@evalops/maestro 0.10.50 → 0.10.51

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 (406) hide show
  1. package/dist/agent/agent-outcome.d.ts +54 -0
  2. package/dist/agent/agent-outcome.d.ts.map +1 -0
  3. package/dist/agent/agent-outcome.js +142 -0
  4. package/dist/agent/agent-outcome.js.map +1 -0
  5. package/dist/agent/agent-resume.d.ts.map +1 -1
  6. package/dist/agent/agent-resume.js +3 -3
  7. package/dist/agent/agent-resume.js.map +1 -1
  8. package/dist/agent/agent-run-summary.d.ts +37 -0
  9. package/dist/agent/agent-run-summary.d.ts.map +1 -0
  10. package/dist/agent/agent-run-summary.js +15 -0
  11. package/dist/agent/agent-run-summary.js.map +1 -0
  12. package/dist/agent/agent-work-board.d.ts +82 -0
  13. package/dist/agent/agent-work-board.d.ts.map +1 -0
  14. package/dist/agent/agent-work-board.js +312 -0
  15. package/dist/agent/agent-work-board.js.map +1 -0
  16. package/dist/agent/auto-compaction.d.ts +7 -2
  17. package/dist/agent/auto-compaction.d.ts.map +1 -1
  18. package/dist/agent/auto-compaction.js +23 -10
  19. package/dist/agent/auto-compaction.js.map +1 -1
  20. package/dist/agent/mission-artifacts.d.ts +62 -0
  21. package/dist/agent/mission-artifacts.d.ts.map +1 -0
  22. package/dist/agent/mission-artifacts.js +438 -0
  23. package/dist/agent/mission-artifacts.js.map +1 -0
  24. package/dist/agent/mission-manifest.d.ts +139 -3
  25. package/dist/agent/mission-manifest.d.ts.map +1 -1
  26. package/dist/agent/mission-manifest.js +549 -3
  27. package/dist/agent/mission-manifest.js.map +1 -1
  28. package/dist/agent/mission-store.d.ts +80 -0
  29. package/dist/agent/mission-store.d.ts.map +1 -0
  30. package/dist/agent/mission-store.js +603 -0
  31. package/dist/agent/mission-store.js.map +1 -0
  32. package/dist/agent/modes.d.ts +2 -2
  33. package/dist/agent/modes.d.ts.map +1 -1
  34. package/dist/agent/modes.js +10 -3
  35. package/dist/agent/modes.js.map +1 -1
  36. package/dist/agent/providers/codex-app-server.d.ts.map +1 -1
  37. package/dist/agent/providers/codex-app-server.js +1 -3
  38. package/dist/agent/providers/codex-app-server.js.map +1 -1
  39. package/dist/agent/providers/google-gemini-cli.js +203 -107
  40. package/dist/agent/providers/google.js +100 -41
  41. package/dist/agent/providers/scripted.d.ts.map +1 -1
  42. package/dist/agent/providers/scripted.js +1 -3
  43. package/dist/agent/providers/scripted.js.map +1 -1
  44. package/dist/agent/providers/validation.d.ts.map +1 -1
  45. package/dist/agent/providers/validation.js +1 -3
  46. package/dist/agent/providers/validation.js.map +1 -1
  47. package/dist/agent/providers/vertex.js +203 -107
  48. package/dist/agent/snapshot-store.d.ts +32 -0
  49. package/dist/agent/snapshot-store.d.ts.map +1 -0
  50. package/dist/agent/snapshot-store.js +195 -0
  51. package/dist/agent/snapshot-store.js.map +1 -0
  52. package/dist/agent/specialist-profiles.d.ts +36 -0
  53. package/dist/agent/specialist-profiles.d.ts.map +1 -0
  54. package/dist/agent/specialist-profiles.js +159 -0
  55. package/dist/agent/specialist-profiles.js.map +1 -0
  56. package/dist/agent/subagent-specs.d.ts +4 -1
  57. package/dist/agent/subagent-specs.d.ts.map +1 -1
  58. package/dist/agent/subagent-specs.js +81 -8
  59. package/dist/agent/subagent-specs.js.map +1 -1
  60. package/dist/agent/swarm/coverage-gate.d.ts +37 -0
  61. package/dist/agent/swarm/coverage-gate.d.ts.map +1 -0
  62. package/dist/agent/swarm/coverage-gate.js +48 -0
  63. package/dist/agent/swarm/coverage-gate.js.map +1 -0
  64. package/dist/agent/swarm/executor.d.ts +1 -0
  65. package/dist/agent/swarm/executor.d.ts.map +1 -1
  66. package/dist/agent/swarm/executor.js +151 -15
  67. package/dist/agent/swarm/executor.js.map +1 -1
  68. package/dist/agent/swarm/orchestrator-prompt.d.ts +25 -0
  69. package/dist/agent/swarm/orchestrator-prompt.d.ts.map +1 -0
  70. package/dist/agent/swarm/orchestrator-prompt.js +48 -0
  71. package/dist/agent/swarm/orchestrator-prompt.js.map +1 -0
  72. package/dist/agent/swarm/plan-parser.d.ts.map +1 -1
  73. package/dist/agent/swarm/plan-parser.js +27 -2
  74. package/dist/agent/swarm/plan-parser.js.map +1 -1
  75. package/dist/agent/swarm/types.d.ts +17 -0
  76. package/dist/agent/swarm/types.d.ts.map +1 -1
  77. package/dist/agent/swarm/types.js.map +1 -1
  78. package/dist/agent/swarm/validation-directive.d.ts +21 -0
  79. package/dist/agent/swarm/validation-directive.d.ts.map +1 -0
  80. package/dist/agent/swarm/validation-directive.js +25 -0
  81. package/dist/agent/swarm/validation-directive.js.map +1 -0
  82. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  83. package/dist/agent/transport/tool-execution-bridge.js +4 -1
  84. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  85. package/dist/api/enterprise-routes.d.ts.map +1 -1
  86. package/dist/api/enterprise-routes.js +87 -10
  87. package/dist/api/enterprise-routes.js.map +1 -1
  88. package/dist/api/org-settings-merge.d.ts +12 -0
  89. package/dist/api/org-settings-merge.d.ts.map +1 -0
  90. package/dist/api/org-settings-merge.js +38 -0
  91. package/dist/api/org-settings-merge.js.map +1 -0
  92. package/dist/api/user-settings-merge.d.ts +16 -0
  93. package/dist/api/user-settings-merge.d.ts.map +1 -0
  94. package/dist/api/user-settings-merge.js +37 -0
  95. package/dist/api/user-settings-merge.js.map +1 -0
  96. package/dist/app-server/daemon-lifecycle-api.d.ts.map +1 -1
  97. package/dist/app-server/daemon-lifecycle-api.js +1 -3
  98. package/dist/app-server/daemon-lifecycle-api.js.map +1 -1
  99. package/dist/app-server/external-agent-import-api.d.ts.map +1 -1
  100. package/dist/app-server/external-agent-import-api.js +1 -3
  101. package/dist/app-server/external-agent-import-api.js.map +1 -1
  102. package/dist/app-server/network-governance-api.d.ts.map +1 -1
  103. package/dist/app-server/network-governance-api.js +1 -3
  104. package/dist/app-server/network-governance-api.js.map +1 -1
  105. package/dist/app-server/plugin-bundle-api.d.ts.map +1 -1
  106. package/dist/app-server/plugin-bundle-api.js +1 -3
  107. package/dist/app-server/plugin-bundle-api.js.map +1 -1
  108. package/dist/app-server/policy-control-api.d.ts.map +1 -1
  109. package/dist/app-server/policy-control-api.js +1 -3
  110. package/dist/app-server/policy-control-api.js.map +1 -1
  111. package/dist/app-server/protocol-modes-api.d.ts.map +1 -1
  112. package/dist/app-server/protocol-modes-api.js +1 -3
  113. package/dist/app-server/protocol-modes-api.js.map +1 -1
  114. package/dist/cli/args.d.ts +2 -0
  115. package/dist/cli/args.d.ts.map +1 -1
  116. package/dist/cli/args.js +15 -0
  117. package/dist/cli/args.js.map +1 -1
  118. package/dist/cli/commands/a2a.d.ts.map +1 -1
  119. package/dist/cli/commands/a2a.js +1 -3
  120. package/dist/cli/commands/a2a.js.map +1 -1
  121. package/dist/cli/commands/agents.d.ts +4 -0
  122. package/dist/cli/commands/agents.d.ts.map +1 -1
  123. package/dist/cli/commands/agents.js +149 -0
  124. package/dist/cli/commands/agents.js.map +1 -1
  125. package/dist/cli/commands/mission.d.ts +4 -0
  126. package/dist/cli/commands/mission.d.ts.map +1 -0
  127. package/dist/cli/commands/mission.js +196 -0
  128. package/dist/cli/commands/mission.js.map +1 -0
  129. package/dist/cli/commands/value.d.ts +10 -0
  130. package/dist/cli/commands/value.d.ts.map +1 -0
  131. package/dist/cli/commands/value.js +33 -0
  132. package/dist/cli/commands/value.js.map +1 -0
  133. package/dist/cli/headless-protocol.d.ts.map +1 -1
  134. package/dist/cli/headless-protocol.js +1 -3
  135. package/dist/cli/headless-protocol.js.map +1 -1
  136. package/dist/cli/help.d.ts.map +1 -1
  137. package/dist/cli/help.js +10 -0
  138. package/dist/cli/help.js.map +1 -1
  139. package/dist/cli/system-prompt.d.ts.map +1 -1
  140. package/dist/cli/system-prompt.js +38 -7
  141. package/dist/cli/system-prompt.js.map +1 -1
  142. package/dist/cli-runtime.js +7756 -2800
  143. package/dist/cli-tui/client-tools/client-tool-controller.d.ts.map +1 -1
  144. package/dist/cli-tui/client-tools/client-tool-controller.js +1 -3
  145. package/dist/cli-tui/client-tools/client-tool-controller.js.map +1 -1
  146. package/dist/cli-tui/commands/undo-handlers.d.ts.map +1 -1
  147. package/dist/cli-tui/commands/undo-handlers.js +7 -2
  148. package/dist/cli-tui/commands/undo-handlers.js.map +1 -1
  149. package/dist/cli-tui/tui-renderer/skills-controller.d.ts +3 -0
  150. package/dist/cli-tui/tui-renderer/skills-controller.d.ts.map +1 -1
  151. package/dist/cli-tui/tui-renderer/skills-controller.js +77 -33
  152. package/dist/cli-tui/tui-renderer/skills-controller.js.map +1 -1
  153. package/dist/codex/app-server-client.d.ts.map +1 -1
  154. package/dist/codex/app-server-client.js +1 -3
  155. package/dist/codex/app-server-client.js.map +1 -1
  156. package/dist/codex/compatibility.d.ts.map +1 -1
  157. package/dist/codex/compatibility.js +1 -3
  158. package/dist/codex/compatibility.js.map +1 -1
  159. package/dist/codex/subagent-dispatch-table.d.ts +8 -0
  160. package/dist/codex/subagent-dispatch-table.d.ts.map +1 -1
  161. package/dist/codex/subagent-dispatch-table.js +23 -0
  162. package/dist/codex/subagent-dispatch-table.js.map +1 -1
  163. package/dist/context/manifest.d.ts.map +1 -1
  164. package/dist/context/manifest.js +1 -3
  165. package/dist/context/manifest.js.map +1 -1
  166. package/dist/conversation/render-model.d.ts +0 -36
  167. package/dist/conversation/render-model.d.ts.map +1 -1
  168. package/dist/conversation/render-model.js +1 -3
  169. package/dist/conversation/render-model.js.map +1 -1
  170. package/dist/customer-value/ambient-learning.d.ts +75 -0
  171. package/dist/customer-value/ambient-learning.d.ts.map +1 -0
  172. package/dist/customer-value/ambient-learning.js +472 -0
  173. package/dist/customer-value/ambient-learning.js.map +1 -0
  174. package/dist/customer-value/internal-helpers.d.ts +13 -0
  175. package/dist/customer-value/internal-helpers.d.ts.map +1 -0
  176. package/dist/customer-value/internal-helpers.js +70 -0
  177. package/dist/customer-value/internal-helpers.js.map +1 -0
  178. package/dist/customer-value/report.d.ts +282 -0
  179. package/dist/customer-value/report.d.ts.map +1 -0
  180. package/dist/customer-value/report.js +2085 -0
  181. package/dist/customer-value/report.js.map +1 -0
  182. package/dist/db/schema.d.ts +5 -1
  183. package/dist/db/schema.d.ts.map +1 -1
  184. package/dist/db/schema.js.map +1 -1
  185. package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
  186. package/dist/evalops/agent-bootstrap.js +1 -3
  187. package/dist/evalops/agent-bootstrap.js.map +1 -1
  188. package/dist/evalops/agent-mcp-metadata.d.ts.map +1 -1
  189. package/dist/evalops/agent-mcp-metadata.js +1 -3
  190. package/dist/evalops/agent-mcp-metadata.js.map +1 -1
  191. package/dist/index.d.ts +1 -0
  192. package/dist/index.d.ts.map +1 -1
  193. package/dist/index.js +1 -0
  194. package/dist/index.js.map +1 -1
  195. package/dist/installers/maestro-review-workflow.d.ts +38 -0
  196. package/dist/installers/maestro-review-workflow.d.ts.map +1 -0
  197. package/dist/installers/maestro-review-workflow.js +163 -0
  198. package/dist/installers/maestro-review-workflow.js.map +1 -0
  199. package/dist/load-env.d.ts.map +1 -1
  200. package/dist/load-env.js +2 -1
  201. package/dist/load-env.js.map +1 -1
  202. package/dist/main.d.ts.map +1 -1
  203. package/dist/main.js +92 -3
  204. package/dist/main.js.map +1 -1
  205. package/dist/mcp/config.d.ts.map +1 -1
  206. package/dist/mcp/config.js +1 -3
  207. package/dist/mcp/config.js.map +1 -1
  208. package/dist/mcp/elicitation.d.ts.map +1 -1
  209. package/dist/mcp/elicitation.js +1 -3
  210. package/dist/mcp/elicitation.js.map +1 -1
  211. package/dist/mcp/official-registry.d.ts.map +1 -1
  212. package/dist/mcp/official-registry.js +1 -3
  213. package/dist/mcp/official-registry.js.map +1 -1
  214. package/dist/mcp/workspace-trust.d.ts.map +1 -1
  215. package/dist/mcp/workspace-trust.js +1 -3
  216. package/dist/mcp/workspace-trust.js.map +1 -1
  217. package/dist/memory/service-client.d.ts.map +1 -1
  218. package/dist/memory/service-client.js +1 -3
  219. package/dist/memory/service-client.js.map +1 -1
  220. package/dist/models/config-loader.d.ts.map +1 -1
  221. package/dist/models/config-loader.js +1 -3
  222. package/dist/models/config-loader.js.map +1 -1
  223. package/dist/node_modules/@evalops/contracts/dist/index.d.ts +1 -0
  224. package/dist/node_modules/@evalops/contracts/dist/index.d.ts.map +1 -1
  225. package/dist/node_modules/@evalops/contracts/dist/index.js +1 -0
  226. package/dist/node_modules/@evalops/contracts/dist/index.js.map +1 -1
  227. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts +61 -0
  228. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.d.ts.map +1 -0
  229. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js +183 -0
  230. package/dist/node_modules/@evalops/contracts/dist/maestro-settings.js.map +1 -0
  231. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  232. package/dist/node_modules/@evalops/tui/package.json +1 -1
  233. package/dist/oauth/connectors.d.ts.map +1 -1
  234. package/dist/oauth/connectors.js +1 -3
  235. package/dist/oauth/connectors.js.map +1 -1
  236. package/dist/oauth/evalops.d.ts.map +1 -1
  237. package/dist/oauth/evalops.js +1 -3
  238. package/dist/oauth/evalops.js.map +1 -1
  239. package/dist/platform/a2a-client.d.ts.map +1 -1
  240. package/dist/platform/a2a-client.js +1 -3
  241. package/dist/platform/a2a-client.js.map +1 -1
  242. package/dist/platform/a2a-cockpit.d.ts +1 -0
  243. package/dist/platform/a2a-cockpit.d.ts.map +1 -1
  244. package/dist/platform/a2a-cockpit.js +42 -11
  245. package/dist/platform/a2a-cockpit.js.map +1 -1
  246. package/dist/platform/a2a-completion-audit.d.ts +1 -1
  247. package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
  248. package/dist/platform/a2a-completion-audit.js +7 -11
  249. package/dist/platform/a2a-completion-audit.js.map +1 -1
  250. package/dist/platform/a2a-maestro-peer.js +16 -0
  251. package/dist/platform/a2a-maestro-peer.js.map +1 -1
  252. package/dist/platform/a2a-peer-pairing.d.ts.map +1 -1
  253. package/dist/platform/a2a-peer-pairing.js +1 -3
  254. package/dist/platform/a2a-peer-pairing.js.map +1 -1
  255. package/dist/platform/a2a-peer-registry.d.ts.map +1 -1
  256. package/dist/platform/a2a-peer-registry.js +1 -3
  257. package/dist/platform/a2a-peer-registry.js.map +1 -1
  258. package/dist/platform/a2a-task-ledger.d.ts +20 -0
  259. package/dist/platform/a2a-task-ledger.d.ts.map +1 -1
  260. package/dist/platform/a2a-task-ledger.js +207 -11
  261. package/dist/platform/a2a-task-ledger.js.map +1 -1
  262. package/dist/platform/a2a-work-graph.d.ts.map +1 -1
  263. package/dist/platform/a2a-work-graph.js +1 -3
  264. package/dist/platform/a2a-work-graph.js.map +1 -1
  265. package/dist/platform/operating-layer.d.ts.map +1 -1
  266. package/dist/platform/operating-layer.js +14 -8
  267. package/dist/platform/operating-layer.js.map +1 -1
  268. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  269. package/dist/platform/tool-execution-client.js +19 -2
  270. package/dist/platform/tool-execution-client.js.map +1 -1
  271. package/dist/providers/auth.d.ts.map +1 -1
  272. package/dist/providers/auth.js +1 -3
  273. package/dist/providers/auth.js.map +1 -1
  274. package/dist/runtime/env.d.ts +9 -1
  275. package/dist/runtime/env.d.ts.map +1 -1
  276. package/dist/runtime/env.js +63 -1
  277. package/dist/runtime/env.js.map +1 -1
  278. package/dist/safety/policy.d.ts.map +1 -1
  279. package/dist/safety/policy.js +1 -4
  280. package/dist/safety/policy.js.map +1 -1
  281. package/dist/sandbox/docker-sandbox.d.ts.map +1 -1
  282. package/dist/sandbox/docker-sandbox.js +6 -1
  283. package/dist/sandbox/docker-sandbox.js.map +1 -1
  284. package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
  285. package/dist/server/handlers/hosted-runner-drain.js +1 -3
  286. package/dist/server/handlers/hosted-runner-drain.js.map +1 -1
  287. package/dist/server/handlers/platform-a2a-push.d.ts.map +1 -1
  288. package/dist/server/handlers/platform-a2a-push.js +53 -2
  289. package/dist/server/handlers/platform-a2a-push.js.map +1 -1
  290. package/dist/server/handlers/runtime-app-server-ws.d.ts.map +1 -1
  291. package/dist/server/handlers/runtime-app-server-ws.js +1 -3
  292. package/dist/server/handlers/runtime-app-server-ws.js.map +1 -1
  293. package/dist/server/headless-runtime-service.d.ts +16 -0
  294. package/dist/server/headless-runtime-service.d.ts.map +1 -1
  295. package/dist/server/headless-runtime-service.js +232 -206
  296. package/dist/server/headless-runtime-service.js.map +1 -1
  297. package/dist/server/hosted-agent-runtime-progress.d.ts.map +1 -1
  298. package/dist/server/hosted-agent-runtime-progress.js +12 -3
  299. package/dist/server/hosted-agent-runtime-progress.js.map +1 -1
  300. package/dist/server/pending-request-payload.d.ts.map +1 -1
  301. package/dist/server/pending-request-payload.js +1 -3
  302. package/dist/server/pending-request-payload.js.map +1 -1
  303. package/dist/server/route-auth.d.ts.map +1 -1
  304. package/dist/server/route-auth.js +2 -0
  305. package/dist/server/route-auth.js.map +1 -1
  306. package/dist/server/session-serialization.d.ts.map +1 -1
  307. package/dist/server/session-serialization.js +1 -3
  308. package/dist/server/session-serialization.js.map +1 -1
  309. package/dist/services/compliance/normalize.d.ts.map +1 -1
  310. package/dist/services/compliance/normalize.js +1 -3
  311. package/dist/services/compliance/normalize.js.map +1 -1
  312. package/dist/services/intelligent-router/normalize.d.ts.map +1 -1
  313. package/dist/services/intelligent-router/normalize.js +1 -3
  314. package/dist/services/intelligent-router/normalize.js.map +1 -1
  315. package/dist/services/revenue-attribution/normalize.d.ts.map +1 -1
  316. package/dist/services/revenue-attribution/normalize.js +1 -3
  317. package/dist/services/revenue-attribution/normalize.js.map +1 -1
  318. package/dist/services/traces/normalize.d.ts.map +1 -1
  319. package/dist/services/traces/normalize.js +1 -3
  320. package/dist/services/traces/normalize.js.map +1 -1
  321. package/dist/services/workspace-config/normalize.d.ts.map +1 -1
  322. package/dist/services/workspace-config/normalize.js +1 -3
  323. package/dist/services/workspace-config/normalize.js.map +1 -1
  324. package/dist/skills/composer.d.ts.map +1 -1
  325. package/dist/skills/composer.js +13 -1
  326. package/dist/skills/composer.js.map +1 -1
  327. package/dist/skills/index.d.ts +1 -0
  328. package/dist/skills/index.d.ts.map +1 -1
  329. package/dist/skills/index.js +1 -0
  330. package/dist/skills/index.js.map +1 -1
  331. package/dist/skills/learned-guidelines.d.ts +33 -0
  332. package/dist/skills/learned-guidelines.d.ts.map +1 -0
  333. package/dist/skills/learned-guidelines.js +291 -0
  334. package/dist/skills/learned-guidelines.js.map +1 -0
  335. package/dist/skills/linter.d.ts.map +1 -1
  336. package/dist/skills/linter.js +1 -3
  337. package/dist/skills/linter.js.map +1 -1
  338. package/dist/skills/runtime-activation.d.ts +1 -0
  339. package/dist/skills/runtime-activation.d.ts.map +1 -1
  340. package/dist/skills/runtime-activation.js +2 -3
  341. package/dist/skills/runtime-activation.js.map +1 -1
  342. package/dist/skills/tool.d.ts.map +1 -1
  343. package/dist/skills/tool.js +26 -21
  344. package/dist/skills/tool.js.map +1 -1
  345. package/dist/skills/trust-cache.d.ts +7 -0
  346. package/dist/skills/trust-cache.d.ts.map +1 -1
  347. package/dist/skills/trust-cache.js +16 -0
  348. package/dist/skills/trust-cache.js.map +1 -1
  349. package/dist/telemetry/agent-workforce-native-event.d.ts.map +1 -1
  350. package/dist/telemetry/agent-workforce-native-event.js +1 -3
  351. package/dist/telemetry/agent-workforce-native-event.js.map +1 -1
  352. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  353. package/dist/telemetry/maestro-event-bus.js +42 -81
  354. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  355. package/dist/telemetry/maestro-platform-replay-fixture.d.ts.map +1 -1
  356. package/dist/telemetry/maestro-platform-replay-fixture.js +1 -3
  357. package/dist/telemetry/maestro-platform-replay-fixture.js.map +1 -1
  358. package/dist/telemetry.d.ts.map +1 -1
  359. package/dist/telemetry.js +54 -43
  360. package/dist/telemetry.js.map +1 -1
  361. package/dist/theme/theme-loader.d.ts.map +1 -1
  362. package/dist/theme/theme-loader.js +1 -3
  363. package/dist/theme/theme-loader.js.map +1 -1
  364. package/dist/tools/apply-patch.d.ts.map +1 -1
  365. package/dist/tools/apply-patch.js +76 -8
  366. package/dist/tools/apply-patch.js.map +1 -1
  367. package/dist/tools/diff-preview.d.ts.map +1 -1
  368. package/dist/tools/diff-preview.js +10 -1
  369. package/dist/tools/diff-preview.js.map +1 -1
  370. package/dist/tools/edit.d.ts.map +1 -1
  371. package/dist/tools/edit.js +17 -0
  372. package/dist/tools/edit.js.map +1 -1
  373. package/dist/tools/write.d.ts.map +1 -1
  374. package/dist/tools/write.js +9 -0
  375. package/dist/tools/write.js.map +1 -1
  376. package/dist/undo/tracker.d.ts +5 -0
  377. package/dist/undo/tracker.d.ts.map +1 -1
  378. package/dist/undo/tracker.js +13 -0
  379. package/dist/undo/tracker.js.map +1 -1
  380. package/dist/utils/fs.d.ts +1 -1
  381. package/dist/utils/fs.d.ts.map +1 -1
  382. package/dist/utils/fs.js +29 -2
  383. package/dist/utils/fs.js.map +1 -1
  384. package/dist/utils/git-stash.d.ts.map +1 -1
  385. package/dist/utils/git-stash.js +15 -8
  386. package/dist/utils/git-stash.js.map +1 -1
  387. package/dist/utils/json.d.ts +11 -0
  388. package/dist/utils/json.d.ts.map +1 -1
  389. package/dist/utils/json.js +9 -0
  390. package/dist/utils/json.js.map +1 -1
  391. package/dist/utils/shell-env.d.ts.map +1 -1
  392. package/dist/utils/shell-env.js +2 -0
  393. package/dist/utils/shell-env.js.map +1 -1
  394. package/dist/utils/url-extractor-git.d.ts +26 -0
  395. package/dist/utils/url-extractor-git.d.ts.map +1 -0
  396. package/dist/utils/url-extractor-git.js +259 -0
  397. package/dist/utils/url-extractor-git.js.map +1 -0
  398. package/dist/utils/url-extractor.d.ts.map +1 -1
  399. package/dist/utils/url-extractor.js +23 -251
  400. package/dist/utils/url-extractor.js.map +1 -1
  401. package/dist/version.json +2 -2
  402. package/package.json +310 -306
  403. package/skills/incident-triage/SKILL.md +19 -1
  404. package/skills/install-code-review/SKILL.md +69 -0
  405. package/skills/security-review/SKILL.md +68 -0
  406. package/skills/security-review/reference/rubric.md +85 -0
