@qduc/term2 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/dist/acp-v2/agent.d.ts +37 -0
  2. package/dist/acp-v2/agent.d.ts.map +1 -0
  3. package/dist/acp-v2/agent.js +171 -0
  4. package/dist/acp-v2/agent.js.map +1 -0
  5. package/dist/acp-v2/serve-args.d.ts +26 -0
  6. package/dist/acp-v2/serve-args.d.ts.map +1 -0
  7. package/dist/acp-v2/serve-args.js +29 -0
  8. package/dist/acp-v2/serve-args.js.map +1 -0
  9. package/dist/acp-v2/serve.d.ts +32 -0
  10. package/dist/acp-v2/serve.d.ts.map +1 -0
  11. package/dist/acp-v2/serve.js +232 -0
  12. package/dist/acp-v2/serve.js.map +1 -0
  13. package/dist/acp-v2/session-backend.d.ts +58 -0
  14. package/dist/acp-v2/session-backend.d.ts.map +1 -0
  15. package/dist/acp-v2/session-backend.js +554 -0
  16. package/dist/acp-v2/session-backend.js.map +1 -0
  17. package/dist/agent.d.ts +1 -0
  18. package/dist/agent.d.ts.map +1 -1
  19. package/dist/agent.js +1 -0
  20. package/dist/agent.js.map +1 -1
  21. package/dist/app.d.ts.map +1 -1
  22. package/dist/app.js +12 -6
  23. package/dist/app.js.map +1 -1
  24. package/dist/cli.js +24 -0
  25. package/dist/cli.js.map +1 -1
  26. package/dist/commands/retry-failed-turn-command.d.ts +1 -0
  27. package/dist/commands/retry-failed-turn-command.d.ts.map +1 -1
  28. package/dist/commands/retry-failed-turn-command.js +3 -0
  29. package/dist/commands/retry-failed-turn-command.js.map +1 -1
  30. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  31. package/dist/components/MarkdownRenderer.js +111 -19
  32. package/dist/components/MarkdownRenderer.js.map +1 -1
  33. package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
  34. package/dist/components/input/ModelMenuSession.js +5 -2
  35. package/dist/components/input/ModelMenuSession.js.map +1 -1
  36. package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
  37. package/dist/components/input/SettingsValueMenuSession.js +55 -35
  38. package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
  39. package/dist/components/input/SubagentPoolMenuSession.d.ts.map +1 -1
  40. package/dist/components/input/SubagentPoolMenuSession.js +3 -3
  41. package/dist/components/input/SubagentPoolMenuSession.js.map +1 -1
  42. package/dist/components/input/menu-bindings.d.ts +8 -4
  43. package/dist/components/input/menu-bindings.d.ts.map +1 -1
  44. package/dist/components/input/menu-bindings.js +14 -2
  45. package/dist/components/input/menu-bindings.js.map +1 -1
  46. package/dist/components/input/settings-intent-host.d.ts.map +1 -1
  47. package/dist/components/input/settings-intent-host.js +2 -1
  48. package/dist/components/input/settings-intent-host.js.map +1 -1
  49. package/dist/components/menu/ModelSelectionMenu.d.ts +2 -1
  50. package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
  51. package/dist/components/menu/ModelSelectionMenu.js +19 -19
  52. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  53. package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
  54. package/dist/components/menu/SettingsSelectionMenu.js +32 -10
  55. package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
  56. package/dist/components/menu/SettingsValueSelectionMenu.d.ts +8 -1
  57. package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
  58. package/dist/components/menu/SettingsValueSelectionMenu.js +52 -34
  59. package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
  60. package/dist/components/menu/StandaloneModelPickerApp.d.ts.map +1 -1
  61. package/dist/components/menu/StandaloneModelPickerApp.js +5 -2
  62. package/dist/components/menu/StandaloneModelPickerApp.js.map +1 -1
  63. package/dist/components/menu/settings-value-formatter.d.ts +11 -0
  64. package/dist/components/menu/settings-value-formatter.d.ts.map +1 -1
  65. package/dist/components/menu/settings-value-formatter.js +37 -2
  66. package/dist/components/menu/settings-value-formatter.js.map +1 -1
  67. package/dist/components/message/ChatMessage.js +2 -2
  68. package/dist/components/message/ChatMessage.js.map +1 -1
  69. package/dist/components/message/command-message-helpers.d.ts +7 -7
  70. package/dist/components/message/command-message-helpers.d.ts.map +1 -1
  71. package/dist/gateway/interaction-protocol.d.ts +2 -1
  72. package/dist/gateway/interaction-protocol.d.ts.map +1 -1
  73. package/dist/gateway/interaction-protocol.js +15 -14
  74. package/dist/gateway/interaction-protocol.js.map +1 -1
  75. package/dist/gateway/runtime-factory.d.ts.map +1 -1
  76. package/dist/gateway/runtime-factory.js +6 -2
  77. package/dist/gateway/runtime-factory.js.map +1 -1
  78. package/dist/hooks/settings-completion-config.d.ts +4 -0
  79. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  80. package/dist/hooks/settings-completion-config.js +1 -1
  81. package/dist/hooks/settings-completion-config.js.map +1 -1
  82. package/dist/hooks/use-app-commands.d.ts +3 -1
  83. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  84. package/dist/hooks/use-app-commands.js +2 -2
  85. package/dist/hooks/use-app-commands.js.map +1 -1
  86. package/dist/hooks/use-conversation-messages.d.ts +1 -0
  87. package/dist/hooks/use-conversation-messages.d.ts.map +1 -1
  88. package/dist/hooks/use-conversation-messages.js +11 -0
  89. package/dist/hooks/use-conversation-messages.js.map +1 -1
  90. package/dist/hooks/use-conversation.d.ts +1 -0
  91. package/dist/hooks/use-conversation.d.ts.map +1 -1
  92. package/dist/hooks/use-conversation.js +2 -1
  93. package/dist/hooks/use-conversation.js.map +1 -1
  94. package/dist/hooks/use-model-selection.d.ts +25 -6
  95. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  96. package/dist/hooks/use-model-selection.js +37 -18
  97. package/dist/hooks/use-model-selection.js.map +1 -1
  98. package/dist/hooks/use-profile-selection.d.ts.map +1 -1
  99. package/dist/hooks/use-profile-selection.js +1 -0
  100. package/dist/hooks/use-profile-selection.js.map +1 -1
  101. package/dist/hooks/use-provider-selection.js +4 -4
  102. package/dist/hooks/use-provider-selection.js.map +1 -1
  103. package/dist/hooks/use-settings-completion.d.ts +7 -1
  104. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  105. package/dist/hooks/use-settings-completion.js +21 -1
  106. package/dist/hooks/use-settings-completion.js.map +1 -1
  107. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  108. package/dist/hooks/use-settings-value-completion.js +7 -2
  109. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  110. package/dist/hooks/use-standalone-model-picker.d.ts +9 -4
  111. package/dist/hooks/use-standalone-model-picker.d.ts.map +1 -1
  112. package/dist/hooks/use-standalone-model-picker.js +44 -18
  113. package/dist/hooks/use-standalone-model-picker.js.map +1 -1
  114. package/dist/hooks/use-subagent-pool-selection.d.ts +3 -2
  115. package/dist/hooks/use-subagent-pool-selection.d.ts.map +1 -1
  116. package/dist/hooks/use-subagent-pool-selection.js +11 -7
  117. package/dist/hooks/use-subagent-pool-selection.js.map +1 -1
  118. package/dist/lib/agent-client.d.ts +1 -0
  119. package/dist/lib/agent-client.d.ts.map +1 -1
  120. package/dist/lib/agent-client.js +17 -0
  121. package/dist/lib/agent-client.js.map +1 -1
  122. package/dist/lib/agent-configuration.d.ts +1 -0
  123. package/dist/lib/agent-configuration.d.ts.map +1 -1
  124. package/dist/lib/agent-configuration.js +3 -0
  125. package/dist/lib/agent-configuration.js.map +1 -1
  126. package/dist/lib/agent-factory.d.ts +1 -0
  127. package/dist/lib/agent-factory.d.ts.map +1 -1
  128. package/dist/lib/agent-factory.js +13 -5
  129. package/dist/lib/agent-factory.js.map +1 -1
  130. package/dist/prompts/fragments/{gpt-6-astra.md → gpt-6.md} +0 -6
  131. package/dist/prompts/fragments/skill-instruction-conflicts.md +5 -0
  132. package/dist/prompts/gpt-5.6.md +1 -1
  133. package/dist/prompts/orchestrator-prompt.test.ts +5 -2
  134. package/dist/prompts/orchestrator.md +1 -1
  135. package/dist/prompts/pair-mode-stub.md +3 -0
  136. package/dist/prompts/pair-mode.md +29 -0
  137. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  138. package/dist/prompts/prompt-constructor.js +1 -0
  139. package/dist/prompts/prompt-constructor.js.map +1 -1
  140. package/dist/prompts/prompt-constructor.test.ts +28 -18
  141. package/dist/prompts/prompt-constructor.ts +1 -0
  142. package/dist/prompts/prompt-profiles.js +3 -3
  143. package/dist/prompts/prompt-profiles.js.map +1 -1
  144. package/dist/prompts/prompt-profiles.ts +3 -3
  145. package/dist/prompts/steering-notice.d.ts +3 -3
  146. package/dist/prompts/steering-notice.d.ts.map +1 -1
  147. package/dist/prompts/steering-notice.js +13 -5
  148. package/dist/prompts/steering-notice.js.map +1 -1
  149. package/dist/prompts/steering-notice.test.ts +36 -0
  150. package/dist/prompts/steering-notice.ts +17 -4
  151. package/dist/prompts/subagents/base-gpt-5-modern.md +1 -1
  152. package/dist/prompts/subagents/worker-prompt.test.ts +13 -1
  153. package/dist/prompts/subagents/worker.md +4 -2
  154. package/dist/providers/model-catalog/catalog.generated.d.ts +505 -361
  155. package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
  156. package/dist/providers/model-catalog/catalog.generated.js +505 -361
  157. package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
  158. package/dist/providers/openrouter-decisions.d.ts +8 -0
  159. package/dist/providers/openrouter-decisions.d.ts.map +1 -1
  160. package/dist/providers/openrouter-decisions.js +59 -12
  161. package/dist/providers/openrouter-decisions.js.map +1 -1
  162. package/dist/scripts/eval-gpt6-prompts.d.ts +2 -0
  163. package/dist/scripts/eval-gpt6-prompts.d.ts.map +1 -0
  164. package/dist/scripts/eval-gpt6-prompts.js +214 -0
  165. package/dist/scripts/eval-gpt6-prompts.js.map +1 -0
  166. package/dist/services/agent-runtime/application-run-loop.d.ts +3 -0
  167. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
  168. package/dist/services/agent-runtime/application-run-loop.js +39 -3
  169. package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
  170. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts.map +1 -1
  171. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js +8 -3
  172. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js.map +1 -1
  173. package/dist/services/approval/decision-shadow.d.ts +14 -3
  174. package/dist/services/approval/decision-shadow.d.ts.map +1 -1
  175. package/dist/services/approval/decision-shadow.js +11 -12
  176. package/dist/services/approval/decision-shadow.js.map +1 -1
  177. package/dist/services/approval/non-interactive-approval-policy.d.ts +0 -2
  178. package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -1
  179. package/dist/services/approval/non-interactive-approval-policy.js +0 -2
  180. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -1
  181. package/dist/services/approval/shell-auto-approval-evaluator.d.ts +1 -3
  182. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  183. package/dist/services/approval/shell-auto-approval-evaluator.js +99 -77
  184. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  185. package/dist/services/conversation/conversation-events.d.ts +6 -1
  186. package/dist/services/conversation/conversation-events.d.ts.map +1 -1
  187. package/dist/services/conversation/conversation-events.js.map +1 -1
  188. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  189. package/dist/services/conversation/conversation-orchestrator.js +10 -0
  190. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  191. package/dist/services/decision-shadow/decision-client.d.ts +42 -0
  192. package/dist/services/decision-shadow/decision-client.d.ts.map +1 -0
  193. package/dist/services/decision-shadow/decision-client.js +94 -0
  194. package/dist/services/decision-shadow/decision-client.js.map +1 -0
  195. package/dist/services/decision-shadow/decision-shadow-observer.d.ts +16 -0
  196. package/dist/services/decision-shadow/decision-shadow-observer.d.ts.map +1 -0
  197. package/dist/services/decision-shadow/decision-shadow-observer.js +2 -0
  198. package/dist/services/decision-shadow/decision-shadow-observer.js.map +1 -0
  199. package/dist/services/decision-shadow/decision-shadow-pilot.d.ts +14 -0
  200. package/dist/services/decision-shadow/decision-shadow-pilot.d.ts.map +1 -0
  201. package/dist/services/decision-shadow/decision-shadow-pilot.js +166 -0
  202. package/dist/services/decision-shadow/decision-shadow-pilot.js.map +1 -0
  203. package/dist/services/decision-shadow/failure-observation.d.ts +10 -0
  204. package/dist/services/decision-shadow/failure-observation.d.ts.map +1 -0
  205. package/dist/services/decision-shadow/failure-observation.js +26 -0
  206. package/dist/services/decision-shadow/failure-observation.js.map +1 -0
  207. package/dist/services/decision-shadow/failure-triage.d.ts +33 -0
  208. package/dist/services/decision-shadow/failure-triage.d.ts.map +1 -0
  209. package/dist/services/decision-shadow/failure-triage.js +60 -0
  210. package/dist/services/decision-shadow/failure-triage.js.map +1 -0
  211. package/dist/services/decision-shadow/replay-evaluator.d.ts +44 -0
  212. package/dist/services/decision-shadow/replay-evaluator.d.ts.map +1 -0
  213. package/dist/services/decision-shadow/replay-evaluator.js +65 -0
  214. package/dist/services/decision-shadow/replay-evaluator.js.map +1 -0
  215. package/dist/services/decision-shadow/replay-fixtures.d.ts +8 -0
  216. package/dist/services/decision-shadow/replay-fixtures.d.ts.map +1 -0
  217. package/dist/services/decision-shadow/replay-fixtures.js +14 -0
  218. package/dist/services/decision-shadow/replay-fixtures.js.map +1 -0
  219. package/dist/services/mode-notices.d.ts.map +1 -1
  220. package/dist/services/mode-notices.js +5 -1
  221. package/dist/services/mode-notices.js.map +1 -1
  222. package/dist/services/models/decision-model-listing.d.ts +3 -3
  223. package/dist/services/models/decision-model-listing.d.ts.map +1 -1
  224. package/dist/services/models/decision-model-listing.js +3 -3
  225. package/dist/services/models/decision-model-listing.js.map +1 -1
  226. package/dist/services/models/model-nicknames.d.ts +38 -2
  227. package/dist/services/models/model-nicknames.d.ts.map +1 -1
  228. package/dist/services/models/model-nicknames.js +64 -8
  229. package/dist/services/models/model-nicknames.js.map +1 -1
  230. package/dist/services/models/model-tabs.d.ts +22 -0
  231. package/dist/services/models/model-tabs.d.ts.map +1 -0
  232. package/dist/services/models/model-tabs.js +38 -0
  233. package/dist/services/models/model-tabs.js.map +1 -0
  234. package/dist/services/profiles/labels.d.ts.map +1 -1
  235. package/dist/services/profiles/labels.js +2 -0
  236. package/dist/services/profiles/labels.js.map +1 -1
  237. package/dist/services/profiles/legacy-adapter.d.ts.map +1 -1
  238. package/dist/services/profiles/legacy-adapter.js +1 -0
  239. package/dist/services/profiles/legacy-adapter.js.map +1 -1
  240. package/dist/services/profiles/profile-transition.d.ts.map +1 -1
  241. package/dist/services/profiles/profile-transition.js +3 -0
  242. package/dist/services/profiles/profile-transition.js.map +1 -1
  243. package/dist/services/profiles/registry.d.ts.map +1 -1
  244. package/dist/services/profiles/registry.js +8 -0
  245. package/dist/services/profiles/registry.js.map +1 -1
  246. package/dist/services/session/continuation-recovery-handler.d.ts +4 -2
  247. package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
  248. package/dist/services/session/continuation-recovery-handler.js +1 -1
  249. package/dist/services/session/continuation-recovery-handler.js.map +1 -1
  250. package/dist/services/session/initial-turn-recovery-handler.d.ts +4 -2
  251. package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
  252. package/dist/services/session/initial-turn-recovery-handler.js +1 -1
  253. package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
  254. package/dist/services/session/pending-interaction-state.d.ts +2 -0
  255. package/dist/services/session/pending-interaction-state.d.ts.map +1 -1
  256. package/dist/services/session/pending-interaction-state.js +12 -0
  257. package/dist/services/session/pending-interaction-state.js.map +1 -1
  258. package/dist/services/session/session-composition.d.ts +18 -2
  259. package/dist/services/session/session-composition.d.ts.map +1 -1
  260. package/dist/services/session/session-composition.js +74 -46
  261. package/dist/services/session/session-composition.js.map +1 -1
  262. package/dist/services/settings/ancillary-settings-migration.d.ts.map +1 -1
  263. package/dist/services/settings/ancillary-settings-migration.js +4 -0
  264. package/dist/services/settings/ancillary-settings-migration.js.map +1 -1
  265. package/dist/services/settings/settings-schema.d.ts +4 -4
  266. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  267. package/dist/services/settings/settings-schema.js +17 -17
  268. package/dist/services/settings/settings-schema.js.map +1 -1
  269. package/dist/services/settings/settings-service.d.ts +4 -1
  270. package/dist/services/settings/settings-service.d.ts.map +1 -1
  271. package/dist/services/settings/settings-service.js +19 -24
  272. package/dist/services/settings/settings-service.js.map +1 -1
  273. package/dist/services/settings/settings-sources.d.ts +1 -1
  274. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  275. package/dist/services/settings/settings-sources.js +1 -1
  276. package/dist/services/settings/settings-sources.js.map +1 -1
  277. package/dist/services/settings/settings-ui-metadata.d.ts +4 -0
  278. package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -1
  279. package/dist/services/settings/settings-ui-metadata.js +22 -13
  280. package/dist/services/settings/settings-ui-metadata.js.map +1 -1
  281. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +2 -1
  282. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  283. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +1 -1
  284. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  285. package/dist/services/subagents/role-loader.d.ts.map +1 -1
  286. package/dist/services/subagents/role-loader.js +1 -0
  287. package/dist/services/subagents/role-loader.js.map +1 -1
  288. package/dist/services/subagents/subagent-async-registry.d.ts.map +1 -1
  289. package/dist/services/subagents/subagent-async-registry.js +1 -0
  290. package/dist/services/subagents/subagent-async-registry.js.map +1 -1
  291. package/dist/tools/system/run-code/run-code.d.ts.map +1 -1
  292. package/dist/tools/system/run-code/run-code.js +1 -0
  293. package/dist/tools/system/run-code/run-code.js.map +1 -1
  294. package/dist/tools/system/shell.d.ts +2 -0
  295. package/dist/tools/system/shell.d.ts.map +1 -1
  296. package/dist/tools/system/shell.js +9 -4
  297. package/dist/tools/system/shell.js.map +1 -1
  298. package/dist/types/message.d.ts +2 -0
  299. package/dist/types/message.d.ts.map +1 -1
  300. package/dist/types/message.js.map +1 -1
  301. package/dist/utils/clear-input-before-reset.d.ts +19 -0
  302. package/dist/utils/clear-input-before-reset.d.ts.map +1 -0
  303. package/dist/utils/clear-input-before-reset.js +20 -0
  304. package/dist/utils/clear-input-before-reset.js.map +1 -0
  305. package/dist/utils/settings-command.d.ts +2 -0
  306. package/dist/utils/settings-command.d.ts.map +1 -1
  307. package/dist/utils/settings-command.js +30 -1
  308. package/dist/utils/settings-command.js.map +1 -1
  309. package/dist/utils/shell/sandbox/denied-read-detector.d.ts.map +1 -1
  310. package/dist/utils/shell/sandbox/denied-read-detector.js +10 -6
  311. package/dist/utils/shell/sandbox/denied-read-detector.js.map +1 -1
  312. package/dist/utils/value-suggestions.js +3 -3
  313. package/dist/utils/value-suggestions.js.map +1 -1
  314. package/package.json +2 -1
