gsd-pi 2.76.0-dev.707772f58 → 2.76.0-dev.7218806ab

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist/claude-cli-check.js +32 -3
  2. package/dist/mcp-server.d.ts +7 -0
  3. package/dist/mcp-server.js +35 -1
  4. package/dist/resources/extensions/claude-code-cli/readiness.js +4 -3
  5. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +77 -17
  6. package/dist/resources/extensions/gsd/auto-model-selection.js +1 -1
  7. package/dist/resources/extensions/gsd/auto-start.js +27 -18
  8. package/dist/resources/extensions/gsd/auto.js +13 -17
  9. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +17 -1
  10. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +39 -9
  11. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +93 -0
  12. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  13. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +40 -4
  14. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +12 -1
  15. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
  16. package/dist/resources/extensions/gsd/compaction-snapshot.js +121 -0
  17. package/dist/resources/extensions/gsd/error-classifier.js +10 -3
  18. package/dist/resources/extensions/gsd/exec-history.js +120 -0
  19. package/dist/resources/extensions/gsd/exec-sandbox.js +258 -0
  20. package/dist/resources/extensions/gsd/gsd-db.js +62 -4
  21. package/dist/resources/extensions/gsd/guided-flow.js +189 -0
  22. package/dist/resources/extensions/gsd/health-widget.js +4 -1
  23. package/dist/resources/extensions/gsd/key-manager.js +6 -0
  24. package/dist/resources/extensions/gsd/model-router.js +36 -3
  25. package/dist/resources/extensions/gsd/pre-execution-checks.js +35 -9
  26. package/dist/resources/extensions/gsd/preferences-types.js +9 -0
  27. package/dist/resources/extensions/gsd/preferences-validation.js +83 -0
  28. package/dist/resources/extensions/gsd/preferences.js +17 -17
  29. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  30. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
  31. package/dist/resources/extensions/gsd/safety/file-change-validator.js +1 -1
  32. package/dist/resources/extensions/gsd/token-counter.js +22 -5
  33. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +59 -0
  34. package/dist/resources/extensions/gsd/tools/exec-tool.js +126 -0
  35. package/dist/resources/extensions/gsd/tools/resume-tool.js +23 -0
  36. package/dist/resources/extensions/gsd/workflow-mcp.js +3 -0
  37. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  38. package/dist/web/standalone/.next/BUILD_ID +1 -1
  39. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  40. package/dist/web/standalone/.next/build-manifest.json +2 -2
  41. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  42. package/dist/web/standalone/.next/required-server-files.json +1 -1
  43. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  44. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  45. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  47. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  51. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  52. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  53. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  54. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  55. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  56. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  57. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  58. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  59. package/dist/web/standalone/.next/server/app/index.html +1 -1
  60. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  61. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  62. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  63. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  64. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  65. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  67. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  69. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  70. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  71. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  72. package/dist/web/standalone/server.js +1 -1
  73. package/package.json +1 -1
  74. package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
  75. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
  76. package/packages/mcp-server/dist/remote-questions.js +732 -0
  77. package/packages/mcp-server/dist/remote-questions.js.map +1 -0
  78. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  79. package/packages/mcp-server/dist/server.js +18 -1
  80. package/packages/mcp-server/dist/server.js.map +1 -1
  81. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  82. package/packages/mcp-server/dist/workflow-tools.js +64 -25
  83. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  84. package/packages/mcp-server/package.json +2 -1
  85. package/packages/mcp-server/src/remote-questions.test.ts +294 -0
  86. package/packages/mcp-server/src/remote-questions.ts +916 -0
  87. package/packages/mcp-server/src/server.ts +19 -1
  88. package/packages/mcp-server/src/workflow-tools.test.ts +146 -1
  89. package/packages/mcp-server/src/workflow-tools.ts +84 -43
  90. package/packages/mcp-server/tsconfig.test.json +19 -0
  91. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  92. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  93. package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -0
  94. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  95. package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
  96. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  97. package/packages/pi-ai/dist/providers/simple-options.js +16 -1
  98. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  99. package/packages/pi-ai/src/providers/anthropic-shared.ts +3 -1
  100. package/packages/pi-ai/src/providers/simple-options.ts +17 -1
  101. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  102. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
  103. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
  104. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
  105. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
  106. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  107. package/packages/pi-coding-agent/dist/core/model-registry.js +14 -0
  108. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  109. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts +2 -0
  110. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts.map +1 -0
  111. package/packages/pi-coding-agent/dist/core/redact-secrets.js +49 -0
  112. package/packages/pi-coding-agent/dist/core/redact-secrets.js.map +1 -0
  113. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts +2 -0
  114. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts.map +1 -0
  115. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js +67 -0
  116. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js.map +1 -0
  117. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  118. package/packages/pi-coding-agent/dist/core/session-manager.js +9 -5
  119. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  120. package/packages/pi-coding-agent/dist/core/session-manager.test.js +25 -1
  121. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  122. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
  123. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  124. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +5 -4
  125. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  126. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
  127. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  128. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
  129. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  130. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  131. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -1
  132. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  133. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  134. package/packages/pi-coding-agent/src/core/model-registry.ts +16 -0
  135. package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
  136. package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
  137. package/packages/pi-coding-agent/src/core/session-manager.test.ts +36 -1
  138. package/packages/pi-coding-agent/src/core/session-manager.ts +9 -5
  139. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +6 -6
  140. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
  141. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
  142. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  143. package/src/resources/extensions/claude-code-cli/readiness.ts +4 -3
  144. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +78 -17
  145. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +149 -5
  146. package/src/resources/extensions/gsd/auto-model-selection.ts +1 -1
  147. package/src/resources/extensions/gsd/auto-post-unit.ts +0 -1
  148. package/src/resources/extensions/gsd/auto-start.ts +29 -19
  149. package/src/resources/extensions/gsd/auto.ts +12 -17
  150. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +23 -1
  151. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +40 -9
  152. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +109 -0
  153. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  154. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +42 -4
  155. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +13 -1
  156. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
  157. package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
  158. package/src/resources/extensions/gsd/error-classifier.ts +10 -3
  159. package/src/resources/extensions/gsd/exec-history.ts +153 -0
  160. package/src/resources/extensions/gsd/exec-sandbox.ts +326 -0
  161. package/src/resources/extensions/gsd/gsd-db.ts +68 -4
  162. package/src/resources/extensions/gsd/guided-flow.ts +221 -0
  163. package/src/resources/extensions/gsd/health-widget.ts +3 -1
  164. package/src/resources/extensions/gsd/key-manager.ts +6 -0
  165. package/src/resources/extensions/gsd/model-router.ts +42 -1
  166. package/src/resources/extensions/gsd/pre-execution-checks.ts +36 -10
  167. package/src/resources/extensions/gsd/preferences-types.ts +38 -0
  168. package/src/resources/extensions/gsd/preferences-validation.ts +79 -0
  169. package/src/resources/extensions/gsd/preferences.ts +17 -17
  170. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -0
  171. package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
  172. package/src/resources/extensions/gsd/safety/file-change-validator.ts +1 -1
  173. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +123 -0
  174. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +31 -0
  175. package/src/resources/extensions/gsd/tests/exec-history.test.ts +124 -0
  176. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +210 -0
  177. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +20 -0
  178. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +151 -0
  179. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +1 -1
  180. package/src/resources/extensions/gsd/tests/key-manager.test.ts +7 -0
  181. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +14 -0
  182. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +234 -0
  183. package/src/resources/extensions/gsd/tests/preferences.test.ts +110 -0
  184. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
  185. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +48 -0
  186. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
  187. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +9 -3
  188. package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
  189. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
  190. package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
  191. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
  192. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
  193. package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
  194. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +3 -1
  195. package/src/resources/extensions/gsd/token-counter.ts +22 -5
  196. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
  197. package/src/resources/extensions/gsd/tools/exec-tool.ts +183 -0
  198. package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
  199. package/src/resources/extensions/gsd/workflow-logger.ts +2 -1
  200. package/src/resources/extensions/gsd/workflow-mcp.ts +3 -0
  201. /package/dist/web/standalone/.next/static/{7iJDIT41wyL1lOgpDXINh → 5qAwYhcU5Fs2VOq_R8lOc}/_buildManifest.js +0 -0
  202. /package/dist/web/standalone/.next/static/{7iJDIT41wyL1lOgpDXINh → 5qAwYhcU5Fs2VOq_R8lOc}/_ssgManifest.js +0 -0
