@opengsd/gsd-pi 1.0.1 → 1.0.2-dev.0ee79e5

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.
Files changed (1431) hide show
  1. package/README.md +59 -4
  2. package/dist/claude-cli-check.js +1 -1
  3. package/dist/cli-policy.d.ts +1 -1
  4. package/dist/cli-policy.js +2 -2
  5. package/dist/cli.js +4 -3
  6. package/dist/extension-sort.js +1 -1
  7. package/dist/extension-validator.js +1 -1
  8. package/dist/help-text.js +8 -0
  9. package/dist/loader-entrypoint.js +1 -1
  10. package/dist/loader.js +0 -0
  11. package/dist/resource-loader.d.ts +1 -4
  12. package/dist/resource-loader.js +70 -123
  13. package/dist/resources/.managed-resources-content-hash +1 -1
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +2 -2
  15. package/dist/resources/extensions/github-sync/templates.js +1 -1
  16. package/dist/resources/extensions/gsd/auto/contracts.js +1 -1
  17. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/lease-conflict-notice.js +1 -1
  19. package/dist/resources/extensions/gsd/auto/loop.js +7 -2
  20. package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
  21. package/dist/resources/extensions/gsd/auto/phases.js +40 -4
  22. package/dist/resources/extensions/gsd/auto/run-unit.js +110 -44
  23. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +18 -0
  24. package/dist/resources/extensions/gsd/auto/session.js +1 -1
  25. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +1 -1
  26. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  27. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +1 -1
  28. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +1 -1
  29. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +1 -1
  30. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +1 -1
  31. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +1 -1
  33. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +1 -1
  34. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +1 -1
  35. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +1 -1
  36. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +1 -1
  37. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -1
  38. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +1 -1
  39. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +1 -1
  40. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +1 -1
  41. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +1 -1
  42. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +1 -1
  43. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +1 -1
  44. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  45. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +1 -1
  46. package/dist/resources/extensions/gsd/auto-artifact-paths.js +4 -3
  47. package/dist/resources/extensions/gsd/auto-budget.js +1 -1
  48. package/dist/resources/extensions/gsd/auto-dashboard.js +1 -1
  49. package/dist/resources/extensions/gsd/auto-dispatch.js +3 -1
  50. package/dist/resources/extensions/gsd/auto-post-unit.js +21 -2
  51. package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
  52. package/dist/resources/extensions/gsd/auto-recovery.js +115 -3
  53. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  54. package/dist/resources/extensions/gsd/auto-status-message.js +1 -1
  55. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  56. package/dist/resources/extensions/gsd/auto-unit-closeout.js +1 -1
  57. package/dist/resources/extensions/gsd/auto-verification.js +1 -1
  58. package/dist/resources/extensions/gsd/auto-worktree-repair.js +1 -1
  59. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  60. package/dist/resources/extensions/gsd/auto.js +34 -8
  61. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +5 -9
  62. package/dist/resources/extensions/gsd/bootstrap/crash-log.js +3 -4
  63. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -1
  64. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  65. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  66. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +1 -1
  67. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +2 -2
  68. package/dist/resources/extensions/gsd/bootstrap/plan-milestone-schema-recovery.js +98 -0
  69. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  70. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +4 -3
  71. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -1
  72. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +1 -1
  73. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +69 -0
  74. package/dist/resources/extensions/gsd/bootstrap/system-context.js +2 -2
  75. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  76. package/dist/resources/extensions/gsd/browser-evidence.js +1 -1
  77. package/dist/resources/extensions/gsd/closeout-recovery.js +1 -1
  78. package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
  79. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  80. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  81. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +1 -1
  82. package/dist/resources/extensions/gsd/commands/handlers/ops.js +1 -1
  83. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  84. package/dist/resources/extensions/gsd/commands-closeout.js +1 -1
  85. package/dist/resources/extensions/gsd/commands-ship.js +1 -1
  86. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  87. package/dist/resources/extensions/gsd/commands-workflow-templates.js +1 -1
  88. package/dist/resources/extensions/gsd/commands-worktree.js +1 -1
  89. package/dist/resources/extensions/gsd/component-loader.js +1 -1
  90. package/dist/resources/extensions/gsd/db/auto-workers.js +1 -1
  91. package/dist/resources/extensions/gsd/db/command-queue.js +1 -1
  92. package/dist/resources/extensions/gsd/db/milestone-leases.js +20 -6
  93. package/dist/resources/extensions/gsd/db/runtime-kv.js +1 -1
  94. package/dist/resources/extensions/gsd/db/unit-dispatches.js +1 -1
  95. package/dist/resources/extensions/gsd/db-adapter.js +1 -1
  96. package/dist/resources/extensions/gsd/db-base-schema.js +1 -1
  97. package/dist/resources/extensions/gsd/db-connection-cache.js +1 -1
  98. package/dist/resources/extensions/gsd/db-coordination-schema.js +1 -1
  99. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +1 -1
  100. package/dist/resources/extensions/gsd/db-gate-rows.js +1 -1
  101. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +1 -1
  102. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +1 -1
  103. package/dist/resources/extensions/gsd/db-migration-backup.js +1 -1
  104. package/dist/resources/extensions/gsd/db-migration-steps.js +1 -1
  105. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +1 -1
  106. package/dist/resources/extensions/gsd/db-open-state.js +1 -1
  107. package/dist/resources/extensions/gsd/db-provider.js +1 -1
  108. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +1 -1
  109. package/dist/resources/extensions/gsd/db-schema-metadata.js +1 -1
  110. package/dist/resources/extensions/gsd/db-task-slice-rows.js +1 -1
  111. package/dist/resources/extensions/gsd/db-transaction.js +1 -1
  112. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +1 -1
  113. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +1 -1
  114. package/dist/resources/extensions/gsd/doctor-git-checks.js +1 -1
  115. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -1
  116. package/dist/resources/extensions/gsd/ecosystem/loader.js +1 -1
  117. package/dist/resources/extensions/gsd/escalation.js +1 -1
  118. package/dist/resources/extensions/gsd/fresh-run-ui.js +1 -1
  119. package/dist/resources/extensions/gsd/git-conflict-state.js +1 -1
  120. package/dist/resources/extensions/gsd/git-service.js +1 -1
  121. package/dist/resources/extensions/gsd/gsd-command-home.js +1 -1
  122. package/dist/resources/extensions/gsd/gsd-db.js +1 -1
  123. package/dist/resources/extensions/gsd/guided-unit-context.js +1 -1
  124. package/dist/resources/extensions/gsd/health-widget.js +1 -1
  125. package/dist/resources/extensions/gsd/knowledge-backfill.js +1 -1
  126. package/dist/resources/extensions/gsd/knowledge-capture.js +1 -1
  127. package/dist/resources/extensions/gsd/knowledge-parser.js +1 -1
  128. package/dist/resources/extensions/gsd/knowledge-projection.js +1 -1
  129. package/dist/resources/extensions/gsd/legacy-telemetry.js +1 -3
  130. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  131. package/dist/resources/extensions/gsd/md-importer.js +2 -2
  132. package/dist/resources/extensions/gsd/memory-backfill.js +1 -1
  133. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  134. package/dist/resources/extensions/gsd/metrics.js +1 -1
  135. package/dist/resources/extensions/gsd/migrate/audit.js +4 -2
  136. package/dist/resources/extensions/gsd/migrate/command.js +27 -5
  137. package/dist/resources/extensions/gsd/migrate/parser.js +57 -11
  138. package/dist/resources/extensions/gsd/migrate/parsers.js +16 -0
  139. package/dist/resources/extensions/gsd/migrate/preview.js +1 -0
  140. package/dist/resources/extensions/gsd/migrate/safety.js +1 -1
  141. package/dist/resources/extensions/gsd/migrate/transformer.js +79 -6
  142. package/dist/resources/extensions/gsd/migrate/validator.js +22 -1
  143. package/dist/resources/extensions/gsd/migrate/writer.js +1 -1
  144. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +1 -1
  145. package/dist/resources/extensions/gsd/model-router.js +1 -1
  146. package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
  147. package/dist/resources/extensions/gsd/orphan-stash-audit.js +1 -1
  148. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
  149. package/dist/resources/extensions/gsd/paths.js +1 -1
  150. package/dist/resources/extensions/gsd/pending-auto-start.js +1 -1
  151. package/dist/resources/extensions/gsd/planning-depth.js +1 -1
  152. package/dist/resources/extensions/gsd/post-execution-checks.js +1 -1
  153. package/dist/resources/extensions/gsd/pr-evidence.js +1 -1
  154. package/dist/resources/extensions/gsd/pre-execution-checks.js +1 -1
  155. package/dist/resources/extensions/gsd/preferences-skills.js +4 -9
  156. package/dist/resources/extensions/gsd/process-task-path.js +1 -1
  157. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +6 -0
  158. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -0
  159. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -0
  160. package/dist/resources/extensions/gsd/prompts/review-migration.md +2 -2
  161. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  162. package/dist/resources/extensions/gsd/recovery-classification.js +1 -1
  163. package/dist/resources/extensions/gsd/repository-registry.js +1 -1
  164. package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -1
  165. package/dist/resources/extensions/gsd/schemas/parsers.js +1 -1
  166. package/dist/resources/extensions/gsd/schemas/validate.js +1 -1
  167. package/dist/resources/extensions/gsd/skill-catalog.js +6 -3
  168. package/dist/resources/extensions/gsd/skill-discovery.js +6 -2
  169. package/dist/resources/extensions/gsd/skill-health.js +3 -1
  170. package/dist/resources/extensions/gsd/skill-manifest.js +1 -1
  171. package/dist/resources/extensions/gsd/skill-telemetry.js +9 -9
  172. package/dist/resources/extensions/gsd/slice-cadence.js +1 -1
  173. package/dist/resources/extensions/gsd/smart-entry-routing.js +1 -1
  174. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +1 -1
  175. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +1 -1
  176. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  177. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +1 -1
  178. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +1 -1
  179. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +1 -1
  180. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +1 -1
  181. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +1 -1
  182. package/dist/resources/extensions/gsd/state-reconciliation/index.js +1 -1
  183. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +1 -1
  184. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +1 -1
  185. package/dist/resources/extensions/gsd/state-reconciliation/types.js +1 -1
  186. package/dist/resources/extensions/gsd/state-reconciliation.js +1 -1
  187. package/dist/resources/extensions/gsd/state.js +9 -18
  188. package/dist/resources/extensions/gsd/tool-contract.js +1 -1
  189. package/dist/resources/extensions/gsd/tools/complete-milestone.js +2 -2
  190. package/dist/resources/extensions/gsd/tools/complete-slice.js +8 -2
  191. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  192. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +1 -1
  193. package/dist/resources/extensions/gsd/tools/exec-tool.js +1 -1
  194. package/dist/resources/extensions/gsd/tools/plan-milestone.js +1 -1
  195. package/dist/resources/extensions/gsd/tools/validate-milestone.js +1 -1
  196. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  197. package/dist/resources/extensions/gsd/tui/render-kit.js +1 -1
  198. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  199. package/dist/resources/extensions/gsd/unit-context-manifest.js +1 -1
  200. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  201. package/dist/resources/extensions/gsd/uok/audit.js +1 -1
  202. package/dist/resources/extensions/gsd/uok/contracts.js +1 -1
  203. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +1 -1
  204. package/dist/resources/extensions/gsd/uok/loop-adapter.js +1 -1
  205. package/dist/resources/extensions/gsd/uok/plan-v2.js +1 -1
  206. package/dist/resources/extensions/gsd/uok/timeline.js +1 -1
  207. package/dist/resources/extensions/gsd/validation-block-guard.js +1 -1
  208. package/dist/resources/extensions/gsd/verification-gate.js +28 -12
  209. package/dist/resources/extensions/gsd/verification-verdict.js +9 -1
  210. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -1
  211. package/dist/resources/extensions/gsd/watch/splash-palette.js +1 -1
  212. package/dist/resources/extensions/gsd/workflow-manifest.js +1 -1
  213. package/dist/resources/extensions/gsd/workflow-projections.js +1 -1
  214. package/dist/resources/extensions/gsd/workflow-protocol.js +1 -1
  215. package/dist/resources/extensions/gsd/workflow-reconcile.js +8 -0
  216. package/dist/resources/extensions/gsd/workflow-templates.js +1 -1
  217. package/dist/resources/extensions/gsd/working-output-messages.js +1 -1
  218. package/dist/resources/extensions/gsd/workspace.js +1 -1
  219. package/dist/resources/extensions/gsd/worktree-lifecycle.js +1 -1
  220. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  221. package/dist/resources/extensions/gsd/worktree-safety.js +1 -1
  222. package/dist/resources/extensions/gsd/worktree-state-projection.js +1 -1
  223. package/dist/resources/extensions/mcp-client/manager.js +1 -1
  224. package/dist/resources/extensions/ollama/index.js +1 -1
  225. package/dist/resources/extensions/ollama/model-capabilities.js +16 -5
  226. package/dist/resources/extensions/ollama/ndjson-stream.js +1 -1
  227. package/dist/resources/extensions/ollama/ollama-chat-provider.js +38 -2
  228. package/dist/resources/extensions/ollama/ollama-client.js +1 -1
  229. package/dist/resources/extensions/ollama/ollama-commands.js +1 -1
  230. package/dist/resources/extensions/ollama/ollama-discovery.js +49 -20
  231. package/dist/resources/extensions/ollama/ollama-tool.js +1 -1
  232. package/dist/resources/extensions/ollama/thinking-parser.js +1 -1
  233. package/dist/resources/extensions/ollama/types.js +1 -1
  234. package/dist/resources/extensions/shared/cmux-events.js +1 -1
  235. package/dist/resources/extensions/shared/gsd-phase-state.js +1 -1
  236. package/dist/resources/extensions/shared/interview-ui.js +1 -1
  237. package/dist/resources/extensions/subagent/launch.js +1 -1
  238. package/dist/resources/extensions/subagent/run-store.js +1 -1
  239. package/dist/resources/extensions/visual-brief/artifact-policy.js +1 -1
  240. package/dist/resources/extensions/visual-brief/index.js +1 -1
  241. package/dist/resources/extensions/visual-brief/page-contract.js +1 -1
  242. package/dist/resources/extensions/visual-brief/prompts.js +1 -1
  243. package/dist/resources/skills/api-design/SKILL.md +1 -1
  244. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  245. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  246. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  247. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +13 -4
  248. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +2 -0
  249. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  250. package/dist/resources/skills/observability/SKILL.md +4 -4
  251. package/dist/resources/skills/security-review/SKILL.md +1 -1
  252. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  253. package/dist/update-check.d.ts +5 -2
  254. package/dist/update-check.js +10 -7
  255. package/dist/update-cmd.d.ts +6 -1
  256. package/dist/update-cmd.js +4 -1
  257. package/dist/web/standalone/.next/BUILD_ID +1 -1
  258. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  259. package/dist/web/standalone/.next/build-manifest.json +3 -3
  260. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  261. package/dist/web/standalone/.next/required-server-files.json +4 -4
  262. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  263. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  265. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  267. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  268. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  269. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  270. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  271. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  272. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  273. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  275. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  276. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  277. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  278. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  279. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  280. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  281. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  282. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  283. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  284. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  286. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  287. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  289. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  290. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  291. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  292. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  295. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  297. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  298. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  300. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  301. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  303. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  304. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  306. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  307. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  308. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  309. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  310. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  312. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  313. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  314. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  315. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  316. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  317. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  318. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  319. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  321. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  322. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  323. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  324. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  325. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  326. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  327. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  328. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  329. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  330. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  331. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  332. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  333. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  334. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  335. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  336. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  337. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  338. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  339. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  340. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  341. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  342. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  343. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  344. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  345. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  346. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  347. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  348. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  349. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  350. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  351. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  352. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  353. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  354. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  355. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  356. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  357. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  358. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  359. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  360. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  361. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  362. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  363. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  364. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  365. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  366. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  367. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  368. package/dist/web/standalone/.next/server/app/index.html +1 -1
  369. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  370. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  371. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  372. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  373. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  374. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  375. package/dist/web/standalone/.next/server/app/page.js +2 -2
  376. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  377. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  378. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  379. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  380. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  381. package/dist/web/standalone/.next/server/middleware.js +2 -2
  382. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  383. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  384. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  385. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-a662c55787b78a48.js → page-74e2ce73b334a036.js} +1 -1
  386. package/dist/web/standalone/.next/static/chunks/app/layout-9059d39aaac392ff.js +1 -0
  387. package/dist/web/standalone/.next/static/chunks/app/page-abc53c69ef415841.js +1 -0
  388. package/dist/web/standalone/.next/static/chunks/{main-app-da6af500e9c35ea7.js → main-app-cd9a54b04f7d1b0b.js} +1 -1
  389. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-81274155375a5684.js +1 -0
  390. package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib → sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3} +0 -0
  391. package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/package.json +11 -5
  392. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +1 -0
  393. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  394. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +42 -0
  395. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +30 -0
  396. package/dist/web/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  397. package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/package.json +13 -7
  398. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/LICENSE +191 -0
  399. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  400. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
  401. package/dist/web/standalone/node_modules/node-pty/build/Makefile +369 -0
  402. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  403. package/dist/web/standalone/node_modules/node-pty/build/binding.Makefile +6 -0
  404. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +168 -0
  405. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.Makefile +6 -0
  406. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +106 -0
  407. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +110 -0
  408. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +106 -0
  409. package/dist/web/standalone/server.js +1 -1
  410. package/dist/welcome-screen.js +1 -1
  411. package/package.json +11 -7
  412. package/packages/contracts/dist/index.js +1 -1
  413. package/packages/contracts/dist/index.js.map +1 -1
  414. package/packages/contracts/dist/rpc.js +1 -1
  415. package/packages/contracts/dist/rpc.js.map +1 -1
  416. package/packages/contracts/dist/rpc.test.js +1 -1
  417. package/packages/contracts/dist/rpc.test.js.map +1 -1
  418. package/packages/contracts/dist/workflow.js +1 -1
  419. package/packages/contracts/dist/workflow.js.map +1 -1
  420. package/packages/contracts/package.json +1 -1
  421. package/packages/contracts/src/index.ts +1 -1
  422. package/packages/contracts/src/rpc.test.ts +1 -1
  423. package/packages/contracts/src/rpc.ts +1 -1
  424. package/packages/contracts/src/workflow.ts +1 -1
  425. package/packages/daemon/package.json +3 -3
  426. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  427. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  428. package/packages/mcp-server/package.json +3 -3
  429. package/packages/mcp-server/src/import-candidates.test.ts +1 -1
  430. package/packages/mcp-server/src/workflow-tools-parity.test.ts +1 -1
  431. package/packages/mcp-server/src/workflow-tools.test.ts +1 -1
  432. package/packages/mcp-server/src/workflow-tools.ts +1 -1
  433. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  434. package/packages/native/dist/grep/index.js +35 -1
  435. package/packages/native/dist/index.d.ts +1 -0
  436. package/packages/native/dist/index.js +4 -1
  437. package/packages/native/dist/native.d.ts +2 -0
  438. package/packages/native/dist/native.js +38 -25
  439. package/packages/native/dist/text/index.js +118 -6
  440. package/packages/native/dist/xxhash/index.d.ts +1 -2
  441. package/packages/native/dist/xxhash/index.js +7 -7
  442. package/packages/native/package.json +1 -1
  443. package/packages/native/src/__tests__/function-fallback.test.mjs +37 -0
  444. package/packages/native/src/__tests__/text-fallback.test.mjs +44 -0
  445. package/packages/native/src/grep/index.ts +38 -1
  446. package/packages/native/src/index.ts +2 -0
  447. package/packages/native/src/native.ts +37 -22
  448. package/packages/native/src/text/index.ts +145 -32
  449. package/packages/native/src/xxhash/index.ts +6 -9
  450. package/packages/native/tsconfig.tsbuildinfo +1 -1
  451. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  452. package/packages/pi-agent-core/dist/agent-loop.js +61 -5
  453. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  454. package/packages/pi-agent-core/dist/agent.d.ts +10 -0
  455. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  456. package/packages/pi-agent-core/dist/agent.js +14 -0
  457. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  458. package/packages/pi-agent-core/dist/token-audit.js +1 -1
  459. package/packages/pi-agent-core/dist/token-audit.js.map +1 -1
  460. package/packages/pi-agent-core/dist/types.d.ts +32 -0
  461. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  462. package/packages/pi-agent-core/dist/types.js.map +1 -1
  463. package/packages/pi-agent-core/package.json +1 -1
  464. package/packages/pi-agent-core/src/agent-loop.test.ts +162 -0
  465. package/packages/pi-agent-core/src/agent-loop.ts +110 -5
  466. package/packages/pi-agent-core/src/agent.ts +18 -0
  467. package/packages/pi-agent-core/src/token-audit.test.ts +1 -1
  468. package/packages/pi-agent-core/src/token-audit.ts +1 -1
  469. package/packages/pi-agent-core/src/types.ts +44 -0
  470. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  471. package/packages/pi-ai/dist/models/fake-model.d.ts +1 -1
  472. package/packages/pi-ai/dist/models/fake-model.js +1 -1
  473. package/packages/pi-ai/dist/models/fake-model.js.map +1 -1
  474. package/packages/pi-ai/dist/providers/api-family.js +1 -1
  475. package/packages/pi-ai/dist/providers/api-family.js.map +1 -1
  476. package/packages/pi-ai/dist/providers/api-family.test.js +1 -1
  477. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -1
  478. package/packages/pi-ai/dist/providers/fake.d.ts +1 -1
  479. package/packages/pi-ai/dist/providers/fake.js +1 -1
  480. package/packages/pi-ai/dist/providers/fake.js.map +1 -1
  481. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +1 -1
  482. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -1
  483. package/packages/pi-ai/dist/providers/provider-capabilities.js +1 -1
  484. package/packages/pi-ai/dist/providers/provider-capabilities.js.map +1 -1
  485. package/packages/pi-ai/dist/providers/provider-capabilities.test.js +1 -1
  486. package/packages/pi-ai/dist/providers/provider-capabilities.test.js.map +1 -1
  487. package/packages/pi-ai/dist/providers/transform-messages-report.test.js +1 -1
  488. package/packages/pi-ai/dist/providers/transform-messages-report.test.js.map +1 -1
  489. package/packages/pi-ai/dist/types.js.map +1 -1
  490. package/packages/pi-ai/package.json +1 -1
  491. package/packages/pi-ai/src/models/fake-model.ts +1 -1
  492. package/packages/pi-ai/src/providers/api-family.test.ts +1 -1
  493. package/packages/pi-ai/src/providers/api-family.ts +1 -1
  494. package/packages/pi-ai/src/providers/fake.ts +1 -1
  495. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +1 -1
  496. package/packages/pi-ai/src/providers/provider-capabilities.test.ts +1 -1
  497. package/packages/pi-ai/src/providers/provider-capabilities.ts +1 -1
  498. package/packages/pi-ai/src/providers/transform-messages-report.test.ts +1 -1
  499. package/packages/pi-ai/src/types.ts +1 -1
  500. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  501. package/packages/pi-coding-agent/dist/core/agent-session-command-errors.test.d.ts +2 -0
  502. package/packages/pi-coding-agent/dist/core/agent-session-command-errors.test.d.ts.map +1 -0
  503. package/packages/pi-coding-agent/dist/core/agent-session-command-errors.test.js +69 -0
  504. package/packages/pi-coding-agent/dist/core/agent-session-command-errors.test.js.map +1 -0
  505. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +1 -1
  506. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  507. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  508. package/packages/pi-coding-agent/dist/core/agent-session.js +52 -1
  509. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  510. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +1 -1
  511. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +1 -1
  513. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -1
  514. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +1 -1
  515. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -1
  516. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +1 -1
  517. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -1
  518. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +1 -1
  519. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -1
  520. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +1 -1
  521. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -1
  522. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
  523. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  524. package/packages/pi-coding-agent/dist/core/extensions/runner.js +37 -0
  525. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  526. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +32 -0
  527. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  528. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +1 -1
  530. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -1
  531. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  532. package/packages/pi-coding-agent/dist/core/model-discovery.js +5 -1
  533. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  534. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +21 -0
  535. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  536. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  537. package/packages/pi-coding-agent/dist/core/package-manager.js +4 -6
  538. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  539. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +1 -1
  540. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -1
  541. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  542. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  543. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +1 -1
  544. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  545. package/packages/pi-coding-agent/dist/core/skills.d.ts +10 -1
  546. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  547. package/packages/pi-coding-agent/dist/core/skills.js +13 -13
  548. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  549. package/packages/pi-coding-agent/dist/core/skills.test.d.ts +2 -0
  550. package/packages/pi-coding-agent/dist/core/skills.test.d.ts.map +1 -0
  551. package/packages/pi-coding-agent/dist/core/skills.test.js +69 -0
  552. package/packages/pi-coding-agent/dist/core/skills.test.js.map +1 -0
  553. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js +1 -1
  554. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js.map +1 -1
  555. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +1 -1
  556. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -1
  557. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +1 -1
  558. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -1
  559. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  560. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  561. package/packages/pi-coding-agent/dist/index.js +1 -1
  562. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  563. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +1 -1
  564. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -1
  565. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +1 -1
  566. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  567. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js +1 -1
  568. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js.map +1 -1
  569. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +1 -1
  570. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  571. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +1 -1
  572. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -1
  573. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +2 -2
  574. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  575. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +1 -1
  576. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -1
  577. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +1 -1
  578. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  579. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +1 -1
  580. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  581. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js +1 -1
  582. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js.map +1 -1
  583. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js +1 -1
  584. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js.map +1 -1
  585. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +1 -1
  586. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  587. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  588. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +1 -1
  589. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  590. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js +1 -1
  591. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js.map +1 -1
  592. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  593. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  594. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js +1 -1
  595. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js.map +1 -1
  596. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  597. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  598. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +1 -1
  599. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  600. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +1 -1
  601. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  602. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js +1 -1
  603. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js.map +1 -1
  604. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  605. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  606. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +1 -1
  607. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  608. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js +1 -1
  609. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js.map +1 -1
  610. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +1 -1
  611. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  612. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -1
  613. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  614. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +1 -1
  615. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  616. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +1 -1
  617. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  618. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js +1 -1
  619. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js.map +1 -1
  620. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +1 -1
  621. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  622. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +1 -1
  623. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  624. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js +1 -1
  625. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js.map +1 -1
  626. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js +1 -1
  627. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js.map +1 -1
  628. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  629. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  630. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js +1 -1
  631. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js.map +1 -1
  632. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js +1 -1
  633. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js.map +1 -1
  634. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +1 -1
  635. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -1
  636. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +2 -2
  637. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  638. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  639. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  640. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +1 -1
  641. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -1
  642. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +1 -1
  643. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -1
  644. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +1 -1
  645. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  646. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +1 -1
  647. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  648. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js +1 -1
  649. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js.map +1 -1
  650. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
  651. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  652. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -1
  653. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  654. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -1
  655. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  656. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js +1 -1
  657. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js.map +1 -1
  658. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +1 -1
  659. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  660. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +2 -2
  661. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  662. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +1 -1
  663. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -1
  664. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  665. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  666. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  667. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  668. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +1 -1
  669. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -1
  670. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +1 -1
  671. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  672. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +1 -1
  673. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -1
  674. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js +1 -1
  675. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js.map +1 -1
  676. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js +1 -1
  677. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js.map +1 -1
  678. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +1 -1
  679. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  680. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +1 -1
  681. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -1
  682. package/packages/pi-coding-agent/package.json +2 -2
  683. package/packages/pi-coding-agent/src/core/agent-session-command-errors.test.ts +79 -0
  684. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +1 -1
  685. package/packages/pi-coding-agent/src/core/agent-session.ts +52 -1
  686. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1 -1
  687. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +1 -1
  688. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +1 -1
  689. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +1 -1
  690. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +1 -1
  691. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +1 -1
  692. package/packages/pi-coding-agent/src/core/extensions/runner.ts +43 -0
  693. package/packages/pi-coding-agent/src/core/extensions/types.ts +43 -0
  694. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +1 -1
  695. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +22 -0
  696. package/packages/pi-coding-agent/src/core/model-discovery.ts +6 -1
  697. package/packages/pi-coding-agent/src/core/package-manager.ts +6 -10
  698. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +1 -1
  699. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  700. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +1 -1
  701. package/packages/pi-coding-agent/src/core/skills.test.ts +67 -0
  702. package/packages/pi-coding-agent/src/core/skills.ts +18 -15
  703. package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +1 -1
  704. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +1 -1
  705. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +1 -1
  706. package/packages/pi-coding-agent/src/index.ts +2 -0
  707. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +1 -1
  708. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +1 -1
  709. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +1 -1
  710. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +1 -1
  711. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +1 -1
  712. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +2 -2
  713. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +1 -1
  714. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +1 -1
  715. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +1 -1
  716. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +1 -1
  717. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +1 -1
  718. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +1 -1
  719. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -1
  720. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +1 -1
  721. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +1 -1
  722. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  723. package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +1 -1
  724. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  725. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +1 -1
  726. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +1 -1
  727. package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +1 -1
  728. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  729. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +1 -1
  730. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +1 -1
  731. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +1 -1
  732. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -1
  733. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +1 -1
  734. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +1 -1
  735. package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +1 -1
  736. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +1 -1
  737. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +1 -1
  738. package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +1 -1
  739. package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +1 -1
  740. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +1 -1
  741. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +1 -1
  742. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +1 -1
  743. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +1 -1
  744. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +2 -2
  745. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  746. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +1 -1
  747. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +1 -1
  748. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1 -1
  749. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +1 -1
  750. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +1 -1
  751. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +1 -1
  752. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -1
  753. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -1
  754. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +1 -1
  755. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +1 -1
  756. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +2 -2
  757. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +1 -1
  758. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +1 -1
  759. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  760. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +1 -1
  761. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +1 -1
  762. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +1 -1
  763. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +1 -1
  764. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +1 -1
  765. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +1 -1
  766. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +1 -1
  767. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  768. package/packages/pi-tui/dist/__tests__/keys.test.js +1 -1
  769. package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -1
  770. package/packages/pi-tui/dist/__tests__/style.test.js +1 -1
  771. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -1
  772. package/packages/pi-tui/dist/__tests__/tui.test.js +1 -1
  773. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  774. package/packages/pi-tui/dist/__tests__/utils.test.js +5 -2
  775. package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -1
  776. package/packages/pi-tui/dist/components/__tests__/box.test.js +1 -1
  777. package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -1
  778. package/packages/pi-tui/dist/components/__tests__/editor.test.js +1 -1
  779. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
  780. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +1 -1
  781. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -1
  782. package/packages/pi-tui/dist/components/box.js +1 -1
  783. package/packages/pi-tui/dist/components/box.js.map +1 -1
  784. package/packages/pi-tui/dist/components/editor.js +1 -1
  785. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  786. package/packages/pi-tui/dist/components/input.js +1 -1
  787. package/packages/pi-tui/dist/components/input.js.map +1 -1
  788. package/packages/pi-tui/dist/components/truncated-text.js +1 -1
  789. package/packages/pi-tui/dist/components/truncated-text.js.map +1 -1
  790. package/packages/pi-tui/dist/index.js +1 -1
  791. package/packages/pi-tui/dist/index.js.map +1 -1
  792. package/packages/pi-tui/dist/keys.js +1 -1
  793. package/packages/pi-tui/dist/keys.js.map +1 -1
  794. package/packages/pi-tui/dist/overlay-layout.js +1 -1
  795. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  796. package/packages/pi-tui/dist/style.js +1 -1
  797. package/packages/pi-tui/dist/style.js.map +1 -1
  798. package/packages/pi-tui/dist/tui.js +1 -1
  799. package/packages/pi-tui/dist/tui.js.map +1 -1
  800. package/packages/pi-tui/dist/utils.d.ts +3 -1
  801. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  802. package/packages/pi-tui/dist/utils.js +46 -2
  803. package/packages/pi-tui/dist/utils.js.map +1 -1
  804. package/packages/pi-tui/package.json +1 -1
  805. package/packages/pi-tui/src/__tests__/keys.test.ts +1 -1
  806. package/packages/pi-tui/src/__tests__/style.test.ts +1 -1
  807. package/packages/pi-tui/src/__tests__/tui.test.ts +1 -1
  808. package/packages/pi-tui/src/__tests__/utils.test.ts +6 -2
  809. package/packages/pi-tui/src/components/__tests__/box.test.ts +1 -1
  810. package/packages/pi-tui/src/components/__tests__/editor.test.ts +1 -1
  811. package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +1 -1
  812. package/packages/pi-tui/src/components/box.ts +1 -1
  813. package/packages/pi-tui/src/components/editor.ts +1 -1
  814. package/packages/pi-tui/src/components/input.ts +1 -1
  815. package/packages/pi-tui/src/components/truncated-text.ts +1 -1
  816. package/packages/pi-tui/src/index.ts +1 -1
  817. package/packages/pi-tui/src/keys.ts +1 -1
  818. package/packages/pi-tui/src/overlay-layout.ts +1 -1
  819. package/packages/pi-tui/src/style.ts +1 -1
  820. package/packages/pi-tui/src/tui.ts +1 -1
  821. package/packages/pi-tui/src/utils.ts +47 -2
  822. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  823. package/packages/rpc-client/dist/rpc-types.js +1 -1
  824. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  825. package/packages/rpc-client/package.json +2 -2
  826. package/packages/rpc-client/src/rpc-types.ts +1 -1
  827. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  828. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  829. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  830. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  831. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  832. package/pkg/package.json +1 -1
  833. package/scripts/install.js +36 -3
  834. package/scripts/lib/workspace-manifest.cjs +1 -1
  835. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +2 -2
  836. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +5 -5
  837. package/src/resources/extensions/github-sync/templates.ts +1 -1
  838. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +1 -1
  839. package/src/resources/extensions/github-sync/tests/templates.test.ts +1 -1
  840. package/src/resources/extensions/google-search/index.ts +1 -1
  841. package/src/resources/extensions/gsd/auto/contracts.ts +1 -1
  842. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +1 -1
  843. package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +1 -1
  844. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -0
  845. package/src/resources/extensions/gsd/auto/loop.ts +7 -2
  846. package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
  847. package/src/resources/extensions/gsd/auto/phases.ts +47 -4
  848. package/src/resources/extensions/gsd/auto/run-unit.ts +117 -45
  849. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +40 -0
  850. package/src/resources/extensions/gsd/auto/session.ts +1 -1
  851. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +1 -1
  852. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +1 -1
  853. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +1 -1
  854. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +1 -1
  855. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +1 -1
  856. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +1 -1
  857. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +1 -1
  858. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +1 -1
  859. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +1 -1
  860. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +1 -1
  861. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +1 -1
  862. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +1 -1
  863. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -1
  864. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +1 -1
  865. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +1 -1
  866. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +1 -1
  867. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +1 -1
  868. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +1 -1
  869. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +1 -1
  870. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  871. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +1 -1
  872. package/src/resources/extensions/gsd/auto-artifact-paths.ts +4 -3
  873. package/src/resources/extensions/gsd/auto-budget.ts +1 -1
  874. package/src/resources/extensions/gsd/auto-dashboard.ts +1 -1
  875. package/src/resources/extensions/gsd/auto-dispatch.ts +2 -1
  876. package/src/resources/extensions/gsd/auto-post-unit.ts +28 -1
  877. package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
  878. package/src/resources/extensions/gsd/auto-recovery.ts +132 -3
  879. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  880. package/src/resources/extensions/gsd/auto-status-message.ts +1 -1
  881. package/src/resources/extensions/gsd/auto-timers.ts +13 -4
  882. package/src/resources/extensions/gsd/auto-unit-closeout.ts +1 -1
  883. package/src/resources/extensions/gsd/auto-verification.ts +1 -1
  884. package/src/resources/extensions/gsd/auto-worktree-repair.ts +1 -1
  885. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  886. package/src/resources/extensions/gsd/auto.ts +37 -9
  887. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +5 -9
  888. package/src/resources/extensions/gsd/bootstrap/crash-log.ts +3 -4
  889. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +2 -1
  890. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  891. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  892. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +1 -1
  893. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +2 -2
  894. package/src/resources/extensions/gsd/bootstrap/plan-milestone-schema-recovery.ts +119 -0
  895. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  896. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +4 -3
  897. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -1
  898. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +1 -1
  899. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +81 -0
  900. package/src/resources/extensions/gsd/bootstrap/system-context.ts +2 -2
  901. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +1 -1
  902. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +1 -1
  903. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  904. package/src/resources/extensions/gsd/browser-evidence.ts +1 -1
  905. package/src/resources/extensions/gsd/closeout-recovery.ts +1 -1
  906. package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
  907. package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -1
  908. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  909. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +1 -1
  910. package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -2
  911. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  912. package/src/resources/extensions/gsd/commands-closeout.ts +1 -1
  913. package/src/resources/extensions/gsd/commands-ship.ts +1 -1
  914. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  915. package/src/resources/extensions/gsd/commands-workflow-templates.ts +1 -1
  916. package/src/resources/extensions/gsd/commands-worktree.ts +1 -1
  917. package/src/resources/extensions/gsd/component-loader.ts +1 -1
  918. package/src/resources/extensions/gsd/db/auto-workers.ts +1 -1
  919. package/src/resources/extensions/gsd/db/command-queue.ts +1 -1
  920. package/src/resources/extensions/gsd/db/milestone-leases.ts +20 -6
  921. package/src/resources/extensions/gsd/db/runtime-kv.ts +1 -1
  922. package/src/resources/extensions/gsd/db/unit-dispatches.ts +1 -1
  923. package/src/resources/extensions/gsd/db-adapter.ts +1 -1
  924. package/src/resources/extensions/gsd/db-base-schema.ts +1 -1
  925. package/src/resources/extensions/gsd/db-connection-cache.ts +1 -1
  926. package/src/resources/extensions/gsd/db-coordination-schema.ts +1 -1
  927. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +1 -1
  928. package/src/resources/extensions/gsd/db-gate-rows.ts +1 -1
  929. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +1 -1
  930. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +1 -1
  931. package/src/resources/extensions/gsd/db-migration-backup.ts +1 -1
  932. package/src/resources/extensions/gsd/db-migration-steps.ts +1 -1
  933. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +1 -1
  934. package/src/resources/extensions/gsd/db-open-state.ts +1 -1
  935. package/src/resources/extensions/gsd/db-provider.ts +1 -1
  936. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +1 -1
  937. package/src/resources/extensions/gsd/db-schema-metadata.ts +1 -1
  938. package/src/resources/extensions/gsd/db-task-slice-rows.ts +1 -1
  939. package/src/resources/extensions/gsd/db-transaction.ts +1 -1
  940. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +1 -1
  941. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +1 -1
  942. package/src/resources/extensions/gsd/doctor-git-checks.ts +1 -1
  943. package/src/resources/extensions/gsd/doctor-types.ts +1 -1
  944. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +1 -1
  945. package/src/resources/extensions/gsd/ecosystem/loader.ts +1 -1
  946. package/src/resources/extensions/gsd/escalation.ts +1 -1
  947. package/src/resources/extensions/gsd/fresh-run-ui.ts +1 -1
  948. package/src/resources/extensions/gsd/git-conflict-state.ts +1 -1
  949. package/src/resources/extensions/gsd/git-service.ts +1 -1
  950. package/src/resources/extensions/gsd/gsd-command-home.ts +1 -1
  951. package/src/resources/extensions/gsd/gsd-db.ts +1 -1
  952. package/src/resources/extensions/gsd/guided-unit-context.ts +1 -1
  953. package/src/resources/extensions/gsd/health-widget.ts +1 -1
  954. package/src/resources/extensions/gsd/knowledge-backfill.ts +1 -1
  955. package/src/resources/extensions/gsd/knowledge-capture.ts +1 -1
  956. package/src/resources/extensions/gsd/knowledge-parser.ts +1 -1
  957. package/src/resources/extensions/gsd/knowledge-projection.ts +1 -1
  958. package/src/resources/extensions/gsd/legacy-telemetry.ts +1 -4
  959. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  960. package/src/resources/extensions/gsd/md-importer.ts +2 -2
  961. package/src/resources/extensions/gsd/memory-backfill.ts +1 -1
  962. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  963. package/src/resources/extensions/gsd/metrics.ts +1 -1
  964. package/src/resources/extensions/gsd/migrate/audit.ts +8 -2
  965. package/src/resources/extensions/gsd/migrate/command.ts +31 -5
  966. package/src/resources/extensions/gsd/migrate/index.ts +1 -1
  967. package/src/resources/extensions/gsd/migrate/parser.ts +63 -10
  968. package/src/resources/extensions/gsd/migrate/parsers.ts +17 -0
  969. package/src/resources/extensions/gsd/migrate/preview.ts +1 -0
  970. package/src/resources/extensions/gsd/migrate/safety.ts +1 -1
  971. package/src/resources/extensions/gsd/migrate/transformer.ts +81 -6
  972. package/src/resources/extensions/gsd/migrate/types.ts +29 -1
  973. package/src/resources/extensions/gsd/migrate/validator.ts +25 -1
  974. package/src/resources/extensions/gsd/migrate/writer.ts +6 -1
  975. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +1 -1
  976. package/src/resources/extensions/gsd/model-router.ts +1 -1
  977. package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
  978. package/src/resources/extensions/gsd/orphan-stash-audit.ts +1 -1
  979. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
  980. package/src/resources/extensions/gsd/paths.ts +1 -1
  981. package/src/resources/extensions/gsd/pending-auto-start.ts +1 -1
  982. package/src/resources/extensions/gsd/planning-depth.ts +1 -1
  983. package/src/resources/extensions/gsd/post-execution-checks.ts +1 -1
  984. package/src/resources/extensions/gsd/pr-evidence.ts +1 -1
  985. package/src/resources/extensions/gsd/pre-execution-checks.ts +1 -1
  986. package/src/resources/extensions/gsd/preferences-skills.ts +4 -9
  987. package/src/resources/extensions/gsd/process-task-path.ts +1 -1
  988. package/src/resources/extensions/gsd/prompts/discuss-headless.md +6 -0
  989. package/src/resources/extensions/gsd/prompts/discuss.md +6 -0
  990. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -0
  991. package/src/resources/extensions/gsd/prompts/review-migration.md +2 -2
  992. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  993. package/src/resources/extensions/gsd/recovery-classification.ts +1 -1
  994. package/src/resources/extensions/gsd/repository-registry.ts +1 -1
  995. package/src/resources/extensions/gsd/root-write-leak-guard.ts +4 -1
  996. package/src/resources/extensions/gsd/schemas/parsers.ts +1 -1
  997. package/src/resources/extensions/gsd/schemas/validate.ts +1 -1
  998. package/src/resources/extensions/gsd/skill-catalog.ts +6 -3
  999. package/src/resources/extensions/gsd/skill-discovery.ts +5 -2
  1000. package/src/resources/extensions/gsd/skill-health.ts +3 -1
  1001. package/src/resources/extensions/gsd/skill-manifest.ts +1 -1
  1002. package/src/resources/extensions/gsd/skill-telemetry.ts +9 -9
  1003. package/src/resources/extensions/gsd/slice-cadence.ts +1 -1
  1004. package/src/resources/extensions/gsd/smart-entry-routing.ts +1 -1
  1005. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +1 -1
  1006. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +1 -1
  1007. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  1008. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +1 -1
  1009. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +1 -1
  1010. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +1 -1
  1011. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +1 -1
  1012. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +1 -1
  1013. package/src/resources/extensions/gsd/state-reconciliation/index.ts +1 -1
  1014. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +1 -1
  1015. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +1 -1
  1016. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -1
  1017. package/src/resources/extensions/gsd/state-reconciliation.ts +1 -1
  1018. package/src/resources/extensions/gsd/state.ts +9 -17
  1019. package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +1 -1
  1020. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +1 -1
  1021. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +1 -1
  1022. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +1 -1
  1023. package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +1 -1
  1024. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +156 -6
  1025. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +4 -4
  1026. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1 -1
  1027. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +102 -1
  1028. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +1 -1
  1029. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +22 -2
  1030. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +1 -1
  1031. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +1 -1
  1032. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +71 -56
  1033. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +1 -1
  1034. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +1 -1
  1035. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  1036. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -1
  1037. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +1 -1
  1038. package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +1 -1
  1039. package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +1 -1
  1040. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +1 -1
  1041. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +1 -1
  1042. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +1 -1
  1043. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +1 -1
  1044. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +1 -1
  1045. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +1 -1
  1046. package/src/resources/extensions/gsd/tests/brief-command.test.ts +1 -1
  1047. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +1 -1
  1048. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +1 -1
  1049. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +1 -1
  1050. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +1 -1
  1051. package/src/resources/extensions/gsd/tests/claude-skill-dirs.test.ts +13 -2
  1052. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +1 -1
  1053. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +1 -1
  1054. package/src/resources/extensions/gsd/tests/cmux.test.ts +1 -1
  1055. package/src/resources/extensions/gsd/tests/command-queue.test.ts +1 -1
  1056. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +1 -1
  1057. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +1 -1
  1058. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +1 -1
  1059. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +1 -1
  1060. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +3 -3
  1061. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +1 -1
  1062. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +1 -1
  1063. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +27 -0
  1064. package/src/resources/extensions/gsd/tests/component-loader.test.ts +1 -1
  1065. package/src/resources/extensions/gsd/tests/context-store.test.ts +1 -1
  1066. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +22 -0
  1067. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +1 -1
  1068. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +1 -1
  1069. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -1
  1070. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +1 -1
  1071. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  1072. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +1 -1
  1073. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +1 -1
  1074. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +1 -1
  1075. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +1 -1
  1076. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +1 -1
  1077. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +1 -1
  1078. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +1 -1
  1079. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +1 -1
  1080. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +1 -1
  1081. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +1 -1
  1082. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +1 -1
  1083. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +1 -1
  1084. package/src/resources/extensions/gsd/tests/db-provider.test.ts +1 -1
  1085. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +1 -1
  1086. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +1 -1
  1087. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -1
  1088. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +1 -1
  1089. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +1 -1
  1090. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +1 -1
  1091. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +1 -1
  1092. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +1 -1
  1093. package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +1 -1
  1094. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +1 -1
  1095. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -30
  1096. package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +1 -1
  1097. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -1
  1098. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +1 -1
  1099. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +1 -1
  1100. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +1 -1
  1101. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +1 -1
  1102. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +1 -1
  1103. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +1 -1
  1104. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +1 -1
  1105. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +1 -1
  1106. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +1 -1
  1107. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +1 -1
  1108. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -1
  1109. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  1110. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +1 -1
  1111. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +1 -1
  1112. package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +1 -1
  1113. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +1 -1
  1114. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +1 -1
  1115. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +1 -1
  1116. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +1 -1
  1117. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +1 -1
  1118. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +1 -1
  1119. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +1 -1
  1120. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +1 -1
  1121. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +1 -1
  1122. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +1 -1
  1123. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +1 -1
  1124. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +1 -1
  1125. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +1 -1
  1126. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +1 -1
  1127. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +1 -1
  1128. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +1 -1
  1129. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +1 -1
  1130. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +2 -2
  1131. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  1132. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +1 -1
  1133. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +0 -52
  1134. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +1 -1
  1135. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +1 -1
  1136. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +1 -1
  1137. package/src/resources/extensions/gsd/tests/integration/headless-command.ts +1 -1
  1138. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  1139. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  1140. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1 -23
  1141. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -28
  1142. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +1 -1
  1143. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +1 -1
  1144. package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +1 -1
  1145. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +1 -1
  1146. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +2 -32
  1147. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +1 -1
  1148. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +3 -3
  1149. package/src/resources/extensions/gsd/tests/md-importer.test.ts +23 -0
  1150. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +1 -1
  1151. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +1 -1
  1152. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  1153. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +1 -1
  1154. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +1 -1
  1155. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +1 -1
  1156. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +5 -3
  1157. package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +1 -1
  1158. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +1 -1
  1159. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +1 -1
  1160. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +74 -0
  1161. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +20 -2
  1162. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +61 -2
  1163. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +26 -2
  1164. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  1165. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +1 -1
  1166. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +1 -1
  1167. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  1168. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +1 -1
  1169. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +1 -1
  1170. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +1 -1
  1171. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +1 -1
  1172. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +1 -1
  1173. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +1 -1
  1174. package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +2 -2
  1175. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -1
  1176. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +1 -1
  1177. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +1 -158
  1178. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +1 -1
  1179. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +1 -1
  1180. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +1 -1
  1181. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +1 -1
  1182. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +1 -1
  1183. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  1184. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +2 -1
  1185. package/src/resources/extensions/gsd/tests/plan-milestone-schema-recovery.test.ts +59 -0
  1186. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -1
  1187. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -1
  1188. package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +1 -1
  1189. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +1 -1
  1190. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +1 -1
  1191. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +1 -1
  1192. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +1 -1
  1193. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +2 -2
  1194. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +1 -1
  1195. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -1
  1196. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +1 -1
  1197. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -0
  1198. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +1 -1
  1199. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +1 -1
  1200. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +1 -1
  1201. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +1 -1
  1202. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +63 -0
  1203. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +1 -1
  1204. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +1 -1
  1205. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +3 -4
  1206. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +1 -1
  1207. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +1 -1
  1208. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +0 -4
  1209. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +1 -1
  1210. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +1 -1
  1211. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +40 -0
  1212. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +1 -1
  1213. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -1
  1214. package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +1 -1
  1215. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +1 -1
  1216. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +1 -1
  1217. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +2 -2
  1218. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +1 -1
  1219. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +27 -10
  1220. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +1 -1
  1221. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +1 -1
  1222. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +5 -1
  1223. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +5 -1
  1224. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +1 -1
  1225. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +1 -1
  1226. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +1 -1
  1227. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -3
  1228. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1 -1
  1229. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +1 -1
  1230. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  1231. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +1 -1
  1232. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +1 -1
  1233. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +1 -1
  1234. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +1 -1
  1235. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +1 -1
  1236. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +1 -1
  1237. package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
  1238. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +1 -1
  1239. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +1 -1
  1240. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
  1241. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +9 -0
  1242. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +1 -1
  1243. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +1 -1
  1244. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +1 -1
  1245. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +3 -3
  1246. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -1
  1247. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +1 -1
  1248. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +1 -1
  1249. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +1 -1
  1250. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +1 -1
  1251. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +1 -1
  1252. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -1
  1253. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +1 -1
  1254. package/src/resources/extensions/gsd/tests/update-command.test.ts +62 -0
  1255. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +1 -1
  1256. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +1 -1
  1257. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -1
  1258. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +1 -1
  1259. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +1 -1
  1260. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +16 -7
  1261. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +1 -1
  1262. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +12 -1
  1263. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +1 -1
  1264. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +1 -1
  1265. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +1 -1
  1266. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +1 -1
  1267. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +1 -1
  1268. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +1 -1
  1269. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +1 -1
  1270. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +1 -1
  1271. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +1 -1
  1272. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +1 -1
  1273. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +1 -1
  1274. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +1 -1
  1275. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +1 -1
  1276. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +1 -1
  1277. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +1 -1
  1278. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +1 -1
  1279. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +1 -1
  1280. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +1 -1
  1281. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +1 -1
  1282. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +1 -1
  1283. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +1 -1
  1284. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +1 -1
  1285. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +1 -1
  1286. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +1 -1
  1287. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +1 -1
  1288. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +1 -1
  1289. package/src/resources/extensions/gsd/tests/workspace.test.ts +1 -1
  1290. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +2 -2
  1291. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  1292. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  1293. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  1294. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  1295. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  1296. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +1 -1
  1297. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +1 -1
  1298. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +1 -1
  1299. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +1 -1
  1300. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +1 -1
  1301. package/src/resources/extensions/gsd/tests/write-gate.test.ts +1 -1
  1302. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +1 -1
  1303. package/src/resources/extensions/gsd/tool-contract.ts +1 -1
  1304. package/src/resources/extensions/gsd/tools/complete-milestone.ts +2 -2
  1305. package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -1
  1306. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  1307. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +1 -1
  1308. package/src/resources/extensions/gsd/tools/exec-tool.ts +1 -1
  1309. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -1
  1310. package/src/resources/extensions/gsd/tools/validate-milestone.ts +1 -1
  1311. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  1312. package/src/resources/extensions/gsd/tui/render-kit.ts +1 -1
  1313. package/src/resources/extensions/gsd/types.ts +1 -1
  1314. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  1315. package/src/resources/extensions/gsd/unit-context-manifest.ts +1 -1
  1316. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  1317. package/src/resources/extensions/gsd/uok/audit.ts +1 -1
  1318. package/src/resources/extensions/gsd/uok/contracts.ts +1 -1
  1319. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +1 -1
  1320. package/src/resources/extensions/gsd/uok/kernel.ts +1 -1
  1321. package/src/resources/extensions/gsd/uok/loop-adapter.ts +1 -1
  1322. package/src/resources/extensions/gsd/uok/plan-v2.ts +1 -1
  1323. package/src/resources/extensions/gsd/uok/timeline.ts +1 -1
  1324. package/src/resources/extensions/gsd/validation-block-guard.ts +1 -1
  1325. package/src/resources/extensions/gsd/verification-gate.ts +28 -12
  1326. package/src/resources/extensions/gsd/verification-verdict.ts +10 -1
  1327. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -1
  1328. package/src/resources/extensions/gsd/watch/splash-palette.ts +1 -1
  1329. package/src/resources/extensions/gsd/workflow-manifest.ts +1 -1
  1330. package/src/resources/extensions/gsd/workflow-projections.ts +1 -1
  1331. package/src/resources/extensions/gsd/workflow-protocol.ts +1 -1
  1332. package/src/resources/extensions/gsd/workflow-reconcile.ts +8 -0
  1333. package/src/resources/extensions/gsd/workflow-templates.ts +1 -1
  1334. package/src/resources/extensions/gsd/working-output-messages.ts +1 -1
  1335. package/src/resources/extensions/gsd/workspace.ts +1 -1
  1336. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1 -1
  1337. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  1338. package/src/resources/extensions/gsd/worktree-safety.ts +1 -1
  1339. package/src/resources/extensions/gsd/worktree-state-projection.ts +1 -1
  1340. package/src/resources/extensions/mcp-client/manager.ts +1 -1
  1341. package/src/resources/extensions/mcp-client/tests/manager.test.ts +1 -1
  1342. package/src/resources/extensions/ollama/index.ts +1 -1
  1343. package/src/resources/extensions/ollama/model-capabilities.ts +16 -5
  1344. package/src/resources/extensions/ollama/ndjson-stream.ts +1 -1
  1345. package/src/resources/extensions/ollama/ollama-chat-provider.ts +41 -2
  1346. package/src/resources/extensions/ollama/ollama-client.ts +1 -1
  1347. package/src/resources/extensions/ollama/ollama-commands.ts +1 -1
  1348. package/src/resources/extensions/ollama/ollama-discovery.ts +49 -17
  1349. package/src/resources/extensions/ollama/ollama-tool.ts +1 -1
  1350. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +48 -3
  1351. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +1 -1
  1352. package/src/resources/extensions/ollama/tests/ollama-chat-provider-think.test.ts +87 -0
  1353. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +1 -1
  1354. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +1 -1
  1355. package/src/resources/extensions/ollama/tests/ollama-discovery-priority.test.ts +89 -0
  1356. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +44 -6
  1357. package/src/resources/extensions/ollama/thinking-parser.ts +1 -1
  1358. package/src/resources/extensions/ollama/types.ts +21 -1
  1359. package/src/resources/extensions/shared/cmux-events.ts +1 -1
  1360. package/src/resources/extensions/shared/gsd-phase-state.ts +1 -1
  1361. package/src/resources/extensions/shared/interview-ui.ts +1 -1
  1362. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +1 -1
  1363. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +1 -1
  1364. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +1 -1
  1365. package/src/resources/extensions/subagent/launch.ts +1 -1
  1366. package/src/resources/extensions/subagent/run-store.ts +1 -1
  1367. package/src/resources/extensions/subagent/tests/launch.test.ts +1 -1
  1368. package/src/resources/extensions/subagent/tests/run-store.test.ts +1 -1
  1369. package/src/resources/extensions/visual-brief/artifact-policy.ts +1 -1
  1370. package/src/resources/extensions/visual-brief/index.ts +1 -1
  1371. package/src/resources/extensions/visual-brief/page-contract.ts +1 -1
  1372. package/src/resources/extensions/visual-brief/prompts.ts +1 -1
  1373. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +1 -1
  1374. package/src/resources/skills/api-design/SKILL.md +1 -1
  1375. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  1376. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +1 -1
  1377. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  1378. package/src/resources/skills/create-skill/SKILL.md +3 -0
  1379. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +13 -4
  1380. package/src/resources/skills/create-skill/workflows/create-new-skill.md +2 -0
  1381. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  1382. package/src/resources/skills/observability/SKILL.md +4 -4
  1383. package/src/resources/skills/security-review/SKILL.md +1 -1
  1384. package/dist/web/standalone/.next/static/chunks/app/layout-82017658b76e2494.js +0 -1
  1385. package/dist/web/standalone/.next/static/chunks/app/page-d660442e70026068.js +0 -1
  1386. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1065c9a10c4c2187.js +0 -1
  1387. package/dist/web/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
  1388. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +0 -175
  1389. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -290
  1390. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -743
  1391. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +0 -138
  1392. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +0 -514
  1393. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -641
  1394. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -313
  1395. package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -1049
  1396. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -170
  1397. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +0 -206
  1398. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -149
  1399. package/src/resources/extensions/gsd/tests/headless-query.test.ts +0 -184
  1400. package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +0 -38
  1401. package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +0 -83
  1402. package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +0 -243
  1403. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
  1404. package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +0 -263
  1405. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +0 -90
  1406. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +0 -954
  1407. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -431
  1408. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +0 -549
  1409. package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +0 -612
  1410. package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +0 -539
  1411. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +0 -405
  1412. package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +0 -335
  1413. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +0 -248
  1414. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -347
  1415. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -253
  1416. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +0 -567
  1417. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -252
  1418. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +0 -609
  1419. package/src/resources/extensions/gsd/tests/requirements.test.ts +0 -110
  1420. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +0 -348
  1421. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
  1422. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1645
  1423. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -766
  1424. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  1425. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -216
  1426. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +0 -242
  1427. /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → zmk7-7Fvws2VUTifSEy0f}/_buildManifest.js +0 -0
  1428. /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → zmk7-7Fvws2VUTifSEy0f}/_ssgManifest.js +0 -0
  1429. /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/lib/index.js +0 -0
  1430. /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/versions.json +0 -0
  1431. /package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-tool-filter.test.js","sourceRoot":"","sources":["../../src/core/sdk-tool-filter.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Tests final provider request-time tool compatibility filtering.\n\nimport assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport { Type } from \"@sinclair/typebox\";\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { filterToolsForProviderRequest, getAdjustToolSetRequestCustomMessages } from \"./sdk.js\";\nimport { registerToolCompatibility, resetToolCompatibilityRegistry } from \"./tools/tool-compatibility-registry.js\";\n\nfunction tool(name: string): AgentTool {\n\treturn {\n\t\tname,\n\t\tlabel: name,\n\t\tdescription: name,\n\t\tparameters: Type.Object({}),\n\t\texecute: async () => ({ content: [], details: undefined }),\n\t};\n}\n\ntest(\"filterToolsForProviderRequest removes provider-incompatible tools\", () => {\n\tresetToolCompatibilityRegistry();\n\ttry {\n\t\tregisterToolCompatibility(\"image_result_tool\", { producesImages: true });\n\t\tregisterToolCompatibility(\"complex_schema_tool\", { schemaFeatures: [\"patternProperties\"] });\n\n\t\tconst result = filterToolsForProviderRequest(\n\t\t\t[tool(\"bash\"), tool(\"image_result_tool\"), tool(\"complex_schema_tool\")],\n\t\t\t{ api: \"google-generative-ai\", provider: \"google\" },\n\t\t);\n\n\t\tassert.deepEqual(result.compatible.map((entry) => entry.name), [\"bash\", \"image_result_tool\"]);\n\t\tassert.deepEqual(result.filtered.map((entry) => entry.name), [\"complex_schema_tool\"]);\n\t} finally {\n\t\tresetToolCompatibilityRegistry();\n\t}\n});\n\ntest(\"filterToolsForProviderRequest enforces provider-specific hard caps at send time\", () => {\n\tconst result = filterToolsForProviderRequest(\n\t\tArray.from({ length: 130 }, (_, index) => tool(`tool_${index}`)),\n\t\t{ api: \"openai-completions\", provider: \"groq\" },\n\t);\n\n\tassert.equal(result.compatible.length, 128);\n\tassert.deepEqual(result.filtered.map((entry) => entry.name), [\"tool_128\", \"tool_129\"]);\n});\n\ntest(\"getAdjustToolSetRequestCustomMessages only reports custom messages in the current request tail\", () => {\n\tconst messages = [\n\t\t{ role: \"custom\", customType: \"gsd-run\", content: \"old workflow\", display: false, timestamp: 1 },\n\t\t{ role: \"assistant\", content: [{ type: \"text\", text: \"done\" }], timestamp: 2 },\n\t\t{ role: \"user\", content: [{ type: \"text\", text: \"normal prompt\" }], timestamp: 3 },\n\t\t{ role: \"custom\", customType: \"gsd-doctor-heal\", content: \"current workflow\", display: false, timestamp: 4 },\n\t] as any[];\n\n\tassert.deepEqual(getAdjustToolSetRequestCustomMessages(messages), [\n\t\t{ index: 3, customType: \"gsd-doctor-heal\" },\n\t]);\n});\n"]}
