@pentoshi/clai 3.9.2 → 3.9.4

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 (407) hide show
  1. package/dist/agent/compaction-attempt.d.ts +22 -0
  2. package/dist/agent/compaction-attempt.js +69 -0
  3. package/dist/agent/compaction-attempt.js.map +1 -0
  4. package/dist/agent/compaction-summary.d.ts +27 -0
  5. package/dist/agent/compaction-summary.js +62 -0
  6. package/dist/agent/compaction-summary.js.map +1 -1
  7. package/dist/agent/context-breakdown.d.ts +2 -0
  8. package/dist/agent/context-breakdown.js +37 -0
  9. package/dist/agent/context-breakdown.js.map +1 -1
  10. package/dist/agent/context-manager.d.ts +7 -1
  11. package/dist/agent/context-manager.js +64 -15
  12. package/dist/agent/context-manager.js.map +1 -1
  13. package/dist/agent/continue-orient.d.ts +8 -0
  14. package/dist/agent/continue-orient.js +26 -3
  15. package/dist/agent/continue-orient.js.map +1 -1
  16. package/dist/agent/durable-envelope.d.ts +39 -0
  17. package/dist/agent/durable-envelope.js +195 -0
  18. package/dist/agent/durable-envelope.js.map +1 -0
  19. package/dist/agent/events.d.ts +21 -0
  20. package/dist/agent/loop-guard.d.ts +13 -5
  21. package/dist/agent/loop-guard.js +114 -1
  22. package/dist/agent/loop-guard.js.map +1 -1
  23. package/dist/agent/outcomes.d.ts +29 -0
  24. package/dist/agent/outcomes.js +118 -3
  25. package/dist/agent/outcomes.js.map +1 -1
  26. package/dist/agent/plan-decision.js +8 -3
  27. package/dist/agent/plan-decision.js.map +1 -1
  28. package/dist/agent/plan-tool.d.ts +5 -0
  29. package/dist/agent/plan-tool.js +166 -6
  30. package/dist/agent/plan-tool.js.map +1 -1
  31. package/dist/agent/reliability-policy.d.ts +11 -6
  32. package/dist/agent/reliability-policy.js +19 -13
  33. package/dist/agent/reliability-policy.js.map +1 -1
  34. package/dist/agent/request-budget.d.ts +24 -0
  35. package/dist/agent/request-budget.js +59 -0
  36. package/dist/agent/request-budget.js.map +1 -0
  37. package/dist/agent/responder-context.js +2 -2
  38. package/dist/agent/responder-context.js.map +1 -1
  39. package/dist/agent/responder-parent.d.ts +30 -0
  40. package/dist/agent/responder-parent.js +82 -0
  41. package/dist/agent/responder-parent.js.map +1 -0
  42. package/dist/agent/runner.d.ts +15 -2
  43. package/dist/agent/runner.js +766 -213
  44. package/dist/agent/runner.js.map +1 -1
  45. package/dist/agent/scope-context.d.ts +5 -0
  46. package/dist/agent/scope-context.js +7 -1
  47. package/dist/agent/scope-context.js.map +1 -1
  48. package/dist/agent/session-policy.js +1 -0
  49. package/dist/agent/session-policy.js.map +1 -1
  50. package/dist/agent/stop-summary.js +13 -7
  51. package/dist/agent/stop-summary.js.map +1 -1
  52. package/dist/agent/task-analyzer.js +7 -3
  53. package/dist/agent/task-analyzer.js.map +1 -1
  54. package/dist/agent/task-evidence.js +2 -0
  55. package/dist/agent/task-evidence.js.map +1 -1
  56. package/dist/agent/task-sync.d.ts +11 -0
  57. package/dist/agent/task-sync.js +31 -0
  58. package/dist/agent/task-sync.js.map +1 -1
  59. package/dist/agent/tool-call-parser.d.ts +6 -13
  60. package/dist/agent/tool-call-parser.js +186 -82
  61. package/dist/agent/tool-call-parser.js.map +1 -1
  62. package/dist/agent/tool-history.d.ts +8 -2
  63. package/dist/agent/tool-history.js +8 -1
  64. package/dist/agent/tool-history.js.map +1 -1
  65. package/dist/agent/turn-outcome.d.ts +4 -1
  66. package/dist/agent/turn-outcome.js +16 -2
  67. package/dist/agent/turn-outcome.js.map +1 -1
  68. package/dist/app/adapters/agent-event-adapter.js +27 -0
  69. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  70. package/dist/app/adapters/current-agent-adapter.js +1 -0
  71. package/dist/app/adapters/current-agent-adapter.js.map +1 -1
  72. package/dist/app/adapters/current-interactive-sessions-adapter.d.ts +4 -0
  73. package/dist/app/adapters/current-interactive-sessions-adapter.js +11 -0
  74. package/dist/app/adapters/current-interactive-sessions-adapter.js.map +1 -0
  75. package/dist/app/adapters/current-jobs-adapter.js +4 -3
  76. package/dist/app/adapters/current-jobs-adapter.js.map +1 -1
  77. package/dist/app/adapters/current-store-adapter.js +4 -3
  78. package/dist/app/adapters/current-store-adapter.js.map +1 -1
  79. package/dist/app/adapters/current-updates-adapter.d.ts +1 -1
  80. package/dist/app/adapters/current-updates-adapter.js +34 -5
  81. package/dist/app/adapters/current-updates-adapter.js.map +1 -1
  82. package/dist/app/adapters/quiet-meta-tools.js +2 -1
  83. package/dist/app/adapters/quiet-meta-tools.js.map +1 -1
  84. package/dist/app/controllers/cancel-all-result.d.ts +8 -0
  85. package/dist/app/controllers/cancel-all-result.js +32 -0
  86. package/dist/app/controllers/cancel-all-result.js.map +1 -0
  87. package/dist/app/controllers/job-controller.d.ts +4 -3
  88. package/dist/app/controllers/job-controller.js +9 -6
  89. package/dist/app/controllers/job-controller.js.map +1 -1
  90. package/dist/app/controllers/plan-controller.js +14 -0
  91. package/dist/app/controllers/plan-controller.js.map +1 -1
  92. package/dist/app/controllers/responder-settlement.js +2 -2
  93. package/dist/app/controllers/responder-settlement.js.map +1 -1
  94. package/dist/app/controllers/session-compact-helper.d.ts +23 -1
  95. package/dist/app/controllers/session-compact-helper.js +117 -7
  96. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  97. package/dist/app/controllers/session-context-usage.d.ts +24 -0
  98. package/dist/app/controllers/session-context-usage.js +89 -0
  99. package/dist/app/controllers/session-context-usage.js.map +1 -0
  100. package/dist/app/controllers/session-controller.d.ts +25 -17
  101. package/dist/app/controllers/session-controller.js +142 -128
  102. package/dist/app/controllers/session-controller.js.map +1 -1
  103. package/dist/app/controllers/session-prompt-queue.d.ts +3 -0
  104. package/dist/app/controllers/session-prompt-queue.js +20 -1
  105. package/dist/app/controllers/session-prompt-queue.js.map +1 -1
  106. package/dist/app/controllers/session-responder.js +16 -6
  107. package/dist/app/controllers/session-responder.js.map +1 -1
  108. package/dist/app/controllers/session-turn-request.d.ts +18 -0
  109. package/dist/app/controllers/session-turn-request.js +31 -0
  110. package/dist/app/controllers/session-turn-request.js.map +1 -0
  111. package/dist/app/controllers/turn-continuation.d.ts +14 -0
  112. package/dist/app/controllers/turn-continuation.js +46 -0
  113. package/dist/app/controllers/turn-continuation.js.map +1 -0
  114. package/dist/app/events/app-event.d.ts +21 -0
  115. package/dist/app/events/app-event.js +1 -0
  116. package/dist/app/events/app-event.js.map +1 -1
  117. package/dist/app/ports/agent-port.d.ts +7 -0
  118. package/dist/app/ports/interactive-sessions-port.d.ts +21 -0
  119. package/dist/app/ports/interactive-sessions-port.js +9 -0
  120. package/dist/app/ports/interactive-sessions-port.js.map +1 -0
  121. package/dist/app/ports/jobs-port.d.ts +4 -3
  122. package/dist/app/ports/persistence-port.d.ts +11 -0
  123. package/dist/app/ports/updates-port.d.ts +8 -0
  124. package/dist/attachments/service.js +13 -2
  125. package/dist/attachments/service.js.map +1 -1
  126. package/dist/commands/providers.js +13 -10
  127. package/dist/commands/providers.js.map +1 -1
  128. package/dist/commands/update.d.ts +4 -0
  129. package/dist/commands/update.js +14 -0
  130. package/dist/commands/update.js.map +1 -1
  131. package/dist/index.js +21 -8
  132. package/dist/index.js.map +1 -1
  133. package/dist/interactive-session/artifact-writer.d.ts +54 -0
  134. package/dist/interactive-session/artifact-writer.js +161 -0
  135. package/dist/interactive-session/artifact-writer.js.map +1 -0
  136. package/dist/interactive-session/cleanup.d.ts +36 -0
  137. package/dist/interactive-session/cleanup.js +157 -0
  138. package/dist/interactive-session/cleanup.js.map +1 -0
  139. package/dist/interactive-session/config.d.ts +118 -0
  140. package/dist/interactive-session/config.js +141 -0
  141. package/dist/interactive-session/config.js.map +1 -0
  142. package/dist/interactive-session/input-policy.d.ts +41 -0
  143. package/dist/interactive-session/input-policy.js +163 -0
  144. package/dist/interactive-session/input-policy.js.map +1 -0
  145. package/dist/interactive-session/manager.d.ts +107 -0
  146. package/dist/interactive-session/manager.js +927 -0
  147. package/dist/interactive-session/manager.js.map +1 -0
  148. package/dist/interactive-session/output-store.d.ts +81 -0
  149. package/dist/interactive-session/output-store.js +239 -0
  150. package/dist/interactive-session/output-store.js.map +1 -0
  151. package/dist/interactive-session/output-view.d.ts +20 -0
  152. package/dist/interactive-session/output-view.js +142 -0
  153. package/dist/interactive-session/output-view.js.map +1 -0
  154. package/dist/interactive-session/recovery-journal.d.ts +55 -0
  155. package/dist/interactive-session/recovery-journal.js +115 -0
  156. package/dist/interactive-session/recovery-journal.js.map +1 -0
  157. package/dist/interactive-session/registry.d.ts +59 -0
  158. package/dist/interactive-session/registry.js +170 -0
  159. package/dist/interactive-session/registry.js.map +1 -0
  160. package/dist/interactive-session/runtime.d.ts +107 -0
  161. package/dist/interactive-session/runtime.js +191 -0
  162. package/dist/interactive-session/runtime.js.map +1 -0
  163. package/dist/interactive-session/session-runtime.d.ts +50 -0
  164. package/dist/interactive-session/session-runtime.js +63 -0
  165. package/dist/interactive-session/session-runtime.js.map +1 -0
  166. package/dist/interactive-session/streaming-redactor.d.ts +53 -0
  167. package/dist/interactive-session/streaming-redactor.js +263 -0
  168. package/dist/interactive-session/streaming-redactor.js.map +1 -0
  169. package/dist/interactive-session/telemetry.d.ts +30 -0
  170. package/dist/interactive-session/telemetry.js +47 -0
  171. package/dist/interactive-session/telemetry.js.map +1 -0
  172. package/dist/interactive-session/transport-factory.d.ts +8 -0
  173. package/dist/interactive-session/transport-factory.js +16 -0
  174. package/dist/interactive-session/transport-factory.js.map +1 -0
  175. package/dist/interactive-session/transport-node-pty.d.ts +49 -0
  176. package/dist/interactive-session/transport-node-pty.js +219 -0
  177. package/dist/interactive-session/transport-node-pty.js.map +1 -0
  178. package/dist/interactive-session/transport-pipe.d.ts +9 -0
  179. package/dist/interactive-session/transport-pipe.js +215 -0
  180. package/dist/interactive-session/transport-pipe.js.map +1 -0
  181. package/dist/interactive-session/transport.d.ts +104 -0
  182. package/dist/interactive-session/transport.js +89 -0
  183. package/dist/interactive-session/transport.js.map +1 -0
  184. package/dist/interactive-session/types.d.ts +254 -0
  185. package/dist/interactive-session/types.js +191 -0
  186. package/dist/interactive-session/types.js.map +1 -0
  187. package/dist/llm/adapters/anthropic-tools.d.ts +14 -1
  188. package/dist/llm/adapters/anthropic-tools.js +36 -5
  189. package/dist/llm/adapters/anthropic-tools.js.map +1 -1
  190. package/dist/llm/adapters/gemini-tools.d.ts +3 -1
  191. package/dist/llm/adapters/gemini-tools.js +5 -2
  192. package/dist/llm/adapters/gemini-tools.js.map +1 -1
  193. package/dist/llm/adapters/ollama-tools.js +8 -3
  194. package/dist/llm/adapters/ollama-tools.js.map +1 -1
  195. package/dist/llm/adapters/openai-tools.js +8 -1
  196. package/dist/llm/adapters/openai-tools.js.map +1 -1
  197. package/dist/llm/agentrouter.js +2 -0
  198. package/dist/llm/agentrouter.js.map +1 -1
  199. package/dist/llm/anthropic.d.ts +8 -0
  200. package/dist/llm/anthropic.js +68 -9
  201. package/dist/llm/anthropic.js.map +1 -1
  202. package/dist/llm/aws-mantle.js +60 -12
  203. package/dist/llm/aws-mantle.js.map +1 -1
  204. package/dist/llm/bynara.js +2 -0
  205. package/dist/llm/bynara.js.map +1 -1
  206. package/dist/llm/capabilities.d.ts +7 -0
  207. package/dist/llm/capabilities.js +22 -0
  208. package/dist/llm/capabilities.js.map +1 -1
  209. package/dist/llm/gemini.d.ts +3 -0
  210. package/dist/llm/gemini.js +71 -11
  211. package/dist/llm/gemini.js.map +1 -1
  212. package/dist/llm/groq.d.ts +20 -1
  213. package/dist/llm/groq.js +32 -4
  214. package/dist/llm/groq.js.map +1 -1
  215. package/dist/llm/http.d.ts +29 -0
  216. package/dist/llm/http.js +122 -29
  217. package/dist/llm/http.js.map +1 -1
  218. package/dist/llm/kimchi.js +2 -0
  219. package/dist/llm/kimchi.js.map +1 -1
  220. package/dist/llm/nvidia.js +2 -0
  221. package/dist/llm/nvidia.js.map +1 -1
  222. package/dist/llm/ollama.d.ts +5 -0
  223. package/dist/llm/ollama.js +53 -6
  224. package/dist/llm/ollama.js.map +1 -1
  225. package/dist/llm/openai.js +2 -0
  226. package/dist/llm/openai.js.map +1 -1
  227. package/dist/llm/openrouter.js +2 -0
  228. package/dist/llm/openrouter.js.map +1 -1
  229. package/dist/llm/qwen-cloud.js +2 -0
  230. package/dist/llm/qwen-cloud.js.map +1 -1
  231. package/dist/llm/router.d.ts +16 -0
  232. package/dist/llm/router.js +79 -23
  233. package/dist/llm/router.js.map +1 -1
  234. package/dist/llm/sampling.d.ts +32 -0
  235. package/dist/llm/sampling.js +48 -0
  236. package/dist/llm/sampling.js.map +1 -0
  237. package/dist/llm/stream-progress.d.ts +4 -0
  238. package/dist/llm/stream-progress.js +43 -0
  239. package/dist/llm/stream-progress.js.map +1 -0
  240. package/dist/llm/system-messages.d.ts +29 -0
  241. package/dist/llm/system-messages.js +51 -0
  242. package/dist/llm/system-messages.js.map +1 -0
  243. package/dist/llm/token-usage.d.ts +4 -1
  244. package/dist/llm/token-usage.js +56 -4
  245. package/dist/llm/token-usage.js.map +1 -1
  246. package/dist/llm/tool-protocol.js +30 -0
  247. package/dist/llm/tool-protocol.js.map +1 -1
  248. package/dist/os/process-identity.d.ts +46 -0
  249. package/dist/os/process-identity.js +147 -0
  250. package/dist/os/process-identity.js.map +1 -0
  251. package/dist/os/process-tree.d.ts +15 -0
  252. package/dist/os/process-tree.js +77 -0
  253. package/dist/os/process-tree.js.map +1 -0
  254. package/dist/prompts/embedded.js +1 -1
  255. package/dist/prompts/embedded.js.map +1 -1
  256. package/dist/prompts/system.agent.md +13 -12
  257. package/dist/repl/prompt-line.d.ts +5 -0
  258. package/dist/repl/prompt-line.js +7 -1
  259. package/dist/repl/prompt-line.js.map +1 -1
  260. package/dist/repl.js +71 -41
  261. package/dist/repl.js.map +1 -1
  262. package/dist/safety/classifier.js +98 -44
  263. package/dist/safety/classifier.js.map +1 -1
  264. package/dist/safety/engagement-policy.d.ts +8 -0
  265. package/dist/safety/engagement-policy.js +52 -7
  266. package/dist/safety/engagement-policy.js.map +1 -1
  267. package/dist/safety/patterns.d.ts +44 -0
  268. package/dist/safety/patterns.js +168 -37
  269. package/dist/safety/patterns.js.map +1 -1
  270. package/dist/store/config.d.ts +9 -1
  271. package/dist/store/config.js +51 -1
  272. package/dist/store/config.js.map +1 -1
  273. package/dist/store/history-index.d.ts +12 -0
  274. package/dist/store/history-index.js +47 -18
  275. package/dist/store/history-index.js.map +1 -1
  276. package/dist/store/history.d.ts +5 -2
  277. package/dist/store/history.js +153 -62
  278. package/dist/store/history.js.map +1 -1
  279. package/dist/store/plan.d.ts +81 -5
  280. package/dist/store/plan.js +406 -46
  281. package/dist/store/plan.js.map +1 -1
  282. package/dist/store/redaction-cache.d.ts +12 -0
  283. package/dist/store/redaction-cache.js +51 -0
  284. package/dist/store/redaction-cache.js.map +1 -0
  285. package/dist/store/responder-settlement.d.ts +5 -1
  286. package/dist/store/responder-settlement.js +42 -30
  287. package/dist/store/responder-settlement.js.map +1 -1
  288. package/dist/store/scope.js +36 -27
  289. package/dist/store/scope.js.map +1 -1
  290. package/dist/store/task-transitions.d.ts +19 -0
  291. package/dist/store/task-transitions.js +46 -0
  292. package/dist/store/task-transitions.js.map +1 -0
  293. package/dist/tools/capabilities.js +33 -18
  294. package/dist/tools/capabilities.js.map +1 -1
  295. package/dist/tools/command-intent.d.ts +24 -0
  296. package/dist/tools/command-intent.js +158 -4
  297. package/dist/tools/command-intent.js.map +1 -1
  298. package/dist/tools/definitions.d.ts +5 -1
  299. package/dist/tools/definitions.js +257 -21
  300. package/dist/tools/definitions.js.map +1 -1
  301. package/dist/tools/fs.d.ts +16 -0
  302. package/dist/tools/fs.js +122 -46
  303. package/dist/tools/fs.js.map +1 -1
  304. package/dist/tools/image.js +1 -1
  305. package/dist/tools/image.js.map +1 -1
  306. package/dist/tools/interactive-session-tools.d.ts +11 -0
  307. package/dist/tools/interactive-session-tools.js +261 -0
  308. package/dist/tools/interactive-session-tools.js.map +1 -0
  309. package/dist/tools/jobs.d.ts +78 -4
  310. package/dist/tools/jobs.js +486 -127
  311. package/dist/tools/jobs.js.map +1 -1
  312. package/dist/tools/net-ping-sweep.d.ts +3 -1
  313. package/dist/tools/net-ping-sweep.js +64 -26
  314. package/dist/tools/net-ping-sweep.js.map +1 -1
  315. package/dist/tools/nmap-runner.js +5 -2
  316. package/dist/tools/nmap-runner.js.map +1 -1
  317. package/dist/tools/pdf.js +50 -7
  318. package/dist/tools/pdf.js.map +1 -1
  319. package/dist/tools/registry.js +158 -96
  320. package/dist/tools/registry.js.map +1 -1
  321. package/dist/tools/shell.d.ts +24 -2
  322. package/dist/tools/shell.js +113 -28
  323. package/dist/tools/shell.js.map +1 -1
  324. package/dist/tools/tool-types.d.ts +2 -0
  325. package/dist/tools/validate.d.ts +8 -5
  326. package/dist/tools/validate.js +177 -7
  327. package/dist/tools/validate.js.map +1 -1
  328. package/dist/tools/wordlists.js +69 -17
  329. package/dist/tools/wordlists.js.map +1 -1
  330. package/dist/tui/state.d.ts +4 -0
  331. package/dist/tui/state.js +88 -2
  332. package/dist/tui/state.js.map +1 -1
  333. package/dist/tui-v2/actions/keymap.js +3 -8
  334. package/dist/tui-v2/actions/keymap.js.map +1 -1
  335. package/dist/tui-v2/app/App.js +52 -4
  336. package/dist/tui-v2/app/App.js.map +1 -1
  337. package/dist/tui-v2/app/commands/config-commands.js +5 -2
  338. package/dist/tui-v2/app/commands/config-commands.js.map +1 -1
  339. package/dist/tui-v2/app/commands/picker-commands.js +3 -0
  340. package/dist/tui-v2/app/commands/picker-commands.js.map +1 -1
  341. package/dist/tui-v2/app/plan-lifecycle.d.ts +1 -1
  342. package/dist/tui-v2/app/plan-lifecycle.js +2 -1
  343. package/dist/tui-v2/app/plan-lifecycle.js.map +1 -1
  344. package/dist/tui-v2/bootstrap/composition-root.d.ts +3 -0
  345. package/dist/tui-v2/bootstrap/composition-root.js +3 -0
  346. package/dist/tui-v2/bootstrap/composition-root.js.map +1 -1
  347. package/dist/tui-v2/bootstrap/start-tui-v2.js +10 -0
  348. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  349. package/dist/tui-v2/components/composer/composer-input-box.d.ts +1 -1
  350. package/dist/tui-v2/components/composer/composer-input-box.js +12 -3
  351. package/dist/tui-v2/components/composer/composer-input-box.js.map +1 -1
  352. package/dist/tui-v2/components/jobs/jobs-panel.js +19 -6
  353. package/dist/tui-v2/components/jobs/jobs-panel.js.map +1 -1
  354. package/dist/tui-v2/components/plan/plan-view.js +9 -6
  355. package/dist/tui-v2/components/plan/plan-view.js.map +1 -1
  356. package/dist/tui-v2/components/status/status-line.d.ts +15 -0
  357. package/dist/tui-v2/components/status/status-line.js +33 -25
  358. package/dist/tui-v2/components/status/status-line.js.map +1 -1
  359. package/dist/tui-v2/components/transcript/assistant-message.js +17 -9
  360. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
  361. package/dist/tui-v2/components/transcript/compacted-row.js +49 -22
  362. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
  363. package/dist/tui-v2/components/transcript/intro-card.js +3 -0
  364. package/dist/tui-v2/components/transcript/intro-card.js.map +1 -1
  365. package/dist/tui-v2/components/transcript/thinking-block.js +2 -1
  366. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
  367. package/dist/tui-v2/components/transcript/transcript-view.js +27 -2
  368. package/dist/tui-v2/components/transcript/transcript-view.js.map +1 -1
  369. package/dist/tui-v2/components/transcript/use-transcript-selection.js +57 -6
  370. package/dist/tui-v2/components/transcript/use-transcript-selection.js.map +1 -1
  371. package/dist/tui-v2/composer/composer-editor.js +12 -6
  372. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  373. package/dist/tui-v2/rendering/incremental-strip.d.ts +11 -0
  374. package/dist/tui-v2/rendering/incremental-strip.js +89 -0
  375. package/dist/tui-v2/rendering/incremental-strip.js.map +1 -0
  376. package/dist/tui-v2/rendering/plan-view.d.ts +12 -0
  377. package/dist/tui-v2/rendering/plan-view.js +71 -2
  378. package/dist/tui-v2/rendering/plan-view.js.map +1 -1
  379. package/dist/tui-v2/rendering/streaming-markdown.d.ts +25 -0
  380. package/dist/tui-v2/rendering/streaming-markdown.js +108 -0
  381. package/dist/tui-v2/rendering/streaming-markdown.js.map +1 -0
  382. package/dist/tui-v2/rendering/thinking-tail.d.ts +5 -0
  383. package/dist/tui-v2/rendering/thinking-tail.js +26 -0
  384. package/dist/tui-v2/rendering/thinking-tail.js.map +1 -0
  385. package/dist/tui-v2/state/transcript-hydrate.js +6 -2
  386. package/dist/tui-v2/state/transcript-hydrate.js.map +1 -1
  387. package/dist/tui-v2/state/transcript-reducer.js +146 -25
  388. package/dist/tui-v2/state/transcript-reducer.js.map +1 -1
  389. package/dist/tui-v2/state/transcript-types.d.ts +6 -0
  390. package/dist/tui-v2/state/transcript-types.js +17 -0
  391. package/dist/tui-v2/state/transcript-types.js.map +1 -1
  392. package/dist/types.d.ts +34 -0
  393. package/dist/types.js.map +1 -1
  394. package/dist/ui/intro-header.d.ts +1 -0
  395. package/dist/ui/intro-header.js +10 -13
  396. package/dist/ui/intro-header.js.map +1 -1
  397. package/dist/ui/markdown.js +9 -2
  398. package/dist/ui/markdown.js.map +1 -1
  399. package/dist/ui/mentions.d.ts +5 -0
  400. package/dist/ui/mentions.js +66 -7
  401. package/dist/ui/mentions.js.map +1 -1
  402. package/dist/ui/thinking.d.ts +5 -1
  403. package/dist/ui/thinking.js +3 -2
  404. package/dist/ui/thinking.js.map +1 -1
  405. package/dist/version.generated.d.ts +2 -2
  406. package/dist/version.generated.js +2 -2
  407. package/package.json +2 -1
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Interactive-session configuration: documented defaults, validated ranges, and
3
+ * a runtime kill switch. Every value is validated before a slot is reserved or a
4
+ * process is launched so an out-of-range setting can never produce a live child.
5
+ */
6
+ import { type SessionOperation, type TerminalDimensions } from "./types.js";
7
+ export interface InteractiveSessionConfig {
8
+ enabled: boolean;
9
+ liveSessionLimit: number;
10
+ quietIntervalMs: number;
11
+ startDeadlineMs: number;
12
+ sendDeadlineMs: number;
13
+ closeDeadlineMs: number;
14
+ gracefulCloseMs: number;
15
+ pageBytes: number;
16
+ memoryWindowBytes: number;
17
+ queuedInputBytes: number;
18
+ artifactCaptureBytes: number;
19
+ artifactChunkBytes: number;
20
+ persistenceQueueBytes: number;
21
+ /** Undefined disables the timeout. */
22
+ idleTimeoutMs: number | undefined;
23
+ lifetimeTimeoutMs: number | undefined;
24
+ /** Behavior when artifact capture reaches its limit. */
25
+ onOutputLimit: "terminate" | "continue";
26
+ /** Max bytes retained for cross-chunk secret matching. */
27
+ redactionOverlapBytes: number;
28
+ }
29
+ interface Range {
30
+ readonly min: number;
31
+ readonly max: number;
32
+ }
33
+ export declare const INTERACTIVE_SESSION_RANGES: {
34
+ readonly liveSessionLimit: {
35
+ readonly min: 1;
36
+ readonly max: 32;
37
+ };
38
+ readonly quietIntervalMs: {
39
+ readonly min: 25;
40
+ readonly max: 5000;
41
+ };
42
+ readonly startDeadlineMs: {
43
+ readonly min: 100;
44
+ readonly max: 120000;
45
+ };
46
+ readonly sendDeadlineMs: {
47
+ readonly min: 100;
48
+ readonly max: 120000;
49
+ };
50
+ readonly closeDeadlineMs: {
51
+ readonly min: 100;
52
+ readonly max: 120000;
53
+ };
54
+ readonly gracefulCloseMs: {
55
+ readonly min: 0;
56
+ readonly max: 30000;
57
+ };
58
+ readonly pageBytes: {
59
+ readonly min: 1024;
60
+ readonly max: 1048576;
61
+ };
62
+ readonly memoryWindowBytes: {
63
+ readonly min: 65536;
64
+ readonly max: 16777216;
65
+ };
66
+ readonly queuedInputBytes: {
67
+ readonly min: 1024;
68
+ readonly max: 1048576;
69
+ };
70
+ readonly artifactCaptureBytes: {
71
+ readonly min: 1048576;
72
+ readonly max: 1073741824;
73
+ };
74
+ readonly artifactChunkBytes: {
75
+ readonly min: 65536;
76
+ readonly max: 16777216;
77
+ };
78
+ readonly persistenceQueueBytes: {
79
+ readonly min: 65536;
80
+ readonly max: 16777216;
81
+ };
82
+ readonly idleTimeoutMs: {
83
+ readonly min: 1000;
84
+ readonly max: 86400000;
85
+ };
86
+ readonly lifetimeTimeoutMs: {
87
+ readonly min: 1000;
88
+ readonly max: 604800000;
89
+ };
90
+ readonly redactionOverlapBytes: {
91
+ readonly min: 256;
92
+ readonly max: 65536;
93
+ };
94
+ };
95
+ export type RangedConfigField = keyof typeof INTERACTIVE_SESSION_RANGES;
96
+ export declare const DIMENSION_RANGE: Range;
97
+ export declare const DEFAULT_DIMENSIONS: TerminalDimensions;
98
+ /** Hard cap for a blocking read wait, independent of send deadlines. */
99
+ export declare const MAX_READ_WAIT_MS = 30000;
100
+ export declare const MAX_LIST_SUMMARIES = 50;
101
+ export declare const INTERACTIVE_SESSION_DEFAULTS: InteractiveSessionConfig;
102
+ /** Env kill switch. Disables only the seven interactive tools. */
103
+ export declare const KILL_SWITCH_ENV = "CLAI_DISABLE_INTERACTIVE_SESSIONS";
104
+ export type InteractiveSessionOverrides = Partial<InteractiveSessionConfig>;
105
+ /**
106
+ * Resolve the effective configuration. Throws `INVALID_CONFIGURATION` for any
107
+ * out-of-range value so callers fail before allocating resources.
108
+ */
109
+ export declare function resolveInteractiveSessionConfig(overrides?: InteractiveSessionOverrides, operation?: SessionOperation): InteractiveSessionConfig;
110
+ export declare function isInteractiveSessionsEnabled(config?: InteractiveSessionConfig): boolean;
111
+ /** Per-operation timeout override, validated against the same bounds. */
112
+ export declare function resolveDeadline(field: "startDeadlineMs" | "sendDeadlineMs" | "closeDeadlineMs", override: number | undefined, config: InteractiveSessionConfig, operation: SessionOperation): number;
113
+ export declare function resolveQuietInterval(override: number | undefined, config: InteractiveSessionConfig, operation: SessionOperation): number;
114
+ export declare function resolveOptionalTimeout(field: "idleTimeoutMs" | "lifetimeTimeoutMs", override: number | undefined, config: InteractiveSessionConfig, operation: SessionOperation): number | undefined;
115
+ /** Validate requested dimensions before any lookup or process mutation. */
116
+ export declare function resolveDimensions(columns: number | undefined, rows: number | undefined, operation: SessionOperation): TerminalDimensions;
117
+ export declare function clampReadWait(waitMs: number | undefined): number;
118
+ export {};
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Interactive-session configuration: documented defaults, validated ranges, and
3
+ * a runtime kill switch. Every value is validated before a slot is reserved or a
4
+ * process is launched so an out-of-range setting can never produce a live child.
5
+ */
6
+ import { throwSessionError, } from "./types.js";
7
+ export const INTERACTIVE_SESSION_RANGES = {
8
+ liveSessionLimit: { min: 1, max: 32 },
9
+ quietIntervalMs: { min: 25, max: 5_000 },
10
+ startDeadlineMs: { min: 100, max: 120_000 },
11
+ sendDeadlineMs: { min: 100, max: 120_000 },
12
+ closeDeadlineMs: { min: 100, max: 120_000 },
13
+ gracefulCloseMs: { min: 0, max: 30_000 },
14
+ pageBytes: { min: 1_024, max: 1_048_576 },
15
+ memoryWindowBytes: { min: 65_536, max: 16_777_216 },
16
+ queuedInputBytes: { min: 1_024, max: 1_048_576 },
17
+ artifactCaptureBytes: { min: 1_048_576, max: 1_073_741_824 },
18
+ artifactChunkBytes: { min: 65_536, max: 16_777_216 },
19
+ persistenceQueueBytes: { min: 65_536, max: 16_777_216 },
20
+ idleTimeoutMs: { min: 1_000, max: 86_400_000 },
21
+ lifetimeTimeoutMs: { min: 1_000, max: 604_800_000 },
22
+ redactionOverlapBytes: { min: 256, max: 65_536 },
23
+ };
24
+ export const DIMENSION_RANGE = { min: 2, max: 1_000 };
25
+ export const DEFAULT_DIMENSIONS = { columns: 80, rows: 24 };
26
+ /** Hard cap for a blocking read wait, independent of send deadlines. */
27
+ export const MAX_READ_WAIT_MS = 30_000;
28
+ export const MAX_LIST_SUMMARIES = 50;
29
+ export const INTERACTIVE_SESSION_DEFAULTS = {
30
+ enabled: true,
31
+ liveSessionLimit: 4,
32
+ quietIntervalMs: 250,
33
+ startDeadlineMs: 10_000,
34
+ sendDeadlineMs: 30_000,
35
+ closeDeadlineMs: 10_000,
36
+ gracefulCloseMs: 2_000,
37
+ pageBytes: 12_000,
38
+ memoryWindowBytes: 1_048_576,
39
+ queuedInputBytes: 65_536,
40
+ artifactCaptureBytes: 67_108_864,
41
+ artifactChunkBytes: 1_048_576,
42
+ persistenceQueueBytes: 1_048_576,
43
+ idleTimeoutMs: undefined,
44
+ lifetimeTimeoutMs: undefined,
45
+ onOutputLimit: "terminate",
46
+ redactionOverlapBytes: 4_096,
47
+ };
48
+ /** Env kill switch. Disables only the seven interactive tools. */
49
+ export const KILL_SWITCH_ENV = "CLAI_DISABLE_INTERACTIVE_SESSIONS";
50
+ function envDisabled() {
51
+ const raw = process.env[KILL_SWITCH_ENV];
52
+ if (raw === undefined)
53
+ return false;
54
+ const normalized = raw.trim().toLowerCase();
55
+ return normalized === "1" || normalized === "true" || normalized === "yes";
56
+ }
57
+ function invalid(field, message, operation) {
58
+ throwSessionError({
59
+ code: "INVALID_CONFIGURATION",
60
+ operation,
61
+ message,
62
+ details: { field },
63
+ });
64
+ }
65
+ function checkRange(field, value, operation) {
66
+ const { min, max } = INTERACTIVE_SESSION_RANGES[field];
67
+ if (!Number.isInteger(value) || value < min || value > max) {
68
+ invalid(field, `${field} must be an integer between ${min} and ${max}.`, operation);
69
+ }
70
+ return value;
71
+ }
72
+ /**
73
+ * Resolve the effective configuration. Throws `INVALID_CONFIGURATION` for any
74
+ * out-of-range value so callers fail before allocating resources.
75
+ */
76
+ export function resolveInteractiveSessionConfig(overrides = {}, operation = "start") {
77
+ const merged = { ...INTERACTIVE_SESSION_DEFAULTS, ...overrides };
78
+ for (const field of Object.keys(INTERACTIVE_SESSION_RANGES)) {
79
+ const value = merged[field];
80
+ if (value === undefined)
81
+ continue;
82
+ if (typeof value !== "number") {
83
+ invalid(field, `${field} must be a number.`, operation);
84
+ }
85
+ checkRange(field, value, operation);
86
+ }
87
+ if (merged.artifactChunkBytes > merged.artifactCaptureBytes) {
88
+ invalid("artifactChunkBytes", "artifactChunkBytes cannot exceed artifactCaptureBytes.", operation);
89
+ }
90
+ if (merged.onOutputLimit !== "terminate" && merged.onOutputLimit !== "continue") {
91
+ invalid("onOutputLimit", "onOutputLimit must be terminate or continue.", operation);
92
+ }
93
+ return { ...merged, enabled: merged.enabled && !envDisabled() };
94
+ }
95
+ export function isInteractiveSessionsEnabled(config = resolveInteractiveSessionConfig()) {
96
+ return config.enabled;
97
+ }
98
+ /** Per-operation timeout override, validated against the same bounds. */
99
+ export function resolveDeadline(field, override, config, operation) {
100
+ if (override === undefined)
101
+ return config[field];
102
+ return checkRange(field, override, operation);
103
+ }
104
+ export function resolveQuietInterval(override, config, operation) {
105
+ if (override === undefined)
106
+ return config.quietIntervalMs;
107
+ return checkRange("quietIntervalMs", override, operation);
108
+ }
109
+ export function resolveOptionalTimeout(field, override, config, operation) {
110
+ if (override === undefined)
111
+ return config[field];
112
+ return checkRange(field, override, operation);
113
+ }
114
+ /** Validate requested dimensions before any lookup or process mutation. */
115
+ export function resolveDimensions(columns, rows, operation) {
116
+ const resolved = {
117
+ columns: columns ?? DEFAULT_DIMENSIONS.columns,
118
+ rows: rows ?? DEFAULT_DIMENSIONS.rows,
119
+ };
120
+ for (const [field, value] of Object.entries(resolved)) {
121
+ if (!Number.isInteger(value) ||
122
+ value < DIMENSION_RANGE.min ||
123
+ value > DIMENSION_RANGE.max) {
124
+ throwSessionError({
125
+ code: "INVALID_REQUEST",
126
+ operation,
127
+ message: `${field} must be an integer between ${DIMENSION_RANGE.min} and ${DIMENSION_RANGE.max}.`,
128
+ details: { field },
129
+ });
130
+ }
131
+ }
132
+ return resolved;
133
+ }
134
+ export function clampReadWait(waitMs) {
135
+ if (waitMs === undefined)
136
+ return 0;
137
+ if (!Number.isFinite(waitMs) || waitMs < 0)
138
+ return 0;
139
+ return Math.min(Math.floor(waitMs), MAX_READ_WAIT_MS);
140
+ }
141
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/interactive-session/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Contextual policy for later interactive input.
3
+ *
4
+ * Generic tool classification cannot decide this: the risk of a keystroke depends
5
+ * on the owning session, the exact bytes, and whether they are being submitted.
6
+ * Risk is monotonic with the shell boundary — a command sent into a session is
7
+ * never rated lower than the same command run through `shell.exec`.
8
+ */
9
+ import type { RiskDecision } from "../safety/classifier.js";
10
+ import type { EngagementScope } from "../store/scope.js";
11
+ import type { SessionInput, SessionTransportKind } from "./types.js";
12
+ export interface InputPolicyContext {
13
+ readonly ownerId: string;
14
+ readonly sessionId: string;
15
+ readonly transport: SessionTransportKind;
16
+ readonly input: SessionInput;
17
+ readonly scope?: EngagementScope | undefined;
18
+ }
19
+ export declare function classifyInteractiveInput(context: InputPolicyContext): RiskDecision;
20
+ /** Redacted, bounded description shown in a confirmation preview. */
21
+ export declare function describeInput(input: SessionInput): string;
22
+ export interface ApprovalBinding {
23
+ readonly ownerId: string;
24
+ readonly sessionId: string;
25
+ readonly input: SessionInput;
26
+ readonly decision: RiskDecision["level"];
27
+ }
28
+ export declare class ApprovalTokenVault {
29
+ private readonly now;
30
+ private readonly tokens;
31
+ constructor(now?: () => number);
32
+ mint(binding: ApprovalBinding): string;
33
+ /**
34
+ * Validate and invalidate atomically. Any change to owner, session, bytes,
35
+ * kind, submit behavior, or decision fails, and a token is single-use so a
36
+ * concurrent replay cannot deliver the same input twice.
37
+ */
38
+ consume(token: string | undefined, binding: ApprovalBinding): boolean;
39
+ /** Expiry sweep; single-use semantics make stale tokens unusable anyway. */
40
+ private sweep;
41
+ }
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Contextual policy for later interactive input.
3
+ *
4
+ * Generic tool classification cannot decide this: the risk of a keystroke depends
5
+ * on the owning session, the exact bytes, and whether they are being submitted.
6
+ * Risk is monotonic with the shell boundary — a command sent into a session is
7
+ * never rated lower than the same command run through `shell.exec`.
8
+ */
9
+ import { createHmac, randomBytes, timingSafeEqual } from "node:crypto";
10
+ import { classifyShellCommand } from "../safety/classifier.js";
11
+ import { maskSecret } from "../llm/provider.js";
12
+ /** Controls that only move a cursor or redraw a prompt carry no risk. */
13
+ const SAFE_CONTROLS = new Set([
14
+ "escape",
15
+ "tab",
16
+ "backspace",
17
+ "up",
18
+ "down",
19
+ "left",
20
+ "right",
21
+ "interrupt",
22
+ "suspend",
23
+ "eof",
24
+ ]);
25
+ /**
26
+ * Short, unambiguous REPL answers. Everything outside this set is treated as
27
+ * unknown submitted text and therefore requires confirmation.
28
+ */
29
+ const RECOGNIZED_ANSWER_RE = /^(y|n|yes|no|q|quit|exit|:q|:q!|help|\?|\d+(\.\d+)?|true|false|none|null)$/i;
30
+ /** REPL constructs that destroy data or escape the interpreter irreversibly. */
31
+ const REPL_DESTRUCTIVE_PATTERNS = [
32
+ /\bshutil\s*\.\s*rmtree\b/i,
33
+ /\bos\s*\.\s*(remove|unlink|rmdir)\b/i,
34
+ /\bfs\s*\.\s*(unlink|rm|rmdir)Sync?\b/i,
35
+ /\bDROP\s+(TABLE|DATABASE|SCHEMA)\b/i,
36
+ /\bTRUNCATE\s+TABLE\b/i,
37
+ /\bDELETE\s+FROM\b(?![\s\S]*\bWHERE\b)/i,
38
+ /\bRemove-Item\b[\s\S]*-Recurse/i,
39
+ ];
40
+ /** REPL constructs that mutate state or reach outside the interpreter. */
41
+ const REPL_MUTATOR_PATTERNS = [
42
+ /\bos\s*\.\s*system\b/i,
43
+ /\bsubprocess\s*\.\s*(run|call|Popen|check_output)\b/i,
44
+ /\bchild_process\b/i,
45
+ /\brequire\s*\(\s*['"]fs['"]\s*\)/i,
46
+ /\b(eval|exec)\s*\(/i,
47
+ /\bopen\s*\([^)]*['"][wa]\+?['"]/i,
48
+ /\bInvoke-(Expression|WebRequest|RestMethod)\b/i,
49
+ /\b(UPDATE|INSERT\s+INTO|ALTER\s+TABLE|GRANT|REVOKE)\b/i,
50
+ /\bpip\s+install\b|\bnpm\s+(install|i)\b/i,
51
+ ];
52
+ const EXFILTRATION_PATTERNS = [
53
+ /\b(curl|wget)\b[\s\S]*\|\s*(sh|bash|zsh|python)/i,
54
+ /\bbase64\b[\s\S]*\|\s*(curl|wget|nc)\b/i,
55
+ ];
56
+ export function classifyInteractiveInput(context) {
57
+ const { input } = context;
58
+ if (input.kind === "eof") {
59
+ return { level: "safe", reason: "Closing session input has no command effect" };
60
+ }
61
+ if (input.kind === "control") {
62
+ return SAFE_CONTROLS.has(input.control)
63
+ ? { level: "safe", reason: "Terminal navigation control" }
64
+ : { level: "confirm", reason: "Unrecognized terminal control" };
65
+ }
66
+ const text = input.text;
67
+ if (text.trim().length === 0) {
68
+ return { level: "safe", reason: "Whitespace-only input has no command effect" };
69
+ }
70
+ if (EXFILTRATION_PATTERNS.some((pattern) => pattern.test(text))) {
71
+ return {
72
+ level: "block",
73
+ reason: "Input pipes remote content into an interpreter or exports local data",
74
+ };
75
+ }
76
+ if (REPL_DESTRUCTIVE_PATTERNS.some((pattern) => pattern.test(text))) {
77
+ return { level: "block", reason: "Input matches a destructive REPL pattern" };
78
+ }
79
+ // Never rate an interactive command below the shell boundary for the same text.
80
+ const shellDecision = classifyShellCommand(text, context.scope ? { scope: context.scope } : {});
81
+ if (shellDecision.level !== "safe")
82
+ return shellDecision;
83
+ if (REPL_MUTATOR_PATTERNS.some((pattern) => pattern.test(text))) {
84
+ return { level: "confirm", reason: "Input mutates state through an interpreter" };
85
+ }
86
+ if (RECOGNIZED_ANSWER_RE.test(text.trim())) {
87
+ return { level: "safe", reason: "Recognized prompt answer" };
88
+ }
89
+ return {
90
+ level: "confirm",
91
+ reason: "Submitted interactive text is not recognized as read-only",
92
+ };
93
+ }
94
+ /** Redacted, bounded description shown in a confirmation preview. */
95
+ export function describeInput(input) {
96
+ if (input.kind === "eof")
97
+ return "close session input (EOF)";
98
+ if (input.kind === "control")
99
+ return `control: ${input.control}`;
100
+ const trimmed = input.text.trim();
101
+ const preview = trimmed.length > 120 ? `${trimmed.slice(0, 120)}…` : trimmed;
102
+ const body = /^[\x20-\x7e]*$/.test(preview) ? preview : maskSecret(preview);
103
+ return `${input.submit === "enter" ? "submit" : "type"}: ${body}`;
104
+ }
105
+ // --- Approval tokens ----------------------------------------------------
106
+ const TOKEN_TTL_MS = 60_000;
107
+ /** Per-process key: digests are never persisted, logged, or returned. */
108
+ const digestKey = randomBytes(32);
109
+ function bindingDigest(binding) {
110
+ const { input } = binding;
111
+ const parts = [
112
+ binding.ownerId,
113
+ binding.sessionId,
114
+ input.kind,
115
+ input.kind === "text" ? input.text : input.kind === "control" ? input.control : "",
116
+ input.kind === "text" ? input.submit : "",
117
+ binding.decision,
118
+ ];
119
+ return createHmac("sha256", digestKey).update(parts.join("\u0000")).digest("hex");
120
+ }
121
+ export class ApprovalTokenVault {
122
+ now;
123
+ tokens = new Map();
124
+ constructor(now = Date.now) {
125
+ this.now = now;
126
+ }
127
+ mint(binding) {
128
+ this.sweep();
129
+ const token = randomBytes(24).toString("base64url");
130
+ this.tokens.set(token, {
131
+ digest: bindingDigest(binding),
132
+ expiresAt: this.now() + TOKEN_TTL_MS,
133
+ });
134
+ return token;
135
+ }
136
+ /**
137
+ * Validate and invalidate atomically. Any change to owner, session, bytes,
138
+ * kind, submit behavior, or decision fails, and a token is single-use so a
139
+ * concurrent replay cannot deliver the same input twice.
140
+ */
141
+ consume(token, binding) {
142
+ if (!token)
143
+ return false;
144
+ const entry = this.tokens.get(token);
145
+ if (!entry)
146
+ return false;
147
+ this.tokens.delete(token);
148
+ if (entry.expiresAt <= this.now())
149
+ return false;
150
+ const expected = Buffer.from(bindingDigest(binding), "utf8");
151
+ const actual = Buffer.from(entry.digest, "utf8");
152
+ return expected.length === actual.length && timingSafeEqual(expected, actual);
153
+ }
154
+ /** Expiry sweep; single-use semantics make stale tokens unusable anyway. */
155
+ sweep() {
156
+ const now = this.now();
157
+ for (const [token, entry] of this.tokens) {
158
+ if (entry.expiresAt <= now)
159
+ this.tokens.delete(token);
160
+ }
161
+ }
162
+ }
163
+ //# sourceMappingURL=input-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-policy.js","sourceRoot":"","sources":["../../src/interactive-session/input-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Interactive session manager: the single owner of persistent interactive
3
+ * process lifecycle.
4
+ *
5
+ * Ownership is conversation-scoped. Every operation requires an owner id, and a
6
+ * lookup for another owner is indistinguishable from a missing session so the
7
+ * manager cannot be used as an existence oracle. Direct user-terminal handoff is
8
+ * outside this contract by design.
9
+ */
10
+ import type { EngagementScope } from "../store/scope.js";
11
+ import { type InteractiveSessionConfig, type InteractiveSessionOverrides } from "./config.js";
12
+ import { RecoveryJournal, type ReconciliationEntry } from "./recovery-journal.js";
13
+ import { type Clock } from "./runtime.js";
14
+ import { SessionTelemetry } from "./telemetry.js";
15
+ import { type SessionTransportFactory } from "./transport.js";
16
+ import { type CloseAllResult, type CloseOwnerResult, type CloseRequest, type CloseResult, type ListResult, type ReadRequest, type ReadResult, type ResizeRequest, type ResizeResult, type SendRequest, type SendResult, type SessionInput, type SessionOperation, type StartRequest, type StartResult, type StatusResult, type TerminationReason } from "./types.js";
17
+ /** Confirmation surface for a `confirm`-level action. Previews are redacted. */
18
+ export type ConfirmPreview = (request: {
19
+ readonly title: string;
20
+ readonly description: string;
21
+ readonly reason: string;
22
+ }) => Promise<boolean>;
23
+ export interface ManagerRequestExtras {
24
+ readonly confirm?: ConfirmPreview | undefined;
25
+ readonly scope?: EngagementScope | undefined;
26
+ }
27
+ export interface InteractiveSessionManagerDeps {
28
+ readonly config?: InteractiveSessionOverrides | undefined;
29
+ readonly transports?: SessionTransportFactory | undefined;
30
+ readonly clock?: Clock | undefined;
31
+ readonly journal?: RecoveryJournal | undefined;
32
+ readonly telemetry?: SessionTelemetry | undefined;
33
+ readonly artifactBaseDir?: string | undefined;
34
+ }
35
+ export declare class InteractiveSessionManager {
36
+ private readonly registry;
37
+ private readonly runtimes;
38
+ private readonly approvals;
39
+ private readonly telemetry;
40
+ private readonly journal;
41
+ private readonly cleanup;
42
+ private readonly transports;
43
+ private readonly clock;
44
+ private readonly baseConfig;
45
+ private readonly artifactBaseDir;
46
+ private readonly ownerCloses;
47
+ constructor(deps?: InteractiveSessionManagerDeps);
48
+ get config(): InteractiveSessionConfig;
49
+ /** Reconcile crashed-session records. Must run before tools are enabled. */
50
+ reconcileOrphans(): ReconciliationEntry[];
51
+ ptyCapability(): Promise<{
52
+ available: boolean;
53
+ reason?: string | undefined;
54
+ }>;
55
+ start(request: StartRequest & ManagerRequestExtras): Promise<StartResult>;
56
+ private launchError;
57
+ private launchWithDeadline;
58
+ send(request: SendRequest & ManagerRequestExtras): Promise<SendResult>;
59
+ private sendError;
60
+ /**
61
+ * Acceptance is all-or-nothing under the mutation lock: either the whole action
62
+ * is reserved within the backpressure bound, or no sequence or queue state
63
+ * changes at all.
64
+ */
65
+ private accept;
66
+ private assertControlSupported;
67
+ /**
68
+ * Quiet detection starts at delivery completion: only output observed after
69
+ * this point resets the quiet timer, while the absolute deadline never extends.
70
+ */
71
+ private gather;
72
+ read(request: ReadRequest): Promise<ReadResult>;
73
+ private waitForOutput;
74
+ status(request: {
75
+ ownerId: string;
76
+ id: string;
77
+ }): StatusResult;
78
+ list(request: {
79
+ ownerId: string;
80
+ }): ListResult;
81
+ resize(request: ResizeRequest): Promise<ResizeResult>;
82
+ close(request: CloseRequest): Promise<CloseResult>;
83
+ /** Owner cancellation: closes every live session owned by a conversation. */
84
+ cancelOwner(ownerId: string): Promise<CloseOwnerResult>;
85
+ /**
86
+ * Fence an owner synchronously, then start one tracked close. Callers rebinding
87
+ * a conversation id must fence before the old id becomes unreachable.
88
+ */
89
+ beginCloseOwner(ownerId: string, reason?: TerminationReason): Promise<CloseOwnerResult>;
90
+ /** Await any teardown already started for an owner. */
91
+ awaitOwnerClose(ownerId: string): Promise<void>;
92
+ closeAll(reason?: TerminationReason): Promise<CloseAllResult>;
93
+ private closeOwnerSessions;
94
+ private finalizeRecord;
95
+ private finalize;
96
+ private authorizeCommand;
97
+ private authorizeInput;
98
+ private assertOwner;
99
+ private assertNotFenced;
100
+ private assertEnabled;
101
+ private notFound;
102
+ private requireRuntime;
103
+ }
104
+ /** Strict validation of the dependent input fields before acceptance. */
105
+ export declare function validateInput(input: SessionInput | undefined, operation: SessionOperation): SessionInput;
106
+ /** Process-wide manager, mirroring the existing process-wide job manager. */
107
+ export declare const interactiveSessionManager: InteractiveSessionManager;