gsd-pi 2.58.0-dev.778d6ac → 2.58.0-dev.d63175c
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/cli.js +35 -49
- package/dist/headless-ui.d.ts +0 -17
- package/dist/headless-ui.js +3 -97
- package/dist/headless.js +6 -67
- package/dist/help-text.js +0 -1
- package/dist/onboarding.js +0 -44
- package/dist/resource-loader.js +1 -16
- package/dist/resources/agents/researcher.md +1 -1
- package/dist/resources/extensions/ask-user-questions.js +3 -16
- package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +6 -14
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +36 -59
- package/dist/resources/extensions/context7/extension-manifest.json +1 -1
- package/dist/resources/extensions/get-secrets-from-user.js +5 -8
- package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
- package/dist/resources/extensions/google-search/index.js +1 -2
- package/dist/resources/extensions/gsd/auto/phases.js +21 -25
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
- package/dist/resources/extensions/gsd/auto-dashboard.js +20 -37
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -17
- package/dist/resources/extensions/gsd/auto-model-selection.js +3 -26
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
- package/dist/resources/extensions/gsd/auto-recovery.js +5 -13
- package/dist/resources/extensions/gsd/auto-start.js +22 -35
- package/dist/resources/extensions/gsd/auto-worktree.js +12 -196
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +0 -32
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +8 -80
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -32
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -33
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +11 -44
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +0 -67
- package/dist/resources/extensions/gsd/captures.js +4 -56
- package/dist/resources/extensions/gsd/db-writer.js +8 -116
- package/dist/resources/extensions/gsd/doctor-git-checks.js +0 -28
- package/dist/resources/extensions/gsd/doctor-providers.js +1 -2
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +4 -5
- package/dist/resources/extensions/gsd/doctor.js +1 -3
- package/dist/resources/extensions/gsd/error-classifier.js +10 -13
- package/dist/resources/extensions/gsd/extension-manifest.json +1 -16
- package/dist/resources/extensions/gsd/forensics.js +20 -123
- package/dist/resources/extensions/gsd/git-service.js +1 -23
- package/dist/resources/extensions/gsd/gitignore.js +0 -33
- package/dist/resources/extensions/gsd/gsd-db.js +9 -36
- package/dist/resources/extensions/gsd/guided-flow.js +44 -106
- package/dist/resources/extensions/gsd/health-widget-core.js +0 -31
- package/dist/resources/extensions/gsd/health-widget.js +0 -17
- package/dist/resources/extensions/gsd/index.js +1 -1
- package/dist/resources/extensions/gsd/memory-extractor.js +0 -7
- package/dist/resources/extensions/gsd/migrate-external.js +1 -8
- package/dist/resources/extensions/gsd/model-cost-table.js +0 -18
- package/dist/resources/extensions/gsd/model-router.js +1 -35
- package/dist/resources/extensions/gsd/native-git-bridge.js +0 -17
- package/dist/resources/extensions/gsd/notifications.js +1 -16
- package/dist/resources/extensions/gsd/parallel-eligibility.js +2 -13
- package/dist/resources/extensions/gsd/parallel-merge.js +5 -78
- package/dist/resources/extensions/gsd/parsers-legacy.js +3 -20
- package/dist/resources/extensions/gsd/paths.js +0 -43
- package/dist/resources/extensions/gsd/preferences-models.js +1 -14
- package/dist/resources/extensions/gsd/preferences-types.js +1 -2
- package/dist/resources/extensions/gsd/preferences.js +16 -13
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -4
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/dist/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/dist/resources/extensions/gsd/repo-identity.js +11 -205
- package/dist/resources/extensions/gsd/rethink.js +0 -5
- package/dist/resources/extensions/gsd/roadmap-slices.js +4 -5
- package/dist/resources/extensions/gsd/state.js +27 -85
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/dist/resources/extensions/gsd/tools/complete-task.js +71 -34
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -12
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +1 -29
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -14
- package/dist/resources/extensions/gsd/triage-resolution.js +7 -22
- package/dist/resources/extensions/gsd/undo.js +2 -2
- package/dist/resources/extensions/gsd/unit-ownership.js +33 -164
- package/dist/resources/extensions/gsd/verdict-parser.js +8 -20
- package/dist/resources/extensions/gsd/workflow-manifest.js +5 -24
- package/dist/resources/extensions/gsd/workflow-projections.js +63 -95
- package/dist/resources/extensions/gsd/workflow-reconcile.js +5 -35
- package/dist/resources/extensions/gsd/workspace-index.js +0 -24
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -105
- package/dist/resources/extensions/gsd/worktree-resolver.js +3 -20
- package/dist/resources/extensions/mcp-client/index.js +7 -11
- package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/dist/resources/extensions/shared/interview-ui.js +1 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -17
- 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 +1 -1
- package/dist/web/standalone/.next/required-server-files.json +1 -1
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +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 +1 -1
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -17
- package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
- 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 +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-a1c1e452c6b32d04.js → webpack-61d3afac6d0f0ce7.js} +1 -1
- package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +1 -0
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +1 -2
- package/package.json +2 -2
- package/packages/native/dist/ast/index.js +5 -9
- package/packages/native/dist/ast/types.js +1 -2
- package/packages/native/dist/clipboard/index.js +7 -12
- package/packages/native/dist/clipboard/types.js +1 -2
- package/packages/native/dist/diff/index.js +7 -12
- package/packages/native/dist/diff/types.js +1 -2
- package/packages/native/dist/fd/index.js +3 -6
- package/packages/native/dist/fd/types.js +1 -2
- package/packages/native/dist/glob/index.js +5 -9
- package/packages/native/dist/glob/types.js +1 -2
- package/packages/native/dist/grep/index.js +5 -9
- package/packages/native/dist/grep/types.js +1 -2
- package/packages/native/dist/gsd-parser/index.js +11 -18
- package/packages/native/dist/gsd-parser/types.js +1 -2
- package/packages/native/dist/highlight/index.js +7 -12
- package/packages/native/dist/highlight/types.js +1 -2
- package/packages/native/dist/html/index.js +3 -6
- package/packages/native/dist/html/types.js +1 -2
- package/packages/native/dist/image/index.js +5 -10
- package/packages/native/dist/image/types.js +4 -7
- package/packages/native/dist/index.js +17 -70
- package/packages/native/dist/json-parse/index.js +8 -13
- package/packages/native/dist/native.js +10 -47
- package/packages/native/dist/ps/index.js +9 -15
- package/packages/native/dist/ps/types.js +1 -2
- package/packages/native/dist/stream-process/index.js +7 -12
- package/packages/native/dist/text/index.js +14 -24
- package/packages/native/dist/text/types.js +2 -5
- package/packages/native/dist/truncate/index.js +7 -12
- package/packages/native/dist/ttsr/index.js +7 -12
- package/packages/native/dist/ttsr/types.js +1 -2
- package/packages/native/dist/xxhash/index.js +5 -9
- package/packages/native/package.json +19 -19
- package/packages/native/src/native.ts +8 -9
- package/packages/pi-agent-core/dist/agent-loop.js +2 -3
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
- package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/proxy.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -3
- package/packages/pi-agent-core/src/proxy.ts +1 -1
- package/packages/pi-ai/dist/env-api-keys.js +0 -1
- package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
- package/packages/pi-ai/dist/index.d.ts +0 -1
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +0 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +2 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +3 -3
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.d.ts +0 -3
- package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/json-parse.js +1 -24
- package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
- package/packages/pi-ai/src/env-api-keys.ts +0 -1
- package/packages/pi-ai/src/index.ts +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.ts +2 -17
- package/packages/pi-ai/src/types.ts +2 -3
- package/packages/pi-ai/src/utils/json-parse.ts +1 -28
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -31
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +1 -17
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +2 -62
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/exec.js +1 -3
- package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +0 -4
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +0 -5
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +0 -3
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +2 -31
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +0 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +0 -10
- package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -12
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.js +1 -48
- package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -10
- package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +4 -13
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.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 +0 -4
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +0 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +0 -5
- package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -38
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +1 -94
- package/packages/pi-coding-agent/src/core/exec.ts +1 -3
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -4
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +0 -5
- package/packages/pi-coding-agent/src/core/index.ts +0 -6
- package/packages/pi-coding-agent/src/core/lsp/index.ts +0 -3
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +0 -3
- package/packages/pi-coding-agent/src/core/messages.ts +2 -29
- package/packages/pi-coding-agent/src/core/model-resolver.ts +0 -1
- package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -20
- package/packages/pi-coding-agent/src/core/retry-handler.ts +1 -52
- package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +3 -11
- package/packages/pi-coding-agent/src/core/tools/read.ts +4 -14
- package/packages/pi-coding-agent/src/index.ts +0 -6
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +0 -7
- package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +0 -6
- package/packages/pi-tui/dist/terminal.d.ts +0 -2
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +0 -9
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +0 -9
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/src/terminal.ts +0 -14
- package/packages/pi-tui/src/tui.ts +0 -8
- package/scripts/ensure-workspace-builds.cjs +14 -45
- package/src/resources/agents/researcher.md +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -21
- package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
- package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +6 -13
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +35 -63
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -28
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +1 -108
- package/src/resources/extensions/context7/extension-manifest.json +1 -1
- package/src/resources/extensions/get-secrets-from-user.ts +5 -8
- package/src/resources/extensions/google-search/extension-manifest.json +1 -1
- package/src/resources/extensions/google-search/index.ts +1 -2
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -1
- package/src/resources/extensions/gsd/auto/phases.ts +34 -43
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
- package/src/resources/extensions/gsd/auto-dashboard.ts +19 -37
- package/src/resources/extensions/gsd/auto-dispatch.ts +2 -18
- package/src/resources/extensions/gsd/auto-model-selection.ts +5 -26
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
- package/src/resources/extensions/gsd/auto-recovery.ts +5 -12
- package/src/resources/extensions/gsd/auto-start.ts +26 -35
- package/src/resources/extensions/gsd/auto-worktree.ts +9 -190
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +0 -31
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +8 -85
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -38
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -31
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -50
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +0 -75
- package/src/resources/extensions/gsd/captures.ts +3 -63
- package/src/resources/extensions/gsd/db-writer.ts +7 -140
- package/src/resources/extensions/gsd/doctor-git-checks.ts +0 -26
- package/src/resources/extensions/gsd/doctor-providers.ts +1 -2
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +4 -5
- package/src/resources/extensions/gsd/doctor.ts +1 -3
- package/src/resources/extensions/gsd/error-classifier.ts +11 -14
- package/src/resources/extensions/gsd/extension-manifest.json +1 -16
- package/src/resources/extensions/gsd/forensics.ts +20 -144
- package/src/resources/extensions/gsd/git-service.ts +3 -26
- package/src/resources/extensions/gsd/gitignore.ts +0 -33
- package/src/resources/extensions/gsd/gsd-db.ts +7 -43
- package/src/resources/extensions/gsd/guided-flow.ts +45 -114
- package/src/resources/extensions/gsd/health-widget-core.ts +0 -34
- package/src/resources/extensions/gsd/health-widget.ts +0 -17
- package/src/resources/extensions/gsd/index.ts +0 -1
- package/src/resources/extensions/gsd/memory-extractor.ts +0 -8
- package/src/resources/extensions/gsd/migrate-external.ts +1 -9
- package/src/resources/extensions/gsd/model-cost-table.ts +0 -19
- package/src/resources/extensions/gsd/model-router.ts +1 -35
- package/src/resources/extensions/gsd/native-git-bridge.ts +0 -17
- package/src/resources/extensions/gsd/notifications.ts +0 -16
- package/src/resources/extensions/gsd/parallel-eligibility.ts +2 -15
- package/src/resources/extensions/gsd/parallel-merge.ts +4 -87
- package/src/resources/extensions/gsd/parsers-legacy.ts +3 -22
- package/src/resources/extensions/gsd/paths.ts +0 -42
- package/src/resources/extensions/gsd/preferences-models.ts +1 -14
- package/src/resources/extensions/gsd/preferences-types.ts +1 -2
- package/src/resources/extensions/gsd/preferences.ts +15 -13
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -2
- package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
- package/src/resources/extensions/gsd/prompts/triage-captures.md +0 -1
- package/src/resources/extensions/gsd/repo-identity.ts +11 -186
- package/src/resources/extensions/gsd/rethink.ts +0 -6
- package/src/resources/extensions/gsd/roadmap-slices.ts +4 -5
- package/src/resources/extensions/gsd/state.ts +32 -84
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +1 -71
- package/src/resources/extensions/gsd/tests/captures.test.ts +0 -103
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -27
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +0 -21
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +12 -7
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +5 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +1 -20
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +79 -0
- package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +0 -31
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +12 -125
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +0 -67
- package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +1 -111
- package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -59
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +2 -85
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -34
- package/src/resources/extensions/gsd/tests/model-router.test.ts +3 -68
- package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +0 -28
- package/src/resources/extensions/gsd/tests/notifications.test.ts +0 -45
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -33
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +0 -29
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -38
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +0 -117
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -134
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -2
- package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -8
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +17 -100
- package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +0 -48
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +0 -92
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +2 -4
- package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +1 -48
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +5 -29
- package/src/resources/extensions/gsd/tools/complete-task.ts +74 -36
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -13
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +0 -36
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +2 -20
- package/src/resources/extensions/gsd/triage-resolution.ts +6 -23
- package/src/resources/extensions/gsd/types.ts +2 -4
- package/src/resources/extensions/gsd/undo.ts +2 -2
- package/src/resources/extensions/gsd/unit-ownership.ts +35 -206
- package/src/resources/extensions/gsd/verdict-parser.ts +6 -21
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -3
- package/src/resources/extensions/gsd/workflow-manifest.ts +5 -22
- package/src/resources/extensions/gsd/workflow-projections.ts +64 -97
- package/src/resources/extensions/gsd/workflow-reconcile.ts +10 -39
- package/src/resources/extensions/gsd/workspace-index.ts +0 -30
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -120
- package/src/resources/extensions/gsd/worktree-resolver.ts +3 -22
- package/src/resources/extensions/mcp-client/index.ts +7 -13
- package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
- package/src/resources/extensions/shared/interview-ui.ts +1 -12
- package/src/resources/skills/create-gsd-extension/SKILL.md +3 -5
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +4 -5
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +3 -5
- package/dist/resources/extensions/gsd/milestone-validation-gates.js +0 -45
- package/dist/resources/extensions/ollama/index.js +0 -112
- package/dist/resources/extensions/ollama/model-capabilities.js +0 -115
- package/dist/resources/extensions/ollama/ollama-client.js +0 -168
- package/dist/resources/extensions/ollama/ollama-commands.js +0 -194
- package/dist/resources/extensions/ollama/ollama-discovery.js +0 -69
- package/dist/resources/extensions/ollama/ollama-tool.js +0 -184
- package/dist/resources/extensions/ollama/types.js +0 -2
- package/dist/startup-model-validation.d.ts +0 -39
- package/dist/startup-model-validation.js +0 -50
- package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +0 -9
- package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
- package/packages/native/src/__tests__/module-compat.test.mjs +0 -91
- package/packages/pi-agent-core/src/agent-loop.test.ts +0 -45
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +0 -2
- package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js +0 -25
- package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +0 -37
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +0 -75
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +0 -2
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +0 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -73
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +0 -1
- package/packages/pi-ai/src/providers/anthropic-shared.test.ts +0 -29
- package/packages/pi-ai/src/utils/repair-tool-json.ts +0 -88
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -102
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +0 -6
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +0 -176
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +0 -28
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +0 -37
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +0 -63
- package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +0 -19
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +0 -115
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +0 -109
- package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +0 -44
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +0 -97
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +0 -2
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +0 -181
- package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/messages.test.js +0 -86
- package/packages/pi-coding-agent/dist/core/messages.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +0 -9
- package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js +0 -193
- package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +0 -16
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +0 -1
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +0 -80
- package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +0 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +0 -236
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +0 -77
- package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +0 -62
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +0 -134
- package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +0 -137
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +0 -228
- package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +0 -118
- package/packages/pi-coding-agent/src/core/messages.test.ts +0 -114
- package/packages/pi-coding-agent/src/core/retry-handler.test.ts +0 -255
- package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +0 -92
- package/src/resources/extensions/gsd/milestone-validation-gates.ts +0 -56
- package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +0 -71
- package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +0 -192
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +0 -131
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +0 -20
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -74
- package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +0 -129
- package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +0 -96
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +0 -164
- package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +0 -135
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +0 -107
- package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
- package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -959
- package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +0 -105
- package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +0 -116
- package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +0 -159
- package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +0 -150
- package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +0 -70
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +0 -178
- package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +0 -69
- package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +0 -157
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +0 -90
- package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +0 -162
- package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +0 -233
- package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +0 -305
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +0 -405
- package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
- package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1628
- package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +0 -106
- package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +0 -221
- package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +0 -289
- package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +0 -154
- package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +0 -156
- package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +0 -140
- package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +0 -101
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +0 -95
- package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +0 -55
- package/src/resources/extensions/ollama/index.ts +0 -130
- package/src/resources/extensions/ollama/model-capabilities.ts +0 -145
- package/src/resources/extensions/ollama/ollama-client.ts +0 -196
- package/src/resources/extensions/ollama/ollama-commands.ts +0 -248
- package/src/resources/extensions/ollama/ollama-discovery.ts +0 -106
- package/src/resources/extensions/ollama/ollama-tool.ts +0 -218
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +0 -162
- package/src/resources/extensions/ollama/tests/ollama-client.test.ts +0 -38
- package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +0 -28
- package/src/resources/extensions/ollama/types.ts +0 -130
- package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +0 -156
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{R0D4xaIPl5kg93edN7Oo0 → 5DLsjFHdSB6_a1EDQVjr7}/_ssgManifest.js +0 -0
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
// GSD-2 — Extension Sort: Topological dependency ordering
|
|
2
|
-
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
3
|
-
|
|
4
|
-
import { readManifestFromEntryPath } from "./extension-manifest.js";
|
|
5
|
-
|
|
6
|
-
export interface SortWarning {
|
|
7
|
-
declaringId: string;
|
|
8
|
-
missingId: string;
|
|
9
|
-
message: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface SortResult {
|
|
13
|
-
sortedPaths: string[];
|
|
14
|
-
warnings: SortWarning[];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Sort extension entry paths in topological dependency-first order using Kahn's BFS algorithm.
|
|
19
|
-
*
|
|
20
|
-
* - Extensions without manifests are prepended in input order.
|
|
21
|
-
* - Missing dependencies produce a structured warning but do not block loading.
|
|
22
|
-
* - Cycles produce warnings; cycle participants are appended alphabetically.
|
|
23
|
-
* - Self-dependencies are silently ignored.
|
|
24
|
-
*/
|
|
25
|
-
export function sortExtensionPaths(paths: string[]): SortResult {
|
|
26
|
-
const warnings: SortWarning[] = [];
|
|
27
|
-
const pathsWithoutId: string[] = [];
|
|
28
|
-
const idToPath = new Map<string, string>();
|
|
29
|
-
|
|
30
|
-
// Step 1: Build ID map
|
|
31
|
-
for (const p of paths) {
|
|
32
|
-
const manifest = readManifestFromEntryPath(p);
|
|
33
|
-
if (!manifest) {
|
|
34
|
-
pathsWithoutId.push(p);
|
|
35
|
-
} else {
|
|
36
|
-
idToPath.set(manifest.id, p);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Step 2: Build graph — inDegree and dependents adjacency
|
|
41
|
-
const inDegree = new Map<string, number>();
|
|
42
|
-
const dependents = new Map<string, string[]>(); // dep → [ids that depend on dep]
|
|
43
|
-
|
|
44
|
-
for (const id of idToPath.keys()) {
|
|
45
|
-
if (!inDegree.has(id)) inDegree.set(id, 0);
|
|
46
|
-
if (!dependents.has(id)) dependents.set(id, []);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
for (const [id, entryPath] of idToPath) {
|
|
50
|
-
const manifest = readManifestFromEntryPath(entryPath);
|
|
51
|
-
const rawDeps = manifest?.dependencies?.extensions ?? [];
|
|
52
|
-
const deps = Array.isArray(rawDeps) ? rawDeps : [];
|
|
53
|
-
|
|
54
|
-
for (const depId of deps) {
|
|
55
|
-
// Silently ignore self-deps
|
|
56
|
-
if (depId === id) continue;
|
|
57
|
-
|
|
58
|
-
if (!idToPath.has(depId)) {
|
|
59
|
-
// Missing dependency — warn and skip edge
|
|
60
|
-
warnings.push({
|
|
61
|
-
declaringId: id,
|
|
62
|
-
missingId: depId,
|
|
63
|
-
message: `Extension '${id}' declares dependency '${depId}' which is not installed — loading anyway`,
|
|
64
|
-
});
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Valid edge: id depends on depId → increment inDegree[id], add id to dependents[depId]
|
|
69
|
-
inDegree.set(id, (inDegree.get(id) ?? 0) + 1);
|
|
70
|
-
const depDependents = dependents.get(depId) ?? [];
|
|
71
|
-
depDependents.push(id);
|
|
72
|
-
dependents.set(depId, depDependents);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Step 3: Kahn's algorithm — start with nodes that have inDegree 0
|
|
77
|
-
const sorted: string[] = [];
|
|
78
|
-
// Ready queue: IDs with inDegree 0, maintained in alphabetical order
|
|
79
|
-
const ready: string[] = [...idToPath.keys()]
|
|
80
|
-
.filter((id) => inDegree.get(id) === 0)
|
|
81
|
-
.sort();
|
|
82
|
-
|
|
83
|
-
while (ready.length > 0) {
|
|
84
|
-
const id = ready.shift()!;
|
|
85
|
-
sorted.push(idToPath.get(id)!);
|
|
86
|
-
|
|
87
|
-
const deps = dependents.get(id) ?? [];
|
|
88
|
-
for (const depId of deps) {
|
|
89
|
-
const newDegree = (inDegree.get(depId) ?? 0) - 1;
|
|
90
|
-
inDegree.set(depId, newDegree);
|
|
91
|
-
if (newDegree === 0) {
|
|
92
|
-
// Insert into ready queue maintaining alphabetical order
|
|
93
|
-
const insertIdx = ready.findIndex((r) => r > depId);
|
|
94
|
-
if (insertIdx === -1) {
|
|
95
|
-
ready.push(depId);
|
|
96
|
-
} else {
|
|
97
|
-
ready.splice(insertIdx, 0, depId);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Step 4: Cycle handling — any remaining IDs with inDegree > 0
|
|
104
|
-
const cycleIds = [...idToPath.keys()]
|
|
105
|
-
.filter((id) => (inDegree.get(id) ?? 0) > 0)
|
|
106
|
-
.sort();
|
|
107
|
-
|
|
108
|
-
if (cycleIds.length > 0) {
|
|
109
|
-
const cycleSet = new Set(cycleIds);
|
|
110
|
-
|
|
111
|
-
for (const id of cycleIds) {
|
|
112
|
-
const entryPath = idToPath.get(id)!;
|
|
113
|
-
const manifest = readManifestFromEntryPath(entryPath);
|
|
114
|
-
const rawDeps = manifest?.dependencies?.extensions ?? [];
|
|
115
|
-
const deps = Array.isArray(rawDeps) ? rawDeps : [];
|
|
116
|
-
|
|
117
|
-
for (const depId of deps) {
|
|
118
|
-
if (depId === id) continue;
|
|
119
|
-
if (!cycleSet.has(depId)) continue;
|
|
120
|
-
|
|
121
|
-
// Both id and depId are in cycle — emit warning
|
|
122
|
-
warnings.push({
|
|
123
|
-
declaringId: id,
|
|
124
|
-
missingId: depId,
|
|
125
|
-
message: `Extension '${id}' and '${depId}' form a dependency cycle — loading both anyway (alphabetical order)`,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
sorted.push(entryPath);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return {
|
|
134
|
-
sortedPaths: [...pathsWithoutId, ...sorted],
|
|
135
|
-
warnings,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { describe, it } from "node:test";
|
|
3
|
-
import {
|
|
4
|
-
isImageDimensionError,
|
|
5
|
-
MANY_IMAGE_MAX_DIMENSION,
|
|
6
|
-
downsizeConversationImages,
|
|
7
|
-
} from "./image-overflow-recovery.js";
|
|
8
|
-
import type { Message } from "@gsd/pi-ai";
|
|
9
|
-
|
|
10
|
-
// ─── isImageDimensionError ────────────────────────────────────────────────────
|
|
11
|
-
|
|
12
|
-
describe("isImageDimensionError", () => {
|
|
13
|
-
it("returns true for Anthropic many-image dimension error", () => {
|
|
14
|
-
const errorMessage =
|
|
15
|
-
'Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"messages.125.content.38.image.source.base64.data: At least one of the image dimensions exceed max allowed size for many-image requests: 2000 pixels"}}';
|
|
16
|
-
assert.equal(isImageDimensionError(errorMessage), true);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it("returns true for bare dimension exceed message", () => {
|
|
20
|
-
const errorMessage =
|
|
21
|
-
"image dimensions exceed max allowed size for many-image requests: 2000 pixels";
|
|
22
|
-
assert.equal(isImageDimensionError(errorMessage), true);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it("returns false for unrelated 400 error", () => {
|
|
26
|
-
const errorMessage =
|
|
27
|
-
'Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"max_tokens: 4096 > 2048"}}';
|
|
28
|
-
assert.equal(isImageDimensionError(errorMessage), false);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it("returns false for rate limit error", () => {
|
|
32
|
-
assert.equal(isImageDimensionError("429 rate limit exceeded"), false);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it("returns false for empty string", () => {
|
|
36
|
-
assert.equal(isImageDimensionError(""), false);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("returns false for undefined", () => {
|
|
40
|
-
assert.equal(isImageDimensionError(undefined), false);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// ─── MANY_IMAGE_MAX_DIMENSION ─────────────────────────────────────────────────
|
|
45
|
-
|
|
46
|
-
describe("MANY_IMAGE_MAX_DIMENSION", () => {
|
|
47
|
-
it("is less than 2000 (the API-enforced limit)", () => {
|
|
48
|
-
assert.ok(MANY_IMAGE_MAX_DIMENSION < 2000);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("is a positive integer", () => {
|
|
52
|
-
assert.ok(MANY_IMAGE_MAX_DIMENSION > 0);
|
|
53
|
-
assert.equal(MANY_IMAGE_MAX_DIMENSION, Math.floor(MANY_IMAGE_MAX_DIMENSION));
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// ─── helpers ──────────────────────────────────────────────────────────────────
|
|
58
|
-
|
|
59
|
-
function makeUserMsg(content: Message["content"] & any): Message {
|
|
60
|
-
return { role: "user", content, timestamp: Date.now() } as Message;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function makeAssistantMsg(text: string): Message {
|
|
64
|
-
return {
|
|
65
|
-
role: "assistant",
|
|
66
|
-
content: [{ type: "text", text }],
|
|
67
|
-
api: "anthropic-messages",
|
|
68
|
-
provider: "anthropic",
|
|
69
|
-
model: "claude-opus-4-6",
|
|
70
|
-
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
|
|
71
|
-
stopReason: "stop",
|
|
72
|
-
timestamp: Date.now(),
|
|
73
|
-
} as Message;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function makeToolResultMsg(images: number): Message {
|
|
77
|
-
const content: any[] = [];
|
|
78
|
-
for (let i = 0; i < images; i++) {
|
|
79
|
-
content.push({ type: "image", data: `img${i}`, mimeType: "image/png" });
|
|
80
|
-
}
|
|
81
|
-
return {
|
|
82
|
-
role: "toolResult",
|
|
83
|
-
toolCallId: `tc${Math.random()}`,
|
|
84
|
-
toolName: "screenshot",
|
|
85
|
-
content,
|
|
86
|
-
isError: false,
|
|
87
|
-
timestamp: Date.now(),
|
|
88
|
-
} as Message;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// ─── downsizeConversationImages ───────────────────────────────────────────────
|
|
92
|
-
|
|
93
|
-
describe("downsizeConversationImages", () => {
|
|
94
|
-
it("counts images in user and toolResult messages", () => {
|
|
95
|
-
const messages: Message[] = [
|
|
96
|
-
makeUserMsg([
|
|
97
|
-
{ type: "image", data: "img1", mimeType: "image/png" },
|
|
98
|
-
{ type: "image", data: "img2", mimeType: "image/png" },
|
|
99
|
-
]),
|
|
100
|
-
makeAssistantMsg("I see them"),
|
|
101
|
-
makeToolResultMsg(1),
|
|
102
|
-
];
|
|
103
|
-
|
|
104
|
-
const result = downsizeConversationImages(messages);
|
|
105
|
-
assert.equal(result.imageCount, 3);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
it("returns processed=false when no images present", () => {
|
|
109
|
-
const messages: Message[] = [
|
|
110
|
-
makeUserMsg("just text"),
|
|
111
|
-
makeAssistantMsg("reply"),
|
|
112
|
-
];
|
|
113
|
-
|
|
114
|
-
const result = downsizeConversationImages(messages);
|
|
115
|
-
assert.equal(result.imageCount, 0);
|
|
116
|
-
assert.equal(result.processed, false);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it("returns processed=false when image count <= RECENT_IMAGES_TO_KEEP", () => {
|
|
120
|
-
const messages: Message[] = [
|
|
121
|
-
makeUserMsg([
|
|
122
|
-
{ type: "image", data: "img1", mimeType: "image/png" },
|
|
123
|
-
]),
|
|
124
|
-
makeAssistantMsg("got it"),
|
|
125
|
-
];
|
|
126
|
-
|
|
127
|
-
const result = downsizeConversationImages(messages);
|
|
128
|
-
assert.equal(result.imageCount, 1);
|
|
129
|
-
assert.equal(result.processed, false);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it("strips older images when many images present, preserves recent ones", () => {
|
|
133
|
-
const messages: Message[] = [];
|
|
134
|
-
for (let i = 0; i < 25; i++) {
|
|
135
|
-
messages.push(
|
|
136
|
-
makeUserMsg([
|
|
137
|
-
{ type: "text", text: `message ${i}` },
|
|
138
|
-
{ type: "image", data: `img${i}`, mimeType: "image/png" },
|
|
139
|
-
]),
|
|
140
|
-
);
|
|
141
|
-
messages.push(makeAssistantMsg(`reply ${i}`));
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const result = downsizeConversationImages(messages);
|
|
145
|
-
assert.ok(result.processed);
|
|
146
|
-
assert.equal(result.imageCount, 25);
|
|
147
|
-
assert.equal(result.strippedCount, 20); // 25 - 5 recent
|
|
148
|
-
|
|
149
|
-
// Count remaining images
|
|
150
|
-
let remainingImages = 0;
|
|
151
|
-
for (const msg of messages) {
|
|
152
|
-
if (msg.role === "assistant") continue;
|
|
153
|
-
if (typeof msg.content === "string") continue;
|
|
154
|
-
const arr = msg.content as any[];
|
|
155
|
-
for (const block of arr) {
|
|
156
|
-
if (block.type === "image") remainingImages++;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
assert.equal(remainingImages, 5, "Should keep exactly 5 most recent images");
|
|
160
|
-
|
|
161
|
-
// The 5 most recent user messages (indices 40,42,44,46,48) should have images
|
|
162
|
-
for (let i = 20; i < 25; i++) {
|
|
163
|
-
const userMsg = messages[i * 2]; // user messages at even indices
|
|
164
|
-
const arr = userMsg.content as any[];
|
|
165
|
-
const hasImage = arr.some((c: any) => c.type === "image");
|
|
166
|
-
assert.ok(hasImage, `Recent message ${i} should retain its image`);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it("adds text placeholder when stripping an image", () => {
|
|
171
|
-
const messages: Message[] = [];
|
|
172
|
-
for (let i = 0; i < 10; i++) {
|
|
173
|
-
messages.push(
|
|
174
|
-
makeUserMsg([
|
|
175
|
-
{ type: "image", data: `img${i}`, mimeType: "image/jpeg" },
|
|
176
|
-
]),
|
|
177
|
-
);
|
|
178
|
-
messages.push(makeAssistantMsg(`reply ${i}`));
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
downsizeConversationImages(messages);
|
|
182
|
-
|
|
183
|
-
// First message's image should have been replaced with text
|
|
184
|
-
const firstMsg = messages[0];
|
|
185
|
-
const arr = firstMsg.content as any[];
|
|
186
|
-
const placeholder = arr.find(
|
|
187
|
-
(c: any) => c.type === "text" && c.text.includes("[image removed"),
|
|
188
|
-
);
|
|
189
|
-
assert.ok(placeholder, "Stripped image should be replaced with text placeholder");
|
|
190
|
-
assert.ok(
|
|
191
|
-
placeholder.text.includes("image/jpeg"),
|
|
192
|
-
"Placeholder should mention original mime type",
|
|
193
|
-
);
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
it("handles toolResult messages with images", () => {
|
|
197
|
-
const messages: Message[] = [];
|
|
198
|
-
for (let i = 0; i < 10; i++) {
|
|
199
|
-
messages.push(makeToolResultMsg(1));
|
|
200
|
-
messages.push(makeAssistantMsg(`reply ${i}`));
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const result = downsizeConversationImages(messages);
|
|
204
|
-
assert.equal(result.imageCount, 10);
|
|
205
|
-
assert.equal(result.strippedCount, 5);
|
|
206
|
-
assert.ok(result.processed);
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
it("handles mixed user and toolResult images", () => {
|
|
210
|
-
const messages: Message[] = [];
|
|
211
|
-
for (let i = 0; i < 8; i++) {
|
|
212
|
-
messages.push(
|
|
213
|
-
makeUserMsg([
|
|
214
|
-
{ type: "text", text: `check ${i}` },
|
|
215
|
-
{ type: "image", data: `uimg${i}`, mimeType: "image/png" },
|
|
216
|
-
]),
|
|
217
|
-
);
|
|
218
|
-
messages.push(makeAssistantMsg(`processing ${i}`));
|
|
219
|
-
messages.push(makeToolResultMsg(1));
|
|
220
|
-
messages.push(makeAssistantMsg(`done ${i}`));
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
const result = downsizeConversationImages(messages);
|
|
224
|
-
// 8 user images + 8 tool result images = 16 total
|
|
225
|
-
assert.equal(result.imageCount, 16);
|
|
226
|
-
assert.equal(result.strippedCount, 11); // 16 - 5 recent
|
|
227
|
-
});
|
|
228
|
-
});
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Image overflow recovery for many-image sessions.
|
|
3
|
-
*
|
|
4
|
-
* When a conversation accumulates many images (screenshots, file reads, etc.),
|
|
5
|
-
* the Anthropic API enforces a stricter per-image dimension limit (2000px) for
|
|
6
|
-
* "many-image requests." This module detects the resulting 400 error and
|
|
7
|
-
* recovers by stripping older images from the conversation history, preserving
|
|
8
|
-
* the most recent ones to maintain session continuity.
|
|
9
|
-
*
|
|
10
|
-
* @see https://github.com/gsd-build/gsd-2/issues/2874
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type { Message, ImageContent, TextContent } from "@gsd/pi-ai";
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Maximum image dimension (px) that the Anthropic API allows in many-image
|
|
17
|
-
* requests. Images at or above this size in a large conversation will be
|
|
18
|
-
* rejected with a 400 error. We use 1568 as the safe ceiling (Anthropic's
|
|
19
|
-
* recommended max for multi-image requests).
|
|
20
|
-
*/
|
|
21
|
-
export const MANY_IMAGE_MAX_DIMENSION = 1568;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Number of recent images to preserve when stripping old images.
|
|
25
|
-
* Keeps the most recent screenshots/images so the model retains visual context
|
|
26
|
-
* for the current task.
|
|
27
|
-
*/
|
|
28
|
-
const RECENT_IMAGES_TO_KEEP = 5;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Regex matching the Anthropic API error for oversized images in many-image requests.
|
|
32
|
-
*/
|
|
33
|
-
const IMAGE_DIMENSION_ERROR_RE =
|
|
34
|
-
/image.dimensions?.exceed.*max.*allowed.*size.*many.image/i;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Detect whether an error message is the Anthropic "image dimensions exceed max
|
|
38
|
-
* allowed size for many-image requests" 400 error.
|
|
39
|
-
*/
|
|
40
|
-
export function isImageDimensionError(errorMessage: string | undefined | null): boolean {
|
|
41
|
-
if (!errorMessage) return false;
|
|
42
|
-
return IMAGE_DIMENSION_ERROR_RE.test(errorMessage);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface DownsizeResult {
|
|
46
|
-
/** Total number of images found in the conversation */
|
|
47
|
-
imageCount: number;
|
|
48
|
-
/** Whether any images were stripped */
|
|
49
|
-
processed: boolean;
|
|
50
|
-
/** Number of images that were stripped */
|
|
51
|
-
strippedCount: number;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Strip older images from conversation messages to recover from many-image
|
|
56
|
-
* dimension errors. Preserves the N most recent images and replaces older ones
|
|
57
|
-
* with a text placeholder.
|
|
58
|
-
*
|
|
59
|
-
* Mutates messages in place (same pattern as replaceMessages/compaction).
|
|
60
|
-
*
|
|
61
|
-
* Accepts Message[] (the LLM message union) so it works with both
|
|
62
|
-
* agent.state.messages and session entries.
|
|
63
|
-
*/
|
|
64
|
-
export function downsizeConversationImages(messages: Message[]): DownsizeResult {
|
|
65
|
-
// First pass: collect all image locations (message index + content index)
|
|
66
|
-
const imageLocations: Array<{ msgIdx: number; contentIdx: number }> = [];
|
|
67
|
-
|
|
68
|
-
for (let msgIdx = 0; msgIdx < messages.length; msgIdx++) {
|
|
69
|
-
const msg = messages[msgIdx];
|
|
70
|
-
if (msg.role === "assistant") continue;
|
|
71
|
-
|
|
72
|
-
// UserMessage can have string content; ToolResultMessage always has array
|
|
73
|
-
if (msg.role === "user" && typeof msg.content === "string") continue;
|
|
74
|
-
|
|
75
|
-
const contentArr = msg.content as (TextContent | ImageContent)[];
|
|
76
|
-
if (!Array.isArray(contentArr)) continue;
|
|
77
|
-
|
|
78
|
-
for (let contentIdx = 0; contentIdx < contentArr.length; contentIdx++) {
|
|
79
|
-
if (contentArr[contentIdx].type === "image") {
|
|
80
|
-
imageLocations.push({ msgIdx, contentIdx });
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const imageCount = imageLocations.length;
|
|
86
|
-
if (imageCount === 0) {
|
|
87
|
-
return { imageCount: 0, processed: false, strippedCount: 0 };
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Determine which images to strip (all except the N most recent)
|
|
91
|
-
const stripCount = Math.max(0, imageCount - RECENT_IMAGES_TO_KEEP);
|
|
92
|
-
if (stripCount === 0) {
|
|
93
|
-
return { imageCount, processed: false, strippedCount: 0 };
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const toStrip = imageLocations.slice(0, stripCount);
|
|
97
|
-
|
|
98
|
-
// Second pass: replace stripped images with text placeholder.
|
|
99
|
-
// Process in reverse order to maintain content indices.
|
|
100
|
-
for (let i = toStrip.length - 1; i >= 0; i--) {
|
|
101
|
-
const { msgIdx, contentIdx } = toStrip[i];
|
|
102
|
-
const msg = messages[msgIdx];
|
|
103
|
-
if (msg.role === "assistant") continue;
|
|
104
|
-
if (msg.role === "user" && typeof msg.content === "string") continue;
|
|
105
|
-
|
|
106
|
-
const contentArr = msg.content as (TextContent | ImageContent)[];
|
|
107
|
-
const imageBlock = contentArr[contentIdx] as ImageContent;
|
|
108
|
-
const mimeType = imageBlock.mimeType || "image/unknown";
|
|
109
|
-
|
|
110
|
-
// Replace the image block with a text placeholder
|
|
111
|
-
(contentArr as any[])[contentIdx] = {
|
|
112
|
-
type: "text",
|
|
113
|
-
text: `[image removed to reduce context size — was ${mimeType}]`,
|
|
114
|
-
} as TextContent;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return { imageCount, processed: true, strippedCount: stripCount };
|
|
118
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* messages.test.ts — Tests for convertToLlm custom message handling.
|
|
3
|
-
*
|
|
4
|
-
* Reproduction test for #3026: background job completion notifications
|
|
5
|
-
* delivered as custom messages must be clearly distinguishable from
|
|
6
|
-
* user-typed input when converted to LLM messages.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import test from "node:test";
|
|
10
|
-
import assert from "node:assert/strict";
|
|
11
|
-
import { convertToLlm, type CustomMessage } from "./messages.js";
|
|
12
|
-
|
|
13
|
-
/** Extract the first content block from a message, asserting array content. */
|
|
14
|
-
function firstTextBlock(msg: ReturnType<typeof convertToLlm>[number]) {
|
|
15
|
-
const { content } = msg;
|
|
16
|
-
assert.ok(Array.isArray(content), "Expected content to be an array");
|
|
17
|
-
const block = content[0];
|
|
18
|
-
assert.ok(typeof block === "object" && block !== null, "Expected first block to be an object");
|
|
19
|
-
return block;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
test("convertToLlm wraps custom messages with system notification prefix", () => {
|
|
23
|
-
const customMsg: CustomMessage = {
|
|
24
|
-
role: "custom",
|
|
25
|
-
customType: "async_job_result",
|
|
26
|
-
content: "**Background job done: bg_abc123** (sleep 2, 2.1s)\n\ndone",
|
|
27
|
-
display: true,
|
|
28
|
-
timestamp: Date.now(),
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const result = convertToLlm([customMsg]);
|
|
32
|
-
assert.equal(result.length, 1);
|
|
33
|
-
assert.equal(result[0].role, "user");
|
|
34
|
-
|
|
35
|
-
// The content must include a system notification wrapper so the LLM
|
|
36
|
-
// does not confuse it with user input (#3026).
|
|
37
|
-
const text = firstTextBlock(result[0]);
|
|
38
|
-
assert.equal(text.type, "text");
|
|
39
|
-
assert.ok(
|
|
40
|
-
"text" in text && text.text.includes("[system notification"),
|
|
41
|
-
"Custom message should be wrapped with system notification marker",
|
|
42
|
-
);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test("convertToLlm wraps custom messages with array content", () => {
|
|
46
|
-
const customMsg: CustomMessage = {
|
|
47
|
-
role: "custom",
|
|
48
|
-
customType: "bg-shell-status",
|
|
49
|
-
content: [{ type: "text", text: "Background processes:\n ✓ bg1 dev-server :3000" }],
|
|
50
|
-
display: false,
|
|
51
|
-
timestamp: Date.now(),
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const result = convertToLlm([customMsg]);
|
|
55
|
-
assert.equal(result.length, 1);
|
|
56
|
-
assert.equal(result[0].role, "user");
|
|
57
|
-
|
|
58
|
-
const text = firstTextBlock(result[0]);
|
|
59
|
-
assert.equal(text.type, "text");
|
|
60
|
-
assert.ok(
|
|
61
|
-
"text" in text && text.text.includes("[system notification"),
|
|
62
|
-
"Custom message with array content should be wrapped with system notification marker",
|
|
63
|
-
);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test("convertToLlm includes customType in notification wrapper", () => {
|
|
67
|
-
const customMsg: CustomMessage = {
|
|
68
|
-
role: "custom",
|
|
69
|
-
customType: "async_job_result",
|
|
70
|
-
content: "job output here",
|
|
71
|
-
display: true,
|
|
72
|
-
timestamp: Date.now(),
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const result = convertToLlm([customMsg]);
|
|
76
|
-
const text = firstTextBlock(result[0]);
|
|
77
|
-
assert.ok(
|
|
78
|
-
"text" in text && text.text.includes("async_job_result"),
|
|
79
|
-
"Notification wrapper should include the customType for context",
|
|
80
|
-
);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test("convertToLlm notification wrapper instructs LLM not to treat as user input", () => {
|
|
84
|
-
const customMsg: CustomMessage = {
|
|
85
|
-
role: "custom",
|
|
86
|
-
customType: "async_job_result",
|
|
87
|
-
content: "**Background job done: bg_abc123** (sleep 2, 2.1s)\n\ndone",
|
|
88
|
-
display: true,
|
|
89
|
-
timestamp: Date.now(),
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const result = convertToLlm([customMsg]);
|
|
93
|
-
const text = firstTextBlock(result[0]);
|
|
94
|
-
assert.ok(
|
|
95
|
-
"text" in text && text.text.includes("not user input"),
|
|
96
|
-
"Notification should explicitly state this is not user input",
|
|
97
|
-
);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
test("convertToLlm preserves user messages without wrapper", () => {
|
|
101
|
-
const userMsg = {
|
|
102
|
-
role: "user" as const,
|
|
103
|
-
content: [{ type: "text" as const, text: "Hello world" }],
|
|
104
|
-
timestamp: Date.now(),
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const result = convertToLlm([userMsg]);
|
|
108
|
-
assert.equal(result.length, 1);
|
|
109
|
-
const text = firstTextBlock(result[0]);
|
|
110
|
-
assert.ok(
|
|
111
|
-
"text" in text && text.text === "Hello world",
|
|
112
|
-
"User messages should pass through unchanged",
|
|
113
|
-
);
|
|
114
|
-
});
|