@earendil-works/pi-durable 1.4.0 → 1.5.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 (221) hide show
  1. package/CHANGELOG.md +186 -0
  2. package/README.md +181 -84
  3. package/dist/codemode/codemode.d.ts +4 -4
  4. package/dist/codemode/codemode.d.ts.map +1 -1
  5. package/dist/codemode/codemode.js +9 -12
  6. package/dist/codemode/codemode.js.map +1 -1
  7. package/dist/codemode/models.js +4 -4
  8. package/dist/codemode/models.js.map +1 -1
  9. package/dist/env/index.d.ts +12 -10
  10. package/dist/env/index.d.ts.map +1 -1
  11. package/dist/env/index.js.map +1 -1
  12. package/dist/env/node-watch.d.ts +3 -3
  13. package/dist/env/node-watch.d.ts.map +1 -1
  14. package/dist/env/node-watch.js +18 -16
  15. package/dist/env/node-watch.js.map +1 -1
  16. package/dist/env/node.d.ts +2 -2
  17. package/dist/env/node.d.ts.map +1 -1
  18. package/dist/env/node.js +1 -1
  19. package/dist/env/node.js.map +1 -1
  20. package/dist/errors.d.ts +18 -2
  21. package/dist/errors.d.ts.map +1 -1
  22. package/dist/errors.js +26 -3
  23. package/dist/errors.js.map +1 -1
  24. package/dist/harness/agent.d.ts.map +1 -1
  25. package/dist/harness/agent.js +10 -2
  26. package/dist/harness/agent.js.map +1 -1
  27. package/dist/harness/compaction.d.ts.map +1 -1
  28. package/dist/harness/compaction.js +19 -2
  29. package/dist/harness/compaction.js.map +1 -1
  30. package/dist/harness/context.d.ts +23 -7
  31. package/dist/harness/context.d.ts.map +1 -1
  32. package/dist/harness/context.js +71 -25
  33. package/dist/harness/context.js.map +1 -1
  34. package/dist/harness/define.d.ts +7 -3
  35. package/dist/harness/define.d.ts.map +1 -1
  36. package/dist/harness/define.js +4 -0
  37. package/dist/harness/define.js.map +1 -1
  38. package/dist/harness/generation.d.ts +38 -5
  39. package/dist/harness/generation.d.ts.map +1 -1
  40. package/dist/harness/generation.js +445 -96
  41. package/dist/harness/generation.js.map +1 -1
  42. package/dist/harness/harness.d.ts +2 -0
  43. package/dist/harness/harness.d.ts.map +1 -1
  44. package/dist/harness/harness.js +87 -62
  45. package/dist/harness/harness.js.map +1 -1
  46. package/dist/harness/inbox.d.ts +5 -1
  47. package/dist/harness/inbox.d.ts.map +1 -1
  48. package/dist/harness/inbox.js +4 -1
  49. package/dist/harness/inbox.js.map +1 -1
  50. package/dist/harness/json.d.ts +20 -4
  51. package/dist/harness/json.d.ts.map +1 -1
  52. package/dist/harness/json.js +23 -5
  53. package/dist/harness/json.js.map +1 -1
  54. package/dist/harness/live.d.ts +122 -16
  55. package/dist/harness/live.d.ts.map +1 -1
  56. package/dist/harness/live.js +93 -12
  57. package/dist/harness/live.js.map +1 -1
  58. package/dist/harness/partial-changes.d.ts +54 -0
  59. package/dist/harness/partial-changes.d.ts.map +1 -0
  60. package/dist/harness/partial-changes.js +162 -0
  61. package/dist/harness/partial-changes.js.map +1 -0
  62. package/dist/harness/registry-reader.d.ts +11 -0
  63. package/dist/harness/registry-reader.d.ts.map +1 -0
  64. package/dist/harness/registry-reader.js +25 -0
  65. package/dist/harness/registry-reader.js.map +1 -0
  66. package/dist/harness/scheduler.d.ts +46 -19
  67. package/dist/harness/scheduler.d.ts.map +1 -1
  68. package/dist/harness/scheduler.js +973 -376
  69. package/dist/harness/scheduler.js.map +1 -1
  70. package/dist/harness/submissions.d.ts +17 -10
  71. package/dist/harness/submissions.d.ts.map +1 -1
  72. package/dist/harness/submissions.js +62 -25
  73. package/dist/harness/submissions.js.map +1 -1
  74. package/dist/harness/task-graph.d.ts +12 -9
  75. package/dist/harness/task-graph.d.ts.map +1 -1
  76. package/dist/harness/task-graph.js +38 -28
  77. package/dist/harness/task-graph.js.map +1 -1
  78. package/dist/harness/telemetry.d.ts +11 -11
  79. package/dist/harness/telemetry.d.ts.map +1 -1
  80. package/dist/harness/telemetry.js +7 -7
  81. package/dist/harness/telemetry.js.map +1 -1
  82. package/dist/harness/tool.d.ts +2 -0
  83. package/dist/harness/tool.d.ts.map +1 -1
  84. package/dist/harness/tool.js +171 -55
  85. package/dist/harness/tool.js.map +1 -1
  86. package/dist/harness/transcript.d.ts +72 -0
  87. package/dist/harness/transcript.d.ts.map +1 -0
  88. package/dist/harness/transcript.js +264 -0
  89. package/dist/harness/transcript.js.map +1 -0
  90. package/dist/harness/types.d.ts +218 -59
  91. package/dist/harness/types.d.ts.map +1 -1
  92. package/dist/harness/types.js.map +1 -1
  93. package/dist/harness/util.d.ts +3 -1
  94. package/dist/harness/util.d.ts.map +1 -1
  95. package/dist/harness/util.js +9 -0
  96. package/dist/harness/util.js.map +1 -1
  97. package/dist/harness/view.d.ts +43 -22
  98. package/dist/harness/view.d.ts.map +1 -1
  99. package/dist/harness/view.js +130 -71
  100. package/dist/harness/view.js.map +1 -1
  101. package/dist/index.d.ts +9 -7
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +4 -3
  104. package/dist/index.js.map +1 -1
  105. package/dist/search.d.ts +19 -3
  106. package/dist/search.d.ts.map +1 -1
  107. package/dist/search.js +107 -44
  108. package/dist/search.js.map +1 -1
  109. package/dist/session/cached-storage.d.ts +71 -0
  110. package/dist/session/cached-storage.d.ts.map +1 -0
  111. package/dist/session/cached-storage.js +269 -0
  112. package/dist/session/cached-storage.js.map +1 -0
  113. package/dist/session/conversation-tails.d.ts +33 -0
  114. package/dist/session/conversation-tails.d.ts.map +1 -0
  115. package/dist/session/conversation-tails.js +101 -0
  116. package/dist/session/conversation-tails.js.map +1 -0
  117. package/dist/session/keys.d.ts +68 -0
  118. package/dist/session/keys.d.ts.map +1 -0
  119. package/dist/session/keys.js +161 -0
  120. package/dist/session/keys.js.map +1 -0
  121. package/dist/session/session.d.ts +167 -26
  122. package/dist/session/session.d.ts.map +1 -1
  123. package/dist/session/session.js +1029 -171
  124. package/dist/session/session.js.map +1 -1
  125. package/dist/session/transaction.d.ts +81 -3
  126. package/dist/session/transaction.d.ts.map +1 -1
  127. package/dist/session/transaction.js +224 -37
  128. package/dist/session/transaction.js.map +1 -1
  129. package/dist/session/writer.d.ts +74 -0
  130. package/dist/session/writer.d.ts.map +1 -0
  131. package/dist/session/writer.js +294 -0
  132. package/dist/session/writer.js.map +1 -0
  133. package/dist/storage/indexeddb.d.ts +10 -2
  134. package/dist/storage/indexeddb.d.ts.map +1 -1
  135. package/dist/storage/indexeddb.js +91 -41
  136. package/dist/storage/indexeddb.js.map +1 -1
  137. package/dist/storage/jsonl/storage.d.ts +14 -2
  138. package/dist/storage/jsonl/storage.d.ts.map +1 -1
  139. package/dist/storage/jsonl/storage.js +88 -24
  140. package/dist/storage/jsonl/storage.js.map +1 -1
  141. package/dist/storage/memory.d.ts +7 -2
  142. package/dist/storage/memory.d.ts.map +1 -1
  143. package/dist/storage/memory.js +28 -2
  144. package/dist/storage/memory.js.map +1 -1
  145. package/dist/storage/sqlite/storage.d.ts +14 -2
  146. package/dist/storage/sqlite/storage.d.ts.map +1 -1
  147. package/dist/storage/sqlite/storage.js +110 -36
  148. package/dist/storage/sqlite/storage.js.map +1 -1
  149. package/dist/storage/store/commit.d.ts +33 -0
  150. package/dist/storage/store/commit.d.ts.map +1 -0
  151. package/dist/storage/store/commit.js +286 -0
  152. package/dist/storage/store/commit.js.map +1 -0
  153. package/dist/storage/store/documents.d.ts +43 -0
  154. package/dist/storage/store/documents.d.ts.map +1 -0
  155. package/dist/storage/store/documents.js +102 -0
  156. package/dist/storage/store/documents.js.map +1 -0
  157. package/dist/storage/store/index.d.ts +2 -0
  158. package/dist/storage/store/index.d.ts.map +1 -0
  159. package/dist/storage/store/index.js +2 -0
  160. package/dist/storage/store/index.js.map +1 -0
  161. package/dist/storage/store/queries.d.ts +49 -0
  162. package/dist/storage/store/queries.d.ts.map +1 -0
  163. package/dist/storage/store/queries.js +93 -0
  164. package/dist/storage/store/queries.js.map +1 -0
  165. package/dist/storage/store/storage.d.ts +59 -0
  166. package/dist/storage/store/storage.d.ts.map +1 -0
  167. package/dist/storage/store/storage.js +438 -0
  168. package/dist/storage/store/storage.js.map +1 -0
  169. package/dist/storage/store/tables.d.ts +54 -0
  170. package/dist/storage/store/tables.d.ts.map +1 -0
  171. package/dist/storage/store/tables.js +108 -0
  172. package/dist/storage/store/tables.js.map +1 -0
  173. package/dist/testing/commit-writes.d.ts +5 -0
  174. package/dist/testing/commit-writes.d.ts.map +1 -0
  175. package/dist/testing/commit-writes.js +12 -0
  176. package/dist/testing/commit-writes.js.map +1 -0
  177. package/dist/testing/env-conformance.js +7 -7
  178. package/dist/testing/env-conformance.js.map +1 -1
  179. package/dist/testing/index.d.ts +1 -0
  180. package/dist/testing/index.d.ts.map +1 -1
  181. package/dist/testing/index.js +1 -0
  182. package/dist/testing/index.js.map +1 -1
  183. package/dist/testing/storage-benchmark.d.ts.map +1 -1
  184. package/dist/testing/storage-benchmark.js +18 -17
  185. package/dist/testing/storage-benchmark.js.map +1 -1
  186. package/dist/testing/storage-conformance.d.ts.map +1 -1
  187. package/dist/testing/storage-conformance.js +354 -69
  188. package/dist/testing/storage-conformance.js.map +1 -1
  189. package/dist/tool-search/tool-search.d.ts +6 -12
  190. package/dist/tool-search/tool-search.d.ts.map +1 -1
  191. package/dist/tool-search/tool-search.js +7 -7
  192. package/dist/tool-search/tool-search.js.map +1 -1
  193. package/dist/tools/bash.d.ts +12 -12
  194. package/dist/tools/bash.d.ts.map +1 -1
  195. package/dist/tools/bash.js +16 -15
  196. package/dist/tools/bash.js.map +1 -1
  197. package/dist/tools/edit.d.ts +7 -7
  198. package/dist/tools/edit.d.ts.map +1 -1
  199. package/dist/tools/edit.js +9 -9
  200. package/dist/tools/edit.js.map +1 -1
  201. package/dist/tools/index.d.ts +32 -32
  202. package/dist/tools/read.d.ts +6 -6
  203. package/dist/tools/read.d.ts.map +1 -1
  204. package/dist/tools/read.js +19 -8
  205. package/dist/tools/read.js.map +1 -1
  206. package/dist/tools/write.d.ts +4 -4
  207. package/dist/tools/write.d.ts.map +1 -1
  208. package/dist/tools/write.js +5 -5
  209. package/dist/tools/write.js.map +1 -1
  210. package/dist/types.d.ts +223 -77
  211. package/dist/types.d.ts.map +1 -1
  212. package/dist/types.js.map +1 -1
  213. package/package.json +19 -12
  214. package/dist/harness/events.d.ts +0 -186
  215. package/dist/harness/events.d.ts.map +0 -1
  216. package/dist/harness/events.js +0 -373
  217. package/dist/harness/events.js.map +0 -1
  218. package/dist/session/observation.d.ts +0 -42
  219. package/dist/session/observation.d.ts.map +0 -1
  220. package/dist/session/observation.js +0 -281
  221. package/dist/session/observation.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"task-graph.js","sourceRoot":"","sources":["../../src/harness/task-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8D,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,cAAc,EAAW,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,SAAS,EAAoB,MAAM,uBAAuB,CAAC;AAWpE,OAAO,EAA2C,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyDjD,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,CAAU,CAAC;AAC3F,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,QAAQ,CAAc;IACtB,QAAQ,CAAU;IAClB,SAAS,CAAoB;IACtC,MAAM,CAAoB;IAC1B,OAAO,GAAG,KAAK,CAAC;IAEhB,YAAY,OAAoB,EAAE,OAAgB,EAAE,QAA2B;QAC9E,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE;YAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO;YACtC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5D,SAAS,CACR,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAClD,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAChC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACzB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC3B,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAC9C,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAY,KAAK,EAAE,OAAO,CAAC,EACvE,OAAO,CACP,CAAC;QACF,IAAI,CAAC;YACJ,OAAO,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC;YACT,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CACtC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,cAAc,CAAY,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACzG,OAAO,CACP,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QACnC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,MAAM,CAAC,MAAM,CAAC;QACrB,CAAC;QACD,IAAI,MAAM,KAAK,SAAS;YAAE,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,8FAA8F;IAC9F,OAAO,CACN,MAAoD,EACpD,OAAgB;QAEhB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,GAAG,EAAY,EAAE,CAAC;YACjG,MAAM,MAAM,GAAG,GAAS,EAAE;gBACzB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;oBAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YAClF,CAAC,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC7C,iFAAiF;YACjF,IAAI,IAAI,CAAC,OAAO;gBAAE,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnD,OAAO,CAAC,WAAW,EAAE,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,wGAAwG;IACxG,eAAe;QACd,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACtD,IAAI,CAAC,QAAQ;aACX,UAAU,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO;YAChC,MAAM,GAAG,GAAS,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO;oBAAE,SAAS;gBAC1D,GAAG,CAAC,IAAI,CACP,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CACpG,CAAC;YACH,CAAC;YACD,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,CAAC,CAAC;YACF,uDAAuD;aACtD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAgB;QAC5B,MAAM,KAAK,GAAkC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;QAC/C,MAAM,OAAO,GAAoB,EAAE,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CACX,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CACpG,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACtC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAC5F,CAAC;YACF,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACvC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1F,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;CACD;AAED;;;GAGG;AACH,SAAS,OAAO,CACf,KAAY,EACZ,WAA8B,EAC9B,OAAgB,EAChB,OAAqC,EACrC,MAAgC;IAEhC,MAAM,GAAG,GAAS,EAAE,CAAC;IACrB,iEAAiE;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC7D,MAAM,IAAI,GAAG,CAAC,GAAW,EAA6B,EAAE,CACvD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9D,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACxC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,QAAQ,KAAK,SAAS;gBAAE,SAAS;YACrC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC5B,SAAS;QACV,CAAC;QACD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,IAAI,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC1F,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,IAA4B,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,oHAAoH;IACpH,6EAA6E;IAC7E,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IACpD,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QACjF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAE,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,qGAAqG;AACrG,SAAS,OAAO,CAAC,KAAY,EAAE,GAAS,EAAE,OAAgB,EAAE,MAAgC;IAC3F,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC7B,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAC1C,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,MAAM,CACd,MAAqB,EACrB,aAAwC,EACxC,OAAkC;IAElC,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;QACtB,aAAa;QACb,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;KAC7C,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,MAAqB;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACb,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACnE,KAAK,SAAS;YACb,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QACzG,KAAK,UAAU;YACd,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACrF,2DAA2D;QAC3D,KAAK,YAAY,CAAC;QAClB,KAAK,UAAU;YACd,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;AACF,CAAC;AAED,SAAS,OAAO,CAAC,UAAqB;IACrC,OAAQ,UAAyC,CAAC,KAAK,CAAC;AACzD,CAAC","sourcesContent":["import { type AttachedReplicatedState, type Context, type JsonValue, replicatedState } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT, withoutAbortSignal } from \"@earendil-works/chord/context\";\nimport { applyImmutable, type Op } from \"@earendil-works/chord/delta\";\nimport { CommittedStateSource, CommittedWatch } from \"../session/observation.ts\";\nimport { contained, type SessionImpl } from \"../session/session.ts\";\nimport type {\n\tCommitPublication,\n\tConversationId,\n\tJoinPolicy,\n\tStorage,\n\tTaskId,\n\tTaskOutcome,\n\tTaskRecord,\n\tWatchHandle,\n} from \"../types.ts\";\nimport { type BlockedReason, type BlockedSubject, blockedSubject } from \"./scheduler.ts\";\nimport { closedError, scanAll } from \"./util.ts\";\n\n/** A live task's durable status without its checkpoint and outcome payloads (spec §9.5). */\nexport type TaskGraphState =\n\t| { readonly status: \"pending\" | \"running\"; readonly phase: string }\n\t| {\n\t\t\treadonly status: \"waiting\";\n\t\t\treadonly phase: string;\n\t\t\treadonly on: readonly TaskId[];\n\t\t\treadonly policy: JoinPolicy;\n\t }\n\t/** Asleep until the Harness clock reaches `until`. */\n\t| { readonly status: \"sleeping\"; readonly phase: string; readonly until: number }\n\t/** Outcome held until its ordinary owned work drains. */\n\t| { readonly status: \"completing\"; readonly outcome: TaskOutcome<JsonValue>[\"status\"] };\n\nexport type TaskGraphNode = {\n\treadonly id: TaskId;\n\treadonly kind: string;\n\treadonly conversationId: ConversationId;\n\t/** Owner task; absent for a conversation-owned task. */\n\treadonly owner?: TaskId;\n\treadonly background: boolean;\n\treadonly abortRequested: boolean;\n\treadonly state: TaskGraphState;\n\t/**\n\t * Why it cannot run here, when it cannot: no registered definition takes it (`missing_task`, `task_too_old`,\n\t * `migration_failed`), or the restart limit parked it (`restart_limit`). Follows registry changes.\n\t */\n\treadonly blocked?: BlockedReason;\n\t/** Conversations this task owns, in ID order. */\n\treadonly conversations: readonly ConversationId[];\n};\n\n/** Every live task of the Session (spec §9.5). */\nexport type TaskGraph = {\n\t/** Every live task, keyed by its decimal ID. */\n\treadonly tasks: Readonly<Record<string, TaskGraphNode>>;\n};\n\nexport type TaskGraphWatch = WatchHandle<TaskGraph>;\n\ntype AnyTaskRecord = TaskRecord<JsonValue, JsonValue, JsonValue>;\ntype Observer = CommittedStateSource<TaskGraph> | CommittedWatch<TaskGraph>;\ntype Mount = {\n\tvalue: TaskGraph;\n\treadonly observers: Set<Observer>;\n\t/** What the blocked reason reads of each live task, so a registry change can derive it again without payloads. */\n\treadonly records: Map<string, BlockedSubject>;\n};\n\n/** What the graph asks the scheduler: a task's blocked reason, and when reasons may change without a commit. */\nexport type TaskGraphBlocking = {\n\treadonly blocked: (record: BlockedSubject) => BlockedReason | undefined;\n\treadonly subscribeBlocked: (listener: () => void) => () => void;\n};\n\nconst LIVE_STATUSES = [\"pending\", \"running\", \"waiting\", \"sleeping\", \"completing\"] as const;\nconst SCAN_PAGE_SIZE = 256;\n\n/**\n * The Harness's task graph mount: built on the Session line by its first observer and dropped with its last. It\n * advances from the Session's commit publications, which are durable.\n */\nexport class TaskGraphView {\n\treadonly #session: SessionImpl;\n\treadonly #storage: Storage;\n\treadonly #blocking: TaskGraphBlocking;\n\t#mount: Mount | undefined;\n\t#closed = false;\n\n\tconstructor(session: SessionImpl, storage: Storage, blocking: TaskGraphBlocking) {\n\t\tthis.#session = session;\n\t\tthis.#storage = storage;\n\t\tthis.#blocking = blocking;\n\t\tsession.observeCommits((publication, context) => {\n\t\t\tif (this.#mount === undefined) return;\n\t\t\tadvance(this.#mount, publication, context, blocking.blocked, (error) => session.report(error));\n\t\t});\n\t\tblocking.subscribeBlocked(() => this.#refreshBlocked());\n\t\tsession.subscribeClose(() => {\n\t\t\tthis.#closed = true;\n\t\t\tfor (const observer of [...(this.#mount?.observers ?? [])]) {\n\t\t\t\tcontained(\n\t\t\t\t\t() => observer.closeSession(this.#session.failure),\n\t\t\t\t\t(error) => session.report(error),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.#mount = undefined;\n\t\t});\n\t}\n\n\t/** A disposable read-only Chord state of the graph. */\n\tasync state(context: Context): Promise<AttachedReplicatedState<TaskGraph>> {\n\t\tconst { observer, detach } = await this.#attach(\n\t\t\t(value, release) => new CommittedStateSource<TaskGraph>(value, release),\n\t\t\tcontext,\n\t\t);\n\t\ttry {\n\t\t\treturn replicatedState(observer, { onError: (error) => this.#session.report(error) });\n\t\t} catch (error) {\n\t\t\tdetach();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** A serialized exact-frame watch of the graph; cancelling `context` stops it. */\n\tasync watch(context: Context): Promise<TaskGraphWatch> {\n\t\tconst { observer } = await this.#attach(\n\t\t\t(value, release) => new CommittedWatch<TaskGraph>(value, release, (error) => this.#session.report(error)),\n\t\t\tcontext,\n\t\t);\n\t\tconst signal = context.abortSignal;\n\t\tif (signal?.aborted) {\n\t\t\tobserver.cancel();\n\t\t\tthrow signal.reason;\n\t\t}\n\t\tif (signal !== undefined) observer.observeCancellation(signal);\n\t\treturn observer;\n\t}\n\n\t/** Register an observer created from the current revision, atomically on the Session line. */\n\t#attach<O extends Observer>(\n\t\tcreate: (value: TaskGraph, release: () => void) => O,\n\t\tcontext: Context,\n\t): Promise<{ observer: O; detach: () => void }> {\n\t\treturn this.#session.readOnLine(async () => {\n\t\t\tconst mount = this.#mount ?? { ...(await this.#build(context)), observers: new Set<Observer>() };\n\t\t\tconst detach = (): void => {\n\t\t\t\tmount.observers.delete(observer);\n\t\t\t\tif (mount.observers.size === 0 && this.#mount === mount) this.#mount = undefined;\n\t\t\t};\n\t\t\tconst observer = create(mount.value, detach);\n\t\t\t// Close or cancellation may begin while the mount builds; register nothing then.\n\t\t\tif (this.#closed) throw closedError(this.#session);\n\t\t\tcontext.abortSignal?.throwIfAborted();\n\t\t\tthis.#mount = mount;\n\t\t\tmount.observers.add(observer);\n\t\t\treturn { observer, detach };\n\t\t});\n\t}\n\n\t/** On the Session line: derive every node's blocked reason again, and publish the ones that changed. */\n\t#refreshBlocked(): void {\n\t\tif (this.#mount === undefined || this.#closed) return;\n\t\tthis.#session\n\t\t\t.readOnLine(async () => {\n\t\t\t\tconst mount = this.#mount;\n\t\t\t\tif (mount === undefined) return;\n\t\t\t\tconst ops: Op[] = [];\n\t\t\t\tfor (const [key, record] of mount.records) {\n\t\t\t\t\tconst blocked = this.#blocking.blocked(record);\n\t\t\t\t\tif (blocked === mount.value.tasks[key]?.blocked) continue;\n\t\t\t\t\tops.push(\n\t\t\t\t\t\tblocked === undefined ? [\"d\", [\"tasks\", key, \"blocked\"]] : [\"s\", [\"tasks\", key, \"blocked\"], blocked],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tpublish(mount, ops, BACKGROUND_CONTEXT, (error) => this.#session.report(error));\n\t\t\t})\n\t\t\t// Rejected only once the Session is closing or failed.\n\t\t\t.catch(() => {});\n\t}\n\n\tasync #build(context: Context): Promise<Omit<Mount, \"observers\">> {\n\t\tconst tasks: Record<string, TaskGraphNode> = {};\n\t\tconst live = new Map<string, BlockedSubject>();\n\t\tconst records: AnyTaskRecord[] = [];\n\t\tfor (const status of LIVE_STATUSES) {\n\t\t\trecords.push(\n\t\t\t\t...(await scanAll((cursor) => this.#storage.scanTasks({ status }, SCAN_PAGE_SIZE, cursor, context))),\n\t\t\t);\n\t\t}\n\t\trecords.sort((a, b) => a.id - b.id);\n\t\tfor (const record of records) {\n\t\t\tconst owned = await scanAll((cursor) =>\n\t\t\t\tthis.#storage.scanConversations({ ownerTaskId: record.id }, SCAN_PAGE_SIZE, cursor, context),\n\t\t\t);\n\t\t\tconst conversations = owned.map((conversation) => conversation.id).sort((a, b) => a - b);\n\t\t\tconst subject = blockedSubject(record);\n\t\t\ttasks[String(record.id)] = nodeOf(record, conversations, this.#blocking.blocked(subject));\n\t\t\tlive.set(String(record.id), subject);\n\t\t}\n\t\treturn { value: { tasks }, records: live };\n\t}\n}\n\n/**\n * Derive the mount's operations from one publication, apply them, and hand the revision to every observer; one that\n * throws is reported through `report`, and the others still get it.\n */\nfunction advance(\n\tmount: Mount,\n\tpublication: CommitPublication,\n\tcontext: Context,\n\tblocked: TaskGraphBlocking[\"blocked\"],\n\treport: (error: unknown) => void,\n): void {\n\tconst ops: Op[] = [];\n\t// Nodes this publication set or deleted, over the mount's value.\n\tconst changed = new Map<string, TaskGraphNode | undefined>();\n\tconst node = (key: string): TaskGraphNode | undefined =>\n\t\tchanged.has(key) ? changed.get(key) : mount.value.tasks[key];\n\tfor (const change of publication.changes) {\n\t\tif (change.type !== \"task\") continue;\n\t\tconst record = change.value;\n\t\tconst key = String(record.id);\n\t\tconst previous = node(key);\n\t\tif (record.state.status === \"terminal\") {\n\t\t\tmount.records.delete(key);\n\t\t\tif (previous === undefined) continue;\n\t\t\tops.push([\"d\", [\"tasks\", key]]);\n\t\t\tchanged.set(key, undefined);\n\t\t\tcontinue;\n\t\t}\n\t\tconst subject = blockedSubject(record);\n\t\tmount.records.set(key, subject);\n\t\tconst next = nodeOf(record, previous?.conversations ?? [], blocked(subject));\n\t\tif (previous !== undefined && JSON.stringify(next) === JSON.stringify(previous)) continue;\n\t\tops.push([\"s\", [\"tasks\", key], next as unknown as JsonValue]);\n\t\tchanged.set(key, next);\n\t}\n\t// After the tasks, so a conversation created with its owner task in one commit finds the owner's node. Change order\n\t// within a publication is unspecified, so each owner's list is sorted again.\n\tconst created = new Map<string, ConversationId[]>();\n\tfor (const change of publication.changes) {\n\t\tif (change.type !== \"conversation\" || change.value.owner === undefined) continue;\n\t\tconst key = String(change.value.owner.taskId);\n\t\tif (node(key) !== undefined) created.set(key, [...(created.get(key) ?? []), change.value.id]);\n\t}\n\tfor (const [key, ids] of created) {\n\t\tconst conversations = [...node(key)!.conversations, ...ids].sort((a, b) => a - b);\n\t\tops.push([\"s\", [\"tasks\", key, \"conversations\"], conversations]);\n\t}\n\tpublish(mount, ops, context, report);\n}\n\n/** Apply `ops` to the mount and hand the revision to every observer; one that throws is reported. */\nfunction publish(mount: Mount, ops: Op[], context: Context, report: (error: unknown) => void): void {\n\tif (ops.length === 0) return;\n\tmount.value = applyImmutable(mount.value, ops);\n\tconst frameContext = withoutAbortSignal(context);\n\tfor (const observer of [...mount.observers])\n\t\tcontained(() => observer.advance(mount.value, ops, frameContext), report);\n}\n\nfunction nodeOf(\n\trecord: AnyTaskRecord,\n\tconversations: readonly ConversationId[],\n\tblocked: BlockedReason | undefined,\n): TaskGraphNode {\n\treturn {\n\t\tid: record.id,\n\t\tkind: record.kind,\n\t\tconversationId: record.conversationId,\n\t\t...(record.owner === undefined ? {} : { owner: record.owner }),\n\t\tbackground: record.background,\n\t\tabortRequested: record.abortRequested,\n\t\tstate: stateOf(record),\n\t\tconversations,\n\t\t...(blocked === undefined ? {} : { blocked }),\n\t};\n}\n\nfunction stateOf(record: AnyTaskRecord): TaskGraphState {\n\tconst state = record.state;\n\tswitch (state.status) {\n\t\tcase \"pending\":\n\t\tcase \"running\":\n\t\t\treturn { status: state.status, phase: phaseOf(state.checkpoint) };\n\t\tcase \"waiting\":\n\t\t\treturn { status: \"waiting\", phase: phaseOf(state.checkpoint), on: [...state.on], policy: state.policy };\n\t\tcase \"sleeping\":\n\t\t\treturn { status: \"sleeping\", phase: phaseOf(state.checkpoint), until: state.until };\n\t\t// Terminal records never reach here: they leave the graph.\n\t\tcase \"completing\":\n\t\tcase \"terminal\":\n\t\t\treturn { status: \"completing\", outcome: state.outcome.status };\n\t}\n}\n\nfunction phaseOf(checkpoint: JsonValue): string {\n\treturn (checkpoint as { readonly phase: string }).phase;\n}\n"]}