@@ -1 +1 @@
1
- {"version":3,"file":"client-tool-controller.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/client-tools/client-tool-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAEN,KAAK,qBAAqB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAEX,oBAAoB,EAEpB,MAAM,gCAAgC,CAAC;AAuFxC,UAAU,2BAA2B;IACpC,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,SAAS,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,KAAK,CAAC;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5E;AAqoBD,qBAAa,oBAAoB;IAOpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAEZ,OAAO,EAAE,2BAA2B;IAMjE,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,kBAAkB;IA8E1B,OAAO,CAAC,yBAAyB;IA8GjC,OAAO,CAAC,mBAAmB;IA0G3B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;CAUxB"}
1
+ {"version":3,"file":"client-tool-controller.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/client-tools/client-tool-controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAInD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAEN,KAAK,qBAAqB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAEX,oBAAoB,EAEpB,MAAM,gCAAgC,CAAC;AAuFxC,UAAU,2BAA2B;IACpC,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,SAAS,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,KAAK,CAAC;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC5E;AAioBD,qBAAa,oBAAoB;IAOpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAC3D,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAEZ,OAAO,EAAE,2BAA2B;IAMjE,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,kBAAkB;IA8E1B,OAAO,CAAC,yBAAyB;IA8GjC,OAAO,CAAC,mBAAmB;IA0G3B,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,gBAAgB;CAUxB"}
@@ -1,9 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { extractQuestions, parseUserResponse } from "../../tools/ask-user.js";
3
+ import { isRecord } from "../../utils/json.js";
3
4
  import { HookInputModal, } from "../hooks/hook-input-modal.js";
