pi-daddy 0.43.0 → 0.44.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 (222) hide show
  1. package/CHANGELOG.md +104 -33
  2. package/README.md +27 -5
  3. package/THIRD_PARTY_LICENSES/musl-COPYRIGHT.txt +193 -0
  4. package/THIRD_PARTY_LICENSES/zig-MIT.txt +21 -0
  5. package/THIRD_PARTY_NOTICES.md +9 -0
  6. package/contracts/ledger-record/v1/README.md +40 -25
  7. package/dist/cli.d.ts +2 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +10 -5
  10. package/dist/cli.js.map +1 -1
  11. package/dist/executors/activity-session.js +116 -65
  12. package/dist/executors/activity-session.js.map +1 -1
  13. package/dist/executors/captured-execution.d.ts +13 -0
  14. package/dist/executors/captured-execution.d.ts.map +1 -0
  15. package/dist/executors/captured-execution.js +53 -0
  16. package/dist/executors/captured-execution.js.map +1 -0
  17. package/dist/executors/child-final.d.ts +31 -0
  18. package/dist/executors/child-final.d.ts.map +1 -0
  19. package/dist/executors/child-final.js +197 -0
  20. package/dist/executors/child-final.js.map +1 -0
  21. package/dist/executors/executor.d.ts +2 -1
  22. package/dist/executors/executor.d.ts.map +1 -1
  23. package/dist/executors/executor.js +12 -0
  24. package/dist/executors/executor.js.map +1 -1
  25. package/dist/executors/owned-worker.d.ts +18 -0
  26. package/dist/executors/owned-worker.d.ts.map +1 -0
  27. package/dist/executors/owned-worker.js +295 -0
  28. package/dist/executors/owned-worker.js.map +1 -0
  29. package/dist/executors/worker-artifact.d.ts +3 -0
  30. package/dist/executors/worker-artifact.d.ts.map +1 -0
  31. package/dist/executors/worker-artifact.js +3 -0
  32. package/dist/executors/worker-artifact.js.map +1 -0
  33. package/dist/governance/approval-prompt.d.ts +4 -3
  34. package/dist/governance/approval-prompt.d.ts.map +1 -1
  35. package/dist/governance/approval-prompt.js +13 -6
  36. package/dist/governance/approval-prompt.js.map +1 -1
  37. package/dist/governance/captured-worker-record.d.ts +9 -0
  38. package/dist/governance/captured-worker-record.d.ts.map +1 -0
  39. package/dist/governance/captured-worker-record.js +123 -0
  40. package/dist/governance/captured-worker-record.js.map +1 -0
  41. package/dist/governance/lease-record.d.ts +4 -0
  42. package/dist/governance/lease-record.d.ts.map +1 -1
  43. package/dist/governance/lease-record.js +19 -2
  44. package/dist/governance/lease-record.js.map +1 -1
  45. package/dist/governance/ledger-events.d.ts +5 -5
  46. package/dist/governance/ledger-events.d.ts.map +1 -1
  47. package/dist/governance/ledger-v3-validation.js +1 -1
  48. package/dist/governance/ledger-v3-validation.js.map +1 -1
  49. package/dist/governance/workspace-acceptance.d.ts +3 -1
  50. package/dist/governance/workspace-acceptance.d.ts.map +1 -1
  51. package/dist/governance/workspace-acceptance.js +21 -5
  52. package/dist/governance/workspace-acceptance.js.map +1 -1
  53. package/dist/governance/workspace-lease.d.ts.map +1 -1
  54. package/dist/governance/workspace-lease.js +44 -1
  55. package/dist/governance/workspace-lease.js.map +1 -1
  56. package/dist/kernel/authority-text.d.ts +3 -0
  57. package/dist/kernel/authority-text.d.ts.map +1 -0
  58. package/dist/kernel/authority-text.js +22 -0
  59. package/dist/kernel/authority-text.js.map +1 -0
  60. package/dist/kernel/bounded-read-failures.d.ts +9 -0
  61. package/dist/kernel/bounded-read-failures.d.ts.map +1 -0
  62. package/dist/kernel/bounded-read-failures.js +33 -0
  63. package/dist/kernel/bounded-read-failures.js.map +1 -0
  64. package/dist/kernel/bounded-read-sync.d.ts +24 -0
  65. package/dist/kernel/bounded-read-sync.d.ts.map +1 -0
  66. package/dist/kernel/bounded-read-sync.js +75 -0
  67. package/dist/kernel/bounded-read-sync.js.map +1 -0
  68. package/dist/kernel/bounded-read.d.ts +29 -2
  69. package/dist/kernel/bounded-read.d.ts.map +1 -1
  70. package/dist/kernel/bounded-read.js +98 -9
  71. package/dist/kernel/bounded-read.js.map +1 -1
  72. package/dist/kernel/capacity.d.ts +36 -0
  73. package/dist/kernel/capacity.d.ts.map +1 -0
  74. package/dist/kernel/capacity.js +94 -0
  75. package/dist/kernel/capacity.js.map +1 -0
  76. package/dist/kernel/captured-worker-contract.d.ts +38 -0
  77. package/dist/kernel/captured-worker-contract.d.ts.map +1 -0
  78. package/dist/kernel/captured-worker-contract.js +2 -0
  79. package/dist/kernel/captured-worker-contract.js.map +1 -0
  80. package/dist/kernel/catalog.d.ts +12 -3
  81. package/dist/kernel/catalog.d.ts.map +1 -1
  82. package/dist/kernel/catalog.js +28 -8
  83. package/dist/kernel/catalog.js.map +1 -1
  84. package/dist/kernel/chain.d.ts +1 -0
  85. package/dist/kernel/chain.d.ts.map +1 -1
  86. package/dist/kernel/chain.js.map +1 -1
  87. package/dist/kernel/definitions.d.ts +11 -1
  88. package/dist/kernel/definitions.d.ts.map +1 -1
  89. package/dist/kernel/definitions.js +6 -3
  90. package/dist/kernel/definitions.js.map +1 -1
  91. package/dist/kernel/fanout.d.ts +5 -25
  92. package/dist/kernel/fanout.d.ts.map +1 -1
  93. package/dist/kernel/fanout.js +15 -30
  94. package/dist/kernel/fanout.js.map +1 -1
  95. package/dist/kernel/grant-env.d.ts +0 -2
  96. package/dist/kernel/grant-env.d.ts.map +1 -1
  97. package/dist/kernel/grant-env.js +0 -1
  98. package/dist/kernel/grant-env.js.map +1 -1
  99. package/dist/kernel/model-preflight.d.ts +8 -0
  100. package/dist/kernel/model-preflight.d.ts.map +1 -1
  101. package/dist/kernel/model-preflight.js +23 -0
  102. package/dist/kernel/model-preflight.js.map +1 -1
  103. package/dist/kernel/selected-definitions.d.ts +15 -0
  104. package/dist/kernel/selected-definitions.d.ts.map +1 -0
  105. package/dist/kernel/selected-definitions.js +146 -0
  106. package/dist/kernel/selected-definitions.js.map +1 -0
  107. package/dist/kernel/skill-packages.d.ts +4 -2
  108. package/dist/kernel/skill-packages.d.ts.map +1 -1
  109. package/dist/kernel/skill-packages.js +34 -41
  110. package/dist/kernel/skill-packages.js.map +1 -1
  111. package/dist/kernel/skill-resources.d.ts.map +1 -1
  112. package/dist/kernel/skill-resources.js +8 -11
  113. package/dist/kernel/skill-resources.js.map +1 -1
  114. package/dist/kernel/workspace.d.ts +6 -3
  115. package/dist/kernel/workspace.d.ts.map +1 -1
  116. package/dist/kernel/workspace.js +10 -6
  117. package/dist/kernel/workspace.js.map +1 -1
  118. package/dist/products/dashboard-cli.js +1 -1
  119. package/dist/products/dashboard-cli.js.map +1 -1
  120. package/dist/products/dashboard-render.d.ts +1 -2
  121. package/dist/products/dashboard-render.d.ts.map +1 -1
  122. package/dist/products/dashboard-render.js +3 -1
  123. package/dist/products/dashboard-render.js.map +1 -1
  124. package/dist/products/dashboard-session-client.d.ts +1 -2
  125. package/dist/products/dashboard-session-client.d.ts.map +1 -1
  126. package/dist/products/dashboard-session-client.js.map +1 -1
  127. package/dist/products/episode-report.d.ts +12 -8
  128. package/dist/products/episode-report.d.ts.map +1 -1
  129. package/dist/products/episode-report.js +61 -12
  130. package/dist/products/episode-report.js.map +1 -1
  131. package/extensions/approvals.ts +1 -1
  132. package/extensions/chain-plan.ts +9 -3
  133. package/extensions/context-staging.ts +30 -35
  134. package/extensions/dashboard-session-server.ts +1 -2
  135. package/extensions/definition-describe.ts +44 -0
  136. package/extensions/definition-runtime.ts +89 -26
  137. package/extensions/delegate-chain.ts +273 -256
  138. package/extensions/delegation-activation.ts +1 -1
  139. package/extensions/delegation.ts +41 -53
  140. package/extensions/execute-child.ts +167 -134
  141. package/extensions/fanout-outcome.ts +1 -9
  142. package/extensions/grants-command.ts +2 -9
  143. package/extensions/grants.ts +106 -38
  144. package/extensions/init-command.ts +52 -12
  145. package/extensions/reload-environment.ts +21 -2
  146. package/extensions/retired-inputs.ts +7 -0
  147. package/extensions/run-delegation.ts +212 -265
  148. package/extensions/session-capacity.ts +53 -0
  149. package/extensions/session-environment.ts +5 -2
  150. package/extensions/session-model-prompt.ts +33 -32
  151. package/extensions/session-report.ts +28 -11
  152. package/extensions/session.ts +200 -157
  153. package/extensions/workspace-runtime.ts +2 -1
  154. package/native/README.md +25 -0
  155. package/native/linux-x64/worker +0 -0
  156. package/native/linux-x64/worker.sha256 +1 -0
  157. package/native/provenance.json +42 -0
  158. package/native/toolchain.json +18 -0
  159. package/native/worker.c +209 -0
  160. package/package.json +15 -7
  161. package/src/cli.ts +16 -6
  162. package/src/executors/activity-session.ts +120 -66
  163. package/src/executors/captured-execution.ts +61 -0
  164. package/src/executors/child-final.ts +190 -0
  165. package/src/executors/executor.ts +14 -1
  166. package/src/executors/owned-worker.ts +322 -0
  167. package/src/executors/worker-artifact.ts +2 -0
  168. package/src/governance/approval-prompt.ts +18 -8
  169. package/src/governance/captured-worker-record.ts +138 -0
  170. package/src/governance/lease-record.ts +21 -2
  171. package/src/governance/ledger-events.ts +5 -5
  172. package/src/governance/ledger-v3-validation.ts +1 -1
  173. package/src/governance/workspace-acceptance.ts +20 -4
  174. package/src/governance/workspace-lease.ts +59 -1
  175. package/src/kernel/authority-text.ts +17 -0
  176. package/src/kernel/bounded-read-failures.ts +42 -0
  177. package/src/kernel/bounded-read-sync.ts +87 -0
  178. package/src/kernel/bounded-read.ts +128 -11
  179. package/src/kernel/capacity.ts +123 -0
  180. package/src/kernel/captured-worker-contract.ts +29 -0
  181. package/src/kernel/catalog.ts +45 -16
  182. package/src/kernel/chain.ts +1 -0
  183. package/src/kernel/definitions.ts +11 -2
  184. package/src/kernel/fanout.ts +17 -32
  185. package/src/kernel/grant-env.ts +0 -3
  186. package/src/kernel/model-preflight.ts +29 -0
  187. package/src/kernel/selected-definitions.ts +156 -0
  188. package/src/kernel/skill-packages.ts +40 -38
  189. package/src/kernel/skill-resources.ts +8 -9
  190. package/src/kernel/workspace.ts +12 -5
  191. package/src/products/dashboard-cli.ts +1 -1
  192. package/src/products/dashboard-render.ts +6 -2
  193. package/src/products/dashboard-session-client.ts +1 -2
  194. package/src/products/episode-report.ts +80 -17
  195. package/dist/advisors/advisor.d.ts +0 -90
  196. package/dist/advisors/advisor.d.ts.map +0 -1
  197. package/dist/advisors/advisor.js +0 -154
  198. package/dist/advisors/advisor.js.map +0 -1
  199. package/dist/advisors/decider.d.ts +0 -88
  200. package/dist/advisors/decider.d.ts.map +0 -1
  201. package/dist/advisors/decider.js +0 -29
  202. package/dist/advisors/decider.js.map +0 -1
  203. package/dist/advisors/jev.d.ts +0 -41
  204. package/dist/advisors/jev.d.ts.map +0 -1
  205. package/dist/advisors/jev.js +0 -139
  206. package/dist/advisors/jev.js.map +0 -1
  207. package/dist/advisors/settings.d.ts +0 -49
  208. package/dist/advisors/settings.d.ts.map +0 -1
  209. package/dist/advisors/settings.js +0 -99
  210. package/dist/advisors/settings.js.map +0 -1
  211. package/dist/governance/episode-cost-gate.d.ts +0 -31
  212. package/dist/governance/episode-cost-gate.d.ts.map +0 -1
  213. package/dist/governance/episode-cost-gate.js +0 -112
  214. package/dist/governance/episode-cost-gate.js.map +0 -1
  215. package/extensions/advisor-session.ts +0 -67
  216. package/extensions/effort-advice.ts +0 -112
  217. package/extensions/pruning-advice.ts +0 -133
  218. package/src/advisors/advisor.ts +0 -246
  219. package/src/advisors/decider.ts +0 -74
  220. package/src/advisors/jev.ts +0 -163
  221. package/src/advisors/settings.ts +0 -115
  222. package/src/governance/episode-cost-gate.ts +0 -128
