@scotthuang/agent-knock-knock 0.13.3 → 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 (259) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +13 -5
  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/codex-process-incarnation.d.ts +8 -0
  14. package/dist/src/codex-process-incarnation.js +36 -0
  15. package/dist/src/codex-process-incarnation.js.map +1 -0
  16. package/dist/src/deferred-foreground-conflict-policy.d.ts +22 -0
  17. package/dist/src/deferred-foreground-conflict-policy.js +52 -0
  18. package/dist/src/deferred-foreground-conflict-policy.js.map +1 -0
  19. package/dist/src/durable-notification-kernel.d.ts +94 -0
  20. package/dist/src/durable-notification-kernel.js +68 -0
  21. package/dist/src/durable-notification-kernel.js.map +1 -0
  22. package/dist/src/herdr-socket-transport.d.ts +43 -0
  23. package/dist/src/herdr-socket-transport.js +170 -0
  24. package/dist/src/herdr-socket-transport.js.map +1 -0
  25. package/dist/src/herdr-terminal-control-provider.d.ts +2 -45
  26. package/dist/src/herdr-terminal-control-provider.js +2 -172
  27. package/dist/src/herdr-terminal-control-provider.js.map +1 -1
  28. package/dist/src/host-adapter-capabilities.d.ts +35 -0
  29. package/dist/src/host-adapter-capabilities.js +146 -0
  30. package/dist/src/host-adapter-capabilities.js.map +1 -0
  31. package/dist/src/host-adapter.d.ts +9 -3
  32. package/dist/src/host-adapter.js +33 -9
  33. package/dist/src/host-adapter.js.map +1 -1
  34. package/dist/src/host-bridge-tools.d.ts +3 -4
  35. package/dist/src/host-bridge-tools.js +49 -92
  36. package/dist/src/host-bridge-tools.js.map +1 -1
  37. package/dist/src/host-bridge.js +5 -5
  38. package/dist/src/host-bridge.js.map +1 -1
  39. package/dist/src/host-monitor-reconciliation.d.ts +6 -0
  40. package/dist/src/host-monitor-reconciliation.js +96 -0
  41. package/dist/src/host-monitor-reconciliation.js.map +1 -0
  42. package/dist/src/native-thread-lifecycle-cli-adapter.js +116 -60
  43. package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
  44. package/dist/src/openclaw-list-projection.d.ts +2 -0
  45. package/dist/src/openclaw-list-projection.js +3 -0
  46. package/dist/src/openclaw-list-projection.js.map +1 -0
  47. package/dist/src/openclaw-model-facing-field-policy.d.ts +2 -0
  48. package/dist/src/openclaw-model-facing-field-policy.js +3 -0
  49. package/dist/src/openclaw-model-facing-field-policy.js.map +1 -0
  50. package/dist/src/openclaw-plugin-command-adapter.d.ts +6 -29
  51. package/dist/src/openclaw-plugin-command-adapter.js +7 -2660
  52. package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
  53. package/dist/src/openclaw-plugin-helpers.d.ts +2 -148
  54. package/dist/src/openclaw-plugin-helpers.js +2 -1844
  55. package/dist/src/openclaw-plugin-helpers.js.map +1 -1
  56. package/dist/src/openclaw-plugin-schemas.d.ts +2 -563
  57. package/dist/src/openclaw-plugin-schemas.js +2 -572
  58. package/dist/src/openclaw-plugin-schemas.js.map +1 -1
  59. package/dist/src/openclaw-plugin-supervisor.d.ts +4 -5
  60. package/dist/src/openclaw-plugin-supervisor.js +5 -94
  61. package/dist/src/openclaw-plugin-supervisor.js.map +1 -1
  62. package/dist/src/openclaw-plugin-value-helpers.d.ts +2 -0
  63. package/dist/src/openclaw-plugin-value-helpers.js +3 -0
  64. package/dist/src/openclaw-plugin-value-helpers.js.map +1 -0
  65. package/dist/src/openclaw-private-authority-offers.d.ts +4 -39
  66. package/dist/src/openclaw-private-authority-offers.js +3 -258
  67. package/dist/src/openclaw-private-authority-offers.js.map +1 -1
  68. package/dist/src/semantic-private-authority-offers.d.ts +41 -0
  69. package/dist/src/semantic-private-authority-offers.js +261 -0
  70. package/dist/src/semantic-private-authority-offers.js.map +1 -0
  71. package/dist/src/semantic-tool-arguments.d.ts +9 -0
  72. package/dist/src/semantic-tool-arguments.js +64 -0
  73. package/dist/src/semantic-tool-arguments.js.map +1 -0
  74. package/dist/src/semantic-tool-catalog.d.ts +48 -0
  75. package/dist/src/semantic-tool-catalog.js +105 -0
  76. package/dist/src/semantic-tool-catalog.js.map +1 -0
  77. package/dist/src/semantic-tool-command-helpers.d.ts +145 -0
  78. package/dist/src/semantic-tool-command-helpers.js +1272 -0
  79. package/dist/src/semantic-tool-command-helpers.js.map +1 -0
  80. package/dist/src/semantic-tool-list-projection.d.ts +10 -0
  81. package/dist/src/semantic-tool-list-projection.js +497 -0
  82. package/dist/src/semantic-tool-list-projection.js.map +1 -0
  83. package/dist/src/semantic-tool-model-facing-field-policy.d.ts +3 -0
  84. package/dist/src/semantic-tool-model-facing-field-policy.js +66 -0
  85. package/dist/src/semantic-tool-model-facing-field-policy.js.map +1 -0
  86. package/dist/src/semantic-tool-presentation.d.ts +37 -0
  87. package/dist/src/semantic-tool-presentation.js +680 -0
  88. package/dist/src/semantic-tool-presentation.js.map +1 -0
  89. package/dist/src/semantic-tool-private-authority.d.ts +39 -0
  90. package/dist/src/semantic-tool-private-authority.js +602 -0
  91. package/dist/src/semantic-tool-private-authority.js.map +1 -0
  92. package/dist/src/semantic-tool-relay.d.ts +16 -0
  93. package/dist/src/semantic-tool-relay.js +175 -0
  94. package/dist/src/semantic-tool-relay.js.map +1 -0
  95. package/dist/src/semantic-tool-runtime.d.ts +10 -0
  96. package/dist/src/semantic-tool-runtime.js +1157 -0
  97. package/dist/src/semantic-tool-runtime.js.map +1 -0
  98. package/dist/src/semantic-tool-schemas.d.ts +563 -0
  99. package/dist/src/semantic-tool-schemas.js +573 -0
  100. package/dist/src/semantic-tool-schemas.js.map +1 -0
  101. package/dist/src/semantic-tool-value-helpers.d.ts +5 -0
  102. package/dist/src/semantic-tool-value-helpers.js +27 -0
  103. package/dist/src/semantic-tool-value-helpers.js.map +1 -0
  104. package/dist/src/store-event-presentation.d.ts +17 -0
  105. package/dist/src/store-event-presentation.js +33 -0
  106. package/dist/src/store-event-presentation.js.map +1 -0
  107. package/dist/src/store.d.ts +3 -16
  108. package/dist/src/store.js +2 -30
  109. package/dist/src/store.js.map +1 -1
  110. package/dist/src/terminal-action-projection.d.ts +2 -98
  111. package/dist/src/terminal-action-projection.js +13 -215
  112. package/dist/src/terminal-action-projection.js.map +1 -1
  113. package/dist/src/terminal-agent-bridge.d.ts +14 -340
  114. package/dist/src/terminal-agent-bridge.js +155 -3226
  115. package/dist/src/terminal-agent-bridge.js.map +1 -1
  116. package/dist/src/terminal-approval-cli-adapter.d.ts +17 -0
  117. package/dist/src/terminal-approval-cli-adapter.js +921 -0
  118. package/dist/src/terminal-approval-cli-adapter.js.map +1 -0
  119. package/dist/src/terminal-command-cli-adapter.d.ts +2 -429
  120. package/dist/src/terminal-command-cli-adapter.js +344 -6061
  121. package/dist/src/terminal-command-cli-adapter.js.map +1 -1
  122. package/dist/src/terminal-command-cli-ports.d.ts +443 -0
  123. package/dist/src/terminal-command-cli-ports.js +2 -0
  124. package/dist/src/terminal-command-cli-ports.js.map +1 -0
  125. package/dist/src/terminal-command-dispatch-preparation.d.ts +81 -0
  126. package/dist/src/terminal-command-dispatch-preparation.js +209 -0
  127. package/dist/src/terminal-command-dispatch-preparation.js.map +1 -0
  128. package/dist/src/terminal-command-dispatch-transport.d.ts +35 -0
  129. package/dist/src/terminal-command-dispatch-transport.js +859 -0
  130. package/dist/src/terminal-command-dispatch-transport.js.map +1 -0
  131. package/dist/src/terminal-command-foreground-proof.d.ts +32 -0
  132. package/dist/src/terminal-command-foreground-proof.js +72 -0
  133. package/dist/src/terminal-command-foreground-proof.js.map +1 -0
  134. package/dist/src/terminal-command-send-preflight.d.ts +41 -0
  135. package/dist/src/terminal-command-send-preflight.js +86 -0
  136. package/dist/src/terminal-command-send-preflight.js.map +1 -0
  137. package/dist/src/terminal-composer-classifier.d.ts +55 -0
  138. package/dist/src/terminal-composer-classifier.js +638 -0
  139. package/dist/src/terminal-composer-classifier.js.map +1 -0
  140. package/dist/src/terminal-dispatch-recovery-authority.d.ts +56 -0
  141. package/dist/src/terminal-dispatch-recovery-authority.js +251 -0
  142. package/dist/src/terminal-dispatch-recovery-authority.js.map +1 -0
  143. package/dist/src/terminal-dispatch-recovery-cli-adapter.d.ts +1 -9
  144. package/dist/src/terminal-dispatch-recovery-cli-adapter.js +5 -240
  145. package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -1
  146. package/dist/src/terminal-handoff-cli-adapter.d.ts +1 -11
  147. package/dist/src/terminal-handoff-cli-adapter.js +2 -39
  148. package/dist/src/terminal-handoff-cli-adapter.js.map +1 -1
  149. package/dist/src/terminal-human-explicit-send-cli-adapter.d.ts +25 -0
  150. package/dist/src/terminal-human-explicit-send-cli-adapter.js +903 -0
  151. package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -0
  152. package/dist/src/terminal-identity-authority-cli-adapter.d.ts +1 -6
  153. package/dist/src/terminal-identity-authority-cli-adapter.js +3 -33
  154. package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -1
  155. package/dist/src/terminal-interaction-cli-adapter.js +209 -210
  156. package/dist/src/terminal-interaction-cli-adapter.js.map +1 -1
  157. package/dist/src/terminal-interaction-core.d.ts +0 -2
  158. package/dist/src/terminal-interaction-core.js +4 -3
  159. package/dist/src/terminal-interaction-core.js.map +1 -1
  160. package/dist/src/terminal-interaction-protocol.d.ts +21 -0
  161. package/dist/src/terminal-interaction-protocol.js +74 -0
  162. package/dist/src/terminal-interaction-protocol.js.map +1 -1
  163. package/dist/src/terminal-interaction-response-bridge.d.ts +126 -0
  164. package/dist/src/terminal-interaction-response-bridge.js +579 -0
  165. package/dist/src/terminal-interaction-response-bridge.js.map +1 -0
  166. package/dist/src/terminal-interaction-response-transaction.d.ts +44 -0
  167. package/dist/src/terminal-interaction-response-transaction.js +56 -0
  168. package/dist/src/terminal-interaction-response-transaction.js.map +1 -0
  169. package/dist/src/terminal-list-action-policy.d.ts +43 -0
  170. package/dist/src/terminal-list-action-policy.js +164 -0
  171. package/dist/src/terminal-list-action-policy.js.map +1 -0
  172. package/dist/src/terminal-list-cli-adapter.d.ts +6 -36
  173. package/dist/src/terminal-list-cli-adapter.js +241 -1946
  174. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  175. package/dist/src/terminal-list-facts.d.ts +129 -0
  176. package/dist/src/terminal-list-facts.js +179 -0
  177. package/dist/src/terminal-list-facts.js.map +1 -0
  178. package/dist/src/terminal-list-inventory.d.ts +59 -0
  179. package/dist/src/terminal-list-inventory.js +194 -0
  180. package/dist/src/terminal-list-inventory.js.map +1 -0
  181. package/dist/src/terminal-list-ownership-service.d.ts +118 -0
  182. package/dist/src/terminal-list-ownership-service.js +1003 -0
  183. package/dist/src/terminal-list-ownership-service.js.map +1 -0
  184. package/dist/src/terminal-list-projection-service.d.ts +49 -0
  185. package/dist/src/terminal-list-projection-service.js +407 -0
  186. package/dist/src/terminal-list-projection-service.js.map +1 -0
  187. package/dist/src/terminal-list-renderer.d.ts +11 -11
  188. package/dist/src/terminal-list-renderer.js +168 -119
  189. package/dist/src/terminal-list-renderer.js.map +1 -1
  190. package/dist/src/terminal-managed-send-cli-adapter.d.ts +33 -0
  191. package/dist/src/terminal-managed-send-cli-adapter.js +994 -0
  192. package/dist/src/terminal-managed-send-cli-adapter.js.map +1 -0
  193. package/dist/src/terminal-managed-turn-list-action-policy.d.ts +47 -0
  194. package/dist/src/terminal-managed-turn-list-action-policy.js +64 -0
  195. package/dist/src/terminal-managed-turn-list-action-policy.js.map +1 -0
  196. package/dist/src/terminal-model-control-action-policy.d.ts +60 -0
  197. package/dist/src/terminal-model-control-action-policy.js +96 -0
  198. package/dist/src/terminal-model-control-action-policy.js.map +1 -0
  199. package/dist/src/terminal-model-control-availability.d.ts +68 -0
  200. package/dist/src/terminal-model-control-availability.js +157 -0
  201. package/dist/src/terminal-model-control-availability.js.map +1 -0
  202. package/dist/src/terminal-model-control-bridge.d.ts +48 -0
  203. package/dist/src/terminal-model-control-bridge.js +259 -0
  204. package/dist/src/terminal-model-control-bridge.js.map +1 -0
  205. package/dist/src/terminal-model-control-profile.d.ts +55 -0
  206. package/dist/src/terminal-model-control-profile.js +137 -0
  207. package/dist/src/terminal-model-control-profile.js.map +1 -0
  208. package/dist/src/terminal-model-control-subject.d.ts +34 -0
  209. package/dist/src/terminal-model-control-subject.js +58 -0
  210. package/dist/src/terminal-model-control-subject.js.map +1 -0
  211. package/dist/src/terminal-model-control-transaction.d.ts +19 -0
  212. package/dist/src/terminal-model-control-transaction.js +39 -0
  213. package/dist/src/terminal-model-control-transaction.js.map +1 -0
  214. package/dist/src/terminal-model-control.d.ts +37 -18
  215. package/dist/src/terminal-model-control.js +285 -194
  216. package/dist/src/terminal-model-control.js.map +1 -1
  217. package/dist/src/terminal-monitor-application-service.js +50 -17
  218. package/dist/src/terminal-monitor-application-service.js.map +1 -1
  219. package/dist/src/terminal-native-inspection-bridge.d.ts +211 -0
  220. package/dist/src/terminal-native-inspection-bridge.js +1127 -0
  221. package/dist/src/terminal-native-inspection-bridge.js.map +1 -0
  222. package/dist/src/terminal-runtime-cli-adapter.d.ts +2 -2
  223. package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
  224. package/dist/src/terminal-submission-retry-application.d.ts +24 -0
  225. package/dist/src/terminal-submission-retry-application.js +402 -0
  226. package/dist/src/terminal-submission-retry-application.js.map +1 -0
  227. package/dist/src/terminal-submission-retry-ports.d.ts +30 -0
  228. package/dist/src/terminal-submission-retry-ports.js +2 -0
  229. package/dist/src/terminal-submission-retry-ports.js.map +1 -0
  230. package/dist/src/terminal-submission-retry-reconciliation.d.ts +236 -0
  231. package/dist/src/terminal-submission-retry-reconciliation.js +1130 -0
  232. package/dist/src/terminal-submission-retry-reconciliation.js.map +1 -0
  233. package/dist/src/terminal-submission-retry-transport.d.ts +58 -0
  234. package/dist/src/terminal-submission-retry-transport.js +675 -0
  235. package/dist/src/terminal-submission-retry-transport.js.map +1 -0
  236. package/dist/src/terminal-text-submission-bridge.d.ts +200 -0
  237. package/dist/src/terminal-text-submission-bridge.js +632 -0
  238. package/dist/src/terminal-text-submission-bridge.js.map +1 -0
  239. package/dist/src/terminal-user-explicit-send-policy.d.ts +29 -0
  240. package/dist/src/terminal-user-explicit-send-policy.js +46 -0
  241. package/dist/src/terminal-user-explicit-send-policy.js.map +1 -0
  242. package/dist/src/terminal-watch-cli-adapter.js +91 -143
  243. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  244. package/dist/src/terminal-watch-codec.d.ts +9 -0
  245. package/dist/src/terminal-watch-codec.js +1051 -0
  246. package/dist/src/terminal-watch-codec.js.map +1 -0
  247. package/dist/src/terminal-watch-interaction-response-store.d.ts +19 -0
  248. package/dist/src/terminal-watch-interaction-response-store.js +87 -0
  249. package/dist/src/terminal-watch-interaction-response-store.js.map +1 -0
  250. package/dist/src/terminal-watch-record.d.ts +319 -0
  251. package/dist/src/terminal-watch-record.js +742 -0
  252. package/dist/src/terminal-watch-record.js.map +1 -0
  253. package/dist/src/terminal-watch-service.js +48 -27
  254. package/dist/src/terminal-watch-service.js.map +1 -1
  255. package/dist/src/terminal-watch-store.d.ts +3 -279
  256. package/dist/src/terminal-watch-store.js +5 -1779
  257. package/dist/src/terminal-watch-store.js.map +1 -1
  258. package/package.json +7 -2
  259. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +1 -1
