@scotthuang/agent-knock-knock 0.12.13 → 0.12.14

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 (144) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +5 -5
  3. package/dist/src/callback-cli-adapter.d.ts +9 -6
  4. package/dist/src/callback-cli-adapter.js +119 -30
  5. package/dist/src/callback-cli-adapter.js.map +1 -1
  6. package/dist/src/callback-outbox-policy.d.ts +39 -0
  7. package/dist/src/callback-outbox-policy.js +163 -6
  8. package/dist/src/callback-outbox-policy.js.map +1 -1
  9. package/dist/src/callback-outbox-service.d.ts +28 -1
  10. package/dist/src/callback-outbox-service.js +413 -82
  11. package/dist/src/callback-outbox-service.js.map +1 -1
  12. package/dist/src/callback-outbox-settlement.d.ts +14 -1
  13. package/dist/src/callback-outbox-settlement.js +151 -30
  14. package/dist/src/callback-outbox-settlement.js.map +1 -1
  15. package/dist/src/callback-route-authority.d.ts +59 -0
  16. package/dist/src/callback-route-authority.js +123 -0
  17. package/dist/src/callback-route-authority.js.map +1 -0
  18. package/dist/src/callback-transport.d.ts +134 -0
  19. package/dist/src/callback-transport.js +256 -0
  20. package/dist/src/callback-transport.js.map +1 -0
  21. package/dist/src/cli-core.js +17 -4
  22. package/dist/src/cli-core.js.map +1 -1
  23. package/dist/src/codex-lifecycle-compatibility.js +2 -1
  24. package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
  25. package/dist/src/deferred-foreground-application-service.d.ts +18 -0
  26. package/dist/src/deferred-foreground-application-service.js +72 -0
  27. package/dist/src/deferred-foreground-application-service.js.map +1 -1
  28. package/dist/src/deferred-foreground-authority-cli-adapter.js +2 -1
  29. package/dist/src/deferred-foreground-authority-cli-adapter.js.map +1 -1
  30. package/dist/src/deferred-foreground-recovery-cli-adapter.d.ts +1 -1
  31. package/dist/src/deferred-foreground-recovery-cli-adapter.js +108 -37
  32. package/dist/src/deferred-foreground-recovery-cli-adapter.js.map +1 -1
  33. package/dist/src/deferred-foreground-recovery-service.d.ts +1 -1
  34. package/dist/src/deferred-foreground-recovery-service.js +10 -3
  35. package/dist/src/deferred-foreground-recovery-service.js.map +1 -1
  36. package/dist/src/deferred-foreground-transfer-policy.d.ts +1 -1
  37. package/dist/src/deferred-foreground-transfer-policy.js +3 -2
  38. package/dist/src/deferred-foreground-transfer-policy.js.map +1 -1
  39. package/dist/src/deferred-foreground-transfer.d.ts +17 -1
  40. package/dist/src/deferred-foreground-transfer.js +244 -35
  41. package/dist/src/deferred-foreground-transfer.js.map +1 -1
  42. package/dist/src/deferred-foreground-user-close.d.ts +18 -0
  43. package/dist/src/deferred-foreground-user-close.js +180 -0
  44. package/dist/src/deferred-foreground-user-close.js.map +1 -0
  45. package/dist/src/openclaw-callback-transport.d.ts +4 -1
  46. package/dist/src/openclaw-callback-transport.js +403 -10
  47. package/dist/src/openclaw-callback-transport.js.map +1 -1
  48. package/dist/src/openclaw-managed-callback-cli-adapter.d.ts +23 -0
  49. package/dist/src/openclaw-managed-callback-cli-adapter.js +77 -0
  50. package/dist/src/openclaw-managed-callback-cli-adapter.js.map +1 -0
  51. package/dist/src/openclaw-plugin-command-adapter.js +28 -31
  52. package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
  53. package/dist/src/openclaw-plugin-helpers.js +8 -0
  54. package/dist/src/openclaw-plugin-helpers.js.map +1 -1
  55. package/dist/src/openclaw-plugin-schemas.d.ts +20 -1
  56. package/dist/src/openclaw-plugin-schemas.js +26 -2
  57. package/dist/src/openclaw-plugin-schemas.js.map +1 -1
  58. package/dist/src/protocol.d.ts +3 -0
  59. package/dist/src/protocol.js +4 -0
  60. package/dist/src/protocol.js.map +1 -1
  61. package/dist/src/store.d.ts +9 -0
  62. package/dist/src/store.js +79 -1
  63. package/dist/src/store.js.map +1 -1
  64. package/dist/src/terminal-acceptance-cli-adapter.d.ts +2 -0
  65. package/dist/src/terminal-acceptance-cli-adapter.js +62 -12
  66. package/dist/src/terminal-acceptance-cli-adapter.js.map +1 -1
  67. package/dist/src/terminal-action-projection.d.ts +1 -2
  68. package/dist/src/terminal-action-projection.js +4 -5
  69. package/dist/src/terminal-action-projection.js.map +1 -1
  70. package/dist/src/terminal-agent-bridge.d.ts +82 -0
  71. package/dist/src/terminal-agent-bridge.js +539 -111
  72. package/dist/src/terminal-agent-bridge.js.map +1 -1
  73. package/dist/src/terminal-command-cli-adapter.d.ts +9 -0
  74. package/dist/src/terminal-command-cli-adapter.js +2130 -5
  75. package/dist/src/terminal-command-cli-adapter.js.map +1 -1
  76. package/dist/src/terminal-dispatch-application.d.ts +4 -1
  77. package/dist/src/terminal-dispatch-application.js +11 -2
  78. package/dist/src/terminal-dispatch-application.js.map +1 -1
  79. package/dist/src/terminal-dispatch-execution.js +3 -1
  80. package/dist/src/terminal-dispatch-execution.js.map +1 -1
  81. package/dist/src/terminal-dispatch-ledger-codec.d.ts +3 -0
  82. package/dist/src/terminal-dispatch-ledger-codec.js +46 -19
  83. package/dist/src/terminal-dispatch-ledger-codec.js.map +1 -1
  84. package/dist/src/terminal-dispatch-presenter.js +5 -3
  85. package/dist/src/terminal-dispatch-presenter.js.map +1 -1
  86. package/dist/src/terminal-dispatch-receipt.d.ts +3 -0
  87. package/dist/src/terminal-dispatch-receipt.js +15 -1
  88. package/dist/src/terminal-dispatch-receipt.js.map +1 -1
  89. package/dist/src/terminal-dispatch-recovery-cli-adapter.js +68 -7
  90. package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -1
  91. package/dist/src/terminal-dispatch-recovery-service.d.ts +2 -0
  92. package/dist/src/terminal-dispatch-recovery-service.js +9 -0
  93. package/dist/src/terminal-dispatch-recovery-service.js.map +1 -1
  94. package/dist/src/terminal-identity-authority-cli-adapter.d.ts +2 -0
  95. package/dist/src/terminal-identity-authority-cli-adapter.js +30 -27
  96. package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -1
  97. package/dist/src/terminal-list-cli-adapter.d.ts +1 -0
  98. package/dist/src/terminal-list-cli-adapter.js +50 -31
  99. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  100. package/dist/src/terminal-list-renderer.d.ts +9 -1
  101. package/dist/src/terminal-list-renderer.js +219 -98
  102. package/dist/src/terminal-list-renderer.js.map +1 -1
  103. package/dist/src/terminal-maintenance-cli-adapter.js +253 -326
  104. package/dist/src/terminal-maintenance-cli-adapter.js.map +1 -1
  105. package/dist/src/terminal-monitor-application-service.d.ts +5 -0
  106. package/dist/src/terminal-monitor-application-service.js +5 -0
  107. package/dist/src/terminal-monitor-application-service.js.map +1 -1
  108. package/dist/src/terminal-monitor-cli-adapter.d.ts +25 -1
  109. package/dist/src/terminal-monitor-cli-adapter.js +170 -27
  110. package/dist/src/terminal-monitor-cli-adapter.js.map +1 -1
  111. package/dist/src/terminal-monitor-reconciliation-eligibility.d.ts +1 -1
  112. package/dist/src/terminal-monitor-reconciliation-eligibility.js +220 -32
  113. package/dist/src/terminal-monitor-reconciliation-eligibility.js.map +1 -1
  114. package/dist/src/terminal-monitor-state-cli-adapter.d.ts +1 -1
  115. package/dist/src/terminal-monitor-state-cli-adapter.js +808 -147
  116. package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
  117. package/dist/src/terminal-monitor-state-reconciliation-service.d.ts +2 -1
  118. package/dist/src/terminal-monitor-state-reconciliation-service.js +12 -0
  119. package/dist/src/terminal-monitor-state-reconciliation-service.js.map +1 -1
  120. package/dist/src/terminal-monitor-supervision-cli-adapter.d.ts +2 -0
  121. package/dist/src/terminal-monitor-supervision-cli-adapter.js +31 -11
  122. package/dist/src/terminal-monitor-supervision-cli-adapter.js.map +1 -1
  123. package/dist/src/terminal-status-cli-adapter.d.ts +1 -0
  124. package/dist/src/terminal-status-cli-adapter.js +30 -28
  125. package/dist/src/terminal-status-cli-adapter.js.map +1 -1
  126. package/dist/src/terminal-submission-acceptance.js +78 -25
  127. package/dist/src/terminal-submission-acceptance.js.map +1 -1
  128. package/dist/src/terminal-submission-retry-service.d.ts +114 -0
  129. package/dist/src/terminal-submission-retry-service.js +589 -0
  130. package/dist/src/terminal-submission-retry-service.js.map +1 -0
  131. package/dist/src/terminal-watch-callback-cli-adapter.d.ts +10 -2
  132. package/dist/src/terminal-watch-callback-cli-adapter.js +76 -37
  133. package/dist/src/terminal-watch-callback-cli-adapter.js.map +1 -1
  134. package/dist/src/terminal-watch-cli-adapter.js +41 -17
  135. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  136. package/dist/src/terminal-watch-service.d.ts +11 -6
  137. package/dist/src/terminal-watch-service.js +210 -41
  138. package/dist/src/terminal-watch-service.js.map +1 -1
  139. package/dist/src/terminal-watch-store.d.ts +23 -0
  140. package/dist/src/terminal-watch-store.js +162 -4
  141. package/dist/src/terminal-watch-store.js.map +1 -1
  142. package/docs/quickstart-tmux.md +1 -1
  143. package/package.json +1 -1
  144. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +8 -5