1
+ {"version":3,"file":"task-graph.js","sourceRoot":"","sources":["../../src/harness/task-graph.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Context, type JsonValue, Watch, type WatchCall, type WatchHandle } from \"@earendil-works/chord\";\nimport { BACKGROUND_CONTEXT, withoutAbortSignal } from \"@earendil-works/chord/context\";\nimport { applyImmutable, type Op } from \"@earendil-works/chord/delta\";\nimport {\n\tcloseEndOf,\n\tcloseEnds,\n\tcontained,\n\tguardObserver,\n\ttype ObservedCommit,\n\tobservation,\n\ttype SessionImpl,\n} from \"../session/session.ts\";\nimport type {\n\tConversationId,\n\tJoinPolicy,\n\tObservation,\n\tObserver,\n\tStorage,\n\tTaskId,\n\tTaskOutcome,\n\tTaskRecord,\n} from \"../types.ts\";\nimport { type BlockedReason, type BlockedSubject, blockedSubject } from \"./scheduler.ts\";\nimport { closedError, scanAll } from \"./util.ts\";\n\n/** A live task's durable status without its checkpoint and outcome payloads (spec §9.4). */\nexport type TaskGraphState =\n\t| { readonly status: \"pending\" | \"running\"; readonly phase: string }\n\t| {\n\t\t\treadonly status: \"waiting\";\n\t\t\treadonly phase: string;\n\t\t\treadonly on: readonly TaskId[];\n\t\t\treadonly policy: JoinPolicy;\n\t }\n\t/** Asleep until the Harness clock reaches `until`. */\n\t| { readonly status: \"sleeping\"; readonly phase: string; readonly until: number }\n\t/** Outcome held until its ordinary owned work drains. */\n\t| { readonly status: \"completing\"; readonly outcome: TaskOutcome<JsonValue>[\"status\"] };\n\nexport type TaskGraphNode = {\n\treadonly id: TaskId;\n\treadonly kind: string;\n\treadonly conversationId: ConversationId;\n\t/** Owner task; absent for a conversation-owned task. */\n\treadonly owner?: TaskId;\n\treadonly background: boolean;\n\treadonly abortRequested: boolean;\n\treadonly state: TaskGraphState;\n\t/**\n\t * Why it cannot run here, when it cannot: no registered definition takes it (`missing_task`, `task_too_old`,\n\t * `migration_failed`). Follows registry changes.\n\t */\n\treadonly blocked?: BlockedReason;\n\t/** Conversations this task owns, in ID order. */\n\treadonly conversations: readonly ConversationId[];\n};\n\n/** Every live task of the Session (spec §9.4). */\nexport type TaskGraph = {\n\t/** Every live task, keyed by its decimal ID. */\n\treadonly tasks: Readonly<Record<string, TaskGraphNode>>;\n};\n\nexport type TaskGraphWatch = WatchHandle<TaskGraph>;\n\ntype AnyTaskRecord = TaskRecord<JsonValue, JsonValue, JsonValue>;\ntype Mount = {\n\tvalue: TaskGraph;\n\t/** Watches and guarded host observers (`observeTaskGraph()`). */\n\treadonly observers: Set<Observer<TaskGraph>>;\n\t/** What the blocked reason reads of each live task, so a registry change can derive it again without payloads. */\n\treadonly records: Map<string, BlockedSubject>;\n};\n\n/** What the graph asks the scheduler: a task's blocked reason, and when reasons may change without a commit. */\nexport type TaskGraphBlocking = {\n\treadonly blocked: (record: BlockedSubject) => BlockedReason | undefined;\n\treadonly subscribeBlocked: (listener: () => void) => () => void;\n};\n\nconst LIVE_STATUSES = [\"pending\", \"running\", \"waiting\", \"sleeping\", \"completing\"] as const;\nconst SCAN_PAGE_SIZE = 256;\n\n/**\n * The Harness's task graph mount: built on the Session line by its first observer and dropped with its last. It\n * advances from the Session's commit publications, which are durable.\n */\nexport class TaskGraphView {\n\treadonly #session: SessionImpl;\n\treadonly #blocking: TaskGraphBlocking;\n\t#mount: Mount | undefined;\n\t#closed = false;\n\n\tconstructor(session: SessionImpl, blocking: TaskGraphBlocking) {\n\t\tthis.#session = session;\n\t\tthis.#blocking = blocking;\n\t\tsession.followCommits((publication, context) => {\n\t\t\t// A commit held in memory changes documents only, which the graph does not show.\n\t\t\tif (this.#mount === undefined || publication.kind === \"memory\") return;\n\t\t\tadvance(this.#mount, publication, context, blocking.blocked, (error) => session.report(error));\n\t\t});\n\t\tblocking.subscribeBlocked(() => this.#refreshBlocked());\n\t\tsession.subscribeClose(() => {\n\t\t\tthis.#closed = true;\n\t\t\tconst ends = closeEnds(this.#session.failure);\n\t\t\tfor (const observer of [...(this.#mount?.observers ?? [])]) {\n\t\t\t\tcontained(\n\t\t\t\t\t() => observer.end(closeEndOf(observer, ends)),\n\t\t\t\t\t(error) => session.report(error),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.#mount = undefined;\n\t\t});\n\t}\n\n\t/**\n\t * Attach a synchronous observer of the graph (`Harness.observeTaskGraph()`), behind `guardObserver()`; `context`\n\t * governs only the attachment.\n\t */\n\tasync observe(observer: Observer<TaskGraph>, context: Context): Promise<Observation<TaskGraph>> {\n\t\tlet value!: TaskGraph;\n\t\tconst attached = await this.#attach((current, release) => {\n\t\t\tvalue = current;\n\t\t\treturn guardObserver(observer, release, (error) => this.#session.report(error));\n\t\t}, context);\n\t\tconst signal = context.abortSignal;\n\t\tif (signal?.aborted) {\n\t\t\tattached.detach();\n\t\t\tthrow signal.reason;\n\t\t}\n\t\treturn observation(value, attached.observer);\n\t}\n\n\t/** A serialized watch of the graph, an observer of its mount; aborting `context` ends it `aborted`. */\n\tasync watch(context: Context): Promise<TaskGraphWatch> {\n\t\tconst { observer } = await this.#attach(\n\t\t\t(value, release) => new Watch<TaskGraph>(value, release, (error) => this.#session.report(error)),\n\t\t\tcontext,\n\t\t);\n\t\tconst signal = context.abortSignal;\n\t\tif (signal?.aborted) {\n\t\t\tobserver.abort();\n\t\t\tthrow signal.reason;\n\t\t}\n\t\tif (signal !== undefined) observer.observeAbort(signal);\n\t\treturn observer;\n\t}\n\n\t/** Register an observer created from the current revision, atomically on the Session line. */\n\t#attach<O extends Observer<TaskGraph>>(\n\t\tcreate: (value: TaskGraph, release: () => void) => O,\n\t\tcontext: Context,\n\t): Promise<{ observer: O; detach: () => void }> {\n\t\treturn this.#session.readOnLine(async (storage) => {\n\t\t\tconst mount = this.#mount ?? {\n\t\t\t\t...(await this.#build(storage, context)),\n\t\t\t\tobservers: new Set<Observer<TaskGraph>>(),\n\t\t\t};\n\t\t\tconst detach = (): void => {\n\t\t\t\tmount.observers.delete(observer);\n\t\t\t\tif (mount.observers.size === 0 && this.#mount === mount) this.#mount = undefined;\n\t\t\t};\n\t\t\tconst observer = create(mount.value, detach);\n\t\t\t// Close or cancellation may begin while the mount builds; register nothing then.\n\t\t\tif (this.#closed) throw closedError(this.#session);\n\t\t\tcontext.abortSignal?.throwIfAborted();\n\t\t\tthis.#mount = mount;\n\t\t\tmount.observers.add(observer);\n\t\t\treturn { observer, detach };\n\t\t});\n\t}\n\n\t/** On the Session line: derive every node's blocked reason again, and publish the ones that changed. */\n\t#refreshBlocked(): void {\n\t\tif (this.#mount === undefined || this.#closed) return;\n\t\tthis.#session\n\t\t\t.readOnLine(async () => {\n\t\t\t\tconst mount = this.#mount;\n\t\t\t\tif (mount === undefined) return;\n\t\t\t\tconst ops: Op[] = [];\n\t\t\t\tfor (const [key, record] of mount.records) {\n\t\t\t\t\tconst blocked = this.#blocking.blocked(record);\n\t\t\t\t\tif (blocked === mount.value.tasks[key]?.blocked) continue;\n\t\t\t\t\tops.push(\n\t\t\t\t\t\tblocked === undefined ? [\"d\", [\"tasks\", key, \"blocked\"]] : [\"s\", [\"tasks\", key, \"blocked\"], blocked],\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tpublish(mount, ops, BACKGROUND_CONTEXT, (error) => this.#session.report(error));\n\t\t\t})\n\t\t\t// Rejected only once the Session is closing or failed.\n\t\t\t.catch(() => {});\n\t}\n\n\t/** Read the graph on the line, through the line's `storage`. */\n\tasync #build(storage: Storage, context: Context): Promise<Omit<Mount, \"observers\">> {\n\t\tconst tasks: Record<string, TaskGraphNode> = {};\n\t\tconst live = new Map<string, BlockedSubject>();\n\t\tconst records: AnyTaskRecord[] = [];\n\t\tfor (const status of LIVE_STATUSES) {\n\t\t\trecords.push(...(await scanAll((cursor) => storage.scanTasks({ status }, SCAN_PAGE_SIZE, cursor, context))));\n\t\t}\n\t\trecords.sort((a, b) => a.id - b.id);\n\t\tfor (const record of records) {\n\t\t\tconst owned = await scanAll((cursor) =>\n\t\t\t\tstorage.scanConversations({ ownerTaskId: record.id }, SCAN_PAGE_SIZE, cursor, context),\n\t\t\t);\n\t\t\tconst conversations = owned.map((conversation) => conversation.id).sort((a, b) => a - b);\n\t\t\tconst subject = blockedSubject(record);\n\t\t\ttasks[String(record.id)] = nodeOf(record, conversations, this.#blocking.blocked(subject));\n\t\t\tlive.set(String(record.id), subject);\n\t\t}\n\t\treturn { value: { tasks }, records: live };\n\t}\n}\n\n/**\n * Derive the mount's operations from one publication, apply them, and hand the revision to every observer; one that\n * throws is reported through `report`, and the others still get it.\n */\nfunction advance(\n\tmount: Mount,\n\tpublication: ObservedCommit,\n\tcontext: Context,\n\tblocked: TaskGraphBlocking[\"blocked\"],\n\treport: (error: unknown) => void,\n): void {\n\tconst ops: Op[] = [];\n\t// Nodes this publication set or deleted, over the mount's value.\n\tconst changed = new Map<string, TaskGraphNode | undefined>();\n\tconst node = (key: string): TaskGraphNode | undefined =>\n\t\tchanged.has(key) ? changed.get(key) : mount.value.tasks[key];\n\tfor (const change of publication.changes) {\n\t\tif (change.type !== \"task\") continue;\n\t\tconst record = change.value;\n\t\tconst key = String(record.id);\n\t\tconst previous = node(key);\n\t\tif (record.state.status === \"terminal\") {\n\t\t\tmount.records.delete(key);\n\t\t\tif (previous === undefined) continue;\n\t\t\tops.push([\"d\", [\"tasks\", key]]);\n\t\t\tchanged.set(key, undefined);\n\t\t\tcontinue;\n\t\t}\n\t\tconst subject = blockedSubject(record);\n\t\tmount.records.set(key, subject);\n\t\tconst next = nodeOf(record, previous?.conversations ?? [], blocked(subject));\n\t\tif (previous !== undefined && JSON.stringify(next) === JSON.stringify(previous)) continue;\n\t\tops.push([\"s\", [\"tasks\", key], next as unknown as JsonValue]);\n\t\tchanged.set(key, next);\n\t}\n\t// After the tasks, so a conversation created with its owner task in one commit finds the owner's node. Change order\n\t// within a publication is unspecified, so each owner's list is sorted again.\n\tconst created = new Map<string, ConversationId[]>();\n\tfor (const change of publication.changes) {\n\t\tif (change.type !== \"conversation\" || change.value.owner === undefined) continue;\n\t\tconst key = String(change.value.owner.taskId);\n\t\tif (node(key) !== undefined) created.set(key, [...(created.get(key) ?? []), change.value.id]);\n\t}\n\tfor (const [key, ids] of created) {\n\t\tconst conversations = [...node(key)!.conversations, ...ids].sort((a, b) => a - b);\n\t\tops.push([\"s\", [\"tasks\", key, \"conversations\"], conversations]);\n\t}\n\tpublish(mount, ops, context, report);\n}\n\n/** Apply `ops` to the mount and hand the revision to every observer; one that throws is reported. */\nfunction publish(mount: Mount, ops: Op[], context: Context, report: (error: unknown) => void): void {\n\tif (ops.length === 0) return;\n\tmount.value = applyImmutable(mount.value, ops);\n\tconst frameContext = withoutAbortSignal(context);\n\tconst call: WatchCall<TaskGraph> = { kind: \"value\", value: mount.value, ops, retired: false };\n\tfor (const observer of [...mount.observers]) contained(() => observer.advance(call, frameContext), report);\n}\n\nfunction nodeOf(\n\trecord: AnyTaskRecord,\n\tconversations: readonly ConversationId[],\n\tblocked: BlockedReason | undefined,\n): TaskGraphNode {\n\treturn {\n\t\tid: record.id,\n\t\tkind: record.kind,\n\t\tconversationId: record.conversationId,\n\t\t...(record.owner === undefined ? {} : { owner: record.owner }),\n\t\tbackground: record.background,\n\t\tabortRequested: record.abortRequested,\n\t\tstate: stateOf(record),\n\t\tconversations,\n\t\t...(blocked === undefined ? {} : { blocked }),\n\t};\n}\n\nfunction stateOf(record: AnyTaskRecord): TaskGraphState {\n\tconst state = record.state;\n\tswitch (state.status) {\n\t\tcase \"pending\":\n\t\tcase \"running\":\n\t\t\treturn { status: state.status, phase: phaseOf(state.checkpoint) };\n\t\tcase \"waiting\":\n\t\t\treturn { status: \"waiting\", phase: phaseOf(state.checkpoint), on: [...state.on], policy: state.policy };\n\t\tcase \"sleeping\":\n\t\t\treturn { status: \"sleeping\", phase: phaseOf(state.checkpoint), until: state.until };\n\t\t// Terminal records never reach here: they leave the graph.\n\t\tcase \"completing\":\n\t\tcase \"terminal\":\n\t\t\treturn { status: \"completing\", outcome: state.outcome.status };\n\t}\n}\n\nfunction phaseOf(checkpoint: JsonValue): string {\n\treturn (checkpoint as { readonly phase: string }).phase;\n}\n"]}
@@ -3,7 +3,7 @@ export declare const DURABLE_TELEMETRY_SCHEMA: {
3
3
  readonly version: 1;
4
4
  readonly spans: {
5
5
  readonly "pi.durable.submit": {
6
- readonly description: "Public submission admission and its commit. Inputs start root traces linked to their callers; writes are children. Internal admissions emit phase events only.";
6
+ readonly description: "Public submission admission: with its commit for submit(draft, context); the admission only for submit(tx, draft), whose result is provisional (a later throw or storage failure of the caller's commit leaves no submission) and whose commit events go to the caller's commit context. Inputs and continues start root traces linked to their callers; writes are children. Internal admissions emit phase events only.";
7
7
  readonly parents: {
8
8
  readonly kind: "any";
9
9
  };
@@ -11,7 +11,7 @@ export declare const DURABLE_TELEMETRY_SCHEMA: {
11
11
  readonly "submission.type": {
12
12
  readonly type: "string";
13
13
  readonly required: true;
14
- readonly values: readonly ["input", "write"];
14
+ readonly values: readonly ["input", "write", "continue"];
15
15
  readonly description: "Submission type.";
16
16
  };
17
17
  readonly "conversation.id": {
@@ -79,14 +79,14 @@ export declare const DURABLE_TELEMETRY_SCHEMA: {
79
79
  readonly type: {
80
80
  readonly type: "string";
81
81
  readonly required: true;
82
- readonly description: "ReportInfo type.";
83
- readonly values: readonly ["session_failed", "task_faulted", "task_parked", "migration_failed", "task_outdated", "task_error", "extension_error", "host_error", "listener_error"];
82
+ readonly description: "Report kind (`Report.kind`).";
83
+ readonly values: readonly ["storage_failed", "task_faulted", "task_interrupted", "migration_failed", "task_outdated", "task_error", "extension_error", "host_error", "listener_error"];
84
84
  };
85
85
  readonly reason: {
86
86
  readonly type: "string";
87
87
  readonly required: false;
88
88
  readonly description: "Fixed report reason, when present.";
89
- readonly values: readonly ["threw", "restart_limit", "missing_task", "incompatible_task"];
89
+ readonly values: readonly ["threw", "restart_limit", "interrupted", "missing_task", "task_too_old", "migration_failed"];
90
90
  };
91
91
  readonly extension: {
92
92
  readonly type: "string";
@@ -207,14 +207,14 @@ export declare const DURABLE_TELEMETRY_SCHEMA: {
207
207
  readonly type: {
208
208
  readonly type: "string";
209
209
  readonly required: true;
210
- readonly description: "ReportInfo type.";
211
- readonly values: readonly ["session_failed", "task_faulted", "task_parked", "migration_failed", "task_outdated", "task_error", "extension_error", "host_error", "listener_error"];
210
+ readonly description: "Report kind (`Report.kind`).";
211
+ readonly values: readonly ["storage_failed", "task_faulted", "task_interrupted", "migration_failed", "task_outdated", "task_error", "extension_error", "host_error", "listener_error"];
212
212
  };
213
213
  readonly reason: {
214
214
  readonly type: "string";
215
215
  readonly required: false;
216
216
  readonly description: "Fixed report reason, when present.";
217
- readonly values: readonly ["threw", "restart_limit", "missing_task", "incompatible_task"];
217
+ readonly values: readonly ["threw", "restart_limit", "interrupted", "missing_task", "task_too_old", "migration_failed"];
218
218
  };
219
219
  readonly extension: {
220
220
  readonly type: "string";
@@ -259,13 +259,13 @@ export declare const DURABLE_TELEMETRY_SCHEMA: {
259
259
  readonly metrics: {
260
260
  readonly "pi.durable.reports": {
261
261
  readonly kind: "counter";
262
- readonly description: "Reports raised, grouped by their fixed ReportInfo type.";
262
+ readonly description: "Reports raised, grouped by their fixed kind.";
263
263
  readonly attributes: {
264
264
  type: {
265
265
  readonly type: "string";
266
266
  readonly required: true;
267
- readonly description: "ReportInfo type.";
268
- readonly values: readonly ["session_failed", "task_faulted", "task_parked", "migration_failed", "task_outdated", "task_error", "extension_error", "host_error", "listener_error"];
267
+ readonly description: "Report kind (`Report.kind`).";
268
+ readonly values: readonly ["storage_failed", "task_faulted", "task_interrupted", "migration_failed", "task_outdated", "task_error", "extension_error", "host_error", "listener_error"];
269
269
  };
270
270
  };
271
271
  };
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/harness/telemetry.ts"],"names":[],"mappings":"AAgDA,6GAA6G;AAC7G,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAwBxB,kBAAkB;0CAtEjB,sEAAsE;;iCAElF,UAAU;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,WAAW,EAAE,sBAAsB;qCAAE,WAAW,EAAE,MAAM;;iCACtG,YAAY;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,WAAW,EAAE,aAAa;;;;gBAmEpC,uBAAuB;0CAjCjD,2BAA2B;;iCAEvC,eAAe;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,WAAW,EAAE,gBAAgB;qCAAE,WAAW,EAAE,MAAM;;iCACrG,MAAM;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,MAAM,YAAG,MAAM,EAAE,YAAY;qCAAG,WAAW,EAAE,aAAa;;iCACpG,iBAAiB;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAS,WAAW,EAAE,kBAAkB;qCAAE,WAAW,EAAE,MAAM;;;;gBA6B/B,mBAAmB;0CArClF,oDAAoD;;;qCAzBhE,IAAI,EAAE,QAAQ;qCACd,QAAQ;qCACR,WAAW,EAAE,kBAAkB;qCAC/B,MAAM,YACL,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,gBAAgB;;;qCAIjB,IAAI,EAAE,QAAQ;qCACd,QAAQ;qCACR,WAAW,EAAE,oCAAoC;qCACjD,MAAM,YAAG,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB;;;qCAE1D,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAS,WAAW,EAAE,0CAA0C;;;qCACxF,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAS,WAAW,EAAE,wBAAwB;qCAAE,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAuFxF,IAAI;mCA7Gb,QAAQ;;0CAED,kBAAkB;+CAE9B,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmHjB,CAAC"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/harness/telemetry.ts"],"names":[],"mappings":"AAgDA,6GAA6G;AAC7G,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAwBxB,kBAAkB;0CAtEjB,sEAAsE;;iCAElF,UAAU;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,WAAW,EAAE,sBAAsB;qCAAE,WAAW,EAAE,MAAM;;iCACtG,YAAY;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,WAAW,EAAE,aAAa;;;;gBAmEpC,uBAAuB;0CAjCjD,2BAA2B;;iCAEvC,eAAe;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,WAAW,EAAE,gBAAgB;qCAAE,WAAW,EAAE,MAAM;;iCACrG,MAAM;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAQ,MAAM,YAAG,MAAM,EAAE,YAAY;qCAAG,WAAW,EAAE,aAAa;;iCACpG,iBAAiB;qCAAI,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAS,WAAW,EAAE,kBAAkB;qCAAE,WAAW,EAAE,MAAM;;;;gBA6B/B,mBAAmB;0CArClF,oDAAoD;;;qCAzBhE,IAAI,EAAE,QAAQ;qCACd,QAAQ;qCACR,WAAW,EAAE,8BAA8B;qCAC3C,MAAM,YACL,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,gBAAgB;;;qCAIjB,IAAI,EAAE,QAAQ;qCACd,QAAQ;qCACR,WAAW,EAAE,oCAAoC;qCACjD,MAAM,YAAG,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB;;;qCAExF,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAS,WAAW,EAAE,0CAA0C;;;qCACxF,IAAI,EAAE,QAAQ;qCAAE,QAAQ;qCAAS,WAAW,EAAE,wBAAwB;qCAAE,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAuFxF,IAAI;mCA7Gb,QAAQ;;0CAED,8BAA8B;+CAE1C,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmHjB,CAAC"}
@@ -10,11 +10,11 @@ const reportAttributes = {
10
10
  type: {
11
11
  type: "string",
12
12
  required: true,
13
- description: "ReportInfo type.",
13
+ description: "Report kind (`Report.kind`).",
14
14
  values: [
15
- "session_failed",
15
+ "storage_failed",
16
16
  "task_faulted",
17
- "task_parked",
17
+ "task_interrupted",
18
18
  "migration_failed",
19
19
  "task_outdated",
20
20
  "task_error",
@@ -27,7 +27,7 @@ const reportAttributes = {
27
27
  type: "string",
28
28
  required: false,
29
29
  description: "Fixed report reason, when present.",
30
- values: ["threw", "restart_limit", "missing_task", "incompatible_task"],
30
+ values: ["threw", "restart_limit", "interrupted", "missing_task", "task_too_old", "migration_failed"],
31
31
  },
32
32
  extension: { type: "string", required: false, description: "Registered extension name, when present." },
33
33
  "task.id": { type: "number", required: false, description: "Task ID, when present.", cardinality: "high" },
@@ -49,13 +49,13 @@ export const DURABLE_TELEMETRY_SCHEMA = defineTelemetrySchema({
49
49
  version: 1,
50
50
  spans: {
51
51
  "pi.durable.submit": {
52
- description: "Public submission admission and its commit. Inputs start root traces linked to their callers; writes are children. Internal admissions emit phase events only.",
52
+ description: "Public submission admission: with its commit for submit(draft, context); the admission only for submit(tx, draft), whose result is provisional (a later throw or storage failure of the caller's commit leaves no submission) and whose commit events go to the caller's commit context. Inputs and continues start root traces linked to their callers; writes are children. Internal admissions emit phase events only.",
53
53
  parents: { kind: "any" },
54
54
  startAttributes: {
55
55
  "submission.type": {
56
56
  type: "string",
57
57
  required: true,
58
- values: ["input", "write"],
58
+ values: ["input", "write", "continue"],
59
59
  description: "Submission type.",
60
60
  },
61
61
  "conversation.id": { type: "number", required: true, description: "Conversation ID.", cardinality: "high" },
@@ -113,7 +113,7 @@ export const DURABLE_TELEMETRY_SCHEMA = defineTelemetrySchema({
113
113
  metrics: {
114
114
  "pi.durable.reports": {
115
115
  kind: "counter",
116
- description: "Reports raised, grouped by their fixed ReportInfo type.",
116
+ description: "Reports raised, grouped by their fixed kind.",
117
117
  attributes: { type: reportAttributes.type },
118
118
  },
119
119
  "pi.durable.phase.duration": {
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/harness/telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineTelemetrySchema } from \"@earendil-works/pi-telemetry\";\n\nconst entry = {\n\tdescription: \"A transcript entry was committed; content remains in the transcript.\",\n\tattributes: {\n\t\t\"entry.id\": { type: \"number\", required: true, description: \"Transcript entry ID.\", cardinality: \"high\" },\n\t\t\"entry.kind\": { type: \"string\", required: true, description: \"Entry kind.\" },\n\t},\n} as const;\nconst reportAttributes = {\n\ttype: {\n\t\ttype: \"string\",\n\t\trequired: true,\n\t\tdescription: \"ReportInfo type.\",\n\t\tvalues: [\n\t\t\t\"session_failed\",\n\t\t\t\"task_faulted\",\n\t\t\t\"task_parked\",\n\t\t\t\"migration_failed\",\n\t\t\t\"task_outdated\",\n\t\t\t\"task_error\",\n\t\t\t\"extension_error\",\n\t\t\t\"host_error\",\n\t\t\t\"listener_error\",\n\t\t],\n\t},\n\treason: {\n\t\ttype: \"string\",\n\t\trequired: false,\n\t\tdescription: \"Fixed report reason, when present.\",\n\t\tvalues: [\"threw\", \"restart_limit\", \"missing_task\", \"incompatible_task\"],\n\t},\n\textension: { type: \"string\", required: false, description: \"Registered extension name, when present.\" },\n\t\"task.id\": { type: \"number\", required: false, description: \"Task ID, when present.\", cardinality: \"high\" },\n} as const;\nconst report = {\n\tdescription: \"A report was raised; no error payload is recorded.\",\n\tattributes: reportAttributes,\n} as const;\nconst submission = {\n\tdescription: \"A submission was settled.\",\n\tattributes: {\n\t\t\"submission.id\": { type: \"number\", required: true, description: \"Submission ID.\", cardinality: \"high\" },\n\t\tstatus: { type: \"string\", required: true, values: [\"done\", \"unanswered\"], description: \"Settlement.\" },\n\t\t\"answer.entry_id\": { type: \"number\", required: false, description: \"Answer entry ID.\", cardinality: \"high\" },\n\t},\n} as const;\n\n/** Durable's content-free span, event, and metric vocabulary. IDs address durable records, never content. */\nexport const DURABLE_TELEMETRY_SCHEMA = defineTelemetrySchema({\n\tversion: 1,\n\tspans: {\n\t\t\"pi.durable.submit\": {\n\t\t\tdescription:\n\t\t\t\t\"Public submission admission and its commit. Inputs start root traces linked to their callers; writes are children. Internal admissions emit phase events only.\",\n\t\t\tparents: { kind: \"any\" },\n\t\t\tstartAttributes: {\n\t\t\t\t\"submission.type\": {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tvalues: [\"input\", \"write\"],\n\t\t\t\t\tdescription: \"Submission type.\",\n\t\t\t\t},\n\t\t\t\t\"conversation.id\": { type: \"number\", required: true, description: \"Conversation ID.\", cardinality: \"high\" },\n\t\t\t},\n\t\t\tendAttributes: {\n\t\t\t\t\"submission.id\": { type: \"number\", description: \"Admitted submission ID.\", cardinality: \"high\" },\n\t\t\t\tresult: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalues: [\"queued\", \"placed\", \"done\"],\n\t\t\t\t\tdescription: \"Admission result; stale writes report done.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevents: { \"pi.durable.entry\": entry, \"pi.durable.submission\": submission, \"pi.durable.report\": report },\n\t\t\tstatus: { default: \"ok\", errorWhen: \"Admission failed.\" },\n\t\t},\n\t\t\"pi.durable.phase\": {\n\t\t\tdescription: \"One task phase invocation, including its decision commit, never a wait or restart.\",\n\t\t\tparents: { kind: \"any\" },\n\t\t\tstartAttributes: {\n\t\t\t\t\"task.id\": { type: \"number\", required: true, description: \"Task ID.\", cardinality: \"high\" },\n\t\t\t\t\"task.name\": { type: \"string\", required: true, description: \"Registered task name.\" },\n\t\t\t\tphase: { type: \"string\", required: true, description: \"Invoked checkpoint phase.\" },\n\t\t\t\tkind: { type: \"string\", required: true, values: [\"run\", \"abort\"], description: \"Invocation kind.\" },\n\t\t\t\tattempt: { type: \"number\", required: false, description: \"Checkpoint attempt, when present.\" },\n\t\t\t\tresumed: {\n\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tdescription: \"First invocation of a task loaded in this process.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendAttributes: {\n\t\t\t\toutcome: { type: \"string\", description: \"next=<phase>, waiting, sleeping, done, faulted, or aborted.\" },\n\t\t\t\t\"tool.name\": { type: \"string\", description: \"Called tool name.\" },\n\t\t\t\t\"tool.call_id\": { type: \"string\", description: \"Transcript tool call ID.\", cardinality: \"high\" },\n\t\t\t},\n\t\t\tevents: {\n\t\t\t\t\"pi.durable.entry\": entry,\n\t\t\t\t\"pi.durable.submission\": submission,\n\t\t\t\t\"pi.durable.report\": report,\n\t\t\t\t\"pi.durable.checkpoint\": {\n\t\t\t\t\tdescription: \"The running checkpoint's phase changed while the invocation continued.\",\n\t\t\t\t\tattributes: { phase: { type: \"string\", required: true, description: \"Committed checkpoint phase.\" } },\n\t\t\t\t},\n\t\t\t\t\"pi.durable.replay\": {\n\t\t\t\t\tdescription: \"A nested tool call was answered from its stored result.\",\n\t\t\t\t\tattributes: { \"tool.name\": { type: \"string\", required: true, description: \"Called tool name.\" } },\n\t\t\t\t},\n\t\t\t},\n\t\t\tstatus: {\n\t\t\t\tdefault: \"ok\",\n\t\t\t\terrorWhen:\n\t\t\t\t\t\"Faulted, failed, and orphaned outcomes use task_faulted, task_failed, and task_orphaned with a diagnostic capped at 500 characters. Aborted outcomes keep status ok.\",\n\t\t\t},\n\t\t},\n\t},\n\tmetrics: {\n\t\t\"pi.durable.reports\": {\n\t\t\tkind: \"counter\",\n\t\t\tdescription: \"Reports raised, grouped by their fixed ReportInfo type.\",\n\t\t\tattributes: { type: reportAttributes.type },\n\t\t},\n\t\t\"pi.durable.phase.duration\": {\n\t\t\tkind: \"histogram\",\n\t\t\tunit: \"ms\",\n\t\t\tdescription: \"Duration of a phase invocation and its decision commit.\",\n\t\t\tattributes: {\n\t\t\t\ttask: { type: \"string\", required: true, description: \"Registered task name.\" },\n\t\t\t\tphase: { type: \"string\", required: true, description: \"Invoked checkpoint phase.\" },\n\t\t\t\toutcome: { type: \"string\", required: true, description: \"Phase outcome.\" },\n\t\t\t},\n\t\t},\n\t\t\"pi.durable.tasks.active\": {\n\t\t\tkind: \"upDownCounter\",\n\t\t\tdescription: \"Live tasks held by this Harness; decremented at terminal settlement or close.\",\n\t\t\tattributes: { task: { type: \"string\", required: true, description: \"Registered task name.\" } },\n\t\t},\n\t},\n});\n"]}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/harness/telemetry.ts"],"names":[],"mappings":"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","sourcesContent":["import { defineTelemetrySchema } from \"@earendil-works/pi-telemetry\";\n\nconst entry = {\n\tdescription: \"A transcript entry was committed; content remains in the transcript.\",\n\tattributes: {\n\t\t\"entry.id\": { type: \"number\", required: true, description: \"Transcript entry ID.\", cardinality: \"high\" },\n\t\t\"entry.kind\": { type: \"string\", required: true, description: \"Entry kind.\" },\n\t},\n} as const;\nconst reportAttributes = {\n\ttype: {\n\t\ttype: \"string\",\n\t\trequired: true,\n\t\tdescription: \"Report kind (`Report.kind`).\",\n\t\tvalues: [\n\t\t\t\"storage_failed\",\n\t\t\t\"task_faulted\",\n\t\t\t\"task_interrupted\",\n\t\t\t\"migration_failed\",\n\t\t\t\"task_outdated\",\n\t\t\t\"task_error\",\n\t\t\t\"extension_error\",\n\t\t\t\"host_error\",\n\t\t\t\"listener_error\",\n\t\t],\n\t},\n\treason: {\n\t\ttype: \"string\",\n\t\trequired: false,\n\t\tdescription: \"Fixed report reason, when present.\",\n\t\tvalues: [\"threw\", \"restart_limit\", \"interrupted\", \"missing_task\", \"task_too_old\", \"migration_failed\"],\n\t},\n\textension: { type: \"string\", required: false, description: \"Registered extension name, when present.\" },\n\t\"task.id\": { type: \"number\", required: false, description: \"Task ID, when present.\", cardinality: \"high\" },\n} as const;\nconst report = {\n\tdescription: \"A report was raised; no error payload is recorded.\",\n\tattributes: reportAttributes,\n} as const;\nconst submission = {\n\tdescription: \"A submission was settled.\",\n\tattributes: {\n\t\t\"submission.id\": { type: \"number\", required: true, description: \"Submission ID.\", cardinality: \"high\" },\n\t\tstatus: { type: \"string\", required: true, values: [\"done\", \"unanswered\"], description: \"Settlement.\" },\n\t\t\"answer.entry_id\": { type: \"number\", required: false, description: \"Answer entry ID.\", cardinality: \"high\" },\n\t},\n} as const;\n\n/** Durable's content-free span, event, and metric vocabulary. IDs address durable records, never content. */\nexport const DURABLE_TELEMETRY_SCHEMA = defineTelemetrySchema({\n\tversion: 1,\n\tspans: {\n\t\t\"pi.durable.submit\": {\n\t\t\tdescription:\n\t\t\t\t\"Public submission admission: with its commit for submit(draft, context); the admission only for submit(tx, draft), whose result is provisional (a later throw or storage failure of the caller's commit leaves no submission) and whose commit events go to the caller's commit context. Inputs and continues start root traces linked to their callers; writes are children. Internal admissions emit phase events only.\",\n\t\t\tparents: { kind: \"any\" },\n\t\t\tstartAttributes: {\n\t\t\t\t\"submission.type\": {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tvalues: [\"input\", \"write\", \"continue\"],\n\t\t\t\t\tdescription: \"Submission type.\",\n\t\t\t\t},\n\t\t\t\t\"conversation.id\": { type: \"number\", required: true, description: \"Conversation ID.\", cardinality: \"high\" },\n\t\t\t},\n\t\t\tendAttributes: {\n\t\t\t\t\"submission.id\": { type: \"number\", description: \"Admitted submission ID.\", cardinality: \"high\" },\n\t\t\t\tresult: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalues: [\"queued\", \"placed\", \"done\"],\n\t\t\t\t\tdescription: \"Admission result; stale writes report done.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tevents: { \"pi.durable.entry\": entry, \"pi.durable.submission\": submission, \"pi.durable.report\": report },\n\t\t\tstatus: { default: \"ok\", errorWhen: \"Admission failed.\" },\n\t\t},\n\t\t\"pi.durable.phase\": {\n\t\t\tdescription: \"One task phase invocation, including its decision commit, never a wait or restart.\",\n\t\t\tparents: { kind: \"any\" },\n\t\t\tstartAttributes: {\n\t\t\t\t\"task.id\": { type: \"number\", required: true, description: \"Task ID.\", cardinality: \"high\" },\n\t\t\t\t\"task.name\": { type: \"string\", required: true, description: \"Registered task name.\" },\n\t\t\t\tphase: { type: \"string\", required: true, description: \"Invoked checkpoint phase.\" },\n\t\t\t\tkind: { type: \"string\", required: true, values: [\"run\", \"abort\"], description: \"Invocation kind.\" },\n\t\t\t\tattempt: { type: \"number\", required: false, description: \"Checkpoint attempt, when present.\" },\n\t\t\t\tresumed: {\n\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tdescription: \"First invocation of a task loaded in this process.\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tendAttributes: {\n\t\t\t\toutcome: { type: \"string\", description: \"next=<phase>, waiting, sleeping, done, faulted, or aborted.\" },\n\t\t\t\t\"tool.name\": { type: \"string\", description: \"Called tool name.\" },\n\t\t\t\t\"tool.call_id\": { type: \"string\", description: \"Transcript tool call ID.\", cardinality: \"high\" },\n\t\t\t},\n\t\t\tevents: {\n\t\t\t\t\"pi.durable.entry\": entry,\n\t\t\t\t\"pi.durable.submission\": submission,\n\t\t\t\t\"pi.durable.report\": report,\n\t\t\t\t\"pi.durable.checkpoint\": {\n\t\t\t\t\tdescription: \"The running checkpoint's phase changed while the invocation continued.\",\n\t\t\t\t\tattributes: { phase: { type: \"string\", required: true, description: \"Committed checkpoint phase.\" } },\n\t\t\t\t},\n\t\t\t\t\"pi.durable.replay\": {\n\t\t\t\t\tdescription: \"A nested tool call was answered from its stored result.\",\n\t\t\t\t\tattributes: { \"tool.name\": { type: \"string\", required: true, description: \"Called tool name.\" } },\n\t\t\t\t},\n\t\t\t},\n\t\t\tstatus: {\n\t\t\t\tdefault: \"ok\",\n\t\t\t\terrorWhen:\n\t\t\t\t\t\"Faulted, failed, and orphaned outcomes use task_faulted, task_failed, and task_orphaned with a diagnostic capped at 500 characters. Aborted outcomes keep status ok.\",\n\t\t\t},\n\t\t},\n\t},\n\tmetrics: {\n\t\t\"pi.durable.reports\": {\n\t\t\tkind: \"counter\",\n\t\t\tdescription: \"Reports raised, grouped by their fixed kind.\",\n\t\t\tattributes: { type: reportAttributes.type },\n\t\t},\n\t\t\"pi.durable.phase.duration\": {\n\t\t\tkind: \"histogram\",\n\t\t\tunit: \"ms\",\n\t\t\tdescription: \"Duration of a phase invocation and its decision commit.\",\n\t\t\tattributes: {\n\t\t\t\ttask: { type: \"string\", required: true, description: \"Registered task name.\" },\n\t\t\t\tphase: { type: \"string\", required: true, description: \"Invoked checkpoint phase.\" },\n\t\t\t\toutcome: { type: \"string\", required: true, description: \"Phase outcome.\" },\n\t\t\t},\n\t\t},\n\t\t\"pi.durable.tasks.active\": {\n\t\t\tkind: \"upDownCounter\",\n\t\t\tdescription: \"Live tasks held by this Harness; decremented at terminal settlement or close.\",\n\t\t\tattributes: { task: { type: \"string\", required: true, description: \"Registered task name.\" } },\n\t\t},\n\t},\n});\n"]}
@@ -10,6 +10,8 @@ export type ToolTaskInput = {
10
10
  kind: "model";
11
11
  assistant: EntryId;
12
12
  callId: string;
13
+ /** A call to a tool its request did not offer: settles `tool_unavailable` without resolving the name. */
14
+ unoffered?: true;
13
15
  } | {
14
16
  kind: "nested";
15
17
  parent: TaskId;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/harness/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,kBAAkB,EAAkB,MAAM,uBAAuB,CAAC;AAWpH,OAAO,KAAK,EAA6B,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AASpG,OAAO,KAAK,EACX,cAAc,EACd,OAAO,EACP,UAAU,EACV,IAAI,EACJ,MAAM,EAIN,EAAE,EACF,UAAU,EACV,MAAM,aAAa,CAAC;AAarB,OAAO,KAAK,EACX,yBAAyB,EACzB,WAAW,EACX,cAAc,EAEd,mBAAmB,EAEnB,SAAS,EAET,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,MAAM,MAAM,aAAa,GACtB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEL,MAAM,MAAM,kBAAkB,GAC3B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;AACnB,2FAA2F;GACzF;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAQ7G,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG;IAC7B,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAChC,oHAAoH;IACpH,MAAM,CAAC,EAAE,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;CACvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,iEAQxB,CAAC;AAKH;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,oEAuFnB,CAAC;AAsnBH,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAE/E;AAwCD;;;GAGG;AACH,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC,UAAU,CAAC;IAAE,WAAW,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CAAC,CAkBxD"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/harness/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,kBAAkB,EAAkB,MAAM,uBAAuB,CAAC;AAWpH,OAAO,KAAK,EAA6B,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AAUpG,OAAO,KAAK,EACX,cAAc,EACd,OAAO,EACP,UAAU,EACV,IAAI,EACJ,MAAM,EAIN,EAAE,EACF,UAAU,EACV,MAAM,aAAa,CAAC;AAiBrB,OAAO,KAAK,EACX,yBAAyB,EACzB,WAAW,EACX,cAAc,EAEd,mBAAmB,EAEnB,SAAS,EAET,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,MAAM,MAAM,aAAa,GACtB;IACA,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,yGAAyG;IACzG,SAAS,CAAC,EAAE,IAAI,CAAC;CAChB,GACD;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEL,MAAM,MAAM,kBAAkB,GAC3B;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE;AACnB,2FAA2F;GACzF;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAQ7G,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG;IAC7B,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAChC,oHAAoH;IACpH,MAAM,CAAC,EAAE,kBAAkB,CAAC,yBAAyB,CAAC,CAAC;CACvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,iEAQxB,CAAC;AAKH;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,oEAgHnB,CAAC;AAqwBH,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAE/E;AA2CD;;;GAGG;AACH,wBAAsB,gBAAgB,CACrC,EAAE,EAAE,EAAE,EACN,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC,UAAU,CAAC;IAAE,WAAW,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CAAC,CAkBxD"}