@opengsd/gsd-pi 1.1.1-dev.a5a2de8 → 1.1.1-dev.b2556262
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/dist/headless-recover.js +56 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +18 -2
- package/dist/resources/extensions/browser-tools/engine/selection.js +1 -1
- package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/dist/resources/extensions/browser-tools/index.js +68 -24
- package/dist/resources/extensions/browser-tools/state.js +12 -0
- package/dist/resources/extensions/browser-tools/tools/session.js +3 -2
- package/dist/resources/extensions/browser-tools/utils.js +3 -3
- package/dist/resources/extensions/browser-tools/web-app-detect.js +52 -0
- package/dist/resources/extensions/gsd/auto/loop.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +87 -12
- package/dist/resources/extensions/gsd/auto/session.js +22 -1
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +81 -13
- package/dist/resources/extensions/gsd/auto-model-selection.js +154 -9
- package/dist/resources/extensions/gsd/auto-post-unit.js +19 -2
- package/dist/resources/extensions/gsd/auto-prompts.js +26 -21
- package/dist/resources/extensions/gsd/auto-recovery.js +4 -2
- package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-timers.js +24 -10
- package/dist/resources/extensions/gsd/auto.js +40 -15
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +192 -77
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
- package/dist/resources/extensions/gsd/closeout-wizard.js +32 -9
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +10 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -9
- package/dist/resources/extensions/gsd/commands-maintenance.js +93 -15
- package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +2 -2
- package/dist/resources/extensions/gsd/config-overlay.js +1 -0
- package/dist/resources/extensions/gsd/context-masker.js +129 -5
- package/dist/resources/extensions/gsd/db-writer.js +35 -0
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +50 -1
- package/dist/resources/extensions/gsd/gsd-db.js +480 -172
- package/dist/resources/extensions/gsd/guided-flow.js +4 -1
- package/dist/resources/extensions/gsd/markdown-renderer.js +37 -53
- package/dist/resources/extensions/gsd/md-importer.js +38 -3
- package/dist/resources/extensions/gsd/migration-auto-check.js +126 -31
- package/dist/resources/extensions/gsd/parsers-legacy.js +23 -0
- package/dist/resources/extensions/gsd/planner-handoff.js +98 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +22 -4
- package/dist/resources/extensions/gsd/pre-execution-checks.js +10 -2
- package/dist/resources/extensions/gsd/preferences-models.js +111 -43
- package/dist/resources/extensions/gsd/preferences-types.js +13 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +68 -3
- package/dist/resources/extensions/gsd/preferences.js +4 -1
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/run-uat.md +2 -2
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/roadmap-slices.js +5 -1
- package/dist/resources/extensions/gsd/safety/content-validator.js +6 -4
- package/dist/resources/extensions/gsd/skill-manifest.js +12 -0
- package/dist/resources/extensions/gsd/source-observations.js +306 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +15 -8
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +33 -5
- package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +34 -13
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +39 -14
- package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +4 -4
- package/dist/resources/extensions/gsd/state.js +7 -3
- package/dist/resources/extensions/gsd/tool-contract.js +15 -1
- package/dist/resources/extensions/gsd/tool-presentation-plan.js +24 -2
- package/dist/resources/extensions/gsd/tools/complete-slice.js +28 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +42 -11
- package/dist/resources/extensions/gsd/tools/plan-task.js +7 -1
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +62 -406
- package/dist/resources/extensions/gsd/uat-policy.js +130 -0
- package/dist/resources/extensions/gsd/uat-run.js +414 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +3 -4
- package/dist/resources/extensions/gsd/unit-tool-contracts.js +38 -14
- package/dist/resources/extensions/gsd/verdict-parser.js +3 -8
- package/dist/resources/extensions/gsd/workflow-manifest.js +132 -5
- package/dist/resources/extensions/gsd/workflow-mcp.js +2 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +8 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +26 -0
- package/dist/resources/extensions/gsd/worktree-reentry.js +96 -0
- package/dist/resources/extensions/gsd/worktree-state-projection.js +18 -17
- package/dist/resources/extensions/shared/gsd-browser-cli.js +6 -0
- package/dist/resources/extensions/subagent/agents.js +1 -0
- package/dist/resources/extensions/subagent/index.js +27 -12
- package/dist/resources/extensions/subagent/launch.js +7 -2
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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.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 +1 -1
- 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 +1 -1
- 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-paths-manifest.json +6 -6
- package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-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/node_modules/@gsd/native/dist/native.js +22 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +4 -4
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +21 -23
- package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +25 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +66 -12
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +18 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +16 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/workflow-tools.js +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/dist/native.js +22 -0
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
- package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/image-models.generated.js +30 -0
- package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +174 -29
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +178 -54
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +8 -1
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/themes.js +1 -1
- package/packages/pi-coding-agent/dist/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/dist/utils.d.ts +11 -0
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +119 -6
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/package.json +2 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/themes.js +1 -1
- package/pkg/dist/theme/themes.js.map +1 -1
- package/pkg/package.json +1 -1
- package/scripts/install/handoff.js +16 -3
- package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +21 -2
- package/src/resources/extensions/browser-tools/engine/selection.ts +1 -1
- package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
- package/src/resources/extensions/browser-tools/index.ts +75 -27
- package/src/resources/extensions/browser-tools/state.ts +13 -0
- package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +2 -2
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +57 -0
- package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +37 -0
- package/src/resources/extensions/browser-tools/tests/web-app-detect.test.mjs +68 -0
- package/src/resources/extensions/browser-tools/tools/session.ts +4 -2
- package/src/resources/extensions/browser-tools/utils.ts +3 -3
- package/src/resources/extensions/browser-tools/web-app-detect.ts +63 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
- package/src/resources/extensions/gsd/auto/loop.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +89 -15
- package/src/resources/extensions/gsd/auto/session.ts +24 -1
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +117 -12
- package/src/resources/extensions/gsd/auto-model-selection.ts +190 -12
- package/src/resources/extensions/gsd/auto-post-unit.ts +20 -2
- package/src/resources/extensions/gsd/auto-prompts.ts +25 -22
- package/src/resources/extensions/gsd/auto-recovery.ts +22 -3
- package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-timers.ts +25 -9
- package/src/resources/extensions/gsd/auto.ts +41 -14
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +250 -78
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
- package/src/resources/extensions/gsd/closeout-wizard.ts +47 -13
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -17
- package/src/resources/extensions/gsd/commands-maintenance.ts +124 -13
- package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +2 -2
- package/src/resources/extensions/gsd/config-overlay.ts +1 -0
- package/src/resources/extensions/gsd/context-masker.ts +152 -5
- package/src/resources/extensions/gsd/db-writer.ts +38 -0
- package/src/resources/extensions/gsd/docs/preferences-reference.md +50 -1
- package/src/resources/extensions/gsd/gsd-db.ts +564 -186
- package/src/resources/extensions/gsd/guided-flow.ts +4 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +44 -66
- package/src/resources/extensions/gsd/md-importer.ts +49 -2
- package/src/resources/extensions/gsd/migration-auto-check.ts +154 -34
- package/src/resources/extensions/gsd/parsers-legacy.ts +20 -0
- package/src/resources/extensions/gsd/planner-handoff.ts +149 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +22 -4
- package/src/resources/extensions/gsd/pre-execution-checks.ts +9 -2
- package/src/resources/extensions/gsd/preferences-models.ts +113 -43
- package/src/resources/extensions/gsd/preferences-types.ts +47 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +76 -2
- package/src/resources/extensions/gsd/preferences.ts +5 -0
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/run-uat.md +2 -2
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +6 -1
- package/src/resources/extensions/gsd/safety/content-validator.ts +8 -5
- package/src/resources/extensions/gsd/skill-manifest.ts +12 -0
- package/src/resources/extensions/gsd/source-observations.ts +402 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +20 -8
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +44 -5
- package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +39 -11
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +45 -15
- package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +4 -4
- package/src/resources/extensions/gsd/state.ts +7 -4
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +114 -0
- package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +66 -4
- package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +299 -1
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +75 -3
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +22 -1
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -0
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/closeout-wizard.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/content-validator.test.ts +74 -0
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +56 -1
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +17 -2
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +1 -11
- package/src/resources/extensions/gsd/tests/gate-dispatch.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +62 -1
- package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +42 -0
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +99 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +99 -2
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/planner-handoff.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +162 -18
- package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +4 -3
- package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/source-observations.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +76 -21
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +203 -0
- package/src/resources/extensions/gsd/tests/uat-policy.test.ts +170 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +306 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +77 -10
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +260 -5
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +511 -1
- package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +102 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +44 -0
- package/src/resources/extensions/gsd/tool-contract.ts +29 -1
- package/src/resources/extensions/gsd/tool-presentation-plan.ts +41 -6
- package/src/resources/extensions/gsd/tools/complete-slice.ts +29 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +54 -12
- package/src/resources/extensions/gsd/tools/plan-task.ts +8 -1
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +71 -489
- package/src/resources/extensions/gsd/types.ts +1 -0
- package/src/resources/extensions/gsd/uat-policy.ts +191 -0
- package/src/resources/extensions/gsd/uat-run.ts +550 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +3 -4
- package/src/resources/extensions/gsd/unit-tool-contracts.ts +38 -14
- package/src/resources/extensions/gsd/verdict-parser.ts +3 -10
- package/src/resources/extensions/gsd/workflow-manifest.ts +193 -7
- package/src/resources/extensions/gsd/workflow-mcp.ts +2 -3
- package/src/resources/extensions/gsd/workflow-projections.ts +9 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +32 -0
- package/src/resources/extensions/gsd/worktree-reentry.ts +103 -0
- package/src/resources/extensions/gsd/worktree-state-projection.ts +22 -22
- package/src/resources/extensions/shared/gsd-browser-cli.ts +6 -0
- package/src/resources/extensions/shared/tests/format-utils.test.ts +8 -3
- package/src/resources/extensions/subagent/agents.ts +4 -0
- package/src/resources/extensions/subagent/index.ts +28 -3
- package/src/resources/extensions/subagent/launch.ts +8 -0
- package/src/resources/extensions/subagent/tests/model-override.test.ts +31 -0
- /package/dist/web/standalone/.next/static/{9y3LeeR2uGr2yRj9RjY3D → tJOKQbQRO-9MiFDO8DIDS}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{9y3LeeR2uGr2yRj9RjY3D → tJOKQbQRO-9MiFDO8DIDS}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive-chat-render.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-chat-render.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Message } from \"@gsd/pi-ai\";\nimport { parseSkillBlock } from \"@gsd/agent-core\";\nimport type { SessionContext } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport type { TruncationResult } from \"@gsd/pi-coding-agent/core/tools/truncate.js\";\nimport { Container, Markdown, Spacer, Text } from \"@gsd/pi-tui\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport { chatTurnFollowsUser, reconcileChatTurnConnections } from \"./components/chat-turn-connect.js\";\nimport { BashExecutionComponent } from \"./components/bash-execution.js\";\nimport { BranchSummaryMessageComponent } from \"./components/branch-summary-message.js\";\nimport { CompactionSummaryMessageComponent } from \"./components/compaction-summary-message.js\";\nimport { CustomMessageComponent } from \"./components/custom-message.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { SkillInvocationMessageComponent } from \"./components/skill-invocation-message.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { UserMessageComponent } from \"./components/user-message.js\";\nimport { asServerToolUse, asWebSearchResult, isToolContentBlock } from \"./gsd-content-blocks.js\";\nimport { buildAssistantReplaySegments } from \"./interactive-notify-render.js\";\nimport { MAX_CHAT_COMPONENTS } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\t/** Extract text content from a user message */\nexport function getUserMessageText(host: InteractiveModeDelegateHost, message: Message): string {\n\t\tif (message.role !== \"user\") return \"\";\n\t\tconst textBlocks =\n\t\t\ttypeof message.content === \"string\"\n\t\t\t\t? [{ type: \"text\", text: message.content }]\n\t\t\t\t: message.content.filter((c: { type: string }) => c.type === \"text\");\n\t\treturn textBlocks.map((c) => (c as { text: string }).text).join(\"\");\n\t}\n\n\t/**\n\t * Show a status message in the chat.\n\t *\n\t * If multiple status messages are emitted back-to-back (without anything else being added to the chat),\n\t * we update the previous status line instead of appending new ones to avoid log spam.\n\t */\nexport function showStatus(host: InteractiveModeDelegateHost, message: string, options?: { append?: boolean }): void {\n\t\tconst append = options?.append ?? false;\n\t\tconst children = host.chatContainer.children;\n\t\tconst last = children.length > 0 ? children[children.length - 1] : undefined;\n\t\tconst secondLast = children.length > 1 ? children[children.length - 2] : undefined;\n\n\t\tif (!append && last && secondLast && last === host.lastStatusText && secondLast === host.lastStatusSpacer) {\n\t\t\thost.lastStatusText.setText(theme.fg(\"dim\", message));\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tconst spacer = new Spacer(1);\n\t\tconst text = new Text(theme.fg(\"dim\", message), 1, 0);\n\t\thost.chatContainer.addChild(spacer);\n\t\thost.chatContainer.addChild(text);\n\t\thost.lastStatusSpacer = spacer;\n\t\thost.lastStatusText = text;\n\t\thost.ui.requestRender();\n\t}\n\nfunction addUserMessageComponent(host: InteractiveModeDelegateHost, userComponent: UserMessageComponent): void {\n\thost.chatContainer.addChild(userComponent);\n}\n\nfunction finalizeChatMutation(host: InteractiveModeDelegateHost): void {\n\ttrimChatHistory(host);\n\treconcileChatTurnConnections(host.chatContainer.children);\n}\n\nexport function addMessageToChat(host: InteractiveModeDelegateHost, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\t\tswitch (message.role) {\n\t\t\tcase \"bashExecution\": {\n\t\t\t\tconst component = new BashExecutionComponent(message.command, host.ui, message.excludeFromContext);\n\t\t\t\tif (message.output) {\n\t\t\t\t\tcomponent.appendOutput(message.output);\n\t\t\t\t}\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessage.exitCode,\n\t\t\t\t\tmessage.cancelled,\n\t\t\t\t\tmessage.truncated ? ({ truncated: true } as TruncationResult) : undefined,\n\t\t\t\t\tmessage.fullOutputPath,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom\": {\n\t\t\t\tif (message.display) {\n\t\t\t\t\tconst renderer = host.session.extensionRunner?.getMessageRenderer(message.customType);\n\t\t\t\t\tconst component = new CustomMessageComponent(message, renderer, host.getMarkdownThemeWithSettings());\n\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"compactionSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new CompactionSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"branchSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new BranchSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst textContent = getUserMessageText(host, message);\n\t\t\t\tif (textContent) {\n\t\t\t\t\tconst skillBlock = parseSkillBlock(textContent);\n\t\t\t\t\tif (skillBlock) {\n\t\t\t\t\t\t// Render skill block (collapsible)\n\t\t\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\t\t\tconst component = new SkillInvocationMessageComponent(\n\t\t\t\t\t\t\tskillBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Render user message separately if present\n\t\t\t\t\t\tif (skillBlock.userMessage) {\n\t\t\t\t\t\t\tconst userComponent = new UserMessageComponent(\n\t\t\t\t\t\t\t\tskillBlock.userMessage,\n\t\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\t\tmessage.timestamp,\n\t\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst userComponent = new UserMessageComponent(textContent, host.getMarkdownThemeWithSettings(), message.timestamp, timestampFormat);\n\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t}\n\t\t\t\t\tif (options?.populateHistory) {\n\t\t\t\t\t\thost.editor.addToHistory?.(textContent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"assistant\": {\n\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\tmessage,\n\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\ttimestampFormat,\n\t\t\t\t\tundefined,\n\t\t\t\t\tconnectedToUser,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\t// Tool results are rendered inline with tool calls, handled separately\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = message;\n\t\t\t}\n\t\t}\n\t\tfinalizeChatMutation(host);\n\t}\n\n\t/**\n\t * Remove oldest components when chat exceeds MAX_CHAT_COMPONENTS.\n\t * Only render-components are removed — session data stays in SessionManager.\n\t */\nexport function trimChatHistory(host: InteractiveModeDelegateHost): void {\n\t\twhile (host.chatContainer.children.length > MAX_CHAT_COMPONENTS) {\n\t\t\tconst oldest = host.chatContainer.children[0];\n\t\t\thost.chatContainer.removeChild(oldest);\n\t\t}\n\t}\n\n\t/**\n\t * Render session context to chat. Used for initial load and rebuild after compaction.\n\t * @param sessionContext Session context to render\n\t * @param options.updateFooter Update footer state\n\t * @param options.populateHistory Add user messages to editor history\n\t */\nexport function renderSessionContext(host: InteractiveModeDelegateHost, \n\t\tsessionContext: SessionContext,\n\t\toptions: { updateFooter?: boolean; populateHistory?: boolean } = {},\n\t): void {\n\t\thost.pendingTools.clear();\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\n\t\tif (options.updateFooter) {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t}\n\n\t\tfor (const message of sessionContext.messages) {\n\t\t\t// Assistant messages need special handling for tool calls\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst hasToolBlocks = message.content.some((c) => isToolContentBlock(c));\n\t\t\t\tif (!hasToolBlocks) {\n\t\t\t\t\taddMessageToChat(host, message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst assistantSegments: AssistantMessageComponent[] = [];\n\t\t\t\tconst replaySegments = buildAssistantReplaySegments(message.content);\n\n\t\t\t\tfor (const segment of replaySegments) {\n\t\t\t\t\tif (segment.kind === \"assistant\") {\n\t\t\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t{ startIndex: segment.startIndex, endIndex: segment.endIndex },\n\t\t\t\t\t\t\tconnectedToUser,\n\t\t\t\t\t\t);\n\t\t\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\t\t\tassistantSegments.push(assistantComponent);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst content = message.content[segment.contentIndex];\n\t\t\t\t\tif (content.type === \"toolCall\") {\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\t\tcontent.arguments,\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\thost.getRegisteredToolDefinition(content.name),\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\n\t\t\t\t\t\tif (message.stopReason === \"aborted\" || message.stopReason === \"error\") {\n\t\t\t\t\t\t\tlet errorMessage: string;\n\t\t\t\t\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\t\t\t\t\tconst retryAttempt = host.session.retryAttempt;\n\t\t\t\t\t\t\t\terrorMessage =\n\t\t\t\t\t\t\t\t\tretryAttempt > 0\n\t\t\t\t\t\t\t\t\t\t? `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? \"s\" : \"\"}`\n\t\t\t\t\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\terrorMessage = message.errorMessage || \"Error\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcomponent.updateResult({ content: [{ type: \"text\", text: errorMessage }], isError: true });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.pendingTools.set(content.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst serverTool = asServerToolUse(content);\n\t\t\t\t\t\tif (serverTool) {\n\t\t\t\t\t\t// Server-side tool (e.g., native web search)\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tserverTool.name,\n\t\t\t\t\t\t\tserverTool.input ?? {},\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Find matching webSearchResult in host message's content\n\t\t\t\t\t\tconst resultBlock = message.content\n\t\t\t\t\t\t\t.map(asWebSearchResult)\n\t\t\t\t\t\t\t.find((block) => block && block.toolUseId === serverTool.id);\n\t\t\t\t\t\tif (resultBlock) {\n\t\t\t\t\t\t\tconst searchContent = resultBlock.content;\n\t\t\t\t\t\t\tconst isError = searchContent && typeof searchContent === \"object\" && \"type\" in (searchContent as any) && (searchContent as any).type === \"web_search_tool_result_error\";\n\t\t\t\t\t\t\tconst resultText = host.formatWebSearchResult(searchContent);\n\t\t\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: resultText }],\n\t\t\t\t\t\t\t\tisError: !!isError,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No result yet (aborted stream?) — show as pending\n\t\t\t\t\t\t\thost.pendingTools.set(serverTool.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Match streaming-mode behavior: show metadata once on the final\n\t\t\t\t// assistant prose segment for host message.\n\t\t\t\tconst lastAssistantSegment = assistantSegments[assistantSegments.length - 1];\n\t\t\t\tlastAssistantSegment?.setShowMetadata(true);\n\t\t\t} else if (message.role === \"toolResult\") {\n\t\t\t\t// Match tool results to pending tool components\n\t\t\t\tconst component = host.pendingTools.get(message.toolCallId);\n\t\t\t\tif (component) {\n\t\t\t\t\tcomponent.updateResult(message);\n\t\t\t\t\thost.pendingTools.delete(message.toolCallId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// All other messages use standard rendering\n\t\t\t\taddMessageToChat(host, message, options);\n\t\t\t}\n\t\t}\n\n\t\t// Any pendingTools entries left over after replay are historical tool\n\t\t// calls whose results were squashed out of session context (commonly by\n\t\t// compaction). Mark them finished so the frame stops showing \"Running\".\n\t\tfor (const component of host.pendingTools.values()) {\n\t\t\tcomponent.markHistoricalNoResult();\n\t\t}\n\t\thost.pendingTools.clear();\n\t\ttrimChatHistory(host);\n\t\treconcileChatTurnConnections(host.chatContainer.children);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderInitialMessages(host: InteractiveModeDelegateHost): void {\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context, {\n\t\t\tupdateFooter: true,\n\t\t\tpopulateHistory: true,\n\t\t});\n\t\tpopulatePinnedFromMessages(host, context.messages);\n\n\t\tconst allEntries = host.sessionManager.getEntries();\n\t\tconst compactionCount = allEntries.filter((e: { type: string }) => e.type === \"compaction\").length;\n\t\tif (compactionCount > 0) {\n\t\t\tconst times = compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n\t\t\tshowStatus(host, `Session compacted ${times}`);\n\t\t}\n\t}\n\nexport async function getUserInput(host: InteractiveModeDelegateHost): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\thost.onInputCallback = (text: string) => {\n\t\t\t\thost.onInputCallback = undefined;\n\t\t\t\tresolve(text);\n\t\t\t};\n\t\t});\n\t}\n\nexport function rebuildChatFromMessages(host: InteractiveModeDelegateHost): void {\n\t\thost.chatContainer.clear();\n\t\thost.pinnedMessageContainer.clear();\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context);\n\t\t// Pinned content NOT re-populated here — the streaming lifecycle in\n\t\t// chat-controller.ts manages the pinned zone during active work.\n\t\t// populatePinnedFromMessages() remains in renderInitialMessages()\n\t\t// for the session-resume case at startup.\n\t}\n\n\t/**\n\t * After rebuilding chat from messages, pin the last assistant text above the\n\t * editor if tool results would otherwise push it out of the viewport.\n\t */\nexport function populatePinnedFromMessages(host: InteractiveModeDelegateHost, messages: AgentMessage[]): void {\n\t\thost.pinnedMessageContainer.clear();\n\n\t\t// Walk backwards to find the last assistant message\n\t\tlet lastAssistant: AssistantMessage | undefined;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg && \"role\" in msg && msg.role === \"assistant\") {\n\t\t\t\tlastAssistant = msg as AssistantMessage;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!lastAssistant) return;\n\n\t\t// Check if any tool calls follow the last text block\n\t\tconst content = lastAssistant.content;\n\t\tlet lastTextIndex = -1;\n\t\tlet hasToolAfterText = false;\n\t\tfor (let i = 0; i < content.length; i++) {\n\t\t\tif (content[i].type === \"text\") lastTextIndex = i;\n\t\t}\n\t\tif (lastTextIndex >= 0) {\n\t\t\tfor (let i = lastTextIndex + 1; i < content.length; i++) {\n\t\t\t\tif (isToolContentBlock(content[i])) {\n\t\t\t\t\thasToolAfterText = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!hasToolAfterText || lastTextIndex < 0) return;\n\n\t\tconst textBlock = content[lastTextIndex] as { type: \"text\"; text: string };\n\t\tconst text = textBlock.text?.trim();\n\t\tif (!text) return;\n\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew DynamicBorder((str: string) => theme.fg(\"dim\", str), \"Latest Output\"),\n\t\t);\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew Markdown(text, 1, 0, host.getMarkdownThemeWithSettings()),\n\t\t);\n\t}\n"]}
|
|
1
|
+
{"version":3,"file":"interactive-chat-render.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-chat-render.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport type { AgentMessage } from \"@gsd/pi-agent-core\";\nimport type { AssistantMessage, Message } from \"@gsd/pi-ai\";\nimport { parseSkillBlock } from \"@gsd/agent-core\";\nimport type { SessionContext } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport type { TruncationResult } from \"@gsd/pi-coding-agent/core/tools/truncate.js\";\nimport { Container, Markdown, Spacer, Text } from \"@gsd/pi-tui\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport { chatTurnFollowsUser, reconcileChatTurnConnections } from \"./components/chat-turn-connect.js\";\nimport { BashExecutionComponent } from \"./components/bash-execution.js\";\nimport { BranchSummaryMessageComponent } from \"./components/branch-summary-message.js\";\nimport { CompactionSummaryMessageComponent } from \"./components/compaction-summary-message.js\";\nimport { CustomMessageComponent } from \"./components/custom-message.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { SkillInvocationMessageComponent } from \"./components/skill-invocation-message.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { UserMessageComponent } from \"./components/user-message.js\";\nimport { asServerToolUse, asWebSearchResult, isToolContentBlock } from \"./gsd-content-blocks.js\";\nimport { buildAssistantReplaySegments } from \"./interactive-notify-render.js\";\nimport { MAX_CHAT_COMPONENTS } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\t/** Extract text content from a user message */\nexport function getUserMessageText(host: InteractiveModeDelegateHost, message: Message): string {\n\t\tif (message.role !== \"user\") return \"\";\n\t\tconst textBlocks =\n\t\t\ttypeof message.content === \"string\"\n\t\t\t\t? [{ type: \"text\", text: message.content }]\n\t\t\t\t: message.content.filter((c: { type: string }) => c.type === \"text\");\n\t\treturn textBlocks.map((c) => (c as { text: string }).text).join(\"\");\n\t}\n\n\t/**\n\t * Show a status message in the chat.\n\t *\n\t * If multiple status messages are emitted back-to-back (without anything else being added to the chat),\n\t * we update the previous status line instead of appending new ones to avoid log spam.\n\t */\nexport function showStatus(host: InteractiveModeDelegateHost, message: string, options?: { append?: boolean }): void {\n\t\tconst append = options?.append ?? false;\n\t\tconst children = host.chatContainer.children;\n\t\tconst last = children.length > 0 ? children[children.length - 1] : undefined;\n\t\tconst secondLast = children.length > 1 ? children[children.length - 2] : undefined;\n\n\t\tif (!append && last && secondLast && last === host.lastStatusText && secondLast === host.lastStatusSpacer) {\n\t\t\thost.lastStatusText.setText(theme.fg(\"dim\", message));\n\t\t\thost.ui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tconst spacer = new Spacer(1);\n\t\tconst text = new Text(theme.fg(\"dim\", message), 1, 0);\n\t\thost.chatContainer.addChild(spacer);\n\t\thost.chatContainer.addChild(text);\n\t\thost.lastStatusSpacer = spacer;\n\t\thost.lastStatusText = text;\n\t\thost.ui.requestRender();\n\t}\n\nfunction addUserMessageComponent(host: InteractiveModeDelegateHost, userComponent: UserMessageComponent): void {\n\thost.chatContainer.addChild(userComponent);\n}\n\nfunction hasAssistantVisibleContent(content: Array<any>, hideThinkingBlock: boolean): boolean {\n\treturn content.some((c: any) => {\n\t\tif (c?.type === \"text\" && typeof c.text === \"string\" && c.text.trim().length > 0) return true;\n\t\tif (!hideThinkingBlock && c?.type === \"thinking\" && typeof c.thinking === \"string\" && c.thinking.trim().length > 0) return true;\n\t\treturn false;\n\t});\n}\n\nfunction finalizeChatMutation(host: InteractiveModeDelegateHost): void {\n\ttrimChatHistory(host);\n\treconcileChatTurnConnections(host.chatContainer.children);\n}\n\nexport function addMessageToChat(host: InteractiveModeDelegateHost, message: AgentMessage, options?: { populateHistory?: boolean }): void {\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\t\tswitch (message.role) {\n\t\t\tcase \"bashExecution\": {\n\t\t\t\tconst component = new BashExecutionComponent(message.command, host.ui, message.excludeFromContext);\n\t\t\t\tif (message.output) {\n\t\t\t\t\tcomponent.appendOutput(message.output);\n\t\t\t\t}\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessage.exitCode,\n\t\t\t\t\tmessage.cancelled,\n\t\t\t\t\tmessage.truncated ? ({ truncated: true } as TruncationResult) : undefined,\n\t\t\t\t\tmessage.fullOutputPath,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom\": {\n\t\t\t\tif (message.display) {\n\t\t\t\t\tconst renderer = host.session.extensionRunner?.getMessageRenderer(message.customType);\n\t\t\t\t\tconst component = new CustomMessageComponent(message, renderer, host.getMarkdownThemeWithSettings());\n\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"compactionSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new CompactionSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"branchSummary\": {\n\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\tconst component = new BranchSummaryMessageComponent(message, host.getMarkdownThemeWithSettings());\n\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst textContent = getUserMessageText(host, message);\n\t\t\t\tif (textContent) {\n\t\t\t\t\tconst skillBlock = parseSkillBlock(textContent);\n\t\t\t\t\tif (skillBlock) {\n\t\t\t\t\t\t// Render skill block (collapsible)\n\t\t\t\t\t\thost.chatContainer.addChild(new Spacer(1));\n\t\t\t\t\t\tconst component = new SkillInvocationMessageComponent(\n\t\t\t\t\t\t\tskillBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Render user message separately if present\n\t\t\t\t\t\tif (skillBlock.userMessage) {\n\t\t\t\t\t\t\tconst userComponent = new UserMessageComponent(\n\t\t\t\t\t\t\t\tskillBlock.userMessage,\n\t\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\t\tmessage.timestamp,\n\t\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst userComponent = new UserMessageComponent(textContent, host.getMarkdownThemeWithSettings(), message.timestamp, timestampFormat);\n\t\t\t\t\t\taddUserMessageComponent(host, userComponent);\n\t\t\t\t\t}\n\t\t\t\t\tif (options?.populateHistory) {\n\t\t\t\t\t\thost.editor.addToHistory?.(textContent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"assistant\": {\n\t\t\t\tconst hasToolBlocks = message.content.some((c: any) => isToolContentBlock(c));\n\t\t\t\tconst isAbortOrError = message.stopReason === \"aborted\" || message.stopReason === \"error\";\n\t\t\t\tif (!hasAssistantVisibleContent(message.content, host.hideThinkingBlock) && !(isAbortOrError && !hasToolBlocks)) break;\n\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\tmessage,\n\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\ttimestampFormat,\n\t\t\t\t\tundefined,\n\t\t\t\t\tconnectedToUser,\n\t\t\t\t);\n\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\t// Tool results are rendered inline with tool calls, handled separately\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst _exhaustive: never = message;\n\t\t\t}\n\t\t}\n\t\tfinalizeChatMutation(host);\n\t}\n\n\t/**\n\t * Remove oldest components when chat exceeds MAX_CHAT_COMPONENTS.\n\t * Only render-components are removed — session data stays in SessionManager.\n\t */\nexport function trimChatHistory(host: InteractiveModeDelegateHost): void {\n\t\twhile (host.chatContainer.children.length > MAX_CHAT_COMPONENTS) {\n\t\t\tconst oldest = host.chatContainer.children[0];\n\t\t\thost.chatContainer.removeChild(oldest);\n\t\t}\n\t}\n\n\t/**\n\t * Render session context to chat. Used for initial load and rebuild after compaction.\n\t * @param sessionContext Session context to render\n\t * @param options.updateFooter Update footer state\n\t * @param options.populateHistory Add user messages to editor history\n\t */\nexport function renderSessionContext(host: InteractiveModeDelegateHost, \n\t\tsessionContext: SessionContext,\n\t\toptions: { updateFooter?: boolean; populateHistory?: boolean } = {},\n\t): void {\n\t\thost.pendingTools.clear();\n\t\tconst timestampFormat = host.settingsManager.getTimestampFormat();\n\n\t\tif (options.updateFooter) {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t}\n\n\t\tfor (const message of sessionContext.messages) {\n\t\t\t// Assistant messages need special handling for tool calls\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst hasToolBlocks = message.content.some((c) => isToolContentBlock(c));\n\t\t\t\tif (!hasToolBlocks) {\n\t\t\t\t\taddMessageToChat(host, message);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst assistantSegments: AssistantMessageComponent[] = [];\n\t\t\t\tconst replaySegments = buildAssistantReplaySegments(message.content);\n\n\t\t\t\tfor (const segment of replaySegments) {\n\t\t\t\t\tif (segment.kind === \"assistant\") {\n\t\t\t\t\t\tconst segContent = message.content.slice(segment.startIndex, segment.endIndex + 1);\n\t\t\t\t\t\tif (!hasAssistantVisibleContent(segContent, host.hideThinkingBlock)) continue;\n\t\t\t\t\t\tconst connectedToUser = chatTurnFollowsUser(host.chatContainer.children);\n\t\t\t\t\t\tconst assistantComponent = new AssistantMessageComponent(\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\thost.hideThinkingBlock,\n\t\t\t\t\t\t\thost.getMarkdownThemeWithSettings(),\n\t\t\t\t\t\t\ttimestampFormat,\n\t\t\t\t\t\t\t{ startIndex: segment.startIndex, endIndex: segment.endIndex },\n\t\t\t\t\t\t\tconnectedToUser,\n\t\t\t\t\t\t);\n\t\t\t\t\t\thost.chatContainer.addChild(assistantComponent);\n\t\t\t\t\t\tassistantSegments.push(assistantComponent);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst content = message.content[segment.contentIndex];\n\t\t\t\t\tif (content.type === \"toolCall\") {\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tcontent.name,\n\t\t\t\t\t\t\tcontent.arguments,\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\thost.getRegisteredToolDefinition(content.name),\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\n\t\t\t\t\t\tif (message.stopReason === \"aborted\" || message.stopReason === \"error\") {\n\t\t\t\t\t\t\tlet errorMessage: string;\n\t\t\t\t\t\t\tif (message.stopReason === \"aborted\") {\n\t\t\t\t\t\t\t\tconst retryAttempt = host.session.retryAttempt;\n\t\t\t\t\t\t\t\terrorMessage =\n\t\t\t\t\t\t\t\t\tretryAttempt > 0\n\t\t\t\t\t\t\t\t\t\t? `Aborted after ${retryAttempt} retry attempt${retryAttempt > 1 ? \"s\" : \"\"}`\n\t\t\t\t\t\t\t\t\t\t: \"Operation aborted\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\terrorMessage = message.errorMessage || \"Error\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcomponent.updateResult({ content: [{ type: \"text\", text: errorMessage }], isError: true });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.pendingTools.set(content.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst serverTool = asServerToolUse(content);\n\t\t\t\t\t\tif (serverTool) {\n\t\t\t\t\t\t// Server-side tool (e.g., native web search)\n\t\t\t\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\t\t\t\tserverTool.name,\n\t\t\t\t\t\t\tserverTool.input ?? {},\n\t\t\t\t\t\t\t{ showImages: host.settingsManager.getShowImages() },\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\thost.ui,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcomponent.setExpanded(host.toolOutputExpanded);\n\t\t\t\t\t\thost.chatContainer.addChild(component);\n\t\t\t\t\t\t// Find matching webSearchResult in host message's content\n\t\t\t\t\t\tconst resultBlock = message.content\n\t\t\t\t\t\t\t.map(asWebSearchResult)\n\t\t\t\t\t\t\t.find((block) => block && block.toolUseId === serverTool.id);\n\t\t\t\t\t\tif (resultBlock) {\n\t\t\t\t\t\t\tconst searchContent = resultBlock.content;\n\t\t\t\t\t\t\tconst isError = searchContent && typeof searchContent === \"object\" && \"type\" in (searchContent as any) && (searchContent as any).type === \"web_search_tool_result_error\";\n\t\t\t\t\t\t\tconst resultText = host.formatWebSearchResult(searchContent);\n\t\t\t\t\t\t\tcomponent.updateResult({\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: resultText }],\n\t\t\t\t\t\t\t\tisError: !!isError,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// No result yet (aborted stream?) — show as pending\n\t\t\t\t\t\t\thost.pendingTools.set(serverTool.id, component);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Match streaming-mode behavior: show metadata once on the final\n\t\t\t\t// assistant prose segment for host message.\n\t\t\t\tconst lastAssistantSegment = assistantSegments[assistantSegments.length - 1];\n\t\t\t\tlastAssistantSegment?.setShowMetadata(true);\n\t\t\t} else if (message.role === \"toolResult\") {\n\t\t\t\t// Match tool results to pending tool components\n\t\t\t\tconst component = host.pendingTools.get(message.toolCallId);\n\t\t\t\tif (component) {\n\t\t\t\t\tcomponent.updateResult(message);\n\t\t\t\t\thost.pendingTools.delete(message.toolCallId);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// All other messages use standard rendering\n\t\t\t\taddMessageToChat(host, message, options);\n\t\t\t}\n\t\t}\n\n\t\t// Any pendingTools entries left over after replay are historical tool\n\t\t// calls whose results were squashed out of session context (commonly by\n\t\t// compaction). Mark them finished so the frame stops showing \"Running\".\n\t\tfor (const component of host.pendingTools.values()) {\n\t\t\tcomponent.markHistoricalNoResult();\n\t\t}\n\t\thost.pendingTools.clear();\n\t\ttrimChatHistory(host);\n\t\treconcileChatTurnConnections(host.chatContainer.children);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderInitialMessages(host: InteractiveModeDelegateHost): void {\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context, {\n\t\t\tupdateFooter: true,\n\t\t\tpopulateHistory: true,\n\t\t});\n\t\tpopulatePinnedFromMessages(host, context.messages);\n\n\t\tconst allEntries = host.sessionManager.getEntries();\n\t\tconst compactionCount = allEntries.filter((e: { type: string }) => e.type === \"compaction\").length;\n\t\tif (compactionCount > 0) {\n\t\t\tconst times = compactionCount === 1 ? \"1 time\" : `${compactionCount} times`;\n\t\t\tshowStatus(host, `Session compacted ${times}`);\n\t\t}\n\t}\n\nexport async function getUserInput(host: InteractiveModeDelegateHost): Promise<string> {\n\t\treturn new Promise((resolve) => {\n\t\t\thost.onInputCallback = (text: string) => {\n\t\t\t\thost.onInputCallback = undefined;\n\t\t\t\tresolve(text);\n\t\t\t};\n\t\t});\n\t}\n\nexport function rebuildChatFromMessages(host: InteractiveModeDelegateHost): void {\n\t\thost.chatContainer.clear();\n\t\thost.pinnedMessageContainer.clear();\n\t\tconst context = host.sessionManager.buildSessionContext();\n\t\trenderSessionContext(host, context);\n\t\t// Pinned content NOT re-populated here — the streaming lifecycle in\n\t\t// chat-controller.ts manages the pinned zone during active work.\n\t\t// populatePinnedFromMessages() remains in renderInitialMessages()\n\t\t// for the session-resume case at startup.\n\t}\n\n\t/**\n\t * After rebuilding chat from messages, pin the last assistant text above the\n\t * editor if tool results would otherwise push it out of the viewport.\n\t */\nexport function populatePinnedFromMessages(host: InteractiveModeDelegateHost, messages: AgentMessage[]): void {\n\t\thost.pinnedMessageContainer.clear();\n\n\t\t// Walk backwards to find the last assistant message\n\t\tlet lastAssistant: AssistantMessage | undefined;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg && \"role\" in msg && msg.role === \"assistant\") {\n\t\t\t\tlastAssistant = msg as AssistantMessage;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!lastAssistant) return;\n\n\t\t// Check if any tool calls follow the last text block\n\t\tconst content = lastAssistant.content;\n\t\tlet lastTextIndex = -1;\n\t\tlet hasToolAfterText = false;\n\t\tfor (let i = 0; i < content.length; i++) {\n\t\t\tif (content[i].type === \"text\") lastTextIndex = i;\n\t\t}\n\t\tif (lastTextIndex >= 0) {\n\t\t\tfor (let i = lastTextIndex + 1; i < content.length; i++) {\n\t\t\t\tif (isToolContentBlock(content[i])) {\n\t\t\t\t\thasToolAfterText = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!hasToolAfterText || lastTextIndex < 0) return;\n\n\t\tconst textBlock = content[lastTextIndex] as { type: \"text\"; text: string };\n\t\tconst text = textBlock.text?.trim();\n\t\tif (!text) return;\n\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew DynamicBorder((str: string) => theme.fg(\"dim\", str), \"Latest Output\"),\n\t\t);\n\t\thost.pinnedMessageContainer.addChild(\n\t\t\tnew Markdown(text, 1, 0, host.getMarkdownThemeWithSettings()),\n\t\t);\n\t}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gsd/agent-modes",
|
|
3
|
-
"version": "1.1.1-dev.
|
|
3
|
+
"version": "1.1.1-dev.b2556262",
|
|
4
4
|
"description": "GSD run modes and CLI layer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"gsd": {
|
|
@@ -25,12 +25,12 @@
|
|
|
25
25
|
"test": "node --import ../../src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/**/*.test.ts"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@gsd/agent-core": "^1.1.1-dev.
|
|
29
|
-
"@gsd/pi-agent-core": "^1.1.1-dev.
|
|
30
|
-
"@gsd/pi-ai": "^1.1.1-dev.
|
|
31
|
-
"@gsd/pi-coding-agent": "^1.1.1-dev.
|
|
32
|
-
"@gsd/pi-tui": "^1.1.1-dev.
|
|
33
|
-
"@opengsd/contracts": "^1.1.1-dev.
|
|
28
|
+
"@gsd/agent-core": "^1.1.1-dev.b2556262",
|
|
29
|
+
"@gsd/pi-agent-core": "^1.1.1-dev.b2556262",
|
|
30
|
+
"@gsd/pi-ai": "^1.1.1-dev.b2556262",
|
|
31
|
+
"@gsd/pi-coding-agent": "^1.1.1-dev.b2556262",
|
|
32
|
+
"@gsd/pi-tui": "^1.1.1-dev.b2556262",
|
|
33
|
+
"@opengsd/contracts": "^1.1.1-dev.b2556262",
|
|
34
34
|
"chalk": "^5.5.0"
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -1082,7 +1082,7 @@ const planTaskParams = {
|
|
|
1082
1082
|
files: z.array(z.string()).describe("Files likely touched"),
|
|
1083
1083
|
verify: nonEmptyString("verify").describe("Verification command or block"),
|
|
1084
1084
|
inputs: z.array(z.string()).describe("Input files or references"),
|
|
1085
|
-
expectedOutput: z.array(z.string()).describe("
|
|
1085
|
+
expectedOutput: z.array(z.string()).describe("Files this task creates or overwrites"),
|
|
1086
1086
|
observabilityImpact: optionalNonEmptyString("observabilityImpact").describe("Task observability impact"),
|
|
1087
1087
|
};
|
|
1088
1088
|
const planTaskSchema = z.object(planTaskParams);
|