From 72bb02e68e9de94282145a3953f6ccece6e4734f Mon Sep 17 00:00:00 2001
From: Tianyi Cui <53024+tianyicui@users.noreply.github.com>
Date: Thu, 16 Jul 2026 16:01:06 +0800
Subject: [PATCH] refactor(workspace-context): move package to context group
---
docs/config-catalog.md | 4 +-
docs/event-producer-consumer.md | 8 +-
docs/module-graph.md | 20 ++--
.../feature/2026-06-24-workspace-context.md | 4 +-
knip.json | 2 +-
packages/README.md | 3 +-
packages/context/README.md | 7 +-
.../workspace-context/README.md | 0
.../workspace-context/package.json | 0
.../workspace-context/src/config.ts | 0
.../workspace-context/src/digest.ts | 0
.../workspace-context/src/files.ts | 0
.../workspace-context/src/index.ts | 0
.../workspace-context/src/render.ts | 0
.../workspace-context/src/state.ts | 0
.../tests/workspace-context.e2e.ts | 0
.../tests/workspace-context.spec.ts | 0
.../workspace-context/tsconfig.json | 0
.../examples/acp-demo/tests/built-bin.e2e.ts | 2 +-
packages/examples/acp-demo/tsconfig.json | 2 +-
.../examples/agent-spine-demo/tsconfig.json | 2 +-
.../stdio-demo/tests/built-bin.e2e.ts | 2 +-
packages/examples/stdio-demo/tsconfig.json | 2 +-
packages/prompt/README.md | 9 --
pnpm-lock.yaml | 100 +++++++++---------
tsconfig.build.json | 2 +-
tsconfig.json | 2 +-
27 files changed, 81 insertions(+), 90 deletions(-)
rename packages/{prompt => context}/workspace-context/README.md (100%)
rename packages/{prompt => context}/workspace-context/package.json (100%)
rename packages/{prompt => context}/workspace-context/src/config.ts (100%)
rename packages/{prompt => context}/workspace-context/src/digest.ts (100%)
rename packages/{prompt => context}/workspace-context/src/files.ts (100%)
rename packages/{prompt => context}/workspace-context/src/index.ts (100%)
rename packages/{prompt => context}/workspace-context/src/render.ts (100%)
rename packages/{prompt => context}/workspace-context/src/state.ts (100%)
rename packages/{prompt => context}/workspace-context/tests/workspace-context.e2e.ts (100%)
rename packages/{prompt => context}/workspace-context/tests/workspace-context.spec.ts (100%)
rename packages/{prompt => context}/workspace-context/tsconfig.json (100%)
delete mode 100644 packages/prompt/README.md
diff --git a/docs/config-catalog.md b/docs/config-catalog.md
index 71e1458394..c94b5d571e 100644
--- a/docs/config-catalog.md
+++ b/docs/config-catalog.md
@@ -135,7 +135,7 @@ export interface SkillConfig {
}
```
-Depends on: [`AgentLoopConfig`](#deepseek-aidsh-agent-loop) · [`SkillLocal`](../packages/skill/skill-local/src/index.ts) · [`SkillRegistryConfig`](#deepseek-aidsh-skill) · [`SystemPromptConfig`](#deepseek-aidsh-system-prompt) · [`toolBash`](../packages/bash/tool-bash/src/index.ts) · [`ToolsConfig`](#deepseek-aidsh-tools) · [`toolSkill`](../packages/skill/tool-skill/src/index.ts) · [`toolTasks`](../packages/tasks/tool-tasks/src/index.ts) · [`workspaceContext`](../packages/prompt/workspace-context/src/index.ts)
+Depends on: [`AgentLoopConfig`](#deepseek-aidsh-agent-loop) · [`SkillLocal`](../packages/skill/skill-local/src/index.ts) · [`SkillRegistryConfig`](#deepseek-aidsh-skill) · [`SystemPromptConfig`](#deepseek-aidsh-system-prompt) · [`toolBash`](../packages/bash/tool-bash/src/index.ts) · [`ToolsConfig`](#deepseek-aidsh-tools) · [`toolSkill`](../packages/skill/tool-skill/src/index.ts) · [`toolTasks`](../packages/tasks/tool-tasks/src/index.ts) · [`workspaceContext`](../packages/context/workspace-context/src/index.ts)
Source: [`packages/examples/agent-spine-demo/src/index.ts:55`](../packages/examples/agent-spine-demo/src/index.ts)
@@ -1268,7 +1268,7 @@ export interface Config {
}
```
-Source: [`packages/prompt/workspace-context/src/config.ts:16`](../packages/prompt/workspace-context/src/config.ts)
+Source: [`packages/context/workspace-context/src/config.ts:16`](../packages/context/workspace-context/src/config.ts)
## Loadable plugins with no config
diff --git a/docs/event-producer-consumer.md b/docs/event-producer-consumer.md
index 811e604202..0e4f370267 100644
--- a/docs/event-producer-consumer.md
+++ b/docs/event-producer-consumer.md
@@ -14,7 +14,7 @@ This matrix shows which packages dispatch each harness-owned event and which pac
| `agent/prompt-submit` | `waterfall` | [`packages/core/agent/src/types.ts:224`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`acp`](../packages/ui/acp), [`hooks-claude`](../packages/hooks/hooks-claude), [`hooks-codex`](../packages/hooks/hooks-codex), [`repeat-tool-guard`](../packages/guard/repeat-tool-guard) |
| `agent/queued` | `emit` | [`packages/core/agent/src/types.ts:179`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | - |
| `agent/request` | `waterfall` | [`packages/core/agent/src/types.ts:236`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | - |
-| `agent/session-prefix` | `waterfall` | [`packages/core/agent/src/types.ts:251`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`tool-skill`](../packages/skill/tool-skill), [`workspace-context`](../packages/prompt/workspace-context) |
+| `agent/session-prefix` | `waterfall` | [`packages/core/agent/src/types.ts:251`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | [`tool-skill`](../packages/skill/tool-skill), [`workspace-context`](../packages/context/workspace-context) |
| `agent/session-start` | `emit` | [`packages/core/agent/src/types.ts:192`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`hooks-claude`](../packages/hooks/hooks-claude), [`hooks-codex`](../packages/hooks/hooks-codex) |
| `agent/status` | `emit` | [`packages/core/agent/src/types.ts:169`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`emit`) | [`invariants`](../packages/support/invariants), [`repeat-tool-guard`](../packages/guard/repeat-tool-guard), [`stdio`](../packages/ui/stdio) |
| `agent/step-result` | `waterfall` | [`packages/core/agent/src/types.ts:262`](../packages/core/agent/src/types.ts) | [`agent-loop`](../packages/core/agent-loop) (`waterfall`) | - |
@@ -27,7 +27,7 @@ This matrix shows which packages dispatch each harness-owned event and which pac
| `llm/stream` | `waterfall` | [`packages/llm/llm/src/index.ts:39`](../packages/llm/llm/src/index.ts) | [`llm`](../packages/llm/llm) (`waterfall`) | [`invariants`](../packages/support/invariants), [`llm-replay`](../packages/support/llm-replay) |
| `session/created` | `emit` | [`packages/core/session/src/index.ts:47`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`invariants`](../packages/support/invariants), [`jsonrpc`](../packages/ui/jsonrpc), [`session-persistence`](../packages/session-persistence/session-persistence) |
| `session/disposed` | `emit` | [`packages/core/session/src/index.ts:57`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | - |
-| `session/event` | `emit` | [`packages/core/session/src/index.ts:69`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`acp`](../packages/ui/acp), [`invariants`](../packages/support/invariants), [`jsonrpc`](../packages/ui/jsonrpc), [`session-persistence`](../packages/session-persistence/session-persistence), [`stdio`](../packages/ui/stdio), [`workspace-context`](../packages/prompt/workspace-context) |
+| `session/event` | `emit` | [`packages/core/session/src/index.ts:69`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`acp`](../packages/ui/acp), [`invariants`](../packages/support/invariants), [`jsonrpc`](../packages/ui/jsonrpc), [`session-persistence`](../packages/session-persistence/session-persistence), [`stdio`](../packages/ui/stdio), [`workspace-context`](../packages/context/workspace-context) |
| `session/flush` | `parallel` | [`packages/core/session/src/index.ts:79`](../packages/core/session/src/index.ts) | [`session`](../packages/core/session) (`events.dispatch`) | [`session-persistence`](../packages/session-persistence/session-persistence) |
| `subagent/end` | `emit` | [`packages/subagent/subagent/src/index.ts:108`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`events.dispatch`) | [`hooks-claude`](../packages/hooks/hooks-claude), [`jsonrpc`](../packages/ui/jsonrpc) |
| `subagent/provider-added` | `emit` | [`packages/subagent/subagent/src/index.ts:82`](../packages/subagent/subagent/src/index.ts) | [`subagent`](../packages/subagent/subagent) (`emit`) | [`tool-subagent`](../packages/subagent/tool-subagent) |
@@ -37,9 +37,9 @@ This matrix shows which packages dispatch each harness-owned event and which pac
| `system-prompt/change` | `emit` | [`packages/core/system-prompt/src/index.ts:33`](../packages/core/system-prompt/src/index.ts) | [`system-prompt`](../packages/core/system-prompt) (`emit`) | - |
| `tools/change` | `emit` | [`packages/core/tools/src/index.ts:116`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`emit`) | - |
| `tools/execute` | `waterfall` | [`packages/core/tools/src/index.ts:89`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`timeout-policy`](../packages/timeout/timeout-policy) |
-| `tools/post-execute` | `waterfall` | [`packages/core/tools/src/index.ts:98`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`hooks-claude`](../packages/hooks/hooks-claude), [`hooks-codex`](../packages/hooks/hooks-codex), [`repeat-tool-guard`](../packages/guard/repeat-tool-guard), [`workspace-context`](../packages/prompt/workspace-context) |
+| `tools/post-execute` | `waterfall` | [`packages/core/tools/src/index.ts:98`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`hooks-claude`](../packages/hooks/hooks-claude), [`hooks-codex`](../packages/hooks/hooks-codex), [`repeat-tool-guard`](../packages/guard/repeat-tool-guard), [`workspace-context`](../packages/context/workspace-context) |
| `tools/pre-execute` | `waterfall` | [`packages/core/tools/src/index.ts:80`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`waterfall`) | [`hooks-claude`](../packages/hooks/hooks-claude), [`hooks-codex`](../packages/hooks/hooks-codex) |
-| `tools/result` | `emit` | [`packages/core/tools/src/index.ts:106`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`events.dispatch`) | [`subagent-inprocess`](../packages/subagent/subagent-inprocess), [`workspace-context`](../packages/prompt/workspace-context) |
+| `tools/result` | `emit` | [`packages/core/tools/src/index.ts:106`](../packages/core/tools/src/index.ts) | [`tools`](../packages/core/tools) (`events.dispatch`) | [`subagent-inprocess`](../packages/subagent/subagent-inprocess), [`workspace-context`](../packages/context/workspace-context) |
| `workflow/agent-end` | `emit` | [`packages/workflow/workflow/src/index.ts:81`](../packages/workflow/workflow/src/index.ts) | [`workflow`](../packages/workflow/workflow) (`events.dispatch`) | - |
| `workflow/agent-start` | `emit` | [`packages/workflow/workflow/src/index.ts:70`](../packages/workflow/workflow/src/index.ts) | [`workflow`](../packages/workflow/workflow) (`events.dispatch`) | - |
| `workflow/end` | `emit` | [`packages/workflow/workflow/src/index.ts:91`](../packages/workflow/workflow/src/index.ts) | [`workflow`](../packages/workflow/workflow) (`events.dispatch`) | - |
diff --git a/docs/module-graph.md b/docs/module-graph.md
index 6bf6d7c349..10a02651da 100644
--- a/docs/module-graph.md
+++ b/docs/module-graph.md
@@ -108,6 +108,7 @@ flowchart TD
end
subgraph group_context["packages/context"]
pkg_time_context["time-context"]
+ pkg_workspace_context["workspace-context"]
end
subgraph group_examples["packages/examples"]
pkg_acp_demo["acp-demo"]
@@ -121,9 +122,6 @@ flowchart TD
subgraph group_mcp["packages/mcp"]
pkg_mcp_client["mcp-client"]
end
- subgraph group_prompt["packages/prompt"]
- pkg_workspace_context["workspace-context"]
- end
subgraph group_sandbox["packages/sandbox"]
pkg_sandbox["sandbox"]
pkg_sandbox_local["sandbox-local"]
@@ -291,16 +289,16 @@ flowchart TD
pkg_tool_ask_user --> pkg_agent
pkg_tool_ask_user --> pkg_tools
pkg_tool_ask_user --> pkg_user_interaction
- pkg_repeat_tool_guard --> pkg_agent
- pkg_repeat_tool_guard --> pkg_tools
- pkg_mcp_client --> pkg_llm
- pkg_mcp_client --> pkg_tools
pkg_workspace_context --> pkg_agent
pkg_workspace_context --> pkg_fs
pkg_workspace_context --> pkg_llm
pkg_workspace_context --> pkg_paths
pkg_workspace_context --> pkg_session
pkg_workspace_context --> pkg_tools
+ pkg_repeat_tool_guard --> pkg_agent
+ pkg_repeat_tool_guard --> pkg_tools
+ pkg_mcp_client --> pkg_llm
+ pkg_mcp_client --> pkg_tools
pkg_tool_tasks --> pkg_agent
pkg_tool_tasks --> pkg_system_prompt
pkg_tool_tasks --> pkg_tasks
@@ -451,9 +449,9 @@ flowchart TD
| [`hooks-codex`](../packages/hooks/hooks-codex) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`tools`](../packages/core/tools) |
| [`acp`](../packages/ui/acp) | `ui` | [`agent`](../packages/core/agent), [`bash`](../packages/bash/bash), [`llm`](../packages/llm/llm), [`permission`](../packages/ui/permission), [`sandbox`](../packages/sandbox/sandbox), [`session`](../packages/core/session), [`session-persistence`](../packages/session-persistence/session-persistence), [`tools`](../packages/core/tools), [`user-approval`](../packages/ui/user-approval), [`user-interaction`](../packages/ui/user-interaction) |
| [`tool-ask-user`](../packages/ui/tool-ask-user) | `ui` | [`agent`](../packages/core/agent), [`tools`](../packages/core/tools), [`user-interaction`](../packages/ui/user-interaction) |
+| [`workspace-context`](../packages/context/workspace-context) | `context` | [`agent`](../packages/core/agent), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`paths`](../packages/util/paths), [`session`](../packages/core/session), [`tools`](../packages/core/tools) |
| [`repeat-tool-guard`](../packages/guard/repeat-tool-guard) | `guard` | [`agent`](../packages/core/agent), [`tools`](../packages/core/tools) |
| [`mcp-client`](../packages/mcp/mcp-client) | `mcp` | [`llm`](../packages/llm/llm), [`tools`](../packages/core/tools) |
-| [`workspace-context`](../packages/prompt/workspace-context) | `prompt` | [`agent`](../packages/core/agent), [`fs`](../packages/fs/fs), [`llm`](../packages/llm/llm), [`paths`](../packages/util/paths), [`session`](../packages/core/session), [`tools`](../packages/core/tools) |
| [`tool-tasks`](../packages/tasks/tool-tasks) | `tasks` | [`agent`](../packages/core/agent), [`system-prompt`](../packages/core/system-prompt), [`tasks`](../packages/tasks/tasks), [`tools`](../packages/core/tools) |
| [`tool-workflow`](../packages/workflow/tool-workflow) | `workflow` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`system-prompt`](../packages/core/system-prompt), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) |
| [`subagent-acp`](../packages/subagent/subagent-acp) | `subagent` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent), [`subagent-subprocess`](../packages/subagent/subagent-subprocess) |
@@ -462,9 +460,9 @@ flowchart TD
| [`hooks-claude`](../packages/hooks/hooks-claude) | `hooks` | [`agent`](../packages/core/agent), [`hook-protocol`](../packages/hooks/hook-protocol), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools) |
| [`subagent-mock`](../packages/support/subagent-mock) | `support` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`subagent`](../packages/subagent/subagent) |
| [`jsonrpc`](../packages/ui/jsonrpc) | `ui` | [`agent`](../packages/core/agent), [`llm`](../packages/llm/llm), [`llm-deepseek`](../packages/llm/llm-deepseek), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent) |
-| [`agent-spine-demo`](../packages/examples/agent-spine-demo) | `examples` | [`agent`](../packages/core/agent), [`agent-loop`](../packages/core/agent-loop), [`invariants`](../packages/support/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`skill`](../packages/skill/skill), [`skill-local`](../packages/skill/skill-local), [`system-prompt`](../packages/core/system-prompt), [`tasks`](../packages/tasks/tasks), [`tool-bash`](../packages/bash/tool-bash), [`tool-skill`](../packages/skill/tool-skill), [`tool-tasks`](../packages/tasks/tool-tasks), [`tools`](../packages/core/tools), [`workspace-context`](../packages/prompt/workspace-context) |
+| [`agent-spine-demo`](../packages/examples/agent-spine-demo) | `examples` | [`agent`](../packages/core/agent), [`agent-loop`](../packages/core/agent-loop), [`invariants`](../packages/support/invariants), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`skill`](../packages/skill/skill), [`skill-local`](../packages/skill/skill-local), [`system-prompt`](../packages/core/system-prompt), [`tasks`](../packages/tasks/tasks), [`tool-bash`](../packages/bash/tool-bash), [`tool-skill`](../packages/skill/tool-skill), [`tool-tasks`](../packages/tasks/tool-tasks), [`tools`](../packages/core/tools), [`workspace-context`](../packages/context/workspace-context) |
| [`workflow-workerthread`](../packages/workflow/workflow-workerthread) | `workflow` | [`agent`](../packages/core/agent), [`brand`](../packages/util/brand), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`tools`](../packages/core/tools), [`workflow`](../packages/workflow/workflow) |
| [`subagent-fork`](../packages/subagent/subagent-fork) | `subagent` | [`agent`](../packages/core/agent), [`session`](../packages/core/session), [`subagent`](../packages/subagent/subagent), [`subagent-inprocess`](../packages/subagent/subagent-inprocess) |
| [`subagent-spawn`](../packages/subagent/subagent-spawn) | `subagent` | [`subagent`](../packages/subagent/subagent), [`subagent-inprocess`](../packages/subagent/subagent-inprocess) |
-| [`acp-demo`](../packages/examples/acp-demo) | `examples` | [`acp`](../packages/ui/acp), [`agent-spine-demo`](../packages/examples/agent-spine-demo), [`app-boot`](../packages/ui/app-boot), [`session-persistence-jsonl`](../packages/session-persistence/session-persistence-jsonl), [`tools`](../packages/core/tools), [`user-interaction`](../packages/ui/user-interaction), [`workspace-context`](../packages/prompt/workspace-context) |
-| [`stdio-demo`](../packages/examples/stdio-demo) | `examples` | [`agent`](../packages/core/agent), [`agent-spine-demo`](../packages/examples/agent-spine-demo), [`app-boot`](../packages/ui/app-boot), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence-jsonl`](../packages/session-persistence/session-persistence-jsonl), [`stdio`](../packages/ui/stdio), [`tool-ask-user`](../packages/ui/tool-ask-user), [`tools`](../packages/core/tools), [`user-interaction`](../packages/ui/user-interaction), [`workspace-context`](../packages/prompt/workspace-context) |
+| [`acp-demo`](../packages/examples/acp-demo) | `examples` | [`acp`](../packages/ui/acp), [`agent-spine-demo`](../packages/examples/agent-spine-demo), [`app-boot`](../packages/ui/app-boot), [`session-persistence-jsonl`](../packages/session-persistence/session-persistence-jsonl), [`tools`](../packages/core/tools), [`user-interaction`](../packages/ui/user-interaction), [`workspace-context`](../packages/context/workspace-context) |
+| [`stdio-demo`](../packages/examples/stdio-demo) | `examples` | [`agent`](../packages/core/agent), [`agent-spine-demo`](../packages/examples/agent-spine-demo), [`app-boot`](../packages/ui/app-boot), [`llm`](../packages/llm/llm), [`session`](../packages/core/session), [`session-persistence-jsonl`](../packages/session-persistence/session-persistence-jsonl), [`stdio`](../packages/ui/stdio), [`tool-ask-user`](../packages/ui/tool-ask-user), [`tools`](../packages/core/tools), [`user-interaction`](../packages/ui/user-interaction), [`workspace-context`](../packages/context/workspace-context) |
diff --git a/docs/rfc/implemented/feature/2026-06-24-workspace-context.md b/docs/rfc/implemented/feature/2026-06-24-workspace-context.md
index 4b395d4e11..cc11fd19ff 100644
--- a/docs/rfc/implemented/feature/2026-06-24-workspace-context.md
+++ b/docs/rfc/implemented/feature/2026-06-24-workspace-context.md
@@ -12,7 +12,7 @@ The lifecycle has two distinct classes of content. The initial applicable chain
## Decision
-The implementation lives in `packages/prompt/workspace-context` as `@deepseek-ai/dsh-workspace-context`. It is a prompt/context extension, not a core service or a filesystem backend. `@deepseek-ai/dsh-agent-core` mounts it for both product front doors and forwards its config. The plugin consumes `agent/session-prefix`, `tools/post-execute`, and the optional `ctx.fs` capability.
+The implementation lives in `packages/context/workspace-context` as `@deepseek-ai/dsh-workspace-context`. It is a request-context extension, not a core service or a filesystem backend. `@deepseek-ai/dsh-agent-core` mounts it for both product front doors and forwards its config. The plugin consumes `agent/session-prefix`, `tools/post-execute`, and the optional `ctx.fs` capability.
The plugin does not statically inject `fs`. Providerless product trees therefore boot normally and the plugin no-ops until a filesystem provider exists. All production reads go through that provider. Candidate probes call `lstat` before `resolve`, so a repository-owned final-component symlink is rejected rather than followed outside the workspace. The session-prefix signal and dynamic tool execution signal propagate through resolution, metadata probes, and streaming reads, so cancellation does not wait for an unrelated filesystem scan. Once `lstat` identifies a regular-file winner, a provider exception or disagreement during resolve/stat is classified as unavailable: it is neither interpreted as a deletion nor allowed to fall through to a lower-priority candidate.
@@ -32,7 +32,7 @@ The plugin prepends its contribution before `await next()` returns, so session-p
A resumed agent creates a new loop instance and recomposes the baseline from current files, with the new prefix anchored by the resume request header. This permits current baseline content on resume without mutating a prefix already used by an earlier instance.
-The baseline is a user-role `` with `Instructions from: ` sections and explicit authority and precedence language. This familiar model-facing frame avoids a harness-specific XML vocabulary. Project paths are root-relative and the user-global path is `~/.dsh/AGENTS.md` for the default home or `$DSH_HOME/AGENTS.md` for a configured home. A literal `` inside file content is escaped. The package README owns the exact current [prompt shape](../../../../packages/prompt/workspace-context/README.md#prompt-shape).
+The baseline is a user-role `` with `Instructions from: ` sections and explicit authority and precedence language. This familiar model-facing frame avoids a harness-specific XML vocabulary. Project paths are root-relative and the user-global path is `~/.dsh/AGENTS.md` for the default home or `$DSH_HOME/AGENTS.md` for a configured home. A literal `` inside file content is escaped. The package README owns the exact current [prompt shape](../../../../packages/context/workspace-context/README.md#prompt-shape).
### Dynamic Discovery And Refresh
diff --git a/knip.json b/knip.json
index 1f62a3e0e6..90e1218098 100644
--- a/knip.json
+++ b/knip.json
@@ -66,7 +66,7 @@
"entry": ["tests/**/*.spec.ts", "tests/**/*.e2e.ts"],
"project": ["src/**/*.ts", "tests/**/*.ts"]
},
- "packages/prompt/workspace-context": {
+ "packages/context/workspace-context": {
"entry": ["tests/**/*.spec.ts", "tests/**/*.e2e.ts"],
"project": ["src/**/*.ts", "tests/**/*.ts"]
},
diff --git a/packages/README.md b/packages/README.md
index 12bb2485bc..c718f52d9f 100644
--- a/packages/README.md
+++ b/packages/README.md
@@ -9,7 +9,6 @@ Packages live at `packages///`; groups are containers, while names r
| Group | Role | Release expectation |
|---|---|---|
| [`core/`](core/README.md) | Product API spine: session, system-prompt, tools, agent, and the concrete loop | Product — stable surface |
-| [`prompt/`](prompt/README.md) | Workspace instruction loading | Product — stable surface |
| [`llm/`](llm/README.md) | LLM capability family: the abstract service + provider adapters | Product — stable surface |
| [`bash/`](bash/README.md) | Bash capability family: the executor seam, a local impl, and the model-facing tool | Product — stable surface |
| [`code-runtime/`](code-runtime/README.md) | Code-execution capability family: the abstract runtime seam for model-written programs + a worker-thread backend | Product — stable surface |
@@ -17,7 +16,7 @@ Packages live at `packages///`; groups are containers, while names r
| [`fs/`](fs/README.md) | Filesystem capability family: the abstract seam, a local impl, and the model-facing file tools | Product — stable surface |
| [`skill/`](skill/README.md) | Skill capability family: the provider registry, local provider, and model-facing catalog/loader | Product — stable surface |
| [`compact/`](compact/README.md) | Compaction capability family: the abstract seam + a basic backend (tool deferred) | Product — stable surface |
-| [`context/`](context/README.md) | Opt-in request-context enrichment | Product — stable surface |
+| [`context/`](context/README.md) | Model-visible request context, including workspace instructions and time context | Product — stable surface |
| [`subagent/`](subagent/README.md) | Subagent capability family: the provider-registry seam and the model-facing delegation tool | Product — stable surface |
| [`tasks/`](tasks/README.md) | Generic background-task runtime and model-facing `task_*` control tools | Product — stable surface |
| [`workflow/`](workflow/README.md) | Workflow capability family: the script-engine seam, the worker-thread engine, and the model-facing `workflow` tool | Product — stable surface |
diff --git a/packages/context/README.md b/packages/context/README.md
index 0045c6629c..374fb96374 100644
--- a/packages/context/README.md
+++ b/packages/context/README.md
@@ -1,7 +1,10 @@
-# context/ — optional request context
+# context/ — request-context extensions
-Opt-in plugins that add bounded model-visible request context without defining a tool or service. The default `dsh-agent-spine-demo` bundle excludes them.
+Product plugins that add bounded model-visible request context without defining a tool or service. `workspace-context` is included by the default `dsh-agent-spine-demo` bundle and can be disabled through bundle config; `time-context` is opt-in.
| Package | Role | ctx key |
|---|---|---|
| `time-context/` | Current time and elapsed-time system-prompt context | (none) |
+| `workspace-context/` | `AGENTS.md`/`CLAUDE.md` workspace context loader | (listens on `agent/session-prefix` + `tools/post-execute`) |
+
+The [`workspace-context` decision record](../../docs/rfc/implemented/feature/2026-06-24-workspace-context.md) explains its per-agent/session isolation and lifecycle split.
diff --git a/packages/prompt/workspace-context/README.md b/packages/context/workspace-context/README.md
similarity index 100%
rename from packages/prompt/workspace-context/README.md
rename to packages/context/workspace-context/README.md
diff --git a/packages/prompt/workspace-context/package.json b/packages/context/workspace-context/package.json
similarity index 100%
rename from packages/prompt/workspace-context/package.json
rename to packages/context/workspace-context/package.json
diff --git a/packages/prompt/workspace-context/src/config.ts b/packages/context/workspace-context/src/config.ts
similarity index 100%
rename from packages/prompt/workspace-context/src/config.ts
rename to packages/context/workspace-context/src/config.ts
diff --git a/packages/prompt/workspace-context/src/digest.ts b/packages/context/workspace-context/src/digest.ts
similarity index 100%
rename from packages/prompt/workspace-context/src/digest.ts
rename to packages/context/workspace-context/src/digest.ts
diff --git a/packages/prompt/workspace-context/src/files.ts b/packages/context/workspace-context/src/files.ts
similarity index 100%
rename from packages/prompt/workspace-context/src/files.ts
rename to packages/context/workspace-context/src/files.ts
diff --git a/packages/prompt/workspace-context/src/index.ts b/packages/context/workspace-context/src/index.ts
similarity index 100%
rename from packages/prompt/workspace-context/src/index.ts
rename to packages/context/workspace-context/src/index.ts
diff --git a/packages/prompt/workspace-context/src/render.ts b/packages/context/workspace-context/src/render.ts
similarity index 100%
rename from packages/prompt/workspace-context/src/render.ts
rename to packages/context/workspace-context/src/render.ts
diff --git a/packages/prompt/workspace-context/src/state.ts b/packages/context/workspace-context/src/state.ts
similarity index 100%
rename from packages/prompt/workspace-context/src/state.ts
rename to packages/context/workspace-context/src/state.ts
diff --git a/packages/prompt/workspace-context/tests/workspace-context.e2e.ts b/packages/context/workspace-context/tests/workspace-context.e2e.ts
similarity index 100%
rename from packages/prompt/workspace-context/tests/workspace-context.e2e.ts
rename to packages/context/workspace-context/tests/workspace-context.e2e.ts
diff --git a/packages/prompt/workspace-context/tests/workspace-context.spec.ts b/packages/context/workspace-context/tests/workspace-context.spec.ts
similarity index 100%
rename from packages/prompt/workspace-context/tests/workspace-context.spec.ts
rename to packages/context/workspace-context/tests/workspace-context.spec.ts
diff --git a/packages/prompt/workspace-context/tsconfig.json b/packages/context/workspace-context/tsconfig.json
similarity index 100%
rename from packages/prompt/workspace-context/tsconfig.json
rename to packages/context/workspace-context/tsconfig.json
diff --git a/packages/examples/acp-demo/tests/built-bin.e2e.ts b/packages/examples/acp-demo/tests/built-bin.e2e.ts
index 11e49f55c7..f612d599a9 100644
--- a/packages/examples/acp-demo/tests/built-bin.e2e.ts
+++ b/packages/examples/acp-demo/tests/built-bin.e2e.ts
@@ -30,7 +30,7 @@ const acpBin = join(repoRoot, 'packages/examples/acp-demo/lib/bin.js')
const dshPackages = [
'examples/agent-spine-demo', 'core/agent', 'core/session', 'core/system-prompt',
'core/tools', 'core/agent-loop', 'llm/llm', 'llm/llm-deepseek', 'bash/bash',
- 'bash/bash-local', 'bash/tool-bash', 'prompt/workspace-context', 'support/invariants', 'ui/app-boot',
+ 'bash/bash-local', 'bash/tool-bash', 'context/workspace-context', 'support/invariants', 'ui/app-boot',
'session-persistence/session-persistence',
'session-persistence/session-persistence-jsonl', 'ui/acp', 'examples/acp-demo', 'util/paths',
]
diff --git a/packages/examples/acp-demo/tsconfig.json b/packages/examples/acp-demo/tsconfig.json
index 911d850c37..b0e537574a 100644
--- a/packages/examples/acp-demo/tsconfig.json
+++ b/packages/examples/acp-demo/tsconfig.json
@@ -30,7 +30,7 @@
"path": "../agent-spine-demo"
},
{
- "path": "../../prompt/workspace-context"
+ "path": "../../context/workspace-context"
},
{
"path": "../../ui/user-interaction"
diff --git a/packages/examples/agent-spine-demo/tsconfig.json b/packages/examples/agent-spine-demo/tsconfig.json
index ec5cb2f3b2..9a51ffa8c8 100644
--- a/packages/examples/agent-spine-demo/tsconfig.json
+++ b/packages/examples/agent-spine-demo/tsconfig.json
@@ -42,7 +42,7 @@
"path": "../../core/agent"
},
{
- "path": "../../prompt/workspace-context"
+ "path": "../../context/workspace-context"
},
{
"path": "../../core/agent-loop"
diff --git a/packages/examples/stdio-demo/tests/built-bin.e2e.ts b/packages/examples/stdio-demo/tests/built-bin.e2e.ts
index 9cc070ba53..ad2ab5239d 100644
--- a/packages/examples/stdio-demo/tests/built-bin.e2e.ts
+++ b/packages/examples/stdio-demo/tests/built-bin.e2e.ts
@@ -21,7 +21,7 @@ const stdioBin = join(repoRoot, 'packages/examples/stdio-demo/lib/bin.js')
const dshPackages = [
'examples/agent-spine-demo', 'core/agent', 'core/session', 'core/system-prompt',
'core/tools', 'core/agent-loop', 'llm/llm', 'bash/bash', 'bash/bash-local',
- 'bash/tool-bash', 'prompt/workspace-context', 'support/invariants', 'ui/app-boot',
+ 'bash/tool-bash', 'context/workspace-context', 'support/invariants', 'ui/app-boot',
'session-persistence/session-persistence',
'session-persistence/session-persistence-jsonl', 'examples/stdio-demo', 'util/paths',
'ui/stdio', 'ui/tool-ask-user', 'ui/user-interaction',
diff --git a/packages/examples/stdio-demo/tsconfig.json b/packages/examples/stdio-demo/tsconfig.json
index 0717b07340..be08d28f95 100644
--- a/packages/examples/stdio-demo/tsconfig.json
+++ b/packages/examples/stdio-demo/tsconfig.json
@@ -33,7 +33,7 @@
"path": "../agent-spine-demo"
},
{
- "path": "../../prompt/workspace-context"
+ "path": "../../context/workspace-context"
},
{
"path": "../../ui/user-interaction"
diff --git a/packages/prompt/README.md b/packages/prompt/README.md
deleted file mode 100644
index 562d146146..0000000000
--- a/packages/prompt/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# prompt/ — prompt and request-context extensions
-
-Product packages that contribute model-facing prompt or request-context behavior without being core agent/session/tool primitives. These packages usually consume existing seams such as `agent/session-prefix`, `agent/request`, `tools/post-execute`, or `system-prompt/assemble`; they do not own the loop and do not provide LLM adapters, execution backends, or UI front doors.
-
-| Package | Role | ctx key |
-|---|---|---|
-| `workspace-context/` | `AGENTS.md`/`CLAUDE.md` workspace context loader | (listens on `agent/session-prefix` + `tools/post-execute`) |
-
-`workspace-context` lives here because it adds workspace guidance to the model request without owning a core service. Its [decision record](../../docs/rfc/implemented/feature/2026-06-24-workspace-context.md) explains the per-agent/session isolation and lifecycle split.
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 41c69a2b56..9cfb93c4d8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -278,6 +278,52 @@ importers:
specifier: ^4.0.0-rc.7
version: 4.0.0-rc.7(@cordisjs/plugin-include@1.0.4)(@cordisjs/plugin-loader@1.0.0-rc.5)
+ packages/context/workspace-context:
+ dependencies:
+ schemastery:
+ specifier: ^3.18.0
+ version: 3.18.0
+ devDependencies:
+ '@cordisjs/plugin-loader':
+ specifier: workspace:^
+ version: link:../../../vendor/loader
+ '@deepseek-ai/dsh-agent':
+ specifier: workspace:^
+ version: link:../../core/agent
+ '@deepseek-ai/dsh-agent-loop':
+ specifier: workspace:^
+ version: link:../../core/agent-loop
+ '@deepseek-ai/dsh-fs':
+ specifier: workspace:^
+ version: link:../../fs/fs
+ '@deepseek-ai/dsh-fs-local':
+ specifier: workspace:^
+ version: link:../../fs/fs-local
+ '@deepseek-ai/dsh-llm':
+ specifier: workspace:^
+ version: link:../../llm/llm
+ '@deepseek-ai/dsh-llm-deepseek':
+ specifier: workspace:^
+ version: link:../../llm/llm-deepseek
+ '@deepseek-ai/dsh-paths':
+ specifier: workspace:^
+ version: link:../../util/paths
+ '@deepseek-ai/dsh-session':
+ specifier: workspace:^
+ version: link:../../core/session
+ '@deepseek-ai/dsh-system-prompt':
+ specifier: workspace:^
+ version: link:../../core/system-prompt
+ '@deepseek-ai/dsh-tool-fs':
+ specifier: workspace:^
+ version: link:../../fs/tool-fs
+ '@deepseek-ai/dsh-tools':
+ specifier: workspace:^
+ version: link:../../core/tools
+ cordis:
+ specifier: ^4.0.0-rc.6
+ version: 4.0.0-rc.7(@cordisjs/plugin-include@1.0.4)(@cordisjs/plugin-loader@vendor+loader)
+
packages/cordis/tool-cordis:
dependencies:
schemastery:
@@ -475,7 +521,7 @@ importers:
version: link:../../ui/user-interaction
'@deepseek-ai/dsh-workspace-context':
specifier: workspace:^
- version: link:../../prompt/workspace-context
+ version: link:../../context/workspace-context
cordis:
specifier: ^4.0.0-rc.7
version: 4.0.0-rc.7(@cordisjs/plugin-include@vendor+include)(@cordisjs/plugin-loader@vendor+loader)
@@ -536,7 +582,7 @@ importers:
version: link:../../core/tools
'@deepseek-ai/dsh-workspace-context':
specifier: workspace:^
- version: link:../../prompt/workspace-context
+ version: link:../../context/workspace-context
cordis:
specifier: ^4.0.0-rc.7
version: 4.0.0-rc.7(@cordisjs/plugin-include@1.0.4)(@cordisjs/plugin-loader@1.0.0-rc.5)
@@ -597,7 +643,7 @@ importers:
version: link:../../ui/user-interaction
'@deepseek-ai/dsh-workspace-context':
specifier: workspace:^
- version: link:../../prompt/workspace-context
+ version: link:../../context/workspace-context
cordis:
specifier: ^4.0.0-rc.7
version: 4.0.0-rc.7(@cordisjs/plugin-include@vendor+include)(@cordisjs/plugin-loader@vendor+loader)
@@ -874,52 +920,6 @@ importers:
specifier: ^4.4.3
version: 4.4.3
- packages/prompt/workspace-context:
- dependencies:
- schemastery:
- specifier: ^3.18.0
- version: 3.18.0
- devDependencies:
- '@cordisjs/plugin-loader':
- specifier: workspace:^
- version: link:../../../vendor/loader
- '@deepseek-ai/dsh-agent':
- specifier: workspace:^
- version: link:../../core/agent
- '@deepseek-ai/dsh-agent-loop':
- specifier: workspace:^
- version: link:../../core/agent-loop
- '@deepseek-ai/dsh-fs':
- specifier: workspace:^
- version: link:../../fs/fs
- '@deepseek-ai/dsh-fs-local':
- specifier: workspace:^
- version: link:../../fs/fs-local
- '@deepseek-ai/dsh-llm':
- specifier: workspace:^
- version: link:../../llm/llm
- '@deepseek-ai/dsh-llm-deepseek':
- specifier: workspace:^
- version: link:../../llm/llm-deepseek
- '@deepseek-ai/dsh-paths':
- specifier: workspace:^
- version: link:../../util/paths
- '@deepseek-ai/dsh-session':
- specifier: workspace:^
- version: link:../../core/session
- '@deepseek-ai/dsh-system-prompt':
- specifier: workspace:^
- version: link:../../core/system-prompt
- '@deepseek-ai/dsh-tool-fs':
- specifier: workspace:^
- version: link:../../fs/tool-fs
- '@deepseek-ai/dsh-tools':
- specifier: workspace:^
- version: link:../../core/tools
- cordis:
- specifier: ^4.0.0-rc.6
- version: 4.0.0-rc.7(@cordisjs/plugin-include@1.0.4)(@cordisjs/plugin-loader@vendor+loader)
-
packages/sandbox/sandbox:
devDependencies:
'@deepseek-ai/dsh-llm':
@@ -2200,7 +2200,7 @@ importers:
version: link:../../packages/workflow/workflow-workerthread
'@deepseek-ai/dsh-workspace-context':
specifier: workspace:^
- version: link:../../packages/prompt/workspace-context
+ version: link:../../packages/context/workspace-context
cordis:
specifier: workspace:^
version: link:../../vendor/cordis
diff --git a/tsconfig.build.json b/tsconfig.build.json
index 0e45536117..4fece2e6f6 100644
--- a/tsconfig.build.json
+++ b/tsconfig.build.json
@@ -31,7 +31,7 @@
{ "path": "./packages/skill/skill-local" },
{ "path": "./packages/skill/tool-skill" },
{ "path": "./packages/ui/tool-ask-user" },
- { "path": "./packages/prompt/workspace-context" },
+ { "path": "./packages/context/workspace-context" },
{ "path": "./packages/core/agent-loop" },
{ "path": "./packages/examples/agent-spine-demo" },
{ "path": "./packages/bash/bash" },
diff --git a/tsconfig.json b/tsconfig.json
index fe91ec93cf..0a73f16ea4 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -42,7 +42,7 @@
{ "path": "./packages/skill/skill-local" },
{ "path": "./packages/skill/tool-skill" },
{ "path": "./packages/ui/tool-ask-user" },
- { "path": "./packages/prompt/workspace-context" },
+ { "path": "./packages/context/workspace-context" },
{ "path": "./packages/core/agent-loop" },
{ "path": "./packages/examples/agent-spine-demo" },
{ "path": "./packages/bash/bash" },