@llblab/pi-actors 0.42.2 → 0.43.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 (254) hide show
  1. package/AGENTS.md +121 -175
  2. package/CHANGELOG.md +16 -0
  3. package/README.md +113 -276
  4. package/dist/fixtures/protocol/control-endpoint.json +6 -0
  5. package/dist/fixtures/protocol/control-record.json +9 -0
  6. package/dist/fixtures/protocol/recipe-summary.json +4 -12
  7. package/dist/fixtures/protocol/trace-event.json +9 -0
  8. package/dist/lib/async-runs.d.ts +14 -38
  9. package/dist/lib/async-runs.js +158 -108
  10. package/dist/lib/control.d.ts +12 -0
  11. package/dist/lib/control.js +84 -0
  12. package/dist/lib/execution-sessions.d.ts +17 -0
  13. package/dist/lib/execution-sessions.js +85 -0
  14. package/dist/lib/file-state.d.ts +1 -0
  15. package/dist/lib/file-state.js +17 -5
  16. package/dist/lib/inspector-actions.d.ts +2 -2
  17. package/dist/lib/inspector-actions.js +2 -2
  18. package/dist/lib/inspector-command.js +3 -3
  19. package/dist/lib/inspector-overlay.d.ts +52 -70
  20. package/dist/lib/inspector-overlay.js +532 -905
  21. package/dist/lib/inspector.d.ts +3 -71
  22. package/dist/lib/inspector.js +19 -665
  23. package/dist/lib/limits.d.ts +4 -2
  24. package/dist/lib/limits.js +4 -2
  25. package/dist/lib/observability.d.ts +17 -17
  26. package/dist/lib/observability.js +45 -84
  27. package/dist/lib/pi.d.ts +1 -1
  28. package/dist/lib/prompts.d.ts +1 -1
  29. package/dist/lib/prompts.js +2 -2
  30. package/dist/lib/recipe-control.d.ts +7 -0
  31. package/dist/lib/recipe-control.js +39 -0
  32. package/dist/lib/recipes-discovery.js +2 -0
  33. package/dist/lib/recipes-references.d.ts +1 -14
  34. package/dist/lib/recipes-references.js +6 -21
  35. package/dist/lib/review-projection.js +1 -5
  36. package/dist/lib/run-ui-runtime.js +2 -2
  37. package/dist/lib/runs-control-delivery.d.ts +21 -0
  38. package/dist/lib/runs-control-delivery.js +127 -0
  39. package/dist/lib/runs-controls.d.ts +35 -0
  40. package/dist/lib/runs-controls.js +144 -0
  41. package/dist/lib/runs-retention.d.ts +7 -0
  42. package/dist/lib/runs-retention.js +27 -3
  43. package/dist/lib/runs-start.js +4 -2
  44. package/dist/lib/runs-status.js +11 -6
  45. package/dist/lib/runs-trace.d.ts +24 -0
  46. package/dist/lib/runs-trace.js +98 -0
  47. package/dist/lib/runtime-notifier.d.ts +1 -1
  48. package/dist/lib/runtime-notifier.js +1 -1
  49. package/dist/lib/tools-inspect.d.ts +3 -3
  50. package/dist/lib/tools-inspect.js +203 -708
  51. package/dist/lib/tools-local.js +2 -10
  52. package/dist/lib/tools-message.d.ts +7 -7
  53. package/dist/lib/tools-message.js +95 -396
  54. package/dist/lib/tools-response.d.ts +1 -4
  55. package/dist/lib/tools-response.js +5 -39
  56. package/dist/lib/tools-spawn.js +16 -28
  57. package/dist/lib/tools.js +1 -2
  58. package/dist/lib/trace-projection.d.ts +22 -0
  59. package/dist/lib/trace-projection.js +165 -0
  60. package/dist/recipes/draft-review.json +0 -10
  61. package/dist/recipes/lens-swarm.json +0 -14
  62. package/dist/recipes/music-player.json +10 -19
  63. package/dist/recipes/pipeline-architect-coordinator.json +0 -11
  64. package/dist/recipes/pipeline-artifact-bundle.json +1 -22
  65. package/dist/recipes/pipeline-artifact-report.json +1 -18
  66. package/dist/recipes/pipeline-artifact-write.json +1 -18
  67. package/dist/recipes/pipeline-async-run-ops.json +0 -12
  68. package/dist/recipes/pipeline-checkpoint-continuation.json +0 -14
  69. package/dist/recipes/pipeline-development-tasking.json +0 -12
  70. package/dist/recipes/pipeline-docs-maintenance.json +0 -12
  71. package/dist/recipes/pipeline-media-library.json +0 -12
  72. package/dist/recipes/pipeline-quorum-review.json +0 -12
  73. package/dist/recipes/pipeline-release-readiness.json +0 -12
  74. package/dist/recipes/pipeline-release-summary.json +0 -12
  75. package/dist/recipes/pipeline-repo-health.json +0 -12
  76. package/dist/recipes/pipeline-research-synthesis.json +0 -11
  77. package/dist/recipes/pipeline-review-readiness.json +0 -12
  78. package/dist/recipes/resource-locker.json +27 -0
  79. package/dist/recipes/subagent-artifact.json +0 -9
  80. package/dist/recipes/subagent-checkpoint.json +0 -10
  81. package/dist/recipes/subagent-conflict-report.json +0 -11
  82. package/dist/recipes/subagent-contradiction-map.json +0 -11
  83. package/dist/recipes/subagent-critic.json +0 -11
  84. package/dist/recipes/subagent-evidence-map.json +0 -11
  85. package/dist/recipes/subagent-followup.json +0 -10
  86. package/dist/recipes/subagent-judge.json +0 -11
  87. package/dist/recipes/subagent-merge.json +0 -11
  88. package/dist/recipes/subagent-normalize.json +0 -11
  89. package/dist/recipes/subagent-plan.json +0 -11
  90. package/dist/recipes/subagent-preflight.json +0 -11
  91. package/dist/recipes/subagent-prompt.json +0 -10
  92. package/dist/recipes/subagent-quorum.json +0 -10
  93. package/dist/recipes/subagent-review-coordinator.json +0 -14
  94. package/dist/recipes/subagent-review.json +0 -11
  95. package/dist/recipes/subagent-task-card.json +0 -11
  96. package/dist/recipes/subagent-tools.json +0 -10
  97. package/dist/recipes/subagent-verify.json +0 -11
  98. package/dist/recipes/subagents-prompts.json +0 -10
  99. package/dist/recipes/tool-review.json +0 -10
  100. package/dist/scripts/async-runner.mjs +25 -25
  101. package/dist/scripts/conformance.mjs +4 -2
  102. package/dist/scripts/locker.mjs +200 -66
  103. package/dist/scripts/music-player.mjs +159 -150
  104. package/dist/scripts/recipe-utils.mjs +6 -96
  105. package/dist/scripts/release-gates.mjs +60 -0
  106. package/dist/scripts/validate-recipe.mjs +3 -53
  107. package/dist/skills/actors/SKILL.md +53 -266
  108. package/dist/skills/swarm/SKILL.md +11 -33
  109. package/docs/0.43-baseline.md +44 -0
  110. package/docs/README.md +3 -3
  111. package/docs/actor-inspector.md +26 -64
  112. package/docs/actors-deep-reference.md +92 -50
  113. package/docs/async-runs.md +81 -328
  114. package/docs/command-templates.md +2 -2
  115. package/docs/component-recipes.md +30 -133
  116. package/docs/recipe-library.md +57 -182
  117. package/docs/task-first-recipes.md +10 -12
  118. package/docs/template-recipes.md +76 -289
  119. package/docs/tool-registry.md +41 -161
  120. package/fixtures/protocol/control-endpoint.json +6 -0
  121. package/fixtures/protocol/control-record.json +9 -0
  122. package/fixtures/protocol/recipe-summary.json +4 -12
  123. package/fixtures/protocol/trace-event.json +9 -0
  124. package/lib/async-runs.ts +202 -201
  125. package/lib/control.ts +102 -0
  126. package/lib/execution-sessions.ts +111 -0
  127. package/lib/file-state.ts +17 -4
  128. package/lib/inspector-actions.ts +2 -2
  129. package/lib/inspector-command.ts +3 -3
  130. package/lib/inspector-overlay.ts +577 -1121
  131. package/lib/inspector.ts +46 -979
  132. package/lib/limits.ts +4 -2
  133. package/lib/observability.ts +63 -104
  134. package/lib/pi.ts +1 -1
  135. package/lib/prompts.ts +2 -2
  136. package/lib/recipe-control.ts +45 -0
  137. package/lib/recipes-discovery.ts +2 -0
  138. package/lib/recipes-references.ts +9 -45
  139. package/lib/review-projection.ts +1 -5
  140. package/lib/run-ui-runtime.ts +2 -2
  141. package/lib/runs-control-delivery.ts +181 -0
  142. package/lib/runs-controls.ts +204 -0
  143. package/lib/runs-retention.ts +38 -3
  144. package/lib/runs-start.ts +4 -2
  145. package/lib/runs-status.ts +11 -6
  146. package/lib/runs-trace.ts +132 -0
  147. package/lib/runtime-notifier.ts +1 -1
  148. package/lib/tools-inspect.ts +240 -901
  149. package/lib/tools-local.ts +2 -12
  150. package/lib/tools-message.ts +112 -519
  151. package/lib/tools-response.ts +5 -52
  152. package/lib/tools-spawn.ts +16 -32
  153. package/lib/tools.ts +1 -2
  154. package/lib/trace-projection.ts +221 -0
  155. package/package.json +2 -1
  156. package/recipes/draft-review.json +0 -10
  157. package/recipes/lens-swarm.json +0 -14
  158. package/recipes/music-player.json +10 -19
  159. package/recipes/pipeline-architect-coordinator.json +0 -11
  160. package/recipes/pipeline-artifact-bundle.json +1 -22
  161. package/recipes/pipeline-artifact-report.json +1 -18
  162. package/recipes/pipeline-artifact-write.json +1 -18
  163. package/recipes/pipeline-async-run-ops.json +0 -12
  164. package/recipes/pipeline-checkpoint-continuation.json +0 -14
  165. package/recipes/pipeline-development-tasking.json +0 -12
  166. package/recipes/pipeline-docs-maintenance.json +0 -12
  167. package/recipes/pipeline-media-library.json +0 -12
  168. package/recipes/pipeline-quorum-review.json +0 -12
  169. package/recipes/pipeline-release-readiness.json +0 -12
  170. package/recipes/pipeline-release-summary.json +0 -12
  171. package/recipes/pipeline-repo-health.json +0 -12
  172. package/recipes/pipeline-research-synthesis.json +0 -11
  173. package/recipes/pipeline-review-readiness.json +0 -12
  174. package/recipes/resource-locker.json +27 -0
  175. package/recipes/subagent-artifact.json +0 -9
  176. package/recipes/subagent-checkpoint.json +0 -10
  177. package/recipes/subagent-conflict-report.json +0 -11
  178. package/recipes/subagent-contradiction-map.json +0 -11
  179. package/recipes/subagent-critic.json +0 -11
  180. package/recipes/subagent-evidence-map.json +0 -11
  181. package/recipes/subagent-followup.json +0 -10
  182. package/recipes/subagent-judge.json +0 -11
  183. package/recipes/subagent-merge.json +0 -11
  184. package/recipes/subagent-normalize.json +0 -11
  185. package/recipes/subagent-plan.json +0 -11
  186. package/recipes/subagent-preflight.json +0 -11
  187. package/recipes/subagent-prompt.json +0 -10
  188. package/recipes/subagent-quorum.json +0 -10
  189. package/recipes/subagent-review-coordinator.json +0 -14
  190. package/recipes/subagent-review.json +0 -11
  191. package/recipes/subagent-task-card.json +0 -11
  192. package/recipes/subagent-tools.json +0 -10
  193. package/recipes/subagent-verify.json +0 -11
  194. package/recipes/subagents-prompts.json +0 -10
  195. package/recipes/tool-review.json +0 -10
  196. package/scripts/async-runner.mjs +25 -25
  197. package/scripts/conformance.mjs +4 -2
  198. package/scripts/locker.mjs +200 -66
  199. package/scripts/music-player.mjs +159 -150
  200. package/scripts/recipe-utils.mjs +6 -96
  201. package/scripts/release-gates.mjs +60 -0
  202. package/scripts/validate-recipe.mjs +3 -53
  203. package/skills/actors/SKILL.md +53 -266
  204. package/skills/swarm/SKILL.md +11 -33
  205. package/dist/fixtures/protocol/actor-message-branch.json +0 -13
  206. package/dist/fixtures/protocol/mailbox-contract.json +0 -15
  207. package/dist/fixtures/protocol/room-message.json +0 -11
  208. package/dist/fixtures/protocol/room-roster.json +0 -11
  209. package/dist/fixtures/protocol/run-inbox-message.json +0 -9
  210. package/dist/fixtures/protocol/run-outbox-event.json +0 -9
  211. package/dist/lib/mailbox-loop.d.ts +0 -41
  212. package/dist/lib/mailbox-loop.js +0 -60
  213. package/dist/lib/messages.d.ts +0 -25
  214. package/dist/lib/messages.js +0 -122
  215. package/dist/lib/rooms.d.ts +0 -104
  216. package/dist/lib/rooms.js +0 -647
  217. package/dist/lib/runs-mailbox.d.ts +0 -25
  218. package/dist/lib/runs-mailbox.js +0 -146
  219. package/dist/lib/runs-messages.d.ts +0 -15
  220. package/dist/lib/runs-messages.js +0 -179
  221. package/dist/lib/runs-outbox.d.ts +0 -41
  222. package/dist/lib/runs-outbox.js +0 -87
  223. package/dist/lib/tools-mailbox.d.ts +0 -8
  224. package/dist/lib/tools-mailbox.js +0 -48
  225. package/dist/recipes/actor-worker.json +0 -39
  226. package/dist/recipes/coordinator-locker.json +0 -45
  227. package/dist/recipes/locker.json +0 -45
  228. package/dist/recipes/pipeline-room-swarm.json +0 -50
  229. package/dist/recipes/subagent-message.json +0 -32
  230. package/dist/recipes/utility-actor-message.json +0 -23
  231. package/dist/scripts/actor-worker.mjs +0 -214
  232. package/dist/scripts/coordinator.mjs +0 -799
  233. package/docs/actor-messages.md +0 -225
  234. package/fixtures/protocol/actor-message-branch.json +0 -13
  235. package/fixtures/protocol/mailbox-contract.json +0 -15
  236. package/fixtures/protocol/room-message.json +0 -11
  237. package/fixtures/protocol/room-roster.json +0 -11
  238. package/fixtures/protocol/run-inbox-message.json +0 -9
  239. package/fixtures/protocol/run-outbox-event.json +0 -9
  240. package/lib/mailbox-loop.ts +0 -144
  241. package/lib/messages.ts +0 -151
  242. package/lib/rooms.ts +0 -939
  243. package/lib/runs-mailbox.ts +0 -208
  244. package/lib/runs-messages.ts +0 -252
  245. package/lib/runs-outbox.ts +0 -144
  246. package/lib/tools-mailbox.ts +0 -56
  247. package/recipes/actor-worker.json +0 -39
  248. package/recipes/coordinator-locker.json +0 -45
  249. package/recipes/locker.json +0 -45
  250. package/recipes/pipeline-room-swarm.json +0 -50
  251. package/recipes/subagent-message.json +0 -32
  252. package/recipes/utility-actor-message.json +0 -23
  253. package/scripts/actor-worker.mjs +0 -214
  254. package/scripts/coordinator.mjs +0 -799
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Run-owned execution session evidence.
3
+ * Zones: execution manifest session discovery, canonical containment, rich turn correlation
4
+ * Owns reusable agent-turn loading; Trace and TUI projection stay in their adapters.
5
+ */
6
+
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+
10
+ import * as SessionEvidence from "./session-evidence.ts";
11
+ import { readJsonFileResilient } from "./state-readers.ts";
12
+
13
+ export interface ExecutionTurnItem extends SessionEvidence.SessionEvidenceTurn {
14
+ commandId: string;
15
+ diagnostics: string[];
16
+ promptBytes?: number;
17
+ promptFile?: string;
18
+ recipeContext?: unknown;
19
+ sessionFile: string;
20
+ sessionTruncated: boolean;
21
+ stage?: string;
22
+ }
23
+
24
+ function ownedSessionPath(
25
+ stateDir: string,
26
+ sessionFile: string,
27
+ ): string | undefined {
28
+ if (path.isAbsolute(sessionFile)) return undefined;
29
+ const sessionsRoot = path.resolve(stateDir, "sessions");
30
+ const resolved = path.resolve(stateDir, sessionFile);
31
+ if (!resolved.startsWith(`${sessionsRoot}${path.sep}`)) return undefined;
32
+ try {
33
+ const canonicalRoot = fs.realpathSync(sessionsRoot);
34
+ const canonicalFile = fs.realpathSync(resolved);
35
+ return canonicalFile.startsWith(`${canonicalRoot}${path.sep}`)
36
+ ? canonicalFile
37
+ : undefined;
38
+ } catch {
39
+ return undefined;
40
+ }
41
+ }
42
+
43
+ export function readExecutionTurns(stateDir: string): ExecutionTurnItem[] {
44
+ const execution = readJsonFileResilient<Record<string, unknown>>(
45
+ path.join(stateDir, "execution.json"),
46
+ {},
47
+ ).value;
48
+ const commands = Array.isArray(execution.commands)
49
+ ? (execution.commands as Array<Record<string, unknown>>)
50
+ : [];
51
+ const recordedFiles = new Set(
52
+ commands.flatMap((command) =>
53
+ (Array.isArray(command.session_files) ? command.session_files : []).filter(
54
+ (file): file is string => typeof file === "string",
55
+ ),
56
+ ),
57
+ );
58
+ let discoveredCommands: Array<Record<string, unknown>> = [];
59
+ try {
60
+ const sessionsDir = path.join(stateDir, "sessions");
61
+ discoveredCommands = fs
62
+ .readdirSync(sessionsDir, { withFileTypes: true })
63
+ .filter((entry) => entry.isDirectory())
64
+ .flatMap((entry) => {
65
+ const files = fs
66
+ .readdirSync(path.join(sessionsDir, entry.name), {
67
+ withFileTypes: true,
68
+ })
69
+ .filter((file) => file.isFile() && file.name.endsWith(".jsonl"))
70
+ .map((file) => path.posix.join("sessions", entry.name, file.name))
71
+ .filter((file) => !recordedFiles.has(file));
72
+ return files.length > 0
73
+ ? [{ id: entry.name, session_files: files, stage: "subagent" }]
74
+ : [];
75
+ });
76
+ } catch {
77
+ discoveredCommands = [];
78
+ }
79
+ return [...commands, ...discoveredCommands]
80
+ .flatMap((command) =>
81
+ (Array.isArray(command.session_files) ? command.session_files : [])
82
+ .filter((file): file is string => typeof file === "string")
83
+ .flatMap((file) => {
84
+ const sessionPath = ownedSessionPath(stateDir, file);
85
+ if (!sessionPath) return [];
86
+ const session = SessionEvidence.readSessionEvidence(sessionPath);
87
+ return session.turns.map((turn) => ({
88
+ ...turn,
89
+ commandId: String(command.id ?? "unknown"),
90
+ diagnostics: session.diagnostics.map((item) =>
91
+ `${item.line === undefined ? "" : `line ${item.line}: `}${item.message}`,
92
+ ),
93
+ ...(typeof command.prompt_bytes === "number"
94
+ ? { promptBytes: command.prompt_bytes }
95
+ : {}),
96
+ ...(typeof command.prompt_file === "string"
97
+ ? { promptFile: command.prompt_file }
98
+ : {}),
99
+ ...(command.recipe_context !== undefined
100
+ ? { recipeContext: command.recipe_context }
101
+ : {}),
102
+ sessionFile: file,
103
+ sessionTruncated: session.truncated,
104
+ ...(typeof command.stage === "string"
105
+ ? { stage: command.stage }
106
+ : {}),
107
+ }));
108
+ }),
109
+ )
110
+ .map((turn, index) => ({ ...turn, index: index + 1 }));
111
+ }
package/lib/file-state.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  import { createHash, randomUUID } from "node:crypto";
8
8
  import {
9
9
  existsSync,
10
+ lstatSync,
10
11
  mkdirSync,
11
12
  readFileSync,
12
13
  realpathSync,
@@ -25,8 +26,16 @@ const FILE_MUTATION_LOCK_ROOT = join(tmpdir(), "pi-actors-file-locks");
25
26
 
26
27
  function canonicalMutationPath(path: string): string {
27
28
  const absolute = resolve(path);
28
- const suffix: string[] = [];
29
- let existing = absolute;
29
+ try {
30
+ if (lstatSync(absolute).isSymbolicLink()) {
31
+ const target = realpathSync.native(absolute);
32
+ return process.platform === "win32" ? target.toLowerCase() : target;
33
+ }
34
+ } catch {
35
+ /* Materialization may race lock-key derivation; canonicalize through the parent. */
36
+ }
37
+ const suffix: string[] = [basename(absolute)];
38
+ let existing = dirname(absolute);
30
39
  while (!existsSync(existing)) {
31
40
  const parent = dirname(existing);
32
41
  if (parent === existing || existing === parse(existing).root) break;
@@ -235,11 +244,11 @@ export function withFileMutationLock<T>(
235
244
  }
236
245
  }
237
246
 
238
- export function writeJsonAtomic(path: string, value: unknown): void {
247
+ export function writeTextAtomic(path: string, content: string): void {
239
248
  mkdirSync(dirname(path), { recursive: true });
240
249
  const tempPath = `${path}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;
241
250
  try {
242
- writeFileSync(tempPath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
251
+ writeFileSync(tempPath, content, "utf8");
243
252
  renameSync(tempPath, path);
244
253
  } catch (error) {
245
254
  try {
@@ -250,3 +259,7 @@ export function writeJsonAtomic(path: string, value: unknown): void {
250
259
  throw error;
251
260
  }
252
261
  }
262
+
263
+ export function writeJsonAtomic(path: string, value: unknown): void {
264
+ writeTextAtomic(path, `${JSON.stringify(value, null, 2)}\n`);
265
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Actor Inspector run actions.
2
+ * Actor Inspector actions for concrete Run instances.
3
3
  * Owns: exact-session run-action authorization, canonical kill routing, and bounded operator feedback.
4
4
  */
5
5
 
@@ -29,7 +29,7 @@ function bounded(value: unknown): string {
29
29
  : `${text.slice(0, FEEDBACK_LIMIT - 1)}…`;
30
30
  }
31
31
 
32
- export function killOwnedInspectorRun(
32
+ export function killOwnedRunFromInspector(
33
33
  ownerId: string,
34
34
  run: string,
35
35
  stateRoot: string,
@@ -14,8 +14,8 @@ export function registerActorInspectorCommand(
14
14
  pi: Pi.ExtensionAPI,
15
15
  getRunOwnerId: (ctx: Pi.ExtensionContext) => string,
16
16
  ): void {
17
- pi.registerCommand("actors-inspector", {
18
- description: "Open the keyboard-driven actor inspector overlay",
17
+ pi.registerCommand("actor-inspector", {
18
+ description: "Open the keyboard-driven Actor Inspector",
19
19
  handler: async (_args, ctx) => {
20
20
  ctx.ui.setWidget("zz-pi-actors-comms", undefined);
21
21
  await ctx.ui.custom<void>(
@@ -23,7 +23,7 @@ export function registerActorInspectorCommand(
23
23
  new InspectorOverlay.ActorInspectorOverlay({
24
24
  done,
25
25
  killRun: (run, runInstanceId) =>
26
- InspectorActions.killOwnedInspectorRun(
26
+ InspectorActions.killOwnedRunFromInspector(
27
27
  getRunOwnerId(ctx),
28
28
  run,
29
29
  Paths.EXTENSION_RUNTIME_PATHS.runStateRoot,