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 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,aAAa,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;AACxF,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,iCAAiC,CAAC;AAElF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;IACjC,KAAK,EAAE;QACL,IAAI,EAAE,eAAe;QACrB,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,+CAA+C;KACxD;IACD,IAAI;CACL,CAAC,CAAC;AAEH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ClaudeCodeSubagentBackend } from "./backend.js";
2
+ export { buildTaskPrompt, extractSummary, mapRunState } from "./backend.js";
3
+ export { defaultRunsDir, runDir, ensureRunLayout, writeRunState, readRunState, listRunStates, appendRunEvent, readRunEvents, writeRunResult, readRunResult, } from "./persistence.js";
4
+ export type { PersistedRunStatus, RunResult, StartRunInput, SubagentBackend, SubagentContextMode, SubagentDefinition, SubagentRunChunk, SubagentRunRecord, SubagentRunState, SubagentRunner, RuntimeSubagentBackendOptions, } from "./types.js";
@@ -0,0 +1,4 @@
1
+ export { ClaudeCodeSubagentBackend } from "./backend.js";
2
+ export { buildTaskPrompt, extractSummary, mapRunState } from "./backend.js";
3
+ export { defaultRunsDir, runDir, ensureRunLayout, writeRunState, readRunState, listRunStates, appendRunEvent, readRunEvents, writeRunResult, readRunResult, } from "./persistence.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EACL,cAAc,EACd,MAAM,EACN,eAAe,EACf,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { RuntimeEvent } from "@pi-claude-code-agent/runtime";
2
+ import type { RunResult, SubagentRunChunk, SubagentRunRecord } from "./types.js";
3
+ export declare function defaultRunsDir(): string;
4
+ export declare function runDir(storageDir: string, runId: string): string;
5
+ export declare function ensureRunLayout(storageDir: string, runId: string): Promise<void>;
6
+ export declare function writeRunState(storageDir: string, record: SubagentRunRecord): Promise<void>;
7
+ export declare function readRunState(storageDir: string, runId: string): Promise<SubagentRunRecord | undefined>;
8
+ export declare function listRunStates(storageDir: string): Promise<SubagentRunRecord[]>;
9
+ export declare function appendRunEvent(storageDir: string, runId: string, event: RuntimeEvent): Promise<void>;
10
+ export declare function readRunEvents(storageDir: string, runId: string, cursor?: number): Promise<SubagentRunChunk>;
11
+ export declare function writeRunResult(storageDir: string, runId: string, result: RunResult): Promise<void>;
12
+ export declare function readRunResult(storageDir: string, runId: string): Promise<RunResult | undefined>;
@@ -0,0 +1,81 @@
1
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ export function defaultRunsDir() {
4
+ return resolve(process.cwd(), ".subagent-runs");
5
+ }
6
+ export function runDir(storageDir, runId) {
7
+ return join(storageDir, "runs", runId);
8
+ }
9
+ export async function ensureRunLayout(storageDir, runId) {
10
+ const dir = runDir(storageDir, runId);
11
+ await mkdir(join(dir, "artifacts"), { recursive: true });
12
+ }
13
+ export async function writeRunState(storageDir, record) {
14
+ const file = join(runDir(storageDir, record.runId), "status.json");
15
+ await mkdir(dirname(file), { recursive: true });
16
+ await writeFile(file, `${JSON.stringify(record, null, 2)}\n`, "utf8");
17
+ }
18
+ export async function readRunState(storageDir, runId) {
19
+ try {
20
+ const file = join(runDir(storageDir, runId), "status.json");
21
+ return JSON.parse(await readFile(file, "utf8"));
22
+ }
23
+ catch (error) {
24
+ if (error.code === "ENOENT") {
25
+ return undefined;
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ export async function listRunStates(storageDir) {
31
+ try {
32
+ const root = join(storageDir, "runs");
33
+ const ids = await readdir(root);
34
+ const states = await Promise.all(ids.map((id) => readRunState(storageDir, id)));
35
+ return states.filter((value) => Boolean(value));
36
+ }
37
+ catch (error) {
38
+ if (error.code === "ENOENT") {
39
+ return [];
40
+ }
41
+ throw error;
42
+ }
43
+ }
44
+ export async function appendRunEvent(storageDir, runId, event) {
45
+ const file = join(runDir(storageDir, runId), "events.jsonl");
46
+ await mkdir(dirname(file), { recursive: true });
47
+ await writeFile(file, `${JSON.stringify(event)}\n`, { encoding: "utf8", flag: "a" });
48
+ }
49
+ export async function readRunEvents(storageDir, runId, cursor = 0) {
50
+ try {
51
+ const file = join(runDir(storageDir, runId), "events.jsonl");
52
+ const raw = await readFile(file, "utf8");
53
+ const lines = raw.split("\n").filter(Boolean);
54
+ const items = lines.slice(cursor).map((line) => JSON.parse(line));
55
+ return { items, nextCursor: lines.length };
56
+ }
57
+ catch (error) {
58
+ if (error.code === "ENOENT") {
59
+ return { items: [], nextCursor: 0 };
60
+ }
61
+ throw error;
62
+ }
63
+ }
64
+ export async function writeRunResult(storageDir, runId, result) {
65
+ const file = join(runDir(storageDir, runId), "result.json");
66
+ await mkdir(dirname(file), { recursive: true });
67
+ await writeFile(file, `${JSON.stringify(result, null, 2)}\n`, "utf8");
68
+ }
69
+ export async function readRunResult(storageDir, runId) {
70
+ try {
71
+ const file = join(runDir(storageDir, runId), "result.json");
72
+ return JSON.parse(await readFile(file, "utf8"));
73
+ }
74
+ catch (error) {
75
+ if (error.code === "ENOENT") {
76
+ return undefined;
77
+ }
78
+ throw error;
79
+ }
80
+ }
81
+ //# 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,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAInD,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,UAAkB,EAAE,KAAa;IACtD,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,KAAa;IACrE,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,MAAyB;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;IACnE,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,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAkB,EAAE,KAAa;IAClE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAsB,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAA8B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,KAAa,EAAE,KAAmB;IACzF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC;IAC7D,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,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,KAAa,EAAE,MAAM,GAAG,CAAC;IAC/E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC,CAAC;QAClF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;QACtC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,KAAa,EAAE,MAAiB;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5D,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,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,KAAa;IACnE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAc,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { ClaudeCodeRuntime, RuntimeDriverName, RuntimeEvent, RuntimeSessionId, RuntimeSessionState } from "@pi-claude-code-agent/runtime";
2
+ export type SubagentRunner = "pi" | "claude-code-agent";
3
+ export type SubagentContextMode = "fresh" | "fork";
4
+ export type SubagentRunState = "queued" | "starting" | "running" | "idle" | "interrupted" | "failed" | "completed" | "stopped";
5
+ export interface SubagentDefinition {
6
+ name: string;
7
+ prompt?: string;
8
+ runner?: SubagentRunner;
9
+ cwd?: string;
10
+ model?: string;
11
+ }
12
+ export interface StartRunInput {
13
+ agent: SubagentDefinition;
14
+ task: string;
15
+ driver?: RuntimeDriverName;
16
+ cwd?: string;
17
+ model?: string;
18
+ async?: boolean;
19
+ context?: SubagentContextMode;
20
+ }
21
+ export interface RunResult {
22
+ summary: string;
23
+ events: RuntimeEvent[];
24
+ runtimeState: RuntimeSessionState;
25
+ }
26
+ export interface SubagentRunRecord {
27
+ runId: string;
28
+ runner: SubagentRunner;
29
+ agentName: string;
30
+ sessionId?: RuntimeSessionId;
31
+ cwd: string;
32
+ driver?: RuntimeDriverName;
33
+ model?: string;
34
+ state: SubagentRunState;
35
+ context: SubagentContextMode;
36
+ createdAt: string;
37
+ updatedAt: string;
38
+ lastActivityAt: string;
39
+ task: string;
40
+ result?: RunResult;
41
+ note?: string;
42
+ raw?: Record<string, unknown>;
43
+ }
44
+ export interface SubagentRunChunk {
45
+ items: RuntimeEvent[];
46
+ nextCursor: number;
47
+ }
48
+ export interface SubagentBackend {
49
+ readonly runner: SubagentRunner;
50
+ startRun(input: StartRunInput): Promise<SubagentRunRecord>;
51
+ statusRun(runId: string): Promise<SubagentRunRecord | undefined>;
52
+ listRuns(): Promise<SubagentRunRecord[]>;
53
+ eventsRun(runId: string, cursor?: number): Promise<SubagentRunChunk>;
54
+ interruptRun(runId: string): Promise<SubagentRunRecord>;
55
+ stopRun(runId: string): Promise<SubagentRunRecord>;
56
+ collectResult(runId: string): Promise<RunResult | undefined>;
57
+ }
58
+ export interface RuntimeSubagentBackendOptions {
59
+ runtime?: ClaudeCodeRuntime;
60
+ storageDir?: string;
61
+ pollIntervalMs?: number;
62
+ completionTimeoutMs?: number;
63
+ needsAttentionAfterMs?: number;
64
+ attentionPollIntervalMs?: number;
65
+ }
66
+ export interface PersistedRunStatus {
67
+ runId: string;
68
+ sessionId?: RuntimeSessionId;
69
+ state: SubagentRunState;
70
+ updatedAt: string;
71
+ lastActivityAt: string;
72
+ }
@@ -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/subagents-backend",
3
+ "version": "0.10.0",
4
+ "type": "module",
5
+ "description": "Runtime-backed subagent backend abstraction and Claude Code runner",
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-subagent-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,27 @@
1
+ import type { SpawnTeammateInput, TeamMessageResult, TeamTask, TeamsBackendOptions, TeammateRecord, TeammateState } from "./types.js";
2
+ export declare class ClaudeCodeTeamsBackend {
3
+ private readonly bridge;
4
+ private readonly storageDir;
5
+ private readonly ready;
6
+ constructor(options?: TeamsBackendOptions);
7
+ spawnTeammate(input: SpawnTeammateInput): Promise<TeammateRecord>;
8
+ listTeammates(): Promise<TeammateRecord[]>;
9
+ teammateStatus(name: string): Promise<TeammateRecord | undefined>;
10
+ assignTask(input: {
11
+ assignee: string;
12
+ title: string;
13
+ details: string;
14
+ }): Promise<TeamTask>;
15
+ sendMessage(name: string, text: string): Promise<TeamMessageResult>;
16
+ markTaskDone(taskId: string, note?: string): Promise<TeamTask>;
17
+ listTasks(): Promise<TeamTask[]>;
18
+ stopTeammate(name: string): Promise<TeammateRecord>;
19
+ private restoreTeammates;
20
+ private requireTeammate;
21
+ private requireTask;
22
+ private recordFromPeer;
23
+ }
24
+ declare function formatTaskAssignment(task: TeamTask): string;
25
+ declare function classifyTaskReply(reply: string): TeamTask["state"];
26
+ declare function mapState(state: import("@pi-claude-code-agent/intercom-bridge").BridgeState): TeammateState;
27
+ export { classifyTaskReply, formatTaskAssignment, mapState };
@@ -0,0 +1,194 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { resolve } from "node:path";
3
+ import { ClaudeRuntimeIntercomBridge } from "@pi-claude-code-agent/intercom-bridge";
4
+ import { defaultTeamsDir, listTasks, listTeammates, readTask, readTeammate, writeTask, writeTeammate } from "./persistence.js";
5
+ export class ClaudeCodeTeamsBackend {
6
+ bridge;
7
+ storageDir;
8
+ ready;
9
+ constructor(options = {}) {
10
+ this.bridge = options.bridge ?? new ClaudeRuntimeIntercomBridge();
11
+ this.storageDir = resolve(options.storageDir ?? defaultTeamsDir());
12
+ this.ready = this.restoreTeammates();
13
+ }
14
+ async spawnTeammate(input) {
15
+ await this.ready;
16
+ const existing = await readTeammate(this.storageDir, input.name);
17
+ if (existing) {
18
+ throw new Error(`Teammate ${input.name} already exists`);
19
+ }
20
+ const peer = await this.bridge.launchPeer({
21
+ name: input.name,
22
+ prompt: input.prompt,
23
+ driver: input.driver,
24
+ cwd: input.cwd,
25
+ model: input.model,
26
+ });
27
+ const record = this.recordFromPeer(peer.name, peer.sessionId, peer.cwd, peer.driver, peer.model, mapState(peer.state), peer.createdAt, peer.updatedAt, peer.lastActivityAt);
28
+ await writeTeammate(this.storageDir, record);
29
+ return record;
30
+ }
31
+ async listTeammates() {
32
+ await this.ready;
33
+ const teammates = await listTeammates(this.storageDir);
34
+ return teammates.sort((a, b) => a.name.localeCompare(b.name));
35
+ }
36
+ async teammateStatus(name) {
37
+ await this.ready;
38
+ const record = await readTeammate(this.storageDir, name);
39
+ if (!record) {
40
+ return undefined;
41
+ }
42
+ const peer = await this.bridge.status(name);
43
+ if (!peer) {
44
+ return record;
45
+ }
46
+ const next = this.recordFromPeer(peer.name, peer.sessionId, peer.cwd, peer.driver, peer.model, mapState(peer.state), record.createdAt, peer.updatedAt, peer.lastActivityAt);
47
+ await writeTeammate(this.storageDir, next);
48
+ return next;
49
+ }
50
+ async assignTask(input) {
51
+ await this.ready;
52
+ const teammate = await this.requireTeammate(input.assignee);
53
+ const now = new Date().toISOString();
54
+ const task = {
55
+ taskId: randomUUID(),
56
+ title: input.title,
57
+ details: input.details,
58
+ assignee: teammate.name,
59
+ state: "assigned",
60
+ createdAt: now,
61
+ updatedAt: now,
62
+ };
63
+ await writeTask(this.storageDir, task);
64
+ const result = await this.bridge.ask(teammate.name, {
65
+ from: "team-board",
66
+ text: formatTaskAssignment(task),
67
+ });
68
+ task.state = classifyTaskReply(result.reply);
69
+ task.updatedAt = new Date().toISOString();
70
+ task.lastReply = result.reply;
71
+ await writeTask(this.storageDir, task);
72
+ await this.teammateStatus(teammate.name);
73
+ return task;
74
+ }
75
+ async sendMessage(name, text) {
76
+ await this.ready;
77
+ await this.requireTeammate(name);
78
+ const result = await this.bridge.ask(name, {
79
+ from: "team-chat",
80
+ text,
81
+ });
82
+ const teammate = await this.teammateStatus(name);
83
+ if (!teammate) {
84
+ throw new Error(`Teammate ${name} disappeared`);
85
+ }
86
+ return { teammate, reply: result.reply };
87
+ }
88
+ async markTaskDone(taskId, note) {
89
+ await this.ready;
90
+ const task = await this.requireTask(taskId);
91
+ task.state = "done";
92
+ task.updatedAt = new Date().toISOString();
93
+ if (note) {
94
+ task.lastReply = note;
95
+ }
96
+ await writeTask(this.storageDir, task);
97
+ return task;
98
+ }
99
+ async listTasks() {
100
+ await this.ready;
101
+ const tasks = await listTasks(this.storageDir);
102
+ return tasks.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
103
+ }
104
+ async stopTeammate(name) {
105
+ await this.ready;
106
+ const teammate = await this.requireTeammate(name);
107
+ const peer = await this.bridge.stop(name);
108
+ const next = this.recordFromPeer(name, teammate.sessionId, teammate.cwd, peer.driver ?? teammate.driver, teammate.model, mapState(peer.state), teammate.createdAt, peer.updatedAt, peer.lastActivityAt);
109
+ await writeTeammate(this.storageDir, next);
110
+ return next;
111
+ }
112
+ async restoreTeammates() {
113
+ const teammates = await listTeammates(this.storageDir);
114
+ for (const teammate of teammates) {
115
+ if (!teammate.sessionId) {
116
+ continue;
117
+ }
118
+ try {
119
+ const peer = await this.bridge.attachPeer({ name: teammate.name, sessionId: teammate.sessionId });
120
+ if (teammate.driver == null) {
121
+ const next = this.recordFromPeer(peer.name, peer.sessionId, peer.cwd, peer.driver, peer.model, mapState(peer.state), teammate.createdAt, peer.updatedAt, peer.lastActivityAt);
122
+ await writeTeammate(this.storageDir, next);
123
+ }
124
+ }
125
+ catch {
126
+ // Ignore stale bridge/session records.
127
+ }
128
+ }
129
+ }
130
+ async requireTeammate(name) {
131
+ const teammate = await readTeammate(this.storageDir, name);
132
+ if (!teammate) {
133
+ throw new Error(`Unknown teammate ${name}`);
134
+ }
135
+ return teammate;
136
+ }
137
+ async requireTask(taskId) {
138
+ const task = await readTask(this.storageDir, taskId);
139
+ if (!task) {
140
+ throw new Error(`Unknown task ${taskId}`);
141
+ }
142
+ return task;
143
+ }
144
+ recordFromPeer(name, sessionId, cwd, driver, model, state, createdAt, updatedAt, lastActivityAt) {
145
+ return {
146
+ name,
147
+ backend: "claude-code-agent",
148
+ sessionId,
149
+ state,
150
+ cwd,
151
+ driver,
152
+ model,
153
+ createdAt,
154
+ updatedAt,
155
+ lastActivityAt,
156
+ };
157
+ }
158
+ }
159
+ function formatTaskAssignment(task) {
160
+ return [`Task: ${task.title}`, task.details, "Reply with progress and intended next step."].join("\n\n");
161
+ }
162
+ function classifyTaskReply(reply) {
163
+ const normalized = reply.trim().toLowerCase();
164
+ if (normalized.startsWith("done:") || normalized.startsWith("completed:") || normalized.includes("task complete")) {
165
+ return "done";
166
+ }
167
+ if (normalized.startsWith("blocked:") || normalized.includes("blocked")) {
168
+ return "blocked";
169
+ }
170
+ return "in_progress";
171
+ }
172
+ function mapState(state) {
173
+ switch (state) {
174
+ case "starting":
175
+ return "starting";
176
+ case "busy":
177
+ return "busy";
178
+ case "idle":
179
+ case "connected":
180
+ return "idle";
181
+ case "interrupted":
182
+ return "interrupted";
183
+ case "stopped":
184
+ return "stopped";
185
+ case "errored":
186
+ return "errored";
187
+ case "disconnected":
188
+ return "disconnected";
189
+ default:
190
+ return "errored";
191
+ }
192
+ }
193
+ export { classifyTaskReply, formatTaskAssignment, mapState };
194
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { ClaudeRuntimeIntercomBridge } from "@pi-claude-code-agent/intercom-bridge";
3
+ import { ClaudeCodeRuntime, resolveRuntimeDriverFromEnv } from "@pi-claude-code-agent/runtime";
4
+ import { ClaudeCodeTeamsBackend } from "./backend.js";
5
+ const runtime = new ClaudeCodeRuntime({ defaultDriver: resolveRuntimeDriverFromEnv() });
6
+ const bridge = new ClaudeRuntimeIntercomBridge({ runtime });
7
+ const backend = new ClaudeCodeTeamsBackend({ bridge });
8
+ const prompt = process.argv.slice(2).join(" ") || "You are persistent teammate. Reply briefly.";
9
+ const teammate = await backend.spawnTeammate({ name: "demo-teammate", prompt });
10
+ console.log("spawned", JSON.stringify(teammate, null, 2));
11
+ const task = await backend.assignTask({
12
+ assignee: "demo-teammate",
13
+ title: "Demo task",
14
+ details: "Reply with exactly: team-ok",
15
+ });
16
+ console.log("task", JSON.stringify(task, null, 2));
17
+ const message = await backend.sendMessage("demo-teammate", "What are you doing?");
18
+ console.log("message", JSON.stringify(message, null, 2));
19
+ const stopped = await backend.stopTeammate("demo-teammate");
20
+ console.log("stopped", JSON.stringify(stopped, null, 2));
21
+ //# 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,uCAAuC,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,aAAa,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAC;AACxF,MAAM,MAAM,GAAG,IAAI,2BAA2B,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5D,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACvD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,6CAA6C,CAAC;AAEhG,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC;AAChF,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE1D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;IACpC,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,6BAA6B;CACvC,CAAC,CAAC;AACH,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAEnD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;AAClF,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;AAC5D,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ClaudeCodeTeamsBackend } from "./backend.js";
2
+ export { defaultTeamsDir, writeTeammate, readTeammate, listTeammates, writeTask, readTask, listTasks } from "./persistence.js";
3
+ export { classifyTaskReply, formatTaskAssignment, mapState } from "./backend.js";
4
+ export type { SpawnTeammateInput, TeamMessageResult, TeamTask, TeamTaskState, TeamsBackendOptions, TeammateBackend, TeammateRecord, TeammateState, } from "./types.js";
@@ -0,0 +1,4 @@
1
+ export { ClaudeCodeTeamsBackend } from "./backend.js";
2
+ export { defaultTeamsDir, writeTeammate, readTeammate, listTeammates, writeTask, readTask, listTasks } from "./persistence.js";
3
+ export { classifyTaskReply, formatTaskAssignment, mapState } from "./backend.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/H,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TeamTask, TeammateRecord } from "./types.js";
2
+ export declare function defaultTeamsDir(): string;
3
+ export declare function writeTeammate(storageDir: string, teammate: TeammateRecord): Promise<void>;
4
+ export declare function readTeammate(storageDir: string, name: string): Promise<TeammateRecord | undefined>;
5
+ export declare function listTeammates(storageDir: string): Promise<TeammateRecord[]>;
6
+ export declare function writeTask(storageDir: string, task: TeamTask): Promise<void>;
7
+ export declare function readTask(storageDir: string, taskId: string): Promise<TeamTask | undefined>;
8
+ export declare function listTasks(storageDir: string): Promise<TeamTask[]>;
@@ -0,0 +1,66 @@
1
+ import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, join, resolve } from "node:path";
3
+ export function defaultTeamsDir() {
4
+ return resolve(process.cwd(), ".teams-backend");
5
+ }
6
+ export async function writeTeammate(storageDir, teammate) {
7
+ const file = join(storageDir, "teammates", `${teammate.name}.json`);
8
+ await mkdir(dirname(file), { recursive: true });
9
+ await writeFile(file, `${JSON.stringify(teammate, null, 2)}\n`, "utf8");
10
+ }
11
+ export async function readTeammate(storageDir, name) {
12
+ try {
13
+ return JSON.parse(await readFile(join(storageDir, "teammates", `${name}.json`), "utf8"));
14
+ }
15
+ catch (error) {
16
+ if (error.code === "ENOENT") {
17
+ return undefined;
18
+ }
19
+ throw error;
20
+ }
21
+ }
22
+ export async function listTeammates(storageDir) {
23
+ try {
24
+ const dir = join(storageDir, "teammates");
25
+ const files = await readdir(dir);
26
+ const items = await Promise.all(files.map((file) => readTeammate(storageDir, file.replace(/\.json$/, ""))));
27
+ return items.filter((value) => Boolean(value));
28
+ }
29
+ catch (error) {
30
+ if (error.code === "ENOENT") {
31
+ return [];
32
+ }
33
+ throw error;
34
+ }
35
+ }
36
+ export async function writeTask(storageDir, task) {
37
+ const file = join(storageDir, "tasks", `${task.taskId}.json`);
38
+ await mkdir(dirname(file), { recursive: true });
39
+ await writeFile(file, `${JSON.stringify(task, null, 2)}\n`, "utf8");
40
+ }
41
+ export async function readTask(storageDir, taskId) {
42
+ try {
43
+ return JSON.parse(await readFile(join(storageDir, "tasks", `${taskId}.json`), "utf8"));
44
+ }
45
+ catch (error) {
46
+ if (error.code === "ENOENT") {
47
+ return undefined;
48
+ }
49
+ throw error;
50
+ }
51
+ }
52
+ export async function listTasks(storageDir) {
53
+ try {
54
+ const dir = join(storageDir, "tasks");
55
+ const files = await readdir(dir);
56
+ const items = await Promise.all(files.map((file) => readTask(storageDir, file.replace(/\.json$/, ""))));
57
+ return items.filter((value) => Boolean(value));
58
+ }
59
+ catch (error) {
60
+ if (error.code === "ENOENT") {
61
+ return [];
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type TeammateBackend = "claude-code-agent";
2
+ export type TeamTaskState = "todo" | "assigned" | "in_progress" | "done" | "blocked" | "cancelled";
3
+ export type TeammateState = "starting" | "idle" | "busy" | "interrupted" | "stopped" | "errored" | "disconnected";
4
+ import type { RuntimeDriverName } from "@pi-claude-code-agent/runtime";
5
+ export interface SpawnTeammateInput {
6
+ name: string;
7
+ prompt: string;
8
+ driver?: RuntimeDriverName;
9
+ cwd?: string;
10
+ model?: string;
11
+ }
12
+ export interface TeamTask {
13
+ taskId: string;
14
+ title: string;
15
+ details: string;
16
+ assignee: string;
17
+ state: TeamTaskState;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ lastReply?: string;
21
+ }
22
+ export interface TeammateRecord {
23
+ name: string;
24
+ backend: TeammateBackend;
25
+ sessionId?: string;
26
+ state: TeammateState;
27
+ cwd: string;
28
+ driver?: RuntimeDriverName;
29
+ model?: string;
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ lastActivityAt: string;
33
+ }
34
+ export interface TeamMessageResult {
35
+ teammate: TeammateRecord;
36
+ reply: string;
37
+ }
38
+ export interface TeamsBackendOptions {
39
+ storageDir?: string;
40
+ bridge?: import("@pi-claude-code-agent/intercom-bridge").ClaudeRuntimeIntercomBridge;
41
+ }