gsd-pi 2.10.12 → 2.12.0

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 (504) hide show
  1. package/dist/bundled-extension-paths.d.ts +2 -0
  2. package/dist/bundled-extension-paths.js +10 -0
  3. package/dist/loader.js +45 -28
  4. package/dist/onboarding.js +100 -0
  5. package/dist/resource-loader.js +12 -3
  6. package/dist/resources/GSD-WORKFLOW.md +661 -0
  7. package/dist/resources/agents/researcher.md +29 -0
  8. package/dist/resources/agents/scout.md +56 -0
  9. package/dist/resources/agents/worker.md +31 -0
  10. package/dist/resources/extensions/ask-user-questions.ts +289 -0
  11. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +211 -0
  12. package/dist/resources/extensions/async-jobs/await-tool.ts +101 -0
  13. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +34 -0
  14. package/dist/resources/extensions/async-jobs/index.ts +133 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.ts +211 -0
  16. package/dist/resources/extensions/bg-shell/index.ts +3179 -0
  17. package/dist/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
  18. package/dist/resources/extensions/browser-tools/capture.ts +165 -0
  19. package/dist/resources/extensions/browser-tools/core.d.ts +205 -0
  20. package/dist/resources/extensions/browser-tools/core.js +1057 -0
  21. package/dist/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
  22. package/dist/resources/extensions/browser-tools/index.ts +51 -0
  23. package/dist/resources/extensions/browser-tools/lifecycle.ts +270 -0
  24. package/dist/resources/extensions/browser-tools/package.json +24 -0
  25. package/dist/resources/extensions/browser-tools/refs.ts +264 -0
  26. package/dist/resources/extensions/browser-tools/settle.ts +197 -0
  27. package/dist/resources/extensions/browser-tools/state.ts +408 -0
  28. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +652 -0
  29. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +614 -0
  30. package/dist/resources/extensions/browser-tools/tools/assertions.ts +342 -0
  31. package/dist/resources/extensions/browser-tools/tools/forms.ts +801 -0
  32. package/dist/resources/extensions/browser-tools/tools/inspection.ts +492 -0
  33. package/dist/resources/extensions/browser-tools/tools/intent.ts +614 -0
  34. package/dist/resources/extensions/browser-tools/tools/interaction.ts +865 -0
  35. package/dist/resources/extensions/browser-tools/tools/navigation.ts +232 -0
  36. package/dist/resources/extensions/browser-tools/tools/pages.ts +303 -0
  37. package/dist/resources/extensions/browser-tools/tools/refs.ts +541 -0
  38. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +83 -0
  39. package/dist/resources/extensions/browser-tools/tools/session.ts +400 -0
  40. package/dist/resources/extensions/browser-tools/tools/wait.ts +247 -0
  41. package/dist/resources/extensions/browser-tools/utils.ts +660 -0
  42. package/dist/resources/extensions/context7/index.ts +428 -0
  43. package/dist/resources/extensions/context7/package.json +11 -0
  44. package/dist/resources/extensions/get-secrets-from-user.ts +625 -0
  45. package/dist/resources/extensions/google-search/index.ts +336 -0
  46. package/dist/resources/extensions/google-search/package.json +9 -0
  47. package/dist/resources/extensions/gsd/activity-log.ts +116 -0
  48. package/dist/resources/extensions/gsd/auto.ts +3732 -0
  49. package/dist/resources/extensions/gsd/commands.ts +544 -0
  50. package/dist/resources/extensions/gsd/crash-recovery.ts +105 -0
  51. package/dist/resources/extensions/gsd/dashboard-overlay.ts +564 -0
  52. package/dist/resources/extensions/gsd/dispatch-guard.ts +78 -0
  53. package/dist/resources/extensions/gsd/docs/preferences-reference.md +278 -0
  54. package/dist/resources/extensions/gsd/doctor.ts +766 -0
  55. package/dist/resources/extensions/gsd/exit-command.ts +18 -0
  56. package/dist/resources/extensions/gsd/files.ts +857 -0
  57. package/dist/resources/extensions/gsd/git-service.ts +904 -0
  58. package/dist/resources/extensions/gsd/gitignore.ts +200 -0
  59. package/dist/resources/extensions/gsd/guided-flow.ts +1054 -0
  60. package/dist/resources/extensions/gsd/index.ts +735 -0
  61. package/dist/resources/extensions/gsd/metrics.ts +374 -0
  62. package/dist/resources/extensions/gsd/migrate/command.ts +218 -0
  63. package/dist/resources/extensions/gsd/migrate/index.ts +42 -0
  64. package/dist/resources/extensions/gsd/migrate/parser.ts +323 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.ts +624 -0
  66. package/dist/resources/extensions/gsd/migrate/preview.ts +48 -0
  67. package/dist/resources/extensions/gsd/migrate/transformer.ts +346 -0
  68. package/dist/resources/extensions/gsd/migrate/types.ts +370 -0
  69. package/dist/resources/extensions/gsd/migrate/validator.ts +55 -0
  70. package/dist/resources/extensions/gsd/migrate/writer.ts +539 -0
  71. package/dist/resources/extensions/gsd/native-git-bridge.ts +181 -0
  72. package/dist/resources/extensions/gsd/native-parser-bridge.ts +135 -0
  73. package/dist/resources/extensions/gsd/observability-validator.ts +408 -0
  74. package/dist/resources/extensions/gsd/package.json +11 -0
  75. package/dist/resources/extensions/gsd/paths.ts +339 -0
  76. package/dist/resources/extensions/gsd/post-unit-hooks.ts +449 -0
  77. package/dist/resources/extensions/gsd/preferences.ts +988 -0
  78. package/dist/resources/extensions/gsd/prompt-loader.ts +92 -0
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +27 -0
  81. package/dist/resources/extensions/gsd/prompts/discuss.md +237 -0
  82. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
  83. package/dist/resources/extensions/gsd/prompts/execute-task.md +63 -0
  84. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -0
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -0
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +61 -0
  87. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +3 -0
  88. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +29 -0
  89. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -0
  90. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +13 -0
  91. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  92. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +78 -0
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +55 -0
  94. package/dist/resources/extensions/gsd/prompts/queue.md +100 -0
  95. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
  96. package/dist/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  97. package/dist/resources/extensions/gsd/prompts/research-milestone.md +37 -0
  98. package/dist/resources/extensions/gsd/prompts/research-slice.md +28 -0
  99. package/dist/resources/extensions/gsd/prompts/review-migration.md +66 -0
  100. package/dist/resources/extensions/gsd/prompts/run-uat.md +109 -0
  101. package/dist/resources/extensions/gsd/prompts/system.md +190 -0
  102. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
  103. package/dist/resources/extensions/gsd/roadmap-slices.ts +50 -0
  104. package/dist/resources/extensions/gsd/session-forensics.ts +500 -0
  105. package/dist/resources/extensions/gsd/skill-discovery.ts +137 -0
  106. package/dist/resources/extensions/gsd/state.ts +569 -0
  107. package/dist/resources/extensions/gsd/templates/context.md +76 -0
  108. package/dist/resources/extensions/gsd/templates/decisions.md +8 -0
  109. package/dist/resources/extensions/gsd/templates/milestone-summary.md +73 -0
  110. package/dist/resources/extensions/gsd/templates/plan.md +131 -0
  111. package/dist/resources/extensions/gsd/templates/preferences.md +23 -0
  112. package/dist/resources/extensions/gsd/templates/project.md +31 -0
  113. package/dist/resources/extensions/gsd/templates/reassessment.md +28 -0
  114. package/dist/resources/extensions/gsd/templates/requirements.md +81 -0
  115. package/dist/resources/extensions/gsd/templates/research.md +46 -0
  116. package/dist/resources/extensions/gsd/templates/roadmap.md +118 -0
  117. package/dist/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
  118. package/dist/resources/extensions/gsd/templates/slice-context.md +58 -0
  119. package/dist/resources/extensions/gsd/templates/slice-summary.md +99 -0
  120. package/dist/resources/extensions/gsd/templates/state.md +19 -0
  121. package/dist/resources/extensions/gsd/templates/task-plan.md +52 -0
  122. package/dist/resources/extensions/gsd/templates/task-summary.md +57 -0
  123. package/dist/resources/extensions/gsd/templates/uat.md +54 -0
  124. package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +297 -0
  125. package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  126. package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +109 -0
  127. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +45 -0
  128. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +196 -0
  129. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  130. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +469 -0
  131. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +200 -0
  132. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +134 -0
  133. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +312 -0
  134. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +299 -0
  135. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +660 -0
  136. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +27 -0
  137. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +91 -0
  138. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +170 -0
  139. package/dist/resources/extensions/gsd/tests/doctor.test.ts +594 -0
  140. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +169 -0
  141. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +50 -0
  142. package/dist/resources/extensions/gsd/tests/git-service.test.ts +1788 -0
  143. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +577 -0
  144. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +580 -0
  145. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +283 -0
  146. package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +176 -0
  147. package/dist/resources/extensions/gsd/tests/metrics.test.ts +188 -0
  148. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +369 -0
  149. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +757 -0
  150. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +635 -0
  151. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +414 -0
  152. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +297 -0
  153. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +398 -0
  154. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +291 -0
  155. package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  156. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +66 -0
  157. package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +353 -0
  158. package/dist/resources/extensions/gsd/tests/parsers.test.ts +1664 -0
  159. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +133 -0
  160. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +363 -0
  161. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  162. package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  163. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +126 -0
  164. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +142 -0
  165. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +281 -0
  166. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
  167. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  168. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +493 -0
  169. package/dist/resources/extensions/gsd/tests/requirements.test.ts +106 -0
  170. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +35 -0
  171. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
  172. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +41 -0
  173. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +316 -0
  174. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +185 -0
  175. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +123 -0
  176. package/dist/resources/extensions/gsd/tests/test-helpers.ts +61 -0
  177. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +219 -0
  178. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +234 -0
  179. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +75 -0
  180. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +234 -0
  181. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +141 -0
  182. package/dist/resources/extensions/gsd/tests/worktree.test.ts +597 -0
  183. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +122 -0
  184. package/dist/resources/extensions/gsd/types.ts +296 -0
  185. package/dist/resources/extensions/gsd/unit-runtime.ts +184 -0
  186. package/dist/resources/extensions/gsd/workspace-index.ts +189 -0
  187. package/dist/resources/extensions/gsd/worktree-command.ts +845 -0
  188. package/dist/resources/extensions/gsd/worktree-manager.ts +459 -0
  189. package/dist/resources/extensions/gsd/{worktree.js → worktree.ts} +92 -61
  190. package/dist/resources/extensions/mac-tools/index.ts +852 -0
  191. package/dist/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  192. package/dist/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  193. package/dist/resources/extensions/mcporter/index.ts +429 -0
  194. package/dist/resources/extensions/remote-questions/config.ts +81 -0
  195. package/dist/resources/extensions/remote-questions/discord-adapter.ts +128 -0
  196. package/dist/resources/extensions/remote-questions/format.ts +163 -0
  197. package/dist/resources/extensions/remote-questions/manager.ts +192 -0
  198. package/dist/resources/extensions/remote-questions/remote-command.ts +361 -0
  199. package/dist/resources/extensions/remote-questions/slack-adapter.ts +92 -0
  200. package/dist/resources/extensions/remote-questions/status.ts +31 -0
  201. package/dist/resources/extensions/remote-questions/store.ts +77 -0
  202. package/dist/resources/extensions/remote-questions/types.ts +75 -0
  203. package/dist/resources/extensions/search-the-web/cache.ts +78 -0
  204. package/dist/resources/extensions/search-the-web/command-search-provider.ts +99 -0
  205. package/dist/resources/extensions/search-the-web/format.ts +258 -0
  206. package/dist/resources/extensions/search-the-web/http.ts +238 -0
  207. package/dist/resources/extensions/search-the-web/index.ts +65 -0
  208. package/dist/resources/extensions/search-the-web/native-search.ts +165 -0
  209. package/dist/resources/extensions/search-the-web/provider.ts +136 -0
  210. package/dist/resources/extensions/search-the-web/tavily.ts +116 -0
  211. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +581 -0
  212. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +620 -0
  213. package/dist/resources/extensions/search-the-web/tool-search.ts +635 -0
  214. package/dist/resources/extensions/search-the-web/url-utils.ts +91 -0
  215. package/dist/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  216. package/dist/resources/extensions/shared/confirm-ui.ts +126 -0
  217. package/dist/resources/extensions/shared/interview-ui.ts +613 -0
  218. package/dist/resources/extensions/shared/next-action-ui.ts +197 -0
  219. package/dist/resources/extensions/shared/progress-widget.ts +282 -0
  220. package/dist/resources/extensions/shared/terminal.ts +23 -0
  221. package/dist/resources/extensions/shared/thinking-widget.ts +107 -0
  222. package/dist/resources/extensions/shared/ui.ts +400 -0
  223. package/dist/resources/extensions/shared/wizard-ui.ts +551 -0
  224. package/dist/resources/extensions/slash-commands/audit.ts +88 -0
  225. package/dist/resources/extensions/slash-commands/clear.ts +10 -0
  226. package/dist/resources/extensions/slash-commands/create-extension.ts +297 -0
  227. package/dist/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  228. package/dist/resources/extensions/slash-commands/index.ts +12 -0
  229. package/dist/resources/extensions/subagent/agents.ts +126 -0
  230. package/dist/resources/extensions/subagent/index.ts +1072 -0
  231. package/dist/resources/extensions/subagent/isolation.ts +498 -0
  232. package/dist/resources/extensions/ttsr/index.ts +163 -0
  233. package/dist/resources/extensions/ttsr/rule-loader.ts +121 -0
  234. package/dist/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
  235. package/dist/resources/extensions/ttsr/ttsr-manager.ts +430 -0
  236. package/dist/resources/extensions/universal-config/discovery.ts +78 -0
  237. package/dist/resources/extensions/universal-config/format.ts +160 -0
  238. package/dist/resources/extensions/universal-config/index.ts +118 -0
  239. package/dist/resources/extensions/universal-config/package.json +11 -0
  240. package/dist/resources/extensions/universal-config/scanners.ts +579 -0
  241. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +111 -0
  242. package/dist/resources/extensions/universal-config/tests/format.test.ts +111 -0
  243. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +438 -0
  244. package/dist/resources/extensions/universal-config/tools.ts +60 -0
  245. package/dist/resources/extensions/universal-config/types.ts +116 -0
  246. package/dist/resources/extensions/voice/index.ts +271 -0
  247. package/dist/resources/extensions/voice/speech-recognizer.py +504 -0
  248. package/dist/resources/extensions/voice/speech-recognizer.swift +154 -0
  249. package/dist/resources/skills/debug-like-expert/SKILL.md +231 -0
  250. package/dist/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  251. package/dist/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  252. package/dist/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  253. package/dist/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  254. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  255. package/dist/resources/skills/frontend-design/SKILL.md +45 -0
  256. package/dist/resources/skills/github-workflows/SKILL.md +92 -0
  257. package/dist/resources/skills/github-workflows/references/gh/SKILL.md +255 -0
  258. package/dist/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
  259. package/dist/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
  260. package/dist/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
  261. package/dist/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
  262. package/dist/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
  263. package/dist/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
  264. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  265. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  266. package/dist/resources/skills/swiftui/SKILL.md +208 -0
  267. package/dist/resources/skills/swiftui/references/animations.md +921 -0
  268. package/dist/resources/skills/swiftui/references/architecture.md +1561 -0
  269. package/dist/resources/skills/swiftui/references/layout-system.md +1186 -0
  270. package/dist/resources/skills/swiftui/references/navigation.md +1492 -0
  271. package/dist/resources/skills/swiftui/references/networking-async.md +214 -0
  272. package/dist/resources/skills/swiftui/references/performance.md +1706 -0
  273. package/dist/resources/skills/swiftui/references/platform-integration.md +204 -0
  274. package/dist/resources/skills/swiftui/references/state-management.md +1443 -0
  275. package/dist/resources/skills/swiftui/references/swiftdata.md +297 -0
  276. package/dist/resources/skills/swiftui/references/testing-debugging.md +247 -0
  277. package/dist/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
  278. package/dist/resources/skills/swiftui/workflows/add-feature.md +191 -0
  279. package/dist/resources/skills/swiftui/workflows/build-new-app.md +311 -0
  280. package/dist/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
  281. package/dist/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
  282. package/dist/resources/skills/swiftui/workflows/ship-app.md +203 -0
  283. package/dist/resources/skills/swiftui/workflows/write-tests.md +235 -0
  284. package/dist/wizard.js +1 -0
  285. package/package.json +8 -6
  286. package/packages/native/dist/fd/index.d.ts +1 -0
  287. package/packages/native/dist/fd/index.js +1 -0
  288. package/packages/native/dist/grep/index.d.ts +2 -1
  289. package/packages/native/dist/grep/index.js +1 -0
  290. package/packages/native/src/__tests__/fd.test.mjs +35 -0
  291. package/packages/native/src/__tests__/grep.test.mjs +26 -9
  292. package/packages/native/src/fd/index.ts +1 -0
  293. package/packages/native/src/grep/index.ts +3 -2
  294. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  295. package/packages/pi-agent-core/dist/agent-loop.js +169 -55
  296. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  297. package/packages/pi-agent-core/dist/agent.d.ts +13 -1
  298. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  299. package/packages/pi-agent-core/dist/agent.js +16 -0
  300. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  301. package/packages/pi-agent-core/dist/types.d.ts +91 -1
  302. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  303. package/packages/pi-agent-core/dist/types.js.map +1 -1
  304. package/packages/pi-agent-core/src/agent-loop.ts +273 -63
  305. package/packages/pi-agent-core/src/agent.ts +24 -0
  306. package/packages/pi-agent-core/src/types.ts +98 -0
  307. package/packages/pi-ai/dist/env-api-keys.js +2 -0
  308. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +314 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +236 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/google-gemini-cli.js +6 -0
  315. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/providers/openai-completions.js +2 -0
  318. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  319. package/packages/pi-ai/dist/types.d.ts +1 -1
  320. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/types.js.map +1 -1
  322. package/packages/pi-ai/src/env-api-keys.ts +2 -0
  323. package/packages/pi-ai/src/models.generated.ts +236 -0
  324. package/packages/pi-ai/src/providers/google-gemini-cli.ts +8 -0
  325. package/packages/pi-ai/src/providers/openai-completions.ts +3 -0
  326. package/packages/pi-ai/src/types.ts +2 -1
  327. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/cli/args.js +1 -0
  329. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +26 -0
  331. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/agent-session.js +137 -22
  333. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +20 -0
  335. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/auth-storage.js +43 -0
  337. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts +51 -0
  339. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +119 -0
  341. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts +2 -0
  343. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +183 -0
  345. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  347. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  349. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  352. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +12 -1
  354. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/session-manager.js +37 -1
  356. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/core/session-manager.test.js +61 -0
  360. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  362. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/settings-manager.js +47 -0
  364. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/find.js +1 -0
  367. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +6 -15
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +18 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +46 -4
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -2
  377. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  378. package/packages/pi-coding-agent/src/cli/args.ts +1 -0
  379. package/packages/pi-coding-agent/src/core/agent-session.ts +167 -22
  380. package/packages/pi-coding-agent/src/core/auth-storage.ts +45 -0
  381. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +229 -0
  382. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +165 -0
  383. package/packages/pi-coding-agent/src/core/index.ts +1 -0
  384. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  385. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -0
  386. package/packages/pi-coding-agent/src/core/session-manager.ts +51 -1
  387. package/packages/pi-coding-agent/src/core/settings-manager.ts +66 -0
  388. package/packages/pi-coding-agent/src/core/tools/find.ts +1 -0
  389. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +6 -16
  390. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +49 -4
  391. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -2
  392. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  393. package/packages/pi-tui/dist/autocomplete.js +3 -4
  394. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  395. package/packages/pi-tui/dist/components/editor.d.ts +7 -0
  396. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  397. package/packages/pi-tui/dist/components/editor.js +57 -50
  398. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  399. package/packages/pi-tui/src/autocomplete.ts +3 -5
  400. package/packages/pi-tui/src/components/editor.ts +70 -49
  401. package/pkg/dist/core/export-html/ansi-to-html.d.ts +22 -0
  402. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  403. package/pkg/dist/core/export-html/ansi-to-html.js +249 -0
  404. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -0
  405. package/pkg/dist/core/export-html/index.d.ts +37 -0
  406. package/pkg/dist/core/export-html/index.d.ts.map +1 -0
  407. package/pkg/dist/core/export-html/index.js +223 -0
  408. package/pkg/dist/core/export-html/index.js.map +1 -0
  409. package/pkg/dist/core/export-html/template.css +971 -0
  410. package/pkg/dist/core/export-html/template.html +54 -0
  411. package/pkg/dist/core/export-html/template.js +1583 -0
  412. package/pkg/dist/core/export-html/tool-renderer.d.ts +38 -0
  413. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  414. package/pkg/dist/core/export-html/tool-renderer.js +70 -0
  415. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -0
  416. package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
  417. package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
  418. package/scripts/postinstall.js +30 -17
  419. package/src/resources/extensions/bg-shell/index.ts +51 -7
  420. package/src/resources/extensions/gsd/activity-log.ts +61 -14
  421. package/src/resources/extensions/gsd/auto.ts +288 -19
  422. package/src/resources/extensions/gsd/commands.ts +9 -3
  423. package/src/resources/extensions/gsd/dashboard-overlay.ts +55 -12
  424. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -0
  425. package/src/resources/extensions/gsd/doctor.ts +60 -3
  426. package/src/resources/extensions/gsd/files.ts +45 -1
  427. package/src/resources/extensions/gsd/git-service.ts +46 -41
  428. package/src/resources/extensions/gsd/guided-flow.ts +81 -9
  429. package/src/resources/extensions/gsd/index.ts +62 -1
  430. package/src/resources/extensions/gsd/native-git-bridge.ts +181 -0
  431. package/src/resources/extensions/gsd/paths.ts +35 -4
  432. package/src/resources/extensions/gsd/post-unit-hooks.ts +449 -0
  433. package/src/resources/extensions/gsd/preferences.ts +232 -1
  434. package/src/resources/extensions/gsd/prompt-loader.ts +45 -3
  435. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  436. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -3
  437. package/src/resources/extensions/gsd/prompts/discuss.md +10 -8
  438. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  439. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -1
  440. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -1
  441. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
  442. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +3 -1
  443. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +4 -2
  444. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -1
  445. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +3 -1
  446. package/src/resources/extensions/gsd/prompts/plan-milestone.md +9 -12
  447. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -3
  448. package/src/resources/extensions/gsd/prompts/queue.md +3 -1
  449. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  450. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  451. package/src/resources/extensions/gsd/state.ts +130 -18
  452. package/src/resources/extensions/gsd/templates/context.md +1 -1
  453. package/src/resources/extensions/gsd/templates/state.md +3 -3
  454. package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +5 -1
  456. package/src/resources/extensions/gsd/tests/doctor.test.ts +115 -1
  457. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +6 -2
  458. package/src/resources/extensions/gsd/tests/git-service.test.ts +35 -35
  459. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +8 -8
  460. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +4 -1
  461. package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  462. package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +5 -5
  463. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  464. package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  465. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +12 -0
  466. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +6 -0
  467. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +4 -4
  468. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +4 -4
  469. package/src/resources/extensions/gsd/tests/worktree.test.ts +19 -19
  470. package/src/resources/extensions/gsd/types.ts +109 -0
  471. package/src/resources/extensions/gsd/worktree-manager.ts +72 -13
  472. package/src/resources/extensions/gsd/worktree.ts +5 -4
  473. package/src/resources/extensions/search-the-web/command-search-provider.ts +8 -4
  474. package/src/resources/extensions/search-the-web/native-search.ts +32 -23
  475. package/src/resources/extensions/search-the-web/provider.ts +19 -2
  476. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +62 -0
  477. package/src/resources/extensions/search-the-web/tool-llm-context.ts +62 -3
  478. package/src/resources/extensions/search-the-web/tool-search.ts +62 -3
  479. package/src/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  480. package/src/resources/extensions/subagent/index.ts +2 -1
  481. package/src/resources/skills/github-workflows/SKILL.md +5 -0
  482. package/dist/resources/extensions/gsd/git-service.d.ts +0 -225
  483. package/dist/resources/extensions/gsd/git-service.js +0 -756
  484. package/dist/resources/extensions/gsd/preferences.d.ts +0 -122
  485. package/dist/resources/extensions/gsd/preferences.js +0 -616
  486. package/dist/resources/extensions/gsd/worktree.d.ts +0 -106
  487. package/dist/resources/extensions/remote-questions/config.d.ts +0 -14
  488. package/dist/resources/extensions/remote-questions/config.js +0 -68
  489. package/dist/resources/extensions/remote-questions/discord-adapter.d.ts +0 -17
  490. package/dist/resources/extensions/remote-questions/discord-adapter.js +0 -118
  491. package/dist/resources/extensions/remote-questions/format.d.ts +0 -38
  492. package/dist/resources/extensions/remote-questions/format.js +0 -119
  493. package/dist/resources/extensions/remote-questions/manager.d.ts +0 -23
  494. package/dist/resources/extensions/remote-questions/manager.js +0 -161
  495. package/dist/resources/extensions/remote-questions/remote-command.d.ts +0 -6
  496. package/dist/resources/extensions/remote-questions/remote-command.js +0 -358
  497. package/dist/resources/extensions/remote-questions/slack-adapter.d.ts +0 -15
  498. package/dist/resources/extensions/remote-questions/slack-adapter.js +0 -82
  499. package/dist/resources/extensions/remote-questions/status.d.ts +0 -9
  500. package/dist/resources/extensions/remote-questions/status.js +0 -25
  501. package/dist/resources/extensions/remote-questions/store.d.ts +0 -11
  502. package/dist/resources/extensions/remote-questions/store.js +0 -66
  503. package/dist/resources/extensions/remote-questions/types.d.ts +0 -68
  504. package/dist/resources/extensions/remote-questions/types.js +0 -4