@@ -0,0 +1,183 @@
1
+ // GSD Exec Tool — executor for the gsd_exec MCP tool.
2
+ //
3
+ // Thin wrapper around exec-sandbox.ts that reads effective options from
4
+ // the project preferences (context_mode block) and formats the result
5
+ // for MCP return.
6
+
7
+ import {
8
+ EXEC_DEFAULTS,
9
+ runExecSandbox,
10
+ type ExecSandboxOptions,
11
+ type ExecSandboxRequest,
12
+ type ExecSandboxResult,
13
+ } from "../exec-sandbox.js";
14
+ import { isContextModeEnabled, type ContextModeConfig } from "../preferences-types.js";
15
+
16
+ export interface ExecToolParams {
17
+ runtime: ExecSandboxRequest["runtime"];
18
+ script: string;
19
+ purpose?: string;
20
+ timeout_ms?: number;
21
+ }
22
+
23
+ export interface ToolExecutionResult {
24
+ content: Array<{ type: "text"; text: string }>;
25
+ details: Record<string, unknown>;
26
+ isError?: boolean;
27
+ }
28
+
29
+ export interface ExecToolDeps {
30
+ baseDir: string;
31
+ preferences: { context_mode?: ContextModeConfig } | null;
32
+ /** Optional override for testing. */
33
+ run?: (req: ExecSandboxRequest, opts: ExecSandboxOptions) => Promise<ExecSandboxResult>;
34
+ now?: () => Date;
35
+ generateId?: () => string;
36
+ }
37
+
38
+ export function buildExecOptions(
39
+ baseDir: string,
40
+ cfg: ContextModeConfig | undefined,
41
+ extras?: Pick<ExecSandboxOptions, "env" | "now" | "generateId">,
42
+ ): ExecSandboxOptions {
43
+ const allowlist = Array.isArray(cfg?.exec_env_allowlist) ? cfg!.exec_env_allowlist! : EXEC_DEFAULTS.envAllowlist;
44
+ const stdoutCap = clampNumber(
45
+ cfg?.exec_stdout_cap_bytes,
46
+ EXEC_DEFAULTS.stdoutCapBytes,
47
+ 4_096,
48
+ 16_777_216,
49
+ );
50
+ const defaultTimeout = clampNumber(
51
+ cfg?.exec_timeout_ms,
52
+ EXEC_DEFAULTS.defaultTimeoutMs,
53
+ 1_000,
54
+ EXEC_DEFAULTS.clampTimeoutMs,
55
+ );
56
+ const digestChars = clampNumber(cfg?.exec_digest_chars, EXEC_DEFAULTS.digestChars, 0, 4_000);
57
+ return {
58
+ baseDir,
59
+ clamp_timeout_ms: EXEC_DEFAULTS.clampTimeoutMs,
60
+ default_timeout_ms: defaultTimeout,
61
+ stdout_cap_bytes: stdoutCap,
62
+ stderr_cap_bytes: EXEC_DEFAULTS.stderrCapBytes,
63
+ digest_chars: digestChars,
64
+ env_allowlist: allowlist,
65
+ ...extras,
66
+ };
67
+ }
68
+
69
+ function clampNumber(value: unknown, fallback: number, min: number, max: number): number {
70
+ if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
71
+ if (value < min) return min;
72
+ if (value > max) return max;
73
+ return Math.floor(value);
74
+ }
75
+
76
+ function isEnabled(prefs: ExecToolDeps["preferences"]): boolean {
77
+ return isContextModeEnabled(prefs);
78
+ }
79
+
80
+ function disabledResult(): ToolExecutionResult {
81
+ return {
82
+ content: [
83
+ {
84
+ type: "text",
85
+ text:
86
+ "gsd_exec is disabled by `context_mode.enabled: false` in preferences. Remove that " +
87
+ "override (or set it to true) to re-enable sandboxed tool-output execution.",
88
+ },
89
+ ],
90
+ details: { operation: "gsd_exec", error: "context_mode_disabled" },
91
+ isError: true,
92
+ };
93
+ }
94
+
95
+ function paramError(message: string): ToolExecutionResult {
96
+ return {
97
+ content: [{ type: "text", text: `Error: ${message}` }],
98
+ details: { operation: "gsd_exec", error: "invalid_params", detail: message },
99
+ isError: true,
100
+ };
101
+ }
102
+
103
+ export async function executeGsdExec(
104
+ params: ExecToolParams,
105
+ deps: ExecToolDeps,
106
+ ): Promise<ToolExecutionResult> {
107
+ if (!isEnabled(deps.preferences)) return disabledResult();
108
+
109
+ const runtime = params.runtime;
110
+ if (runtime !== "bash" && runtime !== "node" && runtime !== "python") {
111
+ return paramError(`invalid runtime "${String(runtime)}" — must be bash | node | python`);
112
+ }
113
+ const script = typeof params.script === "string" ? params.script : "";
114
+ if (script.trim().length === 0) {
115
+ return paramError("script is required and must be a non-empty string");
116
+ }
117
+ if (Buffer.byteLength(script, "utf8") > 200_000) {
118
+ return paramError("script exceeds the 200 KB length limit");
119
+ }
120
+
121
+ const opts = buildExecOptions(
122
+ deps.baseDir,
123
+ deps.preferences?.context_mode,
124
+ { now: deps.now, generateId: deps.generateId },
125
+ );
126
+ const run = deps.run ?? runExecSandbox;
127
+
128
+ try {
129
+ const result = await run(
130
+ {
131
+ runtime,
132
+ script,
133
+ ...(typeof params.purpose === "string" ? { purpose: params.purpose } : {}),
134
+ ...(typeof params.timeout_ms === "number" ? { timeout_ms: params.timeout_ms } : {}),
135
+ },
136
+ opts,
137
+ );
138
+ return formatResult(result);
139
+ } catch (err) {
140
+ const message = err instanceof Error ? err.message : String(err);
141
+ return {
142
+ content: [{ type: "text", text: `Error: gsd_exec failed — ${message}` }],
143
+ details: { operation: "gsd_exec", error: message },
144
+ isError: true,
145
+ };
146
+ }
147
+ }
148
+
149
+ function formatResult(result: ExecSandboxResult): ToolExecutionResult {
150
+ const headerLines = [
151
+ `gsd_exec[${result.id}] runtime=${result.runtime} exit=${formatExit(result)} duration=${result.duration_ms}ms`,
152
+ ` stdout: ${result.stdout_bytes}B${result.stdout_truncated ? " (truncated)" : ""} → ${result.stdout_path}`,
153
+ ` stderr: ${result.stderr_bytes}B${result.stderr_truncated ? " (truncated)" : ""} → ${result.stderr_path}`,
154
+ ];
155
+ const summary = `${headerLines.join("\n")}\n--- digest ---\n${result.digest}`.trimEnd();
156
+ return {
157
+ content: [{ type: "text", text: summary }],
158
+ details: {
159
+ operation: "gsd_exec",
160
+ id: result.id,
161
+ runtime: result.runtime,
162
+ exit_code: result.exit_code,
163
+ signal: result.signal,
164
+ timed_out: result.timed_out,
165
+ duration_ms: result.duration_ms,
166
+ stdout_bytes: result.stdout_bytes,
167
+ stderr_bytes: result.stderr_bytes,
168
+ stdout_truncated: result.stdout_truncated,
169
+ stderr_truncated: result.stderr_truncated,
170
+ stdout_path: result.stdout_path,
171
+ stderr_path: result.stderr_path,
172
+ meta_path: result.meta_path,
173
+ },
174
+ isError: result.timed_out || result.signal !== null || result.exit_code !== 0,
175
+ };
176
+ }
177
+
178
+ function formatExit(result: ExecSandboxResult): string {
179
+ if (result.timed_out) return "timeout";
180
+ if (result.signal) return `signal:${result.signal}`;
181
+ if (result.exit_code === null) return "null";
182
+ return String(result.exit_code);
183
+ }
@@ -0,0 +1,40 @@
1
+ // GSD Resume Tool — returns the contents of .gsd/last-snapshot.md so
2
+ // agents can re-orient after compaction or session resume without
3
+ // re-deriving project memory state.
4
+
5
+ import { readCompactionSnapshot } from "../compaction-snapshot.js";
6
+
7
+ export interface ResumeToolParams {
8
+ /** Ignored — reserved for future variant (e.g. dated snapshots). */
9
+ _variant?: string;
10
+ }
11
+
12
+ export interface ToolExecutionResult {
13
+ content: Array<{ type: "text"; text: string }>;
14
+ details: Record<string, unknown>;
15
+ isError?: boolean;
16
+ }
17
+
18
+ export function executeResume(
19
+ _params: ResumeToolParams,
20
+ opts: { baseDir: string },
21
+ ): ToolExecutionResult {
22
+ const snapshot = readCompactionSnapshot(opts.baseDir);
23
+ if (snapshot == null) {
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text:
29
+ "No snapshot found at .gsd/last-snapshot.md. The snapshot is written automatically " +
30
+ "on session_before_compact (enabled by default; set context_mode.enabled=false to opt out).",
31
+ },
32
+ ],
33
+ details: { operation: "gsd_resume", found: false },
34
+ };
35
+ }
36
+ return {
37
+ content: [{ type: "text", text: snapshot }],
38
+ details: { operation: "gsd_resume", found: true, bytes: Buffer.byteLength(snapshot, "utf-8") },
39
+ };
40
+ }
@@ -57,7 +57,8 @@ export type LogComponent =
57
57
  | "ecosystem" // GSD ecosystem extension loader and dispatch
58
58
  | "memory-embeddings" // Memory layer embedding generation
59
59
  | "memory-ingest" // Memory layer ingestion pipeline
60
- | "memory-backfill"; // ADR-013: decisions->memories backfill
60
+ | "memory-backfill" // ADR-013: decisions->memories backfill
61
+ | "context-mode"; // Context-mode exec sandbox and compaction snapshot
61
62
 
62
63
  export interface LogEntry {
63
64
  ts: string;
@@ -23,6 +23,9 @@ export interface WorkflowCapabilityOptions {
23
23
  const MCP_WORKFLOW_TOOL_SURFACE = new Set([
24
24
  "ask_user_questions",
25
25
  "gsd_decision_save",
26
+ "gsd_exec",
27
+ "gsd_exec_search",
28
+ "gsd_resume",
26
29
  "gsd_complete_milestone",
27
30
  "gsd_complete_task",
28
31
  "gsd_complete_slice",