@llblab/pi-kit 0.38.4 → 0.39.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 (424) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +1 -1
  3. package/node_modules/@llblab/pi-actors/AGENTS.md +108 -20
  4. package/node_modules/@llblab/pi-actors/BACKLOG.md +207 -4
  5. package/node_modules/@llblab/pi-actors/CHANGELOG.md +13 -0
  6. package/node_modules/@llblab/pi-actors/README.md +31 -1
  7. package/node_modules/@llblab/pi-actors/dist/index.js +1 -1
  8. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.d.ts +37 -0
  9. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.js +131 -62
  10. package/node_modules/@llblab/pi-actors/dist/lib/automatic-review-runtime.d.ts +2 -0
  11. package/node_modules/@llblab/pi-actors/dist/lib/automatic-review-runtime.js +3 -2
  12. package/node_modules/@llblab/pi-actors/dist/lib/command-templates.d.ts +37 -0
  13. package/node_modules/@llblab/pi-actors/dist/lib/command-templates.js +263 -129
  14. package/node_modules/@llblab/pi-actors/dist/lib/execution-files.d.ts +32 -0
  15. package/node_modules/@llblab/pi-actors/dist/lib/execution-files.js +128 -0
  16. package/node_modules/@llblab/pi-actors/dist/lib/execution-output.js +5 -4
  17. package/node_modules/@llblab/pi-actors/dist/lib/execution-sessions.d.ts +19 -1
  18. package/node_modules/@llblab/pi-actors/dist/lib/execution-sessions.js +62 -26
  19. package/node_modules/@llblab/pi-actors/dist/lib/execution.d.ts +4 -1
  20. package/node_modules/@llblab/pi-actors/dist/lib/execution.js +6 -1
  21. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.d.ts +9 -2
  22. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.js +92 -14
  23. package/node_modules/@llblab/pi-actors/dist/lib/file-state.js +21 -2
  24. package/node_modules/@llblab/pi-actors/dist/lib/inspector-command.js +2 -2
  25. package/node_modules/@llblab/pi-actors/dist/lib/inspector-overlay.d.ts +25 -7
  26. package/node_modules/@llblab/pi-actors/dist/lib/inspector-overlay.js +562 -262
  27. package/node_modules/@llblab/pi-actors/dist/lib/inspector.d.ts +20 -10
  28. package/node_modules/@llblab/pi-actors/dist/lib/inspector.js +80 -91
  29. package/node_modules/@llblab/pi-actors/dist/lib/limits.d.ts +1 -0
  30. package/node_modules/@llblab/pi-actors/dist/lib/limits.js +1 -0
  31. package/node_modules/@llblab/pi-actors/dist/lib/observability.d.ts +15 -1
  32. package/node_modules/@llblab/pi-actors/dist/lib/observability.js +216 -99
  33. package/node_modules/@llblab/pi-actors/dist/lib/pi.d.ts +5 -4
  34. package/node_modules/@llblab/pi-actors/dist/lib/pi.js +64 -10
  35. package/node_modules/@llblab/pi-actors/dist/lib/recipe-projection.d.ts +18 -0
  36. package/node_modules/@llblab/pi-actors/dist/lib/recipe-projection.js +220 -0
  37. package/node_modules/@llblab/pi-actors/dist/lib/recipes-context.d.ts +2 -0
  38. package/node_modules/@llblab/pi-actors/dist/lib/recipes-context.js +30 -6
  39. package/node_modules/@llblab/pi-actors/dist/lib/registry.js +270 -36
  40. package/node_modules/@llblab/pi-actors/dist/lib/run-delivery.d.ts +213 -5
  41. package/node_modules/@llblab/pi-actors/dist/lib/run-delivery.js +1909 -40
  42. package/node_modules/@llblab/pi-actors/dist/lib/run-supervision.d.ts +107 -0
  43. package/node_modules/@llblab/pi-actors/dist/lib/run-supervision.js +412 -0
  44. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.d.ts +9 -2
  45. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.js +283 -60
  46. package/node_modules/@llblab/pi-actors/dist/lib/runs-artifacts.d.ts +26 -1
  47. package/node_modules/@llblab/pi-actors/dist/lib/runs-artifacts.js +68 -2
  48. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-exports.d.ts +451 -0
  49. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-exports.js +2315 -0
  50. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-index.d.ts +97 -0
  51. package/node_modules/@llblab/pi-actors/dist/lib/runs-context-index.js +368 -0
  52. package/node_modules/@llblab/pi-actors/dist/lib/runs-control-delivery.js +46 -7
  53. package/node_modules/@llblab/pi-actors/dist/lib/runs-control.d.ts +78 -2
  54. package/node_modules/@llblab/pi-actors/dist/lib/runs-control.js +334 -2
  55. package/node_modules/@llblab/pi-actors/dist/lib/runs-controls.js +4 -1
  56. package/node_modules/@llblab/pi-actors/dist/lib/runs-descendant-launches.d.ts +80 -0
  57. package/node_modules/@llblab/pi-actors/dist/lib/runs-descendant-launches.js +287 -0
  58. package/node_modules/@llblab/pi-actors/dist/lib/runs-execution-evidence.d.ts +110 -0
  59. package/node_modules/@llblab/pi-actors/dist/lib/runs-execution-evidence.js +282 -0
  60. package/node_modules/@llblab/pi-actors/dist/lib/runs-index.d.ts +66 -1
  61. package/node_modules/@llblab/pi-actors/dist/lib/runs-index.js +349 -13
  62. package/node_modules/@llblab/pi-actors/dist/lib/runs-native-launches.d.ts +73 -0
  63. package/node_modules/@llblab/pi-actors/dist/lib/runs-native-launches.js +227 -0
  64. package/node_modules/@llblab/pi-actors/dist/lib/runs-outcomes.d.ts +141 -0
  65. package/node_modules/@llblab/pi-actors/dist/lib/runs-outcomes.js +292 -0
  66. package/node_modules/@llblab/pi-actors/dist/lib/runs-ownership.d.ts +10 -1
  67. package/node_modules/@llblab/pi-actors/dist/lib/runs-ownership.js +36 -4
  68. package/node_modules/@llblab/pi-actors/dist/lib/runs-process-windows-mi.d.ts +46 -0
  69. package/node_modules/@llblab/pi-actors/dist/lib/runs-process-windows-mi.js +114 -0
  70. package/node_modules/@llblab/pi-actors/dist/lib/runs-process.d.ts +34 -1
  71. package/node_modules/@llblab/pi-actors/dist/lib/runs-process.js +158 -26
  72. package/node_modules/@llblab/pi-actors/dist/lib/runs-results.d.ts +116 -0
  73. package/node_modules/@llblab/pi-actors/dist/lib/runs-results.js +518 -0
  74. package/node_modules/@llblab/pi-actors/dist/lib/runs-retention.d.ts +15 -2
  75. package/node_modules/@llblab/pi-actors/dist/lib/runs-retention.js +148 -9
  76. package/node_modules/@llblab/pi-actors/dist/lib/runs-session-exports.d.ts +95 -0
  77. package/node_modules/@llblab/pi-actors/dist/lib/runs-session-exports.js +470 -0
  78. package/node_modules/@llblab/pi-actors/dist/lib/runs-snapshot.d.ts +58 -0
  79. package/node_modules/@llblab/pi-actors/dist/lib/runs-snapshot.js +92 -0
  80. package/node_modules/@llblab/pi-actors/dist/lib/runs-start.d.ts +2 -0
  81. package/node_modules/@llblab/pi-actors/dist/lib/runs-start.js +44 -3
  82. package/node_modules/@llblab/pi-actors/dist/lib/runs-status.d.ts +15 -1
  83. package/node_modules/@llblab/pi-actors/dist/lib/runs-status.js +337 -13
  84. package/node_modules/@llblab/pi-actors/dist/lib/runs-supervision.d.ts +105 -0
  85. package/node_modules/@llblab/pi-actors/dist/lib/runs-supervision.js +501 -0
  86. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.d.ts +1 -0
  87. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.js +14 -3
  88. package/node_modules/@llblab/pi-actors/dist/lib/runtime.js +22 -3
  89. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.d.ts +37 -0
  90. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.js +59 -3
  91. package/node_modules/@llblab/pi-actors/dist/lib/state-readers.d.ts +4 -1
  92. package/node_modules/@llblab/pi-actors/dist/lib/state-readers.js +14 -8
  93. package/node_modules/@llblab/pi-actors/dist/lib/temp.d.ts +2 -4
  94. package/node_modules/@llblab/pi-actors/dist/lib/temp.js +4 -56
  95. package/node_modules/@llblab/pi-actors/dist/lib/tools-access.d.ts +3 -0
  96. package/node_modules/@llblab/pi-actors/dist/lib/tools-access.js +13 -0
  97. package/node_modules/@llblab/pi-actors/dist/lib/tools-inspect.d.ts +1 -0
  98. package/node_modules/@llblab/pi-actors/dist/lib/tools-inspect.js +110 -43
  99. package/node_modules/@llblab/pi-actors/dist/lib/tools-local.d.ts +3 -0
  100. package/node_modules/@llblab/pi-actors/dist/lib/tools-local.js +18 -6
  101. package/node_modules/@llblab/pi-actors/dist/lib/tools-message.d.ts +4 -1
  102. package/node_modules/@llblab/pi-actors/dist/lib/tools-message.js +126 -31
  103. package/node_modules/@llblab/pi-actors/dist/lib/tools-response.d.ts +31 -3
  104. package/node_modules/@llblab/pi-actors/dist/lib/tools-response.js +311 -47
  105. package/node_modules/@llblab/pi-actors/dist/lib/tools-spawn.d.ts +3 -0
  106. package/node_modules/@llblab/pi-actors/dist/lib/tools-spawn.js +29 -7
  107. package/node_modules/@llblab/pi-actors/dist/lib/trace-projection.d.ts +20 -0
  108. package/node_modules/@llblab/pi-actors/dist/lib/trace-projection.js +192 -43
  109. package/node_modules/@llblab/pi-actors/dist/scripts/async-runner.mjs +272 -194
  110. package/node_modules/@llblab/pi-actors/dist/scripts/conformance.mjs +14 -2
  111. package/node_modules/@llblab/pi-actors/dist/skills/actors/SKILL.md +46 -2
  112. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/diagnostics.md +40 -0
  113. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/runs.md +55 -1
  114. package/node_modules/@llblab/pi-actors/docs/README.md +9 -1
  115. package/node_modules/@llblab/pi-actors/docs/actor-inspector.md +84 -15
  116. package/node_modules/@llblab/pi-actors/docs/agent-experience.md +216 -0
  117. package/node_modules/@llblab/pi-actors/docs/async-runs.md +18 -2
  118. package/node_modules/@llblab/pi-actors/docs/composition-transport.md +103 -0
  119. package/node_modules/@llblab/pi-actors/docs/coordinator-delivery.md +204 -4
  120. package/node_modules/@llblab/pi-actors/docs/inspection.md +38 -2
  121. package/node_modules/@llblab/pi-actors/docs/output-projection-map.md +130 -0
  122. package/node_modules/@llblab/pi-actors/docs/releasing.md +19 -2
  123. package/node_modules/@llblab/pi-actors/docs/run-supervision.md +1622 -0
  124. package/node_modules/@llblab/pi-actors/docs/template-recipes.md +4 -0
  125. package/node_modules/@llblab/pi-actors/docs/windows-process-observation.md +248 -0
  126. package/node_modules/@llblab/pi-actors/index.ts +1 -1
  127. package/node_modules/@llblab/pi-actors/lib/async-runs.ts +164 -73
  128. package/node_modules/@llblab/pi-actors/lib/automatic-review-runtime.ts +4 -2
  129. package/node_modules/@llblab/pi-actors/lib/command-templates.ts +287 -138
  130. package/node_modules/@llblab/pi-actors/lib/execution-files.ts +118 -0
  131. package/node_modules/@llblab/pi-actors/lib/execution-output.ts +4 -4
  132. package/node_modules/@llblab/pi-actors/lib/execution-sessions.ts +57 -27
  133. package/node_modules/@llblab/pi-actors/lib/execution.ts +8 -0
  134. package/node_modules/@llblab/pi-actors/lib/extension-runtime.ts +102 -12
  135. package/node_modules/@llblab/pi-actors/lib/file-state.ts +16 -2
  136. package/node_modules/@llblab/pi-actors/lib/inspector-command.ts +2 -2
  137. package/node_modules/@llblab/pi-actors/lib/inspector-overlay.ts +524 -261
  138. package/node_modules/@llblab/pi-actors/lib/inspector.ts +101 -130
  139. package/node_modules/@llblab/pi-actors/lib/limits.ts +1 -0
  140. package/node_modules/@llblab/pi-actors/lib/observability.ts +235 -116
  141. package/node_modules/@llblab/pi-actors/lib/pi.ts +59 -11
  142. package/node_modules/@llblab/pi-actors/lib/recipe-projection.ts +232 -0
  143. package/node_modules/@llblab/pi-actors/lib/recipes-context.ts +27 -6
  144. package/node_modules/@llblab/pi-actors/lib/registry.ts +266 -36
  145. package/node_modules/@llblab/pi-actors/lib/run-delivery.ts +1737 -49
  146. package/node_modules/@llblab/pi-actors/lib/run-supervision.ts +411 -0
  147. package/node_modules/@llblab/pi-actors/lib/run-ui-runtime.ts +237 -73
  148. package/node_modules/@llblab/pi-actors/lib/runs-artifacts.ts +73 -1
  149. package/node_modules/@llblab/pi-actors/lib/runs-context-exports.ts +1871 -0
  150. package/node_modules/@llblab/pi-actors/lib/runs-context-index.ts +372 -0
  151. package/node_modules/@llblab/pi-actors/lib/runs-control-delivery.ts +36 -18
  152. package/node_modules/@llblab/pi-actors/lib/runs-control.ts +297 -1
  153. package/node_modules/@llblab/pi-actors/lib/runs-controls.ts +3 -1
  154. package/node_modules/@llblab/pi-actors/lib/runs-descendant-launches.ts +338 -0
  155. package/node_modules/@llblab/pi-actors/lib/runs-execution-evidence.ts +302 -0
  156. package/node_modules/@llblab/pi-actors/lib/runs-index.ts +345 -17
  157. package/node_modules/@llblab/pi-actors/lib/runs-native-launches.ts +270 -0
  158. package/node_modules/@llblab/pi-actors/lib/runs-outcomes.ts +377 -0
  159. package/node_modules/@llblab/pi-actors/lib/runs-ownership.ts +37 -4
  160. package/node_modules/@llblab/pi-actors/lib/runs-process-windows-mi.ts +113 -0
  161. package/node_modules/@llblab/pi-actors/lib/runs-process.ts +210 -34
  162. package/node_modules/@llblab/pi-actors/lib/runs-results.ts +601 -0
  163. package/node_modules/@llblab/pi-actors/lib/runs-retention.ts +134 -10
  164. package/node_modules/@llblab/pi-actors/lib/runs-session-exports.ts +406 -0
  165. package/node_modules/@llblab/pi-actors/lib/runs-snapshot.ts +143 -0
  166. package/node_modules/@llblab/pi-actors/lib/runs-start.ts +44 -2
  167. package/node_modules/@llblab/pi-actors/lib/runs-status.ts +252 -10
  168. package/node_modules/@llblab/pi-actors/lib/runs-supervision.ts +394 -0
  169. package/node_modules/@llblab/pi-actors/lib/runs-trace.ts +14 -3
  170. package/node_modules/@llblab/pi-actors/lib/runtime.ts +22 -3
  171. package/node_modules/@llblab/pi-actors/lib/session-evidence.ts +76 -4
  172. package/node_modules/@llblab/pi-actors/lib/state-readers.ts +16 -7
  173. package/node_modules/@llblab/pi-actors/lib/temp.ts +3 -56
  174. package/node_modules/@llblab/pi-actors/lib/tools-access.ts +13 -0
  175. package/node_modules/@llblab/pi-actors/lib/tools-inspect.ts +110 -51
  176. package/node_modules/@llblab/pi-actors/lib/tools-local.ts +37 -24
  177. package/node_modules/@llblab/pi-actors/lib/tools-message.ts +120 -37
  178. package/node_modules/@llblab/pi-actors/lib/tools-response.ts +273 -50
  179. package/node_modules/@llblab/pi-actors/lib/tools-spawn.ts +31 -10
  180. package/node_modules/@llblab/pi-actors/lib/trace-projection.ts +165 -42
  181. package/node_modules/@llblab/pi-actors/package.json +10 -6
  182. package/node_modules/@llblab/pi-actors/scripts/async-runner.mjs +272 -194
  183. package/node_modules/@llblab/pi-actors/scripts/conformance.mjs +14 -2
  184. package/node_modules/@llblab/pi-actors/skills/actors/SKILL.md +46 -2
  185. package/node_modules/@llblab/pi-actors/skills/actors/references/diagnostics.md +40 -0
  186. package/node_modules/@llblab/pi-actors/skills/actors/references/runs.md +55 -1
  187. package/node_modules/yaml/LICENSE +13 -0
  188. package/node_modules/yaml/README.md +172 -0
  189. package/node_modules/yaml/bin.mjs +11 -0
  190. package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  191. package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  192. package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  193. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  194. package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
  195. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  196. package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  197. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  198. package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  199. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  200. package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
  201. package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  202. package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  203. package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  204. package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  205. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  206. package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  207. package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  208. package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  209. package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  210. package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  211. package/node_modules/yaml/browser/dist/errors.js +57 -0
  212. package/node_modules/yaml/browser/dist/index.js +17 -0
  213. package/node_modules/yaml/browser/dist/log.js +11 -0
  214. package/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
  215. package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  216. package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  217. package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  218. package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  219. package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  220. package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  221. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  222. package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  223. package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  224. package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  225. package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  226. package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  227. package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  228. package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
  229. package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  230. package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
  231. package/node_modules/yaml/browser/dist/public-api.js +102 -0
  232. package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  233. package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  234. package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  235. package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  236. package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  237. package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  238. package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  239. package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  240. package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  241. package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  242. package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  243. package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  244. package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  245. package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  246. package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  247. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
  248. package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  249. package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  250. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  251. package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  252. package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  253. package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  254. package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  255. package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  256. package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  257. package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  258. package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
  259. package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  260. package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  261. package/node_modules/yaml/browser/dist/util.js +11 -0
  262. package/node_modules/yaml/browser/dist/visit.js +233 -0
  263. package/node_modules/yaml/browser/index.js +5 -0
  264. package/node_modules/yaml/browser/package.json +3 -0
  265. package/node_modules/yaml/dist/cli.d.ts +8 -0
  266. package/node_modules/yaml/dist/cli.mjs +201 -0
  267. package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  268. package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  269. package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  270. package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  271. package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  272. package/node_modules/yaml/dist/compose/compose-node.js +112 -0
  273. package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  274. package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  275. package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  276. package/node_modules/yaml/dist/compose/composer.js +224 -0
  277. package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  278. package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  279. package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  280. package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  281. package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  282. package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  283. package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  284. package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  285. package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  286. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  287. package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  288. package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
  289. package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  290. package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  291. package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  292. package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  293. package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  294. package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  295. package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  296. package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  297. package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  298. package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  299. package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  300. package/node_modules/yaml/dist/doc/Document.js +337 -0
  301. package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  302. package/node_modules/yaml/dist/doc/anchors.js +76 -0
  303. package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  304. package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  305. package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  306. package/node_modules/yaml/dist/doc/createNode.js +90 -0
  307. package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  308. package/node_modules/yaml/dist/doc/directives.js +178 -0
  309. package/node_modules/yaml/dist/errors.d.ts +21 -0
  310. package/node_modules/yaml/dist/errors.js +62 -0
  311. package/node_modules/yaml/dist/index.d.ts +25 -0
  312. package/node_modules/yaml/dist/index.js +50 -0
  313. package/node_modules/yaml/dist/log.d.ts +3 -0
  314. package/node_modules/yaml/dist/log.js +19 -0
  315. package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  316. package/node_modules/yaml/dist/nodes/Alias.js +118 -0
  317. package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  318. package/node_modules/yaml/dist/nodes/Collection.js +151 -0
  319. package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  320. package/node_modules/yaml/dist/nodes/Node.js +40 -0
  321. package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  322. package/node_modules/yaml/dist/nodes/Pair.js +39 -0
  323. package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
  324. package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  325. package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  326. package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  327. package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  328. package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  329. package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  330. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  331. package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  332. package/node_modules/yaml/dist/nodes/identity.js +53 -0
  333. package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  334. package/node_modules/yaml/dist/nodes/toJS.js +39 -0
  335. package/node_modules/yaml/dist/options.d.ts +350 -0
  336. package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  337. package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  338. package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  339. package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  340. package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  341. package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  342. package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  343. package/node_modules/yaml/dist/parse/cst.js +112 -0
  344. package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  345. package/node_modules/yaml/dist/parse/lexer.js +723 -0
  346. package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  347. package/node_modules/yaml/dist/parse/line-counter.js +41 -0
  348. package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  349. package/node_modules/yaml/dist/parse/parser.js +980 -0
  350. package/node_modules/yaml/dist/public-api.d.ts +44 -0
  351. package/node_modules/yaml/dist/public-api.js +107 -0
  352. package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  353. package/node_modules/yaml/dist/schema/Schema.js +39 -0
  354. package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  355. package/node_modules/yaml/dist/schema/common/map.js +19 -0
  356. package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  357. package/node_modules/yaml/dist/schema/common/null.js +17 -0
  358. package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  359. package/node_modules/yaml/dist/schema/common/seq.js +19 -0
  360. package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  361. package/node_modules/yaml/dist/schema/common/string.js +16 -0
  362. package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  363. package/node_modules/yaml/dist/schema/core/bool.js +21 -0
  364. package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  365. package/node_modules/yaml/dist/schema/core/float.js +47 -0
  366. package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  367. package/node_modules/yaml/dist/schema/core/int.js +42 -0
  368. package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  369. package/node_modules/yaml/dist/schema/core/schema.js +25 -0
  370. package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  371. package/node_modules/yaml/dist/schema/json/schema.js +64 -0
  372. package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  373. package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  374. package/node_modules/yaml/dist/schema/tags.js +99 -0
  375. package/node_modules/yaml/dist/schema/types.d.ts +92 -0
  376. package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  377. package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  378. package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  379. package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  380. package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  381. package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  382. package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  383. package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  384. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  385. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
  386. package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  387. package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  388. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  389. package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  390. package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  391. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  392. package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  393. package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  394. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  395. package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  396. package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  397. package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  398. package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  399. package/node_modules/yaml/dist/stringify/stringify.js +132 -0
  400. package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  401. package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  402. package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  403. package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  404. package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  405. package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  406. package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  407. package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
  408. package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  409. package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  410. package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  411. package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  412. package/node_modules/yaml/dist/test-events.d.ts +4 -0
  413. package/node_modules/yaml/dist/test-events.js +134 -0
  414. package/node_modules/yaml/dist/util.d.ts +16 -0
  415. package/node_modules/yaml/dist/util.js +28 -0
  416. package/node_modules/yaml/dist/visit.d.ts +102 -0
  417. package/node_modules/yaml/dist/visit.js +236 -0
  418. package/node_modules/yaml/package.json +97 -0
  419. package/node_modules/yaml/util.js +2 -0
  420. package/package.json +2 -2
  421. package/node_modules/@llblab/pi-actors/banner.jpg +0 -0
  422. package/node_modules/@llblab/pi-actors/dist/lib/inspector-actions.d.ts +0 -16
  423. package/node_modules/@llblab/pi-actors/dist/lib/inspector-actions.js +0 -57
  424. package/node_modules/@llblab/pi-actors/lib/inspector-actions.ts +0 -79
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Run result-producer admission and natural terminal publication.
3
+ * Owns: producer authority, work/scoped evidence admission, first-result source bindings and natural-acceptance timing eligibility.
4
+ * Excludes: workload execution, stop-request admission, process/tree proof, and delivery.
5
+ */
6
+ import type { ChildProcess } from "node:child_process";
7
+ import { type CommandTemplateAttemptReceipt, type CommandTemplateManagedAttempt } from "./command-templates.ts";
8
+ import { type RunDescendantLaunchIntent, type RunDescendantLaunchRequest } from "./runs-descendant-launches.ts";
9
+ import { type RunNativeLaunchBirth, type RunNativeLaunchIntent, type RunNativeLaunchRequest, type RunNativeLaunchCloseSettlement } from "./runs-native-launches.ts";
10
+ import { type RunResultDiagnosticCandidate, type RunResultDiagnosticsBinding, type RunPrimaryTextBinding, type RunArtifactInventoryBinding } from "./runs-outcomes.ts";
11
+ import { type SpawnIdentityCaptureDeps } from "./runs-process.ts";
12
+ import { type AppendTraceEventInput } from "./runs-trace.ts";
13
+ export interface RunResultProducer {
14
+ readonly run: string;
15
+ readonly runInstanceId: string;
16
+ readonly ownerId?: string;
17
+ readonly pid: number;
18
+ readonly processIdentityDigest?: string;
19
+ }
20
+ /** Immutable admission capture, copied on read. Metadata cannot reconstruct its genuine producer key. */
21
+ export declare function readRunProducerCapturedMetadata(producer: RunResultProducer, maxBytes: number): Record<string, unknown> | undefined;
22
+ export interface RunProducerCleanupFailure {
23
+ readonly status: "release_unproven";
24
+ readonly error_code: string;
25
+ }
26
+ /** Runtime-local diagnostics only; absence is not proof that a lifecycle lock was released. */
27
+ export declare function readRunProducerCleanupFailure(producer: RunResultProducer): Readonly<RunProducerCleanupFailure> | undefined;
28
+ /** Kernel lifecycle composition only; a child preparation's cleanup failure fences its genuine parent producer. */
29
+ export declare function reportRunProducerCleanupFailure(producer: RunResultProducer, error: unknown): void;
30
+ /** Opaque, synchronous first-result source admission; copied markers cannot recreate it. */
31
+ export interface RunResultDiagnosticsAdmission {
32
+ readonly kernel_only: true;
33
+ }
34
+ /** Runtime-local timing eligibility only; the marker/serialized data is not authority. */
35
+ export interface RunNaturalResultTimingAdmission {
36
+ readonly kernel_only: true;
37
+ }
38
+ export interface RunNaturalResultTimingAcceptance {
39
+ readonly state: "available";
40
+ readonly identity: Readonly<{
41
+ run: string;
42
+ run_instance_id: string;
43
+ ownerId?: string;
44
+ }>;
45
+ readonly code: number;
46
+ readonly recorded_status: "done" | "failed";
47
+ readonly completed_at: string;
48
+ readonly acceptance: "natural";
49
+ readonly timing: "not_asserted";
50
+ }
51
+ export type RunNaturalResultTimingAcceptanceReading = Readonly<RunNaturalResultTimingAcceptance> | {
52
+ readonly state: "unavailable";
53
+ readonly reason: "admission_invalid" | "admission_mismatch";
54
+ };
55
+ export interface RunResultPublicationOptions {
56
+ /** Invocation-local trusted kernel port; source preparation/publication must already be complete. */
57
+ primaryText?: () => Readonly<RunPrimaryTextBinding>;
58
+ /** Kernel-captured metadata source, prepared before result admission; never an actor result field. */
59
+ artifactInventory?: () => Readonly<RunArtifactInventoryBinding>;
60
+ /** First-winner source publication only, with a runtime-local candidate admission under the existing lock. */
61
+ resultDiagnostics?: (admission: RunResultDiagnosticsAdmission) => Readonly<RunResultDiagnosticsBinding>;
62
+ /** Natural-only postcommit event, before Trace. No clock/origin/sample, body, work or frozen timing authority. */
63
+ naturalResultTiming?: (admission: RunNaturalResultTimingAdmission) => void;
64
+ /** Synchronous evidence updates, only after producer and first-result admission. */
65
+ prepare?: (context: {
66
+ stopping: boolean;
67
+ }) => void;
68
+ trace?: AppendTraceEventInput;
69
+ /** Contention instrumentation must not mutate Run state before revalidation. */
70
+ onLockContention?: () => void;
71
+ }
72
+ export declare function admitRunResultProducer(stateDir: string): {
73
+ meta: Record<string, unknown>;
74
+ producer: RunResultProducer;
75
+ };
76
+ /** Revalidate only inside this producer's exact synchronous work callback; never a new work permission. */
77
+ export declare function revalidateRunWorkAdmission(stateDir: string, producer: RunResultProducer): void;
78
+ /**
79
+ * Synchronous kernel preparation/native launch only. Never await workload or inference under this lock.
80
+ * Runtime-local authority retains its native fingerprint without OS reprobes; a live self-PID cannot recycle.
81
+ * Separate child-Run admission and complete owned-scope receipts remain with their lifecycle owners.
82
+ */
83
+ export declare function withRunWorkAdmission<T>(stateDir: string, producer: RunResultProducer, admit: () => T, options?: Pick<RunResultPublicationOptions, "onLockContention">): T;
84
+ /**
85
+ * Declared intent only, not a child-start capability or membership receipt.
86
+ * Run synchronous kernel preparation after persistence; never await workload/inference here.
87
+ */
88
+ export declare function withRunDescendantIntentAdmission<T>(stateDir: string, producer: RunResultProducer, request: RunDescendantLaunchRequest, prepare: (intent: Readonly<RunDescendantLaunchIntent>) => T, options?: Pick<RunResultPublicationOptions, "onLockContention">): T;
89
+ export interface RunDescendantReconciliationResult {
90
+ readonly status: "recorded" | "already_recorded";
91
+ readonly intent: Readonly<RunDescendantLaunchIntent>;
92
+ }
93
+ /** Same-runtime evidence repair only: never spawn, reconstruct a producer, reopen work, or release scope fences. */
94
+ export declare function reconcileRunDescendantPreparation(stateDir: string, producer: RunResultProducer, request: RunDescendantLaunchRequest, options?: Pick<RunResultPublicationOptions, "onLockContention">): Readonly<RunDescendantReconciliationResult>;
95
+ /** Called only by the executor's synchronous managed observer inside this native launch admission. */
96
+ export declare function bindRunNativeLaunchProcess(stateDir: string, producer: RunResultProducer, intent: Readonly<RunNativeLaunchIntent>, context: CommandTemplateManagedAttempt, deps?: SpawnIdentityCaptureDeps): Readonly<RunNativeLaunchBirth>;
97
+ /** Actual direct-process close only; recording while stopping never grants whole-scope terminal authority. */
98
+ export declare function recordRunNativeLaunchSettlement(stateDir: string, producer: RunResultProducer, intent: Readonly<RunNativeLaunchIntent>, receipt: CommandTemplateAttemptReceipt, options?: Pick<RunResultPublicationOptions, "onLockContention">): Readonly<RunNativeLaunchCloseSettlement>;
99
+ /**
100
+ * Private native launch primitive: retain admission before invoking the synchronous factory.
101
+ * Journal writes precede the factory; lifecycle cleanup failure is retained separately, never replacing its outcome.
102
+ * A throw retains uncertainty, never rollback or proof that no child was born.
103
+ * Runner wiring requires crash/reuse fences and birth/member proof; this receipt alone grants no stop authority.
104
+ */
105
+ export declare function withRunNativeLaunchAdmission(stateDir: string, producer: RunResultProducer, request: RunNativeLaunchRequest, start: (intent: Readonly<RunNativeLaunchIntent>) => ChildProcess, options?: Pick<RunResultPublicationOptions, "onLockContention">): ChildProcess;
106
+ /** Synchronous evidence writes only, including while stopping; this never grants work or terminal authority. */
107
+ export declare function withRunProducerEvidence<T>(stateDir: string, producer: RunResultProducer, record: (context: {
108
+ readonly status: "running" | "stopping" | "done" | "failed";
109
+ }) => T, options?: Pick<RunResultPublicationOptions, "onLockContention">): T;
110
+ /** Evidence only within the exact active first-result callback, never nested lock/work/result authority. */
111
+ export declare function withRunResultDiagnosticsAdmission<T>(stateDir: string, producer: RunResultProducer, admission: RunResultDiagnosticsAdmission, record: (candidate: RunResultDiagnosticCandidate) => T): T;
112
+ /** Exact active first-natural callback only; never reacquires the already-held lifecycle lock. */
113
+ export declare function withRunNaturalResultTimingAdmission<T>(stateDir: string, producer: RunResultProducer, admission: RunNaturalResultTimingAdmission, record: (acceptance: Readonly<RunNaturalResultTimingAcceptance>) => T): T;
114
+ /** Pure historical acceptance receipt, not a current-file/status fence, elapsed sample or timing authority. */
115
+ export declare function readRunNaturalResultTimingAcceptance(stateDir: string, producer: RunResultProducer, admission: unknown): Readonly<RunNaturalResultTimingAcceptanceReading>;
116
+ export declare function publishRunResult(stateDir: string, producer: RunResultProducer, result: Record<string, unknown>, options?: RunResultPublicationOptions): boolean;
@@ -0,0 +1,518 @@
1
+ /**
2
+ * Run result-producer admission and natural terminal publication.
3
+ * Owns: producer authority, work/scoped evidence admission, first-result source bindings and natural-acceptance timing eligibility.
4
+ * Excludes: workload execution, stop-request admission, process/tree proof, and delivery.
5
+ */
6
+ import { lstatSync, readFileSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { types as UtilTypes } from "node:util";
9
+ import { readPendingCommandSpawnAdmission, requireFreshManagedCommandAttempt, requireNativeCommandAttemptClose } from "./command-templates.js";
10
+ import { writeJsonAtomic } from "./file-state.js";
11
+ import { assertRunDescendantPreparedMetadata, readRunDescendantLaunchLedger, readRunDescendantPreparation, recordRunDescendantLaunchIntentUnderLock, resolveRunDescendantLaunchTarget } from "./runs-descendant-launches.js";
12
+ import { recordRunNativeLaunchBirthUnderLock, recordRunNativeLaunchIntentUnderLock, recordRunNativeLaunchSettlementUnderLock } from "./runs-native-launches.js";
13
+ import { readRunNaturalOutcome, readRunStopClaim, RUN_OUTCOME_PROTOCOL, RUN_PRIMARY_TEXT_PROTOCOL, RUN_ARTIFACT_INVENTORY_PROTOCOL, decodeRunPrimaryTextBinding, decodeRunArtifactInventoryBinding, RUN_RESULT_DIAGNOSTICS_PROTOCOL, RUN_RESULT_DIAGNOSTIC_FIELDS, decodeRunResultDiagnosticsBinding } from "./runs-outcomes.js";
14
+ import { assertDistinctRunStateDirectories, assertOwnedRunStateDirectory, readOwnedRunStateDirectory } from "./runs-ownership.js";
15
+ import { captureSpawnedNativeProcessIdentity, runProcessIdentityDigest, verifyRunProcessIdentity } from "./runs-process.js";
16
+ import { acquireStateStartLock } from "./runs-start.js";
17
+ import { appendRunTraceEvent } from "./runs-trace.js";
18
+ const admittedProducers = new WeakMap();
19
+ /** Immutable admission capture, copied on read. Metadata cannot reconstruct its genuine producer key. */
20
+ export function readRunProducerCapturedMetadata(producer, maxBytes) {
21
+ const captured = admittedProducers.get(producer);
22
+ if (captured === undefined)
23
+ throw new Error("Run producer requires an identity admitted by this runtime.");
24
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 1)
25
+ throw new Error("Run producer metadata read budget is invalid.");
26
+ return Buffer.byteLength(captured) <= maxBytes ? JSON.parse(captured) : undefined;
27
+ }
28
+ const cleanupFailures = new WeakMap();
29
+ /** Runtime-local diagnostics only; absence is not proof that a lifecycle lock was released. */
30
+ export function readRunProducerCleanupFailure(producer) {
31
+ return cleanupFailures.get(producer);
32
+ }
33
+ function requireProducerCleanupAvailable(producer) {
34
+ if (cleanupFailures.has(producer))
35
+ throw new Error("Run producer lifecycle cleanup remains unproven.");
36
+ }
37
+ function retainProducerCleanupFailure(producer, error) {
38
+ if (cleanupFailures.has(producer))
39
+ return;
40
+ let code = "UNKNOWN";
41
+ try {
42
+ const value = error?.code;
43
+ if (typeof value === "string" && /^[A-Z0-9_]{1,64}$/.exec(value)?.[0] === value)
44
+ code = value;
45
+ }
46
+ catch { /* An error getter must not replace the protected factory outcome. */ }
47
+ cleanupFailures.set(producer, Object.freeze({ status: "release_unproven", error_code: code }));
48
+ try {
49
+ console.error("Run producer lifecycle cleanup failed; release remains unproven and further producer operations are fenced.");
50
+ }
51
+ catch { /* Diagnostics must not replace the protected factory outcome. */ }
52
+ }
53
+ /** Kernel lifecycle composition only; a child preparation's cleanup failure fences its genuine parent producer. */
54
+ export function reportRunProducerCleanupFailure(producer, error) {
55
+ if (!admittedProducers.has(producer))
56
+ throw new Error("Run producer requires an identity admitted by this runtime.");
57
+ retainProducerCleanupFailure(producer, error);
58
+ }
59
+ /** Refuse deferred kernel completions without awaiting or reading custom then/catch properties. */
60
+ function requireSynchronousResultCallback(value, message) {
61
+ if (UtilTypes.isPromise(value)) {
62
+ void Promise.prototype.then.call(value, undefined, () => { });
63
+ throw new Error(message);
64
+ }
65
+ if (value && (typeof value === "object" || typeof value === "function") && "then" in value)
66
+ throw new Error(message);
67
+ }
68
+ const diagnosticAdmissions = new WeakMap();
69
+ const naturalTimingAdmissions = new WeakMap();
70
+ function requireIdentity(identity) {
71
+ if (!identity || typeof identity.run !== "string" || !identity.run ||
72
+ typeof identity.runInstanceId !== "string" || !identity.runInstanceId) {
73
+ throw new Error("Run result publication requires a captured Run and generation.");
74
+ }
75
+ }
76
+ function requireNoNativeProducerContradiction(meta) {
77
+ const proof = verifyRunProcessIdentity(process.pid, meta.process_identity);
78
+ if (proof.status === "owner_mismatch" || proof.status === "dead_pid") {
79
+ throw new Error("Run result producer process identity changed.");
80
+ }
81
+ // Unavailable native proof preserves exact self-PID legacy binding, never forced-stop authority.
82
+ }
83
+ function readProducerMeta(stateDir, run) {
84
+ const canonical = assertOwnedRunStateDirectory(stateDir, run);
85
+ const path = join(canonical, "run.json");
86
+ let meta;
87
+ try {
88
+ if (!lstatSync(path).isFile())
89
+ throw new Error("Not a regular metadata file.");
90
+ meta = JSON.parse(readFileSync(path, "utf8"));
91
+ }
92
+ catch {
93
+ throw new Error("Run result producer metadata is unavailable or invalid.");
94
+ }
95
+ if (!meta || typeof meta !== "object" || Array.isArray(meta)) {
96
+ throw new Error("Run result producer metadata is unavailable or invalid.");
97
+ }
98
+ const record = meta;
99
+ if (record.run !== run || record.state_dir !== canonical) {
100
+ throw new Error("Run result producer state identity changed.");
101
+ }
102
+ if (typeof record.run_instance_id !== "string" || !record.run_instance_id ||
103
+ !Number.isSafeInteger(record.pid) || Number(record.pid) <= 0 ||
104
+ (record.ownerId !== undefined && (typeof record.ownerId !== "string" || !record.ownerId))) {
105
+ throw new Error("Run result producer identity is unavailable or invalid.");
106
+ }
107
+ return record;
108
+ }
109
+ function readCapturedProducerMeta(stateDir, producer) {
110
+ const meta = readProducerMeta(stateDir, producer.run);
111
+ if (meta.run_instance_id !== producer.runInstanceId)
112
+ throw new Error("Run result producer generation changed.");
113
+ if (meta.ownerId !== producer.ownerId)
114
+ throw new Error("Run result producer owner changed.");
115
+ if (meta.pid !== producer.pid || producer.pid !== process.pid) {
116
+ throw new Error("Run result producer process changed.");
117
+ }
118
+ if (runProcessIdentityDigest(meta.process_identity) !== producer.processIdentityDigest) {
119
+ throw new Error("Run result producer process identity changed.");
120
+ }
121
+ if (meta.outcome_protocol !== RUN_OUTCOME_PROTOCOL)
122
+ throw new Error("Run outcome protocol changed.");
123
+ return meta;
124
+ }
125
+ function assertRunWorkAdmitted(stateDir, meta) {
126
+ const stop = readRunStopClaim(stateDir, meta);
127
+ if (stop.state === "pending" || stop.state === "invalid") {
128
+ throw new Error("Run work admission is stopping or unproven.");
129
+ }
130
+ try {
131
+ lstatSync(join(stateDir, "result.json"));
132
+ throw new Error("Run work admission is terminal or unproven.");
133
+ }
134
+ catch (error) {
135
+ if (error.code !== "ENOENT")
136
+ throw error;
137
+ }
138
+ }
139
+ export function admitRunResultProducer(stateDir) {
140
+ const release = acquireStateStartLock(stateDir);
141
+ try {
142
+ const owned = readOwnedRunStateDirectory(stateDir);
143
+ const meta = readProducerMeta(owned.stateDir, owned.run);
144
+ if (meta.pid !== process.pid)
145
+ throw new Error("Run result producer process changed.");
146
+ requireNoNativeProducerContradiction(meta);
147
+ assertRunWorkAdmitted(owned.stateDir, meta);
148
+ if (meta.outcome_protocol === undefined) {
149
+ // A cached host may use the unchanged CLI; bind the protocol before any workload starts.
150
+ meta.outcome_protocol = RUN_OUTCOME_PROTOCOL;
151
+ writeJsonAtomic(join(owned.stateDir, "run.json"), meta);
152
+ }
153
+ if (meta.outcome_protocol !== RUN_OUTCOME_PROTOCOL)
154
+ throw new Error("Run outcome protocol is unsupported.");
155
+ const processIdentityDigest = runProcessIdentityDigest(meta.process_identity);
156
+ const producer = Object.freeze({
157
+ run: owned.run,
158
+ runInstanceId: String(meta.run_instance_id),
159
+ ...(typeof meta.ownerId === "string" ? { ownerId: meta.ownerId } : {}),
160
+ pid: process.pid,
161
+ ...(processIdentityDigest ? { processIdentityDigest } : {}),
162
+ });
163
+ admittedProducers.set(producer, JSON.stringify(meta));
164
+ return { meta, producer };
165
+ }
166
+ finally {
167
+ release();
168
+ }
169
+ }
170
+ function withAdmittedProducer(stateDir, producer, action, options) {
171
+ requireIdentity(producer);
172
+ if (!admittedProducers.has(producer))
173
+ throw new Error("Run producer requires an identity admitted by this runtime.");
174
+ requireProducerCleanupAvailable(producer);
175
+ const release = acquireStateStartLock(stateDir, { onContention: options.onLockContention });
176
+ try {
177
+ return action(readCapturedProducerMeta(stateDir, producer));
178
+ }
179
+ finally {
180
+ try {
181
+ release();
182
+ }
183
+ catch (error) {
184
+ retainProducerCleanupFailure(producer, error);
185
+ }
186
+ }
187
+ }
188
+ const activeWorkAdmissions = new WeakMap();
189
+ /** Revalidate only inside this producer's exact synchronous work callback; never a new work permission. */
190
+ export function revalidateRunWorkAdmission(stateDir, producer) {
191
+ if (activeWorkAdmissions.get(producer) !== stateDir) {
192
+ throw new Error("Run work revalidation requires its active runtime-local admission.");
193
+ }
194
+ requireProducerCleanupAvailable(producer);
195
+ assertRunWorkAdmitted(stateDir, readCapturedProducerMeta(stateDir, producer));
196
+ }
197
+ /**
198
+ * Synchronous kernel preparation/native launch only. Never await workload or inference under this lock.
199
+ * Runtime-local authority retains its native fingerprint without OS reprobes; a live self-PID cannot recycle.
200
+ * Separate child-Run admission and complete owned-scope receipts remain with their lifecycle owners.
201
+ */
202
+ export function withRunWorkAdmission(stateDir, producer, admit, options = {}) {
203
+ return withAdmittedProducer(stateDir, producer, (meta) => {
204
+ assertRunWorkAdmitted(stateDir, meta);
205
+ const previous = activeWorkAdmissions.get(producer);
206
+ activeWorkAdmissions.set(producer, stateDir);
207
+ try {
208
+ return admit();
209
+ }
210
+ finally {
211
+ if (previous === undefined)
212
+ activeWorkAdmissions.delete(producer);
213
+ else
214
+ activeWorkAdmissions.set(producer, previous);
215
+ }
216
+ }, options);
217
+ }
218
+ /**
219
+ * Declared intent only, not a child-start capability or membership receipt.
220
+ * Run synchronous kernel preparation after persistence; never await workload/inference here.
221
+ */
222
+ export function withRunDescendantIntentAdmission(stateDir, producer, request, prepare, options = {}) {
223
+ return withRunWorkAdmission(stateDir, producer, () => {
224
+ const intent = recordRunDescendantLaunchIntentUnderLock(stateDir, producer, request);
225
+ return prepare(intent);
226
+ }, options);
227
+ }
228
+ /** Same-runtime evidence repair only: never spawn, reconstruct a producer, reopen work, or release scope fences. */
229
+ export function reconcileRunDescendantPreparation(stateDir, producer, request, options = {}) {
230
+ return withRunProducerEvidence(stateDir, producer, () => {
231
+ const canonical = assertOwnedRunStateDirectory(stateDir, producer.run);
232
+ const child = resolveRunDescendantLaunchTarget(request, producer, canonical);
233
+ if (!child)
234
+ throw new Error("Run descendant launch identity or request is invalid.");
235
+ const readRecorded = () => {
236
+ const reading = readRunDescendantLaunchLedger(canonical, producer);
237
+ if (reading.state === "invalid")
238
+ throw new Error("Run descendant launch evidence is unavailable or invalid.");
239
+ const intent = reading.state === "available"
240
+ ? reading.ledger.intents.find((item) => item.child.run_instance_id === child.run_instance_id) : undefined;
241
+ if (intent && (intent.child.run !== child.run || intent.child.ownerId !== child.ownerId || intent.child.state_dir !== child.state_dir)) {
242
+ throw new Error("Run descendant preparation target changed.");
243
+ }
244
+ return intent?.preparation ? intent : undefined;
245
+ };
246
+ const accepted = readRecorded();
247
+ if (accepted)
248
+ return Object.freeze({ status: "already_recorded", intent: accepted });
249
+ assertDistinctRunStateDirectories(canonical, child.state_dir);
250
+ assertRunDescendantPreparedMetadata(child.state_dir, child);
251
+ const release = acquireStateStartLock(child.state_dir);
252
+ try {
253
+ requireProducerCleanupAvailable(producer);
254
+ readProducerEvidenceStatus(stateDir, readCapturedProducerMeta(stateDir, producer));
255
+ const existing = readRecorded();
256
+ if (existing)
257
+ return Object.freeze({ status: "already_recorded", intent: existing });
258
+ const parent = { run: producer.run, run_instance_id: producer.runInstanceId,
259
+ ...(producer.ownerId === undefined ? {} : { ownerId: producer.ownerId }), state_dir: canonical };
260
+ const preparation = readRunDescendantPreparation(child.state_dir, child, parent);
261
+ if (!preparation)
262
+ throw new Error("Run descendant preparation binding changed or is unavailable.");
263
+ const intent = recordRunDescendantLaunchIntentUnderLock(canonical, producer, {
264
+ run: child.run, runInstanceId: child.run_instance_id, ownerId: child.ownerId, stateDir: child.state_dir,
265
+ }, preparation);
266
+ return Object.freeze({ status: "recorded", intent });
267
+ }
268
+ finally {
269
+ try {
270
+ release();
271
+ }
272
+ catch (error) {
273
+ retainProducerCleanupFailure(producer, error);
274
+ }
275
+ }
276
+ }, options);
277
+ }
278
+ const activeNativeAdmissions = new WeakMap();
279
+ const observedNativeAttempts = new WeakSet();
280
+ const claimedNativeAdmissions = new WeakSet();
281
+ const boundNativeMembers = new WeakMap();
282
+ /** Called only by the executor's synchronous managed observer inside this native launch admission. */
283
+ export function bindRunNativeLaunchProcess(stateDir, producer, intent, context, deps = {}) {
284
+ const admission = activeNativeAdmissions.get(intent);
285
+ if (!admission || !admission.spawnAdmission || admission.producer !== producer || admission.stateDir !== stateDir || admission.attempted) {
286
+ throw new Error("Run native birth requires its active runtime-local launch admission.");
287
+ }
288
+ requireProducerCleanupAvailable(producer);
289
+ admission.attempted = true;
290
+ const managed = requireFreshManagedCommandAttempt(context, admission.spawnAdmission);
291
+ if (managed.attempt !== intent.attempt || observedNativeAttempts.has(managed)) {
292
+ throw new Error("Run native birth managed attempt changed or was already observed.");
293
+ }
294
+ observedNativeAttempts.add(managed);
295
+ readCapturedProducerMeta(stateDir, producer);
296
+ const identity = captureSpawnedNativeProcessIdentity(managed.process, deps);
297
+ if (!identity)
298
+ throw new Error("Run native launch process proof is unavailable.");
299
+ readCapturedProducerMeta(stateDir, producer);
300
+ requireFreshManagedCommandAttempt(context, admission.spawnAdmission);
301
+ const birth = recordRunNativeLaunchBirthUnderLock(stateDir, producer, intent, {
302
+ pid: managed.process.pid, observed_at: new Date().toISOString(), process_identity: identity,
303
+ });
304
+ boundNativeMembers.set(intent, { stateDir, producer, spawnAdmission: admission.spawnAdmission, process: managed.process, birth, attempted: false });
305
+ return birth;
306
+ }
307
+ /** Actual direct-process close only; recording while stopping never grants whole-scope terminal authority. */
308
+ export function recordRunNativeLaunchSettlement(stateDir, producer, intent, receipt, options = {}) {
309
+ const member = boundNativeMembers.get(intent);
310
+ if (!member || member.stateDir !== stateDir || member.producer !== producer || member.attempted) {
311
+ throw new Error("Run native settlement requires its runtime-local bound member.");
312
+ }
313
+ const close = requireNativeCommandAttemptClose(receipt, member.spawnAdmission, member.process);
314
+ if (close.pid !== member.birth.pid || receipt.attempt !== intent.attempt)
315
+ throw new Error("Run native settlement member changed.");
316
+ member.attempted = true;
317
+ return withRunProducerEvidence(stateDir, producer, () => {
318
+ requireNativeCommandAttemptClose(receipt, member.spawnAdmission, member.process);
319
+ return recordRunNativeLaunchSettlementUnderLock(stateDir, producer, {
320
+ intent, birth: member.birth, settlement: {
321
+ observed_at: new Date().toISOString(), native_exit_code: close.nativeExitCode, native_signal: close.nativeSignal,
322
+ },
323
+ });
324
+ }, options);
325
+ }
326
+ /**
327
+ * Private native launch primitive: retain admission before invoking the synchronous factory.
328
+ * Journal writes precede the factory; lifecycle cleanup failure is retained separately, never replacing its outcome.
329
+ * A throw retains uncertainty, never rollback or proof that no child was born.
330
+ * Runner wiring requires crash/reuse fences and birth/member proof; this receipt alone grants no stop authority.
331
+ */
332
+ export function withRunNativeLaunchAdmission(stateDir, producer, request, start, options = {}) {
333
+ return withRunWorkAdmission(stateDir, producer, () => {
334
+ const spawnAdmission = readPendingCommandSpawnAdmission();
335
+ if (spawnAdmission) {
336
+ if (claimedNativeAdmissions.has(spawnAdmission))
337
+ throw new Error("Run native spawn admission was already claimed.");
338
+ claimedNativeAdmissions.add(spawnAdmission);
339
+ }
340
+ const intent = recordRunNativeLaunchIntentUnderLock(stateDir, producer, request);
341
+ activeNativeAdmissions.set(intent, { stateDir, producer, spawnAdmission, attempted: false });
342
+ try {
343
+ return start(intent);
344
+ }
345
+ finally {
346
+ activeNativeAdmissions.delete(intent);
347
+ }
348
+ }, options);
349
+ }
350
+ function readProducerEvidenceStatus(stateDir, meta) {
351
+ const stop = readRunStopClaim(stateDir, meta);
352
+ const outcome = readRunNaturalOutcome(stateDir, meta);
353
+ if (outcome.state === "invalid")
354
+ throw new Error("Run evidence state is unavailable or invalid.");
355
+ return outcome.state === "accepted" ? outcome.status
356
+ : stop.state === "pending" || stop.state === "invalid" || outcome.state === "captured" ? "stopping" : "running";
357
+ }
358
+ /** Synchronous evidence writes only, including while stopping; this never grants work or terminal authority. */
359
+ export function withRunProducerEvidence(stateDir, producer, record, options = {}) {
360
+ return withAdmittedProducer(stateDir, producer, (meta) => {
361
+ return record(Object.freeze({ status: readProducerEvidenceStatus(stateDir, meta) }));
362
+ }, options);
363
+ }
364
+ /** Evidence only within the exact active first-result callback, never nested lock/work/result authority. */
365
+ export function withRunResultDiagnosticsAdmission(stateDir, producer, admission, record) {
366
+ const active = diagnosticAdmissions.get(admission);
367
+ if (!active || active.stateDir !== stateDir || active.producer !== producer || !admittedProducers.has(producer)) {
368
+ throw new Error("Run result diagnostics requires its active runtime-local admission.");
369
+ }
370
+ requireProducerCleanupAvailable(producer);
371
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
372
+ const value = record(active.candidate);
373
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
374
+ return value;
375
+ }
376
+ /** Exact active first-natural callback only; never reacquires the already-held lifecycle lock. */
377
+ export function withRunNaturalResultTimingAdmission(stateDir, producer, admission, record) {
378
+ const active = naturalTimingAdmissions.get(admission);
379
+ if (!active || !active.active || active.stateDir !== stateDir || active.producer !== producer || !admittedProducers.has(producer)) {
380
+ throw new Error("Run natural result timing requires its active runtime-local admission.");
381
+ }
382
+ requireProducerCleanupAvailable(producer);
383
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
384
+ const value = record(active.acceptance);
385
+ requireSynchronousResultCallback(value, "Run natural result timing admission must complete synchronously.");
386
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
387
+ return value;
388
+ }
389
+ /** Pure historical acceptance receipt, not a current-file/status fence, elapsed sample or timing authority. */
390
+ export function readRunNaturalResultTimingAcceptance(stateDir, producer, admission) {
391
+ const retained = naturalTimingAdmissions.get(admission);
392
+ if (!retained)
393
+ return Object.freeze({ state: "unavailable", reason: "admission_invalid" });
394
+ if (retained.stateDir !== stateDir || retained.producer !== producer)
395
+ return Object.freeze({ state: "unavailable", reason: "admission_mismatch" });
396
+ return retained.acceptance;
397
+ }
398
+ export function publishRunResult(stateDir, producer, result, options = {}) {
399
+ requireIdentity(producer);
400
+ if (!admittedProducers.has(producer))
401
+ throw new Error("Run producer requires an identity admitted by this runtime.");
402
+ requireProducerCleanupAvailable(producer);
403
+ const code = result && typeof result === "object" ? Object.getOwnPropertyDescriptor(result, "code")?.value : undefined;
404
+ if (!result || typeof result !== "object" || Array.isArray(result) || !Number.isSafeInteger(code)) {
405
+ throw new Error("Run result code must be a safe integer.");
406
+ }
407
+ const release = acquireStateStartLock(stateDir, { onContention: options.onLockContention });
408
+ try {
409
+ const meta = readCapturedProducerMeta(stateDir, producer);
410
+ requireNoNativeProducerContradiction(meta);
411
+ const stop = readRunStopClaim(stateDir, meta);
412
+ if (stop.state === "invalid")
413
+ throw new Error("Run stop state is unavailable or invalid.");
414
+ const path = join(stateDir, "result.json");
415
+ try {
416
+ if (!lstatSync(path).isFile())
417
+ throw new Error("Run result path is not a regular file.");
418
+ return false;
419
+ }
420
+ catch (error) {
421
+ if (error.code !== "ENOENT")
422
+ throw error;
423
+ }
424
+ const descriptors = Object.getOwnPropertyDescriptors(result);
425
+ if (Object.values(descriptors).some(field => field.enumerable && !Object.hasOwn(field, "value")))
426
+ throw new Error("Run result fields must be data properties.");
427
+ const input = Object.fromEntries(Object.entries(descriptors).filter(([, field]) => field.enumerable).map(([key, field]) => [key, field.value]));
428
+ if (typeof input.toJSON === "function")
429
+ throw new Error("Run result serialization must preserve its data fields.");
430
+ const { stop_claim_id: _claim, terminal_acceptance: _acceptance, output: _output, output_unavailable: _unavailable, primary_text_protocol: _primaryProtocol, artifact_inventory: _inventory, artifact_inventory_unavailable: _inventoryUnavailable, artifact_inventory_protocol: _inventoryProtocol, result_diagnostics: _diagnostics, result_diagnostics_unavailable: _diagnosticsUnavailable, result_diagnostics_protocol: _diagnosticsProtocol, ...fields } = input;
431
+ const capture = Object.freeze({ ...fields, code });
432
+ if (options.prepare) {
433
+ requireSynchronousResultCallback(options.prepare({ stopping: stop.state === "pending" }), "Run result preparation must complete synchronously.");
434
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
435
+ }
436
+ let primary;
437
+ if (options.primaryText) {
438
+ const value = options.primaryText();
439
+ requireSynchronousResultCallback(value, "Run primary text binding must complete synchronously.");
440
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
441
+ primary = decodeRunPrimaryTextBinding(stateDir, producer.runInstanceId, value);
442
+ }
443
+ let inventory;
444
+ if (options.artifactInventory) {
445
+ const value = options.artifactInventory();
446
+ requireSynchronousResultCallback(value, "Run artifact inventory binding must complete synchronously.");
447
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
448
+ inventory = decodeRunArtifactInventoryBinding(stateDir, producer.runInstanceId, value);
449
+ }
450
+ let diagnostics;
451
+ if (options.resultDiagnostics) {
452
+ const candidate = Object.freeze(Object.fromEntries(RUN_RESULT_DIAGNOSTIC_FIELDS.flatMap(key => typeof capture[key] === "string" ? [[key, capture[key]]] : [])));
453
+ const admission = Object.freeze({ kernel_only: true });
454
+ diagnosticAdmissions.set(admission, { stateDir, producer, candidate });
455
+ try {
456
+ const value = options.resultDiagnostics(admission);
457
+ requireSynchronousResultCallback(value, "Run result diagnostics binding must complete synchronously.");
458
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
459
+ diagnostics = decodeRunResultDiagnosticsBinding(stateDir, producer.runInstanceId, value);
460
+ }
461
+ finally {
462
+ diagnosticAdmissions.delete(admission);
463
+ }
464
+ }
465
+ if (options.prepare || options.primaryText || options.artifactInventory || options.resultDiagnostics)
466
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
467
+ const completedAt = new Date().toISOString();
468
+ writeJsonAtomic(path, {
469
+ ...capture,
470
+ ...primary,
471
+ ...(primary ? { primary_text_protocol: RUN_PRIMARY_TEXT_PROTOCOL } : {}),
472
+ ...inventory,
473
+ ...(inventory ? { artifact_inventory_protocol: RUN_ARTIFACT_INVENTORY_PROTOCOL } : {}),
474
+ ...diagnostics,
475
+ ...(diagnostics ? { result_diagnostics_protocol: RUN_RESULT_DIAGNOSTICS_PROTOCOL } : {}),
476
+ run_instance_id: producer.runInstanceId,
477
+ completedAt,
478
+ ...(stop.state === "pending"
479
+ ? { terminal_acceptance: "after_stop_claim", stop_claim_id: stop.claim.claim_id }
480
+ : { terminal_acceptance: "natural" }),
481
+ });
482
+ if (stop.state !== "pending" && options.naturalResultTiming) {
483
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
484
+ const admission = Object.freeze({ kernel_only: true });
485
+ const identity = Object.freeze({ run: producer.run, run_instance_id: producer.runInstanceId,
486
+ ...(producer.ownerId === undefined ? {} : { ownerId: producer.ownerId }) });
487
+ const acceptance = Object.freeze({ state: "available", identity,
488
+ code: code, recorded_status: code === 0 ? "done" : "failed", completed_at: completedAt, acceptance: "natural", timing: "not_asserted" });
489
+ const retained = { stateDir, producer, acceptance, active: true };
490
+ naturalTimingAdmissions.set(admission, retained);
491
+ try {
492
+ requireSynchronousResultCallback(options.naturalResultTiming(admission), "Run natural result timing observer must complete synchronously.");
493
+ requireNoNativeProducerContradiction(readCapturedProducerMeta(stateDir, producer));
494
+ }
495
+ finally {
496
+ retained.active = false;
497
+ }
498
+ }
499
+ if (stop.state === "pending") {
500
+ appendRunTraceEvent(stateDir, {
501
+ kind: "run.result_captured",
502
+ summary: "Captured workload result while stopping",
503
+ data: { code, stop_claim_id: stop.claim.claim_id },
504
+ });
505
+ }
506
+ else if (options.trace)
507
+ appendRunTraceEvent(stateDir, options.trace);
508
+ return true;
509
+ }
510
+ finally {
511
+ try {
512
+ release();
513
+ }
514
+ catch (error) {
515
+ retainProducerCleanupFailure(producer, error);
516
+ }
517
+ }
518
+ }
@@ -1,10 +1,23 @@
1
1
  /**
2
- * Async run retention operations.
3
- * Owns: terminal-run archive and prune filesystem behavior.
2
+ * Run retirement owner.
3
+ * Owns: lifecycle-serialized manual archive/prune, age-based cleanup and shared ownership/scope fences.
4
+ * Excludes: native closure proof, process actuation and ordinary non-Run temp cleanup.
4
5
  */
5
6
  import { cpSync } from "node:fs";
6
7
  export type RunRetentionAction = "archive" | "prune";
7
8
  export type RunRetentionOutcome = "queued" | "handled" | "failed";
9
+ export declare const DEFAULT_RUN_MAX_AGE_MS: number;
10
+ export interface RunRetentionExpectation {
11
+ onLocked?(): void;
12
+ ownerId?: string;
13
+ runInstanceId?: string;
14
+ }
15
+ /** Manual API preserves its existing status/expected contract, not a native closure claim. */
16
+ export declare function retainRun(stateDir: string, action: RunRetentionAction, expected: RunRetentionExpectation, readStatus: (stateDir: string) => Record<string, unknown>, options?: {
17
+ preserveArtifacts?: boolean;
18
+ }): Record<string, unknown>;
19
+ /** Filesystem age selects candidates; it grants neither retirement nor native scope authority. */
20
+ export declare function cleanupStaleRunEntries(runsDir: string, maxAgeMs?: number, now?: number): Promise<number>;
8
21
  export declare function appendRunRetentionEvidence(status: Record<string, unknown>, action: RunRetentionAction, outcome: RunRetentionOutcome, options?: {
9
22
  error?: string;
10
23
  id?: string;