@llblab/pi-actors 0.32.0 → 0.34.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 (162) hide show
  1. package/AGENTS.md +23 -11
  2. package/BACKLOG.md +2 -30
  3. package/CHANGELOG.md +30 -1
  4. package/dist/index.js +10 -10
  5. package/dist/lib/async-runs.d.ts +23 -75
  6. package/dist/lib/async-runs.js +49 -801
  7. package/dist/lib/command-templates.d.ts +3 -3
  8. package/dist/lib/command-templates.js +3 -3
  9. package/dist/lib/config.d.ts +2 -2
  10. package/dist/lib/config.js +5 -5
  11. package/dist/lib/{output.d.ts → execution-output.d.ts} +3 -3
  12. package/dist/lib/{output.js → execution-output.js} +3 -3
  13. package/dist/lib/execution.js +1 -1
  14. package/dist/lib/{actor-inspector-tui.d.ts → inspector.d.ts} +3 -2
  15. package/dist/lib/{actor-inspector-tui.js → inspector.js} +3 -2
  16. package/dist/lib/mailbox-loop.d.ts +3 -3
  17. package/dist/lib/mailbox-loop.js +3 -3
  18. package/dist/lib/{actor-messages.d.ts → messages.d.ts} +3 -3
  19. package/dist/lib/{actor-messages.js → messages.js} +3 -3
  20. package/dist/lib/paths.d.ts +1 -1
  21. package/dist/lib/paths.js +3 -3
  22. package/dist/lib/{actor-recipe-context.d.ts → recipes-context.d.ts} +3 -2
  23. package/dist/lib/{actor-recipe-context.js → recipes-context.js} +2 -1
  24. package/dist/lib/{recipe-discovery.d.ts → recipes-discovery.d.ts} +9 -9
  25. package/dist/lib/{recipe-discovery.js → recipes-discovery.js} +17 -17
  26. package/dist/lib/registry.d.ts +1 -1
  27. package/dist/lib/registry.js +22 -22
  28. package/dist/lib/{actor-rooms.d.ts → rooms.d.ts} +4 -4
  29. package/dist/lib/{actor-rooms.js → rooms.js} +3 -3
  30. package/dist/lib/runs-artifacts.d.ts +21 -0
  31. package/dist/lib/runs-artifacts.js +68 -0
  32. package/dist/lib/runs-control.d.ts +13 -0
  33. package/dist/lib/runs-control.js +59 -0
  34. package/dist/lib/runs-identity.d.ts +5 -0
  35. package/dist/lib/runs-identity.js +11 -0
  36. package/dist/lib/runs-index.d.ts +18 -0
  37. package/dist/lib/runs-index.js +119 -0
  38. package/dist/lib/runs-mailbox.d.ts +25 -0
  39. package/dist/lib/runs-mailbox.js +146 -0
  40. package/dist/lib/runs-messages.d.ts +15 -0
  41. package/dist/lib/runs-messages.js +179 -0
  42. package/dist/lib/runs-outbox.d.ts +41 -0
  43. package/dist/lib/runs-outbox.js +87 -0
  44. package/dist/lib/runs-process.d.ts +7 -0
  45. package/dist/lib/runs-process.js +36 -0
  46. package/dist/lib/runs-retention.d.ts +8 -0
  47. package/dist/lib/runs-retention.js +56 -0
  48. package/dist/lib/runs-start.d.ts +9 -0
  49. package/dist/lib/runs-start.js +67 -0
  50. package/dist/lib/runs-status.d.ts +8 -0
  51. package/dist/lib/runs-status.js +60 -0
  52. package/dist/lib/runtime.d.ts +2 -2
  53. package/dist/lib/runtime.js +5 -5
  54. package/dist/lib/schema.d.ts +9 -0
  55. package/dist/lib/schema.js +40 -0
  56. package/dist/lib/tools-access.d.ts +19 -0
  57. package/dist/lib/tools-access.js +44 -0
  58. package/dist/lib/tools-inspect.d.ts +11 -0
  59. package/dist/lib/tools-inspect.js +534 -0
  60. package/dist/lib/tools-local.d.ts +14 -0
  61. package/dist/lib/tools-local.js +156 -0
  62. package/dist/lib/tools-mailbox.d.ts +8 -0
  63. package/dist/lib/tools-mailbox.js +48 -0
  64. package/dist/lib/tools-message.d.ts +9 -0
  65. package/dist/lib/tools-message.js +346 -0
  66. package/dist/lib/tools-register.d.ts +18 -0
  67. package/dist/lib/tools-register.js +40 -0
  68. package/dist/lib/tools-response.d.ts +21 -0
  69. package/dist/lib/tools-response.js +219 -0
  70. package/dist/lib/tools-spawn.d.ts +12 -0
  71. package/dist/lib/tools-spawn.js +159 -0
  72. package/dist/lib/tools.d.ts +13 -39
  73. package/dist/lib/tools.js +11 -1497
  74. package/dist/recipes/utility-coordinator-lock-snapshot.json +1 -1
  75. package/dist/scripts/actor-worker.mjs +186 -7
  76. package/dist/scripts/async-runner.mjs +171 -8
  77. package/dist/scripts/build-dist.mjs +1 -1
  78. package/dist/scripts/conformance.mjs +34 -18
  79. package/dist/scripts/coordinator.mjs +733 -11
  80. package/dist/scripts/locker.mjs +345 -16
  81. package/dist/scripts/recipe-utils.mjs +478 -14
  82. package/dist/scripts/validate-recipe.mjs +110 -10
  83. package/dist/skills/actors/SKILL.md +2 -2
  84. package/dist/skills/swarm/SKILL.md +2 -2
  85. package/docs/recipe-library.md +1 -1
  86. package/docs/template-recipes.md +1 -1
  87. package/docs/tool-registry.md +3 -3
  88. package/index.ts +12 -19
  89. package/lib/async-runs.ts +124 -1016
  90. package/lib/command-templates.ts +3 -3
  91. package/lib/config.ts +7 -7
  92. package/lib/{output.ts → execution-output.ts} +3 -3
  93. package/lib/execution.ts +5 -1
  94. package/lib/{actor-inspector-tui.ts → inspector.ts} +4 -3
  95. package/lib/mailbox-loop.ts +3 -3
  96. package/lib/{actor-messages.ts → messages.ts} +3 -3
  97. package/lib/paths.ts +3 -3
  98. package/lib/{actor-recipe-context.ts → recipes-context.ts} +3 -2
  99. package/lib/{recipe-discovery.ts → recipes-discovery.ts} +30 -30
  100. package/lib/{recipe-usage.ts → recipes-usage.ts} +2 -2
  101. package/lib/registry.ts +37 -24
  102. package/lib/{actor-rooms.ts → rooms.ts} +4 -4
  103. package/lib/runs-artifacts.ts +96 -0
  104. package/lib/runs-control.ts +85 -0
  105. package/lib/runs-identity.ts +14 -0
  106. package/lib/runs-index.ts +156 -0
  107. package/lib/runs-mailbox.ts +208 -0
  108. package/lib/runs-messages.ts +252 -0
  109. package/lib/runs-outbox.ts +144 -0
  110. package/lib/runs-process.ts +51 -0
  111. package/lib/runs-retention.ts +77 -0
  112. package/lib/runs-start.ts +98 -0
  113. package/lib/runs-status.ts +78 -0
  114. package/lib/runtime.ts +6 -6
  115. package/lib/schema.ts +55 -0
  116. package/lib/tools-access.ts +68 -0
  117. package/lib/tools-inspect.ts +735 -0
  118. package/lib/tools-local.ts +234 -0
  119. package/lib/tools-mailbox.ts +56 -0
  120. package/lib/tools-message.ts +483 -0
  121. package/lib/tools-register.ts +64 -0
  122. package/lib/tools-response.ts +267 -0
  123. package/lib/tools-spawn.ts +240 -0
  124. package/lib/tools.ts +26 -2051
  125. package/package.json +1 -1
  126. package/recipes/utility-coordinator-lock-snapshot.json +1 -1
  127. package/scripts/actor-worker.mjs +186 -7
  128. package/scripts/async-runner.mjs +171 -8
  129. package/scripts/build-dist.mjs +1 -1
  130. package/scripts/conformance.mjs +34 -18
  131. package/scripts/coordinator.mjs +733 -11
  132. package/scripts/locker.mjs +345 -16
  133. package/scripts/recipe-utils.mjs +478 -14
  134. package/scripts/validate-recipe.mjs +110 -10
  135. package/skills/actors/SKILL.md +2 -2
  136. package/skills/swarm/SKILL.md +2 -2
  137. package/dist/lib/actor-worker.d.ts +0 -16
  138. package/dist/lib/actor-worker.js +0 -134
  139. package/dist/lib/async-runner.d.ts +0 -5
  140. package/dist/lib/async-runner.js +0 -134
  141. package/dist/lib/conformance.d.ts +0 -12
  142. package/dist/lib/conformance.js +0 -28
  143. package/dist/lib/coordinator.d.ts +0 -5
  144. package/dist/lib/coordinator.js +0 -660
  145. package/dist/lib/locker.d.ts +0 -5
  146. package/dist/lib/locker.js +0 -310
  147. package/dist/lib/recipe-utils.d.ts +0 -5
  148. package/dist/lib/recipe-utils.js +0 -385
  149. package/dist/lib/validate-recipe.d.ts +0 -6
  150. package/dist/lib/validate-recipe.js +0 -104
  151. package/lib/actor-worker.ts +0 -174
  152. package/lib/async-runner.ts +0 -173
  153. package/lib/conformance.ts +0 -46
  154. package/lib/coordinator.ts +0 -742
  155. package/lib/locker.ts +0 -340
  156. package/lib/recipe-utils.ts +0 -486
  157. package/lib/validate-recipe.ts +0 -110
  158. /package/dist/lib/{recipe-references.d.ts → recipes-references.d.ts} +0 -0
  159. /package/dist/lib/{recipe-references.js → recipes-references.js} +0 -0
  160. /package/dist/lib/{recipe-usage.d.ts → recipes-usage.d.ts} +0 -0
  161. /package/dist/lib/{recipe-usage.js → recipes-usage.js} +0 -0
  162. /package/lib/{recipe-references.ts → recipes-references.ts} +0 -0
