@scotthuang/agent-knock-knock 0.14.2 → 0.14.3

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 (116) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +233 -108
  3. package/dist/src/backend-callback-public-projection.d.ts +27 -0
  4. package/dist/src/backend-callback-public-projection.js +58 -0
  5. package/dist/src/backend-callback-public-projection.js.map +1 -0
  6. package/dist/src/backend-public-progress.d.ts +2 -0
  7. package/dist/src/backend-public-progress.js +4 -1
  8. package/dist/src/backend-public-progress.js.map +1 -1
  9. package/dist/src/backend-recovery-semantic.js +5 -4
  10. package/dist/src/backend-recovery-semantic.js.map +1 -1
  11. package/dist/src/callback-transport.d.ts +1 -1
  12. package/dist/src/callback-transport.js +2 -2
  13. package/dist/src/callback-transport.js.map +1 -1
  14. package/dist/src/claude-conversation-routing-cli-adapter.d.ts +2 -0
  15. package/dist/src/claude-conversation-routing-cli-adapter.js +127 -0
  16. package/dist/src/claude-conversation-routing-cli-adapter.js.map +1 -0
  17. package/dist/src/claude-conversation-routing-identity.d.ts +11 -0
  18. package/dist/src/claude-conversation-routing-identity.js +46 -0
  19. package/dist/src/claude-conversation-routing-identity.js.map +1 -0
  20. package/dist/src/claude-native-cli-adapter.d.ts +18 -0
  21. package/dist/src/claude-native-cli-adapter.js +159 -0
  22. package/dist/src/claude-native-cli-adapter.js.map +1 -0
  23. package/dist/src/claude-native-client.d.ts +57 -0
  24. package/dist/src/claude-native-client.js +197 -0
  25. package/dist/src/claude-native-client.js.map +1 -0
  26. package/dist/src/claude-native-discovery.d.ts +20 -0
  27. package/dist/src/claude-native-discovery.js +111 -0
  28. package/dist/src/claude-native-discovery.js.map +1 -0
  29. package/dist/src/claude-native-identity.d.ts +29 -0
  30. package/dist/src/claude-native-identity.js +54 -0
  31. package/dist/src/claude-native-identity.js.map +1 -0
  32. package/dist/src/claude-native-monitor.d.ts +13 -0
  33. package/dist/src/claude-native-monitor.js +123 -0
  34. package/dist/src/claude-native-monitor.js.map +1 -0
  35. package/dist/src/claude-native-observation.d.ts +54 -0
  36. package/dist/src/claude-native-observation.js +418 -0
  37. package/dist/src/claude-native-observation.js.map +1 -0
  38. package/dist/src/claude-native-outbox.d.ts +16 -0
  39. package/dist/src/claude-native-outbox.js +122 -0
  40. package/dist/src/claude-native-outbox.js.map +1 -0
  41. package/dist/src/claude-native-peer-helper.d.ts +2 -0
  42. package/dist/src/claude-native-peer-helper.js +121 -0
  43. package/dist/src/claude-native-peer-helper.js.map +1 -0
  44. package/dist/src/claude-native-public-projection.d.ts +605 -0
  45. package/dist/src/claude-native-public-projection.js +98 -0
  46. package/dist/src/claude-native-public-projection.js.map +1 -0
  47. package/dist/src/claude-native-runtime.d.ts +25 -0
  48. package/dist/src/claude-native-runtime.js +74 -0
  49. package/dist/src/claude-native-runtime.js.map +1 -0
  50. package/dist/src/claude-native-state-store.d.ts +49 -0
  51. package/dist/src/claude-native-state-store.js +96 -0
  52. package/dist/src/claude-native-state-store.js.map +1 -0
  53. package/dist/src/claude-native-task-service.d.ts +70 -0
  54. package/dist/src/claude-native-task-service.js +327 -0
  55. package/dist/src/claude-native-task-service.js.map +1 -0
  56. package/dist/src/cli-core.js +2 -1
  57. package/dist/src/cli-core.js.map +1 -1
  58. package/dist/src/cli-runtime-context.d.ts +2 -0
  59. package/dist/src/cli-runtime-context.js.map +1 -1
  60. package/dist/src/codex-native-outbox.js +7 -5
  61. package/dist/src/codex-native-outbox.js.map +1 -1
  62. package/dist/src/codex-native-public-projection.d.ts +17 -7
  63. package/dist/src/codex-native-public-projection.js +4 -4
  64. package/dist/src/codex-native-public-projection.js.map +1 -1
  65. package/dist/src/codex-native-semantic.js +15 -5
  66. package/dist/src/codex-native-semantic.js.map +1 -1
  67. package/dist/src/conversation-list.js +8 -2
  68. package/dist/src/conversation-list.js.map +1 -1
  69. package/dist/src/conversation-routing-cli-adapter.d.ts +2 -7
  70. package/dist/src/conversation-routing-cli-adapter.js +4 -2
  71. package/dist/src/conversation-routing-cli-adapter.js.map +1 -1
  72. package/dist/src/conversation-routing-commands.d.ts +5 -0
  73. package/dist/src/conversation-routing-commands.js.map +1 -1
  74. package/dist/src/desktop-command-presentation.js +3 -1
  75. package/dist/src/desktop-command-presentation.js.map +1 -1
  76. package/dist/src/desktop-public-projection.js +3 -6
  77. package/dist/src/desktop-public-projection.js.map +1 -1
  78. package/dist/src/desktop-task-service.js +10 -3
  79. package/dist/src/desktop-task-service.js.map +1 -1
  80. package/dist/src/durable-notification-kernel.d.ts +10 -0
  81. package/dist/src/durable-notification-kernel.js +18 -1
  82. package/dist/src/durable-notification-kernel.js.map +1 -1
  83. package/dist/src/host-monitor-reconciliation.js +9 -1
  84. package/dist/src/host-monitor-reconciliation.js.map +1 -1
  85. package/dist/src/host-profile-runtime.js +3 -1
  86. package/dist/src/host-profile-runtime.js.map +1 -1
  87. package/dist/src/local-codex-cli-adapter.js +4 -3
  88. package/dist/src/local-codex-cli-adapter.js.map +1 -1
  89. package/dist/src/openclaw-callback-evidence.d.ts +17 -0
  90. package/dist/src/openclaw-callback-evidence.js +75 -0
  91. package/dist/src/openclaw-callback-evidence.js.map +1 -0
  92. package/dist/src/openclaw-callback-transport.js +90 -9
  93. package/dist/src/openclaw-callback-transport.js.map +1 -1
  94. package/dist/src/semantic-conversation-target.js +1 -1
  95. package/dist/src/semantic-conversation-target.js.map +1 -1
  96. package/dist/src/semantic-tool-command-helpers.d.ts +0 -1
  97. package/dist/src/semantic-tool-command-helpers.js +27 -17
  98. package/dist/src/semantic-tool-command-helpers.js.map +1 -1
  99. package/dist/src/semantic-tool-descriptions.js +3 -3
  100. package/dist/src/semantic-tool-descriptions.js.map +1 -1
  101. package/dist/src/semantic-tool-list-projection.js +11 -4
  102. package/dist/src/semantic-tool-list-projection.js.map +1 -1
  103. package/dist/src/semantic-tool-presentation.js +17 -3
  104. package/dist/src/semantic-tool-presentation.js.map +1 -1
  105. package/dist/src/semantic-tool-runtime.js +8 -1
  106. package/dist/src/semantic-tool-runtime.js.map +1 -1
  107. package/dist/src/semantic-tool-schemas.js +15 -15
  108. package/dist/src/semantic-tool-schemas.js.map +1 -1
  109. package/dist/src/terminal-list-cli-adapter.js +5 -1
  110. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  111. package/dist/src/terminal-list-ownership-service.js +1 -1
  112. package/dist/src/terminal-list-ownership-service.js.map +1 -1
  113. package/docs/backend-task-recovery.md +43 -0
  114. package/docs/claude-cli-direct.md +60 -0
  115. package/package.json +2 -2
  116. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +14 -4