@@ -12,7 +12,8 @@ import { isSessionSendBlockingStatus, turnIdForConversation } from "./protocol.j
12
12
  import { listManagedSessions, loadNativeThreadTransition } from "./session-store.js";
13
13
  import { isExactClaudeNativeInspectionIdleComposer, NativeInspectionSubmissionError } from "./terminal-agent-bridge.js";
14
14
  import { terminalControlAliasMatches, selectRootTerminalProcesses, withCodexCompanionFences } from "./terminal-authority-policy.js";
15
- import { isTerminalModelReasoningEffort, terminalUserExplicitModelControlBindingToken, terminalUserExplicitModelControlResidualEntryBindingToken, terminalUserExplicitModelControlRepairBindingToken } from "./terminal-model-control.js";
15
+ import { decideModelControlAvailability } from "./terminal-model-control-availability.js";
16
+ import { CODEX_MODEL_CONTROL_AGENT_VERSION, isTerminalModelControlPlanForAgent, isTerminalModelReasoningEffort, terminalModelControlPlanConforms, terminalModelControlProfileForPlan, terminalUserExplicitModelControlBindingToken } from "./terminal-model-control.js";
16
17
  import { nonBlankString } from "./value-guards.js";
17
18
  export const CODEX_FOREGROUND_IDENTIFICATION_TTL_MS = 30_000;