@@ -1,106 +0,0 @@
1
- /**
2
- * GSD Slice Branch Management — Thin Facade
3
- *
4
- * Simple branch-per-slice workflow. No worktrees, no registry.
5
- * Runtime state (metrics, activity, lock, STATE.md) is gitignored
6
- * so branch switches are clean.
7
- *
8
- * All git-mutation functions delegate to GitServiceImpl from git-service.ts.
9
- * Pure utility functions (detectWorktreeName, getSliceBranchName, parseSliceBranch,
10
- * SLICE_BRANCH_RE) remain standalone.
11
- *
12
- * Flow:
13
- * 1. ensureSliceBranch() — create + checkout slice branch
14
- * 2. agent does work, commits
15
- * 3. mergeSliceToMain() — checkout integration branch, squash-merge, delete slice branch
16
- */
17
- export type { MergeSliceResult } from "./git-service.js";
18
- export { MergeConflictError } from "./git-service.js";
19
- /**
20
- * Set the active milestone ID on the cached GitServiceImpl.
21
- * This enables integration branch resolution in getMainBranch().
22
- */
23
- export declare function setActiveMilestoneId(basePath: string, milestoneId: string | null): void;
24
- /**
25
- * Record the current branch as the integration branch for a milestone.
26
- * Called once when auto-mode starts — captures where slice branches should
27
- * merge back to. No-op if the same branch is already recorded. Updates the
28
- * record when the user starts from a different branch (#300). Always a no-op
29
- * if on a GSD slice branch.
30
- */
31
- export declare function captureIntegrationBranch(basePath: string, milestoneId: string): void;
32
- /**
33
- * Detect the active worktree name from the current working directory.
34
- * Returns null if not inside a GSD worktree (.gsd/worktrees/<name>/).
35
- */
36
- export declare function detectWorktreeName(basePath: string): string | null;
37
- /**
38
- * Get the slice branch name, namespaced by worktree when inside one.
39
- *
40
- * In the main tree: gsd/<milestoneId>/<sliceId>
41
- * In a worktree: gsd/<worktreeName>/<milestoneId>/<sliceId>
42
- *
43
- * This prevents branch conflicts when multiple worktrees work on the
44
- * same milestone/slice IDs — git doesn't allow a branch to be checked
45
- * out in more than one worktree simultaneously.
46
- */
47
- export declare function getSliceBranchName(milestoneId: string, sliceId: string, worktreeName?: string | null): string;
48
- /** Regex that matches both plain and worktree-namespaced slice branches. */
49
- export declare const SLICE_BRANCH_RE: RegExp;
50
- /**
51
- * Parse a slice branch name into its components.
52
- * Handles both `gsd/M001/S01` and `gsd/myworktree/M001/S01`.
53
- */
54
- export declare function parseSliceBranch(branchName: string): {
55
- worktreeName: string | null;
56
- milestoneId: string;
57
- sliceId: string;
58
- } | null;
59
- /**
60
- * Get the "main" branch for GSD slice operations.
61
- *
62
- * In the main working tree: returns main/master (the repo's default branch).
63
- * In a worktree: returns worktree/<name> — the worktree's own base branch.
64
- *
65
- * This is critical because git doesn't allow a branch to be checked out
66
- * in more than one worktree. Slice branches merge into the worktree's base
67
- * branch, and the worktree branch later merges into the real main via
68
- * /worktree merge.
69
- */
70
- export declare function getMainBranch(basePath: string): string;
71
- export declare function getCurrentBranch(basePath: string): string;
72
- /**
73
- * Ensure the slice branch exists and is checked out.
74
- * Creates the branch from the current branch if it's not a slice branch,
75
- * otherwise from main. This preserves planning artifacts (CONTEXT, ROADMAP,
76
- * etc.) that were committed on the working branch — which may differ from
77
- * the repo's default branch (e.g. `developer` vs `main`).
78
- * When inside a worktree, the branch is namespaced to avoid conflicts.
79
- * Returns true if the branch was newly created.
80
- */
81
- export declare function ensureSliceBranch(basePath: string, milestoneId: string, sliceId: string): boolean;
82
- /**
83
- * Auto-commit any dirty files in the current working tree.
84
- * Returns the commit message used, or null if already clean.
85
- */
86
- export declare function autoCommitCurrentBranch(basePath: string, unitType: string, unitId: string): string | null;
87
- /**
88
- * Switch to the integration branch, auto-committing any dirty files on the current branch first.
89
- */
90
- export declare function switchToMain(basePath: string): void;
91
- /**
92
- * Squash-merge a completed slice branch into the integration branch.
93
- * Expects to already be on the integration branch (call switchToMain first).
94
- * Deletes the slice branch after merge.
95
- */
96
- export declare function mergeSliceToMain(basePath: string, milestoneId: string, sliceId: string, sliceTitle: string): import("./git-service.ts").MergeSliceResult;
97
- /**
98
- * Check if we're currently on a slice branch (not main).
99
- * Handles both plain (gsd/M001/S01) and worktree-namespaced (gsd/wt/M001/S01) branches.
100
- */
101
- export declare function isOnSliceBranch(basePath: string): boolean;
102
- /**
103
- * Get the active slice branch name, or null if on main.
104
- * Handles both plain and worktree-namespaced branch patterns.
105
- */
106
- export declare function getActiveSliceBranch(basePath: string): string | null;
@@ -1,14 +0,0 @@
1
- /**
2
- * Remote Questions — configuration resolution and validation
3
- */
4
- import type { RemoteChannel } from "./types.js";
5
- export interface ResolvedConfig {
6
- channel: RemoteChannel;
7
- channelId: string;
8
- timeoutMs: number;
9
- pollIntervalMs: number;
10
- token: string;
11
- }
12
- export declare function resolveRemoteConfig(): ResolvedConfig | null;
13
- export declare function getRemoteConfigStatus(): string;
14
- export declare function isValidChannelId(channel: RemoteChannel, id: string): boolean;
@@ -1,68 +0,0 @@
1
- /**
2
- * Remote Questions — configuration resolution and validation
3
- */
4
- import { loadEffectiveGSDPreferences } from "../gsd/preferences.js";
5
- const ENV_KEYS = {
6
- slack: "SLACK_BOT_TOKEN",
7
- discord: "DISCORD_BOT_TOKEN",
8
- };
9
- // Channel ID format validation — prevents SSRF if preferences are attacker-controlled
10
- const CHANNEL_ID_PATTERNS = {
11
- slack: /^[A-Z0-9]{9,12}$/,
12
- discord: /^\d{17,20}$/,
13
- };
14
- const DEFAULT_TIMEOUT_MINUTES = 5;
15
- const DEFAULT_POLL_INTERVAL_SECONDS = 5;
16
- const MIN_TIMEOUT_MINUTES = 1;
17
- const MAX_TIMEOUT_MINUTES = 30;
18
- const MIN_POLL_INTERVAL_SECONDS = 2;
19
- const MAX_POLL_INTERVAL_SECONDS = 30;
20
- export function resolveRemoteConfig() {
21
- const prefs = loadEffectiveGSDPreferences();
22
- const rq = prefs?.preferences.remote_questions;
23
- if (!rq || !rq.channel || !rq.channel_id)
24
- return null;
25
- if (rq.channel !== "slack" && rq.channel !== "discord")
26
- return null;
27
- const channelId = String(rq.channel_id);
28
- if (!CHANNEL_ID_PATTERNS[rq.channel].test(channelId))
29
- return null;
30
- const token = process.env[ENV_KEYS[rq.channel]];
31
- if (!token)
32
- return null;
33
- const timeoutMinutes = clampNumber(rq.timeout_minutes, DEFAULT_TIMEOUT_MINUTES, MIN_TIMEOUT_MINUTES, MAX_TIMEOUT_MINUTES);
34
- const pollIntervalSeconds = clampNumber(rq.poll_interval_seconds, DEFAULT_POLL_INTERVAL_SECONDS, MIN_POLL_INTERVAL_SECONDS, MAX_POLL_INTERVAL_SECONDS);
35
- return {
36
- channel: rq.channel,
37
- channelId,
38
- timeoutMs: timeoutMinutes * 60 * 1000,
39
- pollIntervalMs: pollIntervalSeconds * 1000,
40
- token,
41
- };
42
- }
43
- export function getRemoteConfigStatus() {
44
- const prefs = loadEffectiveGSDPreferences();
45
- const rq = prefs?.preferences.remote_questions;
46
- if (!rq || !rq.channel || !rq.channel_id)
47
- return "Remote questions: not configured";
48
- if (rq.channel !== "slack" && rq.channel !== "discord")
49
- return `Remote questions: unknown channel type \"${rq.channel}\"`;
50
- const channelId = String(rq.channel_id);
51
- if (!CHANNEL_ID_PATTERNS[rq.channel].test(channelId))
52
- return `Remote questions: invalid ${rq.channel} channel ID format`;
53
- const envVar = ENV_KEYS[rq.channel];
54
- if (!process.env[envVar])
55
- return `Remote questions: ${envVar} not set — remote questions disabled`;
56
- const timeoutMinutes = clampNumber(rq.timeout_minutes, DEFAULT_TIMEOUT_MINUTES, MIN_TIMEOUT_MINUTES, MAX_TIMEOUT_MINUTES);
57
- const pollIntervalSeconds = clampNumber(rq.poll_interval_seconds, DEFAULT_POLL_INTERVAL_SECONDS, MIN_POLL_INTERVAL_SECONDS, MAX_POLL_INTERVAL_SECONDS);
58
- return `Remote questions: ${rq.channel} configured (timeout ${timeoutMinutes}m, poll ${pollIntervalSeconds}s)`;
59
- }
60
- export function isValidChannelId(channel, id) {
61
- return CHANNEL_ID_PATTERNS[channel].test(id);
62
- }
63
- function clampNumber(value, fallback, min, max) {
64
- const n = typeof value === "number" ? value : Number(value);
65
- if (!Number.isFinite(n))
66
- return fallback;
67
- return Math.max(min, Math.min(max, n));
68
- }
@@ -1,17 +0,0 @@
1
- /**
2
- * Remote Questions — Discord adapter
3
- */
4
- import type { ChannelAdapter, RemotePrompt, RemoteDispatchResult, RemoteAnswer, RemotePromptRef } from "./types.js";
5
- export declare class DiscordAdapter implements ChannelAdapter {
6
- readonly name: "discord";
7
- private botUserId;
8
- private readonly token;
9
- private readonly channelId;
10
- constructor(token: string, channelId: string);
11
- validate(): Promise<void>;
12
- sendPrompt(prompt: RemotePrompt): Promise<RemoteDispatchResult>;
13
- pollAnswer(prompt: RemotePrompt, ref: RemotePromptRef): Promise<RemoteAnswer | null>;
14
- private checkReactions;
15
- private checkReplies;
16
- private discordApi;
17
- }
@@ -1,118 +0,0 @@
1
- /**
2
- * Remote Questions — Discord adapter
3
- */
4
- import { formatForDiscord, parseDiscordResponse } from "./format.js";
5
- const DISCORD_API = "https://discord.com/api/v10";
6
- const PER_REQUEST_TIMEOUT_MS = 15_000;
7
- const NUMBER_EMOJIS = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣"];
8
- export class DiscordAdapter {
9
- name = "discord";
10
- botUserId = null;
11
- token;
12
- channelId;
13
- constructor(token, channelId) {
14
- this.token = token;
15
- this.channelId = channelId;
16
- }
17
- async validate() {
18
- const res = await this.discordApi("GET", "/users/@me");
19
- if (!res.id)
20
- throw new Error("Discord auth failed: invalid token");
21
- this.botUserId = String(res.id);
22
- }
23
- async sendPrompt(prompt) {
24
- const { embeds, reactionEmojis } = formatForDiscord(prompt);
25
- const res = await this.discordApi("POST", `/channels/${this.channelId}/messages`, {
26
- content: "**GSD needs your input** — reply to this message with your answer",
27
- embeds,
28
- });
29
- if (!res.id)
30
- throw new Error(`Discord send failed: ${JSON.stringify(res)}`);
31
- const messageId = String(res.id);
32
- if (prompt.questions.length === 1) {
33
- for (const emoji of reactionEmojis) {
34
- try {
35
- await this.discordApi("PUT", `/channels/${this.channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/@me`);
36
- }
37
- catch {
38
- // Best-effort only
39
- }
40
- }
41
- }
42
- return {
43
- ref: {
44
- id: prompt.id,
45
- channel: "discord",
46
- messageId,
47
- channelId: this.channelId,
48
- },
49
- };
50
- }
51
- async pollAnswer(prompt, ref) {
52
- if (!this.botUserId)
53
- await this.validate();
54
- if (prompt.questions.length === 1) {
55
- const reactionAnswer = await this.checkReactions(prompt, ref);
56
- if (reactionAnswer)
57
- return reactionAnswer;
58
- }
59
- return this.checkReplies(prompt, ref);
60
- }
61
- async checkReactions(prompt, ref) {
62
- const reactions = [];
63
- for (const emoji of NUMBER_EMOJIS) {
64
- try {
65
- const users = await this.discordApi("GET", `/channels/${ref.channelId}/messages/${ref.messageId}/reactions/${encodeURIComponent(emoji)}`);
66
- if (Array.isArray(users)) {
67
- const humanUsers = users.filter((u) => u.id !== this.botUserId);
68
- if (humanUsers.length > 0)
69
- reactions.push({ emoji, count: humanUsers.length });
70
- }
71
- }
72
- catch (err) {
73
- const msg = String(err.message ?? "");
74
- // 404 = no reactions for this emoji — expected, continue
75
- if (msg.includes("HTTP 404"))
76
- continue;
77
- // 401/403 = auth failure — surface to caller so it can fail the poll
78
- if (msg.includes("HTTP 401") || msg.includes("HTTP 403"))
79
- throw err;
80
- // Other errors (rate limit, network) — skip this emoji, best-effort
81
- }
82
- }
83
- if (reactions.length === 0)
84
- return null;
85
- return parseDiscordResponse(reactions, null, prompt.questions);
86
- }
87
- async checkReplies(prompt, ref) {
88
- const messages = await this.discordApi("GET", `/channels/${ref.channelId}/messages?after=${ref.messageId}&limit=10`);
89
- if (!Array.isArray(messages))
90
- return null;
91
- const replies = messages.filter((m) => m.author?.id &&
92
- m.author.id !== this.botUserId &&
93
- m.message_reference?.message_id === ref.messageId &&
94
- m.content);
95
- if (replies.length === 0)
96
- return null;
97
- return parseDiscordResponse([], String(replies[0].content), prompt.questions);
98
- }
99
- async discordApi(method, path, body) {
100
- const headers = { Authorization: `Bot ${this.token}` };
101
- const init = { method, headers };
102
- if (body) {
103
- headers["Content-Type"] = "application/json";
104
- init.body = JSON.stringify(body);
105
- }
106
- init.signal = AbortSignal.timeout(PER_REQUEST_TIMEOUT_MS);
107
- const response = await fetch(`${DISCORD_API}${path}`, init);
108
- if (response.status === 204)
109
- return {};
110
- if (!response.ok) {
111
- const text = await response.text().catch(() => "");
112
- // Limit error body length to avoid leaking verbose Discord error responses
113
- const safeText = text.length > 200 ? text.slice(0, 200) + "…" : text;
114
- throw new Error(`Discord API HTTP ${response.status}: ${safeText}`);
115
- }
116
- return response.json();
117
- }
118
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * Remote Questions — payload formatting and parsing helpers
3
- */
4
- import type { RemotePrompt, RemoteQuestion, RemoteAnswer } from "./types.js";
5
- export interface SlackBlock {
6
- type: string;
7
- text?: {
8
- type: string;
9
- text: string;
10
- };
11
- elements?: Array<{
12
- type: string;
13
- text: string;
14
- }>;
15
- }
16
- export interface DiscordEmbed {
17
- title: string;
18
- description: string;
19
- color: number;
20
- fields: Array<{
21
- name: string;
22
- value: string;
23
- inline?: boolean;
24
- }>;
25
- footer?: {
26
- text: string;
27
- };
28
- }
29
- export declare function formatForSlack(prompt: RemotePrompt): SlackBlock[];
30
- export declare function formatForDiscord(prompt: RemotePrompt): {
31
- embeds: DiscordEmbed[];
32
- reactionEmojis: string[];
33
- };
34
- export declare function parseSlackReply(text: string, questions: RemoteQuestion[]): RemoteAnswer;
35
- export declare function parseDiscordResponse(reactions: Array<{
36
- emoji: string;
37
- count: number;
38
- }>, replyText: string | null, questions: RemoteQuestion[]): RemoteAnswer;
@@ -1,119 +0,0 @@
1
- /**
2
- * Remote Questions — payload formatting and parsing helpers
3
- */
4
- const NUMBER_EMOJIS = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣"];
5
- const MAX_USER_NOTE_LENGTH = 500;
6
- export function formatForSlack(prompt) {
7
- const blocks = [
8
- {
9
- type: "header",
10
- text: { type: "plain_text", text: "GSD needs your input" },
11
- },
12
- ];
13
- for (const q of prompt.questions) {
14
- blocks.push({
15
- type: "section",
16
- text: { type: "mrkdwn", text: `*${q.header}*\n${q.question}` },
17
- });
18
- blocks.push({
19
- type: "section",
20
- text: {
21
- type: "mrkdwn",
22
- text: q.options.map((opt, i) => `${i + 1}. *${opt.label}* — ${opt.description}`).join("\n"),
23
- },
24
- });
25
- blocks.push({
26
- type: "context",
27
- elements: [{
28
- type: "mrkdwn",
29
- text: q.allowMultiple
30
- ? "Reply in thread with comma-separated numbers (`1,3`) or free text."
31
- : "Reply in thread with a number (`1`) or free text.",
32
- }],
33
- });
34
- blocks.push({ type: "divider" });
35
- }
36
- return blocks;
37
- }
38
- export function formatForDiscord(prompt) {
39
- const reactionEmojis = [];
40
- const embeds = prompt.questions.map((q, questionIndex) => {
41
- const supportsReactions = prompt.questions.length === 1;
42
- const optionLines = q.options.map((opt, i) => {
43
- const emoji = NUMBER_EMOJIS[i] ?? `${i + 1}.`;
44
- if (supportsReactions && NUMBER_EMOJIS[i])
45
- reactionEmojis.push(NUMBER_EMOJIS[i]);
46
- return `${emoji} **${opt.label}** — ${opt.description}`;
47
- });
48
- const footerText = supportsReactions
49
- ? (q.allowMultiple
50
- ? "Reply with comma-separated choices (`1,3`) or react with matching numbers"
51
- : "Reply with a number or react with the matching number")
52
- : `Question ${questionIndex + 1}/${prompt.questions.length} — reply with one line per question or use semicolons`;
53
- return {
54
- title: q.header,
55
- description: q.question,
56
- color: 0x7c3aed,
57
- fields: [{ name: "Options", value: optionLines.join("\n") }],
58
- footer: { text: footerText },
59
- };
60
- });
61
- return { embeds, reactionEmojis };
62
- }
63
- export function parseSlackReply(text, questions) {
64
- const answers = {};
65
- const trimmed = text.trim();
66
- if (questions.length === 1) {
67
- answers[questions[0].id] = parseAnswerForQuestion(trimmed, questions[0]);
68
- return { answers };
69
- }
70
- const parts = trimmed.includes(";")
71
- ? trimmed.split(";").map((s) => s.trim()).filter(Boolean)
72
- : trimmed.split("\n").map((s) => s.trim()).filter(Boolean);
73
- for (let i = 0; i < questions.length; i++) {
74
- answers[questions[i].id] = parseAnswerForQuestion(parts[i] ?? "", questions[i]);
75
- }
76
- return { answers };
77
- }
78
- export function parseDiscordResponse(reactions, replyText, questions) {
79
- if (replyText)
80
- return parseSlackReply(replyText, questions);
81
- const answers = {};
82
- if (questions.length !== 1) {
83
- for (const q of questions) {
84
- answers[q.id] = { answers: [], user_note: "Discord reactions are only supported for single-question prompts" };
85
- }
86
- return { answers };
87
- }
88
- const q = questions[0];
89
- const picked = reactions
90
- .filter((r) => NUMBER_EMOJIS.includes(r.emoji) && r.count > 0)
91
- .map((r) => q.options[NUMBER_EMOJIS.indexOf(r.emoji)]?.label)
92
- .filter(Boolean);
93
- answers[q.id] = picked.length > 0
94
- ? { answers: q.allowMultiple ? picked : [picked[0]] }
95
- : { answers: [], user_note: "No clear response via reactions" };
96
- return { answers };
97
- }
98
- function parseAnswerForQuestion(text, q) {
99
- if (!text)
100
- return { answers: [], user_note: "No response provided" };
101
- if (/^[\d,\s]+$/.test(text)) {
102
- const nums = text
103
- .split(",")
104
- .map((s) => parseInt(s.trim(), 10))
105
- .filter((n) => !Number.isNaN(n) && n >= 1 && n <= q.options.length);
106
- if (nums.length > 0) {
107
- const selected = nums.map((n) => q.options[n - 1].label);
108
- return { answers: q.allowMultiple ? selected : [selected[0]] };
109
- }
110
- }
111
- const single = parseInt(text, 10);
112
- if (!Number.isNaN(single) && single >= 1 && single <= q.options.length) {
113
- return { answers: [q.options[single - 1].label] };
114
- }
115
- return { answers: [], user_note: truncateNote(text) };
116
- }
117
- function truncateNote(text) {
118
- return text.length > MAX_USER_NOTE_LENGTH ? text.slice(0, MAX_USER_NOTE_LENGTH) + "…" : text;
119
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * Remote Questions — orchestration manager
3
- */
4
- interface ToolResult {
5
- content: Array<{
6
- type: "text";
7
- text: string;
8
- }>;
9
- details?: Record<string, unknown>;
10
- }
11
- interface QuestionInput {
12
- id: string;
13
- header: string;
14
- question: string;
15
- options: Array<{
16
- label: string;
17
- description: string;
18
- }>;
19
- allowMultiple?: boolean;
20
- }
21
- export declare function tryRemoteQuestions(questions: QuestionInput[], signal?: AbortSignal): Promise<ToolResult | null>;
22
- export declare function sanitizeError(msg: string): string;
23
- export {};
@@ -1,161 +0,0 @@
1
- /**
2
- * Remote Questions — orchestration manager
3
- */
4
- import { randomUUID } from "node:crypto";
5
- import { resolveRemoteConfig } from "./config.js";
6
- import { SlackAdapter } from "./slack-adapter.js";
7
- import { DiscordAdapter } from "./discord-adapter.js";
8
- import { createPromptRecord, writePromptRecord, markPromptAnswered, markPromptDispatched, markPromptStatus, updatePromptRecord } from "./store.js";
9
- export async function tryRemoteQuestions(questions, signal) {
10
- const config = resolveRemoteConfig();
11
- if (!config)
12
- return null;
13
- const prompt = createPrompt(questions, config);
14
- writePromptRecord(createPromptRecord(prompt));
15
- const adapter = createAdapter(config);
16
- try {
17
- await adapter.validate();
18
- }
19
- catch (err) {
20
- markPromptStatus(prompt.id, "failed", sanitizeError(String(err.message)));
21
- return errorResult(`Remote auth failed (${config.channel}): ${err.message}`, config.channel);
22
- }
23
- let dispatch;
24
- try {
25
- dispatch = await adapter.sendPrompt(prompt);
26
- markPromptDispatched(prompt.id, dispatch.ref);
27
- }
28
- catch (err) {
29
- markPromptStatus(prompt.id, "failed", sanitizeError(String(err.message)));
30
- return errorResult(`Failed to send questions via ${config.channel}: ${err.message}`, config.channel);
31
- }
32
- const answer = await pollUntilDone(adapter, prompt, dispatch.ref, signal);
33
- if (!answer) {
34
- markPromptStatus(prompt.id, signal?.aborted ? "cancelled" : "timed_out");
35
- return {
36
- content: [{
37
- type: "text",
38
- text: JSON.stringify({
39
- timed_out: true,
40
- channel: config.channel,
41
- prompt_id: prompt.id,
42
- timeout_minutes: config.timeoutMs / 60000,
43
- thread_url: dispatch.ref.threadUrl ?? null,
44
- message: `User did not respond within ${config.timeoutMs / 60000} minutes.`,
45
- }),
46
- }],
47
- details: {
48
- remote: true,
49
- channel: config.channel,
50
- timed_out: true,
51
- promptId: prompt.id,
52
- threadUrl: dispatch.ref.threadUrl,
53
- status: signal?.aborted ? "cancelled" : "timed_out",
54
- },
55
- };
56
- }
57
- markPromptAnswered(prompt.id, answer);
58
- return {
59
- content: [{ type: "text", text: JSON.stringify({ answers: formatForTool(answer) }) }],
60
- details: {
61
- remote: true,
62
- channel: config.channel,
63
- timed_out: false,
64
- promptId: prompt.id,
65
- threadUrl: dispatch.ref.threadUrl,
66
- questions,
67
- response: answer,
68
- status: "answered",
69
- },
70
- };
71
- }
72
- function createPrompt(questions, config) {
73
- const createdAt = Date.now();
74
- return {
75
- id: randomUUID(),
76
- channel: config.channel,
77
- createdAt,
78
- timeoutAt: createdAt + config.timeoutMs,
79
- pollIntervalMs: config.pollIntervalMs,
80
- context: { source: "ask_user_questions" },
81
- questions: questions.map((q) => ({
82
- id: q.id,
83
- header: q.header,
84
- question: q.question,
85
- options: q.options,
86
- allowMultiple: q.allowMultiple ?? false,
87
- })),
88
- };
89
- }
90
- function createAdapter(config) {
91
- return config.channel === "slack"
92
- ? new SlackAdapter(config.token, config.channelId)
93
- : new DiscordAdapter(config.token, config.channelId);
94
- }
95
- async function pollUntilDone(adapter, prompt, ref, signal) {
96
- let retryCount = 0;
97
- while (Date.now() < prompt.timeoutAt && !signal?.aborted) {
98
- try {
99
- const answer = await adapter.pollAnswer(prompt, ref);
100
- updatePromptRecord(prompt.id, { lastPollAt: Date.now() });
101
- retryCount = 0;
102
- if (answer)
103
- return answer;
104
- }
105
- catch (err) {
106
- retryCount++;
107
- if (retryCount > 1) {
108
- markPromptStatus(prompt.id, "failed", sanitizeError(String(err.message)));
109
- return null;
110
- }
111
- }
112
- await sleep(prompt.pollIntervalMs, signal);
113
- }
114
- return null;
115
- }
116
- function sleep(ms, signal) {
117
- return new Promise((resolve) => {
118
- if (signal?.aborted)
119
- return resolve();
120
- const timer = setTimeout(() => {
121
- if (signal)
122
- signal.removeEventListener("abort", onAbort);
123
- resolve();
124
- }, ms);
125
- const onAbort = () => {
126
- clearTimeout(timer);
127
- resolve();
128
- };
129
- signal?.addEventListener("abort", onAbort, { once: true });
130
- });
131
- }
132
- function formatForTool(answer) {
133
- const out = {};
134
- for (const [id, data] of Object.entries(answer.answers)) {
135
- const list = [...data.answers];
136
- if (data.user_note)
137
- list.push(`user_note: ${data.user_note}`);
138
- out[id] = { answers: list };
139
- }
140
- return out;
141
- }
142
- // Strip token-like strings from error messages before surfacing
143
- const TOKEN_PATTERNS = [
144
- /xoxb-[A-Za-z0-9\-]+/g, // Slack bot tokens
145
- /xoxp-[A-Za-z0-9\-]+/g, // Slack user tokens
146
- /xoxa-[A-Za-z0-9\-]+/g, // Slack app tokens
147
- /[A-Za-z0-9_\-.]{20,}/g, // Long opaque secrets (Discord tokens, etc.)
148
- ];
149
- export function sanitizeError(msg) {
150
- let sanitized = msg;
151
- for (const pattern of TOKEN_PATTERNS) {
152
- sanitized = sanitized.replace(pattern, "[REDACTED]");
153
- }
154
- return sanitized;
155
- }
156
- function errorResult(message, channel) {
157
- return {
158
- content: [{ type: "text", text: sanitizeError(message) }],
159
- details: { remote: true, channel, error: true, status: "failed" },
160
- };
161
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * Remote Questions — /gsd remote command
3
- */
4
- import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
5
- export declare function handleRemote(subcommand: string, ctx: ExtensionCommandContext, _pi: ExtensionAPI): Promise<void>;
6
- export declare function saveRemoteQuestionsConfig(channel: "slack" | "discord", channelId: string): void;