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,347 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { EventEmitter } from "node:events";
3
+ import net from "node:net";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+ function sanitizePipeSegment(value) {
7
+ return value.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").toLowerCase() || "default";
8
+ }
9
+ function getBrokerSocketPath() {
10
+ if (process.platform === "win32") {
11
+ return `\\\\.\\pipe\\pi-intercom-${sanitizePipeSegment(homedir())}`;
12
+ }
13
+ return join(homedir(), ".pi/agent/intercom/broker.sock");
14
+ }
15
+ function writeMessage(socket, message) {
16
+ const payload = Buffer.from(JSON.stringify(message), "utf8");
17
+ const header = Buffer.alloc(4);
18
+ header.writeUInt32BE(payload.length, 0);
19
+ socket.write(Buffer.concat([header, payload]));
20
+ }
21
+ function createMessageReader(onMessage, onError) {
22
+ let buffer = Buffer.alloc(0);
23
+ return (data) => {
24
+ buffer = Buffer.concat([buffer, data]);
25
+ while (buffer.length >= 4) {
26
+ const length = buffer.readUInt32BE(0);
27
+ if (buffer.length < 4 + length) {
28
+ return;
29
+ }
30
+ const payload = buffer.subarray(4, 4 + length);
31
+ buffer = buffer.subarray(4 + length);
32
+ try {
33
+ onMessage(JSON.parse(payload.toString("utf8")));
34
+ }
35
+ catch (error) {
36
+ onError(error instanceof Error ? error : new Error(String(error)));
37
+ return;
38
+ }
39
+ }
40
+ };
41
+ }
42
+ class IntercomBrokerClient extends EventEmitter {
43
+ socket = null;
44
+ sessionId = null;
45
+ pendingSends = new Map();
46
+ pendingLists = new Map();
47
+ get connected() {
48
+ return Boolean(this.socket && this.sessionId && !this.socket.destroyed && !this.socket.writableEnded && this.socket.writable);
49
+ }
50
+ async connect(session) {
51
+ if (this.socket) {
52
+ throw new Error("Already connected");
53
+ }
54
+ const socket = net.connect(getBrokerSocketPath());
55
+ this.socket = socket;
56
+ await new Promise((resolve, reject) => {
57
+ const timeout = setTimeout(() => {
58
+ cleanup();
59
+ socket.destroy();
60
+ reject(new Error("Intercom broker connection timeout"));
61
+ }, 5_000);
62
+ const cleanup = () => {
63
+ clearTimeout(timeout);
64
+ socket.off("error", onError);
65
+ socket.off("close", onClose);
66
+ this.off("registered", onRegistered);
67
+ };
68
+ const onError = (error) => {
69
+ cleanup();
70
+ this.socket = null;
71
+ reject(error);
72
+ };
73
+ const onClose = () => {
74
+ cleanup();
75
+ this.socket = null;
76
+ this.sessionId = null;
77
+ reject(new Error("Intercom broker closed before registration"));
78
+ };
79
+ const onRegistered = () => {
80
+ cleanup();
81
+ resolve();
82
+ };
83
+ const reader = createMessageReader((message) => this.handleMessage(message), (error) => socket.destroy(error));
84
+ socket.on("data", reader);
85
+ socket.once("error", onError);
86
+ socket.once("close", onClose);
87
+ this.once("registered", onRegistered);
88
+ writeMessage(socket, { type: "register", session });
89
+ });
90
+ socket.on("error", (error) => this.emit("error", error));
91
+ socket.on("close", () => {
92
+ this.socket = null;
93
+ this.sessionId = null;
94
+ this.emit("disconnected");
95
+ });
96
+ }
97
+ async disconnect() {
98
+ const socket = this.socket;
99
+ if (!socket) {
100
+ return;
101
+ }
102
+ this.rejectPending(new Error("Intercom client disconnected"));
103
+ await new Promise((resolve) => {
104
+ socket.once("close", () => resolve());
105
+ try {
106
+ writeMessage(socket, { type: "unregister" });
107
+ socket.end();
108
+ }
109
+ catch {
110
+ socket.destroy();
111
+ resolve();
112
+ }
113
+ });
114
+ }
115
+ async listSessions() {
116
+ const socket = this.requireSocket();
117
+ const requestId = randomUUID();
118
+ return new Promise((resolve, reject) => {
119
+ const timeout = setTimeout(() => {
120
+ this.pendingLists.delete(requestId);
121
+ reject(new Error("Intercom list timeout"));
122
+ }, 5_000);
123
+ this.pendingLists.set(requestId, {
124
+ resolve: (sessions) => {
125
+ clearTimeout(timeout);
126
+ resolve(sessions);
127
+ },
128
+ reject: (error) => {
129
+ clearTimeout(timeout);
130
+ reject(error);
131
+ },
132
+ });
133
+ writeMessage(socket, { type: "list", requestId });
134
+ });
135
+ }
136
+ async send(to, message) {
137
+ const socket = this.requireSocket();
138
+ const messageId = randomUUID();
139
+ return new Promise((resolve, reject) => {
140
+ const timeout = setTimeout(() => {
141
+ this.pendingSends.delete(messageId);
142
+ reject(new Error("Intercom send timeout"));
143
+ }, 10_000);
144
+ this.pendingSends.set(messageId, {
145
+ resolve: (result) => {
146
+ clearTimeout(timeout);
147
+ resolve(result);
148
+ },
149
+ reject: (error) => {
150
+ clearTimeout(timeout);
151
+ reject(error);
152
+ },
153
+ });
154
+ writeMessage(socket, {
155
+ type: "send",
156
+ to,
157
+ message: {
158
+ id: messageId,
159
+ timestamp: Date.now(),
160
+ replyTo: message.replyTo,
161
+ expectsReply: message.expectsReply,
162
+ content: {
163
+ text: message.text,
164
+ attachments: message.attachments,
165
+ },
166
+ },
167
+ });
168
+ });
169
+ }
170
+ updatePresence(input) {
171
+ const socket = this.socket;
172
+ if (!socket || !this.sessionId || socket.destroyed || socket.writableEnded || !socket.writable) {
173
+ return;
174
+ }
175
+ writeMessage(socket, { type: "presence", ...input });
176
+ }
177
+ requireSocket() {
178
+ if (!this.connected || !this.socket) {
179
+ throw new Error("Intercom broker not connected");
180
+ }
181
+ return this.socket;
182
+ }
183
+ rejectPending(error) {
184
+ for (const pending of this.pendingSends.values()) {
185
+ pending.reject(error);
186
+ }
187
+ this.pendingSends.clear();
188
+ for (const pending of this.pendingLists.values()) {
189
+ pending.reject(error);
190
+ }
191
+ this.pendingLists.clear();
192
+ }
193
+ handleMessage(message) {
194
+ switch (message.type) {
195
+ case "registered":
196
+ this.sessionId = message.sessionId;
197
+ this.emit("registered", message.sessionId);
198
+ return;
199
+ case "sessions": {
200
+ const pending = this.pendingLists.get(message.requestId);
201
+ if (!pending) {
202
+ return;
203
+ }
204
+ this.pendingLists.delete(message.requestId);
205
+ pending.resolve(message.sessions);
206
+ return;
207
+ }
208
+ case "message":
209
+ this.emit("message", {
210
+ id: message.message.id,
211
+ timestamp: message.message.timestamp,
212
+ replyTo: message.message.replyTo,
213
+ expectsReply: message.message.expectsReply,
214
+ text: message.message.content.text,
215
+ attachments: message.message.content.attachments,
216
+ from: message.from,
217
+ });
218
+ return;
219
+ case "delivered": {
220
+ const pending = this.pendingSends.get(message.messageId);
221
+ if (!pending) {
222
+ return;
223
+ }
224
+ this.pendingSends.delete(message.messageId);
225
+ pending.resolve({ id: message.messageId, delivered: true });
226
+ return;
227
+ }
228
+ case "delivery_failed": {
229
+ const pending = this.pendingSends.get(message.messageId);
230
+ if (!pending) {
231
+ return;
232
+ }
233
+ this.pendingSends.delete(message.messageId);
234
+ pending.resolve({ id: message.messageId, delivered: false, reason: message.reason });
235
+ return;
236
+ }
237
+ case "error":
238
+ this.emit("error", new Error(message.error));
239
+ return;
240
+ default:
241
+ return;
242
+ }
243
+ }
244
+ }
245
+ export class PiIntercomTransport {
246
+ clients = new Map();
247
+ static async canConnect(timeoutMs = 500) {
248
+ return new Promise((resolve) => {
249
+ const socket = net.connect(getBrokerSocketPath());
250
+ const finish = (ok) => {
251
+ clearTimeout(timeout);
252
+ socket.off("connect", onConnect);
253
+ socket.off("error", onError);
254
+ resolve(ok);
255
+ };
256
+ const onConnect = () => {
257
+ socket.end();
258
+ finish(true);
259
+ };
260
+ const onError = () => {
261
+ socket.destroy();
262
+ finish(false);
263
+ };
264
+ socket.once("connect", onConnect);
265
+ socket.once("error", onError);
266
+ const timeout = setTimeout(() => {
267
+ socket.destroy();
268
+ finish(false);
269
+ }, timeoutMs);
270
+ });
271
+ }
272
+ async registerPeer(peer, onMessage) {
273
+ await this.unregisterPeer(peer.name);
274
+ const client = new IntercomBrokerClient();
275
+ client.on("message", async (message) => {
276
+ await onMessage(message);
277
+ });
278
+ client.on("error", () => {
279
+ // Keep transport errors out of stdout; caller sees missing broker on next operation.
280
+ });
281
+ await client.connect(buildSessionInfo(peer));
282
+ this.clients.set(peer.name, { client, peer });
283
+ }
284
+ async updatePeer(peer) {
285
+ const entry = this.clients.get(peer.name);
286
+ if (!entry) {
287
+ return;
288
+ }
289
+ entry.peer = peer;
290
+ entry.client.updatePresence({
291
+ name: peer.name,
292
+ model: peer.model,
293
+ status: peer.state,
294
+ });
295
+ }
296
+ async unregisterPeer(name) {
297
+ const entry = this.clients.get(name);
298
+ if (!entry) {
299
+ return;
300
+ }
301
+ this.clients.delete(name);
302
+ await entry.client.disconnect();
303
+ }
304
+ async sendFromPeer(peerName, to, message) {
305
+ const entry = this.clients.get(peerName);
306
+ if (!entry) {
307
+ throw new Error(`Peer ${peerName} not connected to intercom transport`);
308
+ }
309
+ const result = await entry.client.send(to, message);
310
+ if (!result.delivered) {
311
+ throw new Error(result.reason ?? `Failed to deliver message from ${peerName} to ${to}`);
312
+ }
313
+ }
314
+ async listSessions() {
315
+ const first = this.clients.values().next().value;
316
+ if (!first) {
317
+ return [];
318
+ }
319
+ return first.client.listSessions();
320
+ }
321
+ getStatus() {
322
+ const entries = [...this.clients.values()];
323
+ return {
324
+ kind: "pi-intercom",
325
+ boundPeers: entries.length,
326
+ connectedPeers: entries.filter((entry) => entry.client.connected).length,
327
+ };
328
+ }
329
+ async close() {
330
+ for (const name of [...this.clients.keys()]) {
331
+ await this.unregisterPeer(name);
332
+ }
333
+ }
334
+ }
335
+ function buildSessionInfo(peer) {
336
+ const now = Date.now();
337
+ return {
338
+ name: peer.name,
339
+ cwd: peer.cwd,
340
+ model: peer.model ?? "claude-code-agent",
341
+ pid: process.pid,
342
+ startedAt: now,
343
+ lastActivity: now,
344
+ status: peer.state,
345
+ };
346
+ }
347
+ //# sourceMappingURL=pi-intercom-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-intercom-transport.js","sourceRoot":"","sources":["../src/pi-intercom-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ import type { ClaudeCodeRuntime, InterruptResult, RuntimeDriverName, RuntimeEvent, RuntimeSessionId, RuntimeStatus, StartSessionInput } from "@pi-claude-code-agent/runtime";
2
+ export type BridgeState = "starting" | "connected" | "idle" | "busy" | "interrupted" | "stopped" | "errored" | "disconnected";
3
+ export type IntercomMessageKind = "send" | "ask" | "reply";
4
+ export interface BridgePeer {
5
+ name: string;
6
+ sessionId: RuntimeSessionId;
7
+ cwd: string;
8
+ model?: string;
9
+ driver?: RuntimeDriverName;
10
+ state: BridgeState;
11
+ createdAt: string;
12
+ updatedAt: string;
13
+ lastActivityAt: string;
14
+ }
15
+ export interface InterruptPeerResult {
16
+ peer: BridgePeer;
17
+ interrupt: InterruptResult;
18
+ }
19
+ export interface LaunchPeerInput {
20
+ name: string;
21
+ prompt: string;
22
+ driver?: RuntimeDriverName;
23
+ cwd?: string;
24
+ model?: string;
25
+ appendSystemPrompt?: string;
26
+ permissionMode?: StartSessionInput["permissionMode"];
27
+ tools?: string[];
28
+ additionalDirectories?: string[];
29
+ env?: Record<string, string>;
30
+ waitForIdle?: boolean;
31
+ }
32
+ export interface AttachPeerInput {
33
+ name: string;
34
+ sessionId: RuntimeSessionId;
35
+ }
36
+ export interface IntercomInboundMessage {
37
+ kind: IntercomMessageKind;
38
+ from: string;
39
+ text: string;
40
+ replyTo?: string;
41
+ timeoutMs?: number;
42
+ model?: string;
43
+ }
44
+ export type DeliveryState = "completed" | "delivered_and_running";
45
+ export interface AskResult {
46
+ peer: BridgePeer;
47
+ reply: string;
48
+ runState: RuntimeStatus["state"];
49
+ events: RuntimeEvent[];
50
+ deliveryState: DeliveryState;
51
+ }
52
+ export interface BridgeTransportAttachment {
53
+ type: "file" | "snippet" | "context";
54
+ name: string;
55
+ content: string;
56
+ language?: string;
57
+ }
58
+ export interface BridgeTransportSessionInfo {
59
+ id: string;
60
+ name?: string;
61
+ cwd: string;
62
+ model: string;
63
+ pid: number;
64
+ startedAt: number;
65
+ lastActivity: number;
66
+ status?: string;
67
+ }
68
+ export interface BridgeTransportIncomingMessage {
69
+ id: string;
70
+ timestamp: number;
71
+ replyTo?: string;
72
+ expectsReply?: boolean;
73
+ text: string;
74
+ attachments?: BridgeTransportAttachment[];
75
+ from: BridgeTransportSessionInfo;
76
+ }
77
+ export interface BridgeTransportOutgoingMessage {
78
+ text: string;
79
+ replyTo?: string;
80
+ expectsReply?: boolean;
81
+ attachments?: BridgeTransportAttachment[];
82
+ }
83
+ export interface BridgeTransportStatus {
84
+ kind: string;
85
+ boundPeers: number;
86
+ connectedPeers: number;
87
+ }
88
+ export interface BridgeTransport {
89
+ registerPeer(peer: BridgePeer, onMessage: (message: BridgeTransportIncomingMessage) => Promise<void> | void): Promise<void>;
90
+ updatePeer(peer: BridgePeer): Promise<void>;
91
+ unregisterPeer(name: string): Promise<void>;
92
+ sendFromPeer(peerName: string, to: string, message: BridgeTransportOutgoingMessage): Promise<void>;
93
+ listSessions?(): Promise<BridgeTransportSessionInfo[]>;
94
+ getStatus?(): Promise<BridgeTransportStatus> | BridgeTransportStatus;
95
+ close?(): Promise<void>;
96
+ }
97
+ export interface BridgeOptions {
98
+ runtime?: ClaudeCodeRuntime;
99
+ storageDir?: string;
100
+ transport?: BridgeTransport;
101
+ pollIntervalMs?: number;
102
+ askTimeoutMs?: number;
103
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@pi-claude-code-agent/intercom-bridge",
3
+ "version": "0.10.0",
4
+ "type": "module",
5
+ "description": "Thin intercom-style bridge for Claude Code runtime sessions",
6
+ "files": [
7
+ "dist",
8
+ "package.json"
9
+ ],
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "bin": {
19
+ "claude-intercom-demo": "./dist/cli.js"
20
+ },
21
+ "scripts": {
22
+ "build": "tsc -p tsconfig.json",
23
+ "test": "node --test --import tsx ./test/**/*.test.ts",
24
+ "demo": "tsx src/cli.ts"
25
+ },
26
+ "peerDependencies": {
27
+ "@pi-claude-code-agent/runtime": "0.10.0"
28
+ },
29
+ "devDependencies": {
30
+ "tsx": "^4.20.6"
31
+ }
32
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { resolveRuntimeDriverFromEnv } from "./driver-config.js";
4
+ import { ClaudeCodeRuntime } from "./runtime.js";
5
+ const runtime = new ClaudeCodeRuntime({ defaultDriver: resolveRuntimeDriverFromEnv() });
6
+ const prompt = process.argv.slice(2).join(" ") || "Reply with exactly: smoke-ok";
7
+ const session = await runtime.start({
8
+ prompt,
9
+ name: "runtime-smoke",
10
+ permissionMode: "bypassPermissions",
11
+ });
12
+ console.log(`started ${session.sessionId}`);
13
+ for (;;) {
14
+ const status = await runtime.status(session.sessionId);
15
+ if (!status) {
16
+ throw new Error("session disappeared");
17
+ }
18
+ if (["idle", "failed", "stopped", "interrupted"].includes(status.state)) {
19
+ console.log(JSON.stringify(status, null, 2));
20
+ const tail = await runtime.tail(session.sessionId, 10);
21
+ console.log(JSON.stringify(tail, null, 2));
22
+ break;
23
+ }
24
+ await delay(500);
25
+ }
26
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,aAAa,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;AACxF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,8BAA8B,CAAC;AAEjF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC;IAClC,MAAM;IACN,IAAI,EAAE,eAAe;IACrB,cAAc,EAAE,mBAAmB;CACpC,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;AAE5C,SAAS,CAAC;IACR,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM;IACR,CAAC;IACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RuntimeDriverName } from "./types.js";
2
+ export declare const RUNTIME_DRIVER_ENV = "PI_CLAUDE_RUNTIME_DRIVER";
3
+ export declare function parseRuntimeDriverName(value: unknown): RuntimeDriverName | undefined;
4
+ export declare function resolveRuntimeDriverFromEnv(env?: Record<string, string | undefined>): RuntimeDriverName | undefined;
@@ -0,0 +1,12 @@
1
+ export const RUNTIME_DRIVER_ENV = "PI_CLAUDE_RUNTIME_DRIVER";
2
+ export function parseRuntimeDriverName(value) {
3
+ if (typeof value !== "string") {
4
+ return undefined;
5
+ }
6
+ const trimmed = value.trim();
7
+ return trimmed === "claude-sdk" || trimmed === "codex-cli" ? trimmed : undefined;
8
+ }
9
+ export function resolveRuntimeDriverFromEnv(env = process.env) {
10
+ return parseRuntimeDriverName(env[RUNTIME_DRIVER_ENV]);
11
+ }
12
+ //# sourceMappingURL=driver-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-config.js","sourceRoot":"","sources":["../src/driver-config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAE7D,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,MAA0C,OAAO,CAAC,GAAG;IAErD,OAAO,sBAAsB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { NormalizedDriverMessage } from "./messages.js";
2
+ import type { DriverEventEnvelope, RuntimeDriver, RuntimeDriverRunHandle, RuntimeDriverRunInput } from "../types.js";
3
+ export declare function parseClaudeSdkMessage(message: unknown): NormalizedDriverMessage[];
4
+ export declare class ClaudeSdkDriver implements RuntimeDriver {
5
+ readonly name: "claude-sdk";
6
+ run(input: RuntimeDriverRunInput, onEvent: (event: DriverEventEnvelope) => Promise<void> | void): RuntimeDriverRunHandle;
7
+ private buildOptions;
8
+ }