@scotthuang/agent-knock-knock 0.14.17 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +5 -3
  3. package/connectors/deepseek-harness/README.md +47 -10
  4. package/connectors/pi/README.md +36 -9
  5. package/dist/src/claude-conversation-routing-cli-adapter.js +80 -6
  6. package/dist/src/claude-conversation-routing-cli-adapter.js.map +1 -1
  7. package/dist/src/claude-lifecycle-compatibility.js +3 -9
  8. package/dist/src/claude-lifecycle-compatibility.js.map +1 -1
  9. package/dist/src/claude-local-transcript-provider.d.ts +5 -15
  10. package/dist/src/claude-local-transcript-provider.js +38 -56
  11. package/dist/src/claude-local-transcript-provider.js.map +1 -1
  12. package/dist/src/claude-managed-send-route.d.ts +17 -0
  13. package/dist/src/claude-managed-send-route.js +54 -0
  14. package/dist/src/claude-managed-send-route.js.map +1 -0
  15. package/dist/src/claude-native-cli-adapter.js +11 -9
  16. package/dist/src/claude-native-cli-adapter.js.map +1 -1
  17. package/dist/src/claude-native-client.d.ts +2 -0
  18. package/dist/src/claude-native-client.js +6 -1
  19. package/dist/src/claude-native-client.js.map +1 -1
  20. package/dist/src/claude-native-discovery.js +14 -2
  21. package/dist/src/claude-native-discovery.js.map +1 -1
  22. package/dist/src/claude-native-observation.js +3 -1
  23. package/dist/src/claude-native-observation.js.map +1 -1
  24. package/dist/src/claude-native-outbox.js +15 -3
  25. package/dist/src/claude-native-outbox.js.map +1 -1
  26. package/dist/src/claude-native-peer-envelope.d.ts +3 -0
  27. package/dist/src/claude-native-peer-envelope.js +72 -0
  28. package/dist/src/claude-native-peer-envelope.js.map +1 -0
  29. package/dist/src/claude-native-public-projection.d.ts +635 -60
  30. package/dist/src/claude-native-public-projection.js +42 -11
  31. package/dist/src/claude-native-public-projection.js.map +1 -1
  32. package/dist/src/claude-native-runtime.d.ts +2 -0
  33. package/dist/src/claude-native-runtime.js +1 -1
  34. package/dist/src/claude-native-runtime.js.map +1 -1
  35. package/dist/src/claude-native-sender-policy.d.ts +3 -0
  36. package/dist/src/claude-native-sender-policy.js +14 -0
  37. package/dist/src/claude-native-sender-policy.js.map +1 -0
  38. package/dist/src/claude-native-state-store.d.ts +3 -0
  39. package/dist/src/claude-native-state-store.js +18 -6
  40. package/dist/src/claude-native-state-store.js.map +1 -1
  41. package/dist/src/claude-native-task-service.d.ts +2 -0
  42. package/dist/src/claude-native-task-service.js +37 -8
  43. package/dist/src/claude-native-task-service.js.map +1 -1
  44. package/dist/src/claude-reader-configuration.d.ts +14 -0
  45. package/dist/src/claude-reader-configuration.js +41 -0
  46. package/dist/src/claude-reader-configuration.js.map +1 -0
  47. package/dist/src/claude-terminal-agent-adapter.d.ts +4 -0
  48. package/dist/src/claude-terminal-agent-adapter.js +1 -1
  49. package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
  50. package/dist/src/claude-terminal-agent-observation.d.ts +14 -0
  51. package/dist/src/claude-terminal-agent-observation.js +147 -0
  52. package/dist/src/claude-terminal-agent-observation.js.map +1 -0
  53. package/dist/src/claude-terminal-registry-observation.d.ts +29 -0
  54. package/dist/src/claude-terminal-registry-observation.js +122 -0
  55. package/dist/src/claude-terminal-registry-observation.js.map +1 -0
  56. package/dist/src/claude-transcript-config.d.ts +25 -0
  57. package/dist/src/claude-transcript-config.js +61 -0
  58. package/dist/src/claude-transcript-config.js.map +1 -0
  59. package/dist/src/cli-core.js +42 -15
  60. package/dist/src/cli-core.js.map +1 -1
  61. package/dist/src/cli-usage.js +1 -0
  62. package/dist/src/cli-usage.js.map +1 -1
  63. package/dist/src/codex-native-semantic.js +10 -2
  64. package/dist/src/codex-native-semantic.js.map +1 -1
  65. package/dist/src/codex-process-incarnation.js +3 -1
  66. package/dist/src/codex-process-incarnation.js.map +1 -1
  67. package/dist/src/conversation-list.d.ts +6 -0
  68. package/dist/src/conversation-list.js +75 -17
  69. package/dist/src/conversation-list.js.map +1 -1
  70. package/dist/src/conversation-route-dispatch.js +4 -3
  71. package/dist/src/conversation-route-dispatch.js.map +1 -1
  72. package/dist/src/conversation-route-store.d.ts +6 -1
  73. package/dist/src/conversation-route-store.js +13 -5
  74. package/dist/src/conversation-route-store.js.map +1 -1
  75. package/dist/src/conversation-routing-cli-adapter.js +49 -2
  76. package/dist/src/conversation-routing-cli-adapter.js.map +1 -1
  77. package/dist/src/conversation-runtime-route-store.js +5 -3
  78. package/dist/src/conversation-runtime-route-store.js.map +1 -1
  79. package/dist/src/host-adapter.js +3 -2
  80. package/dist/src/host-adapter.js.map +1 -1
  81. package/dist/src/managed-session.d.ts +11 -0
  82. package/dist/src/managed-session.js +24 -1
  83. package/dist/src/managed-session.js.map +1 -1
  84. package/dist/src/native-store-authority-cli-adapter.d.ts +20 -0
  85. package/dist/src/native-store-authority-cli-adapter.js +105 -0
  86. package/dist/src/native-store-authority-cli-adapter.js.map +1 -0
  87. package/dist/src/native-store-authority-ledger.d.ts +3 -0
  88. package/dist/src/native-store-authority-ledger.js +46 -0
  89. package/dist/src/native-store-authority-ledger.js.map +1 -0
  90. package/dist/src/native-store-authority-projection.d.ts +6 -0
  91. package/dist/src/native-store-authority-projection.js +68 -0
  92. package/dist/src/native-store-authority-projection.js.map +1 -0
  93. package/dist/src/native-store-authority-runtime.d.ts +9 -0
  94. package/dist/src/native-store-authority-runtime.js +77 -0
  95. package/dist/src/native-store-authority-runtime.js.map +1 -0
  96. package/dist/src/native-store-authority-transfer.d.ts +31 -0
  97. package/dist/src/native-store-authority-transfer.js +172 -0
  98. package/dist/src/native-store-authority-transfer.js.map +1 -0
  99. package/dist/src/native-store-authority-watch.d.ts +9 -0
  100. package/dist/src/native-store-authority-watch.js +43 -0
  101. package/dist/src/native-store-authority-watch.js.map +1 -0
  102. package/dist/src/native-store-authority.d.ts +29 -0
  103. package/dist/src/native-store-authority.js +181 -0
  104. package/dist/src/native-store-authority.js.map +1 -0
  105. package/dist/src/semantic-tool-descriptions.d.ts +1 -1
  106. package/dist/src/semantic-tool-descriptions.js +15 -13
  107. package/dist/src/semantic-tool-descriptions.js.map +1 -1
  108. package/dist/src/semantic-tool-list-projection.js +36 -7
  109. package/dist/src/semantic-tool-list-projection.js.map +1 -1
  110. package/dist/src/semantic-tool-private-authority.d.ts +5 -0
  111. package/dist/src/semantic-tool-private-authority.js +55 -3
  112. package/dist/src/semantic-tool-private-authority.js.map +1 -1
  113. package/dist/src/semantic-tool-relay.d.ts +1 -0
  114. package/dist/src/semantic-tool-relay.js +12 -5
  115. package/dist/src/semantic-tool-relay.js.map +1 -1
  116. package/dist/src/semantic-tool-runtime.js +5 -37
  117. package/dist/src/semantic-tool-runtime.js.map +1 -1
  118. package/dist/src/semantic-tool-schemas.d.ts +25 -0
  119. package/dist/src/semantic-tool-schemas.js +23 -9
  120. package/dist/src/semantic-tool-schemas.js.map +1 -1
  121. package/dist/src/session-store.js +5 -1
  122. package/dist/src/session-store.js.map +1 -1
  123. package/dist/src/store-owner-identity.d.ts +24 -0
  124. package/dist/src/store-owner-identity.js +127 -0
  125. package/dist/src/store-owner-identity.js.map +1 -0
  126. package/dist/src/store-owner-process.d.ts +24 -0
  127. package/dist/src/store-owner-process.js +104 -0
  128. package/dist/src/store-owner-process.js.map +1 -0
  129. package/dist/src/store-owner-registry.d.ts +13 -0
  130. package/dist/src/store-owner-registry.js +158 -0
  131. package/dist/src/store-owner-registry.js.map +1 -0
  132. package/dist/src/store.d.ts +3 -1
  133. package/dist/src/store.js +5 -2
  134. package/dist/src/store.js.map +1 -1
  135. package/dist/src/terminal-action-contracts.js +18 -2
  136. package/dist/src/terminal-action-contracts.js.map +1 -1
  137. package/dist/src/terminal-action-projection.d.ts +1 -1
  138. package/dist/src/terminal-action-projection.js.map +1 -1
  139. package/dist/src/terminal-command-dispatch-preparation.js +6 -3
  140. package/dist/src/terminal-command-dispatch-preparation.js.map +1 -1
  141. package/dist/src/terminal-dispatch-ledger-codec.js +1 -1
  142. package/dist/src/terminal-dispatch-ledger-codec.js.map +1 -1
  143. package/dist/src/terminal-dispatch-recovery-cli-adapter.js +2 -21
  144. package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -1
  145. package/dist/src/terminal-dispatch-repository-cli-adapter.d.ts +3 -1
  146. package/dist/src/terminal-dispatch-repository-cli-adapter.js +3 -2
  147. package/dist/src/terminal-dispatch-repository-cli-adapter.js.map +1 -1
  148. package/dist/src/terminal-human-explicit-send-cli-adapter.js +17 -6
  149. package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -1
  150. package/dist/src/terminal-list-cli-adapter.d.ts +2 -0
  151. package/dist/src/terminal-list-cli-adapter.js +26 -8
  152. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  153. package/dist/src/terminal-list-ownership-service.d.ts +1 -0
  154. package/dist/src/terminal-list-ownership-service.js +22 -1
  155. package/dist/src/terminal-list-ownership-service.js.map +1 -1
  156. package/dist/src/terminal-list-projection-service.js +7 -1
  157. package/dist/src/terminal-list-projection-service.js.map +1 -1
  158. package/dist/src/terminal-list-renderer.js +1 -1
  159. package/dist/src/terminal-list-renderer.js.map +1 -1
  160. package/dist/src/terminal-managed-interaction-list-action.d.ts +17 -0
  161. package/dist/src/terminal-managed-interaction-list-action.js +59 -0
  162. package/dist/src/terminal-managed-interaction-list-action.js.map +1 -0
  163. package/dist/src/terminal-managed-send-cli-adapter.js +8 -1
  164. package/dist/src/terminal-managed-send-cli-adapter.js.map +1 -1
  165. package/dist/src/terminal-model-control-profile.d.ts +3 -2
  166. package/dist/src/terminal-model-control-profile.js +32 -9
  167. package/dist/src/terminal-model-control-profile.js.map +1 -1
  168. package/dist/src/terminal-monitor-decision-policy.d.ts +1 -1
  169. package/dist/src/terminal-mutation-cli-runtime.d.ts +7 -2
  170. package/dist/src/terminal-mutation-cli-runtime.js +11 -3
  171. package/dist/src/terminal-mutation-cli-runtime.js.map +1 -1
  172. package/dist/src/terminal-permission-control-cli-adapter.js +7 -0
  173. package/dist/src/terminal-permission-control-cli-adapter.js.map +1 -1
  174. package/dist/src/terminal-permission-control-list-projection.d.ts +1 -1
  175. package/dist/src/terminal-process-source.js +3 -1
  176. package/dist/src/terminal-process-source.js.map +1 -1
  177. package/dist/src/terminal-questionnaire-adapter.js +11 -8
  178. package/dist/src/terminal-questionnaire-adapter.js.map +1 -1
  179. package/dist/src/terminal-runtime-cli-adapter.js +27 -72
  180. package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
  181. package/dist/src/terminal-status-cli-adapter.js +1 -0
  182. package/dist/src/terminal-status-cli-adapter.js.map +1 -1
  183. package/dist/src/terminal-status-facts.d.ts +1 -0
  184. package/dist/src/terminal-status-facts.js +8 -1
  185. package/dist/src/terminal-status-facts.js.map +1 -1
  186. package/dist/src/terminal-watch-cli-adapter.js +3 -2
  187. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  188. package/dist/src/terminal-watch-record.js +2 -0
  189. package/dist/src/terminal-watch-record.js.map +1 -1
  190. package/dist/src/terminal-watch-response-cli-adapter.js +9 -0
  191. package/dist/src/terminal-watch-response-cli-adapter.js.map +1 -1
  192. package/dist/src/terminal-watch-terminal-identity.js +1 -0
  193. package/dist/src/terminal-watch-terminal-identity.js.map +1 -1
  194. package/docs/bidirectional-agent-protocol.md +1 -1
  195. package/docs/callback-compatibility.md +2 -1
  196. package/docs/claude-cli-direct.md +44 -13
  197. package/docs/list-output.md +8 -0
  198. package/docs/operator-guide.md +79 -5
  199. package/docs/storage-and-logging.md +10 -5
  200. package/docs/testing.md +4 -2
  201. package/openclaw.plugin.json +1 -1
  202. package/package.json +1 -1
  203. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +29 -14
