pi-ca-leash 0.10.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 (138) hide show
  1. package/AGENTS.md +77 -0
  2. package/ARCHITECTURE.md +290 -0
  3. package/CHANGELOG.md +158 -0
  4. package/DEVELOPMENT.md +197 -0
  5. package/KNOWN_LIMITS.md +80 -0
  6. package/LICENSE +21 -0
  7. package/README.md +288 -0
  8. package/extensions/backend-tool-actions.test.ts +59 -0
  9. package/extensions/backend-tool-actions.ts +31 -0
  10. package/extensions/command-drivers.test.ts +37 -0
  11. package/extensions/command-drivers.ts +126 -0
  12. package/extensions/command-parity.test.ts +560 -0
  13. package/extensions/command-visibility.test.ts +21 -0
  14. package/extensions/command-visibility.ts +10 -0
  15. package/extensions/index.ts +3218 -0
  16. package/extensions/llm-tools.test.ts +537 -0
  17. package/extensions/model-catalog.test.ts +34 -0
  18. package/extensions/model-catalog.ts +173 -0
  19. package/extensions/peer-history.test.ts +141 -0
  20. package/extensions/peer-history.ts +90 -0
  21. package/extensions/peer-naming.test.ts +25 -0
  22. package/extensions/peer-naming.ts +129 -0
  23. package/extensions/peer-relay.test.ts +122 -0
  24. package/extensions/peer-relay.ts +83 -0
  25. package/extensions/peer-ux.test.ts +239 -0
  26. package/extensions/peer-ux.ts +327 -0
  27. package/extensions/persistence.test.ts +68 -0
  28. package/extensions/persistence.ts +67 -0
  29. package/extensions/prompts/extension-log-tool.md +5 -0
  30. package/extensions/prompts/peer-ask-tool.md +5 -0
  31. package/extensions/prompts/peer-bridge-system.md +4 -0
  32. package/extensions/prompts/peer-history-tool.md +3 -0
  33. package/extensions/prompts/peer-init-user-help.md +11 -0
  34. package/extensions/prompts/peer-init.md +17 -0
  35. package/extensions/prompts/peer-interrupt-tool.md +2 -0
  36. package/extensions/prompts/peer-list-tool.md +3 -0
  37. package/extensions/prompts/peer-no-babysitting.md +6 -0
  38. package/extensions/prompts/peer-send-tool.md +5 -0
  39. package/extensions/prompts/peer-start-tool.md +7 -0
  40. package/extensions/prompts/peer-stop-tool.md +3 -0
  41. package/extensions/prompts/runtime-models-tool.md +6 -0
  42. package/extensions/prompts/subagent-list-tool.md +3 -0
  43. package/extensions/prompts/subagent-run-tool.md +6 -0
  44. package/extensions/prompts/subagent-status-tool.md +2 -0
  45. package/extensions/prompts/team-list-tool.md +2 -0
  46. package/extensions/prompts/team-message-tool.md +2 -0
  47. package/extensions/prompts/team-spawn-tool.md +5 -0
  48. package/extensions/prompts/team-stop-tool.md +2 -0
  49. package/extensions/prompts/team-task-tool.md +3 -0
  50. package/extensions/prompts.ts +41 -0
  51. package/extensions/runtime-driver.test.ts +38 -0
  52. package/extensions/runtime-driver.ts +33 -0
  53. package/extensions/runtime-safety.test.ts +21 -0
  54. package/extensions/runtime-safety.ts +49 -0
  55. package/extensions/support.test.ts +144 -0
  56. package/extensions/support.ts +205 -0
  57. package/extensions/tool-inputs.test.ts +45 -0
  58. package/extensions/tool-inputs.ts +79 -0
  59. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/bridge.d.ts +48 -0
  60. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/bridge.js +406 -0
  61. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/bridge.js.map +1 -0
  62. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/cli.d.ts +2 -0
  63. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/cli.js +18 -0
  64. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/cli.js.map +1 -0
  65. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/index.d.ts +5 -0
  66. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/index.js +5 -0
  67. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/index.js.map +1 -0
  68. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/persistence.d.ts +12 -0
  69. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/persistence.js +31 -0
  70. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/persistence.js.map +1 -0
  71. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/pi-intercom-transport.d.ts +12 -0
  72. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/pi-intercom-transport.js +347 -0
  73. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/pi-intercom-transport.js.map +1 -0
  74. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/types.d.ts +103 -0
  75. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/types.js +2 -0
  76. package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/types.js.map +1 -0
  77. package/node_modules/@pi-claude-code-agent/intercom-bridge/package.json +32 -0
  78. package/node_modules/@pi-claude-code-agent/runtime/dist/cli.d.ts +2 -0
  79. package/node_modules/@pi-claude-code-agent/runtime/dist/cli.js +26 -0
  80. package/node_modules/@pi-claude-code-agent/runtime/dist/cli.js.map +1 -0
  81. package/node_modules/@pi-claude-code-agent/runtime/dist/driver-config.d.ts +4 -0
  82. package/node_modules/@pi-claude-code-agent/runtime/dist/driver-config.js +12 -0
  83. package/node_modules/@pi-claude-code-agent/runtime/dist/driver-config.js.map +1 -0
  84. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/claude-sdk.d.ts +8 -0
  85. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/claude-sdk.js +320 -0
  86. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/claude-sdk.js.map +1 -0
  87. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/codex-cli.d.ts +24 -0
  88. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/codex-cli.js +266 -0
  89. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/codex-cli.js.map +1 -0
  90. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/messages.d.ts +72 -0
  91. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/messages.js +2 -0
  92. package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/messages.js.map +1 -0
  93. package/node_modules/@pi-claude-code-agent/runtime/dist/index.d.ts +6 -0
  94. package/node_modules/@pi-claude-code-agent/runtime/dist/index.js +5 -0
  95. package/node_modules/@pi-claude-code-agent/runtime/dist/index.js.map +1 -0
  96. package/node_modules/@pi-claude-code-agent/runtime/dist/persistence.d.ts +16 -0
  97. package/node_modules/@pi-claude-code-agent/runtime/dist/persistence.js +94 -0
  98. package/node_modules/@pi-claude-code-agent/runtime/dist/persistence.js.map +1 -0
  99. package/node_modules/@pi-claude-code-agent/runtime/dist/runtime.d.ts +31 -0
  100. package/node_modules/@pi-claude-code-agent/runtime/dist/runtime.js +409 -0
  101. package/node_modules/@pi-claude-code-agent/runtime/dist/runtime.js.map +1 -0
  102. package/node_modules/@pi-claude-code-agent/runtime/dist/types.d.ts +185 -0
  103. package/node_modules/@pi-claude-code-agent/runtime/dist/types.js +2 -0
  104. package/node_modules/@pi-claude-code-agent/runtime/dist/types.js.map +1 -0
  105. package/node_modules/@pi-claude-code-agent/runtime/package.json +32 -0
  106. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/backend.d.ts +34 -0
  107. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/backend.js +327 -0
  108. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/backend.js.map +1 -0
  109. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/cli.d.ts +2 -0
  110. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/cli.js +17 -0
  111. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/cli.js.map +1 -0
  112. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/index.d.ts +4 -0
  113. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/index.js +4 -0
  114. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/index.js.map +1 -0
  115. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/persistence.d.ts +12 -0
  116. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/persistence.js +81 -0
  117. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/persistence.js.map +1 -0
  118. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/types.d.ts +72 -0
  119. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/types.js +2 -0
  120. package/node_modules/@pi-claude-code-agent/subagents-backend/dist/types.js.map +1 -0
  121. package/node_modules/@pi-claude-code-agent/subagents-backend/package.json +32 -0
  122. package/node_modules/@pi-claude-code-agent/teams-backend/dist/backend.d.ts +27 -0
  123. package/node_modules/@pi-claude-code-agent/teams-backend/dist/backend.js +194 -0
  124. package/node_modules/@pi-claude-code-agent/teams-backend/dist/backend.js.map +1 -0
  125. package/node_modules/@pi-claude-code-agent/teams-backend/dist/cli.d.ts +2 -0
  126. package/node_modules/@pi-claude-code-agent/teams-backend/dist/cli.js +21 -0
  127. package/node_modules/@pi-claude-code-agent/teams-backend/dist/cli.js.map +1 -0
  128. package/node_modules/@pi-claude-code-agent/teams-backend/dist/index.d.ts +4 -0
  129. package/node_modules/@pi-claude-code-agent/teams-backend/dist/index.js +4 -0
  130. package/node_modules/@pi-claude-code-agent/teams-backend/dist/index.js.map +1 -0
  131. package/node_modules/@pi-claude-code-agent/teams-backend/dist/persistence.d.ts +8 -0
  132. package/node_modules/@pi-claude-code-agent/teams-backend/dist/persistence.js +66 -0
  133. package/node_modules/@pi-claude-code-agent/teams-backend/dist/persistence.js.map +1 -0
  134. package/node_modules/@pi-claude-code-agent/teams-backend/dist/types.d.ts +41 -0
  135. package/node_modules/@pi-claude-code-agent/teams-backend/dist/types.js +2 -0
  136. package/node_modules/@pi-claude-code-agent/teams-backend/dist/types.js.map +1 -0
  137. package/node_modules/@pi-claude-code-agent/teams-backend/package.json +33 -0
  138. package/package.json +98 -0
