@scotthuang/agent-knock-knock 0.13.2 → 0.13.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 (278) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +27 -6
  3. package/dist/src/callback-outbox-policy.js +27 -6
  4. package/dist/src/callback-outbox-policy.js.map +1 -1
  5. package/dist/src/callback-outbox-service.d.ts +4 -30
  6. package/dist/src/callback-outbox-service.js +21 -154
  7. package/dist/src/callback-outbox-service.js.map +1 -1
  8. package/dist/src/callback-outbox-settlement.js +13 -8
  9. package/dist/src/callback-outbox-settlement.js.map +1 -1
  10. package/dist/src/callback-route-service.d.ts +46 -0
  11. package/dist/src/callback-route-service.js +155 -0
  12. package/dist/src/callback-route-service.js.map +1 -0
  13. package/dist/src/claude-terminal-agent-adapter.js +4 -0
  14. package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
  15. package/dist/src/cli-core.js +9 -1
  16. package/dist/src/cli-core.js.map +1 -1
  17. package/dist/src/codex-process-incarnation.d.ts +8 -0
  18. package/dist/src/codex-process-incarnation.js +36 -0
  19. package/dist/src/codex-process-incarnation.js.map +1 -0
  20. package/dist/src/codex-terminal-agent-adapter.js +4 -0
  21. package/dist/src/codex-terminal-agent-adapter.js.map +1 -1
  22. package/dist/src/deferred-foreground-conflict-policy.d.ts +22 -0
  23. package/dist/src/deferred-foreground-conflict-policy.js +52 -0
  24. package/dist/src/deferred-foreground-conflict-policy.js.map +1 -0
  25. package/dist/src/durable-notification-kernel.d.ts +94 -0
  26. package/dist/src/durable-notification-kernel.js +68 -0
  27. package/dist/src/durable-notification-kernel.js.map +1 -0
  28. package/dist/src/herdr-socket-transport.d.ts +43 -0
  29. package/dist/src/herdr-socket-transport.js +170 -0
  30. package/dist/src/herdr-socket-transport.js.map +1 -0
  31. package/dist/src/herdr-terminal-control-provider.d.ts +2 -45
  32. package/dist/src/herdr-terminal-control-provider.js +8 -173
  33. package/dist/src/herdr-terminal-control-provider.js.map +1 -1
  34. package/dist/src/host-adapter-capabilities.d.ts +35 -0
  35. package/dist/src/host-adapter-capabilities.js +146 -0
  36. package/dist/src/host-adapter-capabilities.js.map +1 -0
  37. package/dist/src/host-adapter.d.ts +9 -3
  38. package/dist/src/host-adapter.js +33 -9
  39. package/dist/src/host-adapter.js.map +1 -1
  40. package/dist/src/host-bridge-tools.d.ts +3 -4
  41. package/dist/src/host-bridge-tools.js +49 -92
  42. package/dist/src/host-bridge-tools.js.map +1 -1
  43. package/dist/src/host-bridge.js +5 -5
  44. package/dist/src/host-bridge.js.map +1 -1
  45. package/dist/src/host-monitor-reconciliation.d.ts +6 -0
  46. package/dist/src/host-monitor-reconciliation.js +96 -0
  47. package/dist/src/host-monitor-reconciliation.js.map +1 -0
  48. package/dist/src/managed-session.js +2 -18
  49. package/dist/src/managed-session.js.map +1 -1
  50. package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +13 -0
  51. package/dist/src/native-thread-lifecycle-cli-adapter.js +635 -3
  52. package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
  53. package/dist/src/openclaw-list-projection.d.ts +2 -0
  54. package/dist/src/openclaw-list-projection.js +3 -0
  55. package/dist/src/openclaw-list-projection.js.map +1 -0
  56. package/dist/src/openclaw-model-facing-field-policy.d.ts +2 -0
  57. package/dist/src/openclaw-model-facing-field-policy.js +3 -0
  58. package/dist/src/openclaw-model-facing-field-policy.js.map +1 -0
  59. package/dist/src/openclaw-plugin-command-adapter.d.ts +6 -29
  60. package/dist/src/openclaw-plugin-command-adapter.js +7 -2370
  61. package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
  62. package/dist/src/openclaw-plugin-helpers.d.ts +2 -121
  63. package/dist/src/openclaw-plugin-helpers.js +2 -1164
  64. package/dist/src/openclaw-plugin-helpers.js.map +1 -1
  65. package/dist/src/openclaw-plugin-schemas.d.ts +2 -510
  66. package/dist/src/openclaw-plugin-schemas.js +2 -519
  67. package/dist/src/openclaw-plugin-schemas.js.map +1 -1
  68. package/dist/src/openclaw-plugin-supervisor.d.ts +4 -5
  69. package/dist/src/openclaw-plugin-supervisor.js +5 -94
  70. package/dist/src/openclaw-plugin-supervisor.js.map +1 -1
  71. package/dist/src/openclaw-plugin-value-helpers.d.ts +2 -0
  72. package/dist/src/openclaw-plugin-value-helpers.js +3 -0
  73. package/dist/src/openclaw-plugin-value-helpers.js.map +1 -0
  74. package/dist/src/openclaw-private-authority-offers.d.ts +4 -39
  75. package/dist/src/openclaw-private-authority-offers.js +3 -258
  76. package/dist/src/openclaw-private-authority-offers.js.map +1 -1
  77. package/dist/src/semantic-private-authority-offers.d.ts +41 -0
  78. package/dist/src/semantic-private-authority-offers.js +261 -0
  79. package/dist/src/semantic-private-authority-offers.js.map +1 -0
  80. package/dist/src/semantic-tool-arguments.d.ts +9 -0
  81. package/dist/src/semantic-tool-arguments.js +64 -0
  82. package/dist/src/semantic-tool-arguments.js.map +1 -0
  83. package/dist/src/semantic-tool-catalog.d.ts +48 -0
  84. package/dist/src/semantic-tool-catalog.js +105 -0
  85. package/dist/src/semantic-tool-catalog.js.map +1 -0
  86. package/dist/src/semantic-tool-command-helpers.d.ts +145 -0
  87. package/dist/src/semantic-tool-command-helpers.js +1272 -0
  88. package/dist/src/semantic-tool-command-helpers.js.map +1 -0
  89. package/dist/src/semantic-tool-list-projection.d.ts +10 -0
  90. package/dist/src/semantic-tool-list-projection.js +497 -0
  91. package/dist/src/semantic-tool-list-projection.js.map +1 -0
  92. package/dist/src/semantic-tool-model-facing-field-policy.d.ts +3 -0
  93. package/dist/src/semantic-tool-model-facing-field-policy.js +66 -0
  94. package/dist/src/semantic-tool-model-facing-field-policy.js.map +1 -0
  95. package/dist/src/semantic-tool-presentation.d.ts +37 -0
  96. package/dist/src/semantic-tool-presentation.js +680 -0
  97. package/dist/src/semantic-tool-presentation.js.map +1 -0
  98. package/dist/src/semantic-tool-private-authority.d.ts +39 -0
  99. package/dist/src/semantic-tool-private-authority.js +602 -0
  100. package/dist/src/semantic-tool-private-authority.js.map +1 -0
  101. package/dist/src/semantic-tool-relay.d.ts +16 -0
  102. package/dist/src/semantic-tool-relay.js +175 -0
  103. package/dist/src/semantic-tool-relay.js.map +1 -0
  104. package/dist/src/semantic-tool-runtime.d.ts +10 -0
  105. package/dist/src/semantic-tool-runtime.js +1157 -0
  106. package/dist/src/semantic-tool-runtime.js.map +1 -0
  107. package/dist/src/semantic-tool-schemas.d.ts +563 -0
  108. package/dist/src/semantic-tool-schemas.js +573 -0
  109. package/dist/src/semantic-tool-schemas.js.map +1 -0
  110. package/dist/src/semantic-tool-value-helpers.d.ts +5 -0
  111. package/dist/src/semantic-tool-value-helpers.js +27 -0
  112. package/dist/src/semantic-tool-value-helpers.js.map +1 -0
  113. package/dist/src/store-event-presentation.d.ts +17 -0
  114. package/dist/src/store-event-presentation.js +33 -0
  115. package/dist/src/store-event-presentation.js.map +1 -0
  116. package/dist/src/store.d.ts +3 -16
  117. package/dist/src/store.js +2 -30
  118. package/dist/src/store.js.map +1 -1
  119. package/dist/src/terminal-action-projection.d.ts +3 -17
  120. package/dist/src/terminal-action-projection.js +13 -41
  121. package/dist/src/terminal-action-projection.js.map +1 -1
  122. package/dist/src/terminal-agent-adapter.d.ts +7 -0
  123. package/dist/src/terminal-agent-adapter.js +8 -0
  124. package/dist/src/terminal-agent-adapter.js.map +1 -1
  125. package/dist/src/terminal-agent-bridge.d.ts +35 -332
  126. package/dist/src/terminal-agent-bridge.js +293 -2798
  127. package/dist/src/terminal-agent-bridge.js.map +1 -1
  128. package/dist/src/terminal-approval-cli-adapter.d.ts +17 -0
  129. package/dist/src/terminal-approval-cli-adapter.js +921 -0
  130. package/dist/src/terminal-approval-cli-adapter.js.map +1 -0
  131. package/dist/src/terminal-command-cli-adapter.d.ts +2 -429
  132. package/dist/src/terminal-command-cli-adapter.js +344 -6061
  133. package/dist/src/terminal-command-cli-adapter.js.map +1 -1
  134. package/dist/src/terminal-command-cli-ports.d.ts +443 -0
  135. package/dist/src/terminal-command-cli-ports.js +2 -0
  136. package/dist/src/terminal-command-cli-ports.js.map +1 -0
  137. package/dist/src/terminal-command-dispatch-preparation.d.ts +81 -0
  138. package/dist/src/terminal-command-dispatch-preparation.js +209 -0
  139. package/dist/src/terminal-command-dispatch-preparation.js.map +1 -0
  140. package/dist/src/terminal-command-dispatch-transport.d.ts +35 -0
  141. package/dist/src/terminal-command-dispatch-transport.js +859 -0
  142. package/dist/src/terminal-command-dispatch-transport.js.map +1 -0
  143. package/dist/src/terminal-command-foreground-proof.d.ts +32 -0
  144. package/dist/src/terminal-command-foreground-proof.js +72 -0
  145. package/dist/src/terminal-command-foreground-proof.js.map +1 -0
  146. package/dist/src/terminal-command-send-preflight.d.ts +41 -0
  147. package/dist/src/terminal-command-send-preflight.js +86 -0
  148. package/dist/src/terminal-command-send-preflight.js.map +1 -0
  149. package/dist/src/terminal-composer-classifier.d.ts +55 -0
  150. package/dist/src/terminal-composer-classifier.js +638 -0
  151. package/dist/src/terminal-composer-classifier.js.map +1 -0
  152. package/dist/src/terminal-control-ref.d.ts +23 -0
  153. package/dist/src/terminal-control-ref.js +32 -0
  154. package/dist/src/terminal-control-ref.js.map +1 -1
  155. package/dist/src/terminal-dispatch-recovery-authority.d.ts +56 -0
  156. package/dist/src/terminal-dispatch-recovery-authority.js +251 -0
  157. package/dist/src/terminal-dispatch-recovery-authority.js.map +1 -0
  158. package/dist/src/terminal-dispatch-recovery-cli-adapter.d.ts +1 -9
  159. package/dist/src/terminal-dispatch-recovery-cli-adapter.js +5 -240
  160. package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -1
  161. package/dist/src/terminal-handoff-cli-adapter.d.ts +1 -11
  162. package/dist/src/terminal-handoff-cli-adapter.js +2 -39
  163. package/dist/src/terminal-handoff-cli-adapter.js.map +1 -1
  164. package/dist/src/terminal-human-explicit-send-cli-adapter.d.ts +25 -0
  165. package/dist/src/terminal-human-explicit-send-cli-adapter.js +903 -0
  166. package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -0
  167. package/dist/src/terminal-identity-authority-cli-adapter.d.ts +1 -6
  168. package/dist/src/terminal-identity-authority-cli-adapter.js +3 -33
  169. package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -1
  170. package/dist/src/terminal-interaction-cli-adapter.js +209 -210
  171. package/dist/src/terminal-interaction-cli-adapter.js.map +1 -1
  172. package/dist/src/terminal-interaction-core.d.ts +0 -2
  173. package/dist/src/terminal-interaction-core.js +4 -3
  174. package/dist/src/terminal-interaction-core.js.map +1 -1
  175. package/dist/src/terminal-interaction-protocol.d.ts +21 -0
  176. package/dist/src/terminal-interaction-protocol.js +74 -0
  177. package/dist/src/terminal-interaction-protocol.js.map +1 -1
  178. package/dist/src/terminal-interaction-response-bridge.d.ts +126 -0
  179. package/dist/src/terminal-interaction-response-bridge.js +579 -0
  180. package/dist/src/terminal-interaction-response-bridge.js.map +1 -0
  181. package/dist/src/terminal-interaction-response-transaction.d.ts +44 -0
  182. package/dist/src/terminal-interaction-response-transaction.js +56 -0
  183. package/dist/src/terminal-interaction-response-transaction.js.map +1 -0
  184. package/dist/src/terminal-list-action-policy.d.ts +43 -0
  185. package/dist/src/terminal-list-action-policy.js +164 -0
  186. package/dist/src/terminal-list-action-policy.js.map +1 -0
  187. package/dist/src/terminal-list-cli-adapter.d.ts +6 -36
  188. package/dist/src/terminal-list-cli-adapter.js +314 -1711
  189. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  190. package/dist/src/terminal-list-facts.d.ts +129 -0
  191. package/dist/src/terminal-list-facts.js +179 -0
  192. package/dist/src/terminal-list-facts.js.map +1 -0
  193. package/dist/src/terminal-list-inventory.d.ts +59 -0
  194. package/dist/src/terminal-list-inventory.js +194 -0
  195. package/dist/src/terminal-list-inventory.js.map +1 -0
  196. package/dist/src/terminal-list-ownership-service.d.ts +118 -0
  197. package/dist/src/terminal-list-ownership-service.js +1003 -0
  198. package/dist/src/terminal-list-ownership-service.js.map +1 -0
  199. package/dist/src/terminal-list-projection-service.d.ts +49 -0
  200. package/dist/src/terminal-list-projection-service.js +407 -0
  201. package/dist/src/terminal-list-projection-service.js.map +1 -0
  202. package/dist/src/terminal-list-renderer.d.ts +12 -11
  203. package/dist/src/terminal-list-renderer.js +237 -104
  204. package/dist/src/terminal-list-renderer.js.map +1 -1
  205. package/dist/src/terminal-managed-send-cli-adapter.d.ts +33 -0
  206. package/dist/src/terminal-managed-send-cli-adapter.js +994 -0
  207. package/dist/src/terminal-managed-send-cli-adapter.js.map +1 -0
  208. package/dist/src/terminal-managed-turn-list-action-policy.d.ts +47 -0
  209. package/dist/src/terminal-managed-turn-list-action-policy.js +64 -0
  210. package/dist/src/terminal-managed-turn-list-action-policy.js.map +1 -0
  211. package/dist/src/terminal-model-control-action-policy.d.ts +60 -0
  212. package/dist/src/terminal-model-control-action-policy.js +96 -0
  213. package/dist/src/terminal-model-control-action-policy.js.map +1 -0
  214. package/dist/src/terminal-model-control-availability.d.ts +68 -0
  215. package/dist/src/terminal-model-control-availability.js +157 -0
  216. package/dist/src/terminal-model-control-availability.js.map +1 -0
  217. package/dist/src/terminal-model-control-bridge.d.ts +48 -0
  218. package/dist/src/terminal-model-control-bridge.js +259 -0
  219. package/dist/src/terminal-model-control-bridge.js.map +1 -0
  220. package/dist/src/terminal-model-control-profile.d.ts +55 -0
  221. package/dist/src/terminal-model-control-profile.js +137 -0
  222. package/dist/src/terminal-model-control-profile.js.map +1 -0
  223. package/dist/src/terminal-model-control-subject.d.ts +34 -0
  224. package/dist/src/terminal-model-control-subject.js +58 -0
  225. package/dist/src/terminal-model-control-subject.js.map +1 -0
  226. package/dist/src/terminal-model-control-transaction.d.ts +19 -0
  227. package/dist/src/terminal-model-control-transaction.js +39 -0
  228. package/dist/src/terminal-model-control-transaction.js.map +1 -0
  229. package/dist/src/terminal-model-control.d.ts +331 -0
  230. package/dist/src/terminal-model-control.js +1686 -0
  231. package/dist/src/terminal-model-control.js.map +1 -0
  232. package/dist/src/terminal-monitor-application-service.js +50 -17
  233. package/dist/src/terminal-monitor-application-service.js.map +1 -1
  234. package/dist/src/terminal-native-inspection-bridge.d.ts +211 -0
  235. package/dist/src/terminal-native-inspection-bridge.js +1127 -0
  236. package/dist/src/terminal-native-inspection-bridge.js.map +1 -0
  237. package/dist/src/terminal-runtime-cli-adapter.d.ts +2 -0
  238. package/dist/src/terminal-runtime-cli-adapter.js +59 -17
  239. package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
  240. package/dist/src/terminal-submission-retry-application.d.ts +24 -0
  241. package/dist/src/terminal-submission-retry-application.js +402 -0
  242. package/dist/src/terminal-submission-retry-application.js.map +1 -0
  243. package/dist/src/terminal-submission-retry-ports.d.ts +30 -0
  244. package/dist/src/terminal-submission-retry-ports.js +2 -0
  245. package/dist/src/terminal-submission-retry-ports.js.map +1 -0
  246. package/dist/src/terminal-submission-retry-reconciliation.d.ts +236 -0
  247. package/dist/src/terminal-submission-retry-reconciliation.js +1130 -0
  248. package/dist/src/terminal-submission-retry-reconciliation.js.map +1 -0
  249. package/dist/src/terminal-submission-retry-transport.d.ts +58 -0
  250. package/dist/src/terminal-submission-retry-transport.js +675 -0
  251. package/dist/src/terminal-submission-retry-transport.js.map +1 -0
  252. package/dist/src/terminal-text-submission-bridge.d.ts +200 -0
  253. package/dist/src/terminal-text-submission-bridge.js +632 -0
  254. package/dist/src/terminal-text-submission-bridge.js.map +1 -0
  255. package/dist/src/terminal-user-explicit-send-policy.d.ts +29 -0
  256. package/dist/src/terminal-user-explicit-send-policy.js +46 -0
  257. package/dist/src/terminal-user-explicit-send-policy.js.map +1 -0
  258. package/dist/src/terminal-watch-cli-adapter.js +91 -143
  259. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  260. package/dist/src/terminal-watch-codec.d.ts +9 -0
  261. package/dist/src/terminal-watch-codec.js +1051 -0
  262. package/dist/src/terminal-watch-codec.js.map +1 -0
  263. package/dist/src/terminal-watch-interaction-response-store.d.ts +19 -0
  264. package/dist/src/terminal-watch-interaction-response-store.js +87 -0
  265. package/dist/src/terminal-watch-interaction-response-store.js.map +1 -0
  266. package/dist/src/terminal-watch-record.d.ts +319 -0
  267. package/dist/src/terminal-watch-record.js +742 -0
  268. package/dist/src/terminal-watch-record.js.map +1 -0
  269. package/dist/src/terminal-watch-service.js +48 -27
  270. package/dist/src/terminal-watch-service.js.map +1 -1
  271. package/dist/src/terminal-watch-store.d.ts +3 -279
  272. package/dist/src/terminal-watch-store.js +5 -1779
  273. package/dist/src/terminal-watch-store.js.map +1 -1
  274. package/docs/quickstart-herdr.md +1 -1
  275. package/docs/quickstart-tmux.md +27 -2
  276. package/openclaw.plugin.json +13 -1
  277. package/package.json +7 -2
  278. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +54 -11
