gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -12
- package/dist/cli.js +13 -1
- package/dist/help-text.js +24 -0
- package/dist/resources/extensions/bg-shell/overlay.js +3 -0
- package/dist/resources/extensions/github-sync/sync.js +2 -1
- package/dist/resources/extensions/gsd/auto/loop.js +0 -2
- package/dist/resources/extensions/gsd/auto/phases.js +7 -12
- package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
- package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
- package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
- package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
- package/dist/resources/extensions/gsd/auto-verification.js +5 -10
- package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
- package/dist/resources/extensions/gsd/auto.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
- package/dist/resources/extensions/gsd/db-writer.js +95 -4
- package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
- package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +46 -282
- package/dist/resources/extensions/gsd/file-watcher.js +5 -1
- package/dist/resources/extensions/gsd/files.js +14 -198
- package/dist/resources/extensions/gsd/git-service.js +4 -0
- package/dist/resources/extensions/gsd/gitignore.js +4 -0
- package/dist/resources/extensions/gsd/gsd-db.js +819 -197
- package/dist/resources/extensions/gsd/guided-flow.js +18 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
- package/dist/resources/extensions/gsd/md-importer.js +182 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
- package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
- package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
- package/dist/resources/extensions/gsd/preferences.js +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/state.js +484 -30
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
- package/dist/resources/extensions/gsd/undo.js +197 -3
- package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
- package/dist/resources/extensions/gsd/workspace-index.js +63 -39
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -17
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- 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 +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +18 -17
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +4 -4
- package/packages/pi-ai/dist/models.custom.d.ts +173 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.custom.js +170 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +16 -1
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.test.js +67 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -0
- package/packages/pi-ai/src/models.custom.ts +172 -0
- package/packages/pi-ai/src/models.test.ts +85 -0
- package/packages/pi-ai/src/models.ts +17 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.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.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -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 +80 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
- package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
- package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +8 -15
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/github-sync/sync.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
- package/src/resources/extensions/gsd/auto/loop.ts +0 -2
- package/src/resources/extensions/gsd/auto/phases.ts +7 -20
- package/src/resources/extensions/gsd/auto/types.ts +0 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
- package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
- package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
- package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
- package/src/resources/extensions/gsd/auto-verification.ts +4 -9
- package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
- package/src/resources/extensions/gsd/auto.ts +0 -9
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
- package/src/resources/extensions/gsd/db-writer.ts +105 -4
- package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
- package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
- package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
- package/src/resources/extensions/gsd/doctor-types.ts +0 -23
- package/src/resources/extensions/gsd/doctor.ts +45 -295
- package/src/resources/extensions/gsd/file-watcher.ts +4 -1
- package/src/resources/extensions/gsd/files.ts +16 -220
- package/src/resources/extensions/gsd/git-service.ts +4 -0
- package/src/resources/extensions/gsd/gitignore.ts +4 -0
- package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
- package/src/resources/extensions/gsd/guided-flow.ts +20 -8
- package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
- package/src/resources/extensions/gsd/md-importer.ts +211 -2
- package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
- package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
- package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
- package/src/resources/extensions/gsd/preferences-types.ts +3 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
- package/src/resources/extensions/gsd/preferences.ts +1 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
- package/src/resources/extensions/gsd/skill-health.ts +2 -1
- package/src/resources/extensions/gsd/state.ts +547 -29
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
- package/src/resources/extensions/gsd/types.ts +50 -0
- package/src/resources/extensions/gsd/undo.ts +247 -3
- package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
- package/src/resources/extensions/gsd/workspace-index.ts +64 -46
- package/dist/resources/extensions/gsd/auto-observability.js +0 -56
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
- package/src/resources/extensions/gsd/auto-observability.ts +0 -74
- package/src/resources/extensions/gsd/observability-validator.ts +0 -456
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n * Uses @mariozechner/jiti fork with virtualModules support for compiled Bun binaries.\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createJiti } from \"@mariozechner/jiti\";\nimport * as _bundledPiAgentCore from \"@gsd/pi-agent-core\";\nimport * as _bundledPiAi from \"@gsd/pi-ai\";\nimport * as _bundledPiAiOauth from \"@gsd/pi-ai/oauth\";\nimport type { KeyId } from \"@gsd/pi-tui\";\nimport * as _bundledPiTui from \"@gsd/pi-tui\";\n// Static imports of packages that extensions may use.\n// These MUST be static so Bun bundles them into the compiled binary.\n// The virtualModules option then makes them available to extensions.\nimport * as _bundledTypebox from \"@sinclair/typebox\";\nimport * as _bundledYaml from \"yaml\";\nimport * as _bundledMcpClient from \"@modelcontextprotocol/sdk/client\";\nimport * as _bundledMcpStdio from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport * as _bundledMcpStreamableHttp from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport * as _bundledMcpSse from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport * as _bundledMcpServer from \"@modelcontextprotocol/sdk/server\";\nimport * as _bundledMcpServerStdio from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport * as _bundledMcpServerSse from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport * as _bundledMcpServerStreamableHttp from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport * as _bundledMcpTypes from \"@modelcontextprotocol/sdk/types.js\";\nimport { getAgentDir, isBunBinary } from \"../../config.js\";\n// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n// avoiding a circular dependency. Extensions can import from @gsd/pi-coding-agent.\nimport * as _bundledPiCodingAgent from \"../../index.js\";\nimport { createEventBus, type EventBus } from \"../event-bus.js\";\nimport type { ExecOptions } from \"../exec.js\";\nimport { execCommand } from \"../exec.js\";\nimport { getUntrustedExtensionPaths } from \"./project-trust.js\";\nexport { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from \"./project-trust.js\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.js\";\n\n/**\n * Statically imported modules for Bun binary virtualModules.\n * Maps specifier -> module object for subpaths that must be available in compiled binaries.\n */\nconst STATIC_BUNDLED_MODULES: Record<string, unknown> = {\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@gsd/pi-agent-core\": _bundledPiAgentCore,\n\t\"@gsd/pi-tui\": _bundledPiTui,\n\t\"@gsd/pi-ai\": _bundledPiAi,\n\t\"@gsd/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@gsd/pi-coding-agent\": _bundledPiCodingAgent,\n\t\"yaml\": _bundledYaml,\n\t\"@modelcontextprotocol/sdk/client\": _bundledMcpClient,\n\t\"@modelcontextprotocol/sdk/client/stdio\": _bundledMcpStdio,\n\t\"@modelcontextprotocol/sdk/client/stdio.js\": _bundledMcpStdio,\n\t\"@modelcontextprotocol/sdk/client/streamableHttp\": _bundledMcpStreamableHttp,\n\t\"@modelcontextprotocol/sdk/client/streamableHttp.js\": _bundledMcpStreamableHttp,\n\t\"@modelcontextprotocol/sdk/client/sse\": _bundledMcpSse,\n\t\"@modelcontextprotocol/sdk/client/sse.js\": _bundledMcpSse,\n\t\"@modelcontextprotocol/sdk/server\": _bundledMcpServer,\n\t\"@modelcontextprotocol/sdk/server/stdio\": _bundledMcpServerStdio,\n\t\"@modelcontextprotocol/sdk/server/stdio.js\": _bundledMcpServerStdio,\n\t\"@modelcontextprotocol/sdk/server/sse\": _bundledMcpServerSse,\n\t\"@modelcontextprotocol/sdk/server/sse.js\": _bundledMcpServerSse,\n\t\"@modelcontextprotocol/sdk/server/streamableHttp\": _bundledMcpServerStreamableHttp,\n\t\"@modelcontextprotocol/sdk/server/streamableHttp.js\": _bundledMcpServerStreamableHttp,\n\t\"@modelcontextprotocol/sdk/types\": _bundledMcpTypes,\n\t\"@modelcontextprotocol/sdk/types.js\": _bundledMcpTypes,\n\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\"@mariozechner/pi-agent-core\": _bundledPiAgentCore,\n\t\"@mariozechner/pi-tui\": _bundledPiTui,\n\t\"@mariozechner/pi-ai\": _bundledPiAi,\n\t\"@mariozechner/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@mariozechner/pi-coding-agent\": _bundledPiCodingAgent,\n};\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary) */\nconst VIRTUAL_MODULES: Record<string, unknown> = { ...STATIC_BUNDLED_MODULES };\n\nconst require = createRequire(import.meta.url);\nconst EXTENSION_TIMING_ENABLED = process.env.GSD_STARTUP_TIMING === \"1\" || process.env.PI_TIMING === \"1\";\n\n/**\n * Bundled npm packages whose subpath exports should be auto-resolved for extensions.\n * Each package listed here will have its `exports` field read from package.json,\n * and all subpath exports will be registered as jiti aliases (Node.js mode) so that\n * extensions can import any standard subpath without hitting jiti's CJS double-resolve bug.\n */\nconst BUNDLED_PACKAGES_WITH_EXPORTS = [\n\t\"@modelcontextprotocol/sdk\",\n\t\"yaml\",\n];\n\n/**\n * Read a package's `exports` field and return alias entries mapping\n * specifiers (e.g. `@modelcontextprotocol/sdk/server`) to resolved file paths.\n *\n * Handles:\n * - Explicit subpath exports: `./client` -> `@pkg/client`\n * - Wildcard exports (`./*`): scans the package's dist directory for actual files\n * - Both `.js`-suffixed and bare specifiers for each subpath\n */\nfunction resolveSubpathExports(packageName: string): Record<string, string> {\n\tconst aliases: Record<string, string> = {};\n\n\tlet packageJsonPath: string;\n\ttry {\n\t\t// Resolve the package's root directory via its package.json\n\t\tpackageJsonPath = require.resolve(`${packageName}/package.json`);\n\t} catch {\n\t\t// Package doesn't allow importing package.json via exports — find it manually\n\t\ttry {\n\t\t\tconst anyEntry = require.resolve(packageName);\n\t\t\t// Walk up from the resolved entry to find package.json\n\t\t\tlet dir = path.dirname(anyEntry);\n\t\t\twhile (dir !== path.dirname(dir)) {\n\t\t\t\tconst candidate = path.join(dir, \"package.json\");\n\t\t\t\tif (fs.existsSync(candidate)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst pkg = JSON.parse(fs.readFileSync(candidate, \"utf-8\"));\n\t\t\t\t\t\tif (pkg.name === packageName) {\n\t\t\t\t\t\t\tpackageJsonPath = candidate;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// not valid JSON, keep walking\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdir = path.dirname(dir);\n\t\t\t}\n\t\t} catch {\n\t\t\treturn aliases;\n\t\t}\n\t\tif (!packageJsonPath!) return aliases;\n\t}\n\n\tlet pkg: { exports?: Record<string, unknown> };\n\ttry {\n\t\tpkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n\t} catch {\n\t\treturn aliases;\n\t}\n\n\tconst exports = pkg.exports;\n\tif (!exports || typeof exports !== \"object\") return aliases;\n\n\tconst packageDir = path.dirname(packageJsonPath);\n\n\tfor (const [subpath, target] of Object.entries(exports)) {\n\t\tif (subpath === \".\") continue; // Root export handled by static imports\n\n\t\t// Handle wildcard exports like \"./*\"\n\t\tif (subpath.includes(\"*\")) {\n\t\t\tresolveWildcardExports(packageName, packageDir, subpath, target, aliases);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Explicit subpath: \"./client\" -> \"@pkg/client\"\n\t\tconst specifier = `${packageName}/${subpath.replace(/^\\.\\//, \"\")}`;\n\n\t\ttry {\n\t\t\tconst resolved = require.resolve(specifier);\n\t\t\taliases[specifier] = resolved;\n\n\t\t\t// Add .js-suffixed variant if the specifier doesn't already end in .js\n\t\t\tif (!specifier.endsWith(\".js\")) {\n\t\t\t\tconst jsSpecifier = `${specifier}.js`;\n\t\t\t\ttry {\n\t\t\t\t\tconst jsResolved = require.resolve(jsSpecifier);\n\t\t\t\t\taliases[jsSpecifier] = jsResolved;\n\t\t\t\t} catch {\n\t\t\t\t\t// .js variant doesn't resolve — that's fine\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add bare variant (without .js) if it ends in .js\n\t\t\tif (specifier.endsWith(\".js\")) {\n\t\t\t\tconst bareSpecifier = specifier.slice(0, -3);\n\t\t\t\ttry {\n\t\t\t\t\tconst bareResolved = require.resolve(bareSpecifier);\n\t\t\t\t\taliases[bareSpecifier] = bareResolved;\n\t\t\t\t} catch {\n\t\t\t\t\t// bare variant doesn't resolve — that's fine\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Subpath doesn't resolve — skip it\n\t\t}\n\t}\n\n\treturn aliases;\n}\n\n/**\n * Resolve wildcard export patterns (e.g. `./*`) by scanning the package's\n * file structure to find all matching files and generate alias entries.\n */\nfunction resolveWildcardExports(\n\tpackageName: string,\n\tpackageDir: string,\n\tsubpathPattern: string,\n\ttarget: unknown,\n\taliases: Record<string, string>,\n): void {\n\t// Extract the target directory pattern from the export target\n\t// e.g. { \"require\": \"./dist/cjs/*\" } -> \"dist/cjs\"\n\tlet targetDir: string | null = null;\n\n\tif (typeof target === \"string\") {\n\t\ttargetDir = target.replace(/\\/\\*$/, \"\").replace(/^\\.\\//, \"\");\n\t} else if (target && typeof target === \"object\") {\n\t\tconst targetObj = target as Record<string, unknown>;\n\t\t// Prefer \"require\" for CJS compatibility with jiti, fall back to \"import\"\n\t\tconst resolved = targetObj.require ?? targetObj.import ?? targetObj.default;\n\t\tif (typeof resolved === \"string\") {\n\t\t\ttargetDir = resolved.replace(/\\/\\*$/, \"\").replace(/^\\.\\//, \"\");\n\t\t}\n\t}\n\n\tif (!targetDir) return;\n\n\tconst fullTargetDir = path.join(packageDir, targetDir);\n\tif (!fs.existsSync(fullTargetDir)) return;\n\n\t// Scan for .js files and generate specifiers\n\tconst subpathPrefix = subpathPattern.replace(/\\/?\\*$/, \"\").replace(/^\\.\\//, \"\");\n\tscanDirForExports(packageName, fullTargetDir, subpathPrefix, aliases);\n}\n\n/**\n * Recursively scan a directory for .js files and register them as aliases.\n */\nfunction scanDirForExports(\n\tpackageName: string,\n\tdir: string,\n\trelativePath: string,\n\taliases: Record<string, string>,\n): void {\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst entryRelative = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Skip examples/test directories — extensions don't need them\n\t\t\tif (entry.name === \"examples\" || entry.name === \"__tests__\" || entry.name === \"test\") continue;\n\t\t\tscanDirForExports(packageName, path.join(dir, entry.name), entryRelative, aliases);\n\t\t} else if (entry.name.endsWith(\".js\") && !entry.name.endsWith(\".d.js\")) {\n\t\t\tconst filePath = path.join(dir, entry.name);\n\t\t\tconst specifier = `${packageName}/${entryRelative}`;\n\t\t\t// Only add if not already covered by an explicit export\n\t\t\tif (!(specifier in aliases)) {\n\t\t\t\taliases[specifier] = filePath;\n\t\t\t}\n\t\t\t// Also add bare (no .js) variant\n\t\t\tconst bareSpecifier = specifier.replace(/\\.js$/, \"\");\n\t\t\tif (!(bareSpecifier in aliases)) {\n\t\t\t\taliases[bareSpecifier] = filePath;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction logExtensionTiming(extensionPath: string, ms: number, outcome: \"loaded\" | \"failed\"): void {\n\tif (!EXTENSION_TIMING_ENABLED) return;\n\tconsole.error(`[startup] extension ${outcome}: ${extensionPath} (${ms}ms)`);\n}\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"@sinclair/typebox\");\n\tconst typeboxRoot = typeboxEntry.replace(/[\\\\/]build[\\\\/]cjs[\\\\/]index\\.js$/, \"\");\n\n\tconst yamlEntry = require.resolve(\"yaml\");\n\tconst yamlRoot = yamlEntry.replace(/[\\\\/]dist[\\\\/]index\\.js$/, \"\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn fileURLToPath(import.meta.resolve(specifier));\n\t};\n\n\t// Auto-discover subpath exports from bundled npm packages.\n\t// This ensures extensions can import any standard subpath (e.g. @modelcontextprotocol/sdk/server)\n\t// without hitting jiti's CJS double-resolve bug.\n\tconst autoDiscovered: Record<string, string> = {};\n\tfor (const packageName of BUNDLED_PACKAGES_WITH_EXPORTS) {\n\t\tconst subpathAliases = resolveSubpathExports(packageName);\n\t\tObject.assign(autoDiscovered, subpathAliases);\n\t}\n\n\t_aliases = {\n\t\t// Auto-discovered subpath exports (lowest priority — overridden by manual entries below)\n\t\t...autoDiscovered,\n\t\t// Manual entries for workspace packages and packages needing special resolution\n\t\t\"@gsd/pi-coding-agent\": packageIndex,\n\t\t\"@gsd/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@gsd/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@gsd/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@gsd/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t\t\"@sinclair/typebox\": typeboxRoot,\n\t\t\"yaml\": yamlRoot,\n\t\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\t\"@mariozechner/pi-coding-agent\": packageIndex,\n\t\t\"@mariozechner/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@mariozechner/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@mariozechner/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@mariozechner/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t};\n\n\treturn _aliases;\n}\n\nfunction getJitiOptions() {\n\treturn isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() };\n}\n\nconst _moduleImporters = new Map<string, ReturnType<typeof createJiti>>();\n\nfunction getModuleImporter(parentModuleUrl: string) {\n\tlet importer = _moduleImporters.get(parentModuleUrl);\n\tif (!importer) {\n\t\timporter = createJiti(parentModuleUrl, {\n\t\t\tmoduleCache: true,\n\t\t\t...getJitiOptions(),\n\t\t});\n\t\t_moduleImporters.set(parentModuleUrl, importer);\n\t}\n\treturn importer;\n}\n\nexport async function importExtensionModule<T = unknown>(parentModuleUrl: string, specifier: string): Promise<T> {\n\tconst importer = getModuleImporter(parentModuleUrl);\n\tconst resolvedPath = fileURLToPath(new URL(specifier, parentModuleUrl));\n\treturn importer.import(resolvedPath) as Promise<T>;\n}\n\nconst UNICODE_SPACES = /[\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\n\nfunction normalizeUnicodeSpaces(str: string): string {\n\treturn str.replace(UNICODE_SPACES, \" \");\n}\n\nfunction expandPath(p: string): string {\n\tconst normalized = normalizeUnicodeSpaces(p);\n\tif (normalized.startsWith(\"~/\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(2));\n\t}\n\tif (normalized.startsWith(\"~\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(1));\n\t}\n\treturn normalized;\n}\n\nfunction resolvePath(extPath: string, cwd: string): string {\n\tconst expanded = expandPath(extPath);\n\tif (path.isAbsolute(expanded)) {\n\t\treturn expanded;\n\t}\n\treturn path.resolve(cwd, expanded);\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tretryLastTurn: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config) => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\textensionPath: extension.path,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\">): void {\n\t\t\textension.commands.set(name, { name, ...options });\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.js\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tretryLastTurn(): void {\n\t\t\truntime.retryLastTurn();\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.registerProvider(name, config);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.unregisterProvider(name);\n\t\t},\n\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\nasync function loadExtensionModule(extensionPath: string) {\n\t// Pre-compiled extension loading: if the source is .ts and a sibling .js\n\t// file exists with matching or newer mtime, use native import() to skip\n\t// jiti JIT compilation entirely. This is the biggest startup win for\n\t// bundled extensions that have already been built.\n\tif (extensionPath.endsWith(\".ts\")) {\n\t\tconst jsPath = extensionPath.replace(/\\.ts$/, \".js\");\n\t\ttry {\n\t\t\tconst [tsStat, jsStat] = [fs.statSync(extensionPath), fs.statSync(jsPath)];\n\t\t\tif (jsStat.mtimeMs >= tsStat.mtimeMs) {\n\t\t\t\tconst module = await import(jsPath);\n\t\t\t\tconst factory = (module.default ?? module) as ExtensionFactory;\n\t\t\t\treturn typeof factory !== \"function\" ? undefined : factory;\n\t\t\t}\n\t\t} catch {\n\t\t\t// .js file doesn't exist or stat failed — fall through to jiti\n\t\t}\n\t}\n\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t...getJitiOptions(),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\n\n/**\n * Check whether a module path belongs to a non-extension library that should\n * be silently skipped rather than reported as an error.\n *\n * A directory is a non-extension library when its package.json has a \"pi\"\n * manifest that declares no extensions (e.g. `\"pi\": {}`). This is the\n * opt-out convention used by shared libraries like cmux that live inside\n * the extensions/ directory but are not extensions themselves.\n *\n * This serves as a defense-in-depth check: even if the upstream discovery\n * layers fail to filter out the library, the loader itself will not emit\n * a spurious error.\n */\nfunction isNonExtensionLibrary(resolvedPath: string): boolean {\n\t// Walk up from the resolved file to find the nearest package.json\n\tlet dir = path.dirname(resolvedPath);\n\tconst root = path.parse(dir).root;\n\twhile (dir !== root) {\n\t\tconst packageJsonPath = path.join(dir, \"package.json\");\n\t\tif (fs.existsSync(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\t\t\tconst pkg = JSON.parse(content);\n\t\t\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\t\t\t// Has a pi manifest — check if it declares any extensions\n\t\t\t\t\tconst extensions = pkg.pi.extensions;\n\t\t\t\t\tif (!Array.isArray(extensions) || extensions.length === 0) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Malformed package.json — not a known library\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdir = path.dirname(dir);\n\t}\n\treturn false;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd);\n\tconst start = Date.now();\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\t// Defense-in-depth: if the module is inside a directory that has\n\t\t\t// explicitly opted out of extension loading via its pi manifest,\n\t\t\t// silently skip it instead of reporting a spurious error.\n\t\t\tif (isNonExtensionLibrary(resolvedPath)) {\n\t\t\t\treturn { extension: null, error: null };\n\t\t\t}\n\t\t\tlogExtensionTiming(extensionPath, Date.now() - start, \"failed\");\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\n\t\tlogExtensionTiming(extensionPath, Date.now() - start, \"loaded\");\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tlogExtensionTiming(extensionPath, Date.now() - start, \"failed\");\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\tawait factory(api);\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n *\n * Extensions are loaded in parallel to reduce wall-clock time (~30-50% faster\n * than sequential loading for I/O-bound jiti compilation).\n */\nexport async function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult> {\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\n\tconst results = await Promise.all(\n\t\tpaths.map((extPath) => loadExtension(extPath, cwd, resolvedEventBus, runtime)),\n\t);\n\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst { extension, error } = results[i];\n\t\tif (error) {\n\t\t\terrors.push({ path: paths[i], error });\n\t\t} else if (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\n\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readPiManifest(packageJsonPath: string): PiManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content);\n\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\treturn pkg.pi as PiManifest;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"pi.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"pi\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readPiManifest(packageJsonPath);\n\t\tif (manifest) {\n\t\t\t// When a pi manifest exists, it is authoritative — don't fall through\n\t\t\t// to index.ts/index.js auto-detection. This allows library directories\n\t\t\t// (like cmux) to opt out by declaring \"pi\": {} with no extensions.\n\t\t\tif (!manifest.extensions?.length) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn entries.length > 0 ? entries : null;\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/* /package.json` with \"pi\" field → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/.pi/extensions/\n\t// Only loaded when the project path has been explicitly trusted (TOFU model).\n\tconst localExtDir = path.join(cwd, \".pi\", \"extensions\");\n\tconst localDiscovered = discoverExtensionsInDir(localExtDir);\n\tif (localDiscovered.length > 0) {\n\t\tconst untrusted = getUntrustedExtensionPaths(cwd, localDiscovered, agentDir);\n\t\tif (untrusted.length > 0) {\n\t\t\tprocess.stderr.write(\n\t\t\t\t`[pi] Skipping ${untrusted.length} project-local extension(s) in ${localExtDir} — project not trusted. Use trustProject() to enable.\\n`,\n\t\t\t);\n\t\t}\n\t\tconst trusted = localDiscovered.filter((p) => !untrusted.includes(p));\n\t\taddPaths(trusted);\n\t}\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(agentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, cwd);\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with pi manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, cwd, eventBus);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n * Uses @mariozechner/jiti fork with virtualModules support for compiled Bun binaries.\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createJiti } from \"@mariozechner/jiti\";\nimport * as _bundledPiAgentCore from \"@gsd/pi-agent-core\";\nimport * as _bundledPiAi from \"@gsd/pi-ai\";\nimport * as _bundledPiAiOauth from \"@gsd/pi-ai/oauth\";\nimport type { KeyId } from \"@gsd/pi-tui\";\nimport * as _bundledPiTui from \"@gsd/pi-tui\";\n// Static imports of packages that extensions may use.\n// These MUST be static so Bun bundles them into the compiled binary.\n// The virtualModules option then makes them available to extensions.\nimport * as _bundledTypebox from \"@sinclair/typebox\";\nimport * as _bundledYaml from \"yaml\";\nimport * as _bundledMcpClient from \"@modelcontextprotocol/sdk/client\";\nimport * as _bundledMcpStdio from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport * as _bundledMcpStreamableHttp from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport * as _bundledMcpSse from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport * as _bundledMcpServer from \"@modelcontextprotocol/sdk/server\";\nimport * as _bundledMcpServerStdio from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport * as _bundledMcpServerSse from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport * as _bundledMcpServerStreamableHttp from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport * as _bundledMcpTypes from \"@modelcontextprotocol/sdk/types.js\";\nimport { getAgentDir, isBunBinary } from \"../../config.js\";\n// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n// avoiding a circular dependency. Extensions can import from @gsd/pi-coding-agent.\nimport * as _bundledPiCodingAgent from \"../../index.js\";\nimport { createEventBus, type EventBus } from \"../event-bus.js\";\nimport type { ExecOptions } from \"../exec.js\";\nimport { execCommand } from \"../exec.js\";\nimport { getUntrustedExtensionPaths } from \"./project-trust.js\";\nexport { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from \"./project-trust.js\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tLifecycleHookHandler,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.js\";\n\n/**\n * Statically imported modules for Bun binary virtualModules.\n * Maps specifier -> module object for subpaths that must be available in compiled binaries.\n */\nconst STATIC_BUNDLED_MODULES: Record<string, unknown> = {\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@gsd/pi-agent-core\": _bundledPiAgentCore,\n\t\"@gsd/pi-tui\": _bundledPiTui,\n\t\"@gsd/pi-ai\": _bundledPiAi,\n\t\"@gsd/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@gsd/pi-coding-agent\": _bundledPiCodingAgent,\n\t\"yaml\": _bundledYaml,\n\t\"@modelcontextprotocol/sdk/client\": _bundledMcpClient,\n\t\"@modelcontextprotocol/sdk/client/stdio\": _bundledMcpStdio,\n\t\"@modelcontextprotocol/sdk/client/stdio.js\": _bundledMcpStdio,\n\t\"@modelcontextprotocol/sdk/client/streamableHttp\": _bundledMcpStreamableHttp,\n\t\"@modelcontextprotocol/sdk/client/streamableHttp.js\": _bundledMcpStreamableHttp,\n\t\"@modelcontextprotocol/sdk/client/sse\": _bundledMcpSse,\n\t\"@modelcontextprotocol/sdk/client/sse.js\": _bundledMcpSse,\n\t\"@modelcontextprotocol/sdk/server\": _bundledMcpServer,\n\t\"@modelcontextprotocol/sdk/server/stdio\": _bundledMcpServerStdio,\n\t\"@modelcontextprotocol/sdk/server/stdio.js\": _bundledMcpServerStdio,\n\t\"@modelcontextprotocol/sdk/server/sse\": _bundledMcpServerSse,\n\t\"@modelcontextprotocol/sdk/server/sse.js\": _bundledMcpServerSse,\n\t\"@modelcontextprotocol/sdk/server/streamableHttp\": _bundledMcpServerStreamableHttp,\n\t\"@modelcontextprotocol/sdk/server/streamableHttp.js\": _bundledMcpServerStreamableHttp,\n\t\"@modelcontextprotocol/sdk/types\": _bundledMcpTypes,\n\t\"@modelcontextprotocol/sdk/types.js\": _bundledMcpTypes,\n\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\"@mariozechner/pi-agent-core\": _bundledPiAgentCore,\n\t\"@mariozechner/pi-tui\": _bundledPiTui,\n\t\"@mariozechner/pi-ai\": _bundledPiAi,\n\t\"@mariozechner/pi-ai/oauth\": _bundledPiAiOauth,\n\t\"@mariozechner/pi-coding-agent\": _bundledPiCodingAgent,\n};\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary) */\nconst VIRTUAL_MODULES: Record<string, unknown> = { ...STATIC_BUNDLED_MODULES };\n\nconst require = createRequire(import.meta.url);\nconst EXTENSION_TIMING_ENABLED = process.env.GSD_STARTUP_TIMING === \"1\" || process.env.PI_TIMING === \"1\";\n\n/**\n * Bundled npm packages whose subpath exports should be auto-resolved for extensions.\n * Each package listed here will have its `exports` field read from package.json,\n * and all subpath exports will be registered as jiti aliases (Node.js mode) so that\n * extensions can import any standard subpath without hitting jiti's CJS double-resolve bug.\n */\nconst BUNDLED_PACKAGES_WITH_EXPORTS = [\n\t\"@modelcontextprotocol/sdk\",\n\t\"yaml\",\n];\n\n/**\n * Read a package's `exports` field and return alias entries mapping\n * specifiers (e.g. `@modelcontextprotocol/sdk/server`) to resolved file paths.\n *\n * Handles:\n * - Explicit subpath exports: `./client` -> `@pkg/client`\n * - Wildcard exports (`./*`): scans the package's dist directory for actual files\n * - Both `.js`-suffixed and bare specifiers for each subpath\n */\nfunction resolveSubpathExports(packageName: string): Record<string, string> {\n\tconst aliases: Record<string, string> = {};\n\n\tlet packageJsonPath: string;\n\ttry {\n\t\t// Resolve the package's root directory via its package.json\n\t\tpackageJsonPath = require.resolve(`${packageName}/package.json`);\n\t} catch {\n\t\t// Package doesn't allow importing package.json via exports — find it manually\n\t\ttry {\n\t\t\tconst anyEntry = require.resolve(packageName);\n\t\t\t// Walk up from the resolved entry to find package.json\n\t\t\tlet dir = path.dirname(anyEntry);\n\t\t\twhile (dir !== path.dirname(dir)) {\n\t\t\t\tconst candidate = path.join(dir, \"package.json\");\n\t\t\t\tif (fs.existsSync(candidate)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst pkg = JSON.parse(fs.readFileSync(candidate, \"utf-8\"));\n\t\t\t\t\t\tif (pkg.name === packageName) {\n\t\t\t\t\t\t\tpackageJsonPath = candidate;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// not valid JSON, keep walking\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdir = path.dirname(dir);\n\t\t\t}\n\t\t} catch {\n\t\t\treturn aliases;\n\t\t}\n\t\tif (!packageJsonPath!) return aliases;\n\t}\n\n\tlet pkg: { exports?: Record<string, unknown> };\n\ttry {\n\t\tpkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n\t} catch {\n\t\treturn aliases;\n\t}\n\n\tconst exports = pkg.exports;\n\tif (!exports || typeof exports !== \"object\") return aliases;\n\n\tconst packageDir = path.dirname(packageJsonPath);\n\n\tfor (const [subpath, target] of Object.entries(exports)) {\n\t\tif (subpath === \".\") continue; // Root export handled by static imports\n\n\t\t// Handle wildcard exports like \"./*\"\n\t\tif (subpath.includes(\"*\")) {\n\t\t\tresolveWildcardExports(packageName, packageDir, subpath, target, aliases);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Explicit subpath: \"./client\" -> \"@pkg/client\"\n\t\tconst specifier = `${packageName}/${subpath.replace(/^\\.\\//, \"\")}`;\n\n\t\ttry {\n\t\t\tconst resolved = require.resolve(specifier);\n\t\t\taliases[specifier] = resolved;\n\n\t\t\t// Add .js-suffixed variant if the specifier doesn't already end in .js\n\t\t\tif (!specifier.endsWith(\".js\")) {\n\t\t\t\tconst jsSpecifier = `${specifier}.js`;\n\t\t\t\ttry {\n\t\t\t\t\tconst jsResolved = require.resolve(jsSpecifier);\n\t\t\t\t\taliases[jsSpecifier] = jsResolved;\n\t\t\t\t} catch {\n\t\t\t\t\t// .js variant doesn't resolve — that's fine\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add bare variant (without .js) if it ends in .js\n\t\t\tif (specifier.endsWith(\".js\")) {\n\t\t\t\tconst bareSpecifier = specifier.slice(0, -3);\n\t\t\t\ttry {\n\t\t\t\t\tconst bareResolved = require.resolve(bareSpecifier);\n\t\t\t\t\taliases[bareSpecifier] = bareResolved;\n\t\t\t\t} catch {\n\t\t\t\t\t// bare variant doesn't resolve — that's fine\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Subpath doesn't resolve — skip it\n\t\t}\n\t}\n\n\treturn aliases;\n}\n\n/**\n * Resolve wildcard export patterns (e.g. `./*`) by scanning the package's\n * file structure to find all matching files and generate alias entries.\n */\nfunction resolveWildcardExports(\n\tpackageName: string,\n\tpackageDir: string,\n\tsubpathPattern: string,\n\ttarget: unknown,\n\taliases: Record<string, string>,\n): void {\n\t// Extract the target directory pattern from the export target\n\t// e.g. { \"require\": \"./dist/cjs/*\" } -> \"dist/cjs\"\n\tlet targetDir: string | null = null;\n\n\tif (typeof target === \"string\") {\n\t\ttargetDir = target.replace(/\\/\\*$/, \"\").replace(/^\\.\\//, \"\");\n\t} else if (target && typeof target === \"object\") {\n\t\tconst targetObj = target as Record<string, unknown>;\n\t\t// Prefer \"require\" for CJS compatibility with jiti, fall back to \"import\"\n\t\tconst resolved = targetObj.require ?? targetObj.import ?? targetObj.default;\n\t\tif (typeof resolved === \"string\") {\n\t\t\ttargetDir = resolved.replace(/\\/\\*$/, \"\").replace(/^\\.\\//, \"\");\n\t\t}\n\t}\n\n\tif (!targetDir) return;\n\n\tconst fullTargetDir = path.join(packageDir, targetDir);\n\tif (!fs.existsSync(fullTargetDir)) return;\n\n\t// Scan for .js files and generate specifiers\n\tconst subpathPrefix = subpathPattern.replace(/\\/?\\*$/, \"\").replace(/^\\.\\//, \"\");\n\tscanDirForExports(packageName, fullTargetDir, subpathPrefix, aliases);\n}\n\n/**\n * Recursively scan a directory for .js files and register them as aliases.\n */\nfunction scanDirForExports(\n\tpackageName: string,\n\tdir: string,\n\trelativePath: string,\n\taliases: Record<string, string>,\n): void {\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn;\n\t}\n\n\tfor (const entry of entries) {\n\t\tconst entryRelative = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n\n\t\tif (entry.isDirectory()) {\n\t\t\t// Skip examples/test directories — extensions don't need them\n\t\t\tif (entry.name === \"examples\" || entry.name === \"__tests__\" || entry.name === \"test\") continue;\n\t\t\tscanDirForExports(packageName, path.join(dir, entry.name), entryRelative, aliases);\n\t\t} else if (entry.name.endsWith(\".js\") && !entry.name.endsWith(\".d.js\")) {\n\t\t\tconst filePath = path.join(dir, entry.name);\n\t\t\tconst specifier = `${packageName}/${entryRelative}`;\n\t\t\t// Only add if not already covered by an explicit export\n\t\t\tif (!(specifier in aliases)) {\n\t\t\t\taliases[specifier] = filePath;\n\t\t\t}\n\t\t\t// Also add bare (no .js) variant\n\t\t\tconst bareSpecifier = specifier.replace(/\\.js$/, \"\");\n\t\t\tif (!(bareSpecifier in aliases)) {\n\t\t\t\taliases[bareSpecifier] = filePath;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction logExtensionTiming(extensionPath: string, ms: number, outcome: \"loaded\" | \"failed\"): void {\n\tif (!EXTENSION_TIMING_ENABLED) return;\n\tconsole.error(`[startup] extension ${outcome}: ${extensionPath} (${ms}ms)`);\n}\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"@sinclair/typebox\");\n\tconst typeboxRoot = typeboxEntry.replace(/[\\\\/]build[\\\\/]cjs[\\\\/]index\\.js$/, \"\");\n\n\tconst yamlEntry = require.resolve(\"yaml\");\n\tconst yamlRoot = yamlEntry.replace(/[\\\\/]dist[\\\\/]index\\.js$/, \"\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn fileURLToPath(import.meta.resolve(specifier));\n\t};\n\n\t// Auto-discover subpath exports from bundled npm packages.\n\t// This ensures extensions can import any standard subpath (e.g. @modelcontextprotocol/sdk/server)\n\t// without hitting jiti's CJS double-resolve bug.\n\tconst autoDiscovered: Record<string, string> = {};\n\tfor (const packageName of BUNDLED_PACKAGES_WITH_EXPORTS) {\n\t\tconst subpathAliases = resolveSubpathExports(packageName);\n\t\tObject.assign(autoDiscovered, subpathAliases);\n\t}\n\n\t_aliases = {\n\t\t// Auto-discovered subpath exports (lowest priority — overridden by manual entries below)\n\t\t...autoDiscovered,\n\t\t// Manual entries for workspace packages and packages needing special resolution\n\t\t\"@gsd/pi-coding-agent\": packageIndex,\n\t\t\"@gsd/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@gsd/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@gsd/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@gsd/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t\t\"@sinclair/typebox\": typeboxRoot,\n\t\t\"yaml\": yamlRoot,\n\t\t// Aliases for external PI ecosystem packages that import from the original scope\n\t\t\"@mariozechner/pi-coding-agent\": packageIndex,\n\t\t\"@mariozechner/pi-agent-core\": resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@gsd/pi-agent-core\"),\n\t\t\"@mariozechner/pi-tui\": resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@gsd/pi-tui\"),\n\t\t\"@mariozechner/pi-ai\": resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@gsd/pi-ai\"),\n\t\t\"@mariozechner/pi-ai/oauth\": resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@gsd/pi-ai/oauth\"),\n\t};\n\n\treturn _aliases;\n}\n\nfunction getJitiOptions() {\n\treturn isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() };\n}\n\nconst _moduleImporters = new Map<string, ReturnType<typeof createJiti>>();\n\nfunction getModuleImporter(parentModuleUrl: string) {\n\tlet importer = _moduleImporters.get(parentModuleUrl);\n\tif (!importer) {\n\t\timporter = createJiti(parentModuleUrl, {\n\t\t\tmoduleCache: true,\n\t\t\t...getJitiOptions(),\n\t\t});\n\t\t_moduleImporters.set(parentModuleUrl, importer);\n\t}\n\treturn importer;\n}\n\nexport async function importExtensionModule<T = unknown>(parentModuleUrl: string, specifier: string): Promise<T> {\n\tconst importer = getModuleImporter(parentModuleUrl);\n\tconst resolvedPath = fileURLToPath(new URL(specifier, parentModuleUrl));\n\treturn importer.import(resolvedPath) as Promise<T>;\n}\n\nconst UNICODE_SPACES = /[\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\n\nfunction normalizeUnicodeSpaces(str: string): string {\n\treturn str.replace(UNICODE_SPACES, \" \");\n}\n\nfunction expandPath(p: string): string {\n\tconst normalized = normalizeUnicodeSpaces(p);\n\tif (normalized.startsWith(\"~/\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(2));\n\t}\n\tif (normalized.startsWith(\"~\")) {\n\t\treturn path.join(os.homedir(), normalized.slice(1));\n\t}\n\treturn normalized;\n}\n\nfunction resolvePath(extPath: string, cwd: string): string {\n\tconst expanded = expandPath(extPath);\n\tif (path.isAbsolute(expanded)) {\n\t\treturn expanded;\n\t}\n\treturn path.resolve(cwd, expanded);\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tretryLastTurn: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config) => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\textensionPath: extension.path,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\">): void {\n\t\t\textension.commands.set(name, { name, ...options });\n\t\t},\n\n\t\tregisterBeforeInstall(handler: LifecycleHookHandler): void {\n\t\t\textension.lifecycleHooks.beforeInstall.push(handler);\n\t\t},\n\n\t\tregisterAfterInstall(handler: LifecycleHookHandler): void {\n\t\t\textension.lifecycleHooks.afterInstall.push(handler);\n\t\t},\n\n\t\tregisterBeforeRemove(handler: LifecycleHookHandler): void {\n\t\t\textension.lifecycleHooks.beforeRemove.push(handler);\n\t\t},\n\n\t\tregisterAfterRemove(handler: LifecycleHookHandler): void {\n\t\t\textension.lifecycleHooks.afterRemove.push(handler);\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.js\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tretryLastTurn(): void {\n\t\t\truntime.retryLastTurn();\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.registerProvider(name, config);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.unregisterProvider(name);\n\t\t},\n\n\t\tevents: eventBus,\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\n/**\n * Heuristic patterns that indicate TypeScript syntax in a source file.\n * Used to detect when a .js file accidentally contains TypeScript code\n * and provide a helpful error message instead of a cryptic parse failure.\n */\nconst TS_SYNTAX_PATTERNS: RegExp[] = [\n\t// Variable type annotations: const name: string, let count: number\n\t/\\b(?:const|let|var)\\s+\\w+\\s*:\\s*(?:string|number|boolean|any|void|never|unknown|object|bigint|symbol|undefined|null)\\b/,\n\t// Parameter type annotations: (api: ExtensionAPI)\n\t/\\(\\s*\\w+\\s*:\\s*[A-Z]\\w*/,\n\t// Return type annotations: ): Promise<void> { or ): string =>\n\t/\\)\\s*:\\s*(?:Promise|string|number|boolean|void|any|never|unknown)\\b/,\n\t// Interface declarations\n\t/\\binterface\\s+[A-Z]\\w*\\s*(?:<[^>]*>)?\\s*\\{/,\n\t// Type alias declarations\n\t/\\btype\\s+[A-Z]\\w*\\s*(?:<[^>]*>)?\\s*=/,\n\t// Angle-bracket type assertions: <Type>value\n\t/(?:as\\s+\\w+(?:<[^>]*>)?)\\s*[;,)\\]}]/,\n\t// Generic type parameters on functions: function foo<T>\n\t/\\bfunction\\s+\\w+\\s*<[^>]+>/,\n\t// Enum declarations\n\t/\\benum\\s+[A-Z]\\w*\\s*\\{/,\n];\n\n/**\n * Check whether a source string likely contains TypeScript syntax.\n * This is a heuristic — it may produce false positives for unusual JS,\n * but is tuned to catch the most common TS-in-JS mistakes.\n */\nexport function containsTypeScriptSyntax(source: string): boolean {\n\treturn TS_SYNTAX_PATTERNS.some((pattern) => pattern.test(source));\n}\n\nasync function loadExtensionModule(extensionPath: string) {\n\t// Pre-compiled extension loading: if the source is .ts and a sibling .js\n\t// file exists with matching or newer mtime, use native import() to skip\n\t// jiti JIT compilation entirely. This is the biggest startup win for\n\t// bundled extensions that have already been built.\n\tif (extensionPath.endsWith(\".ts\")) {\n\t\tconst jsPath = extensionPath.replace(/\\.ts$/, \".js\");\n\t\ttry {\n\t\t\tconst [tsStat, jsStat] = [fs.statSync(extensionPath), fs.statSync(jsPath)];\n\t\t\tif (jsStat.mtimeMs >= tsStat.mtimeMs) {\n\t\t\t\tconst module = await import(jsPath);\n\t\t\t\tconst factory = (module.default ?? module) as ExtensionFactory;\n\t\t\t\treturn typeof factory !== \"function\" ? undefined : factory;\n\t\t\t}\n\t\t} catch {\n\t\t\t// .js file doesn't exist or stat failed — fall through to jiti\n\t\t}\n\t}\n\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t...getJitiOptions(),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\n\n/**\n * Check whether a module path belongs to a non-extension library that should\n * be silently skipped rather than reported as an error.\n *\n * A directory is a non-extension library when its package.json has a \"pi\"\n * manifest that declares no extensions (e.g. `\"pi\": {}`). This is the\n * opt-out convention used by shared libraries like cmux that live inside\n * the extensions/ directory but are not extensions themselves.\n *\n * This serves as a defense-in-depth check: even if the upstream discovery\n * layers fail to filter out the library, the loader itself will not emit\n * a spurious error.\n */\nfunction isNonExtensionLibrary(resolvedPath: string): boolean {\n\t// Walk up from the resolved file to find the nearest package.json\n\tlet dir = path.dirname(resolvedPath);\n\tconst root = path.parse(dir).root;\n\twhile (dir !== root) {\n\t\tconst packageJsonPath = path.join(dir, \"package.json\");\n\t\tif (fs.existsSync(packageJsonPath)) {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\t\t\tconst pkg = JSON.parse(content);\n\t\t\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\t\t\t// Has a pi manifest — check if it declares any extensions\n\t\t\t\t\tconst extensions = pkg.pi.extensions;\n\t\t\t\t\tif (!Array.isArray(extensions) || extensions.length === 0) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Malformed package.json — not a known library\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdir = path.dirname(dir);\n\t}\n\treturn false;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t\tlifecycleHooks: {\n\t\t\tbeforeInstall: [],\n\t\t\tafterInstall: [],\n\t\t\tbeforeRemove: [],\n\t\t\tafterRemove: [],\n\t\t},\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd);\n\tconst start = Date.now();\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\t// Defense-in-depth: if the module is inside a directory that has\n\t\t\t// explicitly opted out of extension loading via its pi manifest,\n\t\t\t// silently skip it instead of reporting a spurious error.\n\t\t\tif (isNonExtensionLibrary(resolvedPath)) {\n\t\t\t\treturn { extension: null, error: null };\n\t\t\t}\n\t\t\tlogExtensionTiming(extensionPath, Date.now() - start, \"failed\");\n\n\t\t\t// Check if a .js file contains TypeScript syntax\n\t\t\tif (resolvedPath.endsWith(\".js\")) {\n\t\t\t\ttry {\n\t\t\t\t\tconst source = fs.readFileSync(resolvedPath, \"utf-8\");\n\t\t\t\t\tif (containsTypeScriptSyntax(source)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\textension: null,\n\t\t\t\t\t\t\terror: `Extension file \"${extensionPath}\" appears to contain TypeScript syntax but has a .js extension. Rename it to .ts so the loader can compile it.`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Could not read file — fall through to generic error\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\n\t\tlogExtensionTiming(extensionPath, Date.now() - start, \"loaded\");\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tlogExtensionTiming(extensionPath, Date.now() - start, \"failed\");\n\n\t\t// Check if a .js file contains TypeScript syntax — the parse error from\n\t\t// jiti/Node is often cryptic, so surface a clearer diagnostic.\n\t\tif (resolvedPath.endsWith(\".js\")) {\n\t\t\ttry {\n\t\t\t\tconst source = fs.readFileSync(resolvedPath, \"utf-8\");\n\t\t\t\tif (containsTypeScriptSyntax(source)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\textension: null,\n\t\t\t\t\t\terror: `Extension file \"${extensionPath}\" appears to contain TypeScript syntax but has a .js extension. Rename it to .ts so the loader can compile it.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Could not read file — fall through to generic error\n\t\t\t}\n\t\t}\n\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\tawait factory(api);\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n *\n * Extensions are loaded in parallel to reduce wall-clock time (~30-50% faster\n * than sequential loading for I/O-bound jiti compilation).\n */\nexport async function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult> {\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\n\tconst results = await Promise.all(\n\t\tpaths.map((extPath) => loadExtension(extPath, cwd, resolvedEventBus, runtime)),\n\t);\n\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst { extension, error } = results[i];\n\t\tif (error) {\n\t\t\terrors.push({ path: paths[i], error });\n\t\t} else if (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\n\ninterface PiManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readPiManifest(packageJsonPath: string): PiManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content);\n\t\tif (pkg.pi && typeof pkg.pi === \"object\") {\n\t\t\treturn pkg.pi as PiManifest;\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"pi.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"pi\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readPiManifest(packageJsonPath);\n\t\tif (manifest) {\n\t\t\t// When a pi manifest exists, it is authoritative — don't fall through\n\t\t\t// to index.ts/index.js auto-detection. This allows library directories\n\t\t\t// (like cmux) to opt out by declaring \"pi\": {} with no extensions.\n\t\t\tif (!manifest.extensions?.length) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn entries.length > 0 ? entries : null;\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/* /package.json` with \"pi\" field → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/.pi/extensions/\n\t// Only loaded when the project path has been explicitly trusted (TOFU model).\n\tconst localExtDir = path.join(cwd, \".pi\", \"extensions\");\n\tconst localDiscovered = discoverExtensionsInDir(localExtDir);\n\tif (localDiscovered.length > 0) {\n\t\tconst untrusted = getUntrustedExtensionPaths(cwd, localDiscovered, agentDir);\n\t\tif (untrusted.length > 0) {\n\t\t\tprocess.stderr.write(\n\t\t\t\t`[pi] Skipping ${untrusted.length} project-local extension(s) in ${localExtDir} — project not trusted. Use trustProject() to enable.\\n`,\n\t\t\t);\n\t\t}\n\t\tconst trusted = localDiscovered.filter((p) => !untrusted.includes(p));\n\t\taddPaths(trusted);\n\t}\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(agentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, cwd);\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with pi manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, cwd, eventBus);\n}\n"]}
|
|
@@ -4,6 +4,7 @@ import * as fs from "node:fs";
|
|
|
4
4
|
import * as os from "node:os";
|
|
5
5
|
import * as path from "node:path";
|
|
6
6
|
import { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from "./project-trust.js";
|
|
7
|
+
import { containsTypeScriptSyntax, loadExtensions } from "./loader.js";
|
|
7
8
|
// ─── helpers ──────────────────────────────────────────────────────────────────
|
|
8
9
|
function makeTempDir() {
|
|
9
10
|
return fs.mkdtempSync(path.join(os.tmpdir(), "loader-test-"));
|
|
@@ -110,4 +111,66 @@ describe("getUntrustedExtensionPaths", () => {
|
|
|
110
111
|
assert.deepEqual(result, paths);
|
|
111
112
|
});
|
|
112
113
|
});
|
|
114
|
+
// ─── containsTypeScriptSyntax ─────────────────────────────────────────────────
|
|
115
|
+
describe("containsTypeScriptSyntax", () => {
|
|
116
|
+
it("detects parameter type annotations", () => {
|
|
117
|
+
assert.ok(containsTypeScriptSyntax(`export default function activate(api: ExtensionAPI) {}`));
|
|
118
|
+
});
|
|
119
|
+
it("detects interface declarations", () => {
|
|
120
|
+
assert.ok(containsTypeScriptSyntax(`interface Config { name: string; }`));
|
|
121
|
+
});
|
|
122
|
+
it("detects type alias declarations", () => {
|
|
123
|
+
assert.ok(containsTypeScriptSyntax(`type Handler = (event: string) => void;`));
|
|
124
|
+
});
|
|
125
|
+
it("detects enum declarations", () => {
|
|
126
|
+
assert.ok(containsTypeScriptSyntax(`enum Direction { Up, Down, Left, Right }`));
|
|
127
|
+
});
|
|
128
|
+
it("detects return type annotations", () => {
|
|
129
|
+
assert.ok(containsTypeScriptSyntax(`function foo(): Promise<void> {}`));
|
|
130
|
+
});
|
|
131
|
+
it("detects generic type parameters on functions", () => {
|
|
132
|
+
assert.ok(containsTypeScriptSyntax(`function identity<T>(arg) { return arg; }`));
|
|
133
|
+
});
|
|
134
|
+
it("detects variable type annotations", () => {
|
|
135
|
+
assert.ok(containsTypeScriptSyntax(`const name: string = "hello";`));
|
|
136
|
+
});
|
|
137
|
+
it("returns false for plain JavaScript", () => {
|
|
138
|
+
assert.equal(containsTypeScriptSyntax(`export default function activate(api) { api.on("init", () => {}); }`), false);
|
|
139
|
+
});
|
|
140
|
+
it("returns false for empty string", () => {
|
|
141
|
+
assert.equal(containsTypeScriptSyntax(""), false);
|
|
142
|
+
});
|
|
143
|
+
it("returns false for JSDoc comments with type-like syntax", () => {
|
|
144
|
+
// JSDoc uses different syntax: @param {string} name
|
|
145
|
+
assert.equal(containsTypeScriptSyntax(`/** @param {string} name */\nexport default function activate(api) {}`), false);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
// ─── loadExtensions: TypeScript syntax in .js files ───────────────────────────
|
|
149
|
+
describe("loadExtensions", () => {
|
|
150
|
+
let tmpDir;
|
|
151
|
+
beforeEach(() => {
|
|
152
|
+
tmpDir = makeTempDir();
|
|
153
|
+
});
|
|
154
|
+
afterEach(() => {
|
|
155
|
+
cleanDir(tmpDir);
|
|
156
|
+
});
|
|
157
|
+
it("reports helpful error when .js file contains TypeScript syntax", async () => {
|
|
158
|
+
// Create a .js file that uses TypeScript type annotations
|
|
159
|
+
const extPath = path.join(tmpDir, "my-extension.js");
|
|
160
|
+
fs.writeFileSync(extPath, `export default function activate(api: ExtensionAPI) {\n api.on("init", async () => {});\n}\n`);
|
|
161
|
+
const result = await loadExtensions([extPath], tmpDir);
|
|
162
|
+
assert.equal(result.errors.length, 1);
|
|
163
|
+
const errorMsg = result.errors[0].error;
|
|
164
|
+
// The error should mention TypeScript syntax and suggest .ts extension
|
|
165
|
+
assert.ok(/TypeScript/.test(errorMsg) && /\.ts\b/.test(errorMsg), `Expected error to mention TypeScript syntax and .ts extension, got: ${errorMsg}`);
|
|
166
|
+
});
|
|
167
|
+
it("reports helpful error when .js file contains TS interface declaration", async () => {
|
|
168
|
+
const extPath = path.join(tmpDir, "typed-ext.js");
|
|
169
|
+
fs.writeFileSync(extPath, `interface Config { name: string; }\nexport default function activate(api) { return; }\n`);
|
|
170
|
+
const result = await loadExtensions([extPath], tmpDir);
|
|
171
|
+
assert.equal(result.errors.length, 1);
|
|
172
|
+
const errorMsg = result.errors[0].error;
|
|
173
|
+
assert.ok(/TypeScript/.test(errorMsg) && /\.ts\b/.test(errorMsg), `Expected error to mention TypeScript syntax and .ts extension, got: ${errorMsg}`);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
113
176
|
//# sourceMappingURL=loader.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, beforeEach, afterEach } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from \"./project-trust.js\";\n\n// ─── helpers ──────────────────────────────────────────────────────────────────\n\nfunction makeTempDir(): string {\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"loader-test-\"));\n}\n\nfunction cleanDir(dir: string): void {\n\tfs.rmSync(dir, { recursive: true, force: true });\n}\n\n// ─── isProjectTrusted ─────────────────────────────────────────────────────────\n\ndescribe(\"isProjectTrusted\", () => {\n\tlet agentDir: string;\n\n\tbeforeEach(() => {\n\t\tagentDir = makeTempDir();\n\t});\n\n\tafterEach(() => {\n\t\tcleanDir(agentDir);\n\t});\n\n\tit(\"returns false when no trusted-projects.json exists\", () => {\n\t\tassert.equal(isProjectTrusted(\"/some/project\", agentDir), false);\n\t});\n\n\tit(\"returns false for an untrusted project path\", () => {\n\t\ttrustProject(\"/trusted/project\", agentDir);\n\t\tassert.equal(isProjectTrusted(\"/other/project\", agentDir), false);\n\t});\n\n\tit(\"returns true after trustProject is called for that path\", () => {\n\t\ttrustProject(\"/trusted/project\", agentDir);\n\t\tassert.equal(isProjectTrusted(\"/trusted/project\", agentDir), true);\n\t});\n\n\tit(\"canonicalizes paths before comparison (trailing slash)\", () => {\n\t\ttrustProject(\"/my/project/\", agentDir);\n\t\tassert.equal(isProjectTrusted(\"/my/project\", agentDir), true);\n\t});\n\n\tit(\"returns false when trusted-projects.json is malformed JSON\", () => {\n\t\tfs.mkdirSync(agentDir, { recursive: true });\n\t\tfs.writeFileSync(path.join(agentDir, \"trusted-projects.json\"), \"not json\");\n\t\tassert.equal(isProjectTrusted(\"/any/project\", agentDir), false);\n\t});\n\n\tit(\"returns false when trusted-projects.json contains non-array\", () => {\n\t\tfs.mkdirSync(agentDir, { recursive: true });\n\t\tfs.writeFileSync(path.join(agentDir, \"trusted-projects.json\"), JSON.stringify({ foo: \"bar\" }));\n\t\tassert.equal(isProjectTrusted(\"/any/project\", agentDir), false);\n\t});\n});\n\n// ─── trustProject ─────────────────────────────────────────────────────────────\n\ndescribe(\"trustProject\", () => {\n\tlet agentDir: string;\n\n\tbeforeEach(() => {\n\t\tagentDir = makeTempDir();\n\t});\n\n\tafterEach(() => {\n\t\tcleanDir(agentDir);\n\t});\n\n\tit(\"creates agentDir if it does not exist\", () => {\n\t\tconst nested = path.join(agentDir, \"deeply\", \"nested\");\n\t\ttrustProject(\"/a/project\", nested);\n\t\tassert.ok(fs.existsSync(nested));\n\t});\n\n\tit(\"persists the trusted path to trusted-projects.json\", () => {\n\t\ttrustProject(\"/a/project\", agentDir);\n\t\tconst content = JSON.parse(fs.readFileSync(path.join(agentDir, \"trusted-projects.json\"), \"utf-8\"));\n\t\tassert.ok(Array.isArray(content));\n\t\tassert.ok(content.includes(path.resolve(\"/a/project\")));\n\t});\n\n\tit(\"accumulates multiple trusted projects\", () => {\n\t\ttrustProject(\"/project/one\", agentDir);\n\t\ttrustProject(\"/project/two\", agentDir);\n\t\tconst content = JSON.parse(fs.readFileSync(path.join(agentDir, \"trusted-projects.json\"), \"utf-8\"));\n\t\tassert.equal(content.length, 2);\n\t});\n\n\tit(\"does not duplicate already-trusted paths\", () => {\n\t\ttrustProject(\"/project/one\", agentDir);\n\t\ttrustProject(\"/project/one\", agentDir);\n\t\tconst content = JSON.parse(fs.readFileSync(path.join(agentDir, \"trusted-projects.json\"), \"utf-8\"));\n\t\tassert.equal(content.length, 1);\n\t});\n});\n\n// ─── getUntrustedExtensionPaths ───────────────────────────────────────────────\n\ndescribe(\"getUntrustedExtensionPaths\", () => {\n\tlet agentDir: string;\n\n\tbeforeEach(() => {\n\t\tagentDir = makeTempDir();\n\t});\n\n\tafterEach(() => {\n\t\tcleanDir(agentDir);\n\t});\n\n\tit(\"returns all paths when project is not trusted\", () => {\n\t\tconst paths = [\"/proj/.pi/extensions/a.ts\", \"/proj/.pi/extensions/b.ts\"];\n\t\tconst result = getUntrustedExtensionPaths(\"/proj\", paths, agentDir);\n\t\tassert.deepEqual(result, paths);\n\t});\n\n\tit(\"returns empty array when project is trusted\", () => {\n\t\ttrustProject(\"/proj\", agentDir);\n\t\tconst paths = [\"/proj/.pi/extensions/a.ts\", \"/proj/.pi/extensions/b.ts\"];\n\t\tconst result = getUntrustedExtensionPaths(\"/proj\", paths, agentDir);\n\t\tassert.deepEqual(result, []);\n\t});\n\n\tit(\"returns empty array when extension paths list is empty regardless of trust\", () => {\n\t\tconst result = getUntrustedExtensionPaths(\"/proj\", [], agentDir);\n\t\tassert.deepEqual(result, []);\n\t});\n\n\tit(\"trusting one project does not affect another\", () => {\n\t\ttrustProject(\"/project/a\", agentDir);\n\t\tconst paths = [\"/project/b/.pi/extensions/evil.ts\"];\n\t\tconst result = getUntrustedExtensionPaths(\"/project/b\", paths, agentDir);\n\t\tassert.deepEqual(result, paths);\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../../src/core/extensions/loader.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, beforeEach, afterEach } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { isProjectTrusted, trustProject, getUntrustedExtensionPaths } from \"./project-trust.js\";\nimport { containsTypeScriptSyntax, loadExtensions } from \"./loader.js\";\n\n// ─── helpers ──────────────────────────────────────────────────────────────────\n\nfunction makeTempDir(): string {\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"loader-test-\"));\n}\n\nfunction cleanDir(dir: string): void {\n\tfs.rmSync(dir, { recursive: true, force: true });\n}\n\n// ─── isProjectTrusted ─────────────────────────────────────────────────────────\n\ndescribe(\"isProjectTrusted\", () => {\n\tlet agentDir: string;\n\n\tbeforeEach(() => {\n\t\tagentDir = makeTempDir();\n\t});\n\n\tafterEach(() => {\n\t\tcleanDir(agentDir);\n\t});\n\n\tit(\"returns false when no trusted-projects.json exists\", () => {\n\t\tassert.equal(isProjectTrusted(\"/some/project\", agentDir), false);\n\t});\n\n\tit(\"returns false for an untrusted project path\", () => {\n\t\ttrustProject(\"/trusted/project\", agentDir);\n\t\tassert.equal(isProjectTrusted(\"/other/project\", agentDir), false);\n\t});\n\n\tit(\"returns true after trustProject is called for that path\", () => {\n\t\ttrustProject(\"/trusted/project\", agentDir);\n\t\tassert.equal(isProjectTrusted(\"/trusted/project\", agentDir), true);\n\t});\n\n\tit(\"canonicalizes paths before comparison (trailing slash)\", () => {\n\t\ttrustProject(\"/my/project/\", agentDir);\n\t\tassert.equal(isProjectTrusted(\"/my/project\", agentDir), true);\n\t});\n\n\tit(\"returns false when trusted-projects.json is malformed JSON\", () => {\n\t\tfs.mkdirSync(agentDir, { recursive: true });\n\t\tfs.writeFileSync(path.join(agentDir, \"trusted-projects.json\"), \"not json\");\n\t\tassert.equal(isProjectTrusted(\"/any/project\", agentDir), false);\n\t});\n\n\tit(\"returns false when trusted-projects.json contains non-array\", () => {\n\t\tfs.mkdirSync(agentDir, { recursive: true });\n\t\tfs.writeFileSync(path.join(agentDir, \"trusted-projects.json\"), JSON.stringify({ foo: \"bar\" }));\n\t\tassert.equal(isProjectTrusted(\"/any/project\", agentDir), false);\n\t});\n});\n\n// ─── trustProject ─────────────────────────────────────────────────────────────\n\ndescribe(\"trustProject\", () => {\n\tlet agentDir: string;\n\n\tbeforeEach(() => {\n\t\tagentDir = makeTempDir();\n\t});\n\n\tafterEach(() => {\n\t\tcleanDir(agentDir);\n\t});\n\n\tit(\"creates agentDir if it does not exist\", () => {\n\t\tconst nested = path.join(agentDir, \"deeply\", \"nested\");\n\t\ttrustProject(\"/a/project\", nested);\n\t\tassert.ok(fs.existsSync(nested));\n\t});\n\n\tit(\"persists the trusted path to trusted-projects.json\", () => {\n\t\ttrustProject(\"/a/project\", agentDir);\n\t\tconst content = JSON.parse(fs.readFileSync(path.join(agentDir, \"trusted-projects.json\"), \"utf-8\"));\n\t\tassert.ok(Array.isArray(content));\n\t\tassert.ok(content.includes(path.resolve(\"/a/project\")));\n\t});\n\n\tit(\"accumulates multiple trusted projects\", () => {\n\t\ttrustProject(\"/project/one\", agentDir);\n\t\ttrustProject(\"/project/two\", agentDir);\n\t\tconst content = JSON.parse(fs.readFileSync(path.join(agentDir, \"trusted-projects.json\"), \"utf-8\"));\n\t\tassert.equal(content.length, 2);\n\t});\n\n\tit(\"does not duplicate already-trusted paths\", () => {\n\t\ttrustProject(\"/project/one\", agentDir);\n\t\ttrustProject(\"/project/one\", agentDir);\n\t\tconst content = JSON.parse(fs.readFileSync(path.join(agentDir, \"trusted-projects.json\"), \"utf-8\"));\n\t\tassert.equal(content.length, 1);\n\t});\n});\n\n// ─── getUntrustedExtensionPaths ───────────────────────────────────────────────\n\ndescribe(\"getUntrustedExtensionPaths\", () => {\n\tlet agentDir: string;\n\n\tbeforeEach(() => {\n\t\tagentDir = makeTempDir();\n\t});\n\n\tafterEach(() => {\n\t\tcleanDir(agentDir);\n\t});\n\n\tit(\"returns all paths when project is not trusted\", () => {\n\t\tconst paths = [\"/proj/.pi/extensions/a.ts\", \"/proj/.pi/extensions/b.ts\"];\n\t\tconst result = getUntrustedExtensionPaths(\"/proj\", paths, agentDir);\n\t\tassert.deepEqual(result, paths);\n\t});\n\n\tit(\"returns empty array when project is trusted\", () => {\n\t\ttrustProject(\"/proj\", agentDir);\n\t\tconst paths = [\"/proj/.pi/extensions/a.ts\", \"/proj/.pi/extensions/b.ts\"];\n\t\tconst result = getUntrustedExtensionPaths(\"/proj\", paths, agentDir);\n\t\tassert.deepEqual(result, []);\n\t});\n\n\tit(\"returns empty array when extension paths list is empty regardless of trust\", () => {\n\t\tconst result = getUntrustedExtensionPaths(\"/proj\", [], agentDir);\n\t\tassert.deepEqual(result, []);\n\t});\n\n\tit(\"trusting one project does not affect another\", () => {\n\t\ttrustProject(\"/project/a\", agentDir);\n\t\tconst paths = [\"/project/b/.pi/extensions/evil.ts\"];\n\t\tconst result = getUntrustedExtensionPaths(\"/project/b\", paths, agentDir);\n\t\tassert.deepEqual(result, paths);\n\t});\n});\n\n// ─── containsTypeScriptSyntax ─────────────────────────────────────────────────\n\ndescribe(\"containsTypeScriptSyntax\", () => {\n\tit(\"detects parameter type annotations\", () => {\n\t\tassert.ok(containsTypeScriptSyntax(`export default function activate(api: ExtensionAPI) {}`));\n\t});\n\n\tit(\"detects interface declarations\", () => {\n\t\tassert.ok(containsTypeScriptSyntax(`interface Config { name: string; }`));\n\t});\n\n\tit(\"detects type alias declarations\", () => {\n\t\tassert.ok(containsTypeScriptSyntax(`type Handler = (event: string) => void;`));\n\t});\n\n\tit(\"detects enum declarations\", () => {\n\t\tassert.ok(containsTypeScriptSyntax(`enum Direction { Up, Down, Left, Right }`));\n\t});\n\n\tit(\"detects return type annotations\", () => {\n\t\tassert.ok(containsTypeScriptSyntax(`function foo(): Promise<void> {}`));\n\t});\n\n\tit(\"detects generic type parameters on functions\", () => {\n\t\tassert.ok(containsTypeScriptSyntax(`function identity<T>(arg) { return arg; }`));\n\t});\n\n\tit(\"detects variable type annotations\", () => {\n\t\tassert.ok(containsTypeScriptSyntax(`const name: string = \"hello\";`));\n\t});\n\n\tit(\"returns false for plain JavaScript\", () => {\n\t\tassert.equal(containsTypeScriptSyntax(`export default function activate(api) { api.on(\"init\", () => {}); }`), false);\n\t});\n\n\tit(\"returns false for empty string\", () => {\n\t\tassert.equal(containsTypeScriptSyntax(\"\"), false);\n\t});\n\n\tit(\"returns false for JSDoc comments with type-like syntax\", () => {\n\t\t// JSDoc uses different syntax: @param {string} name\n\t\tassert.equal(containsTypeScriptSyntax(`/** @param {string} name */\\nexport default function activate(api) {}`), false);\n\t});\n});\n\n// ─── loadExtensions: TypeScript syntax in .js files ───────────────────────────\n\ndescribe(\"loadExtensions\", () => {\n\tlet tmpDir: string;\n\n\tbeforeEach(() => {\n\t\ttmpDir = makeTempDir();\n\t});\n\n\tafterEach(() => {\n\t\tcleanDir(tmpDir);\n\t});\n\n\tit(\"reports helpful error when .js file contains TypeScript syntax\", async () => {\n\t\t// Create a .js file that uses TypeScript type annotations\n\t\tconst extPath = path.join(tmpDir, \"my-extension.js\");\n\t\tfs.writeFileSync(\n\t\t\textPath,\n\t\t\t`export default function activate(api: ExtensionAPI) {\\n api.on(\"init\", async () => {});\\n}\\n`,\n\t\t);\n\n\t\tconst result = await loadExtensions([extPath], tmpDir);\n\n\t\tassert.equal(result.errors.length, 1);\n\t\tconst errorMsg = result.errors[0].error;\n\t\t// The error should mention TypeScript syntax and suggest .ts extension\n\t\tassert.ok(\n\t\t\t/TypeScript/.test(errorMsg) && /\\.ts\\b/.test(errorMsg),\n\t\t\t`Expected error to mention TypeScript syntax and .ts extension, got: ${errorMsg}`,\n\t\t);\n\t});\n\n\tit(\"reports helpful error when .js file contains TS interface declaration\", async () => {\n\t\tconst extPath = path.join(tmpDir, \"typed-ext.js\");\n\t\tfs.writeFileSync(\n\t\t\textPath,\n\t\t\t`interface Config { name: string; }\\nexport default function activate(api) { return; }\\n`,\n\t\t);\n\n\t\tconst result = await loadExtensions([extPath], tmpDir);\n\n\t\tassert.equal(result.errors.length, 1);\n\t\tconst errorMsg = result.errors[0].error;\n\t\tassert.ok(\n\t\t\t/TypeScript/.test(errorMsg) && /\\.ts\\b/.test(errorMsg),\n\t\t\t`Expected error to mention TypeScript syntax and .ts extension, got: ${errorMsg}`,\n\t\t);\n\t});\n});\n"]}
|
|
@@ -44,34 +44,32 @@ function makeThrowingExtension(eventType, error) {
|
|
|
44
44
|
};
|
|
45
45
|
}
|
|
46
46
|
describe("ExtensionRunner.emitToolCall", () => {
|
|
47
|
-
it("catches throwing extension handler and routes to emitError", async () => {
|
|
47
|
+
it("catches throwing extension handler and routes to emitError", async (t) => {
|
|
48
48
|
const dir = mkdtempSync(join(tmpdir(), "runner-test-"));
|
|
49
|
-
|
|
50
|
-
const sessionManager = SessionManager.create(dir, dir);
|
|
51
|
-
const authStorage = AuthStorage.create();
|
|
52
|
-
const modelRegistry = new ModelRegistry(authStorage, join(dir, "models.json"));
|
|
53
|
-
const throwingExt = makeThrowingExtension("tool_call", new Error("handler crashed"));
|
|
54
|
-
const runtime = makeMinimalRuntime();
|
|
55
|
-
const runner = new ExtensionRunner([throwingExt], runtime, dir, sessionManager, modelRegistry);
|
|
56
|
-
const errors = [];
|
|
57
|
-
runner.onError((err) => errors.push(err));
|
|
58
|
-
const event = {
|
|
59
|
-
type: "tool_call",
|
|
60
|
-
toolCallId: "test-123",
|
|
61
|
-
toolName: "test_tool",
|
|
62
|
-
input: {},
|
|
63
|
-
};
|
|
64
|
-
const result = await runner.emitToolCall(event);
|
|
65
|
-
// Should not throw — error is caught and routed to emitError
|
|
66
|
-
assert.equal(result, undefined);
|
|
67
|
-
assert.equal(errors.length, 1);
|
|
68
|
-
assert.equal(errors[0].error, "handler crashed");
|
|
69
|
-
assert.equal(errors[0].event, "tool_call");
|
|
70
|
-
assert.equal(errors[0].extensionPath, "/test/throwing-ext");
|
|
71
|
-
}
|
|
72
|
-
finally {
|
|
49
|
+
t.after(() => {
|
|
73
50
|
rmSync(dir, { recursive: true, force: true });
|
|
74
|
-
}
|
|
51
|
+
});
|
|
52
|
+
const sessionManager = SessionManager.create(dir, dir);
|
|
53
|
+
const authStorage = AuthStorage.create();
|
|
54
|
+
const modelRegistry = new ModelRegistry(authStorage, join(dir, "models.json"));
|
|
55
|
+
const throwingExt = makeThrowingExtension("tool_call", new Error("handler crashed"));
|
|
56
|
+
const runtime = makeMinimalRuntime();
|
|
57
|
+
const runner = new ExtensionRunner([throwingExt], runtime, dir, sessionManager, modelRegistry);
|
|
58
|
+
const errors = [];
|
|
59
|
+
runner.onError((err) => errors.push(err));
|
|
60
|
+
const event = {
|
|
61
|
+
type: "tool_call",
|
|
62
|
+
toolCallId: "test-123",
|
|
63
|
+
toolName: "test_tool",
|
|
64
|
+
input: {},
|
|
65
|
+
};
|
|
66
|
+
const result = await runner.emitToolCall(event);
|
|
67
|
+
// Should not throw — error is caught and routed to emitError
|
|
68
|
+
assert.equal(result, undefined);
|
|
69
|
+
assert.equal(errors.length, 1);
|
|
70
|
+
assert.equal(errors[0].error, "handler crashed");
|
|
71
|
+
assert.equal(errors[0].event, "tool_call");
|
|
72
|
+
assert.equal(errors[0].extensionPath, "/test/throwing-ext");
|
|
75
73
|
});
|
|
76
74
|
});
|
|
77
75
|
//# sourceMappingURL=runner.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../../src/core/extensions/runner.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAQ,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,SAAS,kBAAkB;IAC1B,OAAO;QACN,WAAW,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC3B,eAAe,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC/B,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC;QACrB,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;QACxB,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS;QAC/B,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE;QACxB,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE;QACrB,cAAc,EAAE,GAAG,EAAE,GAAE,CAAC;QACxB,YAAY,EAAE,GAAG,EAAE,GAAE,CAAC;QACtB,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE;QACrB,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACxB,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS;QACjC,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC1B,gBAAgB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC1B,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC5B,4BAA4B,EAAE,EAAE;KACD,CAAC;AAClC,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB,EAAE,KAAY;IAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE;QACvB,KAAK,IAAI,EAAE;YACV,MAAM,KAAK,CAAC;QACb,CAAC;KACD,CAAC,CAAC;IACH,OAAO;QACN,IAAI,EAAE,oBAAoB;QAC1B,QAAQ;QACR,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,EAAE;QACb,WAAW,EAAE,EAAE;KACS,CAAC;AAC3B,CAAC;AAED,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,4DAA4D,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../../src/core/extensions/runner.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it, mock } from \"node:test\";\nimport { ExtensionRunner } from \"./runner.js\";\nimport type { Extension, ExtensionRuntime, ToolCallEvent } from \"./index.js\";\nimport { SessionManager } from \"../session-manager.js\";\nimport { ModelRegistry } from \"../model-registry.js\";\nimport { mkdtempSync, rmSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport { AuthStorage } from \"../auth-storage.js\";\n\nfunction makeMinimalRuntime(): ExtensionRuntime {\n\treturn {\n\t\tsendMessage: async () => {},\n\t\tsendUserMessage: async () => {},\n\t\tappendEntry: () => {},\n\t\tsetSessionName: () => {},\n\t\tgetSessionName: () => undefined,\n\t\tsetLabel: () => {},\n\t\tgetActiveTools: () => [],\n\t\tgetAllTools: () => [],\n\t\tsetActiveTools: () => {},\n\t\trefreshTools: () => {},\n\t\tgetCommands: () => [],\n\t\tsetModel: async () => {},\n\t\tgetThinkingLevel: () => undefined,\n\t\tsetThinkingLevel: () => {},\n\t\tregisterProvider: () => {},\n\t\tunregisterProvider: () => {},\n\t\tpendingProviderRegistrations: [],\n\t} as unknown as ExtensionRuntime;\n}\n\nfunction makeThrowingExtension(eventType: string, error: Error): Extension {\n\tconst handlers = new Map();\n\thandlers.set(eventType, [\n\t\tasync () => {\n\t\t\tthrow error;\n\t\t},\n\t]);\n\treturn {\n\t\tpath: \"/test/throwing-ext\",\n\t\thandlers,\n\t\tcommands: [],\n\t\tshortcuts: [],\n\t\tdiagnostics: [],\n\t} as unknown as Extension;\n}\n\ndescribe(\"ExtensionRunner.emitToolCall\", () => {\n\tit(\"catches throwing extension handler and routes to emitError\", async (t) => {\n\t\tconst dir = mkdtempSync(join(tmpdir(), \"runner-test-\"));\n\t\tt.after(() => {\n\t\t\trmSync(dir, { recursive: true, force: true });\n\t\t});\n\n\t\tconst sessionManager = SessionManager.create(dir, dir);\n\t\tconst authStorage = AuthStorage.create();\n\t\tconst modelRegistry = new ModelRegistry(authStorage, join(dir, \"models.json\"));\n\n\t\tconst throwingExt = makeThrowingExtension(\"tool_call\", new Error(\"handler crashed\"));\n\t\tconst runtime = makeMinimalRuntime();\n\t\tconst runner = new ExtensionRunner([throwingExt], runtime, dir, sessionManager, modelRegistry);\n\n\t\tconst errors: any[] = [];\n\t\trunner.onError((err) => errors.push(err));\n\n\t\tconst event: ToolCallEvent = {\n\t\t\ttype: \"tool_call\",\n\t\t\ttoolCallId: \"test-123\",\n\t\t\ttoolName: \"test_tool\",\n\t\t\tinput: {},\n\t\t} as ToolCallEvent;\n\n\t\tconst result = await runner.emitToolCall(event);\n\n\t\t// Should not throw — error is caught and routed to emitError\n\t\tassert.equal(result, undefined);\n\t\tassert.equal(errors.length, 1);\n\t\tassert.equal(errors[0].error, \"handler crashed\");\n\t\tassert.equal(errors[0].event, \"tool_call\");\n\t\tassert.equal(errors[0].extensionPath, \"/test/throwing-ext\");\n\t});\n});\n"]}
|
|
@@ -686,6 +686,30 @@ export interface RegisteredCommand {
|
|
|
686
686
|
getArgumentCompletions?: (argumentPrefix: string) => AutocompleteItem[] | null;
|
|
687
687
|
handler: (args: string, ctx: ExtensionCommandContext) => Promise<void>;
|
|
688
688
|
}
|
|
689
|
+
export type LifecycleHookScope = "user" | "project";
|
|
690
|
+
export type LifecycleHookPhase = "beforeInstall" | "afterInstall" | "beforeRemove" | "afterRemove";
|
|
691
|
+
export interface LifecycleHookContext {
|
|
692
|
+
/** Lifecycle phase currently being executed. */
|
|
693
|
+
phase: LifecycleHookPhase;
|
|
694
|
+
/** Package source string passed to install (npm:, git:, https://, local path). */
|
|
695
|
+
source: string;
|
|
696
|
+
/** Resolved installed package path (or resolved local path), when available for this phase. */
|
|
697
|
+
installedPath?: string;
|
|
698
|
+
/** Where the package was installed. */
|
|
699
|
+
scope: LifecycleHookScope;
|
|
700
|
+
/** Current working directory for the install invocation. */
|
|
701
|
+
cwd: string;
|
|
702
|
+
/** Whether install is running in an interactive TTY. */
|
|
703
|
+
interactive: boolean;
|
|
704
|
+
/** Info-level logging sink for install output. */
|
|
705
|
+
log(message: string): void;
|
|
706
|
+
/** Warning-level logging sink for install output. */
|
|
707
|
+
warn(message: string): void;
|
|
708
|
+
/** Error-level logging sink for install output. */
|
|
709
|
+
error(message: string): void;
|
|
710
|
+
}
|
|
711
|
+
export type LifecycleHookHandler = (ctx: LifecycleHookContext) => Promise<void> | void;
|
|
712
|
+
export type LifecycleHookMap = Record<LifecycleHookPhase, LifecycleHookHandler[]>;
|
|
689
713
|
/** Handler function type for events */
|
|
690
714
|
export type ExtensionHandler<E, R = undefined> = (event: E, ctx: ExtensionContext) => Promise<R | void> | R | void;
|
|
691
715
|
/**
|
|
@@ -726,6 +750,14 @@ export interface ExtensionAPI {
|
|
|
726
750
|
registerTool<TParams extends TSchema = TSchema, TDetails = unknown>(tool: ToolDefinition<TParams, TDetails>): void;
|
|
727
751
|
/** Register a custom command. */
|
|
728
752
|
registerCommand(name: string, options: Omit<RegisteredCommand, "name">): void;
|
|
753
|
+
/** Register a lifecycle hook run before package installation starts. */
|
|
754
|
+
registerBeforeInstall(handler: LifecycleHookHandler): void;
|
|
755
|
+
/** Register a lifecycle hook run after package installation completes. */
|
|
756
|
+
registerAfterInstall(handler: LifecycleHookHandler): void;
|
|
757
|
+
/** Register a lifecycle hook run before package removal starts. */
|
|
758
|
+
registerBeforeRemove(handler: LifecycleHookHandler): void;
|
|
759
|
+
/** Register a lifecycle hook run after package removal completes. */
|
|
760
|
+
registerAfterRemove(handler: LifecycleHookHandler): void;
|
|
729
761
|
/** Register a keyboard shortcut. */
|
|
730
762
|
registerShortcut(shortcut: KeyId, options: {
|
|
731
763
|
description?: string;
|
|
@@ -857,6 +889,10 @@ export interface ExtensionAPI {
|
|
|
857
889
|
}
|
|
858
890
|
/** Configuration for registering a provider via pi.registerProvider(). */
|
|
859
891
|
export interface ProviderConfig {
|
|
892
|
+
/** Auth behavior for provider availability and request key handling. Defaults to "apiKey". */
|
|
893
|
+
authMode?: "apiKey" | "oauth" | "externalCli" | "none";
|
|
894
|
+
/** Optional readiness check. Return false if the provider cannot accept requests (e.g., CLI not authenticated, API key invalid). Called before default auth checks. */
|
|
895
|
+
isReady?: () => boolean;
|
|
860
896
|
/** Base URL for the API endpoint. Required when defining models. */
|
|
861
897
|
baseUrl?: string;
|
|
862
898
|
/** API key or environment variable name. Required when defining models (unless oauth provided). */
|
|
@@ -1041,6 +1077,7 @@ export interface Extension {
|
|
|
1041
1077
|
commands: Map<string, RegisteredCommand>;
|
|
1042
1078
|
flags: Map<string, ExtensionFlag>;
|
|
1043
1079
|
shortcuts: Map<KeyId, ExtensionShortcut>;
|
|
1080
|
+
lifecycleHooks: LifecycleHookMap;
|
|
1044
1081
|
}
|
|
1045
1082
|
/** Result of loading extensions. */
|
|
1046
1083
|
export interface LoadExtensionsResult {
|