diff --git a/.env.sample b/.env.sample index c74e00c..05c8ef4 100644 --- a/.env.sample +++ b/.env.sample @@ -26,7 +26,7 @@ DSH_VERSION=dsh-v0.2.1-rc.5 # Full upstream commit SHA that DSH_VERSION resolves to; the main image build # fails if the clone's HEAD differs (guards against a moved tag). DSH_COMMIT=b830ec950faba0a46dda564be3e2d854afed94f1 -RELEASE_REVISION= +RELEASE_REVISION=r6 PNPM_VERSION=11.28.5 # Container port, and the host port published by "make run". DSH_PORT=3080 diff --git a/AGENTS.md b/AGENTS.md index 7cb1ed9..c389f41 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -82,7 +82,7 @@ needs kind plus the agent-sandbox CRDs (see the example README). ## Versioning and releases - Release identity = DSH_VERSION plus an optional -rN repository revision. - The current identity is dsh-v0.2.1-rc.5 (first release at this DSH ref, so no + The current identity is dsh-v0.2.1-rc.5-r6 (first release at this DSH ref, so no suffix); a repository-only change at the same ref publishes -r2. - Channels: release tags are immutable; latest follows the newest release; main is the development channel for both image packages. diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e73d2e..cd9eb2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,39 @@ All notable changes to this repository are documented here. Generated by git-cliff from Conventional Commits; do not edit this file by hand. +## [dsh-v0.2.1-rc.5-r6] - 2026-10-31 + +### Added + +- **example:** Persist the agent workspace on the PVC via subPath (#34) (367294b) +- **example:** Start DSH's folder picker on the persisted workspace (#36) (82ee0d0) + +### CI + +- **workflows:** Streamline CI and remove redundant builds (#31) (dcb5b43) + +### Documentation + +- Align readmes, docs and agent guidance with current behavior (#37) (24f23e0) + +### Fixed + +- **gateway:** Answer client-aborted requests with 499, not a traceback (#32) (cbcc56f) +- Ship bubblewrap for DSH's command sandbox, keep agents usable without it (#35) (a09d4ac) +- **ci:** Harden workflow token scope and download integrity (#39) (2f959e6) +- **gateway:** Replace token cookies with revocable sessions and harden abuse controls (#40) (1a929e3) + +### Maintenance + +- **changelog:** Refresh for dsh-v0.2.1-rc.5 (#30) (b57916d) +- Bump docker/login-action (#28) (8c34f43) +- **deps:** Bump agent-sandbox to v1.0.9 (#38) (4c073ee) +- Improve package installation and add Python depend… (#42) (8e9bd47) + +### Other + +- Add continue-on-error to CHANGELOG PR step (97c5632) + ## [dsh-v0.2.1-rc.5] - 2026-10-30 ### Added diff --git a/Dockerfile b/Dockerfile index a28e2d3..700d5d3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -68,7 +68,7 @@ RUN cd /opt/dsh \ FROM $NODE_RUNTIME_IMAGE AS runtime ARG DSH_VERSION=dsh-v0.2.1-rc.5 -ARG RELEASE_REVISION= +ARG RELEASE_REVISION=r6 ARG PNPM_VERSION=11.28.5 ARG VCS_REF=unknown @@ -106,8 +106,11 @@ RUN apt-get update \ tini \ gh \ bubblewrap \ + python3 \ + python3-pip \ + python3-venv \ && rm -rf /var/lib/apt/lists/* \ - && curl -LsSf https://astral.sh/uv/install.sh | sh \ + && apt-get autoclean -y \ && install -d -o node -g node -m 0755 /workspace "$DSH_HOME" \ && corepack enable \ && corepack prepare "pnpm@$PNPM_VERSION" --activate \ @@ -160,6 +163,6 @@ WORKDIR /workspace USER node EXPOSE 3080 -VOLUME ["/home/node/.dsh"] +VOLUME ["/home/node/.dsh", "/workspace"] STOPSIGNAL SIGTERM ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/dsh-entrypoint"] diff --git a/README.md b/README.md index 97e8879..446df62 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ docker run -d --name dsh-web \ -p 3080:3080 \ -v dsh-home:/home/node/.dsh \ -e DEEPSEEK_API_KEY \ - ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 + ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 ``` DSH Web is **not usable at a bare `/`**. Without its launch-token cookie it @@ -45,7 +45,7 @@ docker run -d --name dsh-web -p 18081:3080 \ -e DSH_PUBLIC_URL=http://localhost:18081 \ -v dsh-home:/home/node/.dsh \ -e DEEPSEEK_API_KEY \ - ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 + ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 # then open http://localhost:18081/?token=... ``` @@ -94,20 +94,20 @@ ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox/dsh-agents-as-a-service/gateway | Tag | Contents | Meaning | | --- | --- | --- | -| `dsh-v0.2.1-rc.5` | DSH Web, port `3080` | **Current release identity.** Immutable: once published it never moves. | +| `dsh-v0.2.1-rc.5-r6` | DSH Web, port `3080` | **Current release identity.** Immutable: once published it never moves. | | `latest` | DSH Web | Most recent release; same digest as the current identity. | | `main` | DSH Web | Development channel rebuilt when image-definition files change on `main`. Not a release; not for production. | The example gateway is published under its nested path with the same release identity, e.g. -`ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox/dsh-agents-as-a-service/gateway:dsh-v0.2.1-rc.5`. +`ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox/dsh-agents-as-a-service/gateway:dsh-v0.2.1-rc.5-r6`. Release identities, channels and rollback rules are explained in [docs/versioning.md](docs/versioning.md). Production deployments should pin a digest: ```bash -docker buildx imagetools inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 +docker buildx imagetools inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 # image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox@sha256: ``` @@ -188,7 +188,7 @@ required checks and releases: [docs/gitflow.md](docs/gitflow.md). The release identity is the upstream DSH ref plus an optional repository revision: `DSH_VERSION` and `RELEASE_REVISION` in [versions.env](versions.env). -The current identity is **`dsh-v0.2.1-rc.5`** — the first release at this +The current identity is **`dsh-v0.2.1-rc.5-r6`** — the first release at this upstream DSH ref, so it carries no repository revision. Tags are immutable; a broken release is fixed by publishing `-r(N+1)`, never by re-tagging. diff --git a/docs/README.md b/docs/README.md index 192ec1c..45f8c02 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,7 @@ gets a DSH Web container running before anything else. | [main-image.md](main-image.md) | The primary artifact: build args, runtime environment, entrypoint, probes, volumes/ports/signals, non-root contract, image names, tags and digests. | | [examples.md](examples.md) | The example contract: required layout, manifest rules, exposure variants, components and image naming, scripts, docs, and how to add a new example. | | [gitflow.md](gitflow.md) | Branches, protected `main`, squash merges, Conventional PR titles, required CI checks, release branches, hotfixes and the one-time GitHub settings checklist. | -| [versioning.md](versioning.md) | Release identity (`DSH ref` + optional `-rN`), the current identity `dsh-v0.2.1-rc.5`, why identities are immutable, channels, compatibility matrix, bumping pins, the release checklist, rollback, git-cliff and digest pinning. | +| [versioning.md](versioning.md) | Release identity (`DSH ref` + optional `-rN`), the current identity `dsh-v0.2.1-rc.5-r6`, why identities are immutable, channels, compatibility matrix, bumping pins, the release checklist, rollback, git-cliff and digest pinning. | | [workflow-security.md](workflow-security.md) | GitHub Actions security posture: least-privilege tokens, pinned actions, untrusted-input handling, download integrity checks, artifact hygiene, the latest audit record and residual repository-setting recommendations. | ## Project skills diff --git a/docs/main-image.md b/docs/main-image.md index 8e21636..0095da6 100644 --- a/docs/main-image.md +++ b/docs/main-image.md @@ -39,12 +39,12 @@ To reproduce the equivalent by hand: ```bash docker build \ - --build-arg DSH_VERSION=dsh-v0.2.1-rc.5 \ + --build-arg DSH_VERSION=dsh-v0.2.1-rc.5-r6 \ --build-arg DSH_COMMIT=b830ec950faba0a46dda564be3e2d854afed94f1 \ --build-arg RELEASE_REVISION= \ --build-arg PNPM_VERSION=11.28.5 \ --build-arg VCS_REF="$(git rev-parse --short HEAD)" \ - -t ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 . + -t ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 . ``` ### Build args @@ -209,7 +209,7 @@ GitHub Container Registry: | Tag | Meaning | | --- | --- | -| `dsh-v0.2.1-rc.5` | Current release identity. **Immutable**: once published it never moves. | +| `dsh-v0.2.1-rc.5-r6` | Current release identity. **Immutable**: once published it never moves. | | `latest` | Most recent release; points at the same digest as the current identity. | | `main` | Development channel rebuilt when image-definition files change on `main`; not a release, not for production. | @@ -218,7 +218,7 @@ Release identities, channels and rollback rules are defined in pin a digest: ```bash -docker buildx imagetools inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 +docker buildx imagetools inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 # ... pin the digest in your deployment manifests: # image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox@sha256: ``` @@ -226,7 +226,7 @@ docker buildx imagetools inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbo ## Verifying an image ```bash -docker inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 \ +docker inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 \ --format '{{json .Config.Labels}}' # org.opencontainers.image.title / .version / .source # io.sredevopsorg.dsh.version / io.sredevopsorg.release.revision diff --git a/docs/versioning.md b/docs/versioning.md index 66b6a17..475ab4c 100644 --- a/docs/versioning.md +++ b/docs/versioning.md @@ -15,12 +15,12 @@ release identity = DSH_VERSION + optional "-" + RELEASE_REVISION | Piece | Meaning | | --- | --- | -| `DSH_VERSION` | The upstream DeepSeek Harness git ref being packaged, e.g. `dsh-v0.2.1-rc.5`. It mirrors upstream's own tag. | +| `DSH_VERSION` | The upstream DeepSeek Harness git ref being packaged, e.g. `dsh-v0.2.1-rc.5-r6`. It mirrors upstream's own tag. | | `RELEASE_REVISION` | An optional repository revision at that DSH ref: empty for the first release, `rN` (`N >= 2`) for a repository-only re-release. | Examples: -- `DSH_VERSION=dsh-v0.2.1-rc.5`, `RELEASE_REVISION=` → identity `dsh-v0.2.1-rc.5` +- `DSH_VERSION=dsh-v0.2.1-rc.5-r6`, `RELEASE_REVISION=` → identity `dsh-v0.2.1-rc.5-r6` (first release at that upstream ref). - `DSH_VERSION=`, `RELEASE_REVISION=rN` → identity `-rN` (for example documentation, CI or gateway changes on top of an already-released ref; no DSH @@ -36,7 +36,7 @@ with an empty revision); a repository-only change at the same DSH ref increments change what an existing deployment runs. A fix therefore publishes a new identity; see the rules above. -The current identity is `dsh-v0.2.1-rc.5`, the first release at this upstream +The current identity is `dsh-v0.2.1-rc.5-r6`, the first release at this upstream ref, so it carries no revision suffix. The identity is stored in [versions.env](../versions.env) and consumed everywhere: the Dockerfile labels (version and revision), the example manifests, the Makefile and the release @@ -46,7 +46,7 @@ workflow. | Channel | Image tag | Meaning | | --- | --- | --- | -| Release | `dsh-v0.2.1-rc.5` | The current immutable release identity. What production should pin (preferably by digest). | +| Release | `dsh-v0.2.1-rc.5-r6` | The current immutable release identity. What production should pin (preferably by digest). | | `latest` | `latest` | Alias for the most recent release; moves only when a new release is published. | | `main` | `main` | Development channel, rebuilt when image or gateway sources change on `main`. Never treat it as a release; it exists so `main` can be tested. | @@ -60,7 +60,7 @@ Values from [versions.env](../versions.env) at the current identity: | Component | Pin | Source | | --- | --- | --- | | Upstream DSH source | `DSH_REPO` | [versions.env](../versions.env) | -| DSH ref | `dsh-v0.2.1-rc.5` | `DSH_VERSION` | +| DSH ref | `dsh-v0.2.1-rc.5-r6` | `DSH_VERSION` | | DSH commit | `b830ec950faba0a46dda564be3e2d854afed94f1` | `DSH_COMMIT`; the main image build fails unless the clone's `HEAD` matches | | Repository revision | `(empty)` | `RELEASE_REVISION` | | pnpm | `11.28.5` | `PNPM_VERSION` | @@ -176,7 +176,7 @@ Release identities are immutable in theory; deployments should still pin the _resolved_ digest for reproducibility and supply-chain safety: ```bash -docker buildx imagetools inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 +docker buildx imagetools inspect ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 # then, in the deployment: # image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox@sha256: ``` diff --git a/examples/dsh-agents-as-a-service/README.md b/examples/dsh-agents-as-a-service/README.md index c6105a4..48546c8 100644 --- a/examples/dsh-agents-as-a-service/README.md +++ b/examples/dsh-agents-as-a-service/README.md @@ -270,7 +270,7 @@ kubectl delete -f manifests/40-claim-rejected.yaml ```bash # Published image (on kind, load it into the cluster; on a real cluster the # kubelet pulls it from GHCR): -GW=ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox/dsh-agents-as-a-service/gateway:dsh-v0.2.1-rc.5 +GW=ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox/dsh-agents-as-a-service/gateway:dsh-v0.2.1-rc.5-r6 docker pull "$GW" kind load docker-image "$GW" --name diff --git a/examples/dsh-agents-as-a-service/gateway/README.md b/examples/dsh-agents-as-a-service/gateway/README.md index 043f1ba..6dfb84d 100644 --- a/examples/dsh-agents-as-a-service/gateway/README.md +++ b/examples/dsh-agents-as-a-service/gateway/README.md @@ -24,7 +24,7 @@ It does four things: The DSH version pin lives in [`versions.env`](../../../versions.env) (`DSH_VERSION` plus the optional repository `RELEASE_REVISION`); the example manifests and published images use the release identity built from it (currently -`dsh-v0.2.1-rc.5`). DSH binds `:3080`, gates the UI and `/api` behind a +`dsh-v0.2.1-rc.5-r6`). DSH binds `:3080`, gates the UI and `/api` behind a `dsh-auth-*` cookie and requires a WebSocket at `/api/remote.mux`. ## Flow diff --git a/examples/dsh-agents-as-a-service/manifests/10-sandboxtemplate.yaml b/examples/dsh-agents-as-a-service/manifests/10-sandboxtemplate.yaml index 432298b..9315740 100644 --- a/examples/dsh-agents-as-a-service/manifests/10-sandboxtemplate.yaml +++ b/examples/dsh-agents-as-a-service/manifests/10-sandboxtemplate.yaml @@ -73,7 +73,7 @@ spec: fsGroupChangePolicy: OnRootMismatch containers: - name: dsh-web - image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 + image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 imagePullPolicy: IfNotPresent ports: - name: web diff --git a/examples/dsh-agents-as-a-service/manifests/50-gateway.yaml b/examples/dsh-agents-as-a-service/manifests/50-gateway.yaml index f5e51cb..024e52e 100644 --- a/examples/dsh-agents-as-a-service/manifests/50-gateway.yaml +++ b/examples/dsh-agents-as-a-service/manifests/50-gateway.yaml @@ -101,7 +101,7 @@ spec: type: RuntimeDefault containers: - name: gateway - image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox/dsh-agents-as-a-service/gateway:dsh-v0.2.1-rc.5 + image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox/dsh-agents-as-a-service/gateway:dsh-v0.2.1-rc.5-r6 imagePullPolicy: IfNotPresent securityContext: allowPrivilegeEscalation: false diff --git a/examples/minimal-single-tenant/manifests/10-sandboxtemplate.yaml b/examples/minimal-single-tenant/manifests/10-sandboxtemplate.yaml index 482ddc8..e118d84 100644 --- a/examples/minimal-single-tenant/manifests/10-sandboxtemplate.yaml +++ b/examples/minimal-single-tenant/manifests/10-sandboxtemplate.yaml @@ -56,7 +56,7 @@ spec: fsGroupChangePolicy: OnRootMismatch containers: - name: dsh-web - image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5 + image: ghcr.io/sredevopsorg/deepseek-kubernetes-sandbox:dsh-v0.2.1-rc.5-r6 imagePullPolicy: IfNotPresent ports: - name: web diff --git a/scripts/set-version.sh b/scripts/set-version.sh index 7dc47b5..2c9f268 100755 --- a/scripts/set-version.sh +++ b/scripts/set-version.sh @@ -3,7 +3,7 @@ # "make check". # # ./scripts/set-version.sh dsh-v0.2.2-rc.1 # new DSH ref, no revision -# ./scripts/set-version.sh dsh-v0.2.1-rc.5 r3 # same ref, new repo revision +# ./scripts/set-version.sh dsh-v0.2.1-rc.5-r6 r3 # same ref, new repo revision # # For a new DSH ref the script resolves the tag's commit with "git ls-remote" # (peeled ^{} commit first, tag ref as fallback) and rewrites DSH_COMMIT in diff --git a/versions.env b/versions.env index 0548461..1728adb 100644 --- a/versions.env +++ b/versions.env @@ -18,9 +18,16 @@ PNPM_VERSION=11.28.5 # Release identity = DSH_VERSION plus an optional repository revision. # An empty RELEASE_REVISION is the first release at this DSH ref; rN (N >= 2) # marks a repository-only re-release at the same DSH ref. This is the first -# release at dsh-v0.2.1-rc.5, so the identity is the plain tag; a later +# release at dsh-v0.2.1-rc.5-r6, so the identity is the plain tag; a later # repository-only change at the same ref becomes -r2. -RELEASE_REVISION= +RELEASE_REVISION=r6 + +# Base images for the main DSH Web image (root Dockerfile), pinned by digest. +NODE_BUILD_IMAGE=docker.io/node:24-trixie@sha256:8c761eca2bf7eec965f946cf47b8090143cb41f45f2f8699af0cc0298d2d2d19 +NODE_RUNTIME_IMAGE=docker.io/node:24-trixie-slim@sha256:54f84b4cf8432b21aaffd5d3ce8d41e12cea0d10d33c09d2f3c9879d49d6b446 + +# Base image for the example gateway (examples/dsh-agents-as-a-service/gateway). +GATEWAY_PYTHON_IMAGE=docker.io/python:3.12-slim@sha256:aa943ce411423c7582288f18707ff66eddcbaeb510502d747a72aeb34f30d159 # Base images for the main DSH Web image (root Dockerfile), pinned by digest. NODE_BUILD_IMAGE=docker.io/node:24-trixie@sha256:8c761eca2bf7eec965f946cf47b8090143cb41f45f2f8699af0cc0298d2d2d19