@@ -0,0 +1,77 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { readJsonFileNoFollow } from "./durable-json-file.js";
4
+ import { nativeAuthorityStore, nativeAuthorityThreadIds, canonicalAuthorityStore } from "./native-store-authority.js";
5
+ import { associateTerminalEndpointEvidence } from "./terminal-control-ref.js";
6
+ import { createTerminalDispatchRepositoryCliAdapter } from "./terminal-dispatch-repository-cli-adapter.js";
7
+ import { captureStoreOwnerIdentity } from "./store-owner-identity.js";
8
+ import { registerStoreOwnerIdentity } from "./store-owner-registry.js";
9
+ import { withStoreWriterLease } from "./store.js";
10
+ import { cliEnv } from "./cli-runtime-context.js";
11
+ import { recordValue } from "./value-guards.js";
12
+ function matchingLedgers(input) {
13
+ const directory = path.join(input.runtimeDir, "terminal-dispatch");
14
+ let names;
15
+ try {
16
+ names = fs.readdirSync(directory);
17
+ }
18
+ catch (error) {
19
+ if (error.code === "ENOENT")
20
+ return [];
21
+ throw error;
22
+ }
23
+ return names.filter(name => /^terminal-dispatch-[0-9a-f]+\.json$/u.test(name)).flatMap(name => {
24
+ const ledger = recordValue(readJsonFileNoFollow(path.join(directory, name), "terminal authority ledger"));
25
+ if (!ledger)
26
+ throw new Error("terminal authority ledger is unreadable; refusing native mutation");
27
+ return nativeAuthorityThreadIds(ledger).includes(input.nativeThreadId.toLowerCase()) ? [ledger] : [];
28
+ });
29
+ }
30
+ /** Native backend access must not bypass an existing managed terminal authority. */
31
+ export function assertNativeRuntimeStoreAuthority(input) {
32
+ for (const ledger of matchingLedgers(input)) {
33
+ const transfer = recordValue(ledger.store_authority_transfer);
34
+ if (nativeAuthorityStore(ledger) !== canonicalAuthorityStore(input.storeDir) || transfer && transfer.phase !== "committed") {
35
+ throw new Error("native thread has conflicting or transferring Store authority; refresh AKK list and use " +
36
+ "transfer_store_authority (agent_knock_knock_reconcile_binding operation=transfer_store_authority); no native input sent");
37
+ }
38
+ }
39
+ }
40
+ function ledgerControl(ledger) {
41
+ const value = recordValue(ledger.terminal_control);
42
+ if (!value || !["herdr", "tmux"].includes(String(value.kind)))
43
+ throw new Error("unverified authority terminal control");
44
+ const common = { target: String(value.target), session: String(value.session ?? ""),
45
+ socketPath: typeof value.socket_path === "string" ? value.socket_path : undefined,
46
+ panePid: Number(value.pane_pid), capabilities: [] };
47
+ const control = value.kind === "herdr" ? { ...common, kind: "herdr",
48
+ workspaceId: String(value.workspace_id), tabId: String(value.tab_id), paneId: String(value.pane_id),
49
+ terminalId: String(value.terminal_id), sessionDir: typeof value.session_dir === "string" ? value.session_dir : undefined }
50
+ : { ...common, kind: "tmux", window: 0, pane: 0 };
51
+ return ledger.terminal_endpoint ? associateTerminalEndpointEvidence(control, ledger.terminal_endpoint) : control;
52
+ }
53
+ export async function withNativeRuntimeStoreAuthority(input, action) {
54
+ const repository = createTerminalDispatchRepositoryCliAdapter();
55
+ if (path.resolve(input.runtimeDir) !== path.resolve(repository.runtimeDir()))
56
+ throw new Error("native authority runtime namespace changed");
57
+ const controls = [...new Map(matchingLedgers(input).map(ledger => {
58
+ const control = ledgerControl(ledger);
59
+ return [repository.runtimeKey(control), control];
60
+ })).entries()].sort(([a], [b]) => a.localeCompare(b)).map(([, control]) => control);
61
+ const releases = [];
62
+ try {
63
+ for (const control of controls)
64
+ releases.push(repository.acquire(input.storeDir, control));
65
+ assertNativeRuntimeStoreAuthority(input);
66
+ if (controls.length)
67
+ withStoreWriterLease(input.storeDir, () => {
68
+ registerStoreOwnerIdentity(captureStoreOwnerIdentity(input.storeDir, cliEnv()));
69
+ });
70
+ return await action();
71
+ }
72
+ finally {
73
+ for (const release of releases.reverse())
74
+ release();
75
+ }
76
+ }
77
+ //# sourceMappingURL=native-store-authority-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-store-authority-runtime.js","sourceRoot":"","sources":["../../src/native-store-authority-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { TerminalControlRef } from "./terminal-control-ref.js";
2
+ import type { TerminalDispatchLedgerDocument as Ledger } from "./terminal-dispatch-ledger-codec.js";
3
+ import type { TerminalDispatchRepositoryCliAdapter } from "./terminal-dispatch-repository-cli-adapter.js";
4
+ export interface NativeStoreAuthorityTransferRequest {
5
+ storeDir: string;
6
+ terminalControl: TerminalControlRef;
7
+ expectedAuthorityToken?: string;
8
+ maintenanceAcknowledgement?: boolean;
9
+ automatic?: boolean;
10
+ }
11
+ export declare function completedNativeStoreAuthorityReceipt(input: NativeStoreAuthorityTransferRequest, ledger?: Ledger): {
12
+ transferred: true;
13
+ transfer_id: string;
14
+ session_id: string;
15
+ store_dir: string;
16
+ } | undefined;
17
+ /** Caller holds the shared terminal lock. Store leases are deliberately sequential. */
18
+ export declare function transferNativeStoreAuthorityWhileLocked(input: NativeStoreAuthorityTransferRequest, repository: TerminalDispatchRepositoryCliAdapter): {
19
+ transferred: true;
20
+ transfer_id: string;
21
+ session_id: string;
22
+ store_dir: string;
23
+ };
24
+ export declare function transferNativeStoreAuthority(input: NativeStoreAuthorityTransferRequest, repository: TerminalDispatchRepositoryCliAdapter): {
25
+ transferred: true;
26
+ transfer_id: string;
27
+ session_id: string;
28
+ store_dir: string;
29
+ };
30
+ /** Called after the terminal lock and before the destination Store lease. */
31
+ export declare function recoverNativeStoreAuthorityWhileLocked(input: Omit<NativeStoreAuthorityTransferRequest, "automatic">, repository: TerminalDispatchRepositoryCliAdapter): void;
@@ -0,0 +1,172 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { cliEnv } from "./cli-runtime-context.js";
3
+ import { canonicalJson } from "./canonical-json.js";
4
+ import { loadManagedSession, saveManagedSession, listManagedSessions, tryLoadManagedSession } from "./session-store.js";
5
+ import { withStoreWriterLease } from "./store.js";
6
+ import { captureStoreOwnerIdentity } from "./store-owner-identity.js";
7
+ import { readStoreOwnerInventory, registerStoreOwnerIdentity, probeStoreOwnerInventory } from "./store-owner-registry.js";
8
+ import { canonicalAuthorityStore, inspectNativeStoreAuthority, nativeAuthorityWorkSettled } from "./native-store-authority.js";
9
+ import { recordValue } from "./value-guards.js";
10
+ function readJournal(ledger) {
11
+ const journal = recordValue(ledger.store_authority_transfer);
12
+ if (!journal || journal.phase === "committed")
13
+ return undefined;
14
+ if (journal.version !== 1 || !journal.source_session || !journal.target_session ||
15
+ typeof journal.source_store_dir !== "string" || typeof journal.target_store_dir !== "string" ||
16
+ typeof journal.transfer_id !== "string" || !["prepared", "source_retired", "target_created"].includes(String(journal.phase))) {
17
+ throw new Error("Store authority transfer journal is invalid; preserve evidence and repair it before retrying");
18
+ }
19
+ return journal;
20
+ }
21
+ function verifySourceOwner(journal) {
22
+ const inventory = readStoreOwnerInventory(journal.source_store_dir);
23
+ if (inventory.fingerprint !== journal.source_inventory)
24
+ throw new Error("source Store owner registrations changed during transfer; no input sent");
25
+ if (journal.legacy_acknowledged && inventory.reason === "owner_inventory_absent")
26
+ return;
27
+ if (probeStoreOwnerInventory(inventory).state !== "dead")
28
+ throw new Error("source Store has an active or unverifiable owner; transfer refused; no input sent");
29
+ }
30
+ function prepareJournal(input, ledger) {
31
+ const inspection = inspectNativeStoreAuthority({ ...input, ledger });
32
+ if (!inspection.transferEligible || !inspection.session || !inspection.sourceStoreDir) {
33
+ throw new Error(`Store authority transfer refused: ${inspection.reason ?? inspection.state}; no input sent`);
34
+ }
35
+ if (input.automatic ? !inspection.automaticEligible : inspection.fingerprint !== input.expectedAuthorityToken) {
36
+ throw new Error("Store authority changed or is not automatically reclaimable; refresh AKK list; no input sent");
37
+ }
38
+ if (inspection.ownerStatus === "legacy" && input.maintenanceAcknowledgement !== true) {
39
+ throw new Error("legacy Store owner is unknown; stop all associated Hosts/writers, then explicitly supply maintenance_acknowledgement=true");
40
+ }
41
+ const source = inspection.session;
42
+ const now = new Date().toISOString();
43
+ const id = randomUUID();
44
+ const target = { ...source, revision: undefined, status: "bound",
45
+ binding: { ...source.binding, binding_id: randomUUID(), generation: source.binding.generation + 1,
46
+ bound_at: now, last_verified_at: now },
47
+ updated_at: now, detached_at: undefined, quarantine_reason: undefined,
48
+ authority_transfer: undefined,
49
+ authority_received: { transfer_id: id, source_store_dir: inspection.sourceStoreDir, received_at: now } };
50
+ return { version: 1, transfer_id: id, phase: "prepared", source_store_dir: inspection.sourceStoreDir,
51
+ target_store_dir: canonicalAuthorityStore(input.storeDir),
52
+ source_inventory: readStoreOwnerInventory(inspection.sourceStoreDir).fingerprint,
53
+ source_session: source, target_session: JSON.parse(JSON.stringify(target)),
54
+ generation: (inspection.generation ?? 1) + 1,
55
+ automatic: input.automatic === true, legacy_acknowledged: inspection.ownerStatus === "legacy",
56
+ started_at: now, initial_authority_token: input.expectedAuthorityToken };
57
+ }
58
+ export function completedNativeStoreAuthorityReceipt(input, ledger) {
59
+ const journal = recordValue(ledger?.store_authority_transfer);
60
+ if (!journal || journal.phase !== "committed" || journal.target_store_dir !== canonicalAuthorityStore(input.storeDir) ||
61
+ (input.automatic ? journal.automatic !== true : !input.expectedAuthorityToken || input.expectedAuthorityToken !== journal.initial_authority_token))
62
+ return undefined;
63
+ return { transferred: true, transfer_id: String(journal.transfer_id),
64
+ session_id: String(recordValue(journal.target_session)?.session_id), store_dir: String(journal.target_store_dir) };
65
+ }
66
+ function targetAvailable(journal) {
67
+ const existing = listManagedSessions(journal.target_store_dir);
68
+ for (const session of existing) {
69
+ if ((session.session_id === journal.target_session.session_id ||
70
+ session.binding?.native_thread_id === journal.target_session.binding?.native_thread_id) &&
71
+ session.authority_received?.transfer_id !== journal.transfer_id) {
72
+ throw new Error("destination Store already has a competing Session; transfer refused");
73
+ }
74
+ }
75
+ }
76
+ /** Caller holds the shared terminal lock. Store leases are deliberately sequential. */
77
+ export function transferNativeStoreAuthorityWhileLocked(input, repository) {
78
+ let ledger = repository.load(input.terminalControl);
79
+ if (!ledger || !repository.matchesControl(ledger, input.terminalControl)) {
80
+ throw new Error("Store authority terminal incarnation changed; refresh AKK list; no input sent");
81
+ }
82
+ const completed = completedNativeStoreAuthorityReceipt(input, ledger);
83
+ if (completed)
84
+ return completed;
85
+ let journal = readJournal(ledger);
86
+ if (journal) {
87
+ const inspection = inspectNativeStoreAuthority({ ...input, ledger });
88
+ if (canonicalAuthorityStore(input.storeDir) !== journal.target_store_dir ||
89
+ (input.automatic ? !journal.automatic : inspection.fingerprint !== input.expectedAuthorityToken)) {
90
+ throw new Error("unfinished Store authority transfer belongs to another destination or snapshot");
91
+ }
92
+ }
93
+ else
94
+ journal = prepareJournal(input, ledger);
95
+ const transaction = journal;
96
+ const persist = (phase) => {
97
+ transaction.phase = phase;
98
+ ledger = { ...ledger, store_authority_transfer: { ...transaction } };
99
+ repository.save(input.terminalControl, ledger, { authorityTransfer: true });
100
+ };
101
+ // Upgrade/check destination before installing a durable fence. Once prepared,
102
+ // every crash point is resumed by this journal, without any terminal input.
103
+ withStoreWriterLease(transaction.target_store_dir, () => {
104
+ targetAvailable(transaction);
105
+ const owner = captureStoreOwnerIdentity(transaction.target_store_dir, cliEnv());
106
+ registerStoreOwnerIdentity(owner);
107
+ if (!readStoreOwnerInventory(transaction.target_store_dir).complete)
108
+ throw new Error("destination owner inventory is incomplete; source authority unchanged");
109
+ transaction.target_owner ??= owner;
110
+ });
111
+ withStoreWriterLease(transaction.source_store_dir, () => {
112
+ verifySourceOwner(transaction);
113
+ const source = loadManagedSession(transaction.source_store_dir, transaction.source_session.session_id);
114
+ if (source.authority_transfer?.transfer_id === transaction.transfer_id)
115
+ return;
116
+ if (canonicalJson(source) !== canonicalJson(transaction.source_session) ||
117
+ !nativeAuthorityWorkSettled(transaction.source_store_dir, source)) {
118
+ throw new Error("source Session/work changed during authority transfer; no input sent");
119
+ }
120
+ persist("prepared");
121
+ saveManagedSession(transaction.source_store_dir, { ...source, status: "quarantined",
122
+ quarantine_reason: "native Store authority transferred", updated_at: transaction.started_at,
123
+ authority_transfer: { transfer_id: transaction.transfer_id, target_store_dir: transaction.target_store_dir,
124
+ transferred_at: transaction.started_at } }, { expectedRevision: source.revision });
125
+ persist("source_retired");
126
+ });
127
+ withStoreWriterLease(transaction.target_store_dir, () => {
128
+ verifySourceOwner(transaction);
129
+ targetAvailable(transaction);
130
+ const present = tryLoadManagedSession(transaction.target_store_dir, transaction.target_session.session_id);
131
+ const { revision: _revision, ...presentBody } = present ?? {};
132
+ if (present && canonicalJson(presentBody) !== canonicalJson(transaction.target_session)) {
133
+ throw new Error("destination Session changed before authority transfer commit; preserve the journal and inspect the destination");
134
+ }
135
+ if (!present)
136
+ saveManagedSession(transaction.target_store_dir, transaction.target_session, { expectedRevision: null });
137
+ persist("target_created");
138
+ const owner = captureStoreOwnerIdentity(transaction.target_store_dir, cliEnv());
139
+ registerStoreOwnerIdentity(owner);
140
+ const session = loadManagedSession(transaction.target_store_dir, transaction.target_session.session_id);
141
+ // No old Turn is adopted or replayed. Its callback/history stay in source.
142
+ ledger = { status: "resolved", store_dir: transaction.target_store_dir,
143
+ native_thread_id: session.binding.native_thread_id, session_id: session.session_id,
144
+ binding: session.binding, resolved_at: new Date().toISOString(),
145
+ reason: "native Store authority transferred without terminal input",
146
+ store_authority: { version: 1, generation: transaction.generation,
147
+ store_dir: transaction.target_store_dir, owner },
148
+ store_authority_transfer: { ...transaction, phase: "committed" } };
149
+ repository.save(input.terminalControl, ledger, { authorityTransfer: true });
150
+ });
151
+ return { transferred: true, transfer_id: transaction.transfer_id,
152
+ session_id: transaction.target_session.session_id, store_dir: transaction.target_store_dir };
153
+ }
154
+ export function transferNativeStoreAuthority(input, repository) {
155
+ const release = repository.acquire(input.storeDir, input.terminalControl);
156
+ try {
157
+ return transferNativeStoreAuthorityWhileLocked(input, repository);
158
+ }
159
+ finally {
160
+ release();
161
+ }
162
+ }
163
+ /** Called after the terminal lock and before the destination Store lease. */
164
+ export function recoverNativeStoreAuthorityWhileLocked(input, repository) {
165
+ const ledger = repository.load(input.terminalControl);
166
+ const inspection = inspectNativeStoreAuthority({ ...input, ledger });
167
+ const journal = ledger && readJournal(ledger);
168
+ if (inspection.automaticEligible || journal?.automatic && journal.target_store_dir === canonicalAuthorityStore(input.storeDir)) {
169
+ transferNativeStoreAuthorityWhileLocked({ ...input, automatic: true }, repository);
170
+ }
171
+ }
172
+ //# sourceMappingURL=native-store-authority-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-store-authority-transfer.js","sourceRoot":"","sources":["../../src/native-store-authority-transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type TerminalControlRef } from "./terminal-control-ref.js";
2
+ /** Register the creating Host atomically with the Watch's durable authority. */
3
+ export declare function withNativeAuthorityWatchOwner<T>(storeDir: string, create: () => T): T;
4
+ /** Read only: a transfer must retain outstanding Watch observation/callback ownership. */
5
+ export declare function hasOutstandingNativeAuthorityWatch(input: {
6
+ storeDir: string;
7
+ terminalControl: TerminalControlRef;
8
+ nativeThreadId?: string;
9
+ }): boolean;
@@ -0,0 +1,43 @@
1
+ import { terminalControlEvidenceMatches } from "./terminal-control-ref.js";
2
+ import { listTerminalWatches } from "./terminal-watch-store.js";
3
+ import { cliEnv } from "./cli-runtime-context.js";
4
+ import { captureStoreOwnerIdentity } from "./store-owner-identity.js";
5
+ import { registerStoreOwnerIdentity } from "./store-owner-registry.js";
6
+ import { withStoreWriterLease } from "./store.js";
7
+ /** Register the creating Host atomically with the Watch's durable authority. */
8
+ export function withNativeAuthorityWatchOwner(storeDir, create) {
9
+ return withStoreWriterLease(storeDir, () => {
10
+ registerStoreOwnerIdentity(captureStoreOwnerIdentity(storeDir, cliEnv()));
11
+ return create();
12
+ });
13
+ }
14
+ function watchNativeThreadId(watch) {
15
+ const anchor = watch.anchor;
16
+ if (anchor.schema === "agent-knock-knock/claude-human-started-active-task-anchor")
17
+ return anchor.session_id;
18
+ if (anchor.schema === "agent-knock-knock/claude-user-explicit-fallback-watch-anchor")
19
+ return anchor.transcript_anchor.session_id;
20
+ if (anchor.schema === "agent-knock-knock/codex-human-started-active-task-anchor" ||
21
+ anchor.schema === "agent-knock-knock/codex-paginated-task-anchor")
22
+ return anchor.native_thread_id;
23
+ if (anchor.schema !== "agent-knock-knock/codex-user-explicit-fallback-watch-anchor")
24
+ return undefined;
25
+ const checkpoint = watch.observation_checkpoint;
26
+ if ("schema" in checkpoint && checkpoint.schema === "agent-knock-knock/codex-user-explicit-fallback-watch-checkpoint") {
27
+ const accepted = checkpoint.accepted_identity?.native_thread_id;
28
+ if (accepted)
29
+ return accepted;
30
+ }
31
+ return anchor.acceptance_anchor.version === 1 ? anchor.acceptance_anchor.native_thread_id : undefined;
32
+ }
33
+ /** Read only: a transfer must retain outstanding Watch observation/callback ownership. */
34
+ export function hasOutstandingNativeAuthorityWatch(input) {
35
+ return listTerminalWatches(input.storeDir).some(watch => {
36
+ const nativeThreadId = watchNativeThreadId(watch);
37
+ const related = nativeThreadId && input.nativeThreadId
38
+ ? nativeThreadId.toLowerCase() === input.nativeThreadId.toLowerCase()
39
+ : terminalControlEvidenceMatches(watch.terminal.terminal_endpoint, input.terminalControl);
40
+ return related && (watch.status === "active" || watch.notification_outbox.some(notification => notification.status !== "delivered" && notification.status !== "superseded"));
41
+ });
42
+ }
43
+ //# sourceMappingURL=native-store-authority-watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-store-authority-watch.js","sourceRoot":"","sources":["../../src/native-store-authority-watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAA2B,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAsB,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,gFAAgF;AAChF,MAAM,UAAU,6BAA6B,CAAI,QAAgB,EAAE,MAAe;IAChF,OAAO,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE;QACzC,0BAA0B,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAoB;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,2DAA2D;QAAE,OAAO,MAAM,CAAC,UAAU,CAAC;IAC5G,IAAI,MAAM,CAAC,MAAM,KAAK,8DAA8D;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC;IACjI,IAAI,MAAM,CAAC,MAAM,KAAK,0DAA0D;QAC9E,MAAM,CAAC,MAAM,KAAK,+CAA+C;QAAE,OAAO,MAAM,CAAC,gBAAgB,CAAC;IACpG,IAAI,MAAM,CAAC,MAAM,KAAK,6DAA6D;QAAE,OAAO,SAAS,CAAC;IACtG,MAAM,UAAU,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAChD,IAAI,QAAQ,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,iEAAiE,EAAE,CAAC;QACtH,MAAM,QAAQ,GAAG,UAAU,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;QAChE,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC,iBAAiB,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;AACxG,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,kCAAkC,CAAC,KAIlD;IACC,OAAO,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACtD,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,cAAc,IAAI,KAAK,CAAC,cAAc;YACpD,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE;YACrE,CAAC,CAAC,8BAA8B,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5F,OAAO,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAC5F,YAAY,CAAC,MAAM,KAAK,WAAW,IAAI,YAAY,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ManagedSessionState } from "./managed-session.js";
2
+ import { type TerminalControlRef } from "./terminal-control-ref.js";
3
+ import type { TerminalDispatchLedgerDocument } from "./terminal-dispatch-ledger-codec.js";
4
+ export interface NativeStoreAuthorityInspection {
5
+ state: "none" | "current" | "conflict" | "transferring";
6
+ reason?: string;
7
+ sourceStoreDir?: string;
8
+ sessionId?: string;
9
+ generation?: number;
10
+ fingerprint?: string;
11
+ transferEligible: boolean;
12
+ automaticEligible: boolean;
13
+ ownerStatus: "alive" | "dead" | "unknown" | "legacy";
14
+ session?: ManagedSessionState;
15
+ }
16
+ export declare function canonicalAuthorityStore(storeDir: string): string;
17
+ export declare function nativeAuthorityStore(ledger: TerminalDispatchLedgerDocument): string | undefined;
18
+ export declare function nativeAuthorityThreadIds(ledger: TerminalDispatchLedgerDocument): string[];
19
+ /** A resolved dispatch releases the Turn, not this native thread's Store authority. */
20
+ export declare function nativeAuthorityWorkSettled(storeDir: string, session: ManagedSessionState): boolean;
21
+ export declare function nativeAuthorityFingerprint(value: unknown): string;
22
+ /** Shared, read-only authority predicate for List, Status and mutation preflight. */
23
+ export declare function inspectNativeStoreAuthority(input: {
24
+ ledger?: TerminalDispatchLedgerDocument;
25
+ terminalControl: TerminalControlRef;
26
+ nativeThreadId?: string;
27
+ storeDir: string;
28
+ }): NativeStoreAuthorityInspection;
29
+ export declare function assertNativeStoreAuthorityCurrent(input: Parameters<typeof inspectNativeStoreAuthority>[0]): void;
@@ -0,0 +1,181 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { canonicalJson } from "./canonical-json.js";
5
+ import { listDeferredForegroundTransfers } from "./deferred-foreground-transfer.js";
6
+ import { isFinalDeferredForegroundTransferStatus } from "./deferred-foreground-transfer-policy.js";
7
+ import { listManagedSessions, listNativeThreadTransitions } from "./session-store.js";
8
+ import { listConversations, pathsForConversationDir, storeManifestPath } from "./store.js";
9
+ import { readJsonFileNoFollow } from "./durable-json-file.js";
10
+ import { hasOutstandingNativeAuthorityWatch } from "./native-store-authority-watch.js";
11
+ import { isSessionSendBlockingStatus, sessionIdForConversation } from "./protocol.js";
12
+ import { terminalControlEvidence, terminalControlEvidenceMatches } from "./terminal-control-ref.js";
13
+ import { isStoreOwnerIdentity, storeOwnerKind } from "./store-owner-identity.js";
14
+ import { readStoreOwnerInventory, probeStoreOwnerInventory } from "./store-owner-registry.js";
15
+ import { nonBlankString, recordValue } from "./value-guards.js";
16
+ export function canonicalAuthorityStore(storeDir) {
17
+ const resolved = path.resolve(storeDir);
18
+ try {
19
+ return fs.realpathSync(resolved);
20
+ }
21
+ catch {
22
+ return resolved;
23
+ }
24
+ }
25
+ export function nativeAuthorityStore(ledger) {
26
+ const stored = nonBlankString(ledger.store_dir);
27
+ if (stored)
28
+ return canonicalAuthorityStore(stored);
29
+ const statePath = nonBlankString(ledger.state_path);
30
+ if (!statePath)
31
+ return undefined;
32
+ try {
33
+ return canonicalAuthorityStore(pathsForConversationDir(path.dirname(statePath)).storeDir);
34
+ }
35
+ catch {
36
+ return undefined;
37
+ }
38
+ }
39
+ export function nativeAuthorityThreadIds(ledger) {
40
+ const binding = recordValue(ledger.binding);
41
+ return [ledger.native_thread_id, binding?.native_thread_id,
42
+ ledger.before_native_thread_id, ledger.target_native_thread_id]
43
+ .flatMap(value => nonBlankString(value)?.toLowerCase() ?? []);
44
+ }
45
+ /** A resolved dispatch releases the Turn, not this native thread's Store authority. */
46
+ export function nativeAuthorityWorkSettled(storeDir, session) {
47
+ if (!["bound", "detached"].includes(session.status) || session.authority_transfer)
48
+ return false;
49
+ const turns = listConversations(storeDir).filter(turn => sessionIdForConversation(turn) === session.session_id);
50
+ if (turns.some(turn => isSessionSendBlockingStatus(turn.status) ||
51
+ recordValue(turn.approval_state)?.blocked === true ||
52
+ [turn.callback_delivery, turn.callback_notification_delivery].some(hasUnsettledAuthorityCallback)))
53
+ return false;
54
+ if (listNativeThreadTransitions(storeDir).some(transition => (transition.source_session_id === session.session_id || transition.target_session_id === session.session_id) &&
55
+ !["committed", "aborted"].includes(transition.status)))
56
+ return false;
57
+ if (session.binding && hasOutstandingNativeAuthorityWatch({ storeDir,
58
+ terminalControl: session.binding.terminal_control, nativeThreadId: session.binding.native_thread_id }))
59
+ return false;
60
+ // Conservatively wait for all Store transfers: a callback/deferred handoff may
61
+ // carry authority indirectly through a Turn rather than the Session id.
62
+ return !listDeferredForegroundTransfers(storeDir).some(transfer => !isFinalDeferredForegroundTransferStatus(transfer.status));
63
+ }
64
+ function hasUnsettledAuthorityCallback(value) {
65
+ const delivery = recordValue(value);
66
+ return Boolean(delivery && !["delivered", "accepted", "superseded"].includes(String(delivery.status)));
67
+ }
68
+ export function nativeAuthorityFingerprint(value) {
69
+ return createHash("sha256").update(canonicalJson(value)).digest("hex");
70
+ }
71
+ /** Shared, read-only authority predicate for List, Status and mutation preflight. */
72
+ export function inspectNativeStoreAuthority(input) {
73
+ const result = {
74
+ state: "none", ownerStatus: "legacy", transferEligible: false, automaticEligible: false
75
+ };
76
+ const ledger = input.ledger;
77
+ if (!ledger)
78
+ return result;
79
+ const ids = nativeAuthorityThreadIds(ledger);
80
+ if (!ids.length || input.nativeThreadId && !ids.includes(input.nativeThreadId.toLowerCase()))
81
+ return result;
82
+ const evidence = ledger.terminal_endpoint ?? ledger.terminal_control;
83
+ if (!terminalControlEvidenceMatches(evidence, input.terminalControl, { requireProcessAnchor: false })) {
84
+ return { ...result, state: "conflict", reason: "authority_terminal_identity_unverified" };
85
+ }
86
+ result.sourceStoreDir = nativeAuthorityStore(ledger);
87
+ result.sessionId = nonBlankString(ledger.session_id ?? ledger.target_session_id);
88
+ const authority = recordValue(ledger.store_authority);
89
+ result.generation = Number(authority?.generation ?? 1);
90
+ const transfer = recordValue(ledger.store_authority_transfer);
91
+ const inProgress = transfer && transfer.phase !== "committed";
92
+ result.state = inProgress ? "transferring" : result.sourceStoreDir === canonicalAuthorityStore(input.storeDir) ? "current" : "conflict";
93
+ if (result.state === "current")
94
+ return result;
95
+ result.reason = inProgress ? "store_authority_transfer_incomplete" : "native_thread_authoritative_in_another_store";
96
+ if (!result.sourceStoreDir || !result.sessionId) {
97
+ result.reason = "authority_store_or_session_unverified";
98
+ return result;
99
+ }
100
+ return inspectForeignStoreAuthority(input, ledger, result);
101
+ }
102
+ function inspectForeignStoreAuthority(input, ledger, result) {
103
+ const sourceStoreDir = result.sourceStoreDir;
104
+ const ids = nativeAuthorityThreadIds(ledger);
105
+ const authority = recordValue(ledger.store_authority);
106
+ const transfer = recordValue(ledger.store_authority_transfer);
107
+ const inProgress = transfer && transfer.phase !== "committed";
108
+ try {
109
+ const inventory = readStoreOwnerInventory(sourceStoreDir);
110
+ result.ownerStatus = inspectStoreAuthorityOwner(ledger.store_authority, inventory, sourceStoreDir);
111
+ const sessions = listManagedSessions(sourceStoreDir);
112
+ const session = sessions.find(value => value.session_id === result.sessionId);
113
+ if (!session || !session.binding || !ids.includes(session.binding.native_thread_id?.toLowerCase() ?? "")) {
114
+ result.reason = "authority_session_binding_unverified";
115
+ return result;
116
+ }
117
+ result.session = session;
118
+ result.fingerprint = nativeAuthorityFingerprint({ ledger, session, inventory: inventory.fingerprint,
119
+ targetStore: canonicalAuthorityStore(input.storeDir), terminal: terminalControlEvidence(input.terminalControl) });
120
+ if (inProgress)
121
+ return inspectPendingTransfer(result, transfer, inventory.fingerprint, input.storeDir);
122
+ if (ledger.status !== "resolved" || !nativeAuthorityWorkSettled(sourceStoreDir, session)) {
123
+ result.reason = "authority_has_unresolved_work";
124
+ return result;
125
+ }
126
+ if (["alive", "unknown"].includes(result.ownerStatus)) {
127
+ result.reason = `authority_owner_${result.ownerStatus}`;
128
+ return result;
129
+ }
130
+ result.transferEligible = true;
131
+ result.automaticEligible = automaticOwnerEvidence(result, authority, inventory);
132
+ return result;
133
+ }
134
+ catch {
135
+ return { ...result, reason: "authority_evidence_unreadable", transferEligible: false, automaticEligible: false };
136
+ }
137
+ }
138
+ function inspectStoreAuthorityOwner(value, inventory, sourceStoreDir) {
139
+ const authority = recordValue(value);
140
+ if (value !== undefined && (!authority || authority.version !== 1 || !isStoreOwnerIdentity(authority.owner)))
141
+ return "unknown";
142
+ if (authority && (canonicalAuthorityStore(String(authority.store_dir)) !== sourceStoreDir ||
143
+ !inventory.owners.some(owner => canonicalJson(owner) === canonicalJson(authority.owner))))
144
+ return "unknown";
145
+ if (!authority && inventory.reason === "owner_inventory_absent")
146
+ return "legacy";
147
+ const state = probeStoreOwnerInventory(inventory).state;
148
+ if (state !== "dead")
149
+ return state;
150
+ const manifest = recordValue(readJsonFileNoFollow(storeManifestPath(sourceStoreDir), "Store manifest"));
151
+ return !authority || authority.legacy_owner_coverage === true || manifest?.owner_registration !== "required" ? "legacy" : "dead";
152
+ }
153
+ function automaticOwnerEvidence(result, authority, inventory) {
154
+ return result.ownerStatus === "dead" && isStoreOwnerIdentity(authority?.owner) && inventory.complete &&
155
+ inventory.owners.some(owner => canonicalJson(owner) === canonicalJson(authority.owner)) &&
156
+ inventory.owners.every(owner => owner.store_kind === "ephemeral") &&
157
+ storeOwnerKind(result.sourceStoreDir, { AKK_EPHEMERAL_STORE: "1" }) === "ephemeral";
158
+ }
159
+ function inspectPendingTransfer(result, transfer, inventoryFingerprint, storeDir) {
160
+ if (transfer.source_inventory !== inventoryFingerprint) {
161
+ result.reason = "authority_owner_registrations_changed";
162
+ return result;
163
+ }
164
+ if (result.ownerStatus === "alive" || result.ownerStatus === "unknown" ||
165
+ result.ownerStatus === "legacy" && transfer.legacy_acknowledged !== true) {
166
+ result.reason = `authority_owner_${result.ownerStatus}`;
167
+ return result;
168
+ }
169
+ result.transferEligible = canonicalAuthorityStore(String(transfer.target_store_dir)) === canonicalAuthorityStore(storeDir);
170
+ return result;
171
+ }
172
+ export function assertNativeStoreAuthorityCurrent(input) {
173
+ const inspected = inspectNativeStoreAuthority(input);
174
+ if (!["conflict", "transferring"].includes(inspected.state))
175
+ return;
176
+ throw new Error(`terminal ${input.terminalControl.target} native thread is authoritative in another Store ` +
177
+ `${inspected.sourceStoreDir ?? "(unverified)"}: ${inspected.reason}. Refresh AKK list and use its ` +
178
+ "transfer_store_authority action (agent_knock_knock_reconcile_binding operation=transfer_store_authority). " +
179
+ "Active or unverifiable owners must be stopped/repaired first; do not delete the Store or runtime ledger.");
180
+ }
181
+ //# sourceMappingURL=native-store-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-store-authority.js","sourceRoot":"","sources":["../../src/native-store-authority.ts"],"names":[],"mappings":"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"}
@@ -26,4 +26,4 @@ export declare const semanticToolDescriptions: {
26
26
  readonly identify_foreground: string;
27
27
  readonly identify_and_send: string;
28
28
  };
