gsd-pi 2.67.0-dev.1cd1e0f → 2.67.0-dev.2367d7e
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.
- package/README.md +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +155 -70
- package/dist/resources/extensions/gsd/auto/phases.js +17 -0
- package/dist/resources/extensions/gsd/auto/session.js +10 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +12 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
- package/dist/resources/extensions/gsd/auto-start.js +16 -30
- package/dist/resources/extensions/gsd/auto-worktree.js +62 -15
- package/dist/resources/extensions/gsd/auto.js +121 -59
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -435
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +7 -64
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +7 -2
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -25
- package/dist/resources/extensions/gsd/commands/index.js +8 -1
- package/dist/resources/extensions/gsd/commands-mcp-status.js +43 -7
- package/dist/resources/extensions/gsd/doctor-git-checks.js +4 -4
- package/dist/resources/extensions/gsd/doctor-proactive.js +3 -3
- package/dist/resources/extensions/gsd/doctor.js +8 -4
- package/dist/resources/extensions/gsd/gsd-db.js +11 -0
- package/dist/resources/extensions/gsd/guided-flow.js +56 -31
- package/dist/resources/extensions/gsd/init-wizard.js +37 -0
- package/dist/resources/extensions/gsd/interrupted-session.js +146 -0
- package/dist/resources/extensions/gsd/mcp-project-config.js +83 -0
- package/dist/resources/extensions/gsd/state.js +7 -2
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +508 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +18 -3
- package/dist/resources/extensions/gsd/workflow-mcp.js +261 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/2826.821e01b07d92e948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/app/{page-0c485498795110d6.js → page-f1e30ab6bb269149.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/{webpack-b49b09f97429b5d0.js → webpack-6e4d7e9a4f57bed4.js} +1 -1
- package/package.json +4 -2
- package/packages/mcp-server/README.md +38 -0
- package/packages/mcp-server/dist/cli.d.ts +9 -0
- package/packages/mcp-server/dist/cli.d.ts.map +1 -0
- package/packages/mcp-server/dist/cli.js +58 -0
- package/packages/mcp-server/dist/cli.js.map +1 -0
- package/packages/mcp-server/dist/index.d.ts +20 -0
- package/packages/mcp-server/dist/index.d.ts.map +1 -0
- package/packages/mcp-server/dist/index.js +14 -0
- package/packages/mcp-server/dist/index.js.map +1 -0
- package/packages/mcp-server/dist/readers/captures.d.ts +25 -0
- package/packages/mcp-server/dist/readers/captures.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/captures.js +67 -0
- package/packages/mcp-server/dist/readers/captures.js.map +1 -0
- package/packages/mcp-server/dist/readers/doctor-lite.d.ts +20 -0
- package/packages/mcp-server/dist/readers/doctor-lite.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/doctor-lite.js +173 -0
- package/packages/mcp-server/dist/readers/doctor-lite.js.map +1 -0
- package/packages/mcp-server/dist/readers/index.d.ts +14 -0
- package/packages/mcp-server/dist/readers/index.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/index.js +10 -0
- package/packages/mcp-server/dist/readers/index.js.map +1 -0
- package/packages/mcp-server/dist/readers/knowledge.d.ts +18 -0
- package/packages/mcp-server/dist/readers/knowledge.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/knowledge.js +82 -0
- package/packages/mcp-server/dist/readers/knowledge.js.map +1 -0
- package/packages/mcp-server/dist/readers/metrics.d.ts +32 -0
- package/packages/mcp-server/dist/readers/metrics.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/metrics.js +74 -0
- package/packages/mcp-server/dist/readers/metrics.js.map +1 -0
- package/packages/mcp-server/dist/readers/paths.d.ts +42 -0
- package/packages/mcp-server/dist/readers/paths.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/paths.js +199 -0
- package/packages/mcp-server/dist/readers/paths.js.map +1 -0
- package/packages/mcp-server/dist/readers/roadmap.d.ts +26 -0
- package/packages/mcp-server/dist/readers/roadmap.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/roadmap.js +194 -0
- package/packages/mcp-server/dist/readers/roadmap.js.map +1 -0
- package/packages/mcp-server/dist/readers/state.d.ts +43 -0
- package/packages/mcp-server/dist/readers/state.d.ts.map +1 -0
- package/packages/mcp-server/dist/readers/state.js +184 -0
- package/packages/mcp-server/dist/readers/state.js.map +1 -0
- package/packages/mcp-server/dist/server.d.ts +28 -0
- package/packages/mcp-server/dist/server.d.ts.map +1 -0
- package/packages/mcp-server/dist/server.js +319 -0
- package/packages/mcp-server/dist/server.js.map +1 -0
- package/packages/mcp-server/dist/session-manager.d.ts +54 -0
- package/packages/mcp-server/dist/session-manager.d.ts.map +1 -0
- package/packages/mcp-server/dist/session-manager.js +284 -0
- package/packages/mcp-server/dist/session-manager.js.map +1 -0
- package/packages/mcp-server/dist/types.d.ts +61 -0
- package/packages/mcp-server/dist/types.d.ts.map +1 -0
- package/packages/mcp-server/dist/types.js +11 -0
- package/packages/mcp-server/dist/types.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts +9 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.js +532 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -0
- package/packages/mcp-server/src/server.ts +6 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +976 -0
- package/packages/mcp-server/src/workflow-tools.ts +997 -0
- package/packages/mcp-server/tsconfig.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +14 -6
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.test.ts +53 -0
- package/packages/pi-agent-core/src/agent-loop.ts +20 -6
- package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts +43 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.js +208 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.js +227 -0
- package/packages/pi-coding-agent/dist/core/contextual-tips.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -0
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +28 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +17 -12
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts +4 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +14 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +3 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +15 -12
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/src/core/contextual-tips.test.ts +259 -0
- package/packages/pi-coding-agent/src/core/contextual-tips.ts +232 -0
- package/packages/pi-coding-agent/src/core/index.ts +2 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +54 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +18 -12
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +21 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +19 -15
- package/packages/rpc-client/dist/index.d.ts +10 -0
- package/packages/rpc-client/dist/index.d.ts.map +1 -0
- package/packages/rpc-client/dist/index.js +9 -0
- package/packages/rpc-client/dist/index.js.map +1 -0
- package/packages/rpc-client/dist/jsonl.d.ts +17 -0
- package/packages/rpc-client/dist/jsonl.d.ts.map +1 -0
- package/packages/rpc-client/dist/jsonl.js +54 -0
- package/packages/rpc-client/dist/jsonl.js.map +1 -0
- package/packages/rpc-client/dist/rpc-client.d.ts +259 -0
- package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-client.js +541 -0
- package/packages/rpc-client/dist/rpc-client.js.map +1 -0
- package/packages/rpc-client/dist/rpc-client.test.d.ts +2 -0
- package/packages/rpc-client/dist/rpc-client.test.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-client.test.js +477 -0
- package/packages/rpc-client/dist/rpc-client.test.js.map +1 -0
- package/packages/rpc-client/dist/rpc-types.d.ts +566 -0
- package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -0
- package/packages/rpc-client/dist/rpc-types.js +12 -0
- package/packages/rpc-client/dist/rpc-types.js.map +1 -0
- package/scripts/ensure-workspace-builds.cjs +2 -0
- package/scripts/link-workspace-packages.cjs +21 -14
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +193 -93
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +173 -79
- package/src/resources/extensions/gsd/auto/phases.ts +25 -0
- package/src/resources/extensions/gsd/auto/session.ts +10 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +20 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
- package/src/resources/extensions/gsd/auto-start.ts +23 -55
- package/src/resources/extensions/gsd/auto-worktree.ts +59 -15
- package/src/resources/extensions/gsd/auto.ts +133 -64
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -435
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -5
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +7 -72
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -2
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +122 -6
- package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +53 -26
- package/src/resources/extensions/gsd/commands/index.ts +7 -1
- package/src/resources/extensions/gsd/commands-mcp-status.ts +53 -7
- package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -4
- package/src/resources/extensions/gsd/doctor-proactive.ts +3 -3
- package/src/resources/extensions/gsd/doctor.ts +9 -5
- package/src/resources/extensions/gsd/gsd-db.ts +12 -0
- package/src/resources/extensions/gsd/guided-flow.ts +66 -36
- package/src/resources/extensions/gsd/init-wizard.ts +40 -0
- package/src/resources/extensions/gsd/interrupted-session.ts +224 -0
- package/src/resources/extensions/gsd/mcp-project-config.ts +128 -0
- package/src/resources/extensions/gsd/state.ts +7 -1
- package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +668 -2
- package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +380 -2
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +52 -1
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +2 -9
- package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -33
- package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +169 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/interrupted-session-ui.test.ts +136 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +85 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +500 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +625 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +629 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +19 -3
- package/src/resources/extensions/gsd/workflow-mcp.ts +320 -0
- package/dist/web/standalone/.next/static/chunks/6502.b804e48b7919f55e.js +0 -9
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts +0 -13
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js +0 -27
- package/packages/pi-coding-agent/dist/modes/interactive/provider-auth-setup.js.map +0 -1
- package/packages/pi-coding-agent/src/modes/interactive/provider-auth-setup.ts +0 -40
- /package/dist/web/standalone/.next/static/{PHqEommYRR8CRn3i84CGM → WMDT_0C0XDkBKtsAI_AX4}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{PHqEommYRR8CRn3i84CGM → WMDT_0C0XDkBKtsAI_AX4}/_ssgManifest.js +0 -0
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* link-workspace-packages.cjs
|
|
4
4
|
*
|
|
5
|
-
* Creates node_modules/@gsd/* symlinks pointing
|
|
5
|
+
* Creates node_modules/@gsd/* and node_modules/@gsd-build/* symlinks pointing
|
|
6
|
+
* to shipped packages/* directories.
|
|
6
7
|
*
|
|
7
8
|
* During development, npm workspaces creates these automatically. But in the
|
|
8
9
|
* published tarball, workspace packages are shipped under packages/ (via the
|
|
@@ -20,27 +21,33 @@ const { resolve, join } = require('path')
|
|
|
20
21
|
|
|
21
22
|
const root = resolve(__dirname, '..')
|
|
22
23
|
const packagesDir = join(root, 'packages')
|
|
23
|
-
const
|
|
24
|
+
const scopeDirs = {
|
|
25
|
+
'@gsd': join(root, 'node_modules', '@gsd'),
|
|
26
|
+
'@gsd-build': join(root, 'node_modules', '@gsd-build'),
|
|
27
|
+
}
|
|
24
28
|
|
|
25
|
-
// Map directory names to package names
|
|
29
|
+
// Map directory names to scoped package names
|
|
26
30
|
const packageMap = {
|
|
27
|
-
'native': 'native',
|
|
28
|
-
'pi-agent-core': 'pi-agent-core',
|
|
29
|
-
'pi-ai': 'pi-ai',
|
|
30
|
-
'pi-coding-agent': 'pi-coding-agent',
|
|
31
|
-
'pi-tui': 'pi-tui',
|
|
31
|
+
'native': { scope: '@gsd', name: 'native' },
|
|
32
|
+
'pi-agent-core': { scope: '@gsd', name: 'pi-agent-core' },
|
|
33
|
+
'pi-ai': { scope: '@gsd', name: 'pi-ai' },
|
|
34
|
+
'pi-coding-agent': { scope: '@gsd', name: 'pi-coding-agent' },
|
|
35
|
+
'pi-tui': { scope: '@gsd', name: 'pi-tui' },
|
|
36
|
+
'rpc-client': { scope: '@gsd-build', name: 'rpc-client' },
|
|
32
37
|
}
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
if (!existsSync(
|
|
36
|
-
|
|
39
|
+
for (const scopeDir of Object.values(scopeDirs)) {
|
|
40
|
+
if (!existsSync(scopeDir)) {
|
|
41
|
+
mkdirSync(scopeDir, { recursive: true })
|
|
42
|
+
}
|
|
37
43
|
}
|
|
38
44
|
|
|
39
45
|
let linked = 0
|
|
40
46
|
let copied = 0
|
|
41
|
-
for (const [dir,
|
|
47
|
+
for (const [dir, pkg] of Object.entries(packageMap)) {
|
|
42
48
|
const source = join(packagesDir, dir)
|
|
43
|
-
const
|
|
49
|
+
const scopeDir = scopeDirs[pkg.scope]
|
|
50
|
+
const target = join(scopeDir, pkg.name)
|
|
44
51
|
|
|
45
52
|
if (!existsSync(source)) continue
|
|
46
53
|
|
|
@@ -50,7 +57,7 @@ for (const [dir, name] of Object.entries(packageMap)) {
|
|
|
50
57
|
const stat = lstatSync(target)
|
|
51
58
|
if (stat.isSymbolicLink()) {
|
|
52
59
|
const linkTarget = readlinkSync(target)
|
|
53
|
-
if (resolve(join(
|
|
60
|
+
if (resolve(join(scopeDir, linkTarget)) === source || linkTarget === source) {
|
|
54
61
|
continue // Already correct
|
|
55
62
|
}
|
|
56
63
|
unlinkSync(target) // Wrong target, relink
|
|
@@ -14,17 +14,37 @@ import type {
|
|
|
14
14
|
Context,
|
|
15
15
|
Model,
|
|
16
16
|
SimpleStreamOptions,
|
|
17
|
+
ToolCall,
|
|
17
18
|
} from "@gsd/pi-ai";
|
|
18
19
|
import { EventStream } from "@gsd/pi-ai";
|
|
19
20
|
import { execSync } from "node:child_process";
|
|
20
21
|
import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
|
|
22
|
+
import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
|
|
21
23
|
import type {
|
|
22
24
|
SDKAssistantMessage,
|
|
23
25
|
SDKMessage,
|
|
24
26
|
SDKPartialAssistantMessage,
|
|
25
27
|
SDKResultMessage,
|
|
28
|
+
SDKUserMessage,
|
|
26
29
|
} from "./sdk-types.js";
|
|
27
30
|
|
|
31
|
+
export interface ExternalToolResultContentBlock {
|
|
32
|
+
type: string;
|
|
33
|
+
text?: string;
|
|
34
|
+
data?: string;
|
|
35
|
+
mimeType?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ExternalToolResultPayload {
|
|
39
|
+
content: ExternalToolResultContentBlock[];
|
|
40
|
+
details?: Record<string, unknown>;
|
|
41
|
+
isError: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type ToolCallWithExternalResult = ToolCall & {
|
|
45
|
+
externalResult?: ExternalToolResultPayload;
|
|
46
|
+
};
|
|
47
|
+
|
|
28
48
|
// ---------------------------------------------------------------------------
|
|
29
49
|
// Stream factory
|
|
30
50
|
// ---------------------------------------------------------------------------
|
|
@@ -152,89 +172,6 @@ export function makeStreamExhaustedErrorMessage(model: string, lastTextContent:
|
|
|
152
172
|
return message;
|
|
153
173
|
}
|
|
154
174
|
|
|
155
|
-
/**
|
|
156
|
-
* Claude Code executes its own internal tool loop inside the SDK call. The
|
|
157
|
-
* streamed and final assistant messages should therefore contain only
|
|
158
|
-
* user-facing content (text/thinking), not replayable tool blocks that GSD
|
|
159
|
-
* would render again.
|
|
160
|
-
*/
|
|
161
|
-
function isUserFacingClaudeCodeBlock(block: AssistantMessage["content"][number]): boolean {
|
|
162
|
-
return block.type === "text" || block.type === "thinking";
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function filterUserFacingClaudeCodeContent(
|
|
166
|
-
blocks: AssistantMessage["content"],
|
|
167
|
-
): AssistantMessage["content"] {
|
|
168
|
-
return blocks.filter(isUserFacingClaudeCodeBlock);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
function remapClaudeCodeContentIndex(
|
|
172
|
-
blocks: AssistantMessage["content"],
|
|
173
|
-
contentIndex: number,
|
|
174
|
-
): number {
|
|
175
|
-
let visibleCount = 0;
|
|
176
|
-
for (let i = 0; i <= contentIndex && i < blocks.length; i++) {
|
|
177
|
-
if (isUserFacingClaudeCodeBlock(blocks[i]!)) visibleCount++;
|
|
178
|
-
}
|
|
179
|
-
return Math.max(0, visibleCount - 1);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
function sanitizeClaudeCodePartial(
|
|
183
|
-
partial: AssistantMessage,
|
|
184
|
-
): AssistantMessage {
|
|
185
|
-
return {
|
|
186
|
-
...partial,
|
|
187
|
-
content: filterUserFacingClaudeCodeContent(partial.content),
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
export function sanitizeClaudeCodeStreamingEvent(
|
|
192
|
-
event: AssistantMessageEvent,
|
|
193
|
-
): AssistantMessageEvent | null {
|
|
194
|
-
switch (event.type) {
|
|
195
|
-
case "toolcall_start":
|
|
196
|
-
case "toolcall_delta":
|
|
197
|
-
case "toolcall_end":
|
|
198
|
-
case "server_tool_use":
|
|
199
|
-
case "web_search_result":
|
|
200
|
-
return null;
|
|
201
|
-
case "text_start":
|
|
202
|
-
case "text_delta":
|
|
203
|
-
case "text_end":
|
|
204
|
-
case "thinking_start":
|
|
205
|
-
case "thinking_delta":
|
|
206
|
-
case "thinking_end":
|
|
207
|
-
return {
|
|
208
|
-
...event,
|
|
209
|
-
contentIndex: remapClaudeCodeContentIndex(event.partial.content, event.contentIndex),
|
|
210
|
-
partial: sanitizeClaudeCodePartial(event.partial),
|
|
211
|
-
};
|
|
212
|
-
default:
|
|
213
|
-
return event;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export function buildFinalClaudeCodeContent(
|
|
218
|
-
blocks: AssistantMessage["content"],
|
|
219
|
-
lastThinkingContent: string,
|
|
220
|
-
lastTextContent: string,
|
|
221
|
-
resultText?: string,
|
|
222
|
-
): AssistantMessage["content"] {
|
|
223
|
-
const finalContent = filterUserFacingClaudeCodeContent(blocks);
|
|
224
|
-
if (finalContent.length > 0) return finalContent;
|
|
225
|
-
|
|
226
|
-
if (lastThinkingContent) {
|
|
227
|
-
finalContent.push({ type: "thinking", thinking: lastThinkingContent });
|
|
228
|
-
}
|
|
229
|
-
if (lastTextContent) {
|
|
230
|
-
finalContent.push({ type: "text", text: lastTextContent });
|
|
231
|
-
}
|
|
232
|
-
if (finalContent.length === 0 && resultText) {
|
|
233
|
-
finalContent.push({ type: "text", text: resultText });
|
|
234
|
-
}
|
|
235
|
-
return finalContent;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
175
|
// ---------------------------------------------------------------------------
|
|
239
176
|
// SDK options builder
|
|
240
177
|
// ---------------------------------------------------------------------------
|
|
@@ -246,6 +183,7 @@ export function buildFinalClaudeCodeContent(
|
|
|
246
183
|
* beta flags, and other configuration without mocking the full SDK.
|
|
247
184
|
*/
|
|
248
185
|
export function buildSdkOptions(modelId: string, prompt: string): Record<string, unknown> {
|
|
186
|
+
const mcpServers = buildWorkflowMcpServers();
|
|
249
187
|
return {
|
|
250
188
|
pathToClaudeCodeExecutable: getClaudePath(),
|
|
251
189
|
model: modelId,
|
|
@@ -256,10 +194,115 @@ export function buildSdkOptions(modelId: string, prompt: string): Record<string,
|
|
|
256
194
|
allowDangerouslySkipPermissions: true,
|
|
257
195
|
settingSources: ["project"],
|
|
258
196
|
systemPrompt: { type: "preset", preset: "claude_code" },
|
|
197
|
+
...(mcpServers ? { mcpServers } : {}),
|
|
259
198
|
betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
|
|
260
199
|
};
|
|
261
200
|
}
|
|
262
201
|
|
|
202
|
+
function normalizeToolResultContent(content: unknown): ExternalToolResultContentBlock[] {
|
|
203
|
+
if (typeof content === "string") {
|
|
204
|
+
return [{ type: "text", text: content }];
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (!Array.isArray(content)) {
|
|
208
|
+
if (content == null) return [{ type: "text", text: "" }];
|
|
209
|
+
return [{ type: "text", text: JSON.stringify(content) }];
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const blocks: ExternalToolResultContentBlock[] = [];
|
|
213
|
+
|
|
214
|
+
for (const item of content) {
|
|
215
|
+
if (typeof item === "string") {
|
|
216
|
+
blocks.push({ type: "text", text: item });
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (!item || typeof item !== "object") {
|
|
220
|
+
blocks.push({ type: "text", text: String(item) });
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const block = item as Record<string, unknown>;
|
|
225
|
+
if (block.type === "text") {
|
|
226
|
+
blocks.push({ type: "text", text: typeof block.text === "string" ? block.text : "" });
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (
|
|
230
|
+
block.type === "image"
|
|
231
|
+
&& typeof block.data === "string"
|
|
232
|
+
&& typeof block.mimeType === "string"
|
|
233
|
+
) {
|
|
234
|
+
blocks.push({ type: "image", data: block.data, mimeType: block.mimeType });
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
blocks.push({ type: "text", text: JSON.stringify(block) });
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return blocks.length > 0 ? blocks : [{ type: "text", text: "" }];
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export function extractToolResultsFromSdkUserMessage(message: SDKUserMessage): Array<{
|
|
245
|
+
toolUseId: string;
|
|
246
|
+
result: ExternalToolResultPayload;
|
|
247
|
+
}> {
|
|
248
|
+
const extracted: Array<{ toolUseId: string; result: ExternalToolResultPayload }> = [];
|
|
249
|
+
const seen = new Set<string>();
|
|
250
|
+
const rawMessage = message.message as Record<string, unknown> | null | undefined;
|
|
251
|
+
const content = Array.isArray(rawMessage?.content) ? rawMessage.content : [];
|
|
252
|
+
|
|
253
|
+
for (const item of content) {
|
|
254
|
+
if (!item || typeof item !== "object") continue;
|
|
255
|
+
const block = item as Record<string, unknown>;
|
|
256
|
+
const type = typeof block.type === "string" ? block.type : "";
|
|
257
|
+
if (type !== "tool_result" && type !== "mcp_tool_result") continue;
|
|
258
|
+
|
|
259
|
+
const toolUseId = typeof block.tool_use_id === "string" ? block.tool_use_id : "";
|
|
260
|
+
if (!toolUseId || seen.has(toolUseId)) continue;
|
|
261
|
+
seen.add(toolUseId);
|
|
262
|
+
|
|
263
|
+
extracted.push({
|
|
264
|
+
toolUseId,
|
|
265
|
+
result: {
|
|
266
|
+
content: normalizeToolResultContent(block.content),
|
|
267
|
+
details: {},
|
|
268
|
+
isError: block.is_error === true,
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (extracted.length === 0) {
|
|
274
|
+
const fallback = message.tool_use_result;
|
|
275
|
+
if (fallback && typeof fallback === "object") {
|
|
276
|
+
const toolResult = fallback as Record<string, unknown>;
|
|
277
|
+
const toolUseId = typeof toolResult.tool_use_id === "string" ? toolResult.tool_use_id : "";
|
|
278
|
+
if (toolUseId) {
|
|
279
|
+
extracted.push({
|
|
280
|
+
toolUseId,
|
|
281
|
+
result: {
|
|
282
|
+
content: normalizeToolResultContent(toolResult.content),
|
|
283
|
+
details: {},
|
|
284
|
+
isError: toolResult.is_error === true,
|
|
285
|
+
},
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return extracted;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function attachExternalResultsToToolCalls(
|
|
295
|
+
toolCalls: AssistantMessage["content"],
|
|
296
|
+
toolResultsById: ReadonlyMap<string, ExternalToolResultPayload>,
|
|
297
|
+
): void {
|
|
298
|
+
for (const block of toolCalls) {
|
|
299
|
+
if (block.type !== "toolCall") continue;
|
|
300
|
+
const externalResult = toolResultsById.get(block.id);
|
|
301
|
+
if (!externalResult) continue;
|
|
302
|
+
(block as ToolCallWithExternalResult).externalResult = externalResult;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
263
306
|
// ---------------------------------------------------------------------------
|
|
264
307
|
// streamSimple implementation
|
|
265
308
|
// ---------------------------------------------------------------------------
|
|
@@ -294,6 +337,10 @@ async function pumpSdkMessages(
|
|
|
294
337
|
/** Track the last text content seen across all assistant turns for the final message. */
|
|
295
338
|
let lastTextContent = "";
|
|
296
339
|
let lastThinkingContent = "";
|
|
340
|
+
/** Collect tool calls from intermediate SDK turns for tool_execution events. */
|
|
341
|
+
const intermediateToolCalls: AssistantMessage["content"] = [];
|
|
342
|
+
/** Preserve real external tool results from Claude Code's synthetic user messages. */
|
|
343
|
+
const toolResultsById = new Map<string, ExternalToolResultPayload>();
|
|
297
344
|
|
|
298
345
|
try {
|
|
299
346
|
// Dynamic import — the SDK is an optional dependency.
|
|
@@ -362,10 +409,9 @@ async function pumpSdkMessages(
|
|
|
362
409
|
if (!builder) break;
|
|
363
410
|
|
|
364
411
|
const assistantEvent = builder.handleEvent(event);
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
if (sanitizedEvent) stream.push(sanitizedEvent);
|
|
412
|
+
if (assistantEvent) {
|
|
413
|
+
stream.push(assistantEvent);
|
|
414
|
+
}
|
|
369
415
|
break;
|
|
370
416
|
}
|
|
371
417
|
|
|
@@ -393,9 +439,39 @@ async function pumpSdkMessages(
|
|
|
393
439
|
lastTextContent = block.text;
|
|
394
440
|
} else if (block.type === "thinking" && block.thinking) {
|
|
395
441
|
lastThinkingContent = block.thinking;
|
|
442
|
+
} else if (block.type === "toolCall") {
|
|
443
|
+
// Collect tool calls for externalToolExecution rendering
|
|
444
|
+
intermediateToolCalls.push(block);
|
|
396
445
|
}
|
|
397
446
|
}
|
|
398
447
|
}
|
|
448
|
+
|
|
449
|
+
// Extract tool results from the SDK's synthetic user message
|
|
450
|
+
// and attach to corresponding tool call blocks immediately.
|
|
451
|
+
for (const { toolUseId, result } of extractToolResultsFromSdkUserMessage(msg as SDKUserMessage)) {
|
|
452
|
+
toolResultsById.set(toolUseId, result);
|
|
453
|
+
}
|
|
454
|
+
attachExternalResultsToToolCalls(intermediateToolCalls, toolResultsById);
|
|
455
|
+
|
|
456
|
+
// Push a synthetic toolcall_end for each tool call from this turn
|
|
457
|
+
// so the TUI can render tool results in real-time during the SDK
|
|
458
|
+
// session instead of waiting until the entire session completes.
|
|
459
|
+
if (builder) {
|
|
460
|
+
for (const block of builder.message.content) {
|
|
461
|
+
if (block.type !== "toolCall") continue;
|
|
462
|
+
const extResult = (block as ToolCallWithExternalResult).externalResult;
|
|
463
|
+
if (!extResult) continue;
|
|
464
|
+
// Push a toolcall_end with result attached so the chat-controller
|
|
465
|
+
// can call updateResult on the pending ToolExecutionComponent.
|
|
466
|
+
stream.push({
|
|
467
|
+
type: "toolcall_end",
|
|
468
|
+
contentIndex: builder.message.content.indexOf(block),
|
|
469
|
+
toolCall: block,
|
|
470
|
+
partial: builder.message,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
399
475
|
builder = null;
|
|
400
476
|
break;
|
|
401
477
|
}
|
|
@@ -403,12 +479,36 @@ async function pumpSdkMessages(
|
|
|
403
479
|
// -- Result (terminal) --
|
|
404
480
|
case "result": {
|
|
405
481
|
const result = msg as SDKResultMessage;
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
482
|
+
|
|
483
|
+
// Build final message. Include intermediate tool calls so the
|
|
484
|
+
// agent loop's externalToolExecution path emits tool_execution
|
|
485
|
+
// events for proper TUI rendering, followed by the text response.
|
|
486
|
+
const finalContent: AssistantMessage["content"] = [];
|
|
487
|
+
|
|
488
|
+
// Add tool calls from intermediate turns first (renders above text)
|
|
489
|
+
attachExternalResultsToToolCalls(intermediateToolCalls, toolResultsById);
|
|
490
|
+
finalContent.push(...intermediateToolCalls);
|
|
491
|
+
|
|
492
|
+
// Add text/thinking from the last turn
|
|
493
|
+
if (builder && builder.message.content.length > 0) {
|
|
494
|
+
for (const block of builder.message.content) {
|
|
495
|
+
if (block.type === "text" || block.type === "thinking") {
|
|
496
|
+
finalContent.push(block);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
} else {
|
|
500
|
+
if (lastThinkingContent) {
|
|
501
|
+
finalContent.push({ type: "thinking", thinking: lastThinkingContent });
|
|
502
|
+
}
|
|
503
|
+
if (lastTextContent) {
|
|
504
|
+
finalContent.push({ type: "text", text: lastTextContent });
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Fallback: use the SDK's result text if we have no content
|
|
509
|
+
if (finalContent.length === 0 && result.subtype === "success" && result.result) {
|
|
510
|
+
finalContent.push({ type: "text", text: result.result });
|
|
511
|
+
}
|
|
412
512
|
|
|
413
513
|
const finalMessage: AssistantMessage = {
|
|
414
514
|
role: "assistant",
|