18
19
  export const CODEX_FOREGROUND_IDENTIFICATION_SCROLLBACK_LINES = 240;
@@ -238,11 +239,9 @@ class NativeThreadLifecycleCliApplication {
238
239
  return snapshot;
239
240
  }
240
241
  const adapter = this.agentAdapter(options, terminal.agent);
241
- const capability = adapter.probeModelControl?.(snapshot.version);
242
- const plan = capability?.status === "supported"
243
- ? adapter.planModelControl?.(capability)
244
- : undefined;
245
- if (!plan || plan.behaviorProfile !== "codex-model-control-0.154.0") {
242
+ const { capability, plan, profile } = modelControlProfileObservation(adapter, snapshot.version);
243
+ if (!plan || profile?.agent !== "codex" ||
244
+ !profile.supportsZeroRolloutPhysicalAuthority) {
246
245
  throw new Error(capability?.reason ?? "Codex has no verified physical model-control profile");
247
246
  }
248
247
  const bindingToken = this.physicalModelControlBindingToken(terminal, snapshot.version, plan.behaviorProfile);
@@ -917,22 +916,21 @@ class NativeThreadLifecycleCliApplication {
917
916
  const terminal = await bridge.resolveStoredTerminal(initiallyResolved.agent, initiallyResolved.pid, initiallyResolved.terminalControl, { pid: initiallyResolved.pid });
918
917
  this.assertSameInspectionTerminal(initiallyResolved, terminal, "while waiting for model-control repair ownership");
919
918
  if (terminal.agent !== "codex") {
920
- throw new Error("model-control residual repair currently supports only Codex 0.154.0");
919
+ throw new Error("model-control residual repair currently supports only Codex " +
920
+ CODEX_MODEL_CONTROL_AGENT_VERSION);
921
921
  }
922
922
  const snapshot = await this.modelControlSnapshot(options, terminal);
923
923
  const agentVersion = required(nonBlankString(snapshot.version), "model-control repair requires an exact running agent version");
924
924
  const adapter = runtimeFacade.createAgentRegistry().require(terminal.agent);
925
- const capability = adapter.probeModelControl?.(agentVersion);
926
- const plan = capability?.status === "supported"
927
- ? adapter.planModelControl?.(capability)
928
- : undefined;
929
- if (!plan || plan.behaviorProfile !== "codex-model-control-0.154.0") {
925
+ const { capability, plan, profile } = modelControlProfileObservation(adapter, agentVersion);
926
+ if (!plan || profile?.agent !== "codex" ||
927
+ !profile.supportsResidualRepair) {
930
928
  throw new Error(capability?.reason ??
931
929
  "the running Codex version has no verified model-control repair profile");
932
930
  }
933
931
  await this.assertModelControlExclusive({ options, terminal, snapshot });
934
932
  const runtime = this.inspectionRuntime(terminal, snapshot);
935
- await this.assertModelControlRepairReady({
933
+ const status = await this.assertModelControlRepairReady({
936
934
  options,
937
935
  terminal,
938
936
  snapshot,
@@ -943,13 +941,26 @@ class NativeThreadLifecycleCliApplication {
943
941
  if (residual.state !== "recoverable") {
944
942
  throw new Error(residual.reason);
945
943
  }
946
- const actualBindingToken = this.modelControlRepairBindingToken({
944
+ const availability = this.modelControlAvailability({
945
+ options,
947
946
  terminal,
947
+ snapshot,
948
948
  agentVersion,
949
949
  plan,
950
- residual
950
+ status,
951
+ surface: {
952
+ kind: "residual",
953
+ residualKind: residual.kind,
954
+ residualFingerprint: residual.fingerprint,
955
+ activityState: status.activity_state
956
+ }
951
957
  });
952
- if (actualBindingToken !== expectedBindingToken) {
958
+ const repairBindingToken = availability.availability === "residual_continuation"
959
+ ? availability.repairBindingToken
960
+ : availability.availability === "repair_only"
961
+ ? availability.expectedBindingToken
962
+ : undefined;
963
+ if (repairBindingToken !== expectedBindingToken) {
953
964
  throw new Error("the exact model-control residual changed after it was listed; refresh AKK list");
954
965
  }
955
966
  return await operation({
@@ -983,10 +994,7 @@ class NativeThreadLifecycleCliApplication {
983
994
  if (expectedNativeThreadId !== actualNativeThreadId) {
984
995
  throw new Error("the current native Session changed during model-control repair");
985
996
  }
986
- const capability = context.adapter.probeModelControl?.(snapshot.version);
987
- const plan = capability?.status === "supported"
988
- ? context.adapter.planModelControl?.(capability)
989
- : undefined;
997
+ const { plan } = modelControlProfileObservation(context.adapter, snapshot.version);
990
998
  if (!plan || JSON.stringify(plan) !== JSON.stringify(context.plan)) {
991
999
  throw new Error("the exact model-control repair profile changed during the operation");
992
1000
  }
@@ -1028,35 +1036,43 @@ class NativeThreadLifecycleCliApplication {
1028
1036
  if (this.ports.state.orphanedForRecovery(input.terminal.terminalControl)) {
1029
1037
  throw new Error("the terminal has unresolved input ownership during model-control repair");
1030
1038
  }
1039
+ return status;
1031
1040
  }
1032
- modelControlRepairBindingToken(input) {
1033
- const incarnation = this.ports.identity.physicalProcessIncarnation(input.terminal.pid);
1034
- return terminalUserExplicitModelControlRepairBindingToken({
1035
- terminalId: input.terminal.conversationId,
1036
- terminalControl: input.terminal.terminalControl,
1037
- pid: input.terminal.pid,
1038
- workspace: required(nonBlankString(input.terminal.terminalControl.currentPath), "model-control repair requires an exact terminal cwd"),
1039
- processUuid: incarnation.processUuid,
1040
- processBirth: incarnation.processBirth,
1041
- agentVersion: input.agentVersion,
1042
- behaviorProfile: input.plan.behaviorProfile,
1043
- residualKind: input.residual.kind,
1044
- residualFingerprint: input.residual.fingerprint
1045
- });
1046
- }
1047
- modelControlResidualEntryBindingToken(input) {
1041
+ modelControlAvailability(input) {
1042
+ const nativeThreadId = input.snapshot.identity?.sessionId ??
1043
+ input.snapshot.session?.binding?.native_thread_id;
1044
+ const zeroRolloutVerified = input.terminal.agent === "codex" &&
1045
+ !input.snapshot.identity && !input.snapshot.session;
1048
1046
  const incarnation = this.ports.identity.physicalProcessIncarnation(input.terminal.pid);
1049
- return terminalUserExplicitModelControlResidualEntryBindingToken({
1047
+ const storeDir = this.ports.state.storeDir(input.options);
1048
+ return decideModelControlAvailability({
1049
+ exactTerminalRow: true,
1050
1050
  terminalId: input.terminal.conversationId,
1051
+ processState: "active",
1051
1052
  terminalControl: input.terminal.terminalControl,
1053
+ agent: input.terminal.agent,
1052
1054
  pid: input.terminal.pid,
1053
- workspace: required(nonBlankString(input.terminal.terminalControl.currentPath), "model-control continuation requires an exact terminal cwd"),
1054
1055
  processUuid: incarnation.processUuid,
1055
1056
  processBirth: incarnation.processBirth,
1056
1057
  agentVersion: input.agentVersion,
1057
1058
  behaviorProfile: input.plan.behaviorProfile,
1058
- residualKind: input.residual.kind,
1059
- residualFingerprint: input.residual.fingerprint
1059
+ nativeAuthority: isExactNativeThreadId(nativeThreadId)
1060
+ ? {
1061
+ kind: "exact_session",
1062
+ ordinaryBindingToken: input.snapshot.bindingToken
1063
+ }
1064
+ : zeroRolloutVerified
1065
+ ? { kind: "verified_zero_rollout" }
1066
+ : { kind: "unavailable" },
1067
+ modelControlSupported: true,
1068
+ approvalScanned: input.status.approval_state.scanned === true,
1069
+ approvalBlocked: input.status.approval_state.blocked === true,
1070
+ terminalHasInteraction: input.status.interaction_state !== undefined,
1071
+ terminalHasBlockingTurn: this.ports.state.terminalBlockingTurns(storeDir, input.terminal.terminalControl).length > 0,
1072
+ hasOrphanedDispatch: this.ports.state.dispatchOwnership(input.terminal.terminalControl)
1073
+ .state !== "none" ||
1074
+ this.ports.state.orphanedForRecovery(input.terminal.terminalControl) !== undefined,
1075
+ surface: input.surface
1060
1076
  });
1061
1077
  }
1062
1078
  async withPreparedModelControl(options, expectedBindingToken, operation, behavior = {}) {
@@ -1079,14 +1095,13 @@ class NativeThreadLifecycleCliApplication {
1079
1095
  }
1080
1096
  const agentVersion = required(nonBlankString(snapshot.version), "model control requires an exact running agent version");
1081
1097
  const adapter = runtimeFacade.createAgentRegistry().require(terminal.agent);
1082
- const capability = adapter.probeModelControl?.(agentVersion);
1098
+ const { capability, plan } = modelControlProfileObservation(adapter, agentVersion);
1083
1099
  if (capability?.status !== "supported" ||
1084
1100
  capability.modelSelection !== true ||
1085
1101
  capability.reasoningEffortSelection !== true) {
1086
1102
  throw new Error(capability?.reason ??
1087
1103
  `${adapter.displayName} has no verified model-control profile`);
1088
1104
  }
1089
- const plan = adapter.planModelControl?.(capability);
1090
1105
  if (!plan) {
1091
1106
  throw new Error("the agent adapter did not produce a model-control plan");
1092
1107
  }
@@ -1094,21 +1109,38 @@ class NativeThreadLifecycleCliApplication {
1094
1109
  let initialResidual;
1095
1110
  let runtime;
1096
1111
  if (hasOrdinaryAuthority) {
1097
- runtime = await this.assertInitialInspectionReady(options, terminal, snapshot, bridge);
1098
- const modelStatus = await bridge.status(terminal.agent, terminal.terminalControl, { runtime });
1099
- if (modelStatus.approval_state.scanned !== true ||
1100
- modelStatus.approval_state.blocked === true ||
1101
- modelStatus.interaction_state !== undefined) {
1112
+ const ready = await this.observeInitialInspectionReady(options, terminal, snapshot, bridge);
1113
+ runtime = ready.runtime;
1114
+ if (ready.status.approval_state.scanned !== true ||
1115
+ ready.status.approval_state.blocked === true ||
1116
+ ready.status.interaction_state !== undefined) {
1102
1117
  throw new Error("model control requires a freshly scanned terminal with no approval or questionnaire");
1103
1118
  }
1119
+ const availability = this.modelControlAvailability({
1120
+ options,
1121
+ terminal,
1122
+ snapshot,
1123
+ agentVersion,
1124
+ plan,
1125
+ status: ready.status,
1126
+ surface: {
1127
+ kind: "idle_empty",
1128
+ screenState: ready.status.screen_state
1129
+ }
1130
+ });
1131
+ if (availability.availability !== "open_from_empty" ||
1132
+ availability.expectedBindingToken !== ordinaryBindingToken) {
1133
+ throw new Error("model control requires an exact verified idle pane with an empty composer and no blocking interaction");
1134
+ }
1104
1135
  }
1105
1136
  else {
1106
1137
  if (terminal.agent !== "codex" ||
1107
- plan.behaviorProfile !== "codex-model-control-0.154.0") {
1138
+ terminalModelControlProfileForPlan(plan)
1139
+ ?.supportsResidualContinuation !== true) {
1108
1140
  throw new Error("terminal binding changed after it was listed; refresh AKK list and retry");
1109
1141
  }
1110
1142
  runtime = this.inspectionRuntime(terminal, snapshot);
1111
- await this.assertModelControlRepairReady({
1143
+ const status = await this.assertModelControlRepairReady({
1112
1144
  options,
1113
1145
  terminal,
1114
1146
  snapshot,
@@ -1119,13 +1151,22 @@ class NativeThreadLifecycleCliApplication {
1119
1151
  if (observed.state !== "recoverable") {
1120
1152
  throw new Error(observed.reason);
1121
1153
  }
1122
- const residualEntryToken = this.modelControlResidualEntryBindingToken({
1154
+ const availability = this.modelControlAvailability({
1155
+ options,
1123
1156
  terminal,
1157
+ snapshot,
1124
1158
  agentVersion,
1125
1159
  plan,
1126
- residual: observed
1160
+ status,
1161
+ surface: {
1162
+ kind: "residual",
1163
+ residualKind: observed.kind,
1164
+ residualFingerprint: observed.fingerprint,
1165
+ activityState: status.activity_state
1166
+ }
1127
1167
  });
1128
- if (residualEntryToken !== expectedBindingToken) {
1168
+ if (availability.availability !== "residual_continuation" ||
1169
+ availability.expectedBindingToken !== expectedBindingToken) {
1129
1170
  throw new Error("the exact model-control residual changed after it was listed; refresh AKK list");
1130
1171
  }
1131
1172
  initialResidual = observed;
@@ -1143,9 +1184,9 @@ class NativeThreadLifecycleCliApplication {
1143
1184
  ordinaryBindingToken,
1144
1185
  initialResidual,
1145
1186
  ...(terminal.agent === "codex" &&
1146
- plan.behaviorProfile === "codex-model-control-0.154.0"
1187
+ isTerminalModelControlPlanForAgent(plan, "codex")
1147
1188
  ? {
1148
- loadCodexCatalog: async () => runtimeFacade.codexModelCatalogForRunningProcess(terminal.pid, "0.154.0", terminal.terminalControl.currentPath)
1189
+ loadCodexCatalog: async () => runtimeFacade.codexModelCatalogForRunningProcess(terminal.pid, CODEX_MODEL_CONTROL_AGENT_VERSION, terminal.terminalControl.currentPath)
1149
1190
  }
1150
1191
  : {})
1151
1192
  });
@@ -1169,10 +1210,7 @@ class NativeThreadLifecycleCliApplication {
1169
1210
  if (expectedNativeThreadId !== actualNativeThreadId) {
1170
1211
  throw new Error("the current native Session changed during model control; inspect the pane before retrying");
1171
1212
  }
1172
- const capability = context.adapter.probeModelControl?.(snapshot.version);
1173
- const plan = capability?.status === "supported"
1174
- ? context.adapter.planModelControl?.(capability)
1175
- : undefined;
1213
+ const { plan } = modelControlProfileObservation(context.adapter, snapshot.version);
1176
1214
  if (!plan || JSON.stringify(plan) !== JSON.stringify(context.plan)) {
1177
1215
  throw new Error("the exact model-control profile changed during the operation");
1178
1216
  }
@@ -1198,7 +1236,11 @@ class NativeThreadLifecycleCliApplication {
1198
1236
  }
1199
1237
  catch (idleError) {
1200
1238
  if (context.terminal.agent !== "claude" ||
1201
- context.plan.behaviorProfile !== "claude-model-control-2.1.266" ||
1239
+ !terminalModelControlPlanConforms({
1240
+ agent: context.terminal.agent,
1241
+ agentVersion: context.agentVersion,
1242
+ plan: context.plan
1243
+ }) ||
1202
1244
  context.runtime.requireExactClaudeAgentRow !== true ||
1203
1245
  context.runtime.exactClaudeAgentState !== "idle") {
1204
1246
  throw idleError;
@@ -1374,6 +1416,9 @@ class NativeThreadLifecycleCliApplication {
1374
1416
  };
1375
1417
  }
1376
1418
  async assertInitialInspectionReady(options, terminal, snapshot, bridge) {
1419
+ return (await this.observeInitialInspectionReady(options, terminal, snapshot, bridge)).runtime;
1420
+ }
1421
+ async observeInitialInspectionReady(options, terminal, snapshot, bridge) {
1377
1422
  this.assertInspectionAgentIdentity({
1378
1423
  options, terminal, snapshot, stage: "before native status inspection"
1379
1424
  });
@@ -1384,7 +1429,7 @@ class NativeThreadLifecycleCliApplication {
1384
1429
  options, terminal, terminalStatus: status, session: snapshot.session
1385
1430
  });
1386
1431
  await this.assertInspectionComposerReady({ options, terminal });
1387
- return runtime;
1432
+ return { runtime, status };
1388
1433
  }
1389
1434
  async submitInspection(context) {
1390
1435
  try {
@@ -1669,6 +1714,17 @@ function nativeInspectionComposerEmpty(agent, screen) {
1669
1714
  ? codexComposerEmpty(screen)
1670
1715
  : isExactClaudeNativeInspectionIdleComposer(String(screen ?? ""));
1671
1716
  }
1717
+ function modelControlProfileObservation(adapter, agentVersion) {
1718
+ const capability = adapter.probeModelControl?.(agentVersion);
1719
+ const plan = capability?.status === "supported"
1720
+ ? adapter.planModelControl?.(capability)
1721
+ : undefined;
1722
+ return {
1723
+ capability,
1724
+ plan,
1725
+ profile: plan ? terminalModelControlProfileForPlan(plan) : undefined
1726
+ };
1727
+ }
1672
1728
  function required(value, message) {
1673
1729
  if (value === undefined || value === "")
1674
1730
  throw new Error(message);