@@ -1,4 +1,4 @@
1
- import { readFile } from "node:fs/promises";
1
+ import { BoundedReadCleanupError, readBoundedFile } from "../src/kernel/bounded-read.ts";
2
2
  import { appendLedgerEvent, buildSessionConfigEvent } from "../src/governance/ledger.ts";
3
3
  import { readRecords } from "../src/governance/record.ts";
4
4
  import {
@@ -16,9 +16,6 @@ export interface SessionModelPromptState {
16
16
  definitions: Map<string, { name: string }>;
17
17
  definitionRuntimeSettings: DefinitionRuntimeSettings;
18
18
  definitionRuntimeOverrides: Map<string, DefinitionRuntimeChoice>;
19
- sessionModelPrompt: "ask" | "never";
20
- sessionModelPrompted: boolean;
21
- sessionModelPromptInFlight?: Promise<void>;
22
19
  }
23
20
  export interface SessionModelPromptUI {
24
21
  hasUI: boolean;
@@ -26,19 +23,27 @@ export interface SessionModelPromptUI {
26
23
  notify(message: string, type?: "info" | "warning" | "error"): void;
27
24
  }
28
25
 
29
- async function historicalDefinitions(path: string | undefined): Promise<string[]> {
26
+ /** Trusted composition only; no requester or environment can supply these lifecycle/I/O ports. */
27
+ export interface ManualModelControl {
28
+ read?: typeof readBoundedFile;
29
+ assertHealthy?: () => void;
30
+ onReadCleanup?: (error: BoundedReadCleanupError) => void;
31
+ }
32
+ async function historicalDefinitions(path: string | undefined, read = readBoundedFile): Promise<string[]> {
30
33
  if (!path) return [];
31
- try {
32
- const parsed = readRecords(await readFile(path, "utf8"));
33
- return parsed.records
34
- .map((record) => record.body as { event?: unknown; agentType?: unknown })
35
- .filter((body) => body.event === "capability_decision" && typeof body.agentType === "string")
36
- .map((body) => body.agentType as string)
37
- .filter((name) => name !== "delegate");
38
- } catch (error) {
39
- if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
40
- throw error;
34
+ const result = await read(path, { maxBytes: 64 * 1024 * 1024, timeoutMs: 3000 });
35
+ if (!result.ok) {
36
+ if ("code" in result && result.code === "ENOENT") return [];
37
+ throw new Error(`manual model history unavailable: ${result.detail}`);
41
38
  }
39
+ const parsed = readRecords(result.text);
40
+ if (parsed.damage)
41
+ throw new Error(`manual model history damaged at line ${parsed.damage.line}: ${parsed.damage.reason}`);
42
+ return parsed.records
43
+ .map((record) => record.body as { event?: unknown; agentType?: unknown })
44
+ .filter((body) => body.event === "capability_decision" && typeof body.agentType === "string")
45
+ .map((body) => body.agentType as string)
46
+ .filter((name) => name !== "delegate");
42
47
  }
43
48
 
44
49
  export function sessionModelRows(state: SessionModelPromptState, names: readonly string[]) {
@@ -115,9 +120,11 @@ async function choose(
115
120
  current: readonly string[],
116
121
  ui: SessionModelPromptUI,
117
122
  trigger: "first-delegation" | "grants-models",
123
+ control: ManualModelControl,
118
124
  ): Promise<void> {
119
- const names = [...new Set([...(await historicalDefinitions(state.ledgerPath)), ...current])].sort();
120
- if (state.sessionModelPrompt === "never" || !ui.hasUI) {
125
+ const names = [...new Set([...(await historicalDefinitions(state.ledgerPath, control.read)), ...current])].sort();
126
+ control.assertHealthy?.();
127
+ if (!ui.hasUI) {
121
128
  await record(state, "kept", trigger);
122
129
  return;
123
130
  }
@@ -126,6 +133,7 @@ async function choose(
126
133
  `Child model defaults\n\n${table(state, names)}\n\nPress Enter to keep, or enter edits one per line.`,
127
134
  "<definition> <provider:model> <thinking> | all <provider:model> <thinking>",
128
135
  );
136
+ control.assertHealthy?.();
129
137
  if (answer === undefined) throw new Error("session model selection was dismissed; no child was spawned");
130
138
  if (!answer.trim()) {
131
139
  await record(state, "kept", trigger);
@@ -152,28 +160,21 @@ export async function saveSessionModelEdits(
152
160
  return null;
153
161
  }
154
162
 
155
- export async function ensureSessionModelPrompt(
163
+ export async function changeSessionModels(
156
164
  state: SessionModelPromptState,
157
- current: readonly string[],
158
165
  ui: SessionModelPromptUI,
166
+ control: ManualModelControl = {},
159
167
  ): Promise<void> {
160
- if (state.sessionModelPrompted) return;
161
- if (!state.sessionModelPromptInFlight) {
162
- state.sessionModelPromptInFlight = choose(state, current, ui, "first-delegation").then(() => {
163
- state.sessionModelPrompted = true;
164
- });
165
- }
166
168
  try {
167
- await state.sessionModelPromptInFlight;
168
- } finally {
169
- state.sessionModelPromptInFlight = undefined;
169
+ control.assertHealthy?.();
170
+ await choose(state, [...state.definitions.keys()], ui, "grants-models", control);
171
+ control.assertHealthy?.();
172
+ } catch (error) {
173
+ if (error instanceof BoundedReadCleanupError) control.onReadCleanup?.(error);
174
+ throw error;
170
175
  }
171
176
  }
172
177
 
173
- export async function changeSessionModels(state: SessionModelPromptState, ui: SessionModelPromptUI): Promise<void> {
174
- await choose(state, [...state.definitions.keys()], ui, "grants-models");
175
- }
176
-
177
178
  export function renderSessionModels(state: SessionModelPromptState): string {
178
179
  return table(state, [...state.definitions.keys()].sort());
179
180
  }
@@ -47,6 +47,7 @@ export interface SessionReportContext {
47
47
  }
48
48
 
49
49
  export async function reportSessionStart(session: GrantsSession, ctx: SessionReportContext): Promise<void> {
50
+ if (session.capacityRefusal) ctx.ui.notify(`grants: ${session.capacityRefusal.message}`, "warning");
50
51
  // A malformed bound is now loud as well as safe. Silently disabling spawning would be just as
51
52
  // confusing as silently disabling the limit was dangerous — the operator set the variable, so
52
53
  // they need to know it did not take effect (G7 / A-S4).
@@ -277,17 +278,7 @@ export async function reportSessionStart(session: GrantsSession, ctx: SessionRep
277
278
  // exactly — one added `await` inside the blanket catch cancelling every control below it in
278
279
  // silence.
279
280
  try {
280
- const line = renderSpawnableSummary(
281
- await summariseSpawnable(
282
- session.definitions,
283
- (name) => planWithApprovals(session, { task: "(preview)", agent: name }, {}, null),
284
- // The session facts that make every per-definition verdict identical. `mayDelegate` in
285
- // particular: without `tool:delegate` there is no delegate tool at all, and the line used to
286
- // report definitions as spawnable in the one session where nothing can ever be spawned.
287
- { mayDelegate: session.mayDelegate, depth: session.depth, maxDepth: session.maxDepth },
288
- ),
289
- session.definitions.size,
290
- );
281
+ const line = await selectedDefinitionsSummary(session);
291
282
  if (line) info.push(line);
292
283
  } catch (error) {
293
284
  ctx.ui.notify(
@@ -303,3 +294,29 @@ export async function reportSessionStart(session: GrantsSession, ctx: SessionRep
303
294
  // multi-line status screen has always survived while these separate lines did not.
304
295
  if (info.length > 0) ctx.ui.notify(info.join("\n"), "info");
305
296
  }
297
+
298
+ /** Public selected resources become available after session start; report their frozen snapshot then. */
299
+ export async function reportSelectedDefinitions(session: GrantsSession, ctx: SessionReportContext): Promise<void> {
300
+ for (const reason of session.definitionSkips)
301
+ ctx.ui.notify(`grants: a definition was not loaded — ${reason}`, "warning");
302
+ if (!session.governed) return;
303
+ try {
304
+ const line = await selectedDefinitionsSummary(session);
305
+ if (line) ctx.ui.notify(line, "info");
306
+ } catch (error) {
307
+ ctx.ui.notify(
308
+ `grants: selected definitions could not be summarized (${String(error)}) — run /grants for detail.`,
309
+ "warning",
310
+ );
311
+ }
312
+ }
313
+ function selectedDefinitionsSummary(session: GrantsSession): Promise<string | null> {
314
+ return summariseSpawnable(
315
+ session.definitions,
316
+ (name) => planWithApprovals(session, { task: "(preview)", agent: name }, {}, null),
317
+ // The session facts that make every per-definition verdict identical. `mayDelegate` in
318
+ // particular: without `tool:delegate` there is no delegate tool at all, and the line used to
319
+ // report definitions as spawnable in the one session where nothing can ever be spawned.
320
+ { mayDelegate: session.mayDelegate, depth: session.depth, maxDepth: session.maxDepth },
321
+ ).then((summary) => renderSpawnableSummary(summary, session.definitions.size));
322
+ }