@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,643 @@
|
|
|
1
|
+
import { sessionShortRef } from "./session-selector.js";
|
|
2
|
+
import { managedSessionBindingToken } from "./managed-session.js";
|
|
3
|
+
import { isActiveConversationStatus, isWaitingForAgentStatus } from "./protocol.js";
|
|
4
|
+
import { isRecord, nonBlankString as stringValue } from "./value-guards.js";
|
|
5
|
+
const TERMINAL_WATCH_ACTION_USE = "Monitor this human-started external task and notify OpenClaw when it " +
|
|
6
|
+
"needs attention or finishes, instead of polling. Do not use Terminal " +
|
|
7
|
+
"Watch for an AKK-managed Turn. Call agent_knock_knock_watch with this " +
|
|
8
|
+
"exact terminal_id; AKK refreshes and revalidates current observation " +
|
|
9
|
+
"authority internally.";
|
|
10
|
+
const NO_AVAILABLE_LIST_ACTION_FACTS = {
|
|
11
|
+
terminalBridgeReady: false,
|
|
12
|
+
managedApprovalPending: false,
|
|
13
|
+
renewEligible: false,
|
|
14
|
+
retryCallbackEligible: false
|
|
15
|
+
};
|
|
16
|
+
export function renderManagedTurnListEntry(task, { terminalBridge = false, approvalState, actionFacts = NO_AVAILABLE_LIST_ACTION_FACTS } = {}) {
|
|
17
|
+
const sessionId = stringValue(task.session_id) ??
|
|
18
|
+
stringValue(task.conversation_id);
|
|
19
|
+
const turnId = stringValue(task.turn_id) ??
|
|
20
|
+
stringValue(task.conversation_id) ??
|
|
21
|
+
String(task.id ?? "");
|
|
22
|
+
const entry = {
|
|
23
|
+
...task,
|
|
24
|
+
session_id: sessionId,
|
|
25
|
+
turn_id: turnId,
|
|
26
|
+
id: turnId,
|
|
27
|
+
short_ref: sessionShortRef(turnId),
|
|
28
|
+
source: "managed_turn",
|
|
29
|
+
...(approvalState ? { approval_state: approvalState } : {}),
|
|
30
|
+
commands: {
|
|
31
|
+
respond: task.status === "waiting_for_openclaw",
|
|
32
|
+
cancel: isWaitingForAgentStatus(task.status),
|
|
33
|
+
close: task.status !== "closed",
|
|
34
|
+
status: true,
|
|
35
|
+
approve: terminalBridge && isActiveConversationStatus(task.status)
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const availableActions = renderAvailableListActions(entry, actionFacts);
|
|
39
|
+
const { commands: _commands, ...publicEntry } = entry;
|
|
40
|
+
return {
|
|
41
|
+
...publicEntry,
|
|
42
|
+
available_actions: availableActions
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function listActionContracts() {
|
|
46
|
+
return {
|
|
47
|
+
version: 18,
|
|
48
|
+
instructions: [
|
|
49
|
+
"Treat terminals[] as the primary resource and use only actions present in available_actions, except the snapshot-bound terminals[].handoff_decision.choices.take_over_current.action and an exact terminals[].blocking_turns[].recovery_action. Either nested action requires explicit user confirmation; after it succeeds, refresh list before any follow-current send.",
|
|
50
|
+
"The session_exact scope uses session_id only when it is prefilled by the listed send action. A rollout-backed managed Codex pane instead uses the terminal_follow_current scope with its exact terminal_id because even one materialized rollout does not prove the current TUI foreground thread. AKK derives and revalidates current terminal authority internally. A turn id is never an ordinary send target.",
|
|
51
|
+
"A user-explicit raw terminal selector, or a uniquely delegated raw send with no selector, is only a discovery choice. If that terminal already has one rollout-backed managed Codex source, AKK captures fresh candidate authority under the terminal and Store locks and still uses the same v3 follow-current transfer; it never degrades to sole-root strict continuation. Unmanaged first attach retains its existing behavior.",
|
|
52
|
+
"Read-only native-thread listing targets an exact terminal_id. Native-thread new/resume mutations use terminal_id and, for resume, one complete native_thread_id; AKK resolves and revalidates current lifecycle authority internally. They never create a Turn.",
|
|
53
|
+
"Native inspection is a separate terminal action: use only its closed inspection enum and current exact terminal_id. AKK resolves current lifecycle authority internally, and AKK status does not execute a native slash command.",
|
|
54
|
+
"Terminal Watch observes one exact human-started active task without sending terminal input or creating an AKK Session or Turn. Start it only from terminals[].available_actions.watch, pass that action's exact terminal_id, and use watch_id for later status or unwatch operations. AKK refreshes and revalidates current observation authority internally.",
|
|
55
|
+
"A verified, idle human native-thread switch may expose a terminal-scoped send; that action atomically adopts the live context before creating its Turn. A conclusively ended Codex rollout may expose the same snapshot-bound operation only after AKK proves zero current rollout and an exact empty composer; it detaches the ended Session and creates an isolated virgin Session. A status-card-only zero-rollout source or any otherwise eligible quiescent rollout-backed source with a complete nonempty pinned open-rollout inventory may also expose this exact action. One materialized rollout does not prove the current Codex TUI foreground thread, and a /clear resume hint is diagnostic only. AKK freezes any released predecessor Turn history, submits the ordinary task once, and binds a separate provisional Session only after one post-anchor rollout uniquely accepts that exact request. The accepted UUID may equal or differ from the predecessor without merging their Session lineages, and narrow panes do not require /status. Until that promotion commits, strict session_id send, respond, approve, cancel, native lifecycle, and native_inspect remain unavailable, and the provisional binding has no callback authority. If dispatch, acceptance, or post-submit binding is uncertain, do not retry automatically. An explicitly closed uncertain Turn may authorize only a future candidate send when its exact resolved close ledger, append-only uncertain receipt, frozen predecessor history, and complete current rollout inventory prove that the old bound rollout is absent and every candidate is unclaimed; close never forges the lost callback, and uncertain submissions cannot be renewed. Other binding conflicts remain fail-closed and may expose only exact low-level reconcile_binding recovery.",
|
|
56
|
+
"List resumable threads before resume; use only a complete native_thread_id and the action returned for that candidate.",
|
|
57
|
+
"Structured follow-current actions use only the exact terminal_id prefilled by that terminal row. Human slash commands may use an explicitly named discovery selector. AKK resolves and revalidates current action authority internally; never infer or guess a target.",
|
|
58
|
+
"Use respond only for an in-flight turn that is explicitly waiting for OpenClaw.",
|
|
59
|
+
"Manual approval binds the exact prompt the user reviewed. After explicit confirmation, call only the currently advertised approve action; AKK keeps the prompt authority private and recaptures the exact terminal, process, request, and prompt before sending a decision key. A prompt without complete exact evidence is not approvable.",
|
|
60
|
+
"Managed controls target turn_id. A raw terminal may be controlled only through its own list-prefilled conversation_id action. When a Codex managed prompt has no usable AKK Turn owner, list may expose one manual terminal-scoped approve action after exact observation. It does not mutate the Turn or Session binding, has no durable dispatch receipt, and is never eligible for automatic approval. If its result is interrupted, refresh status and inspect the live prompt instead of retrying blindly.",
|
|
61
|
+
"Start with the action's prefilled arguments, supply every missing_required field, and consult the top-level action's optional fields only when needed.",
|
|
62
|
+
"Authoritative full IDs are prefilled; short_ref is for display and human input.",
|
|
63
|
+
"Availability is a snapshot. AKK revalidates process, provider-owned terminal identity, workspace, activity, approval, and recovery state before side effects."
|
|
64
|
+
],
|
|
65
|
+
field_semantics: {
|
|
66
|
+
process_state: {
|
|
67
|
+
terminals: "physical_terminal_process_liveness",
|
|
68
|
+
authoritative_for_tool_calls: false
|
|
69
|
+
},
|
|
70
|
+
status: {
|
|
71
|
+
managed_turns: "managed_turn_lifecycle",
|
|
72
|
+
authoritative_for_tool_calls: false
|
|
73
|
+
},
|
|
74
|
+
activity_state: {
|
|
75
|
+
terminals: "terminal_screen_activity_classification",
|
|
76
|
+
authoritative_for_tool_calls: false
|
|
77
|
+
},
|
|
78
|
+
managed: {
|
|
79
|
+
current_turn: "the authoritative dispatch-ledger owner, never inferred from history",
|
|
80
|
+
recent_turn: "the latest visible non-owning turn in the current managed session",
|
|
81
|
+
session_id: "the continuing agent context; it is an ordinary-send target only when the listed send action explicitly prefills it, and rollout-backed Codex uses the listed follow-current terminal action instead",
|
|
82
|
+
binding_id: "the immutable terminal-binding generation currently authorized for this Session",
|
|
83
|
+
history: "older turns, present only with --all"
|
|
84
|
+
},
|
|
85
|
+
available_actions: {
|
|
86
|
+
meaning: "currently_safe_actions",
|
|
87
|
+
authoritative_for_tool_calls: true
|
|
88
|
+
},
|
|
89
|
+
native_agent_identity_observation: {
|
|
90
|
+
meaning: "the latest bounded native identity probe; verified_absent is distinct from an unavailable resolver",
|
|
91
|
+
authoritative_for_tool_calls: false
|
|
92
|
+
},
|
|
93
|
+
management_conflict: {
|
|
94
|
+
verified_empty_native_session: "a previously bound Codex rollout is conclusively closed; only the exact snapshot-bound send in available_actions may detach it and create an isolated virgin Session"
|
|
95
|
+
},
|
|
96
|
+
handoff_state: {
|
|
97
|
+
meaning: "why a conflict-scoped follow-current send is available or blocked",
|
|
98
|
+
verified_empty_native_session_adoptable: "the exact current terminal snapshot permits the listed conflict send; availability is revalidated before terminal input"
|
|
99
|
+
},
|
|
100
|
+
handoff_decision: {
|
|
101
|
+
meaning: "an explicit human choice required before superseding an active source Turn",
|
|
102
|
+
authoritative_action_path: "terminals[].handoff_decision.choices.take_over_current.action",
|
|
103
|
+
requires_explicit_user_confirmation: true,
|
|
104
|
+
after_success: "refresh list before using a follow-current send action"
|
|
105
|
+
},
|
|
106
|
+
blocking_turns: {
|
|
107
|
+
meaning: "terminal-incarnation-wide collateral unresolved managed Turns that suppress send, lifecycle, and native-inspection actions; an active human-handoff source Turn is never listed here and remains governed only by handoff_decision",
|
|
108
|
+
authoritative_action_path: "terminals[].blocking_turns[].recovery_action",
|
|
109
|
+
requires_explicit_user_confirmation: true,
|
|
110
|
+
after_success: "refresh list before using any terminal action"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
actions: {
|
|
114
|
+
send: {
|
|
115
|
+
tool: "agent_knock_knock_send",
|
|
116
|
+
target_argument: "session_id",
|
|
117
|
+
initial_attach_target_argument: "terminal_id",
|
|
118
|
+
managed_scopes: {
|
|
119
|
+
session_exact: {
|
|
120
|
+
target_arguments: ["session_id"],
|
|
121
|
+
follows_current_terminal: false
|
|
122
|
+
},
|
|
123
|
+
terminal_follow_current: {
|
|
124
|
+
target_arguments: ["terminal_id"],
|
|
125
|
+
follows_current_terminal: true
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
initial_attach_scope: "A structured call uses the terminal_id prefilled by an unmanaged raw-terminal row's available send action, or omits the target only when exactly one eligible raw pane exists. Human slash commands may preserve a discovery selector explicitly named by the user. For an already managed rollout-backed Codex pane, an explicit or unique raw delegation internally captures fresh v3 candidate authority under lock; it never becomes a strict Session continuation.",
|
|
129
|
+
required: ["request"],
|
|
130
|
+
optional: [
|
|
131
|
+
"session_id",
|
|
132
|
+
"terminal_id",
|
|
133
|
+
"type",
|
|
134
|
+
"idleTimeoutMinutes",
|
|
135
|
+
"agentTimeoutMinutes",
|
|
136
|
+
"agentHardTimeoutMinutes"
|
|
137
|
+
],
|
|
138
|
+
unsupported: ["timeoutSeconds"],
|
|
139
|
+
status_card_only_deferred_scope: "A zero-Turn Codex status-card binding has no rollout; only its listed follow-current send creates an isolated provisional Session and binds it after exact request acceptance. Until promotion commits, strict managed controls, native lifecycle, native_inspect, and callback authority remain unavailable; an uncertain dispatch, acceptance, or post-submit binding must not be retried automatically.",
|
|
140
|
+
candidate_rollout_deferred_scope: "A quiescent rollout-backed Codex source uses a listed follow-current send whenever AKK can pin a complete nonempty candidate inventory. Inventory status resolved means only that one rollout is materialized; it does not prove the current TUI foreground thread. Released predecessor Turn history stays read-only while a separate provisional Session sends once and waits for one unique post-anchor request acceptance. A /clear resume hint is diagnostic only and is not routing authority. Same-UUID and different-UUID results keep separate Session lineages; zero, multiple, drifted, or uncertain acceptance is never retried blindly. Explicit close can abandon an uncertain receipt for future-send liveness only while the exact resolved close ledger, append-only receipt, frozen history, absent old rollout, and unclaimed candidate set remain authoritative; it never synthesizes callback delivery.",
|
|
141
|
+
ordinary_use: "Create a new managed Turn through the exact action listed for the pane. An explicit session_id never follows the pane and is unavailable for rollout-backed Codex Sessions; their listed follow-current action binds only the unique exact rollout that accepts the submitted request. A user-explicit or uniquely delegated raw send receives the same fresh under-lock candidate authority when it resolves to an already managed rollout-backed Codex source. A live terminal selector can also attach an unmanaged pane, adopt one verified human-selected native context, detach a verified-empty Codex source, or replace an eligible status-card/candidate-rollout source."
|
|
142
|
+
},
|
|
143
|
+
watch: {
|
|
144
|
+
tool: "agent_knock_knock_watch",
|
|
145
|
+
target_argument: "terminal_id",
|
|
146
|
+
required: ["terminal_id"],
|
|
147
|
+
optional: ["hardTimeoutMinutes"],
|
|
148
|
+
creates_turn: false,
|
|
149
|
+
creates_session: false,
|
|
150
|
+
sends_terminal_input: false,
|
|
151
|
+
candidate_source: "terminals[].available_actions.watch",
|
|
152
|
+
scope: "Observe only the exact supported human-started task already active in this terminal. It never adopts the task as AKK work or blocks later human terminal use."
|
|
153
|
+
},
|
|
154
|
+
unwatch: {
|
|
155
|
+
tool: "agent_knock_knock_unwatch",
|
|
156
|
+
target_argument: "watch_id",
|
|
157
|
+
required: ["watch_id"],
|
|
158
|
+
creates_turn: false,
|
|
159
|
+
creates_session: false,
|
|
160
|
+
sends_terminal_input: false,
|
|
161
|
+
requires_user_intent: true
|
|
162
|
+
},
|
|
163
|
+
new_thread: {
|
|
164
|
+
tool: "agent_knock_knock_new_thread",
|
|
165
|
+
target_argument: "terminal_id",
|
|
166
|
+
required: ["terminal_id"],
|
|
167
|
+
creates_turn: false,
|
|
168
|
+
creates_session: true,
|
|
169
|
+
requires_user_intent: true
|
|
170
|
+
},
|
|
171
|
+
list_resumable_threads: {
|
|
172
|
+
tool: "agent_knock_knock_list_resumable_threads",
|
|
173
|
+
target_argument: "terminal_id",
|
|
174
|
+
required: ["terminal_id"],
|
|
175
|
+
side_effect_free: true
|
|
176
|
+
},
|
|
177
|
+
native_inspect: {
|
|
178
|
+
tool: "agent_knock_knock_native_inspect",
|
|
179
|
+
target_argument: "terminal_id",
|
|
180
|
+
required: ["terminal_id", "inspection"],
|
|
181
|
+
supported_inspections: ["status"],
|
|
182
|
+
creates_turn: false,
|
|
183
|
+
creates_session: false,
|
|
184
|
+
mutates_store: false,
|
|
185
|
+
sends_terminal_input: true,
|
|
186
|
+
candidate_source: "terminals[].available_actions.native_inspect"
|
|
187
|
+
},
|
|
188
|
+
resume_thread: {
|
|
189
|
+
tool: "agent_knock_knock_resume_thread",
|
|
190
|
+
target_argument: "terminal_id",
|
|
191
|
+
required: [
|
|
192
|
+
"terminal_id",
|
|
193
|
+
"native_thread_id"
|
|
194
|
+
],
|
|
195
|
+
creates_turn: false,
|
|
196
|
+
requires_user_intent: true,
|
|
197
|
+
candidate_source: "list_resumable_threads"
|
|
198
|
+
},
|
|
199
|
+
reconcile_binding: {
|
|
200
|
+
tool: "agent_knock_knock_reconcile_binding",
|
|
201
|
+
target_argument: "terminal_id",
|
|
202
|
+
required: [
|
|
203
|
+
"terminal_id",
|
|
204
|
+
"conflicting_session_id"
|
|
205
|
+
],
|
|
206
|
+
creates_turn: false,
|
|
207
|
+
sends_terminal_input: false,
|
|
208
|
+
requires_user_intent: true,
|
|
209
|
+
effect: "Detach one exactly listed conflicting Session binding without adopting the live replacement thread."
|
|
210
|
+
},
|
|
211
|
+
respond: {
|
|
212
|
+
tool: "agent_knock_knock_respond",
|
|
213
|
+
target_argument: "turn_id",
|
|
214
|
+
required: ["turn_id", "request"],
|
|
215
|
+
ordinary_use: "Answer an agent question inside the explicitly selected in-flight turn without creating another turn."
|
|
216
|
+
},
|
|
217
|
+
status: {
|
|
218
|
+
tool: "agent_knock_knock_status",
|
|
219
|
+
target_arguments: {
|
|
220
|
+
exactly_one_of: ["turn_id", "conversation_id", "watch_id"]
|
|
221
|
+
},
|
|
222
|
+
managed_target_argument: "turn_id",
|
|
223
|
+
watch_target_argument: "watch_id",
|
|
224
|
+
watch_scope: "Use only the authoritative watch_id prefilled by a current Terminal Watch row.",
|
|
225
|
+
compatibility_target_argument: "conversation_id",
|
|
226
|
+
compatibility_scope: "A deprecated legacy Turn alias, or only the exact selector prefilled by an unmanaged raw-terminal row's available status action; never construct, guess, or reuse it.",
|
|
227
|
+
required: [],
|
|
228
|
+
optional: ["idleTimeoutMinutes", "trace"]
|
|
229
|
+
},
|
|
230
|
+
approve: {
|
|
231
|
+
tool: "agent_knock_knock_approve",
|
|
232
|
+
target_arguments: {
|
|
233
|
+
exactly_one_of: ["turn_id", "terminal_id"]
|
|
234
|
+
},
|
|
235
|
+
managed_target_argument: "turn_id",
|
|
236
|
+
terminal_target_argument: "terminal_id",
|
|
237
|
+
required: [],
|
|
238
|
+
optional: [],
|
|
239
|
+
terminal_scoped_scope: "Only the latest list-prefilled Codex terminal_id action may approve a managed current prompt without a usable Turn owner. It remains human-confirmed, uses private server-bound reviewed-prompt authority, revalidates exact terminal/process/Session/dispatch/prompt state before keys, never mutates managed state, has no durable dispatch receipt, cannot be auto-approved, and must not be blindly retried after an interrupted result.",
|
|
240
|
+
approval_authority: "private_server_bound_reviewed_prompt",
|
|
241
|
+
missing_prompt_region_evidence: "not_approvable",
|
|
242
|
+
requires_explicit_user_confirmation: true,
|
|
243
|
+
requires_fresh_status: true
|
|
244
|
+
},
|
|
245
|
+
cancel: {
|
|
246
|
+
tool: "agent_knock_knock_cancel",
|
|
247
|
+
target_argument: "turn_id",
|
|
248
|
+
compatibility_target_argument: "conversation_id",
|
|
249
|
+
compatibility_scope: "A deprecated legacy Turn alias, or only the exact selector prefilled by an unmanaged raw-terminal row's available cancellation action; never construct, guess, or reuse it.",
|
|
250
|
+
required: ["turn_id"],
|
|
251
|
+
optional: ["idleTimeoutMinutes"],
|
|
252
|
+
requires_user_intent: true
|
|
253
|
+
},
|
|
254
|
+
renew: {
|
|
255
|
+
tool: "agent_knock_knock_renew",
|
|
256
|
+
target_argument: "turn_id",
|
|
257
|
+
compatibility_target_argument: "conversation_id",
|
|
258
|
+
compatibility_scope: "Deprecated legacy Turn alias only; unmanaged raw-terminal rows never advertise renew.",
|
|
259
|
+
required: ["turn_id"],
|
|
260
|
+
optional: ["minutes"]
|
|
261
|
+
},
|
|
262
|
+
retry_callback: {
|
|
263
|
+
tool: "agent_knock_knock_retry_callback",
|
|
264
|
+
target_argument: "turn_id",
|
|
265
|
+
compatibility_target_argument: "conversation_id",
|
|
266
|
+
compatibility_scope: "Deprecated legacy Turn alias only; unmanaged raw-terminal rows never advertise callback retry.",
|
|
267
|
+
required: ["turn_id"]
|
|
268
|
+
},
|
|
269
|
+
close: {
|
|
270
|
+
tool: "agent_knock_knock_close",
|
|
271
|
+
target_argument: "turn_id",
|
|
272
|
+
compatibility_target_argument: "conversation_id",
|
|
273
|
+
compatibility_scope: "A deprecated legacy Turn alias, or only the exact selector prefilled by an unmanaged raw-terminal row's orphan-close action; never construct, guess, or reuse it.",
|
|
274
|
+
required: ["turn_id"],
|
|
275
|
+
optional: [
|
|
276
|
+
"reason",
|
|
277
|
+
"expected_message_id",
|
|
278
|
+
"expected_transition_id"
|
|
279
|
+
],
|
|
280
|
+
requires_explicit_user_confirmation: true,
|
|
281
|
+
handoff_scope: "Use only the complete nested action from terminals[].handoff_decision.choices.take_over_current after explicit confirmation. AKK binds and revalidates the current handoff decision privately."
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
export function renderAvailableListActions(entry, facts = NO_AVAILABLE_LIST_ACTION_FACTS) {
|
|
287
|
+
const id = stringValue(entry.id ?? entry.conversation_id);
|
|
288
|
+
if (!id) {
|
|
289
|
+
return {};
|
|
290
|
+
}
|
|
291
|
+
const commands = isRecord(entry.commands) ? entry.commands : {};
|
|
292
|
+
const managed = entry.source === "managed_turn";
|
|
293
|
+
const targetArguments = managed
|
|
294
|
+
? { turn_id: id }
|
|
295
|
+
: { conversation_id: id };
|
|
296
|
+
const actions = {
|
|
297
|
+
status: {
|
|
298
|
+
tool: "agent_knock_knock_status",
|
|
299
|
+
arguments: targetArguments
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
const terminalControlled = entry.source === "terminal";
|
|
303
|
+
const approvalState = isRecord(entry.approval_state)
|
|
304
|
+
? entry.approval_state
|
|
305
|
+
: {};
|
|
306
|
+
const managedApprovalPending = facts.managedApprovalPending;
|
|
307
|
+
const terminalBridgeReady = managed && facts.terminalBridgeReady;
|
|
308
|
+
if (terminalControlled &&
|
|
309
|
+
commands.send === true &&
|
|
310
|
+
entry.activity_state === "idle" &&
|
|
311
|
+
approvalState.blocked !== true) {
|
|
312
|
+
actions.send = {
|
|
313
|
+
tool: "agent_knock_knock_send",
|
|
314
|
+
arguments: { selector: id },
|
|
315
|
+
missing_required: ["request"]
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
const lifecycleBindingToken = stringValue(entry.lifecycle_binding_token);
|
|
319
|
+
appendTerminalWatchAction({
|
|
320
|
+
actions,
|
|
321
|
+
commands,
|
|
322
|
+
entry,
|
|
323
|
+
id,
|
|
324
|
+
lifecycleBindingToken,
|
|
325
|
+
terminalControlled
|
|
326
|
+
});
|
|
327
|
+
if (terminalControlled &&
|
|
328
|
+
commands.new_thread === true &&
|
|
329
|
+
entry.activity_state === "idle" &&
|
|
330
|
+
approvalState.blocked !== true &&
|
|
331
|
+
lifecycleBindingToken) {
|
|
332
|
+
actions.new_thread = {
|
|
333
|
+
tool: "agent_knock_knock_new_thread",
|
|
334
|
+
arguments: {
|
|
335
|
+
terminal_id: id,
|
|
336
|
+
expected_binding_token: lifecycleBindingToken
|
|
337
|
+
},
|
|
338
|
+
requires_user_intent: true
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
if (terminalControlled &&
|
|
342
|
+
commands.list_resumable_threads === true) {
|
|
343
|
+
actions.list_resumable_threads = {
|
|
344
|
+
tool: "agent_knock_knock_list_resumable_threads",
|
|
345
|
+
arguments: { terminal_id: id }
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
if (terminalControlled &&
|
|
349
|
+
commands.native_inspect === true &&
|
|
350
|
+
entry.activity_state === "idle" &&
|
|
351
|
+
approvalState.blocked !== true &&
|
|
352
|
+
lifecycleBindingToken) {
|
|
353
|
+
actions.native_inspect = {
|
|
354
|
+
tool: "agent_knock_knock_native_inspect",
|
|
355
|
+
arguments: {
|
|
356
|
+
terminal_id: id,
|
|
357
|
+
inspection: "status",
|
|
358
|
+
expected_binding_token: lifecycleBindingToken
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
if (managed &&
|
|
363
|
+
commands.respond === true &&
|
|
364
|
+
terminalBridgeReady &&
|
|
365
|
+
entry.status === "waiting_for_openclaw" &&
|
|
366
|
+
!managedApprovalPending &&
|
|
367
|
+
approvalState.blocked !== true) {
|
|
368
|
+
actions.respond = {
|
|
369
|
+
tool: "agent_knock_knock_respond",
|
|
370
|
+
arguments: { turn_id: id },
|
|
371
|
+
missing_required: ["request"]
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
const approvalFingerprint = stringValue(approvalState.fingerprint);
|
|
375
|
+
const managedApprovalEligible = terminalBridgeReady &&
|
|
376
|
+
entry.status === "waiting_for_openclaw" &&
|
|
377
|
+
(entry.agent !== "claude" ||
|
|
378
|
+
approvalState.decision_mode === "keys");
|
|
379
|
+
if (commands.approve === true &&
|
|
380
|
+
approvalState.approvable === true &&
|
|
381
|
+
approvalFingerprint &&
|
|
382
|
+
((terminalControlled &&
|
|
383
|
+
entry.agent === "codex") ||
|
|
384
|
+
managedApprovalEligible)) {
|
|
385
|
+
actions.approve = {
|
|
386
|
+
tool: "agent_knock_knock_approve",
|
|
387
|
+
arguments: targetArguments,
|
|
388
|
+
missing_required: ["expected_approval_fingerprint"],
|
|
389
|
+
before_call: {
|
|
390
|
+
tool: "agent_knock_knock_status",
|
|
391
|
+
arguments: targetArguments,
|
|
392
|
+
use: "After explicit user confirmation, copy the latest terminal_status.approval_state.fingerprint into expected_approval_fingerprint."
|
|
393
|
+
},
|
|
394
|
+
requires_explicit_user_confirmation: true,
|
|
395
|
+
requires_fresh_status: true
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
const cancelAction = renderCancelListAction(entry, facts, targetArguments, approvalState);
|
|
399
|
+
if (cancelAction) {
|
|
400
|
+
actions.cancel = cancelAction;
|
|
401
|
+
}
|
|
402
|
+
if (managed && facts.renewEligible) {
|
|
403
|
+
actions.renew = {
|
|
404
|
+
tool: "agent_knock_knock_renew",
|
|
405
|
+
arguments: targetArguments
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
if (managed && facts.retryCallbackEligible) {
|
|
409
|
+
actions.retry_callback = {
|
|
410
|
+
tool: "agent_knock_knock_retry_callback",
|
|
411
|
+
arguments: targetArguments
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
if (commands.close === true) {
|
|
415
|
+
const orphanedDispatch = isRecord(entry.orphaned_terminal_dispatch)
|
|
416
|
+
? entry.orphaned_terminal_dispatch
|
|
417
|
+
: undefined;
|
|
418
|
+
const expectedMessageId = stringValue(orphanedDispatch?.message_id);
|
|
419
|
+
const expectedTransitionId = stringValue(orphanedDispatch?.transition_id);
|
|
420
|
+
actions.close = {
|
|
421
|
+
tool: "agent_knock_knock_close",
|
|
422
|
+
arguments: {
|
|
423
|
+
...(managed ? { turn_id: id } : { conversation_id: id }),
|
|
424
|
+
...(expectedMessageId
|
|
425
|
+
? { expected_message_id: expectedMessageId }
|
|
426
|
+
: {}),
|
|
427
|
+
...(expectedTransitionId
|
|
428
|
+
? { expected_transition_id: expectedTransitionId }
|
|
429
|
+
: {})
|
|
430
|
+
},
|
|
431
|
+
requires_explicit_user_confirmation: true
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
return actions;
|
|
435
|
+
}
|
|
436
|
+
function appendTerminalWatchAction(input) {
|
|
437
|
+
if (!input.terminalControlled ||
|
|
438
|
+
input.commands.watch !== true ||
|
|
439
|
+
!["working", "awaiting_approval"].includes(String(input.entry.activity_state ?? "")) ||
|
|
440
|
+
!input.lifecycleBindingToken) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
input.actions.watch = {
|
|
444
|
+
tool: "agent_knock_knock_watch",
|
|
445
|
+
arguments: {
|
|
446
|
+
terminal_id: input.id
|
|
447
|
+
},
|
|
448
|
+
requires_user_intent: true,
|
|
449
|
+
use: TERMINAL_WATCH_ACTION_USE
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
export function terminalWatchDiscoveryHint(terminalId) {
|
|
453
|
+
return {
|
|
454
|
+
kind: "terminal_watch_discovery",
|
|
455
|
+
terminal_id: terminalId,
|
|
456
|
+
command: `/akk watch ${terminalId}`,
|
|
457
|
+
available_action_required: true,
|
|
458
|
+
instruction: "Refresh agent_knock_knock_list and use only this terminal's current " +
|
|
459
|
+
"available_actions.watch. Terminal Watch is only for human-started " +
|
|
460
|
+
"external work, never an AKK-managed Turn."
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
export function exactTerminalWatchAction(entry, terminalId) {
|
|
464
|
+
if (!isRecord(entry) || !isRecord(entry.available_actions)) {
|
|
465
|
+
return undefined;
|
|
466
|
+
}
|
|
467
|
+
const watch = isRecord(entry.available_actions.watch)
|
|
468
|
+
? entry.available_actions.watch
|
|
469
|
+
: undefined;
|
|
470
|
+
const args = isRecord(watch?.arguments) ? watch.arguments : undefined;
|
|
471
|
+
return watch?.tool === "agent_knock_knock_watch" &&
|
|
472
|
+
watch.requires_user_intent === true &&
|
|
473
|
+
args?.terminal_id === terminalId &&
|
|
474
|
+
Object.keys(args).length === 1
|
|
475
|
+
? watch
|
|
476
|
+
: undefined;
|
|
477
|
+
}
|
|
478
|
+
const CURRENT_TURN_ACTIONS = [
|
|
479
|
+
"status", "respond", "approve", "cancel", "renew", "retry_callback"
|
|
480
|
+
];
|
|
481
|
+
export function currentTerminalActions(currentTurn) {
|
|
482
|
+
if (!currentTurn || !isRecord(currentTurn.available_actions)) {
|
|
483
|
+
return {};
|
|
484
|
+
}
|
|
485
|
+
const actions = {};
|
|
486
|
+
for (const action of CURRENT_TURN_ACTIONS) {
|
|
487
|
+
if (isRecord(currentTurn.available_actions[action])) {
|
|
488
|
+
actions[action] = currentTurn.available_actions[action];
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return actions;
|
|
492
|
+
}
|
|
493
|
+
export function safeTerminalActionsDuringConflict(rawActions) {
|
|
494
|
+
const actions = {};
|
|
495
|
+
for (const action of ["status", "close"]) {
|
|
496
|
+
if (isRecord(rawActions[action])) {
|
|
497
|
+
actions[action] = rawActions[action];
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
return actions;
|
|
501
|
+
}
|
|
502
|
+
export function sendActionForManagedSession(action, sessionId) {
|
|
503
|
+
const { selector: _selector, ...existingArguments } = isRecord(action.arguments)
|
|
504
|
+
? action.arguments
|
|
505
|
+
: {};
|
|
506
|
+
return {
|
|
507
|
+
...action,
|
|
508
|
+
arguments: {
|
|
509
|
+
...existingArguments,
|
|
510
|
+
session_id: sessionId
|
|
511
|
+
}
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
export function actionsForManagedSessionBinding(actions, session) {
|
|
515
|
+
const token = managedSessionBindingToken(session);
|
|
516
|
+
const next = { ...actions };
|
|
517
|
+
for (const actionName of ["new_thread", "resume_thread", "native_inspect"]) {
|
|
518
|
+
const action = isRecord(next[actionName]) ? next[actionName] : undefined;
|
|
519
|
+
if (!action) {
|
|
520
|
+
continue;
|
|
521
|
+
}
|
|
522
|
+
next[actionName] = {
|
|
523
|
+
...action,
|
|
524
|
+
arguments: {
|
|
525
|
+
...(isRecord(action.arguments) ? action.arguments : {}),
|
|
526
|
+
expected_binding_token: token
|
|
527
|
+
}
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
return next;
|
|
531
|
+
}
|
|
532
|
+
export function safeUnavailableManagedTurnActions(actionsValue) {
|
|
533
|
+
const actions = {};
|
|
534
|
+
for (const action of ["status", "retry_callback", "close"]) {
|
|
535
|
+
if (isRecord(actionsValue[action])) {
|
|
536
|
+
actions[action] = actionsValue[action];
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
return actions;
|
|
540
|
+
}
|
|
541
|
+
export function renderHistoricalManagedTurn(managedTurn) {
|
|
542
|
+
const availableActions = isRecord(managedTurn.available_actions)
|
|
543
|
+
? managedTurn.available_actions
|
|
544
|
+
: {};
|
|
545
|
+
return {
|
|
546
|
+
...managedTurn,
|
|
547
|
+
available_actions: safeUnavailableManagedTurnActions(availableActions)
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
export function renderCurrentManagedTurn(managedTurn, facts) {
|
|
551
|
+
if (!facts.rawApproval || !facts.isCodex)
|
|
552
|
+
return managedTurn;
|
|
553
|
+
const approve = retargetConversationAction(facts.rawApproval, facts.ownerId);
|
|
554
|
+
const terminalApprovalState = facts.terminalApprovalState?.();
|
|
555
|
+
return {
|
|
556
|
+
...managedTurn,
|
|
557
|
+
...(terminalApprovalState
|
|
558
|
+
? { approval_state: terminalApprovalState }
|
|
559
|
+
: {}),
|
|
560
|
+
available_actions: {
|
|
561
|
+
...(isRecord(managedTurn.available_actions)
|
|
562
|
+
? managedTurn.available_actions
|
|
563
|
+
: {}),
|
|
564
|
+
approve
|
|
565
|
+
}
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
export function readOnlyListActions(actionsValue) {
|
|
569
|
+
return isRecord(actionsValue.status)
|
|
570
|
+
? { status: actionsValue.status }
|
|
571
|
+
: {};
|
|
572
|
+
}
|
|
573
|
+
export function readOnlyManagedTurn(managedTurn) {
|
|
574
|
+
return {
|
|
575
|
+
...managedTurn,
|
|
576
|
+
available_actions: readOnlyListActions(isRecord(managedTurn.available_actions)
|
|
577
|
+
? managedTurn.available_actions
|
|
578
|
+
: {})
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
export function withoutGenericHandoffSourceClose(managedTurn, blockingHandoffTurnIds) {
|
|
582
|
+
const conversationId = stringValue(managedTurn.conversation_id);
|
|
583
|
+
if (!conversationId || !blockingHandoffTurnIds.has(conversationId)) {
|
|
584
|
+
return managedTurn;
|
|
585
|
+
}
|
|
586
|
+
const availableActions = isRecord(managedTurn.available_actions)
|
|
587
|
+
? managedTurn.available_actions
|
|
588
|
+
: {};
|
|
589
|
+
const { close: _genericClose, ...safeActions } = availableActions;
|
|
590
|
+
return {
|
|
591
|
+
...managedTurn,
|
|
592
|
+
available_actions: safeActions
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
export function retargetConversationAction(action, conversationId) {
|
|
596
|
+
const beforeCall = isRecord(action.before_call)
|
|
597
|
+
? action.before_call
|
|
598
|
+
: undefined;
|
|
599
|
+
return {
|
|
600
|
+
...action,
|
|
601
|
+
arguments: {
|
|
602
|
+
...(isRecord(action.arguments) ? action.arguments : {}),
|
|
603
|
+
turn_id: conversationId,
|
|
604
|
+
conversation_id: undefined
|
|
605
|
+
},
|
|
606
|
+
...(beforeCall
|
|
607
|
+
? {
|
|
608
|
+
before_call: {
|
|
609
|
+
...beforeCall,
|
|
610
|
+
arguments: {
|
|
611
|
+
...(isRecord(beforeCall.arguments)
|
|
612
|
+
? beforeCall.arguments
|
|
613
|
+
: {}),
|
|
614
|
+
turn_id: conversationId,
|
|
615
|
+
conversation_id: undefined
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
: {})
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
function renderCancelListAction(entry, facts, targetArguments, approvalState) {
|
|
623
|
+
const rawCancellable = entry.source === "terminal" &&
|
|
624
|
+
isRecord(entry.commands) &&
|
|
625
|
+
entry.commands.cancel === true &&
|
|
626
|
+
(entry.activity_state === "working" ||
|
|
627
|
+
(approvalState.blocked === true &&
|
|
628
|
+
approvalState.approvable === true));
|
|
629
|
+
const managedCancellable = entry.source === "managed_turn" &&
|
|
630
|
+
facts.terminalBridgeReady &&
|
|
631
|
+
["waiting_for_agent", "waiting_for_openclaw"].includes(String(entry.status)) &&
|
|
632
|
+
!(facts.managedApprovalPending &&
|
|
633
|
+
approvalState.approvable !== true);
|
|
634
|
+
if (!rawCancellable && !managedCancellable) {
|
|
635
|
+
return undefined;
|
|
636
|
+
}
|
|
637
|
+
return {
|
|
638
|
+
tool: "agent_knock_knock_cancel",
|
|
639
|
+
arguments: targetArguments,
|
|
640
|
+
requires_user_intent: true
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
//# sourceMappingURL=terminal-list-renderer.js.map
|