@@ -0,0 +1,197 @@
1
+ import { spawn } from "node:child_process";
2
+ import { createInterface } from "node:readline";
3
+ import { randomUUID } from "node:crypto";
4
+ import { CLAUDE_NATIVE_PEER_HELPER } from "./claude-native-peer-helper.js";
5
+ import { discoverClaudeNativeSessions, inspectClaudeNativeSession } from "./claude-native-discovery.js";
6
+ import { ClaudeNativeError, createClaudeNativeConversationId, isClaudeNativeUuid } from "./claude-native-identity.js";
7
+ /** Parent AKK process owns the helper; the actual writer owns its native reply socket. */
8
+ class MacPeerTransport {
9
+ options;
10
+ child;
11
+ starting;
12
+ closed = false;
13
+ pending = new Map();
14
+ constructor(options) {
15
+ this.options = options;
16
+ }
17
+ get senderPid() { return this.child?.pid; }
18
+ async start() {
19
+ if (this.closed)
20
+ throw new ClaudeNativeError("client_closed", "Claude native client is closed");
21
+ if (this.starting)
22
+ return this.starting;
23
+ this.starting = new Promise((resolve, reject) => {
24
+ const child = spawn(this.options.pythonPath ?? "python3", ["-I", "-u", "-c", CLAUDE_NATIVE_PEER_HELPER], { stdio: ["pipe", "pipe", "pipe"], env: { PATH: process.env.PATH, LANG: process.env.LANG,
25
+ LC_ALL: process.env.LC_ALL, PYTHONIOENCODING: "utf-8" } });
26
+ this.child = child;
27
+ child.stdin.on("error", () => this.failPending());
28
+ const timer = setTimeout(() => { child.kill(); reject(new ClaudeNativeError("peer_helper_unavailable", "Claude peer credential helper did not start")); }, 3000);
29
+ const lines = createInterface({ input: child.stdout });
30
+ lines.on("line", line => {
31
+ if (line.length > 65536)
32
+ return;
33
+ let value;
34
+ try {
35
+ value = JSON.parse(line);
36
+ }
37
+ catch {
38
+ return;
39
+ }
40
+ if (value.ready === true && value.pid === child.pid) {
41
+ clearTimeout(timer);
42
+ resolve();
43
+ return;
44
+ }
45
+ if (value.event === "notice") {
46
+ try {
47
+ this.options.onNotice?.(value);
48
+ }
49
+ catch { /* Observer failures never retry input. */ }
50
+ return;
51
+ }
52
+ const request = this.pending.get(value.id);
53
+ if (!request)
54
+ return;
55
+ clearTimeout(request.timer);
56
+ this.pending.delete(value.id);
57
+ const r = value.result;
58
+ request.resolve(r && ["written", "not_sent", "uncertain"].includes(r.dispatchState)
59
+ ? { ...r, ...(request.action === "send" ? { senderPid: child.pid } : {}) }
60
+ : { dispatchState: request.action === "send" ? "uncertain" : "not_sent", errorCode: "invalid_peer_response",
61
+ ...(request.action === "send" ? { senderPid: child.pid } : {}) });
62
+ });
63
+ child.stderr.resume();
64
+ child.once("error", () => { clearTimeout(timer); reject(new ClaudeNativeError("peer_helper_unavailable", "Python 3 is required for native macOS peer identity verification")); this.failPending(); });
65
+ child.once("exit", () => { clearTimeout(timer); reject(new ClaudeNativeError("peer_helper_exited", "Claude peer credential helper exited")); this.failPending(); this.closed = true; });
66
+ });
67
+ return this.starting;
68
+ }
69
+ failPending() {
70
+ for (const p of this.pending.values()) {
71
+ clearTimeout(p.timer);
72
+ p.resolve({ dispatchState: p.action === "send" ? "uncertain" : "not_sent", errorCode: "peer_helper_exited",
73
+ ...(p.action === "send" ? { senderPid: this.child?.pid } : {}) });
74
+ }
75
+ this.pending.clear();
76
+ }
77
+ async request(action, entry, input = {}) {
78
+ await this.start();
79
+ return new Promise(resolve => {
80
+ const id = randomUUID(), timer = setTimeout(() => {
81
+ this.pending.delete(id);
82
+ resolve({ dispatchState: action === "send" ? "uncertain" : "not_sent", errorCode: "peer_timeout",
83
+ ...(action === "send" ? { senderPid: this.child?.pid } : {}) });
84
+ }, this.options.timeoutMs ?? 5000);
85
+ this.pending.set(id, { resolve, timer, action });
86
+ this.child.stdin.write(JSON.stringify({ id, action, entry, ...input }) + "\n", error => {
87
+ if (!error || !this.pending.has(id))
88
+ return;
89
+ clearTimeout(timer);
90
+ this.pending.delete(id);
91
+ resolve({ dispatchState: action === "send" ? "uncertain" : "not_sent", errorCode: "peer_write_failed",
92
+ ...(action === "send" ? { senderPid: this.child?.pid } : {}) });
93
+ });
94
+ });
95
+ }
96
+ async probe(entry) {
97
+ const result = await this.request("probe", entry);
98
+ if (result.errorCode)
99
+ throw new ClaudeNativeError(result.errorCode, "Claude native socket identity could not be verified");
100
+ }
101
+ async send(entry, input) {
102
+ try {
103
+ await this.start();
104
+ }
105
+ catch (error) {
106
+ return { dispatchState: "not_sent",
107
+ errorCode: error instanceof ClaudeNativeError ? error.code : "peer_helper_unavailable" };
108
+ }
109
+ return this.request("send", entry, input);
110
+ }
111
+ close() {
112
+ this.closed = true;
113
+ this.failPending();
114
+ this.child?.stdin.end();
115
+ const child = this.child;
116
+ if (child) {
117
+ const timer = setTimeout(() => { if (child.exitCode === null)
118
+ child.kill(); }, 2000);
119
+ timer.unref();
120
+ }
121
+ }
122
+ }
123
+ export class ClaudeNativeClient {
124
+ options;
125
+ peer;
126
+ closed = false;
127
+ inFlight = new Set();
128
+ constructor(options = {}) {
129
+ this.options = options;
130
+ this.peer = options.peerTransport ?? new MacPeerTransport(options);
131
+ }
132
+ get senderPid() { return this.peer.senderPid; }
133
+ async discover() {
134
+ this.assertOpen();
135
+ const found = await (this.options.discoverSessions?.() ?? discoverClaudeNativeSessions(this.options));
136
+ const sessions = [], errors = [...found.errors];
137
+ for (const entry of found.sessions) {
138
+ try {
139
+ await this.peer.probe(entry);
140
+ sessions.push(entry);
141
+ }
142
+ catch (error) {
143
+ errors.push({ configDir: entry.configDir,
144
+ code: error instanceof ClaudeNativeError ? error.code : "peer_unavailable" });
145
+ }
146
+ }
147
+ return { sessions, errors };
148
+ }
149
+ async inspect(identity) {
150
+ this.assertOpen();
151
+ if ((this.options.platform ?? process.platform) !== "darwin")
152
+ throw new ClaudeNativeError("unsupported_platform", "Claude native peer verification is currently validated on macOS only");
153
+ const entry = await (this.options.inspectSession?.(identity) ?? inspectClaudeNativeSession(identity, this.options));
154
+ if (entry.nativeId !== createClaudeNativeConversationId(identity)
155
+ || createClaudeNativeConversationId(entry) !== entry.nativeId) {
156
+ throw new ClaudeNativeError("identity_changed", "Claude native inspection returned a different process/session");
157
+ }
158
+ await this.peer.probe(entry);
159
+ return entry;
160
+ }
161
+ async send(identity, input) {
162
+ this.assertOpen();
163
+ if (typeof input.text !== "string" || !input.text.trim() || Buffer.byteLength(input.text) > 256 * 1024
164
+ || !isClaudeNativeUuid(input.inputUuid) || !isClaudeNativeUuid(input.messageId))
165
+ throw new ClaudeNativeError("invalid_input", "Claude native message requires bounded text and UUID identifiers");
166
+ const key = `${identity.configDir}:${identity.pid}:${identity.processStart}:${identity.sessionId}`;
167
+ if (this.inFlight.has(key))
168
+ return { dispatchState: "not_sent", errorCode: "send_in_flight" };
169
+ this.inFlight.add(key);
170
+ let dispatchAttempted = false;
171
+ try {
172
+ let entry = await this.inspect(identity);
173
+ if (entry.status !== "idle")
174
+ return { dispatchState: "not_sent", errorCode: "session_not_idle" };
175
+ await input.beforeDispatch?.(entry, this.peer.senderPid);
176
+ entry = await this.inspect(identity);
177
+ if (entry.status !== "idle")
178
+ return { dispatchState: "not_sent", errorCode: "session_not_idle" };
179
+ dispatchAttempted = true;
180
+ const result = await this.peer.send(entry, input);
181
+ return { ...result, ...(this.peer.senderPid === undefined ? {} : { senderPid: this.peer.senderPid }) };
182
+ }
183
+ catch (error) {
184
+ return { dispatchState: dispatchAttempted ? "uncertain" : "not_sent",
185
+ errorCode: error instanceof ClaudeNativeError ? error.code : "native_unavailable",
186
+ ...(dispatchAttempted && this.peer.senderPid !== undefined ? { senderPid: this.peer.senderPid } : {}) };
187
+ }
188
+ finally {
189
+ this.inFlight.delete(key);
190
+ }
191
+ }
192
+ close() { this.closed = true; this.peer.close(); }
193
+ assertOpen() { if (this.closed)
194
+ throw new ClaudeNativeError("client_closed", "Claude native client is closed"); }
195
+ }
196
+ export function createClaudeNativeClient(options = {}) { return new ClaudeNativeClient(options); }
197
+ //# sourceMappingURL=claude-native-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-native-client.js","sourceRoot":"","sources":["../../src/claude-native-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,0BAA0B,EACM,MAAM,8BAA8B,CAAC;AAC5G,OAAO,EAAE,iBAAiB,EAAE,gCAAgC,EAAE,kBAAkB,EAA4D,MAAM,6BAA6B,CAAC;AA2BhL,0FAA0F;AAC1F,MAAM,gBAAgB;IAKA,OAAO;IAJnB,KAAK,CAAkC;IACvC,QAAQ,CAAiB;IACzB,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,GAAG,IAAI,GAAG,EAAoG,CAAC;IAC9H,YAAoB,OAAkC;uBAAlC,OAAO;IAA8B,CAAC;IAC1D,IAAI,SAAS,KAAyB,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,iBAAiB,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;QAChG,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,yBAAyB,CAAC,EACrG,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;oBACtF,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,yBAAyB,EAAE,6CAA6C,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACjK,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACvD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACtB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;oBAAE,OAAO;gBAChC,IAAI,KAAU,CAAC;gBAAC,IAAI,CAAC;oBAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACnE,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;oBAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBAAC,OAAO,EAAE,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBAChG,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAA2B,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,0CAA0C,CAAC,CAAC;oBAClH,OAAO;gBACT,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAAC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACjE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;gBACvB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;oBACjF,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;oBAC1E,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,uBAAuB;wBACzG,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,yBAAyB,EAAE,kEAAkE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,sCAAsC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1L,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACO,WAAW;QACjB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,oBAAoB;gBACxK,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QACtE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACO,KAAK,CAAC,OAAO,CAAC,MAAwB,EAAE,KAA+B,EAAE,KAAK,GAAG,EAAE;QACzF,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,MAAM,EAAE,GAAG,UAAU,EAAE,EAAE,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,CAAC,EAAE,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,cAAc;oBACvH,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,KAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE;gBACtF,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,OAAO;gBAC5C,YAAY,CAAC,KAAK,CAAC,CAAC;gBAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,EAAE,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,mBAAmB;oBACnG,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,KAA+B;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,SAAS;YAAE,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,SAAS,EAAE,qDAAqD,CAAC,CAAC;IAC7H,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAA+B,EAAE,KAA6D;QACvG,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAC3B,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,EAAE,aAAa,EAAE,UAAmB;gBACzD,SAAS,EAAE,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;QAAC,CAAC;QAC7F,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;gBAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IACrH,CAAC;CACF;AACD,MAAM,OAAO,kBAAkB;IAIA,OAAO;IAHnB,IAAI,CAA4B;IACzC,MAAM,GAAG,KAAK,CAAC;IACf,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,YAA6B,OAAO,GAA8B,EAAE;uBAAvC,OAAO;QAAoC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAC7I,IAAI,SAAS,KAAyB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtG,MAAM,QAAQ,GAA+B,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5E,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAC3D,OAAO,KAAK,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS;oBACtD,IAAI,EAAE,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;YAAC,CAAC;QACpF,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,QAA8B;QAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAAE,MAAM,IAAI,iBAAiB,CAAC,sBAAsB,EAAE,sEAAsE,CAAC,CAAC;QAC1L,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,IAAI,0BAA0B,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACpH,IAAI,KAAK,CAAC,QAAQ,KAAK,gCAAgC,CAAC,QAAQ,CAAC;eAC5D,gCAAgC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChE,MAAM,IAAI,iBAAiB,CAAC,kBAAkB,EAAE,+DAA+D,CAAC,CAAC;QACnH,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IAC7C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAA8B,EAAE,KACgD;QACzF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI;eACjG,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC;YAAE,MAAM,IAAI,iBAAiB,CAAC,eAAe,EAAE,kEAAkE,CAAC,CAAC;QACpM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACnG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;QAC9F,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;YACjG,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzD,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;YACjG,iBAAiB,GAAG,IAAI,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;QACzG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU;gBAClE,SAAS,EAAE,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB;gBACjF,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5G,CAAC;gBAAS,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;IAC1C,CAAC;IACD,KAAK,KAAW,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChD,UAAU,KAAW,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,iBAAiB,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC,CAAC,CAAC;CAChI;AACD,MAAM,UAAU,wBAAwB,CAAC,OAAO,GAA8B,EAAE,IAAwB,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type ClaudeNativeCatalogEntry, type ClaudeNativeIdentity } from "./claude-native-identity.js";
2
+ export interface ClaudeNativeDiscoveryOptions {
3
+ configDirs?: string[];
4
+ claudePath?: string;
5
+ platform?: NodeJS.Platform;
6
+ /** Test seam: command output must retain the real agents/registry contract. */
7
+ run?: (file: string, args: string[], env?: NodeJS.ProcessEnv) => Promise<string>;
8
+ }
9
+ export interface ClaudeNativeDiscoveryResult {
10
+ sessions: ClaudeNativeCatalogEntry[];
11
+ errors: Array<{
12
+ configDir: string;
13
+ code: string;
14
+ }>;
15
+ }
16
+ export declare function runClaudeNativeCommand(file: string, args: string[], env?: NodeJS.ProcessEnv): Promise<string>;
17
+ export declare function readClaudeNativeRegistry(configDir: string, pid: number): Promise<Record<string, unknown>>;
18
+ export declare function validateClaudeNativeRegistry(configDir: string, row: Record<string, unknown>, options?: ClaudeNativeDiscoveryOptions): Promise<ClaudeNativeCatalogEntry>;
19
+ export declare function discoverClaudeNativeSessions(options?: ClaudeNativeDiscoveryOptions): Promise<ClaudeNativeDiscoveryResult>;
20
+ export declare function inspectClaudeNativeSession(identity: ClaudeNativeIdentity, options?: ClaudeNativeDiscoveryOptions): Promise<ClaudeNativeCatalogEntry>;
@@ -0,0 +1,111 @@
1
+ import { execFile as execFileCallback } from "node:child_process";
2
+ import { lstat, readFile, realpath } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { promisify } from "node:util";
6
+ import { ClaudeNativeError, createClaudeNativeConversationId, validateClaudeNativeIdentity } from "./claude-native-identity.js";
7
+ const execFile = promisify(execFileCallback);
8
+ export async function runClaudeNativeCommand(file, args, env) {
9
+ const result = await execFile(file, args, { env, timeout: 10_000, maxBuffer: 2 * 1024 * 1024, encoding: "utf8" });
10
+ return result.stdout;
11
+ }
12
+ function record(value) {
13
+ if (!value || typeof value !== "object" || Array.isArray(value))
14
+ throw new ClaudeNativeError("invalid_registry", "Invalid native session metadata");
15
+ return value;
16
+ }
17
+ function absolute(value) {
18
+ return typeof value === "string" && path.isAbsolute(value) && value.length <= 4096 && !/[\u0000-\u001f\u007f]/u.test(value);
19
+ }
20
+ async function owned(p, kind) {
21
+ const s = await lstat(p);
22
+ if (s.uid !== process.getuid?.() || (s.mode & 0o022) !== 0 || s.isSymbolicLink()
23
+ || !(kind === "file" ? s.isFile() : kind === "socket" ? s.isSocket() : s.isDirectory())) {
24
+ throw new ClaudeNativeError("unsafe_metadata", "Claude native metadata or socket ownership is unsafe");
25
+ }
26
+ return s;
27
+ }
28
+ export async function readClaudeNativeRegistry(configDir, pid) {
29
+ if (!Number.isSafeInteger(pid) || pid < 1)
30
+ throw new ClaudeNativeError("invalid_identity", "Invalid native PID");
31
+ await owned(configDir, "directory");
32
+ await owned(path.join(configDir, "sessions"), "directory");
33
+ const file = path.join(configDir, "sessions", `${pid}.json`), stat = await owned(file, "file");
34
+ if (stat.size > 64 * 1024)
35
+ throw new ClaudeNativeError("invalid_registry", "Native registry entry exceeds limit");
36
+ return record(JSON.parse(await readFile(file, "utf8")));
37
+ }
38
+ /** The agent-list row and owned registry must describe the same supported inbox. */
39
+ function catalogFields(m, row, identity) {
40
+ if (m.pid !== identity.pid || row.pid !== identity.pid || row.sessionId !== identity.sessionId || row.kind !== "interactive"
41
+ || !absolute(m.cwd) || row.cwd !== m.cwd || typeof m.version !== "string" || !/^\d+\.\d+\.\d+(?:[-+][\w.-]+)?$/u.test(m.version)
42
+ || m.peerProtocol !== 1 || !Array.isArray(m.peerFeatures) || !m.peerFeatures.every(x => typeof x === "string")
43
+ || !absolute(m.messagingSocketPath) || path.basename(m.messagingSocketPath) !== `${identity.pid}.sock`) {
44
+ throw new ClaudeNativeError("unsupported_contract", "Claude native registry and agent list do not prove a supported live identity");
45
+ }
46
+ return { cwd: m.cwd, version: m.version, socketPath: m.messagingSocketPath,
47
+ peerProtocol: 1, peerFeatures: m.peerFeatures };
48
+ }
49
+ export async function validateClaudeNativeRegistry(configDir, row, options = {}) {
50
+ const pid = Number(row.pid), m = await readClaudeNativeRegistry(configDir, pid);
51
+ const processStart = typeof m.procStart === "string" ? m.procStart.trim().replace(/\s+/gu, " ") : "";
52
+ const identity = validateClaudeNativeIdentity({ configDir, sessionId: String(m.sessionId), pid, processStart });
53
+ const fields = catalogFields(m, row, identity);
54
+ const run = options.run ?? runClaudeNativeCommand;
55
+ const processInfo = (await run("/bin/ps", ["-p", String(pid), "-o", "uid=", "-o", "lstart="], { ...process.env, LC_ALL: "C", TZ: "UTC" })).trim().replace(/\s+/gu, " ");
56
+ if (processInfo !== `${process.getuid?.()} ${processStart}`)
57
+ throw new ClaudeNativeError("process_changed", "Claude process identity changed");
58
+ const socketPath = fields.socketPath;
59
+ await owned(await realpath(path.dirname(socketPath)), "directory");
60
+ await owned(socketPath, "socket");
61
+ const statusMap = { idle: "idle", busy: "working", waiting: "waiting" };
62
+ // Both sources must agree. Unknown or racing state remains observable, never sendable.
63
+ const status = m.status === row.status && typeof m.status === "string"
64
+ ? statusMap[m.status] ?? "unknown" : "unknown";
65
+ return { ...identity, ...fields, nativeId: createClaudeNativeConversationId(identity),
66
+ ...(typeof row.name === "string" ? { name: row.name.slice(0, 512) } : {}), status,
67
+ ...(typeof row.waitingFor === "string" ? { waitingFor: row.waitingFor.slice(0, 256) } : {}), observedAt: new Date().toISOString() };
68
+ }
69
+ export async function discoverClaudeNativeSessions(options = {}) {
70
+ const errors = [], sessions = [];
71
+ const configDirs = [...new Set(options.configDirs ?? [process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), ".claude")])];
72
+ if ((options.platform ?? process.platform) !== "darwin")
73
+ return { sessions, errors: [{ configDir: "", code: "unsupported_platform" }] };
74
+ const run = options.run ?? runClaudeNativeCommand;
75
+ for (const configured of configDirs.slice(0, 16)) {
76
+ let configDir = path.resolve(configured);
77
+ try {
78
+ configDir = await realpath(configDir);
79
+ const raw = JSON.parse(await run(options.claudePath ?? "claude", ["agents", "--json", "--all"], { ...process.env, CLAUDE_CONFIG_DIR: configDir }));
80
+ if (!Array.isArray(raw) || raw.length > 4096)
81
+ throw new ClaudeNativeError("invalid_agent_list", "Invalid Claude agents list");
82
+ for (const value of raw) {
83
+ const row = record(value);
84
+ if (row.kind !== "interactive")
85
+ continue;
86
+ try {
87
+ const entry = await validateClaudeNativeRegistry(configDir, row, options);
88
+ if (sessions.some(s => s.nativeId === entry.nativeId))
89
+ throw new ClaudeNativeError("duplicate_identity", "Duplicate native agent identity");
90
+ sessions.push(entry);
91
+ }
92
+ catch (error) {
93
+ errors.push({ configDir, code: error instanceof ClaudeNativeError ? error.code : "registry_unavailable" });
94
+ }
95
+ }
96
+ }
97
+ catch (error) {
98
+ errors.push({ configDir, code: error instanceof ClaudeNativeError ? error.code : "discovery_unavailable" });
99
+ }
100
+ }
101
+ return { sessions, errors };
102
+ }
103
+ export async function inspectClaudeNativeSession(identity, options = {}) {
104
+ const wanted = validateClaudeNativeIdentity(identity);
105
+ const result = await discoverClaudeNativeSessions({ ...options, configDirs: [wanted.configDir] });
106
+ const found = result.sessions.find(s => s.nativeId === createClaudeNativeConversationId(wanted));
107
+ if (!found)
108
+ throw new ClaudeNativeError("identity_unavailable", "Exact Claude CLI process/session is no longer available");
109
+ return found;
110
+ }
111
+ //# sourceMappingURL=claude-native-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-native-discovery.js","sourceRoot":"","sources":["../../src/claude-native-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface ClaudeNativeIdentity {
2
+ configDir: string;
3
+ sessionId: string;
4
+ pid: number;
5
+ /** Native registry/OS `LC_ALL=C TZ=UTC ps lstart` value, whitespace normalized. */
6
+ processStart: string;
7
+ }
8
+ export interface ClaudeNativeCatalogEntry extends ClaudeNativeIdentity {
9
+ nativeId: string;
10
+ cwd: string;
11
+ name?: string;
12
+ version: string;
13
+ socketPath: string;
14
+ peerProtocol: number;
15
+ peerFeatures: string[];
16
+ status: "idle" | "working" | "waiting" | "unknown";
17
+ waitingFor?: string;
18
+ observedAt: string;
19
+ }
20
+ export declare class ClaudeNativeError extends Error {
21
+ readonly code: string;
22
+ constructor(code: string, message: string);
23
+ }
24
+ export declare function isClaudeNativeUuid(value: unknown): value is string;
25
+ export declare function validateClaudeNativeIdentity(value: ClaudeNativeIdentity): ClaudeNativeIdentity;
26
+ export declare function createClaudeNativeConversationId(value: ClaudeNativeIdentity): string;
27
+ export declare function isClaudeNativeConversationId(value: unknown): value is string;
28
+ export declare function parseClaudeNativeConversationId(value: string): ClaudeNativeIdentity;
29
+ export declare function isClaudeNativeWatchId(value: unknown): value is string;
@@ -0,0 +1,54 @@
1
+ import path from "node:path";
2
+ export class ClaudeNativeError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.code = code;
7
+ this.name = "ClaudeNativeError";
8
+ }
9
+ }
10
+ const PREFIX = "claude-cli:v1:";
11
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u;
12
+ export function isClaudeNativeUuid(value) {
13
+ return typeof value === "string" && UUID.test(value);
14
+ }
15
+ export function validateClaudeNativeIdentity(value) {
16
+ if (!value || typeof value.configDir !== "string" || !path.isAbsolute(value.configDir)
17
+ || value.configDir.length > 2048 || /[\u0000-\u001f\u007f]/u.test(value.configDir)
18
+ || !isClaudeNativeUuid(value.sessionId) || !Number.isSafeInteger(value.pid) || value.pid < 1
19
+ || typeof value.processStart !== "string" || value.processStart.length > 128
20
+ || !/^[A-Za-z]{3} [A-Za-z]{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}$/u.test(value.processStart)) {
21
+ throw new ClaudeNativeError("invalid_identity", "Invalid Claude CLI native identity");
22
+ }
23
+ return { configDir: path.resolve(value.configDir), sessionId: value.sessionId,
24
+ pid: value.pid, processStart: value.processStart };
25
+ }
26
+ export function createClaudeNativeConversationId(value) {
27
+ const { configDir, sessionId, pid, processStart } = validateClaudeNativeIdentity(value);
28
+ return PREFIX + Buffer.from(JSON.stringify([configDir, sessionId, pid, processStart])).toString("base64url");
29
+ }
30
+ export function isClaudeNativeConversationId(value) {
31
+ return typeof value === "string" && value.startsWith(PREFIX);
32
+ }
33
+ export function parseClaudeNativeConversationId(value) {
34
+ if (!isClaudeNativeConversationId(value) || value.length > 4096 || !/^[\w-]+$/u.test(value.slice(PREFIX.length))) {
35
+ throw new ClaudeNativeError("invalid_identity", "Invalid Claude CLI conversation ID");
36
+ }
37
+ let tuple;
38
+ try {
39
+ tuple = JSON.parse(Buffer.from(value.slice(PREFIX.length), "base64url").toString("utf8"));
40
+ }
41
+ catch {
42
+ throw new ClaudeNativeError("invalid_identity", "Invalid Claude CLI conversation payload");
43
+ }
44
+ if (!Array.isArray(tuple) || tuple.length !== 4)
45
+ throw new ClaudeNativeError("invalid_identity", "Invalid Claude CLI identity tuple");
46
+ const identity = validateClaudeNativeIdentity({ configDir: tuple[0], sessionId: tuple[1], pid: tuple[2], processStart: tuple[3] });
47
+ if (createClaudeNativeConversationId(identity) !== value)
48
+ throw new ClaudeNativeError("invalid_identity", "Non-canonical Claude CLI identity");
49
+ return identity;
50
+ }
51
+ export function isClaudeNativeWatchId(value) {
52
+ return typeof value === "string" && /^claude-cli-watch:[A-Za-z0-9_-]{8,128}$/u.test(value);
53
+ }
54
+ //# sourceMappingURL=claude-native-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-native-identity.js","sourceRoot":"","sources":["../../src/claude-native-identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ClaudeNativeRuntimeOptions } from "./claude-native-runtime.js";
2
+ export interface ClaudeNativeMonitorTasks {
3
+ reconcile(id: string): Promise<unknown>;
4
+ shouldMonitor(id: string): boolean;
5
+ }
6
+ /** Polling recovers missed events. Durable task/outbox state, never idle alone, decides when to stop. */
7
+ export declare function pollClaudeNativeMonitor(watchId: string, tasks: ClaudeNativeMonitorTasks, options?: {
8
+ sleep?: (ms: number) => Promise<void>;
9
+ onError?: () => void;
10
+ }): Promise<void>;
11
+ export declare function launchClaudeNativeMonitor(watchId: string, options: ClaudeNativeRuntimeOptions): Promise<number>;
12
+ /** Runtime fences the saved PID/start/session and cannot substitute a later resumed process. */
13
+ export declare function runClaudeNativeMonitor(watchId: string, options: ClaudeNativeRuntimeOptions): Promise<void>;
@@ -0,0 +1,123 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { spawn } from "node:child_process";
5
+ import { ensureDir } from "./store.js";
6
+ import { cliCwd, cliEnv, cliNow, cliNowMs, cliPid, cliSleep, cliSleepSync } from "./cli-runtime-context.js";
7
+ import { createFileLockCliAdapter } from "./file-lock-cli-adapter.js";
8
+ import { isClaudeNativeWatchId } from "./claude-native-identity.js";
9
+ import { createClaudeNativeRuntime } from "./claude-native-runtime.js";
10
+ /** Polling recovers missed events. Durable task/outbox state, never idle alone, decides when to stop. */
11
+ export async function pollClaudeNativeMonitor(watchId, tasks, options = {}) {
12
+ if (!isClaudeNativeWatchId(watchId))
13
+ throw new Error("Invalid Claude CLI Watch ID");
14
+ while (tasks.shouldMonitor(watchId)) {
15
+ try {
16
+ await tasks.reconcile(watchId);
17
+ }
18
+ catch {
19
+ options.onError?.();
20
+ }
21
+ if (!tasks.shouldMonitor(watchId))
22
+ return;
23
+ await (options.sleep ?? cliSleep)(2000);
24
+ }
25
+ }
26
+ export async function launchClaudeNativeMonitor(watchId, options) {
27
+ if (!isClaudeNativeWatchId(watchId))
28
+ throw new Error("Invalid Claude CLI Watch ID");
29
+ const args = [fileURLToPath(new URL("./cli.js", import.meta.url)), "monitor-claude-native", "--watch", watchId, "--store-dir", options.storeDir];
30
+ if (options.openclawBin)
31
+ args.push("--openclaw-bin", options.openclawBin);
32
+ const directory = path.join(options.storeDir, "claude-native-monitors");
33
+ ensureDir(directory);
34
+ const fd = fs.openSync(path.join(directory, `${watchId}.log`), fs.constants.O_CREAT | fs.constants.O_APPEND | fs.constants.O_WRONLY | fs.constants.O_NOFOLLOW, 0o600);
35
+ try {
36
+ fs.fchmodSync(fd, 0o600);
37
+ const child = spawn(process.execPath, args, { detached: true, cwd: cliCwd(),
38
+ env: { ...cliEnv(), AKK_NATIVE_CLAUDE_CONFIG_DIRS: JSON.stringify(options.claudeConfigDirs),
39
+ ...(options.claudeBin ? { AKK_NATIVE_CLAUDE_BIN: options.claudeBin } : {}),
40
+ ...(options.pythonBin ? { AKK_NATIVE_CLAUDE_PYTHON: options.pythonBin } : {}) }, stdio: ["ignore", fd, fd, "ipc"] });
41
+ return await new Promise((resolve, reject) => {
42
+ let finished = false;
43
+ const timer = setTimeout(() => finish(new Error("Claude CLI monitor readiness timed out")), 5000);
44
+ const finish = (error, pid) => {
45
+ if (finished)
46
+ return;
47
+ finished = true;
48
+ clearTimeout(timer);
49
+ child.removeAllListeners("message");
50
+ child.removeAllListeners("exit");
51
+ child.removeAllListeners("error");
52
+ if (child.connected)
53
+ child.disconnect();
54
+ child.unref();
55
+ if (error)
56
+ reject(error);
57
+ else
58
+ resolve(pid);
59
+ };
60
+ child.once("error", error => finish(error));
61
+ child.once("exit", () => finish(new Error("Claude CLI monitor exited before readiness")));
62
+ child.on("message", value => {
63
+ const message = value;
64
+ if (message?.watchId === watchId && message.ready === true && Number.isSafeInteger(message.pid) && message.pid > 1)
65
+ finish(undefined, message.pid);
66
+ });
67
+ });
68
+ }
69
+ finally {
70
+ fs.closeSync(fd);
71
+ }
72
+ }
73
+ function announce(watchId, pid) {
74
+ // Losing the launching controller must not stop a durable observer.
75
+ if (!process.connected || !process.send)
76
+ return;
77
+ try {
78
+ process.send({ watchId, ready: true, pid }, () => { });
79
+ }
80
+ catch { /* Parent already disconnected. */ }
81
+ }
82
+ /** Runtime fences the saved PID/start/session and cannot substitute a later resumed process. */
83
+ export async function runClaudeNativeMonitor(watchId, options) {
84
+ if (!isClaudeNativeWatchId(watchId))
85
+ throw new Error("Invalid Claude CLI Watch ID");
86
+ const directory = path.join(options.storeDir, "claude-native-monitors");
87
+ ensureDir(directory);
88
+ const locks = createFileLockCliAdapter({ now: cliNow, nowMs: cliNowMs, pid: cliPid, sleepSync: cliSleepSync });
89
+ const runtime = createClaudeNativeRuntime(options), lockPath = path.join(directory, `${watchId}.lock`);
90
+ let release;
91
+ try {
92
+ runtime.tasks.status(watchId);
93
+ try {
94
+ release = locks.acquire(lockPath, { timeoutMs: 100 });
95
+ }
96
+ catch (error) {
97
+ const owner = locks.owner(lockPath);
98
+ if (owner.pid && owner.pid !== cliPid() && !locks.stale(lockPath)) {
99
+ announce(watchId, owner.pid);
100
+ return;
101
+ }
102
+ throw error;
103
+ }
104
+ // This acknowledges observer ownership only, never native acceptance or success.
105
+ announce(watchId, cliPid());
106
+ let lastErrorAt = -Infinity;
107
+ await pollClaudeNativeMonitor(watchId, runtime.tasks, { onError: () => {
108
+ if (cliNowMs() - lastErrorAt < 30_000)
109
+ return;
110
+ lastErrorAt = cliNowMs();
111
+ process.stderr.write("Claude CLI monitor could not reconcile; retrying the existing durable Watch.\n");
112
+ } });
113
+ }
114
+ finally {
115
+ try {
116
+ release?.();
117
+ }
118
+ finally {
119
+ await runtime.close();
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=claude-native-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-native-monitor.js","sourceRoot":"","sources":["../../src/claude-native-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAmC,MAAM,4BAA4B,CAAC;AAMxG,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAe,EAAE,KAA+B,EAC5F,OAAO,GAAoE,EAAE;IAC7E,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YAAC,MAAM,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QACvC,MAAM,CAAC;YAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC;YAAE,OAAO;QAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAAe,EAAE,OAAmC;IAClG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjJ,IAAI,OAAO,CAAC,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9F,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACtK,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE;YACzE,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,6BAA6B,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC;gBACzF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACzH,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAClG,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,GAAY,EAAE,EAAE;gBAC7C,IAAI,QAAQ;oBAAE,OAAO;gBAAC,QAAQ,GAAG,IAAI,CAAC;gBAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC3D,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACzG,IAAI,KAAK,CAAC,SAAS;oBAAE,KAAK,CAAC,UAAU,EAAE,CAAC;gBAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACvD,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBAAM,OAAO,CAAC,GAAI,CAAC,CAAC;YAC/C,CAAC,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC,CAAC;YAC1F,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;gBAC1B,MAAM,OAAO,GAAG,KAA4D,CAAC;gBAC7E,IAAI,OAAO,EAAE,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAI,GAAG,CAAC;oBAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACtJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AACjC,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,GAAW;IAC5C,oEAAoE;IACpE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO;IAChD,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;AAC7G,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAe,EAAE,OAAmC;IAC/F,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,wBAAwB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;IAC/G,MAAM,OAAO,GAAG,yBAAyB,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;IACvG,IAAI,OAAiC,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC;YAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAAC,CAAC;QAC9D,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC5G,MAAM,KAAK,CAAC;QACd,CAAC;QACD,iFAAiF;QACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5B,IAAI,WAAW,GAAG,CAAC,QAAQ,CAAC;QAC5B,MAAM,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;gBACpE,IAAI,QAAQ,EAAE,GAAG,WAAW,GAAG,MAAM;oBAAE,OAAO;gBAC9C,WAAW,GAAG,QAAQ,EAAE,CAAC;gBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;YACzG,CAAC,EAAE,CAAC,CAAC;IACP,CAAC;YAAS,CAAC;QAAC,IAAI,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IAAC,CAAC;AACvE,CAAC"}