@@ -0,0 +1,589 @@
1
+ import path from "node:path";
2
+ import { atomicSaveJsonFile, isNodeError, readJsonFileNoFollow } from "./durable-json-file.js";
3
+ import { ensureDir, pathsForConversationDir } from "./store.js";
4
+ import { isRecord, nonBlankString } from "./value-guards.js";
5
+ export const TERMINAL_SUBMISSION_RETRY_SCHEMA = "agent-knock-knock/terminal-submission-retry";
6
+ export const TERMINAL_SUBMISSION_RETRY_VERSION = 1;
7
+ export const TERMINAL_SUBMISSION_RETRY_FILE = "submission-retry.json";
8
+ export function projectTerminalSubmissionRetryPending(input) {
9
+ const { attempt, submission, ledger } = input;
10
+ if (attempt.state !== "enter_dispatched" || !attempt.enter_dispatched_at) {
11
+ throw new Error("submission retry has no durable Enter dispatch to reconcile");
12
+ }
13
+ if (!["uncertain", "text_injected", "enter_dispatched"].includes(String(submission.status)) ||
14
+ !["uncertain", "text_injected", "enter_dispatched"].includes(String(ledger.status)) ||
15
+ submission.agent_accepted_at !== undefined ||
16
+ submission.not_accepted_at !== undefined ||
17
+ ledger.agent_accepted_at !== undefined ||
18
+ ledger.not_accepted_at !== undefined ||
19
+ ledger.acceptance_evidence !== undefined) {
20
+ throw new Error("submission retry pending metadata conflicts with a stronger durable outcome");
21
+ }
22
+ const messageId = nonBlankString(submission.message_id);
23
+ const preparedAt = nonBlankString(submission.prepared_at);
24
+ if (!messageId || messageId !== attempt.active_message_id ||
25
+ nonBlankString(ledger.message_id) !== messageId ||
26
+ !preparedAt || nonBlankString(ledger.prepared_at) !== preparedAt) {
27
+ throw new Error("submission retry pending generation authority disagrees");
28
+ }
29
+ assertPendingRetryLedgerPrefix(attempt, ledger);
30
+ const textInjectedAt = attempt.mode === "replacement_send"
31
+ ? attempt.replacement_text_injected_at
32
+ : nonBlankString(submission.text_injected_at);
33
+ if (!textInjectedAt) {
34
+ throw new Error("submission retry pending text authority is unavailable");
35
+ }
36
+ if ((submission.status === "enter_dispatched" &&
37
+ nonBlankString(submission.text_injected_at) !== textInjectedAt) ||
38
+ (ledger.status === "enter_dispatched" &&
39
+ nonBlankString(ledger.text_injected_at) !== textInjectedAt) ||
40
+ (attempt.mode === "exact_draft_enter" &&
41
+ nonBlankString(ledger.text_injected_at) !== textInjectedAt)) {
42
+ throw new Error("submission retry pending text authority disagrees");
43
+ }
44
+ for (const record of [submission, ledger]) {
45
+ const enteredAt = nonBlankString(record.enter_dispatched_at);
46
+ if (enteredAt && enteredAt !== attempt.enter_dispatched_at) {
47
+ throw new Error("submission retry pending Enter authority disagrees");
48
+ }
49
+ }
50
+ return {
51
+ messageId,
52
+ preparedAt,
53
+ textInjectedAt,
54
+ enterDispatchedAt: attempt.enter_dispatched_at
55
+ };
56
+ }
57
+ function assertPendingRetryLedgerPrefix(attempt, ledger) {
58
+ const ledgerState = nonBlankString(ledger.submission_retry_state);
59
+ const ledgerRevision = ledger.submission_retry_revision;
60
+ const dispatchPersisted = ledgerState === "enter_dispatched";
61
+ const reservationPersisted = ledgerState === "enter_reserved";
62
+ if (nonBlankString(ledger.submission_retry_attempt_id) !== attempt.attempt_id ||
63
+ nonBlankString(ledger.submission_retry_mode) !== attempt.mode ||
64
+ nonBlankString(ledger.submission_retry_original_message_id) !==
65
+ attempt.original_message_id ||
66
+ nonBlankString(ledger.submission_retry_active_message_id) !==
67
+ attempt.active_message_id ||
68
+ nonBlankString(ledger.submission_retry_reserved_at) !==
69
+ attempt.reserved_at ||
70
+ typeof ledgerRevision !== "number" ||
71
+ !Number.isSafeInteger(ledgerRevision) ||
72
+ !(dispatchPersisted && ledgerRevision === attempt.revision ||
73
+ reservationPersisted && ledgerRevision === attempt.revision - 1) ||
74
+ nonBlankString(ledger.submission_retry_enter_reserved_at) !==
75
+ attempt.enter_reserved_at ||
76
+ nonBlankString(ledger.submission_retry_enter_dispatched_at) !==
77
+ (dispatchPersisted ? attempt.enter_dispatched_at : undefined) ||
78
+ nonBlankString(ledger.submission_retry_replacement_text_reserved_at) !==
79
+ attempt.replacement_text_reserved_at ||
80
+ nonBlankString(ledger.submission_retry_replacement_text_injected_at) !==
81
+ attempt.replacement_text_injected_at) {
82
+ throw new Error("submission retry pending ledger lacks the exact durable retry prefix");
83
+ }
84
+ }
85
+ /**
86
+ * Pure recovery policy. In particular, `exact_empty` is useful only when a
87
+ * structured pre-key receipt proves the original Enter was never attempted.
88
+ * A legacy error string or a missing Enter timestamp is not that proof.
89
+ */
90
+ export function decideTerminalSubmissionRetry(facts) {
91
+ if (!facts.exactTurnTarget) {
92
+ return { action: "refuse", reason: "submission retry requires one exact Turn id" };
93
+ }
94
+ if (facts.agent !== "codex") {
95
+ return { action: "refuse", reason: "submission retry is supported only for Codex" };
96
+ }
97
+ if (facts.accepted) {
98
+ return { action: "repair_accepted" };
99
+ }
100
+ const attempt = facts.attempt;
101
+ if (attempt) {
102
+ if (["enter_reserved", "enter_dispatched", "agent_accepted"]
103
+ .includes(attempt.state)) {
104
+ return {
105
+ action: "refuse",
106
+ reason: "a durable retry Enter reservation already exists; another key dispatch is forbidden"
107
+ };
108
+ }
109
+ if (facts.composer === "exact_draft" &&
110
+ (attempt.mode === "exact_draft_enter" ||
111
+ ["replacement_text_reserved", "replacement_text_injected"]
112
+ .includes(attempt.state))) {
113
+ return {
114
+ action: "submit_exact_draft",
115
+ activeMessageId: attempt.active_message_id
116
+ };
117
+ }
118
+ if (facts.composer === "exact_empty" &&
119
+ attempt.mode === "replacement_send" &&
120
+ attempt.state === "replacement_reserved" &&
121
+ facts.currentMessageId === attempt.original_message_id) {
122
+ return {
123
+ action: "resume_replacement",
124
+ activeMessageId: attempt.active_message_id
125
+ };
126
+ }
127
+ return {
128
+ action: "refuse",
129
+ reason: `retry attempt ${attempt.attempt_id} is ${attempt.state} and the composer is ${facts.composer}`
130
+ };
131
+ }
132
+ const recoverableOriginal = facts.submissionStatus === "uncertain" &&
133
+ facts.lastProvenStage === "text_injected" &&
134
+ Boolean(facts.submissionTextInjectedAt) &&
135
+ facts.submissionTextInjectedAt === facts.ledgerTextInjectedAt &&
136
+ facts.ledgerStatus === "uncertain" &&
137
+ !facts.enterDispatchedAt &&
138
+ !facts.ledgerEnterDispatchedAt &&
139
+ !facts.ledgerAgentAcceptedAt &&
140
+ Boolean(facts.originalMessageId) &&
141
+ facts.currentMessageId === facts.originalMessageId;
142
+ if (!recoverableOriginal) {
143
+ return {
144
+ action: "refuse",
145
+ reason: "the Turn has no exact text-injected submission generation eligible for recovery"
146
+ };
147
+ }
148
+ if (facts.composer === "exact_draft") {
149
+ return {
150
+ action: "submit_exact_draft",
151
+ activeMessageId: facts.originalMessageId
152
+ };
153
+ }
154
+ if (facts.composer === "exact_empty" &&
155
+ facts.enterNotAttemptedReason === "pre_key_failure" &&
156
+ facts.ledgerEnterNotAttemptedReason === "pre_key_failure" &&
157
+ Boolean(facts.enterNotAttemptedAt) &&
158
+ facts.enterNotAttemptedAt === facts.ledgerEnterNotAttemptedAt) {
159
+ return { action: "start_replacement" };
160
+ }
161
+ return {
162
+ action: "refuse",
163
+ reason: facts.composer === "exact_empty"
164
+ ? "the composer is empty, but no structured pre-key proof shows that the original Enter was never attempted"
165
+ : `the Codex composer is ${facts.composer}; no terminal input is authorized`
166
+ };
167
+ }
168
+ export function terminalSubmissionRetryPath(statePath) {
169
+ return path.join(path.dirname(path.resolve(statePath)), TERMINAL_SUBMISSION_RETRY_FILE);
170
+ }
171
+ export function loadTerminalSubmissionRetry(statePath) {
172
+ const filePath = terminalSubmissionRetryPath(statePath);
173
+ try {
174
+ return validateTerminalSubmissionRetry(readJsonFileNoFollow(filePath, "terminal submission retry"), statePath);
175
+ }
176
+ catch (error) {
177
+ if (isNodeError(error, "ENOENT"))
178
+ return undefined;
179
+ throw error;
180
+ }
181
+ }
182
+ export function saveTerminalSubmissionRetry(statePath, candidate, expectedRevision) {
183
+ const canonicalStatePath = path.resolve(statePath);
184
+ const current = loadTerminalSubmissionRetry(canonicalStatePath);
185
+ if (expectedRevision === null
186
+ ? current !== undefined
187
+ : !current || current.revision !== expectedRevision) {
188
+ throw new Error("terminal submission retry changed before its CAS write");
189
+ }
190
+ const next = validateTerminalSubmissionRetry({
191
+ ...candidate,
192
+ revision: expectedRevision === null ? 1 : expectedRevision + 1,
193
+ state_path: canonicalStatePath
194
+ }, canonicalStatePath);
195
+ if (current)
196
+ assertTerminalSubmissionRetryAdvance(current, next);
197
+ const filePath = terminalSubmissionRetryPath(canonicalStatePath);
198
+ atomicSaveJsonFile(filePath, next, {
199
+ rootLabel: "conversation Store",
200
+ directoryLabel: "conversation directory",
201
+ fileLabel: "terminal submission retry",
202
+ ensureDirectory: ensureDir
203
+ });
204
+ return next;
205
+ }
206
+ export function terminalSubmissionRetryLedgerFields(attempt) {
207
+ return attempt
208
+ ? {
209
+ submission_retry_attempt_id: attempt.attempt_id,
210
+ submission_retry_mode: attempt.mode,
211
+ submission_retry_state: attempt.state,
212
+ submission_retry_revision: attempt.revision,
213
+ submission_retry_original_message_id: attempt.original_message_id,
214
+ submission_retry_active_message_id: attempt.active_message_id,
215
+ submission_retry_reserved_at: attempt.reserved_at,
216
+ ...(attempt.replacement_text_reserved_at
217
+ ? {
218
+ submission_retry_replacement_text_reserved_at: attempt.replacement_text_reserved_at
219
+ }
220
+ : {}),
221
+ ...(attempt.replacement_text_injected_at
222
+ ? {
223
+ submission_retry_replacement_text_injected_at: attempt.replacement_text_injected_at
224
+ }
225
+ : {}),
226
+ ...(attempt.enter_reserved_at
227
+ ? { submission_retry_enter_reserved_at: attempt.enter_reserved_at }
228
+ : {}),
229
+ ...(attempt.enter_dispatched_at
230
+ ? { submission_retry_enter_dispatched_at: attempt.enter_dispatched_at }
231
+ : {})
232
+ }
233
+ : {};
234
+ }
235
+ const TERMINAL_SUBMISSION_RETRY_LEDGER_PREFIX_KEYS = [
236
+ "submission_retry_attempt_id",
237
+ "submission_retry_mode",
238
+ "submission_retry_state",
239
+ "submission_retry_revision",
240
+ "submission_retry_original_message_id",
241
+ "submission_retry_active_message_id",
242
+ "submission_retry_reserved_at",
243
+ "submission_retry_replacement_text_reserved_at",
244
+ "submission_retry_replacement_text_injected_at",
245
+ "submission_retry_enter_reserved_at",
246
+ "submission_retry_enter_dispatched_at"
247
+ ];
248
+ export function terminalSubmissionRetryLedgerPrefix(attempt, ledger) {
249
+ const matches = (expected) => TERMINAL_SUBMISSION_RETRY_LEDGER_PREFIX_KEYS.every((key) => ledger[key] === expected[key]);
250
+ if (matches(terminalSubmissionRetryLedgerFields(attempt)))
251
+ return "current";
252
+ if (attempt.revision === 1 &&
253
+ TERMINAL_SUBMISSION_RETRY_LEDGER_PREFIX_KEYS.every((key) => ledger[key] === undefined) &&
254
+ (attempt.mode === "replacement_send" &&
255
+ attempt.state === "replacement_reserved" ||
256
+ attempt.mode === "exact_draft_enter" &&
257
+ attempt.state === "enter_reserved")) {
258
+ return "missing_initial";
259
+ }
260
+ const previousState = terminalSubmissionRetryPreviousState(attempt);
261
+ const previous = terminalSubmissionRetryLedgerFieldsForState(attempt, previousState, attempt.revision - 1);
262
+ if (attempt.revision > 1 && matches(previous))
263
+ return "previous";
264
+ throw new Error("submission retry ledger is not an exact current or one-write-lagging prefix");
265
+ }
266
+ function terminalSubmissionRetryPreviousState(attempt) {
267
+ if (attempt.state === "enter_dispatched")
268
+ return "enter_reserved";
269
+ if (attempt.state !== "agent_accepted") {
270
+ throw new Error("submission retry attempt has no accepted predecessor");
271
+ }
272
+ if (attempt.enter_dispatched_at)
273
+ return "enter_dispatched";
274
+ if (attempt.enter_reserved_at)
275
+ return "enter_reserved";
276
+ if (attempt.replacement_text_injected_at) {
277
+ return "replacement_text_injected";
278
+ }
279
+ if (attempt.replacement_text_reserved_at) {
280
+ return "replacement_text_reserved";
281
+ }
282
+ if (attempt.mode === "replacement_send")
283
+ return "replacement_reserved";
284
+ throw new Error("accepted exact-draft retry lacks its durable Enter prefix");
285
+ }
286
+ function terminalSubmissionRetryLedgerFieldsForState(attempt, state, revision) {
287
+ const fields = {
288
+ ...terminalSubmissionRetryLedgerFields(attempt),
289
+ submission_retry_state: state,
290
+ submission_retry_revision: revision
291
+ };
292
+ const rank = {
293
+ replacement_reserved: 0,
294
+ replacement_text_reserved: 1,
295
+ replacement_text_injected: 2,
296
+ enter_reserved: 3,
297
+ enter_dispatched: 4,
298
+ agent_accepted: 5
299
+ };
300
+ if (rank[state] < rank.replacement_text_reserved) {
301
+ delete fields.submission_retry_replacement_text_reserved_at;
302
+ }
303
+ if (rank[state] < rank.replacement_text_injected) {
304
+ delete fields.submission_retry_replacement_text_injected_at;
305
+ }
306
+ if (rank[state] < rank.enter_reserved) {
307
+ delete fields.submission_retry_enter_reserved_at;
308
+ }
309
+ if (rank[state] < rank.enter_dispatched) {
310
+ delete fields.submission_retry_enter_dispatched_at;
311
+ }
312
+ return fields;
313
+ }
314
+ export function decideTerminalSubmissionRetryStartup(input) {
315
+ let prefix;
316
+ try {
317
+ prefix = terminalSubmissionRetryLedgerPrefix(input.attempt, input.ledger);
318
+ }
319
+ catch (error) {
320
+ return {
321
+ action: "refuse",
322
+ reason: error instanceof Error ? error.message : String(error)
323
+ };
324
+ }
325
+ const stateAccepted = input.submission.status === "agent_accepted";
326
+ const ledgerAccepted = input.ledger.status === "agent_accepted";
327
+ const accepted = stateAccepted || ledgerAccepted ||
328
+ input.attempt.state === "agent_accepted";
329
+ const stateNotAcceptedStatus = input.submission.status === "not_accepted";
330
+ const ledgerNotAcceptedStatus = input.ledger.status === "not_accepted";
331
+ const stateNotAccepted = terminalOutcomeTimestamp(input.submission, "not_accepted", "not_accepted_at");
332
+ const ledgerNotAccepted = terminalOutcomeTimestamp(input.ledger, "not_accepted", "not_accepted_at");
333
+ const stateUncertain = postRetryUncertainTimestamp(input.submission, input.attempt.enter_dispatched_at);
334
+ const ledgerUncertain = postRetryUncertainTimestamp(input.ledger, input.attempt.enter_dispatched_at);
335
+ if (stateNotAcceptedStatus !== Boolean(stateNotAccepted) ||
336
+ ledgerNotAcceptedStatus !== Boolean(ledgerNotAccepted)) {
337
+ return {
338
+ action: "refuse",
339
+ reason: "not-accepted submission retry lacks its exact terminal timestamp"
340
+ };
341
+ }
342
+ if (accepted &&
343
+ (stateNotAcceptedStatus || ledgerNotAcceptedStatus ||
344
+ stateUncertain || ledgerUncertain)) {
345
+ return {
346
+ action: "refuse",
347
+ reason: "accepted submission retry conflicts with a terminal negative outcome"
348
+ };
349
+ }
350
+ if (accepted) {
351
+ return { action: "finalize_accepted" };
352
+ }
353
+ if ((stateNotAccepted || ledgerNotAccepted) &&
354
+ (stateUncertain || ledgerUncertain)) {
355
+ return {
356
+ action: "refuse",
357
+ reason: "submission retry terminal outcomes conflict"
358
+ };
359
+ }
360
+ if (stateNotAccepted || ledgerNotAccepted) {
361
+ if (stateNotAccepted && ledgerNotAccepted &&
362
+ stateNotAccepted === ledgerNotAccepted) {
363
+ return { action: "no_change", reason: "not_accepted_is_durable" };
364
+ }
365
+ if (stateNotAccepted && !ledgerNotAccepted &&
366
+ input.ledger.status === "enter_dispatched" && prefix === "current") {
367
+ return {
368
+ action: "repair_terminal_ledger",
369
+ outcome: "not_accepted",
370
+ at: stateNotAccepted
371
+ };
372
+ }
373
+ return {
374
+ action: "refuse",
375
+ reason: "not-accepted submission retry is not an exact state-first ledger lag"
376
+ };
377
+ }
378
+ if (stateUncertain || ledgerUncertain) {
379
+ if (stateUncertain && ledgerUncertain && stateUncertain === ledgerUncertain) {
380
+ return { action: "no_change", reason: "uncertain_is_durable" };
381
+ }
382
+ if (stateUncertain && !ledgerUncertain &&
383
+ input.ledger.status === "enter_dispatched" && prefix === "current") {
384
+ return {
385
+ action: "repair_terminal_ledger",
386
+ outcome: "uncertain",
387
+ at: stateUncertain,
388
+ reason: nonBlankString(input.submission.error)
389
+ };
390
+ }
391
+ if (ledgerUncertain && !stateUncertain &&
392
+ input.submission.status === "enter_dispatched" && prefix === "current") {
393
+ return {
394
+ action: "repair_terminal_state",
395
+ outcome: "uncertain",
396
+ at: ledgerUncertain,
397
+ reason: nonBlankString(input.ledger.error)
398
+ };
399
+ }
400
+ return {
401
+ action: "refuse",
402
+ reason: "uncertain submission retry is not an exact state-first ledger lag"
403
+ };
404
+ }
405
+ if (input.attempt.state === "enter_dispatched" && prefix === "previous") {
406
+ return { action: "promote_pending" };
407
+ }
408
+ return {
409
+ action: "no_change",
410
+ reason: prefix === "current"
411
+ ? "retry_prefix_is_already_current"
412
+ : "initial_retry_prefix_requires_explicit_recovery"
413
+ };
414
+ }
415
+ function terminalOutcomeTimestamp(record, status, timestampField) {
416
+ return record.status === status
417
+ ? nonBlankString(record[timestampField])
418
+ : undefined;
419
+ }
420
+ function postRetryUncertainTimestamp(record, enterDispatchedAt) {
421
+ const uncertainAt = terminalOutcomeTimestamp(record, "uncertain", "uncertain_at");
422
+ if (!uncertainAt || !enterDispatchedAt)
423
+ return undefined;
424
+ return Date.parse(uncertainAt) >= Date.parse(enterDispatchedAt)
425
+ ? uncertainAt
426
+ : undefined;
427
+ }
428
+ function validateTerminalSubmissionRetry(value, expectedStatePath) {
429
+ if (!isRecord(value)) {
430
+ throw new Error("terminal submission retry is malformed");
431
+ }
432
+ const requiredStrings = [
433
+ "attempt_id", "mode", "state", "store_dir", "state_path", "session_id",
434
+ "turn_id", "original_message_id", "active_message_id", "request_hash",
435
+ "terminal_target", "reserved_at", "updated_at"
436
+ ];
437
+ if (value.schema !== TERMINAL_SUBMISSION_RETRY_SCHEMA ||
438
+ value.version !== TERMINAL_SUBMISSION_RETRY_VERSION ||
439
+ typeof value.revision !== "number" ||
440
+ !Number.isSafeInteger(value.revision) || value.revision < 1 ||
441
+ requiredStrings.some((field) => !nonBlankString(value[field])) ||
442
+ !["exact_draft_enter", "replacement_send"].includes(String(value.mode)) ||
443
+ ![
444
+ "replacement_reserved", "replacement_text_reserved",
445
+ "replacement_text_injected", "enter_reserved", "enter_dispatched",
446
+ "agent_accepted"
447
+ ].includes(String(value.state)) ||
448
+ path.resolve(String(value.state_path)) !== path.resolve(expectedStatePath) ||
449
+ !path.isAbsolute(String(value.store_dir)) ||
450
+ !/^[0-9a-f]{64}$/u.test(String(value.request_hash)) ||
451
+ ![null, undefined].includes(value.callback_route_fingerprint) &&
452
+ !nonBlankString(value.callback_route_fingerprint) ||
453
+ ![null, undefined].includes(value.deferred_foreground_transfer_id) &&
454
+ !nonBlankString(value.deferred_foreground_transfer_id)) {
455
+ throw new Error("terminal submission retry is malformed");
456
+ }
457
+ const canonicalStatePath = path.resolve(String(value.state_path));
458
+ const canonicalPaths = pathsForConversationDir(path.dirname(canonicalStatePath));
459
+ if (path.resolve(canonicalPaths.statePath) !== canonicalStatePath ||
460
+ path.resolve(canonicalPaths.storeDir) !== path.resolve(String(value.store_dir)) ||
461
+ path.basename(canonicalPaths.conversationDir) !== String(value.turn_id)) {
462
+ throw new Error("terminal submission retry is outside its canonical Turn Store path");
463
+ }
464
+ for (const field of [
465
+ "reserved_at", "updated_at", "replacement_text_reserved_at",
466
+ "replacement_text_injected_at", "enter_reserved_at",
467
+ "enter_dispatched_at", "agent_accepted_at"
468
+ ]) {
469
+ if (value[field] !== undefined && !Number.isFinite(Date.parse(String(value[field])))) {
470
+ throw new Error(`terminal submission retry ${field} is malformed`);
471
+ }
472
+ }
473
+ assertModeStateShape(value);
474
+ return value;
475
+ }
476
+ function assertModeStateShape(record) {
477
+ const rank = {
478
+ replacement_reserved: 0,
479
+ replacement_text_reserved: 1,
480
+ replacement_text_injected: 2,
481
+ enter_reserved: 3,
482
+ enter_dispatched: 4,
483
+ agent_accepted: 5
484
+ };
485
+ const accepted = record.state === "agent_accepted";
486
+ if (record.mode === "exact_draft_enter") {
487
+ if (record.active_message_id !== record.original_message_id ||
488
+ rank[record.state] < rank.enter_reserved ||
489
+ !record.enter_reserved_at ||
490
+ record.replacement_text_reserved_at !== undefined ||
491
+ record.replacement_text_injected_at !== undefined ||
492
+ (!accepted && !timestampMatchesRank(record.enter_dispatched_at, rank[record.state] >= rank.enter_dispatched))) {
493
+ throw new Error("terminal submission retry exact-draft state is malformed");
494
+ }
495
+ }
496
+ else {
497
+ const replacementPrefix = [
498
+ record.replacement_text_reserved_at,
499
+ record.replacement_text_injected_at,
500
+ record.enter_reserved_at,
501
+ record.enter_dispatched_at
502
+ ];
503
+ const prefixIsContiguous = replacementPrefix.every((timestamp, index) => timestamp !== undefined ||
504
+ replacementPrefix.slice(index + 1).every((later) => later === undefined));
505
+ if (record.active_message_id !== record.original_message_id ||
506
+ (accepted
507
+ ? !prefixIsContiguous
508
+ : !timestampMatchesRank(record.replacement_text_reserved_at, rank[record.state] >= rank.replacement_text_reserved) ||
509
+ !timestampMatchesRank(record.replacement_text_injected_at, rank[record.state] >= rank.replacement_text_injected) ||
510
+ !timestampMatchesRank(record.enter_reserved_at, rank[record.state] >= rank.enter_reserved) ||
511
+ !timestampMatchesRank(record.enter_dispatched_at, rank[record.state] >= rank.enter_dispatched))) {
512
+ throw new Error("terminal submission retry replacement state is malformed");
513
+ }
514
+ }
515
+ if (!accepted && !timestampMatchesRank(record.enter_dispatched_at, rank[record.state] >= rank.enter_dispatched)) {
516
+ throw new Error("terminal submission retry Enter state is malformed");
517
+ }
518
+ if (!timestampMatchesRank(record.agent_accepted_at, record.state === "agent_accepted")) {
519
+ throw new Error("terminal submission retry acceptance state is malformed");
520
+ }
521
+ const ordered = record.mode === "replacement_send"
522
+ ? [
523
+ record.reserved_at,
524
+ record.replacement_text_reserved_at,
525
+ record.replacement_text_injected_at,
526
+ record.enter_reserved_at,
527
+ record.enter_dispatched_at,
528
+ record.agent_accepted_at
529
+ ]
530
+ : [
531
+ record.reserved_at,
532
+ record.enter_reserved_at,
533
+ record.enter_dispatched_at,
534
+ record.agent_accepted_at
535
+ ];
536
+ let previous = Number.NEGATIVE_INFINITY;
537
+ for (const timestamp of ordered) {
538
+ if (!timestamp)
539
+ continue;
540
+ const current = Date.parse(timestamp);
541
+ if (current < previous) {
542
+ throw new Error("terminal submission retry timestamps are out of order");
543
+ }
544
+ previous = current;
545
+ }
546
+ }
547
+ function timestampMatchesRank(timestamp, required) {
548
+ return required ? timestamp !== undefined : timestamp === undefined;
549
+ }
550
+ function assertTerminalSubmissionRetryAdvance(current, next) {
551
+ for (const field of [
552
+ "schema", "version", "attempt_id", "mode", "store_dir", "state_path",
553
+ "session_id", "turn_id", "original_message_id", "active_message_id",
554
+ "request_hash", "terminal_target", "callback_route_fingerprint",
555
+ "deferred_foreground_transfer_id", "reserved_at"
556
+ ]) {
557
+ if (JSON.stringify(current[field]) !== JSON.stringify(next[field])) {
558
+ throw new Error(`terminal submission retry cannot change ${field}`);
559
+ }
560
+ }
561
+ const rank = {
562
+ replacement_reserved: 0,
563
+ replacement_text_reserved: 1,
564
+ replacement_text_injected: 2,
565
+ enter_reserved: 3,
566
+ enter_dispatched: 4,
567
+ agent_accepted: 5
568
+ };
569
+ if (rank[next.state] < rank[current.state]) {
570
+ throw new Error("terminal submission retry state cannot regress");
571
+ }
572
+ if (next.state !== "agent_accepted" &&
573
+ rank[next.state] > rank[current.state] + 1) {
574
+ throw new Error("terminal submission retry state cannot skip a transport boundary");
575
+ }
576
+ if (current.mode === "exact_draft_enter" &&
577
+ next.state.startsWith("replacement_")) {
578
+ throw new Error("exact-draft retry cannot become a replacement send");
579
+ }
580
+ for (const field of [
581
+ "replacement_text_reserved_at", "replacement_text_injected_at", "enter_reserved_at",
582
+ "enter_dispatched_at", "agent_accepted_at"
583
+ ]) {
584
+ if (current[field] !== undefined && current[field] !== next[field]) {
585
+ throw new Error(`terminal submission retry cannot change ${field}`);
586
+ }
587
+ }
588
+ }
589
+ //# sourceMappingURL=terminal-submission-retry-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-submission-retry-service.js","sourceRoot":"","sources":["../../src/terminal-submission-retry-service.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,28 @@
1
1
  import type { CallbackSpawnSync } from "./openclaw-callback-transport.js";
