@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
package/lib/runtime.ts CHANGED
@@ -9,8 +9,8 @@ import { existsSync, watch, type FSWatcher } from "node:fs";
9
9
  import * as Config from "./config.ts";
10
10
  import type { RegisteredToolExec } from "./execution.ts";
11
11
  import * as Paths from "./paths.ts";
12
- import * as RecipeDiscovery from "./recipe-discovery.ts";
13
- import * as Tools from "./tools.ts";
12
+ import * as RecipesDiscovery from "./recipes-discovery.ts";
13
+ import * as ToolsLocal from "./tools-local.ts";
14
14
 
15
15
  export interface RuntimeContext {
16
16
  hasUI: boolean;
@@ -31,7 +31,7 @@ export interface ToolRegistryRuntimeDeps {
31
31
  getActiveTools?: () => string[];
32
32
  getAllTools: () => ToolInfoLike[];
33
33
  registerTool: (
34
- definition: ReturnType<typeof Tools.createRuntimeToolDefinition>,
34
+ definition: ReturnType<typeof ToolsLocal.createRuntimeToolDefinition>,
35
35
  ) => void;
36
36
  reservedToolNames: Set<string>;
37
37
  setActiveTools?: (toolNames: string[]) => void;
@@ -100,7 +100,7 @@ export function createAutoToolsRuntime(
100
100
  function registerRuntimeTool(cfg: Config.RegisteredTool) {
101
101
  const fingerprint = getToolFingerprint(cfg);
102
102
  if (runtimeToolFingerprints.get(cfg.name) === fingerprint) return;
103
- deps.registerTool(Tools.createRuntimeToolDefinition(cfg, deps.exec));
103
+ deps.registerTool(ToolsLocal.createRuntimeToolDefinition(cfg, deps.exec));
104
104
  runtimeTools.add(cfg.name);
105
105
  runtimeToolFingerprints.set(cfg.name, fingerprint);
106
106
  }
@@ -148,7 +148,7 @@ export function createAutoToolsRuntime(
148
148
  const recipeRoot = deps.recipeRoot ?? Paths.getRecipeRoot();
149
149
  const packagedRecipeRoot =
150
150
  deps.packagedRecipeRoot ?? Paths.getPackagedRecipeRoot();
151
- const discovered = RecipeDiscovery.discoverRecipeSources([
151
+ const discovered = RecipesDiscovery.discoverRecipeSources([
152
152
  { root: recipeRoot, defaultTool: true, mutableUsage: true },
153
153
  { root: packagedRecipeRoot },
154
154
  ]);
@@ -156,7 +156,7 @@ export function createAutoToolsRuntime(
156
156
  tools.clear();
157
157
  for (const entry of discovered.active.values()) {
158
158
  try {
159
- const cfg = RecipeDiscovery.toRegisteredTool(entry);
159
+ const cfg = RecipesDiscovery.toRegisteredTool(entry);
160
160
  if (cfg) tools.set(cfg.name, cfg);
161
161
  } catch (error) {
162
162
  warnings.push(
package/lib/schema.ts CHANGED
@@ -30,6 +30,61 @@ export interface ToolArgSpec {
30
30
  error?: string;
31
31
  }
32
32
 
33
+ export type JsonSchema = Record<string, unknown>;
34
+
35
+ export function stringSchema(description: string): JsonSchema {
36
+ return { description, type: "string" };
37
+ }
38
+
39
+ export function typedArgSchema(
40
+ description: string,
41
+ type: ToolArgType | undefined,
42
+ ): JsonSchema {
43
+ if (!type) return stringSchema(description);
44
+ switch (type.kind) {
45
+ case "int":
46
+ return { description, type: "integer" };
47
+ case "number":
48
+ return { description, type: "number" };
49
+ case "bool":
50
+ return { description, type: "boolean" };
51
+ case "array":
52
+ return { description, items: {}, type: "array" };
53
+ case "enum":
54
+ return { description, enum: type.values, type: "string" };
55
+ case "path":
56
+ case "string":
57
+ return stringSchema(description);
58
+ }
59
+ }
60
+
61
+ export function booleanSchema(description: string): JsonSchema {
62
+ return { description, type: "boolean" };
63
+ }
64
+
65
+ export function nullSchema(description: string): JsonSchema {
66
+ return { description, type: "null" };
67
+ }
68
+
69
+ export function arraySchema(description: string): JsonSchema {
70
+ return { description, items: {}, type: "array" };
71
+ }
72
+
73
+ export function unionSchema(anyOf: JsonSchema[]): JsonSchema {
74
+ return { anyOf };
75
+ }
76
+
77
+ export function objectSchema(
78
+ properties: Record<string, JsonSchema>,
79
+ required: string[] = [],
80
+ ): JsonSchema {
81
+ return { additionalProperties: false, properties, required, type: "object" };
82
+ }
83
+
84
+ export function looseObjectSchema(description: string): JsonSchema {
85
+ return { additionalProperties: true, description, type: "object" };
86
+ }
87
+
33
88
  function mergeUnique(items: string[]): string[] {
34
89
  return [...new Set(items.filter(Boolean))];
35
90
  }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Public tool access and ownership checks
3
+ * Zones: session ownership, run visibility guards, tool authorization errors
4
+ * Owns consistent session-mismatch diagnostics for public tool execution paths
5
+ */
6
+
7
+ import * as AsyncRuns from "./async-runs.ts";
8
+
9
+ export interface SessionContext {
10
+ sessionManager?: { getSessionId?: () => string };
11
+ }
12
+
13
+ export function getContextSessionId(ctx: unknown): string | undefined {
14
+ return (ctx as SessionContext | undefined)?.sessionManager?.getSessionId?.();
15
+ }
16
+
17
+ export function requireContextSessionId(ctx: unknown, actor: string): string {
18
+ const sessionId = getContextSessionId(ctx);
19
+ if (!sessionId) {
20
+ throw new Error(
21
+ `${actor} requires a current coordinator session; use session:<id> or session:all for explicit session inventory.`,
22
+ );
23
+ }
24
+ return sessionId;
25
+ }
26
+
27
+ export function sessionMismatchError(input: {
28
+ currentSession?: string;
29
+ expectedSession?: string;
30
+ run?: string;
31
+ target?: string;
32
+ }): Error {
33
+ const ownerSession = input.expectedSession ?? "none";
34
+ const currentSession = input.currentSession ?? "none";
35
+ const actor = input.run ? `run:${input.run}` : (input.target ?? "session");
36
+ const hintTarget = input.expectedSession
37
+ ? `session:${input.expectedSession}`
38
+ : "session:all";
39
+ return Object.assign(
40
+ new Error(
41
+ `${actor} reason=session_mismatch owner_session=${ownerSession} current_session=${currentSession} hint=inspect_session:${input.expectedSession ?? "all"}`,
42
+ ),
43
+ {
44
+ current_session: input.currentSession,
45
+ hint: `inspect target=${hintTarget} view=status`,
46
+ owner_session: input.expectedSession,
47
+ reason: "session_mismatch",
48
+ run: input.run,
49
+ target: input.target,
50
+ },
51
+ );
52
+ }
53
+
54
+ export function assertRunAccessibleToContext(
55
+ runId: string,
56
+ ctx: unknown,
57
+ ): Record<string, unknown> {
58
+ const status = AsyncRuns.getRunStatus(runId);
59
+ const sessionId = getContextSessionId(ctx);
60
+ if (sessionId && status.ownerId && status.ownerId !== sessionId) {
61
+ throw sessionMismatchError({
62
+ currentSession: sessionId,
63
+ expectedSession: String(status.ownerId),
64
+ run: runId,
65
+ });
66
+ }
67
+ return status;
68
+ }