@opengsd/gsd-pi 1.1.1-dev.3ea310e → 1.1.1-dev.595401e

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 (314) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
  3. package/dist/resources/extensions/gsd/auto/phases.js +4 -3
  4. package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
  5. package/dist/resources/extensions/gsd/auto-dispatch.js +5 -0
  6. package/dist/resources/extensions/gsd/auto-post-unit.js +132 -8
  7. package/dist/resources/extensions/gsd/auto-prompts.js +68 -22
  8. package/dist/resources/extensions/gsd/auto-start.js +41 -12
  9. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +2 -1
  10. package/dist/resources/extensions/gsd/auto.js +12 -5
  11. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +82 -3
  12. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
  13. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +30 -9
  14. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -10
  15. package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
  16. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
  17. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
  18. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  19. package/dist/resources/extensions/gsd/config-overlay.js +2 -1
  20. package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
  21. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  22. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
  23. package/dist/resources/extensions/gsd/error-classifier.js +2 -1
  24. package/dist/resources/extensions/gsd/escalation.js +4 -4
  25. package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
  26. package/dist/resources/extensions/gsd/forensics.js +74 -2
  27. package/dist/resources/extensions/gsd/gsd-db.js +5 -2
  28. package/dist/resources/extensions/gsd/guided-flow.js +29 -68
  29. package/dist/resources/extensions/gsd/memory-store.js +4 -1
  30. package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
  31. package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
  32. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  33. package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
  34. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  35. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  36. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  37. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  38. package/dist/resources/extensions/gsd/prompts/run-uat.md +48 -24
  39. package/dist/resources/extensions/gsd/prompts/system.md +3 -1
  40. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  41. package/dist/resources/extensions/gsd/rule-registry.js +428 -52
  42. package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
  43. package/dist/resources/extensions/gsd/skill-activation.js +20 -3
  44. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
  45. package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
  46. package/dist/resources/extensions/gsd/state.js +3 -3
  47. package/dist/resources/extensions/gsd/templates/plan.md +3 -1
  48. package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
  49. package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
  50. package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
  51. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +403 -3
  52. package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
  53. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  54. package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
  55. package/dist/resources/extensions/gsd/verification-gate.js +72 -1
  56. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +1 -1
  57. package/dist/resources/extensions/gsd/workflow-mcp.js +5 -1
  58. package/dist/rtk.d.ts +7 -1
  59. package/dist/rtk.js +27 -11
  60. package/dist/web/standalone/.next/BUILD_ID +1 -1
  61. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  62. package/dist/web/standalone/.next/build-manifest.json +2 -2
  63. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  64. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  65. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  73. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/index.html +1 -1
  81. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  85. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  86. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  87. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  88. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  89. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  91. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  92. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  93. package/package.json +3 -2
  94. package/packages/cloud-mcp-gateway/package.json +2 -2
  95. package/packages/contracts/dist/workflow.d.ts +14 -0
  96. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  97. package/packages/contracts/dist/workflow.js +16 -0
  98. package/packages/contracts/dist/workflow.js.map +1 -1
  99. package/packages/contracts/package.json +1 -1
  100. package/packages/daemon/package.json +4 -4
  101. package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
  102. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  103. package/packages/gsd-agent-core/dist/agent-session.js +32 -0
  104. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  105. package/packages/gsd-agent-core/dist/index.d.ts +1 -0
  106. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  107. package/packages/gsd-agent-core/dist/index.js +1 -0
  108. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  109. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
  110. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
  111. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
  112. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
  113. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
  114. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  115. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  116. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  117. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
  118. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  119. package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
  120. package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
  121. package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
  122. package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
  123. package/packages/gsd-agent-core/package.json +6 -6
  124. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
  125. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
  126. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
  127. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
  128. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  129. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  130. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  131. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  132. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
  133. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  134. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +89 -31
  135. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  136. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  137. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
  138. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  139. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
  140. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
  141. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
  142. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
  143. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  144. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
  145. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  146. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  147. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
  148. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  149. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  150. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
  151. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  152. package/packages/gsd-agent-modes/package.json +7 -7
  153. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  154. package/packages/mcp-server/dist/remote-questions.js +23 -9
  155. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  156. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  157. package/packages/mcp-server/dist/workflow-tools.js +84 -2
  158. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  159. package/packages/mcp-server/package.json +3 -3
  160. package/packages/native/package.json +1 -1
  161. package/packages/pi-agent-core/dist/agent-loop.js +38 -0
  162. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  163. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  164. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  165. package/packages/pi-agent-core/dist/agent.js +2 -0
  166. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  167. package/packages/pi-agent-core/dist/types.d.ts +3 -0
  168. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  169. package/packages/pi-agent-core/dist/types.js.map +1 -1
  170. package/packages/pi-agent-core/package.json +1 -1
  171. package/packages/pi-ai/dist/api-registry.d.ts +2 -0
  172. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  173. package/packages/pi-ai/dist/api-registry.js +23 -0
  174. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  175. package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
  176. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  177. package/packages/pi-ai/dist/image-models.generated.js +15 -0
  178. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  179. package/packages/pi-ai/dist/models.generated.d.ts +86 -18
  180. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  181. package/packages/pi-ai/dist/models.generated.js +108 -40
  182. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  183. package/packages/pi-ai/dist/stream.js +6 -6
  184. package/packages/pi-ai/dist/stream.js.map +1 -1
  185. package/packages/pi-ai/package.json +1 -1
  186. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  188. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  190. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  192. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  193. package/packages/pi-coding-agent/package.json +7 -7
  194. package/packages/pi-tui/dist/terminal.d.ts +1 -0
  195. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  196. package/packages/pi-tui/dist/terminal.js +8 -4
  197. package/packages/pi-tui/dist/terminal.js.map +1 -1
  198. package/packages/pi-tui/package.json +1 -1
  199. package/packages/rpc-client/package.json +2 -2
  200. package/pkg/package.json +1 -1
  201. package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
  202. package/src/resources/extensions/gsd/auto/phases.ts +5 -3
  203. package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
  204. package/src/resources/extensions/gsd/auto-dispatch.ts +5 -0
  205. package/src/resources/extensions/gsd/auto-post-unit.ts +164 -7
  206. package/src/resources/extensions/gsd/auto-prompts.ts +102 -15
  207. package/src/resources/extensions/gsd/auto-start.ts +54 -14
  208. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +2 -1
  209. package/src/resources/extensions/gsd/auto.ts +15 -4
  210. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +89 -3
  211. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
  212. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +51 -14
  213. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +21 -10
  214. package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
  215. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  216. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
  217. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  218. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  219. package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
  220. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  221. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
  222. package/src/resources/extensions/gsd/error-classifier.ts +2 -1
  223. package/src/resources/extensions/gsd/escalation.ts +4 -4
  224. package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
  225. package/src/resources/extensions/gsd/forensics.ts +99 -5
  226. package/src/resources/extensions/gsd/gsd-db.ts +5 -2
  227. package/src/resources/extensions/gsd/guided-flow.ts +90 -82
  228. package/src/resources/extensions/gsd/memory-store.ts +4 -1
  229. package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
  230. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  231. package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
  232. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  233. package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
  234. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  235. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  236. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  237. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  238. package/src/resources/extensions/gsd/prompts/run-uat.md +48 -24
  239. package/src/resources/extensions/gsd/prompts/system.md +3 -1
  240. package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  241. package/src/resources/extensions/gsd/rule-registry.ts +558 -58
  242. package/src/resources/extensions/gsd/rule-types.ts +2 -0
  243. package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
  244. package/src/resources/extensions/gsd/skill-activation.ts +20 -2
  245. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
  246. package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
  247. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
  248. package/src/resources/extensions/gsd/state.ts +3 -3
  249. package/src/resources/extensions/gsd/templates/plan.md +3 -1
  250. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
  251. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +37 -0
  252. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +16 -3
  253. package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
  254. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
  255. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
  256. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
  257. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
  258. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
  259. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
  260. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -0
  261. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
  262. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
  263. package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
  264. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
  265. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
  266. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
  267. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
  268. package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
  269. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
  270. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
  271. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
  272. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
  273. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +66 -10
  274. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
  275. package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
  276. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
  277. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
  278. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
  279. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
  280. package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
  281. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +53 -1
  282. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
  283. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
  284. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
  285. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
  286. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +35 -0
  287. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
  288. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
  289. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
  290. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  291. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
  292. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
  293. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
  294. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
  295. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
  296. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
  297. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
  298. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
  299. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +2 -2
  300. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +213 -0
  301. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +25 -0
  302. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
  303. package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
  304. package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
  305. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +489 -3
  306. package/src/resources/extensions/gsd/types.ts +67 -4
  307. package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
  308. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  309. package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
  310. package/src/resources/extensions/gsd/verification-gate.ts +87 -1
  311. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +1 -1
  312. package/src/resources/extensions/gsd/workflow-mcp.ts +5 -1
  313. /package/dist/web/standalone/.next/static/{xACmObbrDjwLriepRgaa9 → IDKjyRHLIaumjgonPcYiX}/_buildManifest.js +0 -0
  314. /package/dist/web/standalone/.next/static/{xACmObbrDjwLriepRgaa9 → IDKjyRHLIaumjgonPcYiX}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-selectors-settings.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-settings.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n findExactModelMatch as findExactModelMatchController,\n getModelCandidates as getModelCandidatesController,\n handleModelCommand as handleModelCommandController,\n updateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\nimport { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n\tfindExactModelMatch as findExactModelMatchController,\n\tgetModelCandidates as getModelCandidatesController,\n\thandleModelCommand as handleModelCommandController,\n\tupdateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport function showSelector(host: InteractiveModeDelegateHost, create: (done: () => void) => { component: Component; focus: Component }): void {\n\t\tconst done = () => {\n\t\t\thost.editorContainer.clear();\n\t\t\thost.editorContainer.addChild(host.editor);\n\t\t\thost.ui.setFocus(host.editor);\n\t\t};\n\t\tconst { component, focus } = create(done);\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(component);\n\t\thost.ui.setFocus(focus);\n\t\thost.ui.requestRender();\n\t}\n\nexport function showSettingsSelector(host: InteractiveModeDelegateHost): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new SettingsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tautoCompact: host.session.autoCompactionEnabled,\n\t\t\t\t\tshowImages: host.settingsManager.getShowImages(),\n\t\t\t\t\tautoResizeImages: host.settingsManager.getImageAutoResize(),\n\t\t\t\t\tblockImages: host.settingsManager.getBlockImages(),\n\t\t\t\t\tenableSkillCommands: host.settingsManager.getEnableSkillCommands(),\n\t\t\t\t\tsteeringMode: host.session.steeringMode,\n\t\t\t\t\tfollowUpMode: host.session.followUpMode,\n\t\t\t\t\ttransport: host.settingsManager.getTransport(),\n\t\t\t\t\tthinkingLevel: host.session.thinkingLevel,\n\t\t\t\t\tavailableThinkingLevels: host.session.getAvailableThinkingLevels(),\n\t\t\t\t\tcurrentTheme: host.settingsManager.getTheme() || \"dark\",\n\t\t\t\t\tavailableThemes: getAvailableThemes(),\n\t\t\t\t\thideThinkingBlock: host.hideThinkingBlock,\n\t\t\t\t\tcollapseChangelog: host.settingsManager.getCollapseChangelog(),\n\t\t\t\t\tdoubleEscapeAction: host.settingsManager.getDoubleEscapeAction(),\n\t\t\t\t\ttreeFilterMode: host.settingsManager.getTreeFilterMode(),\n\t\t\t\t\tshowHardwareCursor: host.settingsManager.getShowHardwareCursor(),\n\t\t\t\t\teditorPaddingX: host.settingsManager.getEditorPaddingX(),\n\t\t\t\t\tautocompleteMaxVisible: host.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\t\trespectGitignoreInPicker: host.settingsManager.getRespectGitignoreInPicker(),\n\t\t\t\t\tquietStartup: host.settingsManager.getQuietStartup(),\n\t\t\t\t\tclearOnShrink: host.settingsManager.getClearOnShrink(),\n\t\t\t\t\ttimestampFormat: host.settingsManager.getTimestampFormat(),\n\t\t\t\t\tadaptiveMode: host.settingsManager.getAdaptiveMode(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonAutoCompactChange: (enabled) => {\n\t\t\t\t\t\thost.session.setAutoCompactionEnabled(enabled);\n\t\t\t\t\t\thost.footer.setAutoCompactEnabled(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonShowImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowImages(enabled);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof ToolExecutionComponent) {\n\t\t\t\t\t\t\t\tchild.setShowImages(enabled);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutoResizeImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setImageAutoResize(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonBlockImagesChange: (blocked) => {\n\t\t\t\t\t\thost.settingsManager.setBlockImages(blocked);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableSkillCommandsChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setEnableSkillCommands(enabled);\n\t\t\t\t\t\thost.setupAutocomplete();\n\t\t\t\t\t},\n\t\t\t\t\tonSteeringModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setSteeringMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonFollowUpModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setFollowUpMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonTransportChange: (transport) => {\n\t\t\t\t\t\thost.settingsManager.setTransport(transport);\n\t\t\t\t\t\thost.session.agent.transport = transport;\n\t\t\t\t\t},\n\t\t\t\t\tonThinkingLevelChange: (level) => {\n\t\t\t\t\t\thost.session.setThinkingLevel(level);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t},\n\t\t\t\t\tonThemeChange: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\thost.settingsManager.setTheme(themeName);\n\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\tif (!result.success) {\n\t\t\t\t\t\t\thost.showError(`Failed to load theme \"${themeName}\": ${result.error}\\nFell back to dark theme.`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonHideThinkingBlockChange: (hidden) => {\n\t\t\t\t\t\thost.hideThinkingBlock = hidden;\n\t\t\t\t\t\thost.settingsManager.setHideThinkingBlock(hidden);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof AssistantMessageComponent) {\n\t\t\t\t\t\t\t\tchild.setHideThinkingBlock(hidden);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.rebuildChatFromMessages();\n\t\t\t\t\t},\n\t\t\t\t\tonCollapseChangelogChange: (collapsed) => {\n\t\t\t\t\t\thost.settingsManager.setCollapseChangelog(collapsed);\n\t\t\t\t\t},\n\t\t\t\t\tonQuietStartupChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setQuietStartup(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonDoubleEscapeActionChange: (action) => {\n\t\t\t\t\t\thost.settingsManager.setDoubleEscapeAction(action);\n\t\t\t\t\t},\n\t\t\t\t\tonTreeFilterModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setTreeFilterMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonShowHardwareCursorChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowHardwareCursor(enabled);\n\t\t\t\t\t\thost.ui.setShowHardwareCursor(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonEditorPaddingXChange: (padding) => {\n\t\t\t\t\t\thost.settingsManager.setEditorPaddingX(padding);\n\t\t\t\t\t\thost.defaultEditor.setPaddingX(padding);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setPaddingX !== undefined) {\n\t\t\t\t\t\t\thost.editor.setPaddingX(padding);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutocompleteMaxVisibleChange: (maxVisible) => {\n\t\t\t\t\t\thost.settingsManager.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\thost.defaultEditor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setAutocompleteMaxVisible !== undefined) {\n\t\t\t\t\t\t\thost.editor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonClearOnShrinkChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setClearOnShrink(enabled);\n\t\t\t\t\t\thost.ui.setClearOnShrink(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonRespectGitignoreInPickerChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setRespectGitignoreInPicker(enabled);\n\t\t\t\t\t\thost.autocompleteProvider?.setRespectGitignore(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonTimestampFormatChange: (format) => {\n\t\t\t\t\t\thost.settingsManager.setTimestampFormat(format);\n\t\t\t\t\t},\n\t\t\t\t\tonAdaptiveModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setAdaptiveMode(mode);\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector.getSettingsList() };\n\t\t});\n\t}\n\nexport async function handleModelCommand(host: InteractiveModeDelegateHost, searchTerm?: string): Promise<void> {\n\t\tawait handleModelCommandController(host, searchTerm);\n\t}\n\nexport async function findExactModelMatch(host: InteractiveModeDelegateHost, searchTerm: string): Promise<Model<any> | undefined> {\n\t\treturn findExactModelMatchController(host, searchTerm);\n\t}\n\nexport async function getModelCandidates(host: InteractiveModeDelegateHost): Promise<Model<any>[]> {\n\t\treturn getModelCandidatesController(host);\n\t}\n\n\t/** Update the footer's available provider count from current model candidates */\nexport async function updateAvailableProviderCount(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tawait updateAvailableProviderCountController(host);\n\t}\n\nexport function showModelSelector(host: InteractiveModeDelegateHost, initialSearchInput?: string): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ModelSelectorComponent(\n\t\t\t\thost.ui,\n\t\t\t\thost.session.model,\n\t\t\t\thost.settingsManager,\n\t\t\t\thost.session.modelRegistry,\n\t\t\t\thost.session.scopedModels,\n\t\t\t\tasync (model) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait host.session.setModel(model);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t\tinitialSearchInput,\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n\nexport async function showModelsSelector(host: InteractiveModeDelegateHost): Promise<void> {\n\t\t// Get all available models\n\t\thost.session.modelRegistry.refresh();\n\t\tconst allModels = host.session.modelRegistry.getAvailable();\n\n\t\tif (allModels.length === 0) {\n\t\t\thost.showStatus(\"No models available\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if session has scoped models (from previous session-only changes or CLI --models)\n\t\tconst sessionScopedModels = host.session.scopedModels;\n\t\tconst hasSessionScope = sessionScopedModels.length > 0;\n\n\t\t// Build enabled model IDs from session state or settings\n\t\tconst enabledModelIds = new Set<string>();\n\t\tlet hasFilter = false;\n\n\t\tif (hasSessionScope) {\n\t\t\t// Use current session's scoped models\n\t\t\tfor (const sm of sessionScopedModels) {\n\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t}\n\t\t\thasFilter = true;\n\t\t} else {\n\t\t\t// Fall back to settings\n\t\t\tconst patterns = host.settingsManager.getEnabledModels();\n\t\t\tif (patterns !== undefined && patterns.length > 0) {\n\t\t\t\thasFilter = true;\n\t\t\t\tconst scopedModels = await resolveModelScope(patterns, host.session.modelRegistry);\n\t\t\t\tfor (const sm of scopedModels) {\n\t\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Track current enabled state (session-only until persisted)\n\t\tconst currentEnabledIds = new Set(enabledModelIds);\n\t\tlet currentHasFilter = hasFilter;\n\n\t\t// Helper to update session's scoped models (session-only, no persist)\n\t\tconst updateSessionModels = async (enabledIds: Set<string>) => {\n\t\t\tif (enabledIds.size > 0 && enabledIds.size < allModels.length) {\n\t\t\t\tconst newScopedModels = await resolveModelScope(Array.from(enabledIds), host.session.modelRegistry);\n\t\t\t\thost.session.setScopedModels(\n\t\t\t\t\tnewScopedModels.map((sm) => ({\n\t\t\t\t\t\tmodel: sm.model,\n\t\t\t\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// All enabled or none enabled = no filter\n\t\t\t\thost.session.setScopedModels([]);\n\t\t\t}\n\t\t\tawait host.updateAvailableProviderCount();\n\t\t\thost.ui.requestRender();\n\t\t};\n\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tallModels,\n\t\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\t\thasEnabledModelsFilter: currentHasFilter,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonModelToggle: async (modelId, enabled) => {\n\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(modelId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentEnabledIds.delete(modelId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableAll: async (allModelIds) => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tfor (const id of allModelIds) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = false;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonClearAll: async () => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonToggleProvider: async (_provider, modelIds, enabled) => {\n\t\t\t\t\t\tfor (const id of modelIds) {\n\t\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.delete(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\t\t// Persist to settings\n\t\t\t\t\t\tconst newPatterns =\n\t\t\t\t\t\t\tenabledIds.length === allModels.length\n\t\t\t\t\t\t\t\t? undefined // All enabled = clear filter\n\t\t\t\t\t\t\t\t: enabledIds;\n\t\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns);\n\t\t\t\t\t\thost.showStatus(\"Model selection saved to settings\");\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n\n"]}
