@scotthuang/agent-knock-knock 0.12.11 → 0.12.13
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.
- package/CHANGELOG.md +40 -0
- package/README.md +43 -30
- package/dist/src/approval-policy.d.ts +11 -2
- package/dist/src/approval-policy.js +33 -7
- package/dist/src/approval-policy.js.map +1 -1
- package/dist/src/callback-cli-adapter.d.ts +47 -0
- package/dist/src/callback-cli-adapter.js +156 -0
- package/dist/src/callback-cli-adapter.js.map +1 -0
- package/dist/src/callback-outbox-policy.d.ts +95 -0
- package/dist/src/callback-outbox-policy.js +149 -0
- package/dist/src/callback-outbox-policy.js.map +1 -0
- package/dist/src/callback-outbox-service.d.ts +247 -0
- package/dist/src/callback-outbox-service.js +1053 -0
- package/dist/src/callback-outbox-service.js.map +1 -0
- package/dist/src/callback-outbox-settlement.d.ts +54 -0
- package/dist/src/callback-outbox-settlement.js +241 -0
- package/dist/src/callback-outbox-settlement.js.map +1 -0
- package/dist/src/canonical-json.d.ts +1 -0
- package/dist/src/canonical-json.js +14 -0
- package/dist/src/canonical-json.js.map +1 -0
- package/dist/src/claude-lifecycle-compatibility.js +15 -0
- package/dist/src/claude-lifecycle-compatibility.js.map +1 -1
- package/dist/src/claude-local-transcript-provider.d.ts +82 -1
- package/dist/src/claude-local-transcript-provider.js +873 -23
- package/dist/src/claude-local-transcript-provider.js.map +1 -1
- package/dist/src/cli-command-runtime.d.ts +14 -0
- package/dist/src/cli-command-runtime.js +164 -0
- package/dist/src/cli-command-runtime.js.map +1 -0
- package/dist/src/cli-core.d.ts +4 -42
- package/dist/src/cli-core.js +958 -28684
- package/dist/src/cli-core.js.map +1 -1
- package/dist/src/cli-runtime-context.d.ts +57 -0
- package/dist/src/cli-runtime-context.js +118 -0
- package/dist/src/cli-runtime-context.js.map +1 -0
- package/dist/src/codex-lifecycle-compatibility.js +2 -1
- package/dist/src/codex-lifecycle-compatibility.js.map +1 -1
- package/dist/src/codex-local-session-provider.d.ts +18 -0
- package/dist/src/codex-local-session-provider.js +67 -0
- package/dist/src/codex-local-session-provider.js.map +1 -1
- package/dist/src/codex-session-provider.js +1 -3
- package/dist/src/codex-session-provider.js.map +1 -1
- package/dist/src/conversation-trace.d.ts +30 -0
- package/dist/src/conversation-trace.js +185 -0
- package/dist/src/conversation-trace.js.map +1 -0
- package/dist/src/deferred-foreground-application-service.d.ts +84 -0
- package/dist/src/deferred-foreground-application-service.js +742 -0
- package/dist/src/deferred-foreground-application-service.js.map +1 -0
- package/dist/src/deferred-foreground-authority-cli-adapter.d.ts +78 -0
- package/dist/src/deferred-foreground-authority-cli-adapter.js +795 -0
- package/dist/src/deferred-foreground-authority-cli-adapter.js.map +1 -0
- package/dist/src/deferred-foreground-boundary.d.ts +61 -0
- package/dist/src/deferred-foreground-boundary.js +2 -0
- package/dist/src/deferred-foreground-boundary.js.map +1 -0
- package/dist/src/deferred-foreground-capability.d.ts +4 -0
- package/dist/src/deferred-foreground-capability.js +184 -0
- package/dist/src/deferred-foreground-capability.js.map +1 -0
- package/dist/src/deferred-foreground-preparation-cli-adapter.d.ts +53 -0
- package/dist/src/deferred-foreground-preparation-cli-adapter.js +210 -0
- package/dist/src/deferred-foreground-preparation-cli-adapter.js.map +1 -0
- package/dist/src/deferred-foreground-preparation-service.d.ts +72 -0
- package/dist/src/deferred-foreground-preparation-service.js +179 -0
- package/dist/src/deferred-foreground-preparation-service.js.map +1 -0
- package/dist/src/deferred-foreground-recovery-cli-adapter.d.ts +139 -0
- package/dist/src/deferred-foreground-recovery-cli-adapter.js +1125 -0
- package/dist/src/deferred-foreground-recovery-cli-adapter.js.map +1 -0
- package/dist/src/deferred-foreground-recovery-service.d.ts +48 -0
- package/dist/src/deferred-foreground-recovery-service.js +91 -0
- package/dist/src/deferred-foreground-recovery-service.js.map +1 -0
- package/dist/src/deferred-foreground-transfer-policy.d.ts +2 -0
- package/dist/src/deferred-foreground-transfer-policy.js +10 -0
- package/dist/src/deferred-foreground-transfer-policy.js.map +1 -0
- package/dist/src/deferred-foreground-transfer.js +46 -105
- package/dist/src/deferred-foreground-transfer.js.map +1 -1
- package/dist/src/doctor-capabilities.d.ts +9 -0
- package/dist/src/doctor-capabilities.js +22 -0
- package/dist/src/doctor-capabilities.js.map +1 -1
- package/dist/src/durable-json-file.d.ts +22 -0
- package/dist/src/durable-json-file.js +127 -0
- package/dist/src/durable-json-file.js.map +1 -0
- package/dist/src/file-lock-cli-adapter.d.ts +43 -0
- package/dist/src/file-lock-cli-adapter.js +150 -0
- package/dist/src/file-lock-cli-adapter.js.map +1 -0
- package/dist/src/herdr-terminal-control-provider.js +1 -3
- package/dist/src/herdr-terminal-control-provider.js.map +1 -1
- package/dist/src/install-doctor-command-adapter.d.ts +17 -0
- package/dist/src/install-doctor-command-adapter.js +225 -0
- package/dist/src/install-doctor-command-adapter.js.map +1 -0
- package/dist/src/live-lifecycle-evidence.js +76 -46
- package/dist/src/live-lifecycle-evidence.js.map +1 -1
- package/dist/src/live-lifecycle-smoke.js +74 -50
- package/dist/src/live-lifecycle-smoke.js.map +1 -1
- package/dist/src/managed-session.d.ts +2 -0
- package/dist/src/managed-session.js +24 -0
- package/dist/src/managed-session.js.map +1 -1
- package/dist/src/managed-turn-recovery-service.d.ts +86 -0
- package/dist/src/managed-turn-recovery-service.js +145 -0
- package/dist/src/managed-turn-recovery-service.js.map +1 -0
- package/dist/src/mutation-transaction.d.ts +48 -0
- package/dist/src/mutation-transaction.js +73 -0
- package/dist/src/mutation-transaction.js.map +1 -0
- package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +154 -0
- package/dist/src/native-thread-lifecycle-cli-adapter.js +786 -0
- package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -0
- package/dist/src/native-thread-lifecycle-ledger-cli-adapter.d.ts +25 -0
- package/dist/src/native-thread-lifecycle-ledger-cli-adapter.js +50 -0
- package/dist/src/native-thread-lifecycle-ledger-cli-adapter.js.map +1 -0
- package/dist/src/native-thread-lifecycle-query-service.d.ts +75 -0
- package/dist/src/native-thread-lifecycle-query-service.js +297 -0
- package/dist/src/native-thread-lifecycle-query-service.js.map +1 -0
- package/dist/src/native-thread-lifecycle-recovery-adapter.d.ts +45 -0
- package/dist/src/native-thread-lifecycle-recovery-adapter.js +154 -0
- package/dist/src/native-thread-lifecycle-recovery-adapter.js.map +1 -0
- package/dist/src/native-thread-lifecycle-recovery-service.d.ts +211 -0
- package/dist/src/native-thread-lifecycle-recovery-service.js +1093 -0
- package/dist/src/native-thread-lifecycle-recovery-service.js.map +1 -0
- package/dist/src/native-thread-resume-snapshot-policy.d.ts +73 -0
- package/dist/src/native-thread-resume-snapshot-policy.js +218 -0
- package/dist/src/native-thread-resume-snapshot-policy.js.map +1 -0
- package/dist/src/native-thread-resume-snapshot.d.ts +3 -61
- package/dist/src/native-thread-resume-snapshot.js +2 -143
- package/dist/src/native-thread-resume-snapshot.js.map +1 -1
- package/dist/src/native-thread-transition-application.d.ts +147 -0
- package/dist/src/native-thread-transition-application.js +974 -0
- package/dist/src/native-thread-transition-application.js.map +1 -0
- package/dist/src/native-thread-transition-policy.d.ts +127 -0
- package/dist/src/native-thread-transition-policy.js +154 -0
- package/dist/src/native-thread-transition-policy.js.map +1 -0
- package/dist/src/native-thread-transition-resource-adapter.d.ts +12 -0
- package/dist/src/native-thread-transition-resource-adapter.js +44 -0
- package/dist/src/native-thread-transition-resource-adapter.js.map +1 -0
- package/dist/src/native-thread-transition-settlement-service.d.ts +94 -0
- package/dist/src/native-thread-transition-settlement-service.js +134 -0
- package/dist/src/native-thread-transition-settlement-service.js.map +1 -0
- package/dist/src/native-thread-transition-verification-adapter.d.ts +62 -0
- package/dist/src/native-thread-transition-verification-adapter.js +451 -0
- package/dist/src/native-thread-transition-verification-adapter.js.map +1 -0
- package/dist/src/openclaw-callback-transport.d.ts +69 -0
- package/dist/src/openclaw-callback-transport.js +583 -0
- package/dist/src/openclaw-callback-transport.js.map +1 -0
- package/dist/src/openclaw-plugin-callback-adapter.d.ts +1 -0
- package/dist/src/openclaw-plugin-callback-adapter.js +423 -0
- package/dist/src/openclaw-plugin-callback-adapter.js.map +1 -0
- package/dist/src/openclaw-plugin-command-adapter.d.ts +16 -0
- package/dist/src/openclaw-plugin-command-adapter.js +1868 -0
- package/dist/src/openclaw-plugin-command-adapter.js.map +1 -0
- package/dist/src/openclaw-plugin-helpers.d.ts +27 -4
- package/dist/src/openclaw-plugin-helpers.js +356 -81
- package/dist/src/openclaw-plugin-helpers.js.map +1 -1
- package/dist/src/openclaw-plugin-schemas.d.ts +358 -0
- package/dist/src/openclaw-plugin-schemas.js +366 -0
- package/dist/src/openclaw-plugin-schemas.js.map +1 -0
- package/dist/src/openclaw-plugin-supervisor.d.ts +6 -0
- package/dist/src/openclaw-plugin-supervisor.js +123 -0
- package/dist/src/openclaw-plugin-supervisor.js.map +1 -0
- package/dist/src/openclaw-plugin.js +7 -2212
- package/dist/src/openclaw-plugin.js.map +1 -1
- package/dist/src/openclaw-private-authority-offers.d.ts +22 -0
- package/dist/src/openclaw-private-authority-offers.js +177 -0
- package/dist/src/openclaw-private-authority-offers.js.map +1 -0
- package/dist/src/protocol.d.ts +5 -0
- package/dist/src/protocol.js +59 -3
- package/dist/src/protocol.js.map +1 -1
- package/dist/src/session-store.d.ts +1 -0
- package/dist/src/session-store.js +84 -106
- package/dist/src/session-store.js.map +1 -1
- package/dist/src/store.d.ts +1 -0
- package/dist/src/store.js +5 -2
- package/dist/src/store.js.map +1 -1
- package/dist/src/terminal-acceptance-application-service.d.ts +65 -0
- package/dist/src/terminal-acceptance-application-service.js +63 -0
- package/dist/src/terminal-acceptance-application-service.js.map +1 -0
- package/dist/src/terminal-acceptance-cli-adapter.d.ts +210 -0
- package/dist/src/terminal-acceptance-cli-adapter.js +957 -0
- package/dist/src/terminal-acceptance-cli-adapter.js.map +1 -0
- package/dist/src/terminal-action-projection.d.ts +309 -0
- package/dist/src/terminal-action-projection.js +376 -0
- package/dist/src/terminal-action-projection.js.map +1 -0
- package/dist/src/terminal-agent-bridge.d.ts +3 -0
- package/dist/src/terminal-agent-bridge.js +29 -8
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/terminal-authority-policy.d.ts +141 -0
- package/dist/src/terminal-authority-policy.js +367 -0
- package/dist/src/terminal-authority-policy.js.map +1 -0
- package/dist/src/terminal-binding-authority.d.ts +118 -0
- package/dist/src/terminal-binding-authority.js +245 -0
- package/dist/src/terminal-binding-authority.js.map +1 -0
- package/dist/src/terminal-binding-reconciliation-service.d.ts +75 -0
- package/dist/src/terminal-binding-reconciliation-service.js +73 -0
- package/dist/src/terminal-binding-reconciliation-service.js.map +1 -0
- package/dist/src/terminal-command-cli-adapter.d.ts +380 -0
- package/dist/src/terminal-command-cli-adapter.js +3288 -0
- package/dist/src/terminal-command-cli-adapter.js.map +1 -0
- package/dist/src/terminal-control-ref.d.ts +4 -0
- package/dist/src/terminal-control-ref.js +11 -8
- package/dist/src/terminal-control-ref.js.map +1 -1
- package/dist/src/terminal-delegate-cli-adapter.d.ts +41 -0
- package/dist/src/terminal-delegate-cli-adapter.js +242 -0
- package/dist/src/terminal-delegate-cli-adapter.js.map +1 -0
- package/dist/src/terminal-dispatch-abort.d.ts +22 -0
- package/dist/src/terminal-dispatch-abort.js +30 -0
- package/dist/src/terminal-dispatch-abort.js.map +1 -0
- package/dist/src/terminal-dispatch-application.d.ts +115 -0
- package/dist/src/terminal-dispatch-application.js +478 -0
- package/dist/src/terminal-dispatch-application.js.map +1 -0
- package/dist/src/terminal-dispatch-capability.d.ts +63 -0
- package/dist/src/terminal-dispatch-capability.js +133 -0
- package/dist/src/terminal-dispatch-capability.js.map +1 -0
- package/dist/src/terminal-dispatch-completion-cli-adapter.d.ts +22 -0
- package/dist/src/terminal-dispatch-completion-cli-adapter.js +96 -0
- package/dist/src/terminal-dispatch-completion-cli-adapter.js.map +1 -0
- package/dist/src/terminal-dispatch-composition.d.ts +79 -0
- package/dist/src/terminal-dispatch-composition.js +2 -0
- package/dist/src/terminal-dispatch-composition.js.map +1 -0
- package/dist/src/terminal-dispatch-execution.d.ts +290 -0
- package/dist/src/terminal-dispatch-execution.js +916 -0
- package/dist/src/terminal-dispatch-execution.js.map +1 -0
- package/dist/src/terminal-dispatch-ledger-codec.d.ts +110 -0
- package/dist/src/terminal-dispatch-ledger-codec.js +399 -0
- package/dist/src/terminal-dispatch-ledger-codec.js.map +1 -0
- package/dist/src/terminal-dispatch-policy.d.ts +93 -0
- package/dist/src/terminal-dispatch-policy.js +122 -0
- package/dist/src/terminal-dispatch-policy.js.map +1 -0
- package/dist/src/terminal-dispatch-presenter.d.ts +65 -0
- package/dist/src/terminal-dispatch-presenter.js +258 -0
- package/dist/src/terminal-dispatch-presenter.js.map +1 -0
- package/dist/src/terminal-dispatch-receipt.d.ts +79 -0
- package/dist/src/terminal-dispatch-receipt.js +314 -0
- package/dist/src/terminal-dispatch-receipt.js.map +1 -0
- package/dist/src/terminal-dispatch-recovery-cli-adapter.d.ts +132 -0
- package/dist/src/terminal-dispatch-recovery-cli-adapter.js +1330 -0
- package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -0
- package/dist/src/terminal-dispatch-recovery-service.d.ts +271 -0
- package/dist/src/terminal-dispatch-recovery-service.js +374 -0
- package/dist/src/terminal-dispatch-recovery-service.js.map +1 -0
- package/dist/src/terminal-dispatch-repository-cli-adapter.d.ts +35 -0
- package/dist/src/terminal-dispatch-repository-cli-adapter.js +483 -0
- package/dist/src/terminal-dispatch-repository-cli-adapter.js.map +1 -0
- package/dist/src/terminal-handoff-application-service.d.ts +7 -0
- package/dist/src/terminal-handoff-application-service.js +18 -0
- package/dist/src/terminal-handoff-application-service.js.map +1 -0
- package/dist/src/terminal-handoff-cli-adapter.d.ts +229 -0
- package/dist/src/terminal-handoff-cli-adapter.js +1389 -0
- package/dist/src/terminal-handoff-cli-adapter.js.map +1 -0
- package/dist/src/terminal-handoff-facts.d.ts +12 -0
- package/dist/src/terminal-handoff-facts.js +16 -0
- package/dist/src/terminal-handoff-facts.js.map +1 -0
- package/dist/src/terminal-identity-authority-cli-adapter.d.ts +318 -0
- package/dist/src/terminal-identity-authority-cli-adapter.js +1072 -0
- package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -0
- package/dist/src/terminal-identity-authority-service.d.ts +48 -0
- package/dist/src/terminal-identity-authority-service.js +45 -0
- package/dist/src/terminal-identity-authority-service.js.map +1 -0
- package/dist/src/terminal-list-cli-adapter.d.ts +274 -0
- package/dist/src/terminal-list-cli-adapter.js +2444 -0
- package/dist/src/terminal-list-cli-adapter.js.map +1 -0
- package/dist/src/terminal-list-renderer.d.ts +34 -0
- package/dist/src/terminal-list-renderer.js +643 -0
- package/dist/src/terminal-list-renderer.js.map +1 -0
- package/dist/src/terminal-maintenance-cli-adapter.d.ts +102 -0
- package/dist/src/terminal-maintenance-cli-adapter.js +1059 -0
- package/dist/src/terminal-maintenance-cli-adapter.js.map +1 -0
- package/dist/src/terminal-monitor-application-service.d.ts +275 -0
- package/dist/src/terminal-monitor-application-service.js +982 -0
- package/dist/src/terminal-monitor-application-service.js.map +1 -0
- package/dist/src/terminal-monitor-cli-adapter.d.ts +130 -0
- package/dist/src/terminal-monitor-cli-adapter.js +442 -0
- package/dist/src/terminal-monitor-cli-adapter.js.map +1 -0
- package/dist/src/terminal-monitor-decision-policy.d.ts +98 -0
- package/dist/src/terminal-monitor-decision-policy.js +246 -0
- package/dist/src/terminal-monitor-decision-policy.js.map +1 -0
- package/dist/src/terminal-monitor-launch-plan.d.ts +45 -0
- package/dist/src/terminal-monitor-launch-plan.js +94 -0
- package/dist/src/terminal-monitor-launch-plan.js.map +1 -0
- package/dist/src/terminal-monitor-ownership-policy.d.ts +31 -0
- package/dist/src/terminal-monitor-ownership-policy.js +64 -0
- package/dist/src/terminal-monitor-ownership-policy.js.map +1 -0
- package/dist/src/terminal-monitor-poll-policy.d.ts +48 -0
- package/dist/src/terminal-monitor-poll-policy.js +67 -0
- package/dist/src/terminal-monitor-poll-policy.js.map +1 -0
- package/dist/src/terminal-monitor-reconciliation-eligibility.d.ts +53 -0
- package/dist/src/terminal-monitor-reconciliation-eligibility.js +114 -0
- package/dist/src/terminal-monitor-reconciliation-eligibility.js.map +1 -0
- package/dist/src/terminal-monitor-state-cli-adapter.d.ts +106 -0
- package/dist/src/terminal-monitor-state-cli-adapter.js +1492 -0
- package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -0
- package/dist/src/terminal-monitor-state-reconciliation-service.d.ts +87 -0
- package/dist/src/terminal-monitor-state-reconciliation-service.js +106 -0
- package/dist/src/terminal-monitor-state-reconciliation-service.js.map +1 -0
- package/dist/src/terminal-monitor-supervision-cli-adapter.d.ts +122 -0
- package/dist/src/terminal-monitor-supervision-cli-adapter.js +685 -0
- package/dist/src/terminal-monitor-supervision-cli-adapter.js.map +1 -0
- package/dist/src/terminal-process-facts.d.ts +2 -0
- package/dist/src/terminal-process-facts.js +19 -0
- package/dist/src/terminal-process-facts.js.map +1 -0
- package/dist/src/terminal-process-source.d.ts +6 -4
- package/dist/src/terminal-process-source.js +25 -20
- package/dist/src/terminal-process-source.js.map +1 -1
- package/dist/src/terminal-runtime-cli-adapter.d.ts +80 -0
- package/dist/src/terminal-runtime-cli-adapter.js +488 -0
- package/dist/src/terminal-runtime-cli-adapter.js.map +1 -0
- package/dist/src/terminal-scoped-approval-authority.d.ts +62 -0
- package/dist/src/terminal-scoped-approval-authority.js +281 -0
- package/dist/src/terminal-scoped-approval-authority.js.map +1 -0
- package/dist/src/terminal-selector-projection-service.d.ts +26 -0
- package/dist/src/terminal-selector-projection-service.js +81 -0
- package/dist/src/terminal-selector-projection-service.js.map +1 -0
- package/dist/src/terminal-status-cli-adapter.d.ts +126 -0
- package/dist/src/terminal-status-cli-adapter.js +577 -0
- package/dist/src/terminal-status-cli-adapter.js.map +1 -0
- package/dist/src/terminal-status-facts.d.ts +56 -0
- package/dist/src/terminal-status-facts.js +199 -0
- package/dist/src/terminal-status-facts.js.map +1 -0
- package/dist/src/terminal-submission-acceptance.d.ts +62 -145
- package/dist/src/terminal-submission-acceptance.js +555 -222
- package/dist/src/terminal-submission-acceptance.js.map +1 -1
- package/dist/src/terminal-submission-facts.d.ts +123 -0
- package/dist/src/terminal-submission-facts.js +205 -0
- package/dist/src/terminal-submission-facts.js.map +1 -0
- package/dist/src/terminal-turn-binding-authority-cli-adapter.d.ts +14 -0
- package/dist/src/terminal-turn-binding-authority-cli-adapter.js +90 -0
- package/dist/src/terminal-turn-binding-authority-cli-adapter.js.map +1 -0
- package/dist/src/terminal-watch-callback-cli-adapter.d.ts +20 -0
- package/dist/src/terminal-watch-callback-cli-adapter.js +55 -0
- package/dist/src/terminal-watch-callback-cli-adapter.js.map +1 -0
- package/dist/src/terminal-watch-cli-adapter.d.ts +64 -0
- package/dist/src/terminal-watch-cli-adapter.js +508 -0
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -0
- package/dist/src/terminal-watch-service.d.ts +97 -0
- package/dist/src/terminal-watch-service.js +714 -0
- package/dist/src/terminal-watch-service.js.map +1 -0
- package/dist/src/terminal-watch-store.d.ts +149 -0
- package/dist/src/terminal-watch-store.js +861 -0
- package/dist/src/terminal-watch-store.js.map +1 -0
- package/dist/src/value-guards.d.ts +4 -0
- package/dist/src/value-guards.js +12 -0
- package/dist/src/value-guards.js.map +1 -0
- package/dist/src/verified-dead-agent-policy.d.ts +192 -0
- package/dist/src/verified-dead-agent-policy.js +262 -0
- package/dist/src/verified-dead-agent-policy.js.map +1 -0
- package/docs/quickstart-herdr.md +8 -0
- package/docs/quickstart-tmux.md +33 -6
- package/openclaw.plugin.json +11 -3
- package/package.json +3 -1
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +58 -40
|
@@ -0,0 +1,795 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { canonicalJson } from "./canonical-json.js";
|
|
4
|
+
import { isExactNativeThreadId, managedSessionBindingToken, managedSessionRevision, managedSessionStatesFromConversations } from "./managed-session.js";
|
|
5
|
+
import { executorForConversation, isTerminalDispatchOwnerReleasedStatus, sessionIdForConversation, turnIdForConversation } from "./protocol.js";
|
|
6
|
+
import { listManagedSessions, loadManagedSession, loadNativeThreadTransition } from "./session-store.js";
|
|
7
|
+
import { candidateSourceRootAuthorityMatches, exactBoundCodexSendSource, terminalControlsShareIncarnation } from "./terminal-authority-policy.js";
|
|
8
|
+
import { terminalControlEvidenceMatches, terminalEndpointFromControlRef } from "./terminal-control-ref.js";
|
|
9
|
+
import { terminalDispatchReceiptHistory as terminalLedgerReceiptHistory } from "./terminal-dispatch-ledger-codec.js";
|
|
10
|
+
import { terminalActionFingerprint } from "./native-thread-resume-snapshot-policy.js";
|
|
11
|
+
import { terminalBridgeRequestFingerprint, terminalBridgeSubmission, terminalBridgeSubmissionReceipts } from "./terminal-dispatch-receipt.js";
|
|
12
|
+
import { pathsForConversation, pathsForConversationDir } from "./store.js";
|
|
13
|
+
import { validTerminalMonitorTimestampMs as validTimestampMs } from "./terminal-monitor-decision-policy.js";
|
|
14
|
+
import { isRecord, nonBlankString as stringValue } from "./value-guards.js";
|
|
15
|
+
const TERMINAL_INPUT_EVIDENCE_FIELDS = [
|
|
16
|
+
"text_injected_at",
|
|
17
|
+
"enter_dispatched_at",
|
|
18
|
+
"submitted_at",
|
|
19
|
+
"agent_accepted_at",
|
|
20
|
+
"not_accepted_at",
|
|
21
|
+
"uncertain_at",
|
|
22
|
+
"acceptance_evidence"
|
|
23
|
+
];
|
|
24
|
+
function required(value, message) {
|
|
25
|
+
if (value === undefined || value === null || value === "") {
|
|
26
|
+
throw new Error(message);
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
export function codexCandidateInventoryHasNoOtherManagedClaim(ports, { storeDir, inventory, sourceSessionId, includeDetached = true }) {
|
|
31
|
+
const candidateIds = new Set(inventory.roots.map((root) => root.sessionId.toLowerCase()));
|
|
32
|
+
return !listManagedSessions(storeDir).some((session) => session.session_id !== sourceSessionId &&
|
|
33
|
+
(includeDetached || session.status !== "detached") &&
|
|
34
|
+
isExactNativeThreadId(session.binding?.native_thread_id) &&
|
|
35
|
+
candidateIds.has(session.binding.native_thread_id.toLowerCase()));
|
|
36
|
+
}
|
|
37
|
+
function hasExactReleasedAbortEnvelope(context) {
|
|
38
|
+
const { ports, session, turn, binding, takeover, submission, terminalControl, messageId } = context;
|
|
39
|
+
if (session.status !== "bound" ||
|
|
40
|
+
session.agent !== "codex" ||
|
|
41
|
+
!binding ||
|
|
42
|
+
!isExactNativeThreadId(binding.native_thread_id) ||
|
|
43
|
+
!isTerminalDispatchOwnerReleasedStatus(turn.status) ||
|
|
44
|
+
ports.turn.needsAttention(turn) ||
|
|
45
|
+
isRecord(turn.callback_delivery) ||
|
|
46
|
+
isRecord(turn.terminal_bridge_completion_claim) ||
|
|
47
|
+
!takeover ||
|
|
48
|
+
isRecord(takeover.terminal_bridge_completion_claim) ||
|
|
49
|
+
!submission ||
|
|
50
|
+
!terminalControl ||
|
|
51
|
+
!messageId) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
function hasExactReleasedAbortStage(context) {
|
|
57
|
+
const { submission, preparedAt, abortedAt } = context;
|
|
58
|
+
if (submission.status !== "aborted" ||
|
|
59
|
+
submission.safe_to_retry !== true ||
|
|
60
|
+
stringValue(submission.last_proven_stage) !== "prepared" ||
|
|
61
|
+
!preparedAt ||
|
|
62
|
+
!abortedAt ||
|
|
63
|
+
!validTimestampMs(preparedAt) ||
|
|
64
|
+
!validTimestampMs(abortedAt) ||
|
|
65
|
+
Date.parse(abortedAt) < Date.parse(preparedAt) ||
|
|
66
|
+
TERMINAL_INPUT_EVIDENCE_FIELDS.some((field) => submission[field] !== undefined)) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
function releasedAbortRequestMatches(context) {
|
|
72
|
+
const { takeover, submission, messageId } = context;
|
|
73
|
+
return stringValue(takeover.terminal_bridge_message_id) === messageId &&
|
|
74
|
+
stringValue(takeover.terminal_bridge_request_hash) ===
|
|
75
|
+
stringValue(submission.request_hash) &&
|
|
76
|
+
terminalBridgeRequestFingerprint(stringValue(takeover.terminal_bridge_request_text) ?? "") === stringValue(submission.request_hash);
|
|
77
|
+
}
|
|
78
|
+
function releasedAbortConversationMatches(context) {
|
|
79
|
+
const { session, turn, submission } = context;
|
|
80
|
+
return executorForConversation(turn).kind === "codex" &&
|
|
81
|
+
sessionIdForConversation(turn) === session.session_id &&
|
|
82
|
+
stringValue(submission.session_id) === session.session_id &&
|
|
83
|
+
stringValue(submission.turn_id) === turnIdForConversation(turn) &&
|
|
84
|
+
stringValue(submission.executor_kind) === "codex" &&
|
|
85
|
+
stringValue(submission.openclaw_session) === turn.openclaw_session;
|
|
86
|
+
}
|
|
87
|
+
function releasedAbortBindingMatches(context) {
|
|
88
|
+
const { turn, binding, takeover, submission } = context;
|
|
89
|
+
return stringValue(turn.terminal_binding_id) === binding.binding_id &&
|
|
90
|
+
Number(turn.terminal_binding_generation) === binding.generation &&
|
|
91
|
+
stringValue(takeover.terminal_binding_id) === binding.binding_id &&
|
|
92
|
+
Number(takeover.terminal_binding_generation) === binding.generation &&
|
|
93
|
+
stringValue(submission.binding_id) === binding.binding_id &&
|
|
94
|
+
Number(submission.binding_generation) === binding.generation &&
|
|
95
|
+
stringValue(turn.native_thread_id) === binding.native_thread_id &&
|
|
96
|
+
stringValue(takeover.terminal_agent_session_id) ===
|
|
97
|
+
binding.native_thread_id &&
|
|
98
|
+
stringValue(submission.native_thread_id) === binding.native_thread_id;
|
|
99
|
+
}
|
|
100
|
+
function releasedAbortProcessAndControlMatches(context) {
|
|
101
|
+
const { session, turn, binding, takeover, submission, terminalControl } = context;
|
|
102
|
+
return Number(takeover.terminal_agent_pid) === binding.native_process.pid &&
|
|
103
|
+
stringValue(takeover.terminal_agent_process_uuid) ===
|
|
104
|
+
binding.native_process.process_uuid &&
|
|
105
|
+
stringValue(takeover.terminal_agent_process_birth) ===
|
|
106
|
+
binding.native_process.process_birth &&
|
|
107
|
+
terminalControlsShareIncarnation(terminalControl, binding.terminal_control) &&
|
|
108
|
+
terminalControlEvidenceMatches(submission.terminal_endpoint ?? terminalControl, binding.terminal_control) &&
|
|
109
|
+
path.resolve(turn.workspace) === path.resolve(session.workspace);
|
|
110
|
+
}
|
|
111
|
+
function releasedAbortPathsMatch(context, canonical) {
|
|
112
|
+
const { ports, storeDir, turn, submission } = context;
|
|
113
|
+
return path.resolve(stringValue(turn.state_path) ?? "") ===
|
|
114
|
+
path.resolve(canonical.statePath) &&
|
|
115
|
+
path.resolve(stringValue(turn.event_log_path) ?? "") ===
|
|
116
|
+
path.resolve(canonical.logPath) &&
|
|
117
|
+
path.resolve(ports.turn.storeDir(turn) ?? "") === path.resolve(storeDir) &&
|
|
118
|
+
path.resolve(stringValue(submission.store_dir) ?? "") ===
|
|
119
|
+
path.resolve(storeDir);
|
|
120
|
+
}
|
|
121
|
+
function exactReleasedSafeAbortedCandidateTurn(ports, { storeDir, session, turn }) {
|
|
122
|
+
const binding = session.binding;
|
|
123
|
+
const takeover = isRecord(turn.native_session_takeover)
|
|
124
|
+
? turn.native_session_takeover
|
|
125
|
+
: undefined;
|
|
126
|
+
const submission = terminalBridgeSubmission(turn);
|
|
127
|
+
const terminalControl = ports.turn.terminalControl(takeover);
|
|
128
|
+
const messageId = stringValue(submission?.message_id);
|
|
129
|
+
const preparedAt = stringValue(submission?.prepared_at);
|
|
130
|
+
const abortedAt = stringValue(submission?.aborted_at);
|
|
131
|
+
const context = {
|
|
132
|
+
ports,
|
|
133
|
+
storeDir,
|
|
134
|
+
session,
|
|
135
|
+
turn,
|
|
136
|
+
binding,
|
|
137
|
+
takeover,
|
|
138
|
+
submission,
|
|
139
|
+
terminalControl,
|
|
140
|
+
messageId,
|
|
141
|
+
preparedAt,
|
|
142
|
+
abortedAt
|
|
143
|
+
};
|
|
144
|
+
if (!hasExactReleasedAbortEnvelope(context) ||
|
|
145
|
+
!hasExactReleasedAbortStage(context) ||
|
|
146
|
+
!releasedAbortRequestMatches(context) ||
|
|
147
|
+
!releasedAbortConversationMatches(context) ||
|
|
148
|
+
!releasedAbortBindingMatches(context) ||
|
|
149
|
+
!releasedAbortProcessAndControlMatches(context)) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
const canonical = pathsForConversation(turn.conversation_id, storeDir);
|
|
153
|
+
if (!releasedAbortPathsMatch(context, canonical)) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const matchingReceipts = terminalBridgeSubmissionReceipts(turn).filter((receipt) => stringValue(receipt.message_id) === messageId);
|
|
157
|
+
return matchingReceipts.length === 1 &&
|
|
158
|
+
canonicalJson(matchingReceipts[0]) === canonicalJson(submission);
|
|
159
|
+
}
|
|
160
|
+
export function deferredCandidateSourceTurnHistory(ports, storeDir, session) {
|
|
161
|
+
const binding = session.binding;
|
|
162
|
+
if (!binding?.native_thread_id) {
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
const turns = currentCandidateBindingTurns(binding, ports.turn.turnsForSession(storeDir, session.session_id));
|
|
166
|
+
if (!turns || turns.some((turn) => {
|
|
167
|
+
const callbackDelivered = isRecord(turn.callback_delivery) &&
|
|
168
|
+
turn.callback_delivery.status === "delivered";
|
|
169
|
+
const explicitlyAbandonedUncertain = exactExplicitlyAbandonedUncertainCandidateTurn(ports, {
|
|
170
|
+
storeDir,
|
|
171
|
+
session,
|
|
172
|
+
turn
|
|
173
|
+
});
|
|
174
|
+
const safelyAbortedBeforeInput = exactReleasedSafeAbortedCandidateTurn(ports, {
|
|
175
|
+
storeDir,
|
|
176
|
+
session,
|
|
177
|
+
turn
|
|
178
|
+
});
|
|
179
|
+
return (!isTerminalDispatchOwnerReleasedStatus(turn.status) ||
|
|
180
|
+
ports.turn.needsAttention(turn) ||
|
|
181
|
+
(isRecord(turn.callback_delivery) &&
|
|
182
|
+
!callbackDelivered) ||
|
|
183
|
+
(Boolean(turn.gateway_method) &&
|
|
184
|
+
!callbackDelivered &&
|
|
185
|
+
!explicitlyAbandonedUncertain &&
|
|
186
|
+
!safelyAbortedBeforeInput));
|
|
187
|
+
})) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
return turns
|
|
191
|
+
.map((turn) => ({
|
|
192
|
+
turn_id: turnIdForConversation(turn),
|
|
193
|
+
status: turn.status,
|
|
194
|
+
updated_at: required(stringValue(turn.updated_at), `managed Turn ${turnIdForConversation(turn)} updated_at is unavailable`),
|
|
195
|
+
binding_id: binding.binding_id,
|
|
196
|
+
binding_generation: binding.generation,
|
|
197
|
+
native_thread_id: binding.native_thread_id,
|
|
198
|
+
turn_fingerprint: createHash("sha256")
|
|
199
|
+
.update(JSON.stringify(turn))
|
|
200
|
+
.digest("hex")
|
|
201
|
+
}))
|
|
202
|
+
.sort((left, right) => left.turn_id.localeCompare(right.turn_id));
|
|
203
|
+
}
|
|
204
|
+
function frozenCandidateSourceTurnHistory(ports, storeDir, session) {
|
|
205
|
+
const binding = session.binding;
|
|
206
|
+
if (!binding?.native_thread_id) {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
const turns = currentCandidateBindingTurns(binding, ports.turn.turnsForSession(storeDir, session.session_id));
|
|
210
|
+
if (!turns || turns.some((turn) => !isTerminalDispatchOwnerReleasedStatus(turn.status))) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
return turns.map((turn) => ({
|
|
214
|
+
turn_id: turnIdForConversation(turn),
|
|
215
|
+
status: turn.status,
|
|
216
|
+
updated_at: required(stringValue(turn.updated_at), `managed Turn ${turnIdForConversation(turn)} updated_at is unavailable`),
|
|
217
|
+
binding_id: binding.binding_id,
|
|
218
|
+
binding_generation: binding.generation,
|
|
219
|
+
native_thread_id: binding.native_thread_id,
|
|
220
|
+
turn_fingerprint: createHash("sha256")
|
|
221
|
+
.update(JSON.stringify(turn))
|
|
222
|
+
.digest("hex")
|
|
223
|
+
})).sort((left, right) => left.turn_id.localeCompare(right.turn_id));
|
|
224
|
+
}
|
|
225
|
+
function candidateTurnNativeThreadId(turn) {
|
|
226
|
+
return stringValue(turn.native_thread_id) ??
|
|
227
|
+
stringValue(isRecord(turn.native_session_takeover)
|
|
228
|
+
? turn.native_session_takeover.terminal_agent_session_id
|
|
229
|
+
: undefined);
|
|
230
|
+
}
|
|
231
|
+
function candidateTurnMatchesCurrentBinding(turn, binding) {
|
|
232
|
+
return stringValue(turn.terminal_binding_id) === binding.binding_id &&
|
|
233
|
+
Number(turn.terminal_binding_generation) === binding.generation &&
|
|
234
|
+
candidateTurnNativeThreadId(turn) === binding.native_thread_id;
|
|
235
|
+
}
|
|
236
|
+
function candidateTurnHasStrictEarlierBinding(turn, binding) {
|
|
237
|
+
const turnBindingId = stringValue(turn.terminal_binding_id);
|
|
238
|
+
const turnBindingGeneration = Number(turn.terminal_binding_generation);
|
|
239
|
+
const turnNativeThreadId = stringValue(turn.native_thread_id);
|
|
240
|
+
const takeover = isRecord(turn.native_session_takeover)
|
|
241
|
+
? turn.native_session_takeover
|
|
242
|
+
: undefined;
|
|
243
|
+
if (turnBindingId &&
|
|
244
|
+
Number.isSafeInteger(turnBindingGeneration) &&
|
|
245
|
+
turnBindingGeneration >= 1 &&
|
|
246
|
+
isExactNativeThreadId(turnNativeThreadId)) {
|
|
247
|
+
const nestedBindingId = stringValue(takeover?.terminal_binding_id);
|
|
248
|
+
const nestedBindingGeneration = takeover?.terminal_binding_generation ===
|
|
249
|
+
undefined
|
|
250
|
+
? undefined
|
|
251
|
+
: Number(takeover.terminal_binding_generation);
|
|
252
|
+
const nestedNativeThreadIds = [
|
|
253
|
+
takeover?.terminal_agent_expected_session_id,
|
|
254
|
+
takeover?.terminal_agent_session_id
|
|
255
|
+
].filter((value) => value !== undefined);
|
|
256
|
+
if ((takeover?.terminal_binding_id !== undefined &&
|
|
257
|
+
nestedBindingId !== turnBindingId) ||
|
|
258
|
+
(nestedBindingGeneration !== undefined &&
|
|
259
|
+
nestedBindingGeneration !== turnBindingGeneration) ||
|
|
260
|
+
nestedNativeThreadIds.some((value) => stringValue(value) !== turnNativeThreadId)) {
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
return turnBindingId !== binding.binding_id &&
|
|
264
|
+
turnBindingGeneration < binding.generation;
|
|
265
|
+
}
|
|
266
|
+
const hasNoPersistedBindingIdentity = turn.terminal_binding_id === undefined &&
|
|
267
|
+
turn.terminal_binding_generation === undefined &&
|
|
268
|
+
turn.native_thread_id === undefined &&
|
|
269
|
+
takeover?.terminal_binding_id === undefined &&
|
|
270
|
+
takeover?.terminal_binding_generation === undefined;
|
|
271
|
+
if (!hasNoPersistedBindingIdentity) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const migrated = managedSessionStatesFromConversations([turn])[0];
|
|
276
|
+
const migratedBinding = migrated?.status === "bound"
|
|
277
|
+
? migrated.binding
|
|
278
|
+
: undefined;
|
|
279
|
+
return Boolean(migratedBinding &&
|
|
280
|
+
migratedBinding.binding_id !== binding.binding_id &&
|
|
281
|
+
migratedBinding.generation < binding.generation &&
|
|
282
|
+
isExactNativeThreadId(migratedBinding.native_thread_id));
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Keep the mutable authority fingerprint scoped to the current binding epoch.
|
|
290
|
+
* A released Turn from a strictly earlier binding epoch no longer owns current
|
|
291
|
+
* terminal input. Its callback and notification recovery remain independent
|
|
292
|
+
* concerns; any ambiguous binding or non-released Turn still fails closed.
|
|
293
|
+
*/
|
|
294
|
+
function currentCandidateBindingTurns(binding, turns) {
|
|
295
|
+
const current = [];
|
|
296
|
+
for (const turn of turns) {
|
|
297
|
+
if (candidateTurnMatchesCurrentBinding(turn, binding)) {
|
|
298
|
+
current.push(turn);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (!isTerminalDispatchOwnerReleasedStatus(turn.status) ||
|
|
302
|
+
!candidateTurnHasStrictEarlierBinding(turn, binding)) {
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return current;
|
|
307
|
+
}
|
|
308
|
+
function exactExplicitlyAbandonedUncertainCandidateTurn(ports, { storeDir, session, turn }) {
|
|
309
|
+
return explicitlyAbandonedUncertainCandidateTurnFingerprint(ports, {
|
|
310
|
+
storeDir,
|
|
311
|
+
session,
|
|
312
|
+
turn
|
|
313
|
+
}) !== undefined;
|
|
314
|
+
}
|
|
315
|
+
function hasExplicitCandidateClose(turn) {
|
|
316
|
+
return turn.status === "closed" &&
|
|
317
|
+
!isRecord(turn.callback_delivery) &&
|
|
318
|
+
!isRecord(turn.terminal_bridge_completion_claim) &&
|
|
319
|
+
Boolean(stringValue(turn.closed_at)) &&
|
|
320
|
+
Boolean(stringValue(turn.close_reason));
|
|
321
|
+
}
|
|
322
|
+
function hasUncertainCandidateEnvelope(context) {
|
|
323
|
+
const { session, turn, takeover, submission, terminalControl, messageId } = context;
|
|
324
|
+
if (!takeover ||
|
|
325
|
+
isRecord(takeover.terminal_bridge_completion_claim) ||
|
|
326
|
+
!terminalControl ||
|
|
327
|
+
submission?.status !== "uncertain" ||
|
|
328
|
+
submission.safe_to_retry === true ||
|
|
329
|
+
!messageId ||
|
|
330
|
+
stringValue(takeover.terminal_bridge_message_id) !== messageId ||
|
|
331
|
+
stringValue(submission.session_id) !== session.session_id ||
|
|
332
|
+
stringValue(submission.turn_id) !== turnIdForConversation(turn)) {
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
function uncertainCandidatePathsMatch(context, canonical) {
|
|
338
|
+
const { ports, storeDir, turn } = context;
|
|
339
|
+
return path.resolve(stringValue(turn.state_path) ?? "") ===
|
|
340
|
+
path.resolve(canonical.statePath) &&
|
|
341
|
+
path.resolve(stringValue(turn.event_log_path) ?? "") ===
|
|
342
|
+
path.resolve(canonical.logPath) &&
|
|
343
|
+
path.resolve(ports.turn.storeDir(turn) ?? "") === path.resolve(storeDir);
|
|
344
|
+
}
|
|
345
|
+
function tryLoadAbandonmentLedger(ports, terminalControl, ledgerOverride) {
|
|
346
|
+
try {
|
|
347
|
+
return ledgerOverride ?? ports.ledger.load(terminalControl);
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
return undefined;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function resolvedAbandonmentLedgerMatches(ledger, context, canonical) {
|
|
354
|
+
const { storeDir, session, turn, submission, messageId } = context;
|
|
355
|
+
return ledger.status === "resolved" &&
|
|
356
|
+
ledger.reason === "conversation explicitly closed by request" &&
|
|
357
|
+
Boolean(validTimestampMs(ledger.resolved_at)) &&
|
|
358
|
+
stringValue(ledger.conversation_id) === turn.conversation_id &&
|
|
359
|
+
stringValue(ledger.session_id) === session.session_id &&
|
|
360
|
+
stringValue(ledger.turn_id) === turnIdForConversation(turn) &&
|
|
361
|
+
stringValue(ledger.message_id) === messageId &&
|
|
362
|
+
stringValue(ledger.request_hash) === stringValue(submission.request_hash) &&
|
|
363
|
+
stringValue(ledger.binding_id) === stringValue(turn.terminal_binding_id) &&
|
|
364
|
+
Number(ledger.binding_generation) ===
|
|
365
|
+
Number(turn.terminal_binding_generation) &&
|
|
366
|
+
path.resolve(stringValue(ledger.state_path) ?? "") ===
|
|
367
|
+
path.resolve(canonical.statePath) &&
|
|
368
|
+
path.resolve(stringValue(ledger.event_log_path) ?? "") ===
|
|
369
|
+
path.resolve(canonical.logPath) &&
|
|
370
|
+
path.resolve(stringValue(ledger.store_dir) ?? "") === path.resolve(storeDir);
|
|
371
|
+
}
|
|
372
|
+
function uniqueAbandonmentReceipt(ledger, messageId) {
|
|
373
|
+
try {
|
|
374
|
+
const matchingReceipts = terminalLedgerReceiptHistory(ledger).filter((candidate) => stringValue(candidate.message_id) === messageId);
|
|
375
|
+
return matchingReceipts.length === 1
|
|
376
|
+
? matchingReceipts[0]
|
|
377
|
+
: undefined;
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return undefined;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
function uncertainAbandonmentReceiptMatches(receipt, context, canonical) {
|
|
384
|
+
const { ports, storeDir, session, turn, submission, terminalControl } = context;
|
|
385
|
+
if (!receipt ||
|
|
386
|
+
receipt.status !== "uncertain" ||
|
|
387
|
+
receipt.safe_to_retry === true ||
|
|
388
|
+
!validTimestampMs(receipt.uncertain_at) ||
|
|
389
|
+
!ports.ledger.matchesControl(receipt, terminalControl) ||
|
|
390
|
+
stringValue(receipt.conversation_id) !== turn.conversation_id ||
|
|
391
|
+
stringValue(receipt.session_id) !== session.session_id ||
|
|
392
|
+
stringValue(receipt.turn_id) !== turnIdForConversation(turn) ||
|
|
393
|
+
stringValue(receipt.request_hash) !== stringValue(submission.request_hash) ||
|
|
394
|
+
stringValue(receipt.binding_id) !== stringValue(turn.terminal_binding_id) ||
|
|
395
|
+
Number(receipt.binding_generation) !==
|
|
396
|
+
Number(turn.terminal_binding_generation) ||
|
|
397
|
+
path.resolve(stringValue(receipt.state_path) ?? "") !==
|
|
398
|
+
path.resolve(canonical.statePath) ||
|
|
399
|
+
path.resolve(stringValue(receipt.event_log_path) ?? "") !==
|
|
400
|
+
path.resolve(canonical.logPath) ||
|
|
401
|
+
path.resolve(stringValue(receipt.store_dir) ?? "") !== path.resolve(storeDir)) {
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
function tryFindExplicitCloseEvent(ports, turn, logPath) {
|
|
407
|
+
try {
|
|
408
|
+
return ports.turn.readEvents(logPath).find((event) => event.event === "conversation_closed" &&
|
|
409
|
+
event.conversation_id === turn.conversation_id &&
|
|
410
|
+
event.status === "closed" &&
|
|
411
|
+
event.ts === turn.closed_at &&
|
|
412
|
+
event.reason === turn.close_reason);
|
|
413
|
+
}
|
|
414
|
+
catch {
|
|
415
|
+
return undefined;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
function explicitlyAbandonedUncertainCandidateTurnProof(ports, { storeDir, session, turn, ledgerOverride, requireResolvedTopLevel = true }) {
|
|
419
|
+
if (!hasExplicitCandidateClose(turn)) {
|
|
420
|
+
return undefined;
|
|
421
|
+
}
|
|
422
|
+
const takeover = isRecord(turn.native_session_takeover)
|
|
423
|
+
? turn.native_session_takeover
|
|
424
|
+
: undefined;
|
|
425
|
+
const submission = terminalBridgeSubmission(turn);
|
|
426
|
+
const terminalControl = ports.turn.terminalControl(takeover);
|
|
427
|
+
const messageId = stringValue(submission?.message_id);
|
|
428
|
+
const context = {
|
|
429
|
+
ports,
|
|
430
|
+
storeDir,
|
|
431
|
+
session,
|
|
432
|
+
turn,
|
|
433
|
+
takeover,
|
|
434
|
+
submission,
|
|
435
|
+
terminalControl,
|
|
436
|
+
messageId
|
|
437
|
+
};
|
|
438
|
+
if (!hasUncertainCandidateEnvelope(context)) {
|
|
439
|
+
return undefined;
|
|
440
|
+
}
|
|
441
|
+
const canonical = pathsForConversation(turn.conversation_id, storeDir);
|
|
442
|
+
if (!uncertainCandidatePathsMatch(context, canonical)) {
|
|
443
|
+
return undefined;
|
|
444
|
+
}
|
|
445
|
+
const ledger = tryLoadAbandonmentLedger(ports, context.terminalControl, ledgerOverride);
|
|
446
|
+
if (!ledger ||
|
|
447
|
+
!ports.ledger.matchesControl(ledger, context.terminalControl) ||
|
|
448
|
+
(requireResolvedTopLevel &&
|
|
449
|
+
!resolvedAbandonmentLedgerMatches(ledger, context, canonical))) {
|
|
450
|
+
return undefined;
|
|
451
|
+
}
|
|
452
|
+
const receipt = uniqueAbandonmentReceipt(ledger, context.messageId);
|
|
453
|
+
if (!uncertainAbandonmentReceiptMatches(receipt, context, canonical)) {
|
|
454
|
+
return undefined;
|
|
455
|
+
}
|
|
456
|
+
const closeEvent = tryFindExplicitCloseEvent(ports, turn, canonical.logPath);
|
|
457
|
+
if (!closeEvent) {
|
|
458
|
+
return undefined;
|
|
459
|
+
}
|
|
460
|
+
// Hash the immutable close event and append-only uncertain receipt, not the
|
|
461
|
+
// mutable top-level terminal ledger that the next dispatch will replace.
|
|
462
|
+
return {
|
|
463
|
+
turnId: turnIdForConversation(turn),
|
|
464
|
+
messageId: context.messageId,
|
|
465
|
+
turnFingerprint: createHash("sha256")
|
|
466
|
+
.update(JSON.stringify(turn))
|
|
467
|
+
.digest("hex"),
|
|
468
|
+
closeEvent,
|
|
469
|
+
uncertainReceipt: receipt
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
function explicitlyAbandonedUncertainCandidateTurnFingerprint(ports, args) {
|
|
473
|
+
const proof = explicitlyAbandonedUncertainCandidateTurnProof(ports, args);
|
|
474
|
+
return proof
|
|
475
|
+
? terminalActionFingerprint({
|
|
476
|
+
kind: "explicitly_abandoned_uncertain_codex_turn",
|
|
477
|
+
source_session_id: args.session.session_id,
|
|
478
|
+
source_revision: managedSessionRevision(args.session),
|
|
479
|
+
source_binding_token: managedSessionBindingToken(args.session),
|
|
480
|
+
turn_id: proof.turnId,
|
|
481
|
+
turn_fingerprint: proof.turnFingerprint,
|
|
482
|
+
close_event: proof.closeEvent,
|
|
483
|
+
uncertain_receipt: proof.uncertainReceipt
|
|
484
|
+
})
|
|
485
|
+
: undefined;
|
|
486
|
+
}
|
|
487
|
+
export function explicitlyAbandonedCandidateSourceFingerprint(ports, { storeDir, session, sourceTurnHistory, dispatchSnapshot, sourceRevision = managedSessionRevision(session), sourceBindingToken = managedSessionBindingToken(session), ledgerOverride, requireResolvedTopLevel = true }) {
|
|
488
|
+
if (dispatchSnapshot.status !== "resolved") {
|
|
489
|
+
return undefined;
|
|
490
|
+
}
|
|
491
|
+
const abandonedTurnProofs = ports.turn.turnsForSession(storeDir, session.session_id).flatMap((turn) => {
|
|
492
|
+
const proof = explicitlyAbandonedUncertainCandidateTurnProof(ports, {
|
|
493
|
+
storeDir,
|
|
494
|
+
session,
|
|
495
|
+
turn,
|
|
496
|
+
ledgerOverride,
|
|
497
|
+
requireResolvedTopLevel
|
|
498
|
+
});
|
|
499
|
+
return proof
|
|
500
|
+
? [{
|
|
501
|
+
turn_id: proof.turnId,
|
|
502
|
+
message_id: proof.messageId,
|
|
503
|
+
turn_fingerprint: proof.turnFingerprint,
|
|
504
|
+
close_event: proof.closeEvent,
|
|
505
|
+
uncertain_receipt: proof.uncertainReceipt
|
|
506
|
+
}]
|
|
507
|
+
: [];
|
|
508
|
+
}).sort((left, right) => left.turn_id.localeCompare(right.turn_id));
|
|
509
|
+
if (abandonedTurnProofs.length === 0) {
|
|
510
|
+
return undefined;
|
|
511
|
+
}
|
|
512
|
+
return terminalActionFingerprint({
|
|
513
|
+
kind: "explicitly_abandoned_codex_predecessor",
|
|
514
|
+
source_session_id: session.session_id,
|
|
515
|
+
source_revision: sourceRevision,
|
|
516
|
+
source_binding_token: sourceBindingToken,
|
|
517
|
+
source_turn_history: sourceTurnHistory,
|
|
518
|
+
previous_dispatch_snapshot: dispatchSnapshot,
|
|
519
|
+
abandoned_turns: abandonedTurnProofs
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
export function assertFrozenExplicitlyAbandonedPredecessorAuthority(ports, { storeDir, transfer, terminalControl }) {
|
|
523
|
+
if (transfer.source_rollout_authority !==
|
|
524
|
+
"explicitly_abandoned_predecessor") {
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
const source = loadManagedSession(storeDir, transfer.source_session_id);
|
|
528
|
+
const sourceAsBound = {
|
|
529
|
+
...source,
|
|
530
|
+
status: "bound",
|
|
531
|
+
binding: transfer.source_before_binding,
|
|
532
|
+
last_transition_id: transfer.source_previous_last_transition_id
|
|
533
|
+
};
|
|
534
|
+
const history = frozenCandidateSourceTurnHistory(ports, storeDir, sourceAsBound);
|
|
535
|
+
const ledger = ports.ledger.load(terminalControl);
|
|
536
|
+
const fingerprint = history && ledger
|
|
537
|
+
? explicitlyAbandonedCandidateSourceFingerprint(ports, {
|
|
538
|
+
storeDir,
|
|
539
|
+
session: sourceAsBound,
|
|
540
|
+
sourceTurnHistory: history,
|
|
541
|
+
dispatchSnapshot: {
|
|
542
|
+
status: transfer.previous_dispatch_status,
|
|
543
|
+
fingerprint: transfer.previous_dispatch_fingerprint
|
|
544
|
+
},
|
|
545
|
+
sourceRevision: transfer.source_expected_revision,
|
|
546
|
+
sourceBindingToken: transfer.source_binding_token,
|
|
547
|
+
ledgerOverride: ledger,
|
|
548
|
+
requireResolvedTopLevel: false
|
|
549
|
+
})
|
|
550
|
+
: undefined;
|
|
551
|
+
if (!history ||
|
|
552
|
+
JSON.stringify(history) !== JSON.stringify(transfer.source_turn_history) ||
|
|
553
|
+
fingerprint !== transfer.source_abandonment_fingerprint) {
|
|
554
|
+
throw new Error(`deferred foreground transfer ${transfer.transfer_id} lost its exact ` +
|
|
555
|
+
"explicitly abandoned predecessor authority");
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
function candidateSourceTransitionHistoryIsTerminal(ports, storeDir, session) {
|
|
559
|
+
if (ports.transition.hasUnresolved(storeDir, session)) {
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
562
|
+
if (!session.last_transition_id) {
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
try {
|
|
566
|
+
const transition = loadNativeThreadTransition(storeDir, session.last_transition_id);
|
|
567
|
+
return ["committed", "aborted"].includes(transition.status) &&
|
|
568
|
+
(transition.source_session_id === session.session_id ||
|
|
569
|
+
transition.target_session_id === session.session_id);
|
|
570
|
+
}
|
|
571
|
+
catch {
|
|
572
|
+
return false;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
export function deferredCodexForegroundDispatchSnapshot(ports, terminalControl) {
|
|
576
|
+
const ledger = ports.ledger.load(terminalControl);
|
|
577
|
+
return deferredCodexForegroundDispatchSnapshotForLedger(ports, terminalControl, ledger);
|
|
578
|
+
}
|
|
579
|
+
function deferredCodexForegroundDispatchSnapshotForLedger(ports, terminalControl, ledger) {
|
|
580
|
+
if (!ledger) {
|
|
581
|
+
return {
|
|
582
|
+
status: "none",
|
|
583
|
+
fingerprint: terminalActionFingerprint({
|
|
584
|
+
kind: "deferred_codex_foreground_terminal_dispatch",
|
|
585
|
+
status: "none"
|
|
586
|
+
})
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
const currentAnchor = terminalEndpointFromControlRef(terminalControl).processAnchorPid;
|
|
590
|
+
const ledgerAnchor = ports.ledger.processAnchor(ledger);
|
|
591
|
+
if (ledger.status !== "resolved" ||
|
|
592
|
+
!Number.isSafeInteger(currentAnchor) ||
|
|
593
|
+
Number(currentAnchor) < 1 ||
|
|
594
|
+
ledgerAnchor !== currentAnchor ||
|
|
595
|
+
!ports.ledger.matchesControl(ledger, terminalControl, {
|
|
596
|
+
requireCurrentRoute: false,
|
|
597
|
+
requireProcessAnchor: true
|
|
598
|
+
})) {
|
|
599
|
+
throw new Error(`terminal ${terminalControl.target} does not have exact resolved ` +
|
|
600
|
+
"dispatch authority");
|
|
601
|
+
}
|
|
602
|
+
const resolvedAt = stringValue(ledger.resolved_at);
|
|
603
|
+
if (!resolvedAt || !Number.isFinite(Date.parse(resolvedAt))) {
|
|
604
|
+
throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has no ` +
|
|
605
|
+
"valid resolved_at");
|
|
606
|
+
}
|
|
607
|
+
const statePath = stringValue(ledger.state_path);
|
|
608
|
+
const ledgerStoreDir = stringValue(ledger.store_dir);
|
|
609
|
+
if (ledgerStoreDir && !path.isAbsolute(ledgerStoreDir)) {
|
|
610
|
+
throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has a ` +
|
|
611
|
+
"nonabsolute Store owner");
|
|
612
|
+
}
|
|
613
|
+
if (statePath) {
|
|
614
|
+
if (!ledgerStoreDir || !path.isAbsolute(statePath) ||
|
|
615
|
+
!path.isAbsolute(ledgerStoreDir)) {
|
|
616
|
+
throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has ` +
|
|
617
|
+
"incomplete Store authority");
|
|
618
|
+
}
|
|
619
|
+
const canonicalStatePath = path.resolve(statePath);
|
|
620
|
+
const canonicalStoreDir = path.resolve(ledgerStoreDir);
|
|
621
|
+
const canonical = pathsForConversationDir(path.dirname(canonicalStatePath));
|
|
622
|
+
if (path.resolve(canonical.statePath) !== canonicalStatePath ||
|
|
623
|
+
path.resolve(canonical.storeDir) !== canonicalStoreDir) {
|
|
624
|
+
throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has a ` +
|
|
625
|
+
"noncanonical Store/state owner");
|
|
626
|
+
}
|
|
627
|
+
const conversationId = stringValue(ledger.conversation_id);
|
|
628
|
+
if (conversationId &&
|
|
629
|
+
path.resolve(pathsForConversation(conversationId, canonicalStoreDir).statePath) !== canonicalStatePath) {
|
|
630
|
+
throw new Error(`terminal ${terminalControl.target} resolved dispatch receipt has a ` +
|
|
631
|
+
"mismatched conversation owner");
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
return {
|
|
635
|
+
status: "resolved",
|
|
636
|
+
fingerprint: terminalActionFingerprint({
|
|
637
|
+
kind: "deferred_codex_foreground_terminal_dispatch",
|
|
638
|
+
status: "resolved",
|
|
639
|
+
ledger
|
|
640
|
+
})
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
export function deferredCodexPreviousDispatchSnapshotMatches(ports, { transfer, terminalControl, ledger }) {
|
|
644
|
+
let snapshot;
|
|
645
|
+
try {
|
|
646
|
+
snapshot = deferredCodexForegroundDispatchSnapshotForLedger(ports, terminalControl, ledger);
|
|
647
|
+
}
|
|
648
|
+
catch {
|
|
649
|
+
return false;
|
|
650
|
+
}
|
|
651
|
+
return snapshot.status === transfer.previous_dispatch_status &&
|
|
652
|
+
snapshot.fingerprint === transfer.previous_dispatch_fingerprint;
|
|
653
|
+
}
|
|
654
|
+
function tryDeferredCodexForegroundDispatchSnapshot(ports, terminalControl) {
|
|
655
|
+
try {
|
|
656
|
+
return deferredCodexForegroundDispatchSnapshot(ports, terminalControl);
|
|
657
|
+
}
|
|
658
|
+
catch {
|
|
659
|
+
return undefined;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
function sourceTurnHistoryForAuthorityObservation(ports, { mode, storeDir, sourceSession, sourceKind, candidateInventory }) {
|
|
663
|
+
const candidateHistoryNeeded = sourceKind ===
|
|
664
|
+
"candidate_rollout_quiescent" &&
|
|
665
|
+
(mode !== "list" || candidateInventory !== undefined);
|
|
666
|
+
if (!candidateHistoryNeeded) {
|
|
667
|
+
return undefined;
|
|
668
|
+
}
|
|
669
|
+
return mode === "boundary_transitioning"
|
|
670
|
+
? frozenCandidateSourceTurnHistory(ports, storeDir, sourceSession)
|
|
671
|
+
: deferredCandidateSourceTurnHistory(ports, storeDir, sourceSession);
|
|
672
|
+
}
|
|
673
|
+
function candidateRootIsExplicitlyAbandoned(sourceKind, abandonment, candidateInventory, binding) {
|
|
674
|
+
if (sourceKind !== "candidate_rollout_quiescent") {
|
|
675
|
+
return false;
|
|
676
|
+
}
|
|
677
|
+
if (abandonment !== "missing_rollout" &&
|
|
678
|
+
(abandonment !== "missing_inventory_rollout" || !candidateInventory)) {
|
|
679
|
+
return false;
|
|
680
|
+
}
|
|
681
|
+
return candidateSourceRootAuthorityMatches(candidateInventory?.roots ?? [], binding.native_thread_id, binding.native_process.rollout, "explicitly_abandoned_predecessor");
|
|
682
|
+
}
|
|
683
|
+
function sourceAbandonmentFingerprintForObservation(ports, { mode, storeDir, context, sourceSession, sourceRolloutAuthority, sourceTurnHistory, dispatchSnapshot, sourceRevision, sourceBindingToken }) {
|
|
684
|
+
if (sourceRolloutAuthority !== "explicitly_abandoned_predecessor" ||
|
|
685
|
+
!sourceTurnHistory || !dispatchSnapshot) {
|
|
686
|
+
return undefined;
|
|
687
|
+
}
|
|
688
|
+
return explicitlyAbandonedCandidateSourceFingerprint(ports, {
|
|
689
|
+
storeDir,
|
|
690
|
+
session: sourceSession,
|
|
691
|
+
sourceTurnHistory,
|
|
692
|
+
dispatchSnapshot,
|
|
693
|
+
sourceRevision,
|
|
694
|
+
sourceBindingToken,
|
|
695
|
+
...(mode === "boundary_transitioning"
|
|
696
|
+
? {
|
|
697
|
+
ledgerOverride: ports.ledger.load(context.terminalControl),
|
|
698
|
+
requireResolvedTopLevel: false
|
|
699
|
+
}
|
|
700
|
+
: {})
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
function exactDeferredCodexSourceForObservation(ports, { mode, storeDir, context, sourceSession, candidateInventory, sourceKind, sourceTurnHistory, sourceRolloutAuthority, sourceAbandonmentFingerprint, requireUnclaimedCandidate }) {
|
|
704
|
+
if (sourceKind === "status_card_only") {
|
|
705
|
+
return Boolean(exactBoundCodexSendSource({
|
|
706
|
+
kind: "status_card",
|
|
707
|
+
sourceSession,
|
|
708
|
+
context
|
|
709
|
+
}) &&
|
|
710
|
+
ports.turn.turnsForSession(storeDir, sourceSession.session_id).length === 0 &&
|
|
711
|
+
!sourceSession.last_transition_id &&
|
|
712
|
+
!ports.transition.hasAny(storeDir, sourceSession));
|
|
713
|
+
}
|
|
714
|
+
if (!candidateInventory || !sourceTurnHistory) {
|
|
715
|
+
return false;
|
|
716
|
+
}
|
|
717
|
+
const exactCandidate = () => exactBoundCodexSendSource({
|
|
718
|
+
kind: "candidate",
|
|
719
|
+
sourceSession,
|
|
720
|
+
context,
|
|
721
|
+
inventory: candidateInventory,
|
|
722
|
+
sourceRolloutAuthority
|
|
723
|
+
});
|
|
724
|
+
const sourceAuthority = sourceRolloutAuthority === "present" ||
|
|
725
|
+
Boolean(sourceAbandonmentFingerprint);
|
|
726
|
+
if (mode === "prepare") {
|
|
727
|
+
return candidateSourceTransitionHistoryIsTerminal(ports, storeDir, sourceSession) && exactCandidate() && sourceAuthority;
|
|
728
|
+
}
|
|
729
|
+
return exactCandidate() && sourceAuthority &&
|
|
730
|
+
(!requireUnclaimedCandidate ||
|
|
731
|
+
codexCandidateInventoryHasNoOtherManagedClaim(ports, {
|
|
732
|
+
storeDir,
|
|
733
|
+
inventory: candidateInventory,
|
|
734
|
+
sourceSessionId: sourceSession.session_id,
|
|
735
|
+
includeDetached: sourceRolloutAuthority === "explicitly_abandoned_predecessor"
|
|
736
|
+
})) &&
|
|
737
|
+
candidateSourceTransitionHistoryIsTerminal(ports, storeDir, sourceSession);
|
|
738
|
+
}
|
|
739
|
+
export function observeDeferredCodexAuthority(ports, { mode, storeDir, context, sourceSession, candidateInventory, abandonment, fixedSourceRolloutAuthority, fixedDispatchSnapshot, sourceRevision, sourceBindingToken, requireUnclaimedCandidate = false }) {
|
|
740
|
+
let dispatchSnapshot = fixedDispatchSnapshot;
|
|
741
|
+
if (mode === "list") {
|
|
742
|
+
dispatchSnapshot = tryDeferredCodexForegroundDispatchSnapshot(ports, context.terminalControl);
|
|
743
|
+
}
|
|
744
|
+
const binding = sourceSession?.binding;
|
|
745
|
+
if (!sourceSession || !binding)
|
|
746
|
+
return undefined;
|
|
747
|
+
const sourceKind = binding.native_process.rollout
|
|
748
|
+
? "candidate_rollout_quiescent"
|
|
749
|
+
: "status_card_only";
|
|
750
|
+
const sourceTurnHistory = sourceTurnHistoryForAuthorityObservation(ports, {
|
|
751
|
+
mode,
|
|
752
|
+
storeDir,
|
|
753
|
+
sourceSession,
|
|
754
|
+
sourceKind,
|
|
755
|
+
candidateInventory
|
|
756
|
+
});
|
|
757
|
+
if (mode === "prepare") {
|
|
758
|
+
dispatchSnapshot = deferredCodexForegroundDispatchSnapshot(ports, context.terminalControl);
|
|
759
|
+
}
|
|
760
|
+
const explicitlyAbandoned = candidateRootIsExplicitlyAbandoned(sourceKind, abandonment, candidateInventory, binding);
|
|
761
|
+
const sourceRolloutAuthority = fixedSourceRolloutAuthority ??
|
|
762
|
+
(explicitlyAbandoned ? "explicitly_abandoned_predecessor" : "present");
|
|
763
|
+
const sourceAbandonmentFingerprint = sourceAbandonmentFingerprintForObservation(ports, {
|
|
764
|
+
mode,
|
|
765
|
+
storeDir,
|
|
766
|
+
context,
|
|
767
|
+
sourceSession,
|
|
768
|
+
sourceRolloutAuthority,
|
|
769
|
+
sourceTurnHistory,
|
|
770
|
+
dispatchSnapshot,
|
|
771
|
+
sourceRevision,
|
|
772
|
+
sourceBindingToken
|
|
773
|
+
});
|
|
774
|
+
const exactSource = exactDeferredCodexSourceForObservation(ports, {
|
|
775
|
+
mode,
|
|
776
|
+
storeDir,
|
|
777
|
+
context,
|
|
778
|
+
sourceSession,
|
|
779
|
+
candidateInventory,
|
|
780
|
+
sourceKind,
|
|
781
|
+
sourceTurnHistory,
|
|
782
|
+
sourceRolloutAuthority,
|
|
783
|
+
sourceAbandonmentFingerprint,
|
|
784
|
+
requireUnclaimedCandidate
|
|
785
|
+
});
|
|
786
|
+
return {
|
|
787
|
+
sourceKind,
|
|
788
|
+
sourceRolloutAuthority,
|
|
789
|
+
sourceTurnHistory,
|
|
790
|
+
dispatchSnapshot,
|
|
791
|
+
sourceAbandonmentFingerprint,
|
|
792
|
+
exactSource
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
//# sourceMappingURL=deferred-foreground-authority-cli-adapter.js.map
|