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
@@ -40,8 +40,9 @@
40
40
  *
41
41
  * Keyed by registry path, not by project: accepting an id is a statement about the operator's registry.
42
42
  */
43
- import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
43
+ import { mkdir, rename, writeFile } from "node:fs/promises";
44
44
  import { dirname, join } from "node:path";
45
+ import { readAuthorityText } from "../kernel/authority-text.js";
45
46
  import { acceptedWorkspacesPath } from "../kernel/project-paths.js";
46
47
  function parse(text) {
47
48
  let parsed;
@@ -66,12 +67,23 @@ function parse(text) {
66
67
  * `grant-store.ts` takes for a malformed grant, and for the same reason: the file is the record of a decision,
67
68
  * so an unreadable one means the decision is unknown, not that anything goes.
68
69
  */
69
- export async function reconcileAcceptedWorkspaces(registryPath, registryIds, env = process.env) {
70
+ export async function reconcileAcceptedWorkspaces(registryPath, registryIds, env = process.env,
71
+ /** Trusted physical-read dependency; never supplied by a registry or requester. */
72
+ read = readAuthorityText, assertHealthy) {
73
+ assertHealthy?.();
70
74
  const path = acceptedWorkspacesPath(registryPath, env);
71
- const text = await readFile(path, "utf8").catch(() => undefined);
75
+ const text = await read(path).catch((error) => {
76
+ // Unknown decisions are not first use; preserve physical failures and their recovery capabilities.
77
+ if (!(error instanceof Error) || !("code" in error) || error.code !== "ENOENT")
78
+ throw error;
79
+ assertHealthy?.();
80
+ return undefined;
81
+ });
82
+ assertHealthy?.();
72
83
  if (text === undefined) {
73
84
  const accepted = [...registryIds].sort();
74
- await write(path, { version: 1, registry: registryPath, accepted });
85
+ await write(path, { version: 1, registry: registryPath, accepted }, assertHealthy);
86
+ assertHealthy?.();
75
87
  return { accepted, firstUse: true, unaccepted: [] };
76
88
  }
77
89
  const stored = parse(text);
@@ -92,10 +104,14 @@ export async function acceptWorkspaces(registryPath, registryIds, env = process.
92
104
  return accepted;
93
105
  }
94
106
  /** Atomic, for the reason every other store here is: a half-written record reads as a narrower decision. */
95
- async function write(path, body) {
107
+ async function write(path, body, assertHealthy) {
108
+ assertHealthy?.();
96
109
  await mkdir(dirname(path), { recursive: true });
110
+ assertHealthy?.();
97
111
  const temp = join(dirname(path), `.${Math.random().toString(36).slice(2)}.tmp`);
98
112
  await writeFile(temp, `${JSON.stringify(body, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
113
+ assertHealthy?.();
99
114
  await rename(temp, path);
115
+ assertHealthy?.();
100
116
  }
101
117
  //# sourceMappingURL=workspace-acceptance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-acceptance.js","sourceRoot":"","sources":["../../src/governance/workspace-acceptance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-acceptance.js","sourceRoot":"","sources":["../../src/governance/workspace-acceptance.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-lease.d.ts","sourceRoot":"","sources":["../../src/governance/workspace-lease.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAK7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGlF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAErF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,mBAAmB,GAAG,UAAU,EACzC,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,UAAU,GAAG,qBAAqB,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,CAQtF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GAAG,OAAO,EACxB,SAAS,EAAE,OAAO,GAAG,SAAS,GAC7B,UAAU,GAAG,aAAa,GAAG,WAAW,CAG1C;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,cAAc,CAAC,CAgW1B"}
1
+ {"version":3,"file":"workspace-lease.d.ts","sourceRoot":"","sources":["../../src/governance/workspace-lease.ts"],"names":[],"mappings":"AAQA,OAAO,EAKL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAK7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGlF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAErF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,mBAAmB,GAAG,UAAU,EACzC,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,UAAU,GAAG,qBAAqB,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,CAQtF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GAAG,OAAO,EACxB,SAAS,EAAE,OAAO,GAAG,SAAS,GAC7B,UAAU,GAAG,aAAa,GAAG,WAAW,CAG1C;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE;IACjD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kGAAkG;IAClG,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,cAAc,CAAC,CAmZ1B"}
@@ -1,3 +1,4 @@
1
+ import { readCapturedWorkerReceipt, matchesWorkerWorkspace, readWorkerRecord, sameWorkerIdentity, isCapturedWorkerIdentity, } from "./captured-worker-record.js";
1
2
  import { createHash, randomUUID } from "node:crypto";
2
3
  import { atomicMetadata, leasePaths, readMetadata, } from "./lease-record.js";
3
4
  import { once } from "node:events";
@@ -54,6 +55,7 @@ export async function acquireWorkspaceLease(input) {
54
55
  ownerId: input.ownerId,
55
56
  recovered: false,
56
57
  attachProcess: () => { },
58
+ attachCapturedWorker: async () => { },
57
59
  attachHerdrTab: () => { },
58
60
  // A read lease took no kernel lock, so there is nothing to keep: `not-held` is the same answer
59
61
  // `release()` gives, and it is the truth rather than a retention that never happened (R-152).
@@ -170,8 +172,17 @@ export async function acquireWorkspaceLease(input) {
170
172
  throw error;
171
173
  }
172
174
  const previous = await readMetadata(paths.metadata);
175
+ // A free kernel lock cannot establish settlement of an earlier captured subtree.
176
+ if (previous === "malformed" ||
177
+ (previous?.captured_worker &&
178
+ (!(await matchesWorkerWorkspace(previous.captured_worker, input.workspace.root)) ||
179
+ !(await readCapturedWorkerReceipt(previous.captured_worker)))) ||
180
+ (previous?.state === "active" && !previous.captured_worker)) {
181
+ holder.stdin?.end();
182
+ throw new GovernanceRefusal(refusal("WORKSPACE_LEASE_STALE", "predecessor workspace ownership is unresolved; original matching worker settlement evidence is required", { workspace_id: input.workspace.workspaceId, root: input.workspace.root }));
183
+ }
173
184
  // "malformed" is not "no prior owner": an unreadable record cannot prove a clean handover (R-100).
174
- const recovered = previous === "malformed" ? "unknown" : previous?.state === "active";
185
+ const recovered = previous?.state === "active";
175
186
  const token = randomUUID();
176
187
  const metadata = {
177
188
  version: 1,
@@ -218,6 +229,26 @@ export async function acquireWorkspaceLease(input) {
218
229
  access: "write",
219
230
  ownerId: input.ownerId,
220
231
  recovered,
232
+ async attachCapturedWorker(identity) {
233
+ if (releasing || holder.exitCode !== null || holder.signalCode !== null)
234
+ throw new Error("writer lease lost before captured ownership persistence");
235
+ if (!isCapturedWorkerIdentity(identity) || !(await matchesWorkerWorkspace(identity, input.workspace.root)))
236
+ throw new Error("captured identity does not match leased workspace");
237
+ const current = await readMetadata(paths.metadata);
238
+ if (current === "malformed" || current?.token !== token)
239
+ throw new Error("writer ownership record changed before captured attachment");
240
+ if (metadata.captured_worker && !sameWorkerIdentity(metadata.captured_worker, identity))
241
+ throw new Error("writer lease already owns another captured execution");
242
+ const record = (await readWorkerRecord(identity.ownershipPath));
243
+ if (record.state !== "ready" ||
244
+ !isCapturedWorkerIdentity(record.identity) ||
245
+ !sameWorkerIdentity(identity, record.identity))
246
+ throw new Error("captured readiness record mismatch");
247
+ metadata.captured_worker = identity;
248
+ await atomicMetadata(paths.metadata, metadata);
249
+ if (holder.exitCode !== null || holder.signalCode !== null)
250
+ throw new Error("writer lease lost during captured ownership persistence");
251
+ },
221
252
  attachProcess(pid) {
222
253
  attach({ process_pid: pid });
223
254
  },
@@ -307,6 +338,18 @@ export async function acquireWorkspaceLease(input) {
307
338
  async release(reason = "completed") {
308
339
  // Memoized, not a boolean. A second call used to answer "released" whatever the first returned, so a
309
340
  // retry — or a `finally` after an explicit release — read a clean handover that never happened.
341
+ if (metadata.captured_worker) {
342
+ const receipt = await readCapturedWorkerReceipt(metadata.captured_worker);
343
+ if (!receipt) {
344
+ holder.unref();
345
+ unrefStream(holder.stdout);
346
+ unrefStream(holder.stderr);
347
+ return (settled = "retained");
348
+ }
349
+ // Only original matching receipt can reconcile a previously uncertain captured worker.
350
+ if (settled === "retained")
351
+ settled = undefined;
352
+ }
310
353
  if (settled)
311
354
  return settled;
312
355
  releasing = true;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-lease.js","sourceRoot":"","sources":["../../src/governance/workspace-lease.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-lease.js","sourceRoot":"","sources":["../../src/governance/workspace-lease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function readAuthorityText(path: string): Promise<string>;
2
+ export declare function readOptionalAuthorityText(path: string): Promise<string | undefined>;
3
+ //# sourceMappingURL=authority-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority-text.d.ts","sourceRoot":"","sources":["../../src/kernel/authority-text.ts"],"names":[],"mappings":"AAEA,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMrE;AACD,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAOzF"}
@@ -0,0 +1,22 @@
1
+ /** Authority metadata: only ENOENT is absence; damage and unresolved cleanup preserve failure. */
2
+ import { readBoundedFile } from "./bounded-read.js";
3
+ export async function readAuthorityText(path) {
4
+ const read = await readBoundedFile(path, { maxBytes: 1024 * 1024, timeoutMs: 2_000 });
5
+ if (read.ok)
6
+ return read.text;
7
+ const error = new Error(`Cannot read ${path}: ${read.why} (${read.detail})`);
8
+ if ("code" in read && read.code)
9
+ Object.assign(error, { code: read.code });
10
+ throw error;
11
+ }
12
+ export async function readOptionalAuthorityText(path) {
13
+ try {
14
+ return await readAuthorityText(path);
15
+ }
16
+ catch (error) {
17
+ if (error.code === "ENOENT")
18
+ return undefined;
19
+ throw error;
20
+ }
21
+ }
22
+ //# sourceMappingURL=authority-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority-text.js","sourceRoot":"","sources":["../../src/kernel/authority-text.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,IAAI,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7E,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,CAAC;AACd,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAY;IAC1D,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { BoundedReadCleanupError } from "./bounded-read.ts";
2
+ /** Independent failed readers remain typed, with every original recovery capability intact. */
3
+ export declare class CollectedBoundedReadCleanupError extends BoundedReadCleanupError {
4
+ readonly errors: readonly BoundedReadCleanupError[];
5
+ constructor(errors: readonly BoundedReadCleanupError[]);
6
+ }
7
+ /** Preserve singleton identity; flatten only our typed collection, never arbitrary caller errors. */
8
+ export declare function collectBoundedReadFailures(errors: readonly unknown[]): BoundedReadCleanupError | undefined;
9
+ //# sourceMappingURL=bounded-read-failures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-read-failures.d.ts","sourceRoot":"","sources":["../../src/kernel/bounded-read-failures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,+FAA+F;AAC/F,qBAAa,gCAAiC,SAAQ,uBAAuB;IAC3E,QAAQ,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;gBACxC,MAAM,EAAE,SAAS,uBAAuB,EAAE;CAWvD;AAED,qGAAqG;AACrG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,uBAAuB,GAAG,SAAS,CAsB1G"}
@@ -0,0 +1,33 @@
1
+ import { BoundedReadCleanupError } from "./bounded-read.js";
2
+ /** Independent failed readers remain typed, with every original recovery capability intact. */
3
+ export class CollectedBoundedReadCleanupError extends BoundedReadCleanupError {
4
+ errors;
5
+ constructor(errors) {
6
+ const members = Object.freeze([...errors]);
7
+ super(members, async () => {
8
+ const outcomes = await Promise.allSettled(members.map((error) => error.cleanup()));
9
+ const failed = members.filter((_error, index) => outcomes[index].status === "rejected");
10
+ if (failed.length)
11
+ throw collectBoundedReadFailures(failed);
12
+ });
13
+ this.name = "CollectedBoundedReadCleanupError";
14
+ this.message = `${members.length} bounded reader descriptor cleanups unresolved; retain and explicitly retry`;
15
+ this.errors = members;
16
+ }
17
+ }
18
+ /** Preserve singleton identity; flatten only our typed collection, never arbitrary caller errors. */
19
+ export function collectBoundedReadFailures(errors) {
20
+ const members = [
21
+ ...new Set(errors.flatMap((error) => error instanceof CollectedBoundedReadCleanupError
22
+ ? error.errors
23
+ : error instanceof BoundedReadCleanupError
24
+ ? [error]
25
+ : [])),
26
+ ];
27
+ const existing = errors.find((error) => error instanceof CollectedBoundedReadCleanupError &&
28
+ error.errors.length === members.length &&
29
+ error.errors.every((member, index) => member === members[index]));
30
+ return (existing ??
31
+ (members.length > 1 ? new CollectedBoundedReadCleanupError(members) : members[0]));
32
+ }
33
+ //# sourceMappingURL=bounded-read-failures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-read-failures.js","sourceRoot":"","sources":["../../src/kernel/bounded-read-failures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,+FAA+F;AAC/F,MAAM,OAAO,gCAAiC,SAAQ,uBAAuB;IAClE,MAAM,CAAqC;IACpD,YAAY,MAA0C;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC3C,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YACxB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;YACxF,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,0BAA0B,CAAC,MAAM,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,6EAA6E,CAAC;QAC9G,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACxB,CAAC;CACF;AAED,qGAAqG;AACrG,MAAM,UAAU,0BAA0B,CAAC,MAA0B;IACnE,MAAM,OAAO,GAAG;QACd,GAAG,IAAI,GAAG,CACR,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CACvB,KAAK,YAAY,gCAAgC;YAC/C,CAAC,CAAC,KAAK,CAAC,MAAM;YACd,CAAC,CAAC,KAAK,YAAY,uBAAuB;gBACxC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACT,CAAC,CAAC,EAAE,CACT,CACF;KACF,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAC1B,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,YAAY,gCAAgC;QACjD,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;QACtC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CACnE,CAAC;IACF,OAAO,CACJ,QAAyD;QAC1D,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,gCAAgC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAClF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** Bounded synchronous reads for the synchronous planner/settings seams. */
2
+ import { openSync, closeSync, fstatSync, readSync } from "node:fs";
3
+ import { BoundedReadCleanupError } from "./bounded-read.ts";
4
+ export interface SyncReadPorts {
5
+ open: typeof openSync;
6
+ close: typeof closeSync;
7
+ stat: typeof fstatSync;
8
+ read: typeof readSync;
9
+ realpath: (path: string) => string;
10
+ }
11
+ /** Diagnostic owners only: a numeric fd cannot safely be retried after close failed and may have been reused. */
12
+ export declare function unresolvedSyncReadCleanups(): readonly BoundedReadCleanupError[];
13
+ export declare function readBoundedTextSync(path: string, options: {
14
+ maxBytes: number;
15
+ timeoutMs?: number;
16
+ prefix?: boolean;
17
+ confinedRoot?: string;
18
+ now?: () => number;
19
+ }, io?: SyncReadPorts): {
20
+ text: string;
21
+ truncated: boolean;
22
+ size: number;
23
+ };
24
+ //# sourceMappingURL=bounded-read-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-read-sync.d.ts","sourceRoot":"","sources":["../../src/kernel/bounded-read-sync.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAa,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAgB,MAAM,SAAS,CAAC;AAE5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,QAAQ,CAAC;IACtB,KAAK,EAAE,OAAO,SAAS,CAAC;IACxB,IAAI,EAAE,OAAO,SAAS,CAAC;IACvB,IAAI,EAAE,OAAO,QAAQ,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AASD,iHAAiH;AACjH,wBAAgB,0BAA0B,IAAI,SAAS,uBAAuB,EAAE,CAE/E;AACD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,EACD,EAAE,GAAE,aAAqB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAoDpD"}
@@ -0,0 +1,75 @@
1
+ /** Bounded synchronous reads for the synchronous planner/settings seams. */
2
+ import { constants, openSync, closeSync, fstatSync, readSync, realpathSync } from "node:fs";
3
+ import { isAbsolute, relative } from "node:path";
4
+ import { BoundedReadCleanupError } from "./bounded-read.js";
5
+ const ports = {
6
+ open: openSync,
7
+ close: closeSync,
8
+ stat: fstatSync,
9
+ read: readSync,
10
+ realpath: realpathSync,
11
+ };
12
+ const unresolved = new Set();
13
+ /** Diagnostic owners only: a numeric fd cannot safely be retried after close failed and may have been reused. */
14
+ export function unresolvedSyncReadCleanups() {
15
+ return [...unresolved];
16
+ }
17
+ export function readBoundedTextSync(path, options, io = ports) {
18
+ const now = options.now ?? Date.now;
19
+ const deadline = now() + (options.timeoutMs ?? 2_000);
20
+ const fd = io.open(path, constants.O_RDONLY | constants.O_NONBLOCK | (constants.O_NOFOLLOW ?? 0));
21
+ try {
22
+ const stat = io.stat(fd);
23
+ if (!stat.isFile())
24
+ throw new Error("not a regular file");
25
+ // Linux /proc resolves the held object, including ancestor substitutions between realpath and open.
26
+ // If this proof is unavailable, named context files are refused rather than trusting the earlier path.
27
+ if (options.confinedRoot) {
28
+ const held = io.realpath(`/proc/self/fd/${fd}`);
29
+ const within = relative(options.confinedRoot, held);
30
+ if (!within || within === ".." || within.startsWith("../") || isAbsolute(within))
31
+ throw new Error("held file is outside this session's working directory");
32
+ }
33
+ if (!options.prefix && stat.size > options.maxBytes)
34
+ throw new Error("file exceeds byte limit");
35
+ const bytes = Buffer.alloc(options.maxBytes + 1);
36
+ let offset = 0;
37
+ while (offset < bytes.length) {
38
+ if (now() > deadline)
39
+ throw new Error("bounded read timed out");
40
+ const count = io.read(fd, bytes, offset, Math.min(64 * 1024, bytes.length - offset), offset);
41
+ if (!count)
42
+ break;
43
+ offset += count;
44
+ }
45
+ const truncated = offset > options.maxBytes;
46
+ if (truncated && !options.prefix)
47
+ throw new Error("file grew beyond byte limit");
48
+ // stream:true accepts only an incomplete final codepoint at a deliberately truncated boundary.
49
+ // Malformed bytes in the retained prefix still throw; valid replacement characters remain intact.
50
+ let text;
51
+ try {
52
+ text = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(bytes.subarray(0, Math.min(offset, options.maxBytes)), { stream: truncated });
53
+ }
54
+ catch (cause) {
55
+ throw new Error("invalid UTF-8", { cause });
56
+ }
57
+ return { text, truncated, size: stat.size };
58
+ }
59
+ finally {
60
+ try {
61
+ io.close(fd);
62
+ }
63
+ catch (cause) {
64
+ let failure;
65
+ failure = new BoundedReadCleanupError(cause, async () => {
66
+ throw failure;
67
+ });
68
+ failure.message =
69
+ "synchronous reader close failed; descriptor ownership is unresolved; automatic retry is unsafe";
70
+ unresolved.add(failure);
71
+ throw failure;
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=bounded-read-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-read-sync.js","sourceRoot":"","sources":["../../src/kernel/bounded-read-sync.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,25 @@
1
+ import { type FileHandle } from "node:fs/promises";
2
+ /** Explicitly trusted per-read I/O ports, never requester/environment input. */
3
+ export interface BoundedReadPorts {
4
+ open(path: string, flags: number): Promise<FileHandle>;
5
+ read(handle: FileHandle, buffer: Buffer, offset: number, length: number, position: number): Promise<{
6
+ bytesRead: number;
7
+ }>;
8
+ close(handle: FileHandle): Promise<void>;
9
+ }
10
+ /** A failed read stays failed even after this explicit recovery capability succeeds. */
11
+ export declare class BoundedReadCleanupError extends Error {
12
+ readonly cleanup: () => Promise<void>;
13
+ /** Latest physical failure, including falsy rejections; cause remains the original failure. */
14
+ lastCause: unknown;
15
+ constructor(cause: unknown, cleanup: () => Promise<void>);
16
+ }
17
+ /** Trusted diagnostics/recovery only; not admission, a quota, or a Root-wide shutdown join. */
18
+ export declare function retainedBoundedReadCleanups(): readonly BoundedReadCleanupOwner[];
19
+ export interface BoundedReadCleanupOwner {
20
+ readonly handle: FileHandle | undefined;
21
+ cleanup(): Promise<void>;
22
+ }
1
23
  export interface BoundedReadLimits {
2
24
  /** Refuse anything at or over this, before allocating it. */
3
25
  maxBytes: number;
@@ -16,6 +38,7 @@ export interface BoundedReadLimits {
16
38
  export type BoundedReadFailure = {
17
39
  why: "unopenable";
18
40
  detail: string;
41
+ code?: string;
19
42
  } | {
20
43
  why: "not-a-regular-file";
21
44
  detail: string;
@@ -29,9 +52,13 @@ export type BoundedReadFailure = {
29
52
  } | {
30
53
  why: "timed-out";
31
54
  detail: string;
55
+ } | {
56
+ why: "invalid-utf8";
57
+ detail: string;
32
58
  } | {
33
59
  why: "unreadable";
34
60
  detail: string;
61
+ code?: string;
35
62
  };
36
63
  export type BoundedReadResult = {
37
64
  ok: true;
@@ -52,6 +79,6 @@ export type BoundedReadBytes = {
52
79
  * UTF-8 round trip unchanged — a latin-1 byte that decodes to U+FFFD changes the file's digest, and that
53
80
  * check is only possible against the original buffer. Decoding here and re-encoding there would defeat it.
54
81
  */
55
- export declare function readBoundedFile(path: string, limits: BoundedReadLimits): Promise<BoundedReadResult>;
56
- export declare function readBoundedBytes(path: string, limits: BoundedReadLimits): Promise<BoundedReadBytes>;
82
+ export declare function readBoundedFile(path: string, limits: BoundedReadLimits, ports?: BoundedReadPorts): Promise<BoundedReadResult>;
83
+ export declare function readBoundedBytes(path: string, limits: BoundedReadLimits, ports?: BoundedReadPorts): Promise<BoundedReadBytes>;
57
84
  //# sourceMappingURL=bounded-read.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bounded-read.d.ts","sourceRoot":"","sources":["../../src/kernel/bounded-read.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,GAAG,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,GAAG,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,GAAG,kBAAkB,CAAC,CAAC;AAClG,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,GAAG,kBAAkB,CAAC,CAAC;AAElG;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAGzG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkDzG"}
1
+ {"version":3,"file":"bounded-read.d.ts","sourceRoot":"","sources":["../../src/kernel/bounded-read.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,77 @@
32
32
  */
33
33
  import { constants } from "node:fs";
34
34
  import { open } from "node:fs/promises";
35
+ /** A failed read stays failed even after this explicit recovery capability succeeds. */
36
+ export class BoundedReadCleanupError extends Error {
37
+ cleanup;
38
+ /** Latest physical failure, including falsy rejections; cause remains the original failure. */
39
+ lastCause;
40
+ constructor(cause, cleanup) {
41
+ super("bounded reader descriptor cleanup unresolved; retain and explicitly retry", { cause });
42
+ this.name = "BoundedReadCleanupError";
43
+ this.lastCause = cause;
44
+ this.cleanup = cleanup;
45
+ }
46
+ }
47
+ const retained = new Set();
48
+ /** Trusted diagnostics/recovery only; not admission, a quota, or a Root-wide shutdown join. */
49
+ export function retainedBoundedReadCleanups() {
50
+ return [...retained];
51
+ }
52
+ class BoundedReadCleanup {
53
+ held;
54
+ active;
55
+ failure;
56
+ finish;
57
+ reading = new Promise((resolve) => (this.finish = resolve));
58
+ close;
59
+ constructor(close) {
60
+ this.close = close;
61
+ retained.add(this);
62
+ }
63
+ acquired(handle) {
64
+ this.held = handle;
65
+ }
66
+ get handle() {
67
+ return this.held;
68
+ }
69
+ readSettled() {
70
+ this.finish();
71
+ }
72
+ cleanup() {
73
+ if (this.active)
74
+ return this.active;
75
+ // Publish before calling any trusted port: reentrant/concurrent cleanup shares this operation.
76
+ const operation = this.reading.then(async () => {
77
+ if (!this.held) {
78
+ retained.delete(this);
79
+ return;
80
+ }
81
+ try {
82
+ await this.close(this.held);
83
+ }
84
+ catch (cause) {
85
+ this.failure ??= new BoundedReadCleanupError(cause, () => this.cleanup());
86
+ this.failure.lastCause = cause;
87
+ throw this.failure;
88
+ }
89
+ this.held = undefined;
90
+ retained.delete(this);
91
+ });
92
+ this.active = operation;
93
+ void operation.then(() => {
94
+ this.active = undefined;
95
+ }, () => {
96
+ this.active = undefined;
97
+ });
98
+ return operation;
99
+ }
100
+ }
101
+ const boundedReadPorts = {
102
+ open,
103
+ read: (handle, buffer, offset, length, position) => handle.read(buffer, offset, length, position),
104
+ close: (handle) => handle.close(),
105
+ };
35
106
  /**
36
107
  * The same read, handing back raw bytes.
37
108
  *
@@ -39,18 +110,35 @@ import { open } from "node:fs/promises";
39
110
  * UTF-8 round trip unchanged — a latin-1 byte that decodes to U+FFFD changes the file's digest, and that
40
111
  * check is only possible against the original buffer. Decoding here and re-encoding there would defeat it.
41
112
  */
42
- export async function readBoundedFile(path, limits) {
43
- const read = await readBoundedBytes(path, limits);
44
- return read.ok ? { ok: true, text: read.bytes.toString("utf8") } : read;
113
+ export async function readBoundedFile(path, limits, ports = boundedReadPorts) {
114
+ const read = await readBoundedBytes(path, limits, ports);
115
+ if (!read.ok)
116
+ return read;
117
+ try {
118
+ return { ok: true, text: new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(read.bytes) };
119
+ }
120
+ catch {
121
+ return { ok: false, why: "invalid-utf8", detail: `${path} is not valid UTF-8` };
122
+ }
123
+ }
124
+ /** Preserve typed I/O evidence; a caller must not classify absence by searching diagnostic prose. */
125
+ function ioCode(error) {
126
+ if (error && typeof error === "object" && "code" in error && typeof error.code === "string")
127
+ return { code: error.code };
128
+ return {};
45
129
  }
46
- export async function readBoundedBytes(path, limits) {
130
+ export async function readBoundedBytes(path, limits, ports = boundedReadPorts) {
47
131
  const now = limits.now ?? Date.now;
48
132
  let handle;
133
+ const cleanup = new BoundedReadCleanup((held) => ports.close(held));
49
134
  try {
50
- handle = await open(path, constants.O_RDONLY | constants.O_NONBLOCK);
135
+ handle = await ports.open(path, constants.O_RDONLY | constants.O_NONBLOCK);
136
+ cleanup.acquired(handle);
51
137
  }
52
138
  catch (error) {
53
- return { ok: false, why: "unopenable", detail: String(error) };
139
+ cleanup.readSettled();
140
+ await cleanup.cleanup();
141
+ return { ok: false, why: "unopenable", detail: String(error), ...ioCode(error) };
54
142
  }
55
143
  try {
56
144
  const info = await handle.stat();
@@ -77,7 +165,7 @@ export async function readBoundedBytes(path, limits) {
77
165
  why: "timed-out",
78
166
  detail: `${path} did not finish reading within ${limits.timeoutMs}ms`,
79
167
  };
80
- const { bytesRead } = await handle.read(buffer, filled, buffer.length - filled, filled);
168
+ const { bytesRead } = await ports.read(handle, buffer, filled, buffer.length - filled, filled);
81
169
  if (bytesRead === 0)
82
170
  break;
83
171
  filled += bytesRead;
@@ -91,10 +179,11 @@ export async function readBoundedBytes(path, limits) {
91
179
  return { ok: true, bytes: buffer.subarray(0, filled) };
92
180
  }
93
181
  catch (error) {
94
- return { ok: false, why: "unreadable", detail: String(error) };
182
+ return { ok: false, why: "unreadable", detail: String(error), ...ioCode(error) };
95
183
  }
96
184
  finally {
97
- await handle.close().catch(() => { });
185
+ cleanup.readSettled();
186
+ await cleanup.cleanup();
98
187
  }
99
188
  }
100
189
  //# sourceMappingURL=bounded-read.js.map