@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,411 @@
1
+ /**
2
+ * Run generation supervision policy, clocks and deadline observation.
3
+ * Owns: policy/clock validation, genuine runtime-local origins, monotonic timing and one-shot bounded deadline wake protocol.
4
+ * Excludes: canonical state admission, independent supervisor/recovery, report acceptance, lifecycle/work authority and stop/closure actuation.
5
+ */
6
+ import { performance } from "node:perf_hooks";
7
+ import type { RunContextIndexIdentity } from "./runs-context-index.ts";
8
+
9
+ const POLICY_FIELDS = ["report_every", "max_runtime"] as const;
10
+ const DURATION_MULTIPLIERS = { ms: 1, s: 1_000, m: 60_000, h: 3_600_000 } as const;
11
+
12
+ /** Shared lower bound for Run report policies and root-session diagnostic batches. */
13
+ export const RUN_DIAGNOSTIC_MIN_INTERVAL_MS = 60_000;
14
+
15
+ type PolicyField = typeof POLICY_FIELDS[number];
16
+ type PolicyLayer = "recipe" | "launch";
17
+ type NormalizedLayer = Record<PolicyField, number | null | undefined>;
18
+
19
+ export type RunSupervisionPolicySource = PolicyLayer | "unset";
20
+
21
+ export interface RunSupervisionPolicy {
22
+ readonly report_every_ms: number | null;
23
+ readonly max_runtime_ms: number | null;
24
+ }
25
+
26
+ export interface ResolvedRunSupervisionPolicy extends RunSupervisionPolicy {
27
+ readonly provenance: {
28
+ readonly report_every: RunSupervisionPolicySource;
29
+ readonly max_runtime: RunSupervisionPolicySource;
30
+ };
31
+ }
32
+
33
+ function requireDiagnosticInterval(milliseconds: number, label: string): void {
34
+ if (milliseconds < RUN_DIAGNOSTIC_MIN_INTERVAL_MS) {
35
+ throw new Error(`Invalid ${label}: interval must be at least ${RUN_DIAGNOSTIC_MIN_INTERVAL_MS}ms (1m).`);
36
+ }
37
+ }
38
+
39
+ function normalizeDuration(
40
+ value: unknown,
41
+ field: PolicyField,
42
+ layer: PolicyLayer,
43
+ ): number | null {
44
+ if (value === null) return null;
45
+ const match = typeof value === "string"
46
+ ? /^([1-9][0-9]*)(ms|s|m|h)$/u.exec(value)
47
+ : null;
48
+ // A final line terminator may satisfy $, but is not part of a literal duration.
49
+ if (!match || match[0] !== value) {
50
+ throw new Error(
51
+ `Invalid ${layer}.${field}: expected a positive integer duration with ms/s/m/h, or null.`,
52
+ );
53
+ }
54
+ const milliseconds = Number(match[1]) *
55
+ DURATION_MULTIPLIERS[match[2] as keyof typeof DURATION_MULTIPLIERS];
56
+ if (!Number.isSafeInteger(milliseconds)) {
57
+ throw new Error(
58
+ `Invalid ${layer}.${field}: duration exceeds the safe integer millisecond range.`,
59
+ );
60
+ }
61
+ if (field === "report_every") requireDiagnosticInterval(milliseconds, `${layer}.${field}`);
62
+ return milliseconds;
63
+ }
64
+
65
+ function normalizeLayer(value: unknown, layer: PolicyLayer): NormalizedLayer {
66
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
67
+ throw new Error(`Run supervision ${layer} policy must be an object.`);
68
+ }
69
+ const record = value as Record<string, unknown>;
70
+ const normalized: NormalizedLayer = {
71
+ report_every: undefined,
72
+ max_runtime: undefined,
73
+ };
74
+ for (const field of POLICY_FIELDS) {
75
+ if (!Object.hasOwn(record, field)) continue;
76
+ const raw = record[field];
77
+ if (raw !== undefined) normalized[field] = normalizeDuration(raw, field, layer);
78
+ }
79
+ return normalized;
80
+ }
81
+
82
+ export function resolveRunSupervisionPolicy(
83
+ recipe: unknown = {},
84
+ launch: unknown = {},
85
+ ): ResolvedRunSupervisionPolicy {
86
+ const recipePolicy = normalizeLayer(recipe, "recipe");
87
+ const launchPolicy = normalizeLayer(launch, "launch");
88
+ const select = (field: PolicyField): {
89
+ value: number | null;
90
+ source: RunSupervisionPolicySource;
91
+ } => {
92
+ const launchValue = launchPolicy[field];
93
+ if (launchValue !== undefined) return { value: launchValue, source: "launch" };
94
+ const recipeValue = recipePolicy[field];
95
+ if (recipeValue !== undefined) return { value: recipeValue, source: "recipe" };
96
+ return { value: null, source: "unset" };
97
+ };
98
+ const report = select("report_every");
99
+ const maximum = select("max_runtime");
100
+ return {
101
+ report_every_ms: report.value,
102
+ max_runtime_ms: maximum.value,
103
+ provenance: { report_every: report.source, max_runtime: maximum.source },
104
+ };
105
+ }
106
+
107
+ /** Decode persisted milliseconds without coercing strings or inventing absent settings. */
108
+ export function decodeRunSupervisionPolicy(value: unknown): RunSupervisionPolicy {
109
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
110
+ throw new Error("Stored run supervision policy must be an object.");
111
+ }
112
+ const record = value as Record<string, unknown>;
113
+ const read = (field: "report_every_ms" | "max_runtime_ms"): number | null => {
114
+ const milliseconds = Object.hasOwn(record, field) ? record[field] : undefined;
115
+ if (milliseconds === null) return null;
116
+ if (typeof milliseconds === "number" &&
117
+ Number.isSafeInteger(milliseconds) && milliseconds > 0) {
118
+ if (field === "report_every_ms") requireDiagnosticInterval(milliseconds, `stored supervision ${field}`);
119
+ return milliseconds;
120
+ }
121
+ throw new Error(
122
+ `Invalid stored supervision ${field}: expected positive integer milliseconds or null.`,
123
+ );
124
+ };
125
+ return { report_every_ms: read("report_every_ms"), max_runtime_ms: read("max_runtime_ms") };
126
+ }
127
+
128
+ /** Compare already-normalized values, not their provenance or generation clocks. */
129
+ export function sameRunSupervisionPolicy(
130
+ left: RunSupervisionPolicy,
131
+ right: RunSupervisionPolicy,
132
+ ): boolean {
133
+ return left.report_every_ms === right.report_every_ms &&
134
+ left.max_runtime_ms === right.max_runtime_ms;
135
+ }
136
+
137
+ export interface RunSupervisionState extends RunSupervisionPolicy {
138
+ readonly deadline_at: string | null;
139
+ }
140
+
141
+ export interface RunSupervisionClock {
142
+ readonly started_at: string;
143
+ readonly supervision: RunSupervisionState;
144
+ }
145
+
146
+ function timestamp(milliseconds: number, field: string): string {
147
+ if (!Number.isSafeInteger(milliseconds) ||
148
+ !Number.isFinite(new Date(milliseconds).getTime())) {
149
+ throw new Error(`Invalid run supervision ${field}: timestamp is outside the representable millisecond range.`);
150
+ }
151
+ return new Date(milliseconds).toISOString();
152
+ }
153
+
154
+ function parseStart(value: unknown): number {
155
+ if (typeof value !== "string") {
156
+ throw new Error("Invalid run supervision started_at: expected a canonical ISO timestamp.");
157
+ }
158
+ const milliseconds = Date.parse(value);
159
+ if (!Number.isSafeInteger(milliseconds) || timestamp(milliseconds, "started_at") !== value) {
160
+ throw new Error("Invalid run supervision started_at: expected a canonical ISO timestamp.");
161
+ }
162
+ return milliseconds;
163
+ }
164
+
165
+ export function createRunSupervisionClock(
166
+ policy: unknown,
167
+ startedAtMs: number,
168
+ ): RunSupervisionClock {
169
+ const normalized = decodeRunSupervisionPolicy(policy);
170
+ const startedAt = timestamp(startedAtMs, "started_at");
171
+ const deadlineAt = normalized.max_runtime_ms === null
172
+ ? null
173
+ : timestamp(startedAtMs + normalized.max_runtime_ms, "deadline_at");
174
+ return {
175
+ started_at: startedAt,
176
+ supervision: { ...normalized, deadline_at: deadlineAt },
177
+ };
178
+ }
179
+
180
+ /** Wholly absent legacy clocks stay absent; decoding never consults current time. */
181
+ export function readRunSupervisionClock(value: unknown): RunSupervisionClock | undefined {
182
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
183
+ throw new Error("Run supervision clock metadata must be an object.");
184
+ }
185
+ const record = value as Record<string, unknown>;
186
+ const hasStart = Object.hasOwn(record, "started_at");
187
+ const hasPolicy = Object.hasOwn(record, "supervision");
188
+ if (!hasStart && !hasPolicy && !Object.hasOwn(record, "supervision_provenance")) return undefined;
189
+ if (!hasStart || !hasPolicy) throw new Error("Run supervision clock metadata is incomplete.");
190
+ const clock = createRunSupervisionClock(record.supervision, parseStart(record.started_at));
191
+ if (Object.hasOwn(record, "createdAt") && record.createdAt !== clock.started_at) {
192
+ throw new Error("Run supervision started_at contradicts generation creation time.");
193
+ }
194
+ const stored = record.supervision as Record<string, unknown>;
195
+ if (!Object.hasOwn(stored, "deadline_at") || stored.deadline_at !== clock.supervision.deadline_at) {
196
+ throw new Error("Run supervision deadline_at contradicts its captured start and policy.");
197
+ }
198
+ return clock;
199
+ }
200
+
201
+ // --- Runtime-local timing ---
202
+
203
+ export const RUN_SUPERVISION_TIMER_SLICE_MAX_MS = 2_147_483_647;
204
+ export interface RunSupervisionTimeSource {
205
+ wallNow(): number;
206
+ monotonicNow(): { readonly milliseconds: number; readonly epoch: object };
207
+ }
208
+ export interface RunSupervisionTimeOrigin { readonly wall_ms: number; }
209
+ type ClockFault = "clock_unavailable" | "monotonic_unavailable" | "monotonic_reversed" | "monotonic_epoch_changed";
210
+ export type RunSupervisionTimeObservation =
211
+ | { readonly state: "available"; readonly elapsed_ms: number; readonly remaining_ms: number | null;
212
+ readonly deadline_state: "pending" | "due" | "disabled"; readonly deadline_wake_ms: number | null }
213
+ | { readonly state: "unproven"; readonly reason: ClockFault; readonly elapsed_ms: null; readonly remaining_ms: null;
214
+ readonly deadline_state: "unproven" | "due" | "disabled"; readonly deadline_wake_ms: 0 | null };
215
+ export interface RunSupervisionTimebase {
216
+ readonly clock: Readonly<RunSupervisionClock>;
217
+ readonly observe: () => Readonly<RunSupervisionTimeObservation>;
218
+ }
219
+ export type RunSupervisionTimebaseReading =
220
+ | { readonly state: "available"; readonly timebase: Readonly<RunSupervisionTimebase> }
221
+ | { readonly state: "unavailable"; readonly reason: "clock_unconfigured" | "clock_invalid" | "origin_unavailable" | "origin_mismatch" | "clock_changed" };
222
+ interface OriginEvidence {
223
+ readonly wall: number;
224
+ readonly start: number;
225
+ readonly epoch: object;
226
+ readonly read: RunSupervisionTimeSource["monotonicNow"];
227
+ last: number;
228
+ elapsed: number;
229
+ signature?: string;
230
+ fault?: ClockFault;
231
+ }
232
+ const origins = new WeakMap<object, OriginEvidence>();
233
+ const systemEpoch = Object.freeze({});
234
+ const systemSource: RunSupervisionTimeSource = {
235
+ wallNow: () => Date.now(), monotonicNow: () => ({ milliseconds: performance.now(), epoch: systemEpoch }),
236
+ };
237
+ function monotonic(value: unknown): value is number { return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER; }
238
+
239
+ /** Capture synchronously at generation admission; the returned exact reference, not its DTO, retains continuity. */
240
+ export function captureRunSupervisionTimeOrigin(source: RunSupervisionTimeSource = systemSource): Readonly<RunSupervisionTimeOrigin> {
241
+ const wall = source.wallNow();
242
+ createRunSupervisionClock({ report_every_ms: null, max_runtime_ms: null }, wall);
243
+ const read = source.monotonicNow.bind(source); const sample = read();
244
+ const milliseconds = sample?.milliseconds; const epoch = sample?.epoch;
245
+ if (!monotonic(milliseconds) || !epoch || typeof epoch !== "object") {
246
+ throw new Error("Run supervision time origin requires a finite monotonic sample and runtime-local epoch.");
247
+ }
248
+ const origin = Object.freeze({ wall_ms: wall });
249
+ origins.set(origin, { wall, start: milliseconds, last: milliseconds, elapsed: 0, epoch, read });
250
+ return origin;
251
+ }
252
+
253
+ function observe(evidence: OriginEvidence, maximum: number | null): Readonly<RunSupervisionTimeObservation> {
254
+ if (!evidence.fault) {
255
+ try {
256
+ const sample = evidence.read(); const milliseconds = sample?.milliseconds; const epoch = sample?.epoch;
257
+ if (epoch !== evidence.epoch) evidence.fault = "monotonic_epoch_changed";
258
+ else if (!monotonic(milliseconds)) evidence.fault = "monotonic_unavailable";
259
+ else if (milliseconds < evidence.last) evidence.fault = "monotonic_reversed";
260
+ else { evidence.last = milliseconds; evidence.elapsed = Math.floor(milliseconds - evidence.start); }
261
+ } catch { evidence.fault = "clock_unavailable"; }
262
+ }
263
+ const due = maximum !== null && evidence.elapsed >= maximum;
264
+ if (evidence.fault) return Object.freeze({ state: "unproven", reason: evidence.fault, elapsed_ms: null, remaining_ms: null,
265
+ deadline_state: maximum === null ? "disabled" : due ? "due" : "unproven", deadline_wake_ms: due ? 0 : null });
266
+ // Integer subtraction preserves ceil(maximum - elapsed) even when a huge allowance loses fractional precision.
267
+ const remaining = maximum === null ? null : Math.max(0, maximum - evidence.elapsed);
268
+ return Object.freeze({ state: "available", elapsed_ms: evidence.elapsed, remaining_ms: remaining,
269
+ deadline_state: maximum === null ? "disabled" : due ? "due" : "pending",
270
+ deadline_wake_ms: remaining === null ? null : Math.min(remaining, RUN_SUPERVISION_TIMER_SLICE_MAX_MS) });
271
+ }
272
+
273
+ /** Stored metadata alone cannot recreate an origin, renew a budget or clear previously latched clock uncertainty. */
274
+ export function createRunSupervisionTimebase(metadata: unknown, origin: unknown): Readonly<RunSupervisionTimebaseReading> {
275
+ let decoded: RunSupervisionClock | undefined;
276
+ try { decoded = readRunSupervisionClock(metadata); }
277
+ catch { return Object.freeze({ state: "unavailable", reason: "clock_invalid" }); }
278
+ if (!decoded) return Object.freeze({ state: "unavailable", reason: "clock_unconfigured" });
279
+ const evidence = origin && typeof origin === "object" ? origins.get(origin) : undefined;
280
+ if (!evidence) return Object.freeze({ state: "unavailable", reason: "origin_unavailable" });
281
+ if (Date.parse(decoded.started_at) !== evidence.wall) return Object.freeze({ state: "unavailable", reason: "origin_mismatch" });
282
+ const signature = JSON.stringify(decoded);
283
+ if (evidence.signature !== undefined && evidence.signature !== signature) return Object.freeze({ state: "unavailable", reason: "clock_changed" });
284
+ evidence.signature = signature;
285
+ const clock = Object.freeze({ started_at: decoded.started_at, supervision: Object.freeze({ ...decoded.supervision }) });
286
+ return Object.freeze({ state: "available", timebase: Object.freeze({ clock, observe: () => observe(evidence, clock.supervision.max_runtime_ms) }) });
287
+ }
288
+
289
+ // --- Deadline observation ---
290
+
291
+ export interface RunSupervisionDeadlineObservation {
292
+ readonly kind: "run_deadline_due";
293
+ readonly identity: Readonly<RunContextIndexIdentity>;
294
+ readonly deadline_at: string;
295
+ readonly timing: Readonly<RunSupervisionTimeObservation>;
296
+ readonly scope_closure: "not_asserted";
297
+ readonly stop_requested: false;
298
+ }
299
+ export interface RunSupervisionControllerPorts {
300
+ /** Synchronous caller-admitted state; stored metadata/DTOs never reconstruct work or actuation authority. */
301
+ readCurrent(): { readonly identity: unknown; readonly clock: unknown } | null;
302
+ /** Must enqueue asynchronously and return one synchronous cancellation function. */
303
+ schedule?: (wake: () => void, milliseconds: number) => () => void;
304
+ /** Synchronous observation only, not delivery acceptance or permission to signal/finalize a Run. */
305
+ onDeadlineDue(event: Readonly<RunSupervisionDeadlineObservation>): void;
306
+ }
307
+ type ControllerReason = "binding_unavailable" | "binding_changed" | "clock_changed" | "clock_invalid" | "clock_unproven" |
308
+ "timer_unavailable" | "timer_provider_invalid" | "notification_failed";
309
+ export interface RunSupervisionControllerSnapshot {
310
+ readonly state: "idle" | "armed" | "disabled" | "due" | "stopped" | "unproven";
311
+ readonly identity: Readonly<RunContextIndexIdentity>;
312
+ readonly deadline_due: boolean;
313
+ readonly pending_wake_ms: number | null;
314
+ readonly reason?: ControllerReason;
315
+ readonly timer_cleanup?: "unproven";
316
+ }
317
+ export interface RunSupervisionController {
318
+ readonly start: () => Readonly<RunSupervisionControllerSnapshot>;
319
+ readonly stop: () => Readonly<RunSupervisionControllerSnapshot>;
320
+ readonly snapshot: () => Readonly<RunSupervisionControllerSnapshot>;
321
+ }
322
+ function identity(value: unknown): Readonly<RunContextIndexIdentity> | undefined {
323
+ if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
324
+ const read = (key: string): unknown => Object.getOwnPropertyDescriptor(value, key)?.value;
325
+ const run = read("run"); const generation = read("run_instance_id"); const owner = read("ownerId");
326
+ if (typeof run !== "string" || !/^[A-Za-z0-9_.-]+$/u.test(run) || typeof generation !== "string" || !generation ||
327
+ (owner !== undefined && (typeof owner !== "string" || !owner))) return undefined;
328
+ return Object.freeze({ run, run_instance_id: generation, ...(owner === undefined ? {} : { ownerId: owner }) });
329
+ }
330
+ function sameIdentity(a: RunContextIndexIdentity, b: RunContextIndexIdentity): boolean {
331
+ return a.run === b.run && a.run_instance_id === b.run_instance_id && a.ownerId === b.ownerId;
332
+ }
333
+ function number(value: unknown): value is number { return typeof value === "number" && Number.isSafeInteger(value) && value >= 0; }
334
+ function timingSnapshot(value: RunSupervisionTimeObservation, maximum: number): Readonly<RunSupervisionTimeObservation> | undefined {
335
+ const state = value?.state; const elapsed = value?.elapsed_ms; const remaining = value?.remaining_ms;
336
+ const deadline = value?.deadline_state; const wake = value?.deadline_wake_ms;
337
+ if (state === "available" && number(elapsed) && number(remaining) && remaining === Math.max(0, maximum - elapsed) &&
338
+ deadline === (elapsed >= maximum ? "due" : "pending") && wake === Math.min(remaining, RUN_SUPERVISION_TIMER_SLICE_MAX_MS)) {
339
+ return Object.freeze({ state, elapsed_ms: elapsed, remaining_ms: remaining, deadline_state: deadline, deadline_wake_ms: wake });
340
+ }
341
+ if (state === "unproven" && elapsed === null && remaining === null && (deadline === "due" || deadline === "unproven") && wake === (deadline === "due" ? 0 : null)) {
342
+ const reason = value.reason;
343
+ if (["clock_unavailable", "monotonic_unavailable", "monotonic_reversed", "monotonic_epoch_changed"].includes(reason)) {
344
+ return Object.freeze({ state, reason, elapsed_ms: null, remaining_ms: null, deadline_state: deadline, deadline_wake_ms: deadline === "due" ? 0 : null });
345
+ }
346
+ }
347
+ return undefined;
348
+ }
349
+ function scheduleNode(wake: () => void, milliseconds: number): () => void {
350
+ const timer = setTimeout(wake, milliseconds); return () => clearTimeout(timer);
351
+ }
352
+
353
+ /** No lifecycle/work lock is held here; the caller owns authoritative state ports and any later admitted action. */
354
+ export function createRunSupervisionController(expected: unknown, timebase: RunSupervisionTimebase, ports: RunSupervisionControllerPorts): Readonly<RunSupervisionController> {
355
+ const bound = identity(expected);
356
+ if (!bound) throw new Error("Run supervision controller requires an exact Run/generation/owner binding.");
357
+ const decoded = readRunSupervisionClock(timebase.clock);
358
+ if (!decoded || typeof timebase.observe !== "function") throw new Error("Run supervision controller requires a configured timebase.");
359
+ const clockKey = JSON.stringify(decoded); const maximum = decoded.supervision.max_runtime_ms; const deadlineAt = decoded.supervision.deadline_at;
360
+ const observe = timebase.observe.bind(timebase); const readCurrent = ports.readCurrent.bind(ports);
361
+ const schedule = ports.schedule?.bind(ports) ?? scheduleNode; const notify = ports.onDeadlineDue.bind(ports);
362
+ let state: RunSupervisionControllerSnapshot["state"] = maximum === null ? "disabled" : "idle";
363
+ let started = false; let active = false; let due = false; let reason: ControllerReason | undefined; let cleanup = false;
364
+ let ticket: object | undefined; let cancel: (() => void) | undefined; let pending: number | null = null;
365
+ const snapshot = (): Readonly<RunSupervisionControllerSnapshot> => Object.freeze({ state, identity: bound, deadline_due: due, pending_wake_ms: pending,
366
+ ...(reason ? { reason } : {}), ...(cleanup ? { timer_cleanup: "unproven" as const } : {}) });
367
+ const cancelOnce = (action: () => void): void => { try { action(); } catch { cleanup = true; } };
368
+ const disarm = (): void => { const action = cancel; ticket = undefined; cancel = undefined; pending = null; if (action) cancelOnce(action); };
369
+ const fail = (cause: ControllerReason): void => { active = false; reason ??= cause; if (state !== "stopped") state = "unproven"; disarm(); };
370
+ const checkBinding = (): ControllerReason | undefined => {
371
+ try {
372
+ const current = readCurrent(); const currentIdentity = identity(current?.identity);
373
+ if (!currentIdentity) return "binding_unavailable";
374
+ if (!sameIdentity(bound, currentIdentity)) return "binding_changed";
375
+ const clock = readRunSupervisionClock(current?.clock);
376
+ return clock && JSON.stringify(clock) === clockKey ? undefined : "clock_changed";
377
+ } catch { return "binding_unavailable"; }
378
+ };
379
+ const arm = (milliseconds: number): void => {
380
+ const currentTicket = {}; ticket = currentTicket; pending = milliseconds; state = "armed";
381
+ let scheduling = true; let action: (() => void) | undefined;
382
+ try {
383
+ action = schedule(() => {
384
+ if (!active || ticket !== currentTicket) return;
385
+ if (scheduling) { fail("timer_provider_invalid"); return; }
386
+ ticket = undefined; cancel = undefined; pending = null; step();
387
+ }, milliseconds);
388
+ } catch { cleanup = true; fail("timer_unavailable"); }
389
+ finally { scheduling = false; }
390
+ if (typeof action !== "function") { cleanup = true; if (active) fail("timer_provider_invalid"); return; }
391
+ if (!active || ticket !== currentTicket) cancelOnce(action); else cancel = action;
392
+ };
393
+ const step = (): void => {
394
+ if (!active || maximum === null || deadlineAt === null) return;
395
+ const before = checkBinding(); if (!active) return; if (before) { fail(before); return; }
396
+ let timing: Readonly<RunSupervisionTimeObservation> | undefined;
397
+ try { timing = timingSnapshot(observe(), maximum); } catch { fail("clock_invalid"); return; }
398
+ if (!active) return;
399
+ if (!timing) { fail("clock_invalid"); return; }
400
+ if (timing.deadline_state !== "due" && timing.state === "unproven") { fail("clock_unproven"); return; }
401
+ const after = checkBinding(); if (!active) return; if (after) { fail(after); return; }
402
+ if (timing.deadline_state === "due") {
403
+ due = true; active = false; state = "due";
404
+ const event = Object.freeze({ kind: "run_deadline_due" as const, identity: bound, deadline_at: deadlineAt, timing,
405
+ scope_closure: "not_asserted" as const, stop_requested: false as const });
406
+ try { notify(event); } catch { fail("notification_failed"); }
407
+ } else if (timing.deadline_wake_ms !== null) arm(timing.deadline_wake_ms);
408
+ };
409
+ return Object.freeze({ snapshot, start: () => { if (!started) { started = true; if (maximum !== null && state === "idle") { active = true; step(); } } return snapshot(); },
410
+ stop: () => { active = false; state = "stopped"; disarm(); return snapshot(); } });
411
+ }