1
+ {"version":3,"file":"interactive-selectors-settings.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-selectors-settings.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n findExactModelMatch as findExactModelMatchController,\n getModelCandidates as getModelCandidatesController,\n handleModelCommand as handleModelCommandController,\n updateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\n\nimport { Loader, Spacer } from \"@gsd/pi-tui\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport type { Model, OAuthProviderId } from \"@gsd/pi-ai\";\nimport { getAuthPath } from \"@gsd/pi-coding-agent/config.js\";\nimport { resolveModelScope } from \"@gsd/pi-coding-agent/core/model-resolver.js\";\nimport { SessionManager } from \"@gsd/pi-coding-agent/core/session-manager.js\";\nimport { getAvailableThemes, setRegisteredThemes, setTheme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { LoginDialogComponent } from \"./components/login-dialog.js\";\nimport { ModelSelectorComponent } from \"./components/model-selector.js\";\nimport { OAuthSelectorComponent } from \"./components/oauth-selector.js\";\nimport { ProviderManagerComponent } from \"./components/provider-manager.js\";\nimport { ScopedModelsSelectorComponent } from \"./components/scoped-models-selector.js\";\nimport { SessionSelectorComponent } from \"./components/session-selector.js\";\nimport { SettingsSelectorComponent } from \"./components/settings-selector.js\";\nimport { ToolExecutionComponent } from \"./components/tool-execution.js\";\nimport { TreeSelectorComponent } from \"./components/tree-selector.js\";\nimport { UserMessageSelectorComponent } from \"./components/user-message-selector.js\";\nimport { AssistantMessageComponent } from \"./components/assistant-message.js\";\nimport {\n\tfindExactModelMatch as findExactModelMatchController,\n\tgetModelCandidates as getModelCandidatesController,\n\thandleModelCommand as handleModelCommandController,\n\tupdateAvailableProviderCount as updateAvailableProviderCountController,\n} from \"./controllers/model-controller.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport function showSelector(host: InteractiveModeDelegateHost, create: (done: () => void) => { component: Component; focus: Component }): void {\n\t\tconst done = () => {\n\t\t\thost.editorContainer.clear();\n\t\t\thost.editorContainer.addChild(host.editor);\n\t\t\thost.ui.setFocus(host.editor);\n\t\t};\n\t\tconst { component, focus } = create(done);\n\t\thost.editorContainer.clear();\n\t\thost.editorContainer.addChild(component);\n\t\thost.ui.setFocus(focus);\n\t\thost.ui.requestRender();\n\t}\n\nexport function showSettingsSelector(host: InteractiveModeDelegateHost): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new SettingsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tautoCompact: host.session.autoCompactionEnabled,\n\t\t\t\t\tshowImages: host.settingsManager.getShowImages(),\n\t\t\t\t\tautoResizeImages: host.settingsManager.getImageAutoResize(),\n\t\t\t\t\tblockImages: host.settingsManager.getBlockImages(),\n\t\t\t\t\tenableSkillCommands: host.settingsManager.getEnableSkillCommands(),\n\t\t\t\t\tsteeringMode: host.session.steeringMode,\n\t\t\t\t\tfollowUpMode: host.session.followUpMode,\n\t\t\t\t\ttransport: host.settingsManager.getTransport(),\n\t\t\t\t\tthinkingLevel: host.session.thinkingLevel,\n\t\t\t\t\tavailableThinkingLevels: host.session.getAvailableThinkingLevels(),\n\t\t\t\t\tcurrentTheme: host.settingsManager.getTheme() || \"dark\",\n\t\t\t\t\tavailableThemes: getAvailableThemes(),\n\t\t\t\t\thideThinkingBlock: host.hideThinkingBlock,\n\t\t\t\t\ttoolsExpanded: host.toolOutputExpanded,\n\t\t\t\t\tcollapseChangelog: host.settingsManager.getCollapseChangelog(),\n\t\t\t\t\tdoubleEscapeAction: host.settingsManager.getDoubleEscapeAction(),\n\t\t\t\t\ttreeFilterMode: host.settingsManager.getTreeFilterMode(),\n\t\t\t\t\tshowHardwareCursor: host.settingsManager.getShowHardwareCursor(),\n\t\t\t\t\teditorPaddingX: host.settingsManager.getEditorPaddingX(),\n\t\t\t\t\tautocompleteMaxVisible: host.settingsManager.getAutocompleteMaxVisible(),\n\t\t\t\t\trespectGitignoreInPicker: host.settingsManager.getRespectGitignoreInPicker(),\n\t\t\t\t\tquietStartup: host.settingsManager.getQuietStartup(),\n\t\t\t\t\tclearOnShrink: host.settingsManager.getClearOnShrink(),\n\t\t\t\t\ttimestampFormat: host.settingsManager.getTimestampFormat(),\n\t\t\t\t\tadaptiveMode: host.settingsManager.getAdaptiveMode(),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonAutoCompactChange: (enabled) => {\n\t\t\t\t\t\thost.session.setAutoCompactionEnabled(enabled);\n\t\t\t\t\t\thost.footer.setAutoCompactEnabled(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonShowImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowImages(enabled);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof ToolExecutionComponent) {\n\t\t\t\t\t\t\t\tchild.setShowImages(enabled);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutoResizeImagesChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setImageAutoResize(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonBlockImagesChange: (blocked) => {\n\t\t\t\t\t\thost.settingsManager.setBlockImages(blocked);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableSkillCommandsChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setEnableSkillCommands(enabled);\n\t\t\t\t\t\thost.setupAutocomplete();\n\t\t\t\t\t},\n\t\t\t\t\tonSteeringModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setSteeringMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonFollowUpModeChange: (mode) => {\n\t\t\t\t\t\thost.session.setFollowUpMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonTransportChange: (transport) => {\n\t\t\t\t\t\thost.settingsManager.setTransport(transport);\n\t\t\t\t\t\thost.session.agent.transport = transport;\n\t\t\t\t\t},\n\t\t\t\t\tonThinkingLevelChange: (level) => {\n\t\t\t\t\t\thost.session.setThinkingLevel(level);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t},\n\t\t\t\t\tonThemeChange: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\thost.settingsManager.setTheme(themeName);\n\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\tif (!result.success) {\n\t\t\t\t\t\t\thost.showError(`Failed to load theme \"${themeName}\": ${result.error}\\nFell back to dark theme.`);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonThemePreview: (themeName) => {\n\t\t\t\t\t\tconst result = setTheme(themeName, true);\n\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\thost.clearMarkdownThemeCache();\n\t\t\t\t\t\t\thost.ui.invalidate();\n\t\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonHideThinkingBlockChange: (hidden) => {\n\t\t\t\t\t\thost.hideThinkingBlock = hidden;\n\t\t\t\t\t\thost.settingsManager.setHideThinkingBlock(hidden);\n\t\t\t\t\t\tfor (const child of host.chatContainer.children) {\n\t\t\t\t\t\t\tif (child instanceof AssistantMessageComponent) {\n\t\t\t\t\t\t\t\tchild.setHideThinkingBlock(hidden);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.rebuildChatFromMessages();\n\t\t\t\t\t},\n\t\t\t\t\tonToolsExpandedChange: (expanded) => {\n\t\t\t\t\t\thost.settingsManager.setToolsExpanded(expanded);\n\t\t\t\t\t\thost.setToolsExpanded(expanded);\n\t\t\t\t\t},\n\t\t\t\t\tonCollapseChangelogChange: (collapsed) => {\n\t\t\t\t\t\thost.settingsManager.setCollapseChangelog(collapsed);\n\t\t\t\t\t},\n\t\t\t\t\tonQuietStartupChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setQuietStartup(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonDoubleEscapeActionChange: (action) => {\n\t\t\t\t\t\thost.settingsManager.setDoubleEscapeAction(action);\n\t\t\t\t\t},\n\t\t\t\t\tonTreeFilterModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setTreeFilterMode(mode);\n\t\t\t\t\t},\n\t\t\t\t\tonShowHardwareCursorChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setShowHardwareCursor(enabled);\n\t\t\t\t\t\thost.ui.setShowHardwareCursor(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonEditorPaddingXChange: (padding) => {\n\t\t\t\t\t\thost.settingsManager.setEditorPaddingX(padding);\n\t\t\t\t\t\thost.defaultEditor.setPaddingX(padding);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setPaddingX !== undefined) {\n\t\t\t\t\t\t\thost.editor.setPaddingX(padding);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAutocompleteMaxVisibleChange: (maxVisible) => {\n\t\t\t\t\t\thost.settingsManager.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\thost.defaultEditor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\tif (host.editor !== host.defaultEditor && host.editor.setAutocompleteMaxVisible !== undefined) {\n\t\t\t\t\t\t\thost.editor.setAutocompleteMaxVisible(maxVisible);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonClearOnShrinkChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setClearOnShrink(enabled);\n\t\t\t\t\t\thost.ui.setClearOnShrink(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonRespectGitignoreInPickerChange: (enabled) => {\n\t\t\t\t\t\thost.settingsManager.setRespectGitignoreInPicker(enabled);\n\t\t\t\t\t\thost.autocompleteProvider?.setRespectGitignore(enabled);\n\t\t\t\t\t},\n\t\t\t\t\tonTimestampFormatChange: (format) => {\n\t\t\t\t\t\thost.settingsManager.setTimestampFormat(format);\n\t\t\t\t\t},\n\t\t\t\t\tonAdaptiveModeChange: (mode) => {\n\t\t\t\t\t\thost.settingsManager.setAdaptiveMode(mode);\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector.getSettingsList() };\n\t\t});\n\t}\n\nexport async function handleModelCommand(host: InteractiveModeDelegateHost, searchTerm?: string): Promise<void> {\n\t\tawait handleModelCommandController(host, searchTerm);\n\t}\n\nexport async function findExactModelMatch(host: InteractiveModeDelegateHost, searchTerm: string): Promise<Model<any> | undefined> {\n\t\treturn findExactModelMatchController(host, searchTerm);\n\t}\n\nexport async function getModelCandidates(host: InteractiveModeDelegateHost): Promise<Model<any>[]> {\n\t\treturn getModelCandidatesController(host);\n\t}\n\n\t/** Update the footer's available provider count from current model candidates */\nexport async function updateAvailableProviderCount(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tawait updateAvailableProviderCountController(host);\n\t}\n\nexport function showModelSelector(host: InteractiveModeDelegateHost, initialSearchInput?: string): void {\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ModelSelectorComponent(\n\t\t\t\thost.ui,\n\t\t\t\thost.session.model,\n\t\t\t\thost.settingsManager,\n\t\t\t\thost.session.modelRegistry,\n\t\t\t\thost.session.scopedModels,\n\t\t\t\tasync (model) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait host.session.setModel(model);\n\t\t\t\t\t\thost.footer.invalidate();\n\t\t\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showStatus(`Model: ${model.id}`);\n\t\t\t\t\t\thost.checkDaxnutsEasterEgg(model);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tdone();\n\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t},\n\t\t\t\tinitialSearchInput,\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n\nexport async function showModelsSelector(host: InteractiveModeDelegateHost): Promise<void> {\n\t\t// Get all available models\n\t\thost.session.modelRegistry.refresh();\n\t\tconst allModels = host.session.modelRegistry.getAvailable();\n\n\t\tif (allModels.length === 0) {\n\t\t\thost.showStatus(\"No models available\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if session has scoped models (from previous session-only changes or CLI --models)\n\t\tconst sessionScopedModels = host.session.scopedModels;\n\t\tconst hasSessionScope = sessionScopedModels.length > 0;\n\n\t\t// Build enabled model IDs from session state or settings\n\t\tconst enabledModelIds = new Set<string>();\n\t\tlet hasFilter = false;\n\n\t\tif (hasSessionScope) {\n\t\t\t// Use current session's scoped models\n\t\t\tfor (const sm of sessionScopedModels) {\n\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t}\n\t\t\thasFilter = true;\n\t\t} else {\n\t\t\t// Fall back to settings\n\t\t\tconst patterns = host.settingsManager.getEnabledModels();\n\t\t\tif (patterns !== undefined && patterns.length > 0) {\n\t\t\t\thasFilter = true;\n\t\t\t\tconst scopedModels = await resolveModelScope(patterns, host.session.modelRegistry);\n\t\t\t\tfor (const sm of scopedModels) {\n\t\t\t\t\tenabledModelIds.add(`${sm.model.provider}/${sm.model.id}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Track current enabled state (session-only until persisted)\n\t\tconst currentEnabledIds = new Set(enabledModelIds);\n\t\tlet currentHasFilter = hasFilter;\n\n\t\t// Helper to update session's scoped models (session-only, no persist)\n\t\tconst updateSessionModels = async (enabledIds: Set<string>) => {\n\t\t\tif (enabledIds.size > 0 && enabledIds.size < allModels.length) {\n\t\t\t\tconst newScopedModels = await resolveModelScope(Array.from(enabledIds), host.session.modelRegistry);\n\t\t\t\thost.session.setScopedModels(\n\t\t\t\t\tnewScopedModels.map((sm) => ({\n\t\t\t\t\t\tmodel: sm.model,\n\t\t\t\t\t\tthinkingLevel: sm.thinkingLevel,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// All enabled or none enabled = no filter\n\t\t\t\thost.session.setScopedModels([]);\n\t\t\t}\n\t\t\tawait host.updateAvailableProviderCount();\n\t\t\thost.ui.requestRender();\n\t\t};\n\n\t\thost.showSelector((done) => {\n\t\t\tconst selector = new ScopedModelsSelectorComponent(\n\t\t\t\t{\n\t\t\t\t\tallModels,\n\t\t\t\t\tenabledModelIds: currentEnabledIds,\n\t\t\t\t\thasEnabledModelsFilter: currentHasFilter,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonModelToggle: async (modelId, enabled) => {\n\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(modelId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcurrentEnabledIds.delete(modelId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonEnableAll: async (allModelIds) => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tfor (const id of allModelIds) {\n\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = false;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonClearAll: async () => {\n\t\t\t\t\t\tcurrentEnabledIds.clear();\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonToggleProvider: async (_provider, modelIds, enabled) => {\n\t\t\t\t\t\tfor (const id of modelIds) {\n\t\t\t\t\t\t\tif (enabled) {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.add(id);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcurrentEnabledIds.delete(id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentHasFilter = true;\n\t\t\t\t\t\tawait updateSessionModels(currentEnabledIds);\n\t\t\t\t\t},\n\t\t\t\t\tonPersist: (enabledIds) => {\n\t\t\t\t\t\t// Persist to settings\n\t\t\t\t\t\tconst newPatterns =\n\t\t\t\t\t\t\tenabledIds.length === allModels.length\n\t\t\t\t\t\t\t\t? undefined // All enabled = clear filter\n\t\t\t\t\t\t\t\t: enabledIds;\n\t\t\t\t\t\thost.settingsManager.setEnabledModels(newPatterns);\n\t\t\t\t\t\thost.showStatus(\"Model selection saved to settings\");\n\t\t\t\t\t},\n\t\t\t\t\tonCancel: () => {\n\t\t\t\t\t\tdone();\n\t\t\t\t\t\thost.ui.requestRender();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn { component: selector, focus: selector };\n\t\t});\n\t}\n"]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd/agent-modes",
3
- "version": "1.1.1-dev.3ea310e",
3
+ "version": "1.1.1-dev.595401e",
4
4
  "description": "GSD run modes and CLI layer",