29
- export declare const semanticCommandGuidance: readonly ["For a requested new Desktop conversation use agent_knock_knock_desktop_create, optionally with an exact project and first task. Preserve its operation_id and automatic Watch; opening or uncertain operations may only be continued by that same ID. The terminal new_thread tool remains separate and must not be used to replace a Desktop conversation.", "Present conversations[] as CLI or Desktop using surface, with Codex/Claude as agent types. Select its displayed conversation_id and advertised action; AKK chooses the connection. Do not add raw discovery arrays to the list or count them or Watches as independent tasks. Same-project display grouping never proves session identity. Use terminalDebug for complete connection diagnostics. Bound Watch/Turn operations retain their original provider; never retry uncertain input on another route.", string, string, string];
29
+ export declare const semanticCommandGuidance: readonly ["For a requested new Desktop conversation use agent_knock_knock_desktop_create, optionally with an exact project and first task. Preserve its operation_id and automatic Watch; opening or uncertain operations may only be continued by that same ID. The terminal new_thread tool remains separate and must not be used to replace a Desktop conversation.", "Present conversations[] as CLI or Desktop using surface, with Codex/Claude as agent types. Select its displayed conversation_id and advertised action; AKK chooses the connection. New Claude sends prefer an exact managed terminal Turn, falling back to a native Watch only without a controllable exact terminal; Codex sends prefer the verified backend. Do not add raw discovery arrays to the list or count them or Watches as independent tasks. Same-project display grouping never proves session identity. Use terminalDebug for complete connection diagnostics. Bound Watch/Turn operations retain their original provider; never retry uncertain input on another route.", string, string, string];