1
+ {"version":3,"file":"sdk-tool-filter.test.js","sourceRoot":"","sources":["../../src/core/sdk-tool-filter.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Tests final provider request-time tool compatibility filtering.\n\nimport assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport { Type } from \"@sinclair/typebox\";\nimport type { AgentTool } from \"@gsd/pi-agent-core\";\nimport { filterToolsForProviderRequest, getAdjustToolSetRequestCustomMessages } from \"./sdk.js\";\nimport { registerToolCompatibility, resetToolCompatibilityRegistry } from \"./tools/tool-compatibility-registry.js\";\n\nfunction tool(name: string): AgentTool {\n\treturn {\n\t\tname,\n\t\tlabel: name,\n\t\tdescription: name,\n\t\tparameters: Type.Object({}),\n\t\texecute: async () => ({ content: [], details: undefined }),\n\t};\n}\n\ntest(\"filterToolsForProviderRequest removes provider-incompatible tools\", () => {\n\tresetToolCompatibilityRegistry();\n\ttry {\n\t\tregisterToolCompatibility(\"image_result_tool\", { producesImages: true });\n\t\tregisterToolCompatibility(\"complex_schema_tool\", { schemaFeatures: [\"patternProperties\"] });\n\n\t\tconst result = filterToolsForProviderRequest(\n\t\t\t[tool(\"bash\"), tool(\"image_result_tool\"), tool(\"complex_schema_tool\")],\n\t\t\t{ api: \"google-generative-ai\", provider: \"google\" },\n\t\t);\n\n\t\tassert.deepEqual(result.compatible.map((entry) => entry.name), [\"bash\", \"image_result_tool\"]);\n\t\tassert.deepEqual(result.filtered.map((entry) => entry.name), [\"complex_schema_tool\"]);\n\t} finally {\n\t\tresetToolCompatibilityRegistry();\n\t}\n});\n\ntest(\"filterToolsForProviderRequest enforces provider-specific hard caps at send time\", () => {\n\tconst result = filterToolsForProviderRequest(\n\t\tArray.from({ length: 130 }, (_, index) => tool(`tool_${index}`)),\n\t\t{ api: \"openai-completions\", provider: \"groq\" },\n\t);\n\n\tassert.equal(result.compatible.length, 128);\n\tassert.deepEqual(result.filtered.map((entry) => entry.name), [\"tool_128\", \"tool_129\"]);\n});\n\ntest(\"getAdjustToolSetRequestCustomMessages only reports custom messages in the current request tail\", () => {\n\tconst messages = [\n\t\t{ role: \"custom\", customType: \"gsd-run\", content: \"old workflow\", display: false, timestamp: 1 },\n\t\t{ role: \"assistant\", content: [{ type: \"text\", text: \"done\" }], timestamp: 2 },\n\t\t{ role: \"user\", content: [{ type: \"text\", text: \"normal prompt\" }], timestamp: 3 },\n\t\t{ role: \"custom\", customType: \"gsd-doctor-heal\", content: \"current workflow\", display: false, timestamp: 4 },\n\t] as any[];\n\n\tassert.deepEqual(getAdjustToolSetRequestCustomMessages(messages), [\n\t\t{ index: 3, customType: \"gsd-doctor-heal\" },\n\t]);\n});\n"]}
@@ -1,4 +1,4 @@
1
- // GSD2 - Coding agent session factory and runtime wiring
1
+ // gsd-pi - Coding agent session factory and runtime wiring
2
2
  import { existsSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD2 - Coding agent session factory and runtime wiring\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Lightweight PATH scan for the `claude` binary — no subprocess, no network.\n * Mirrors the check in src/resources/extensions/gsd/doctor-providers.ts so the\n * legacy Anthropic OAuth self-heal path can only trigger when the user has a\n * working Claude Code CLI to fall back to.\n */\nfunction isClaudeCodeBinaryInPath(): boolean {\n\tconst pathDirs = (process.env.PATH ?? \"\").split(\":\");\n\treturn pathDirs.some((dir) => dir && existsSync(join(dir, \"claude\")));\n}\n\n/**\n * Structured error thrown when all credentials for a provider are in a\n * backoff window. Carries typed metadata so callers (e.g. the auto-loop)\n * can make informed retry decisions instead of string-matching the message.\n */\nexport class CredentialCooldownError extends Error {\n\treadonly code = \"AUTH_COOLDOWN\" as const;\n\t/** Milliseconds until the earliest credential becomes available, or undefined if unknown. */\n\treadonly retryAfterMs: number | undefined;\n\n\tconstructor(provider: string, retryAfterMs?: number) {\n\t\tsuper(\n\t\t\t`All credentials for \"${provider}\" are in a cooldown window. ` +\n\t\t\t\t`Please wait a moment and try again, or switch to a different provider.`,\n\t\t);\n\t\tthis.name = \"CredentialCooldownError\";\n\t\tthis.retryAfterMs = retryAfterMs;\n\t}\n}\n\nexport function canRestoreSessionModel(\n\tmodelRegistry: Pick<ModelRegistry, \"isProviderRequestReady\">,\n\tmodel: Model<any>,\n): boolean {\n\treturn modelRegistry.isProviderRequestReady(model.provider);\n}\n\nconst PROVIDER_TOOL_LIMITS: Record<string, number> = {\n\tgroq: 128,\n};\n\nfunction resolveProviderToolLimit(\n\tproviderCaps: ReturnType<typeof getProviderCapabilities>,\n\tprovider: string | undefined,\n): number {\n\tif (provider && PROVIDER_TOOL_LIMITS[provider]) {\n\t\treturn PROVIDER_TOOL_LIMITS[provider];\n\t}\n\treturn providerCaps.maxTools > 0 ? providerCaps.maxTools : 0;\n}\n\nexport function filterToolsForProviderRequest(\n\ttools: AgentTool[],\n\tmodel: Pick<Model<any>, \"api\" | \"provider\">,\n): { compatible: AgentTool[]; filtered: AgentTool[] } {\n\tconst providerCaps = getProviderCapabilities(model.api);\n\tif (!providerCaps.toolCalling) {\n\t\treturn { compatible: [], filtered: tools };\n\t}\n\n\tconst compatible: AgentTool[] = [];\n\tconst filtered: AgentTool[] = [];\n\tfor (const tool of tools) {\n\t\tconst compat = getToolCompatibility(tool.name);\n\t\tif (\n\t\t\t(compat?.producesImages && !providerCaps.imageToolResults) ||\n\t\t\tcompat?.schemaFeatures?.some((feature) => providerCaps.unsupportedSchemaFeatures.includes(feature))\n\t\t) {\n\t\t\tfiltered.push(tool);\n\t\t} else {\n\t\t\tcompatible.push(tool);\n\t\t}\n\t}\n\n\tconst toolLimit = resolveProviderToolLimit(providerCaps, model.provider);\n\tif (toolLimit > 0 && compatible.length > toolLimit) {\n\t\tfiltered.push(...compatible.splice(toolLimit));\n\t}\n\n\treturn { compatible, filtered };\n}\nimport { Agent, maybeLogProviderPayloadAudit, type AgentMessage, type AgentTool, type ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport { getProviderCapabilities, type Message, type Model } from \"@gsd/pi-ai\";\nimport { getAgentDir, getDocsPath } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, ToolDefinition } from \"./extensions/index.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tallTools,\n\tbashTool,\n\tcodingTools,\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\teditTool,\n\tfindTool,\n\tgrepTool,\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n\tlsTool,\n\treadOnlyTools,\n\treadTool,\n\ttype Tool,\n\ttype ToolName,\n\twriteTool,\n} from \"./tools/index.js\";\nimport { getToolCompatibility } from \"./tools/tool-compatibility-registry.js\";\n\nexport function getAdjustToolSetRequestCustomMessages(\n\tmessages: readonly AgentMessage[] | undefined,\n): Array<{ index: number; customType: string }> {\n\tif (!messages) return [];\n\tconst requestMessages: Array<{ index: number; customType: string }> = [];\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index] as { role?: unknown; customType?: unknown };\n\t\tif (message?.role === \"assistant\") break;\n\t\tif (message?.role === \"custom\" && typeof message.customType === \"string\") {\n\t\t\trequestMessages.push({ index, customType: message.customType });\n\t\t}\n\t}\n\treturn requestMessages.reverse();\n}\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json) */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: new ModelRegistry(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/** Built-in tools to use. Default: codingTools [read, bash, edit, write] */\n\ttools?: Tool[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\t/**\n\t * Additional tool names to activate after extensions/MCP servers register.\n\t * Names that are not registered by any extension are silently ignored\n\t * by AgentSession.setActiveToolsByName.\n\t *\n\t * Used by --tools to forward names that don't match a built-in (likely\n\t * extension- or MCP-provided), so subagents whose frontmatter declares\n\t * extension tools don't end up with an empty tool list.\n\t */\n\textraActiveToolNames?: string[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\n\t/** Optional: check if the claude-code CLI provider is ready (installed + authed).\n\t * Passed to RetryHandler for third-party block recovery (#3772). */\n\tisClaudeCodeReady?: () => boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandLocation,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport {\n\t// Pre-built tools (use process.cwd())\n\treadTool,\n\tbashTool,\n\teditTool,\n\twriteTool,\n\tgrepTool,\n\tfindTool,\n\tlsTool,\n\tcodingTools,\n\treadOnlyTools,\n\tallTools as allBuiltInTools,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n\t// Hashline edit mode\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@gsd/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [readTool, bashTool],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\t// Use provided or create AuthStorage and ModelRegistry\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd);\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Flush provider registrations queued during extension loading so that\n\t// extension models (e.g. pi-claude-cli) are visible in the registry before\n\t// findInitialModel() runs. bindCore() repeats this flush as a safety net\n\t// for any late-arriving registrations.\n\tconst { runtime: extensionRuntime } = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionRuntime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\textensionRuntime.pendingProviderRegistrations = [];\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);\n\t\t\tif (restoredModel && canRestoreSessionModel(modelRegistry, restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// Flush extension provider registrations so extension-provided models (e.g. claude-code/*)\n\t// are available in the registry before model resolution. Without this, findInitialModel()\n\t// cannot find extension models and falls back to built-in providers (#3534).\n\tconst extensionsForModelResolution = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionsForModelResolution.runtime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\t// Clear the queue so bindCore() doesn't re-register the same providers.\n\textensionsForModelResolution.runtime.pendingProviderRegistrations = [];\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRegistry,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}. Then use /model to select a model.`;\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model || !model.reasoning) {\n\t\tthinkingLevel = \"off\";\n\t}\n\n\tconst editMode = settingsManager.getEditMode();\n\tconst defaultActiveToolNames: ToolName[] = editMode === \"hashline\"\n\t\t? [\"hashline_read\", \"bash\", \"hashline_edit\", \"write\", \"lsp\"]\n\t\t: [\"read\", \"bash\", \"edit\", \"write\", \"lsp\"];\n\tconst builtinActiveToolNames: ToolName[] = options.tools\n\t\t? options.tools.map((t) => t.name).filter((n): n is ToolName => n in allTools)\n\t\t: defaultActiveToolNames;\n\t// Merge in extension/MCP tool names from --tools that didn't match a built-in.\n\t// AgentSession.setActiveToolsByName silently drops names that aren't in the\n\t// registry, so unknown names are harmless here.\n\tconst initialActiveToolNames: string[] = options.extraActiveToolNames\n\t\t? [...builtinActiveToolNames, ...options.extraActiveToolNames]\n\t\t: builtinActiveToolNames;\n\n\tlet agent: Agent;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\tconst workspaceRootRef: { current: string } = { current: cwd };\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tonPayload: async (payload, currentModel) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\tmaybeLogProviderPayloadAudit(payload, \"before_provider_request:unchanged\");\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\tconst nextPayload = await runner.emitBeforeProviderRequest(payload, currentModel);\n\t\t\tmaybeLogProviderPayloadAudit(nextPayload, \"before_provider_request:after\");\n\t\t\treturn nextPayload;\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tfilterTools: async (tools, _signal, messages) => {\n\t\t\tconst currentModel = agent.state.activeInferenceModel ?? agent.state.model ?? model;\n\t\t\tif (!currentModel) return tools;\n\t\t\tconst providerFiltered = filterToolsForProviderRequest(tools, currentModel);\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"adjust_tool_set\")) return providerFiltered.compatible;\n\t\t\tconst result = await runner.emitAdjustToolSet({\n\t\t\t\tselectedModelApi: currentModel.api,\n\t\t\t\tselectedModelProvider: currentModel.provider,\n\t\t\t\tselectedModelId: currentModel.id,\n\t\t\t\tactiveToolNames: providerFiltered.compatible.map((tool) => tool.name),\n\t\t\t\tfilteredTools: providerFiltered.filtered.map((tool) => tool.name),\n\t\t\t\trequestCustomMessages: getAdjustToolSetRequestCustomMessages(messages),\n\t\t\t});\n\t\t\tif (!result?.toolNames) return providerFiltered.compatible;\n\t\t\tconst allowedNames = new Set(result.toolNames);\n\t\t\treturn providerFiltered.compatible.filter((tool) => allowedNames.has(tool.name));\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getRetrySettings().maxDelayMs,\n\t\texternalToolExecution: (m) => modelRegistry.getProviderAuthMode(m.provider) === \"externalCli\",\n\t\tgetProviderOptions: async (currentModel) => {\n\t\t\tif (currentModel.provider !== \"claude-code\") return undefined;\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) {\n\t\t\t\treturn { cwd: workspaceRootRef.current };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcwd: workspaceRootRef.current,\n\t\t\t\t...(runner.hasUI() ? { extensionUIContext: runner.getUIContext() } : {}),\n\t\t\t\tonExternalToolCall: async (toolCall: { id: string; name: string; arguments: Record<string, unknown> }) => {\n\t\t\t\t\tif (!runner.hasHandlers(\"tool_call\")) return;\n\t\t\t\t\tawait runner.emitToolCall({\n\t\t\t\t\t\ttype: \"tool_call\",\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tinput: toolCall.arguments,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonExternalToolResult: async (event: {\n\t\t\t\t\ttoolCall: { id: string; name: string; arguments: Record<string, unknown> };\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t\t\t\t\t\tdetails?: Record<string, unknown>;\n\t\t\t\t\t\tisError: boolean;\n\t\t\t\t\t};\n\t\t\t\t}) => {\n\t\t\t\t\tif (!runner.hasHandlers(\"tool_result\")) return;\n\t\t\t\t\tconst content = event.result.content.map((block) => {\n\t\t\t\t\t\tif (block.type === \"image\" && typeof block.data === \"string\" && typeof block.mimeType === \"string\") {\n\t\t\t\t\t\t\treturn { type: \"image\" as const, data: block.data, mimeType: block.mimeType };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { type: \"text\" as const, text: typeof block.text === \"string\" ? block.text : \"\" };\n\t\t\t\t\t});\n\t\t\t\t\tawait runner.emitToolResult({\n\t\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\t\ttoolCallId: event.toolCall.id,\n\t\t\t\t\t\ttoolName: event.toolCall.name,\n\t\t\t\t\t\tinput: event.toolCall.arguments,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\tdetails: event.result.details,\n\t\t\t\t\t\tisError: event.result.isError,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tgetApiKey: async (provider) => {\n\t\t\t// Use the provider argument from the in-flight request;\n\t\t\t// agent.state.model may already be switched mid-turn.\n\t\t\tconst resolvedProvider = provider || agent.state.model?.provider;\n\t\t\tif (!resolvedProvider) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\t\t\tconst authMode = modelRegistry.getProviderAuthMode(resolvedProvider);\n\t\t\tif (authMode === \"externalCli\" || authMode === \"none\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// Retry key resolution with backoff to handle transient network failures\n\t\t\t// (e.g., OAuth token refresh failing due to brief connectivity loss).\n\t\t\t// When credentials are in a cooldown window (e.g., after a 429), wait\n\t\t\t// for the backoff to expire instead of using fixed delays that are\n\t\t\t// shorter than the cooldown duration.\n\t\t\tconst maxAttempts = 3;\n\t\t\tconst baseDelayMs = 2000;\n\t\t\tconst maxCooldownWaitMs = 60_000; // Don't wait longer than 60s (skip quota-exhausted 30min backoffs)\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tconst key = await modelRegistry.getApiKeyForProvider(resolvedProvider);\n\t\t\t\tif (key) return key;\n\n\t\t\t\t// On the last attempt, fall through to error handling below\n\t\t\t\tif (attempt >= maxAttempts) break;\n\n\t\t\t\t// Only retry if credentials exist (network issue) — no point retrying\n\t\t\t\t// when there are genuinely no credentials configured.\n\t\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\t\tconst model = agent.state.model;\n\t\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\t\tif (!hasAuth && !isOAuth) break;\n\n\t\t\t\t// If credentials are in a cooldown window, wait for the earliest\n\t\t\t\t// one to expire rather than using a fixed delay that's too short.\n\t\t\t\tconst backoffExpiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tif (backoffExpiry !== undefined) {\n\t\t\t\t\tconst waitMs = backoffExpiry - Date.now() + 500; // 500ms buffer\n\t\t\t\t\tif (waitMs > 0 && waitMs <= maxCooldownWaitMs) {\n\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, waitMs));\n\t\t\t\t\t\tcontinue; // Retry immediately after cooldown clears\n\t\t\t\t\t}\n\t\t\t\t\tif (waitMs > maxCooldownWaitMs) {\n\t\t\t\t\t\tbreak; // Quota-exhausted or very long backoff — don't block\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Standard exponential backoff for non-cooldown transient failures\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, baseDelayMs * attempt));\n\t\t\t}\n\n\t\t\t// All retries exhausted — throw descriptive error.\n\t\t\t// Check if credentials exist but are temporarily in a backoff window\n\t\t\t// (e.g., after a 429). This message intentionally avoids phrases like\n\t\t\t// \"rate limit\" / \"429\" to prevent isRetryableError() from re-entering\n\t\t\t// the retry handler and creating cascading error entries (#3429).\n\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\tif (hasAuth) {\n\t\t\t\t// Anthropic OAuth was removed in v2.74.0 for TOS compliance (#3952).\n\t\t\t\t// Users who upgraded from an older version may still have OAuth\n\t\t\t\t// credentials in auth.json that will never resolve to a valid API key.\n\t\t\t\tif (\n\t\t\t\t\tresolvedProvider === \"anthropic\" &&\n\t\t\t\t\tmodelRegistry.authStorage.hasLegacyOAuthCredential(resolvedProvider)\n\t\t\t\t) {\n\t\t\t\t\t// Self-heal: strip the stale oauth entry so hasAuth() stops lying\n\t\t\t\t\t// about anthropic being configured. This preserves any api_key\n\t\t\t\t\t// credentials alongside it.\n\t\t\t\t\tconst removed = modelRegistry.authStorage.removeLegacyOAuthCredential(resolvedProvider);\n\t\t\t\t\tif (removed) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[auth] Removed unsupported Anthropic OAuth credential from auth.json.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (isClaudeCodeBinaryInPath()) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +\n\t\t\t\t\t\t\t\t`Your current model's provider is set to \"anthropic\" but the local Claude Code CLI ` +\n\t\t\t\t\t\t\t\t`is available — switch the model's provider to \"claude-code\" in your preferences ` +\n\t\t\t\t\t\t\t\t`to use it, or set ANTHROPIC_API_KEY to continue with the Anthropic API directly.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +\n\t\t\t\t\t\t\t`Set ANTHROPIC_API_KEY, run '/login' and paste an API key, or switch to a different provider.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t}\n\t\t\tconst model = agent.state.model;\n\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\tif (isOAuth) {\n\t\t\t\t// If credentials exist but are all in a backoff window (quota / rate-limit),\n\t\t\t\t// surface a specific message instead of the misleading \"Authentication failed\".\n\t\t\t\tif (modelRegistry.authStorage.areAllCredentialsBackedOff(resolvedProvider)) {\n\t\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${resolvedProvider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for \"${resolvedProvider}\". ` +\n\t\t\t\t\t`Set an API key environment variable or run '/login ${resolvedProvider}'.`,\n\t\t\t);\n\t\t},\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.replaceMessages(existingSession.messages);\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRegistry,\n\t\tinitialActiveToolNames,\n\t\textensionRunnerRef,\n\t\tworkspaceRootRef,\n\t\tisClaudeCodeReady: options.isClaudeCodeReady,\n\t});\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi - Coding agent session factory and runtime wiring\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Lightweight PATH scan for the `claude` binary — no subprocess, no network.\n * Mirrors the check in src/resources/extensions/gsd/doctor-providers.ts so the\n * legacy Anthropic OAuth self-heal path can only trigger when the user has a\n * working Claude Code CLI to fall back to.\n */\nfunction isClaudeCodeBinaryInPath(): boolean {\n\tconst pathDirs = (process.env.PATH ?? \"\").split(\":\");\n\treturn pathDirs.some((dir) => dir && existsSync(join(dir, \"claude\")));\n}\n\n/**\n * Structured error thrown when all credentials for a provider are in a\n * backoff window. Carries typed metadata so callers (e.g. the auto-loop)\n * can make informed retry decisions instead of string-matching the message.\n */\nexport class CredentialCooldownError extends Error {\n\treadonly code = \"AUTH_COOLDOWN\" as const;\n\t/** Milliseconds until the earliest credential becomes available, or undefined if unknown. */\n\treadonly retryAfterMs: number | undefined;\n\n\tconstructor(provider: string, retryAfterMs?: number) {\n\t\tsuper(\n\t\t\t`All credentials for \"${provider}\" are in a cooldown window. ` +\n\t\t\t\t`Please wait a moment and try again, or switch to a different provider.`,\n\t\t);\n\t\tthis.name = \"CredentialCooldownError\";\n\t\tthis.retryAfterMs = retryAfterMs;\n\t}\n}\n\nexport function canRestoreSessionModel(\n\tmodelRegistry: Pick<ModelRegistry, \"isProviderRequestReady\">,\n\tmodel: Model<any>,\n): boolean {\n\treturn modelRegistry.isProviderRequestReady(model.provider);\n}\n\nconst PROVIDER_TOOL_LIMITS: Record<string, number> = {\n\tgroq: 128,\n};\n\nfunction resolveProviderToolLimit(\n\tproviderCaps: ReturnType<typeof getProviderCapabilities>,\n\tprovider: string | undefined,\n): number {\n\tif (provider && PROVIDER_TOOL_LIMITS[provider]) {\n\t\treturn PROVIDER_TOOL_LIMITS[provider];\n\t}\n\treturn providerCaps.maxTools > 0 ? providerCaps.maxTools : 0;\n}\n\nexport function filterToolsForProviderRequest(\n\ttools: AgentTool[],\n\tmodel: Pick<Model<any>, \"api\" | \"provider\">,\n): { compatible: AgentTool[]; filtered: AgentTool[] } {\n\tconst providerCaps = getProviderCapabilities(model.api);\n\tif (!providerCaps.toolCalling) {\n\t\treturn { compatible: [], filtered: tools };\n\t}\n\n\tconst compatible: AgentTool[] = [];\n\tconst filtered: AgentTool[] = [];\n\tfor (const tool of tools) {\n\t\tconst compat = getToolCompatibility(tool.name);\n\t\tif (\n\t\t\t(compat?.producesImages && !providerCaps.imageToolResults) ||\n\t\t\tcompat?.schemaFeatures?.some((feature) => providerCaps.unsupportedSchemaFeatures.includes(feature))\n\t\t) {\n\t\t\tfiltered.push(tool);\n\t\t} else {\n\t\t\tcompatible.push(tool);\n\t\t}\n\t}\n\n\tconst toolLimit = resolveProviderToolLimit(providerCaps, model.provider);\n\tif (toolLimit > 0 && compatible.length > toolLimit) {\n\t\tfiltered.push(...compatible.splice(toolLimit));\n\t}\n\n\treturn { compatible, filtered };\n}\nimport { Agent, maybeLogProviderPayloadAudit, type AgentMessage, type AgentTool, type ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport { getProviderCapabilities, type Message, type Model } from \"@gsd/pi-ai\";\nimport { getAgentDir, getDocsPath } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, ToolDefinition } from \"./extensions/index.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tallTools,\n\tbashTool,\n\tcodingTools,\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\teditTool,\n\tfindTool,\n\tgrepTool,\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n\tlsTool,\n\treadOnlyTools,\n\treadTool,\n\ttype Tool,\n\ttype ToolName,\n\twriteTool,\n} from \"./tools/index.js\";\nimport { getToolCompatibility } from \"./tools/tool-compatibility-registry.js\";\n\nexport function getAdjustToolSetRequestCustomMessages(\n\tmessages: readonly AgentMessage[] | undefined,\n): Array<{ index: number; customType: string }> {\n\tif (!messages) return [];\n\tconst requestMessages: Array<{ index: number; customType: string }> = [];\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst message = messages[index] as { role?: unknown; customType?: unknown };\n\t\tif (message?.role === \"assistant\") break;\n\t\tif (message?.role === \"custom\" && typeof message.customType === \"string\") {\n\t\t\trequestMessages.push({ index, customType: message.customType });\n\t\t}\n\t}\n\treturn requestMessages.reverse();\n}\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json) */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: new ModelRegistry(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/** Built-in tools to use. Default: codingTools [read, bash, edit, write] */\n\ttools?: Tool[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\t/**\n\t * Additional tool names to activate after extensions/MCP servers register.\n\t * Names that are not registered by any extension are silently ignored\n\t * by AgentSession.setActiveToolsByName.\n\t *\n\t * Used by --tools to forward names that don't match a built-in (likely\n\t * extension- or MCP-provided), so subagents whose frontmatter declares\n\t * extension tools don't end up with an empty tool list.\n\t */\n\textraActiveToolNames?: string[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\n\t/** Optional: check if the claude-code CLI provider is ready (installed + authed).\n\t * Passed to RetryHandler for third-party block recovery (#3772). */\n\tisClaudeCodeReady?: () => boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandLocation,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport {\n\t// Pre-built tools (use process.cwd())\n\treadTool,\n\tbashTool,\n\teditTool,\n\twriteTool,\n\tgrepTool,\n\tfindTool,\n\tlsTool,\n\tcodingTools,\n\treadOnlyTools,\n\tallTools as allBuiltInTools,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n\t// Hashline edit mode\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@gsd/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [readTool, bashTool],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\t// Use provided or create AuthStorage and ModelRegistry\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd);\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Flush provider registrations queued during extension loading so that\n\t// extension models (e.g. pi-claude-cli) are visible in the registry before\n\t// findInitialModel() runs. bindCore() repeats this flush as a safety net\n\t// for any late-arriving registrations.\n\tconst { runtime: extensionRuntime } = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionRuntime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\textensionRuntime.pendingProviderRegistrations = [];\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);\n\t\t\tif (restoredModel && canRestoreSessionModel(modelRegistry, restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// Flush extension provider registrations so extension-provided models (e.g. claude-code/*)\n\t// are available in the registry before model resolution. Without this, findInitialModel()\n\t// cannot find extension models and falls back to built-in providers (#3534).\n\tconst extensionsForModelResolution = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionsForModelResolution.runtime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\t// Clear the queue so bindCore() doesn't re-register the same providers.\n\textensionsForModelResolution.runtime.pendingProviderRegistrations = [];\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRegistry,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}. Then use /model to select a model.`;\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model || !model.reasoning) {\n\t\tthinkingLevel = \"off\";\n\t}\n\n\tconst editMode = settingsManager.getEditMode();\n\tconst defaultActiveToolNames: ToolName[] = editMode === \"hashline\"\n\t\t? [\"hashline_read\", \"bash\", \"hashline_edit\", \"write\", \"lsp\"]\n\t\t: [\"read\", \"bash\", \"edit\", \"write\", \"lsp\"];\n\tconst builtinActiveToolNames: ToolName[] = options.tools\n\t\t? options.tools.map((t) => t.name).filter((n): n is ToolName => n in allTools)\n\t\t: defaultActiveToolNames;\n\t// Merge in extension/MCP tool names from --tools that didn't match a built-in.\n\t// AgentSession.setActiveToolsByName silently drops names that aren't in the\n\t// registry, so unknown names are harmless here.\n\tconst initialActiveToolNames: string[] = options.extraActiveToolNames\n\t\t? [...builtinActiveToolNames, ...options.extraActiveToolNames]\n\t\t: builtinActiveToolNames;\n\n\tlet agent: Agent;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\tconst workspaceRootRef: { current: string } = { current: cwd };\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tonPayload: async (payload, currentModel) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\tmaybeLogProviderPayloadAudit(payload, \"before_provider_request:unchanged\");\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\tconst nextPayload = await runner.emitBeforeProviderRequest(payload, currentModel);\n\t\t\tmaybeLogProviderPayloadAudit(nextPayload, \"before_provider_request:after\");\n\t\t\treturn nextPayload;\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tfilterTools: async (tools, _signal, messages) => {\n\t\t\tconst currentModel = agent.state.activeInferenceModel ?? agent.state.model ?? model;\n\t\t\tif (!currentModel) return tools;\n\t\t\tconst providerFiltered = filterToolsForProviderRequest(tools, currentModel);\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"adjust_tool_set\")) return providerFiltered.compatible;\n\t\t\tconst result = await runner.emitAdjustToolSet({\n\t\t\t\tselectedModelApi: currentModel.api,\n\t\t\t\tselectedModelProvider: currentModel.provider,\n\t\t\t\tselectedModelId: currentModel.id,\n\t\t\t\tactiveToolNames: providerFiltered.compatible.map((tool) => tool.name),\n\t\t\t\tfilteredTools: providerFiltered.filtered.map((tool) => tool.name),\n\t\t\t\trequestCustomMessages: getAdjustToolSetRequestCustomMessages(messages),\n\t\t\t});\n\t\t\tif (!result?.toolNames) return providerFiltered.compatible;\n\t\t\tconst allowedNames = new Set(result.toolNames);\n\t\t\treturn providerFiltered.compatible.filter((tool) => allowedNames.has(tool.name));\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getRetrySettings().maxDelayMs,\n\t\texternalToolExecution: (m) => modelRegistry.getProviderAuthMode(m.provider) === \"externalCli\",\n\t\tgetProviderOptions: async (currentModel) => {\n\t\t\tif (currentModel.provider !== \"claude-code\") return undefined;\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) {\n\t\t\t\treturn { cwd: workspaceRootRef.current };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcwd: workspaceRootRef.current,\n\t\t\t\t...(runner.hasUI() ? { extensionUIContext: runner.getUIContext() } : {}),\n\t\t\t\tonExternalToolCall: async (toolCall: { id: string; name: string; arguments: Record<string, unknown> }) => {\n\t\t\t\t\tif (!runner.hasHandlers(\"tool_call\")) return;\n\t\t\t\t\tawait runner.emitToolCall({\n\t\t\t\t\t\ttype: \"tool_call\",\n\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\tinput: toolCall.arguments,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tonExternalToolResult: async (event: {\n\t\t\t\t\ttoolCall: { id: string; name: string; arguments: Record<string, unknown> };\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\t\t\t\t\t\tdetails?: Record<string, unknown>;\n\t\t\t\t\t\tisError: boolean;\n\t\t\t\t\t};\n\t\t\t\t}) => {\n\t\t\t\t\tif (!runner.hasHandlers(\"tool_result\")) return;\n\t\t\t\t\tconst content = event.result.content.map((block) => {\n\t\t\t\t\t\tif (block.type === \"image\" && typeof block.data === \"string\" && typeof block.mimeType === \"string\") {\n\t\t\t\t\t\t\treturn { type: \"image\" as const, data: block.data, mimeType: block.mimeType };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { type: \"text\" as const, text: typeof block.text === \"string\" ? block.text : \"\" };\n\t\t\t\t\t});\n\t\t\t\t\tawait runner.emitToolResult({\n\t\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\t\ttoolCallId: event.toolCall.id,\n\t\t\t\t\t\ttoolName: event.toolCall.name,\n\t\t\t\t\t\tinput: event.toolCall.arguments,\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\tdetails: event.result.details,\n\t\t\t\t\t\tisError: event.result.isError,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tgetApiKey: async (provider) => {\n\t\t\t// Use the provider argument from the in-flight request;\n\t\t\t// agent.state.model may already be switched mid-turn.\n\t\t\tconst resolvedProvider = provider || agent.state.model?.provider;\n\t\t\tif (!resolvedProvider) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\t\t\tconst authMode = modelRegistry.getProviderAuthMode(resolvedProvider);\n\t\t\tif (authMode === \"externalCli\" || authMode === \"none\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// Retry key resolution with backoff to handle transient network failures\n\t\t\t// (e.g., OAuth token refresh failing due to brief connectivity loss).\n\t\t\t// When credentials are in a cooldown window (e.g., after a 429), wait\n\t\t\t// for the backoff to expire instead of using fixed delays that are\n\t\t\t// shorter than the cooldown duration.\n\t\t\tconst maxAttempts = 3;\n\t\t\tconst baseDelayMs = 2000;\n\t\t\tconst maxCooldownWaitMs = 60_000; // Don't wait longer than 60s (skip quota-exhausted 30min backoffs)\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tconst key = await modelRegistry.getApiKeyForProvider(resolvedProvider);\n\t\t\t\tif (key) return key;\n\n\t\t\t\t// On the last attempt, fall through to error handling below\n\t\t\t\tif (attempt >= maxAttempts) break;\n\n\t\t\t\t// Only retry if credentials exist (network issue) — no point retrying\n\t\t\t\t// when there are genuinely no credentials configured.\n\t\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\t\tconst model = agent.state.model;\n\t\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\t\tif (!hasAuth && !isOAuth) break;\n\n\t\t\t\t// If credentials are in a cooldown window, wait for the earliest\n\t\t\t\t// one to expire rather than using a fixed delay that's too short.\n\t\t\t\tconst backoffExpiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tif (backoffExpiry !== undefined) {\n\t\t\t\t\tconst waitMs = backoffExpiry - Date.now() + 500; // 500ms buffer\n\t\t\t\t\tif (waitMs > 0 && waitMs <= maxCooldownWaitMs) {\n\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, waitMs));\n\t\t\t\t\t\tcontinue; // Retry immediately after cooldown clears\n\t\t\t\t\t}\n\t\t\t\t\tif (waitMs > maxCooldownWaitMs) {\n\t\t\t\t\t\tbreak; // Quota-exhausted or very long backoff — don't block\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Standard exponential backoff for non-cooldown transient failures\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, baseDelayMs * attempt));\n\t\t\t}\n\n\t\t\t// All retries exhausted — throw descriptive error.\n\t\t\t// Check if credentials exist but are temporarily in a backoff window\n\t\t\t// (e.g., after a 429). This message intentionally avoids phrases like\n\t\t\t// \"rate limit\" / \"429\" to prevent isRetryableError() from re-entering\n\t\t\t// the retry handler and creating cascading error entries (#3429).\n\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\tif (hasAuth) {\n\t\t\t\t// Anthropic OAuth was removed in v2.74.0 for TOS compliance (#3952).\n\t\t\t\t// Users who upgraded from an older version may still have OAuth\n\t\t\t\t// credentials in auth.json that will never resolve to a valid API key.\n\t\t\t\tif (\n\t\t\t\t\tresolvedProvider === \"anthropic\" &&\n\t\t\t\t\tmodelRegistry.authStorage.hasLegacyOAuthCredential(resolvedProvider)\n\t\t\t\t) {\n\t\t\t\t\t// Self-heal: strip the stale oauth entry so hasAuth() stops lying\n\t\t\t\t\t// about anthropic being configured. This preserves any api_key\n\t\t\t\t\t// credentials alongside it.\n\t\t\t\t\tconst removed = modelRegistry.authStorage.removeLegacyOAuthCredential(resolvedProvider);\n\t\t\t\t\tif (removed) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[auth] Removed unsupported Anthropic OAuth credential from auth.json.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (isClaudeCodeBinaryInPath()) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +\n\t\t\t\t\t\t\t\t`Your current model's provider is set to \"anthropic\" but the local Claude Code CLI ` +\n\t\t\t\t\t\t\t\t`is available — switch the model's provider to \"claude-code\" in your preferences ` +\n\t\t\t\t\t\t\t\t`to use it, or set ANTHROPIC_API_KEY to continue with the Anthropic API directly.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +\n\t\t\t\t\t\t\t`Set ANTHROPIC_API_KEY, run '/login' and paste an API key, or switch to a different provider.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t}\n\t\t\tconst model = agent.state.model;\n\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\tif (isOAuth) {\n\t\t\t\t// If credentials exist but are all in a backoff window (quota / rate-limit),\n\t\t\t\t// surface a specific message instead of the misleading \"Authentication failed\".\n\t\t\t\tif (modelRegistry.authStorage.areAllCredentialsBackedOff(resolvedProvider)) {\n\t\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${resolvedProvider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for \"${resolvedProvider}\". ` +\n\t\t\t\t\t`Set an API key environment variable or run '/login ${resolvedProvider}'.`,\n\t\t\t);\n\t\t},\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.replaceMessages(existingSession.messages);\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRegistry,\n\t\tinitialActiveToolNames,\n\t\textensionRunnerRef,\n\t\tworkspaceRootRef,\n\t\tisClaudeCodeReady: options.isClaudeCodeReady,\n\t});\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
@@ -1,4 +1,4 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: Tests skill invocation and prompt-only skill visibility behavior.
3
3
  import assert from "node:assert/strict";
4
4
  import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
@@ -1 +1 @@
1
- {"version":3,"file":"skill-tool.test.js","sourceRoot":"","sources":["../../src/core/skill-tool.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Tests skill invocation and prompt-only skill visibility behavior.\n\nimport assert from \"node:assert/strict\";\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\n\nimport { Agent } from \"@gsd/pi-agent-core\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nlet testDir: string;\n\nfunction writeSkill(cwd: string, name: string, description: string, body = `# ${name}\\n`): string {\n\tconst skillDir = join(cwd, \".agents\", \"skills\", name);\n\tmkdirSync(skillDir, { recursive: true });\n\tconst skillPath = join(skillDir, \"SKILL.md\");\n\twriteFileSync(skillPath, `---\\nname: ${name}\\ndescription: ${description}\\n---\\n\\n${body}`);\n\treturn skillPath;\n}\n\ndescribe(\"Skill tool\", () => {\n\tbeforeEach(() => {\n\t\ttestDir = mkdtempSync(join(tmpdir(), \"skill-tool-test-\"));\n\t});\n\n\tafterEach(() => {\n\t\trmSync(testDir, { recursive: true, force: true });\n\t});\n\n\tasync function createSession() {\n\t\tconst agentDir = join(testDir, \"agent-home\");\n\t\tconst authStorage = AuthStorage.inMemory({});\n\t\tconst modelRegistry = new ModelRegistry(authStorage, join(agentDir, \"models.json\"));\n\t\tconst settingsManager = SettingsManager.inMemory();\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: testDir,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\treturn new AgentSession({\n\t\t\tagent: new Agent(),\n\t\t\tsessionManager: SessionManager.inMemory(testDir),\n\t\t\tsettingsManager,\n\t\t\tcwd: testDir,\n\t\t\tresourceLoader,\n\t\t\tmodelRegistry,\n\t\t});\n\t}\n\n\tit(\"resolves a project-level skill to the exact skill block format\", async () => {\n\t\tconst skillPath = writeSkill(\n\t\t\ttestDir,\n\t\t\t\"swift-testing\",\n\t\t\t\"Use for Swift Testing assertions and verification patterns.\",\n\t\t\t\"# Swift Testing\\nUse this skill.\\n\",\n\t\t);\n\t\tconst session = await createSession();\n\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-1\", { skill: \"swift-testing\" });\n\t\tassert.equal(\n\t\t\tresult.content[0]?.type === \"text\" ? result.content[0].text : \"\",\n\t\t\t`<skill name=\"swift-testing\" location=\"${skillPath}\">\\nReferences are relative to ${join(testDir, \".agents\", \"skills\", \"swift-testing\")}.\\n\\n# Swift Testing\\nUse this skill.\\n</skill>`,\n\t\t);\n\t});\n\n\tit(\"returns a helpful error for unknown skills\", async () => {\n\t\twriteSkill(testDir, \"swift-testing\", \"Use for Swift Testing assertions and verification patterns.\");\n\t\tconst session = await createSession();\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-2\", { skill: \"nonexistent\" });\n\t\tconst message = result.content[0]?.type === \"text\" ? result.content[0].text : \"\";\n\t\tassert.match(message, /^Skill \"nonexistent\" not found\\. Available skills: /);\n\t\tassert.match(message, /swift-testing/);\n\t});\n\n\tit(\"filters skill catalog without unloading skills or disabling Skill tool\", async () => {\n\t\twriteSkill(testDir, \"alpha\", \"Use alpha.\");\n\t\twriteSkill(testDir, \"beta\", \"Use beta.\");\n\t\tconst session = await createSession();\n\n\t\tassert.match(session.systemPrompt, /<name>alpha<\\/name>/);\n\t\tassert.match(session.systemPrompt, /<name>beta<\\/name>/);\n\n\t\tsession.setVisibleSkillsByName([\"alpha\"]);\n\t\tassert.deepEqual(session.getVisibleSkillNames(), [\"alpha\"]);\n\t\tassert.match(session.systemPrompt, /<name>alpha<\\/name>/);\n\t\tassert.doesNotMatch(session.systemPrompt, /<name>beta<\\/name>/);\n\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should remain active\");\n\t\tconst result = await tool.execute(\"call-3\", { skill: \"beta\" });\n\t\tconst text = result.content[0]?.type === \"text\" ? result.content[0].text : \"\";\n\t\tassert.match(text, /<skill name=\"beta\"/);\n\n\t\tsession.setVisibleSkillsByName(undefined);\n\t\tassert.equal(session.getVisibleSkillNames(), undefined);\n\t\tassert.match(session.systemPrompt, /<name>alpha<\\/name>/);\n\t\tassert.match(session.systemPrompt, /<name>beta<\\/name>/);\n\t});\n});\n"]}
1
+ {"version":3,"file":"skill-tool.test.js","sourceRoot":"","sources":["../../src/core/skill-tool.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Tests skill invocation and prompt-only skill visibility behavior.\n\nimport assert from \"node:assert/strict\";\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\n\nimport { Agent } from \"@gsd/pi-agent-core\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nlet testDir: string;\n\nfunction writeSkill(cwd: string, name: string, description: string, body = `# ${name}\\n`): string {\n\tconst skillDir = join(cwd, \".agents\", \"skills\", name);\n\tmkdirSync(skillDir, { recursive: true });\n\tconst skillPath = join(skillDir, \"SKILL.md\");\n\twriteFileSync(skillPath, `---\\nname: ${name}\\ndescription: ${description}\\n---\\n\\n${body}`);\n\treturn skillPath;\n}\n\ndescribe(\"Skill tool\", () => {\n\tbeforeEach(() => {\n\t\ttestDir = mkdtempSync(join(tmpdir(), \"skill-tool-test-\"));\n\t});\n\n\tafterEach(() => {\n\t\trmSync(testDir, { recursive: true, force: true });\n\t});\n\n\tasync function createSession() {\n\t\tconst agentDir = join(testDir, \"agent-home\");\n\t\tconst authStorage = AuthStorage.inMemory({});\n\t\tconst modelRegistry = new ModelRegistry(authStorage, join(agentDir, \"models.json\"));\n\t\tconst settingsManager = SettingsManager.inMemory();\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: testDir,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\treturn new AgentSession({\n\t\t\tagent: new Agent(),\n\t\t\tsessionManager: SessionManager.inMemory(testDir),\n\t\t\tsettingsManager,\n\t\t\tcwd: testDir,\n\t\t\tresourceLoader,\n\t\t\tmodelRegistry,\n\t\t});\n\t}\n\n\tit(\"resolves a project-level skill to the exact skill block format\", async () => {\n\t\tconst skillPath = writeSkill(\n\t\t\ttestDir,\n\t\t\t\"swift-testing\",\n\t\t\t\"Use for Swift Testing assertions and verification patterns.\",\n\t\t\t\"# Swift Testing\\nUse this skill.\\n\",\n\t\t);\n\t\tconst session = await createSession();\n\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-1\", { skill: \"swift-testing\" });\n\t\tassert.equal(\n\t\t\tresult.content[0]?.type === \"text\" ? result.content[0].text : \"\",\n\t\t\t`<skill name=\"swift-testing\" location=\"${skillPath}\">\\nReferences are relative to ${join(testDir, \".agents\", \"skills\", \"swift-testing\")}.\\n\\n# Swift Testing\\nUse this skill.\\n</skill>`,\n\t\t);\n\t});\n\n\tit(\"returns a helpful error for unknown skills\", async () => {\n\t\twriteSkill(testDir, \"swift-testing\", \"Use for Swift Testing assertions and verification patterns.\");\n\t\tconst session = await createSession();\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-2\", { skill: \"nonexistent\" });\n\t\tconst message = result.content[0]?.type === \"text\" ? result.content[0].text : \"\";\n\t\tassert.match(message, /^Skill \"nonexistent\" not found\\. Available skills: /);\n\t\tassert.match(message, /swift-testing/);\n\t});\n\n\tit(\"filters skill catalog without unloading skills or disabling Skill tool\", async () => {\n\t\twriteSkill(testDir, \"alpha\", \"Use alpha.\");\n\t\twriteSkill(testDir, \"beta\", \"Use beta.\");\n\t\tconst session = await createSession();\n\n\t\tassert.match(session.systemPrompt, /<name>alpha<\\/name>/);\n\t\tassert.match(session.systemPrompt, /<name>beta<\\/name>/);\n\n\t\tsession.setVisibleSkillsByName([\"alpha\"]);\n\t\tassert.deepEqual(session.getVisibleSkillNames(), [\"alpha\"]);\n\t\tassert.match(session.systemPrompt, /<name>alpha<\\/name>/);\n\t\tassert.doesNotMatch(session.systemPrompt, /<name>beta<\\/name>/);\n\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should remain active\");\n\t\tconst result = await tool.execute(\"call-3\", { skill: \"beta\" });\n\t\tconst text = result.content[0]?.type === \"text\" ? result.content[0].text : \"\";\n\t\tassert.match(text, /<skill name=\"beta\"/);\n\n\t\tsession.setVisibleSkillsByName(undefined);\n\t\tassert.equal(session.getVisibleSkillNames(), undefined);\n\t\tassert.match(session.systemPrompt, /<name>alpha<\\/name>/);\n\t\tassert.match(session.systemPrompt, /<name>beta<\\/name>/);\n\t});\n});\n"]}
@@ -1,4 +1,9 @@
1
1
  import type { ResourceDiagnostic } from "./diagnostics.js";
2
+ /**
3
+ * GSD-owned bundled skills directory. GSD writes its bundled skill set here
4
+ * instead of the shared Agent Skills ecosystem directory.
5
+ */
6
+ export declare const GSD_BUNDLED_SKILLS_DIR: string;
2
7
  /**
3
8
  * The standard ecosystem skills directory used by skills.sh and the
4
9
  * Agent Skills standard. All agents share this location for globally
@@ -9,6 +14,10 @@ export declare const ECOSYSTEM_SKILLS_DIR: string;
9
14
  * The standard project-level skills directory (`.agents/skills/` relative to cwd).
10
15
  */
11
16
  export declare const ECOSYSTEM_PROJECT_SKILLS_DIR = ".agents";
17
+ /**
18
+ * Claude Code's user-level skills directory. Read-only compatibility source.
19
+ */
20
+ export declare const CLAUDE_SKILLS_DIR: string;
12
21
  export interface SkillFrontmatter {
13
22
  name?: string;
14
23
  description?: string;
@@ -54,7 +63,7 @@ export declare function formatSkillsForPrompt(skills: Skill[]): string;
54
63
  export interface LoadSkillsOptions {
55
64
  /** Working directory for project-local skills. Default: process.cwd() */
56
65
  cwd?: string;
57
- /** @deprecated Skills now use ~/.agents/skills/ exclusively. This option is ignored. */
66
+ /** @deprecated GSD bundled skills resolve from ~/.gsd/agent/skills/. This option is ignored. */
58
67
  agentDir?: string;
59
68
  /** Explicit skill paths (files or directories) */
60
69
  skillPaths?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAuC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,4BAA4B,YAAY,CAAC;AA6DtD,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAID,wBAAgB,eAAe,IAAI,KAAK,EAAE,CAEzC;AA+CD,MAAM,WAAW,wBAAwB;IACxC,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,gBAAgB,CAGrF;AAqID;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CA2B7D;AAWD,MAAM,WAAW,iBAAiB;IACjC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,wDAAwD;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAeD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAiH5E"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAGlC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAuC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,4BAA4B,YAAY,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAuC,CAAC;AAuDtE,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAID,wBAAgB,eAAe,IAAI,KAAK,EAAE,CAEzC;AA+CD,MAAM,WAAW,wBAAwB;IACxC,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,gBAAgB,CAGrF;AAqID;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CA2B7D;AAWD,MAAM,WAAW,iBAAiB;IACjC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,wDAAwD;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAeD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CA6G5E"}
@@ -4,7 +4,11 @@ import { homedir } from "os";
4
4
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "path";
5
5
  import { parseFrontmatter } from "../utils/frontmatter.js";
6
6
  import { toPosixPath } from "../utils/path-display.js";
7
- import { CONFIG_DIR_NAME } from "../config.js";
7
+ /**
8
+ * GSD-owned bundled skills directory. GSD writes its bundled skill set here
9
+ * instead of the shared Agent Skills ecosystem directory.
10
+ */
11
+ export const GSD_BUNDLED_SKILLS_DIR = join(process.env.GSD_CODING_AGENT_DIR || join(homedir(), ".gsd", "agent"), "skills");
8
12
  /**
9
13
  * The standard ecosystem skills directory used by skills.sh and the
10
14
  * Agent Skills standard. All agents share this location for globally
@@ -16,10 +20,9 @@ export const ECOSYSTEM_SKILLS_DIR = join(homedir(), ".agents", "skills");
16
20
  */
17
21
  export const ECOSYSTEM_PROJECT_SKILLS_DIR = ".agents";
18
22
  /**
19
- * Legacy skills directory (~/.gsd/agent/skills/ or ~/.pi/agent/skills/).
20
- * Read as a fallback so existing installs don't lose skills before migration runs.
23
+ * Claude Code's user-level skills directory. Read-only compatibility source.
21
24
  */
22
- const LEGACY_SKILLS_DIR = join(homedir(), CONFIG_DIR_NAME, "agent", "skills");
25
+ export const CLAUDE_SKILLS_DIR = join(homedir(), ".claude", "skills");
23
26
  /** Max name length per spec */
24
27
  const MAX_NAME_LENGTH = 64;
25
28
  /** Max description length per spec */
@@ -320,17 +323,14 @@ export function loadSkills(options = {}) {
320
323
  }
321
324
  }
322
325
  if (includeDefaults) {
323
- // Primary: ~/.agents/skills/ the industry-standard skills.sh location
326
+ // GSD-owned bundled skills win collisions inside GSD.
327
+ addSkills(loadSkillsFromDirInternal(GSD_BUNDLED_SKILLS_DIR, "bundled", true));
328
+ // User-global: ~/.agents/skills/ — the industry-standard skills.sh location
324
329
  addSkills(loadSkillsFromDirInternal(ECOSYSTEM_SKILLS_DIR, "user", true));
325
- // Primary project: .agents/skills/ — standard project-level location
330
+ // Project: .agents/skills/ — standard project-level location
326
331
  addSkills(loadSkillsFromDirInternal(resolve(cwd, ECOSYSTEM_PROJECT_SKILLS_DIR, "skills"), "project", true));
327
- // Legacy fallback: read skills from ~/.gsd/agent/skills/ so existing
328
- // installs keep working until the one-time migration in resource-loader
329
- // copies them to ~/.agents/skills/. Skip if migration has completed.
330
- const legacyMigrated = existsSync(join(LEGACY_SKILLS_DIR, ".migrated-to-agents"));
331
- if (LEGACY_SKILLS_DIR !== ECOSYSTEM_SKILLS_DIR && existsSync(LEGACY_SKILLS_DIR) && !legacyMigrated) {
332
- addSkills(loadSkillsFromDirInternal(LEGACY_SKILLS_DIR, "user", true));
333
- }
332
+ // Claude Code compatibility, read-only and lower priority.
333
+ addSkills(loadSkillsFromDirInternal(CLAUDE_SKILLS_DIR, "user", true));
334
334
  }
335
335
  const userSkillsDir = ECOSYSTEM_SKILLS_DIR;
336
336
  const projectSkillsDir = resolve(cwd, ECOSYSTEM_PROJECT_SKILLS_DIR, "skills");
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from \"fs\";\nimport ignore from \"ignore\";\nimport { homedir } from \"os\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"path\";\nimport { parseFrontmatter } from \"../utils/frontmatter.js\";\nimport { toPosixPath } from \"../utils/path-display.js\";\nimport type { ResourceDiagnostic } from \"./diagnostics.js\";\nimport { CONFIG_DIR_NAME } from \"../config.js\";\n\n/**\n * The standard ecosystem skills directory used by skills.sh and the\n * Agent Skills standard. All agents share this location for globally\n * installed skills.\n */\nexport const ECOSYSTEM_SKILLS_DIR = join(homedir(), \".agents\", \"skills\");\n\n/**\n * The standard project-level skills directory (`.agents/skills/` relative to cwd).\n */\nexport const ECOSYSTEM_PROJECT_SKILLS_DIR = \".agents\";\n\n/**\n * Legacy skills directory (~/.gsd/agent/skills/ or ~/.pi/agent/skills/).\n * Read as a fallback so existing installs don't lose skills before migration runs.\n */\nconst LEGACY_SKILLS_DIR = join(homedir(), CONFIG_DIR_NAME, \"agent\", \"skills\");\n\n/** Max name length per spec */\nconst MAX_NAME_LENGTH = 64;\n\n/** Max description length per spec */\nconst MAX_DESCRIPTION_LENGTH = 1024;\n\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\n\ntype IgnoreMatcher = ReturnType<typeof ignore>;\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tif (pattern.startsWith(\"/\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nfunction addIgnoreRules(ig: IgnoreMatcher, dir: string, rootDir: string): void {\n\tconst relativeDir = relative(rootDir, dir);\n\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\tconst ignorePath = join(dir, filename);\n\t\tif (!existsSync(ignorePath)) continue;\n\t\ttry {\n\t\t\tconst content = readFileSync(ignorePath, \"utf-8\");\n\t\t\tconst patterns = content\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\tif (patterns.length > 0) {\n\t\t\t\tig.add(patterns);\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n\nexport interface SkillFrontmatter {\n\tname?: string;\n\tdescription?: string;\n\t\"disable-model-invocation\"?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface Skill {\n\tname: string;\n\tdescription: string;\n\tfilePath: string;\n\tbaseDir: string;\n\tsource: string;\n\tdisableModelInvocation: boolean;\n}\n\nexport interface LoadSkillsResult {\n\tskills: Skill[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nlet loadedSkills: Skill[] = [];\n\nexport function getLoadedSkills(): Skill[] {\n\treturn [...loadedSkills];\n}\n\n/**\n * Validate skill name per Agent Skills spec.\n * Returns array of validation error messages (empty if valid).\n */\nfunction validateName(name: string, parentDirName: string): string[] {\n\tconst errors: string[] = [];\n\n\tif (name !== parentDirName) {\n\t\terrors.push(`name \"${name}\" does not match parent directory \"${parentDirName}\"`);\n\t}\n\n\tif (name.length > MAX_NAME_LENGTH) {\n\t\terrors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);\n\t}\n\n\tif (!/^[a-z0-9-]+$/.test(name)) {\n\t\terrors.push(`name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)`);\n\t}\n\n\tif (name.startsWith(\"-\") || name.endsWith(\"-\")) {\n\t\terrors.push(`name must not start or end with a hyphen`);\n\t}\n\n\tif (name.includes(\"--\")) {\n\t\terrors.push(`name must not contain consecutive hyphens`);\n\t}\n\n\treturn errors;\n}\n\n/**\n * Validate description per Agent Skills spec.\n */\nfunction validateDescription(description: string | undefined): string[] {\n\tconst errors: string[] = [];\n\n\tif (!description || description.trim() === \"\") {\n\t\terrors.push(\"description is required\");\n\t} else if (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\terrors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);\n\t}\n\n\treturn errors;\n}\n\nexport interface LoadSkillsFromDirOptions {\n\t/** Directory to scan for skills */\n\tdir: string;\n\t/** Source identifier for these skills */\n\tsource: string;\n}\n\n/**\n * Load skills from a directory.\n *\n * Discovery rules:\n * - direct .md children in the root\n * - recursive SKILL.md under subdirectories\n */\nexport function loadSkillsFromDir(options: LoadSkillsFromDirOptions): LoadSkillsResult {\n\tconst { dir, source } = options;\n\treturn loadSkillsFromDirInternal(dir, source, true);\n}\n\nfunction loadSkillsFromDirInternal(\n\tdir: string,\n\tsource: string,\n\tincludeRootFiles: boolean,\n\tignoreMatcher?: IgnoreMatcher,\n\trootDir?: string,\n): LoadSkillsResult {\n\tconst skills: Skill[] = [];\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\tif (!existsSync(dir)) {\n\t\treturn { skills, diagnostics };\n\t}\n\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\taddIgnoreRules(ig, dir, root);\n\n\ttry {\n\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.name.startsWith(\".\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip node_modules to avoid scanning dependencies\n\t\t\tif (entry.name === \"node_modules\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst fullPath = join(dir, entry.name);\n\n\t\t\t// For symlinks, check if they point to a directory and follow them\n\t\t\tlet isDirectory = entry.isDirectory();\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tconst stats = statSync(fullPath);\n\t\t\t\t\tisDirectory = stats.isDirectory();\n\t\t\t\t\tisFile = stats.isFile();\n\t\t\t\t} catch {\n\t\t\t\t\t// Broken symlink, skip it\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst relPath = toPosixPath(relative(root, fullPath));\n\t\t\tconst ignorePath = isDirectory ? `${relPath}/` : relPath;\n\t\t\tif (ig.ignores(ignorePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isDirectory) {\n\t\t\t\tconst subResult = loadSkillsFromDirInternal(fullPath, source, false, ig, root);\n\t\t\t\tskills.push(...subResult.skills);\n\t\t\t\tdiagnostics.push(...subResult.diagnostics);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isFile) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isRootMd = includeRootFiles && entry.name.endsWith(\".md\");\n\t\t\tconst isSkillMd = !includeRootFiles && entry.name === \"SKILL.md\";\n\t\t\tif (!isRootMd && !isSkillMd) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst result = loadSkillFromFile(fullPath, source);\n\t\t\tif (result.skill) {\n\t\t\t\tskills.push(result.skill);\n\t\t\t}\n\t\t\tdiagnostics.push(...result.diagnostics);\n\t\t}\n\t} catch {}\n\n\treturn { skills, diagnostics };\n}\n\nfunction loadSkillFromFile(\n\tfilePath: string,\n\tsource: string,\n): { skill: Skill | null; diagnostics: ResourceDiagnostic[] } {\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\ttry {\n\t\tconst rawContent = readFileSync(filePath, \"utf-8\");\n\t\tconst { frontmatter } = parseFrontmatter<SkillFrontmatter>(rawContent);\n\t\tconst skillDir = dirname(filePath);\n\t\tconst parentDirName = basename(skillDir);\n\n\t\t// Validate description\n\t\tconst descErrors = validateDescription(frontmatter.description);\n\t\tfor (const error of descErrors) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t}\n\n\t\t// Use name from frontmatter, or fall back to parent directory name\n\t\tconst name = frontmatter.name || parentDirName;\n\n\t\t// Validate name\n\t\tconst nameErrors = validateName(name, parentDirName);\n\t\tfor (const error of nameErrors) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t}\n\n\t\t// Still load the skill even with warnings (unless description is completely missing)\n\t\tif (!frontmatter.description || frontmatter.description.trim() === \"\") {\n\t\t\treturn { skill: null, diagnostics };\n\t\t}\n\n\t\treturn {\n\t\t\tskill: {\n\t\t\t\tname,\n\t\t\t\tdescription: frontmatter.description,\n\t\t\t\tfilePath,\n\t\t\t\tbaseDir: skillDir,\n\t\t\t\tsource,\n\t\t\t\tdisableModelInvocation: frontmatter[\"disable-model-invocation\"] === true,\n\t\t\t},\n\t\t\tdiagnostics,\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to parse skill file\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: filePath });\n\t\treturn { skill: null, diagnostics };\n\t}\n}\n\n/**\n * Format skills for inclusion in a system prompt.\n * Uses XML format per Agent Skills standard.\n * See: https://agentskills.io/integrate-skills\n *\n * Skills with disableModelInvocation=true are excluded from the prompt\n * (they can only be invoked explicitly via /skill:name commands).\n */\nexport function formatSkillsForPrompt(skills: Skill[]): string {\n\tconst visibleSkills = skills.filter((s) => !s.disableModelInvocation);\n\n\tif (visibleSkills.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines = [\n\t\t\"\\n\\nThe following skills provide specialized instructions for specific tasks.\",\n\t\t\"Use the Skill tool with the exact skill name from <available_skills> when the task matches its description.\",\n\t\t\"If the Skill tool reports an unknown skill, do not guess: use an exact name from <available_skills> or tell the user the skill is unavailable.\",\n\t\t\"When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\",\n\t\t\"\",\n\t\t\"<available_skills>\",\n\t];\n\n\tfor (const skill of visibleSkills) {\n\t\tlines.push(\" <skill>\");\n\t\tlines.push(` <name>${escapeXml(skill.name)}</name>`);\n\t\tlines.push(` <description>${escapeXml(skill.description)}</description>`);\n\t\tlines.push(` <location>${escapeXml(skill.filePath)}</location>`);\n\t\tlines.push(\" </skill>\");\n\t}\n\n\tlines.push(\"</available_skills>\");\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction escapeXml(str: string): string {\n\treturn str\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&apos;\");\n}\n\nexport interface LoadSkillsOptions {\n\t/** Working directory for project-local skills. Default: process.cwd() */\n\tcwd?: string;\n\t/** @deprecated Skills now use ~/.agents/skills/ exclusively. This option is ignored. */\n\tagentDir?: string;\n\t/** Explicit skill paths (files or directories) */\n\tskillPaths?: string[];\n\t/** Include default skills directories. Default: true */\n\tincludeDefaults?: boolean;\n}\n\nfunction normalizePath(input: string): string {\n\tconst trimmed = input.trim();\n\tif (trimmed === \"~\") return homedir();\n\tif (trimmed.startsWith(\"~/\")) return join(homedir(), trimmed.slice(2));\n\tif (trimmed.startsWith(\"~\")) return join(homedir(), trimmed.slice(1));\n\treturn trimmed;\n}\n\nfunction resolveSkillPath(p: string, cwd: string): string {\n\tconst normalized = normalizePath(p);\n\treturn isAbsolute(normalized) ? normalized : resolve(cwd, normalized);\n}\n\n/**\n * Load skills from all configured locations.\n * Returns skills and any validation diagnostics.\n */\nexport function loadSkills(options: LoadSkillsOptions = {}): LoadSkillsResult {\n\tconst { cwd = process.cwd(), skillPaths = [], includeDefaults = true } = options;\n\n\tconst skillMap = new Map<string, Skill>();\n\tconst realPathSet = new Set<string>();\n\tconst allDiagnostics: ResourceDiagnostic[] = [];\n\tconst collisionDiagnostics: ResourceDiagnostic[] = [];\n\n\tfunction addSkills(result: LoadSkillsResult) {\n\t\tallDiagnostics.push(...result.diagnostics);\n\t\tfor (const skill of result.skills) {\n\t\t\t// Resolve symlinks to detect duplicate files\n\t\t\tlet realPath: string;\n\t\t\ttry {\n\t\t\t\trealPath = realpathSync(skill.filePath);\n\t\t\t} catch {\n\t\t\t\trealPath = skill.filePath;\n\t\t\t}\n\n\t\t\t// Skip silently if we've already loaded this exact file (via symlink)\n\t\t\tif (realPathSet.has(realPath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst existing = skillMap.get(skill.name);\n\t\t\tif (existing) {\n\t\t\t\tcollisionDiagnostics.push({\n\t\t\t\t\ttype: \"collision\",\n\t\t\t\t\tmessage: `name \"${skill.name}\" collision`,\n\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\tcollision: {\n\t\t\t\t\t\tresourceType: \"skill\",\n\t\t\t\t\t\tname: skill.name,\n\t\t\t\t\t\twinnerPath: existing.filePath,\n\t\t\t\t\t\tloserPath: skill.filePath,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tskillMap.set(skill.name, skill);\n\t\t\t\trealPathSet.add(realPath);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (includeDefaults) {\n\t\t// Primary: ~/.agents/skills/ — the industry-standard skills.sh location\n\t\taddSkills(loadSkillsFromDirInternal(ECOSYSTEM_SKILLS_DIR, \"user\", true));\n\t\t// Primary project: .agents/skills/ — standard project-level location\n\t\taddSkills(loadSkillsFromDirInternal(resolve(cwd, ECOSYSTEM_PROJECT_SKILLS_DIR, \"skills\"), \"project\", true));\n\n\t\t// Legacy fallback: read skills from ~/.gsd/agent/skills/ so existing\n\t\t// installs keep working until the one-time migration in resource-loader\n\t\t// copies them to ~/.agents/skills/. Skip if migration has completed.\n\t\tconst legacyMigrated = existsSync(join(LEGACY_SKILLS_DIR, \".migrated-to-agents\"));\n\t\tif (LEGACY_SKILLS_DIR !== ECOSYSTEM_SKILLS_DIR && existsSync(LEGACY_SKILLS_DIR) && !legacyMigrated) {\n\t\t\taddSkills(loadSkillsFromDirInternal(LEGACY_SKILLS_DIR, \"user\", true));\n\t\t}\n\t}\n\n\tconst userSkillsDir = ECOSYSTEM_SKILLS_DIR;\n\tconst projectSkillsDir = resolve(cwd, ECOSYSTEM_PROJECT_SKILLS_DIR, \"skills\");\n\n\tconst isUnderPath = (target: string, root: string): boolean => {\n\t\tconst normalizedRoot = resolve(root);\n\t\tif (target === normalizedRoot) {\n\t\t\treturn true;\n\t\t}\n\t\tconst prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;\n\t\treturn target.startsWith(prefix);\n\t};\n\n\tconst getSource = (resolvedPath: string): \"user\" | \"project\" | \"path\" => {\n\t\tif (!includeDefaults) {\n\t\t\tif (isUnderPath(resolvedPath, userSkillsDir)) return \"user\";\n\t\t\tif (isUnderPath(resolvedPath, projectSkillsDir)) return \"project\";\n\t\t}\n\t\treturn \"path\";\n\t};\n\n\tfor (const rawPath of skillPaths) {\n\t\tconst resolvedPath = resolveSkillPath(rawPath, cwd);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tallDiagnostics.push({ type: \"warning\", message: \"skill path does not exist\", path: resolvedPath });\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stats = statSync(resolvedPath);\n\t\t\tconst source = getSource(resolvedPath);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\taddSkills(loadSkillsFromDirInternal(resolvedPath, source, true));\n\t\t\t} else if (stats.isFile() && resolvedPath.endsWith(\".md\")) {\n\t\t\t\tconst result = loadSkillFromFile(resolvedPath, source);\n\t\t\t\tif (result.skill) {\n\t\t\t\t\taddSkills({ skills: [result.skill], diagnostics: result.diagnostics });\n\t\t\t\t} else {\n\t\t\t\t\tallDiagnostics.push(...result.diagnostics);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tallDiagnostics.push({ type: \"warning\", message: \"skill path is not a markdown file\", path: resolvedPath });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to read skill path\";\n\t\t\tallDiagnostics.push({ type: \"warning\", message, path: resolvedPath });\n\t\t}\n\t}\n\n\tloadedSkills = Array.from(skillMap.values());\n\n\treturn {\n\t\tskills: [...loadedSkills],\n\t\tdiagnostics: [...allDiagnostics, ...collisionDiagnostics],\n\t};\n}\n"]}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from \"fs\";\nimport ignore from \"ignore\";\nimport { homedir } from \"os\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"path\";\nimport { parseFrontmatter } from \"../utils/frontmatter.js\";\nimport { toPosixPath } from \"../utils/path-display.js\";\nimport type { ResourceDiagnostic } from \"./diagnostics.js\";\n\n/**\n * GSD-owned bundled skills directory. GSD writes its bundled skill set here\n * instead of the shared Agent Skills ecosystem directory.\n */\nexport const GSD_BUNDLED_SKILLS_DIR = join(\n\tprocess.env.GSD_CODING_AGENT_DIR || join(homedir(), \".gsd\", \"agent\"),\n\t\"skills\",\n);\n\n/**\n * The standard ecosystem skills directory used by skills.sh and the\n * Agent Skills standard. All agents share this location for globally\n * installed skills.\n */\nexport const ECOSYSTEM_SKILLS_DIR = join(homedir(), \".agents\", \"skills\");\n\n/**\n * The standard project-level skills directory (`.agents/skills/` relative to cwd).\n */\nexport const ECOSYSTEM_PROJECT_SKILLS_DIR = \".agents\";\n\n/**\n * Claude Code's user-level skills directory. Read-only compatibility source.\n */\nexport const CLAUDE_SKILLS_DIR = join(homedir(), \".claude\", \"skills\");\n\n/** Max name length per spec */\nconst MAX_NAME_LENGTH = 64;\n\n/** Max description length per spec */\nconst MAX_DESCRIPTION_LENGTH = 1024;\n\nconst IGNORE_FILE_NAMES = [\".gitignore\", \".ignore\", \".fdignore\"];\n\ntype IgnoreMatcher = ReturnType<typeof ignore>;\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n\tconst trimmed = line.trim();\n\tif (!trimmed) return null;\n\tif (trimmed.startsWith(\"#\") && !trimmed.startsWith(\"\\\\#\")) return null;\n\n\tlet pattern = line;\n\tlet negated = false;\n\n\tif (pattern.startsWith(\"!\")) {\n\t\tnegated = true;\n\t\tpattern = pattern.slice(1);\n\t} else if (pattern.startsWith(\"\\\\!\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tif (pattern.startsWith(\"/\")) {\n\t\tpattern = pattern.slice(1);\n\t}\n\n\tconst prefixed = prefix ? `${prefix}${pattern}` : pattern;\n\treturn negated ? `!${prefixed}` : prefixed;\n}\n\nfunction addIgnoreRules(ig: IgnoreMatcher, dir: string, rootDir: string): void {\n\tconst relativeDir = relative(rootDir, dir);\n\tconst prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : \"\";\n\n\tfor (const filename of IGNORE_FILE_NAMES) {\n\t\tconst ignorePath = join(dir, filename);\n\t\tif (!existsSync(ignorePath)) continue;\n\t\ttry {\n\t\t\tconst content = readFileSync(ignorePath, \"utf-8\");\n\t\t\tconst patterns = content\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => prefixIgnorePattern(line, prefix))\n\t\t\t\t.filter((line): line is string => Boolean(line));\n\t\t\tif (patterns.length > 0) {\n\t\t\t\tig.add(patterns);\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n\nexport interface SkillFrontmatter {\n\tname?: string;\n\tdescription?: string;\n\t\"disable-model-invocation\"?: boolean;\n\t[key: string]: unknown;\n}\n\nexport interface Skill {\n\tname: string;\n\tdescription: string;\n\tfilePath: string;\n\tbaseDir: string;\n\tsource: string;\n\tdisableModelInvocation: boolean;\n}\n\nexport interface LoadSkillsResult {\n\tskills: Skill[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nlet loadedSkills: Skill[] = [];\n\nexport function getLoadedSkills(): Skill[] {\n\treturn [...loadedSkills];\n}\n\n/**\n * Validate skill name per Agent Skills spec.\n * Returns array of validation error messages (empty if valid).\n */\nfunction validateName(name: string, parentDirName: string): string[] {\n\tconst errors: string[] = [];\n\n\tif (name !== parentDirName) {\n\t\terrors.push(`name \"${name}\" does not match parent directory \"${parentDirName}\"`);\n\t}\n\n\tif (name.length > MAX_NAME_LENGTH) {\n\t\terrors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);\n\t}\n\n\tif (!/^[a-z0-9-]+$/.test(name)) {\n\t\terrors.push(`name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)`);\n\t}\n\n\tif (name.startsWith(\"-\") || name.endsWith(\"-\")) {\n\t\terrors.push(`name must not start or end with a hyphen`);\n\t}\n\n\tif (name.includes(\"--\")) {\n\t\terrors.push(`name must not contain consecutive hyphens`);\n\t}\n\n\treturn errors;\n}\n\n/**\n * Validate description per Agent Skills spec.\n */\nfunction validateDescription(description: string | undefined): string[] {\n\tconst errors: string[] = [];\n\n\tif (!description || description.trim() === \"\") {\n\t\terrors.push(\"description is required\");\n\t} else if (description.length > MAX_DESCRIPTION_LENGTH) {\n\t\terrors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);\n\t}\n\n\treturn errors;\n}\n\nexport interface LoadSkillsFromDirOptions {\n\t/** Directory to scan for skills */\n\tdir: string;\n\t/** Source identifier for these skills */\n\tsource: string;\n}\n\n/**\n * Load skills from a directory.\n *\n * Discovery rules:\n * - direct .md children in the root\n * - recursive SKILL.md under subdirectories\n */\nexport function loadSkillsFromDir(options: LoadSkillsFromDirOptions): LoadSkillsResult {\n\tconst { dir, source } = options;\n\treturn loadSkillsFromDirInternal(dir, source, true);\n}\n\nfunction loadSkillsFromDirInternal(\n\tdir: string,\n\tsource: string,\n\tincludeRootFiles: boolean,\n\tignoreMatcher?: IgnoreMatcher,\n\trootDir?: string,\n): LoadSkillsResult {\n\tconst skills: Skill[] = [];\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\tif (!existsSync(dir)) {\n\t\treturn { skills, diagnostics };\n\t}\n\n\tconst root = rootDir ?? dir;\n\tconst ig = ignoreMatcher ?? ignore();\n\taddIgnoreRules(ig, dir, root);\n\n\ttry {\n\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.name.startsWith(\".\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip node_modules to avoid scanning dependencies\n\t\t\tif (entry.name === \"node_modules\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst fullPath = join(dir, entry.name);\n\n\t\t\t// For symlinks, check if they point to a directory and follow them\n\t\t\tlet isDirectory = entry.isDirectory();\n\t\t\tlet isFile = entry.isFile();\n\t\t\tif (entry.isSymbolicLink()) {\n\t\t\t\ttry {\n\t\t\t\t\tconst stats = statSync(fullPath);\n\t\t\t\t\tisDirectory = stats.isDirectory();\n\t\t\t\t\tisFile = stats.isFile();\n\t\t\t\t} catch {\n\t\t\t\t\t// Broken symlink, skip it\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst relPath = toPosixPath(relative(root, fullPath));\n\t\t\tconst ignorePath = isDirectory ? `${relPath}/` : relPath;\n\t\t\tif (ig.ignores(ignorePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isDirectory) {\n\t\t\t\tconst subResult = loadSkillsFromDirInternal(fullPath, source, false, ig, root);\n\t\t\t\tskills.push(...subResult.skills);\n\t\t\t\tdiagnostics.push(...subResult.diagnostics);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isFile) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isRootMd = includeRootFiles && entry.name.endsWith(\".md\");\n\t\t\tconst isSkillMd = !includeRootFiles && entry.name === \"SKILL.md\";\n\t\t\tif (!isRootMd && !isSkillMd) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst result = loadSkillFromFile(fullPath, source);\n\t\t\tif (result.skill) {\n\t\t\t\tskills.push(result.skill);\n\t\t\t}\n\t\t\tdiagnostics.push(...result.diagnostics);\n\t\t}\n\t} catch {}\n\n\treturn { skills, diagnostics };\n}\n\nfunction loadSkillFromFile(\n\tfilePath: string,\n\tsource: string,\n): { skill: Skill | null; diagnostics: ResourceDiagnostic[] } {\n\tconst diagnostics: ResourceDiagnostic[] = [];\n\n\ttry {\n\t\tconst rawContent = readFileSync(filePath, \"utf-8\");\n\t\tconst { frontmatter } = parseFrontmatter<SkillFrontmatter>(rawContent);\n\t\tconst skillDir = dirname(filePath);\n\t\tconst parentDirName = basename(skillDir);\n\n\t\t// Validate description\n\t\tconst descErrors = validateDescription(frontmatter.description);\n\t\tfor (const error of descErrors) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t}\n\n\t\t// Use name from frontmatter, or fall back to parent directory name\n\t\tconst name = frontmatter.name || parentDirName;\n\n\t\t// Validate name\n\t\tconst nameErrors = validateName(name, parentDirName);\n\t\tfor (const error of nameErrors) {\n\t\t\tdiagnostics.push({ type: \"warning\", message: error, path: filePath });\n\t\t}\n\n\t\t// Still load the skill even with warnings (unless description is completely missing)\n\t\tif (!frontmatter.description || frontmatter.description.trim() === \"\") {\n\t\t\treturn { skill: null, diagnostics };\n\t\t}\n\n\t\treturn {\n\t\t\tskill: {\n\t\t\t\tname,\n\t\t\t\tdescription: frontmatter.description,\n\t\t\t\tfilePath,\n\t\t\t\tbaseDir: skillDir,\n\t\t\t\tsource,\n\t\t\t\tdisableModelInvocation: frontmatter[\"disable-model-invocation\"] === true,\n\t\t\t},\n\t\t\tdiagnostics,\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"failed to parse skill file\";\n\t\tdiagnostics.push({ type: \"warning\", message, path: filePath });\n\t\treturn { skill: null, diagnostics };\n\t}\n}\n\n/**\n * Format skills for inclusion in a system prompt.\n * Uses XML format per Agent Skills standard.\n * See: https://agentskills.io/integrate-skills\n *\n * Skills with disableModelInvocation=true are excluded from the prompt\n * (they can only be invoked explicitly via /skill:name commands).\n */\nexport function formatSkillsForPrompt(skills: Skill[]): string {\n\tconst visibleSkills = skills.filter((s) => !s.disableModelInvocation);\n\n\tif (visibleSkills.length === 0) {\n\t\treturn \"\";\n\t}\n\n\tconst lines = [\n\t\t\"\\n\\nThe following skills provide specialized instructions for specific tasks.\",\n\t\t\"Use the Skill tool with the exact skill name from <available_skills> when the task matches its description.\",\n\t\t\"If the Skill tool reports an unknown skill, do not guess: use an exact name from <available_skills> or tell the user the skill is unavailable.\",\n\t\t\"When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\",\n\t\t\"\",\n\t\t\"<available_skills>\",\n\t];\n\n\tfor (const skill of visibleSkills) {\n\t\tlines.push(\" <skill>\");\n\t\tlines.push(` <name>${escapeXml(skill.name)}</name>`);\n\t\tlines.push(` <description>${escapeXml(skill.description)}</description>`);\n\t\tlines.push(` <location>${escapeXml(skill.filePath)}</location>`);\n\t\tlines.push(\" </skill>\");\n\t}\n\n\tlines.push(\"</available_skills>\");\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction escapeXml(str: string): string {\n\treturn str\n\t\t.replace(/&/g, \"&amp;\")\n\t\t.replace(/</g, \"&lt;\")\n\t\t.replace(/>/g, \"&gt;\")\n\t\t.replace(/\"/g, \"&quot;\")\n\t\t.replace(/'/g, \"&apos;\");\n}\n\nexport interface LoadSkillsOptions {\n\t/** Working directory for project-local skills. Default: process.cwd() */\n\tcwd?: string;\n\t/** @deprecated GSD bundled skills resolve from ~/.gsd/agent/skills/. This option is ignored. */\n\tagentDir?: string;\n\t/** Explicit skill paths (files or directories) */\n\tskillPaths?: string[];\n\t/** Include default skills directories. Default: true */\n\tincludeDefaults?: boolean;\n}\n\nfunction normalizePath(input: string): string {\n\tconst trimmed = input.trim();\n\tif (trimmed === \"~\") return homedir();\n\tif (trimmed.startsWith(\"~/\")) return join(homedir(), trimmed.slice(2));\n\tif (trimmed.startsWith(\"~\")) return join(homedir(), trimmed.slice(1));\n\treturn trimmed;\n}\n\nfunction resolveSkillPath(p: string, cwd: string): string {\n\tconst normalized = normalizePath(p);\n\treturn isAbsolute(normalized) ? normalized : resolve(cwd, normalized);\n}\n\n/**\n * Load skills from all configured locations.\n * Returns skills and any validation diagnostics.\n */\nexport function loadSkills(options: LoadSkillsOptions = {}): LoadSkillsResult {\n\tconst { cwd = process.cwd(), skillPaths = [], includeDefaults = true } = options;\n\n\tconst skillMap = new Map<string, Skill>();\n\tconst realPathSet = new Set<string>();\n\tconst allDiagnostics: ResourceDiagnostic[] = [];\n\tconst collisionDiagnostics: ResourceDiagnostic[] = [];\n\n\tfunction addSkills(result: LoadSkillsResult) {\n\t\tallDiagnostics.push(...result.diagnostics);\n\t\tfor (const skill of result.skills) {\n\t\t\t// Resolve symlinks to detect duplicate files\n\t\t\tlet realPath: string;\n\t\t\ttry {\n\t\t\t\trealPath = realpathSync(skill.filePath);\n\t\t\t} catch {\n\t\t\t\trealPath = skill.filePath;\n\t\t\t}\n\n\t\t\t// Skip silently if we've already loaded this exact file (via symlink)\n\t\t\tif (realPathSet.has(realPath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst existing = skillMap.get(skill.name);\n\t\t\tif (existing) {\n\t\t\t\tcollisionDiagnostics.push({\n\t\t\t\t\ttype: \"collision\",\n\t\t\t\t\tmessage: `name \"${skill.name}\" collision`,\n\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\tcollision: {\n\t\t\t\t\t\tresourceType: \"skill\",\n\t\t\t\t\t\tname: skill.name,\n\t\t\t\t\t\twinnerPath: existing.filePath,\n\t\t\t\t\t\tloserPath: skill.filePath,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tskillMap.set(skill.name, skill);\n\t\t\t\trealPathSet.add(realPath);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (includeDefaults) {\n\t\t// GSD-owned bundled skills win collisions inside GSD.\n\t\taddSkills(loadSkillsFromDirInternal(GSD_BUNDLED_SKILLS_DIR, \"bundled\", true));\n\t\t// User-global: ~/.agents/skills/ — the industry-standard skills.sh location\n\t\taddSkills(loadSkillsFromDirInternal(ECOSYSTEM_SKILLS_DIR, \"user\", true));\n\t\t// Project: .agents/skills/ — standard project-level location\n\t\taddSkills(loadSkillsFromDirInternal(resolve(cwd, ECOSYSTEM_PROJECT_SKILLS_DIR, \"skills\"), \"project\", true));\n\t\t// Claude Code compatibility, read-only and lower priority.\n\t\taddSkills(loadSkillsFromDirInternal(CLAUDE_SKILLS_DIR, \"user\", true));\n\t}\n\n\tconst userSkillsDir = ECOSYSTEM_SKILLS_DIR;\n\tconst projectSkillsDir = resolve(cwd, ECOSYSTEM_PROJECT_SKILLS_DIR, \"skills\");\n\n\tconst isUnderPath = (target: string, root: string): boolean => {\n\t\tconst normalizedRoot = resolve(root);\n\t\tif (target === normalizedRoot) {\n\t\t\treturn true;\n\t\t}\n\t\tconst prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;\n\t\treturn target.startsWith(prefix);\n\t};\n\n\tconst getSource = (resolvedPath: string): \"user\" | \"project\" | \"path\" => {\n\t\tif (!includeDefaults) {\n\t\t\tif (isUnderPath(resolvedPath, userSkillsDir)) return \"user\";\n\t\t\tif (isUnderPath(resolvedPath, projectSkillsDir)) return \"project\";\n\t\t}\n\t\treturn \"path\";\n\t};\n\n\tfor (const rawPath of skillPaths) {\n\t\tconst resolvedPath = resolveSkillPath(rawPath, cwd);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tallDiagnostics.push({ type: \"warning\", message: \"skill path does not exist\", path: resolvedPath });\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stats = statSync(resolvedPath);\n\t\t\tconst source = getSource(resolvedPath);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\taddSkills(loadSkillsFromDirInternal(resolvedPath, source, true));\n\t\t\t} else if (stats.isFile() && resolvedPath.endsWith(\".md\")) {\n\t\t\t\tconst result = loadSkillFromFile(resolvedPath, source);\n\t\t\t\tif (result.skill) {\n\t\t\t\t\taddSkills({ skills: [result.skill], diagnostics: result.diagnostics });\n\t\t\t\t} else {\n\t\t\t\t\tallDiagnostics.push(...result.diagnostics);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tallDiagnostics.push({ type: \"warning\", message: \"skill path is not a markdown file\", path: resolvedPath });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : \"failed to read skill path\";\n\t\t\tallDiagnostics.push({ type: \"warning\", message, path: resolvedPath });\n\t\t}\n\t}\n\n\tloadedSkills = Array.from(skillMap.values());\n\n\treturn {\n\t\tskills: [...loadedSkills],\n\t\tdiagnostics: [...allDiagnostics, ...collisionDiagnostics],\n\t};\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skills.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.test.d.ts","sourceRoot":"","sources":["../../src/core/skills.test.ts"],"names":[],"mappings":""}