@@ -1,173 +0,0 @@
1
- /**
2
- * Detached async-runner entrypoint logic.
3
- * Zones: async run process, command-template execution telemetry
4
- */
5
-
6
- import { appendFileSync, readFileSync } from "node:fs";
7
- import { join } from "node:path";
8
-
9
- import { appendRecipeContextToPiArgs } from "./actor-recipe-context.ts";
10
- import { execCommandTemplate } from "./command-templates.ts";
11
- import { executeRegisteredTool, type ToolExecOptions } from "./execution.ts";
12
- import { writeJsonAtomic } from "./file-state.ts";
13
-
14
- function quoteCommandDetailPart(value: string): string {
15
- if (value === "") return "''";
16
- if (/^[A-Za-z0-9_/:=.,@%+\-]+$/.test(value)) return value;
17
- return `'${String(value).replaceAll("'", "'\\''")}'`;
18
- }
19
-
20
- function formatCommandDetail(command: string, args: string[]): string {
21
- return [command, ...args].map(quoteCommandDetailPart).join(" ");
22
- }
23
-
24
- function summarizeCommandDetail(commandDetail: string): string {
25
- return commandDetail.length > 160
26
- ? `${commandDetail.slice(0, 157)}...`
27
- : commandDetail;
28
- }
29
-
30
- export async function runAsyncRunner(stateDir = process.argv[2]): Promise<void> {
31
- if (!stateDir) throw new Error("missing state dir");
32
-
33
- const runPath = join(stateDir, "run.json");
34
- const progressPath = join(stateDir, "progress.json");
35
- const resultPath = join(stateDir, "result.json");
36
- const eventsPath = join(stateDir, "events.jsonl");
37
- const outboxPath = join(stateDir, "outbox.jsonl");
38
- const stdoutPath = join(stateDir, "stdout.log");
39
- const stderrPath = join(stateDir, "stderr.log");
40
- const meta = JSON.parse(readFileSync(runPath, "utf8"));
41
-
42
- function event(name: string, data: Record<string, unknown> = {}): void {
43
- appendFileSync(
44
- eventsPath,
45
- `${JSON.stringify({ event: name, ts: new Date().toISOString(), ...data })}\n`,
46
- );
47
- }
48
-
49
- function outbox(
50
- name: string,
51
- summary: string,
52
- data: Record<string, unknown> = {},
53
- delivery = "log",
54
- level = "info",
55
- ): void {
56
- appendFileSync(
57
- outboxPath,
58
- `${JSON.stringify({ body: data, data, delivery, event: name, from: `run:${meta.run}`, level, summary, to: "coordinator", ts: new Date().toISOString(), type: name })}\n`,
59
- );
60
- }
61
-
62
- function progress(phase: string, extra: Record<string, unknown> = {}): void {
63
- writeJsonAtomic(progressPath, {
64
- phase,
65
- updatedAt: new Date().toISOString(),
66
- ...extra,
67
- });
68
- }
69
-
70
- let activeSubagents = 0;
71
- let completedSubagents = 0;
72
- const subagentFailures: Record<string, unknown>[] = [];
73
-
74
- function getCommandDoneDelivery(result: { code: number }): string {
75
- return result.code !== 0 || activeSubagents > 0 ? "followup" : "log";
76
- }
77
-
78
- function progressRunning(): void {
79
- progress("running", {
80
- activeSubagents,
81
- completed: completedSubagents,
82
- failures: subagentFailures,
83
- });
84
- }
85
-
86
- async function observedExec(command: string, args: string[], options?: ToolExecOptions) {
87
- const commandDetail = formatCommandDetail(command, args);
88
- const execArgs = appendRecipeContextToPiArgs(
89
- command,
90
- args,
91
- meta.recipe_context_records,
92
- options?.actorRecipeContext,
93
- );
94
- activeSubagents += 1;
95
- event("command.start", { activeSubagents, command: commandDetail });
96
- progressRunning();
97
- const result = await execCommandTemplate(command, execArgs, options);
98
- activeSubagents = Math.max(0, activeSubagents - 1);
99
- completedSubagents += 1;
100
- if (result.code !== 0) {
101
- subagentFailures.push({
102
- code: result.code,
103
- command: commandDetail,
104
- killed: result.killed,
105
- });
106
- }
107
- event("command.done", {
108
- activeSubagents,
109
- code: result.code,
110
- command: commandDetail,
111
- killed: result.killed,
112
- });
113
- outbox(
114
- "command.done",
115
- `Command ${summarizeCommandDetail(commandDetail)} completed with code ${result.code}`,
116
- {
117
- activeSubagents,
118
- ...(meta.artifacts ? { artifacts: meta.artifacts } : {}),
119
- run_files: [stdoutPath, stderrPath, resultPath, eventsPath, outboxPath],
120
- code: result.code,
121
- command: commandDetail,
122
- killed: result.killed,
123
- },
124
- getCommandDoneDelivery(result),
125
- result.code === 0 ? "info" : "error",
126
- );
127
- progressRunning();
128
- return result;
129
- }
130
-
131
- try {
132
- event("run.runner.start", { pid: process.pid });
133
- progressRunning();
134
- const result = await executeRegisteredTool(
135
- {
136
- name: "run_actor",
137
- description: "Detached command-template run actor",
138
- template: meta.template,
139
- args: [],
140
- defaults: {},
141
- },
142
- meta.values || {},
143
- observedExec,
144
- meta.cwd,
145
- );
146
- const text = result.content?.[0]?.text || "";
147
- appendFileSync(stdoutPath, text);
148
- writeJsonAtomic(resultPath, {
149
- code: result.details.code,
150
- command: result.details.command,
151
- killed: result.details.killed,
152
- truncated: result.details.truncated,
153
- completedAt: new Date().toISOString(),
154
- });
155
- progress("done", {
156
- completed: 1,
157
- failures: result.details.nonCriticalFailures || [],
158
- });
159
- event("run.done", { code: result.details.code });
160
- } catch (error) {
161
- const message = error instanceof Error ? error.message : String(error);
162
- appendFileSync(stderrPath, `${message}\n`);
163
- writeJsonAtomic(resultPath, {
164
- code: 1,
165
- error: message,
166
- killed: false,
167
- completedAt: new Date().toISOString(),
168
- });
169
- progress("failed", { completed: 0, failures: [{ message }] });
170
- event("run.failed", { error: message });
171
- throw error;
172
- }
173
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * Internal conformance runner logic.
3
- * Zones: CI/release validation, protocol regression suite selection
4
- */
5
-
6
- import { spawnSync } from "node:child_process";
7
-
8
- export const conformanceSuites = [
9
- "tests/protocol-examples.test.ts",
10
- "tests/recipe-discovery.test.ts",
11
- "tests/registry.test.ts",
12
- "tests/runtime-registry.test.ts",
13
- "tests/async-runs.test.ts",
14
- "tests/actor-rooms.test.ts",
15
- "tests/tools.test.ts",
16
- ];
17
-
18
- export interface ConformanceReport {
19
- code: number;
20
- output: string;
21
- summary: string;
22
- suites: number;
23
- }
24
-
25
- export function runConformance(cwd = new URL("..", import.meta.url)): ConformanceReport {
26
- const result = spawnSync(
27
- process.execPath,
28
- ["--experimental-strip-types", "--test", ...conformanceSuites],
29
- { cwd, encoding: "utf8", stdio: "pipe" },
30
- );
31
-
32
- const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
33
- const summary = output
34
- .split("\n")
35
- .filter((line) =>
36
- /^ℹ (tests|pass|fail|cancelled|skipped|todo|duration_ms) /.test(line),
37
- )
38
- .join("\n");
39
-
40
- return {
41
- code: result.status ?? 1,
42
- output,
43
- summary,
44
- suites: conformanceSuites.length,
45
- };
46
- }