@justjoshn/pi-pstack 0.0.0-stage → 0.15.36-pi.11

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 (644) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/LICENSE +21 -0
  3. package/README.md +100 -2
  4. package/agents/ci-watcher.md +28 -0
  5. package/agents/comment-sicko.md +32 -0
  6. package/agents/poteto-agent.md +9 -0
  7. package/agents/thermo-nuclear-code-quality-review.md +23 -0
  8. package/assets/logo.png +0 -0
  9. package/automations/benny/FOR_AGENTS.md +83 -0
  10. package/automations/benny/README.md +20 -0
  11. package/automations/benny/skills/reproduce-and-fix-issues/SKILL.md +310 -0
  12. package/automations/benny/skills/reproduce-and-fix-issues/references/control-adapter.md +169 -0
  13. package/automations/benny/skills/reproduce-and-fix-issues/references/feature-map.example.md +205 -0
  14. package/automations/benny/skills/reproduce-and-fix-issues/references/verify-existing-fix.md +93 -0
  15. package/automations/benny/skills/setup-benny/SKILL.md +254 -0
  16. package/automations/benny/skills/triage-issue-reports/SKILL.md +240 -0
  17. package/automations/benny/skills/triage-issue-reports/references/routing.example.md +61 -0
  18. package/automations/benny/templates/configuration.example.yaml +113 -0
  19. package/automations/benny/templates/reproduce-automation-prompt.md +49 -0
  20. package/automations/benny/templates/triage-automation-prompt.md +53 -0
  21. package/bin/pstack-routines-supervisor +9 -0
  22. package/docs/guide/01-setup.md +67 -0
  23. package/docs/guide/02-poteto-mode.md +139 -0
  24. package/docs/guide/03-understand.md +79 -0
  25. package/docs/guide/04-design.md +133 -0
  26. package/docs/guide/05-build-and-clean.md +83 -0
  27. package/docs/guide/06-verify-and-ship.md +162 -0
  28. package/docs/guide/07-overnight.md +122 -0
  29. package/docs/guide/08-principles.md +72 -0
  30. package/docs/guide/09-make-it-yours.md +100 -0
  31. package/docs/guide/10-recipes-and-pitfalls.md +182 -0
  32. package/docs/guide/README.md +38 -0
  33. package/docs/guide/images/design.jpg +0 -0
  34. package/docs/guide/images/overnight.jpg +0 -0
  35. package/docs/guide/images/recipes.jpg +0 -0
  36. package/docs/guide/images/router.jpg +0 -0
  37. package/docs/guide/images/understanding.jpg +0 -0
  38. package/docs/guide/images/verification.jpg +0 -0
  39. package/docs/native-gaps.md +73 -0
  40. package/docs/parity-reverse-engineering.md +94 -0
  41. package/docs/parity-status.md +113 -0
  42. package/licenses/cursor-team-kit.LICENSE +21 -0
  43. package/licenses/pstack.LICENSE +21 -0
  44. package/package.json +86 -4
  45. package/packaging/install-supervisor-unit.sh +164 -0
  46. package/packaging/launchd/com.pstack.routines-supervisor.plist.example +24 -0
  47. package/packaging/systemd/pstack-routines-supervisor.service.example +15 -0
  48. package/skills/architect/SKILL.md +79 -0
  49. package/skills/architect/references/design-red-flags.md +57 -0
  50. package/skills/architect/references/rationale-template.md +35 -0
  51. package/skills/architect/references/runner-prompt.md +20 -0
  52. package/skills/arena/SKILL.md +48 -0
  53. package/skills/automate-me/SKILL.md +104 -0
  54. package/skills/benchmark-checklist/SKILL.md +39 -0
  55. package/skills/blast-radius/SKILL.md +50 -0
  56. package/skills/bro/SKILL.md +7 -0
  57. package/skills/check-compiler-errors/SKILL.md +23 -0
  58. package/skills/control-cli/SKILL.md +109 -0
  59. package/skills/control-ui/SKILL.md +109 -0
  60. package/skills/correct/SKILL.md +32 -0
  61. package/skills/create-formal-verification-skill/SKILL.md +43 -0
  62. package/skills/create-skill/SKILL.md +548 -0
  63. package/skills/create-verification-skill/SKILL.md +44 -0
  64. package/skills/create-verification-skill/references/feature-map-example/README.md +47 -0
  65. package/skills/create-verification-skill/references/feature-map-example/create-note.md +39 -0
  66. package/skills/create-verification-skill/references/feature-map-example/search.md +45 -0
  67. package/skills/deslop/SKILL.md +22 -0
  68. package/skills/figure-it-out/SKILL.md +52 -0
  69. package/skills/fix-ci/SKILL.md +29 -0
  70. package/skills/fix-merge-conflicts/SKILL.md +32 -0
  71. package/skills/get-pr-comments/SKILL.md +23 -0
  72. package/skills/how/SKILL.md +36 -0
  73. package/skills/how/references/explainer-prompt.md +55 -0
  74. package/skills/how/references/explorer-prompt.md +35 -0
  75. package/skills/in-your-own-words/SKILL.md +7 -0
  76. package/skills/interrogate/SKILL.md +31 -0
  77. package/skills/ketchup/SKILL.md +43 -0
  78. package/skills/ketchup-video/SKILL.md +29 -0
  79. package/skills/loop-on-ci/SKILL.md +50 -0
  80. package/skills/maintain-formal-verification-skill/SKILL.md +58 -0
  81. package/skills/maintain-verification-skill/SKILL.md +39 -0
  82. package/skills/make-bot-ui/SKILL.md +104 -0
  83. package/skills/make-pr-easy-to-review/SKILL.md +59 -0
  84. package/skills/new-branch-and-pr/SKILL.md +29 -0
  85. package/skills/no-comments/SKILL.md +24 -0
  86. package/skills/no-inline-imports/SKILL.md +12 -0
  87. package/skills/poteto-help/SKILL.md +161 -0
  88. package/skills/poteto-help/references/prompting.md +51 -0
  89. package/skills/poteto-help/references/recipes.md +51 -0
  90. package/skills/poteto-mode/SKILL.md +151 -0
  91. package/skills/poteto-mode/playbooks/authoring-a-skill.md +12 -0
  92. package/skills/poteto-mode/playbooks/autonomous-run.md +13 -0
  93. package/skills/poteto-mode/playbooks/autopilot-full.md +25 -0
  94. package/skills/poteto-mode/playbooks/autopilot-stack.md +8 -0
  95. package/skills/poteto-mode/playbooks/babysit.md +23 -0
  96. package/skills/poteto-mode/playbooks/bug-fix.md +15 -0
  97. package/skills/poteto-mode/playbooks/eval.md +25 -0
  98. package/skills/poteto-mode/playbooks/feature.md +21 -0
  99. package/skills/poteto-mode/playbooks/hillclimb.md +21 -0
  100. package/skills/poteto-mode/playbooks/investigation.md +14 -0
  101. package/skills/poteto-mode/playbooks/multi-phase-plan.md +155 -0
  102. package/skills/poteto-mode/playbooks/opening-a-pr.md +34 -0
  103. package/skills/poteto-mode/playbooks/orchestrate.md +25 -0
  104. package/skills/poteto-mode/playbooks/pause-safely.md +10 -0
  105. package/skills/poteto-mode/playbooks/perf-issue.md +25 -0
  106. package/skills/poteto-mode/playbooks/prototype.md +14 -0
  107. package/skills/poteto-mode/playbooks/refactoring.md +16 -0
  108. package/skills/poteto-mode/playbooks/runtime-forensics.md +11 -0
  109. package/skills/poteto-mode/playbooks/session-pickup.md +11 -0
  110. package/skills/poteto-mode/playbooks/shipping.md +12 -0
  111. package/skills/poteto-mode/playbooks/trace-forensics.md +14 -0
  112. package/skills/poteto-mode/playbooks/visual-parity.md +11 -0
  113. package/skills/poteto-mode/playbooks/worktree-cleanup.md +12 -0
  114. package/skills/poteto-mode/references/bugbot-triage.md +142 -0
  115. package/skills/poteto-mode/scripts/bootstrap.ts +62 -0
  116. package/skills/poteto-mode/scripts/bun.lock +67 -0
  117. package/skills/poteto-mode/scripts/check-plan.mjs +205 -0
  118. package/skills/poteto-mode/scripts/check-plan.test.ts +110 -0
  119. package/skills/poteto-mode/scripts/package.json +16 -0
  120. package/skills/poteto-mode/scripts/watch-pr/cli.test.ts +224 -0
  121. package/skills/poteto-mode/scripts/watch-pr/cli.ts +223 -0
  122. package/skills/poteto-mode/scripts/watch-pr/fakes.test-helper.ts +129 -0
  123. package/skills/poteto-mode/scripts/watch-pr/github.test.ts +498 -0
  124. package/skills/poteto-mode/scripts/watch-pr/github.ts +726 -0
  125. package/skills/poteto-mode/scripts/watch-pr/policy.test.ts +482 -0
  126. package/skills/poteto-mode/scripts/watch-pr/policy.ts +842 -0
  127. package/skills/poteto-mode/scripts/watch-pr/render.ts +169 -0
  128. package/skills/poteto-mode/scripts/watch-pr/tsconfig.json +13 -0
  129. package/skills/poteto-mode/scripts/watch-pr/types.compile.ts +93 -0
  130. package/skills/poteto-mode/scripts/watch-pr/types.ts +414 -0
  131. package/skills/poteto-mode/scripts/watch-pr/watch-pr +6 -0
  132. package/skills/poteto-mode/scripts/worktree-audit.sh +156 -0
  133. package/skills/pr-review-canvas/SKILL.md +176 -0
  134. package/skills/pr-review-canvas/renderer.js +170 -0
  135. package/skills/pr-review-canvas/styles.css +96 -0
  136. package/skills/pr-review-canvas/template.html +18 -0
  137. package/skills/principle-attack-the-premise/SKILL.md +21 -0
  138. package/skills/principle-boundary-discipline/SKILL.md +34 -0
  139. package/skills/principle-build-the-lever/SKILL.md +23 -0
  140. package/skills/principle-encode-lessons-in-structure/SKILL.md +11 -0
  141. package/skills/principle-exhaust-the-design-space/SKILL.md +9 -0
  142. package/skills/principle-experience-first/SKILL.md +19 -0
  143. package/skills/principle-explain-the-number/SKILL.md +18 -0
  144. package/skills/principle-fix-root-causes/SKILL.md +21 -0
  145. package/skills/principle-foundational-thinking/SKILL.md +21 -0
  146. package/skills/principle-guard-the-context-window/SKILL.md +12 -0
  147. package/skills/principle-laziness-protocol/SKILL.md +10 -0
  148. package/skills/principle-make-operations-idempotent/SKILL.md +22 -0
  149. package/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +14 -0
  150. package/skills/principle-minimize-reader-load/SKILL.md +18 -0
  151. package/skills/principle-model-the-domain/SKILL.md +24 -0
  152. package/skills/principle-never-block-on-the-human/SKILL.md +15 -0
  153. package/skills/principle-outcome-oriented-execution/SKILL.md +21 -0
  154. package/skills/principle-prove-it-works/SKILL.md +22 -0
  155. package/skills/principle-redesign-from-first-principles/SKILL.md +16 -0
  156. package/skills/principle-separate-before-serializing-shared-state/SKILL.md +16 -0
  157. package/skills/principle-sequence-verifiable-units/SKILL.md +17 -0
  158. package/skills/principle-subtract-before-you-add/SKILL.md +18 -0
  159. package/skills/principle-test-behavior-not-implementation/SKILL.md +20 -0
  160. package/skills/principle-type-system-discipline/SKILL.md +13 -0
  161. package/skills/recall/SKILL.md +35 -0
  162. package/skills/reflect/SKILL.md +69 -0
  163. package/skills/reflect/references/divergent-reviewer.md +38 -0
  164. package/skills/reflect/references/judgment-reviewer.md +37 -0
  165. package/skills/reflect/references/synthesizer.md +56 -0
  166. package/skills/reflect/references/tooling-reviewer.md +48 -0
  167. package/skills/review-and-ship/SKILL.md +41 -0
  168. package/skills/run-smoke-tests/SKILL.md +42 -0
  169. package/skills/setup-pstack/SKILL.md +74 -0
  170. package/skills/sharpen/SKILL.md +16 -0
  171. package/skills/show-me-your-work/SKILL.md +82 -0
  172. package/skills/show-me-your-work/references/decision-log-template.tsv +1 -0
  173. package/skills/show-me-your-work/scripts/log.sh +42 -0
  174. package/skills/statechart/SKILL.md +82 -0
  175. package/skills/statechart/references/render.md +93 -0
  176. package/skills/statechart/scripts/backends/cfg.ts +33 -0
  177. package/skills/statechart/scripts/backends/mermaid.ts +201 -0
  178. package/skills/statechart/scripts/backends/plain-text.ts +72 -0
  179. package/skills/statechart/scripts/backends/report.ts +177 -0
  180. package/skills/statechart/scripts/frontends/config.ts +276 -0
  181. package/skills/statechart/scripts/frontends/dot.ts +74 -0
  182. package/skills/statechart/scripts/frontends/marks.ts +93 -0
  183. package/skills/statechart/scripts/frontends/messages.ts +52 -0
  184. package/skills/statechart/scripts/frontends/spec.ts +114 -0
  185. package/skills/statechart/scripts/frontends/trace.ts +24 -0
  186. package/skills/statechart/scripts/frontends/value.ts +166 -0
  187. package/skills/statechart/scripts/frontends/verdict.ts +40 -0
  188. package/skills/statechart/scripts/frontends/view.ts +119 -0
  189. package/skills/statechart/scripts/ir.ts +547 -0
  190. package/skills/statechart/scripts/package.json +11 -0
  191. package/skills/statechart/scripts/passes/annotate.ts +128 -0
  192. package/skills/statechart/scripts/passes/label.ts +269 -0
  193. package/skills/statechart/scripts/passes/lift.ts +85 -0
  194. package/skills/statechart/scripts/passes/loop-check.ts +68 -0
  195. package/skills/statechart/scripts/passes/paths.ts +60 -0
  196. package/skills/statechart/scripts/passes/reach.ts +135 -0
  197. package/skills/statechart/scripts/passes/region-check.ts +97 -0
  198. package/skills/statechart/scripts/passes/regions.ts +295 -0
  199. package/skills/statechart/scripts/pipeline.ts +76 -0
  200. package/skills/statechart/scripts/run.ts +481 -0
  201. package/skills/statechart/scripts/statechart +29 -0
  202. package/skills/statechart/scripts/statechart.ts +164 -0
  203. package/skills/statechart/scripts/test/ConfigOracle.java +63 -0
  204. package/skills/statechart/scripts/test/chart.test.ts +1210 -0
  205. package/skills/statechart/scripts/test/charts/Braces.mmd +7 -0
  206. package/skills/statechart/scripts/test/charts/Escapes.mmd +11 -0
  207. package/skills/statechart/scripts/test/charts/Phases.mmd +29 -0
  208. package/skills/statechart/scripts/test/cli.test.ts +1314 -0
  209. package/skills/statechart/scripts/test/config-fuzz.test.ts +263 -0
  210. package/skills/statechart/scripts/test/corpus/Counter/ChartRun.out +57 -0
  211. package/skills/statechart/scripts/test/corpus/Counter/Counter.cfg +3 -0
  212. package/skills/statechart/scripts/test/corpus/Counter/Counter.tla +10 -0
  213. package/skills/statechart/scripts/test/corpus/Counter/chart.mmd +9 -0
  214. package/skills/statechart/scripts/test/corpus/Counter/graph.dot +16 -0
  215. package/skills/statechart/scripts/test/corpus/Counter/report.md +7 -0
  216. package/skills/statechart/scripts/test/corpus/Counter/sany.out +2 -0
  217. package/skills/statechart/scripts/test/corpus/Counter/verdict-1.out +49 -0
  218. package/skills/statechart/scripts/test/corpus/CounterAction/ChartRun.out +60 -0
  219. package/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.cfg +4 -0
  220. package/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.tla +22 -0
  221. package/skills/statechart/scripts/test/corpus/CounterAction/chart.mmd +26 -0
  222. package/skills/statechart/scripts/test/corpus/CounterAction/graph.dot +19 -0
  223. package/skills/statechart/scripts/test/corpus/CounterAction/report.md +20 -0
  224. package/skills/statechart/scripts/test/corpus/CounterAction/sany.out +2 -0
  225. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.exit +1 -0
  226. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.out +56 -0
  227. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.exit +1 -0
  228. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.out +82 -0
  229. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-3.out +57 -0
  230. package/skills/statechart/scripts/test/corpus/CounterDeadlock/ChartRun.out +59 -0
  231. package/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.cfg +3 -0
  232. package/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.tla +11 -0
  233. package/skills/statechart/scripts/test/corpus/CounterDeadlock/chart.mmd +22 -0
  234. package/skills/statechart/scripts/test/corpus/CounterDeadlock/graph.dot +16 -0
  235. package/skills/statechart/scripts/test/corpus/CounterDeadlock/report.md +17 -0
  236. package/skills/statechart/scripts/test/corpus/CounterDeadlock/sany.out +2 -0
  237. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.exit +1 -0
  238. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.out +56 -0
  239. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.exit +1 -0
  240. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.out +77 -0
  241. package/skills/statechart/scripts/test/corpus/CounterFan/ChartRun.out +69 -0
  242. package/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.cfg +2 -0
  243. package/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.tla +11 -0
  244. package/skills/statechart/scripts/test/corpus/CounterFan/chart.mmd +85 -0
  245. package/skills/statechart/scripts/test/corpus/CounterFan/graph.dot +70 -0
  246. package/skills/statechart/scripts/test/corpus/CounterFan/report.md +12 -0
  247. package/skills/statechart/scripts/test/corpus/CounterFan/sany.out +2 -0
  248. package/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.exit +1 -0
  249. package/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.out +67 -0
  250. package/skills/statechart/scripts/test/corpus/CounterFan/verdict-2.out +57 -0
  251. package/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.exit +1 -0
  252. package/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.out +85 -0
  253. package/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.cfg +6 -0
  254. package/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.tla +13 -0
  255. package/skills/statechart/scripts/test/corpus/CounterGuard/chart.mmd +5 -0
  256. package/skills/statechart/scripts/test/corpus/CounterGuard/graph.dot +10 -0
  257. package/skills/statechart/scripts/test/corpus/CounterGuard/report.md +31 -0
  258. package/skills/statechart/scripts/test/corpus/CounterGuard/sany.out +2 -0
  259. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.exit +1 -0
  260. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.out +64 -0
  261. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.exit +1 -0
  262. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.out +77 -0
  263. package/skills/statechart/scripts/test/corpus/CounterInitPast/ChartRun.out +55 -0
  264. package/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.cfg +3 -0
  265. package/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.tla +10 -0
  266. package/skills/statechart/scripts/test/corpus/CounterInitPast/chart.mmd +12 -0
  267. package/skills/statechart/scripts/test/corpus/CounterInitPast/graph.dot +6 -0
  268. package/skills/statechart/scripts/test/corpus/CounterInitPast/report.md +12 -0
  269. package/skills/statechart/scripts/test/corpus/CounterInitPast/sany.out +2 -0
  270. package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.exit +1 -0
  271. package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.out +33 -0
  272. package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-2.out +54 -0
  273. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/ChartRun.out +54 -0
  274. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.cfg +3 -0
  275. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.tla +10 -0
  276. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/chart.mmd +1 -0
  277. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/graph.dot +6 -0
  278. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/report.md +7 -0
  279. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/sany.out +2 -0
  280. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/verdict-1.out +46 -0
  281. package/skills/statechart/scripts/test/corpus/CounterInstance/ChartRun.out +59 -0
  282. package/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.cfg +2 -0
  283. package/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.tla +10 -0
  284. package/skills/statechart/scripts/test/corpus/CounterInstance/CounterSteps.tla +6 -0
  285. package/skills/statechart/scripts/test/corpus/CounterInstance/chart.mmd +17 -0
  286. package/skills/statechart/scripts/test/corpus/CounterInstance/graph.dot +15 -0
  287. package/skills/statechart/scripts/test/corpus/CounterInstance/report.md +14 -0
  288. package/skills/statechart/scripts/test/corpus/CounterInstance/sany.out +3 -0
  289. package/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.exit +1 -0
  290. package/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.out +78 -0
  291. package/skills/statechart/scripts/test/corpus/CounterJump/ChartRun.out +59 -0
  292. package/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.cfg +3 -0
  293. package/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.tla +19 -0
  294. package/skills/statechart/scripts/test/corpus/CounterJump/chart.mmd +26 -0
  295. package/skills/statechart/scripts/test/corpus/CounterJump/graph.dot +22 -0
  296. package/skills/statechart/scripts/test/corpus/CounterJump/report.md +12 -0
  297. package/skills/statechart/scripts/test/corpus/CounterJump/sany.out +2 -0
  298. package/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.exit +1 -0
  299. package/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.out +58 -0
  300. package/skills/statechart/scripts/test/corpus/CounterJump/verdict-2.out +57 -0
  301. package/skills/statechart/scripts/test/corpus/CounterLoop/ChartRun.out +57 -0
  302. package/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.cfg +2 -0
  303. package/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.tla +11 -0
  304. package/skills/statechart/scripts/test/corpus/CounterLoop/chart.mmd +17 -0
  305. package/skills/statechart/scripts/test/corpus/CounterLoop/graph.dot +15 -0
  306. package/skills/statechart/scripts/test/corpus/CounterLoop/report.md +14 -0
  307. package/skills/statechart/scripts/test/corpus/CounterLoop/sany.out +2 -0
  308. package/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.exit +1 -0
  309. package/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.out +76 -0
  310. package/skills/statechart/scripts/test/corpus/CounterOrder/ChartRun.out +59 -0
  311. package/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.cfg +3 -0
  312. package/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.tla +11 -0
  313. package/skills/statechart/scripts/test/corpus/CounterOrder/chart.mmd +19 -0
  314. package/skills/statechart/scripts/test/corpus/CounterOrder/graph.dot +10 -0
  315. package/skills/statechart/scripts/test/corpus/CounterOrder/report.md +15 -0
  316. package/skills/statechart/scripts/test/corpus/CounterOrder/sany.out +2 -0
  317. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.exit +1 -0
  318. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.out +56 -0
  319. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.exit +1 -0
  320. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.out +67 -0
  321. package/skills/statechart/scripts/test/corpus/CounterRules/ChartRun.out +62 -0
  322. package/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.cfg +6 -0
  323. package/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.tla +24 -0
  324. package/skills/statechart/scripts/test/corpus/CounterRules/Moves.tla +5 -0
  325. package/skills/statechart/scripts/test/corpus/CounterRules/chart.mmd +22 -0
  326. package/skills/statechart/scripts/test/corpus/CounterRules/graph.dot +10 -0
  327. package/skills/statechart/scripts/test/corpus/CounterRules/report.md +23 -0
  328. package/skills/statechart/scripts/test/corpus/CounterRules/sany.out +3 -0
  329. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.exit +1 -0
  330. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.out +58 -0
  331. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.exit +1 -0
  332. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.out +66 -0
  333. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.exit +1 -0
  334. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.out +74 -0
  335. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-4.out +59 -0
  336. package/skills/statechart/scripts/test/corpus/CounterStart/ChartRun.out +58 -0
  337. package/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.cfg +3 -0
  338. package/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.tla +15 -0
  339. package/skills/statechart/scripts/test/corpus/CounterStart/chart.mmd +18 -0
  340. package/skills/statechart/scripts/test/corpus/CounterStart/graph.dot +13 -0
  341. package/skills/statechart/scripts/test/corpus/CounterStart/report.md +11 -0
  342. package/skills/statechart/scripts/test/corpus/CounterStart/sany.out +2 -0
  343. package/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.exit +1 -0
  344. package/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.out +33 -0
  345. package/skills/statechart/scripts/test/corpus/CounterStart/verdict-2.out +57 -0
  346. package/skills/statechart/scripts/test/corpus/CounterStop/ChartRun.out +57 -0
  347. package/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.cfg +3 -0
  348. package/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.tla +15 -0
  349. package/skills/statechart/scripts/test/corpus/CounterStop/chart.mmd +7 -0
  350. package/skills/statechart/scripts/test/corpus/CounterStop/graph.dot +13 -0
  351. package/skills/statechart/scripts/test/corpus/CounterStop/report.md +6 -0
  352. package/skills/statechart/scripts/test/corpus/CounterStop/sany.out +2 -0
  353. package/skills/statechart/scripts/test/corpus/CounterStop/verdict-1.out +49 -0
  354. package/skills/statechart/scripts/test/corpus/CounterTie/ChartRun.out +61 -0
  355. package/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.cfg +4 -0
  356. package/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.tla +14 -0
  357. package/skills/statechart/scripts/test/corpus/CounterTie/chart.mmd +30 -0
  358. package/skills/statechart/scripts/test/corpus/CounterTie/graph.dot +19 -0
  359. package/skills/statechart/scripts/test/corpus/CounterTie/report.md +27 -0
  360. package/skills/statechart/scripts/test/corpus/CounterTie/sany.out +2 -0
  361. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.exit +1 -0
  362. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.out +56 -0
  363. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.exit +1 -0
  364. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.out +64 -0
  365. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.exit +1 -0
  366. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.out +87 -0
  367. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-4.out +57 -0
  368. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/ChartRun.out +60 -0
  369. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.cfg +3 -0
  370. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.tla +12 -0
  371. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/chart.mmd +23 -0
  372. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/graph.dot +19 -0
  373. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/report.md +11 -0
  374. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/sany.out +2 -0
  375. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.exit +1 -0
  376. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.out +56 -0
  377. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-2.out +57 -0
  378. package/skills/statechart/scripts/test/corpus/CounterView/ChartRun.out +61 -0
  379. package/skills/statechart/scripts/test/corpus/CounterView/CounterView.cfg +4 -0
  380. package/skills/statechart/scripts/test/corpus/CounterView/CounterView.tla +14 -0
  381. package/skills/statechart/scripts/test/corpus/CounterView/chart.mmd +23 -0
  382. package/skills/statechart/scripts/test/corpus/CounterView/graph.dot +19 -0
  383. package/skills/statechart/scripts/test/corpus/CounterView/report.md +27 -0
  384. package/skills/statechart/scripts/test/corpus/CounterView/sany.out +2 -0
  385. package/skills/statechart/scripts/test/corpus/CounterView/verdict-1.exit +1 -0
  386. package/skills/statechart/scripts/test/corpus/CounterView/verdict-1.out +56 -0
  387. package/skills/statechart/scripts/test/corpus/CounterView/verdict-2.exit +1 -0
  388. package/skills/statechart/scripts/test/corpus/CounterView/verdict-2.out +64 -0
  389. package/skills/statechart/scripts/test/corpus/CounterView/verdict-3.exit +1 -0
  390. package/skills/statechart/scripts/test/corpus/CounterView/verdict-3.out +87 -0
  391. package/skills/statechart/scripts/test/corpus/CounterView/verdict-4.out +57 -0
  392. package/skills/statechart/scripts/test/corpus/CounterView/view.mjs +1 -0
  393. package/skills/statechart/scripts/test/corpus/DieHard/ChartRun.out +59 -0
  394. package/skills/statechart/scripts/test/corpus/DieHard/DieHard.cfg +4 -0
  395. package/skills/statechart/scripts/test/corpus/DieHard/DieHard.tla +38 -0
  396. package/skills/statechart/scripts/test/corpus/DieHard/chart.mmd +92 -0
  397. package/skills/statechart/scripts/test/corpus/DieHard/graph.dot +126 -0
  398. package/skills/statechart/scripts/test/corpus/DieHard/report.md +17 -0
  399. package/skills/statechart/scripts/test/corpus/DieHard/sany.out +2 -0
  400. package/skills/statechart/scripts/test/corpus/DieHard/verdict-1.exit +1 -0
  401. package/skills/statechart/scripts/test/corpus/DieHard/verdict-1.out +91 -0
  402. package/skills/statechart/scripts/test/corpus/DieHard/verdict-2.out +57 -0
  403. package/skills/statechart/scripts/test/corpus/FirstRule/ChartRun.out +61 -0
  404. package/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.cfg +6 -0
  405. package/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.tla +11 -0
  406. package/skills/statechart/scripts/test/corpus/FirstRule/chart.mmd +22 -0
  407. package/skills/statechart/scripts/test/corpus/FirstRule/graph.dot +16 -0
  408. package/skills/statechart/scripts/test/corpus/FirstRule/report.md +25 -0
  409. package/skills/statechart/scripts/test/corpus/FirstRule/sany.out +2 -0
  410. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.exit +1 -0
  411. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.out +56 -0
  412. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.exit +1 -0
  413. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.out +64 -0
  414. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.exit +1 -0
  415. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.out +64 -0
  416. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.exit +1 -0
  417. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.out +77 -0
  418. package/skills/statechart/scripts/test/corpus/HiddenClock/ChartRun.out +57 -0
  419. package/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.cfg +4 -0
  420. package/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.tla +11 -0
  421. package/skills/statechart/scripts/test/corpus/HiddenClock/chart.mmd +13 -0
  422. package/skills/statechart/scripts/test/corpus/HiddenClock/graph.dot +12 -0
  423. package/skills/statechart/scripts/test/corpus/HiddenClock/report.md +11 -0
  424. package/skills/statechart/scripts/test/corpus/HiddenClock/sany.out +2 -0
  425. package/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.exit +1 -0
  426. package/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.out +72 -0
  427. package/skills/statechart/scripts/test/corpus/Login/ChartRun.out +57 -0
  428. package/skills/statechart/scripts/test/corpus/Login/Login.cfg +3 -0
  429. package/skills/statechart/scripts/test/corpus/Login/Login.tla +62 -0
  430. package/skills/statechart/scripts/test/corpus/Login/chart.mmd +27 -0
  431. package/skills/statechart/scripts/test/corpus/Login/graph.dot +40 -0
  432. package/skills/statechart/scripts/test/corpus/Login/report.md +7 -0
  433. package/skills/statechart/scripts/test/corpus/Login/sany.out +1 -0
  434. package/skills/statechart/scripts/test/corpus/Login/verdict-1.out +47 -0
  435. package/skills/statechart/scripts/test/corpus/Login/view.mjs +1 -0
  436. package/skills/statechart/scripts/test/corpus/LoginGuarded/ChartRun.out +57 -0
  437. package/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.cfg +2 -0
  438. package/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.tla +64 -0
  439. package/skills/statechart/scripts/test/corpus/LoginGuarded/chart.mmd +28 -0
  440. package/skills/statechart/scripts/test/corpus/LoginGuarded/graph.dot +37 -0
  441. package/skills/statechart/scripts/test/corpus/LoginGuarded/report.md +8 -0
  442. package/skills/statechart/scripts/test/corpus/LoginGuarded/sany.out +1 -0
  443. package/skills/statechart/scripts/test/corpus/LoginGuarded/verdict-1.out +47 -0
  444. package/skills/statechart/scripts/test/corpus/LoginGuarded/view.mjs +1 -0
  445. package/skills/statechart/scripts/test/corpus/LoginParallel/ChartRun.out +60 -0
  446. package/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.cfg +3 -0
  447. package/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.tla +64 -0
  448. package/skills/statechart/scripts/test/corpus/LoginParallel/chart.mmd +44 -0
  449. package/skills/statechart/scripts/test/corpus/LoginParallel/graph.dot +58 -0
  450. package/skills/statechart/scripts/test/corpus/LoginParallel/report.md +17 -0
  451. package/skills/statechart/scripts/test/corpus/LoginParallel/sany.out +1 -0
  452. package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.exit +1 -0
  453. package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.out +83 -0
  454. package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-2.out +57 -0
  455. package/skills/statechart/scripts/test/corpus/LoginParallel/view.mjs +1 -0
  456. package/skills/statechart/scripts/test/corpus/MediaPlayer/ChartRun.out +60 -0
  457. package/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.cfg +3 -0
  458. package/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.tla +103 -0
  459. package/skills/statechart/scripts/test/corpus/MediaPlayer/chart.mmd +43 -0
  460. package/skills/statechart/scripts/test/corpus/MediaPlayer/graph.dot +93 -0
  461. package/skills/statechart/scripts/test/corpus/MediaPlayer/report.md +14 -0
  462. package/skills/statechart/scripts/test/corpus/MediaPlayer/sany.out +1 -0
  463. package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.exit +1 -0
  464. package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.out +59 -0
  465. package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-2.out +72 -0
  466. package/skills/statechart/scripts/test/corpus/MediaPlayer/view.mjs +3 -0
  467. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/ChartRun.out +57 -0
  468. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.cfg +2 -0
  469. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.tla +100 -0
  470. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/chart.mmd +31 -0
  471. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/graph.dot +85 -0
  472. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/report.md +9 -0
  473. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/sany.out +1 -0
  474. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/verdict-1.out +47 -0
  475. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/view.mjs +3 -0
  476. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/ChartRun.out +59 -0
  477. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayer.tla +103 -0
  478. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.cfg +3 -0
  479. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.tla +6 -0
  480. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/chart.mmd +42 -0
  481. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/graph.dot +93 -0
  482. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/report.md +19 -0
  483. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/sany.out +2 -0
  484. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.exit +1 -0
  485. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.out +61 -0
  486. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-2.out +59 -0
  487. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-3.out +61 -0
  488. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.exit +1 -0
  489. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.out +66 -0
  490. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.exit +1 -0
  491. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.out +58 -0
  492. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-6.out +49 -0
  493. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/view.mjs +3 -0
  494. package/skills/statechart/scripts/test/corpus/PickWorker/ChartRun.out +57 -0
  495. package/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.cfg +6 -0
  496. package/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.tla +11 -0
  497. package/skills/statechart/scripts/test/corpus/PickWorker/chart.mmd +5 -0
  498. package/skills/statechart/scripts/test/corpus/PickWorker/graph.dot +11 -0
  499. package/skills/statechart/scripts/test/corpus/PickWorker/report.md +7 -0
  500. package/skills/statechart/scripts/test/corpus/PickWorker/sany.out +5 -0
  501. package/skills/statechart/scripts/test/corpus/PickWorker/verdict-1.out +70 -0
  502. package/skills/statechart/scripts/test/corpus/Shadow/ChartRun.out +61 -0
  503. package/skills/statechart/scripts/test/corpus/Shadow/Shadow.cfg +4 -0
  504. package/skills/statechart/scripts/test/corpus/Shadow/Shadow.tla +11 -0
  505. package/skills/statechart/scripts/test/corpus/Shadow/ShadowLib.tla +6 -0
  506. package/skills/statechart/scripts/test/corpus/Shadow/ShadowSub.tla +3 -0
  507. package/skills/statechart/scripts/test/corpus/Shadow/chart.mmd +9 -0
  508. package/skills/statechart/scripts/test/corpus/Shadow/graph.dot +16 -0
  509. package/skills/statechart/scripts/test/corpus/Shadow/report.md +8 -0
  510. package/skills/statechart/scripts/test/corpus/Shadow/sany.out +4 -0
  511. package/skills/statechart/scripts/test/corpus/Shadow/verdict-1.out +65 -0
  512. package/skills/statechart/scripts/test/corpus/SpacedNames/ChartRun.out +59 -0
  513. package/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.cfg +2 -0
  514. package/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.tla +9 -0
  515. package/skills/statechart/scripts/test/corpus/SpacedNames/chart.mmd +23 -0
  516. package/skills/statechart/scripts/test/corpus/SpacedNames/graph.dot +17 -0
  517. package/skills/statechart/scripts/test/corpus/SpacedNames/report.md +15 -0
  518. package/skills/statechart/scripts/test/corpus/SpacedNames/sany.out +1 -0
  519. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.exit +1 -0
  520. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.out +65 -0
  521. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.exit +1 -0
  522. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.out +75 -0
  523. package/skills/statechart/scripts/test/corpus/TwoPhase/ChartRun.out +69 -0
  524. package/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.cfg +3 -0
  525. package/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.tla +75 -0
  526. package/skills/statechart/scripts/test/corpus/TwoPhase/chart.mmd +60 -0
  527. package/skills/statechart/scripts/test/corpus/TwoPhase/graph.dot +297 -0
  528. package/skills/statechart/scripts/test/corpus/TwoPhase/report.md +20 -0
  529. package/skills/statechart/scripts/test/corpus/TwoPhase/sany.out +1 -0
  530. package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.exit +1 -0
  531. package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.out +95 -0
  532. package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-2.out +57 -0
  533. package/skills/statechart/scripts/test/corpus/TwoPhase/view.mjs +1 -0
  534. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/ChartRun.out +57 -0
  535. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.cfg +3 -0
  536. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.tla +75 -0
  537. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/chart.mmd +37 -0
  538. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/graph.dot +223 -0
  539. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/report.md +11 -0
  540. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/sany.out +1 -0
  541. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/verdict-1.out +47 -0
  542. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/view.mjs +1 -0
  543. package/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.exit +1 -0
  544. package/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.out +75 -0
  545. package/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.cfg +5 -0
  546. package/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.tla +11 -0
  547. package/skills/statechart/scripts/test/corpus/TypeGuard/chart.mmd +18 -0
  548. package/skills/statechart/scripts/test/corpus/TypeGuard/graph.dot +14 -0
  549. package/skills/statechart/scripts/test/corpus/TypeGuard/report.md +29 -0
  550. package/skills/statechart/scripts/test/corpus/TypeGuard/sany.out +2 -0
  551. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.exit +1 -0
  552. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.out +64 -0
  553. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.exit +1 -0
  554. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.out +75 -0
  555. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/ChartRun.out +58 -0
  556. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.cfg +2 -0
  557. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.tla +8 -0
  558. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/chart.mmd +22 -0
  559. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/graph.dot +16 -0
  560. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/report.md +15 -0
  561. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/sany.out +2 -0
  562. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.exit +1 -0
  563. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.out +56 -0
  564. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.exit +1 -0
  565. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.out +77 -0
  566. package/skills/statechart/scripts/test/corpus.test.ts +403 -0
  567. package/skills/statechart/scripts/test/differential.test.ts +565 -0
  568. package/skills/statechart/scripts/test/grid/Grid.cfg +2 -0
  569. package/skills/statechart/scripts/test/grid/Grid.tla +9 -0
  570. package/skills/statechart/scripts/test/grid/sany.out +2 -0
  571. package/skills/statechart/scripts/test/java.ts +63 -0
  572. package/skills/statechart/scripts/test/labels.ts +643 -0
  573. package/skills/statechart/scripts/test/messages.test.ts +212 -0
  574. package/skills/statechart/scripts/test/pipeline.test.ts +270 -0
  575. package/skills/statechart/scripts/test/plain-tlc.test.ts +255 -0
  576. package/skills/statechart/scripts/test/render.test.ts +81 -0
  577. package/skills/statechart/scripts/test/tlc-out.test.ts +90 -0
  578. package/skills/statechart/scripts/test/tlc.ts +158 -0
  579. package/skills/statechart/scripts/tsconfig.json +11 -0
  580. package/skills/statechart/scripts/worker.ts +35 -0
  581. package/skills/swarm/SKILL.md +41 -0
  582. package/skills/tdd/SKILL.md +42 -0
  583. package/skills/teach/SKILL.md +21 -0
  584. package/skills/technical-writing/SKILL.md +106 -0
  585. package/skills/thermo-nuclear-code-quality-review/SKILL.md +192 -0
  586. package/skills/typescript-best-practices/SKILL.md +32 -0
  587. package/skills/typescript-best-practices/references/patterns.md +328 -0
  588. package/skills/typescript-exhaustive-switch/SKILL.md +10 -0
  589. package/skills/unslop/SKILL.md +62 -0
  590. package/skills/verify-this/SKILL.md +74 -0
  591. package/skills/weekly-review/SKILL.md +32 -0
  592. package/skills/what-did-i-get-done/SKILL.md +31 -0
  593. package/skills/why/SKILL.md +98 -0
  594. package/skills/why/references/epistemics.md +71 -0
  595. package/skills/why/references/investigator-prompt.md +84 -0
  596. package/skills/why/references/source-playbook.md +17 -0
  597. package/skills/why/references/sources/code-archaeology.md +51 -0
  598. package/skills/why/references/sources/databricks.md +70 -0
  599. package/skills/why/references/sources/datadog.md +97 -0
  600. package/skills/why/references/sources/incident-postmortem.md +5 -0
  601. package/skills/why/references/sources/linear.md +48 -0
  602. package/skills/why/references/sources/notion.md +55 -0
  603. package/skills/why/references/sources/sentry.md +66 -0
  604. package/skills/why/references/sources/slack.md +17 -0
  605. package/skills/why/references/synthesizer-prompt.md +129 -0
  606. package/skills/workflow-from-chats/SKILL.md +50 -0
  607. package/src/aliases.ts +64 -0
  608. package/src/ask.ts +131 -0
  609. package/src/autocomplete.ts +21 -0
  610. package/src/child-env.ts +57 -0
  611. package/src/index.ts +138 -0
  612. package/src/loop.ts +238 -0
  613. package/src/mode.ts +180 -0
  614. package/src/modes.ts +8 -0
  615. package/src/path-skills.ts +104 -0
  616. package/src/paths.ts +90 -0
  617. package/src/pi-command.ts +12 -0
  618. package/src/plan.ts +226 -0
  619. package/src/readonly-shell.ts +107 -0
  620. package/src/rule.ts +56 -0
  621. package/src/sections.ts +136 -0
  622. package/src/subscriptions/cron.ts +75 -0
  623. package/src/subscriptions/durable-store.ts +531 -0
  624. package/src/subscriptions/durable-types.ts +69 -0
  625. package/src/subscriptions/ensure-supervisor.ts +67 -0
  626. package/src/subscriptions/github.ts +149 -0
  627. package/src/subscriptions/index.ts +575 -0
  628. package/src/subscriptions/supervisor-main.ts +134 -0
  629. package/src/subscriptions/supervisor.ts +325 -0
  630. package/src/subscriptions/webhook.ts +270 -0
  631. package/src/task/agents.ts +55 -0
  632. package/src/task/card.ts +61 -0
  633. package/src/task/format.ts +88 -0
  634. package/src/task/models.ts +147 -0
  635. package/src/task/progress.ts +112 -0
  636. package/src/task/records.ts +230 -0
  637. package/src/task/registry.ts +81 -0
  638. package/src/task/runner.ts +459 -0
  639. package/src/task/status.ts +170 -0
  640. package/src/task/stop.ts +100 -0
  641. package/src/task/tool.ts +560 -0
  642. package/src/task/worktree.ts +69 -0
  643. package/src/todo.ts +127 -0
  644. package/src/visualize.ts +244 -0