4
- function isRecord(value) {
5
- return !!value && typeof value === "object" && !Array.isArray(value);
6
- }
7
5
  function getOptionalNumber(record, key) {
8
6
  const value = record[key];
9
7
  return typeof value === "number" && Number.isFinite(value)
@@ -1 +1 @@
1
- {"version":3,"file":"client-tool-controller.js","sourceRoot":"","sources":["../../../src/cli-tui/client-tools/client-tool-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport type { Container, TUI } from \"@evalops/tui\";\nimport type { Question, QuestionOption } from \"../../tools/ask-user.js\";\nimport { extractQuestions, parseUserResponse } from \"../../tools/ask-user.js\";\nimport type { CustomEditor } from \"../custom-editor.js\";\nimport {\n\tHookInputModal,\n\ttype HookInputModalOptions,\n} from \"../hooks/hook-input-modal.js\";\nimport type { Modal } from \"../modal-manager.js\";\nimport type { NotificationView } from \"../notification-view.js\";\nimport type {\n\tTuiClientToolLifecycleEvent,\n\tTuiClientToolService,\n\tTuiPendingClientToolRequest,\n} from \"./local-client-tool-service.js\";\n\ntype PrimitiveValue = string | number | boolean | string[];\n\ntype EnumOption = {\n\tlabel: string;\n\tvalue: string;\n};\n\ntype FieldDefinition =\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"boolean\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: boolean;\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"string\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: string;\n\t\t\tformat?: \"date\" | \"date-time\" | \"email\" | \"uri\";\n\t\t\tmaxLength?: number;\n\t\t\tminLength?: number;\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"number\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: number;\n\t\t\tinteger: boolean;\n\t\t\tmaximum?: number;\n\t\t\tminimum?: number;\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"select\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: string;\n\t\t\toptions: EnumOption[];\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"multi-select\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: string[];\n\t\t\tmaxItems?: number;\n\t\t\tminItems?: number;\n\t\t\toptions: EnumOption[];\n\t };\n\ntype ParsedFormRequest = {\n\tfields: FieldDefinition[];\n\tkind: \"form\";\n\tmessage: string;\n\trequestId: string;\n\trequiredKeys: Set<string>;\n\tserverName: string;\n};\n\ntype ParsedMalformedRequest = {\n\terror: string;\n\tkind: \"malformed\";\n\tmessage: string;\n\trequestId?: string;\n\tserverName?: string;\n};\n\ntype ParsedUrlRequest = {\n\telicitationId?: string;\n\tkind: \"url\";\n\tmessage: string;\n\trequestId: string;\n\tserverName: string;\n\turl: string;\n};\n\ntype ParsedRequest =\n\t| ParsedFormRequest\n\t| ParsedMalformedRequest\n\t| ParsedUrlRequest;\n\ninterface ClientToolControllerOptions {\n\tclientToolService: TuiClientToolService;\n\tui: TUI;\n\teditor: CustomEditor;\n\teditorContainer: Container;\n\tnotificationView: NotificationView;\n\tcreateInputModal?: (options: HookInputModalOptions) => Modal;\n\topenUrl?: (url: string) => boolean | Promise<boolean>;\n\tonPendingStatusChange?: (toolCallId: string, status: string | null) => void;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getOptionalNumber(\n\trecord: Record<string, unknown>,\n\tkey: string,\n): number | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"number\" && Number.isFinite(value)\n\t\t? value\n\t\t: undefined;\n}\n\nfunction getOptionalString(\n\trecord: Record<string, unknown>,\n\tkey: string,\n): string | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction normalizeOptionEntries(\n\tvalues: string[],\n\tlabels?: string[],\n): EnumOption[] {\n\treturn values.map((value, index) => ({\n\t\tvalue,\n\t\tlabel: labels?.[index] ?? value,\n\t}));\n}\n\nfunction parseFieldDefinition(\n\tkey: string,\n\tvalue: unknown,\n): FieldDefinition | null {\n\tif (!isRecord(value) || typeof value.type !== \"string\") {\n\t\treturn null;\n\t}\n\n\tconst label = getOptionalString(value, \"title\") ?? key;\n\tconst description = getOptionalString(value, \"description\");\n\n\tif (value.type === \"boolean\") {\n\t\treturn {\n\t\t\tkey,\n\t\t\tkind: \"boolean\",\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tdefaultValue:\n\t\t\t\ttypeof value.default === \"boolean\" ? value.default : undefined,\n\t\t};\n\t}\n\n\tif (value.type === \"string\") {\n\t\tif (\n\t\t\tArray.isArray(value.enum) &&\n\t\t\tvalue.enum.every((entry) => typeof entry === \"string\")\n\t\t) {\n\t\t\tconst enumNames =\n\t\t\t\tArray.isArray(value.enumNames) &&\n\t\t\t\tvalue.enumNames.every((entry) => typeof entry === \"string\")\n\t\t\t\t\t? (value.enumNames as string[])\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\ttypeof value.default === \"string\" ? value.default : undefined,\n\t\t\t\toptions: normalizeOptionEntries(value.enum as string[], enumNames),\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tArray.isArray(value.oneOf) &&\n\t\t\tvalue.oneOf.every(\n\t\t\t\t(entry) =>\n\t\t\t\t\tisRecord(entry) &&\n\t\t\t\t\ttypeof entry.const === \"string\" &&\n\t\t\t\t\ttypeof entry.title === \"string\",\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\ttypeof value.default === \"string\" ? value.default : undefined,\n\t\t\t\toptions: (value.oneOf as Array<{ const: string; title: string }>).map(\n\t\t\t\t\t(entry) => ({\n\t\t\t\t\t\tvalue: entry.const,\n\t\t\t\t\t\tlabel: entry.title,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkey,\n\t\t\tkind: \"string\",\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tdefaultValue:\n\t\t\t\ttypeof value.default === \"string\" ? value.default : undefined,\n\t\t\tformat:\n\t\t\t\tvalue.format === \"date\" ||\n\t\t\t\tvalue.format === \"date-time\" ||\n\t\t\t\tvalue.format === \"email\" ||\n\t\t\t\tvalue.format === \"uri\"\n\t\t\t\t\t? value.format\n\t\t\t\t\t: undefined,\n\t\t\tmaxLength: getOptionalNumber(value, \"maxLength\"),\n\t\t\tminLength: getOptionalNumber(value, \"minLength\"),\n\t\t};\n\t}\n\n\tif (value.type === \"number\" || value.type === \"integer\") {\n\t\treturn {\n\t\t\tkey,\n\t\t\tkind: \"number\",\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tdefaultValue:\n\t\t\t\ttypeof value.default === \"number\" ? value.default : undefined,\n\t\t\tinteger: value.type === \"integer\",\n\t\t\tmaximum: getOptionalNumber(value, \"maximum\"),\n\t\t\tminimum: getOptionalNumber(value, \"minimum\"),\n\t\t};\n\t}\n\n\tif (value.type === \"array\" && isRecord(value.items)) {\n\t\tif (\n\t\t\tArray.isArray(value.items.enum) &&\n\t\t\tvalue.items.enum.every((entry) => typeof entry === \"string\")\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"multi-select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\tArray.isArray(value.default) &&\n\t\t\t\t\tvalue.default.every((entry) => typeof entry === \"string\")\n\t\t\t\t\t\t? [...(value.default as string[])]\n\t\t\t\t\t\t: undefined,\n\t\t\t\tminItems: getOptionalNumber(value, \"minItems\"),\n\t\t\t\tmaxItems: getOptionalNumber(value, \"maxItems\"),\n\t\t\t\toptions: normalizeOptionEntries(value.items.enum as string[]),\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tArray.isArray(value.items.anyOf) &&\n\t\t\tvalue.items.anyOf.every(\n\t\t\t\t(entry) =>\n\t\t\t\t\tisRecord(entry) &&\n\t\t\t\t\ttypeof entry.const === \"string\" &&\n\t\t\t\t\ttypeof entry.title === \"string\",\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"multi-select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\tArray.isArray(value.default) &&\n\t\t\t\t\tvalue.default.every((entry) => typeof entry === \"string\")\n\t\t\t\t\t\t? [...(value.default as string[])]\n\t\t\t\t\t\t: undefined,\n\t\t\t\tminItems: getOptionalNumber(value, \"minItems\"),\n\t\t\t\tmaxItems: getOptionalNumber(value, \"maxItems\"),\n\t\t\t\toptions: (\n\t\t\t\t\tvalue.items.anyOf as Array<{ const: string; title: string }>\n\t\t\t\t).map((entry) => ({\n\t\t\t\t\tvalue: entry.const,\n\t\t\t\t\tlabel: entry.title,\n\t\t\t\t})),\n\t\t\t};\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction parseMcpElicitationRequest(args: unknown): ParsedRequest {\n\tif (!isRecord(args)) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage: \"MCP server requested additional input.\",\n\t\t\terror: \"Missing elicitation arguments.\",\n\t\t};\n\t}\n\n\tconst requestId = getOptionalString(args, \"requestId\");\n\tconst serverName = getOptionalString(args, \"serverName\");\n\tconst message =\n\t\tgetOptionalString(args, \"message\") ??\n\t\t\"MCP server requested additional input.\";\n\tif (!requestId || !serverName) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\terror: \"Missing elicitation request identity.\",\n\t\t};\n\t}\n\n\tif (args.mode === \"url\") {\n\t\tconst url = getOptionalString(args, \"url\");\n\t\tif (!url) {\n\t\t\treturn {\n\t\t\t\tkind: \"malformed\",\n\t\t\t\tmessage,\n\t\t\t\trequestId,\n\t\t\t\tserverName,\n\t\t\t\terror: \"Missing URL for URL-mode elicitation.\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"url\",\n\t\t\tmessage,\n\t\t\trequestId,\n\t\t\tserverName,\n\t\t\turl,\n\t\t\telicitationId: getOptionalString(args, \"elicitationId\"),\n\t\t};\n\t}\n\n\tconst requestedSchema = args.requestedSchema;\n\tif (!isRecord(requestedSchema)) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\tserverName,\n\t\t\trequestId,\n\t\t\terror: \"Missing requested schema for form elicitation.\",\n\t\t};\n\t}\n\tif (\n\t\trequestedSchema.type !== \"object\" ||\n\t\t!isRecord(requestedSchema.properties)\n\t) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\tserverName,\n\t\t\trequestId,\n\t\t\terror: \"Unsupported elicitation schema shape.\",\n\t\t};\n\t}\n\n\tconst fields = Object.entries(requestedSchema.properties).flatMap(\n\t\t([key, value]) => {\n\t\t\tconst field = parseFieldDefinition(key, value);\n\t\t\treturn field ? [field] : [];\n\t\t},\n\t);\n\tif (fields.length !== Object.keys(requestedSchema.properties).length) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\tserverName,\n\t\t\trequestId,\n\t\t\terror:\n\t\t\t\t\"This elicitation form contains field types the TUI does not support yet.\",\n\t\t};\n\t}\n\n\tconst requiredKeys = new Set(\n\t\tArray.isArray(requestedSchema.required)\n\t\t\t? requestedSchema.required.filter(\n\t\t\t\t\t(entry): entry is string => typeof entry === \"string\",\n\t\t\t\t)\n\t\t\t: [],\n\t);\n\n\treturn {\n\t\tkind: \"form\",\n\t\tserverName,\n\t\trequestId,\n\t\tmessage,\n\t\tfields,\n\t\trequiredKeys,\n\t};\n}\n\nfunction buildInitialValues(\n\tfields: FieldDefinition[],\n): Record<string, PrimitiveValue | undefined> {\n\tconst values: Record<string, PrimitiveValue | undefined> = {};\n\tfor (const field of fields) {\n\t\tif (field.kind === \"boolean\" && field.defaultValue !== undefined) {\n\t\t\tvalues[field.key] = field.defaultValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\t(field.kind === \"string\" || field.kind === \"select\") &&\n\t\t\tfield.defaultValue !== undefined\n\t\t) {\n\t\t\tvalues[field.key] = field.defaultValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.kind === \"number\" && field.defaultValue !== undefined) {\n\t\t\tvalues[field.key] = field.defaultValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.kind === \"multi-select\" && field.defaultValue !== undefined) {\n\t\t\tvalues[field.key] = [...field.defaultValue];\n\t\t}\n\t}\n\treturn values;\n}\n\nfunction validateCollectedForm(\n\trequest: ParsedFormRequest,\n\tvalues: Record<string, PrimitiveValue | undefined>,\n): { content?: Record<string, PrimitiveValue>; error?: string } {\n\tconst content: Record<string, PrimitiveValue> = {};\n\n\tfor (const field of request.fields) {\n\t\tconst required = request.requiredKeys.has(field.key);\n\t\tconst value = values[field.key];\n\n\t\tif (field.kind === \"boolean\") {\n\t\t\tif (typeof value !== \"boolean\") {\n\t\t\t\tif (required) {\n\t\t\t\t\treturn { error: `Select a value for ${field.label}.` };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcontent[field.key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.kind === \"number\") {\n\t\t\tif (typeof value !== \"number\" || Number.isNaN(value)) {\n\t\t\t\tif (required) {\n\t\t\t\t\treturn { error: `Enter a value for ${field.label}.` };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (field.integer && !Number.isInteger(value)) {\n\t\t\t\treturn { error: `${field.label} must be an integer.` };\n\t\t\t}\n\t\t\tif (field.minimum !== undefined && value < field.minimum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at least ${field.minimum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maximum !== undefined && value > field.maximum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at most ${field.maximum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcontent[field.key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.kind === \"multi-select\") {\n\t\t\tconst items = Array.isArray(value)\n\t\t\t\t? value.filter((entry): entry is string => typeof entry === \"string\")\n\t\t\t\t: [];\n\t\t\tif (required && items.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `Select at least one option for ${field.label}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.minItems !== undefined && items.length < field.minItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} needs at least ${field.minItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maxItems !== undefined && items.length > field.maxItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} allows at most ${field.maxItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (items.length > 0) {\n\t\t\t\tcontent[field.key] = items;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst text = typeof value === \"string\" ? value.trim() : \"\";\n\t\tif (!text) {\n\t\t\tif (required) {\n\t\t\t\treturn { error: `Enter a value for ${field.label}.` };\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.kind === \"string\") {\n\t\t\tif (field.minLength !== undefined && text.length < field.minLength) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at least ${field.minLength} characters.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maxLength !== undefined && text.length > field.maxLength) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at most ${field.maxLength} characters.`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcontent[field.key] = text;\n\t}\n\n\treturn { content };\n}\n\nfunction formatQueueSuffix(queueLength: number): string | null {\n\tif (queueLength <= 0) {\n\t\treturn null;\n\t}\n\treturn queueLength === 1\n\t\t? \"1 more request is queued behind this one.\"\n\t\t: `${queueLength} more requests are queued behind this one.`;\n}\n\nfunction formatAskUserPrompt(\n\tquestion: Question,\n\tindex: number,\n\ttotal: number,\n\tqueueLength: number,\n): string {\n\tconst optionLines = question.options.flatMap((option, optionIndex) => [\n\t\t`${optionIndex + 1}. ${option.label}: ${option.description}`,\n\t\t...formatAskUserOptionPreview(option),\n\t]);\n\tconst lines = [\n\t\t`Question ${index + 1} of ${total}`,\n\t\t`[${question.header}] ${question.question}`,\n\t\t\"\",\n\t\t...optionLines,\n\t\t`${question.options.length + 1}. Other: type your own answer directly`,\n\t\t\"\",\n\t\tquestion.multiSelect\n\t\t\t? \"Choose one or more options separated by commas, or type your own answer.\"\n\t\t\t: \"Choose one option by number or label, or type your own answer.\",\n\t\t\"Press Esc to cancel this input request.\",\n\t];\n\tconst queueSuffix = formatQueueSuffix(queueLength);\n\tif (queueSuffix) {\n\t\tlines.push(\"\", queueSuffix);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction formatAskUserOptionPreview(option: QuestionOption): string[] {\n\tif (!option.preview) {\n\t\treturn [];\n\t}\n\tconst title = option.preview.title ? `: ${option.preview.title}` : \"\";\n\tconst lines = option.preview.body.split(/\\r?\\n/);\n\tconst bodyLines = lines.slice(0, 12).map((line) => ` ${line}`);\n\tif (lines.length > bodyLines.length) {\n\t\tbodyLines.push(\" ...\");\n\t}\n\treturn [` Preview (${option.preview.kind}${title})`, ...bodyLines];\n}\n\nfunction normalizeAskUserAnswer(answer: string | string[]): {\n\terror?: string;\n\tvalue?: string;\n} {\n\tconst entries = (Array.isArray(answer) ? answer : [answer])\n\t\t.map((entry) => entry.trim())\n\t\t.filter((entry) => entry.length > 0);\n\tif (entries.length === 0) {\n\t\treturn {\n\t\t\terror: \"Select an option or enter a custom answer.\",\n\t\t};\n\t}\n\tif (entries.some((entry) => entry.toLowerCase() === \"other\")) {\n\t\treturn {\n\t\t\terror: \"Type the custom answer directly instead of selecting Other.\",\n\t\t};\n\t}\n\treturn {\n\t\tvalue: entries.join(\", \"),\n\t};\n}\n\nfunction parseBooleanInput(rawValue: string): boolean | undefined {\n\tswitch (rawValue.trim().toLowerCase()) {\n\t\tcase \"y\":\n\t\tcase \"yes\":\n\t\tcase \"true\":\n\t\tcase \"1\":\n\t\tcase \"on\":\n\t\t\treturn true;\n\t\tcase \"n\":\n\t\tcase \"no\":\n\t\tcase \"false\":\n\t\tcase \"0\":\n\t\tcase \"off\":\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction resolveSelectOption(\n\trawValue: string,\n\toptions: EnumOption[],\n): EnumOption | undefined {\n\tconst trimmed = rawValue.trim();\n\tif (!trimmed) {\n\t\treturn undefined;\n\t}\n\tconst index = Number.parseInt(trimmed, 10);\n\tif (!Number.isNaN(index) && index >= 1 && index <= options.length) {\n\t\treturn options[index - 1];\n\t}\n\tconst normalized = trimmed.toLowerCase();\n\treturn options.find(\n\t\t(option) =>\n\t\t\toption.value.toLowerCase() === normalized ||\n\t\t\toption.label.toLowerCase() === normalized,\n\t);\n}\n\nfunction formatFieldValue(\n\tvalue: PrimitiveValue | undefined,\n): string | undefined {\n\tif (typeof value === \"boolean\") {\n\t\treturn value ? \"yes\" : \"no\";\n\t}\n\tif (typeof value === \"number\") {\n\t\treturn String(value);\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.join(\", \");\n\t}\n\treturn undefined;\n}\n\nfunction formatOption(option: EnumOption, index: number): string {\n\tconst valueSuffix = option.label === option.value ? \"\" : ` (${option.value})`;\n\treturn `${index + 1}. ${option.label}${valueSuffix}`;\n}\n\nfunction formatFieldPrompt(\n\trequest: ParsedFormRequest,\n\tfield: FieldDefinition,\n\tindex: number,\n\tqueueLength: number,\n): string {\n\tconst required = request.requiredKeys.has(field.key);\n\tconst lines = [\n\t\t`Server: ${request.serverName}`,\n\t\t`Field ${index + 1} of ${request.fields.length}`,\n\t\trequest.message,\n\t\t\"\",\n\t\t`${field.label}${required ? \" (required)\" : \"\"}`,\n\t];\n\tif (field.description) {\n\t\tlines.push(field.description);\n\t}\n\n\tswitch (field.kind) {\n\t\tcase \"boolean\":\n\t\t\tlines.push(\"\", \"Type yes or no.\");\n\t\t\tbreak;\n\t\tcase \"string\":\n\t\t\tlines.push(\"\", \"Type a value and press Enter.\");\n\t\t\tif (field.format) {\n\t\t\t\tlines.push(`Expected format: ${field.format}.`);\n\t\t\t}\n\t\t\tif (field.minLength !== undefined) {\n\t\t\t\tlines.push(`Minimum length: ${field.minLength}.`);\n\t\t\t}\n\t\t\tif (field.maxLength !== undefined) {\n\t\t\t\tlines.push(`Maximum length: ${field.maxLength}.`);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tlines.push(\n\t\t\t\t\"\",\n\t\t\t\tfield.integer\n\t\t\t\t\t? \"Type an integer and press Enter.\"\n\t\t\t\t\t: \"Type a number and press Enter.\",\n\t\t\t);\n\t\t\tif (field.minimum !== undefined) {\n\t\t\t\tlines.push(`Minimum value: ${field.minimum}.`);\n\t\t\t}\n\t\t\tif (field.maximum !== undefined) {\n\t\t\t\tlines.push(`Maximum value: ${field.maximum}.`);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"select\":\n\t\t\tlines.push(\n\t\t\t\t\"\",\n\t\t\t\t...field.options.map((option, optionIndex) =>\n\t\t\t\t\tformatOption(option, optionIndex),\n\t\t\t\t),\n\t\t\t\t\"\",\n\t\t\t\t\"Choose an option by number, label, or value.\",\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"multi-select\":\n\t\t\tlines.push(\n\t\t\t\t\"\",\n\t\t\t\t...field.options.map((option, optionIndex) =>\n\t\t\t\t\tformatOption(option, optionIndex),\n\t\t\t\t),\n\t\t\t\t\"\",\n\t\t\t\t\"Choose one or more options separated by commas.\",\n\t\t\t);\n\t\t\tif (field.minItems !== undefined) {\n\t\t\t\tlines.push(`Minimum selections: ${field.minItems}.`);\n\t\t\t}\n\t\t\tif (field.maxItems !== undefined) {\n\t\t\t\tlines.push(`Maximum selections: ${field.maxItems}.`);\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tconst queueSuffix = formatQueueSuffix(queueLength);\n\tif (queueSuffix) {\n\t\tlines.push(\"\", queueSuffix);\n\t}\n\tlines.push(\n\t\t\"\",\n\t\t\"Submit a blank value to keep the default or skip an optional field.\",\n\t);\n\treturn lines.join(\"\\n\");\n}\n\nasync function openExternalUrl(url: string): Promise<boolean> {\n\tconst openCmd =\n\t\tprocess.platform === \"darwin\"\n\t\t\t? \"open\"\n\t\t\t: process.platform === \"win32\"\n\t\t\t\t? \"cmd\"\n\t\t\t\t: \"xdg-open\";\n\tconst args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\treturn new Promise((resolve) => {\n\t\texecFile(openCmd, args, (error) => resolve(!error));\n\t});\n}\n\nexport class ClientToolController {\n\tprivate readonly queue: TuiPendingClientToolRequest[] = [];\n\tprivate active: TuiPendingClientToolRequest | null = null;\n\tprivate modal: Modal | null = null;\n\tprivate processingNext = false;\n\tprivate readonly unsubscribe: () => void;\n\n\tconstructor(private readonly options: ClientToolControllerOptions) {\n\t\tthis.unsubscribe = this.options.clientToolService.subscribe((event) =>\n\t\t\tthis.handleLifecycleEvent(event),\n\t\t);\n\t}\n\n\tdispose(): void {\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate handleLifecycleEvent(event: TuiClientToolLifecycleEvent): void {\n\t\tif (event.type === \"registered\") {\n\t\t\tthis.enqueue(event.request);\n\t\t\treturn;\n\t\t}\n\t\tthis.options.onPendingStatusChange?.(event.request.id, null);\n\t\tif (this.active?.id === event.request.id) {\n\t\t\tthis.active = null;\n\t\t} else {\n\t\t\tconst queueIndex = this.queue.findIndex(\n\t\t\t\t(entry) => entry.id === event.request.id,\n\t\t\t);\n\t\t\tif (queueIndex >= 0) {\n\t\t\t\tthis.queue.splice(queueIndex, 1);\n\t\t\t}\n\t\t}\n\t\tthis.scheduleNext();\n\t}\n\n\tprivate enqueue(request: TuiPendingClientToolRequest): void {\n\t\tif (this.active?.id === request.id) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.queue.some((entry) => entry.id === request.id)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.queue.push(request);\n\t\tthis.options.onPendingStatusChange?.(\n\t\t\trequest.id,\n\t\t\tthis.getPendingStatus(request.toolName),\n\t\t);\n\t\tif (!this.active) {\n\t\t\tthis.scheduleNext();\n\t\t}\n\t}\n\n\tprivate scheduleNext(): void {\n\t\tif (this.processingNext) {\n\t\t\treturn;\n\t\t}\n\t\tthis.processingNext = true;\n\t\tqueueMicrotask(() => {\n\t\t\tthis.processingNext = false;\n\t\t\tthis.showNext();\n\t\t});\n\t}\n\n\tprivate showNext(): void {\n\t\tif (this.active || this.queue.length === 0) {\n\t\t\tif (!this.active && this.queue.length === 0) {\n\t\t\t\tthis.restoreEditor();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst next = this.queue.shift();\n\t\tif (!next) {\n\t\t\tthis.restoreEditor();\n\t\t\treturn;\n\t\t}\n\t\tthis.active = next;\n\t\tthis.showRequest(next);\n\t}\n\n\tprivate showRequest(request: TuiPendingClientToolRequest): void {\n\t\tif (request.toolName === \"ask_user\") {\n\t\t\tthis.showAskUserRequest(request);\n\t\t\treturn;\n\t\t}\n\t\tif (request.toolName === \"mcp_elicitation\") {\n\t\t\tthis.showMcpElicitationRequest(request);\n\t\t\treturn;\n\t\t}\n\t\tthis.options.notificationView.showError(\n\t\t\t`Unsupported local client tool: ${request.toolName}`,\n\t\t);\n\t\tthis.options.clientToolService.cancel(\n\t\t\trequest.id,\n\t\t\t`Unsupported local client tool: ${request.toolName}`,\n\t\t);\n\t}\n\n\tprivate showAskUserRequest(request: TuiPendingClientToolRequest): void {\n\t\tconst questions = extractQuestions(request.args);\n\t\tif (questions.length === 0) {\n\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\"Malformed ask_user request. Cancelling the pending input.\",\n\t\t\t);\n\t\t\tthis.options.clientToolService.resolve(\n\t\t\t\trequest.id,\n\t\t\t\t[{ type: \"text\", text: \"User cancelled structured input request.\" }],\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst answers: string[] = [];\n\t\tconst showQuestion = (index: number) => {\n\t\t\tconst question = questions[index];\n\t\t\tif (!question) {\n\t\t\t\tconst content =\n\t\t\t\t\tquestions.length === 1 ? (answers[0] ?? \"\") : answers.join(\"\\n\");\n\t\t\t\tthis.options.clientToolService.resolve(\n\t\t\t\t\trequest.id,\n\t\t\t\t\t[{ type: \"text\", text: content }],\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst modal = this.createInputModal({\n\t\t\t\tui: this.options.ui,\n\t\t\t\ttitle: \"Structured Input\",\n\t\t\t\tdescription: formatAskUserPrompt(\n\t\t\t\t\tquestion,\n\t\t\t\t\tindex,\n\t\t\t\t\tquestions.length,\n\t\t\t\t\tthis.queue.length,\n\t\t\t\t),\n\t\t\t\tplaceholder: \"Type an option number, label, or your own answer\",\n\t\t\t\tonSubmit: (value) => {\n\t\t\t\t\tconst trimmed = value.trim();\n\t\t\t\t\tif (!trimmed) {\n\t\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\t\t\"Select an option or enter a custom answer.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst parsed = parseUserResponse(trimmed, question);\n\t\t\t\t\tconst normalized = normalizeAskUserAnswer(parsed);\n\t\t\t\t\tif (!normalized.value) {\n\t\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\t\tnormalized.error ?? \"Select an option or enter a custom answer.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tanswers[index] =\n\t\t\t\t\t\tquestions.length === 1\n\t\t\t\t\t\t\t? normalized.value\n\t\t\t\t\t\t\t: `${question.header}: ${normalized.value}`;\n\t\t\t\t\tshowQuestion(index + 1);\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tthis.options.clientToolService.resolve(\n\t\t\t\t\t\trequest.id,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: \"User cancelled structured input request.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\t\t\tthis.showModal(modal);\n\t\t};\n\n\t\tshowQuestion(0);\n\t}\n\n\tprivate showMcpElicitationRequest(\n\t\trequest: TuiPendingClientToolRequest,\n\t): void {\n\t\tconst parsed = parseMcpElicitationRequest(request.args);\n\t\tif (parsed.kind === \"malformed\") {\n\t\t\tthis.options.notificationView.showError(\n\t\t\t\tparsed.error || \"Malformed MCP elicitation request.\",\n\t\t\t);\n\t\t\tthis.resolveMcpAction(request.id, \"cancel\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (parsed.kind === \"url\") {\n\t\t\tvoid Promise.resolve(\n\t\t\t\t(this.options.openUrl ?? openExternalUrl)(parsed.url),\n\t\t\t).then((opened) => {\n\t\t\t\tif (!opened) {\n\t\t\t\t\tthis.options.notificationView.showInfo(\n\t\t\t\t\t\t\"Could not auto-open the URL. Please open it manually.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst modal = this.createInputModal({\n\t\t\t\tui: this.options.ui,\n\t\t\t\ttitle: \"MCP URL Request\",\n\t\t\t\tdescription: [\n\t\t\t\t\t`Server: ${parsed.serverName}`,\n\t\t\t\t\tparsed.message,\n\t\t\t\t\t\"\",\n\t\t\t\t\tparsed.url,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"Type accept, decline, or cancel.\",\n\t\t\t\t\tformatQueueSuffix(this.queue.length),\n\t\t\t\t]\n\t\t\t\t\t.filter((line): line is string => Boolean(line))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\tplaceholder: \"accept | decline | cancel\",\n\t\t\t\tonSubmit: (value) => {\n\t\t\t\t\tconst action = value.trim().toLowerCase();\n\t\t\t\t\tif (\n\t\t\t\t\t\taction !== \"accept\" &&\n\t\t\t\t\t\taction !== \"decline\" &&\n\t\t\t\t\t\taction !== \"cancel\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\t\t\"Type accept, decline, or cancel.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.resolveMcpAction(\n\t\t\t\t\t\trequest.id,\n\t\t\t\t\t\taction as \"accept\" | \"decline\" | \"cancel\",\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tonCancel: () => this.resolveMcpAction(request.id, \"cancel\"),\n\t\t\t});\n\t\t\tthis.showModal(modal);\n\t\t\treturn;\n\t\t}\n\n\t\tif (parsed.fields.length === 0) {\n\t\t\tthis.resolveMcpAction(request.id, \"accept\", {});\n\t\t\treturn;\n\t\t}\n\n\t\tconst values = buildInitialValues(parsed.fields);\n\t\tconst showField = (index: number) => {\n\t\t\tconst field = parsed.fields[index];\n\t\t\tif (!field) {\n\t\t\t\tconst validation = validateCollectedForm(parsed, values);\n\t\t\t\tif (!validation.content) {\n\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\tvalidation.error ?? \"Unable to submit MCP input.\",\n\t\t\t\t\t);\n\t\t\t\t\tthis.resolveMcpAction(request.id, \"cancel\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.resolveMcpAction(request.id, \"accept\", validation.content);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst required = parsed.requiredKeys.has(field.key);\n\t\t\tconst currentValue = values[field.key];\n\t\t\tconst modal = this.createInputModal({\n\t\t\t\tui: this.options.ui,\n\t\t\t\ttitle: \"MCP Input\",\n\t\t\t\tdescription: formatFieldPrompt(parsed, field, index, this.queue.length),\n\t\t\t\tplaceholder: \"Submit the field value\",\n\t\t\t\tprefill: formatFieldValue(currentValue),\n\t\t\t\tonSubmit: (value) => {\n\t\t\t\t\tconst normalized = this.normalizeFieldValue(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\trequired,\n\t\t\t\t\t);\n\t\t\t\t\tif (normalized.error) {\n\t\t\t\t\t\tthis.options.notificationView.showError(normalized.error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvalues[field.key] = normalized.value;\n\t\t\t\t\tshowField(index + 1);\n\t\t\t\t},\n\t\t\t\tonCancel: () => this.resolveMcpAction(request.id, \"cancel\"),\n\t\t\t});\n\t\t\tthis.showModal(modal);\n\t\t};\n\n\t\tshowField(0);\n\t}\n\n\tprivate normalizeFieldValue(\n\t\tfield: FieldDefinition,\n\t\trawValue: string,\n\t\tcurrentValue: PrimitiveValue | undefined,\n\t\trequired: boolean,\n\t): { error?: string; value?: PrimitiveValue } {\n\t\tconst trimmed = rawValue.trim();\n\t\tif (!trimmed) {\n\t\t\tif (currentValue !== undefined) {\n\t\t\t\treturn { value: currentValue };\n\t\t\t}\n\t\t\tif (required) {\n\t\t\t\treturn { error: `Enter a value for ${field.label}.` };\n\t\t\t}\n\t\t\treturn { value: undefined };\n\t\t}\n\n\t\tif (field.kind === \"boolean\") {\n\t\t\tconst value = parseBooleanInput(trimmed);\n\t\t\tif (value === undefined) {\n\t\t\t\treturn { error: `${field.label} must be yes or no.` };\n\t\t\t}\n\t\t\treturn { value };\n\t\t}\n\n\t\tif (field.kind === \"number\") {\n\t\t\tconst value = Number(trimmed);\n\t\t\tif (!Number.isFinite(value)) {\n\t\t\t\treturn { error: `${field.label} must be a valid number.` };\n\t\t\t}\n\t\t\tif (field.integer && !Number.isInteger(value)) {\n\t\t\t\treturn { error: `${field.label} must be an integer.` };\n\t\t\t}\n\t\t\tif (field.minimum !== undefined && value < field.minimum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at least ${field.minimum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maximum !== undefined && value > field.maximum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at most ${field.maximum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { value };\n\t\t}\n\n\t\tif (field.kind === \"select\") {\n\t\t\tconst option = resolveSelectOption(trimmed, field.options);\n\t\t\tif (!option) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must match one of the listed options.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { value: option.value };\n\t\t}\n\n\t\tif (field.kind === \"multi-select\") {\n\t\t\tconst tokens = trimmed\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((token) => token.trim())\n\t\t\t\t.filter((token) => token.length > 0);\n\t\t\tif (tokens.length === 0) {\n\t\t\t\tif (required) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: `Select at least one option for ${field.label}.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn { value: undefined };\n\t\t\t}\n\t\t\tconst selections = new Set<string>();\n\t\t\tfor (const token of tokens) {\n\t\t\t\tconst option = resolveSelectOption(token, field.options);\n\t\t\t\tif (!option) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: `${field.label} must use the listed options.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tselections.add(option.value);\n\t\t\t}\n\t\t\tconst items = [...selections];\n\t\t\tif (field.minItems !== undefined && items.length < field.minItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} needs at least ${field.minItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maxItems !== undefined && items.length > field.maxItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} allows at most ${field.maxItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { value: items };\n\t\t}\n\n\t\tif (field.minLength !== undefined && trimmed.length < field.minLength) {\n\t\t\treturn {\n\t\t\t\terror: `${field.label} must be at least ${field.minLength} characters.`,\n\t\t\t};\n\t\t}\n\t\tif (field.maxLength !== undefined && trimmed.length > field.maxLength) {\n\t\t\treturn {\n\t\t\t\terror: `${field.label} must be at most ${field.maxLength} characters.`,\n\t\t\t};\n\t\t}\n\t\treturn { value: trimmed };\n\t}\n\n\tprivate resolveMcpAction(\n\t\trequestId: string,\n\t\taction: \"accept\" | \"decline\" | \"cancel\",\n\t\tcontent?: Record<string, PrimitiveValue>,\n\t): void {\n\t\tthis.options.clientToolService.resolve(\n\t\t\trequestId,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: JSON.stringify({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\t...(action === \"accept\" && content ? { content } : {}),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tfalse,\n\t\t);\n\t}\n\n\tprivate createInputModal(options: HookInputModalOptions): Modal {\n\t\treturn (\n\t\t\tthis.options.createInputModal ??\n\t\t\t((modalOptions: HookInputModalOptions) =>\n\t\t\t\tnew HookInputModal(modalOptions))\n\t\t)(options);\n\t}\n\n\tprivate showModal(modal: Modal): void {\n\t\tthis.modal = modal;\n\t\tthis.options.editorContainer.clear();\n\t\tthis.options.editorContainer.addChild(modal);\n\t\tthis.options.ui.setFocus(modal);\n\t\tthis.options.ui.requestRender();\n\t}\n\n\tprivate restoreEditor(): void {\n\t\tif (!this.modal) {\n\t\t\treturn;\n\t\t}\n\t\tthis.options.editorContainer.clear();\n\t\tthis.options.editorContainer.addChild(this.options.editor);\n\t\tthis.options.ui.setFocus(this.options.editor);\n\t\tthis.modal = null;\n\t\tthis.options.ui.requestRender();\n\t}\n\n\tprivate getPendingStatus(toolName: string): string {\n\t\tswitch (toolName) {\n\t\t\tcase \"ask_user\":\n\t\t\t\treturn \"Waiting for structured input\";\n\t\t\tcase \"mcp_elicitation\":\n\t\t\t\treturn \"Waiting for MCP input\";\n\t\t\tdefault:\n\t\t\t\treturn \"Waiting for local client tool\";\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"client-tool-controller.js","sourceRoot":"","sources":["../../../src/cli-tui/client-tools/client-tool-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile } from \"node:child_process\";\nimport type { Container, TUI } from \"@evalops/tui\";\nimport type { Question, QuestionOption } from \"../../tools/ask-user.js\";\nimport { extractQuestions, parseUserResponse } from \"../../tools/ask-user.js\";\nimport { isRecord } from \"../../utils/json.js\";\nimport type { CustomEditor } from \"../custom-editor.js\";\nimport {\n\tHookInputModal,\n\ttype HookInputModalOptions,\n} from \"../hooks/hook-input-modal.js\";\nimport type { Modal } from \"../modal-manager.js\";\nimport type { NotificationView } from \"../notification-view.js\";\nimport type {\n\tTuiClientToolLifecycleEvent,\n\tTuiClientToolService,\n\tTuiPendingClientToolRequest,\n} from \"./local-client-tool-service.js\";\n\ntype PrimitiveValue = string | number | boolean | string[];\n\ntype EnumOption = {\n\tlabel: string;\n\tvalue: string;\n};\n\ntype FieldDefinition =\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"boolean\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: boolean;\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"string\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: string;\n\t\t\tformat?: \"date\" | \"date-time\" | \"email\" | \"uri\";\n\t\t\tmaxLength?: number;\n\t\t\tminLength?: number;\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"number\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: number;\n\t\t\tinteger: boolean;\n\t\t\tmaximum?: number;\n\t\t\tminimum?: number;\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"select\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: string;\n\t\t\toptions: EnumOption[];\n\t }\n\t| {\n\t\t\tkey: string;\n\t\t\tkind: \"multi-select\";\n\t\t\tlabel: string;\n\t\t\tdescription?: string;\n\t\t\tdefaultValue?: string[];\n\t\t\tmaxItems?: number;\n\t\t\tminItems?: number;\n\t\t\toptions: EnumOption[];\n\t };\n\ntype ParsedFormRequest = {\n\tfields: FieldDefinition[];\n\tkind: \"form\";\n\tmessage: string;\n\trequestId: string;\n\trequiredKeys: Set<string>;\n\tserverName: string;\n};\n\ntype ParsedMalformedRequest = {\n\terror: string;\n\tkind: \"malformed\";\n\tmessage: string;\n\trequestId?: string;\n\tserverName?: string;\n};\n\ntype ParsedUrlRequest = {\n\telicitationId?: string;\n\tkind: \"url\";\n\tmessage: string;\n\trequestId: string;\n\tserverName: string;\n\turl: string;\n};\n\ntype ParsedRequest =\n\t| ParsedFormRequest\n\t| ParsedMalformedRequest\n\t| ParsedUrlRequest;\n\ninterface ClientToolControllerOptions {\n\tclientToolService: TuiClientToolService;\n\tui: TUI;\n\teditor: CustomEditor;\n\teditorContainer: Container;\n\tnotificationView: NotificationView;\n\tcreateInputModal?: (options: HookInputModalOptions) => Modal;\n\topenUrl?: (url: string) => boolean | Promise<boolean>;\n\tonPendingStatusChange?: (toolCallId: string, status: string | null) => void;\n}\n\nfunction getOptionalNumber(\n\trecord: Record<string, unknown>,\n\tkey: string,\n): number | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"number\" && Number.isFinite(value)\n\t\t? value\n\t\t: undefined;\n}\n\nfunction getOptionalString(\n\trecord: Record<string, unknown>,\n\tkey: string,\n): string | undefined {\n\tconst value = record[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction normalizeOptionEntries(\n\tvalues: string[],\n\tlabels?: string[],\n): EnumOption[] {\n\treturn values.map((value, index) => ({\n\t\tvalue,\n\t\tlabel: labels?.[index] ?? value,\n\t}));\n}\n\nfunction parseFieldDefinition(\n\tkey: string,\n\tvalue: unknown,\n): FieldDefinition | null {\n\tif (!isRecord(value) || typeof value.type !== \"string\") {\n\t\treturn null;\n\t}\n\n\tconst label = getOptionalString(value, \"title\") ?? key;\n\tconst description = getOptionalString(value, \"description\");\n\n\tif (value.type === \"boolean\") {\n\t\treturn {\n\t\t\tkey,\n\t\t\tkind: \"boolean\",\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tdefaultValue:\n\t\t\t\ttypeof value.default === \"boolean\" ? value.default : undefined,\n\t\t};\n\t}\n\n\tif (value.type === \"string\") {\n\t\tif (\n\t\t\tArray.isArray(value.enum) &&\n\t\t\tvalue.enum.every((entry) => typeof entry === \"string\")\n\t\t) {\n\t\t\tconst enumNames =\n\t\t\t\tArray.isArray(value.enumNames) &&\n\t\t\t\tvalue.enumNames.every((entry) => typeof entry === \"string\")\n\t\t\t\t\t? (value.enumNames as string[])\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\ttypeof value.default === \"string\" ? value.default : undefined,\n\t\t\t\toptions: normalizeOptionEntries(value.enum as string[], enumNames),\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tArray.isArray(value.oneOf) &&\n\t\t\tvalue.oneOf.every(\n\t\t\t\t(entry) =>\n\t\t\t\t\tisRecord(entry) &&\n\t\t\t\t\ttypeof entry.const === \"string\" &&\n\t\t\t\t\ttypeof entry.title === \"string\",\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\ttypeof value.default === \"string\" ? value.default : undefined,\n\t\t\t\toptions: (value.oneOf as Array<{ const: string; title: string }>).map(\n\t\t\t\t\t(entry) => ({\n\t\t\t\t\t\tvalue: entry.const,\n\t\t\t\t\t\tlabel: entry.title,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkey,\n\t\t\tkind: \"string\",\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tdefaultValue:\n\t\t\t\ttypeof value.default === \"string\" ? value.default : undefined,\n\t\t\tformat:\n\t\t\t\tvalue.format === \"date\" ||\n\t\t\t\tvalue.format === \"date-time\" ||\n\t\t\t\tvalue.format === \"email\" ||\n\t\t\t\tvalue.format === \"uri\"\n\t\t\t\t\t? value.format\n\t\t\t\t\t: undefined,\n\t\t\tmaxLength: getOptionalNumber(value, \"maxLength\"),\n\t\t\tminLength: getOptionalNumber(value, \"minLength\"),\n\t\t};\n\t}\n\n\tif (value.type === \"number\" || value.type === \"integer\") {\n\t\treturn {\n\t\t\tkey,\n\t\t\tkind: \"number\",\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tdefaultValue:\n\t\t\t\ttypeof value.default === \"number\" ? value.default : undefined,\n\t\t\tinteger: value.type === \"integer\",\n\t\t\tmaximum: getOptionalNumber(value, \"maximum\"),\n\t\t\tminimum: getOptionalNumber(value, \"minimum\"),\n\t\t};\n\t}\n\n\tif (value.type === \"array\" && isRecord(value.items)) {\n\t\tif (\n\t\t\tArray.isArray(value.items.enum) &&\n\t\t\tvalue.items.enum.every((entry) => typeof entry === \"string\")\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"multi-select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\tArray.isArray(value.default) &&\n\t\t\t\t\tvalue.default.every((entry) => typeof entry === \"string\")\n\t\t\t\t\t\t? [...(value.default as string[])]\n\t\t\t\t\t\t: undefined,\n\t\t\t\tminItems: getOptionalNumber(value, \"minItems\"),\n\t\t\t\tmaxItems: getOptionalNumber(value, \"maxItems\"),\n\t\t\t\toptions: normalizeOptionEntries(value.items.enum as string[]),\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tArray.isArray(value.items.anyOf) &&\n\t\t\tvalue.items.anyOf.every(\n\t\t\t\t(entry) =>\n\t\t\t\t\tisRecord(entry) &&\n\t\t\t\t\ttypeof entry.const === \"string\" &&\n\t\t\t\t\ttypeof entry.title === \"string\",\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tkind: \"multi-select\",\n\t\t\t\tlabel,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue:\n\t\t\t\t\tArray.isArray(value.default) &&\n\t\t\t\t\tvalue.default.every((entry) => typeof entry === \"string\")\n\t\t\t\t\t\t? [...(value.default as string[])]\n\t\t\t\t\t\t: undefined,\n\t\t\t\tminItems: getOptionalNumber(value, \"minItems\"),\n\t\t\t\tmaxItems: getOptionalNumber(value, \"maxItems\"),\n\t\t\t\toptions: (\n\t\t\t\t\tvalue.items.anyOf as Array<{ const: string; title: string }>\n\t\t\t\t).map((entry) => ({\n\t\t\t\t\tvalue: entry.const,\n\t\t\t\t\tlabel: entry.title,\n\t\t\t\t})),\n\t\t\t};\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction parseMcpElicitationRequest(args: unknown): ParsedRequest {\n\tif (!isRecord(args)) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage: \"MCP server requested additional input.\",\n\t\t\terror: \"Missing elicitation arguments.\",\n\t\t};\n\t}\n\n\tconst requestId = getOptionalString(args, \"requestId\");\n\tconst serverName = getOptionalString(args, \"serverName\");\n\tconst message =\n\t\tgetOptionalString(args, \"message\") ??\n\t\t\"MCP server requested additional input.\";\n\tif (!requestId || !serverName) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\terror: \"Missing elicitation request identity.\",\n\t\t};\n\t}\n\n\tif (args.mode === \"url\") {\n\t\tconst url = getOptionalString(args, \"url\");\n\t\tif (!url) {\n\t\t\treturn {\n\t\t\t\tkind: \"malformed\",\n\t\t\t\tmessage,\n\t\t\t\trequestId,\n\t\t\t\tserverName,\n\t\t\t\terror: \"Missing URL for URL-mode elicitation.\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"url\",\n\t\t\tmessage,\n\t\t\trequestId,\n\t\t\tserverName,\n\t\t\turl,\n\t\t\telicitationId: getOptionalString(args, \"elicitationId\"),\n\t\t};\n\t}\n\n\tconst requestedSchema = args.requestedSchema;\n\tif (!isRecord(requestedSchema)) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\tserverName,\n\t\t\trequestId,\n\t\t\terror: \"Missing requested schema for form elicitation.\",\n\t\t};\n\t}\n\tif (\n\t\trequestedSchema.type !== \"object\" ||\n\t\t!isRecord(requestedSchema.properties)\n\t) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\tserverName,\n\t\t\trequestId,\n\t\t\terror: \"Unsupported elicitation schema shape.\",\n\t\t};\n\t}\n\n\tconst fields = Object.entries(requestedSchema.properties).flatMap(\n\t\t([key, value]) => {\n\t\t\tconst field = parseFieldDefinition(key, value);\n\t\t\treturn field ? [field] : [];\n\t\t},\n\t);\n\tif (fields.length !== Object.keys(requestedSchema.properties).length) {\n\t\treturn {\n\t\t\tkind: \"malformed\",\n\t\t\tmessage,\n\t\t\tserverName,\n\t\t\trequestId,\n\t\t\terror:\n\t\t\t\t\"This elicitation form contains field types the TUI does not support yet.\",\n\t\t};\n\t}\n\n\tconst requiredKeys = new Set(\n\t\tArray.isArray(requestedSchema.required)\n\t\t\t? requestedSchema.required.filter(\n\t\t\t\t\t(entry): entry is string => typeof entry === \"string\",\n\t\t\t\t)\n\t\t\t: [],\n\t);\n\n\treturn {\n\t\tkind: \"form\",\n\t\tserverName,\n\t\trequestId,\n\t\tmessage,\n\t\tfields,\n\t\trequiredKeys,\n\t};\n}\n\nfunction buildInitialValues(\n\tfields: FieldDefinition[],\n): Record<string, PrimitiveValue | undefined> {\n\tconst values: Record<string, PrimitiveValue | undefined> = {};\n\tfor (const field of fields) {\n\t\tif (field.kind === \"boolean\" && field.defaultValue !== undefined) {\n\t\t\tvalues[field.key] = field.defaultValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (\n\t\t\t(field.kind === \"string\" || field.kind === \"select\") &&\n\t\t\tfield.defaultValue !== undefined\n\t\t) {\n\t\t\tvalues[field.key] = field.defaultValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.kind === \"number\" && field.defaultValue !== undefined) {\n\t\t\tvalues[field.key] = field.defaultValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.kind === \"multi-select\" && field.defaultValue !== undefined) {\n\t\t\tvalues[field.key] = [...field.defaultValue];\n\t\t}\n\t}\n\treturn values;\n}\n\nfunction validateCollectedForm(\n\trequest: ParsedFormRequest,\n\tvalues: Record<string, PrimitiveValue | undefined>,\n): { content?: Record<string, PrimitiveValue>; error?: string } {\n\tconst content: Record<string, PrimitiveValue> = {};\n\n\tfor (const field of request.fields) {\n\t\tconst required = request.requiredKeys.has(field.key);\n\t\tconst value = values[field.key];\n\n\t\tif (field.kind === \"boolean\") {\n\t\t\tif (typeof value !== \"boolean\") {\n\t\t\t\tif (required) {\n\t\t\t\t\treturn { error: `Select a value for ${field.label}.` };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcontent[field.key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.kind === \"number\") {\n\t\t\tif (typeof value !== \"number\" || Number.isNaN(value)) {\n\t\t\t\tif (required) {\n\t\t\t\t\treturn { error: `Enter a value for ${field.label}.` };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (field.integer && !Number.isInteger(value)) {\n\t\t\t\treturn { error: `${field.label} must be an integer.` };\n\t\t\t}\n\t\t\tif (field.minimum !== undefined && value < field.minimum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at least ${field.minimum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maximum !== undefined && value > field.maximum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at most ${field.maximum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcontent[field.key] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (field.kind === \"multi-select\") {\n\t\t\tconst items = Array.isArray(value)\n\t\t\t\t? value.filter((entry): entry is string => typeof entry === \"string\")\n\t\t\t\t: [];\n\t\t\tif (required && items.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `Select at least one option for ${field.label}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.minItems !== undefined && items.length < field.minItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} needs at least ${field.minItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maxItems !== undefined && items.length > field.maxItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} allows at most ${field.maxItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (items.length > 0) {\n\t\t\t\tcontent[field.key] = items;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst text = typeof value === \"string\" ? value.trim() : \"\";\n\t\tif (!text) {\n\t\t\tif (required) {\n\t\t\t\treturn { error: `Enter a value for ${field.label}.` };\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.kind === \"string\") {\n\t\t\tif (field.minLength !== undefined && text.length < field.minLength) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at least ${field.minLength} characters.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maxLength !== undefined && text.length > field.maxLength) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at most ${field.maxLength} characters.`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tcontent[field.key] = text;\n\t}\n\n\treturn { content };\n}\n\nfunction formatQueueSuffix(queueLength: number): string | null {\n\tif (queueLength <= 0) {\n\t\treturn null;\n\t}\n\treturn queueLength === 1\n\t\t? \"1 more request is queued behind this one.\"\n\t\t: `${queueLength} more requests are queued behind this one.`;\n}\n\nfunction formatAskUserPrompt(\n\tquestion: Question,\n\tindex: number,\n\ttotal: number,\n\tqueueLength: number,\n): string {\n\tconst optionLines = question.options.flatMap((option, optionIndex) => [\n\t\t`${optionIndex + 1}. ${option.label}: ${option.description}`,\n\t\t...formatAskUserOptionPreview(option),\n\t]);\n\tconst lines = [\n\t\t`Question ${index + 1} of ${total}`,\n\t\t`[${question.header}] ${question.question}`,\n\t\t\"\",\n\t\t...optionLines,\n\t\t`${question.options.length + 1}. Other: type your own answer directly`,\n\t\t\"\",\n\t\tquestion.multiSelect\n\t\t\t? \"Choose one or more options separated by commas, or type your own answer.\"\n\t\t\t: \"Choose one option by number or label, or type your own answer.\",\n\t\t\"Press Esc to cancel this input request.\",\n\t];\n\tconst queueSuffix = formatQueueSuffix(queueLength);\n\tif (queueSuffix) {\n\t\tlines.push(\"\", queueSuffix);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction formatAskUserOptionPreview(option: QuestionOption): string[] {\n\tif (!option.preview) {\n\t\treturn [];\n\t}\n\tconst title = option.preview.title ? `: ${option.preview.title}` : \"\";\n\tconst lines = option.preview.body.split(/\\r?\\n/);\n\tconst bodyLines = lines.slice(0, 12).map((line) => ` ${line}`);\n\tif (lines.length > bodyLines.length) {\n\t\tbodyLines.push(\" ...\");\n\t}\n\treturn [` Preview (${option.preview.kind}${title})`, ...bodyLines];\n}\n\nfunction normalizeAskUserAnswer(answer: string | string[]): {\n\terror?: string;\n\tvalue?: string;\n} {\n\tconst entries = (Array.isArray(answer) ? answer : [answer])\n\t\t.map((entry) => entry.trim())\n\t\t.filter((entry) => entry.length > 0);\n\tif (entries.length === 0) {\n\t\treturn {\n\t\t\terror: \"Select an option or enter a custom answer.\",\n\t\t};\n\t}\n\tif (entries.some((entry) => entry.toLowerCase() === \"other\")) {\n\t\treturn {\n\t\t\terror: \"Type the custom answer directly instead of selecting Other.\",\n\t\t};\n\t}\n\treturn {\n\t\tvalue: entries.join(\", \"),\n\t};\n}\n\nfunction parseBooleanInput(rawValue: string): boolean | undefined {\n\tswitch (rawValue.trim().toLowerCase()) {\n\t\tcase \"y\":\n\t\tcase \"yes\":\n\t\tcase \"true\":\n\t\tcase \"1\":\n\t\tcase \"on\":\n\t\t\treturn true;\n\t\tcase \"n\":\n\t\tcase \"no\":\n\t\tcase \"false\":\n\t\tcase \"0\":\n\t\tcase \"off\":\n\t\t\treturn false;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction resolveSelectOption(\n\trawValue: string,\n\toptions: EnumOption[],\n): EnumOption | undefined {\n\tconst trimmed = rawValue.trim();\n\tif (!trimmed) {\n\t\treturn undefined;\n\t}\n\tconst index = Number.parseInt(trimmed, 10);\n\tif (!Number.isNaN(index) && index >= 1 && index <= options.length) {\n\t\treturn options[index - 1];\n\t}\n\tconst normalized = trimmed.toLowerCase();\n\treturn options.find(\n\t\t(option) =>\n\t\t\toption.value.toLowerCase() === normalized ||\n\t\t\toption.label.toLowerCase() === normalized,\n\t);\n}\n\nfunction formatFieldValue(\n\tvalue: PrimitiveValue | undefined,\n): string | undefined {\n\tif (typeof value === \"boolean\") {\n\t\treturn value ? \"yes\" : \"no\";\n\t}\n\tif (typeof value === \"number\") {\n\t\treturn String(value);\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value.join(\", \");\n\t}\n\treturn undefined;\n}\n\nfunction formatOption(option: EnumOption, index: number): string {\n\tconst valueSuffix = option.label === option.value ? \"\" : ` (${option.value})`;\n\treturn `${index + 1}. ${option.label}${valueSuffix}`;\n}\n\nfunction formatFieldPrompt(\n\trequest: ParsedFormRequest,\n\tfield: FieldDefinition,\n\tindex: number,\n\tqueueLength: number,\n): string {\n\tconst required = request.requiredKeys.has(field.key);\n\tconst lines = [\n\t\t`Server: ${request.serverName}`,\n\t\t`Field ${index + 1} of ${request.fields.length}`,\n\t\trequest.message,\n\t\t\"\",\n\t\t`${field.label}${required ? \" (required)\" : \"\"}`,\n\t];\n\tif (field.description) {\n\t\tlines.push(field.description);\n\t}\n\n\tswitch (field.kind) {\n\t\tcase \"boolean\":\n\t\t\tlines.push(\"\", \"Type yes or no.\");\n\t\t\tbreak;\n\t\tcase \"string\":\n\t\t\tlines.push(\"\", \"Type a value and press Enter.\");\n\t\t\tif (field.format) {\n\t\t\t\tlines.push(`Expected format: ${field.format}.`);\n\t\t\t}\n\t\t\tif (field.minLength !== undefined) {\n\t\t\t\tlines.push(`Minimum length: ${field.minLength}.`);\n\t\t\t}\n\t\t\tif (field.maxLength !== undefined) {\n\t\t\t\tlines.push(`Maximum length: ${field.maxLength}.`);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tlines.push(\n\t\t\t\t\"\",\n\t\t\t\tfield.integer\n\t\t\t\t\t? \"Type an integer and press Enter.\"\n\t\t\t\t\t: \"Type a number and press Enter.\",\n\t\t\t);\n\t\t\tif (field.minimum !== undefined) {\n\t\t\t\tlines.push(`Minimum value: ${field.minimum}.`);\n\t\t\t}\n\t\t\tif (field.maximum !== undefined) {\n\t\t\t\tlines.push(`Maximum value: ${field.maximum}.`);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"select\":\n\t\t\tlines.push(\n\t\t\t\t\"\",\n\t\t\t\t...field.options.map((option, optionIndex) =>\n\t\t\t\t\tformatOption(option, optionIndex),\n\t\t\t\t),\n\t\t\t\t\"\",\n\t\t\t\t\"Choose an option by number, label, or value.\",\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"multi-select\":\n\t\t\tlines.push(\n\t\t\t\t\"\",\n\t\t\t\t...field.options.map((option, optionIndex) =>\n\t\t\t\t\tformatOption(option, optionIndex),\n\t\t\t\t),\n\t\t\t\t\"\",\n\t\t\t\t\"Choose one or more options separated by commas.\",\n\t\t\t);\n\t\t\tif (field.minItems !== undefined) {\n\t\t\t\tlines.push(`Minimum selections: ${field.minItems}.`);\n\t\t\t}\n\t\t\tif (field.maxItems !== undefined) {\n\t\t\t\tlines.push(`Maximum selections: ${field.maxItems}.`);\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tconst queueSuffix = formatQueueSuffix(queueLength);\n\tif (queueSuffix) {\n\t\tlines.push(\"\", queueSuffix);\n\t}\n\tlines.push(\n\t\t\"\",\n\t\t\"Submit a blank value to keep the default or skip an optional field.\",\n\t);\n\treturn lines.join(\"\\n\");\n}\n\nasync function openExternalUrl(url: string): Promise<boolean> {\n\tconst openCmd =\n\t\tprocess.platform === \"darwin\"\n\t\t\t? \"open\"\n\t\t\t: process.platform === \"win32\"\n\t\t\t\t? \"cmd\"\n\t\t\t\t: \"xdg-open\";\n\tconst args = process.platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n\treturn new Promise((resolve) => {\n\t\texecFile(openCmd, args, (error) => resolve(!error));\n\t});\n}\n\nexport class ClientToolController {\n\tprivate readonly queue: TuiPendingClientToolRequest[] = [];\n\tprivate active: TuiPendingClientToolRequest | null = null;\n\tprivate modal: Modal | null = null;\n\tprivate processingNext = false;\n\tprivate readonly unsubscribe: () => void;\n\n\tconstructor(private readonly options: ClientToolControllerOptions) {\n\t\tthis.unsubscribe = this.options.clientToolService.subscribe((event) =>\n\t\t\tthis.handleLifecycleEvent(event),\n\t\t);\n\t}\n\n\tdispose(): void {\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate handleLifecycleEvent(event: TuiClientToolLifecycleEvent): void {\n\t\tif (event.type === \"registered\") {\n\t\t\tthis.enqueue(event.request);\n\t\t\treturn;\n\t\t}\n\t\tthis.options.onPendingStatusChange?.(event.request.id, null);\n\t\tif (this.active?.id === event.request.id) {\n\t\t\tthis.active = null;\n\t\t} else {\n\t\t\tconst queueIndex = this.queue.findIndex(\n\t\t\t\t(entry) => entry.id === event.request.id,\n\t\t\t);\n\t\t\tif (queueIndex >= 0) {\n\t\t\t\tthis.queue.splice(queueIndex, 1);\n\t\t\t}\n\t\t}\n\t\tthis.scheduleNext();\n\t}\n\n\tprivate enqueue(request: TuiPendingClientToolRequest): void {\n\t\tif (this.active?.id === request.id) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.queue.some((entry) => entry.id === request.id)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.queue.push(request);\n\t\tthis.options.onPendingStatusChange?.(\n\t\t\trequest.id,\n\t\t\tthis.getPendingStatus(request.toolName),\n\t\t);\n\t\tif (!this.active) {\n\t\t\tthis.scheduleNext();\n\t\t}\n\t}\n\n\tprivate scheduleNext(): void {\n\t\tif (this.processingNext) {\n\t\t\treturn;\n\t\t}\n\t\tthis.processingNext = true;\n\t\tqueueMicrotask(() => {\n\t\t\tthis.processingNext = false;\n\t\t\tthis.showNext();\n\t\t});\n\t}\n\n\tprivate showNext(): void {\n\t\tif (this.active || this.queue.length === 0) {\n\t\t\tif (!this.active && this.queue.length === 0) {\n\t\t\t\tthis.restoreEditor();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst next = this.queue.shift();\n\t\tif (!next) {\n\t\t\tthis.restoreEditor();\n\t\t\treturn;\n\t\t}\n\t\tthis.active = next;\n\t\tthis.showRequest(next);\n\t}\n\n\tprivate showRequest(request: TuiPendingClientToolRequest): void {\n\t\tif (request.toolName === \"ask_user\") {\n\t\t\tthis.showAskUserRequest(request);\n\t\t\treturn;\n\t\t}\n\t\tif (request.toolName === \"mcp_elicitation\") {\n\t\t\tthis.showMcpElicitationRequest(request);\n\t\t\treturn;\n\t\t}\n\t\tthis.options.notificationView.showError(\n\t\t\t`Unsupported local client tool: ${request.toolName}`,\n\t\t);\n\t\tthis.options.clientToolService.cancel(\n\t\t\trequest.id,\n\t\t\t`Unsupported local client tool: ${request.toolName}`,\n\t\t);\n\t}\n\n\tprivate showAskUserRequest(request: TuiPendingClientToolRequest): void {\n\t\tconst questions = extractQuestions(request.args);\n\t\tif (questions.length === 0) {\n\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\"Malformed ask_user request. Cancelling the pending input.\",\n\t\t\t);\n\t\t\tthis.options.clientToolService.resolve(\n\t\t\t\trequest.id,\n\t\t\t\t[{ type: \"text\", text: \"User cancelled structured input request.\" }],\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst answers: string[] = [];\n\t\tconst showQuestion = (index: number) => {\n\t\t\tconst question = questions[index];\n\t\t\tif (!question) {\n\t\t\t\tconst content =\n\t\t\t\t\tquestions.length === 1 ? (answers[0] ?? \"\") : answers.join(\"\\n\");\n\t\t\t\tthis.options.clientToolService.resolve(\n\t\t\t\t\trequest.id,\n\t\t\t\t\t[{ type: \"text\", text: content }],\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst modal = this.createInputModal({\n\t\t\t\tui: this.options.ui,\n\t\t\t\ttitle: \"Structured Input\",\n\t\t\t\tdescription: formatAskUserPrompt(\n\t\t\t\t\tquestion,\n\t\t\t\t\tindex,\n\t\t\t\t\tquestions.length,\n\t\t\t\t\tthis.queue.length,\n\t\t\t\t),\n\t\t\t\tplaceholder: \"Type an option number, label, or your own answer\",\n\t\t\t\tonSubmit: (value) => {\n\t\t\t\t\tconst trimmed = value.trim();\n\t\t\t\t\tif (!trimmed) {\n\t\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\t\t\"Select an option or enter a custom answer.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst parsed = parseUserResponse(trimmed, question);\n\t\t\t\t\tconst normalized = normalizeAskUserAnswer(parsed);\n\t\t\t\t\tif (!normalized.value) {\n\t\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\t\tnormalized.error ?? \"Select an option or enter a custom answer.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tanswers[index] =\n\t\t\t\t\t\tquestions.length === 1\n\t\t\t\t\t\t\t? normalized.value\n\t\t\t\t\t\t\t: `${question.header}: ${normalized.value}`;\n\t\t\t\t\tshowQuestion(index + 1);\n\t\t\t\t},\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tthis.options.clientToolService.resolve(\n\t\t\t\t\t\trequest.id,\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\ttext: \"User cancelled structured input request.\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t});\n\t\t\tthis.showModal(modal);\n\t\t};\n\n\t\tshowQuestion(0);\n\t}\n\n\tprivate showMcpElicitationRequest(\n\t\trequest: TuiPendingClientToolRequest,\n\t): void {\n\t\tconst parsed = parseMcpElicitationRequest(request.args);\n\t\tif (parsed.kind === \"malformed\") {\n\t\t\tthis.options.notificationView.showError(\n\t\t\t\tparsed.error || \"Malformed MCP elicitation request.\",\n\t\t\t);\n\t\t\tthis.resolveMcpAction(request.id, \"cancel\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (parsed.kind === \"url\") {\n\t\t\tvoid Promise.resolve(\n\t\t\t\t(this.options.openUrl ?? openExternalUrl)(parsed.url),\n\t\t\t).then((opened) => {\n\t\t\t\tif (!opened) {\n\t\t\t\t\tthis.options.notificationView.showInfo(\n\t\t\t\t\t\t\"Could not auto-open the URL. Please open it manually.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst modal = this.createInputModal({\n\t\t\t\tui: this.options.ui,\n\t\t\t\ttitle: \"MCP URL Request\",\n\t\t\t\tdescription: [\n\t\t\t\t\t`Server: ${parsed.serverName}`,\n\t\t\t\t\tparsed.message,\n\t\t\t\t\t\"\",\n\t\t\t\t\tparsed.url,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"Type accept, decline, or cancel.\",\n\t\t\t\t\tformatQueueSuffix(this.queue.length),\n\t\t\t\t]\n\t\t\t\t\t.filter((line): line is string => Boolean(line))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\tplaceholder: \"accept | decline | cancel\",\n\t\t\t\tonSubmit: (value) => {\n\t\t\t\t\tconst action = value.trim().toLowerCase();\n\t\t\t\t\tif (\n\t\t\t\t\t\taction !== \"accept\" &&\n\t\t\t\t\t\taction !== \"decline\" &&\n\t\t\t\t\t\taction !== \"cancel\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\t\t\"Type accept, decline, or cancel.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.resolveMcpAction(\n\t\t\t\t\t\trequest.id,\n\t\t\t\t\t\taction as \"accept\" | \"decline\" | \"cancel\",\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tonCancel: () => this.resolveMcpAction(request.id, \"cancel\"),\n\t\t\t});\n\t\t\tthis.showModal(modal);\n\t\t\treturn;\n\t\t}\n\n\t\tif (parsed.fields.length === 0) {\n\t\t\tthis.resolveMcpAction(request.id, \"accept\", {});\n\t\t\treturn;\n\t\t}\n\n\t\tconst values = buildInitialValues(parsed.fields);\n\t\tconst showField = (index: number) => {\n\t\t\tconst field = parsed.fields[index];\n\t\t\tif (!field) {\n\t\t\t\tconst validation = validateCollectedForm(parsed, values);\n\t\t\t\tif (!validation.content) {\n\t\t\t\t\tthis.options.notificationView.showError(\n\t\t\t\t\t\tvalidation.error ?? \"Unable to submit MCP input.\",\n\t\t\t\t\t);\n\t\t\t\t\tthis.resolveMcpAction(request.id, \"cancel\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.resolveMcpAction(request.id, \"accept\", validation.content);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst required = parsed.requiredKeys.has(field.key);\n\t\t\tconst currentValue = values[field.key];\n\t\t\tconst modal = this.createInputModal({\n\t\t\t\tui: this.options.ui,\n\t\t\t\ttitle: \"MCP Input\",\n\t\t\t\tdescription: formatFieldPrompt(parsed, field, index, this.queue.length),\n\t\t\t\tplaceholder: \"Submit the field value\",\n\t\t\t\tprefill: formatFieldValue(currentValue),\n\t\t\t\tonSubmit: (value) => {\n\t\t\t\t\tconst normalized = this.normalizeFieldValue(\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tcurrentValue,\n\t\t\t\t\t\trequired,\n\t\t\t\t\t);\n\t\t\t\t\tif (normalized.error) {\n\t\t\t\t\t\tthis.options.notificationView.showError(normalized.error);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvalues[field.key] = normalized.value;\n\t\t\t\t\tshowField(index + 1);\n\t\t\t\t},\n\t\t\t\tonCancel: () => this.resolveMcpAction(request.id, \"cancel\"),\n\t\t\t});\n\t\t\tthis.showModal(modal);\n\t\t};\n\n\t\tshowField(0);\n\t}\n\n\tprivate normalizeFieldValue(\n\t\tfield: FieldDefinition,\n\t\trawValue: string,\n\t\tcurrentValue: PrimitiveValue | undefined,\n\t\trequired: boolean,\n\t): { error?: string; value?: PrimitiveValue } {\n\t\tconst trimmed = rawValue.trim();\n\t\tif (!trimmed) {\n\t\t\tif (currentValue !== undefined) {\n\t\t\t\treturn { value: currentValue };\n\t\t\t}\n\t\t\tif (required) {\n\t\t\t\treturn { error: `Enter a value for ${field.label}.` };\n\t\t\t}\n\t\t\treturn { value: undefined };\n\t\t}\n\n\t\tif (field.kind === \"boolean\") {\n\t\t\tconst value = parseBooleanInput(trimmed);\n\t\t\tif (value === undefined) {\n\t\t\t\treturn { error: `${field.label} must be yes or no.` };\n\t\t\t}\n\t\t\treturn { value };\n\t\t}\n\n\t\tif (field.kind === \"number\") {\n\t\t\tconst value = Number(trimmed);\n\t\t\tif (!Number.isFinite(value)) {\n\t\t\t\treturn { error: `${field.label} must be a valid number.` };\n\t\t\t}\n\t\t\tif (field.integer && !Number.isInteger(value)) {\n\t\t\t\treturn { error: `${field.label} must be an integer.` };\n\t\t\t}\n\t\t\tif (field.minimum !== undefined && value < field.minimum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at least ${field.minimum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maximum !== undefined && value > field.maximum) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must be at most ${field.maximum}.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { value };\n\t\t}\n\n\t\tif (field.kind === \"select\") {\n\t\t\tconst option = resolveSelectOption(trimmed, field.options);\n\t\t\tif (!option) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} must match one of the listed options.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { value: option.value };\n\t\t}\n\n\t\tif (field.kind === \"multi-select\") {\n\t\t\tconst tokens = trimmed\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((token) => token.trim())\n\t\t\t\t.filter((token) => token.length > 0);\n\t\t\tif (tokens.length === 0) {\n\t\t\t\tif (required) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: `Select at least one option for ${field.label}.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn { value: undefined };\n\t\t\t}\n\t\t\tconst selections = new Set<string>();\n\t\t\tfor (const token of tokens) {\n\t\t\t\tconst option = resolveSelectOption(token, field.options);\n\t\t\t\tif (!option) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: `${field.label} must use the listed options.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tselections.add(option.value);\n\t\t\t}\n\t\t\tconst items = [...selections];\n\t\t\tif (field.minItems !== undefined && items.length < field.minItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} needs at least ${field.minItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (field.maxItems !== undefined && items.length > field.maxItems) {\n\t\t\t\treturn {\n\t\t\t\t\terror: `${field.label} allows at most ${field.maxItems} selections.`,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { value: items };\n\t\t}\n\n\t\tif (field.minLength !== undefined && trimmed.length < field.minLength) {\n\t\t\treturn {\n\t\t\t\terror: `${field.label} must be at least ${field.minLength} characters.`,\n\t\t\t};\n\t\t}\n\t\tif (field.maxLength !== undefined && trimmed.length > field.maxLength) {\n\t\t\treturn {\n\t\t\t\terror: `${field.label} must be at most ${field.maxLength} characters.`,\n\t\t\t};\n\t\t}\n\t\treturn { value: trimmed };\n\t}\n\n\tprivate resolveMcpAction(\n\t\trequestId: string,\n\t\taction: \"accept\" | \"decline\" | \"cancel\",\n\t\tcontent?: Record<string, PrimitiveValue>,\n\t): void {\n\t\tthis.options.clientToolService.resolve(\n\t\t\trequestId,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: JSON.stringify({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\t...(action === \"accept\" && content ? { content } : {}),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t\tfalse,\n\t\t);\n\t}\n\n\tprivate createInputModal(options: HookInputModalOptions): Modal {\n\t\treturn (\n\t\t\tthis.options.createInputModal ??\n\t\t\t((modalOptions: HookInputModalOptions) =>\n\t\t\t\tnew HookInputModal(modalOptions))\n\t\t)(options);\n\t}\n\n\tprivate showModal(modal: Modal): void {\n\t\tthis.modal = modal;\n\t\tthis.options.editorContainer.clear();\n\t\tthis.options.editorContainer.addChild(modal);\n\t\tthis.options.ui.setFocus(modal);\n\t\tthis.options.ui.requestRender();\n\t}\n\n\tprivate restoreEditor(): void {\n\t\tif (!this.modal) {\n\t\t\treturn;\n\t\t}\n\t\tthis.options.editorContainer.clear();\n\t\tthis.options.editorContainer.addChild(this.options.editor);\n\t\tthis.options.ui.setFocus(this.options.editor);\n\t\tthis.modal = null;\n\t\tthis.options.ui.requestRender();\n\t}\n\n\tprivate getPendingStatus(toolName: string): string {\n\t\tswitch (toolName) {\n\t\t\tcase \"ask_user\":\n\t\t\t\treturn \"Waiting for structured input\";\n\t\t\tcase \"mcp_elicitation\":\n\t\t\t\treturn \"Waiting for MCP input\";\n\t\t\tdefault:\n\t\t\t\treturn \"Waiting for local client tool\";\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"undo-handlers.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/commands/undo-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,IAAI,IAAI,CAAC;CACtB;AAqBD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAwHtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CA6FjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAoFpE"}
1
+ {"version":3,"file":"undo-handlers.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/commands/undo-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,IAAI,IAAI,CAAC;CACtB;AAqBD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAwHtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CA6FjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAwFpE"}
@@ -275,8 +275,12 @@ export function handleCheckpointCommand(ctx) {
275
275
  ctx.showError("Usage: /checkpoint delete <name>");
276
276
  return;
277
277
  }
278
- // Note: Would need to add a delete method to tracker
279
- ctx.showInfo("Checkpoint deletion not yet implemented");
278
+ const removed = tracker.deleteCheckpoint(name);
279
+ if (!removed) {
280
+ ctx.showError(`Checkpoint not found: ${name}`);
281
+ return;
282
+ }
283
+ ctx.showSuccess(`Deleted checkpoint "${name}"`);
280
284
  break;
281
285
  }
282
286
  default:
@@ -290,6 +294,7 @@ function handleCheckpointHelp(ctx) {
290
294
  " /checkpoint list List all checkpoints",
291
295
  " /checkpoint save <name> Save current state as checkpoint",
292
296
  " /checkpoint restore <name> Restore to a checkpoint",
297
+ " /checkpoint delete <name> Delete a checkpoint",
293
298
  "",
294
299
  "Checkpoints mark a point in the change history.",
295
300
  "Restoring undoes all changes made after the checkpoint.",
@@ -1 +1 @@
1
- {"version":3,"file":"undo-handlers.js","sourceRoot":"","sources":["../../../src/cli-tui/commands/undo-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Enhanced undo command handlers for TUI.\n *\n * Provides:\n * - /undo [N] [--preview] [--force] - Undo last N changes\n * - /changes [--files|--tools] - List file changes\n * - /checkpoint [save|list|restore] - Checkpoint management\n */\n\nimport chalk from \"chalk\";\nimport { getCheckpointService } from \"../../checkpoints/index.js\";\nimport { getChangeTracker } from \"../../undo/index.js\";\nimport type { FileChange } from \"../../undo/types.js\";\n\nexport interface UndoRenderContext {\n\trawInput: string;\n\taddContent(content: string): void;\n\tshowError(message: string): void;\n\tshowInfo(message: string): void;\n\tshowSuccess(message: string): void;\n\trequestRender(): void;\n}\n\n/**\n * Format a timestamp as relative time.\n */\nfunction formatRelativeTime(timestamp: number): string {\n\tconst diff = Date.now() - timestamp;\n\tif (diff < 60000) return \"just now\";\n\tif (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n\tif (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n\treturn `${Math.floor(diff / 86400000)}d ago`;\n}\n\n/**\n * Format a file path for display (truncate if too long).\n */\nfunction formatPath(path: string, maxLen = 50): string {\n\tif (path.length <= maxLen) return path;\n\treturn `...${path.slice(-(maxLen - 3))}`;\n}\n\n/**\n * Handle the enhanced /undo command.\n */\nexport function handleEnhancedUndoCommand(ctx: UndoRenderContext): void {\n\tconst args = ctx.rawInput.replace(/^\\/undo\\s*/, \"\").trim();\n\tconst parts = args.split(/\\s+/).filter(Boolean);\n\n\tconst isPreview = parts.includes(\"--preview\") || parts.includes(\"-p\");\n\tconst isForce = parts.includes(\"--force\") || parts.includes(\"-f\");\n\tconst countArg = parts.find((p) => /^\\d+$/.test(p));\n\tconst count = countArg ? Number.parseInt(countArg, 10) : 1;\n\n\tconst tracker = getChangeTracker();\n\tconst stats = tracker.getStats();\n\n\tif (stats.totalChanges === 0) {\n\t\tconst checkpointSvc = getCheckpointService();\n\t\tif (checkpointSvc?.canUndo()) {\n\t\t\tif (isPreview) {\n\t\t\t\tconst history = checkpointSvc.getHistory();\n\t\t\t\tconst lastCheckpoint = history.at(-1);\n\t\t\t\tif (!lastCheckpoint) {\n\t\t\t\t\tctx.showInfo(\"No checkpoints available to undo.\");\n\t\t\t\t} else {\n\t\t\t\t\tconst lines = [\n\t\t\t\t\t\t\"Checkpoint Undo Preview\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t`Would restore ${lastCheckpoint.fileCount} file${lastCheckpoint.fileCount === 1 ? \"\" : \"s\"} to state before \"${lastCheckpoint.description}\"`,\n\t\t\t\t\t\tchalk.dim(\"Run /undo to apply\"),\n\t\t\t\t\t];\n\t\t\t\t\tctx.addContent(lines.join(\"\\n\"));\n\t\t\t\t\tctx.requestRender();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst result = checkpointSvc.undo();\n\t\t\t\tif (result.success) {\n\t\t\t\t\tconst restored = result.files?.length ?? 0;\n\t\t\t\t\tctx.showSuccess(\n\t\t\t\t\t\t`Restored ${restored} file${restored === 1 ? \"\" : \"s\"} from last checkpoint.`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tctx.showError(result.message);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tctx.showInfo(\n\t\t\t\t\"No changes to undo. File changes are tracked during this session.\",\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isPreview) {\n\t\tconst preview = tracker.previewUndo(count);\n\n\t\tif (preview.changes.length === 0) {\n\t\t\tctx.showInfo(\"No changes to undo.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lines = [\n\t\t\t`Undo Preview (${preview.changes.length} change${preview.changes.length === 1 ? \"\" : \"s\"})`,\n\t\t\t\"\",\n\t\t];\n\n\t\tfor (const change of preview.changes) {\n\t\t\tconst icon =\n\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\tconst action =\n\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t? \"would delete\"\n\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t? \"would restore\"\n\t\t\t\t\t\t: \"would revert\";\n\t\t\tlines.push(\n\t\t\t\t` ${icon} ${formatPath(change.path)} ${chalk.dim(`(${action})`)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (preview.conflicts.length > 0) {\n\t\t\tlines.push(\"\", chalk.yellow(\"Conflicts:\"));\n\t\t\tfor (const conflict of preview.conflicts) {\n\t\t\t\tlines.push(` ${chalk.red(\"!\")} ${conflict.path}: ${conflict.reason}`);\n\t\t\t}\n\t\t\tlines.push(\"\", chalk.dim(\"Use --force to override conflicts\"));\n\t\t}\n\n\t\tlines.push(\"\", chalk.dim(`Run /undo ${count} to apply`));\n\n\t\tctx.addContent(lines.join(\"\\n\"));\n\t\tctx.requestRender();\n\t\treturn;\n\t}\n\n\t// Perform the undo\n\tconst result = tracker.undo(count, isForce);\n\n\tif (result.undone === 0 && result.errors.length > 0) {\n\t\tctx.showError(`Undo failed:\\n${result.errors.join(\"\\n\")}`);\n\t\treturn;\n\t}\n\n\tif (result.undone > 0) {\n\t\tlet message = `Undid ${result.undone} change${result.undone === 1 ? \"\" : \"s\"}`;\n\t\tif (result.skipped > 0) {\n\t\t\tmessage += ` (${result.skipped} skipped)`;\n\t\t}\n\t\tctx.showSuccess(message);\n\t} else {\n\t\tctx.showInfo(\"No changes were undone.\");\n\t}\n\n\tif (result.errors.length > 0) {\n\t\tctx.addContent(\n\t\t\tchalk.yellow(\"Warnings:\\n\") +\n\t\t\t\tresult.errors.map((e) => ` ${e}`).join(\"\\n\"),\n\t\t);\n\t\tctx.requestRender();\n\t}\n}\n\n/**\n * Handle the /changes command.\n */\nexport function handleChangesCommand(ctx: UndoRenderContext): void {\n\tconst args = ctx.rawInput.replace(/^\\/changes\\s*/, \"\").trim();\n\tconst groupByFiles = args.includes(\"--files\") || args.includes(\"-f\");\n\tconst groupByTools = args.includes(\"--tools\") || args.includes(\"-t\");\n\n\tconst tracker = getChangeTracker();\n\tconst changes = tracker.getChanges();\n\tconst stats = tracker.getStats();\n\n\tif (changes.length === 0) {\n\t\tctx.showInfo(\n\t\t\t\"No file changes tracked yet. Changes are recorded when tools modify files.\",\n\t\t);\n\t\treturn;\n\t}\n\n\tconst lines = [`File Changes (${changes.length} total)`, \"\"];\n\n\tif (groupByFiles) {\n\t\t// Group by file path\n\t\tconst byPath = new Map<string, FileChange[]>();\n\t\tfor (const change of changes) {\n\t\t\tconst existing = byPath.get(change.path) ?? [];\n\t\t\texisting.push(change);\n\t\t\tbyPath.set(change.path, existing);\n\t\t}\n\n\t\tfor (const [path, fileChanges] of byPath) {\n\t\t\tlines.push(chalk.cyan(formatPath(path, 60)));\n\t\t\tfor (const change of fileChanges) {\n\t\t\t\tconst icon =\n\t\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\t\tlines.push(\n\t\t\t\t\t` ${icon} ${change.type} by ${change.toolName} ${chalk.dim(formatRelativeTime(change.timestamp))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else if (groupByTools) {\n\t\t// Group by tool\n\t\tfor (const [tool, count] of Object.entries(stats.byTool)) {\n\t\t\tconst toolChanges = changes.filter((c) => c.toolName === tool);\n\t\t\tlines.push(`${chalk.cyan(tool)} (${count} changes)`);\n\t\t\tfor (const change of toolChanges.slice(-5)) {\n\t\t\t\tconst icon =\n\t\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\t\tlines.push(\n\t\t\t\t\t` ${icon} ${formatPath(change.path, 45)} ${chalk.dim(formatRelativeTime(change.timestamp))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (toolChanges.length > 5) {\n\t\t\t\tlines.push(chalk.dim(` ... and ${toolChanges.length - 5} more`));\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Chronological list (newest first)\n\t\tconst recent = changes.slice(-15).reverse();\n\t\tfor (let i = 0; i < recent.length; i++) {\n\t\t\tconst change = recent[i];\n\t\t\tif (!change) continue;\n\t\t\tconst icon =\n\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\tconst num = chalk.dim(`${i + 1}.`);\n\t\t\tlines.push(\n\t\t\t\t`${num} ${icon} [${change.toolName}] ${formatPath(change.path, 40)} ${chalk.dim(formatRelativeTime(change.timestamp))}`,\n\t\t\t);\n\t\t}\n\t\tif (changes.length > 15) {\n\t\t\tlines.push(chalk.dim(`... and ${changes.length - 15} older changes`));\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(\n\t\tchalk.dim(\n\t\t\t`Types: ${stats.byType.create} created, ${stats.byType.modify} modified, ${stats.byType.delete} deleted`,\n\t\t),\n\t);\n\tlines.push(chalk.dim(\"Use /undo N to undo last N changes\"));\n\n\tctx.addContent(lines.join(\"\\n\"));\n\tctx.requestRender();\n}\n\n/**\n * Handle the /checkpoint command.\n */\nexport function handleCheckpointCommand(ctx: UndoRenderContext): void {\n\tconst args = ctx.rawInput.replace(/^\\/checkpoint\\s*/, \"\").trim();\n\tconst parts = args.split(/\\s+/).filter(Boolean);\n\tconst subcommand = parts[0]?.toLowerCase() || \"list\";\n\n\tconst tracker = getChangeTracker();\n\n\tswitch (subcommand) {\n\t\tcase \"save\": {\n\t\t\tconst name = parts[1];\n\t\t\tif (!name) {\n\t\t\t\tctx.showError(\"Usage: /checkpoint save <name> [description]\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst description = parts.slice(2).join(\" \") || undefined;\n\t\t\tconst checkpoint = tracker.createCheckpoint(name, description);\n\t\t\tctx.showSuccess(\n\t\t\t\t`Checkpoint \"${name}\" saved at ${checkpoint.changeCount} changes`,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"list\":\n\t\tcase \"ls\": {\n\t\t\tconst checkpoints = tracker.getCheckpoints();\n\t\t\tif (checkpoints.length === 0) {\n\t\t\t\tctx.showInfo(\n\t\t\t\t\t\"No checkpoints saved. Use /checkpoint save <name> to create one.\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lines = [\"Checkpoints\", \"\"];\n\t\t\tfor (const cp of checkpoints) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` ${chalk.cyan(cp.name)} - ${cp.changeCount} changes ${chalk.dim(formatRelativeTime(cp.timestamp))}`,\n\t\t\t\t);\n\t\t\t\tif (cp.description) {\n\t\t\t\t\tlines.push(` ${chalk.dim(cp.description)}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(chalk.dim(\"Use /checkpoint restore <name> to restore\"));\n\n\t\t\tctx.addContent(lines.join(\"\\n\"));\n\t\t\tctx.requestRender();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"restore\": {\n\t\t\tconst name = parts[1];\n\t\t\tif (!name) {\n\t\t\t\tctx.showError(\"Usage: /checkpoint restore <name> [--force]\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst force = parts.includes(\"--force\") || parts.includes(\"-f\");\n\t\t\tconst result = tracker.restoreCheckpoint(name, force);\n\n\t\t\tif (result.errors.length > 0 && result.undone === 0) {\n\t\t\t\tctx.showError(`Restore failed:\\n${result.errors.join(\"\\n\")}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.showSuccess(\n\t\t\t\t`Restored to checkpoint \"${name}\" (${result.undone} changes undone)`,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"delete\":\n\t\tcase \"rm\": {\n\t\t\tconst name = parts[1];\n\t\t\tif (!name) {\n\t\t\t\tctx.showError(\"Usage: /checkpoint delete <name>\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Note: Would need to add a delete method to tracker\n\t\t\tctx.showInfo(\"Checkpoint deletion not yet implemented\");\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\thandleCheckpointHelp(ctx);\n\t}\n}\n\nfunction handleCheckpointHelp(ctx: UndoRenderContext): void {\n\tconst lines = [\n\t\t\"Checkpoint Commands\",\n\t\t\"\",\n\t\t\" /checkpoint list List all checkpoints\",\n\t\t\" /checkpoint save <name> Save current state as checkpoint\",\n\t\t\" /checkpoint restore <name> Restore to a checkpoint\",\n\t\t\"\",\n\t\t\"Checkpoints mark a point in the change history.\",\n\t\t\"Restoring undoes all changes made after the checkpoint.\",\n\t];\n\n\tctx.addContent(lines.join(\"\\n\"));\n\tctx.requestRender();\n}\n"]}
1
+ {"version":3,"file":"undo-handlers.js","sourceRoot":"","sources":["../../../src/cli-tui/commands/undo-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Enhanced undo command handlers for TUI.\n *\n * Provides:\n * - /undo [N] [--preview] [--force] - Undo last N changes\n * - /changes [--files|--tools] - List file changes\n * - /checkpoint [save|list|restore] - Checkpoint management\n */\n\nimport chalk from \"chalk\";\nimport { getCheckpointService } from \"../../checkpoints/index.js\";\nimport { getChangeTracker } from \"../../undo/index.js\";\nimport type { FileChange } from \"../../undo/types.js\";\n\nexport interface UndoRenderContext {\n\trawInput: string;\n\taddContent(content: string): void;\n\tshowError(message: string): void;\n\tshowInfo(message: string): void;\n\tshowSuccess(message: string): void;\n\trequestRender(): void;\n}\n\n/**\n * Format a timestamp as relative time.\n */\nfunction formatRelativeTime(timestamp: number): string {\n\tconst diff = Date.now() - timestamp;\n\tif (diff < 60000) return \"just now\";\n\tif (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n\tif (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n\treturn `${Math.floor(diff / 86400000)}d ago`;\n}\n\n/**\n * Format a file path for display (truncate if too long).\n */\nfunction formatPath(path: string, maxLen = 50): string {\n\tif (path.length <= maxLen) return path;\n\treturn `...${path.slice(-(maxLen - 3))}`;\n}\n\n/**\n * Handle the enhanced /undo command.\n */\nexport function handleEnhancedUndoCommand(ctx: UndoRenderContext): void {\n\tconst args = ctx.rawInput.replace(/^\\/undo\\s*/, \"\").trim();\n\tconst parts = args.split(/\\s+/).filter(Boolean);\n\n\tconst isPreview = parts.includes(\"--preview\") || parts.includes(\"-p\");\n\tconst isForce = parts.includes(\"--force\") || parts.includes(\"-f\");\n\tconst countArg = parts.find((p) => /^\\d+$/.test(p));\n\tconst count = countArg ? Number.parseInt(countArg, 10) : 1;\n\n\tconst tracker = getChangeTracker();\n\tconst stats = tracker.getStats();\n\n\tif (stats.totalChanges === 0) {\n\t\tconst checkpointSvc = getCheckpointService();\n\t\tif (checkpointSvc?.canUndo()) {\n\t\t\tif (isPreview) {\n\t\t\t\tconst history = checkpointSvc.getHistory();\n\t\t\t\tconst lastCheckpoint = history.at(-1);\n\t\t\t\tif (!lastCheckpoint) {\n\t\t\t\t\tctx.showInfo(\"No checkpoints available to undo.\");\n\t\t\t\t} else {\n\t\t\t\t\tconst lines = [\n\t\t\t\t\t\t\"Checkpoint Undo Preview\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t`Would restore ${lastCheckpoint.fileCount} file${lastCheckpoint.fileCount === 1 ? \"\" : \"s\"} to state before \"${lastCheckpoint.description}\"`,\n\t\t\t\t\t\tchalk.dim(\"Run /undo to apply\"),\n\t\t\t\t\t];\n\t\t\t\t\tctx.addContent(lines.join(\"\\n\"));\n\t\t\t\t\tctx.requestRender();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst result = checkpointSvc.undo();\n\t\t\t\tif (result.success) {\n\t\t\t\t\tconst restored = result.files?.length ?? 0;\n\t\t\t\t\tctx.showSuccess(\n\t\t\t\t\t\t`Restored ${restored} file${restored === 1 ? \"\" : \"s\"} from last checkpoint.`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tctx.showError(result.message);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tctx.showInfo(\n\t\t\t\t\"No changes to undo. File changes are tracked during this session.\",\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (isPreview) {\n\t\tconst preview = tracker.previewUndo(count);\n\n\t\tif (preview.changes.length === 0) {\n\t\t\tctx.showInfo(\"No changes to undo.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lines = [\n\t\t\t`Undo Preview (${preview.changes.length} change${preview.changes.length === 1 ? \"\" : \"s\"})`,\n\t\t\t\"\",\n\t\t];\n\n\t\tfor (const change of preview.changes) {\n\t\t\tconst icon =\n\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\tconst action =\n\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t? \"would delete\"\n\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t? \"would restore\"\n\t\t\t\t\t\t: \"would revert\";\n\t\t\tlines.push(\n\t\t\t\t` ${icon} ${formatPath(change.path)} ${chalk.dim(`(${action})`)}`,\n\t\t\t);\n\t\t}\n\n\t\tif (preview.conflicts.length > 0) {\n\t\t\tlines.push(\"\", chalk.yellow(\"Conflicts:\"));\n\t\t\tfor (const conflict of preview.conflicts) {\n\t\t\t\tlines.push(` ${chalk.red(\"!\")} ${conflict.path}: ${conflict.reason}`);\n\t\t\t}\n\t\t\tlines.push(\"\", chalk.dim(\"Use --force to override conflicts\"));\n\t\t}\n\n\t\tlines.push(\"\", chalk.dim(`Run /undo ${count} to apply`));\n\n\t\tctx.addContent(lines.join(\"\\n\"));\n\t\tctx.requestRender();\n\t\treturn;\n\t}\n\n\t// Perform the undo\n\tconst result = tracker.undo(count, isForce);\n\n\tif (result.undone === 0 && result.errors.length > 0) {\n\t\tctx.showError(`Undo failed:\\n${result.errors.join(\"\\n\")}`);\n\t\treturn;\n\t}\n\n\tif (result.undone > 0) {\n\t\tlet message = `Undid ${result.undone} change${result.undone === 1 ? \"\" : \"s\"}`;\n\t\tif (result.skipped > 0) {\n\t\t\tmessage += ` (${result.skipped} skipped)`;\n\t\t}\n\t\tctx.showSuccess(message);\n\t} else {\n\t\tctx.showInfo(\"No changes were undone.\");\n\t}\n\n\tif (result.errors.length > 0) {\n\t\tctx.addContent(\n\t\t\tchalk.yellow(\"Warnings:\\n\") +\n\t\t\t\tresult.errors.map((e) => ` ${e}`).join(\"\\n\"),\n\t\t);\n\t\tctx.requestRender();\n\t}\n}\n\n/**\n * Handle the /changes command.\n */\nexport function handleChangesCommand(ctx: UndoRenderContext): void {\n\tconst args = ctx.rawInput.replace(/^\\/changes\\s*/, \"\").trim();\n\tconst groupByFiles = args.includes(\"--files\") || args.includes(\"-f\");\n\tconst groupByTools = args.includes(\"--tools\") || args.includes(\"-t\");\n\n\tconst tracker = getChangeTracker();\n\tconst changes = tracker.getChanges();\n\tconst stats = tracker.getStats();\n\n\tif (changes.length === 0) {\n\t\tctx.showInfo(\n\t\t\t\"No file changes tracked yet. Changes are recorded when tools modify files.\",\n\t\t);\n\t\treturn;\n\t}\n\n\tconst lines = [`File Changes (${changes.length} total)`, \"\"];\n\n\tif (groupByFiles) {\n\t\t// Group by file path\n\t\tconst byPath = new Map<string, FileChange[]>();\n\t\tfor (const change of changes) {\n\t\t\tconst existing = byPath.get(change.path) ?? [];\n\t\t\texisting.push(change);\n\t\t\tbyPath.set(change.path, existing);\n\t\t}\n\n\t\tfor (const [path, fileChanges] of byPath) {\n\t\t\tlines.push(chalk.cyan(formatPath(path, 60)));\n\t\t\tfor (const change of fileChanges) {\n\t\t\t\tconst icon =\n\t\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\t\tlines.push(\n\t\t\t\t\t` ${icon} ${change.type} by ${change.toolName} ${chalk.dim(formatRelativeTime(change.timestamp))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else if (groupByTools) {\n\t\t// Group by tool\n\t\tfor (const [tool, count] of Object.entries(stats.byTool)) {\n\t\t\tconst toolChanges = changes.filter((c) => c.toolName === tool);\n\t\t\tlines.push(`${chalk.cyan(tool)} (${count} changes)`);\n\t\t\tfor (const change of toolChanges.slice(-5)) {\n\t\t\t\tconst icon =\n\t\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\t\tlines.push(\n\t\t\t\t\t` ${icon} ${formatPath(change.path, 45)} ${chalk.dim(formatRelativeTime(change.timestamp))}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (toolChanges.length > 5) {\n\t\t\t\tlines.push(chalk.dim(` ... and ${toolChanges.length - 5} more`));\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Chronological list (newest first)\n\t\tconst recent = changes.slice(-15).reverse();\n\t\tfor (let i = 0; i < recent.length; i++) {\n\t\t\tconst change = recent[i];\n\t\t\tif (!change) continue;\n\t\t\tconst icon =\n\t\t\t\tchange.type === \"create\"\n\t\t\t\t\t? chalk.green(\"+\")\n\t\t\t\t\t: change.type === \"delete\"\n\t\t\t\t\t\t? chalk.red(\"-\")\n\t\t\t\t\t\t: chalk.yellow(\"~\");\n\t\t\tconst num = chalk.dim(`${i + 1}.`);\n\t\t\tlines.push(\n\t\t\t\t`${num} ${icon} [${change.toolName}] ${formatPath(change.path, 40)} ${chalk.dim(formatRelativeTime(change.timestamp))}`,\n\t\t\t);\n\t\t}\n\t\tif (changes.length > 15) {\n\t\t\tlines.push(chalk.dim(`... and ${changes.length - 15} older changes`));\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(\n\t\tchalk.dim(\n\t\t\t`Types: ${stats.byType.create} created, ${stats.byType.modify} modified, ${stats.byType.delete} deleted`,\n\t\t),\n\t);\n\tlines.push(chalk.dim(\"Use /undo N to undo last N changes\"));\n\n\tctx.addContent(lines.join(\"\\n\"));\n\tctx.requestRender();\n}\n\n/**\n * Handle the /checkpoint command.\n */\nexport function handleCheckpointCommand(ctx: UndoRenderContext): void {\n\tconst args = ctx.rawInput.replace(/^\\/checkpoint\\s*/, \"\").trim();\n\tconst parts = args.split(/\\s+/).filter(Boolean);\n\tconst subcommand = parts[0]?.toLowerCase() || \"list\";\n\n\tconst tracker = getChangeTracker();\n\n\tswitch (subcommand) {\n\t\tcase \"save\": {\n\t\t\tconst name = parts[1];\n\t\t\tif (!name) {\n\t\t\t\tctx.showError(\"Usage: /checkpoint save <name> [description]\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst description = parts.slice(2).join(\" \") || undefined;\n\t\t\tconst checkpoint = tracker.createCheckpoint(name, description);\n\t\t\tctx.showSuccess(\n\t\t\t\t`Checkpoint \"${name}\" saved at ${checkpoint.changeCount} changes`,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"list\":\n\t\tcase \"ls\": {\n\t\t\tconst checkpoints = tracker.getCheckpoints();\n\t\t\tif (checkpoints.length === 0) {\n\t\t\t\tctx.showInfo(\n\t\t\t\t\t\"No checkpoints saved. Use /checkpoint save <name> to create one.\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lines = [\"Checkpoints\", \"\"];\n\t\t\tfor (const cp of checkpoints) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` ${chalk.cyan(cp.name)} - ${cp.changeCount} changes ${chalk.dim(formatRelativeTime(cp.timestamp))}`,\n\t\t\t\t);\n\t\t\t\tif (cp.description) {\n\t\t\t\t\tlines.push(` ${chalk.dim(cp.description)}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlines.push(\"\");\n\t\t\tlines.push(chalk.dim(\"Use /checkpoint restore <name> to restore\"));\n\n\t\t\tctx.addContent(lines.join(\"\\n\"));\n\t\t\tctx.requestRender();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"restore\": {\n\t\t\tconst name = parts[1];\n\t\t\tif (!name) {\n\t\t\t\tctx.showError(\"Usage: /checkpoint restore <name> [--force]\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst force = parts.includes(\"--force\") || parts.includes(\"-f\");\n\t\t\tconst result = tracker.restoreCheckpoint(name, force);\n\n\t\t\tif (result.errors.length > 0 && result.undone === 0) {\n\t\t\t\tctx.showError(`Restore failed:\\n${result.errors.join(\"\\n\")}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.showSuccess(\n\t\t\t\t`Restored to checkpoint \"${name}\" (${result.undone} changes undone)`,\n\t\t\t);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"delete\":\n\t\tcase \"rm\": {\n\t\t\tconst name = parts[1];\n\t\t\tif (!name) {\n\t\t\t\tctx.showError(\"Usage: /checkpoint delete <name>\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst removed = tracker.deleteCheckpoint(name);\n\t\t\tif (!removed) {\n\t\t\t\tctx.showError(`Checkpoint not found: ${name}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.showSuccess(`Deleted checkpoint \"${name}\"`);\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\thandleCheckpointHelp(ctx);\n\t}\n}\n\nfunction handleCheckpointHelp(ctx: UndoRenderContext): void {\n\tconst lines = [\n\t\t\"Checkpoint Commands\",\n\t\t\"\",\n\t\t\" /checkpoint list List all checkpoints\",\n\t\t\" /checkpoint save <name> Save current state as checkpoint\",\n\t\t\" /checkpoint restore <name> Restore to a checkpoint\",\n\t\t\" /checkpoint delete <name> Delete a checkpoint\",\n\t\t\"\",\n\t\t\"Checkpoints mark a point in the change history.\",\n\t\t\"Restoring undoes all changes made after the checkpoint.\",\n\t];\n\n\tctx.addContent(lines.join(\"\\n\"));\n\tctx.requestRender();\n}\n"]}
@@ -63,8 +63,11 @@ export declare class SkillsController {
63
63
  private renderSkillInfo;
64
64
  private injectSkillMessage;
65
65
  private buildSkillMessage;
66
+ private needsTrustCheck;
67
+ private shouldRefuseStrictTrust;
66
68
  private hasMatchingSkillMessage;
67
69
  private resolveSkillTarget;
70
+ private resolveTrustTarget;
68
71
  }
69
72
  export declare function createSkillsController(options: SkillsControllerOptions): SkillsController;
70
73
  //# sourceMappingURL=skills-controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills-controller.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/tui-renderer/skills-controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAevD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAKpE,MAAM,WAAW,yBAAyB;IACzC,0DAA0D;IAC1D,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,0CAA0C;IAC1C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,2CAA2C;IAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC,oDAAoD;IACpD,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,yEAAyE;IACzE,WAAW,EAAE,MAAM,UAAU,EAAE,CAAC;IAChC,uDAAuD;IACvD,GAAG,EAAE,MAAM,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,yBAAyB,CAAC;CACrC;AAID,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAEtC,OAAO,EAAE,uBAAuB;IAK5C,uDAAuD;IACvD,iBAAiB,IAAI,IAAI;IAIzB;;;;OAIG;IACH,uCAAuC,CACtC,iBAAiB,eAA0B,GACzC,UAAU,EAAE;IAuBf,kCAAkC,IAAI,MAAM;IAU5C,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAwF3D;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,qBAAqB;IA2J7B,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,kBAAkB;CAsB1B;AAID,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,uBAAuB,GAC9B,gBAAgB,CAElB"}
1
+ {"version":3,"file":"skills-controller.d.ts","sourceRoot":"","sources":["../../../src/cli-tui/tui-renderer/skills-controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAkBvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAKpE,MAAM,WAAW,yBAAyB;IACzC,0DAA0D;IAC1D,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,0CAA0C;IAC1C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,2CAA2C;IAC3C,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC,oDAAoD;IACpD,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,yEAAyE;IACzE,WAAW,EAAE,MAAM,UAAU,EAAE,CAAC;IAChC,uDAAuD;IACvD,GAAG,EAAE,MAAM,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,yBAAyB,CAAC;CACrC;AAID,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAEtC,OAAO,EAAE,uBAAuB;IAK5C,uDAAuD;IACvD,iBAAiB,IAAI,IAAI;IAIzB;;;;OAIG;IACH,uCAAuC,CACtC,iBAAiB,eAA0B,GACzC,UAAU,EAAE;IA4Bf,kCAAkC,IAAI,MAAM;IAU5C,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAkG3D;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,qBAAqB;IAmJ7B,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,iBAAiB;IAqCzB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,kBAAkB;CAkB1B;AAID,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,uBAAuB,GAC9B,gBAAgB,CAElB"}