5
5
  "type": "module",
6
6
  "gsd": {
@@ -25,12 +25,12 @@
25
25
  "test": "node --import ../../src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/**/*.test.ts"
26
26
  },
27
27
  "dependencies": {
28
- "@gsd/agent-core": "^1.1.1-dev.3ea310e",
29
- "@gsd/pi-agent-core": "^1.1.1-dev.3ea310e",
30
- "@gsd/pi-ai": "^1.1.1-dev.3ea310e",
31
- "@gsd/pi-coding-agent": "^1.1.1-dev.3ea310e",
32
- "@gsd/pi-tui": "^1.1.1-dev.3ea310e",
33
- "@opengsd/contracts": "^1.1.1-dev.3ea310e",
28
+ "@gsd/agent-core": "^1.1.1-dev.595401e",
29
+ "@gsd/pi-agent-core": "^1.1.1-dev.595401e",
30
+ "@gsd/pi-ai": "^1.1.1-dev.595401e",
31
+ "@gsd/pi-coding-agent": "^1.1.1-dev.595401e",
32
+ "@gsd/pi-tui": "^1.1.1-dev.595401e",
33
+ "@opengsd/contracts": "^1.1.1-dev.595401e",
34
34
  "chalk": "^5.5.0"
35
35
  }
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remote-questions.d.ts","sourceRoot":"","sources":["../src/remote-questions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqBD,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAgJD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AA6mBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,EAAE,GAC1B;IACD,YAAY,EAAE,KAAK,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE,CAYA;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,cAAc,EAAE,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwFlC"}
1
+ {"version":3,"file":"remote-questions.d.ts","sourceRoot":"","sources":["../src/remote-questions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAqBD,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAgJD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AA2nBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,cAAc,EAAE,GAC1B;IACD,YAAY,EAAE,KAAK,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE,CAYA;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,cAAc,EAAE,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwFlC"}
@@ -152,24 +152,38 @@ async function apiRequest(url, method, body, authScheme, authToken, errorLabel)
152
152
  const headers = {
153
153
  Authorization: `${authScheme} ${authToken}`,
154
154
  };
155
+ // Use setTimeout + clearTimeout instead of AbortSignal.timeout() so the
156
+ // timer is always cancelled after the request and response body settle.
157
+ // AbortSignal.timeout() leaves a lingering libuv async handle on Windows that
158
+ // causes an assertion failure during process exit when requests complete
159
+ // before the timeout fires.
160
+ const controller = new AbortController();
161
+ const timeoutId = setTimeout(() => {
162
+ controller.abort(new Error(`${errorLabel} timed out`));
163
+ }, PER_REQUEST_TIMEOUT_MS);
155
164
  const init = {
156
165
  method,
157
166
  headers,
158
- signal: AbortSignal.timeout(PER_REQUEST_TIMEOUT_MS),
167
+ signal: controller.signal,
159
168
  };
160
169
  if (body !== undefined) {
161
170
  headers['Content-Type'] = 'application/json';
162
171
  init.body = JSON.stringify(body);
163
172
  }
164
- const response = await fetch(url, init);
165
- if (response.status === 204)
166
- return {};
167
- if (!response.ok) {
168
- const text = await response.text().catch(() => '');
169
- const safeText = text.length > 200 ? text.slice(0, 200) + '\u2026' : text;
170
- throw new Error(`${errorLabel} HTTP ${response.status}: ${safeText}`);
173
+ try {
174
+ const response = await fetch(url, init);
175
+ if (response.status === 204)
176
+ return {};
177
+ if (!response.ok) {
178
+ const text = await response.text().catch(() => '');
179
+ const safeText = text.length > 200 ? text.slice(0, 200) + '\u2026' : text;
180
+ throw new Error(`${errorLabel} HTTP ${response.status}: ${safeText}`);
181
+ }
182
+ return await response.json();
183
+ }
184
+ finally {
185
+ clearTimeout(timeoutId);
171
186
  }
172
- return response.json();
173
187
  }
174
188
  // ---------------------------------------------------------------------------
175
189
  // Payload formatting
@@ -1 +1 @@
1
- {"version":3,"file":"remote-questions.js","sourceRoot":"","sources":["../src/remote-questions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Remote Questions — self-contained MCP-server adapter\n *\n * Mirrors the routing logic from src/resources/extensions/ask-user-questions.ts\n * but without any dependency on @gsd/pi-coding-agent or the main src/ tree.\n * All channel adapters (Discord, Slack, Telegram), config resolution, HTTP\n * calls, and polling are inlined here so packages/mcp-server remains a\n * standalone package.\n *\n * Entry points consumed by server.ts:\n * isRemoteConfigured() — cheap synchronous config check\n * tryRemoteQuestions(...) — dispatch + poll + return result\n */\n\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype RemoteChannel = 'slack' | 'discord' | 'telegram';\n\ninterface QuestionOption {\n label: string;\n description: string;\n}\n\nexport interface RemoteQuestion {\n id: string;\n header: string;\n question: string;\n options: QuestionOption[];\n allowMultiple?: boolean;\n}\n\ninterface RemotePrompt {\n id: string;\n channel: RemoteChannel;\n createdAt: number;\n timeoutAt: number;\n pollIntervalMs: number;\n questions: RemoteQuestion[];\n context: { source: string };\n}\n\ninterface RemotePromptRef {\n id: string;\n channel: RemoteChannel;\n messageId: string;\n channelId: string;\n threadTs?: string;\n threadUrl?: string;\n}\n\ninterface RemoteAnswer {\n answers: Record<string, { answers: string[]; user_note?: string }>;\n}\n\nexport interface RemoteToolResult {\n content: Array<{ type: 'text'; text: string }>;\n details?: Record<string, unknown>;\n}\n\ninterface ResolvedConfig {\n channel: RemoteChannel;\n channelId: string;\n timeoutMs: number;\n pollIntervalMs: number;\n token: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst PER_REQUEST_TIMEOUT_MS = 15_000;\nconst DISCORD_API = 'https://discord.com/api/v10';\nconst SLACK_API = 'https://slack.com/api';\nconst TELEGRAM_API = 'https://api.telegram.org';\n\nconst DISCORD_NUMBER_EMOJIS = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣'];\nconst SLACK_NUMBER_REACTION_NAMES = ['one', 'two', 'three', 'four', 'five'];\n\nconst DEFAULT_TIMEOUT_MINUTES = 5;\nconst DEFAULT_POLL_INTERVAL_SECONDS = 5;\nconst MIN_TIMEOUT_MINUTES = 1;\nconst MAX_TIMEOUT_MINUTES = 30;\nconst MIN_POLL_INTERVAL_SECONDS = 2;\nconst MAX_POLL_INTERVAL_SECONDS = 30;\n\nconst CHANNEL_ID_PATTERNS: Record<RemoteChannel, RegExp> = {\n slack: /^[A-Z0-9]{9,12}$/,\n discord: /^\\d{17,20}$/,\n telegram: /^-?\\d{5,20}$/,\n};\n\nconst ENV_KEYS: Record<RemoteChannel, string> = {\n slack: 'SLACK_BOT_TOKEN',\n discord: 'DISCORD_BOT_TOKEN',\n telegram: 'TELEGRAM_BOT_TOKEN',\n};\n\n// ---------------------------------------------------------------------------\n// Config resolution — reads ~/.gsd/PREFERENCES.md YAML frontmatter\n// ---------------------------------------------------------------------------\n\nfunction clampNumber(value: unknown, fallback: number, min: number, max: number): number {\n const n = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(n)) return fallback;\n return Math.max(min, Math.min(max, n));\n}\n\n/**\n * Minimal YAML frontmatter reader. Handles:\n * ---\n * key: value\n * nested_key:\n * child: value\n * ---\n * Sufficient for the flat remote_questions config block.\n */\nfunction parseSimpleFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/m);\n if (!match) return {};\n\n const yaml = match[1];\n const result: Record<string, unknown> = {};\n let currentSection: string | null = null;\n const sectionData: Record<string, Record<string, unknown>> = {};\n\n for (const rawLine of yaml.split('\\n')) {\n const line = rawLine.replace(/\\r$/, '');\n if (!line.trim() || line.trim().startsWith('#')) continue;\n\n // Top-level key (no indent)\n const topMatch = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.*)$/);\n if (topMatch) {\n currentSection = topMatch[1];\n const val = topMatch[2].trim();\n if (val) {\n result[currentSection] = parseSimpleScalar(val);\n currentSection = null; // scalar, no children\n } else {\n sectionData[currentSection] = {};\n result[currentSection] = sectionData[currentSection];\n }\n continue;\n }\n\n // Indented child key\n const childMatch = line.match(/^\\s+([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.*)$/);\n if (childMatch && currentSection && sectionData[currentSection]) {\n const childKey = childMatch[1];\n const childVal = childMatch[2].trim();\n sectionData[currentSection][childKey] = parseSimpleScalar(childVal);\n }\n }\n\n return result;\n}\n\nfunction parseSimpleScalar(raw: string): string | number | boolean | null {\n const s = raw.replace(/^[\"']|[\"']$/g, '').trim();\n if (s === 'true') return true;\n if (s === 'false') return false;\n if (s === 'null' || s === '~') return null;\n const n = Number(s);\n if (s !== '' && !Number.isNaN(n)) return n;\n return s;\n}\n\nfunction loadPreferencesFromFile(path: string): Record<string, unknown> | null {\n try {\n const content = readFileSync(path, 'utf-8');\n return parseSimpleFrontmatter(content);\n } catch {\n return null;\n }\n}\n\nfunction resolveRemoteConfig(): ResolvedConfig | null {\n const gsdHome = process.env['GSD_HOME'] ?? join(homedir(), '.gsd');\n const globalPath = join(gsdHome, 'PREFERENCES.md');\n\n const prefs = loadPreferencesFromFile(globalPath);\n if (!prefs) return null;\n\n const rq = prefs['remote_questions'] as Record<string, unknown> | undefined;\n if (!rq || !rq['channel'] || !rq['channel_id']) return null;\n\n const channel = String(rq['channel']) as RemoteChannel;\n if (channel !== 'slack' && channel !== 'discord' && channel !== 'telegram') return null;\n\n const channelId = String(rq['channel_id']);\n if (!CHANNEL_ID_PATTERNS[channel].test(channelId)) return null;\n\n const token = process.env[ENV_KEYS[channel]];\n if (!token) return null;\n\n const timeoutMs = clampNumber(rq['timeout_minutes'], DEFAULT_TIMEOUT_MINUTES, MIN_TIMEOUT_MINUTES, MAX_TIMEOUT_MINUTES) * 60 * 1000;\n const pollIntervalMs = clampNumber(rq['poll_interval_seconds'], DEFAULT_POLL_INTERVAL_SECONDS, MIN_POLL_INTERVAL_SECONDS, MAX_POLL_INTERVAL_SECONDS) * 1000;\n\n return { channel, channelId, timeoutMs, pollIntervalMs, token };\n}\n\n/**\n * Cheap synchronous check — does not make any HTTP requests.\n */\nexport function isRemoteConfigured(): boolean {\n return resolveRemoteConfig() !== null;\n}\n\n// ---------------------------------------------------------------------------\n// HTTP helper\n// ---------------------------------------------------------------------------\n\nasync function apiRequest(\n url: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n body: unknown,\n authScheme: 'Bearer' | 'Bot',\n authToken: string,\n errorLabel: string,\n): Promise<unknown> {\n const headers: Record<string, string> = {\n Authorization: `${authScheme} ${authToken}`,\n };\n\n const init: RequestInit = {\n method,\n headers,\n signal: AbortSignal.timeout(PER_REQUEST_TIMEOUT_MS),\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(body);\n }\n\n const response = await fetch(url, init);\n\n if (response.status === 204) return {};\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n const safeText = text.length > 200 ? text.slice(0, 200) + '\\u2026' : text;\n throw new Error(`${errorLabel} HTTP ${response.status}: ${safeText}`);\n }\n\n return response.json();\n}\n\n// ---------------------------------------------------------------------------\n// Payload formatting\n// ---------------------------------------------------------------------------\n\nfunction formatForDiscord(prompt: RemotePrompt): { embeds: unknown[]; reactionEmojis: string[] } {\n const reactionEmojis: string[] = [];\n const embeds = prompt.questions.map((q, questionIndex) => {\n const supportsReactions = prompt.questions.length === 1;\n const optionLines = q.options.map((opt, i) => {\n const emoji = DISCORD_NUMBER_EMOJIS[i] ?? `${i + 1}.`;\n if (supportsReactions && DISCORD_NUMBER_EMOJIS[i]) reactionEmojis.push(DISCORD_NUMBER_EMOJIS[i]);\n return `${emoji} **${opt.label}** — ${opt.description}`;\n });\n\n const footerParts: string[] = [];\n if (supportsReactions) {\n footerParts.push(q.allowMultiple\n ? 'Reply with comma-separated choices (`1,3`) or react with matching numbers'\n : 'Reply with a number or react with the matching number');\n } else {\n footerParts.push(`Question ${questionIndex + 1}/${prompt.questions.length} — reply with one line per question or use semicolons`);\n }\n footerParts.push(`Source: ${prompt.context.source}`);\n\n return {\n title: q.header,\n description: q.question,\n color: 0x7c3aed,\n fields: [{ name: 'Options', value: optionLines.join('\\n') }],\n footer: { text: footerParts.join(' · ') },\n };\n });\n\n return { embeds, reactionEmojis };\n}\n\nfunction formatForSlack(prompt: RemotePrompt): unknown[] {\n const blocks: unknown[] = [\n { type: 'header', text: { type: 'plain_text', text: 'GSD needs your input' } },\n ];\n\n if (prompt.questions.length > 1) {\n blocks.push({\n type: 'context',\n elements: [{ type: 'mrkdwn', text: 'Reply once in thread using one line per question or semicolons (`1; 2; custom note`).' }],\n });\n }\n\n for (const q of prompt.questions) {\n const supportsReactions = prompt.questions.length === 1;\n blocks.push({ type: 'section', text: { type: 'mrkdwn', text: `*${q.header}*\\n${q.question}` } });\n blocks.push({\n type: 'section',\n text: { type: 'mrkdwn', text: q.options.map((opt, i) => `${i + 1}. *${opt.label}* — ${opt.description}`).join('\\n') },\n });\n blocks.push({\n type: 'context',\n elements: [{\n type: 'mrkdwn',\n text: prompt.questions.length > 1\n ? (q.allowMultiple ? 'For this question, use comma-separated numbers (`1,3`) or free text.' : 'For this question, use one number (`1`) or free text.')\n : (q.allowMultiple\n ? (supportsReactions ? 'Reply in thread with comma-separated numbers (`1,3`) or react with matching number emoji.' : 'Reply in thread with comma-separated numbers (`1,3`) or free text.')\n : (supportsReactions ? 'Reply in thread with a number (`1`) or react with the matching number emoji.' : 'Reply in thread with a number (`1`) or free text.')),\n }],\n });\n blocks.push({ type: 'divider' });\n }\n\n return blocks;\n}\n\nfunction formatForTelegram(prompt: RemotePrompt): { text: string; parse_mode: 'HTML'; reply_markup?: unknown } {\n const escape = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n const lines: string[] = ['<b>GSD needs your input</b>', ''];\n\n for (let qi = 0; qi < prompt.questions.length; qi++) {\n const q = prompt.questions[qi];\n lines.push(`<b>${escape(q.header)}</b>`);\n lines.push(escape(q.question));\n lines.push('');\n for (let i = 0; i < q.options.length; i++) {\n lines.push(`${i + 1}. <b>${escape(q.options[i].label)}</b> — ${escape(q.options[i].description)}`);\n }\n lines.push('');\n if (prompt.questions.length === 1) {\n lines.push(q.allowMultiple ? 'Reply with comma-separated numbers (1,3) or free text.' : 'Reply with a number or tap a button below.');\n } else {\n lines.push(`Question ${qi + 1}/${prompt.questions.length} — reply with one line per question or use semicolons.`);\n }\n if (qi < prompt.questions.length - 1) lines.push('');\n }\n\n const result: { text: string; parse_mode: 'HTML'; reply_markup?: unknown } = {\n text: lines.join('\\n'),\n parse_mode: 'HTML',\n };\n\n if (prompt.questions.length === 1 && prompt.questions[0].options.length <= 5) {\n result.reply_markup = {\n inline_keyboard: prompt.questions[0].options.map((opt, i) => [{\n text: `${i + 1}. ${opt.label}`,\n callback_data: `${prompt.id}:${i}`,\n }]),\n };\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Response parsing\n// ---------------------------------------------------------------------------\n\nfunction parseAnswerForQuestion(text: string, q: RemoteQuestion): { answers: string[]; user_note?: string } {\n if (!text) return { answers: [], user_note: 'No response provided' };\n\n if (/^[\\d,\\s]+$/.test(text)) {\n const nums = text\n .split(',')\n .map((s) => parseInt(s.trim(), 10))\n .filter((n) => !Number.isNaN(n) && n >= 1 && n <= q.options.length);\n if (nums.length > 0) {\n const selected = nums.map((n) => q.options[n - 1].label);\n return { answers: q.allowMultiple ? selected : [selected[0]] };\n }\n }\n\n const single = parseInt(text, 10);\n if (!Number.isNaN(single) && single >= 1 && single <= q.options.length) {\n return { answers: [q.options[single - 1].label] };\n }\n\n const truncated = text.length > 500 ? text.slice(0, 500) + '\\u2026' : text;\n return { answers: [], user_note: truncated };\n}\n\nfunction parseTextReply(text: string, questions: RemoteQuestion[]): RemoteAnswer {\n const answers: RemoteAnswer['answers'] = {};\n const trimmed = text.trim();\n\n if (questions.length === 1) {\n answers[questions[0].id] = parseAnswerForQuestion(trimmed, questions[0]);\n return { answers };\n }\n\n const parts = trimmed.includes(';')\n ? trimmed.split(';').map((s) => s.trim()).filter(Boolean)\n : trimmed.split('\\n').map((s) => s.trim()).filter(Boolean);\n\n for (let i = 0; i < questions.length; i++) {\n answers[questions[i].id] = parseAnswerForQuestion(parts[i] ?? '', questions[i]);\n }\n\n return { answers };\n}\n\nfunction parseDiscordReactions(\n reactions: Array<{ emoji: string; count: number }>,\n questions: RemoteQuestion[],\n): RemoteAnswer {\n const answers: RemoteAnswer['answers'] = {};\n if (questions.length !== 1) {\n for (const q of questions) {\n answers[q.id] = { answers: [], user_note: 'Discord reactions are only supported for single-question prompts' };\n }\n return { answers };\n }\n\n const q = questions[0];\n const picked = reactions\n .filter((r) => DISCORD_NUMBER_EMOJIS.includes(r.emoji) && r.count > 0)\n .map((r) => q.options[DISCORD_NUMBER_EMOJIS.indexOf(r.emoji)]?.label)\n .filter((l): l is string => Boolean(l));\n\n answers[q.id] = picked.length > 0\n ? { answers: q.allowMultiple ? picked : [picked[0]] }\n : { answers: [], user_note: 'No clear response via reactions' };\n\n return { answers };\n}\n\nfunction parseSlackReactions(reactionNames: string[], questions: RemoteQuestion[]): RemoteAnswer {\n const answers: RemoteAnswer['answers'] = {};\n if (questions.length !== 1) {\n for (const q of questions) {\n answers[q.id] = { answers: [], user_note: 'Slack reactions are only supported for single-question prompts' };\n }\n return { answers };\n }\n\n const q = questions[0];\n const picked = reactionNames\n .filter((name) => SLACK_NUMBER_REACTION_NAMES.includes(name))\n .map((name) => q.options[SLACK_NUMBER_REACTION_NAMES.indexOf(name)]?.label)\n .filter((l): l is string => Boolean(l));\n\n answers[q.id] = picked.length > 0\n ? { answers: q.allowMultiple ? picked : [picked[0]] }\n : { answers: [], user_note: 'No clear response via reactions' };\n\n return { answers };\n}\n\nfunction parseTelegramCallbackData(callbackData: string, questions: RemoteQuestion[], promptId: string): RemoteAnswer | null {\n const pattern = new RegExp(`^${promptId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}:(\\\\d+)$`);\n const match = callbackData.match(pattern);\n if (match && questions.length === 1) {\n const idx = parseInt(match[1], 10);\n const q = questions[0];\n if (idx >= 0 && idx < q.options.length) {\n return { answers: { [q.id]: { answers: [q.options[idx].label] } } };\n }\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Channel adapters\n// ---------------------------------------------------------------------------\n\ninterface DispatchResult {\n ref: RemotePromptRef;\n}\n\n// --- Discord ---\n\nasync function discordValidate(token: string, channelId: string): Promise<{ botUserId: string; guildId: string | null }> {\n const meRes = await apiRequest(`${DISCORD_API}/users/@me`, 'GET', undefined, 'Bot', token, 'Discord API') as Record<string, unknown>;\n if (!meRes['id']) throw new Error('Discord auth failed: invalid token');\n const botUserId = String(meRes['id']);\n\n let guildId: string | null = null;\n try {\n const chanRes = await apiRequest(`${DISCORD_API}/channels/${channelId}`, 'GET', undefined, 'Bot', token, 'Discord API') as Record<string, unknown>;\n if (chanRes['guild_id']) guildId = String(chanRes['guild_id']);\n } catch { /* non-fatal */ }\n\n return { botUserId, guildId };\n}\n\nasync function discordSend(prompt: RemotePrompt, token: string, channelId: string, guildId: string | null): Promise<DispatchResult> {\n const { embeds, reactionEmojis } = formatForDiscord(prompt);\n const res = await apiRequest(\n `${DISCORD_API}/channels/${channelId}/messages`,\n 'POST',\n { content: '**GSD needs your input** — reply to this message with your answer', embeds },\n 'Bot', token, 'Discord API',\n ) as Record<string, unknown>;\n\n if (!res['id']) throw new Error(`Discord send failed: ${JSON.stringify(res)}`);\n const messageId = String(res['id']);\n\n if (prompt.questions.length === 1) {\n for (const emoji of reactionEmojis) {\n try {\n await apiRequest(`${DISCORD_API}/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/@me`, 'PUT', undefined, 'Bot', token, 'Discord API');\n } catch { /* best-effort */ }\n }\n }\n\n const threadUrl = guildId ? `https://discord.com/channels/${guildId}/${channelId}/${messageId}` : undefined;\n return { ref: { id: prompt.id, channel: 'discord', messageId, channelId, threadUrl } };\n}\n\nasync function discordPoll(prompt: RemotePrompt, ref: RemotePromptRef, token: string, botUserId: string): Promise<RemoteAnswer | null> {\n // Try reactions first for single-question prompts\n if (prompt.questions.length === 1) {\n const reactions: Array<{ emoji: string; count: number }> = [];\n for (const emoji of DISCORD_NUMBER_EMOJIS) {\n try {\n const users = await apiRequest(\n `${DISCORD_API}/channels/${ref.channelId}/messages/${ref.messageId}/reactions/${encodeURIComponent(emoji)}`,\n 'GET', undefined, 'Bot', token, 'Discord API',\n ) as unknown[];\n if (Array.isArray(users)) {\n const humanUsers = users.filter((u) => (u as Record<string, unknown>)['id'] !== botUserId);\n if (humanUsers.length > 0) reactions.push({ emoji, count: humanUsers.length });\n }\n } catch (err) {\n const msg = String((err as Error).message ?? '');\n if (msg.includes('HTTP 404')) continue;\n if (msg.includes('HTTP 401') || msg.includes('HTTP 403')) throw err;\n }\n }\n if (reactions.length > 0) return parseDiscordReactions(reactions, prompt.questions);\n }\n\n // Try text replies\n const messages = await apiRequest(\n `${DISCORD_API}/channels/${ref.channelId}/messages?after=${ref.messageId}&limit=10`,\n 'GET', undefined, 'Bot', token, 'Discord API',\n ) as unknown[];\n\n if (!Array.isArray(messages)) return null;\n\n const replies = messages.filter((m) => {\n const msg = m as Record<string, unknown>;\n const author = msg['author'] as Record<string, unknown> | undefined;\n const msgRef = msg['message_reference'] as Record<string, unknown> | undefined;\n return author?.['id'] && author['id'] !== botUserId && msgRef?.['message_id'] === ref.messageId && msg['content'];\n });\n\n if (replies.length === 0) return null;\n const first = replies[0] as Record<string, unknown>;\n return parseTextReply(String(first['content']), prompt.questions);\n}\n\nasync function discordAcknowledge(ref: RemotePromptRef, token: string): Promise<void> {\n try {\n await apiRequest(\n `${DISCORD_API}/channels/${ref.channelId}/messages/${ref.messageId}/reactions/${encodeURIComponent('✅')}/@me`,\n 'PUT', undefined, 'Bot', token, 'Discord API',\n );\n } catch { /* best-effort */ }\n}\n\n// --- Slack ---\n\nasync function slackValidate(token: string): Promise<string> {\n const res = await apiRequest(`${SLACK_API}/auth.test`, 'GET', undefined, 'Bearer', token, 'Slack API') as Record<string, unknown>;\n if (!res['ok']) throw new Error(`Slack auth failed: ${res['error'] ?? 'invalid token'}`);\n return String(res['user_id'] ?? '');\n}\n\nasync function slackSend(prompt: RemotePrompt, token: string, channelId: string): Promise<DispatchResult> {\n const res = await apiRequest(\n `${SLACK_API}/chat.postMessage`,\n 'POST',\n { channel: channelId, text: 'GSD needs your input', blocks: formatForSlack(prompt) },\n 'Bearer', token, 'Slack API',\n ) as Record<string, unknown>;\n\n if (!res['ok']) throw new Error(`Slack postMessage failed: ${res['error'] ?? 'unknown'}`);\n\n const ts = String(res['ts']);\n const channel = String(res['channel']);\n\n if (prompt.questions.length === 1) {\n const reactionNames = SLACK_NUMBER_REACTION_NAMES.slice(0, prompt.questions[0].options.length);\n for (const name of reactionNames) {\n try {\n await apiRequest(`${SLACK_API}/reactions.add`, 'POST', { channel, timestamp: ts, name }, 'Bearer', token, 'Slack API');\n } catch { /* best-effort */ }\n }\n }\n\n return {\n ref: {\n id: prompt.id,\n channel: 'slack',\n messageId: ts,\n threadTs: ts,\n channelId: channel,\n threadUrl: `https://slack.com/archives/${channel}/p${ts.replace('.', '')}`,\n },\n };\n}\n\nasync function slackPoll(prompt: RemotePrompt, ref: RemotePromptRef, token: string, botUserId: string): Promise<RemoteAnswer | null> {\n // Check reactions for single-question prompts\n if (prompt.questions.length === 1) {\n const qs = new URLSearchParams({ channel: ref.channelId, timestamp: ref.messageId, full: 'true' }).toString();\n const res = await apiRequest(`${SLACK_API}/reactions.get?${qs}`, 'GET', undefined, 'Bearer', token, 'Slack API') as Record<string, unknown>;\n\n if (res['ok']) {\n const message = (res['message'] ?? {}) as { reactions?: Array<{ name?: string; count?: number; users?: string[] }> };\n const reactions = Array.isArray(message.reactions) ? message.reactions : [];\n const picked = reactions\n .filter((r) => r.name && SLACK_NUMBER_REACTION_NAMES.includes(r.name))\n .filter((r) => {\n const count = Number(r.count ?? 0);\n const users = Array.isArray(r.users) ? r.users.map(String) : [];\n const botIncluded = botUserId ? users.includes(botUserId) : false;\n return count > (botIncluded ? 1 : 0);\n })\n .map((r) => String(r.name));\n\n if (picked.length > 0) return parseSlackReactions(picked, prompt.questions);\n }\n }\n\n // Check thread replies\n const qs = new URLSearchParams({ channel: ref.channelId, ts: ref.threadTs!, limit: '20' }).toString();\n const res = await apiRequest(`${SLACK_API}/conversations.replies?${qs}`, 'GET', undefined, 'Bearer', token, 'Slack API') as Record<string, unknown>;\n\n if (!res['ok']) return null;\n\n const messages = (res['messages'] ?? []) as Array<{ user?: string; text?: string; ts: string }>;\n const userReplies = messages.filter((m) => m.ts !== ref.threadTs && m.user && m.user !== botUserId && m.text);\n if (userReplies.length === 0) return null;\n\n return parseTextReply(String(userReplies[0].text), prompt.questions);\n}\n\nasync function slackAcknowledge(ref: RemotePromptRef, token: string): Promise<void> {\n try {\n await apiRequest(\n `${SLACK_API}/reactions.add`,\n 'POST',\n { channel: ref.channelId, timestamp: ref.messageId, name: 'white_check_mark' },\n 'Bearer', token, 'Slack API',\n );\n } catch { /* best-effort */ }\n}\n\n// --- Telegram ---\n\nasync function telegramValidate(token: string): Promise<number> {\n const res = await apiRequest(`${TELEGRAM_API}/bot${token}/getMe`, 'GET', undefined, 'Bearer', token, 'Telegram API') as Record<string, unknown>;\n const result = res['result'] as Record<string, unknown> | undefined;\n if (!res['ok'] || !result?.['id']) throw new Error('Telegram auth failed: invalid bot token');\n return result['id'] as number;\n}\n\nasync function telegramSend(prompt: RemotePrompt, token: string, chatId: string): Promise<DispatchResult> {\n const payload = formatForTelegram(prompt);\n const params: Record<string, unknown> = { chat_id: chatId, text: payload.text, parse_mode: payload.parse_mode };\n if (payload.reply_markup) params['reply_markup'] = payload.reply_markup;\n\n const res = await apiRequest(`${TELEGRAM_API}/bot${token}/sendMessage`, 'POST', params, 'Bearer', token, 'Telegram API') as Record<string, unknown>;\n const result = res['result'] as Record<string, unknown> | undefined;\n if (!res['ok'] || !result?.['message_id']) throw new Error(`Telegram sendMessage failed: ${JSON.stringify(res)}`);\n\n const messageId = String(result['message_id']);\n // Build public URL only for public channels (negative IDs are private groups)\n const isPublic = !chatId.startsWith('-');\n const messageUrl = isPublic ? `https://t.me/${chatId.replace('@', '')}/${messageId}` : undefined;\n\n return { ref: { id: prompt.id, channel: 'telegram', messageId, channelId: chatId, threadUrl: messageUrl } };\n}\n\nasync function telegramPoll(\n prompt: RemotePrompt,\n ref: RemotePromptRef,\n token: string,\n botUserId: number,\n lastUpdateId: { value: number },\n): Promise<RemoteAnswer | null> {\n const params: Record<string, unknown> = {\n offset: lastUpdateId.value + 1,\n timeout: 0,\n allowed_updates: ['message', 'callback_query'],\n };\n\n const res = await apiRequest(`${TELEGRAM_API}/bot${token}/getUpdates`, 'POST', params, 'Bearer', token, 'Telegram API') as Record<string, unknown>;\n if (!res['ok'] || !Array.isArray(res['result'])) return null;\n\n for (const update of res['result'] as Record<string, unknown>[]) {\n if ((update['update_id'] as number) > lastUpdateId.value) {\n lastUpdateId.value = update['update_id'] as number;\n }\n\n // Callback query (inline keyboard button press)\n if (update['callback_query']) {\n const cq = update['callback_query'] as Record<string, unknown>;\n const msg = cq['message'] as Record<string, unknown> | undefined;\n const from = cq['from'] as Record<string, unknown> | undefined;\n if (msg && String((msg['chat'] as Record<string, unknown>)?.['id']) === ref.channelId &&\n String(msg['message_id']) === ref.messageId && from?.['id'] !== botUserId) {\n // Dismiss loading spinner\n try {\n await apiRequest(`${TELEGRAM_API}/bot${token}/answerCallbackQuery`, 'POST', { callback_query_id: cq['id'] }, 'Bearer', token, 'Telegram API');\n } catch { /* best-effort */ }\n const callbackData = cq['data'] ? String(cq['data']) : null;\n if (callbackData) {\n const parsed = parseTelegramCallbackData(callbackData, prompt.questions, prompt.id);\n if (parsed) return parsed;\n }\n }\n }\n\n // Text message reply\n if (update['message']) {\n const msg = update['message'] as Record<string, unknown>;\n const from = msg['from'] as Record<string, unknown> | undefined;\n if (String((msg['chat'] as Record<string, unknown>)?.['id']) === ref.channelId &&\n from?.['id'] !== botUserId && msg['text']) {\n return parseTextReply(String(msg['text']), prompt.questions);\n }\n }\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Polling loop\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal?.aborted) return resolve();\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => { clearTimeout(timer); resolve(); };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\ninterface ChannelState {\n botUserId: string | number;\n guildId?: string | null; // Discord only\n lastUpdateId?: { value: number }; // Telegram only\n}\n\nasync function pollUntilDone(\n config: ResolvedConfig,\n prompt: RemotePrompt,\n ref: RemotePromptRef,\n state: ChannelState,\n signal?: AbortSignal,\n): Promise<RemoteAnswer | null> {\n while (Date.now() < prompt.timeoutAt && !signal?.aborted) {\n try {\n let answer: RemoteAnswer | null = null;\n\n if (config.channel === 'discord') {\n answer = await discordPoll(prompt, ref, config.token, String(state.botUserId));\n } else if (config.channel === 'slack') {\n answer = await slackPoll(prompt, ref, config.token, String(state.botUserId));\n } else {\n answer = await telegramPoll(prompt, ref, config.token, state.botUserId as number, state.lastUpdateId!);\n }\n\n if (answer) return answer;\n } catch (err) {\n // Auth errors (401/403) mean the configured token is invalid or\n // revoked — re-throw so the caller can surface a useful error\n // immediately instead of silently spinning until the timeout.\n // Network/transient errors keep the retry behaviour.\n const msg = String((err as Error)?.message ?? err);\n if (msg.includes('HTTP 401') || msg.includes('HTTP 403')) {\n throw err;\n }\n // Non-fatal poll error — wait and retry\n }\n\n await sleep(prompt.pollIntervalMs, signal);\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Public entry point\n// ---------------------------------------------------------------------------\n\nfunction buildPrompt(questions: RemoteQuestion[], config: ResolvedConfig): RemotePrompt {\n const createdAt = Date.now();\n return {\n id: randomUUID(),\n channel: config.channel,\n createdAt,\n timeoutAt: createdAt + config.timeoutMs,\n pollIntervalMs: config.pollIntervalMs,\n context: { source: 'ask_user_questions' },\n questions: questions.map((q) => ({\n id: q.id,\n header: q.header,\n question: q.question,\n options: q.options,\n allowMultiple: q.allowMultiple ?? false,\n })),\n };\n}\n\nfunction formatForTool(answer: RemoteAnswer): Record<string, { answers: string[] }> {\n const out: Record<string, { answers: string[] }> = {};\n for (const [id, data] of Object.entries(answer.answers)) {\n const list = [...data.answers];\n if (data.user_note) list.push(`user_note: ${data.user_note}`);\n out[id] = { answers: list };\n }\n return out;\n}\n\n/**\n * Normalize a `RemoteAnswer` into the `RoundResult` shape the GSD\n * discussion-gate hook reads from `tool_result` `details.response`. Mirrors\n * `src/resources/extensions/remote-questions/manager.ts:toRoundResultResponse`\n * and the local-path helper `buildAskUserQuestionsRoundResult` in server.ts.\n * Without this, the remote channel (Discord / Slack / Telegram) would have\n * the same gate-stuck problem as the local elicitation path. See #5267.\n *\n * `questions` is required so the multi-select contract is preserved: a\n * `allowMultiple` question with a single selection must still surface\n * `selected: [label]` so consumers reading `selected.includes(...)` keep\n * working. Falling back to length-based inference (the previous behavior)\n * silently demoted single-pick multi-select answers to strings.\n */\nexport function toRoundResultResponse(\n answer: RemoteAnswer,\n questions: RemoteQuestion[],\n): {\n endInterview: false;\n answers: Record<string, { selected: string | string[]; notes: string }>;\n} {\n const allowMultipleById = new Map<string, boolean>();\n for (const q of questions) allowMultipleById.set(q.id, q.allowMultiple ?? false);\n\n const normalized: Record<string, { selected: string | string[]; notes: string }> = {};\n for (const [id, data] of Object.entries(answer.answers)) {\n const list = data.answers ?? [];\n const allowMultiple = allowMultipleById.get(id) ?? false;\n const selected: string | string[] = allowMultiple ? list : (list[0] ?? '');\n normalized[id] = { selected, notes: data.user_note ?? '' };\n }\n return { endInterview: false, answers: normalized };\n}\n\n/**\n * Dispatch questions to the configured remote channel and wait for a response.\n *\n * Returns null when no remote channel is configured.\n * Returns a tool result shaped like { content, details } on success or\n * timeout — callers should check details.timed_out before trusting the result.\n */\nexport async function tryRemoteQuestions(\n questions: RemoteQuestion[],\n signal?: AbortSignal,\n): Promise<RemoteToolResult | null> {\n const config = resolveRemoteConfig();\n if (!config) return null;\n\n const prompt = buildPrompt(questions, config);\n\n // Validate auth and send the prompt\n let ref: RemotePromptRef;\n let state: ChannelState;\n\n try {\n if (config.channel === 'discord') {\n const { botUserId, guildId } = await discordValidate(config.token, config.channelId);\n state = { botUserId, guildId };\n const dispatch = await discordSend(prompt, config.token, config.channelId, guildId);\n ref = dispatch.ref;\n } else if (config.channel === 'slack') {\n const botUserId = await slackValidate(config.token);\n state = { botUserId };\n const dispatch = await slackSend(prompt, config.token, config.channelId);\n ref = dispatch.ref;\n } else {\n const botUserId = await telegramValidate(config.token);\n state = { botUserId, lastUpdateId: { value: 0 } };\n const dispatch = await telegramSend(prompt, config.token, config.channelId);\n ref = dispatch.ref;\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Remote questions failed (${config.channel}): ${(err as Error).message}` }],\n details: { remote: true, channel: config.channel, error: true, status: 'failed' },\n };\n }\n\n let answer: RemoteAnswer | null;\n try {\n answer = await pollUntilDone(config, prompt, ref, state, signal);\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Remote questions failed (${config.channel}): ${(err as Error).message}` }],\n details: { remote: true, channel: config.channel, error: true, status: 'failed' },\n };\n }\n\n if (!answer) {\n const timedOut = !signal?.aborted;\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n timed_out: timedOut,\n channel: config.channel,\n prompt_id: prompt.id,\n timeout_minutes: config.timeoutMs / 60000,\n thread_url: ref.threadUrl ?? null,\n message: `User did not respond within ${config.timeoutMs / 60000} minutes.`,\n }),\n }],\n details: {\n remote: true,\n channel: config.channel,\n timed_out: timedOut,\n promptId: prompt.id,\n threadUrl: ref.threadUrl ?? null,\n status: signal?.aborted ? 'cancelled' : 'timed_out',\n },\n };\n }\n\n // Best-effort acknowledgement\n try {\n if (config.channel === 'discord') await discordAcknowledge(ref, config.token);\n else if (config.channel === 'slack') await slackAcknowledge(ref, config.token);\n } catch { /* best-effort */ }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ answers: formatForTool(answer) }) }],\n details: {\n remote: true,\n channel: config.channel,\n timed_out: false,\n promptId: prompt.id,\n threadUrl: ref.threadUrl ?? null,\n questions,\n response: toRoundResultResponse(answer, questions),\n status: 'answered',\n },\n };\n}\n"]}
1
+ {"version":3,"file":"remote-questions.js","sourceRoot":"","sources":["../src/remote-questions.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Remote Questions — self-contained MCP-server adapter\n *\n * Mirrors the routing logic from src/resources/extensions/ask-user-questions.ts\n * but without any dependency on @gsd/pi-coding-agent or the main src/ tree.\n * All channel adapters (Discord, Slack, Telegram), config resolution, HTTP\n * calls, and polling are inlined here so packages/mcp-server remains a\n * standalone package.\n *\n * Entry points consumed by server.ts:\n * isRemoteConfigured() — cheap synchronous config check\n * tryRemoteQuestions(...) — dispatch + poll + return result\n */\n\nimport { readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype RemoteChannel = 'slack' | 'discord' | 'telegram';\n\ninterface QuestionOption {\n label: string;\n description: string;\n}\n\nexport interface RemoteQuestion {\n id: string;\n header: string;\n question: string;\n options: QuestionOption[];\n allowMultiple?: boolean;\n}\n\ninterface RemotePrompt {\n id: string;\n channel: RemoteChannel;\n createdAt: number;\n timeoutAt: number;\n pollIntervalMs: number;\n questions: RemoteQuestion[];\n context: { source: string };\n}\n\ninterface RemotePromptRef {\n id: string;\n channel: RemoteChannel;\n messageId: string;\n channelId: string;\n threadTs?: string;\n threadUrl?: string;\n}\n\ninterface RemoteAnswer {\n answers: Record<string, { answers: string[]; user_note?: string }>;\n}\n\nexport interface RemoteToolResult {\n content: Array<{ type: 'text'; text: string }>;\n details?: Record<string, unknown>;\n}\n\ninterface ResolvedConfig {\n channel: RemoteChannel;\n channelId: string;\n timeoutMs: number;\n pollIntervalMs: number;\n token: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst PER_REQUEST_TIMEOUT_MS = 15_000;\nconst DISCORD_API = 'https://discord.com/api/v10';\nconst SLACK_API = 'https://slack.com/api';\nconst TELEGRAM_API = 'https://api.telegram.org';\n\nconst DISCORD_NUMBER_EMOJIS = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣'];\nconst SLACK_NUMBER_REACTION_NAMES = ['one', 'two', 'three', 'four', 'five'];\n\nconst DEFAULT_TIMEOUT_MINUTES = 5;\nconst DEFAULT_POLL_INTERVAL_SECONDS = 5;\nconst MIN_TIMEOUT_MINUTES = 1;\nconst MAX_TIMEOUT_MINUTES = 30;\nconst MIN_POLL_INTERVAL_SECONDS = 2;\nconst MAX_POLL_INTERVAL_SECONDS = 30;\n\nconst CHANNEL_ID_PATTERNS: Record<RemoteChannel, RegExp> = {\n slack: /^[A-Z0-9]{9,12}$/,\n discord: /^\\d{17,20}$/,\n telegram: /^-?\\d{5,20}$/,\n};\n\nconst ENV_KEYS: Record<RemoteChannel, string> = {\n slack: 'SLACK_BOT_TOKEN',\n discord: 'DISCORD_BOT_TOKEN',\n telegram: 'TELEGRAM_BOT_TOKEN',\n};\n\n// ---------------------------------------------------------------------------\n// Config resolution — reads ~/.gsd/PREFERENCES.md YAML frontmatter\n// ---------------------------------------------------------------------------\n\nfunction clampNumber(value: unknown, fallback: number, min: number, max: number): number {\n const n = typeof value === 'number' ? value : Number(value);\n if (!Number.isFinite(n)) return fallback;\n return Math.max(min, Math.min(max, n));\n}\n\n/**\n * Minimal YAML frontmatter reader. Handles:\n * ---\n * key: value\n * nested_key:\n * child: value\n * ---\n * Sufficient for the flat remote_questions config block.\n */\nfunction parseSimpleFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/m);\n if (!match) return {};\n\n const yaml = match[1];\n const result: Record<string, unknown> = {};\n let currentSection: string | null = null;\n const sectionData: Record<string, Record<string, unknown>> = {};\n\n for (const rawLine of yaml.split('\\n')) {\n const line = rawLine.replace(/\\r$/, '');\n if (!line.trim() || line.trim().startsWith('#')) continue;\n\n // Top-level key (no indent)\n const topMatch = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.*)$/);\n if (topMatch) {\n currentSection = topMatch[1];\n const val = topMatch[2].trim();\n if (val) {\n result[currentSection] = parseSimpleScalar(val);\n currentSection = null; // scalar, no children\n } else {\n sectionData[currentSection] = {};\n result[currentSection] = sectionData[currentSection];\n }\n continue;\n }\n\n // Indented child key\n const childMatch = line.match(/^\\s+([a-zA-Z_][a-zA-Z0-9_]*):\\s*(.*)$/);\n if (childMatch && currentSection && sectionData[currentSection]) {\n const childKey = childMatch[1];\n const childVal = childMatch[2].trim();\n sectionData[currentSection][childKey] = parseSimpleScalar(childVal);\n }\n }\n\n return result;\n}\n\nfunction parseSimpleScalar(raw: string): string | number | boolean | null {\n const s = raw.replace(/^[\"']|[\"']$/g, '').trim();\n if (s === 'true') return true;\n if (s === 'false') return false;\n if (s === 'null' || s === '~') return null;\n const n = Number(s);\n if (s !== '' && !Number.isNaN(n)) return n;\n return s;\n}\n\nfunction loadPreferencesFromFile(path: string): Record<string, unknown> | null {\n try {\n const content = readFileSync(path, 'utf-8');\n return parseSimpleFrontmatter(content);\n } catch {\n return null;\n }\n}\n\nfunction resolveRemoteConfig(): ResolvedConfig | null {\n const gsdHome = process.env['GSD_HOME'] ?? join(homedir(), '.gsd');\n const globalPath = join(gsdHome, 'PREFERENCES.md');\n\n const prefs = loadPreferencesFromFile(globalPath);\n if (!prefs) return null;\n\n const rq = prefs['remote_questions'] as Record<string, unknown> | undefined;\n if (!rq || !rq['channel'] || !rq['channel_id']) return null;\n\n const channel = String(rq['channel']) as RemoteChannel;\n if (channel !== 'slack' && channel !== 'discord' && channel !== 'telegram') return null;\n\n const channelId = String(rq['channel_id']);\n if (!CHANNEL_ID_PATTERNS[channel].test(channelId)) return null;\n\n const token = process.env[ENV_KEYS[channel]];\n if (!token) return null;\n\n const timeoutMs = clampNumber(rq['timeout_minutes'], DEFAULT_TIMEOUT_MINUTES, MIN_TIMEOUT_MINUTES, MAX_TIMEOUT_MINUTES) * 60 * 1000;\n const pollIntervalMs = clampNumber(rq['poll_interval_seconds'], DEFAULT_POLL_INTERVAL_SECONDS, MIN_POLL_INTERVAL_SECONDS, MAX_POLL_INTERVAL_SECONDS) * 1000;\n\n return { channel, channelId, timeoutMs, pollIntervalMs, token };\n}\n\n/**\n * Cheap synchronous check — does not make any HTTP requests.\n */\nexport function isRemoteConfigured(): boolean {\n return resolveRemoteConfig() !== null;\n}\n\n// ---------------------------------------------------------------------------\n// HTTP helper\n// ---------------------------------------------------------------------------\n\nasync function apiRequest(\n url: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n body: unknown,\n authScheme: 'Bearer' | 'Bot',\n authToken: string,\n errorLabel: string,\n): Promise<unknown> {\n const headers: Record<string, string> = {\n Authorization: `${authScheme} ${authToken}`,\n };\n\n // Use setTimeout + clearTimeout instead of AbortSignal.timeout() so the\n // timer is always cancelled after the request and response body settle.\n // AbortSignal.timeout() leaves a lingering libuv async handle on Windows that\n // causes an assertion failure during process exit when requests complete\n // before the timeout fires.\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort(new Error(`${errorLabel} timed out`));\n }, PER_REQUEST_TIMEOUT_MS);\n\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n init.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, init);\n\n if (response.status === 204) return {};\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n const safeText = text.length > 200 ? text.slice(0, 200) + '\\u2026' : text;\n throw new Error(`${errorLabel} HTTP ${response.status}: ${safeText}`);\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Payload formatting\n// ---------------------------------------------------------------------------\n\nfunction formatForDiscord(prompt: RemotePrompt): { embeds: unknown[]; reactionEmojis: string[] } {\n const reactionEmojis: string[] = [];\n const embeds = prompt.questions.map((q, questionIndex) => {\n const supportsReactions = prompt.questions.length === 1;\n const optionLines = q.options.map((opt, i) => {\n const emoji = DISCORD_NUMBER_EMOJIS[i] ?? `${i + 1}.`;\n if (supportsReactions && DISCORD_NUMBER_EMOJIS[i]) reactionEmojis.push(DISCORD_NUMBER_EMOJIS[i]);\n return `${emoji} **${opt.label}** — ${opt.description}`;\n });\n\n const footerParts: string[] = [];\n if (supportsReactions) {\n footerParts.push(q.allowMultiple\n ? 'Reply with comma-separated choices (`1,3`) or react with matching numbers'\n : 'Reply with a number or react with the matching number');\n } else {\n footerParts.push(`Question ${questionIndex + 1}/${prompt.questions.length} — reply with one line per question or use semicolons`);\n }\n footerParts.push(`Source: ${prompt.context.source}`);\n\n return {\n title: q.header,\n description: q.question,\n color: 0x7c3aed,\n fields: [{ name: 'Options', value: optionLines.join('\\n') }],\n footer: { text: footerParts.join(' · ') },\n };\n });\n\n return { embeds, reactionEmojis };\n}\n\nfunction formatForSlack(prompt: RemotePrompt): unknown[] {\n const blocks: unknown[] = [\n { type: 'header', text: { type: 'plain_text', text: 'GSD needs your input' } },\n ];\n\n if (prompt.questions.length > 1) {\n blocks.push({\n type: 'context',\n elements: [{ type: 'mrkdwn', text: 'Reply once in thread using one line per question or semicolons (`1; 2; custom note`).' }],\n });\n }\n\n for (const q of prompt.questions) {\n const supportsReactions = prompt.questions.length === 1;\n blocks.push({ type: 'section', text: { type: 'mrkdwn', text: `*${q.header}*\\n${q.question}` } });\n blocks.push({\n type: 'section',\n text: { type: 'mrkdwn', text: q.options.map((opt, i) => `${i + 1}. *${opt.label}* — ${opt.description}`).join('\\n') },\n });\n blocks.push({\n type: 'context',\n elements: [{\n type: 'mrkdwn',\n text: prompt.questions.length > 1\n ? (q.allowMultiple ? 'For this question, use comma-separated numbers (`1,3`) or free text.' : 'For this question, use one number (`1`) or free text.')\n : (q.allowMultiple\n ? (supportsReactions ? 'Reply in thread with comma-separated numbers (`1,3`) or react with matching number emoji.' : 'Reply in thread with comma-separated numbers (`1,3`) or free text.')\n : (supportsReactions ? 'Reply in thread with a number (`1`) or react with the matching number emoji.' : 'Reply in thread with a number (`1`) or free text.')),\n }],\n });\n blocks.push({ type: 'divider' });\n }\n\n return blocks;\n}\n\nfunction formatForTelegram(prompt: RemotePrompt): { text: string; parse_mode: 'HTML'; reply_markup?: unknown } {\n const escape = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n const lines: string[] = ['<b>GSD needs your input</b>', ''];\n\n for (let qi = 0; qi < prompt.questions.length; qi++) {\n const q = prompt.questions[qi];\n lines.push(`<b>${escape(q.header)}</b>`);\n lines.push(escape(q.question));\n lines.push('');\n for (let i = 0; i < q.options.length; i++) {\n lines.push(`${i + 1}. <b>${escape(q.options[i].label)}</b> — ${escape(q.options[i].description)}`);\n }\n lines.push('');\n if (prompt.questions.length === 1) {\n lines.push(q.allowMultiple ? 'Reply with comma-separated numbers (1,3) or free text.' : 'Reply with a number or tap a button below.');\n } else {\n lines.push(`Question ${qi + 1}/${prompt.questions.length} — reply with one line per question or use semicolons.`);\n }\n if (qi < prompt.questions.length - 1) lines.push('');\n }\n\n const result: { text: string; parse_mode: 'HTML'; reply_markup?: unknown } = {\n text: lines.join('\\n'),\n parse_mode: 'HTML',\n };\n\n if (prompt.questions.length === 1 && prompt.questions[0].options.length <= 5) {\n result.reply_markup = {\n inline_keyboard: prompt.questions[0].options.map((opt, i) => [{\n text: `${i + 1}. ${opt.label}`,\n callback_data: `${prompt.id}:${i}`,\n }]),\n };\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Response parsing\n// ---------------------------------------------------------------------------\n\nfunction parseAnswerForQuestion(text: string, q: RemoteQuestion): { answers: string[]; user_note?: string } {\n if (!text) return { answers: [], user_note: 'No response provided' };\n\n if (/^[\\d,\\s]+$/.test(text)) {\n const nums = text\n .split(',')\n .map((s) => parseInt(s.trim(), 10))\n .filter((n) => !Number.isNaN(n) && n >= 1 && n <= q.options.length);\n if (nums.length > 0) {\n const selected = nums.map((n) => q.options[n - 1].label);\n return { answers: q.allowMultiple ? selected : [selected[0]] };\n }\n }\n\n const single = parseInt(text, 10);\n if (!Number.isNaN(single) && single >= 1 && single <= q.options.length) {\n return { answers: [q.options[single - 1].label] };\n }\n\n const truncated = text.length > 500 ? text.slice(0, 500) + '\\u2026' : text;\n return { answers: [], user_note: truncated };\n}\n\nfunction parseTextReply(text: string, questions: RemoteQuestion[]): RemoteAnswer {\n const answers: RemoteAnswer['answers'] = {};\n const trimmed = text.trim();\n\n if (questions.length === 1) {\n answers[questions[0].id] = parseAnswerForQuestion(trimmed, questions[0]);\n return { answers };\n }\n\n const parts = trimmed.includes(';')\n ? trimmed.split(';').map((s) => s.trim()).filter(Boolean)\n : trimmed.split('\\n').map((s) => s.trim()).filter(Boolean);\n\n for (let i = 0; i < questions.length; i++) {\n answers[questions[i].id] = parseAnswerForQuestion(parts[i] ?? '', questions[i]);\n }\n\n return { answers };\n}\n\nfunction parseDiscordReactions(\n reactions: Array<{ emoji: string; count: number }>,\n questions: RemoteQuestion[],\n): RemoteAnswer {\n const answers: RemoteAnswer['answers'] = {};\n if (questions.length !== 1) {\n for (const q of questions) {\n answers[q.id] = { answers: [], user_note: 'Discord reactions are only supported for single-question prompts' };\n }\n return { answers };\n }\n\n const q = questions[0];\n const picked = reactions\n .filter((r) => DISCORD_NUMBER_EMOJIS.includes(r.emoji) && r.count > 0)\n .map((r) => q.options[DISCORD_NUMBER_EMOJIS.indexOf(r.emoji)]?.label)\n .filter((l): l is string => Boolean(l));\n\n answers[q.id] = picked.length > 0\n ? { answers: q.allowMultiple ? picked : [picked[0]] }\n : { answers: [], user_note: 'No clear response via reactions' };\n\n return { answers };\n}\n\nfunction parseSlackReactions(reactionNames: string[], questions: RemoteQuestion[]): RemoteAnswer {\n const answers: RemoteAnswer['answers'] = {};\n if (questions.length !== 1) {\n for (const q of questions) {\n answers[q.id] = { answers: [], user_note: 'Slack reactions are only supported for single-question prompts' };\n }\n return { answers };\n }\n\n const q = questions[0];\n const picked = reactionNames\n .filter((name) => SLACK_NUMBER_REACTION_NAMES.includes(name))\n .map((name) => q.options[SLACK_NUMBER_REACTION_NAMES.indexOf(name)]?.label)\n .filter((l): l is string => Boolean(l));\n\n answers[q.id] = picked.length > 0\n ? { answers: q.allowMultiple ? picked : [picked[0]] }\n : { answers: [], user_note: 'No clear response via reactions' };\n\n return { answers };\n}\n\nfunction parseTelegramCallbackData(callbackData: string, questions: RemoteQuestion[], promptId: string): RemoteAnswer | null {\n const pattern = new RegExp(`^${promptId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}:(\\\\d+)$`);\n const match = callbackData.match(pattern);\n if (match && questions.length === 1) {\n const idx = parseInt(match[1], 10);\n const q = questions[0];\n if (idx >= 0 && idx < q.options.length) {\n return { answers: { [q.id]: { answers: [q.options[idx].label] } } };\n }\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Channel adapters\n// ---------------------------------------------------------------------------\n\ninterface DispatchResult {\n ref: RemotePromptRef;\n}\n\n// --- Discord ---\n\nasync function discordValidate(token: string, channelId: string): Promise<{ botUserId: string; guildId: string | null }> {\n const meRes = await apiRequest(`${DISCORD_API}/users/@me`, 'GET', undefined, 'Bot', token, 'Discord API') as Record<string, unknown>;\n if (!meRes['id']) throw new Error('Discord auth failed: invalid token');\n const botUserId = String(meRes['id']);\n\n let guildId: string | null = null;\n try {\n const chanRes = await apiRequest(`${DISCORD_API}/channels/${channelId}`, 'GET', undefined, 'Bot', token, 'Discord API') as Record<string, unknown>;\n if (chanRes['guild_id']) guildId = String(chanRes['guild_id']);\n } catch { /* non-fatal */ }\n\n return { botUserId, guildId };\n}\n\nasync function discordSend(prompt: RemotePrompt, token: string, channelId: string, guildId: string | null): Promise<DispatchResult> {\n const { embeds, reactionEmojis } = formatForDiscord(prompt);\n const res = await apiRequest(\n `${DISCORD_API}/channels/${channelId}/messages`,\n 'POST',\n { content: '**GSD needs your input** — reply to this message with your answer', embeds },\n 'Bot', token, 'Discord API',\n ) as Record<string, unknown>;\n\n if (!res['id']) throw new Error(`Discord send failed: ${JSON.stringify(res)}`);\n const messageId = String(res['id']);\n\n if (prompt.questions.length === 1) {\n for (const emoji of reactionEmojis) {\n try {\n await apiRequest(`${DISCORD_API}/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/@me`, 'PUT', undefined, 'Bot', token, 'Discord API');\n } catch { /* best-effort */ }\n }\n }\n\n const threadUrl = guildId ? `https://discord.com/channels/${guildId}/${channelId}/${messageId}` : undefined;\n return { ref: { id: prompt.id, channel: 'discord', messageId, channelId, threadUrl } };\n}\n\nasync function discordPoll(prompt: RemotePrompt, ref: RemotePromptRef, token: string, botUserId: string): Promise<RemoteAnswer | null> {\n // Try reactions first for single-question prompts\n if (prompt.questions.length === 1) {\n const reactions: Array<{ emoji: string; count: number }> = [];\n for (const emoji of DISCORD_NUMBER_EMOJIS) {\n try {\n const users = await apiRequest(\n `${DISCORD_API}/channels/${ref.channelId}/messages/${ref.messageId}/reactions/${encodeURIComponent(emoji)}`,\n 'GET', undefined, 'Bot', token, 'Discord API',\n ) as unknown[];\n if (Array.isArray(users)) {\n const humanUsers = users.filter((u) => (u as Record<string, unknown>)['id'] !== botUserId);\n if (humanUsers.length > 0) reactions.push({ emoji, count: humanUsers.length });\n }\n } catch (err) {\n const msg = String((err as Error).message ?? '');\n if (msg.includes('HTTP 404')) continue;\n if (msg.includes('HTTP 401') || msg.includes('HTTP 403')) throw err;\n }\n }\n if (reactions.length > 0) return parseDiscordReactions(reactions, prompt.questions);\n }\n\n // Try text replies\n const messages = await apiRequest(\n `${DISCORD_API}/channels/${ref.channelId}/messages?after=${ref.messageId}&limit=10`,\n 'GET', undefined, 'Bot', token, 'Discord API',\n ) as unknown[];\n\n if (!Array.isArray(messages)) return null;\n\n const replies = messages.filter((m) => {\n const msg = m as Record<string, unknown>;\n const author = msg['author'] as Record<string, unknown> | undefined;\n const msgRef = msg['message_reference'] as Record<string, unknown> | undefined;\n return author?.['id'] && author['id'] !== botUserId && msgRef?.['message_id'] === ref.messageId && msg['content'];\n });\n\n if (replies.length === 0) return null;\n const first = replies[0] as Record<string, unknown>;\n return parseTextReply(String(first['content']), prompt.questions);\n}\n\nasync function discordAcknowledge(ref: RemotePromptRef, token: string): Promise<void> {\n try {\n await apiRequest(\n `${DISCORD_API}/channels/${ref.channelId}/messages/${ref.messageId}/reactions/${encodeURIComponent('✅')}/@me`,\n 'PUT', undefined, 'Bot', token, 'Discord API',\n );\n } catch { /* best-effort */ }\n}\n\n// --- Slack ---\n\nasync function slackValidate(token: string): Promise<string> {\n const res = await apiRequest(`${SLACK_API}/auth.test`, 'GET', undefined, 'Bearer', token, 'Slack API') as Record<string, unknown>;\n if (!res['ok']) throw new Error(`Slack auth failed: ${res['error'] ?? 'invalid token'}`);\n return String(res['user_id'] ?? '');\n}\n\nasync function slackSend(prompt: RemotePrompt, token: string, channelId: string): Promise<DispatchResult> {\n const res = await apiRequest(\n `${SLACK_API}/chat.postMessage`,\n 'POST',\n { channel: channelId, text: 'GSD needs your input', blocks: formatForSlack(prompt) },\n 'Bearer', token, 'Slack API',\n ) as Record<string, unknown>;\n\n if (!res['ok']) throw new Error(`Slack postMessage failed: ${res['error'] ?? 'unknown'}`);\n\n const ts = String(res['ts']);\n const channel = String(res['channel']);\n\n if (prompt.questions.length === 1) {\n const reactionNames = SLACK_NUMBER_REACTION_NAMES.slice(0, prompt.questions[0].options.length);\n for (const name of reactionNames) {\n try {\n await apiRequest(`${SLACK_API}/reactions.add`, 'POST', { channel, timestamp: ts, name }, 'Bearer', token, 'Slack API');\n } catch { /* best-effort */ }\n }\n }\n\n return {\n ref: {\n id: prompt.id,\n channel: 'slack',\n messageId: ts,\n threadTs: ts,\n channelId: channel,\n threadUrl: `https://slack.com/archives/${channel}/p${ts.replace('.', '')}`,\n },\n };\n}\n\nasync function slackPoll(prompt: RemotePrompt, ref: RemotePromptRef, token: string, botUserId: string): Promise<RemoteAnswer | null> {\n // Check reactions for single-question prompts\n if (prompt.questions.length === 1) {\n const qs = new URLSearchParams({ channel: ref.channelId, timestamp: ref.messageId, full: 'true' }).toString();\n const res = await apiRequest(`${SLACK_API}/reactions.get?${qs}`, 'GET', undefined, 'Bearer', token, 'Slack API') as Record<string, unknown>;\n\n if (res['ok']) {\n const message = (res['message'] ?? {}) as { reactions?: Array<{ name?: string; count?: number; users?: string[] }> };\n const reactions = Array.isArray(message.reactions) ? message.reactions : [];\n const picked = reactions\n .filter((r) => r.name && SLACK_NUMBER_REACTION_NAMES.includes(r.name))\n .filter((r) => {\n const count = Number(r.count ?? 0);\n const users = Array.isArray(r.users) ? r.users.map(String) : [];\n const botIncluded = botUserId ? users.includes(botUserId) : false;\n return count > (botIncluded ? 1 : 0);\n })\n .map((r) => String(r.name));\n\n if (picked.length > 0) return parseSlackReactions(picked, prompt.questions);\n }\n }\n\n // Check thread replies\n const qs = new URLSearchParams({ channel: ref.channelId, ts: ref.threadTs!, limit: '20' }).toString();\n const res = await apiRequest(`${SLACK_API}/conversations.replies?${qs}`, 'GET', undefined, 'Bearer', token, 'Slack API') as Record<string, unknown>;\n\n if (!res['ok']) return null;\n\n const messages = (res['messages'] ?? []) as Array<{ user?: string; text?: string; ts: string }>;\n const userReplies = messages.filter((m) => m.ts !== ref.threadTs && m.user && m.user !== botUserId && m.text);\n if (userReplies.length === 0) return null;\n\n return parseTextReply(String(userReplies[0].text), prompt.questions);\n}\n\nasync function slackAcknowledge(ref: RemotePromptRef, token: string): Promise<void> {\n try {\n await apiRequest(\n `${SLACK_API}/reactions.add`,\n 'POST',\n { channel: ref.channelId, timestamp: ref.messageId, name: 'white_check_mark' },\n 'Bearer', token, 'Slack API',\n );\n } catch { /* best-effort */ }\n}\n\n// --- Telegram ---\n\nasync function telegramValidate(token: string): Promise<number> {\n const res = await apiRequest(`${TELEGRAM_API}/bot${token}/getMe`, 'GET', undefined, 'Bearer', token, 'Telegram API') as Record<string, unknown>;\n const result = res['result'] as Record<string, unknown> | undefined;\n if (!res['ok'] || !result?.['id']) throw new Error('Telegram auth failed: invalid bot token');\n return result['id'] as number;\n}\n\nasync function telegramSend(prompt: RemotePrompt, token: string, chatId: string): Promise<DispatchResult> {\n const payload = formatForTelegram(prompt);\n const params: Record<string, unknown> = { chat_id: chatId, text: payload.text, parse_mode: payload.parse_mode };\n if (payload.reply_markup) params['reply_markup'] = payload.reply_markup;\n\n const res = await apiRequest(`${TELEGRAM_API}/bot${token}/sendMessage`, 'POST', params, 'Bearer', token, 'Telegram API') as Record<string, unknown>;\n const result = res['result'] as Record<string, unknown> | undefined;\n if (!res['ok'] || !result?.['message_id']) throw new Error(`Telegram sendMessage failed: ${JSON.stringify(res)}`);\n\n const messageId = String(result['message_id']);\n // Build public URL only for public channels (negative IDs are private groups)\n const isPublic = !chatId.startsWith('-');\n const messageUrl = isPublic ? `https://t.me/${chatId.replace('@', '')}/${messageId}` : undefined;\n\n return { ref: { id: prompt.id, channel: 'telegram', messageId, channelId: chatId, threadUrl: messageUrl } };\n}\n\nasync function telegramPoll(\n prompt: RemotePrompt,\n ref: RemotePromptRef,\n token: string,\n botUserId: number,\n lastUpdateId: { value: number },\n): Promise<RemoteAnswer | null> {\n const params: Record<string, unknown> = {\n offset: lastUpdateId.value + 1,\n timeout: 0,\n allowed_updates: ['message', 'callback_query'],\n };\n\n const res = await apiRequest(`${TELEGRAM_API}/bot${token}/getUpdates`, 'POST', params, 'Bearer', token, 'Telegram API') as Record<string, unknown>;\n if (!res['ok'] || !Array.isArray(res['result'])) return null;\n\n for (const update of res['result'] as Record<string, unknown>[]) {\n if ((update['update_id'] as number) > lastUpdateId.value) {\n lastUpdateId.value = update['update_id'] as number;\n }\n\n // Callback query (inline keyboard button press)\n if (update['callback_query']) {\n const cq = update['callback_query'] as Record<string, unknown>;\n const msg = cq['message'] as Record<string, unknown> | undefined;\n const from = cq['from'] as Record<string, unknown> | undefined;\n if (msg && String((msg['chat'] as Record<string, unknown>)?.['id']) === ref.channelId &&\n String(msg['message_id']) === ref.messageId && from?.['id'] !== botUserId) {\n // Dismiss loading spinner\n try {\n await apiRequest(`${TELEGRAM_API}/bot${token}/answerCallbackQuery`, 'POST', { callback_query_id: cq['id'] }, 'Bearer', token, 'Telegram API');\n } catch { /* best-effort */ }\n const callbackData = cq['data'] ? String(cq['data']) : null;\n if (callbackData) {\n const parsed = parseTelegramCallbackData(callbackData, prompt.questions, prompt.id);\n if (parsed) return parsed;\n }\n }\n }\n\n // Text message reply\n if (update['message']) {\n const msg = update['message'] as Record<string, unknown>;\n const from = msg['from'] as Record<string, unknown> | undefined;\n if (String((msg['chat'] as Record<string, unknown>)?.['id']) === ref.channelId &&\n from?.['id'] !== botUserId && msg['text']) {\n return parseTextReply(String(msg['text']), prompt.questions);\n }\n }\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Polling loop\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal?.aborted) return resolve();\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => { clearTimeout(timer); resolve(); };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\ninterface ChannelState {\n botUserId: string | number;\n guildId?: string | null; // Discord only\n lastUpdateId?: { value: number }; // Telegram only\n}\n\nasync function pollUntilDone(\n config: ResolvedConfig,\n prompt: RemotePrompt,\n ref: RemotePromptRef,\n state: ChannelState,\n signal?: AbortSignal,\n): Promise<RemoteAnswer | null> {\n while (Date.now() < prompt.timeoutAt && !signal?.aborted) {\n try {\n let answer: RemoteAnswer | null = null;\n\n if (config.channel === 'discord') {\n answer = await discordPoll(prompt, ref, config.token, String(state.botUserId));\n } else if (config.channel === 'slack') {\n answer = await slackPoll(prompt, ref, config.token, String(state.botUserId));\n } else {\n answer = await telegramPoll(prompt, ref, config.token, state.botUserId as number, state.lastUpdateId!);\n }\n\n if (answer) return answer;\n } catch (err) {\n // Auth errors (401/403) mean the configured token is invalid or\n // revoked — re-throw so the caller can surface a useful error\n // immediately instead of silently spinning until the timeout.\n // Network/transient errors keep the retry behaviour.\n const msg = String((err as Error)?.message ?? err);\n if (msg.includes('HTTP 401') || msg.includes('HTTP 403')) {\n throw err;\n }\n // Non-fatal poll error — wait and retry\n }\n\n await sleep(prompt.pollIntervalMs, signal);\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Public entry point\n// ---------------------------------------------------------------------------\n\nfunction buildPrompt(questions: RemoteQuestion[], config: ResolvedConfig): RemotePrompt {\n const createdAt = Date.now();\n return {\n id: randomUUID(),\n channel: config.channel,\n createdAt,\n timeoutAt: createdAt + config.timeoutMs,\n pollIntervalMs: config.pollIntervalMs,\n context: { source: 'ask_user_questions' },\n questions: questions.map((q) => ({\n id: q.id,\n header: q.header,\n question: q.question,\n options: q.options,\n allowMultiple: q.allowMultiple ?? false,\n })),\n };\n}\n\nfunction formatForTool(answer: RemoteAnswer): Record<string, { answers: string[] }> {\n const out: Record<string, { answers: string[] }> = {};\n for (const [id, data] of Object.entries(answer.answers)) {\n const list = [...data.answers];\n if (data.user_note) list.push(`user_note: ${data.user_note}`);\n out[id] = { answers: list };\n }\n return out;\n}\n\n/**\n * Normalize a `RemoteAnswer` into the `RoundResult` shape the GSD\n * discussion-gate hook reads from `tool_result` `details.response`. Mirrors\n * `src/resources/extensions/remote-questions/manager.ts:toRoundResultResponse`\n * and the local-path helper `buildAskUserQuestionsRoundResult` in server.ts.\n * Without this, the remote channel (Discord / Slack / Telegram) would have\n * the same gate-stuck problem as the local elicitation path. See #5267.\n *\n * `questions` is required so the multi-select contract is preserved: a\n * `allowMultiple` question with a single selection must still surface\n * `selected: [label]` so consumers reading `selected.includes(...)` keep\n * working. Falling back to length-based inference (the previous behavior)\n * silently demoted single-pick multi-select answers to strings.\n */\nexport function toRoundResultResponse(\n answer: RemoteAnswer,\n questions: RemoteQuestion[],\n): {\n endInterview: false;\n answers: Record<string, { selected: string | string[]; notes: string }>;\n} {\n const allowMultipleById = new Map<string, boolean>();\n for (const q of questions) allowMultipleById.set(q.id, q.allowMultiple ?? false);\n\n const normalized: Record<string, { selected: string | string[]; notes: string }> = {};\n for (const [id, data] of Object.entries(answer.answers)) {\n const list = data.answers ?? [];\n const allowMultiple = allowMultipleById.get(id) ?? false;\n const selected: string | string[] = allowMultiple ? list : (list[0] ?? '');\n normalized[id] = { selected, notes: data.user_note ?? '' };\n }\n return { endInterview: false, answers: normalized };\n}\n\n/**\n * Dispatch questions to the configured remote channel and wait for a response.\n *\n * Returns null when no remote channel is configured.\n * Returns a tool result shaped like { content, details } on success or\n * timeout — callers should check details.timed_out before trusting the result.\n */\nexport async function tryRemoteQuestions(\n questions: RemoteQuestion[],\n signal?: AbortSignal,\n): Promise<RemoteToolResult | null> {\n const config = resolveRemoteConfig();\n if (!config) return null;\n\n const prompt = buildPrompt(questions, config);\n\n // Validate auth and send the prompt\n let ref: RemotePromptRef;\n let state: ChannelState;\n\n try {\n if (config.channel === 'discord') {\n const { botUserId, guildId } = await discordValidate(config.token, config.channelId);\n state = { botUserId, guildId };\n const dispatch = await discordSend(prompt, config.token, config.channelId, guildId);\n ref = dispatch.ref;\n } else if (config.channel === 'slack') {\n const botUserId = await slackValidate(config.token);\n state = { botUserId };\n const dispatch = await slackSend(prompt, config.token, config.channelId);\n ref = dispatch.ref;\n } else {\n const botUserId = await telegramValidate(config.token);\n state = { botUserId, lastUpdateId: { value: 0 } };\n const dispatch = await telegramSend(prompt, config.token, config.channelId);\n ref = dispatch.ref;\n }\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Remote questions failed (${config.channel}): ${(err as Error).message}` }],\n details: { remote: true, channel: config.channel, error: true, status: 'failed' },\n };\n }\n\n let answer: RemoteAnswer | null;\n try {\n answer = await pollUntilDone(config, prompt, ref, state, signal);\n } catch (err) {\n return {\n content: [{ type: 'text', text: `Remote questions failed (${config.channel}): ${(err as Error).message}` }],\n details: { remote: true, channel: config.channel, error: true, status: 'failed' },\n };\n }\n\n if (!answer) {\n const timedOut = !signal?.aborted;\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n timed_out: timedOut,\n channel: config.channel,\n prompt_id: prompt.id,\n timeout_minutes: config.timeoutMs / 60000,\n thread_url: ref.threadUrl ?? null,\n message: `User did not respond within ${config.timeoutMs / 60000} minutes.`,\n }),\n }],\n details: {\n remote: true,\n channel: config.channel,\n timed_out: timedOut,\n promptId: prompt.id,\n threadUrl: ref.threadUrl ?? null,\n status: signal?.aborted ? 'cancelled' : 'timed_out',\n },\n };\n }\n\n // Best-effort acknowledgement\n try {\n if (config.channel === 'discord') await discordAcknowledge(ref, config.token);\n else if (config.channel === 'slack') await slackAcknowledge(ref, config.token);\n } catch { /* best-effort */ }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ answers: formatForTool(answer) }) }],\n details: {\n remote: true,\n channel: config.channel,\n timed_out: false,\n promptId: prompt.id,\n threadUrl: ref.threadUrl ?? null,\n questions,\n response: toRoundResultResponse(answer, questions),\n status: 'answered',\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../src/workflow-tools.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgUxB,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CA+BnG;AA8FD,wBAAgB,yBAAyB,CAAC,CAAC,SAAS;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACzE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,CAAC,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAE5B;AA4JD,4CAA4C;AAC5C,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrE;AAED,4CAA4C;AAC5C,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AA2GD,UAAU,aAAa;IACrB,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC3D,OAAO,CAAC;CACZ;AAED,eAAO,MAAM,mBAAmB,mBAA+B,CAAC;AAChE,eAAO,MAAM,6BAA6B,mBAAyC,CAAC;AACpF,eAAO,MAAM,yBAAyB,mBAAqC,CAAC;AA69B5E,MAAM,WAAW,4BAA4B;IAC3C;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,aAAa,EACzB,OAAO,GAAE,4BAAiC,GACzC,IAAI,CAowBN"}
1
+ {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../src/workflow-tools.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8UxB,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CA+BnG;AA8FD,wBAAgB,yBAAyB,CAAC,CAAC,SAAS;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACzE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,CAAC,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAE5B;AA6JD,4CAA4C;AAC5C,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAKrE;AAED,4CAA4C;AAC5C,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AA2GD,UAAU,aAAa;IACrB,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC3D,OAAO,CAAC;CACZ;AAED,eAAO,MAAM,mBAAmB,mBAA+B,CAAC;AAChE,eAAO,MAAM,6BAA6B,mBAAyC,CAAC;AACpF,eAAO,MAAM,yBAAyB,mBAAqC,CAAC;AAgiC5E,MAAM,WAAW,4BAA4B;IAC3C;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,aAAa,EACzB,OAAO,GAAE,4BAAiC,GACzC,IAAI,CAwyBN"}