@astralyn/pi 0.82.7 → 0.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (781) hide show
  1. package/CHANGELOG.md +78 -5099
  2. package/README.md +12 -111
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/register-bedrock.d.ts.map +1 -1
  6. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  7. package/dist/bun/restore-sandbox-env.js.map +1 -1
  8. package/dist/cli/args.d.ts +2 -0
  9. package/dist/cli/args.d.ts.map +1 -1
  10. package/dist/cli/args.js +28 -2
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/config-selector.d.ts.map +1 -1
  13. package/dist/cli/config-selector.js +2 -2
  14. package/dist/cli/config-selector.js.map +1 -1
  15. package/dist/cli/credential-print.d.ts +23 -0
  16. package/dist/cli/credential-print.d.ts.map +1 -0
  17. package/dist/cli/credential-print.js +117 -0
  18. package/dist/cli/credential-print.js.map +1 -0
  19. package/dist/cli/experimental/auth.d.ts +16 -0
  20. package/dist/cli/experimental/auth.d.ts.map +1 -0
  21. package/dist/cli/experimental/auth.js +13 -0
  22. package/dist/cli/experimental/auth.js.map +1 -0
  23. package/dist/cli/experimental/cli.d.ts +6 -0
  24. package/dist/cli/experimental/cli.d.ts.map +1 -0
  25. package/dist/cli/experimental/cli.js +5 -0
  26. package/dist/cli/experimental/cli.js.map +1 -0
  27. package/dist/cli/experimental/command-options.d.ts +17 -0
  28. package/dist/cli/experimental/command-options.d.ts.map +1 -0
  29. package/dist/cli/experimental/command-options.js +35 -0
  30. package/dist/cli/experimental/command-options.js.map +1 -0
  31. package/dist/cli/experimental/command.d.ts +63 -0
  32. package/dist/cli/experimental/command.d.ts.map +1 -0
  33. package/dist/cli/experimental/command.js +127 -0
  34. package/dist/cli/experimental/command.js.map +1 -0
  35. package/dist/cli/experimental/commands/client.d.ts +13 -0
  36. package/dist/cli/experimental/commands/client.d.ts.map +1 -0
  37. package/dist/cli/experimental/commands/client.js +25 -0
  38. package/dist/cli/experimental/commands/client.js.map +1 -0
  39. package/dist/cli/experimental/commands/pi.d.ts +15 -0
  40. package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
  41. package/dist/cli/experimental/commands/pi.js +28 -0
  42. package/dist/cli/experimental/commands/pi.js.map +1 -0
  43. package/dist/cli/experimental/commands/server.d.ts +13 -0
  44. package/dist/cli/experimental/commands/server.d.ts.map +1 -0
  45. package/dist/cli/experimental/commands/server.js +25 -0
  46. package/dist/cli/experimental/commands/server.js.map +1 -0
  47. package/dist/cli/experimental/transport-address.d.ts +10 -0
  48. package/dist/cli/experimental/transport-address.d.ts.map +1 -0
  49. package/dist/cli/experimental/transport-address.js +38 -0
  50. package/dist/cli/experimental/transport-address.js.map +1 -0
  51. package/dist/cli/file-processor.d.ts.map +1 -1
  52. package/dist/cli/file-processor.js.map +1 -1
  53. package/dist/cli/initial-message.d.ts +1 -1
  54. package/dist/cli/initial-message.d.ts.map +1 -1
  55. package/dist/cli/initial-message.js.map +1 -1
  56. package/dist/cli/list-models.d.ts +1 -1
  57. package/dist/cli/list-models.d.ts.map +1 -1
  58. package/dist/cli/list-models.js +2 -2
  59. package/dist/cli/list-models.js.map +1 -1
  60. package/dist/cli/project-trust.d.ts.map +1 -1
  61. package/dist/cli/project-trust.js.map +1 -1
  62. package/dist/cli/session-picker.d.ts.map +1 -1
  63. package/dist/cli/session-picker.js.map +1 -1
  64. package/dist/cli/startup-ui.d.ts +1 -1
  65. package/dist/cli/startup-ui.d.ts.map +1 -1
  66. package/dist/cli/startup-ui.js +2 -2
  67. package/dist/cli/startup-ui.js.map +1 -1
  68. package/dist/cli.d.ts.map +1 -1
  69. package/dist/cli.js +1 -0
  70. package/dist/cli.js.map +1 -1
  71. package/dist/client/index.d.ts +3 -0
  72. package/dist/client/index.d.ts.map +1 -0
  73. package/dist/client/index.js +3 -0
  74. package/dist/client/index.js.map +1 -0
  75. package/dist/client/remote-session.d.ts +53 -0
  76. package/dist/client/remote-session.d.ts.map +1 -0
  77. package/dist/client/remote-session.js +340 -0
  78. package/dist/client/remote-session.js.map +1 -0
  79. package/dist/client/transcript.d.ts +12 -0
  80. package/dist/client/transcript.d.ts.map +1 -0
  81. package/dist/client/transcript.js +98 -0
  82. package/dist/client/transcript.js.map +1 -0
  83. package/dist/config.d.ts.map +1 -1
  84. package/dist/config.js.map +1 -1
  85. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  86. package/dist/core/agent-session-runtime.js +3 -8
  87. package/dist/core/agent-session-runtime.js.map +1 -1
  88. package/dist/core/agent-session-services.d.ts +1 -0
  89. package/dist/core/agent-session-services.d.ts.map +1 -1
  90. package/dist/core/agent-session-services.js +1 -0
  91. package/dist/core/agent-session-services.js.map +1 -1
  92. package/dist/core/agent-session.d.ts +31 -11
  93. package/dist/core/agent-session.d.ts.map +1 -1
  94. package/dist/core/agent-session.js +189 -192
  95. package/dist/core/agent-session.js.map +1 -1
  96. package/dist/core/auth-guidance.d.ts.map +1 -1
  97. package/dist/core/auth-guidance.js.map +1 -1
  98. package/dist/core/auth-storage.d.ts +15 -9
  99. package/dist/core/auth-storage.d.ts.map +1 -1
  100. package/dist/core/auth-storage.js +159 -41
  101. package/dist/core/auth-storage.js.map +1 -1
  102. package/dist/core/bash-executor.d.ts.map +1 -1
  103. package/dist/core/bash-executor.js.map +1 -1
  104. package/dist/core/cache-stats.d.ts.map +1 -1
  105. package/dist/core/cache-stats.js.map +1 -1
  106. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  107. package/dist/core/compaction/branch-summarization.js.map +1 -1
  108. package/dist/core/compaction/compaction.d.ts.map +1 -1
  109. package/dist/core/compaction/compaction.js.map +1 -1
  110. package/dist/core/compaction/index.d.ts.map +1 -1
  111. package/dist/core/compaction/utils.d.ts.map +1 -1
  112. package/dist/core/compaction/utils.js.map +1 -1
  113. package/dist/core/defaults.d.ts.map +1 -1
  114. package/dist/core/diagnostics.d.ts.map +1 -1
  115. package/dist/core/event-bus.d.ts.map +1 -1
  116. package/dist/core/event-bus.js.map +1 -1
  117. package/dist/core/exec.d.ts.map +1 -1
  118. package/dist/core/exec.js.map +1 -1
  119. package/dist/core/experimental.d.ts.map +1 -1
  120. package/dist/core/experimental.js.map +1 -1
  121. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  122. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  123. package/dist/core/export-html/index.d.ts.map +1 -1
  124. package/dist/core/export-html/index.js.map +1 -1
  125. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  126. package/dist/core/export-html/tool-renderer.js.map +1 -1
  127. package/dist/core/extensions/index.d.ts +1 -1
  128. package/dist/core/extensions/index.d.ts.map +1 -1
  129. package/dist/core/extensions/index.js.map +1 -1
  130. package/dist/core/extensions/loader.d.ts.map +1 -1
  131. package/dist/core/extensions/loader.js +43 -20
  132. package/dist/core/extensions/loader.js.map +1 -1
  133. package/dist/core/extensions/runner.d.ts +3 -1
  134. package/dist/core/extensions/runner.d.ts.map +1 -1
  135. package/dist/core/extensions/runner.js +31 -28
  136. package/dist/core/extensions/runner.js.map +1 -1
  137. package/dist/core/extensions/types.d.ts +28 -3
  138. package/dist/core/extensions/types.d.ts.map +1 -1
  139. package/dist/core/extensions/types.js.map +1 -1
  140. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  141. package/dist/core/extensions/wrapper.js.map +1 -1
  142. package/dist/core/footer-data-provider.d.ts +10 -0
  143. package/dist/core/footer-data-provider.d.ts.map +1 -1
  144. package/dist/core/footer-data-provider.js +18 -19
  145. package/dist/core/footer-data-provider.js.map +1 -1
  146. package/dist/core/http-dispatcher.d.ts.map +1 -1
  147. package/dist/core/http-dispatcher.js +5 -0
  148. package/dist/core/http-dispatcher.js.map +1 -1
  149. package/dist/core/index.d.ts.map +1 -1
  150. package/dist/core/keybindings.d.ts +157 -125
  151. package/dist/core/keybindings.d.ts.map +1 -1
  152. package/dist/core/keybindings.js +0 -1
  153. package/dist/core/keybindings.js.map +1 -1
  154. package/dist/core/messages.d.ts.map +1 -1
  155. package/dist/core/messages.js.map +1 -1
  156. package/dist/core/model-config.d.ts +37 -13
  157. package/dist/core/model-config.d.ts.map +1 -1
  158. package/dist/core/model-config.js +4 -2
  159. package/dist/core/model-config.js.map +1 -1
  160. package/dist/core/model-registry.d.ts +5 -3
  161. package/dist/core/model-registry.d.ts.map +1 -1
  162. package/dist/core/model-registry.js +13 -11
  163. package/dist/core/model-registry.js.map +1 -1
  164. package/dist/core/model-resolver.d.ts +4 -3
  165. package/dist/core/model-resolver.d.ts.map +1 -1
  166. package/dist/core/model-resolver.js +41 -10
  167. package/dist/core/model-resolver.js.map +1 -1
  168. package/dist/core/model-runtime.d.ts +30 -13
  169. package/dist/core/model-runtime.d.ts.map +1 -1
  170. package/dist/core/model-runtime.js +239 -91
  171. package/dist/core/model-runtime.js.map +1 -1
  172. package/dist/core/models-store.d.ts +12 -7
  173. package/dist/core/models-store.d.ts.map +1 -1
  174. package/dist/core/models-store.js +84 -16
  175. package/dist/core/models-store.js.map +1 -1
  176. package/dist/core/output-guard.d.ts.map +1 -1
  177. package/dist/core/output-guard.js.map +1 -1
  178. package/dist/core/package-manager.d.ts +4 -1
  179. package/dist/core/package-manager.d.ts.map +1 -1
  180. package/dist/core/package-manager.js +76 -48
  181. package/dist/core/package-manager.js.map +1 -1
  182. package/dist/core/pi-manifest.d.ts +8 -0
  183. package/dist/core/pi-manifest.d.ts.map +1 -0
  184. package/dist/core/pi-manifest.js +25 -0
  185. package/dist/core/pi-manifest.js.map +1 -0
  186. package/dist/core/project-trust.d.ts.map +1 -1
  187. package/dist/core/project-trust.js.map +1 -1
  188. package/dist/core/prompt-templates.d.ts.map +1 -1
  189. package/dist/core/prompt-templates.js.map +1 -1
  190. package/dist/core/provider-attribution.d.ts.map +1 -1
  191. package/dist/core/provider-attribution.js.map +1 -1
  192. package/dist/core/provider-composer.d.ts +4 -1
  193. package/dist/core/provider-composer.d.ts.map +1 -1
  194. package/dist/core/provider-composer.js +36 -15
  195. package/dist/core/provider-composer.js.map +1 -1
  196. package/dist/core/radius.d.ts.map +1 -1
  197. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  198. package/dist/core/remote-catalog-provider.js +73 -67
  199. package/dist/core/remote-catalog-provider.js.map +1 -1
  200. package/dist/core/resolve-config-value.d.ts.map +1 -1
  201. package/dist/core/resolve-config-value.js.map +1 -1
  202. package/dist/core/resource-loader.d.ts +15 -0
  203. package/dist/core/resource-loader.d.ts.map +1 -1
  204. package/dist/core/resource-loader.js +68 -51
  205. package/dist/core/resource-loader.js.map +1 -1
  206. package/dist/core/runtime-credentials.d.ts +5 -5
  207. package/dist/core/runtime-credentials.d.ts.map +1 -1
  208. package/dist/core/runtime-credentials.js +12 -10
  209. package/dist/core/runtime-credentials.js.map +1 -1
  210. package/dist/core/sdk.d.ts.map +1 -1
  211. package/dist/core/sdk.js.map +1 -1
  212. package/dist/core/session-cwd.d.ts.map +1 -1
  213. package/dist/core/session-cwd.js +0 -1
  214. package/dist/core/session-cwd.js.map +1 -1
  215. package/dist/core/session-manager.d.ts.map +1 -1
  216. package/dist/core/session-manager.js +10 -12
  217. package/dist/core/session-manager.js.map +1 -1
  218. package/dist/core/settings-manager.d.ts +12 -0
  219. package/dist/core/settings-manager.d.ts.map +1 -1
  220. package/dist/core/settings-manager.js +47 -33
  221. package/dist/core/settings-manager.js.map +1 -1
  222. package/dist/core/skills.d.ts.map +1 -1
  223. package/dist/core/skills.js.map +1 -1
  224. package/dist/core/slash-commands.d.ts.map +1 -1
  225. package/dist/core/source-info.d.ts.map +1 -1
  226. package/dist/core/source-info.js.map +1 -1
  227. package/dist/core/system-prompt.d.ts.map +1 -1
  228. package/dist/core/system-prompt.js.map +1 -1
  229. package/dist/core/telemetry.d.ts.map +1 -1
  230. package/dist/core/telemetry.js.map +1 -1
  231. package/dist/core/timings.d.ts.map +1 -1
  232. package/dist/core/timings.js.map +1 -1
  233. package/dist/core/tools/bash.d.ts.map +1 -1
  234. package/dist/core/tools/bash.js +12 -10
  235. package/dist/core/tools/bash.js.map +1 -1
  236. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  237. package/dist/core/tools/edit-diff.js.map +1 -1
  238. package/dist/core/tools/edit.d.ts.map +1 -1
  239. package/dist/core/tools/edit.js +4 -3
  240. package/dist/core/tools/edit.js.map +1 -1
  241. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  242. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  243. package/dist/core/tools/find.d.ts +3 -0
  244. package/dist/core/tools/find.d.ts.map +1 -1
  245. package/dist/core/tools/find.js +47 -20
  246. package/dist/core/tools/find.js.map +1 -1
  247. package/dist/core/tools/grep.d.ts.map +1 -1
  248. package/dist/core/tools/grep.js.map +1 -1
  249. package/dist/core/tools/index.d.ts.map +1 -1
  250. package/dist/core/tools/index.js.map +1 -1
  251. package/dist/core/tools/ls.d.ts.map +1 -1
  252. package/dist/core/tools/ls.js.map +1 -1
  253. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  254. package/dist/core/tools/output-accumulator.js +12 -18
  255. package/dist/core/tools/output-accumulator.js.map +1 -1
  256. package/dist/core/tools/path-utils.d.ts.map +1 -1
  257. package/dist/core/tools/path-utils.js.map +1 -1
  258. package/dist/core/tools/read.d.ts.map +1 -1
  259. package/dist/core/tools/read.js +1 -1
  260. package/dist/core/tools/read.js.map +1 -1
  261. package/dist/core/tools/render-utils.d.ts.map +1 -1
  262. package/dist/core/tools/render-utils.js.map +1 -1
  263. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  264. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  265. package/dist/core/tools/truncate.d.ts.map +1 -1
  266. package/dist/core/tools/truncate.js.map +1 -1
  267. package/dist/core/tools/write.d.ts.map +1 -1
  268. package/dist/core/tools/write.js +0 -1
  269. package/dist/core/tools/write.js.map +1 -1
  270. package/dist/core/trust-manager.d.ts.map +1 -1
  271. package/dist/core/trust-manager.js +48 -10
  272. package/dist/core/trust-manager.js.map +1 -1
  273. package/dist/core/usage-totals.d.ts.map +1 -1
  274. package/dist/core/usage-totals.js.map +1 -1
  275. package/dist/extensions/biu/index.d.ts +19 -0
  276. package/dist/extensions/biu/index.d.ts.map +1 -0
  277. package/dist/extensions/biu/index.js +350 -0
  278. package/dist/extensions/biu/index.js.map +1 -0
  279. package/dist/extensions/biu/prompts.d.ts +26 -0
  280. package/dist/extensions/biu/prompts.d.ts.map +1 -0
  281. package/dist/extensions/biu/prompts.js +260 -0
  282. package/dist/extensions/biu/prompts.js.map +1 -0
  283. package/dist/extensions/biu/workspace.d.ts +122 -0
  284. package/dist/extensions/biu/workspace.d.ts.map +1 -0
  285. package/dist/extensions/biu/workspace.js +404 -0
  286. package/dist/extensions/biu/workspace.js.map +1 -0
  287. package/dist/extensions/deepwiki/client.d.ts.map +1 -1
  288. package/dist/extensions/deepwiki/client.js.map +1 -1
  289. package/dist/extensions/deepwiki/constants.d.ts.map +1 -1
  290. package/dist/extensions/deepwiki/constants.js.map +1 -1
  291. package/dist/extensions/deepwiki/contents.d.ts.map +1 -1
  292. package/dist/extensions/deepwiki/contents.js.map +1 -1
  293. package/dist/extensions/deepwiki/execute.d.ts.map +1 -1
  294. package/dist/extensions/deepwiki/execute.js.map +1 -1
  295. package/dist/extensions/deepwiki/http.d.ts.map +1 -1
  296. package/dist/extensions/deepwiki/http.js.map +1 -1
  297. package/dist/extensions/deepwiki/index.d.ts.map +1 -1
  298. package/dist/extensions/deepwiki/index.js.map +1 -1
  299. package/dist/extensions/deepwiki/render.d.ts.map +1 -1
  300. package/dist/extensions/deepwiki/render.js.map +1 -1
  301. package/dist/extensions/deepwiki/schema.d.ts +1 -1
  302. package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
  303. package/dist/extensions/deepwiki/schema.js.map +1 -1
  304. package/dist/extensions/index.d.ts.map +1 -1
  305. package/dist/extensions/index.js +2 -2
  306. package/dist/extensions/index.js.map +1 -1
  307. package/dist/extensions/llama/client.d.ts.map +1 -1
  308. package/dist/extensions/llama/client.js +0 -2
  309. package/dist/extensions/llama/client.js.map +1 -1
  310. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  311. package/dist/extensions/llama/huggingface.js +0 -2
  312. package/dist/extensions/llama/huggingface.js.map +1 -1
  313. package/dist/extensions/llama/index.d.ts.map +1 -1
  314. package/dist/extensions/llama/index.js +11 -2
  315. package/dist/extensions/llama/index.js.map +1 -1
  316. package/dist/extensions/llama/provider.d.ts.map +1 -1
  317. package/dist/extensions/llama/provider.js +22 -8
  318. package/dist/extensions/llama/provider.js.map +1 -1
  319. package/dist/extensions/llama/ui.d.ts.map +1 -1
  320. package/dist/extensions/llama/ui.js +12 -28
  321. package/dist/extensions/llama/ui.js.map +1 -1
  322. package/dist/extensions/question/constants.d.ts.map +1 -1
  323. package/dist/extensions/question/constants.js.map +1 -1
  324. package/dist/extensions/question/dialog-primitives.d.ts.map +1 -1
  325. package/dist/extensions/question/dialog-primitives.js.map +1 -1
  326. package/dist/extensions/question/dialog.d.ts.map +1 -1
  327. package/dist/extensions/question/dialog.js.map +1 -1
  328. package/dist/extensions/question/index.d.ts.map +1 -1
  329. package/dist/extensions/question/index.js.map +1 -1
  330. package/dist/extensions/question/limits.d.ts.map +1 -1
  331. package/dist/extensions/question/render-cache.d.ts.map +1 -1
  332. package/dist/extensions/question/render-cache.js +3 -4
  333. package/dist/extensions/question/render-cache.js.map +1 -1
  334. package/dist/extensions/question/render.d.ts.map +1 -1
  335. package/dist/extensions/question/render.js.map +1 -1
  336. package/dist/extensions/question/results.d.ts.map +1 -1
  337. package/dist/extensions/question/results.js.map +1 -1
  338. package/dist/extensions/question/schema.d.ts.map +1 -1
  339. package/dist/extensions/question/schema.js.map +1 -1
  340. package/dist/extensions/question/state.d.ts.map +1 -1
  341. package/dist/extensions/question/state.js.map +1 -1
  342. package/dist/extensions/question/types.d.ts.map +1 -1
  343. package/dist/extensions/rewind/anchor.d.ts.map +1 -1
  344. package/dist/extensions/rewind/anchor.js.map +1 -1
  345. package/dist/extensions/rewind/config.d.ts.map +1 -1
  346. package/dist/extensions/rewind/config.js.map +1 -1
  347. package/dist/extensions/rewind/engine.d.ts.map +1 -1
  348. package/dist/extensions/rewind/engine.js.map +1 -1
  349. package/dist/extensions/rewind/gc.d.ts.map +1 -1
  350. package/dist/extensions/rewind/gc.js.map +1 -1
  351. package/dist/extensions/rewind/index.d.ts.map +1 -1
  352. package/dist/extensions/rewind/index.js.map +1 -1
  353. package/dist/extensions/rewind/menu.d.ts.map +1 -1
  354. package/dist/extensions/rewind/menu.js.map +1 -1
  355. package/dist/extensions/rewind/paths.d.ts.map +1 -1
  356. package/dist/extensions/rewind/paths.js.map +1 -1
  357. package/dist/extensions/rewind/restore.d.ts.map +1 -1
  358. package/dist/extensions/rewind/restore.js.map +1 -1
  359. package/dist/extensions/rewind/snapshot.d.ts.map +1 -1
  360. package/dist/extensions/rewind/snapshot.js.map +1 -1
  361. package/dist/extensions/rewind/storage.d.ts.map +1 -1
  362. package/dist/extensions/rewind/storage.js.map +1 -1
  363. package/dist/extensions/rewind/text.d.ts.map +1 -1
  364. package/dist/extensions/rewind/text.js.map +1 -1
  365. package/dist/extensions/rewind/tool-path.d.ts.map +1 -1
  366. package/dist/extensions/rewind/tool-path.js.map +1 -1
  367. package/dist/extensions/router/constants.d.ts +3 -0
  368. package/dist/extensions/router/constants.d.ts.map +1 -1
  369. package/dist/extensions/router/constants.js +3 -0
  370. package/dist/extensions/router/constants.js.map +1 -1
  371. package/dist/extensions/router/dialog.d.ts +14 -7
  372. package/dist/extensions/router/dialog.d.ts.map +1 -1
  373. package/dist/extensions/router/dialog.js +70 -132
  374. package/dist/extensions/router/dialog.js.map +1 -1
  375. package/dist/extensions/router/index.d.ts.map +1 -1
  376. package/dist/extensions/router/index.js.map +1 -1
  377. package/dist/extensions/router/presets.d.ts +8 -3
  378. package/dist/extensions/router/presets.d.ts.map +1 -1
  379. package/dist/extensions/router/presets.js +33 -17
  380. package/dist/extensions/router/presets.js.map +1 -1
  381. package/dist/extensions/router/probe.d.ts.map +1 -1
  382. package/dist/extensions/router/probe.js.map +1 -1
  383. package/dist/extensions/router/register.d.ts +3 -3
  384. package/dist/extensions/router/register.d.ts.map +1 -1
  385. package/dist/extensions/router/register.js.map +1 -1
  386. package/dist/extensions/router/store.d.ts.map +1 -1
  387. package/dist/extensions/router/store.js.map +1 -1
  388. package/dist/extensions/router/stream.d.ts.map +1 -1
  389. package/dist/extensions/router/stream.js.map +1 -1
  390. package/dist/extensions/router/types.d.ts.map +1 -1
  391. package/dist/extensions/router/ui.d.ts +11 -2
  392. package/dist/extensions/router/ui.d.ts.map +1 -1
  393. package/dist/extensions/router/ui.js +316 -171
  394. package/dist/extensions/router/ui.js.map +1 -1
  395. package/dist/extensions/statusline/index.d.ts.map +1 -1
  396. package/dist/extensions/statusline/index.js +17 -9
  397. package/dist/extensions/statusline/index.js.map +1 -1
  398. package/dist/extensions/subagent/activity.d.ts.map +1 -1
  399. package/dist/extensions/subagent/activity.js.map +1 -1
  400. package/dist/extensions/subagent/agents.d.ts.map +1 -1
  401. package/dist/extensions/subagent/agents.js.map +1 -1
  402. package/dist/extensions/subagent/constants.d.ts.map +1 -1
  403. package/dist/extensions/subagent/index.d.ts +3 -0
  404. package/dist/extensions/subagent/index.d.ts.map +1 -1
  405. package/dist/extensions/subagent/index.js +83 -12
  406. package/dist/extensions/subagent/index.js.map +1 -1
  407. package/dist/extensions/subagent/picker.d.ts.map +1 -1
  408. package/dist/extensions/subagent/picker.js +2 -9
  409. package/dist/extensions/subagent/picker.js.map +1 -1
  410. package/dist/extensions/subagent/render.d.ts.map +1 -1
  411. package/dist/extensions/subagent/render.js +33 -9
  412. package/dist/extensions/subagent/render.js.map +1 -1
  413. package/dist/extensions/subagent/resolve.d.ts.map +1 -1
  414. package/dist/extensions/subagent/resolve.js.map +1 -1
  415. package/dist/extensions/subagent/retry.d.ts.map +1 -1
  416. package/dist/extensions/subagent/retry.js.map +1 -1
  417. package/dist/extensions/subagent/runner.d.ts +2 -1
  418. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  419. package/dist/extensions/subagent/runner.js +10 -12
  420. package/dist/extensions/subagent/runner.js.map +1 -1
  421. package/dist/extensions/subagent/schema.d.ts.map +1 -1
  422. package/dist/extensions/subagent/schema.js.map +1 -1
  423. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  424. package/dist/extensions/subagent/sdk-runner.js +41 -1
  425. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  426. package/dist/extensions/subagent/settings.d.ts.map +1 -1
  427. package/dist/extensions/subagent/settings.js +46 -36
  428. package/dist/extensions/subagent/settings.js.map +1 -1
  429. package/dist/extensions/subagent/types.d.ts +0 -1
  430. package/dist/extensions/subagent/types.d.ts.map +1 -1
  431. package/dist/extensions/subagent/types.js.map +1 -1
  432. package/dist/extensions/todo/constants.d.ts.map +1 -1
  433. package/dist/extensions/todo/constants.js.map +1 -1
  434. package/dist/extensions/todo/index.d.ts.map +1 -1
  435. package/dist/extensions/todo/index.js.map +1 -1
  436. package/dist/extensions/todo/overlay.d.ts.map +1 -1
  437. package/dist/extensions/todo/overlay.js +6 -10
  438. package/dist/extensions/todo/overlay.js.map +1 -1
  439. package/dist/extensions/todo/schema.d.ts +2 -2
  440. package/dist/extensions/todo/schema.d.ts.map +1 -1
  441. package/dist/extensions/todo/state.d.ts.map +1 -1
  442. package/dist/extensions/todo/state.js.map +1 -1
  443. package/dist/extensions/todo/view.d.ts.map +1 -1
  444. package/dist/extensions/todo/view.js.map +1 -1
  445. package/dist/index.d.ts +4 -4
  446. package/dist/index.d.ts.map +1 -1
  447. package/dist/index.js +1 -1
  448. package/dist/index.js.map +1 -1
  449. package/dist/main.d.ts.map +1 -1
  450. package/dist/main.js +57 -5
  451. package/dist/main.js.map +1 -1
  452. package/dist/migrations.d.ts.map +1 -1
  453. package/dist/migrations.js.map +1 -1
  454. package/dist/modes/index.d.ts +1 -0
  455. package/dist/modes/index.d.ts.map +1 -1
  456. package/dist/modes/index.js.map +1 -1
  457. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  458. package/dist/modes/interactive/components/armin.js +6 -10
  459. package/dist/modes/interactive/components/armin.js.map +1 -1
  460. package/dist/modes/interactive/components/assistant-message.d.ts +5 -2
  461. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  462. package/dist/modes/interactive/components/assistant-message.js +13 -11
  463. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  464. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/bash-execution.js +4 -10
  466. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  467. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  469. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  470. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  472. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  473. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  475. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  476. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/config-selector.js +5 -22
  478. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  479. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/countdown-timer.js +1 -7
  481. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  482. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  483. package/dist/modes/interactive/components/custom-editor.js +8 -8
  484. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  485. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/custom-entry.js +1 -4
  487. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  488. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  489. package/dist/modes/interactive/components/custom-message.js +1 -7
  490. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  491. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  492. package/dist/modes/interactive/components/daxnuts.js +6 -8
  493. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  494. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  495. package/dist/modes/interactive/components/diff.js.map +1 -1
  496. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  497. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  498. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  499. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  500. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  501. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  502. package/dist/modes/interactive/components/extension-editor.js +1 -7
  503. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  504. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  505. package/dist/modes/interactive/components/extension-input.js +2 -8
  506. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  507. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  508. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  509. package/dist/modes/interactive/components/extension-selector.js +1 -9
  510. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  511. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  512. package/dist/modes/interactive/components/first-time-setup.js +2 -4
  513. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  514. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  515. package/dist/modes/interactive/components/footer.js +2 -4
  516. package/dist/modes/interactive/components/footer.js.map +1 -1
  517. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  518. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  519. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  520. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  521. package/dist/modes/interactive/components/login-dialog.js +3 -9
  522. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  523. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  524. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  525. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  526. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  527. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  528. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  529. package/dist/modes/interactive/components/mermaid.js +75 -0
  530. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  531. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  532. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/model-selector.js +32 -30
  534. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  535. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  536. package/dist/modes/interactive/components/oauth-selector.js +3 -11
  537. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  538. package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
  539. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  540. package/dist/modes/interactive/components/scoped-models-selector.js +34 -13
  541. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  542. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  543. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  544. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  545. package/dist/modes/interactive/components/session-selector.js +35 -60
  546. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  547. package/dist/modes/interactive/components/settings-selector.d.ts +8 -2
  548. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  549. package/dist/modes/interactive/components/settings-selector.js +30 -14
  550. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  551. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  552. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  553. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  554. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  555. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  556. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  557. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  558. package/dist/modes/interactive/components/status-indicator.js +0 -2
  559. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  560. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  561. package/dist/modes/interactive/components/theme-selector.js +0 -2
  562. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  563. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  564. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  565. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  566. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  567. package/dist/modes/interactive/components/tool-execution.js +18 -36
  568. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  569. package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
  570. package/dist/modes/interactive/components/tool-group.js +2 -3
  571. package/dist/modes/interactive/components/tool-group.js.map +1 -1
  572. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  573. package/dist/modes/interactive/components/tree-selector.js +19 -39
  574. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  575. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  576. package/dist/modes/interactive/components/trust-selector.js +0 -6
  577. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  578. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  579. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  580. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  581. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  582. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  583. package/dist/modes/interactive/components/user-message.js +8 -5
  584. package/dist/modes/interactive/components/user-message.js.map +1 -1
  585. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  586. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  587. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  588. package/dist/modes/interactive/external-editor.js +40 -3
  589. package/dist/modes/interactive/external-editor.js.map +1 -1
  590. package/dist/modes/interactive/interactive-mode.d.ts +46 -4
  591. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  592. package/dist/modes/interactive/interactive-mode.js +538 -275
  593. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  594. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  595. package/dist/modes/interactive/model-search.js.map +1 -1
  596. package/dist/modes/interactive/theme/dark.json +1 -0
  597. package/dist/modes/interactive/theme/light.json +1 -0
  598. package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
  599. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  600. package/dist/modes/interactive/theme/theme-controller.js +11 -8
  601. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  602. package/dist/modes/interactive/theme/theme-schema.json +5 -1
  603. package/dist/modes/interactive/theme/theme.d.ts +4 -4
  604. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  605. package/dist/modes/interactive/theme/theme.js +13 -9
  606. package/dist/modes/interactive/theme/theme.js.map +1 -1
  607. package/dist/modes/json-event.d.ts +28 -0
  608. package/dist/modes/json-event.d.ts.map +1 -0
  609. package/dist/modes/json-event.js +12 -0
  610. package/dist/modes/json-event.js.map +1 -0
  611. package/dist/modes/print-mode.d.ts.map +1 -1
  612. package/dist/modes/print-mode.js +12 -2
  613. package/dist/modes/print-mode.js.map +1 -1
  614. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  615. package/dist/modes/rpc/jsonl.js.map +1 -1
  616. package/dist/modes/rpc/rpc-client.d.ts +5 -4
  617. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  618. package/dist/modes/rpc/rpc-client.js +7 -8
  619. package/dist/modes/rpc/rpc-client.js.map +1 -1
  620. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  621. package/dist/modes/rpc/rpc-mode.js +17 -3
  622. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  623. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  624. package/dist/package-manager-cli.d.ts.map +1 -1
  625. package/dist/package-manager-cli.js +11 -9
  626. package/dist/package-manager-cli.js.map +1 -1
  627. package/dist/rpc-entry.d.ts.map +1 -1
  628. package/dist/rpc-entry.js +1 -0
  629. package/dist/rpc-entry.js.map +1 -1
  630. package/dist/utils/abort.d.ts +5 -0
  631. package/dist/utils/abort.d.ts.map +1 -0
  632. package/dist/utils/abort.js +48 -0
  633. package/dist/utils/abort.js.map +1 -0
  634. package/dist/utils/ansi.d.ts.map +1 -1
  635. package/dist/utils/ansi.js.map +1 -1
  636. package/dist/utils/changelog.d.ts.map +1 -1
  637. package/dist/utils/changelog.js.map +1 -1
  638. package/dist/utils/child-process.d.ts.map +1 -1
  639. package/dist/utils/child-process.js.map +1 -1
  640. package/dist/utils/clipboard-image.d.ts.map +1 -1
  641. package/dist/utils/clipboard-image.js.map +1 -1
  642. package/dist/utils/clipboard-native.d.ts.map +1 -1
  643. package/dist/utils/clipboard-native.js.map +1 -1
  644. package/dist/utils/clipboard.d.ts +1 -1
  645. package/dist/utils/clipboard.d.ts.map +1 -1
  646. package/dist/utils/clipboard.js +22 -2
  647. package/dist/utils/clipboard.js.map +1 -1
  648. package/dist/utils/coalescing-terminal.d.ts +1 -0
  649. package/dist/utils/coalescing-terminal.d.ts.map +1 -1
  650. package/dist/utils/coalescing-terminal.js +16 -8
  651. package/dist/utils/coalescing-terminal.js.map +1 -1
  652. package/dist/utils/deprecation.d.ts.map +1 -1
  653. package/dist/utils/deprecation.js.map +1 -1
  654. package/dist/utils/exif-orientation.d.ts.map +1 -1
  655. package/dist/utils/exif-orientation.js.map +1 -1
  656. package/dist/utils/frontmatter.d.ts.map +1 -1
  657. package/dist/utils/frontmatter.js.map +1 -1
  658. package/dist/utils/fs-watch.d.ts.map +1 -1
  659. package/dist/utils/fs-watch.js.map +1 -1
  660. package/dist/utils/git.d.ts.map +1 -1
  661. package/dist/utils/git.js.map +1 -1
  662. package/dist/utils/html.d.ts.map +1 -1
  663. package/dist/utils/html.js.map +1 -1
  664. package/dist/utils/image-convert.d.ts.map +1 -1
  665. package/dist/utils/image-convert.js.map +1 -1
  666. package/dist/utils/image-process.d.ts.map +1 -1
  667. package/dist/utils/image-process.js.map +1 -1
  668. package/dist/utils/image-resize-core.d.ts.map +1 -1
  669. package/dist/utils/image-resize-core.js.map +1 -1
  670. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  671. package/dist/utils/image-resize-worker.js.map +1 -1
  672. package/dist/utils/image-resize.d.ts.map +1 -1
  673. package/dist/utils/image-resize.js.map +1 -1
  674. package/dist/utils/json.d.ts.map +1 -1
  675. package/dist/utils/json.js.map +1 -1
  676. package/dist/utils/management-http.d.ts +23 -0
  677. package/dist/utils/management-http.d.ts.map +1 -0
  678. package/dist/utils/management-http.js +50 -0
  679. package/dist/utils/management-http.js.map +1 -0
  680. package/dist/utils/mime.d.ts.map +1 -1
  681. package/dist/utils/mime.js.map +1 -1
  682. package/dist/utils/open-browser.d.ts.map +1 -1
  683. package/dist/utils/open-browser.js.map +1 -1
  684. package/dist/utils/paths.d.ts +5 -3
  685. package/dist/utils/paths.d.ts.map +1 -1
  686. package/dist/utils/paths.js +25 -4
  687. package/dist/utils/paths.js.map +1 -1
  688. package/dist/utils/photon.d.ts.map +1 -1
  689. package/dist/utils/photon.js.map +1 -1
  690. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  691. package/dist/utils/pi-user-agent.js.map +1 -1
  692. package/dist/utils/shell.d.ts.map +1 -1
  693. package/dist/utils/shell.js.map +1 -1
  694. package/dist/utils/sleep.d.ts.map +1 -1
  695. package/dist/utils/sleep.js.map +1 -1
  696. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  697. package/dist/utils/syntax-highlight.js.map +1 -1
  698. package/dist/utils/tool-result-images.d.ts +19 -0
  699. package/dist/utils/tool-result-images.d.ts.map +1 -0
  700. package/dist/utils/tool-result-images.js +45 -0
  701. package/dist/utils/tool-result-images.js.map +1 -0
  702. package/dist/utils/tools-manager.d.ts.map +1 -1
  703. package/dist/utils/tools-manager.js +4 -6
  704. package/dist/utils/tools-manager.js.map +1 -1
  705. package/dist/utils/version-check.d.ts +4 -0
  706. package/dist/utils/version-check.d.ts.map +1 -1
  707. package/dist/utils/version-check.js +20 -2
  708. package/dist/utils/version-check.js.map +1 -1
  709. package/dist/utils/windows-self-update.d.ts.map +1 -1
  710. package/dist/utils/windows-self-update.js.map +1 -1
  711. package/docs/bundled/README.md +14 -16
  712. package/docs/bundled/extensions/biu.md +63 -0
  713. package/docs/bundled/extensions/router.md +20 -14
  714. package/docs/bundled/extensions/statusline.md +7 -5
  715. package/docs/bundled/themes.md +1 -1
  716. package/docs/compaction.md +25 -30
  717. package/docs/custom-provider.md +303 -467
  718. package/docs/development.md +83 -0
  719. package/docs/docs.json +6 -10
  720. package/docs/extensions.md +139 -119
  721. package/docs/index.md +18 -74
  722. package/docs/json.md +40 -15
  723. package/docs/keybindings.md +38 -10
  724. package/docs/models.md +210 -150
  725. package/docs/providers.md +3 -1
  726. package/docs/quickstart.md +5 -3
  727. package/docs/rpc.md +177 -134
  728. package/docs/sdk.md +165 -178
  729. package/docs/security.md +2 -2
  730. package/docs/session-format.md +139 -119
  731. package/docs/settings.md +4 -1
  732. package/docs/skills.md +0 -1
  733. package/docs/themes.md +5 -3
  734. package/docs/tui.md +411 -549
  735. package/docs/usage.md +11 -11
  736. package/examples/README.md +6 -1
  737. package/examples/extensions/README.md +13 -33
  738. package/examples/extensions/custom-compaction.ts +1 -16
  739. package/examples/extensions/custom-provider-anthropic/index.ts +11 -4
  740. package/examples/extensions/custom-provider-gitlab-duo/index.ts +2 -1
  741. package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
  742. package/examples/extensions/handoff.ts +2 -11
  743. package/examples/extensions/qna.ts +3 -7
  744. package/examples/extensions/summarize.ts +8 -18
  745. package/examples/extensions/truncated-tool.ts +2 -2
  746. package/examples/rpc-extension-ui.ts +11 -2
  747. package/examples/sdk/02-custom-model.ts +1 -2
  748. package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
  749. package/examples/sdk/12-full-control.ts +3 -1
  750. package/examples/sdk/README.md +1 -0
  751. package/npm-shrinkwrap.json +199 -270
  752. package/package.json +16 -9
  753. package/dist/extensions/plan/constants.d.ts +0 -68
  754. package/dist/extensions/plan/constants.d.ts.map +0 -1
  755. package/dist/extensions/plan/constants.js +0 -100
  756. package/dist/extensions/plan/constants.js.map +0 -1
  757. package/dist/extensions/plan/index.d.ts +0 -30
  758. package/dist/extensions/plan/index.d.ts.map +0 -1
  759. package/dist/extensions/plan/index.js +0 -429
  760. package/dist/extensions/plan/index.js.map +0 -1
  761. package/dist/extensions/plan/schema.d.ts +0 -20
  762. package/dist/extensions/plan/schema.d.ts.map +0 -1
  763. package/dist/extensions/plan/schema.js +0 -13
  764. package/dist/extensions/plan/schema.js.map +0 -1
  765. package/dist/extensions/plan/state.d.ts +0 -38
  766. package/dist/extensions/plan/state.d.ts.map +0 -1
  767. package/dist/extensions/plan/state.js +0 -96
  768. package/dist/extensions/plan/state.js.map +0 -1
  769. package/dist/extensions/plan/storage.d.ts +0 -26
  770. package/dist/extensions/plan/storage.d.ts.map +0 -1
  771. package/dist/extensions/plan/storage.js +0 -83
  772. package/dist/extensions/plan/storage.js.map +0 -1
  773. package/dist/extensions/plan/view.d.ts +0 -44
  774. package/dist/extensions/plan/view.d.ts.map +0 -1
  775. package/dist/extensions/plan/view.js +0 -149
  776. package/dist/extensions/plan/view.js.map +0 -1
  777. package/docs/bundled/extensions/README.md +0 -19
  778. package/docs/bundled/extensions/plan.md +0 -34
  779. package/examples/extensions/plan-mode/README.md +0 -66
  780. package/examples/extensions/plan-mode/index.ts +0 -390
  781. package/examples/extensions/plan-mode/utils.ts +0 -168
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { Editor, type EditorTheme, Markdown, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { Keybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { keyLabel as configuredKeyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { ruleBorder, wrapWithPrefix } from \"./dialog-primitives.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { PreviewLinesCache, WidthCachedRender } from \"./render-cache.ts\";\nimport {\n\tdisplayOptions,\n\tfirstUnanswered,\n\thasAnswer,\n\thasMultiAnswer,\n\tnewQuestionState,\n\torderedAnswers,\n} from \"./state.ts\";\nimport type { DialogResult, DisplayOption, InputMode, Question, QuestionAnswer, QuestionOption } from \"./types.ts\";\n\ntype DialogView = \"question\" | \"review\";\n\nconst PREVIEW_MAX_LINES = 16;\n/**\n * Estimated non-preview rows in the stacked (narrow) layout: top/bottom rules,\n * tab strip + blank, question line + blank, up to 5 option rows with\n * descriptions, the \"Chat about this\" row, warning slot, and the hint line.\n * Reserved so the preview clamps short of the terminal height.\n */\nconst PREVIEW_CHROME_ROWS = 18;\n\nexport function createQuestionDialog(questions: Question[], signal?: AbortSignal) {\n\treturn (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: DialogResult) => void) => {\n\t\tlet currentIdx = 0;\n\t\tlet view: DialogView = \"question\";\n\t\tlet inputMode: InputMode;\n\t\tlet noteTarget: string | undefined;\n\t\tlet notesSnapshot: { prior: QuestionAnswer | undefined } | undefined;\n\t\tlet dialogFocused = false;\n\t\tlet footerFocused = false;\n\t\tlet finished = false;\n\t\tconst cache = new WidthCachedRender();\n\t\tconst previewCache = new PreviewLinesCache();\n\t\tconst states = questions.map(() => newQuestionState());\n\t\tconst optionsByQuestion = questions.map((question) => displayOptions(question));\n\n\t\tconst editorTheme: EditorTheme = {\n\t\t\tborderColor: (s) => theme.fg(\"accent\", s),\n\t\t\tselectList: {\n\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\tselectedText: (t) => theme.fg(\"accent\", t),\n\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t},\n\t\t};\n\t\tconst editor = new Editor(tui, editorTheme);\n\n\t\tconst currentQuestion = () => questions[currentIdx];\n\t\tconst currentState = () => states[currentIdx];\n\t\tconst currentOptions = () => optionsByQuestion[currentIdx];\n\t\tconst keyMatches = (data: string, keybinding: Keybinding) => keybindings.matches(data, keybinding);\n\t\tconst keyLabel = (keybinding: Keybinding) => configuredKeyLabel(keybinding, { keybindings });\n\t\tconst keyAction = (keybinding: Keybinding, action: string) => {\n\t\t\tconst label = keyLabel(keybinding);\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\t// Editor reads the global TUI manager internally, while dialog controls use the injected manager.\n\t\tconst editorSubmitAction = (action: string) => {\n\t\t\tconst label = configuredKeyLabel(\"tui.input.submit\");\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\tconst keyGroupAction = (bindings: Keybinding[], action: string) => {\n\t\t\tconst labels = bindings.map(keyLabel).filter(Boolean).join(\"/\");\n\t\t\treturn labels ? `${labels} ${action}` : \"\";\n\t\t};\n\t\tconst joinHints = (...hints: string[]) => hints.filter(Boolean).join(\" • \");\n\n\t\tfunction finish(result: DialogResult): void {\n\t\t\tif (finished) return;\n\t\t\tfinished = true;\n\t\t\tdone(result);\n\t\t}\n\n\t\tconst onAbort = () => finish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\tif (signal?.aborted) onAbort();\n\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tfunction refresh(): void {\n\t\t\tcache.invalidate();\n\t\t\ttui.requestRender();\n\t\t}\n\n\t\tfunction syncEditorFocus(): void {\n\t\t\teditor.focused = dialogFocused && inputMode !== undefined;\n\t\t}\n\n\t\tfunction setCurrentIdx(index: number): void {\n\t\t\tcurrentIdx = Math.max(0, Math.min(questions.length - 1, index));\n\t\t\tview = \"question\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\tnotesSnapshot = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction clearWarning(): void {\n\t\t\tcurrentState().warning = undefined;\n\t\t}\n\n\t\tfunction focusedOption(): DisplayOption | undefined {\n\t\t\treturn currentOptions()[currentState().optionIndex];\n\t\t}\n\n\t\tfunction showReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before reviewing your answers.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tview = \"review\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction advanceAfterAnswer(): void {\n\t\t\tif (questions.length === 1 && !currentQuestion().multiSelect) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing === undefined) {\n\t\t\t\tshowReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentIdx(missing);\n\t\t}\n\n\t\tfunction beginCustomInput(): void {\n\t\t\tconst state = currentState();\n\t\t\tinputMode = \"custom\";\n\t\t\tnoteTarget = undefined;\n\t\t\tconst existingSingle = state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined;\n\t\t\teditor.setText(state.customAnswer?.text ?? existingSingle ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction selectSingleOption(option: QuestionOption): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tstate.singleAnswer = {\n\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\tquestion: question.question,\n\t\t\t\theader: question.header,\n\t\t\t\tkind: \"option\",\n\t\t\t\tanswer: option.label,\n\t\t\t\t...(option.preview ? { preview: option.preview } : {}),\n\t\t\t};\n\t\t\tstate.warning = undefined;\n\t\t}\n\n\t\tfunction beginNotesInput(): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst option = focusedOption();\n\t\t\tif (!option || option.kind === \"other\") {\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (question.multiSelect && !state.multiSelected.has(option.optionIndex)) {\n\t\t\t\tstate.warning = \"Select the option first, then add notes.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!question.multiSelect) {\n\t\t\t\tnotesSnapshot = { prior: state.singleAnswer };\n\t\t\t\tselectSingleOption(option);\n\t\t\t}\n\t\t\tinputMode = \"notes\";\n\t\t\tnoteTarget = option.label;\n\t\t\teditor.setText(state.notesByOption.get(option.label) ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction recordSingle(option: DisplayOption): void {\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (currentState().singleAnswer?.kind === \"custom\") {\n\t\t\t\t\tadvanceAfterAnswer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tselectSingleOption(option);\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction recordMulti(): void {\n\t\t\tconst state = currentState();\n\t\t\tif (!hasMultiAnswer(state)) {\n\t\t\t\tstate.warning = \"Select at least one option, type a custom answer, or cancel the questions.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstate.warning = undefined;\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction toggleMultiOption(option: DisplayOption): void {\n\t\t\tconst state = currentState();\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (state.customAnswer) {\n\t\t\t\t\tstate.customAnswer.selected = !state.customAnswer.selected;\n\t\t\t\t\tclearWarning();\n\t\t\t\t} else {\n\t\t\t\t\tconst tabKey = keyLabel(\"tui.input.tab\");\n\t\t\t\t\tstate.warning = tabKey\n\t\t\t\t\t\t? `Press ${tabKey} to type a custom answer.`\n\t\t\t\t\t\t: \"Choose Type something to type a custom answer.\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (state.multiSelected.has(option.optionIndex)) state.multiSelected.delete(option.optionIndex);\n\t\t\telse state.multiSelected.add(option.optionIndex);\n\t\t\tclearWarning();\n\t\t}\n\n\t\tfunction finishReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before submitting.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t}\n\n\t\teditor.onSubmit = (value) => {\n\t\t\tconst trimmed = value.trim();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tif (trimmed.length > QUESTION_LIMITS.userTextChars) {\n\t\t\t\tstate.warning = `Keep notes and custom answers under ${QUESTION_LIMITS.userTextChars} characters.`;\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\tif (noteTarget) {\n\t\t\t\t\tif (trimmed) state.notesByOption.set(noteTarget, trimmed);\n\t\t\t\t\telse state.notesByOption.delete(noteTarget);\n\t\t\t\t}\n\t\t\t\tinputMode = undefined;\n\t\t\t\tnoteTarget = undefined;\n\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (inputMode === \"custom\") {\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tstate.customAnswer = { text: trimmed, selected: true };\n\t\t\t\t\tstate.optionIndex = question.options.length;\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstate.singleAnswer = {\n\t\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\t\tquestion: question.question,\n\t\t\t\t\theader: question.header,\n\t\t\t\t\tkind: \"custom\",\n\t\t\t\t\tanswer: trimmed,\n\t\t\t\t};\n\t\t\t\tinputMode = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\tadvanceAfterAnswer();\n\t\t\t}\n\t\t};\n\n\t\tfunction handleReviewInput(data: string): void {\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tfinishReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleQuestionInput(data: string): void {\n\t\t\tif (inputMode) {\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tif (inputMode === \"notes\" && notesSnapshot) {\n\t\t\t\t\t\tcurrentState().singleAnswer = notesSnapshot.prior;\n\t\t\t\t\t}\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\tnoteTarget = undefined;\n\t\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.handleInput(data);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tif (currentIdx > 0) setCurrentIdx(currentIdx - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorRight\")) {\n\t\t\t\tif (currentIdx < questions.length - 1) setCurrentIdx(currentIdx + 1);\n\t\t\t\telse if (firstUnanswered(states) === undefined) showReview();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = options.length - 1;\n\t\t\t\t} else if (state.optionIndex > 0) {\n\t\t\t\t\tstate.optionIndex--;\n\t\t\t\t}\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\tif (footerFocused) return;\n\t\t\t\tif (state.optionIndex < options.length - 1) state.optionIndex++;\n\t\t\t\telse footerFocused = true;\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.input.tab\")) {\n\t\t\t\tif (!footerFocused) beginNotesInput();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.length === 1 && data >= \"1\" && data <= \"9\") {\n\t\t\t\tconst index = data.charCodeAt(0) - 49;\n\t\t\t\tconst target = options[index];\n\t\t\t\tif (target) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = index;\n\t\t\t\t\tclearWarning();\n\t\t\t\t\tif (currentQuestion().multiSelect) {\n\t\t\t\t\t\ttoggleMultiOption(target);\n\t\t\t\t\t\trefresh();\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecordSingle(target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (footerFocused) {\n\t\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"needs_clarification\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst option = options[state.optionIndex];\n\t\t\tif (question.multiSelect && keyMatches(data, \"app.list.toggle\")) {\n\t\t\t\tif (option) toggleMultiOption(option);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tif (option?.kind === \"other\" && !state.customAnswer) {\n\t\t\t\t\t\tbeginCustomInput();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecordMulti();\n\t\t\t\t} else if (option) recordSingle(option);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t}\n\t\t}\n\n\t\tfunction handleInput(data: string): void {\n\t\t\tif (view === \"review\") handleReviewInput(data);\n\t\t\telse handleQuestionInput(data);\n\t\t}\n\n\t\tfunction render(width: number): string[] {\n\t\t\treturn cache.get(width, tui.terminal.rows, compute);\n\t\t}\n\n\t\tfunction renderTabs(renderWidth: number, lines: string[]): void {\n\t\t\tif (questions.length < 2) return;\n\t\t\tconst tabCount = questions.length + 1;\n\t\t\tconst headerWidth = Math.max(4, Math.floor((renderWidth - tabCount * 5) / tabCount));\n\t\t\tconst tabs = [\n\t\t\t\t...questions.map((question, index) => {\n\t\t\t\t\tconst answered = hasAnswer(states[index]);\n\t\t\t\t\tconst label = ` ${answered ? \"■\" : \"□\"} ${truncateToWidth(question.header, headerWidth)} `;\n\t\t\t\t\tif (view === \"question\" && index === currentIdx) {\n\t\t\t\t\t\treturn theme.bg(\"selectedBg\", theme.fg(answered ? \"success\" : \"text\", label));\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(answered ? \"success\" : \"muted\", label);\n\t\t\t\t}),\n\t\t\t\tview === \"review\"\n\t\t\t\t\t? theme.bg(\"selectedBg\", theme.fg(\"text\", \" ✓ Submit \"))\n\t\t\t\t\t: theme.fg(firstUnanswered(states) === undefined ? \"success\" : \"dim\", \" ✓ Submit \"),\n\t\t\t].join(\" \");\n\t\t\twrapWithPrefix(\" \", tabs, renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tfunction previewLines(previewText: string, width: number, terminalRows: number): string[] {\n\t\t\tconst maxLines = Math.max(4, Math.min(PREVIEW_MAX_LINES, terminalRows - PREVIEW_CHROME_ROWS));\n\t\t\treturn previewCache.get(previewText, width, maxLines, () => {\n\t\t\t\tconst markdown = new Markdown(previewText, 1, 0, getMarkdownTheme());\n\t\t\t\tconst rendered = markdown.render(Math.max(1, width));\n\t\t\t\tif (rendered.length <= maxLines) return rendered;\n\t\t\t\treturn [\n\t\t\t\t\t...rendered.slice(0, maxLines),\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttruncateToWidth(`… ${rendered.length - maxLines} preview lines hidden`, Math.max(1, width)),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t\t}\n\n\t\t/** Multi-select checkbox marker; the other row shows no box until a custom answer exists. */\n\t\tfunction multiMarker(option: DisplayOption, checked: boolean, hasCustomAnswer: boolean): string {\n\t\t\tif (option.kind === \"other\" && !hasCustomAnswer) return \" \";\n\t\t\treturn checked ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t}\n\n\t\tfunction renderReview(renderWidth: number, lines: string[]): void {\n\t\t\twrapWithPrefix(\" \", theme.fg(\"accent\", \"Review answers\"), renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t\tfor (const answer of orderedAnswers(questions, states)) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"text\", `${answer.questionIndex + 1}. ${answer.question}`),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t\tconst response =\n\t\t\t\t\tanswer.kind === \"multi\"\n\t\t\t\t\t\t? (answer.selected?.join(\", \") ?? \"(no input)\")\n\t\t\t\t\t\t: (answer.answer ?? \"(no input)\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"success\", response), renderWidth, lines);\n\t\t\t\tfor (const note of answer.notes ?? []) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", `Note for ${note.option}: ${note.text}`), renderWidth, lines);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"dim\",\n\t\t\t\t\tjoinHints(\n\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"submit\"),\n\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"edit last question\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t}\n\n\t\tfunction compute(width: number, terminalRows: number): string[] {\n\t\t\tconst lines: string[] = [];\n\t\t\tconst renderWidth = Math.max(1, width);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\trenderTabs(renderWidth, lines);\n\n\t\t\tif (view === \"review\") {\n\t\t\t\trenderReview(renderWidth, lines);\n\t\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\t\treturn lines;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tconst isMulti = question.multiSelect === true;\n\t\t\tconst digitRange = `1-${Math.min(9, options.length)}`;\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\t`${theme.fg(\"accent\", question.header)} ${theme.fg(\"text\", question.question)}`,\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tlines.push(\"\");\n\n\t\t\tconst optionLines: string[] = [];\n\t\t\tconst hasPreview = !isMulti && options.some((option) => option.kind === \"option\" && option.preview);\n\t\t\tconst showPreviewSideBySide = hasPreview && renderWidth >= 60;\n\t\t\tconst listWidth = showPreviewSideBySide ? Math.max(20, Math.floor(renderWidth * 0.4)) : renderWidth;\n\n\t\t\tfor (let index = 0; index < options.length; index++) {\n\t\t\t\tconst option = options[index];\n\t\t\t\tconst focused = !footerFocused && index === state.optionIndex;\n\t\t\t\tconst checked =\n\t\t\t\t\tisMulti &&\n\t\t\t\t\t((option.kind === \"option\" && state.multiSelected.has(option.optionIndex)) ||\n\t\t\t\t\t\t(option.kind === \"other\" && state.customAnswer?.selected === true));\n\t\t\t\tconst selectedSingle =\n\t\t\t\t\t!isMulti &&\n\t\t\t\t\t(option.kind === \"other\"\n\t\t\t\t\t\t? state.singleAnswer?.kind === \"custom\"\n\t\t\t\t\t\t: state.singleAnswer?.answer === option.label);\n\t\t\t\tconst marker = isMulti ? multiMarker(option, checked, state.customAnswer !== undefined) : \" \";\n\t\t\t\tconst focusArrow = focused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\t\tconst note =\n\t\t\t\t\toption.kind === \"option\" && state.notesByOption.has(option.label) ? theme.fg(\"success\", \" +note\") : \"\";\n\t\t\t\tconst customText =\n\t\t\t\t\toption.kind === \"other\"\n\t\t\t\t\t\t? (state.customAnswer?.text ??\n\t\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined))\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst labelText = customText ? `${option.label} ✎ ${customText}` : option.label;\n\t\t\t\tconst label = `${index + 1}. ${labelText}${selectedSingle ? \" ✓\" : \"\"}${note}`;\n\t\t\t\tconst color = focused ? \"accent\" : selectedSingle || checked ? \"success\" : \"text\";\n\t\t\t\twrapWithPrefix(`${focusArrow} ${marker} `, theme.fg(color, label), listWidth, optionLines);\n\t\t\t\tif (option.kind === \"option\" && option.description) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", option.description), listWidth, optionLines);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (inputMode) {\n\t\t\t\toptionLines.push(\"\");\n\t\t\t\tconst label = inputMode === \"notes\" ? `Notes for ${noteTarget ?? \"option\"}:` : \"Your answer:\";\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", label), listWidth, optionLines);\n\t\t\t\tfor (const line of editor.render(Math.max(1, listWidth - 2))) optionLines.push(` ${line}`);\n\t\t\t}\n\n\t\t\tif (showPreviewSideBySide) {\n\t\t\t\tconst gap = 2;\n\t\t\t\tconst rightWidth = renderWidth - listWidth - gap;\n\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\tconst rightLines = previewText\n\t\t\t\t\t? previewLines(previewText, rightWidth, terminalRows)\n\t\t\t\t\t: [theme.fg(\"dim\", \"(no preview)\")];\n\t\t\t\tconst maxRows = Math.max(optionLines.length, rightLines.length);\n\t\t\t\tconst pad = \" \".repeat(gap);\n\t\t\t\tfor (let row = 0; row < maxRows; row++) {\n\t\t\t\t\tconst left = row < optionLines.length ? optionLines[row] : \"\";\n\t\t\t\t\tconst leftPadded = left + \" \".repeat(Math.max(0, listWidth - visibleWidth(left)));\n\t\t\t\t\tconst right = row < rightLines.length ? rightLines[row] : \"\";\n\t\t\t\t\tlines.push(`${leftPadded}${pad}${right}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlines.push(...optionLines);\n\t\t\t\tif (hasPreview) {\n\t\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\t\tif (previewText) {\n\t\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\t\tlines.push(ruleBorder(theme, renderWidth, \"dim\"));\n\t\t\t\t\t\tlines.push(...previewLines(previewText, renderWidth, terminalRows));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\"\");\n\t\t\tconst chatPrefix = footerFocused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\twrapWithPrefix(\n\t\t\t\t`${chatPrefix} `,\n\t\t\t\ttheme.fg(footerFocused ? \"accent\" : \"text\", \"Chat about this\"),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tif (state.warning) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"warning\", state.warning), renderWidth, lines);\n\t\t\t}\n\t\t\tlines.push(\"\");\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(\"save notes\"), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (inputMode === \"custom\") {\n\t\t\t\tconst hint = isMulti ? \"save custom answer\" : \"continue\";\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(hint), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (footerFocused) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"discuss\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.up\", \"return to options\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (isMulti) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} toggle`,\n\t\t\t\t\t\t\tkeyAction(\"app.list.toggle\", \"toggle focused\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"continue\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} select`,\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"select\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\treturn lines;\n\t\t}\n\n\t\treturn {\n\t\t\tget focused() {\n\t\t\t\treturn dialogFocused;\n\t\t\t},\n\t\t\tset focused(value: boolean) {\n\t\t\t\tdialogFocused = value;\n\t\t\t\tsyncEditorFocus();\n\t\t\t},\n\t\t\trender,\n\t\t\tinvalidate: () => {\n\t\t\t\tcache.invalidate();\n\t\t\t},\n\t\t\thandleInput,\n\t\t\tdispose() {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t};\n\t};\n}\n"]}
1
+ {"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../../src/extensions/question/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { Editor, type EditorTheme, Markdown, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport type { Keybinding, KeybindingsManager } from \"../../core/keybindings.ts\";\nimport { keyLabel as configuredKeyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { ruleBorder, wrapWithPrefix } from \"./dialog-primitives.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { PreviewLinesCache, WidthCachedRender } from \"./render-cache.ts\";\nimport {\n\tdisplayOptions,\n\tfirstUnanswered,\n\thasAnswer,\n\thasMultiAnswer,\n\tnewQuestionState,\n\torderedAnswers,\n} from \"./state.ts\";\nimport type { DialogResult, DisplayOption, InputMode, Question, QuestionAnswer, QuestionOption } from \"./types.ts\";\n\ntype DialogView = \"question\" | \"review\";\n\nconst PREVIEW_MAX_LINES = 16;\n/**\n * Estimated non-preview rows in the stacked (narrow) layout: top/bottom rules,\n * tab strip + blank, question line + blank, up to 5 option rows with\n * descriptions, the \"Chat about this\" row, warning slot, and the hint line.\n * Reserved so the preview clamps short of the terminal height.\n */\nconst PREVIEW_CHROME_ROWS = 18;\n\nexport function createQuestionDialog(questions: Question[], signal?: AbortSignal) {\n\treturn (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: DialogResult) => void) => {\n\t\tlet currentIdx = 0;\n\t\tlet view: DialogView = \"question\";\n\t\tlet inputMode: InputMode;\n\t\tlet noteTarget: string | undefined;\n\t\tlet notesSnapshot: { prior: QuestionAnswer | undefined } | undefined;\n\t\tlet dialogFocused = false;\n\t\tlet footerFocused = false;\n\t\tlet finished = false;\n\t\tconst cache = new WidthCachedRender();\n\t\tconst previewCache = new PreviewLinesCache();\n\t\tconst states = questions.map(() => newQuestionState());\n\t\tconst optionsByQuestion = questions.map((question) => displayOptions(question));\n\n\t\tconst editorTheme: EditorTheme = {\n\t\t\tborderColor: (s) => theme.fg(\"accent\", s),\n\t\t\tselectList: {\n\t\t\t\tselectedPrefix: (t) => theme.fg(\"accent\", t),\n\t\t\t\tselectedText: (t) => theme.fg(\"accent\", t),\n\t\t\t\tdescription: (t) => theme.fg(\"muted\", t),\n\t\t\t\tscrollInfo: (t) => theme.fg(\"dim\", t),\n\t\t\t\tnoMatch: (t) => theme.fg(\"warning\", t),\n\t\t\t},\n\t\t};\n\t\tconst editor = new Editor(tui, editorTheme);\n\n\t\tconst currentQuestion = () => questions[currentIdx];\n\t\tconst currentState = () => states[currentIdx];\n\t\tconst currentOptions = () => optionsByQuestion[currentIdx];\n\t\tconst keyMatches = (data: string, keybinding: Keybinding) => keybindings.matches(data, keybinding);\n\t\tconst keyLabel = (keybinding: Keybinding) => configuredKeyLabel(keybinding, { keybindings });\n\t\tconst keyAction = (keybinding: Keybinding, action: string) => {\n\t\t\tconst label = keyLabel(keybinding);\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\t// Editor reads the global TUI manager internally, while dialog controls use the injected manager.\n\t\tconst editorSubmitAction = (action: string) => {\n\t\t\tconst label = configuredKeyLabel(\"tui.input.submit\");\n\t\t\treturn label ? `${label} ${action}` : \"\";\n\t\t};\n\t\tconst keyGroupAction = (bindings: Keybinding[], action: string) => {\n\t\t\tconst labels = bindings.map(keyLabel).filter(Boolean).join(\"/\");\n\t\t\treturn labels ? `${labels} ${action}` : \"\";\n\t\t};\n\t\tconst joinHints = (...hints: string[]) => hints.filter(Boolean).join(\" • \");\n\n\t\tfunction finish(result: DialogResult): void {\n\t\t\tif (finished) return;\n\t\t\tfinished = true;\n\t\t\tdone(result);\n\t\t}\n\n\t\tconst onAbort = () => finish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\tif (signal?.aborted) onAbort();\n\t\telse signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tfunction refresh(): void {\n\t\t\tcache.invalidate();\n\t\t\ttui.requestRender();\n\t\t}\n\n\t\tfunction syncEditorFocus(): void {\n\t\t\teditor.focused = dialogFocused && inputMode !== undefined;\n\t\t}\n\n\t\tfunction setCurrentIdx(index: number): void {\n\t\t\tcurrentIdx = Math.max(0, Math.min(questions.length - 1, index));\n\t\t\tview = \"question\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\tnotesSnapshot = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction clearWarning(): void {\n\t\t\tcurrentState().warning = undefined;\n\t\t}\n\n\t\tfunction focusedOption(): DisplayOption | undefined {\n\t\t\treturn currentOptions()[currentState().optionIndex];\n\t\t}\n\n\t\tfunction showReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before reviewing your answers.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tview = \"review\";\n\t\t\tinputMode = undefined;\n\t\t\tnoteTarget = undefined;\n\t\t\tfooterFocused = false;\n\t\t\teditor.setText(\"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction advanceAfterAnswer(): void {\n\t\t\tif (questions.length === 1 && !currentQuestion().multiSelect) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing === undefined) {\n\t\t\t\tshowReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetCurrentIdx(missing);\n\t\t}\n\n\t\tfunction beginCustomInput(): void {\n\t\t\tconst state = currentState();\n\t\t\tinputMode = \"custom\";\n\t\t\tnoteTarget = undefined;\n\t\t\tconst existingSingle = state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined;\n\t\t\teditor.setText(state.customAnswer?.text ?? existingSingle ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction selectSingleOption(option: QuestionOption): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tstate.singleAnswer = {\n\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\tquestion: question.question,\n\t\t\t\theader: question.header,\n\t\t\t\tkind: \"option\",\n\t\t\t\tanswer: option.label,\n\t\t\t\t...(option.preview ? { preview: option.preview } : {}),\n\t\t\t};\n\t\t\tstate.warning = undefined;\n\t\t}\n\n\t\tfunction beginNotesInput(): void {\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst option = focusedOption();\n\t\t\tif (!option || option.kind === \"other\") {\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (question.multiSelect && !state.multiSelected.has(option.optionIndex)) {\n\t\t\t\tstate.warning = \"Select the option first, then add notes.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!question.multiSelect) {\n\t\t\t\tnotesSnapshot = { prior: state.singleAnswer };\n\t\t\t\tselectSingleOption(option);\n\t\t\t}\n\t\t\tinputMode = \"notes\";\n\t\t\tnoteTarget = option.label;\n\t\t\teditor.setText(state.notesByOption.get(option.label) ?? \"\");\n\t\t\tsyncEditorFocus();\n\t\t\trefresh();\n\t\t}\n\n\t\tfunction recordSingle(option: DisplayOption): void {\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (currentState().singleAnswer?.kind === \"custom\") {\n\t\t\t\t\tadvanceAfterAnswer();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tbeginCustomInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tselectSingleOption(option);\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction recordMulti(): void {\n\t\t\tconst state = currentState();\n\t\t\tif (!hasMultiAnswer(state)) {\n\t\t\t\tstate.warning = \"Select at least one option, type a custom answer, or cancel the questions.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstate.warning = undefined;\n\t\t\tadvanceAfterAnswer();\n\t\t}\n\n\t\tfunction toggleMultiOption(option: DisplayOption): void {\n\t\t\tconst state = currentState();\n\t\t\tif (option.kind === \"other\") {\n\t\t\t\tif (state.customAnswer) {\n\t\t\t\t\tstate.customAnswer.selected = !state.customAnswer.selected;\n\t\t\t\t\tclearWarning();\n\t\t\t\t} else {\n\t\t\t\t\tconst tabKey = keyLabel(\"tui.input.tab\");\n\t\t\t\t\tstate.warning = tabKey\n\t\t\t\t\t\t? `Press ${tabKey} to type a custom answer.`\n\t\t\t\t\t\t: \"Choose Type something to type a custom answer.\";\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (state.multiSelected.has(option.optionIndex)) state.multiSelected.delete(option.optionIndex);\n\t\t\telse state.multiSelected.add(option.optionIndex);\n\t\t\tclearWarning();\n\t\t}\n\n\t\tfunction finishReview(): void {\n\t\t\tconst missing = firstUnanswered(states);\n\t\t\tif (missing !== undefined) {\n\t\t\t\tsetCurrentIdx(missing);\n\t\t\t\tcurrentState().warning = \"Answer this question before submitting.\";\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"answered\" });\n\t\t}\n\n\t\teditor.onSubmit = (value) => {\n\t\t\tconst trimmed = value.trim();\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tif (trimmed.length > QUESTION_LIMITS.userTextChars) {\n\t\t\t\tstate.warning = `Keep notes and custom answers under ${QUESTION_LIMITS.userTextChars} characters.`;\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\tif (noteTarget) {\n\t\t\t\t\tif (trimmed) state.notesByOption.set(noteTarget, trimmed);\n\t\t\t\t\telse state.notesByOption.delete(noteTarget);\n\t\t\t\t}\n\t\t\t\tinputMode = undefined;\n\t\t\t\tnoteTarget = undefined;\n\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (inputMode === \"custom\") {\n\t\t\t\tif (!trimmed) {\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tstate.customAnswer = { text: trimmed, selected: true };\n\t\t\t\t\tstate.optionIndex = question.options.length;\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstate.singleAnswer = {\n\t\t\t\t\tquestionIndex: currentIdx,\n\t\t\t\t\tquestion: question.question,\n\t\t\t\t\theader: question.header,\n\t\t\t\t\tkind: \"custom\",\n\t\t\t\t\tanswer: trimmed,\n\t\t\t\t};\n\t\t\t\tinputMode = undefined;\n\t\t\t\teditor.setText(\"\");\n\t\t\t\tsyncEditorFocus();\n\t\t\t\tadvanceAfterAnswer();\n\t\t\t}\n\t\t};\n\n\t\tfunction handleReviewInput(data: string): void {\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tfinishReview();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tsetCurrentIdx(questions.length - 1);\n\t\t\t}\n\t\t}\n\n\t\tfunction handleQuestionInput(data: string): void {\n\t\t\tif (inputMode) {\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tif (inputMode === \"notes\" && notesSnapshot) {\n\t\t\t\t\t\tcurrentState().singleAnswer = notesSnapshot.prior;\n\t\t\t\t\t}\n\t\t\t\t\tinputMode = undefined;\n\t\t\t\t\tnoteTarget = undefined;\n\t\t\t\t\tnotesSnapshot = undefined;\n\t\t\t\t\teditor.setText(\"\");\n\t\t\t\t\tsyncEditorFocus();\n\t\t\t\t\trefresh();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.handleInput(data);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.editor.cursorLeft\")) {\n\t\t\t\tif (currentIdx > 0) setCurrentIdx(currentIdx - 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.editor.cursorRight\")) {\n\t\t\t\tif (currentIdx < questions.length - 1) setCurrentIdx(currentIdx + 1);\n\t\t\t\telse if (firstUnanswered(states) === undefined) showReview();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tif (keyMatches(data, \"tui.select.up\")) {\n\t\t\t\tif (footerFocused) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = options.length - 1;\n\t\t\t\t} else if (state.optionIndex > 0) {\n\t\t\t\t\tstate.optionIndex--;\n\t\t\t\t}\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.select.down\")) {\n\t\t\t\tif (footerFocused) return;\n\t\t\t\tif (state.optionIndex < options.length - 1) state.optionIndex++;\n\t\t\t\telse footerFocused = true;\n\t\t\t\tclearWarning();\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (keyMatches(data, \"tui.input.tab\")) {\n\t\t\t\tif (!footerFocused) beginNotesInput();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.length === 1 && data >= \"1\" && data <= \"9\") {\n\t\t\t\tconst index = data.charCodeAt(0) - 49;\n\t\t\t\tconst target = options[index];\n\t\t\t\tif (target) {\n\t\t\t\t\tfooterFocused = false;\n\t\t\t\t\tstate.optionIndex = index;\n\t\t\t\t\tclearWarning();\n\t\t\t\t\tif (currentQuestion().multiSelect) {\n\t\t\t\t\t\ttoggleMultiOption(target);\n\t\t\t\t\t\trefresh();\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecordSingle(target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (footerFocused) {\n\t\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"needs_clarification\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst option = options[state.optionIndex];\n\t\t\tif (question.multiSelect && keyMatches(data, \"app.list.toggle\")) {\n\t\t\t\tif (option) toggleMultiOption(option);\n\t\t\t\trefresh();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.confirm\")) {\n\t\t\t\tif (question.multiSelect) {\n\t\t\t\t\tif (option?.kind === \"other\" && !state.customAnswer) {\n\t\t\t\t\t\tbeginCustomInput();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecordMulti();\n\t\t\t\t} else if (option) recordSingle(option);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (keyMatches(data, \"tui.select.cancel\")) {\n\t\t\t\tfinish({ answers: orderedAnswers(questions, states), outcome: \"cancelled\" });\n\t\t\t}\n\t\t}\n\n\t\tfunction handleInput(data: string): void {\n\t\t\tif (view === \"review\") handleReviewInput(data);\n\t\t\telse handleQuestionInput(data);\n\t\t}\n\n\t\tfunction render(width: number): string[] {\n\t\t\treturn cache.get(width, tui.terminal.rows, compute);\n\t\t}\n\n\t\tfunction renderTabs(renderWidth: number, lines: string[]): void {\n\t\t\tif (questions.length < 2) return;\n\t\t\tconst tabCount = questions.length + 1;\n\t\t\tconst headerWidth = Math.max(4, Math.floor((renderWidth - tabCount * 5) / tabCount));\n\t\t\tconst tabs = [\n\t\t\t\t...questions.map((question, index) => {\n\t\t\t\t\tconst answered = hasAnswer(states[index]);\n\t\t\t\t\tconst label = ` ${answered ? \"■\" : \"□\"} ${truncateToWidth(question.header, headerWidth)} `;\n\t\t\t\t\tif (view === \"question\" && index === currentIdx) {\n\t\t\t\t\t\treturn theme.bg(\"selectedBg\", theme.fg(answered ? \"success\" : \"text\", label));\n\t\t\t\t\t}\n\t\t\t\t\treturn theme.fg(answered ? \"success\" : \"muted\", label);\n\t\t\t\t}),\n\t\t\t\tview === \"review\"\n\t\t\t\t\t? theme.bg(\"selectedBg\", theme.fg(\"text\", \" ✓ Submit \"))\n\t\t\t\t\t: theme.fg(firstUnanswered(states) === undefined ? \"success\" : \"dim\", \" ✓ Submit \"),\n\t\t\t].join(\" \");\n\t\t\twrapWithPrefix(\" \", tabs, renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t}\n\n\t\tfunction previewLines(previewText: string, width: number, terminalRows: number): string[] {\n\t\t\tconst maxLines = Math.max(4, Math.min(PREVIEW_MAX_LINES, terminalRows - PREVIEW_CHROME_ROWS));\n\t\t\treturn previewCache.get(previewText, width, maxLines, () => {\n\t\t\t\tconst markdown = new Markdown(previewText, 1, 0, getMarkdownTheme());\n\t\t\t\tconst rendered = markdown.render(Math.max(1, width));\n\t\t\t\tif (rendered.length <= maxLines) return rendered;\n\t\t\t\treturn [\n\t\t\t\t\t...rendered.slice(0, maxLines),\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\ttruncateToWidth(`… ${rendered.length - maxLines} preview lines hidden`, Math.max(1, width)),\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\t});\n\t\t}\n\n\t\t/** Multi-select checkbox marker; the other row shows no box until a custom answer exists. */\n\t\tfunction multiMarker(option: DisplayOption, checked: boolean, hasCustomAnswer: boolean): string {\n\t\t\tif (option.kind === \"other\" && !hasCustomAnswer) return \" \";\n\t\t\treturn checked ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t}\n\n\t\tfunction renderReview(renderWidth: number, lines: string[]): void {\n\t\t\twrapWithPrefix(\" \", theme.fg(\"accent\", \"Review answers\"), renderWidth, lines);\n\t\t\tlines.push(\"\");\n\t\t\tfor (const answer of orderedAnswers(questions, states)) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"text\", `${answer.questionIndex + 1}. ${answer.question}`),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t\tconst response =\n\t\t\t\t\tanswer.kind === \"multi\"\n\t\t\t\t\t\t? (answer.selected?.join(\", \") ?? \"(no input)\")\n\t\t\t\t\t\t: (answer.answer ?? \"(no input)\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"success\", response), renderWidth, lines);\n\t\t\t\tfor (const note of answer.notes ?? []) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", `Note for ${note.option}: ${note.text}`), renderWidth, lines);\n\t\t\t\t}\n\t\t\t\tlines.push(\"\");\n\t\t\t}\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\ttheme.fg(\n\t\t\t\t\t\"dim\",\n\t\t\t\t\tjoinHints(\n\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"submit\"),\n\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"edit last question\"),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t}\n\n\t\tfunction compute(width: number, terminalRows: number): string[] {\n\t\t\tconst lines: string[] = [];\n\t\t\tconst renderWidth = Math.max(1, width);\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\trenderTabs(renderWidth, lines);\n\n\t\t\tif (view === \"review\") {\n\t\t\t\trenderReview(renderWidth, lines);\n\t\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\t\treturn lines;\n\t\t\t}\n\n\t\t\tconst question = currentQuestion();\n\t\t\tconst state = currentState();\n\t\t\tconst options = currentOptions();\n\t\t\tconst isMulti = question.multiSelect === true;\n\t\t\tconst digitRange = `1-${Math.min(9, options.length)}`;\n\t\t\twrapWithPrefix(\n\t\t\t\t\" \",\n\t\t\t\t`${theme.fg(\"accent\", question.header)} ${theme.fg(\"text\", question.question)}`,\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tlines.push(\"\");\n\n\t\t\tconst optionLines: string[] = [];\n\t\t\tconst hasPreview = !isMulti && options.some((option) => option.kind === \"option\" && option.preview);\n\t\t\tconst showPreviewSideBySide = hasPreview && renderWidth >= 60;\n\t\t\tconst listWidth = showPreviewSideBySide ? Math.max(20, Math.floor(renderWidth * 0.4)) : renderWidth;\n\n\t\t\tfor (let index = 0; index < options.length; index++) {\n\t\t\t\tconst option = options[index];\n\t\t\t\tconst focused = !footerFocused && index === state.optionIndex;\n\t\t\t\tconst checked =\n\t\t\t\t\tisMulti &&\n\t\t\t\t\t((option.kind === \"option\" && state.multiSelected.has(option.optionIndex)) ||\n\t\t\t\t\t\t(option.kind === \"other\" && state.customAnswer?.selected === true));\n\t\t\t\tconst selectedSingle =\n\t\t\t\t\t!isMulti &&\n\t\t\t\t\t(option.kind === \"other\"\n\t\t\t\t\t\t? state.singleAnswer?.kind === \"custom\"\n\t\t\t\t\t\t: state.singleAnswer?.answer === option.label);\n\t\t\t\tconst marker = isMulti ? multiMarker(option, checked, state.customAnswer !== undefined) : \" \";\n\t\t\t\tconst focusArrow = focused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\t\tconst note =\n\t\t\t\t\toption.kind === \"option\" && state.notesByOption.has(option.label) ? theme.fg(\"success\", \" +note\") : \"\";\n\t\t\t\tconst customText =\n\t\t\t\t\toption.kind === \"other\"\n\t\t\t\t\t\t? (state.customAnswer?.text ??\n\t\t\t\t\t\t\t(state.singleAnswer?.kind === \"custom\" ? state.singleAnswer.answer : undefined))\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst labelText = customText ? `${option.label} ✎ ${customText}` : option.label;\n\t\t\t\tconst label = `${index + 1}. ${labelText}${selectedSingle ? \" ✓\" : \"\"}${note}`;\n\t\t\t\tconst color = focused ? \"accent\" : selectedSingle || checked ? \"success\" : \"text\";\n\t\t\t\twrapWithPrefix(`${focusArrow} ${marker} `, theme.fg(color, label), listWidth, optionLines);\n\t\t\t\tif (option.kind === \"option\" && option.description) {\n\t\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", option.description), listWidth, optionLines);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (inputMode) {\n\t\t\t\toptionLines.push(\"\");\n\t\t\t\tconst label = inputMode === \"notes\" ? `Notes for ${noteTarget ?? \"option\"}:` : \"Your answer:\";\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"muted\", label), listWidth, optionLines);\n\t\t\t\tfor (const line of editor.render(Math.max(1, listWidth - 2))) optionLines.push(` ${line}`);\n\t\t\t}\n\n\t\t\tif (showPreviewSideBySide) {\n\t\t\t\tconst gap = 2;\n\t\t\t\tconst rightWidth = renderWidth - listWidth - gap;\n\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\tconst rightLines = previewText\n\t\t\t\t\t? previewLines(previewText, rightWidth, terminalRows)\n\t\t\t\t\t: [theme.fg(\"dim\", \"(no preview)\")];\n\t\t\t\tconst maxRows = Math.max(optionLines.length, rightLines.length);\n\t\t\t\tconst pad = \" \".repeat(gap);\n\t\t\t\tfor (let row = 0; row < maxRows; row++) {\n\t\t\t\t\tconst left = row < optionLines.length ? optionLines[row] : \"\";\n\t\t\t\t\tconst leftPadded = left + \" \".repeat(Math.max(0, listWidth - visibleWidth(left)));\n\t\t\t\t\tconst right = row < rightLines.length ? rightLines[row] : \"\";\n\t\t\t\t\tlines.push(`${leftPadded}${pad}${right}`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlines.push(...optionLines);\n\t\t\t\tif (hasPreview) {\n\t\t\t\t\tconst focused = options[state.optionIndex];\n\t\t\t\t\tconst previewText = focused?.kind === \"option\" && focused.preview ? focused.preview : \"\";\n\t\t\t\t\tif (previewText) {\n\t\t\t\t\t\tlines.push(\"\");\n\t\t\t\t\t\tlines.push(ruleBorder(theme, renderWidth, \"dim\"));\n\t\t\t\t\t\tlines.push(...previewLines(previewText, renderWidth, terminalRows));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\"\");\n\t\t\tconst chatPrefix = footerFocused ? theme.fg(\"accent\", \"→\") : \" \";\n\t\t\twrapWithPrefix(\n\t\t\t\t`${chatPrefix} `,\n\t\t\t\ttheme.fg(footerFocused ? \"accent\" : \"text\", \"Chat about this\"),\n\t\t\t\trenderWidth,\n\t\t\t\tlines,\n\t\t\t);\n\t\t\tif (state.warning) {\n\t\t\t\tlines.push(\"\");\n\t\t\t\twrapWithPrefix(\" \", theme.fg(\"warning\", state.warning), renderWidth, lines);\n\t\t\t}\n\t\t\tlines.push(\"\");\n\t\t\tif (inputMode === \"notes\") {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(\"save notes\"), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (inputMode === \"custom\") {\n\t\t\t\tconst hint = isMulti ? \"save custom answer\" : \"continue\";\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\"dim\", joinHints(editorSubmitAction(hint), keyAction(\"tui.select.cancel\", \"back\"))),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (footerFocused) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"discuss\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.up\", \"return to options\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else if (isMulti) {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} toggle`,\n\t\t\t\t\t\t\tkeyAction(\"app.list.toggle\", \"toggle focused\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"continue\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\twrapWithPrefix(\n\t\t\t\t\t\" \",\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\tjoinHints(\n\t\t\t\t\t\t\t`${digitRange} select`,\n\t\t\t\t\t\t\tkeyAction(\"tui.input.tab\", \"notes/custom\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.confirm\", \"select\"),\n\t\t\t\t\t\t\tkeyGroupAction([\"tui.editor.cursorLeft\", \"tui.editor.cursorRight\"], \"questions\"),\n\t\t\t\t\t\t\tkeyAction(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\trenderWidth,\n\t\t\t\t\tlines,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlines.push(ruleBorder(theme, renderWidth));\n\t\t\treturn lines;\n\t\t}\n\n\t\treturn {\n\t\t\tget focused() {\n\t\t\t\treturn dialogFocused;\n\t\t\t},\n\t\t\tset focused(value: boolean) {\n\t\t\t\tdialogFocused = value;\n\t\t\t\tsyncEditorFocus();\n\t\t\t},\n\t\t\trender,\n\t\t\tinvalidate: () => {\n\t\t\t\tcache.invalidate();\n\t\t\t},\n\t\t\thandleInput,\n\t\t\tdispose() {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t},\n\t\t};\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAcnE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,EAAE,YAAY,QA6BhD","sourcesContent":["/**\n * question — ask the user structured questions during execution.\n *\n * This is a Pi-native AskUserQuestion-style tool. It keeps the UI lightweight\n * while returning a structured result envelope the model can reliably consume.\n */\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport {\n\tQUESTION_DESCRIPTION,\n\tQUESTION_LABEL,\n\tQUESTION_PROMPT_GUIDELINES,\n\tQUESTION_PROMPT_SNIPPET,\n\tQUESTION_TOOL_NAME,\n} from \"./constants.ts\";\nimport { createQuestionDialog } from \"./dialog.ts\";\nimport { renderQuestionCall, renderQuestionResult } from \"./render.ts\";\nimport { cancelResult, clarificationResult, errorResult, successResult } from \"./results.ts\";\nimport { QuestionParams, validateQuestions } from \"./schema.ts\";\nimport type { DialogResult, Question, QuestionToolDetails } from \"./types.ts\";\n\nexport default function question(pi: ExtensionAPI) {\n\tpi.registerTool<typeof QuestionParams, QuestionToolDetails>({\n\t\tname: QUESTION_TOOL_NAME,\n\t\tlabel: QUESTION_LABEL,\n\t\tdescription: QUESTION_DESCRIPTION,\n\t\tpromptSnippet: QUESTION_PROMPT_SNIPPET,\n\t\tpromptGuidelines: QUESTION_PROMPT_GUIDELINES,\n\t\tparameters: QuestionParams,\n\t\trendersOwnProgress: true,\n\t\trenderCall(args, theme, context) {\n\t\t\treturn renderQuestionCall(args, theme, context.expanded);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\treturn renderQuestionResult(result, options, theme, context.args);\n\t\t},\n\n\t\tasync execute(_toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst questions = params.questions as Question[];\n\t\t\tif (!ctx.hasUI || ctx.mode !== \"tui\") return errorResult(\"no_ui\", \"question tool requires an interactive TUI\");\n\n\t\t\tconst validation = validateQuestions(questions);\n\t\t\tif (!validation.ok) return errorResult(validation.error, validation.message);\n\n\t\t\tconst result = await ctx.ui.custom<DialogResult>(createQuestionDialog(questions, signal));\n\t\t\tif (result.outcome === \"cancelled\") return cancelResult(result.answers);\n\t\t\tif (result.outcome === \"needs_clarification\") return clarificationResult(result.answers);\n\t\t\treturn successResult(result.answers);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAcnE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,EAAE,YAAY,QA6BhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/question/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACN,oBAAoB,EACpB,cAAc,EACd,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAgB,EAAE;IAClD,EAAE,CAAC,YAAY,CAA6C;QAC3D,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,oBAAoB;QACjC,aAAa,EAAE,uBAAuB;QACtC,gBAAgB,EAAE,0BAA0B;QAC5C,UAAU,EAAE,cAAc;QAC1B,kBAAkB,EAAE,IAAI;QACxB,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;YAChC,OAAO,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAAA,CACzD;QACD,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;YAC7C,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAAA,CAClE;QAED,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;YAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAuB,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;gBAAE,OAAO,WAAW,CAAC,OAAO,EAAE,2CAA2C,CAAC,CAAC;YAE/G,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAe,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1F,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW;gBAAE,OAAO,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC,OAAO,KAAK,qBAAqB;gBAAE,OAAO,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzF,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAA,CACrC;KACD,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\n * question — ask the user structured questions during execution.\n *\n * This is a Pi-native AskUserQuestion-style tool. It keeps the UI lightweight\n * while returning a structured result envelope the model can reliably consume.\n */\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport {\n\tQUESTION_DESCRIPTION,\n\tQUESTION_LABEL,\n\tQUESTION_PROMPT_GUIDELINES,\n\tQUESTION_PROMPT_SNIPPET,\n\tQUESTION_TOOL_NAME,\n} from \"./constants.ts\";\nimport { createQuestionDialog } from \"./dialog.ts\";\nimport { renderQuestionCall, renderQuestionResult } from \"./render.ts\";\nimport { cancelResult, clarificationResult, errorResult, successResult } from \"./results.ts\";\nimport { QuestionParams, validateQuestions } from \"./schema.ts\";\nimport type { DialogResult, Question, QuestionToolDetails } from \"./types.ts\";\n\nexport default function question(pi: ExtensionAPI) {\n\tpi.registerTool<typeof QuestionParams, QuestionToolDetails>({\n\t\tname: QUESTION_TOOL_NAME,\n\t\tlabel: QUESTION_LABEL,\n\t\tdescription: QUESTION_DESCRIPTION,\n\t\tpromptSnippet: QUESTION_PROMPT_SNIPPET,\n\t\tpromptGuidelines: QUESTION_PROMPT_GUIDELINES,\n\t\tparameters: QuestionParams,\n\t\trendersOwnProgress: true,\n\t\trenderCall(args, theme, context) {\n\t\t\treturn renderQuestionCall(args, theme, context.expanded);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\treturn renderQuestionResult(result, options, theme, context.args);\n\t\t},\n\n\t\tasync execute(_toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst questions = params.questions as Question[];\n\t\t\tif (!ctx.hasUI || ctx.mode !== \"tui\") return errorResult(\"no_ui\", \"question tool requires an interactive TUI\");\n\n\t\t\tconst validation = validateQuestions(questions);\n\t\t\tif (!validation.ok) return errorResult(validation.error, validation.message);\n\n\t\t\tconst result = await ctx.ui.custom<DialogResult>(createQuestionDialog(questions, signal));\n\t\t\tif (result.outcome === \"cancelled\") return cancelResult(result.answers);\n\t\t\tif (result.outcome === \"needs_clarification\") return clarificationResult(result.answers);\n\t\t\treturn successResult(result.answers);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/question/index.ts"],"names":[],"mappings":"AAOA,OAAO,EACN,oBAAoB,EACpB,cAAc,EACd,0BAA0B,EAC1B,uBAAuB,EACvB,kBAAkB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAgB;IAChD,EAAE,CAAC,YAAY,CAA6C;QAC3D,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,oBAAoB;QACjC,aAAa,EAAE,uBAAuB;QACtC,gBAAgB,EAAE,0BAA0B;QAC5C,UAAU,EAAE,cAAc;QAC1B,kBAAkB,EAAE,IAAI;QACxB,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO;YAC9B,OAAO,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;YAC3C,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACnE,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;YACxD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAuB,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;gBAAE,OAAO,WAAW,CAAC,OAAO,EAAE,2CAA2C,CAAC,CAAC;YAE/G,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAe,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1F,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW;gBAAE,OAAO,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC,OAAO,KAAK,qBAAqB;gBAAE,OAAO,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzF,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;KACD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * question — ask the user structured questions during execution.\n *\n * This is a Pi-native AskUserQuestion-style tool. It keeps the UI lightweight\n * while returning a structured result envelope the model can reliably consume.\n */\nimport type { ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport {\n\tQUESTION_DESCRIPTION,\n\tQUESTION_LABEL,\n\tQUESTION_PROMPT_GUIDELINES,\n\tQUESTION_PROMPT_SNIPPET,\n\tQUESTION_TOOL_NAME,\n} from \"./constants.ts\";\nimport { createQuestionDialog } from \"./dialog.ts\";\nimport { renderQuestionCall, renderQuestionResult } from \"./render.ts\";\nimport { cancelResult, clarificationResult, errorResult, successResult } from \"./results.ts\";\nimport { QuestionParams, validateQuestions } from \"./schema.ts\";\nimport type { DialogResult, Question, QuestionToolDetails } from \"./types.ts\";\n\nexport default function question(pi: ExtensionAPI) {\n\tpi.registerTool<typeof QuestionParams, QuestionToolDetails>({\n\t\tname: QUESTION_TOOL_NAME,\n\t\tlabel: QUESTION_LABEL,\n\t\tdescription: QUESTION_DESCRIPTION,\n\t\tpromptSnippet: QUESTION_PROMPT_SNIPPET,\n\t\tpromptGuidelines: QUESTION_PROMPT_GUIDELINES,\n\t\tparameters: QuestionParams,\n\t\trendersOwnProgress: true,\n\t\trenderCall(args, theme, context) {\n\t\t\treturn renderQuestionCall(args, theme, context.expanded);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\treturn renderQuestionResult(result, options, theme, context.args);\n\t\t},\n\n\t\tasync execute(_toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst questions = params.questions as Question[];\n\t\t\tif (!ctx.hasUI || ctx.mode !== \"tui\") return errorResult(\"no_ui\", \"question tool requires an interactive TUI\");\n\n\t\t\tconst validation = validateQuestions(questions);\n\t\t\tif (!validation.ok) return errorResult(validation.error, validation.message);\n\n\t\t\tconst result = await ctx.ui.custom<DialogResult>(createQuestionDialog(questions, signal));\n\t\t\tif (result.outcome === \"cancelled\") return cancelResult(result.answers);\n\t\t\tif (result.outcome === \"needs_clarification\") return clarificationResult(result.answers);\n\t\t\treturn successResult(result.answers);\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe;;;;;;;;CAQlB,CAAC;AAEX,eAAO,MAAM,oBAAoB,8EAA8E,CAAC","sourcesContent":["export const QUESTION_LIMITS = {\n\tquestionChars: 400,\n\theaderChars: 32,\n\toptionLabelChars: 80,\n\toptionDescriptionChars: 300,\n\tpreviewChars: 8_000,\n\tuserTextChars: 4_000,\n\tmodelResultChars: 12_000,\n} as const;\n\nexport const TRUNCATION_FOLLOW_UP = \"Ask the user a focused follow-up question to clarify the omitted portion.\";\n"]}
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/limits.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe;;;;;;;;CAQlB,CAAC;AAEX,eAAO,MAAM,oBAAoB,8EAA8E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"render-cache.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,EAAE,CAa3F;CACD;AAED,yDAAyD;AACzD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IAEzC,UAAU,IAAI,IAAI,CAEjB;IAED,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE,CAOjG;CACD","sourcesContent":["/**\n * Memoize rendered preview lines by (previewText, width, maxLines) so editor\n * keystrokes don't re-parse the preview markdown on every frame. Questions are\n * immutable for a dialog's lifetime and carry few previews, so no eviction.\n */\nexport class PreviewLinesCache {\n\tprivate cache = new Map<string, Map<string, string[]>>();\n\n\tget(previewText: string, width: number, maxLines: number, compute: () => string[]): string[] {\n\t\tlet byDimensions = this.cache.get(previewText);\n\t\tif (!byDimensions) {\n\t\t\tbyDimensions = new Map();\n\t\t\tthis.cache.set(previewText, byDimensions);\n\t\t}\n\t\tconst key = `${width}x${maxLines}`;\n\t\tlet lines = byDimensions.get(key);\n\t\tif (!lines) {\n\t\t\tlines = compute();\n\t\t\tbyDimensions.set(key, lines);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\n/** Cache custom dialog output by terminal dimensions. */\nexport class WidthCachedRender {\n\tprivate cachedLines: string[] | undefined;\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedHeight: number | undefined;\n\n\tinvalidate(): void {\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tget(width: number, height: number, compute: (width: number, height: number) => string[]): string[] {\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === width && this.cachedHeight === height)\n\t\t\treturn this.cachedLines;\n\t\tthis.cachedLines = compute(width, height);\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedHeight = height;\n\t\treturn this.cachedLines;\n\t}\n}\n"]}
1
+ {"version":3,"file":"render-cache.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,KAAK,CAA4C;IAEzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,GAAG,MAAM,EAAE;CAc5F;AAED,yDAAyD;AACzD,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,YAAY,CAAqB;IAEzC,UAAU,IAAI,IAAI;IAIlB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE;CAQlG"}
@@ -4,7 +4,9 @@
4
4
  * immutable for a dialog's lifetime and carry few previews, so no eviction.
5
5
  */
6
6
  export class PreviewLinesCache {
7
- cache = new Map();
7
+ constructor() {
8
+ this.cache = new Map();
9
+ }
8
10
  get(previewText, width, maxLines, compute) {
9
11
  let byDimensions = this.cache.get(previewText);
10
12
  if (!byDimensions) {
@@ -22,9 +24,6 @@ export class PreviewLinesCache {
22
24
  }
23
25
  /** Cache custom dialog output by terminal dimensions. */
24
26
  export class WidthCachedRender {
25
- cachedLines;
26
- cachedWidth;
27
- cachedHeight;
28
27
  invalidate() {
29
28
  this.cachedLines = undefined;
30
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACrB,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEzD,GAAG,CAAC,WAAmB,EAAE,KAAa,EAAE,QAAgB,EAAE,OAAuB,EAAY;QAC5F,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,OAAO,EAAE,CAAC;YAClB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;CACD;AAED,yDAAyD;AACzD,MAAM,OAAO,iBAAiB;IACrB,WAAW,CAAuB;IAClC,WAAW,CAAqB;IAChC,YAAY,CAAqB;IAEzC,UAAU,GAAS;QAClB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAAA,CAC7B;IAED,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,OAAoD,EAAY;QAClG,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM;YAC/F,OAAO,IAAI,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;IAAA,CACxB;CACD","sourcesContent":["/**\n * Memoize rendered preview lines by (previewText, width, maxLines) so editor\n * keystrokes don't re-parse the preview markdown on every frame. Questions are\n * immutable for a dialog's lifetime and carry few previews, so no eviction.\n */\nexport class PreviewLinesCache {\n\tprivate cache = new Map<string, Map<string, string[]>>();\n\n\tget(previewText: string, width: number, maxLines: number, compute: () => string[]): string[] {\n\t\tlet byDimensions = this.cache.get(previewText);\n\t\tif (!byDimensions) {\n\t\t\tbyDimensions = new Map();\n\t\t\tthis.cache.set(previewText, byDimensions);\n\t\t}\n\t\tconst key = `${width}x${maxLines}`;\n\t\tlet lines = byDimensions.get(key);\n\t\tif (!lines) {\n\t\t\tlines = compute();\n\t\t\tbyDimensions.set(key, lines);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\n/** Cache custom dialog output by terminal dimensions. */\nexport class WidthCachedRender {\n\tprivate cachedLines: string[] | undefined;\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedHeight: number | undefined;\n\n\tinvalidate(): void {\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tget(width: number, height: number, compute: (width: number, height: number) => string[]): string[] {\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === width && this.cachedHeight === height)\n\t\t\treturn this.cachedLines;\n\t\tthis.cachedLines = compute(width, height);\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedHeight = height;\n\t\treturn this.cachedLines;\n\t}\n}\n"]}
1
+ {"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../src/extensions/question/render-cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACS,UAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;IAgB1D,CAAC;IAdA,GAAG,CAAC,WAAmB,EAAE,KAAa,EAAE,QAAgB,EAAE,OAAuB;QAChF,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,OAAO,EAAE,CAAC;YAClB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAED,yDAAyD;AACzD,MAAM,OAAO,iBAAiB;IAK7B,UAAU;QACT,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,OAAoD;QACtF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM;YAC/F,OAAO,IAAI,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;CACD","sourcesContent":["/**\n * Memoize rendered preview lines by (previewText, width, maxLines) so editor\n * keystrokes don't re-parse the preview markdown on every frame. Questions are\n * immutable for a dialog's lifetime and carry few previews, so no eviction.\n */\nexport class PreviewLinesCache {\n\tprivate cache = new Map<string, Map<string, string[]>>();\n\n\tget(previewText: string, width: number, maxLines: number, compute: () => string[]): string[] {\n\t\tlet byDimensions = this.cache.get(previewText);\n\t\tif (!byDimensions) {\n\t\t\tbyDimensions = new Map();\n\t\t\tthis.cache.set(previewText, byDimensions);\n\t\t}\n\t\tconst key = `${width}x${maxLines}`;\n\t\tlet lines = byDimensions.get(key);\n\t\tif (!lines) {\n\t\t\tlines = compute();\n\t\t\tbyDimensions.set(key, lines);\n\t\t}\n\t\treturn lines;\n\t}\n}\n\n/** Cache custom dialog output by terminal dimensions. */\nexport class WidthCachedRender {\n\tprivate cachedLines: string[] | undefined;\n\tprivate cachedWidth: number | undefined;\n\tprivate cachedHeight: number | undefined;\n\n\tinvalidate(): void {\n\t\tthis.cachedLines = undefined;\n\t}\n\n\tget(width: number, height: number, compute: (width: number, height: number) => string[]): string[] {\n\t\tif (this.cachedLines !== undefined && this.cachedWidth === width && this.cachedHeight === height)\n\t\t\treturn this.cachedLines;\n\t\tthis.cachedLines = compute(width, height);\n\t\tthis.cachedWidth = width;\n\t\tthis.cachedHeight = height;\n\t\treturn this.cachedLines;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAKpE,KAAK,aAAa,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3C,KAAK,UAAU,GAAG;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAuMF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAavF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAqBnH","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { answerScalar } from \"./results.ts\";\nimport type { QuestionAnswer, QuestionOutcome } from \"./types.ts\";\n\ntype RenderOptions = { expanded: boolean };\n\ntype ResultLike = {\n\tcontent?: unknown;\n\tdetails?: unknown;\n};\n\ninterface RenderQuestion {\n\theader: string;\n\tquestion: string;\n\tmultiSelect: boolean;\n}\n\ninterface RenderDetails {\n\tanswers: QuestionAnswer[];\n\toutcome: QuestionOutcome;\n\tmessage?: string;\n}\n\nconst MAX_RENDERED_QUESTIONS = 4;\nconst MAX_RENDERED_ANSWERS = 4;\nconst MAX_RENDERED_SELECTIONS = 5;\nconst MAX_RENDERED_ANSWER_CHARS = 400;\nconst MAX_RENDERED_NOTE_CHARS = 400;\nconst MAX_RENDERED_ERROR_CHARS = 400;\nconst MAX_RENDERED_VALIDATION_SUMMARY_CHARS = 240;\nconst MAX_RENDERED_FALLBACK_CHARS = 1_000;\n\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction safeValue(record: Record<string, unknown>, key: string): unknown {\n\ttry {\n\t\treturn record[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction truncate(text: string, limit: number): string {\n\treturn text.length > limit ? `${text.slice(0, Math.max(0, limit - 1))}…` : text;\n}\n\nfunction oneLine(value: unknown, limit: number): string {\n\treturn typeof value === \"string\" ? truncate(value.replace(/\\s+/gu, \" \").trim(), limit) : \"\";\n}\n\nfunction questionsFromArgs(args: unknown): RenderQuestion[] {\n\tconst record = safeRecord(args);\n\tif (!record) return [];\n\tconst rawQuestions = safeValue(record, \"questions\");\n\tif (!Array.isArray(rawQuestions)) return [];\n\tconst questions: RenderQuestion[] = [];\n\tfor (const rawQuestion of rawQuestions.slice(0, MAX_RENDERED_QUESTIONS)) {\n\t\tconst question = safeRecord(rawQuestion);\n\t\tif (!question) continue;\n\t\tconst rawHeader = safeValue(question, \"header\");\n\t\tif (typeof rawHeader !== \"string\") continue;\n\t\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${questions.length + 1}`;\n\t\tquestions.push({\n\t\t\theader,\n\t\t\tquestion: oneLine(safeValue(question, \"question\"), QUESTION_LIMITS.questionChars),\n\t\t\tmultiSelect: safeValue(question, \"multiSelect\") === true,\n\t\t});\n\t}\n\treturn questions;\n}\n\nfunction resultFallback(result: ResultLike): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\tconst blocks: string[] = [];\n\tfor (const rawBlock of result.content.slice(0, 8)) {\n\t\tconst block = safeRecord(rawBlock);\n\t\tif (!block || safeValue(block, \"type\") !== \"text\") continue;\n\t\tconst text = safeValue(block, \"text\");\n\t\tif (typeof text === \"string\") blocks.push(text);\n\t}\n\treturn truncate(blocks.join(\"\\n\"), MAX_RENDERED_FALLBACK_CHARS);\n}\n\nfunction validationSummary(text: string): { summary: string; hiddenErrors: number } | undefined {\n\tconst match = /^Validation failed for tool\\s+\"question\":\\s*([\\s\\S]*?)(?:\\r?\\n\\s*\\r?\\nReceived arguments:|$)/u.exec(\n\t\ttext.trim(),\n\t);\n\tif (!match) return undefined;\n\tconst errors = match[1]\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim().replace(/^-\\s*/u, \"\"))\n\t\t.filter(Boolean);\n\tconst firstError = oneLine(errors[0], MAX_RENDERED_VALIDATION_SUMMARY_CHARS) || \"schema validation failed\";\n\treturn {\n\t\tsummary: `Invalid arguments · ${firstError}`,\n\t\thiddenErrors: Math.max(0, errors.length - 1),\n\t};\n}\n\nfunction renderFallbackResult(result: ResultLike, expanded: boolean, theme: Theme): Text {\n\tconst fallback = resultFallback(result);\n\tif (!fallback) return new Text(\"Question result unavailable\", 0, 0);\n\tconst validation = validationSummary(fallback);\n\tif (!validation || expanded) return new Text(fallback, 0, 0);\n\n\tconst moreErrors = validation.hiddenErrors > 0 ? ` · +${validation.hiddenErrors} more` : \"\";\n\tconst expandKey = keyLabel(\"app.tools.expand\");\n\tconst hint = theme.fg(\"muted\", expandKey ? ` (${expandKey} to expand)` : \" (more details available)\");\n\treturn new Text(`${theme.fg(\"error\", validation.summary)}${theme.fg(\"muted\", moreErrors)}${hint}`, 0, 0);\n}\n\nfunction normalizeAnswer(value: unknown, index: number): QuestionAnswer | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst rawHeader = safeValue(raw, \"header\");\n\tif (typeof rawHeader !== \"string\") return undefined;\n\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${index + 1}`;\n\tconst kindValue = safeValue(raw, \"kind\");\n\tconst kind = kindValue === \"multi\" || kindValue === \"custom\" ? kindValue : \"option\";\n\tconst rawIndex = safeValue(raw, \"questionIndex\");\n\tconst questionIndex =\n\t\ttypeof rawIndex === \"number\" && Number.isSafeInteger(rawIndex) && rawIndex >= 0 ? rawIndex : index;\n\tconst question = oneLine(safeValue(raw, \"question\"), QUESTION_LIMITS.questionChars);\n\tconst answer = oneLine(safeValue(raw, \"answer\"), MAX_RENDERED_ANSWER_CHARS);\n\n\tconst rawSelected = safeValue(raw, \"selected\");\n\tconst selected = Array.isArray(rawSelected)\n\t\t? rawSelected\n\t\t\t\t.slice(0, MAX_RENDERED_SELECTIONS)\n\t\t\t\t.map((entry, selectedIndex) => {\n\t\t\t\t\tif (typeof entry !== \"string\") return \"\";\n\t\t\t\t\treturn oneLine(entry, MAX_RENDERED_ANSWER_CHARS) || `Option ${selectedIndex + 1}`;\n\t\t\t\t})\n\t\t\t\t.filter(Boolean)\n\t\t: undefined;\n\tconst rawNotes = safeValue(raw, \"notes\");\n\tconst notes = Array.isArray(rawNotes)\n\t\t? rawNotes\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst note = safeRecord(entry);\n\t\t\t\t\tif (!note) return undefined;\n\t\t\t\t\tconst option = oneLine(safeValue(note, \"option\"), QUESTION_LIMITS.optionLabelChars);\n\t\t\t\t\tconst text = oneLine(safeValue(note, \"text\"), MAX_RENDERED_NOTE_CHARS);\n\t\t\t\t\treturn option && text ? { option, text } : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((note): note is { option: string; text: string } => note !== undefined)\n\t\t: undefined;\n\n\treturn {\n\t\tquestionIndex,\n\t\tquestion,\n\t\theader,\n\t\tkind,\n\t\tanswer: answer || null,\n\t\t...(kind === \"multi\" && selected?.length ? { selected } : {}),\n\t\t...(notes?.length ? { notes } : {}),\n\t};\n}\n\nfunction normalizeDetails(value: unknown): RenderDetails | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst outcome = safeValue(raw, \"outcome\");\n\tif (outcome !== \"answered\" && outcome !== \"cancelled\" && outcome !== \"needs_clarification\" && outcome !== \"error\") {\n\t\treturn undefined;\n\t}\n\tconst rawAnswers = safeValue(raw, \"answers\");\n\tconst answers = Array.isArray(rawAnswers)\n\t\t? rawAnswers\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((answer, index) => normalizeAnswer(answer, index))\n\t\t\t\t.filter((answer): answer is QuestionAnswer => answer !== undefined)\n\t\t: [];\n\tconst message = oneLine(safeValue(raw, \"message\"), MAX_RENDERED_ERROR_CHARS);\n\treturn { answers, outcome, ...(message ? { message } : {}) };\n}\n\nfunction errorMessage(result: ResultLike, details: RenderDetails): string {\n\tif (details.message) return details.message;\n\tconst fallback = resultFallback(result).trim();\n\tconst match = /^Question tool error \\([^)]*\\):\\s*([\\s\\S]+)$/u.exec(fallback);\n\treturn truncate(match?.[1]?.trim() || \"The question tool could not continue\", MAX_RENDERED_ERROR_CHARS);\n}\n\nfunction answerLines(answers: QuestionAnswer[], theme: Theme): string[] {\n\treturn answers.map((answer) => {\n\t\tconst notes = answer.notes?.length\n\t\t\t? `\\n${answer.notes.map((note) => theme.fg(\"muted\", ` Note for ${note.option}: ${note.text}`)).join(\"\\n\")}`\n\t\t\t: \"\";\n\t\treturn `${theme.fg(\"accent\", answer.header)}: ${theme.fg(\"text\", answerScalar(answer))}${notes}`;\n\t});\n}\n\nfunction renderOutcome(title: string, details: RenderDetails, expanded: boolean, theme: Theme): Text {\n\tif (!expanded || details.answers.length === 0) return new Text(title, 0, 0);\n\treturn new Text(`${title}\\n${answerLines(details.answers, theme).join(\"\\n\")}`, 0, 0);\n}\n\nfunction answerProgress(details: RenderDetails, args: unknown): string {\n\tconst total = questionsFromArgs(args).length;\n\treturn total > 0 ? `answered ${details.answers.length} of ${total}` : `answered ${details.answers.length}`;\n}\n\nexport function renderQuestionCall(args: unknown, theme: Theme, expanded: boolean): Text {\n\tconst questions = questionsFromArgs(args);\n\tconst headers = questions.map((question) => question.header).join(\", \");\n\tconst count = `${questions.length} decision${questions.length === 1 ? \"\" : \"s\"}`;\n\tconst summary = questions.length === 0 ? \"asking for a decision\" : headers ? `${count}: ${headers}` : count;\n\tconst title = `${theme.fg(\"toolTitle\", theme.bold(\"question\"))} ${theme.fg(\"muted\", summary)}`;\n\tif (!expanded || questions.length === 0) return new Text(title, 0, 0);\n\tconst detailLines = questions.map((question) => {\n\t\tconst multi = question.multiSelect ? \" (multi-select)\" : \"\";\n\t\tconst body = question.question ? `: ${question.question}` : \"\";\n\t\treturn theme.fg(\"dim\", `${question.header}${multi}${body}`);\n\t});\n\treturn new Text(`${title}\\n${detailLines.join(\"\\n\")}`, 0, 0);\n}\n\nexport function renderQuestionResult(result: ResultLike, options: RenderOptions, theme: Theme, args?: unknown): Text {\n\tconst details = normalizeDetails(result.details);\n\tif (!details) return renderFallbackResult(result, options.expanded, theme);\n\n\tif (details.outcome === \"error\") {\n\t\treturn new Text(theme.fg(\"error\", `Question error: ${errorMessage(result, details)}`), 0, 0);\n\t}\n\tif (details.outcome === \"cancelled\") {\n\t\tconst title = theme.fg(\"warning\", `Cancelled · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\tif (details.outcome === \"needs_clarification\") {\n\t\tconst title = theme.fg(\"warning\", `Wants to discuss · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\n\tconst title = theme.fg(\n\t\t\"success\",\n\t\t`✓ Answered ${details.answers.length} decision${details.answers.length === 1 ? \"\" : \"s\"}`,\n\t);\n\treturn renderOutcome(title, details, options.expanded, theme);\n}\n"]}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAKpE,KAAK,aAAa,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3C,KAAK,UAAU,GAAG;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAuMF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAavF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAqBnH"}
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { answerScalar } from \"./results.ts\";\nimport type { QuestionAnswer, QuestionOutcome } from \"./types.ts\";\n\ntype RenderOptions = { expanded: boolean };\n\ntype ResultLike = {\n\tcontent?: unknown;\n\tdetails?: unknown;\n};\n\ninterface RenderQuestion {\n\theader: string;\n\tquestion: string;\n\tmultiSelect: boolean;\n}\n\ninterface RenderDetails {\n\tanswers: QuestionAnswer[];\n\toutcome: QuestionOutcome;\n\tmessage?: string;\n}\n\nconst MAX_RENDERED_QUESTIONS = 4;\nconst MAX_RENDERED_ANSWERS = 4;\nconst MAX_RENDERED_SELECTIONS = 5;\nconst MAX_RENDERED_ANSWER_CHARS = 400;\nconst MAX_RENDERED_NOTE_CHARS = 400;\nconst MAX_RENDERED_ERROR_CHARS = 400;\nconst MAX_RENDERED_VALIDATION_SUMMARY_CHARS = 240;\nconst MAX_RENDERED_FALLBACK_CHARS = 1_000;\n\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction safeValue(record: Record<string, unknown>, key: string): unknown {\n\ttry {\n\t\treturn record[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction truncate(text: string, limit: number): string {\n\treturn text.length > limit ? `${text.slice(0, Math.max(0, limit - 1))}…` : text;\n}\n\nfunction oneLine(value: unknown, limit: number): string {\n\treturn typeof value === \"string\" ? truncate(value.replace(/\\s+/gu, \" \").trim(), limit) : \"\";\n}\n\nfunction questionsFromArgs(args: unknown): RenderQuestion[] {\n\tconst record = safeRecord(args);\n\tif (!record) return [];\n\tconst rawQuestions = safeValue(record, \"questions\");\n\tif (!Array.isArray(rawQuestions)) return [];\n\tconst questions: RenderQuestion[] = [];\n\tfor (const rawQuestion of rawQuestions.slice(0, MAX_RENDERED_QUESTIONS)) {\n\t\tconst question = safeRecord(rawQuestion);\n\t\tif (!question) continue;\n\t\tconst rawHeader = safeValue(question, \"header\");\n\t\tif (typeof rawHeader !== \"string\") continue;\n\t\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${questions.length + 1}`;\n\t\tquestions.push({\n\t\t\theader,\n\t\t\tquestion: oneLine(safeValue(question, \"question\"), QUESTION_LIMITS.questionChars),\n\t\t\tmultiSelect: safeValue(question, \"multiSelect\") === true,\n\t\t});\n\t}\n\treturn questions;\n}\n\nfunction resultFallback(result: ResultLike): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\tconst blocks: string[] = [];\n\tfor (const rawBlock of result.content.slice(0, 8)) {\n\t\tconst block = safeRecord(rawBlock);\n\t\tif (!block || safeValue(block, \"type\") !== \"text\") continue;\n\t\tconst text = safeValue(block, \"text\");\n\t\tif (typeof text === \"string\") blocks.push(text);\n\t}\n\treturn truncate(blocks.join(\"\\n\"), MAX_RENDERED_FALLBACK_CHARS);\n}\n\nfunction validationSummary(text: string): { summary: string; hiddenErrors: number } | undefined {\n\tconst match = /^Validation failed for tool\\s+\"question\":\\s*([\\s\\S]*?)(?:\\r?\\n\\s*\\r?\\nReceived arguments:|$)/u.exec(\n\t\ttext.trim(),\n\t);\n\tif (!match) return undefined;\n\tconst errors = match[1]\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim().replace(/^-\\s*/u, \"\"))\n\t\t.filter(Boolean);\n\tconst firstError = oneLine(errors[0], MAX_RENDERED_VALIDATION_SUMMARY_CHARS) || \"schema validation failed\";\n\treturn {\n\t\tsummary: `Invalid arguments · ${firstError}`,\n\t\thiddenErrors: Math.max(0, errors.length - 1),\n\t};\n}\n\nfunction renderFallbackResult(result: ResultLike, expanded: boolean, theme: Theme): Text {\n\tconst fallback = resultFallback(result);\n\tif (!fallback) return new Text(\"Question result unavailable\", 0, 0);\n\tconst validation = validationSummary(fallback);\n\tif (!validation || expanded) return new Text(fallback, 0, 0);\n\n\tconst moreErrors = validation.hiddenErrors > 0 ? ` · +${validation.hiddenErrors} more` : \"\";\n\tconst expandKey = keyLabel(\"app.tools.expand\");\n\tconst hint = theme.fg(\"muted\", expandKey ? ` (${expandKey} to expand)` : \" (more details available)\");\n\treturn new Text(`${theme.fg(\"error\", validation.summary)}${theme.fg(\"muted\", moreErrors)}${hint}`, 0, 0);\n}\n\nfunction normalizeAnswer(value: unknown, index: number): QuestionAnswer | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst rawHeader = safeValue(raw, \"header\");\n\tif (typeof rawHeader !== \"string\") return undefined;\n\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${index + 1}`;\n\tconst kindValue = safeValue(raw, \"kind\");\n\tconst kind = kindValue === \"multi\" || kindValue === \"custom\" ? kindValue : \"option\";\n\tconst rawIndex = safeValue(raw, \"questionIndex\");\n\tconst questionIndex =\n\t\ttypeof rawIndex === \"number\" && Number.isSafeInteger(rawIndex) && rawIndex >= 0 ? rawIndex : index;\n\tconst question = oneLine(safeValue(raw, \"question\"), QUESTION_LIMITS.questionChars);\n\tconst answer = oneLine(safeValue(raw, \"answer\"), MAX_RENDERED_ANSWER_CHARS);\n\n\tconst rawSelected = safeValue(raw, \"selected\");\n\tconst selected = Array.isArray(rawSelected)\n\t\t? rawSelected\n\t\t\t\t.slice(0, MAX_RENDERED_SELECTIONS)\n\t\t\t\t.map((entry, selectedIndex) => {\n\t\t\t\t\tif (typeof entry !== \"string\") return \"\";\n\t\t\t\t\treturn oneLine(entry, MAX_RENDERED_ANSWER_CHARS) || `Option ${selectedIndex + 1}`;\n\t\t\t\t})\n\t\t\t\t.filter(Boolean)\n\t\t: undefined;\n\tconst rawNotes = safeValue(raw, \"notes\");\n\tconst notes = Array.isArray(rawNotes)\n\t\t? rawNotes\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst note = safeRecord(entry);\n\t\t\t\t\tif (!note) return undefined;\n\t\t\t\t\tconst option = oneLine(safeValue(note, \"option\"), QUESTION_LIMITS.optionLabelChars);\n\t\t\t\t\tconst text = oneLine(safeValue(note, \"text\"), MAX_RENDERED_NOTE_CHARS);\n\t\t\t\t\treturn option && text ? { option, text } : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((note): note is { option: string; text: string } => note !== undefined)\n\t\t: undefined;\n\n\treturn {\n\t\tquestionIndex,\n\t\tquestion,\n\t\theader,\n\t\tkind,\n\t\tanswer: answer || null,\n\t\t...(kind === \"multi\" && selected?.length ? { selected } : {}),\n\t\t...(notes?.length ? { notes } : {}),\n\t};\n}\n\nfunction normalizeDetails(value: unknown): RenderDetails | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst outcome = safeValue(raw, \"outcome\");\n\tif (outcome !== \"answered\" && outcome !== \"cancelled\" && outcome !== \"needs_clarification\" && outcome !== \"error\") {\n\t\treturn undefined;\n\t}\n\tconst rawAnswers = safeValue(raw, \"answers\");\n\tconst answers = Array.isArray(rawAnswers)\n\t\t? rawAnswers\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((answer, index) => normalizeAnswer(answer, index))\n\t\t\t\t.filter((answer): answer is QuestionAnswer => answer !== undefined)\n\t\t: [];\n\tconst message = oneLine(safeValue(raw, \"message\"), MAX_RENDERED_ERROR_CHARS);\n\treturn { answers, outcome, ...(message ? { message } : {}) };\n}\n\nfunction errorMessage(result: ResultLike, details: RenderDetails): string {\n\tif (details.message) return details.message;\n\tconst fallback = resultFallback(result).trim();\n\tconst match = /^Question tool error \\([^)]*\\):\\s*([\\s\\S]+)$/u.exec(fallback);\n\treturn truncate(match?.[1]?.trim() || \"The question tool could not continue\", MAX_RENDERED_ERROR_CHARS);\n}\n\nfunction answerLines(answers: QuestionAnswer[], theme: Theme): string[] {\n\treturn answers.map((answer) => {\n\t\tconst notes = answer.notes?.length\n\t\t\t? `\\n${answer.notes.map((note) => theme.fg(\"muted\", ` Note for ${note.option}: ${note.text}`)).join(\"\\n\")}`\n\t\t\t: \"\";\n\t\treturn `${theme.fg(\"accent\", answer.header)}: ${theme.fg(\"text\", answerScalar(answer))}${notes}`;\n\t});\n}\n\nfunction renderOutcome(title: string, details: RenderDetails, expanded: boolean, theme: Theme): Text {\n\tif (!expanded || details.answers.length === 0) return new Text(title, 0, 0);\n\treturn new Text(`${title}\\n${answerLines(details.answers, theme).join(\"\\n\")}`, 0, 0);\n}\n\nfunction answerProgress(details: RenderDetails, args: unknown): string {\n\tconst total = questionsFromArgs(args).length;\n\treturn total > 0 ? `answered ${details.answers.length} of ${total}` : `answered ${details.answers.length}`;\n}\n\nexport function renderQuestionCall(args: unknown, theme: Theme, expanded: boolean): Text {\n\tconst questions = questionsFromArgs(args);\n\tconst headers = questions.map((question) => question.header).join(\", \");\n\tconst count = `${questions.length} decision${questions.length === 1 ? \"\" : \"s\"}`;\n\tconst summary = questions.length === 0 ? \"asking for a decision\" : headers ? `${count}: ${headers}` : count;\n\tconst title = `${theme.fg(\"toolTitle\", theme.bold(\"question\"))} ${theme.fg(\"muted\", summary)}`;\n\tif (!expanded || questions.length === 0) return new Text(title, 0, 0);\n\tconst detailLines = questions.map((question) => {\n\t\tconst multi = question.multiSelect ? \" (multi-select)\" : \"\";\n\t\tconst body = question.question ? `: ${question.question}` : \"\";\n\t\treturn theme.fg(\"dim\", `${question.header}${multi}${body}`);\n\t});\n\treturn new Text(`${title}\\n${detailLines.join(\"\\n\")}`, 0, 0);\n}\n\nexport function renderQuestionResult(result: ResultLike, options: RenderOptions, theme: Theme, args?: unknown): Text {\n\tconst details = normalizeDetails(result.details);\n\tif (!details) return renderFallbackResult(result, options.expanded, theme);\n\n\tif (details.outcome === \"error\") {\n\t\treturn new Text(theme.fg(\"error\", `Question error: ${errorMessage(result, details)}`), 0, 0);\n\t}\n\tif (details.outcome === \"cancelled\") {\n\t\tconst title = theme.fg(\"warning\", `Cancelled · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\tif (details.outcome === \"needs_clarification\") {\n\t\tconst title = theme.fg(\"warning\", `Wants to discuss · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\n\tconst title = theme.fg(\n\t\t\"success\",\n\t\t`✓ Answered ${details.answers.length} decision${details.answers.length === 1 ? \"\" : \"s\"}`,\n\t);\n\treturn renderOutcome(title, details, options.expanded, theme);\n}\n"]}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/question/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport { answerScalar } from \"./results.ts\";\nimport type { QuestionAnswer, QuestionOutcome } from \"./types.ts\";\n\ntype RenderOptions = { expanded: boolean };\n\ntype ResultLike = {\n\tcontent?: unknown;\n\tdetails?: unknown;\n};\n\ninterface RenderQuestion {\n\theader: string;\n\tquestion: string;\n\tmultiSelect: boolean;\n}\n\ninterface RenderDetails {\n\tanswers: QuestionAnswer[];\n\toutcome: QuestionOutcome;\n\tmessage?: string;\n}\n\nconst MAX_RENDERED_QUESTIONS = 4;\nconst MAX_RENDERED_ANSWERS = 4;\nconst MAX_RENDERED_SELECTIONS = 5;\nconst MAX_RENDERED_ANSWER_CHARS = 400;\nconst MAX_RENDERED_NOTE_CHARS = 400;\nconst MAX_RENDERED_ERROR_CHARS = 400;\nconst MAX_RENDERED_VALIDATION_SUMMARY_CHARS = 240;\nconst MAX_RENDERED_FALLBACK_CHARS = 1_000;\n\nfunction safeRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction safeValue(record: Record<string, unknown>, key: string): unknown {\n\ttry {\n\t\treturn record[key];\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction truncate(text: string, limit: number): string {\n\treturn text.length > limit ? `${text.slice(0, Math.max(0, limit - 1))}…` : text;\n}\n\nfunction oneLine(value: unknown, limit: number): string {\n\treturn typeof value === \"string\" ? truncate(value.replace(/\\s+/gu, \" \").trim(), limit) : \"\";\n}\n\nfunction questionsFromArgs(args: unknown): RenderQuestion[] {\n\tconst record = safeRecord(args);\n\tif (!record) return [];\n\tconst rawQuestions = safeValue(record, \"questions\");\n\tif (!Array.isArray(rawQuestions)) return [];\n\tconst questions: RenderQuestion[] = [];\n\tfor (const rawQuestion of rawQuestions.slice(0, MAX_RENDERED_QUESTIONS)) {\n\t\tconst question = safeRecord(rawQuestion);\n\t\tif (!question) continue;\n\t\tconst rawHeader = safeValue(question, \"header\");\n\t\tif (typeof rawHeader !== \"string\") continue;\n\t\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${questions.length + 1}`;\n\t\tquestions.push({\n\t\t\theader,\n\t\t\tquestion: oneLine(safeValue(question, \"question\"), QUESTION_LIMITS.questionChars),\n\t\t\tmultiSelect: safeValue(question, \"multiSelect\") === true,\n\t\t});\n\t}\n\treturn questions;\n}\n\nfunction resultFallback(result: ResultLike): string {\n\tif (!Array.isArray(result.content)) return \"\";\n\tconst blocks: string[] = [];\n\tfor (const rawBlock of result.content.slice(0, 8)) {\n\t\tconst block = safeRecord(rawBlock);\n\t\tif (!block || safeValue(block, \"type\") !== \"text\") continue;\n\t\tconst text = safeValue(block, \"text\");\n\t\tif (typeof text === \"string\") blocks.push(text);\n\t}\n\treturn truncate(blocks.join(\"\\n\"), MAX_RENDERED_FALLBACK_CHARS);\n}\n\nfunction validationSummary(text: string): { summary: string; hiddenErrors: number } | undefined {\n\tconst match = /^Validation failed for tool\\s+\"question\":\\s*([\\s\\S]*?)(?:\\r?\\n\\s*\\r?\\nReceived arguments:|$)/u.exec(\n\t\ttext.trim(),\n\t);\n\tif (!match) return undefined;\n\tconst errors = match[1]\n\t\t.split(/\\r?\\n/u)\n\t\t.map((line) => line.trim().replace(/^-\\s*/u, \"\"))\n\t\t.filter(Boolean);\n\tconst firstError = oneLine(errors[0], MAX_RENDERED_VALIDATION_SUMMARY_CHARS) || \"schema validation failed\";\n\treturn {\n\t\tsummary: `Invalid arguments · ${firstError}`,\n\t\thiddenErrors: Math.max(0, errors.length - 1),\n\t};\n}\n\nfunction renderFallbackResult(result: ResultLike, expanded: boolean, theme: Theme): Text {\n\tconst fallback = resultFallback(result);\n\tif (!fallback) return new Text(\"Question result unavailable\", 0, 0);\n\tconst validation = validationSummary(fallback);\n\tif (!validation || expanded) return new Text(fallback, 0, 0);\n\n\tconst moreErrors = validation.hiddenErrors > 0 ? ` · +${validation.hiddenErrors} more` : \"\";\n\tconst expandKey = keyLabel(\"app.tools.expand\");\n\tconst hint = theme.fg(\"muted\", expandKey ? ` (${expandKey} to expand)` : \" (more details available)\");\n\treturn new Text(`${theme.fg(\"error\", validation.summary)}${theme.fg(\"muted\", moreErrors)}${hint}`, 0, 0);\n}\n\nfunction normalizeAnswer(value: unknown, index: number): QuestionAnswer | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst rawHeader = safeValue(raw, \"header\");\n\tif (typeof rawHeader !== \"string\") return undefined;\n\tconst header = oneLine(rawHeader, QUESTION_LIMITS.headerChars) || `Decision ${index + 1}`;\n\tconst kindValue = safeValue(raw, \"kind\");\n\tconst kind = kindValue === \"multi\" || kindValue === \"custom\" ? kindValue : \"option\";\n\tconst rawIndex = safeValue(raw, \"questionIndex\");\n\tconst questionIndex =\n\t\ttypeof rawIndex === \"number\" && Number.isSafeInteger(rawIndex) && rawIndex >= 0 ? rawIndex : index;\n\tconst question = oneLine(safeValue(raw, \"question\"), QUESTION_LIMITS.questionChars);\n\tconst answer = oneLine(safeValue(raw, \"answer\"), MAX_RENDERED_ANSWER_CHARS);\n\n\tconst rawSelected = safeValue(raw, \"selected\");\n\tconst selected = Array.isArray(rawSelected)\n\t\t? rawSelected\n\t\t\t\t.slice(0, MAX_RENDERED_SELECTIONS)\n\t\t\t\t.map((entry, selectedIndex) => {\n\t\t\t\t\tif (typeof entry !== \"string\") return \"\";\n\t\t\t\t\treturn oneLine(entry, MAX_RENDERED_ANSWER_CHARS) || `Option ${selectedIndex + 1}`;\n\t\t\t\t})\n\t\t\t\t.filter(Boolean)\n\t\t: undefined;\n\tconst rawNotes = safeValue(raw, \"notes\");\n\tconst notes = Array.isArray(rawNotes)\n\t\t? rawNotes\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst note = safeRecord(entry);\n\t\t\t\t\tif (!note) return undefined;\n\t\t\t\t\tconst option = oneLine(safeValue(note, \"option\"), QUESTION_LIMITS.optionLabelChars);\n\t\t\t\t\tconst text = oneLine(safeValue(note, \"text\"), MAX_RENDERED_NOTE_CHARS);\n\t\t\t\t\treturn option && text ? { option, text } : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((note): note is { option: string; text: string } => note !== undefined)\n\t\t: undefined;\n\n\treturn {\n\t\tquestionIndex,\n\t\tquestion,\n\t\theader,\n\t\tkind,\n\t\tanswer: answer || null,\n\t\t...(kind === \"multi\" && selected?.length ? { selected } : {}),\n\t\t...(notes?.length ? { notes } : {}),\n\t};\n}\n\nfunction normalizeDetails(value: unknown): RenderDetails | undefined {\n\tconst raw = safeRecord(value);\n\tif (!raw) return undefined;\n\tconst outcome = safeValue(raw, \"outcome\");\n\tif (outcome !== \"answered\" && outcome !== \"cancelled\" && outcome !== \"needs_clarification\" && outcome !== \"error\") {\n\t\treturn undefined;\n\t}\n\tconst rawAnswers = safeValue(raw, \"answers\");\n\tconst answers = Array.isArray(rawAnswers)\n\t\t? rawAnswers\n\t\t\t\t.slice(0, MAX_RENDERED_ANSWERS)\n\t\t\t\t.map((answer, index) => normalizeAnswer(answer, index))\n\t\t\t\t.filter((answer): answer is QuestionAnswer => answer !== undefined)\n\t\t: [];\n\tconst message = oneLine(safeValue(raw, \"message\"), MAX_RENDERED_ERROR_CHARS);\n\treturn { answers, outcome, ...(message ? { message } : {}) };\n}\n\nfunction errorMessage(result: ResultLike, details: RenderDetails): string {\n\tif (details.message) return details.message;\n\tconst fallback = resultFallback(result).trim();\n\tconst match = /^Question tool error \\([^)]*\\):\\s*([\\s\\S]+)$/u.exec(fallback);\n\treturn truncate(match?.[1]?.trim() || \"The question tool could not continue\", MAX_RENDERED_ERROR_CHARS);\n}\n\nfunction answerLines(answers: QuestionAnswer[], theme: Theme): string[] {\n\treturn answers.map((answer) => {\n\t\tconst notes = answer.notes?.length\n\t\t\t? `\\n${answer.notes.map((note) => theme.fg(\"muted\", ` Note for ${note.option}: ${note.text}`)).join(\"\\n\")}`\n\t\t\t: \"\";\n\t\treturn `${theme.fg(\"accent\", answer.header)}: ${theme.fg(\"text\", answerScalar(answer))}${notes}`;\n\t});\n}\n\nfunction renderOutcome(title: string, details: RenderDetails, expanded: boolean, theme: Theme): Text {\n\tif (!expanded || details.answers.length === 0) return new Text(title, 0, 0);\n\treturn new Text(`${title}\\n${answerLines(details.answers, theme).join(\"\\n\")}`, 0, 0);\n}\n\nfunction answerProgress(details: RenderDetails, args: unknown): string {\n\tconst total = questionsFromArgs(args).length;\n\treturn total > 0 ? `answered ${details.answers.length} of ${total}` : `answered ${details.answers.length}`;\n}\n\nexport function renderQuestionCall(args: unknown, theme: Theme, expanded: boolean): Text {\n\tconst questions = questionsFromArgs(args);\n\tconst headers = questions.map((question) => question.header).join(\", \");\n\tconst count = `${questions.length} decision${questions.length === 1 ? \"\" : \"s\"}`;\n\tconst summary = questions.length === 0 ? \"asking for a decision\" : headers ? `${count}: ${headers}` : count;\n\tconst title = `${theme.fg(\"toolTitle\", theme.bold(\"question\"))} ${theme.fg(\"muted\", summary)}`;\n\tif (!expanded || questions.length === 0) return new Text(title, 0, 0);\n\tconst detailLines = questions.map((question) => {\n\t\tconst multi = question.multiSelect ? \" (multi-select)\" : \"\";\n\t\tconst body = question.question ? `: ${question.question}` : \"\";\n\t\treturn theme.fg(\"dim\", `${question.header}${multi}${body}`);\n\t});\n\treturn new Text(`${title}\\n${detailLines.join(\"\\n\")}`, 0, 0);\n}\n\nexport function renderQuestionResult(result: ResultLike, options: RenderOptions, theme: Theme, args?: unknown): Text {\n\tconst details = normalizeDetails(result.details);\n\tif (!details) return renderFallbackResult(result, options.expanded, theme);\n\n\tif (details.outcome === \"error\") {\n\t\treturn new Text(theme.fg(\"error\", `Question error: ${errorMessage(result, details)}`), 0, 0);\n\t}\n\tif (details.outcome === \"cancelled\") {\n\t\tconst title = theme.fg(\"warning\", `Cancelled · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\tif (details.outcome === \"needs_clarification\") {\n\t\tconst title = theme.fg(\"warning\", `Wants to discuss · ${answerProgress(details, args)}`);\n\t\treturn renderOutcome(title, details, options.expanded, theme);\n\t}\n\n\tconst title = theme.fg(\n\t\t\"success\",\n\t\t`✓ Answered ${details.answers.length} decision${details.answers.length === 1 ? \"\" : \"s\"}`,\n\t);\n\treturn renderOutcome(title, details, options.expanded, theme);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoBzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAQ3G;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAG3D;AAiBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAS7F;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,cAAc,EAAO,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAOjG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,cAAc,EAAO,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAYxG","sourcesContent":["import type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport { QUESTION_LIMITS, TRUNCATION_FOLLOW_UP } from \"./limits.ts\";\nimport type { QuestionAnswer, QuestionToolDetails, QuestionToolError } from \"./types.ts\";\n\nconst DECLINE_MESSAGE = \"User declined to answer the questions.\";\nconst CLARIFICATION_MESSAGE = \"The user wants to discuss these questions before choosing an answer.\";\nconst ENVELOPE_PREFIX = \"User decisions:\";\nconst ENVELOPE_SUFFIX = \"Continue with these decisions in mind.\";\n\nfunction buildToolResult(text: string, details: QuestionToolDetails): AgentToolResult<QuestionToolDetails> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails,\n\t};\n}\n\nfunction boundedText(text: string): string {\n\tif (text.length <= QUESTION_LIMITS.modelResultChars) return text;\n\tconst suffix = `\\n\\n[Question result truncated. ${TRUNCATION_FOLLOW_UP}]`;\n\treturn `${text.slice(0, Math.max(0, QUESTION_LIMITS.modelResultChars - suffix.length))}${suffix}`;\n}\n\nexport function errorResult(error: QuestionToolError, message: string): AgentToolResult<QuestionToolDetails> {\n\treturn buildToolResult(`Question tool error (${error}): ${message}`, {\n\t\tanswers: [],\n\t\toutcome: \"error\",\n\t\tcancelled: false,\n\t\terror,\n\t\tmessage,\n\t});\n}\n\nexport function answerScalar(answer: QuestionAnswer): string {\n\tif (answer.kind === \"multi\") return answer.selected?.length ? answer.selected.join(\", \") : \"(no input)\";\n\treturn answer.answer && answer.answer.length > 0 ? answer.answer : \"(no input)\";\n}\n\nfunction answerKindLabel(answer: QuestionAnswer): string {\n\tif (answer.kind === \"multi\") return \"Selections\";\n\treturn answer.kind === \"custom\" ? \"Custom answer\" : \"Selected option\";\n}\n\nfunction answerSegment(answer: QuestionAnswer): string {\n\tconst lines = [\n\t\t`${answer.questionIndex + 1}. [${answer.header}] ${answer.question}`,\n\t\t` ${answerKindLabel(answer)}: ${answerScalar(answer)}`,\n\t];\n\tif (answer.preview) lines.push(\" Preview: selected (kept in tool details)\");\n\tfor (const note of answer.notes ?? []) lines.push(` Note for ${note.option}: ${note.text}`);\n\treturn lines.join(\"\\n\");\n}\n\nexport function successResult(answers: QuestionAnswer[]): AgentToolResult<QuestionToolDetails> {\n\tconst text = answers.length\n\t\t? boundedText(`${ENVELOPE_PREFIX}\\n${answers.map(answerSegment).join(\"\\n\\n\")}\\n\\n${ENVELOPE_SUFFIX}`)\n\t\t: DECLINE_MESSAGE;\n\treturn buildToolResult(text, {\n\t\tanswers,\n\t\toutcome: answers.length ? \"answered\" : \"cancelled\",\n\t\tcancelled: answers.length === 0,\n\t});\n}\n\nexport function cancelResult(answers: QuestionAnswer[] = []): AgentToolResult<QuestionToolDetails> {\n\tconst answered = answers.length ? `\\n\\nPartial answers so far:\\n${answers.map(answerSegment).join(\"\\n\\n\")}` : \"\";\n\treturn buildToolResult(boundedText(`${DECLINE_MESSAGE}${answered}`), {\n\t\tanswers,\n\t\toutcome: \"cancelled\",\n\t\tcancelled: true,\n\t});\n}\n\nexport function clarificationResult(answers: QuestionAnswer[] = []): AgentToolResult<QuestionToolDetails> {\n\tconst answered = answers.length ? ` Partial answers so far:\\n${answers.map(answerSegment).join(\"\\n\\n\")}` : \"\";\n\treturn buildToolResult(\n\t\tboundedText(\n\t\t\t`${CLARIFICATION_MESSAGE}${answered}\\n\\nExplain the trade-offs or ask what the user would like clarified.`,\n\t\t),\n\t\t{\n\t\t\tanswers,\n\t\t\toutcome: \"needs_clarification\",\n\t\t\tcancelled: false,\n\t\t},\n\t);\n}\n"]}
1
+ {"version":3,"file":"results.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoBzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAQ3G;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAG3D;AAiBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAS7F;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,cAAc,EAAO,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAOjG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,cAAc,EAAO,GAAG,eAAe,CAAC,mBAAmB,CAAC,CAYxG"}
@@ -1 +1 @@
1
- {"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/extensions/question/results.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport { QUESTION_LIMITS, TRUNCATION_FOLLOW_UP } from \"./limits.ts\";\nimport type { QuestionAnswer, QuestionToolDetails, QuestionToolError } from \"./types.ts\";\n\nconst DECLINE_MESSAGE = \"User declined to answer the questions.\";\nconst CLARIFICATION_MESSAGE = \"The user wants to discuss these questions before choosing an answer.\";\nconst ENVELOPE_PREFIX = \"User decisions:\";\nconst ENVELOPE_SUFFIX = \"Continue with these decisions in mind.\";\n\nfunction buildToolResult(text: string, details: QuestionToolDetails): AgentToolResult<QuestionToolDetails> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails,\n\t};\n}\n\nfunction boundedText(text: string): string {\n\tif (text.length <= QUESTION_LIMITS.modelResultChars) return text;\n\tconst suffix = `\\n\\n[Question result truncated. ${TRUNCATION_FOLLOW_UP}]`;\n\treturn `${text.slice(0, Math.max(0, QUESTION_LIMITS.modelResultChars - suffix.length))}${suffix}`;\n}\n\nexport function errorResult(error: QuestionToolError, message: string): AgentToolResult<QuestionToolDetails> {\n\treturn buildToolResult(`Question tool error (${error}): ${message}`, {\n\t\tanswers: [],\n\t\toutcome: \"error\",\n\t\tcancelled: false,\n\t\terror,\n\t\tmessage,\n\t});\n}\n\nexport function answerScalar(answer: QuestionAnswer): string {\n\tif (answer.kind === \"multi\") return answer.selected?.length ? answer.selected.join(\", \") : \"(no input)\";\n\treturn answer.answer && answer.answer.length > 0 ? answer.answer : \"(no input)\";\n}\n\nfunction answerKindLabel(answer: QuestionAnswer): string {\n\tif (answer.kind === \"multi\") return \"Selections\";\n\treturn answer.kind === \"custom\" ? \"Custom answer\" : \"Selected option\";\n}\n\nfunction answerSegment(answer: QuestionAnswer): string {\n\tconst lines = [\n\t\t`${answer.questionIndex + 1}. [${answer.header}] ${answer.question}`,\n\t\t` ${answerKindLabel(answer)}: ${answerScalar(answer)}`,\n\t];\n\tif (answer.preview) lines.push(\" Preview: selected (kept in tool details)\");\n\tfor (const note of answer.notes ?? []) lines.push(` Note for ${note.option}: ${note.text}`);\n\treturn lines.join(\"\\n\");\n}\n\nexport function successResult(answers: QuestionAnswer[]): AgentToolResult<QuestionToolDetails> {\n\tconst text = answers.length\n\t\t? boundedText(`${ENVELOPE_PREFIX}\\n${answers.map(answerSegment).join(\"\\n\\n\")}\\n\\n${ENVELOPE_SUFFIX}`)\n\t\t: DECLINE_MESSAGE;\n\treturn buildToolResult(text, {\n\t\tanswers,\n\t\toutcome: answers.length ? \"answered\" : \"cancelled\",\n\t\tcancelled: answers.length === 0,\n\t});\n}\n\nexport function cancelResult(answers: QuestionAnswer[] = []): AgentToolResult<QuestionToolDetails> {\n\tconst answered = answers.length ? `\\n\\nPartial answers so far:\\n${answers.map(answerSegment).join(\"\\n\\n\")}` : \"\";\n\treturn buildToolResult(boundedText(`${DECLINE_MESSAGE}${answered}`), {\n\t\tanswers,\n\t\toutcome: \"cancelled\",\n\t\tcancelled: true,\n\t});\n}\n\nexport function clarificationResult(answers: QuestionAnswer[] = []): AgentToolResult<QuestionToolDetails> {\n\tconst answered = answers.length ? ` Partial answers so far:\\n${answers.map(answerSegment).join(\"\\n\\n\")}` : \"\";\n\treturn buildToolResult(\n\t\tboundedText(\n\t\t\t`${CLARIFICATION_MESSAGE}${answered}\\n\\nExplain the trade-offs or ask what the user would like clarified.`,\n\t\t),\n\t\t{\n\t\t\tanswers,\n\t\t\toutcome: \"needs_clarification\",\n\t\t\tcancelled: false,\n\t\t},\n\t);\n}\n"]}
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../../src/extensions/question/results.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"../../core/extensions/types.ts\";\nimport { QUESTION_LIMITS, TRUNCATION_FOLLOW_UP } from \"./limits.ts\";\nimport type { QuestionAnswer, QuestionToolDetails, QuestionToolError } from \"./types.ts\";\n\nconst DECLINE_MESSAGE = \"User declined to answer the questions.\";\nconst CLARIFICATION_MESSAGE = \"The user wants to discuss these questions before choosing an answer.\";\nconst ENVELOPE_PREFIX = \"User decisions:\";\nconst ENVELOPE_SUFFIX = \"Continue with these decisions in mind.\";\n\nfunction buildToolResult(text: string, details: QuestionToolDetails): AgentToolResult<QuestionToolDetails> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text }],\n\t\tdetails,\n\t};\n}\n\nfunction boundedText(text: string): string {\n\tif (text.length <= QUESTION_LIMITS.modelResultChars) return text;\n\tconst suffix = `\\n\\n[Question result truncated. ${TRUNCATION_FOLLOW_UP}]`;\n\treturn `${text.slice(0, Math.max(0, QUESTION_LIMITS.modelResultChars - suffix.length))}${suffix}`;\n}\n\nexport function errorResult(error: QuestionToolError, message: string): AgentToolResult<QuestionToolDetails> {\n\treturn buildToolResult(`Question tool error (${error}): ${message}`, {\n\t\tanswers: [],\n\t\toutcome: \"error\",\n\t\tcancelled: false,\n\t\terror,\n\t\tmessage,\n\t});\n}\n\nexport function answerScalar(answer: QuestionAnswer): string {\n\tif (answer.kind === \"multi\") return answer.selected?.length ? answer.selected.join(\", \") : \"(no input)\";\n\treturn answer.answer && answer.answer.length > 0 ? answer.answer : \"(no input)\";\n}\n\nfunction answerKindLabel(answer: QuestionAnswer): string {\n\tif (answer.kind === \"multi\") return \"Selections\";\n\treturn answer.kind === \"custom\" ? \"Custom answer\" : \"Selected option\";\n}\n\nfunction answerSegment(answer: QuestionAnswer): string {\n\tconst lines = [\n\t\t`${answer.questionIndex + 1}. [${answer.header}] ${answer.question}`,\n\t\t` ${answerKindLabel(answer)}: ${answerScalar(answer)}`,\n\t];\n\tif (answer.preview) lines.push(\" Preview: selected (kept in tool details)\");\n\tfor (const note of answer.notes ?? []) lines.push(` Note for ${note.option}: ${note.text}`);\n\treturn lines.join(\"\\n\");\n}\n\nexport function successResult(answers: QuestionAnswer[]): AgentToolResult<QuestionToolDetails> {\n\tconst text = answers.length\n\t\t? boundedText(`${ENVELOPE_PREFIX}\\n${answers.map(answerSegment).join(\"\\n\\n\")}\\n\\n${ENVELOPE_SUFFIX}`)\n\t\t: DECLINE_MESSAGE;\n\treturn buildToolResult(text, {\n\t\tanswers,\n\t\toutcome: answers.length ? \"answered\" : \"cancelled\",\n\t\tcancelled: answers.length === 0,\n\t});\n}\n\nexport function cancelResult(answers: QuestionAnswer[] = []): AgentToolResult<QuestionToolDetails> {\n\tconst answered = answers.length ? `\\n\\nPartial answers so far:\\n${answers.map(answerSegment).join(\"\\n\\n\")}` : \"\";\n\treturn buildToolResult(boundedText(`${DECLINE_MESSAGE}${answered}`), {\n\t\tanswers,\n\t\toutcome: \"cancelled\",\n\t\tcancelled: true,\n\t});\n}\n\nexport function clarificationResult(answers: QuestionAnswer[] = []): AgentToolResult<QuestionToolDetails> {\n\tconst answered = answers.length ? ` Partial answers so far:\\n${answers.map(answerSegment).join(\"\\n\\n\")}` : \"\";\n\treturn buildToolResult(\n\t\tboundedText(\n\t\t\t`${CLARIFICATION_MESSAGE}${answered}\\n\\nExplain the trade-offs or ask what the user would like clarified.`,\n\t\t),\n\t\t{\n\t\t\tanswers,\n\t\t\toutcome: \"needs_clarification\",\n\t\t\tcancelled: false,\n\t\t},\n\t);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAkB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoD9E,eAAO,MAAM,cAAc;;;;;;;;;;;EAMzB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,SAAS,EAAE,QAAQ,EAAE,GACnB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAwCzE","sourcesContent":["import { Type } from \"typebox\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport type { Question, QuestionOption, QuestionToolError } from \"./types.ts\";\n\nconst MIN_OPTIONS = 2;\nconst MAX_OPTIONS = 4;\nconst MAX_QUESTIONS = 4;\nconst RESERVED_LABELS = [\"Other\", \"Type something\", \"Type something.\", \"Chat about this\"] as const;\n\nconst normalizeLabel = (text: string) => text.trim().toLowerCase();\nconst RESERVED_NORMALIZED = new Set(RESERVED_LABELS.map(normalizeLabel));\n\nconst OptionSchema = Type.Object({\n\tlabel: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.optionLabelChars,\n\t\tdescription:\n\t\t\t\"Short user-facing option label (1-5 words), distinct within the question. Reserved labels ('Other', 'Type something', 'Chat about this') are rejected — the UI adds the custom-answer path itself.\",\n\t}),\n\tdescription: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.optionDescriptionChars,\n\t\tdescription: \"One concise sentence explaining the option's meaning, consequence, or tradeoff.\",\n\t}),\n\tpreview: Type.Optional(\n\t\tType.String({\n\t\t\tmaxLength: QUESTION_LIMITS.previewChars,\n\t\t\tdescription:\n\t\t\t\t\"Optional markdown preview shown only for focused single-select options; use for concrete snippets, layouts, copy, or config comparisons.\",\n\t\t}),\n\t),\n});\n\nconst QuestionSchema = Type.Object({\n\tquestion: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.questionChars,\n\t\tdescription:\n\t\t\t\"One clear, specific decision or preference question ending in a question mark. Ask only what is needed to proceed.\",\n\t}),\n\theader: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.headerChars,\n\t\tdescription: \"Very short decision label shown as a chip; aim for ~12 chars, max 32. E.g. 'Auth method'.\",\n\t}),\n\toptions: Type.Array(OptionSchema, {\n\t\tminItems: MIN_OPTIONS,\n\t\tmaxItems: MAX_OPTIONS,\n\t\tdescription: \"Mutually distinct options for this decision; do not include reserved custom-answer labels.\",\n\t}),\n\tmultiSelect: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Allow selecting multiple options only when choices can be combined. Defaults to false for mutually exclusive decisions.\",\n\t\t}),\n\t),\n});\n\nexport const QuestionParams = Type.Object({\n\tquestions: Type.Array(QuestionSchema, {\n\t\tminItems: 1,\n\t\tmaxItems: MAX_QUESTIONS,\n\t\tdescription: \"Related decisions to ask now (1-4); ask only what is needed to unblock progress.\",\n\t}),\n});\n\n/**\n * Checks the schema cannot express. Length and count limits are omitted:\n * the agent core validates params against `QuestionParams` before execute runs.\n */\nexport function validateQuestions(\n\tquestions: Question[],\n): { ok: true } | { ok: false; error: QuestionToolError; message: string } {\n\tconst seenQuestions = new Set<string>();\n\tfor (const q of questions) {\n\t\tconst questionKey = normalizeLabel(q.question);\n\t\tif (seenQuestions.has(questionKey)) {\n\t\t\treturn { ok: false, error: \"duplicate_question\", message: \"Question text must be unique\" };\n\t\t}\n\t\tseenQuestions.add(questionKey);\n\n\t\tif (q.multiSelect && q.options.some((option) => option.preview)) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: \"preview_multiselect\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"Option previews are not supported on multiSelect questions; drop the previews or make the question single-select\",\n\t\t\t};\n\t\t}\n\n\t\tconst seenLabels = new Set<string>();\n\t\tfor (const option of q.options as QuestionOption[]) {\n\t\t\tconst labelKey = normalizeLabel(option.label);\n\t\t\tif (RESERVED_NORMALIZED.has(labelKey)) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"reserved_label\",\n\t\t\t\t\tmessage: `Option label is reserved (${RESERVED_LABELS.join(\", \")})`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (seenLabels.has(labelKey)) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"duplicate_option_label\",\n\t\t\t\t\tmessage: \"Option labels must be unique within a question\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tseenLabels.add(labelKey);\n\t\t}\n\t}\n\n\treturn { ok: true };\n}\n"]}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/extensions/question/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,KAAK,EAAE,QAAQ,EAAkB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoD9E,eAAO,MAAM,cAAc;;;;;;;;;;;EAMzB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,SAAS,EAAE,QAAQ,EAAE,GACnB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAwCzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/extensions/question/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport type { Question, QuestionOption, QuestionToolError } from \"./types.ts\";\n\nconst MIN_OPTIONS = 2;\nconst MAX_OPTIONS = 4;\nconst MAX_QUESTIONS = 4;\nconst RESERVED_LABELS = [\"Other\", \"Type something\", \"Type something.\", \"Chat about this\"] as const;\n\nconst normalizeLabel = (text: string) => text.trim().toLowerCase();\nconst RESERVED_NORMALIZED = new Set(RESERVED_LABELS.map(normalizeLabel));\n\nconst OptionSchema = Type.Object({\n\tlabel: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.optionLabelChars,\n\t\tdescription:\n\t\t\t\"Short user-facing option label (1-5 words), distinct within the question. Reserved labels ('Other', 'Type something', 'Chat about this') are rejected — the UI adds the custom-answer path itself.\",\n\t}),\n\tdescription: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.optionDescriptionChars,\n\t\tdescription: \"One concise sentence explaining the option's meaning, consequence, or tradeoff.\",\n\t}),\n\tpreview: Type.Optional(\n\t\tType.String({\n\t\t\tmaxLength: QUESTION_LIMITS.previewChars,\n\t\t\tdescription:\n\t\t\t\t\"Optional markdown preview shown only for focused single-select options; use for concrete snippets, layouts, copy, or config comparisons.\",\n\t\t}),\n\t),\n});\n\nconst QuestionSchema = Type.Object({\n\tquestion: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.questionChars,\n\t\tdescription:\n\t\t\t\"One clear, specific decision or preference question ending in a question mark. Ask only what is needed to proceed.\",\n\t}),\n\theader: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.headerChars,\n\t\tdescription: \"Very short decision label shown as a chip; aim for ~12 chars, max 32. E.g. 'Auth method'.\",\n\t}),\n\toptions: Type.Array(OptionSchema, {\n\t\tminItems: MIN_OPTIONS,\n\t\tmaxItems: MAX_OPTIONS,\n\t\tdescription: \"Mutually distinct options for this decision; do not include reserved custom-answer labels.\",\n\t}),\n\tmultiSelect: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Allow selecting multiple options only when choices can be combined. Defaults to false for mutually exclusive decisions.\",\n\t\t}),\n\t),\n});\n\nexport const QuestionParams = Type.Object({\n\tquestions: Type.Array(QuestionSchema, {\n\t\tminItems: 1,\n\t\tmaxItems: MAX_QUESTIONS,\n\t\tdescription: \"Related decisions to ask now (1-4); ask only what is needed to unblock progress.\",\n\t}),\n});\n\n/**\n * Checks the schema cannot express. Length and count limits are omitted:\n * the agent core validates params against `QuestionParams` before execute runs.\n */\nexport function validateQuestions(\n\tquestions: Question[],\n): { ok: true } | { ok: false; error: QuestionToolError; message: string } {\n\tconst seenQuestions = new Set<string>();\n\tfor (const q of questions) {\n\t\tconst questionKey = normalizeLabel(q.question);\n\t\tif (seenQuestions.has(questionKey)) {\n\t\t\treturn { ok: false, error: \"duplicate_question\", message: \"Question text must be unique\" };\n\t\t}\n\t\tseenQuestions.add(questionKey);\n\n\t\tif (q.multiSelect && q.options.some((option) => option.preview)) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: \"preview_multiselect\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"Option previews are not supported on multiSelect questions; drop the previews or make the question single-select\",\n\t\t\t};\n\t\t}\n\n\t\tconst seenLabels = new Set<string>();\n\t\tfor (const option of q.options as QuestionOption[]) {\n\t\t\tconst labelKey = normalizeLabel(option.label);\n\t\t\tif (RESERVED_NORMALIZED.has(labelKey)) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"reserved_label\",\n\t\t\t\t\tmessage: `Option label is reserved (${RESERVED_LABELS.join(\", \")})`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (seenLabels.has(labelKey)) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"duplicate_option_label\",\n\t\t\t\t\tmessage: \"Option labels must be unique within a question\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tseenLabels.add(labelKey);\n\t\t}\n\t}\n\n\treturn { ok: true };\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/extensions/question/schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { Type } from \"typebox\";\nimport { QUESTION_LIMITS } from \"./limits.ts\";\nimport type { Question, QuestionOption, QuestionToolError } from \"./types.ts\";\n\nconst MIN_OPTIONS = 2;\nconst MAX_OPTIONS = 4;\nconst MAX_QUESTIONS = 4;\nconst RESERVED_LABELS = [\"Other\", \"Type something\", \"Type something.\", \"Chat about this\"] as const;\n\nconst normalizeLabel = (text: string) => text.trim().toLowerCase();\nconst RESERVED_NORMALIZED = new Set(RESERVED_LABELS.map(normalizeLabel));\n\nconst OptionSchema = Type.Object({\n\tlabel: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.optionLabelChars,\n\t\tdescription:\n\t\t\t\"Short user-facing option label (1-5 words), distinct within the question. Reserved labels ('Other', 'Type something', 'Chat about this') are rejected — the UI adds the custom-answer path itself.\",\n\t}),\n\tdescription: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.optionDescriptionChars,\n\t\tdescription: \"One concise sentence explaining the option's meaning, consequence, or tradeoff.\",\n\t}),\n\tpreview: Type.Optional(\n\t\tType.String({\n\t\t\tmaxLength: QUESTION_LIMITS.previewChars,\n\t\t\tdescription:\n\t\t\t\t\"Optional markdown preview shown only for focused single-select options; use for concrete snippets, layouts, copy, or config comparisons.\",\n\t\t}),\n\t),\n});\n\nconst QuestionSchema = Type.Object({\n\tquestion: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.questionChars,\n\t\tdescription:\n\t\t\t\"One clear, specific decision or preference question ending in a question mark. Ask only what is needed to proceed.\",\n\t}),\n\theader: Type.String({\n\t\tmaxLength: QUESTION_LIMITS.headerChars,\n\t\tdescription: \"Very short decision label shown as a chip; aim for ~12 chars, max 32. E.g. 'Auth method'.\",\n\t}),\n\toptions: Type.Array(OptionSchema, {\n\t\tminItems: MIN_OPTIONS,\n\t\tmaxItems: MAX_OPTIONS,\n\t\tdescription: \"Mutually distinct options for this decision; do not include reserved custom-answer labels.\",\n\t}),\n\tmultiSelect: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Allow selecting multiple options only when choices can be combined. Defaults to false for mutually exclusive decisions.\",\n\t\t}),\n\t),\n});\n\nexport const QuestionParams = Type.Object({\n\tquestions: Type.Array(QuestionSchema, {\n\t\tminItems: 1,\n\t\tmaxItems: MAX_QUESTIONS,\n\t\tdescription: \"Related decisions to ask now (1-4); ask only what is needed to unblock progress.\",\n\t}),\n});\n\n/**\n * Checks the schema cannot express. Length and count limits are omitted:\n * the agent core validates params against `QuestionParams` before execute runs.\n */\nexport function validateQuestions(\n\tquestions: Question[],\n): { ok: true } | { ok: false; error: QuestionToolError; message: string } {\n\tconst seenQuestions = new Set<string>();\n\tfor (const q of questions) {\n\t\tconst questionKey = normalizeLabel(q.question);\n\t\tif (seenQuestions.has(questionKey)) {\n\t\t\treturn { ok: false, error: \"duplicate_question\", message: \"Question text must be unique\" };\n\t\t}\n\t\tseenQuestions.add(questionKey);\n\n\t\tif (q.multiSelect && q.options.some((option) => option.preview)) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: \"preview_multiselect\",\n\t\t\t\tmessage:\n\t\t\t\t\t\"Option previews are not supported on multiSelect questions; drop the previews or make the question single-select\",\n\t\t\t};\n\t\t}\n\n\t\tconst seenLabels = new Set<string>();\n\t\tfor (const option of q.options as QuestionOption[]) {\n\t\t\tconst labelKey = normalizeLabel(option.label);\n\t\t\tif (RESERVED_NORMALIZED.has(labelKey)) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"reserved_label\",\n\t\t\t\t\tmessage: `Option label is reserved (${RESERVED_LABELS.join(\", \")})`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (seenLabels.has(labelKey)) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"duplicate_option_label\",\n\t\t\t\t\tmessage: \"Option labels must be unique within a question\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tseenLabels.add(labelKey);\n\t\t}\n\t}\n\n\treturn { ok: true };\n}\n"]}