@@ -0,0 +1,37 @@
1
+ import * as acp from '@agentclientprotocol/sdk/experimental/v2';
2
+ import type { ILoggingService } from '../services/service-interfaces.js';
3
+ export type AcpV2PromptOutcome = Readonly<{
4
+ stopReason: acp.StopReason;
5
+ }>;
6
+ export type AcpV2EmitUpdate = (update: acp.SessionUpdate) => Promise<void>;
7
+ /**
8
+ * A prompt that has passed admission but has not started producing updates.
9
+ * Keeping admission separate lets the ACP response acknowledge accepted work
10
+ * before the runtime begins streaming it.
11
+ */
12
+ export type AcpV2PromptExecution = Readonly<{
13
+ run: (emit: AcpV2EmitUpdate, signal: AbortSignal) => Promise<AcpV2PromptOutcome>;
14
+ }>;
15
+ /**
16
+ * Protocol-neutral lifecycle required by the ACP adapter. The production
17
+ * implementation will be backed by term2's extracted headless session host;
18
+ * this boundary keeps ACP transport and schema concerns out of that host.
19
+ */
20
+ export interface AcpV2SessionBackend {
21
+ createSession(request: Pick<acp.NewSessionRequest, 'cwd'>): Promise<acp.NewSessionResponse>;
22
+ listSessions(request: acp.ListSessionsRequest): Promise<acp.ListSessionsResponse>;
23
+ resumeSession(request: Pick<acp.ResumeSessionRequest, 'sessionId' | 'cwd' | 'replayFrom'>, emit: AcpV2EmitUpdate): Promise<acp.ResumeSessionResponse>;
24
+ closeSession(sessionId: acp.SessionId): Promise<void>;
25
+ preparePrompt(request: acp.PromptRequest): Promise<AcpV2PromptExecution>;
26
+ cancelSession(sessionId: acp.SessionId): Promise<void>;
27
+ setClient?(sessionId: acp.SessionId, client: acp.AgentContext, signal: AbortSignal): void;
28
+ clearClient?(sessionId: acp.SessionId): void;
29
+ }
30
+ export type CreateAcpV2AgentOptions = Readonly<{
31
+ backend: AcpV2SessionBackend;
32
+ logger: Pick<ILoggingService, 'error'>;
33
+ version: string;
34
+ }>;
35
+ /** Build the experimental ACP v2 protocol adapter around a session backend. */
36
+ export declare function createAcpV2Agent(options: CreateAcpV2AgentOptions): acp.AgentApp;
37
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../source/acp-v2/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,0CAA0C,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,GAAG,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClF,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC5F,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClF,aAAa,CACX,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,WAAW,GAAG,KAAK,GAAG,YAAY,CAAC,EAC3E,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACtC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,aAAa,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzE,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,SAAS,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1F,WAAW,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAoBH,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,GAAG,CAAC,QAAQ,CAiH/E"}
@@ -0,0 +1,171 @@
1
+ import * as acp from '@agentclientprotocol/sdk/experimental/v2';
2
+ const SESSION_BUSY_ERROR_CODE = -32000;
3
+ const assertNoUnsupportedSessionExtensions = (request) => {
4
+ if (request.additionalDirectories && request.additionalDirectories.length > 0) {
5
+ throw acp.RequestError.invalidParams(undefined, 'additionalDirectories are not supported');
6
+ }
7
+ if (request.mcpServers && request.mcpServers.length > 0) {
8
+ throw acp.RequestError.invalidParams(undefined, 'MCP servers are not supported');
9
+ }
10
+ };
11
+ /** Build the experimental ACP v2 protocol adapter around a session backend. */
12
+ export function createAcpV2Agent(options) {
13
+ const activePrompts = new Map();
14
+ const app = acp.agent({ name: 'term2' });
15
+ app.onRequest(acp.methods.agent.initialize, () => ({
16
+ protocolVersion: acp.PROTOCOL_VERSION,
17
+ info: { name: 'term2', title: 'term2', version: options.version },
18
+ capabilities: { session: {} },
19
+ }));
20
+ app.onRequest(acp.methods.agent.session.new, async ({ params }) => {
21
+ assertNoUnsupportedSessionExtensions(params);
22
+ return await options.backend.createSession({ cwd: params.cwd });
23
+ });
24
+ app.onRequest(acp.methods.agent.session.list, async ({ params }) => await options.backend.listSessions(params));
25
+ app.onRequest(acp.methods.agent.session.resume, async ({ params, client }) => {
26
+ assertNoUnsupportedSessionExtensions(params);
27
+ return await options.backend.resumeSession({
28
+ sessionId: params.sessionId,
29
+ cwd: params.cwd,
30
+ ...(params.replayFrom === undefined ? {} : { replayFrom: params.replayFrom }),
31
+ }, async (update) => {
32
+ await client.notify(acp.methods.client.session.update, { sessionId: params.sessionId, update });
33
+ });
34
+ });
35
+ app.onRequest(acp.methods.agent.session.close, async ({ params }) => {
36
+ const active = activePrompts.get(params.sessionId);
37
+ active?.controller.abort();
38
+ let cancellationError;
39
+ try {
40
+ if (active)
41
+ await options.backend.cancelSession(params.sessionId);
42
+ }
43
+ catch (error) {
44
+ cancellationError = error;
45
+ }
46
+ await active?.done;
47
+ await options.backend.closeSession(params.sessionId);
48
+ options.backend.clearClient?.(params.sessionId);
49
+ if (cancellationError !== undefined)
50
+ throw cancellationError;
51
+ return {};
52
+ });
53
+ app.onRequest(acp.methods.agent.session.prompt, async ({ params, client }) => {
54
+ const { active, settle } = reservePrompt(activePrompts, params.sessionId);
55
+ options.backend.setClient?.(params.sessionId, client, active.controller.signal);
56
+ let execution;
57
+ try {
58
+ execution = await options.backend.preparePrompt(params);
59
+ }
60
+ catch (error) {
61
+ activePrompts.delete(params.sessionId);
62
+ options.backend.clearClient?.(params.sessionId);
63
+ settle();
64
+ throw error;
65
+ }
66
+ if (active.controller.signal.aborted) {
67
+ setTimeout(() => {
68
+ void runPrompt({
69
+ sessionId: params.sessionId,
70
+ execution,
71
+ controller: active.controller,
72
+ client,
73
+ activePrompts,
74
+ logger: options.logger,
75
+ }).finally(() => {
76
+ options.backend.clearClient?.(params.sessionId);
77
+ settle();
78
+ });
79
+ }, 0);
80
+ return {};
81
+ }
82
+ try {
83
+ await client.notify(acp.methods.client.session.update, {
84
+ sessionId: params.sessionId,
85
+ update: { sessionUpdate: 'state_update', state: 'running' },
86
+ });
87
+ }
88
+ catch (error) {
89
+ activePrompts.delete(params.sessionId);
90
+ options.backend.clearClient?.(params.sessionId);
91
+ active.controller.abort();
92
+ settle();
93
+ await options.backend.cancelSession(params.sessionId);
94
+ throw error;
95
+ }
96
+ setTimeout(() => {
97
+ void runPrompt({
98
+ sessionId: params.sessionId,
99
+ execution,
100
+ controller: active.controller,
101
+ client,
102
+ activePrompts,
103
+ logger: options.logger,
104
+ }).finally(() => {
105
+ options.backend.clearClient?.(params.sessionId);
106
+ settle();
107
+ });
108
+ }, 0);
109
+ return {};
110
+ });
111
+ app.onNotification(acp.methods.agent.session.cancel, async ({ params }) => {
112
+ activePrompts.get(params.sessionId)?.controller.abort();
113
+ await options.backend.cancelSession(params.sessionId);
114
+ });
115
+ return app;
116
+ }
117
+ function reservePrompt(activePrompts, sessionId) {
118
+ if (activePrompts.has(sessionId)) {
119
+ throw new acp.RequestError(SESSION_BUSY_ERROR_CODE, 'Session is already processing foreground work');
120
+ }
121
+ const controller = new AbortController();
122
+ let settle;
123
+ const done = new Promise((resolve) => {
124
+ settle = resolve;
125
+ });
126
+ const active = { controller, done };
127
+ activePrompts.set(sessionId, active);
128
+ return { active, settle };
129
+ }
130
+ async function runPrompt(input) {
131
+ let stopReason = '_term2_error';
132
+ try {
133
+ if (input.controller.signal.aborted) {
134
+ stopReason = 'cancelled';
135
+ }
136
+ else {
137
+ const result = await input.execution.run(async (update) => {
138
+ await input.client.notify(acp.methods.client.session.update, { sessionId: input.sessionId, update });
139
+ }, input.controller.signal);
140
+ stopReason = input.controller.signal.aborted ? 'cancelled' : result.stopReason;
141
+ }
142
+ }
143
+ catch (error) {
144
+ if (input.controller.signal.aborted) {
145
+ stopReason = 'cancelled';
146
+ }
147
+ else {
148
+ input.logger.error('ACP prompt execution failed', {
149
+ eventType: 'acp.prompt.failed',
150
+ sessionId: input.sessionId,
151
+ errorMessage: error instanceof Error ? error.message : String(error),
152
+ });
153
+ }
154
+ }
155
+ finally {
156
+ if (input.activePrompts.get(input.sessionId)?.controller === input.controller) {
157
+ input.activePrompts.delete(input.sessionId);
158
+ }
159
+ try {
160
+ await input.client.notify(acp.methods.client.session.update, {
161
+ sessionId: input.sessionId,
162
+ update: { sessionUpdate: 'state_update', state: 'idle', stopReason },
163
+ });
164
+ }
165
+ catch {
166
+ // A disconnected client cannot receive the terminal update. Session
167
+ // persistence remains the source of truth for a later resume.
168
+ }
169
+ }
170
+ }
171
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../source/acp-v2/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ModelSettingsReasoningEffort } from '../services/models/reasoning-effort.js';
2
+ /**
3
+ * Flag parsing for `term2 acp`, kept free of I/O so the launcher's
4
+ * operator-facing contract is unit-testable. Nothing here reads files or
5
+ * opens streams; `runAcp` owns the effectful composition.
6
+ *
7
+ * The accepted set is deliberately minimal — `--provider`, `--model` and
8
+ * `--effort` are the only knobs the launcher exposes. There is no
9
+ * `--auto-approve`: ACP sessions stay fail-closed in this milestone, so the
10
+ * CLI's interactive auto-approve flag is rejected as an unknown option rather
11
+ * than silently ignored.
12
+ */
13
+ export type AcpArgs = {
14
+ provider?: string;
15
+ model?: string;
16
+ effort?: ModelSettingsReasoningEffort;
17
+ };
18
+ export type AcpArgsResult = {
19
+ ok: true;
20
+ args: AcpArgs;
21
+ } | {
22
+ ok: false;
23
+ error: string;
24
+ };
25
+ export declare function parseAcpArgs(argv: readonly string[]): AcpArgsResult;
26
+ //# sourceMappingURL=serve-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-args.d.ts","sourceRoot":"","sources":["../../source/acp-v2/serve-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAEpH;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,4BAA4B,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAuBnE"}
@@ -0,0 +1,29 @@
1
+ import { VALID_REASONING_EFFORTS } from '../services/models/reasoning-effort.js';
2
+ const VALUE_FLAGS = new Set(['--provider', '--model', '--effort']);
3
+ export function parseAcpArgs(argv) {
4
+ const args = {};
5
+ for (let index = 0; index < argv.length; index += 1) {
6
+ const token = argv[index];
7
+ if (!token.startsWith('--'))
8
+ return { ok: false, error: `unexpected argument "${token}"` };
9
+ if (!VALUE_FLAGS.has(token))
10
+ return { ok: false, error: `unknown option "${token}"` };
11
+ const value = argv[index + 1];
12
+ if (value === undefined || value === '' || value.startsWith('--')) {
13
+ return { ok: false, error: `${token} requires a value` };
14
+ }
15
+ index += 1;
16
+ if (token === '--provider')
17
+ args.provider = value;
18
+ else if (token === '--model')
19
+ args.model = value;
20
+ else {
21
+ if (!VALID_REASONING_EFFORTS.includes(value)) {
22
+ return { ok: false, error: `--effort must be one of: ${VALID_REASONING_EFFORTS.join(', ')}` };
23
+ }
24
+ args.effort = value;
25
+ }
26
+ }
27
+ return { ok: true, args };
28
+ }
29
+ //# sourceMappingURL=serve-args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve-args.js","sourceRoot":"","sources":["../../source/acp-v2/serve-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAqC,MAAM,wCAAwC,CAAC;AAsBpH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAEnE,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,MAAM,IAAI,GAAiF,EAAE,CAAC;IAE9F,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,KAAK,GAAG,EAAE,CAAC;QAC3F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,KAAK,GAAG,EAAE,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,mBAAmB,EAAE,CAAC;QAC3D,CAAC;QACD,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,KAAK,KAAK,YAAY;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;aAC7C,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;aAC5C,CAAC;YACJ,IAAI,CAAE,uBAA6C,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAChG,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,KAAqC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `term2 acp`: serve the Agent Client Protocol v2 over stdio.
3
+ *
4
+ * The launcher composes the same production stack `term2 serve` does — the
5
+ * operator's real settings authority, the shared session-log wiring, the shell
6
+ * sandbox runner probe, and the production runtime factory — and then hands the
7
+ * ACP adapter both ends of the JSON-RPC stream. It blocks until the client
8
+ * closes stdin (the ACP connection then closes) or until SIGINT/SIGTERM, then
9
+ * performs a bounded shutdown and returns.
10
+ *
11
+ * stdio contract: stdout is the protocol channel and nothing else may write to
12
+ * it. Diagnostics go to stderr, which is why every handler here takes an
13
+ * injected `writeStderr` instead of calling `console.error` directly.
14
+ *
15
+ * Security posture is inherited, not configured: the runtime factory's session
16
+ * snapshot forces `allowWrite:true`, `autoApprove:false` and
17
+ * `allowUnsandboxed:false` for every session, and there is intentionally no
18
+ * flag that relaxes it. Approval-required tools are mediated by the ACP
19
+ * `session/request_permission` bridge and remain fail-closed on every error.
20
+ */
21
+ export type AcpServeIo = Readonly<{
22
+ stdin: ReadableStream<Uint8Array>;
23
+ stdout: WritableStream<Uint8Array>;
24
+ writeStderr: (message: string) => void;
25
+ /** Best-effort drain of stdout before the caller exits the process. */
26
+ flushStdout?: () => Promise<void>;
27
+ }>;
28
+ /** The real stdio of this process, wired as a newline-delimited JSON-RPC channel. */
29
+ export declare function createStdioAcpIo(): AcpServeIo;
30
+ /** Returns the process exit code: 0 for a clean shutdown, 1 for a startup failure. */
31
+ export declare function runAcp(argv: readonly string[], io: AcpServeIo): Promise<number>;
32
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../source/acp-v2/serve.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACnC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC,CAAC,CAAC;AAEH,qFAAqF;AACrF,wBAAgB,gBAAgB,IAAI,UAAU,CAe7C;AAED,sFAAsF;AACtF,wBAAsB,MAAM,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAkJrF"}
@@ -0,0 +1,232 @@
1
+ import { mkdtempSync, rmSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import path from 'node:path';
4
+ import { Readable, Writable } from 'node:stream';
5
+ import * as acp from '@agentclientprotocol/sdk/experimental/v2';
6
+ import { createAcpV2Agent } from './agent.js';
7
+ import { createAcpV2SessionBackend } from './session-backend.js';
8
+ import { parseAcpArgs } from './serve-args.js';
9
+ import { getAllProviders, getProviderIds } from '../providers/index.js';
10
+ import { installationVersion } from '../providers/fetch/logging-middleware.js';
11
+ import { resolveModelFlag } from '../services/models/model-resolution.js';
12
+ import { buildEnvOverrides, SettingsService } from '../services/settings/settings-service.js';
13
+ import { createServeSessionLogWiring } from '../gateway/serve.js';
14
+ import { createProductionRuntimeFactory } from '../gateway/runtime-factory.js';
15
+ import { getDefaultShellSandboxRunner } from '../utils/shell/sandbox/shell-sandbox-runner.js';
16
+ /** The real stdio of this process, wired as a newline-delimited JSON-RPC channel. */
17
+ export function createStdioAcpIo() {
18
+ return {
19
+ stdin: Readable.toWeb(process.stdin),
20
+ stdout: Writable.toWeb(process.stdout),
21
+ writeStderr: (message) => {
22
+ process.stderr.write(`${message}\n`);
23
+ },
24
+ // An empty write resolves once every earlier write to the same handle has
25
+ // completed, so this is the flush barrier `process.exit` needs to avoid
26
+ // truncating a piped stdout.
27
+ flushStdout: () => new Promise((resolve) => {
28
+ process.stdout.write('', () => resolve());
29
+ }),
30
+ };
31
+ }
32
+ /** Returns the process exit code: 0 for a clean shutdown, 1 for a startup failure. */
33
+ export async function runAcp(argv, io) {
34
+ const parsed = parseAcpArgs(argv);
35
+ if (!parsed.ok) {
36
+ io.writeStderr(`term2 acp: ${parsed.error}`);
37
+ return 1;
38
+ }
39
+ const args = parsed.args;
40
+ const { createLogger, createSessionContext } = createServeSessionLogWiring();
41
+ const sessionContext = createSessionContext();
42
+ const logger = createLogger('acp-launcher', sessionContext);
43
+ const cliOverrides = {};
44
+ if (args.provider || args.model || args.effort) {
45
+ cliOverrides.agent = {
46
+ ...(args.provider ? { provider: args.provider } : {}),
47
+ ...(args.model ? { model: args.model } : {}),
48
+ ...(args.effort ? { reasoningEffort: args.effort } : {}),
49
+ };
50
+ }
51
+ // The launcher process is the credential owner: this is the operator's real
52
+ // settings service (same env precedence as the CLI), not a per-session
53
+ // overlay. Sessions receive only the factory's allowlisted snapshot.
54
+ const settingsAuthority = new SettingsService({
55
+ env: buildEnvOverrides(),
56
+ ...(cliOverrides.agent ? { cli: cliOverrides } : {}),
57
+ loggingService: logger,
58
+ });
59
+ // Validated after settings load so runtime-defined providers from
60
+ // settings.json are registered before the flag is checked.
61
+ if (args.provider && !getProviderIds().includes(args.provider)) {
62
+ io.writeStderr(`term2 acp: unknown provider "${args.provider}".`);
63
+ io.writeStderr('Available providers:');
64
+ for (const provider of getAllProviders()) {
65
+ io.writeStderr(` - ${provider.id} (${provider.label})`);
66
+ }
67
+ return 1;
68
+ }
69
+ if (args.model) {
70
+ // The default prompter reads from the terminal. Here stdin carries the
71
+ // JSON-RPC channel, so an ambiguous pattern must fail instead of consuming
72
+ // protocol bytes: a null answer makes resolution report `cancelled`.
73
+ const resolution = await resolveModelFlag({
74
+ modelFlag: args.model,
75
+ ...(args.provider ? { providerFlag: args.provider } : {}),
76
+ settingsService: settingsAuthority,
77
+ loggingService: logger,
78
+ prompter: async () => null,
79
+ });
80
+ if (resolution.status === 'no_match') {
81
+ io.writeStderr(`term2 acp: ${resolution.error}`);
82
+ return 1;
83
+ }
84
+ if (resolution.status === 'cancelled') {
85
+ io.writeStderr(`term2 acp: cannot resolve --model "${args.model}" non-interactively; pass an exact model id or <provider>/<model>.`);
86
+ return 1;
87
+ }
88
+ if ('warnings' in resolution && resolution.warnings) {
89
+ for (const warning of resolution.warnings)
90
+ io.writeStderr(warning);
91
+ }
92
+ // A per-session override like every other CLI flag; it must not rewrite the
93
+ // user's persisted defaults, so nothing here persists.
94
+ settingsAuthority.set('agent.model', resolution.modelId, { persist: false });
95
+ if (resolution.provider)
96
+ settingsAuthority.set('agent.provider', resolution.provider, { persist: false });
97
+ if (resolution.reasoningEffort && !args.effort) {
98
+ settingsAuthority.set('agent.reasoningEffort', resolution.reasoningEffort, { persist: false });
99
+ }
100
+ }
101
+ const sandboxWarning = await sandboxWarningFor();
102
+ if (sandboxWarning)
103
+ io.writeStderr(sandboxWarning);
104
+ // Per-session scratch for the worker boundary. A unique directory (never
105
+ // /tmp itself) so a session's TMPDIR cannot be shared with another process.
106
+ let tempRoot;
107
+ try {
108
+ tempRoot = mkdtempSync(path.join(tmpdir(), 'term2-acp-'));
109
+ }
110
+ catch (error) {
111
+ io.writeStderr(`term2 acp: cannot create the runtime scratch directory: ${messageOf(error)}`);
112
+ return 1;
113
+ }
114
+ let runtimeFactory;
115
+ let backend;
116
+ let agent;
117
+ try {
118
+ runtimeFactory = createProductionRuntimeFactory({
119
+ settingsAuthority,
120
+ tmpDir: tempRoot,
121
+ sandboxAvailable: true,
122
+ allowWrite: true,
123
+ createLogger,
124
+ createSessionContext,
125
+ });
126
+ backend = createAcpV2SessionBackend({ runtimeFactory, logger });
127
+ agent = createAcpV2Agent({ backend, logger, version: installationVersion });
128
+ }
129
+ catch (error) {
130
+ rmSync(tempRoot, { recursive: true, force: true });
131
+ io.writeStderr(`term2 acp: failed to start: ${messageOf(error)}`);
132
+ return 1;
133
+ }
134
+ // The CLI module registers global SIGINT/SIGTERM handlers that force-exit for
135
+ // interactive sessions. An ACP shutdown is bounded and must be allowed to
136
+ // flush live conversations, so those listeners are parked for the run and put
137
+ // back in the `finally`. Restoring them matters because this launcher owns
138
+ // only its own two handlers: the parked ones belong to the CLI entrypoint, a
139
+ // test host, or an instrumenting module, and dropping them would change how
140
+ // the rest of the process reacts to a signal. The raw wrappers are parked so
141
+ // a `once` listener keeps its one-shot semantics when it comes back.
142
+ const parkedSigint = process.rawListeners('SIGINT');
143
+ const parkedSigterm = process.rawListeners('SIGTERM');
144
+ process.removeAllListeners('SIGINT');
145
+ process.removeAllListeners('SIGTERM');
146
+ let requestShutdown = () => undefined;
147
+ const shutdownRequested = new Promise((resolve) => {
148
+ requestShutdown = resolve;
149
+ });
150
+ const onSignal = () => requestShutdown();
151
+ process.once('SIGINT', onSignal);
152
+ process.once('SIGTERM', onSignal);
153
+ try {
154
+ const connection = agent.connect(acp.ndJsonStream(io.stdout, io.stdin));
155
+ // EOF on stdin closes the connection (the SDK's receive loop ends with the
156
+ // stream), so both a well-behaved client and a crashed one land here.
157
+ await Promise.race([connection.closed, shutdownRequested]);
158
+ await shutdownAcp({ backend, runtimeFactory, logger, io });
159
+ try {
160
+ await io.flushStdout?.();
161
+ }
162
+ catch {
163
+ // The process is exiting; a failed final drain has no recovery path.
164
+ }
165
+ return 0;
166
+ }
167
+ finally {
168
+ process.removeListener('SIGINT', onSignal);
169
+ process.removeListener('SIGTERM', onSignal);
170
+ for (const listener of parkedSigint)
171
+ process.on('SIGINT', listener);
172
+ for (const listener of parkedSigterm)
173
+ process.on('SIGTERM', listener);
174
+ rmSync(tempRoot, { recursive: true, force: true });
175
+ }
176
+ }
177
+ /**
178
+ * Bounded teardown: cancel turns and close live sessions, logging (and warning
179
+ * on stderr) rather than failing, because the client is already gone and there
180
+ * is nothing left to report an error to. The deadline spans two grace periods:
181
+ * each session's own dispose already spends one bounded grace period on
182
+ * cancellation and another on shutdown, and a hang there must not hold the
183
+ * process open forever.
184
+ */
185
+ async function shutdownAcp(input) {
186
+ const graceMs = Math.max(1, input.runtimeFactory.policy.shutdownGraceMs) * 2;
187
+ let deadlineReached = false;
188
+ let deadlineTimer;
189
+ const deadline = new Promise((resolve) => {
190
+ deadlineTimer = setTimeout(() => {
191
+ deadlineReached = true;
192
+ resolve();
193
+ }, graceMs);
194
+ });
195
+ try {
196
+ await Promise.race([input.backend.shutdown(), deadline]);
197
+ }
198
+ catch (error) {
199
+ input.logger.error('ACP shutdown failed', {
200
+ eventType: 'acp.shutdown.failed',
201
+ errorMessage: messageOf(error),
202
+ });
203
+ input.io.writeStderr(`term2 acp: shutdown failed: ${messageOf(error)}`);
204
+ }
205
+ finally {
206
+ if (deadlineTimer)
207
+ clearTimeout(deadlineTimer);
208
+ }
209
+ if (deadlineReached) {
210
+ input.logger.warn('ACP shutdown deadline reached', { eventType: 'acp.shutdown.deadline', graceMs });
211
+ input.io.writeStderr(`term2 acp: shutdown deadline reached after ${graceMs}ms; exiting anyway`);
212
+ }
213
+ }
214
+ /**
215
+ * Advisory only: the shell tool probes the runner per command and refuses the
216
+ * unsandboxed fallback, so an unavailable sandbox never gates startup — it just
217
+ * tells the operator up front why every shell call will be refused.
218
+ */
219
+ async function sandboxWarningFor() {
220
+ const describe = (availability) => `term2 acp: warning: shell sandbox unavailable: ${availability.type}${availability.reason ? ` (${availability.reason})` : ''}; shell tool calls will be refused`;
221
+ try {
222
+ const availability = await getDefaultShellSandboxRunner().availability();
223
+ return availability.type === 'available' ? undefined : describe(availability);
224
+ }
225
+ catch (error) {
226
+ return describe({ type: 'probe_failed', reason: messageOf(error) });
227
+ }
228
+ }
229
+ function messageOf(error) {
230
+ return error instanceof Error ? error.message : String(error);
231
+ }
232
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../source/acp-v2/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import * as acp from '@agentclientprotocol/sdk/experimental/v2';
2
+ import { listConversations, loadConversation } from '../services/conversation/conversation-persistence.js';
3
+ import type { RuntimeFactory } from '../gateway/runtime-factory.js';
4
+ import { type ConversationLogWriter } from '../services/logging/conversation-log-writer.js';
5
+ import type { ILoggingService } from '../services/service-interfaces.js';
6
+ import type { AcpV2SessionBackend } from './agent.js';
7
+ export declare function mapAcpPermissionChoices(choices: readonly {
8
+ id: string;
9
+ label: string;
10
+ }[]): Array<{
11
+ choice: {
12
+ id: string;
13
+ label: string;
14
+ };
15
+ option: {
16
+ optionId: string;
17
+ name: string;
18
+ kind: acp.PermissionOptionKind;
19
+ };
20
+ }>;
21
+ export type AcpV2SessionBackendOptions = Readonly<{
22
+ runtimeFactory: RuntimeFactory;
23
+ createId?: () => string;
24
+ list?: typeof listConversations;
25
+ load?: typeof loadConversation;
26
+ ownerUserId?: string;
27
+ pageSize?: number;
28
+ logger?: ILoggingService;
29
+ writerFactory?: (options: {
30
+ sessionId: string;
31
+ dir: string;
32
+ logger: ILoggingService;
33
+ }) => ConversationLogWriter;
34
+ decideApproval?: (request: {
35
+ readonly toolName: string;
36
+ readonly callId?: string;
37
+ readonly argumentsText: string;
38
+ }, context: {
39
+ readonly sessionId: string;
40
+ readonly cwd: string;
41
+ }) => Promise<{
42
+ readonly answer: string;
43
+ readonly reason?: string;
44
+ }>;
45
+ }>;
46
+ /**
47
+ * The production backend a launcher process owns: the adapter's protocol
48
+ * surface plus a process-lifecycle method that cancels active turns and closes
49
+ * every live session. `AcpV2SessionBackend` deliberately stays free of
50
+ * lifecycle concerns (the adapter has no shutdown concept), so the launcher's
51
+ * teardown is expressed additively here rather than in the adapter contract.
52
+ */
53
+ export type AcpV2ProductionSessionBackend = AcpV2SessionBackend & {
54
+ shutdown(): Promise<void>;
55
+ };
56
+ export declare function createAcpV2SessionBackend(options: AcpV2SessionBackendOptions): AcpV2ProductionSessionBackend;
57
+ export declare const createProductionAcpV2SessionBackend: typeof createAcpV2SessionBackend;
58
+ //# sourceMappingURL=session-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-backend.d.ts","sourceRoot":"","sources":["../../source/acp-v2/session-backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,0CAA0C,CAAC;AAGhE,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,sDAAsD,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,gDAAgD,CAAC;AAExD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEzE,OAAO,KAAK,EAAyC,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAqC7F,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,KAAK,CAAC;IAChG,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC,oBAAoB,CAAA;KAAE,CAAC;CAC5E,CAAC,CAKD;AAED,MAAM,MAAM,0BAA0B,GAAG,QAAQ,CAAC;IAChD,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,iBAAiB,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,KAAK,qBAAqB,CAAC;IAChH,cAAc,CAAC,EAAE,CACf,OAAO,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;KAAE,EAChG,OAAO,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAC1D,OAAO,CAAC;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,MAAM,6BAA6B,GAAG,mBAAmB,GAAG;IAChE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,6BAA6B,CA0a5G;AAED,eAAO,MAAM,mCAAmC,kCAA4B,CAAC"}