@@ -0,0 +1,112 @@
1
+ // A foreground Task blocks the parent until the child settles. Cursor streams the child's conversation steps into the
2
+ // card meanwhile; Pi has no channel for them, so the child's own RPC events are reduced to a short progress line.
3
+ const STEP_LIMIT = 4;
4
+ const ARG_LIMIT = 80;
5
+ const LATEST_LIMIT = 120;
6
+ const THROTTLE_MS = 750;
7
+
8
+ export interface ProgressState {
9
+ steps: string[];
10
+ latest?: string;
11
+ /** Steps run in total, since only the last few are kept. */
12
+ count?: number;
13
+ }
14
+
15
+ /** One line for a tool that started, or undefined for another event. Long or structured arguments are shortened. */
16
+ export function stepLine(event: { type?: string; toolName?: string; args?: unknown }): string | undefined {
17
+ if (event.type !== 'tool_execution_start' || typeof event.toolName !== 'string') return undefined;
18
+ const args = event.args as Record<string, unknown> | undefined;
19
+ const hint = args?.['command'] ?? args?.['path'] ?? args?.['pattern'] ?? args?.['description'] ?? '';
20
+ const text = typeof hint === 'string' ? hint : '';
21
+ const single = text.replace(/\s+/g, ' ').trim();
22
+ const shown = single.length > ARG_LIMIT ? `${single.slice(0, ARG_LIMIT - 1)}…` : single;
23
+ return shown === '' ? `· ${event.toolName}` : `· ${event.toolName}: ${shown}`;
24
+ }
25
+
26
+ /** The latest assistant prose, reduced to its first non-empty line. */
27
+ export function latestLine(event: { type?: string; message?: { role?: string; content?: unknown } }): string | undefined {
28
+ if (event.type !== 'message_end' || event.message?.role !== 'assistant' || !Array.isArray(event.message.content)) return undefined;
29
+ const text = (event.message.content as { type?: string; text?: string }[])
30
+ .filter((part) => part.type === 'text' && typeof part.text === 'string')
31
+ .map((part) => part.text as string)
32
+ .join('\n');
33
+ const line = text
34
+ .split('\n')
35
+ .find((candidate) => candidate.trim() !== '')
36
+ ?.trim();
37
+ if (line === undefined || line === '') return undefined;
38
+ return line.length > LATEST_LIMIT ? `${line.slice(0, LATEST_LIMIT - 1)}…` : line;
39
+ }
40
+
41
+ /** The running card's body: how many steps ran, the last few, and the child's latest prose. */
42
+ export function progressText(state: ProgressState): string {
43
+ const count = state.count ?? state.steps.length;
44
+ const header = count === 0 ? 'Running…' : `Running: ${count} step${count === 1 ? '' : 's'}`;
45
+ return [header, ...state.steps, ...(state.latest === undefined ? [] : ['', state.latest])].join('\n');
46
+ }
47
+
48
+ export type ProgressUpdate = { content: { type: 'text'; text: string }[]; details: unknown };
49
+ export type ProgressSend = (update: ProgressUpdate) => void;
50
+
51
+ export interface ProgressHandle {
52
+ onEvent: (event: { type: string } & Record<string, unknown>) => void;
53
+ stop: () => void;
54
+ }
55
+
56
+ /**
57
+ * Feeds child events into one throttled card update. The first event sends at once so a slow child still shows
58
+ * something; later ones are coalesced, and stop() drops a pending update so it cannot land after the final result.
59
+ */
60
+ export function createProgress(update: ProgressSend | undefined, details: () => unknown, now: () => number = Date.now): ProgressHandle {
61
+ const state: ProgressState = { steps: [], count: 0 };
62
+ let timer: ReturnType<typeof setTimeout> | undefined;
63
+ let lastSent = 0;
64
+ let stopped = false;
65
+ let stepped = false;
66
+
67
+ const send = () => {
68
+ timer = undefined;
69
+ if (stopped) return;
70
+ lastSent = now();
71
+ update?.({ content: [{ type: 'text', text: progressText(state) }], details: details() });
72
+ };
73
+ const schedule = () => {
74
+ if (update === undefined || stopped || timer !== undefined) return;
75
+ if (lastSent === 0) {
76
+ send();
77
+ return;
78
+ }
79
+ timer = setTimeout(send, Math.max(0, THROTTLE_MS - (now() - lastSent)));
80
+ timer.unref?.();
81
+ };
82
+
83
+ return {
84
+ onEvent: (event) => {
85
+ const step = stepLine(event);
86
+ if (step !== undefined) {
87
+ state.count = (state.count ?? 0) + 1;
88
+ state.steps = [...state.steps, step].slice(-STEP_LIMIT);
89
+ // The first tool step always shows, even when prose just reset the throttle, so the card is never stepless.
90
+ if (stepped) {
91
+ schedule();
92
+ } else {
93
+ stepped = true;
94
+ if (timer !== undefined) clearTimeout(timer);
95
+ timer = undefined;
96
+ send();
97
+ }
98
+ return;
99
+ }
100
+ const latest = latestLine(event);
101
+ if (latest !== undefined) {
102
+ state.latest = latest;
103
+ schedule();
104
+ }
105
+ },
106
+ stop: () => {
107
+ stopped = true;
108
+ if (timer !== undefined) clearTimeout(timer);
109
+ timer = undefined;
110
+ },
111
+ };
112
+ }
@@ -0,0 +1,230 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+
4
+ import { parseSessionEntries, SessionManager } from '@earendil-works/pi-coding-agent';
5
+ import type { ModelSpec } from './models.ts';
6
+ import type { Worktree } from './worktree.ts';
7
+
8
+ /** What resume needs to restart an agent the way it first ran. */
9
+ export interface AgentRecord {
10
+ agentId: string;
11
+ type: string;
12
+ model?: ModelSpec;
13
+ readonly: boolean;
14
+ /** The directory the agent was launched from; a cloud agent runs in `worktree` instead. */
15
+ cwd: string;
16
+ /** The main chat's workspace that owns this record when it differs from `cwd` (a descendant of a cloud worker). */
17
+ workspaceRoot?: string;
18
+ createdAt: string;
19
+ /** 1 for a subagent of the main chat, 2 for a subagent of a subagent; absent in records written before it existed. */
20
+ depth?: number;
21
+ worktree?: Worktree;
22
+ /** The agent whose transcript this one started as a copy of (Task `fork`). */
23
+ forkedFrom?: string;
24
+ }
25
+
26
+ function isWorktree(value: unknown): value is Worktree {
27
+ const worktree = value as Partial<Worktree> | null;
28
+ return typeof worktree === 'object' && worktree !== null && (['path', 'cwd', 'branch', 'base', 'commit'] as const).every((key) => typeof worktree[key] === 'string');
29
+ }
30
+
31
+ function isModel(value: unknown): value is ModelSpec {
32
+ const model = value as Partial<ModelSpec> | null;
33
+ return typeof model === 'object' && model !== null && typeof model.provider === 'string' && typeof model.id === 'string' && (model.thinking === undefined || typeof model.thinking === 'string');
34
+ }
35
+
36
+ function isRecord(value: unknown, agentId: string): value is AgentRecord {
37
+ const record = value as Partial<AgentRecord> | null;
38
+ return (
39
+ typeof record === 'object' &&
40
+ record !== null &&
41
+ !Array.isArray(record) &&
42
+ record.agentId === agentId &&
43
+ typeof record.type === 'string' &&
44
+ typeof record.readonly === 'boolean' &&
45
+ typeof record.cwd === 'string' &&
46
+ (record.workspaceRoot === undefined || typeof record.workspaceRoot === 'string') &&
47
+ typeof record.createdAt === 'string' &&
48
+ (record.model === undefined || isModel(record.model)) &&
49
+ (record.depth === undefined || Number.isInteger(record.depth)) &&
50
+ (record.worktree === undefined || isWorktree(record.worktree)) &&
51
+ (record.forkedFrom === undefined || typeof record.forkedFrom === 'string')
52
+ );
53
+ }
54
+
55
+ export function writeRecord(dir: string, record: AgentRecord): void {
56
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
57
+ const path = join(dir, `${record.agentId}.json`);
58
+ const temporary = `${path}.${process.pid}.tmp`;
59
+ writeFileSync(temporary, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
60
+ renameSync(temporary, path);
61
+ }
62
+
63
+ export function readRecord(dir: string, agentId: string): AgentRecord | undefined {
64
+ const path = join(dir, `${agentId}.json`);
65
+ if (!existsSync(path)) return undefined;
66
+ const unreadable = new Error(`Agent record ${path} is unreadable; delete it and start a new agent.`);
67
+ let value: unknown;
68
+ try {
69
+ value = JSON.parse(readFileSync(path, 'utf8'));
70
+ } catch (error) {
71
+ if (error instanceof SyntaxError) throw unreadable;
72
+ throw error;
73
+ }
74
+ if (!isRecord(value, agentId)) throw unreadable;
75
+ return value;
76
+ }
77
+
78
+ /** Pi names a session file `<timestamp>_<session id>.jsonl`; the agent ID is the session ID. */
79
+ export function transcriptFor(dir: string, agentId: string): string | undefined {
80
+ if (!existsSync(dir)) return undefined;
81
+ const file = readdirSync(dir).find((name) => name.endsWith(`_${agentId}.jsonl`));
82
+ return file === undefined ? undefined : join(dir, file);
83
+ }
84
+
85
+ /** The working directory a Pi session file's header names, or undefined without a readable header. */
86
+ function sessionCwd(file: string): string | undefined {
87
+ const [header] = parseSessionEntries(readFileSync(file, 'utf8').split('\n', 1)[0] ?? '');
88
+ return header?.type === 'session' && typeof header.cwd === 'string' && header.cwd !== '' ? header.cwd : undefined;
89
+ }
90
+
91
+ /**
92
+ * Starts `agentId`'s transcript as a copy of `sourceId`'s, through Pi's own session fork: a new session ID in the
93
+ * header, the source as its parent session, and the source's working directory, so `--session-id` finds it where the
94
+ * source ran. Returns the new transcript path.
95
+ */
96
+ export function forkTranscript(dir: string, sourceId: string, agentId: string, turns?: number): string {
97
+ const source = transcriptFor(dir, sourceId);
98
+ if (source === undefined) throw new Error(`Agent ${sourceId} has no transcript to fork.`);
99
+ const cwd = sessionCwd(source);
100
+ if (cwd === undefined) throw new Error(`Agent ${sourceId}'s transcript ${source} has no session header, so it cannot be forked.`);
101
+ const fork = SessionManager.forkFrom(source, cwd, dir, { id: agentId });
102
+ const file = fork.getSessionFile();
103
+ if (file === undefined) throw new Error(`Pi did not write a transcript for the fork of agent ${sourceId}.`);
104
+ if (turns !== undefined) keepFirstTurns(fork, file, turns);
105
+ return file;
106
+ }
107
+
108
+ /**
109
+ * Cuts the copy's active branch just before its (turns + 1)th user message, so the fork opens at the end of turn `turns`.
110
+ * `SessionManager.createBranchedSession(leafId)` mints its own session ID and file name, so it cannot truncate the file
111
+ * `forkFrom(..., { id: agentId })` wrote under the agent's ID (docs/native-gaps.md).
112
+ */
113
+ function keepFirstTurns(fork: SessionManager, file: string, turns: number): void {
114
+ const branch = fork.getBranch();
115
+ const cut = branch.filter((entry) => entry.type === 'message' && entry.message.role === 'user')[turns];
116
+ if (cut === undefined) return;
117
+ const kept = [fork.getHeader(), ...branch.slice(0, branch.indexOf(cut))];
118
+ writeFileSync(file, kept.map((entry) => `${JSON.stringify(entry)}\n`).join(''), { mode: 0o600 });
119
+ }
120
+
121
+ /**
122
+ * Tools a writable launch gives back: those a launch-only readonly run (plan mode) took from the agent's last writable
123
+ * loadout. Pi restores the tool loadout a session last recorded, so without them the agent would stay readonly.
124
+ */
125
+ export function readonlyLaunchRestores(transcript: string): string[] {
126
+ const active = new Set<string>();
127
+ let writable: string[] = [];
128
+ for (const entry of SessionManager.open(transcript).getBranch()) {
129
+ if (entry.type !== 'message' || entry.message.role !== 'system') continue;
130
+ for (const tool of entry.message.toolsRemoved ?? []) active.delete(tool.name);
131
+ for (const tool of entry.message.toolsAdded ?? []) active.add(tool.name);
132
+ if (active.has('write') || active.has('edit')) writable = [...active];
133
+ }
134
+ return writable.filter((name) => !active.has(name));
135
+ }
136
+
137
+ /** IDs of every agent with a record in `dir`. */
138
+ export function recordIds(dir: string): string[] {
139
+ if (!existsSync(dir)) return [];
140
+ return readdirSync(dir)
141
+ .filter((name) => name.endsWith('.json'))
142
+ .map((name) => name.slice(0, -'.json'.length));
143
+ }
144
+
145
+ function alive(pid: number): boolean {
146
+ try {
147
+ process.kill(pid, 0);
148
+ return true;
149
+ } catch (error) {
150
+ return (error as NodeJS.ErrnoException).code === 'EPERM';
151
+ }
152
+ }
153
+
154
+ const isPid = (value: number) => Number.isInteger(value) && value > 0;
155
+
156
+ /** The live pid the agent's run lock names, or undefined when no live process holds it. */
157
+ export function runningPid(dir: string, agentId: string): number | undefined {
158
+ const holder = holderOf(join(dir, `${agentId}.lock`));
159
+ return holder !== undefined && isPid(holder) && alive(holder) ? holder : undefined;
160
+ }
161
+
162
+ /** The pid a lock names: undefined when the file is gone, NaN when it holds no readable pid. */
163
+ function holderOf(path: string): number | undefined {
164
+ try {
165
+ return Number.parseInt(readFileSync(path, 'utf8'), 10);
166
+ } catch (error) {
167
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;
168
+ throw error;
169
+ }
170
+ }
171
+
172
+ function createExclusive(path: string): boolean {
173
+ try {
174
+ writeFileSync(path, String(process.pid), { flag: 'wx', mode: 0o600 });
175
+ return true;
176
+ } catch (error) {
177
+ if ((error as NodeJS.ErrnoException).code === 'EEXIST') return false;
178
+ throw error;
179
+ }
180
+ }
181
+
182
+ function writeAtomically(path: string, text: string): void {
183
+ const temporary = `${path}.${process.pid}.tmp`;
184
+ writeFileSync(temporary, text, { mode: 0o600 });
185
+ renameSync(temporary, path);
186
+ }
187
+
188
+ const stillRunning = (agentId: string, holder: number | undefined, path: string) =>
189
+ new Error(`Agent ${agentId} is still running (pid ${holder !== undefined && isPid(holder) ? holder : 'unknown'}; lock ${path}). Wait for its completion before resuming it.`);
190
+
191
+ export interface RunLock {
192
+ /** Names the process that writes the transcript, so the lock stays held exactly as long as that process lives. */
193
+ holdFor: (pid: number) => void;
194
+ /** Removes the lock unless another holder has taken it over since. */
195
+ release: () => void;
196
+ }
197
+
198
+ /**
199
+ * Pi appends to a session file without a lock, so two processes on one agent ID would interleave its transcript.
200
+ * The lock file holds the pid of the process writing the transcript. A lock without a readable pid counts as held.
201
+ * A dead holder's lock is removed only if it still names that holder, then created again exclusively; two
202
+ * processes taking over the same stale lock in the narrow window between that re-read and the removal can both succeed.
203
+ */
204
+ export function acquireRunLock(dir: string, agentId: string): RunLock {
205
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
206
+ const path = join(dir, `${agentId}.lock`);
207
+ for (let attempt = 0; attempt < 2; attempt += 1) {
208
+ if (createExclusive(path)) {
209
+ let owner = process.pid;
210
+ return {
211
+ holdFor: (pid) => {
212
+ writeAtomically(path, String(pid));
213
+ owner = pid;
214
+ },
215
+ // Best effort: a lock left behind names a pid that will be dead, so the next acquire takes it over.
216
+ release: () => {
217
+ try {
218
+ if (holderOf(path) === owner) rmSync(path, { force: true });
219
+ } catch (error) {
220
+ if (!['EACCES', 'EPERM', 'EROFS', 'EBUSY', 'EIO'].includes((error as NodeJS.ErrnoException).code ?? '')) throw error;
221
+ }
222
+ },
223
+ };
224
+ }
225
+ const holder = holderOf(path);
226
+ if (holder !== undefined && (!isPid(holder) || alive(holder))) throw stillRunning(agentId, holder, path);
227
+ if (holder !== undefined && holderOf(path) === holder) rmSync(path, { force: true });
228
+ }
229
+ throw stillRunning(agentId, holderOf(path), path);
230
+ }
@@ -0,0 +1,81 @@
1
+ import type { AgentActivityOutcome, BoundaryResult, ExtensionAPI, ExtensionContext, SessionBoundaryDraft } from '@earendil-works/pi-coding-agent';
2
+ import { isOneShot } from '../modes.ts';
3
+ import { type NotificationFields, notificationText } from './format.ts';
4
+ import type { ChildHandle, ChildOutcome } from './runner.ts';
5
+
6
+ export const NOTIFICATION_TYPE = 'pstack/task';
7
+
8
+ interface Running {
9
+ settled: Promise<void>;
10
+ handle: ChildHandle;
11
+ /** How the child runs now, which can be stricter than its record (plan mode). */
12
+ readonly: boolean;
13
+ background: boolean;
14
+ }
15
+
16
+ export interface BackgroundNotice {
17
+ title: string;
18
+ toolCallId: string;
19
+ mode: ExtensionContext['mode'];
20
+ detailFor: (outcome: ChildOutcome) => Pick<NotificationFields, 'status' | 'detail' | 'usage'>;
21
+ }
22
+
23
+ /**
24
+ * Every running child of this runtime, foreground and background, so one agent ID never has two writers here.
25
+ * Background completions become notices: a follow-up message in long-lived sessions, and a settle-time entry in
26
+ * one-shot print and JSON runs, which wait for them before exiting.
27
+ */
28
+ export function createSubagentRegistry(pi: ExtensionAPI) {
29
+ const running = new Map<string, Running>();
30
+ const pending: NotificationFields[] = [];
31
+ let retired = false;
32
+
33
+ const deliver = (fields: NotificationFields, mode: ExtensionContext['mode']) => {
34
+ if (isOneShot(mode)) pending.push(fields);
35
+ else pi.sendMessage({ customType: NOTIFICATION_TYPE, content: notificationText(fields), display: true, details: fields }, { triggerTurn: true, deliverAs: 'followUp' });
36
+ };
37
+
38
+ /** Registers synchronously, before any await in the caller, so a sibling call in the same message sees it. */
39
+ const track = (agentId: string, handle: ChildHandle, release: () => void, readonly: boolean, notice?: BackgroundNotice) => {
40
+ const settled = handle.done.then((outcome) => {
41
+ running.delete(agentId);
42
+ release();
43
+ // Shutdown killed this child; the retired runtime's pi must not be touched.
44
+ if (retired || notice === undefined) return;
45
+ deliver({ ...notice.detailFor(outcome), agentId, title: notice.title, toolCallId: notice.toolCallId }, notice.mode);
46
+ });
47
+ running.set(agentId, { settled, handle, readonly, background: notice !== undefined });
48
+ };
49
+
50
+ const backgroundRunning = () => [...running.values()].filter((entry) => entry.background);
51
+
52
+ /** An aborted run ends now: a one-shot run does not hold its exit for background subagents after Escape or a watchdog abort. */
53
+ const beforeSettle = async (ctx: ExtensionContext, outcome: AgentActivityOutcome, entries: readonly SessionBoundaryDraft[]): Promise<BoundaryResult | undefined> => {
54
+ if (!isOneShot(ctx.mode) || outcome === 'aborted' || (pending.length === 0 && backgroundRunning().length === 0)) return undefined;
55
+ if (pending.length === 0) await Promise.race(backgroundRunning().map((entry) => entry.settled));
56
+ const ready = pending.splice(0);
57
+ // Appending keeps entries another extension proposed at this boundary; returning a fresh list would drop them.
58
+ return {
59
+ entries: [...entries, ...ready.map((fields) => ({ type: 'custom_message' as const, customType: NOTIFICATION_TYPE, content: notificationText(fields), display: true, details: fields }))],
60
+ continue: true,
61
+ };
62
+ };
63
+
64
+ const shutdown = (): number => {
65
+ retired = true;
66
+ const background = backgroundRunning().length;
67
+ for (const entry of running.values()) entry.handle.kill();
68
+ running.clear();
69
+ pending.splice(0);
70
+ return background;
71
+ };
72
+
73
+ return {
74
+ isRunning: (agentId: string) => running.has(agentId),
75
+ get: (agentId: string): Pick<Running, 'handle' | 'readonly'> | undefined => running.get(agentId),
76
+ hasBackgroundWork: () => backgroundRunning().length > 0,
77
+ track,
78
+ beforeSettle,
79
+ shutdown,
80
+ };
81
+ }