@@ -0,0 +1,259 @@
1
+ import { inspectNativeQuestionnaire } from "./terminal-questionnaire-adapter.js";
2
+ import { CODEX_MODEL_CONTROL_AGENT_VERSION, isTerminalModelControlPlanForAgent, terminalModelControlSlashCompletionRows } from "./terminal-model-control.js";
3
+ /**
4
+ * Bind model-control's semantic transaction to the terminal transport.
5
+ *
6
+ * Every input permit below is deliberately operation-local and one-shot. The
7
+ * factory neither owns terminal locks nor writes Store state: callers retain
8
+ * those boundaries and the domain state machine retains `beforeInput` timing.
9
+ */
10
+ export function createTerminalModelControlPorts(input) {
11
+ const { adapter, plan, runtime, beforeInput, loadCodexCatalog, runtimePorts, classifiers } = input;
12
+ let claudeModelDialogInputPermit;
13
+ let codexModelInputPermit;
14
+ const consumeCodexModelInputPermit = () => {
15
+ const permit = codexModelInputPermit;
16
+ codexModelInputPermit = undefined;
17
+ return permit;
18
+ };
19
+ const verifyModelControlTerminalIdentity = async (terminalControl, options) => {
20
+ const canUseClaudeModelDialog = adapter.agent === "claude" &&
21
+ isTerminalModelControlPlanForAgent(plan, "claude") &&
22
+ runtime?.requireExactClaudeAgentRow === true &&
23
+ runtime.exactClaudeAgentState === "idle";
24
+ if (options.claudeModelDialog === "require") {
25
+ if (!canUseClaudeModelDialog) {
26
+ throw new Error("Claude model-dialog identity cannot be required outside its exact profile");
27
+ }
28
+ return runtimePorts.verifyTerminalIdentity(adapter.agent, terminalControl, { ...runtime, exactClaudeAgentState: "status_dialog" });
29
+ }
30
+ try {
31
+ return await runtimePorts.verifyTerminalIdentity(adapter.agent, terminalControl, runtime);
32
+ }
33
+ catch (idleError) {
34
+ if (options.claudeModelDialog !== "allow" ||
35
+ !canUseClaudeModelDialog) {
36
+ throw idleError;
37
+ }
38
+ try {
39
+ return await runtimePorts.verifyTerminalIdentity(adapter.agent, terminalControl, { ...runtime, exactClaudeAgentState: "status_dialog" });
40
+ }
41
+ catch {
42
+ // Preserve the original current-snapshot failure. Both attempts use
43
+ // the same PID, process incarnation, native Session, cwd, and terminal
44
+ // control fence; the second changes only the exact allowed agents row
45
+ // state from idle to `waiting` / `dialog open`.
46
+ throw idleError;
47
+ }
48
+ }
49
+ };
50
+ const capture = async (captureInput) => {
51
+ claudeModelDialogInputPermit = undefined;
52
+ codexModelInputPermit = undefined;
53
+ const original = captureInput.terminalControl;
54
+ const verified = await verifyModelControlTerminalIdentity(original, {
55
+ claudeModelDialog: "allow"
56
+ });
57
+ const styledScreen = await runtimePorts.captureStyled(verified);
58
+ const screen = classifiers.stripEscapes(styledScreen);
59
+ const inspection = adapter.inspectScreen({ screen, runtime });
60
+ const modelObservation = adapter.observeModelControl?.(plan, screen);
61
+ const exactCodexModelSurface = adapter.agent === "codex" &&
62
+ modelObservation !== undefined &&
63
+ modelObservation.state !== "none" &&
64
+ modelObservation.state !== "ambiguous";
65
+ const exactClaudeModelDialog = adapter.agent === "claude" &&
66
+ modelObservation?.state === "claude_model_picker";
67
+ const reverified = await verifyModelControlTerminalIdentity(verified, {
68
+ claudeModelDialog: exactClaudeModelDialog ? "require" : "forbid"
69
+ });
70
+ if (!classifiers.sameIdentity(verified, reverified)) {
71
+ throw new Error("terminal control identity changed across model-control capture");
72
+ }
73
+ if (exactClaudeModelDialog) {
74
+ claudeModelDialogInputPermit = {
75
+ terminalControl: reverified,
76
+ fingerprint: modelObservation.fingerprint
77
+ };
78
+ }
79
+ const codexComposer = adapter.agent === "codex"
80
+ ? classifiers.currentCodexComposer(styledScreen, captureInput.expectedComposer ?? "", false, false, captureInput.expectedComposer === plan.command
81
+ ? terminalModelControlSlashCompletionRows(plan)
82
+ : undefined)
83
+ : undefined;
84
+ let codexInputBlocked = false;
85
+ if (adapter.agent === "codex") {
86
+ try {
87
+ const questionnaire = inspectNativeQuestionnaire({
88
+ agent: "codex",
89
+ version: CODEX_MODEL_CONTROL_AGENT_VERSION,
90
+ screen: styledScreen
91
+ });
92
+ const asyncQuestionMode = classifiers.inspectCodexAsyncQuestionInputMode(styledScreen);
93
+ codexInputBlocked = !exactCodexModelSurface && (questionnaire.status !== "none" ||
94
+ classifiers.codexActiveWriterViewerVisible(styledScreen) ||
95
+ asyncQuestionMode === "expanded" ||
96
+ asyncQuestionMode === "ambiguous");
97
+ }
98
+ catch {
99
+ codexInputBlocked = !exactCodexModelSurface;
100
+ }
101
+ }
102
+ const exactEmptyComposer = adapter.agent === "codex"
103
+ ? codexComposer?.state === "exact_empty"
104
+ : classifiers.isExactClaudeIdleComposer(screen);
105
+ const claudeProfiledCommand = adapter.agent === "claude" &&
106
+ captureInput.expectedComposer === plan.command &&
107
+ classifiers.exactClaudeModelControlComposer(screen, plan, captureInput.expectedComposer) !== undefined;
108
+ const claudeBareCommand = adapter.agent === "claude" &&
109
+ captureInput.expectedComposer !== undefined &&
110
+ classifiers.exactTerminalComposer("claude", screen, captureInput.expectedComposer) !== undefined;
111
+ const exactCommandComposer = captureInput.expectedComposer !== undefined && (adapter.agent === "codex"
112
+ ? codexComposer?.state === "exact_draft"
113
+ : claudeProfiledCommand || claudeBareCommand);
114
+ const exactCommandReady = adapter.agent === "codex"
115
+ ? codexComposer?.state === "exact_draft" &&
116
+ codexComposer.profiledSlashPopup === true
117
+ : claudeProfiledCommand;
118
+ const exactBareCommand = adapter.agent === "codex"
119
+ ? codexComposer?.state === "exact_draft" &&
120
+ codexComposer.bareCommand === true
121
+ : claudeBareCommand && !claudeProfiledCommand;
122
+ if (adapter.agent === "codex") {
123
+ const exactModelSurface = modelObservation &&
124
+ modelObservation.state !== "none" &&
125
+ modelObservation.state !== "ambiguous"
126
+ ? {
127
+ kind: "model_surface",
128
+ fingerprint: modelObservation.fingerprint
129
+ }
130
+ : undefined;
131
+ const exactComposerSurface = codexComposer?.state === "exact_empty"
132
+ ? {
133
+ kind: "composer_empty",
134
+ fingerprint: codexComposer.digest
135
+ }
136
+ : codexComposer?.state === "exact_draft"
137
+ ? {
138
+ kind: "composer_command",
139
+ fingerprint: codexComposer.digest
140
+ }
141
+ : undefined;
142
+ const proof = exactModelSurface ?? exactComposerSurface;
143
+ if (proof) {
144
+ codexModelInputPermit = {
145
+ terminalControl: reverified,
146
+ expectedComposer: captureInput.expectedComposer,
147
+ ...proof
148
+ };
149
+ }
150
+ }
151
+ return {
152
+ terminalControl: reverified,
153
+ screen,
154
+ // The exact profiled picker is the current input owner. Generic
155
+ // lifecycle/questionnaire detectors may still see stale transcript
156
+ // markers behind that overlay, so keep their result from vetoing the
157
+ // model-control state machine. Unknown or partial pickers receive no
158
+ // such override and remain fail-closed.
159
+ activityState: exactCodexModelSurface
160
+ ? "unknown"
161
+ : inspection.activity.state,
162
+ approvalBlocked: exactCodexModelSurface
163
+ ? false
164
+ : inspection.approval.blocked,
165
+ exactEmptyComposer,
166
+ exactCommandReady,
167
+ exactCommandComposer,
168
+ exactBareCommand,
169
+ ...(codexComposer?.state === "exact_draft"
170
+ ? { exactCommandFingerprint: codexComposer.digest }
171
+ : {}),
172
+ inputBlocked: codexInputBlocked
173
+ };
174
+ };
175
+ return {
176
+ beforeInput,
177
+ loadCodexCatalog,
178
+ capture,
179
+ sendText: async (control, text) => {
180
+ claudeModelDialogInputPermit = undefined;
181
+ if (adapter.agent === "codex") {
182
+ const permit = consumeCodexModelInputPermit();
183
+ if (!permit || permit.kind !== "composer_empty") {
184
+ throw new Error("Codex /model text requires one fresh exact empty-composer permit");
185
+ }
186
+ const fresh = await capture({
187
+ terminalControl: control,
188
+ expectedComposer: permit.expectedComposer
189
+ });
190
+ const freshPermit = consumeCodexModelInputPermit();
191
+ if (!freshPermit ||
192
+ freshPermit.kind !== permit.kind ||
193
+ freshPermit.fingerprint !== permit.fingerprint ||
194
+ !classifiers.sameIdentity(permit.terminalControl, freshPermit.terminalControl) ||
195
+ fresh.inputBlocked === true ||
196
+ fresh.approvalBlocked ||
197
+ fresh.activityState === "working" ||
198
+ fresh.activityState === "awaiting_approval" ||
199
+ !fresh.exactEmptyComposer) {
200
+ throw new Error("the exact Codex empty composer changed before /model text delivery");
201
+ }
202
+ await runtimePorts.sendText(freshPermit.terminalControl, text);
203
+ return;
204
+ }
205
+ const verified = await runtimePorts.verifyTerminalIdentity(adapter.agent, control, runtime);
206
+ await runtimePorts.sendText(verified, text);
207
+ },
208
+ sendKeys: async (control, keys) => {
209
+ const requestedControl = control;
210
+ if (adapter.agent === "codex") {
211
+ const permit = consumeCodexModelInputPermit();
212
+ claudeModelDialogInputPermit = undefined;
213
+ if (!permit ||
214
+ !classifiers.sameIdentity(permit.terminalControl, requestedControl)) {
215
+ throw new Error("Codex model-control key requires one fresh exact input-surface permit");
216
+ }
217
+ const fresh = await capture({
218
+ terminalControl: requestedControl,
219
+ expectedComposer: permit.expectedComposer
220
+ });
221
+ const freshPermit = consumeCodexModelInputPermit();
222
+ if (!freshPermit ||
223
+ freshPermit.kind !== permit.kind ||
224
+ freshPermit.fingerprint !== permit.fingerprint ||
225
+ !classifiers.sameIdentity(permit.terminalControl, freshPermit.terminalControl) ||
226
+ fresh.inputBlocked === true ||
227
+ fresh.approvalBlocked ||
228
+ fresh.activityState === "working" ||
229
+ fresh.activityState === "awaiting_approval") {
230
+ throw new Error("the exact Codex model-control input surface changed before key dispatch");
231
+ }
232
+ await runtimePorts.sendKeys(freshPermit.terminalControl, keys);
233
+ return;
234
+ }
235
+ const permit = claudeModelDialogInputPermit;
236
+ claudeModelDialogInputPermit = undefined;
237
+ const requireClaudeModelDialog = permit !== undefined &&
238
+ classifiers.sameIdentity(permit.terminalControl, requestedControl);
239
+ const verified = await verifyModelControlTerminalIdentity(requestedControl, {
240
+ claudeModelDialog: requireClaudeModelDialog ? "require" : "forbid"
241
+ });
242
+ if (requireClaudeModelDialog) {
243
+ const styledScreen = await runtimePorts.captureStyled(verified);
244
+ const screen = classifiers.stripEscapes(styledScreen);
245
+ const inspection = adapter.inspectScreen({ screen, runtime });
246
+ const observation = adapter.observeModelControl?.(plan, screen);
247
+ if (inspection.approval.blocked ||
248
+ inspection.activity.state === "working" ||
249
+ observation?.state !== "claude_model_picker" ||
250
+ observation.fingerprint !== permit?.fingerprint) {
251
+ throw new Error("the exact Claude model picker changed before key dispatch");
252
+ }
253
+ }
254
+ await runtimePorts.sendKeys(verified, keys);
255
+ },
256
+ sleep: runtimePorts.sleep
257
+ };
258
+ }
259
+ //# sourceMappingURL=terminal-model-control-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-model-control-bridge.js","sourceRoot":"","sources":["../../src/terminal-model-control-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { ExecutorKind } from "./executors.js";
2
+ /**
3
+ * Verified native model-control behavior profiles.
4
+ *
5
+ * Keep every version/profile pairing here. Callers must consume this registry
6
+ * instead of independently deciding that a running TUI is compatible.
7
+ */
8
+ export declare const TERMINAL_MODEL_CONTROL_PROFILE_IDS: Readonly<{
9
+ readonly codex: "codex-model-control-0.154.0";
10
+ readonly claude: "claude-model-control-2.1.266";
11
+ }>;
12
+ export type TerminalModelControlBehaviorProfile = typeof TERMINAL_MODEL_CONTROL_PROFILE_IDS[keyof typeof TERMINAL_MODEL_CONTROL_PROFILE_IDS];
13
+ export type TerminalModelControlScope = "current_session" | "current_and_new_sessions";
14
+ export interface TerminalModelControlCapabilities {
15
+ readonly status: "supported" | "unsupported" | "unknown";
16
+ readonly agentVersion?: string;
17
+ readonly behaviorProfile?: string;
18
+ readonly scope?: TerminalModelControlScope;
19
+ readonly modelSelection: boolean;
20
+ readonly reasoningEffortSelection: boolean;
21
+ readonly reason: string;
22
+ }
23
+ export interface TerminalModelControlPlan {
24
+ readonly behaviorProfile: TerminalModelControlBehaviorProfile;
25
+ readonly command: "/model";
26
+ readonly scope: TerminalModelControlScope;
27
+ readonly requiresIdle: true;
28
+ readonly requiresExactEmptyComposer: true;
29
+ }
30
+ export interface TerminalModelControlProfile {
31
+ readonly agent: ExecutorKind;
32
+ readonly agentVersion: string;
33
+ readonly behaviorProfile: TerminalModelControlBehaviorProfile;
34
+ readonly plan: TerminalModelControlPlan;
35
+ readonly supportsZeroRolloutPhysicalAuthority: boolean;
36
+ readonly supportsResidualContinuation: boolean;
37
+ readonly supportsResidualRepair: boolean;
38
+ /** Exact native slash-completion rows accepted before dispatching Enter. */
39
+ readonly slashCompletionRows: readonly string[];
40
+ readonly reason: string;
41
+ }
42
+ export declare const CODEX_MODEL_CONTROL_AGENT_VERSION = "0.154.0";
43
+ export declare const CLAUDE_MODEL_CONTROL_AGENT_VERSION = "2.1.266";
44
+ export declare function terminalModelControlProfiles(): readonly TerminalModelControlProfile[];
45
+ export declare function terminalModelControlProfileFor(agent: ExecutorKind, agentVersion: string | undefined): TerminalModelControlProfile | undefined;
46
+ export declare function terminalModelControlProfileForPlan(plan: TerminalModelControlPlan): TerminalModelControlProfile | undefined;
47
+ export declare function terminalModelControlPlanConforms(input: {
48
+ readonly agent: ExecutorKind;
49
+ readonly agentVersion: string | undefined;
50
+ readonly plan: TerminalModelControlPlan;
51
+ }): boolean;
52
+ export declare function isTerminalModelControlPlanForAgent(plan: TerminalModelControlPlan, agent: ExecutorKind): boolean;
53
+ export declare function terminalModelControlSlashCompletionRows(plan: TerminalModelControlPlan): readonly string[];
54
+ export declare function probeTerminalModelControlProfile(agent: ExecutorKind, agentVersion: string | undefined): TerminalModelControlCapabilities;
55
+ export declare function planTerminalModelControlProfile(capabilities: TerminalModelControlCapabilities): TerminalModelControlPlan;
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Verified native model-control behavior profiles.
3
+ *
4
+ * Keep every version/profile pairing here. Callers must consume this registry
5
+ * instead of independently deciding that a running TUI is compatible.
6
+ */
7
+ export const TERMINAL_MODEL_CONTROL_PROFILE_IDS = Object.freeze({
8
+ codex: "codex-model-control-0.154.0",
9
+ claude: "claude-model-control-2.1.266"
10
+ });
11
+ export const CODEX_MODEL_CONTROL_AGENT_VERSION = "0.154.0";
12
+ export const CLAUDE_MODEL_CONTROL_AGENT_VERSION = "2.1.266";
13
+ const MODEL_CONTROL_PROFILES = Object.freeze([
14
+ Object.freeze({
15
+ agent: "codex",
16
+ agentVersion: CODEX_MODEL_CONTROL_AGENT_VERSION,
17
+ behaviorProfile: TERMINAL_MODEL_CONTROL_PROFILE_IDS.codex,
18
+ plan: Object.freeze({
19
+ behaviorProfile: TERMINAL_MODEL_CONTROL_PROFILE_IDS.codex,
20
+ command: "/model",
21
+ scope: "current_and_new_sessions",
22
+ requiresIdle: true,
23
+ requiresExactEmptyComposer: true
24
+ }),
25
+ supportsZeroRolloutPhysicalAuthority: true,
26
+ supportsResidualContinuation: true,
27
+ supportsResidualRepair: true,
28
+ slashCompletionRows: Object.freeze([
29
+ " /model choose what model and reasoning effort to use"
30
+ ]),
31
+ reason: `Codex ${CODEX_MODEL_CONTROL_AGENT_VERSION} /model control changes the ` +
32
+ "current session and persisted defaults"
33
+ }),
34
+ Object.freeze({
35
+ agent: "claude",
36
+ agentVersion: CLAUDE_MODEL_CONTROL_AGENT_VERSION,
37
+ behaviorProfile: TERMINAL_MODEL_CONTROL_PROFILE_IDS.claude,
38
+ plan: Object.freeze({
39
+ behaviorProfile: TERMINAL_MODEL_CONTROL_PROFILE_IDS.claude,
40
+ command: "/model",
41
+ scope: "current_session",
42
+ requiresIdle: true,
43
+ requiresExactEmptyComposer: true
44
+ }),
45
+ supportsZeroRolloutPhysicalAuthority: false,
46
+ supportsResidualContinuation: false,
47
+ supportsResidualRepair: false,
48
+ slashCompletionRows: Object.freeze([]),
49
+ reason: `Claude Code ${CLAUDE_MODEL_CONTROL_AGENT_VERSION} /model supports the ` +
50
+ "explicit session-only selection path"
51
+ })
52
+ ]);
53
+ export function terminalModelControlProfiles() {
54
+ return MODEL_CONTROL_PROFILES;
55
+ }
56
+ export function terminalModelControlProfileFor(agent, agentVersion) {
57
+ const version = nonBlank(agentVersion);
58
+ if (!version)
59
+ return undefined;
60
+ return MODEL_CONTROL_PROFILES.find((profile) => profile.agent === agent && profile.agentVersion === version);
61
+ }
62
+ export function terminalModelControlProfileForPlan(plan) {
63
+ return MODEL_CONTROL_PROFILES.find((profile) => profile.behaviorProfile === plan.behaviorProfile &&
64
+ samePlan(profile.plan, plan));
65
+ }
66
+ export function terminalModelControlPlanConforms(input) {
67
+ const profile = terminalModelControlProfileFor(input.agent, input.agentVersion);
68
+ return profile !== undefined && samePlan(profile.plan, input.plan);
69
+ }
70
+ export function isTerminalModelControlPlanForAgent(plan, agent) {
71
+ return terminalModelControlProfileForPlan(plan)?.agent === agent;
72
+ }
73
+ export function terminalModelControlSlashCompletionRows(plan) {
74
+ return terminalModelControlProfileForPlan(plan)?.slashCompletionRows ?? [];
75
+ }
76
+ export function probeTerminalModelControlProfile(agent, agentVersion) {
77
+ const version = nonBlank(agentVersion);
78
+ if (!version) {
79
+ return {
80
+ status: "unknown",
81
+ modelSelection: false,
82
+ reasoningEffortSelection: false,
83
+ reason: `the running ${agent === "codex" ? "Codex" : "Claude Code"} ` +
84
+ "version could not be verified"
85
+ };
86
+ }
87
+ const profile = terminalModelControlProfileFor(agent, version);
88
+ if (!profile) {
89
+ return {
90
+ status: "unsupported",
91
+ agentVersion: version,
92
+ modelSelection: false,
93
+ reasoningEffortSelection: false,
94
+ reason: `${agent === "codex" ? "Codex" : "Claude Code"} ${version} ` +
95
+ "has no verified model-control profile"
96
+ };
97
+ }
98
+ return {
99
+ status: "supported",
100
+ agentVersion: profile.agentVersion,
101
+ behaviorProfile: profile.behaviorProfile,
102
+ scope: profile.plan.scope,
103
+ modelSelection: true,
104
+ reasoningEffortSelection: true,
105
+ reason: profile.reason
106
+ };
107
+ }
108
+ export function planTerminalModelControlProfile(capabilities) {
109
+ if (capabilities.status !== "supported" ||
110
+ capabilities.modelSelection !== true ||
111
+ capabilities.reasoningEffortSelection !== true ||
112
+ !capabilities.behaviorProfile ||
113
+ !capabilities.scope) {
114
+ throw new Error(capabilities.reason);
115
+ }
116
+ const profile = MODEL_CONTROL_PROFILES.find((candidate) => (!capabilities.agentVersion ||
117
+ candidate.agentVersion === capabilities.agentVersion.trim()) &&
118
+ candidate.behaviorProfile === capabilities.behaviorProfile &&
119
+ candidate.plan.scope === capabilities.scope);
120
+ if (!profile) {
121
+ throw new Error("refusing an unprofiled terminal model-control plan");
122
+ }
123
+ return profile.plan;
124
+ }
125
+ function samePlan(left, right) {
126
+ return left.behaviorProfile === right.behaviorProfile &&
127
+ left.command === right.command &&
128
+ left.scope === right.scope &&
129
+ left.requiresIdle === right.requiresIdle &&
130
+ left.requiresExactEmptyComposer === right.requiresExactEmptyComposer;
131
+ }
132
+ function nonBlank(value) {
133
+ return typeof value === "string" && value.trim().length > 0
134
+ ? value.trim()
135
+ : undefined;
136
+ }
137
+ //# sourceMappingURL=terminal-model-control-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-model-control-profile.js","sourceRoot":"","sources":["../../src/terminal-model-control-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { ExecutorKind } from "./executors.js";
2
+ import { type TerminalModelControlBehaviorProfile } from "./terminal-model-control-profile.js";
3
+ import { type TerminalControlRef } from "./terminal-control-ref.js";
4
+ export interface TerminalModelControlSubjectInput {
5
+ readonly terminalId?: string;
6
+ readonly terminalControl?: TerminalControlRef;
7
+ readonly agent?: ExecutorKind;
8
+ readonly pid?: number;
9
+ readonly workspace?: string;
10
+ readonly processUuid?: string;
11
+ readonly processBirth?: string;
12
+ readonly agentVersion?: string;
13
+ readonly behaviorProfile?: string;
14
+ }
15
+ /** Canonical physical and profile identity shared by projection and mutation. */
16
+ export interface CanonicalTerminalModelControlSubject {
17
+ readonly terminalId: string;
18
+ readonly terminalControl: TerminalControlRef;
19
+ readonly terminalEndpointIdentity: string;
20
+ readonly terminalProcessAnchorPid: number;
21
+ readonly agent: ExecutorKind;
22
+ readonly pid: number;
23
+ readonly workspace: string;
24
+ readonly processUuid: string;
25
+ readonly processBirth: string;
26
+ readonly agentVersion: string;
27
+ readonly behaviorProfile: TerminalModelControlBehaviorProfile;
28
+ }
29
+ /**
30
+ * Normalize one model-control subject without granting an action. Invalid or
31
+ * unsupported facts return undefined so read-only projection remains closed;
32
+ * mutation callers may turn that result into an action-specific error.
33
+ */
34
+ export declare function canonicalModelControlSubject(input: TerminalModelControlSubjectInput): CanonicalTerminalModelControlSubject | undefined;
@@ -0,0 +1,58 @@
1
+ import { terminalModelControlProfileFor } from "./terminal-model-control-profile.js";
2
+ import { hasCanonicalTerminalEndpoint, terminalEndpointFromControlRef, terminalEndpointIdentityKey } from "./terminal-control-ref.js";
3
+ /**
4
+ * Normalize one model-control subject without granting an action. Invalid or
5
+ * unsupported facts return undefined so read-only projection remains closed;
6
+ * mutation callers may turn that result into an action-specific error.
7
+ */
8
+ export function canonicalModelControlSubject(input) {
9
+ const terminalId = nonBlank(input.terminalId);
10
+ const terminalControl = input.terminalControl;
11
+ const workspace = nonBlank(input.workspace);
12
+ const processUuid = nonBlank(input.processUuid);
13
+ const processBirth = nonBlank(input.processBirth);
14
+ const agentVersion = nonBlank(input.agentVersion);
15
+ const behaviorProfile = nonBlank(input.behaviorProfile);
16
+ const pid = input.pid;
17
+ if (!terminalId ||
18
+ !terminalControl ||
19
+ !input.agent ||
20
+ !workspace ||
21
+ !processUuid ||
22
+ !processBirth ||
23
+ !agentVersion ||
24
+ !behaviorProfile ||
25
+ !Number.isSafeInteger(pid) ||
26
+ Number(pid) <= 1 ||
27
+ !hasCanonicalTerminalEndpoint(terminalControl)) {
28
+ return undefined;
29
+ }
30
+ const profile = terminalModelControlProfileFor(input.agent, agentVersion);
31
+ if (!profile || profile.behaviorProfile !== behaviorProfile) {
32
+ return undefined;
33
+ }
34
+ const endpoint = terminalEndpointFromControlRef(terminalControl);
35
+ if (!Number.isSafeInteger(endpoint.processAnchorPid) ||
36
+ Number(endpoint.processAnchorPid) <= 1) {
37
+ return undefined;
38
+ }
39
+ return Object.freeze({
40
+ terminalId,
41
+ terminalControl,
42
+ terminalEndpointIdentity: terminalEndpointIdentityKey(endpoint),
43
+ terminalProcessAnchorPid: Number(endpoint.processAnchorPid),
44
+ agent: input.agent,
45
+ pid: Number(pid),
46
+ workspace,
47
+ processUuid,
48
+ processBirth,
49
+ agentVersion,
50
+ behaviorProfile: profile.behaviorProfile
51
+ });
52
+ }
53
+ function nonBlank(value) {
54
+ return typeof value === "string" && value.trim().length > 0
55
+ ? value.trim()
56
+ : undefined;
57
+ }
58
+ //# sourceMappingURL=terminal-model-control-subject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-model-control-subject.js","sourceRoot":"","sources":["../../src/terminal-model-control-subject.ts"],"names":[],"mappings":"AACA,OAAO,EACL,8BAA8B,EAE/B,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,2BAA2B,EAE5B,MAAM,2BAA2B,CAAC;AA6BnC;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAuC;IAEvC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,IACE,CAAC,UAAU;QACX,CAAC,eAAe;QAChB,CAAC,KAAK,CAAC,KAAK;QACZ,CAAC,SAAS;QACV,CAAC,WAAW;QACZ,CAAC,YAAY;QACb,CAAC,YAAY;QACb,CAAC,eAAe;QAChB,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAChB,CAAC,4BAA4B,CAAC,eAAe,CAAC,EAC9C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,8BAA8B,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC1E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,eAAe,KAAK,eAAe,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,8BAA8B,CAAC,eAAe,CAAC,CAAC;IACjE,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,EACtC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU;QACV,eAAe;QACf,wBAAwB,EAAE,2BAA2B,CAAC,QAAQ,CAAC;QAC/D,wBAAwB,EAAE,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC3D,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;QAChB,SAAS;QACT,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,eAAe,EAAE,OAAO,CAAC,eAAe;KACzC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACzD,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QACd,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const TERMINAL_MODEL_CONTROL_TRANSACTION_PHASES: readonly ["no_input", "reversible_input", "commit_attempted", "postcondition_proven"];
2
+ export type TerminalModelControlTransactionPhase = typeof TERMINAL_MODEL_CONTROL_TRANSACTION_PHASES[number];
3
+ export type TerminalModelControlTransactionEvent = "reversible_input_attempted" | "commit_attempted" | "postcondition_proven";
4
+ export type TerminalModelControlCleanupOutcome = "not_attempted" | "proven" | "failed";
5
+ export interface TerminalModelControlFailureDecision {
6
+ readonly unwind: boolean;
7
+ readonly outcome: "throw" | "uncertain";
8
+ readonly doNotRetry: boolean;
9
+ /** Repair authority can only come from a later exact live residual scan. */
10
+ readonly residualRepair: "none" | "fresh_inspection_required";
11
+ }
12
+ /** Pure monotonic reducer for every native model-control input boundary. */
13
+ export declare function reduceTerminalModelControlTransactionPhase(phase: TerminalModelControlTransactionPhase, event: TerminalModelControlTransactionEvent): TerminalModelControlTransactionPhase;
14
+ /**
15
+ * One failure policy for unwind, uncertainty and automatic-retry safety.
16
+ * A failed cleanup never grants repair directly; List must freshly inspect an
17
+ * exact residual before advertising its separately fenced repair action.
18
+ */
19
+ export declare function decideTerminalModelControlFailure(phase: TerminalModelControlTransactionPhase, cleanup: TerminalModelControlCleanupOutcome): TerminalModelControlFailureDecision;
@@ -0,0 +1,39 @@
1
+ export const TERMINAL_MODEL_CONTROL_TRANSACTION_PHASES = [
2
+ "no_input",
3
+ "reversible_input",
4
+ "commit_attempted",
5
+ "postcondition_proven"
6
+ ];
7
+ /** Pure monotonic reducer for every native model-control input boundary. */
8
+ export function reduceTerminalModelControlTransactionPhase(phase, event) {
9
+ if (phase === "postcondition_proven") {
10
+ throw new Error("model-control transaction cannot accept input after its postcondition");
11
+ }
12
+ if (event === "postcondition_proven")
13
+ return "postcondition_proven";
14
+ if (phase === "commit_attempted" || event === "commit_attempted") {
15
+ return "commit_attempted";
16
+ }
17
+ return "reversible_input";
18
+ }
19
+ /**
20
+ * One failure policy for unwind, uncertainty and automatic-retry safety.
21
+ * A failed cleanup never grants repair directly; List must freshly inspect an
22
+ * exact residual before advertising its separately fenced repair action.
23
+ */
24
+ export function decideTerminalModelControlFailure(phase, cleanup) {
25
+ const reversible = phase === "reversible_input";
26
+ const committed = phase === "commit_attempted";
27
+ const inputAttempted = reversible || committed;
28
+ const cleanupFailedAfterInput = inputAttempted && cleanup === "failed";
29
+ const uncertain = committed || cleanupFailedAfterInput;
30
+ return {
31
+ unwind: inputAttempted && cleanup === "not_attempted",
32
+ outcome: uncertain ? "uncertain" : "throw",
33
+ doNotRetry: uncertain,
34
+ residualRepair: cleanupFailedAfterInput
35
+ ? "fresh_inspection_required"
36
+ : "none"
37
+ };
38
+ }
39
+ //# sourceMappingURL=terminal-model-control-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-model-control-transaction.js","sourceRoot":"","sources":["../../src/terminal-model-control-transaction.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yCAAyC,GAAG;IACvD,UAAU;IACV,kBAAkB;IAClB,kBAAkB;IAClB,sBAAsB;CACd,CAAC;AAuBX,4EAA4E;AAC5E,MAAM,UAAU,0CAA0C,CACxD,KAA2C,EAC3C,KAA2C;IAE3C,IAAI,KAAK,KAAK,sBAAsB,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,KAAK,sBAAsB;QAAE,OAAO,sBAAsB,CAAC;IACpE,IAAI,KAAK,KAAK,kBAAkB,IAAI,KAAK,KAAK,kBAAkB,EAAE,CAAC;QACjE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iCAAiC,CAC/C,KAA2C,EAC3C,OAA2C;IAE3C,MAAM,UAAU,GAAG,KAAK,KAAK,kBAAkB,CAAC;IAChD,MAAM,SAAS,GAAG,KAAK,KAAK,kBAAkB,CAAC;IAC/C,MAAM,cAAc,GAAG,UAAU,IAAI,SAAS,CAAC;IAC/C,MAAM,uBAAuB,GAAG,cAAc,IAAI,OAAO,KAAK,QAAQ,CAAC;IACvE,MAAM,SAAS,GAAG,SAAS,IAAI,uBAAuB,CAAC;IACvD,OAAO;QACL,MAAM,EAAE,cAAc,IAAI,OAAO,KAAK,eAAe;QACrD,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO;QAC1C,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,uBAAuB;YACrC,CAAC,CAAC,2BAA2B;YAC7B,CAAC,CAAC,MAAM;KACX,CAAC;AACJ,CAAC"}