gsd-pi 2.33.1-dev.29a8268 → 2.33.1-dev.b1c6556
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/cli.js +16 -0
- package/dist/resource-loader.d.ts +2 -0
- package/dist/resource-loader.js +39 -4
- package/dist/resources/extensions/ask-user-questions.js +217 -0
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
- package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
- package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
- package/dist/resources/extensions/async-jobs/index.js +119 -0
- package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
- package/dist/resources/extensions/aws-auth/index.js +138 -0
- package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
- package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
- package/dist/resources/extensions/bg-shell/index.js +41 -0
- package/dist/resources/extensions/bg-shell/interaction.js +160 -0
- package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
- package/dist/resources/extensions/bg-shell/overlay.js +378 -0
- package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
- package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
- package/dist/resources/extensions/bg-shell/types.js +96 -0
- package/dist/resources/extensions/bg-shell/utilities.js +50 -0
- package/dist/resources/extensions/browser-tools/capture.js +179 -0
- package/dist/resources/extensions/browser-tools/core.js +899 -0
- package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
- package/dist/resources/extensions/browser-tools/index.js +123 -0
- package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
- package/dist/resources/extensions/browser-tools/refs.js +254 -0
- package/dist/resources/extensions/browser-tools/settle.js +173 -0
- package/dist/resources/extensions/browser-tools/state.js +126 -0
- package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
- package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
- package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
- package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
- package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
- package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
- package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
- package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
- package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
- package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
- package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
- package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
- package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
- package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
- package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
- package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
- package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
- package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
- package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
- package/dist/resources/extensions/browser-tools/utils.js +490 -0
- package/dist/resources/extensions/context7/index.js +337 -0
- package/dist/resources/extensions/get-secrets-from-user.js +492 -0
- package/dist/resources/extensions/google-search/index.js +373 -0
- package/dist/resources/extensions/gsd/activity-log.js +146 -0
- package/dist/resources/extensions/gsd/atomic-write.js +38 -0
- package/dist/resources/extensions/gsd/auto/session.js +187 -0
- package/dist/resources/extensions/gsd/auto-budget.js +30 -0
- package/dist/resources/extensions/gsd/{auto-constants.ts → auto-constants.js} +0 -1
- package/dist/resources/extensions/gsd/auto-dashboard.js +509 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +180 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +382 -0
- package/dist/resources/extensions/gsd/auto-idempotency.js +106 -0
- package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
- package/dist/resources/extensions/gsd/auto-observability.js +54 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +495 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +1121 -0
- package/dist/resources/extensions/gsd/auto-recovery.js +550 -0
- package/dist/resources/extensions/gsd/auto-start.js +405 -0
- package/dist/resources/extensions/gsd/auto-stuck-detection.js +165 -0
- package/dist/resources/extensions/gsd/{auto-supervisor.ts → auto-supervisor.js} +25 -33
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
- package/dist/resources/extensions/gsd/auto-timers.js +181 -0
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
- package/dist/resources/extensions/gsd/auto-verification.js +209 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +665 -0
- package/dist/resources/extensions/gsd/auto.js +1495 -0
- package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
- package/dist/resources/extensions/gsd/captures.js +348 -0
- package/dist/resources/extensions/gsd/claude-import.js +540 -0
- package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +223 -0
- package/dist/resources/extensions/gsd/commands-config.js +89 -0
- package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
- package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
- package/dist/resources/extensions/gsd/commands-logs.js +468 -0
- package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
- package/dist/resources/extensions/gsd/commands.js +1024 -0
- package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
- package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
- package/dist/resources/extensions/gsd/context-budget.js +187 -0
- package/dist/resources/extensions/gsd/context-store.js +165 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
- package/dist/resources/extensions/gsd/db-writer.js +298 -0
- package/dist/resources/extensions/gsd/debug-logger.js +161 -0
- package/dist/resources/extensions/gsd/detection.js +373 -0
- package/dist/resources/extensions/gsd/diff-context.js +168 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +76 -0
- package/dist/resources/extensions/gsd/doctor-checks.js +563 -0
- package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
- package/dist/resources/extensions/gsd/doctor-format.js +71 -0
- package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
- package/dist/resources/extensions/gsd/doctor-types.js +12 -0
- package/dist/resources/extensions/gsd/doctor.js +672 -0
- package/dist/resources/extensions/gsd/error-utils.js +6 -0
- package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
- package/dist/resources/extensions/gsd/exit-command.js +11 -0
- package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
- package/dist/resources/extensions/gsd/export.js +268 -0
- package/dist/resources/extensions/gsd/file-watcher.js +76 -0
- package/dist/resources/extensions/gsd/files.js +937 -0
- package/dist/resources/extensions/gsd/forensics.js +511 -0
- package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
- package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
- package/dist/resources/extensions/gsd/git-service.js +460 -0
- package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
- package/dist/resources/extensions/gsd/gsd-db.js +590 -0
- package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
- package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
- package/dist/resources/extensions/gsd/health-widget.js +141 -0
- package/dist/resources/extensions/gsd/history.js +118 -0
- package/dist/resources/extensions/gsd/index.js +1250 -0
- package/dist/resources/extensions/gsd/init-wizard.js +479 -0
- package/dist/resources/extensions/gsd/json-persistence.js +62 -0
- package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
- package/dist/resources/extensions/gsd/key-manager.js +829 -0
- package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
- package/dist/resources/extensions/gsd/md-importer.js +440 -0
- package/dist/resources/extensions/gsd/mechanical-completion.js +351 -0
- package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
- package/dist/resources/extensions/gsd/memory-store.js +351 -0
- package/dist/resources/extensions/gsd/metrics.js +377 -0
- package/dist/resources/extensions/gsd/migrate/command.js +157 -0
- package/dist/resources/extensions/gsd/migrate/index.js +7 -0
- package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
- package/dist/resources/extensions/gsd/migrate/types.js +4 -0
- package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
- package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
- package/dist/resources/extensions/gsd/migrate-external.js +130 -0
- package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
- package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
- package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
- package/dist/resources/extensions/gsd/model-router.js +187 -0
- package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
- package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
- package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
- package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
- package/dist/resources/extensions/gsd/notifications.js +58 -0
- package/dist/resources/extensions/gsd/observability-validator.js +398 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
- package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
- package/dist/resources/extensions/gsd/paths.js +414 -0
- package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
- package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
- package/dist/resources/extensions/gsd/preferences-models.js +294 -0
- package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
- package/dist/resources/extensions/gsd/preferences-types.js +73 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
- package/dist/resources/extensions/gsd/preferences.js +325 -0
- package/dist/resources/extensions/gsd/progress-score.js +197 -0
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
- package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
- package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
- package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
- package/dist/resources/extensions/gsd/queue-order.js +178 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
- package/dist/resources/extensions/gsd/quick.js +230 -0
- package/dist/resources/extensions/gsd/repo-identity.js +187 -0
- package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
- package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
- package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
- package/dist/resources/extensions/gsd/routing-history.js +210 -0
- package/dist/resources/extensions/gsd/safe-fs.js +52 -0
- package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
- package/dist/resources/extensions/gsd/session-forensics.js +427 -0
- package/dist/resources/extensions/gsd/session-lock.js +397 -0
- package/dist/resources/extensions/gsd/session-status-io.js +134 -0
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
- package/dist/resources/extensions/gsd/skill-health.js +324 -0
- package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
- package/dist/resources/extensions/gsd/state.js +653 -0
- package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
- package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
- package/dist/resources/extensions/gsd/token-counter.js +54 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
- package/dist/resources/extensions/gsd/triage-ui.js +125 -0
- package/dist/resources/extensions/gsd/types.js +4 -0
- package/dist/resources/extensions/gsd/undo.js +210 -0
- package/dist/resources/extensions/gsd/unit-id.js +7 -0
- package/dist/resources/extensions/gsd/unit-runtime.js +130 -0
- package/dist/resources/extensions/gsd/validate-directory.js +143 -0
- package/dist/resources/extensions/gsd/verification-evidence.js +123 -0
- package/dist/resources/extensions/gsd/verification-gate.js +543 -0
- package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
- package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
- package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
- package/dist/resources/extensions/gsd/workspace-index.js +139 -0
- package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
- package/dist/resources/extensions/gsd/worktree-command.js +676 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +359 -0
- package/dist/resources/extensions/gsd/worktree.js +236 -0
- package/dist/resources/extensions/mac-tools/index.js +768 -0
- package/dist/resources/extensions/mcp-client/index.js +363 -0
- package/dist/resources/extensions/package.json +3 -0
- package/dist/resources/extensions/remote-questions/config.js +70 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
- package/dist/resources/extensions/remote-questions/format.js +234 -0
- package/dist/resources/extensions/remote-questions/http-client.js +43 -0
- package/dist/resources/extensions/remote-questions/manager.js +156 -0
- package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
- package/dist/resources/extensions/remote-questions/notify.js +89 -0
- package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
- package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
- package/dist/resources/extensions/remote-questions/status.js +25 -0
- package/dist/resources/extensions/remote-questions/store.js +70 -0
- package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
- package/dist/resources/extensions/remote-questions/types.js +5 -0
- package/dist/resources/extensions/search-the-web/cache.js +74 -0
- package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
- package/dist/resources/extensions/search-the-web/format.js +161 -0
- package/dist/resources/extensions/search-the-web/http.js +178 -0
- package/dist/resources/extensions/search-the-web/index.js +41 -0
- package/dist/resources/extensions/search-the-web/native-search.js +166 -0
- package/dist/resources/extensions/search-the-web/provider.js +143 -0
- package/dist/resources/extensions/search-the-web/tavily.js +82 -0
- package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
- package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
- package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
- package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
- package/dist/resources/extensions/shared/confirm-ui.js +96 -0
- package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
- package/dist/resources/extensions/shared/frontmatter.js +109 -0
- package/dist/resources/extensions/shared/interview-ui.js +569 -0
- package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
- package/dist/resources/extensions/shared/next-action-ui.js +168 -0
- package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
- package/dist/resources/extensions/shared/sanitize.js +17 -0
- package/dist/resources/extensions/shared/terminal.js +21 -0
- package/dist/resources/extensions/shared/ui.js +245 -0
- package/dist/resources/extensions/shared/wizard-ui.js +478 -0
- package/dist/resources/extensions/slash-commands/audit.js +72 -0
- package/dist/resources/extensions/slash-commands/clear.js +8 -0
- package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
- package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
- package/dist/resources/extensions/slash-commands/index.js +10 -0
- package/dist/resources/extensions/subagent/agents.js +103 -0
- package/dist/resources/extensions/subagent/index.js +905 -0
- package/dist/resources/extensions/subagent/isolation.js +384 -0
- package/dist/resources/extensions/subagent/worker-registry.js +73 -0
- package/dist/resources/extensions/ttsr/index.js +144 -0
- package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
- package/dist/resources/extensions/universal-config/discovery.js +94 -0
- package/dist/resources/extensions/universal-config/format.js +178 -0
- package/dist/resources/extensions/universal-config/index.js +99 -0
- package/dist/resources/extensions/universal-config/scanners.js +574 -0
- package/dist/resources/extensions/universal-config/tools.js +57 -0
- package/dist/resources/extensions/universal-config/types.js +8 -0
- package/dist/resources/extensions/voice/index.js +247 -0
- package/dist/startup-timings.d.ts +2 -0
- package/dist/startup-timings.js +22 -0
- package/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +5498 -3645
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +2595 -742
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/src/models.generated.ts +2852 -999
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +9 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- 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/src/core/agent-session.ts +9 -0
- package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-tui/dist/utils.d.ts.map +1 -1
- package/packages/pi-tui/dist/utils.js +32 -2
- package/packages/pi-tui/dist/utils.js.map +1 -1
- package/packages/pi-tui/src/utils.ts +28 -2
- package/src/resources/extensions/bg-shell/index.ts +41 -46
- package/src/resources/extensions/browser-tools/index.ts +156 -67
- package/src/resources/extensions/gsd/auto-start.ts +22 -10
- package/src/resources/extensions/gsd/auto-verification.ts +20 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +74 -2
- package/src/resources/extensions/gsd/auto.ts +11 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +252 -0
- package/src/resources/extensions/gsd/commands.ts +39 -31
- package/src/resources/extensions/gsd/git-service.ts +7 -0
- package/src/resources/extensions/gsd/guided-flow.ts +22 -11
- package/src/resources/extensions/gsd/index.ts +93 -32
- package/src/resources/extensions/gsd/quick.ts +52 -3
- package/src/resources/extensions/gsd/repo-identity.ts +56 -22
- package/src/resources/extensions/gsd/session-lock.ts +17 -0
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
- package/src/resources/extensions/gsd/tests/loop-regression.test.ts +1 -4
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +65 -0
- package/src/resources/extensions/gsd/types.ts +4 -0
- package/src/resources/extensions/gsd/verification-evidence.ts +1 -1
- package/src/resources/extensions/gsd/verification-gate.ts +23 -2
- package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
- package/src/resources/extensions/gsd/worktree-command.ts +17 -11
- package/src/resources/extensions/package.json +3 -0
- package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
- package/src/resources/extensions/search-the-web/index.ts +35 -52
- package/src/resources/extensions/search-the-web/tavily.ts +1 -1
- package/dist/resources/extensions/ask-user-questions.ts +0 -290
- package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
- package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
- package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
- package/dist/resources/extensions/async-jobs/index.ts +0 -141
- package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
- package/dist/resources/extensions/aws-auth/index.ts +0 -144
- package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
- package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
- package/dist/resources/extensions/bg-shell/index.ts +0 -59
- package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
- package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
- package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
- package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
- package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
- package/dist/resources/extensions/bg-shell/types.ts +0 -303
- package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
- package/dist/resources/extensions/browser-tools/capture.ts +0 -199
- package/dist/resources/extensions/browser-tools/core.ts +0 -1196
- package/dist/resources/extensions/browser-tools/index.ts +0 -71
- package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
- package/dist/resources/extensions/browser-tools/refs.ts +0 -264
- package/dist/resources/extensions/browser-tools/settle.ts +0 -197
- package/dist/resources/extensions/browser-tools/state.ts +0 -408
- package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
- package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
- package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
- package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
- package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
- package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
- package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
- package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
- package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
- package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
- package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
- package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
- package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
- package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
- package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
- package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
- package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
- package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
- package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
- package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
- package/dist/resources/extensions/browser-tools/utils.ts +0 -660
- package/dist/resources/extensions/context7/index.ts +0 -428
- package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
- package/dist/resources/extensions/google-search/index.ts +0 -466
- package/dist/resources/extensions/gsd/activity-log.ts +0 -162
- package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
- package/dist/resources/extensions/gsd/auto/session.ts +0 -236
- package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
- package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
- package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
- package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
- package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
- package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
- package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
- package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
- package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
- package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
- package/dist/resources/extensions/gsd/auto-start.ts +0 -483
- package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
- package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
- package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
- package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
- package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
- package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
- package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
- package/dist/resources/extensions/gsd/auto.ts +0 -1834
- package/dist/resources/extensions/gsd/captures.ts +0 -427
- package/dist/resources/extensions/gsd/claude-import.ts +0 -656
- package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
- package/dist/resources/extensions/gsd/commands-config.ts +0 -102
- package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
- package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
- package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
- package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
- package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
- package/dist/resources/extensions/gsd/commands.ts +0 -1149
- package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
- package/dist/resources/extensions/gsd/context-budget.ts +0 -266
- package/dist/resources/extensions/gsd/context-store.ts +0 -195
- package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
- package/dist/resources/extensions/gsd/db-writer.ts +0 -360
- package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
- package/dist/resources/extensions/gsd/detection.ts +0 -470
- package/dist/resources/extensions/gsd/diff-context.ts +0 -214
- package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
- package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
- package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
- package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
- package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
- package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
- package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
- package/dist/resources/extensions/gsd/doctor.ts +0 -722
- package/dist/resources/extensions/gsd/error-utils.ts +0 -6
- package/dist/resources/extensions/gsd/exit-command.ts +0 -18
- package/dist/resources/extensions/gsd/export.ts +0 -317
- package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
- package/dist/resources/extensions/gsd/files.ts +0 -1058
- package/dist/resources/extensions/gsd/forensics.ts +0 -629
- package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
- package/dist/resources/extensions/gsd/git-service.ts +0 -586
- package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
- package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
- package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
- package/dist/resources/extensions/gsd/health-widget.ts +0 -167
- package/dist/resources/extensions/gsd/history.ts +0 -143
- package/dist/resources/extensions/gsd/index.ts +0 -1401
- package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
- package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
- package/dist/resources/extensions/gsd/key-manager.ts +0 -996
- package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
- package/dist/resources/extensions/gsd/md-importer.ts +0 -527
- package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
- package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
- package/dist/resources/extensions/gsd/memory-store.ts +0 -441
- package/dist/resources/extensions/gsd/metrics.ts +0 -532
- package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
- package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
- package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
- package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
- package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
- package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
- package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
- package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
- package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
- package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
- package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
- package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
- package/dist/resources/extensions/gsd/model-router.ts +0 -256
- package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
- package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
- package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
- package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
- package/dist/resources/extensions/gsd/notifications.ts +0 -87
- package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
- package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
- package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
- package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
- package/dist/resources/extensions/gsd/paths.ts +0 -449
- package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
- package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
- package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
- package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
- package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
- package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
- package/dist/resources/extensions/gsd/preferences.ts +0 -416
- package/dist/resources/extensions/gsd/progress-score.ts +0 -273
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
- package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
- package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
- package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
- package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
- package/dist/resources/extensions/gsd/queue-order.ts +0 -230
- package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
- package/dist/resources/extensions/gsd/quick.ts +0 -212
- package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
- package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
- package/dist/resources/extensions/gsd/routing-history.ts +0 -286
- package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
- package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
- package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
- package/dist/resources/extensions/gsd/session-lock.ts +0 -426
- package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
- package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
- package/dist/resources/extensions/gsd/skill-health.ts +0 -417
- package/dist/resources/extensions/gsd/state.ts +0 -727
- package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
- package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
- package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
- package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
- package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
- package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
- package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
- package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
- package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
- package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
- package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
- package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
- package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
- package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
- package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
- package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
- package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
- package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
- package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
- package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
- package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
- package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
- package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
- package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
- package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
- package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
- package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
- package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
- package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
- package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
- package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
- package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
- package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
- package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
- package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
- package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
- package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
- package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
- package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
- package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
- package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
- package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
- package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
- package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
- package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
- package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
- package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
- package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
- package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
- package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
- package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
- package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1181
- package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
- package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
- package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
- package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
- package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
- package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
- package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
- package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
- package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
- package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
- package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
- package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
- package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
- package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
- package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
- package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
- package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
- package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
- package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
- package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
- package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
- package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
- package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
- package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
- package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
- package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
- package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
- package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
- package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
- package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
- package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
- package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
- package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
- package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
- package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
- package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
- package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
- package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
- package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
- package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
- package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
- package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
- package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
- package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
- package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
- package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
- package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
- package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
- package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
- package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
- package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
- package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
- package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
- package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
- package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
- package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
- package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
- package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
- package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
- package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
- package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
- package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
- package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
- package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
- package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
- package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
- package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
- package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
- package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
- package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
- package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
- package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
- package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
- package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
- package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
- package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
- package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
- package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
- package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
- package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
- package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
- package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
- package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
- package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
- package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
- package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
- package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
- package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
- package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
- package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
- package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
- package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
- package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
- package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
- package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
- package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
- package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
- package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
- package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
- package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
- package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
- package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
- package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
- package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
- package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
- package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
- package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
- package/dist/resources/extensions/gsd/token-counter.ts +0 -65
- package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
- package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
- package/dist/resources/extensions/gsd/types.ts +0 -425
- package/dist/resources/extensions/gsd/undo.ts +0 -223
- package/dist/resources/extensions/gsd/unit-id.ts +0 -14
- package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
- package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
- package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
- package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
- package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
- package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
- package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
- package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
- package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
- package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
- package/dist/resources/extensions/gsd/worktree.ts +0 -257
- package/dist/resources/extensions/mac-tools/index.ts +0 -852
- package/dist/resources/extensions/mcp-client/index.ts +0 -459
- package/dist/resources/extensions/remote-questions/config.ts +0 -83
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
- package/dist/resources/extensions/remote-questions/format.ts +0 -315
- package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
- package/dist/resources/extensions/remote-questions/manager.ts +0 -184
- package/dist/resources/extensions/remote-questions/notify.ts +0 -90
- package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
- package/dist/resources/extensions/remote-questions/status.ts +0 -31
- package/dist/resources/extensions/remote-questions/store.ts +0 -81
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
- package/dist/resources/extensions/remote-questions/types.ts +0 -102
- package/dist/resources/extensions/search-the-web/cache.ts +0 -78
- package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
- package/dist/resources/extensions/search-the-web/format.ts +0 -258
- package/dist/resources/extensions/search-the-web/http.ts +0 -238
- package/dist/resources/extensions/search-the-web/index.ts +0 -65
- package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
- package/dist/resources/extensions/search-the-web/provider.ts +0 -148
- package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
- package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
- package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
- package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
- package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
- package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
- package/dist/resources/extensions/shared/frontmatter.ts +0 -117
- package/dist/resources/extensions/shared/interview-ui.ts +0 -613
- package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
- package/dist/resources/extensions/shared/sanitize.ts +0 -19
- package/dist/resources/extensions/shared/terminal.ts +0 -23
- package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
- package/dist/resources/extensions/shared/ui.ts +0 -400
- package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
- package/dist/resources/extensions/slash-commands/audit.ts +0 -88
- package/dist/resources/extensions/slash-commands/clear.ts +0 -10
- package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
- package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
- package/dist/resources/extensions/slash-commands/index.ts +0 -12
- package/dist/resources/extensions/subagent/agents.ts +0 -126
- package/dist/resources/extensions/subagent/index.ts +0 -1121
- package/dist/resources/extensions/subagent/isolation.ts +0 -501
- package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
- package/dist/resources/extensions/ttsr/index.ts +0 -168
- package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
- package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
- package/dist/resources/extensions/universal-config/discovery.ts +0 -104
- package/dist/resources/extensions/universal-config/format.ts +0 -191
- package/dist/resources/extensions/universal-config/index.ts +0 -120
- package/dist/resources/extensions/universal-config/scanners.ts +0 -642
- package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
- package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
- package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
- package/dist/resources/extensions/universal-config/tools.ts +0 -60
- package/dist/resources/extensions/universal-config/types.ts +0 -135
- package/dist/resources/extensions/voice/index.ts +0 -272
- package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
- package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
package/dist/cli.js
CHANGED
|
@@ -10,6 +10,7 @@ import { shouldRunOnboarding, runOnboarding } from './onboarding.js';
|
|
|
10
10
|
import chalk from 'chalk';
|
|
11
11
|
import { checkForUpdates } from './update-check.js';
|
|
12
12
|
import { printHelp, printSubcommandHelp } from './help-text.js';
|
|
13
|
+
import { markStartup, printStartupTimings } from './startup-timings.js';
|
|
13
14
|
function exitIfManagedResourcesAreNewer(currentAgentDir) {
|
|
14
15
|
const currentVersion = process.env.GSD_VERSION || '0.0.0';
|
|
15
16
|
const managedVersion = getNewerManagedResourceVersion(currentAgentDir, currentVersion);
|
|
@@ -172,14 +173,18 @@ if (cliFlags.messages[0] === 'headless') {
|
|
|
172
173
|
// because spawnSync(..., ["--version"]) returns EPERM despite a zero exit code.
|
|
173
174
|
// Provision local managed binaries first so Pi sees them without probing PATH.
|
|
174
175
|
ensureManagedTools(join(agentDir, 'bin'));
|
|
176
|
+
markStartup('ensureManagedTools');
|
|
175
177
|
const authStorage = AuthStorage.create(authFilePath);
|
|
178
|
+
markStartup('AuthStorage.create');
|
|
176
179
|
loadStoredEnvKeys(authStorage);
|
|
177
180
|
migratePiCredentials(authStorage);
|
|
178
181
|
// Resolve models.json path with fallback to ~/.pi/agent/models.json
|
|
179
182
|
const { resolveModelsJsonPath } = await import('./models-resolver.js');
|
|
180
183
|
const modelsJsonPath = resolveModelsJsonPath();
|
|
181
184
|
const modelRegistry = new ModelRegistry(authStorage, modelsJsonPath);
|
|
185
|
+
markStartup('ModelRegistry');
|
|
182
186
|
const settingsManager = SettingsManager.create(agentDir);
|
|
187
|
+
markStartup('SettingsManager.create');
|
|
183
188
|
// Run onboarding wizard on first launch (no LLM provider configured)
|
|
184
189
|
if (!isPrintMode && shouldRunOnboarding(authStorage, settingsManager.getDefaultProvider())) {
|
|
185
190
|
await runOnboarding(authStorage);
|
|
@@ -304,12 +309,14 @@ if (isPrintMode) {
|
|
|
304
309
|
}
|
|
305
310
|
exitIfManagedResourcesAreNewer(agentDir);
|
|
306
311
|
initResources(agentDir);
|
|
312
|
+
markStartup('initResources');
|
|
307
313
|
const resourceLoader = new DefaultResourceLoader({
|
|
308
314
|
agentDir,
|
|
309
315
|
additionalExtensionPaths: cliFlags.extensions.length > 0 ? cliFlags.extensions : undefined,
|
|
310
316
|
appendSystemPrompt,
|
|
311
317
|
});
|
|
312
318
|
await resourceLoader.reload();
|
|
319
|
+
markStartup('resourceLoader.reload');
|
|
313
320
|
const { session, extensionsResult } = await createAgentSession({
|
|
314
321
|
authStorage,
|
|
315
322
|
modelRegistry,
|
|
@@ -317,6 +324,7 @@ if (isPrintMode) {
|
|
|
317
324
|
sessionManager,
|
|
318
325
|
resourceLoader,
|
|
319
326
|
});
|
|
327
|
+
markStartup('createAgentSession');
|
|
320
328
|
if (extensionsResult.errors.length > 0) {
|
|
321
329
|
for (const err of extensionsResult.errors) {
|
|
322
330
|
process.stderr.write(`[gsd] Extension load error: ${err.error}\n`);
|
|
@@ -333,10 +341,12 @@ if (isPrintMode) {
|
|
|
333
341
|
}
|
|
334
342
|
const mode = cliFlags.mode || 'text';
|
|
335
343
|
if (mode === 'rpc') {
|
|
344
|
+
printStartupTimings();
|
|
336
345
|
await runRpcMode(session);
|
|
337
346
|
process.exit(0);
|
|
338
347
|
}
|
|
339
348
|
if (mode === 'mcp') {
|
|
349
|
+
printStartupTimings();
|
|
340
350
|
const { startMcpServer } = await import('./mcp-server.js');
|
|
341
351
|
await startMcpServer({
|
|
342
352
|
tools: session.agent.state.tools ?? [],
|
|
@@ -345,6 +355,7 @@ if (isPrintMode) {
|
|
|
345
355
|
// MCP server runs until the transport closes; keep alive
|
|
346
356
|
await new Promise(() => { });
|
|
347
357
|
}
|
|
358
|
+
printStartupTimings();
|
|
348
359
|
await runPrintMode(session, {
|
|
349
360
|
mode: mode,
|
|
350
361
|
messages: cliFlags.messages,
|
|
@@ -431,8 +442,10 @@ const sessionManager = cliFlags._selectedSessionPath
|
|
|
431
442
|
: SessionManager.create(cwd, projectSessionsDir);
|
|
432
443
|
exitIfManagedResourcesAreNewer(agentDir);
|
|
433
444
|
initResources(agentDir);
|
|
445
|
+
markStartup('initResources');
|
|
434
446
|
const resourceLoader = buildResourceLoader(agentDir);
|
|
435
447
|
await resourceLoader.reload();
|
|
448
|
+
markStartup('resourceLoader.reload');
|
|
436
449
|
const { session, extensionsResult } = await createAgentSession({
|
|
437
450
|
authStorage,
|
|
438
451
|
modelRegistry,
|
|
@@ -440,6 +453,7 @@ const { session, extensionsResult } = await createAgentSession({
|
|
|
440
453
|
sessionManager,
|
|
441
454
|
resourceLoader,
|
|
442
455
|
});
|
|
456
|
+
markStartup('createAgentSession');
|
|
443
457
|
if (extensionsResult.errors.length > 0) {
|
|
444
458
|
for (const err of extensionsResult.errors) {
|
|
445
459
|
process.stderr.write(`[gsd] Extension load error: ${err.error}\n`);
|
|
@@ -487,4 +501,6 @@ if (enabledModelPatterns && enabledModelPatterns.length > 0) {
|
|
|
487
501
|
}
|
|
488
502
|
}
|
|
489
503
|
const interactiveMode = new InteractiveMode(session);
|
|
504
|
+
markStartup('InteractiveMode');
|
|
505
|
+
printStartupTimings();
|
|
490
506
|
await interactiveMode.run();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
|
|
2
2
|
export { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
3
|
+
export declare function getExtensionKey(entryPath: string, extensionsDir: string): string;
|
|
3
4
|
export declare function readManagedResourceVersion(agentDir: string): string | null;
|
|
4
5
|
export declare function getNewerManagedResourceVersion(agentDir: string, currentVersion: string): string | null;
|
|
5
6
|
/**
|
|
@@ -18,4 +19,5 @@ export declare function getNewerManagedResourceVersion(agentDir: string, current
|
|
|
18
19
|
* Inspectable: `ls ~/.gsd/agent/extensions/`
|
|
19
20
|
*/
|
|
20
21
|
export declare function initResources(agentDir: string): void;
|
|
22
|
+
export declare function hasStaleCompiledExtensionSiblings(extensionsDir: string): boolean;
|
|
21
23
|
export declare function buildResourceLoader(agentDir: string): DefaultResourceLoader;
|
package/dist/resource-loader.js
CHANGED
|
@@ -18,13 +18,15 @@ import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled, ensureRegi
|
|
|
18
18
|
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
19
19
|
const distResources = join(packageRoot, 'dist', 'resources');
|
|
20
20
|
const srcResources = join(packageRoot, 'src', 'resources');
|
|
21
|
-
const resourcesDir = existsSync(distResources)
|
|
21
|
+
const resourcesDir = (existsSync(distResources) && existsSync(join(distResources, 'agents')))
|
|
22
|
+
? distResources
|
|
23
|
+
: srcResources;
|
|
22
24
|
const bundledExtensionsDir = join(resourcesDir, 'extensions');
|
|
23
25
|
const resourceVersionManifestName = 'managed-resources.json';
|
|
24
26
|
export { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
25
|
-
function getExtensionKey(entryPath, extensionsDir) {
|
|
27
|
+
export function getExtensionKey(entryPath, extensionsDir) {
|
|
26
28
|
const relPath = relative(extensionsDir, entryPath);
|
|
27
|
-
return relPath.split(/[\\/]/)[0];
|
|
29
|
+
return relPath.split(/[\\/]/)[0].replace(/\.(?:ts|js)$/, '');
|
|
28
30
|
}
|
|
29
31
|
function getManagedResourceManifestPath(agentDir) {
|
|
30
32
|
return join(agentDir, resourceVersionManifestName);
|
|
@@ -158,6 +160,7 @@ function makeTreeWritable(dirPath) {
|
|
|
158
160
|
function syncResourceDir(srcDir, destDir) {
|
|
159
161
|
makeTreeWritable(destDir);
|
|
160
162
|
if (existsSync(srcDir)) {
|
|
163
|
+
pruneStaleSiblingFiles(srcDir, destDir);
|
|
161
164
|
for (const entry of readdirSync(srcDir, { withFileTypes: true })) {
|
|
162
165
|
if (entry.isDirectory()) {
|
|
163
166
|
const target = join(destDir, entry.name);
|
|
@@ -176,6 +179,24 @@ function syncResourceDir(srcDir, destDir) {
|
|
|
176
179
|
makeTreeWritable(destDir);
|
|
177
180
|
}
|
|
178
181
|
}
|
|
182
|
+
function pruneStaleSiblingFiles(srcDir, destDir) {
|
|
183
|
+
if (!existsSync(destDir))
|
|
184
|
+
return;
|
|
185
|
+
const sourceFiles = new Set(readdirSync(srcDir, { withFileTypes: true })
|
|
186
|
+
.filter((entry) => entry.isFile())
|
|
187
|
+
.map((entry) => entry.name));
|
|
188
|
+
for (const entry of readdirSync(destDir, { withFileTypes: true })) {
|
|
189
|
+
if (!entry.isFile())
|
|
190
|
+
continue;
|
|
191
|
+
if (sourceFiles.has(entry.name))
|
|
192
|
+
continue;
|
|
193
|
+
const sourceJsName = entry.name.replace(/\.ts$/, '.js');
|
|
194
|
+
const sourceTsName = entry.name.replace(/\.js$/, '.ts');
|
|
195
|
+
if (sourceFiles.has(sourceJsName) || sourceFiles.has(sourceTsName)) {
|
|
196
|
+
rmSync(join(destDir, entry.name), { force: true });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
179
200
|
/**
|
|
180
201
|
* Recursive directory copy using copyFileSync — workaround for cpSync failures
|
|
181
202
|
* on Windows paths containing non-ASCII characters (#1178).
|
|
@@ -218,7 +239,8 @@ export function initResources(agentDir) {
|
|
|
218
239
|
if (manifest && manifest.gsdVersion === currentVersion) {
|
|
219
240
|
// Version matches — check content fingerprint for same-version staleness.
|
|
220
241
|
const currentHash = computeResourceFingerprint();
|
|
221
|
-
|
|
242
|
+
const hasStaleExtensionFiles = hasStaleCompiledExtensionSiblings(join(agentDir, 'extensions'));
|
|
243
|
+
if (manifest.contentHash && manifest.contentHash === currentHash && !hasStaleExtensionFiles) {
|
|
222
244
|
return;
|
|
223
245
|
}
|
|
224
246
|
}
|
|
@@ -231,6 +253,19 @@ export function initResources(agentDir) {
|
|
|
231
253
|
writeManagedResourceManifest(agentDir);
|
|
232
254
|
ensureRegistryEntries(join(agentDir, 'extensions'));
|
|
233
255
|
}
|
|
256
|
+
export function hasStaleCompiledExtensionSiblings(extensionsDir) {
|
|
257
|
+
if (!existsSync(extensionsDir))
|
|
258
|
+
return false;
|
|
259
|
+
for (const entry of readdirSync(extensionsDir, { withFileTypes: true })) {
|
|
260
|
+
if (!entry.isFile() || !entry.name.endsWith('.ts'))
|
|
261
|
+
continue;
|
|
262
|
+
const jsName = entry.name.replace(/\.ts$/, '.js');
|
|
263
|
+
if (existsSync(join(extensionsDir, jsName))) {
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
234
269
|
/**
|
|
235
270
|
* Constructs a DefaultResourceLoader that loads extensions from both
|
|
236
271
|
* ~/.gsd/agent/extensions/ (GSD's default) and ~/.pi/agent/extensions/ (pi's default).
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request User Input — LLM tool for asking the user questions
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around the shared interview-ui. The LLM presents 1-3
|
|
5
|
+
* questions with 2-3 options each. Each question can be single-select (default)
|
|
6
|
+
* or multi-select (allowMultiple: true). A free-form "None of the above" option
|
|
7
|
+
* is added automatically to single-select questions.
|
|
8
|
+
*
|
|
9
|
+
* Based on: https://github.com/openai/codex (codex-rs/core/src/tools/handlers/ask_user_questions.rs)
|
|
10
|
+
*/
|
|
11
|
+
import { sanitizeError } from "./shared/sanitize.js";
|
|
12
|
+
import { Text } from "@gsd/pi-tui";
|
|
13
|
+
import { Type } from "@sinclair/typebox";
|
|
14
|
+
import { showInterviewRound, } from "./shared/mod.js";
|
|
15
|
+
// ─── Schema ───────────────────────────────────────────────────────────────────
|
|
16
|
+
const OptionSchema = Type.Object({
|
|
17
|
+
label: Type.String({ description: "User-facing label (1-5 words)" }),
|
|
18
|
+
description: Type.String({ description: "One short sentence explaining impact/tradeoff if selected" }),
|
|
19
|
+
});
|
|
20
|
+
const QuestionSchema = Type.Object({
|
|
21
|
+
id: Type.String({ description: "Stable identifier for mapping answers (snake_case)" }),
|
|
22
|
+
header: Type.String({ description: "Short header label shown in the UI (12 or fewer chars)" }),
|
|
23
|
+
question: Type.String({ description: "Single-sentence prompt shown to the user" }),
|
|
24
|
+
options: Type.Array(OptionSchema, {
|
|
25
|
+
description: 'Provide 2-3 mutually exclusive choices for single-select, or any number for multi-select. Put the recommended option first and suffix its label with "(Recommended)". Do not include an "Other" option for single-select; the client adds a free-form "None of the above" option automatically.',
|
|
26
|
+
}),
|
|
27
|
+
allowMultiple: Type.Optional(Type.Boolean({
|
|
28
|
+
description: "If true, the user can select multiple options using SPACE to toggle and ENTER to confirm. No 'None of the above' option is added. Default: false.",
|
|
29
|
+
})),
|
|
30
|
+
});
|
|
31
|
+
const AskUserQuestionsParams = Type.Object({
|
|
32
|
+
questions: Type.Array(QuestionSchema, {
|
|
33
|
+
description: "Questions to show the user. Prefer 1 and do not exceed 3.",
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
37
|
+
const OTHER_OPTION_LABEL = "None of the above";
|
|
38
|
+
function errorResult(message, questions = []) {
|
|
39
|
+
return {
|
|
40
|
+
content: [{ type: "text", text: sanitizeError(message) }],
|
|
41
|
+
details: { questions, response: null, cancelled: true },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Convert the shared RoundResult into the JSON the LLM expects. */
|
|
45
|
+
function formatForLLM(result) {
|
|
46
|
+
const answers = {};
|
|
47
|
+
for (const [id, answer] of Object.entries(result.answers)) {
|
|
48
|
+
const list = [];
|
|
49
|
+
if (Array.isArray(answer.selected)) {
|
|
50
|
+
list.push(...answer.selected);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
list.push(answer.selected);
|
|
54
|
+
}
|
|
55
|
+
if (answer.notes) {
|
|
56
|
+
list.push(`user_note: ${answer.notes}`);
|
|
57
|
+
}
|
|
58
|
+
answers[id] = { answers: list };
|
|
59
|
+
}
|
|
60
|
+
return JSON.stringify({ answers });
|
|
61
|
+
}
|
|
62
|
+
// ─── Extension ────────────────────────────────────────────────────────────────
|
|
63
|
+
export default function AskUserQuestions(pi) {
|
|
64
|
+
pi.registerTool({
|
|
65
|
+
name: "ask_user_questions",
|
|
66
|
+
label: "Request User Input",
|
|
67
|
+
description: "Request user input for one to three short questions and wait for the response. Single-select questions have 2-3 mutually exclusive options with a free-form 'None of the above' added automatically. Multi-select questions (allowMultiple: true) let the user toggle multiple options with SPACE and confirm with ENTER.",
|
|
68
|
+
promptGuidelines: [
|
|
69
|
+
"Use ask_user_questions when you need the user to choose between concrete alternatives before proceeding.",
|
|
70
|
+
"Keep questions to 1 when possible; never exceed 3.",
|
|
71
|
+
"For single-select: each question must have 2-3 options. Put the recommended option first with '(Recommended)' suffix. Do not include an 'Other' or 'None of the above' option - the client adds one automatically.",
|
|
72
|
+
"For multi-select: set allowMultiple: true. The user can pick any number of options. No 'None of the above' is added.",
|
|
73
|
+
],
|
|
74
|
+
parameters: AskUserQuestionsParams,
|
|
75
|
+
async execute(_toolCallId, params, signal, _onUpdate, ctx) {
|
|
76
|
+
// Validation
|
|
77
|
+
if (params.questions.length === 0 || params.questions.length > 3) {
|
|
78
|
+
return errorResult("Error: questions must contain 1-3 items", params.questions);
|
|
79
|
+
}
|
|
80
|
+
for (const q of params.questions) {
|
|
81
|
+
if (!q.options || q.options.length === 0) {
|
|
82
|
+
return errorResult(`Error: ask_user_questions requires non-empty options for every question (question "${q.id}" has none)`, params.questions);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!ctx.hasUI) {
|
|
86
|
+
const { tryRemoteQuestions } = await import("./remote-questions/manager.js");
|
|
87
|
+
const remoteResult = await tryRemoteQuestions(params.questions, signal);
|
|
88
|
+
if (remoteResult)
|
|
89
|
+
return { ...remoteResult, details: remoteResult.details };
|
|
90
|
+
return errorResult("Error: UI not available (non-interactive mode)", params.questions);
|
|
91
|
+
}
|
|
92
|
+
// Delegate to shared interview UI
|
|
93
|
+
const result = await showInterviewRound(params.questions, {}, ctx);
|
|
94
|
+
// RPC mode fallback: custom() returns undefined, so showInterviewRound
|
|
95
|
+
// may return undefined. Fall back to sequential ctx.ui.select() calls.
|
|
96
|
+
if (!result) {
|
|
97
|
+
const answers = {};
|
|
98
|
+
for (const q of params.questions) {
|
|
99
|
+
const options = q.options.map((o) => o.label);
|
|
100
|
+
if (!q.allowMultiple) {
|
|
101
|
+
options.push(OTHER_OPTION_LABEL);
|
|
102
|
+
}
|
|
103
|
+
const selected = await ctx.ui.select(`${q.header}: ${q.question}`, options, { signal, ...(q.allowMultiple ? { allowMultiple: true } : {}) });
|
|
104
|
+
if (selected === undefined) {
|
|
105
|
+
return errorResult("ask_user_questions was cancelled", params.questions);
|
|
106
|
+
}
|
|
107
|
+
answers[q.id] = {
|
|
108
|
+
answers: Array.isArray(selected) ? selected : [selected],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const roundResult = {
|
|
112
|
+
endInterview: false,
|
|
113
|
+
answers: Object.fromEntries(Object.entries(answers).map(([id, a]) => [
|
|
114
|
+
id,
|
|
115
|
+
{ selected: a.answers.length === 1 ? a.answers[0] : a.answers, notes: "" },
|
|
116
|
+
])),
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
content: [{ type: "text", text: JSON.stringify({ answers }) }],
|
|
120
|
+
details: {
|
|
121
|
+
questions: params.questions,
|
|
122
|
+
response: roundResult,
|
|
123
|
+
cancelled: false,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Check if cancelled (empty answers = user exited)
|
|
128
|
+
const hasAnswers = Object.keys(result.answers).length > 0;
|
|
129
|
+
if (!hasAnswers) {
|
|
130
|
+
return {
|
|
131
|
+
content: [{ type: "text", text: "ask_user_questions was cancelled before receiving a response" }],
|
|
132
|
+
details: { questions: params.questions, response: null, cancelled: true },
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
content: [{ type: "text", text: formatForLLM(result) }],
|
|
137
|
+
details: { questions: params.questions, response: result, cancelled: false },
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
// ─── Rendering ────────────────────────────────────────────────────────
|
|
141
|
+
renderCall(args, theme) {
|
|
142
|
+
const qs = args.questions || [];
|
|
143
|
+
let text = theme.fg("toolTitle", theme.bold("ask_user_questions "));
|
|
144
|
+
text += theme.fg("muted", `${qs.length} question${qs.length !== 1 ? "s" : ""}`);
|
|
145
|
+
if (qs.length > 0) {
|
|
146
|
+
const headers = qs.map((q) => q.header).join(", ");
|
|
147
|
+
text += theme.fg("dim", ` (${headers})`);
|
|
148
|
+
}
|
|
149
|
+
for (const q of qs) {
|
|
150
|
+
const multiSel = !!q.allowMultiple;
|
|
151
|
+
text += `\n ${theme.fg("text", q.question)}`;
|
|
152
|
+
const optLabels = multiSel
|
|
153
|
+
? (q.options || []).map((o) => o.label)
|
|
154
|
+
: [...(q.options || []).map((o) => o.label), OTHER_OPTION_LABEL];
|
|
155
|
+
const prefix = multiSel ? "☐" : "";
|
|
156
|
+
const numbered = optLabels.map((l, i) => `${prefix}${i + 1}. ${l}`).join(", ");
|
|
157
|
+
text += `\n ${theme.fg("dim", numbered)}`;
|
|
158
|
+
}
|
|
159
|
+
return new Text(text, 0, 0);
|
|
160
|
+
},
|
|
161
|
+
renderResult(result, _options, theme) {
|
|
162
|
+
const details = result.details;
|
|
163
|
+
if (!details) {
|
|
164
|
+
const text = result.content[0];
|
|
165
|
+
return new Text(text?.type === "text" ? text.text : "", 0, 0);
|
|
166
|
+
}
|
|
167
|
+
// Remote channel result (discriminated on details.remote === true)
|
|
168
|
+
if (details.remote) {
|
|
169
|
+
if (details.timed_out) {
|
|
170
|
+
return new Text(`${theme.fg("warning", `${details.channel} — timed out`)}${details.threadUrl ? theme.fg("dim", ` ${details.threadUrl}`) : ""}`, 0, 0);
|
|
171
|
+
}
|
|
172
|
+
const questions = (details.questions ?? []);
|
|
173
|
+
const lines = [];
|
|
174
|
+
lines.push(theme.fg("dim", details.channel));
|
|
175
|
+
if (details.response) {
|
|
176
|
+
for (const q of questions) {
|
|
177
|
+
const answer = details.response.answers[q.id];
|
|
178
|
+
if (!answer) {
|
|
179
|
+
lines.push(`${theme.fg("accent", q.header)}: ${theme.fg("dim", "(no answer)")}`);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const answerText = answer.answers.length > 0 ? answer.answers.join(", ") : "(custom)";
|
|
183
|
+
let line = `${theme.fg("success", "✓ ")}${theme.fg("accent", q.header)}: ${answerText}`;
|
|
184
|
+
if (answer.user_note) {
|
|
185
|
+
line += ` ${theme.fg("muted", `[note: ${answer.user_note}]`)}`;
|
|
186
|
+
}
|
|
187
|
+
lines.push(line);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return new Text(lines.join("\n"), 0, 0);
|
|
191
|
+
}
|
|
192
|
+
if (details.cancelled || !details.response) {
|
|
193
|
+
return new Text(theme.fg("warning", "Cancelled"), 0, 0);
|
|
194
|
+
}
|
|
195
|
+
const lines = [];
|
|
196
|
+
for (const q of details.questions) {
|
|
197
|
+
const answer = details.response.answers[q.id];
|
|
198
|
+
if (!answer) {
|
|
199
|
+
lines.push(`${theme.fg("accent", q.header)}: ${theme.fg("dim", "(no answer)")}`);
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const selected = answer.selected;
|
|
203
|
+
const notes = answer.notes;
|
|
204
|
+
const multiSel = !!q.allowMultiple;
|
|
205
|
+
const answerText = multiSel && Array.isArray(selected)
|
|
206
|
+
? selected.join(", ")
|
|
207
|
+
: (Array.isArray(selected) ? selected[0] : selected) ?? "(no answer)";
|
|
208
|
+
let line = `${theme.fg("success", "✓ ")}${theme.fg("accent", q.header)}: ${answerText}`;
|
|
209
|
+
if (notes) {
|
|
210
|
+
line += ` ${theme.fg("muted", `[note: ${notes}]`)}`;
|
|
211
|
+
}
|
|
212
|
+
lines.push(line);
|
|
213
|
+
}
|
|
214
|
+
return new Text(lines.join("\n"), 0, 0);
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* async_bash tool — run a bash command in the background.
|
|
3
|
+
*
|
|
4
|
+
* Registers the command with the AsyncJobManager and returns a job ID
|
|
5
|
+
* immediately. The LLM can continue working and check results later
|
|
6
|
+
* with await_job.
|
|
7
|
+
*/
|
|
8
|
+
import { getShellConfig, sanitizeCommand, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, } from "@gsd/pi-coding-agent";
|
|
9
|
+
import { Type } from "@sinclair/typebox";
|
|
10
|
+
import { spawn } from "node:child_process";
|
|
11
|
+
import { createWriteStream } from "node:fs";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { randomBytes } from "node:crypto";
|
|
15
|
+
const schema = Type.Object({
|
|
16
|
+
command: Type.String({ description: "Bash command to execute in the background" }),
|
|
17
|
+
timeout: Type.Optional(Type.Number({ description: "Timeout in seconds (optional)" })),
|
|
18
|
+
label: Type.Optional(Type.String({ description: "Short label for the job (shown in /jobs). Defaults to a truncated version of the command." })),
|
|
19
|
+
});
|
|
20
|
+
function getTempFilePath() {
|
|
21
|
+
const id = randomBytes(8).toString("hex");
|
|
22
|
+
return join(tmpdir(), `pi-async-bash-${id}.log`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Kill a process and its children. Uses process group kill on Unix.
|
|
26
|
+
*/
|
|
27
|
+
function killTree(pid) {
|
|
28
|
+
try {
|
|
29
|
+
// Kill the process group (negative PID)
|
|
30
|
+
process.kill(-pid, "SIGTERM");
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
try {
|
|
34
|
+
process.kill(pid, "SIGTERM");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Already exited
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function createAsyncBashTool(getManager, getCwd) {
|
|
42
|
+
return {
|
|
43
|
+
name: "async_bash",
|
|
44
|
+
label: "Background Bash",
|
|
45
|
+
description: `Run a bash command in the background. Returns a job ID immediately so you can continue working. ` +
|
|
46
|
+
`Use await_job to get results or cancel_job to stop. Ideal for long-running builds, tests, or installs. ` +
|
|
47
|
+
`Output is truncated to the last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB.`,
|
|
48
|
+
promptSnippet: "Run a bash command in the background, returning a job ID immediately.",
|
|
49
|
+
promptGuidelines: [
|
|
50
|
+
"Use async_bash for commands that take more than a few seconds (builds, tests, installs, large git operations).",
|
|
51
|
+
"After starting async jobs, continue with other work and use await_job when you need the results.",
|
|
52
|
+
"Use cancel_job to stop a running background job.",
|
|
53
|
+
"Check /jobs to see all running and recent background jobs.",
|
|
54
|
+
],
|
|
55
|
+
parameters: schema,
|
|
56
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
57
|
+
const manager = getManager();
|
|
58
|
+
const cwd = getCwd();
|
|
59
|
+
const { command, timeout, label } = params;
|
|
60
|
+
const shortCmd = label ?? (command.length > 60 ? command.slice(0, 57) + "..." : command);
|
|
61
|
+
const jobId = manager.register("bash", shortCmd, (signal) => {
|
|
62
|
+
return executeBashInBackground(command, cwd, signal, timeout);
|
|
63
|
+
});
|
|
64
|
+
return {
|
|
65
|
+
content: [{
|
|
66
|
+
type: "text",
|
|
67
|
+
text: [
|
|
68
|
+
`Background job started: **${jobId}**`,
|
|
69
|
+
`Command: \`${shortCmd}\``,
|
|
70
|
+
"",
|
|
71
|
+
"Use `await_job` to get results when ready, or `cancel_job` to stop.",
|
|
72
|
+
].join("\n"),
|
|
73
|
+
}],
|
|
74
|
+
details: undefined,
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Execute a bash command, collecting output. Returns the text result.
|
|
81
|
+
*/
|
|
82
|
+
function executeBashInBackground(command, cwd, signal, timeout) {
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
const { shell, args } = getShellConfig();
|
|
85
|
+
const resolvedCommand = sanitizeCommand(command);
|
|
86
|
+
const child = spawn(shell, [...args, resolvedCommand], {
|
|
87
|
+
cwd,
|
|
88
|
+
detached: true,
|
|
89
|
+
env: { ...process.env },
|
|
90
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
91
|
+
});
|
|
92
|
+
let timedOut = false;
|
|
93
|
+
let timeoutHandle;
|
|
94
|
+
if (timeout !== undefined && timeout > 0) {
|
|
95
|
+
timeoutHandle = setTimeout(() => {
|
|
96
|
+
timedOut = true;
|
|
97
|
+
if (child.pid)
|
|
98
|
+
killTree(child.pid);
|
|
99
|
+
}, timeout * 1000);
|
|
100
|
+
}
|
|
101
|
+
const chunks = [];
|
|
102
|
+
let totalBytes = 0;
|
|
103
|
+
let spillFilePath;
|
|
104
|
+
let spillStream;
|
|
105
|
+
const MAX_BUFFER = DEFAULT_MAX_BYTES * 2;
|
|
106
|
+
const onData = (data) => {
|
|
107
|
+
totalBytes += data.length;
|
|
108
|
+
if (totalBytes > DEFAULT_MAX_BYTES && !spillFilePath) {
|
|
109
|
+
spillFilePath = getTempFilePath();
|
|
110
|
+
spillStream = createWriteStream(spillFilePath);
|
|
111
|
+
for (const chunk of chunks)
|
|
112
|
+
spillStream.write(chunk);
|
|
113
|
+
}
|
|
114
|
+
if (spillStream)
|
|
115
|
+
spillStream.write(data);
|
|
116
|
+
chunks.push(data);
|
|
117
|
+
let chunksBytes = chunks.reduce((s, c) => s + c.length, 0);
|
|
118
|
+
while (chunksBytes > MAX_BUFFER && chunks.length > 1) {
|
|
119
|
+
const removed = chunks.shift();
|
|
120
|
+
chunksBytes -= removed.length;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
if (child.stdout)
|
|
124
|
+
child.stdout.on("data", onData);
|
|
125
|
+
if (child.stderr)
|
|
126
|
+
child.stderr.on("data", onData);
|
|
127
|
+
const onAbort = () => {
|
|
128
|
+
if (child.pid)
|
|
129
|
+
killTree(child.pid);
|
|
130
|
+
};
|
|
131
|
+
if (signal.aborted) {
|
|
132
|
+
onAbort();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
136
|
+
}
|
|
137
|
+
child.on("error", (err) => {
|
|
138
|
+
if (timeoutHandle)
|
|
139
|
+
clearTimeout(timeoutHandle);
|
|
140
|
+
signal.removeEventListener("abort", onAbort);
|
|
141
|
+
reject(err);
|
|
142
|
+
});
|
|
143
|
+
child.on("close", (code) => {
|
|
144
|
+
if (timeoutHandle)
|
|
145
|
+
clearTimeout(timeoutHandle);
|
|
146
|
+
signal.removeEventListener("abort", onAbort);
|
|
147
|
+
if (spillStream)
|
|
148
|
+
spillStream.end();
|
|
149
|
+
if (signal.aborted) {
|
|
150
|
+
const output = Buffer.concat(chunks).toString("utf-8");
|
|
151
|
+
resolve(output ? `${output}\n\nCommand aborted` : "Command aborted");
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (timedOut) {
|
|
155
|
+
const output = Buffer.concat(chunks).toString("utf-8");
|
|
156
|
+
resolve(output ? `${output}\n\nCommand timed out after ${timeout} seconds` : `Command timed out after ${timeout} seconds`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const fullOutput = Buffer.concat(chunks).toString("utf-8");
|
|
160
|
+
const lines = fullOutput.split("\n");
|
|
161
|
+
let text;
|
|
162
|
+
if (lines.length > DEFAULT_MAX_LINES) {
|
|
163
|
+
text = lines.slice(-DEFAULT_MAX_LINES).join("\n");
|
|
164
|
+
if (spillFilePath) {
|
|
165
|
+
text += `\n\n[Showing last ${DEFAULT_MAX_LINES} of ${lines.length} lines. Full output: ${spillFilePath}]`;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
text += `\n\n[Showing last ${DEFAULT_MAX_LINES} of ${lines.length} lines]`;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
text = fullOutput || "(no output)";
|
|
173
|
+
}
|
|
174
|
+
if (code !== 0 && code !== null) {
|
|
175
|
+
text += `\n\nCommand exited with code ${code}`;
|
|
176
|
+
}
|
|
177
|
+
resolve(text);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* await_job tool — wait for one or more background jobs to complete.
|
|
3
|
+
*
|
|
4
|
+
* If specific job IDs are provided, waits for those jobs.
|
|
5
|
+
* If omitted, waits for any running job to complete.
|
|
6
|
+
*/
|
|
7
|
+
import { Type } from "@sinclair/typebox";
|
|
8
|
+
const schema = Type.Object({
|
|
9
|
+
jobs: Type.Optional(Type.Array(Type.String(), {
|
|
10
|
+
description: "Job IDs to wait for. Omit to wait for any running job.",
|
|
11
|
+
})),
|
|
12
|
+
});
|
|
13
|
+
export function createAwaitTool(getManager) {
|
|
14
|
+
return {
|
|
15
|
+
name: "await_job",
|
|
16
|
+
label: "Await Background Job",
|
|
17
|
+
description: "Wait for background jobs to complete. Provide specific job IDs or omit to wait for the next job that finishes. Returns results of completed jobs.",
|
|
18
|
+
parameters: schema,
|
|
19
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
20
|
+
const manager = getManager();
|
|
21
|
+
const { jobs: jobIds } = params;
|
|
22
|
+
let watched;
|
|
23
|
+
if (jobIds && jobIds.length > 0) {
|
|
24
|
+
watched = [];
|
|
25
|
+
const notFound = [];
|
|
26
|
+
for (const id of jobIds) {
|
|
27
|
+
const job = manager.getJob(id);
|
|
28
|
+
if (job) {
|
|
29
|
+
watched.push(job);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
notFound.push(id);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (notFound.length > 0 && watched.length === 0) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: "text", text: `No jobs found: ${notFound.join(", ")}` }],
|
|
38
|
+
details: undefined,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
watched = manager.getRunningJobs();
|
|
44
|
+
if (watched.length === 0) {
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: "text", text: "No running background jobs." }],
|
|
47
|
+
details: undefined,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// If all watched jobs are already done, return immediately
|
|
52
|
+
const running = watched.filter((j) => j.status === "running");
|
|
53
|
+
if (running.length === 0) {
|
|
54
|
+
const result = formatResults(watched);
|
|
55
|
+
manager.acknowledgeDeliveries(watched.map((j) => j.id));
|
|
56
|
+
return { content: [{ type: "text", text: result }], details: undefined };
|
|
57
|
+
}
|
|
58
|
+
// Wait for at least one to complete
|
|
59
|
+
await Promise.race(running.map((j) => j.promise));
|
|
60
|
+
// Collect all completed results (more may have finished while waiting)
|
|
61
|
+
const completed = watched.filter((j) => j.status !== "running");
|
|
62
|
+
manager.acknowledgeDeliveries(completed.map((j) => j.id));
|
|
63
|
+
const stillRunning = watched.filter((j) => j.status === "running");
|
|
64
|
+
let result = formatResults(completed);
|
|
65
|
+
if (stillRunning.length > 0) {
|
|
66
|
+
result += `\n\n**Still running:** ${stillRunning.map((j) => `${j.id} (${j.label})`).join(", ")}`;
|
|
67
|
+
}
|
|
68
|
+
return { content: [{ type: "text", text: result }], details: undefined };
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function formatResults(jobs) {
|
|
73
|
+
if (jobs.length === 0)
|
|
74
|
+
return "No completed jobs.";
|
|
75
|
+
const parts = [];
|
|
76
|
+
for (const job of jobs) {
|
|
77
|
+
const elapsed = ((Date.now() - job.startTime) / 1000).toFixed(1);
|
|
78
|
+
const header = `### ${job.id} — ${job.label} (${job.status}, ${elapsed}s)`;
|
|
79
|
+
if (job.status === "completed") {
|
|
80
|
+
parts.push(`${header}\n\n${job.resultText ?? "(no output)"}`);
|
|
81
|
+
}
|
|
82
|
+
else if (job.status === "failed") {
|
|
83
|
+
parts.push(`${header}\n\nError: ${job.errorText ?? "unknown error"}`);
|
|
84
|
+
}
|
|
85
|
+
else if (job.status === "cancelled") {
|
|
86
|
+
parts.push(`${header}\n\nCancelled.`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return parts.join("\n\n---\n\n");
|
|
90
|
+
}
|