@@ -0,0 +1,406 @@
1
+ import { resolve } from "node:path";
2
+ import { ClaudeCodeRuntime, } from "@pi-claude-code-agent/runtime";
3
+ import { defaultBridgeStorageDir, readBridgeRegistry, writeBridgeRegistry, } from "./persistence.js";
4
+ const DEFAULT_ASK_TIMEOUT_MS = 60_000;
5
+ const DEFAULT_POLL_INTERVAL_MS = 100;
6
+ const BRIDGE_SYSTEM_PROMPT = [
7
+ "You are a long-lived Claude worker reached through intercom-style messages.",
8
+ "Treat new messages as continuation of same session, not fresh bootstrap.",
9
+ "For asks and replies, answer concisely and directly.",
10
+ "When you finish handling one inbound message, end in a clean idle state.",
11
+ ].join(" ");
12
+ export class ClaudeRuntimeIntercomBridge {
13
+ runtime;
14
+ storageDir;
15
+ transport;
16
+ pollIntervalMs;
17
+ askTimeoutMs;
18
+ peers = new Map();
19
+ constructor(options = {}) {
20
+ this.runtime = options.runtime ?? new ClaudeCodeRuntime();
21
+ this.storageDir = resolve(options.storageDir ?? defaultBridgeStorageDir());
22
+ this.transport = options.transport;
23
+ this.pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
24
+ this.askTimeoutMs = options.askTimeoutMs ?? DEFAULT_ASK_TIMEOUT_MS;
25
+ }
26
+ async launchPeer(input) {
27
+ this.assertPeerNameAvailable(input.name);
28
+ const status = await this.runtime.start({
29
+ prompt: input.prompt,
30
+ driver: input.driver,
31
+ cwd: input.cwd,
32
+ model: input.model,
33
+ name: input.name,
34
+ appendSystemPrompt: mergeSystemPrompt(input.appendSystemPrompt),
35
+ permissionMode: input.permissionMode,
36
+ tools: input.tools,
37
+ additionalDirectories: input.additionalDirectories,
38
+ env: input.env,
39
+ });
40
+ const peer = this.peerFromStatus(input.name, status, "starting");
41
+ this.peers.set(peer.name, peer);
42
+ await this.rememberPeer(peer.name, peer.sessionId);
43
+ await this.registerTransportPeer(peer.name);
44
+ if (input.waitForIdle !== false) {
45
+ await this.waitForTerminalState(peer.sessionId);
46
+ }
47
+ return this.syncPeerFromRuntime(peer.name);
48
+ }
49
+ async attachPeer(input) {
50
+ this.assertPeerNameAvailable(input.name);
51
+ const status = await this.runtime.status(input.sessionId);
52
+ if (!status) {
53
+ throw new Error(`Unknown runtime session ${input.sessionId}`);
54
+ }
55
+ const peer = this.peerFromStatus(input.name, status, mapRuntimeState(status.state, true));
56
+ this.peers.set(peer.name, peer);
57
+ await this.rememberPeer(peer.name, peer.sessionId);
58
+ await this.registerTransportPeer(peer.name);
59
+ return peer;
60
+ }
61
+ async listPeers() {
62
+ const peers = await Promise.all([...this.peers.values()].map((peer) => this.syncPeerFromRuntime(peer.name)));
63
+ return peers.sort((a, b) => a.name.localeCompare(b.name));
64
+ }
65
+ async status(name) {
66
+ if (!this.peers.has(name)) {
67
+ return undefined;
68
+ }
69
+ return this.syncPeerFromRuntime(name);
70
+ }
71
+ async send(name, message, options = {}) {
72
+ const result = await this.deliver(name, { ...message, kind: "send" }, { waitForIdle: options.waitForIdle ?? true });
73
+ return result.peer;
74
+ }
75
+ async ask(name, message) {
76
+ return this.deliver(name, { ...message, kind: "ask" }, { waitForIdle: true });
77
+ }
78
+ async reply(name, message) {
79
+ const result = await this.deliver(name, { ...message, kind: "reply" }, { waitForIdle: true });
80
+ return result.peer;
81
+ }
82
+ async interrupt(name) {
83
+ return (await this.interruptWithResult(name)).peer;
84
+ }
85
+ async interruptWithResult(name) {
86
+ const peer = this.requirePeer(name);
87
+ const interrupt = await this.runtime.interrupt(peer.sessionId);
88
+ return {
89
+ peer: await this.syncPeerFromRuntime(name),
90
+ interrupt,
91
+ };
92
+ }
93
+ async stop(name) {
94
+ const peer = this.requirePeer(name);
95
+ const status = await this.runtime.stop(peer.sessionId);
96
+ const stopped = this.peerFromStatus(name, status, mapRuntimeState(status.state, true));
97
+ await this.forgetPeer(name);
98
+ await this.unregisterTransportPeer(name);
99
+ this.peers.delete(name);
100
+ return stopped;
101
+ }
102
+ async disconnect(name) {
103
+ const peer = this.requirePeer(name);
104
+ const next = {
105
+ ...peer,
106
+ state: "disconnected",
107
+ updatedAt: new Date().toISOString(),
108
+ lastActivityAt: new Date().toISOString(),
109
+ };
110
+ this.peers.set(name, next);
111
+ await this.forgetPeer(name);
112
+ await this.unregisterTransportPeer(name);
113
+ return next;
114
+ }
115
+ async setTransport(transport) {
116
+ if (this.transport === transport) {
117
+ return;
118
+ }
119
+ const previous = this.transport;
120
+ this.transport = transport;
121
+ await previous?.close?.();
122
+ if (!transport) {
123
+ return;
124
+ }
125
+ for (const peer of this.peers.values()) {
126
+ await this.registerTransportPeer(peer.name);
127
+ await transport.updatePeer(peer);
128
+ }
129
+ }
130
+ async restorePeers() {
131
+ const registry = await readBridgeRegistry(this.storageDir);
132
+ const restored = [];
133
+ const survivors = [];
134
+ for (const record of registry.peers) {
135
+ if (this.peers.has(record.name)) {
136
+ survivors.push(record);
137
+ restored.push(this.peers.get(record.name));
138
+ continue;
139
+ }
140
+ try {
141
+ const peer = await this.attachPeer(record);
142
+ survivors.push({ name: peer.name, sessionId: peer.sessionId });
143
+ restored.push(peer);
144
+ }
145
+ catch {
146
+ // Drop stale registry entries.
147
+ }
148
+ }
149
+ await writeBridgeRegistry(this.storageDir, { peers: survivors });
150
+ return restored.sort((a, b) => a.name.localeCompare(b.name));
151
+ }
152
+ async transportStatus() {
153
+ return this.transport?.getStatus?.();
154
+ }
155
+ hasTransport() {
156
+ return Boolean(this.transport);
157
+ }
158
+ async close() {
159
+ for (const name of [...this.peers.keys()]) {
160
+ await this.unregisterTransportPeer(name);
161
+ }
162
+ await this.transport?.close?.();
163
+ }
164
+ async deliver(name, inbound, options) {
165
+ const peer = await this.syncPeerFromRuntime(name);
166
+ if (["busy", "starting"].includes(peer.state)) {
167
+ throw new Error(`Peer ${name} busy. Message was not delivered. Use fire-and-forget send only after the peer is idle or wait for the automated peer update.`);
168
+ }
169
+ if (["stopped", "disconnected"].includes(peer.state)) {
170
+ throw new Error(`Peer ${name} unavailable (${peer.state})`);
171
+ }
172
+ const before = await this.runtime.events(peer.sessionId);
173
+ const cursor = before.nextCursor;
174
+ const sentStatus = await this.runtime.send({
175
+ sessionId: peer.sessionId,
176
+ message: formatInboundMessage(inbound),
177
+ model: inbound.model,
178
+ });
179
+ if (!options.waitForIdle) {
180
+ const syncedPeer = await this.syncPeerFromRuntime(name);
181
+ return {
182
+ peer: syncedPeer,
183
+ reply: "",
184
+ runState: sentStatus.state,
185
+ events: [],
186
+ deliveryState: "delivered_and_running",
187
+ };
188
+ }
189
+ const waited = await this.waitForTerminalStateOrCurrent(peer.sessionId, inbound.timeoutMs ?? this.askTimeoutMs);
190
+ const chunk = await this.runtime.events(peer.sessionId, cursor);
191
+ const syncedPeer = await this.syncPeerFromRuntime(name);
192
+ return {
193
+ peer: syncedPeer,
194
+ reply: waited.timedOut ? "" : extractReplyText(chunk.items),
195
+ runState: waited.status.state,
196
+ events: chunk.items,
197
+ deliveryState: waited.timedOut ? "delivered_and_running" : "completed",
198
+ };
199
+ }
200
+ async waitForTerminalStateOrCurrent(sessionId, timeoutMs = this.askTimeoutMs) {
201
+ const started = Date.now();
202
+ for (;;) {
203
+ const status = await this.runtime.status(sessionId);
204
+ if (!status) {
205
+ throw new Error(`Unknown runtime session ${sessionId}`);
206
+ }
207
+ if (["idle", "interrupted", "failed", "stopped"].includes(status.state)) {
208
+ return { status, timedOut: false };
209
+ }
210
+ if (Date.now() - started > timeoutMs) {
211
+ return { status, timedOut: true };
212
+ }
213
+ await delay(this.pollIntervalMs);
214
+ }
215
+ }
216
+ async waitForTerminalState(sessionId, timeoutMs = this.askTimeoutMs) {
217
+ const started = Date.now();
218
+ for (;;) {
219
+ const status = await this.runtime.status(sessionId);
220
+ if (!status) {
221
+ throw new Error(`Unknown runtime session ${sessionId}`);
222
+ }
223
+ if (["idle", "interrupted", "failed", "stopped"].includes(status.state)) {
224
+ return status;
225
+ }
226
+ if (Date.now() - started > timeoutMs) {
227
+ throw new Error(`Timed out waiting for peer ${sessionId} to become idle`);
228
+ }
229
+ await delay(this.pollIntervalMs);
230
+ }
231
+ }
232
+ async syncPeerFromRuntime(name) {
233
+ const peer = this.requirePeer(name);
234
+ const status = await this.runtime.status(peer.sessionId);
235
+ if (!status) {
236
+ const next = {
237
+ ...peer,
238
+ state: "disconnected",
239
+ updatedAt: new Date().toISOString(),
240
+ lastActivityAt: new Date().toISOString(),
241
+ };
242
+ this.peers.set(name, next);
243
+ return next;
244
+ }
245
+ const next = this.peerFromStatus(name, status, mapRuntimeState(status.state, true));
246
+ this.peers.set(name, next);
247
+ await this.transport?.updatePeer(next);
248
+ return next;
249
+ }
250
+ peerFromStatus(name, status, state) {
251
+ return {
252
+ name,
253
+ sessionId: status.sessionId,
254
+ cwd: status.cwd,
255
+ model: status.model,
256
+ driver: status.driver,
257
+ state,
258
+ createdAt: status.createdAt,
259
+ updatedAt: status.updatedAt,
260
+ lastActivityAt: status.lastActivityAt,
261
+ };
262
+ }
263
+ async registerTransportPeer(name) {
264
+ if (!this.transport) {
265
+ return;
266
+ }
267
+ const peer = this.requirePeer(name);
268
+ await this.transport.registerPeer(peer, async (message) => {
269
+ await this.handleTransportMessage(name, message);
270
+ });
271
+ }
272
+ async unregisterTransportPeer(name) {
273
+ await this.transport?.unregisterPeer(name);
274
+ }
275
+ async handleTransportMessage(name, message) {
276
+ const inbound = {
277
+ kind: message.replyTo ? "reply" : message.expectsReply ? "ask" : "send",
278
+ from: message.from.name ?? message.from.id,
279
+ text: formatTransportInboundText(message),
280
+ replyTo: message.replyTo,
281
+ };
282
+ if (message.expectsReply) {
283
+ try {
284
+ const result = await this.deliver(name, inbound, { waitForIdle: true });
285
+ await this.transport?.sendFromPeer(name, message.from.id, {
286
+ text: result.reply,
287
+ replyTo: message.id,
288
+ });
289
+ }
290
+ catch (error) {
291
+ await this.transport?.sendFromPeer(name, message.from.id, {
292
+ text: `Bridge error: ${error instanceof Error ? error.message : String(error)}`,
293
+ replyTo: message.id,
294
+ });
295
+ }
296
+ return;
297
+ }
298
+ await this.deliver(name, inbound, { waitForIdle: false });
299
+ }
300
+ async rememberPeer(name, sessionId) {
301
+ const registry = await readBridgeRegistry(this.storageDir);
302
+ const peers = registry.peers.filter((peer) => peer.name !== name);
303
+ peers.push({ name, sessionId });
304
+ await writeBridgeRegistry(this.storageDir, { peers: peers.sort((a, b) => a.name.localeCompare(b.name)) });
305
+ }
306
+ async forgetPeer(name) {
307
+ const registry = await readBridgeRegistry(this.storageDir);
308
+ await writeBridgeRegistry(this.storageDir, {
309
+ peers: registry.peers.filter((peer) => peer.name !== name),
310
+ });
311
+ }
312
+ requirePeer(name) {
313
+ const peer = this.peers.get(name);
314
+ if (!peer) {
315
+ throw new Error(`Unknown peer ${name}`);
316
+ }
317
+ return peer;
318
+ }
319
+ assertPeerNameAvailable(name) {
320
+ if (this.peers.has(name)) {
321
+ throw new Error(`Peer name ${name} already registered`);
322
+ }
323
+ }
324
+ }
325
+ function mergeSystemPrompt(appendSystemPrompt) {
326
+ return appendSystemPrompt ? `${appendSystemPrompt}\n\n${BRIDGE_SYSTEM_PROMPT}` : BRIDGE_SYSTEM_PROMPT;
327
+ }
328
+ function formatInboundMessage(message) {
329
+ const header = [
330
+ `kind=${message.kind}`,
331
+ `from=${message.from}`,
332
+ message.replyTo ? `replyTo=${message.replyTo}` : undefined,
333
+ ]
334
+ .filter(Boolean)
335
+ .join(" ");
336
+ return [`[intercom ${header}]`, message.text].join("\n\n");
337
+ }
338
+ function extractReplyText(events) {
339
+ const assistantBlocks = events
340
+ .filter((event) => event.type === "message" && event.role === "assistant")
341
+ .flatMap((event) => event.message.blocks)
342
+ .map(blockToVisibleText)
343
+ .filter((value) => Boolean(value && value.trim()));
344
+ if (assistantBlocks.length > 0) {
345
+ return assistantBlocks.join("\n\n").trim();
346
+ }
347
+ const result = [...events]
348
+ .reverse()
349
+ .find((event) => event.type === "result");
350
+ return result?.summary ?? "";
351
+ }
352
+ function extractLatestReplyText(events) {
353
+ const latestAssistantMessage = [...events]
354
+ .reverse()
355
+ .find((event) => event.type === "message" && event.role === "assistant"
356
+ && event.message.blocks.some((block) => Boolean(blockToVisibleText(block)?.trim())));
357
+ if (latestAssistantMessage) {
358
+ return latestAssistantMessage.message.blocks
359
+ .map(blockToVisibleText)
360
+ .filter((value) => Boolean(value && value.trim()))
361
+ .join("\n\n")
362
+ .trim();
363
+ }
364
+ const result = [...events]
365
+ .reverse()
366
+ .find((event) => event.type === "result");
367
+ return result?.summary ?? "";
368
+ }
369
+ function blockToVisibleText(block) {
370
+ if (block.type === "thinking") {
371
+ return undefined;
372
+ }
373
+ return typeof block.text === "string" ? block.text : undefined;
374
+ }
375
+ function mapRuntimeState(state, registered) {
376
+ switch (state) {
377
+ case "starting":
378
+ return registered ? "starting" : "connected";
379
+ case "running":
380
+ return "busy";
381
+ case "idle":
382
+ return "idle";
383
+ case "interrupted":
384
+ return "interrupted";
385
+ case "stopped":
386
+ return "stopped";
387
+ case "failed":
388
+ return "errored";
389
+ default:
390
+ return "connected";
391
+ }
392
+ }
393
+ async function delay(ms) {
394
+ await new Promise((resolve) => setTimeout(resolve, ms));
395
+ }
396
+ function formatTransportInboundText(message) {
397
+ const attachmentText = (message.attachments ?? []).map((attachment) => {
398
+ if (attachment.language) {
399
+ return [`---`, `Attachment: ${attachment.name}`, `~~~${attachment.language}`, attachment.content, `~~~`].join("\n");
400
+ }
401
+ return [`---`, `Attachment: ${attachment.name}`, attachment.content].join("\n");
402
+ }).join("\n\n");
403
+ return attachmentText ? `${message.text}\n\n${attachmentText}` : message.text;
404
+ }
405
+ export { BRIDGE_SYSTEM_PROMPT, extractLatestReplyText, extractReplyText, formatInboundMessage, formatTransportInboundText, mapRuntimeState };
406
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { ClaudeRuntimeIntercomBridge } from "./bridge.js";
3
+ const bridge = new ClaudeRuntimeIntercomBridge();
4
+ const prompt = process.argv.slice(2).join(" ") || "You are demo worker. Reply briefly.";
5
+ const peer = await bridge.launchPeer({
6
+ name: "demo-worker",
7
+ prompt,
8
+ permissionMode: "bypassPermissions",
9
+ });
10
+ console.log("launched", JSON.stringify(peer, null, 2));
11
+ const ask = await bridge.ask("demo-worker", {
12
+ from: "demo-client",
13
+ text: "Reply with exactly: intercom-ok",
14
+ });
15
+ console.log("ask", JSON.stringify(ask, null, 2));
16
+ const stopped = await bridge.stop("demo-worker");
17
+ console.log("stopped", JSON.stringify(stopped, null, 2));
18
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;AACjD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,qCAAqC,CAAC;AAExF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,MAAM;IACN,cAAc,EAAE,mBAAmB;CACpC,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAEvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1C,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,iCAAiC;CACxC,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAEjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACjD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { ClaudeRuntimeIntercomBridge } from "./bridge.js";
2
+ export { PiIntercomTransport } from "./pi-intercom-transport.js";
3
+ export { BRIDGE_SYSTEM_PROMPT, extractLatestReplyText, extractReplyText, formatInboundMessage, formatTransportInboundText, mapRuntimeState, } from "./bridge.js";
4
+ export { defaultBridgeStorageDir, bridgeRegistryPath, readBridgeRegistry, writeBridgeRegistry, } from "./persistence.js";
5
+ export type { AskResult, AttachPeerInput, BridgeOptions, BridgePeer, BridgeState, BridgeTransport, BridgeTransportAttachment, BridgeTransportIncomingMessage, BridgeTransportOutgoingMessage, BridgeTransportSessionInfo, BridgeTransportStatus, DeliveryState, IntercomInboundMessage, IntercomMessageKind, InterruptPeerResult, LaunchPeerInput, } from "./types.js";
@@ -0,0 +1,5 @@
1
+ export { ClaudeRuntimeIntercomBridge } from "./bridge.js";
2
+ export { PiIntercomTransport } from "./pi-intercom-transport.js";
3
+ export { BRIDGE_SYSTEM_PROMPT, extractLatestReplyText, extractReplyText, formatInboundMessage, formatTransportInboundText, mapRuntimeState, } from "./bridge.js";
4
+ export { defaultBridgeStorageDir, bridgeRegistryPath, readBridgeRegistry, writeBridgeRegistry, } from "./persistence.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface PersistedBridgePeerRecord {
2
+ name: string;
3
+ sessionId: string;
4
+ }
5
+ interface PersistedBridgeRegistry {
6
+ peers: PersistedBridgePeerRecord[];
7
+ }
8
+ export declare function defaultBridgeStorageDir(): string;
9
+ export declare function bridgeRegistryPath(storageDir: string): string;
10
+ export declare function readBridgeRegistry(storageDir: string): Promise<PersistedBridgeRegistry>;
11
+ export declare function writeBridgeRegistry(storageDir: string, registry: PersistedBridgeRegistry): Promise<void>;
12
+ export {};
@@ -0,0 +1,31 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ export function defaultBridgeStorageDir() {
4
+ return resolve(process.cwd(), ".claude-intercom-bridge");
5
+ }
6
+ export function bridgeRegistryPath(storageDir) {
7
+ return join(storageDir, "peers.json");
8
+ }
9
+ export async function readBridgeRegistry(storageDir) {
10
+ try {
11
+ const parsed = JSON.parse(await readFile(bridgeRegistryPath(storageDir), "utf8"));
12
+ const peers = Array.isArray(parsed?.peers)
13
+ ? parsed.peers
14
+ .filter((peer) => typeof peer?.name === "string" && typeof peer?.sessionId === "string")
15
+ .map((peer) => ({ name: peer.name, sessionId: peer.sessionId }))
16
+ : [];
17
+ return { peers };
18
+ }
19
+ catch (error) {
20
+ if (error.code === "ENOENT" || error instanceof SyntaxError) {
21
+ return { peers: [] };
22
+ }
23
+ throw error;
24
+ }
25
+ }
26
+ export async function writeBridgeRegistry(storageDir, registry) {
27
+ const path = bridgeRegistryPath(storageDir);
28
+ await mkdir(dirname(path), { recursive: true });
29
+ await writeFile(path, `${JSON.stringify(registry, null, 2)}\n`, "utf8");
30
+ }
31
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWnD,MAAM,UAAU,uBAAuB;IACrC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAE/E,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;YACxC,CAAC,CAAC,MAAM,CAAC,KAAK;iBACX,MAAM,CAAC,CAAC,IAAI,EAA+C,EAAE,CAC5D,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,QAAQ,CACtE;iBACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAClE,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACvF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB,EAAE,QAAiC;IAC7F,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { BridgePeer, BridgeTransport, BridgeTransportIncomingMessage, BridgeTransportOutgoingMessage, BridgeTransportSessionInfo, BridgeTransportStatus } from "./types.js";
2
+ export declare class PiIntercomTransport implements BridgeTransport {
3
+ private readonly clients;
4
+ static canConnect(timeoutMs?: number): Promise<boolean>;
5
+ registerPeer(peer: BridgePeer, onMessage: (message: BridgeTransportIncomingMessage) => Promise<void> | void): Promise<void>;
6
+ updatePeer(peer: BridgePeer): Promise<void>;
7
+ unregisterPeer(name: string): Promise<void>;
8
+ sendFromPeer(peerName: string, to: string, message: BridgeTransportOutgoingMessage): Promise<void>;
9
+ listSessions(): Promise<BridgeTransportSessionInfo[]>;
10
+ getStatus(): BridgeTransportStatus;
11
+ close(): Promise<void>;
12
+ }