2
- export type TerminalWatchCallbackEvent = "approval_required" | "completed" | "failed" | "timed_out" | "invalidated" | "cancelled";
2
+ import { type CallbackAttemptOutcome, type CallbackRouteV1, type CallbackTransportContextV1, type CallbackTransportDeliverInput } from "./callback-transport.js";
3
+ import { type TerminalWatchCallbackEvent as TerminalWatchCallbackEventType, type TerminalWatchCallbackResolution } from "./terminal-watch-service.js";
4
+ import type { TerminalWatch } from "./terminal-watch-store.js";
5
+ export type TerminalWatchCallbackEvent = TerminalWatchCallbackEventType;
3
6
  export interface TerminalWatchCallbackInput {
4
7
  watchId: string;
5
8
  idempotencyKey: string;
6
9
  event: TerminalWatchCallbackEvent;
7
10
  agent: "codex" | "claude";
8
11
  terminalId: string;
9
- openclawSession: string;
12
+ openclawSession?: string;
10
13
  openclawBin?: string;
11
14
  detail?: string;
12
15
  completionText?: string;
13
16
  }
17
+ export type TerminalWatchTransportDeliveryInput = CallbackTransportDeliverInput;
14
18
  export interface TerminalWatchCallbackCliAdapter {
15
19
  deliver(input: TerminalWatchCallbackInput): void;
20
+ deliverTransport?(input: TerminalWatchTransportDeliveryInput): CallbackAttemptOutcome;
16
21
  }
22
+ export declare function resolveTerminalWatchOpenClawCallback(watch: Pick<TerminalWatch, "openclaw_session" | "openclaw_bin">): TerminalWatchCallbackResolution;
23
+ export declare function resolveTerminalWatchOpenClawCallbackContext(watch: Pick<TerminalWatch, "openclaw_session" | "openclaw_bin">, _route?: CallbackRouteV1): CallbackTransportContextV1;
17
24
  export declare function createTerminalWatchCallbackCliAdapter(options?: {
18
25
  environment?: () => NodeJS.ProcessEnv;
26
+ now?: () => Date;
19
27
  spawnSync?: CallbackSpawnSync;
20
28
  }): TerminalWatchCallbackCliAdapter;