@llblab/pi-kit 0.1.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 (523) hide show
  1. package/AGENTS.md +35 -0
  2. package/BACKLOG.md +3 -0
  3. package/CHANGELOG.md +9 -0
  4. package/LICENSE +21 -0
  5. package/README.md +43 -0
  6. package/node_modules/@llblab/pi-actors/AGENTS.md +150 -0
  7. package/node_modules/@llblab/pi-actors/BACKLOG.md +6 -0
  8. package/node_modules/@llblab/pi-actors/CHANGELOG.md +865 -0
  9. package/node_modules/@llblab/pi-actors/README.md +231 -0
  10. package/node_modules/@llblab/pi-actors/banner.jpg +0 -0
  11. package/node_modules/@llblab/pi-actors/dist/fixtures/protocol/artifact-manifest.json +9 -0
  12. package/node_modules/@llblab/pi-actors/dist/fixtures/protocol/control-endpoint.json +6 -0
  13. package/node_modules/@llblab/pi-actors/dist/fixtures/protocol/control-record.json +9 -0
  14. package/node_modules/@llblab/pi-actors/dist/fixtures/protocol/recipe-summary.json +8 -0
  15. package/node_modules/@llblab/pi-actors/dist/fixtures/protocol/run-state.json +10 -0
  16. package/node_modules/@llblab/pi-actors/dist/fixtures/protocol/trace-event.json +9 -0
  17. package/node_modules/@llblab/pi-actors/dist/index.d.ts +7 -0
  18. package/node_modules/@llblab/pi-actors/dist/index.js +17 -0
  19. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.d.ts +146 -0
  20. package/node_modules/@llblab/pi-actors/dist/lib/async-runs.js +800 -0
  21. package/node_modules/@llblab/pi-actors/dist/lib/automatic-review-runtime.d.ts +20 -0
  22. package/node_modules/@llblab/pi-actors/dist/lib/automatic-review-runtime.js +103 -0
  23. package/node_modules/@llblab/pi-actors/dist/lib/command-templates.d.ts +85 -0
  24. package/node_modules/@llblab/pi-actors/dist/lib/command-templates.js +804 -0
  25. package/node_modules/@llblab/pi-actors/dist/lib/config.d.ts +34 -0
  26. package/node_modules/@llblab/pi-actors/dist/lib/config.js +216 -0
  27. package/node_modules/@llblab/pi-actors/dist/lib/control-projection.d.ts +20 -0
  28. package/node_modules/@llblab/pi-actors/dist/lib/control-projection.js +66 -0
  29. package/node_modules/@llblab/pi-actors/dist/lib/control.d.ts +15 -0
  30. package/node_modules/@llblab/pi-actors/dist/lib/control.js +97 -0
  31. package/node_modules/@llblab/pi-actors/dist/lib/draft-consolidation-transaction.d.ts +65 -0
  32. package/node_modules/@llblab/pi-actors/dist/lib/draft-consolidation-transaction.js +610 -0
  33. package/node_modules/@llblab/pi-actors/dist/lib/draft-consolidation.d.ts +35 -0
  34. package/node_modules/@llblab/pi-actors/dist/lib/draft-consolidation.js +126 -0
  35. package/node_modules/@llblab/pi-actors/dist/lib/draft-review.d.ts +56 -0
  36. package/node_modules/@llblab/pi-actors/dist/lib/draft-review.js +254 -0
  37. package/node_modules/@llblab/pi-actors/dist/lib/draft-sleep.d.ts +65 -0
  38. package/node_modules/@llblab/pi-actors/dist/lib/draft-sleep.js +467 -0
  39. package/node_modules/@llblab/pi-actors/dist/lib/execution-output.d.ts +25 -0
  40. package/node_modules/@llblab/pi-actors/dist/lib/execution-output.js +88 -0
  41. package/node_modules/@llblab/pi-actors/dist/lib/execution-sessions.d.ts +17 -0
  42. package/node_modules/@llblab/pi-actors/dist/lib/execution-sessions.js +85 -0
  43. package/node_modules/@llblab/pi-actors/dist/lib/execution.d.ts +99 -0
  44. package/node_modules/@llblab/pi-actors/dist/lib/execution.js +725 -0
  45. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.d.ts +21 -0
  46. package/node_modules/@llblab/pi-actors/dist/lib/extension-runtime.js +141 -0
  47. package/node_modules/@llblab/pi-actors/dist/lib/file-state.d.ts +18 -0
  48. package/node_modules/@llblab/pi-actors/dist/lib/file-state.js +310 -0
  49. package/node_modules/@llblab/pi-actors/dist/lib/identity.d.ts +9 -0
  50. package/node_modules/@llblab/pi-actors/dist/lib/identity.js +27 -0
  51. package/node_modules/@llblab/pi-actors/dist/lib/inspector-actions.d.ts +16 -0
  52. package/node_modules/@llblab/pi-actors/dist/lib/inspector-actions.js +57 -0
  53. package/node_modules/@llblab/pi-actors/dist/lib/inspector-command.d.ts +7 -0
  54. package/node_modules/@llblab/pi-actors/dist/lib/inspector-command.js +37 -0
  55. package/node_modules/@llblab/pi-actors/dist/lib/inspector-overlay.d.ts +100 -0
  56. package/node_modules/@llblab/pi-actors/dist/lib/inspector-overlay.js +824 -0
  57. package/node_modules/@llblab/pi-actors/dist/lib/inspector.d.ts +20 -0
  58. package/node_modules/@llblab/pi-actors/dist/lib/inspector.js +136 -0
  59. package/node_modules/@llblab/pi-actors/dist/lib/limits.d.ts +28 -0
  60. package/node_modules/@llblab/pi-actors/dist/lib/limits.js +28 -0
  61. package/node_modules/@llblab/pi-actors/dist/lib/model-context.d.ts +56 -0
  62. package/node_modules/@llblab/pi-actors/dist/lib/model-context.js +220 -0
  63. package/node_modules/@llblab/pi-actors/dist/lib/observability.d.ts +186 -0
  64. package/node_modules/@llblab/pi-actors/dist/lib/observability.js +951 -0
  65. package/node_modules/@llblab/pi-actors/dist/lib/paths.d.ts +27 -0
  66. package/node_modules/@llblab/pi-actors/dist/lib/paths.js +72 -0
  67. package/node_modules/@llblab/pi-actors/dist/lib/pi.d.ts +19 -0
  68. package/node_modules/@llblab/pi-actors/dist/lib/pi.js +21 -0
  69. package/node_modules/@llblab/pi-actors/dist/lib/preflight-diagnostics.d.ts +27 -0
  70. package/node_modules/@llblab/pi-actors/dist/lib/preflight-diagnostics.js +86 -0
  71. package/node_modules/@llblab/pi-actors/dist/lib/prompts.d.ts +24 -0
  72. package/node_modules/@llblab/pi-actors/dist/lib/prompts.js +49 -0
  73. package/node_modules/@llblab/pi-actors/dist/lib/recipe-control.d.ts +7 -0
  74. package/node_modules/@llblab/pi-actors/dist/lib/recipe-control.js +43 -0
  75. package/node_modules/@llblab/pi-actors/dist/lib/recipes-context.d.ts +36 -0
  76. package/node_modules/@llblab/pi-actors/dist/lib/recipes-context.js +197 -0
  77. package/node_modules/@llblab/pi-actors/dist/lib/recipes-discovery.d.ts +77 -0
  78. package/node_modules/@llblab/pi-actors/dist/lib/recipes-discovery.js +783 -0
  79. package/node_modules/@llblab/pi-actors/dist/lib/recipes-references.d.ts +113 -0
  80. package/node_modules/@llblab/pi-actors/dist/lib/recipes-references.js +1108 -0
  81. package/node_modules/@llblab/pi-actors/dist/lib/recipes-usage.d.ts +21 -0
  82. package/node_modules/@llblab/pi-actors/dist/lib/recipes-usage.js +494 -0
  83. package/node_modules/@llblab/pi-actors/dist/lib/registry.d.ts +67 -0
  84. package/node_modules/@llblab/pi-actors/dist/lib/registry.js +504 -0
  85. package/node_modules/@llblab/pi-actors/dist/lib/review-control.d.ts +14 -0
  86. package/node_modules/@llblab/pi-actors/dist/lib/review-control.js +110 -0
  87. package/node_modules/@llblab/pi-actors/dist/lib/review-diagnostics.d.ts +11 -0
  88. package/node_modules/@llblab/pi-actors/dist/lib/review-diagnostics.js +148 -0
  89. package/node_modules/@llblab/pi-actors/dist/lib/review-projection.d.ts +14 -0
  90. package/node_modules/@llblab/pi-actors/dist/lib/review-projection.js +166 -0
  91. package/node_modules/@llblab/pi-actors/dist/lib/run-evidence-policy.d.ts +95 -0
  92. package/node_modules/@llblab/pi-actors/dist/lib/run-evidence-policy.js +177 -0
  93. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.d.ts +18 -0
  94. package/node_modules/@llblab/pi-actors/dist/lib/run-ui-runtime.js +125 -0
  95. package/node_modules/@llblab/pi-actors/dist/lib/runs-artifacts.d.ts +21 -0
  96. package/node_modules/@llblab/pi-actors/dist/lib/runs-artifacts.js +68 -0
  97. package/node_modules/@llblab/pi-actors/dist/lib/runs-control-delivery.d.ts +28 -0
  98. package/node_modules/@llblab/pi-actors/dist/lib/runs-control-delivery.js +150 -0
  99. package/node_modules/@llblab/pi-actors/dist/lib/runs-control.d.ts +21 -0
  100. package/node_modules/@llblab/pi-actors/dist/lib/runs-control.js +89 -0
  101. package/node_modules/@llblab/pi-actors/dist/lib/runs-controls.d.ts +39 -0
  102. package/node_modules/@llblab/pi-actors/dist/lib/runs-controls.js +283 -0
  103. package/node_modules/@llblab/pi-actors/dist/lib/runs-identity.d.ts +5 -0
  104. package/node_modules/@llblab/pi-actors/dist/lib/runs-identity.js +11 -0
  105. package/node_modules/@llblab/pi-actors/dist/lib/runs-index.d.ts +27 -0
  106. package/node_modules/@llblab/pi-actors/dist/lib/runs-index.js +142 -0
  107. package/node_modules/@llblab/pi-actors/dist/lib/runs-ownership.d.ts +7 -0
  108. package/node_modules/@llblab/pi-actors/dist/lib/runs-ownership.js +96 -0
  109. package/node_modules/@llblab/pi-actors/dist/lib/runs-parent-teardown.d.ts +51 -0
  110. package/node_modules/@llblab/pi-actors/dist/lib/runs-parent-teardown.js +172 -0
  111. package/node_modules/@llblab/pi-actors/dist/lib/runs-process.d.ts +22 -0
  112. package/node_modules/@llblab/pi-actors/dist/lib/runs-process.js +125 -0
  113. package/node_modules/@llblab/pi-actors/dist/lib/runs-retention.d.ts +18 -0
  114. package/node_modules/@llblab/pi-actors/dist/lib/runs-retention.js +108 -0
  115. package/node_modules/@llblab/pi-actors/dist/lib/runs-start.d.ts +12 -0
  116. package/node_modules/@llblab/pi-actors/dist/lib/runs-start.js +68 -0
  117. package/node_modules/@llblab/pi-actors/dist/lib/runs-status.d.ts +10 -0
  118. package/node_modules/@llblab/pi-actors/dist/lib/runs-status.js +68 -0
  119. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.d.ts +48 -0
  120. package/node_modules/@llblab/pi-actors/dist/lib/runs-trace.js +491 -0
  121. package/node_modules/@llblab/pi-actors/dist/lib/runtime-identity.d.ts +7 -0
  122. package/node_modules/@llblab/pi-actors/dist/lib/runtime-identity.js +35 -0
  123. package/node_modules/@llblab/pi-actors/dist/lib/runtime-triage.d.ts +29 -0
  124. package/node_modules/@llblab/pi-actors/dist/lib/runtime-triage.js +60 -0
  125. package/node_modules/@llblab/pi-actors/dist/lib/runtime.d.ts +69 -0
  126. package/node_modules/@llblab/pi-actors/dist/lib/runtime.js +339 -0
  127. package/node_modules/@llblab/pi-actors/dist/lib/schema.d.ts +60 -0
  128. package/node_modules/@llblab/pi-actors/dist/lib/schema.js +428 -0
  129. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.d.ts +45 -0
  130. package/node_modules/@llblab/pi-actors/dist/lib/session-evidence.js +204 -0
  131. package/node_modules/@llblab/pi-actors/dist/lib/state-readers.d.ts +21 -0
  132. package/node_modules/@llblab/pi-actors/dist/lib/state-readers.js +74 -0
  133. package/node_modules/@llblab/pi-actors/dist/lib/temp.d.ts +10 -0
  134. package/node_modules/@llblab/pi-actors/dist/lib/temp.js +90 -0
  135. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-lineage-transaction.d.ts +27 -0
  136. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-lineage-transaction.js +597 -0
  137. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-lineage.d.ts +24 -0
  138. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-lineage.js +98 -0
  139. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-scheduler.d.ts +80 -0
  140. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-scheduler.js +494 -0
  141. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-transaction.d.ts +50 -0
  142. package/node_modules/@llblab/pi-actors/dist/lib/tool-review-transaction.js +362 -0
  143. package/node_modules/@llblab/pi-actors/dist/lib/tool-review.d.ts +56 -0
  144. package/node_modules/@llblab/pi-actors/dist/lib/tool-review.js +197 -0
  145. package/node_modules/@llblab/pi-actors/dist/lib/tools-access.d.ts +19 -0
  146. package/node_modules/@llblab/pi-actors/dist/lib/tools-access.js +44 -0
  147. package/node_modules/@llblab/pi-actors/dist/lib/tools-inspect.d.ts +15 -0
  148. package/node_modules/@llblab/pi-actors/dist/lib/tools-inspect.js +532 -0
  149. package/node_modules/@llblab/pi-actors/dist/lib/tools-local.d.ts +17 -0
  150. package/node_modules/@llblab/pi-actors/dist/lib/tools-local.js +191 -0
  151. package/node_modules/@llblab/pi-actors/dist/lib/tools-message.d.ts +9 -0
  152. package/node_modules/@llblab/pi-actors/dist/lib/tools-message.js +139 -0
  153. package/node_modules/@llblab/pi-actors/dist/lib/tools-register.d.ts +18 -0
  154. package/node_modules/@llblab/pi-actors/dist/lib/tools-register.js +41 -0
  155. package/node_modules/@llblab/pi-actors/dist/lib/tools-response.d.ts +20 -0
  156. package/node_modules/@llblab/pi-actors/dist/lib/tools-response.js +243 -0
  157. package/node_modules/@llblab/pi-actors/dist/lib/tools-spawn.d.ts +15 -0
  158. package/node_modules/@llblab/pi-actors/dist/lib/tools-spawn.js +133 -0
  159. package/node_modules/@llblab/pi-actors/dist/lib/tools.d.ts +28 -0
  160. package/node_modules/@llblab/pi-actors/dist/lib/tools.js +49 -0
  161. package/node_modules/@llblab/pi-actors/dist/lib/trace-projection.d.ts +22 -0
  162. package/node_modules/@llblab/pi-actors/dist/lib/trace-projection.js +231 -0
  163. package/node_modules/@llblab/pi-actors/dist/pi-actors/index.js +1 -0
  164. package/node_modules/@llblab/pi-actors/dist/scripts/async-runner.mjs +555 -0
  165. package/node_modules/@llblab/pi-actors/dist/scripts/build-dist.mjs +60 -0
  166. package/node_modules/@llblab/pi-actors/dist/scripts/conformance.mjs +63 -0
  167. package/node_modules/@llblab/pi-actors/dist/skills/actors/SKILL.md +126 -0
  168. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/command-validate.json +13 -0
  169. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/jsonl-tail.json +10 -0
  170. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/recipe-validate.json +11 -0
  171. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/resource-locker-snapshot.json +11 -0
  172. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/resource-locker.json +25 -0
  173. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/run-ops-snapshot.json +15 -0
  174. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/run-state-files.json +13 -0
  175. package/node_modules/@llblab/pi-actors/dist/skills/actors/recipes/run-summary.json +9 -0
  176. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/diagnostics.md +44 -0
  177. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/persistent-tools.md +76 -0
  178. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/recipes.md +51 -0
  179. package/node_modules/@llblab/pi-actors/dist/skills/actors/references/runs.md +41 -0
  180. package/node_modules/@llblab/pi-actors/dist/skills/actors/scripts/resource-locker.mjs +425 -0
  181. package/node_modules/@llblab/pi-actors/dist/skills/actors/scripts/run-utils.mjs +164 -0
  182. package/node_modules/@llblab/pi-actors/dist/skills/actors/scripts/validate-recipe.mjs +370 -0
  183. package/node_modules/@llblab/pi-actors/dist/skills/artifacts/SKILL.md +33 -0
  184. package/node_modules/@llblab/pi-actors/dist/skills/artifacts/recipes/bundle.json +77 -0
  185. package/node_modules/@llblab/pi-actors/dist/skills/artifacts/recipes/file-write.json +14 -0
  186. package/node_modules/@llblab/pi-actors/dist/skills/artifacts/recipes/manifest.json +14 -0
  187. package/node_modules/@llblab/pi-actors/dist/skills/artifacts/recipes/report.json +39 -0
  188. package/node_modules/@llblab/pi-actors/dist/skills/artifacts/recipes/write.json +53 -0
  189. package/node_modules/@llblab/pi-actors/dist/skills/artifacts/scripts/artifact-utils.mjs +63 -0
  190. package/node_modules/@llblab/pi-actors/dist/skills/music-player/SKILL.md +57 -0
  191. package/node_modules/@llblab/pi-actors/dist/skills/music-player/genapps/music-player.mjs +360 -0
  192. package/node_modules/@llblab/pi-actors/dist/skills/music-player/recipes/playback.json +29 -0
  193. package/node_modules/@llblab/pi-actors/dist/skills/music-player/scripts/playback-client.mjs +143 -0
  194. package/node_modules/@llblab/pi-actors/dist/skills/music-player/scripts/playback.mjs +1446 -0
  195. package/node_modules/@llblab/pi-actors/dist/skills/project-work/SKILL.md +37 -0
  196. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/changelog-head.json +11 -0
  197. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/changelog-section.json +11 -0
  198. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/docs-maintenance.json +66 -0
  199. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/git-log.json +11 -0
  200. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/git-status.json +9 -0
  201. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/markdown-index.json +14 -0
  202. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/package-summary.json +9 -0
  203. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/release-readiness.json +115 -0
  204. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/release-summary.json +74 -0
  205. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/repo-health.json +75 -0
  206. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/run-ops.json +56 -0
  207. package/node_modules/@llblab/pi-actors/dist/skills/project-work/recipes/skill-summary.json +11 -0
  208. package/node_modules/@llblab/pi-actors/dist/skills/project-work/scripts/project-utils.mjs +89 -0
  209. package/node_modules/@llblab/pi-actors/dist/skills/recipe-memory/SKILL.md +36 -0
  210. package/node_modules/@llblab/pi-actors/dist/skills/recipe-memory/recipes/draft-review.json +14 -0
  211. package/node_modules/@llblab/pi-actors/dist/skills/recipe-memory/recipes/tool-review.json +14 -0
  212. package/node_modules/@llblab/pi-actors/dist/skills/swarm/SKILL.md +84 -0
  213. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/architect.json +82 -0
  214. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/checkpoint-continuation.json +51 -0
  215. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/development-tasking.json +67 -0
  216. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/lens-review.json +63 -0
  217. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/quorum-review.json +65 -0
  218. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/research-synthesis.json +81 -0
  219. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/review-readiness.json +59 -0
  220. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-artifact.json +21 -0
  221. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-checkpoint.json +21 -0
  222. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-conflict-report.json +19 -0
  223. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-contradiction-map.json +20 -0
  224. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-critic.json +22 -0
  225. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-evidence-map.json +20 -0
  226. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-followup.json +21 -0
  227. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-judge.json +22 -0
  228. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-merge.json +24 -0
  229. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-normalize.json +20 -0
  230. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-plan.json +20 -0
  231. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-preflight.json +18 -0
  232. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-prompt.json +16 -0
  233. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-prompts.json +39 -0
  234. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-quorum.json +31 -0
  235. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-review-coordinator.json +170 -0
  236. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-review.json +26 -0
  237. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-task-card.json +22 -0
  238. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-tools.json +15 -0
  239. package/node_modules/@llblab/pi-actors/dist/skills/swarm/recipes/subagent-verify.json +23 -0
  240. package/node_modules/@llblab/pi-actors/dist/skills/swarm/references/development-swarm.md +189 -0
  241. package/node_modules/@llblab/pi-actors/dist/skills/swarm/references/review-swarms.md +115 -0
  242. package/node_modules/@llblab/pi-actors/docs/README.md +20 -0
  243. package/node_modules/@llblab/pi-actors/docs/actor-inspector.md +50 -0
  244. package/node_modules/@llblab/pi-actors/docs/async-runs.md +141 -0
  245. package/node_modules/@llblab/pi-actors/docs/command-templates.md +321 -0
  246. package/node_modules/@llblab/pi-actors/docs/recipe-library.md +89 -0
  247. package/node_modules/@llblab/pi-actors/docs/releasing.md +28 -0
  248. package/node_modules/@llblab/pi-actors/docs/template-recipes.md +175 -0
  249. package/node_modules/@llblab/pi-actors/docs/tool-registry.md +90 -0
  250. package/node_modules/@llblab/pi-actors/fixtures/protocol/artifact-manifest.json +9 -0
  251. package/node_modules/@llblab/pi-actors/fixtures/protocol/control-endpoint.json +6 -0
  252. package/node_modules/@llblab/pi-actors/fixtures/protocol/control-record.json +9 -0
  253. package/node_modules/@llblab/pi-actors/fixtures/protocol/recipe-summary.json +8 -0
  254. package/node_modules/@llblab/pi-actors/fixtures/protocol/run-state.json +10 -0
  255. package/node_modules/@llblab/pi-actors/fixtures/protocol/trace-event.json +9 -0
  256. package/node_modules/@llblab/pi-actors/index.ts +30 -0
  257. package/node_modules/@llblab/pi-actors/lib/async-runs.ts +1245 -0
  258. package/node_modules/@llblab/pi-actors/lib/automatic-review-runtime.ts +148 -0
  259. package/node_modules/@llblab/pi-actors/lib/command-templates.ts +1116 -0
  260. package/node_modules/@llblab/pi-actors/lib/config.ts +261 -0
  261. package/node_modules/@llblab/pi-actors/lib/control-projection.ts +105 -0
  262. package/node_modules/@llblab/pi-actors/lib/control.ts +117 -0
  263. package/node_modules/@llblab/pi-actors/lib/draft-consolidation-transaction.ts +821 -0
  264. package/node_modules/@llblab/pi-actors/lib/draft-consolidation.ts +181 -0
  265. package/node_modules/@llblab/pi-actors/lib/draft-review.ts +325 -0
  266. package/node_modules/@llblab/pi-actors/lib/draft-sleep.ts +575 -0
  267. package/node_modules/@llblab/pi-actors/lib/execution-output.ts +123 -0
  268. package/node_modules/@llblab/pi-actors/lib/execution-sessions.ts +111 -0
  269. package/node_modules/@llblab/pi-actors/lib/execution.ts +1153 -0
  270. package/node_modules/@llblab/pi-actors/lib/extension-runtime.ts +181 -0
  271. package/node_modules/@llblab/pi-actors/lib/file-state.ts +306 -0
  272. package/node_modules/@llblab/pi-actors/lib/identity.ts +29 -0
  273. package/node_modules/@llblab/pi-actors/lib/inspector-actions.ts +79 -0
  274. package/node_modules/@llblab/pi-actors/lib/inspector-command.ts +54 -0
  275. package/node_modules/@llblab/pi-actors/lib/inspector-overlay.ts +901 -0
  276. package/node_modules/@llblab/pi-actors/lib/inspector.ts +204 -0
  277. package/node_modules/@llblab/pi-actors/lib/limits.ts +29 -0
  278. package/node_modules/@llblab/pi-actors/lib/model-context.ts +359 -0
  279. package/node_modules/@llblab/pi-actors/lib/observability.ts +1337 -0
  280. package/node_modules/@llblab/pi-actors/lib/paths.ts +111 -0
  281. package/node_modules/@llblab/pi-actors/lib/pi.ts +47 -0
  282. package/node_modules/@llblab/pi-actors/lib/preflight-diagnostics.ts +132 -0
  283. package/node_modules/@llblab/pi-actors/lib/prompts.ts +69 -0
  284. package/node_modules/@llblab/pi-actors/lib/recipe-control.ts +52 -0
  285. package/node_modules/@llblab/pi-actors/lib/recipes-context.ts +268 -0
  286. package/node_modules/@llblab/pi-actors/lib/recipes-discovery.ts +1060 -0
  287. package/node_modules/@llblab/pi-actors/lib/recipes-references.ts +1598 -0
  288. package/node_modules/@llblab/pi-actors/lib/recipes-usage.ts +638 -0
  289. package/node_modules/@llblab/pi-actors/lib/registry.ts +806 -0
  290. package/node_modules/@llblab/pi-actors/lib/review-control.ts +136 -0
  291. package/node_modules/@llblab/pi-actors/lib/review-diagnostics.ts +164 -0
  292. package/node_modules/@llblab/pi-actors/lib/review-projection.ts +196 -0
  293. package/node_modules/@llblab/pi-actors/lib/run-evidence-policy.ts +242 -0
  294. package/node_modules/@llblab/pi-actors/lib/run-ui-runtime.ts +155 -0
  295. package/node_modules/@llblab/pi-actors/lib/runs-artifacts.ts +96 -0
  296. package/node_modules/@llblab/pi-actors/lib/runs-control-delivery.ts +209 -0
  297. package/node_modules/@llblab/pi-actors/lib/runs-control.ts +148 -0
  298. package/node_modules/@llblab/pi-actors/lib/runs-controls.ts +282 -0
  299. package/node_modules/@llblab/pi-actors/lib/runs-identity.ts +14 -0
  300. package/node_modules/@llblab/pi-actors/lib/runs-index.ts +192 -0
  301. package/node_modules/@llblab/pi-actors/lib/runs-ownership.ts +136 -0
  302. package/node_modules/@llblab/pi-actors/lib/runs-parent-teardown.ts +257 -0
  303. package/node_modules/@llblab/pi-actors/lib/runs-process.ts +174 -0
  304. package/node_modules/@llblab/pi-actors/lib/runs-retention.ts +140 -0
  305. package/node_modules/@llblab/pi-actors/lib/runs-start.ts +113 -0
  306. package/node_modules/@llblab/pi-actors/lib/runs-status.ts +101 -0
  307. package/node_modules/@llblab/pi-actors/lib/runs-trace.ts +611 -0
  308. package/node_modules/@llblab/pi-actors/lib/runtime-identity.ts +39 -0
  309. package/node_modules/@llblab/pi-actors/lib/runtime-triage.ts +106 -0
  310. package/node_modules/@llblab/pi-actors/lib/runtime.ts +430 -0
  311. package/node_modules/@llblab/pi-actors/lib/schema.ts +525 -0
  312. package/node_modules/@llblab/pi-actors/lib/session-evidence.ts +302 -0
  313. package/node_modules/@llblab/pi-actors/lib/state-readers.ts +93 -0
  314. package/node_modules/@llblab/pi-actors/lib/temp.ts +99 -0
  315. package/node_modules/@llblab/pi-actors/lib/tool-review-lineage-transaction.ts +881 -0
  316. package/node_modules/@llblab/pi-actors/lib/tool-review-lineage.ts +145 -0
  317. package/node_modules/@llblab/pi-actors/lib/tool-review-scheduler.ts +635 -0
  318. package/node_modules/@llblab/pi-actors/lib/tool-review-transaction.ts +563 -0
  319. package/node_modules/@llblab/pi-actors/lib/tool-review.ts +270 -0
  320. package/node_modules/@llblab/pi-actors/lib/tools-access.ts +68 -0
  321. package/node_modules/@llblab/pi-actors/lib/tools-inspect.ts +673 -0
  322. package/node_modules/@llblab/pi-actors/lib/tools-local.ts +303 -0
  323. package/node_modules/@llblab/pi-actors/lib/tools-message.ts +176 -0
  324. package/node_modules/@llblab/pi-actors/lib/tools-register.ts +63 -0
  325. package/node_modules/@llblab/pi-actors/lib/tools-response.ts +285 -0
  326. package/node_modules/@llblab/pi-actors/lib/tools-spawn.ts +212 -0
  327. package/node_modules/@llblab/pi-actors/lib/tools.ts +88 -0
  328. package/node_modules/@llblab/pi-actors/lib/trace-projection.ts +306 -0
  329. package/node_modules/@llblab/pi-actors/package.json +76 -0
  330. package/node_modules/@llblab/pi-actors/scripts/async-runner.mjs +555 -0
  331. package/node_modules/@llblab/pi-actors/scripts/build-dist.mjs +60 -0
  332. package/node_modules/@llblab/pi-actors/scripts/conformance.mjs +63 -0
  333. package/node_modules/@llblab/pi-actors/skills/actors/SKILL.md +126 -0
  334. package/node_modules/@llblab/pi-actors/skills/actors/recipes/command-validate.json +13 -0
  335. package/node_modules/@llblab/pi-actors/skills/actors/recipes/jsonl-tail.json +10 -0
  336. package/node_modules/@llblab/pi-actors/skills/actors/recipes/recipe-validate.json +11 -0
  337. package/node_modules/@llblab/pi-actors/skills/actors/recipes/resource-locker-snapshot.json +11 -0
  338. package/node_modules/@llblab/pi-actors/skills/actors/recipes/resource-locker.json +25 -0
  339. package/node_modules/@llblab/pi-actors/skills/actors/recipes/run-ops-snapshot.json +15 -0
  340. package/node_modules/@llblab/pi-actors/skills/actors/recipes/run-state-files.json +13 -0
  341. package/node_modules/@llblab/pi-actors/skills/actors/recipes/run-summary.json +9 -0
  342. package/node_modules/@llblab/pi-actors/skills/actors/references/diagnostics.md +44 -0
  343. package/node_modules/@llblab/pi-actors/skills/actors/references/persistent-tools.md +76 -0
  344. package/node_modules/@llblab/pi-actors/skills/actors/references/recipes.md +51 -0
  345. package/node_modules/@llblab/pi-actors/skills/actors/references/runs.md +41 -0
  346. package/node_modules/@llblab/pi-actors/skills/actors/scripts/resource-locker.mjs +425 -0
  347. package/node_modules/@llblab/pi-actors/skills/actors/scripts/run-utils.mjs +164 -0
  348. package/node_modules/@llblab/pi-actors/skills/actors/scripts/validate-recipe.mjs +370 -0
  349. package/node_modules/@llblab/pi-actors/skills/artifacts/SKILL.md +33 -0
  350. package/node_modules/@llblab/pi-actors/skills/artifacts/recipes/bundle.json +77 -0
  351. package/node_modules/@llblab/pi-actors/skills/artifacts/recipes/file-write.json +14 -0
  352. package/node_modules/@llblab/pi-actors/skills/artifacts/recipes/manifest.json +14 -0
  353. package/node_modules/@llblab/pi-actors/skills/artifacts/recipes/report.json +39 -0
  354. package/node_modules/@llblab/pi-actors/skills/artifacts/recipes/write.json +53 -0
  355. package/node_modules/@llblab/pi-actors/skills/artifacts/scripts/artifact-utils.mjs +63 -0
  356. package/node_modules/@llblab/pi-actors/skills/music-player/SKILL.md +57 -0
  357. package/node_modules/@llblab/pi-actors/skills/music-player/genapps/music-player.mjs +360 -0
  358. package/node_modules/@llblab/pi-actors/skills/music-player/recipes/playback.json +29 -0
  359. package/node_modules/@llblab/pi-actors/skills/music-player/scripts/playback-client.mjs +143 -0
  360. package/node_modules/@llblab/pi-actors/skills/music-player/scripts/playback.mjs +1446 -0
  361. package/node_modules/@llblab/pi-actors/skills/project-work/SKILL.md +37 -0
  362. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/changelog-head.json +11 -0
  363. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/changelog-section.json +11 -0
  364. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/docs-maintenance.json +66 -0
  365. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/git-log.json +11 -0
  366. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/git-status.json +9 -0
  367. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/markdown-index.json +14 -0
  368. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/package-summary.json +9 -0
  369. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/release-readiness.json +115 -0
  370. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/release-summary.json +74 -0
  371. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/repo-health.json +75 -0
  372. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/run-ops.json +56 -0
  373. package/node_modules/@llblab/pi-actors/skills/project-work/recipes/skill-summary.json +11 -0
  374. package/node_modules/@llblab/pi-actors/skills/project-work/scripts/project-utils.mjs +89 -0
  375. package/node_modules/@llblab/pi-actors/skills/recipe-memory/SKILL.md +36 -0
  376. package/node_modules/@llblab/pi-actors/skills/recipe-memory/recipes/draft-review.json +14 -0
  377. package/node_modules/@llblab/pi-actors/skills/recipe-memory/recipes/tool-review.json +14 -0
  378. package/node_modules/@llblab/pi-actors/skills/swarm/SKILL.md +84 -0
  379. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/architect.json +82 -0
  380. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/checkpoint-continuation.json +51 -0
  381. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/development-tasking.json +67 -0
  382. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/lens-review.json +63 -0
  383. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/quorum-review.json +65 -0
  384. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/research-synthesis.json +81 -0
  385. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/review-readiness.json +59 -0
  386. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-artifact.json +21 -0
  387. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-checkpoint.json +21 -0
  388. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-conflict-report.json +19 -0
  389. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-contradiction-map.json +20 -0
  390. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-critic.json +22 -0
  391. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-evidence-map.json +20 -0
  392. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-followup.json +21 -0
  393. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-judge.json +22 -0
  394. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-merge.json +24 -0
  395. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-normalize.json +20 -0
  396. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-plan.json +20 -0
  397. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-preflight.json +18 -0
  398. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-prompt.json +16 -0
  399. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-prompts.json +39 -0
  400. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-quorum.json +31 -0
  401. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-review-coordinator.json +170 -0
  402. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-review.json +26 -0
  403. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-task-card.json +22 -0
  404. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-tools.json +15 -0
  405. package/node_modules/@llblab/pi-actors/skills/swarm/recipes/subagent-verify.json +23 -0
  406. package/node_modules/@llblab/pi-actors/skills/swarm/references/development-swarm.md +189 -0
  407. package/node_modules/@llblab/pi-actors/skills/swarm/references/review-swarms.md +115 -0
  408. package/node_modules/@llblab/pi-codex-usage/AGENTS.md +17 -0
  409. package/node_modules/@llblab/pi-codex-usage/BACKLOG.md +8 -0
  410. package/node_modules/@llblab/pi-codex-usage/CHANGELOG.md +80 -0
  411. package/node_modules/@llblab/pi-codex-usage/LICENSE +22 -0
  412. package/node_modules/@llblab/pi-codex-usage/README.md +113 -0
  413. package/node_modules/@llblab/pi-codex-usage/banner.jpg +0 -0
  414. package/node_modules/@llblab/pi-codex-usage/index.ts +1525 -0
  415. package/node_modules/@llblab/pi-codex-usage/package.json +59 -0
  416. package/node_modules/@llblab/pi-grow-loop/AGENTS.md +56 -0
  417. package/node_modules/@llblab/pi-grow-loop/BACKLOG.md +3 -0
  418. package/node_modules/@llblab/pi-grow-loop/CHANGELOG.md +126 -0
  419. package/node_modules/@llblab/pi-grow-loop/README.md +216 -0
  420. package/node_modules/@llblab/pi-grow-loop/banner.jpg +0 -0
  421. package/node_modules/@llblab/pi-grow-loop/index.ts +219 -0
  422. package/node_modules/@llblab/pi-grow-loop/package.json +64 -0
  423. package/node_modules/@llblab/pi-grow-loop/skills/grow-loop/SKILL.md +131 -0
  424. package/node_modules/@llblab/pi-grow-loop/skills/while-true/SKILL.md +233 -0
  425. package/node_modules/@llblab/pi-telegram/AGENTS.md +157 -0
  426. package/node_modules/@llblab/pi-telegram/BACKLOG.md +15 -0
  427. package/node_modules/@llblab/pi-telegram/CHANGELOG.md +886 -0
  428. package/node_modules/@llblab/pi-telegram/README.md +330 -0
  429. package/node_modules/@llblab/pi-telegram/api/activity.ts +15 -0
  430. package/node_modules/@llblab/pi-telegram/api/commands.ts +11 -0
  431. package/node_modules/@llblab/pi-telegram/api/delivery.ts +21 -0
  432. package/node_modules/@llblab/pi-telegram/api/inbound.ts +14 -0
  433. package/node_modules/@llblab/pi-telegram/api/keyboard.ts +11 -0
  434. package/node_modules/@llblab/pi-telegram/api/outbound.ts +11 -0
  435. package/node_modules/@llblab/pi-telegram/api/sections.ts +17 -0
  436. package/node_modules/@llblab/pi-telegram/api/status.ts +12 -0
  437. package/node_modules/@llblab/pi-telegram/api/updates.ts +16 -0
  438. package/node_modules/@llblab/pi-telegram/api/voice.ts +24 -0
  439. package/node_modules/@llblab/pi-telegram/docs/README.md +25 -0
  440. package/node_modules/@llblab/pi-telegram/docs/activity.md +304 -0
  441. package/node_modules/@llblab/pi-telegram/docs/architecture.md +418 -0
  442. package/node_modules/@llblab/pi-telegram/docs/callback-namespaces.md +48 -0
  443. package/node_modules/@llblab/pi-telegram/docs/command-templates.md +365 -0
  444. package/node_modules/@llblab/pi-telegram/docs/compact-matrix-literal.md +176 -0
  445. package/node_modules/@llblab/pi-telegram/docs/delivery.md +225 -0
  446. package/node_modules/@llblab/pi-telegram/docs/generative-apps.md +310 -0
  447. package/node_modules/@llblab/pi-telegram/docs/inbound.md +136 -0
  448. package/node_modules/@llblab/pi-telegram/docs/multi-instance-bus.md +467 -0
  449. package/node_modules/@llblab/pi-telegram/docs/outbound.md +193 -0
  450. package/node_modules/@llblab/pi-telegram/docs/public-api.md +599 -0
  451. package/node_modules/@llblab/pi-telegram/docs/sections.md +452 -0
  452. package/node_modules/@llblab/pi-telegram/docs/ui-style.md +256 -0
  453. package/node_modules/@llblab/pi-telegram/docs/updates.md +171 -0
  454. package/node_modules/@llblab/pi-telegram/docs/voice.md +217 -0
  455. package/node_modules/@llblab/pi-telegram/index.ts +1336 -0
  456. package/node_modules/@llblab/pi-telegram/lib/activity-verbosity.ts +714 -0
  457. package/node_modules/@llblab/pi-telegram/lib/activity.ts +782 -0
  458. package/node_modules/@llblab/pi-telegram/lib/agent-messages.ts +121 -0
  459. package/node_modules/@llblab/pi-telegram/lib/bindings.ts +1129 -0
  460. package/node_modules/@llblab/pi-telegram/lib/bus-api.ts +379 -0
  461. package/node_modules/@llblab/pi-telegram/lib/bus-follower.ts +1941 -0
  462. package/node_modules/@llblab/pi-telegram/lib/bus-leader.ts +2119 -0
  463. package/node_modules/@llblab/pi-telegram/lib/bus-transport.ts +244 -0
  464. package/node_modules/@llblab/pi-telegram/lib/bus.ts +2645 -0
  465. package/node_modules/@llblab/pi-telegram/lib/command-templates.ts +954 -0
  466. package/node_modules/@llblab/pi-telegram/lib/commands.ts +1854 -0
  467. package/node_modules/@llblab/pi-telegram/lib/config.ts +1143 -0
  468. package/node_modules/@llblab/pi-telegram/lib/delivery.ts +891 -0
  469. package/node_modules/@llblab/pi-telegram/lib/generative-app-worker.mjs +104 -0
  470. package/node_modules/@llblab/pi-telegram/lib/generative-apps.ts +958 -0
  471. package/node_modules/@llblab/pi-telegram/lib/inbound.ts +824 -0
  472. package/node_modules/@llblab/pi-telegram/lib/journal.ts +3140 -0
  473. package/node_modules/@llblab/pi-telegram/lib/keyboard.ts +59 -0
  474. package/node_modules/@llblab/pi-telegram/lib/lifecycle.ts +623 -0
  475. package/node_modules/@llblab/pi-telegram/lib/locks.ts +1422 -0
  476. package/node_modules/@llblab/pi-telegram/lib/logs.ts +393 -0
  477. package/node_modules/@llblab/pi-telegram/lib/media.ts +921 -0
  478. package/node_modules/@llblab/pi-telegram/lib/menu-model.ts +1182 -0
  479. package/node_modules/@llblab/pi-telegram/lib/menu-queue.ts +926 -0
  480. package/node_modules/@llblab/pi-telegram/lib/menu-settings.ts +876 -0
  481. package/node_modules/@llblab/pi-telegram/lib/menu-status.ts +274 -0
  482. package/node_modules/@llblab/pi-telegram/lib/menu-thinking.ts +185 -0
  483. package/node_modules/@llblab/pi-telegram/lib/menu.ts +867 -0
  484. package/node_modules/@llblab/pi-telegram/lib/model.ts +672 -0
  485. package/node_modules/@llblab/pi-telegram/lib/outbound-attachments.ts +981 -0
  486. package/node_modules/@llblab/pi-telegram/lib/outbound-buttons.ts +331 -0
  487. package/node_modules/@llblab/pi-telegram/lib/outbound-markup.ts +515 -0
  488. package/node_modules/@llblab/pi-telegram/lib/outbound-voice.ts +285 -0
  489. package/node_modules/@llblab/pi-telegram/lib/outbound.ts +1007 -0
  490. package/node_modules/@llblab/pi-telegram/lib/ownership.ts +298 -0
  491. package/node_modules/@llblab/pi-telegram/lib/paths.ts +127 -0
  492. package/node_modules/@llblab/pi-telegram/lib/pi.ts +197 -0
  493. package/node_modules/@llblab/pi-telegram/lib/polling.ts +1588 -0
  494. package/node_modules/@llblab/pi-telegram/lib/preview.ts +846 -0
  495. package/node_modules/@llblab/pi-telegram/lib/prompt-templates.ts +158 -0
  496. package/node_modules/@llblab/pi-telegram/lib/prompts.ts +218 -0
  497. package/node_modules/@llblab/pi-telegram/lib/queue.ts +3075 -0
  498. package/node_modules/@llblab/pi-telegram/lib/recovery.ts +464 -0
  499. package/node_modules/@llblab/pi-telegram/lib/rendering.ts +1213 -0
  500. package/node_modules/@llblab/pi-telegram/lib/replies.ts +892 -0
  501. package/node_modules/@llblab/pi-telegram/lib/routing.ts +2889 -0
  502. package/node_modules/@llblab/pi-telegram/lib/runtime.ts +628 -0
  503. package/node_modules/@llblab/pi-telegram/lib/sections.ts +710 -0
  504. package/node_modules/@llblab/pi-telegram/lib/setup.ts +220 -0
  505. package/node_modules/@llblab/pi-telegram/lib/skills.ts +21 -0
  506. package/node_modules/@llblab/pi-telegram/lib/status.ts +1550 -0
  507. package/node_modules/@llblab/pi-telegram/lib/sync.ts +883 -0
  508. package/node_modules/@llblab/pi-telegram/lib/target.ts +49 -0
  509. package/node_modules/@llblab/pi-telegram/lib/telegram-api.ts +1747 -0
  510. package/node_modules/@llblab/pi-telegram/lib/text-groups.ts +487 -0
  511. package/node_modules/@llblab/pi-telegram/lib/thread-reconciler.ts +1002 -0
  512. package/node_modules/@llblab/pi-telegram/lib/threads.ts +3183 -0
  513. package/node_modules/@llblab/pi-telegram/lib/time-injection.ts +78 -0
  514. package/node_modules/@llblab/pi-telegram/lib/turns.ts +753 -0
  515. package/node_modules/@llblab/pi-telegram/lib/updates.ts +4950 -0
  516. package/node_modules/@llblab/pi-telegram/lib/voice.ts +340 -0
  517. package/node_modules/@llblab/pi-telegram/package.json +83 -0
  518. package/node_modules/@llblab/pi-telegram/screenshot.png +0 -0
  519. package/node_modules/@llblab/pi-telegram/scripts/check-downgrade.mjs +435 -0
  520. package/node_modules/@llblab/pi-telegram/skills/generated-control-surface/SKILL.md +241 -0
  521. package/node_modules/@llblab/pi-telegram/skills/generative-apps/SKILL.md +114 -0
  522. package/node_modules/@llblab/pi-telegram/skills/telegram-bridge/SKILL.md +149 -0
  523. package/package.json +67 -0
@@ -0,0 +1,901 @@
1
+ /**
2
+ * Keyboard-driven Actor Inspector overlay for concrete Run instances.
3
+ * Zones: owned actor selection, Recipe/Trace/Control tabs, safe Run Kill confirmation
4
+ * Owns manual kernel navigation; evidence parsing and lifecycle mutation stay in ports.
5
+ */
6
+
7
+ import { readFileSync, statSync } from "node:fs";
8
+ import * as path from "node:path";
9
+
10
+ import type { Theme } from "@earendil-works/pi-coding-agent";
11
+ import {
12
+ matchesKey,
13
+ truncateToWidth,
14
+ visibleWidth,
15
+ type TUI,
16
+ } from "@earendil-works/pi-tui";
17
+
18
+ import * as ActorInspector from "./inspector.ts";
19
+ import * as ControlProjection from "./control-projection.ts";
20
+ import * as RunsControls from "./runs-controls.ts";
21
+ import * as RunControlDelivery from "./runs-control-delivery.ts";
22
+ import * as RunsTrace from "./runs-trace.ts";
23
+ import * as Limits from "./limits.ts";
24
+ import { computeRunControlCapacity } from "./run-evidence-policy.ts";
25
+ import * as RuntimeTriage from "./runtime-triage.ts";
26
+ import * as TraceProjection from "./trace-projection.ts";
27
+
28
+ export type ActorInspectorTab = "recipe" | "trace" | "control";
29
+
30
+ type InspectorFocus = "runs" | "tabs" | "document" | "list" | "detail" | "select";
31
+ type SelectorMode = "run" | "source";
32
+
33
+ export interface ActorInspectorActionResult {
34
+ ok: boolean;
35
+ message: string;
36
+ }
37
+
38
+ export interface ActorInspectorOverlayOptions {
39
+ done: () => void;
40
+ killRun?: (run: string, runInstanceId: string) => ActorInspectorActionResult;
41
+ ownerId: string;
42
+ readRuns?: typeof ActorInspector.readActorInspectorRuns;
43
+ readTrace?: typeof TraceProjection.projectRunTrace;
44
+ stateRoot: string;
45
+ theme: Theme;
46
+ tui: TUI;
47
+ }
48
+
49
+ interface KillConfirmation {
50
+ run: string;
51
+ runInstanceId: string;
52
+ status: string;
53
+ }
54
+
55
+ const TABS: ActorInspectorTab[] = ["recipe", "trace", "control"];
56
+ const TRACE_SOURCES: TraceProjection.TraceSourceFilter[] = [
57
+ "all",
58
+ "lifecycle",
59
+ "control",
60
+ "process",
61
+ "agent",
62
+ "artifact",
63
+ "runtime",
64
+ ];
65
+
66
+ export class ActorInspectorOverlay {
67
+ private readonly done: () => void;
68
+ private readonly killRun?: (run: string, runInstanceId: string) => ActorInspectorActionResult;
69
+ private readonly ownerId: string;
70
+ private readonly readRuns: typeof ActorInspector.readActorInspectorRuns;
71
+ private readonly readTrace: typeof TraceProjection.projectRunTrace;
72
+ private readonly stateRoot: string;
73
+ private readonly theme: Theme;
74
+ private readonly tui: TUI;
75
+ private readonly refreshTimer: NodeJS.Timeout;
76
+ private contentStripeIndices: number[] = [];
77
+ private documentScroll = 0;
78
+ private detailScroll = 0;
79
+ private feedback?: ActorInspectorActionResult;
80
+ private focus: InspectorFocus = "runs";
81
+ private killConfirmation?: KillConfirmation;
82
+ private killDialogChoice: "cancel" | "kill" = "cancel";
83
+ private rowIndex = 0;
84
+ private runCache?: ActorInspector.ActorInspectorRunItem[];
85
+ private selectedTraceId?: string;
86
+ private runIndex = 0;
87
+ private selectorIndex = 0;
88
+ private selectorMode?: SelectorMode;
89
+ private tabIndex = 0;
90
+ private traceCache?: {
91
+ run: string;
92
+ runInstanceId?: string;
93
+ items: TraceProjection.TraceItem[];
94
+ };
95
+ private traceDetail?: TraceProjection.TraceItem;
96
+ private traceSourceIndex = 0;
97
+
98
+ constructor(options: ActorInspectorOverlayOptions) {
99
+ this.done = options.done;
100
+ this.killRun = options.killRun;
101
+ this.ownerId = options.ownerId;
102
+ this.readRuns = options.readRuns ?? ActorInspector.readActorInspectorRuns;
103
+ this.readTrace = options.readTrace ?? TraceProjection.projectRunTrace;
104
+ this.stateRoot = options.stateRoot;
105
+ this.theme = options.theme;
106
+ this.tui = options.tui;
107
+ this.refreshTimer = setInterval(() => {
108
+ this.invalidate();
109
+ this.tui.requestRender();
110
+ }, 1_000);
111
+ this.refreshTimer.unref?.();
112
+ }
113
+
114
+ dispose(): void {
115
+ clearInterval(this.refreshTimer);
116
+ }
117
+
118
+ invalidate(): void {
119
+ this.runCache = undefined;
120
+ this.traceCache = undefined;
121
+ }
122
+
123
+ handleInput(data: string): void {
124
+ const runs = this.runs();
125
+ this.runIndex = Math.min(this.runIndex, Math.max(0, runs.length - 1));
126
+ if (matchesKey(data, "ctrl+c")) {
127
+ this.done();
128
+ return;
129
+ }
130
+ if (this.killConfirmation) {
131
+ this.handleKillInput(data);
132
+ this.tui.requestRender();
133
+ return;
134
+ }
135
+ if (data.toLowerCase() === "k") {
136
+ this.requestKill(runs[this.runIndex]);
137
+ this.tui.requestRender();
138
+ return;
139
+ }
140
+ if (matchesKey(data, "escape")) {
141
+ if (this.focus === "select") {
142
+ this.selectorMode = undefined;
143
+ this.focus = this.tab === "trace" ? "tabs" : "runs";
144
+ } else if (this.focus === "detail") {
145
+ this.selectedTraceId = this.traceDetail?.id;
146
+ this.traceDetail = undefined;
147
+ this.detailScroll = 0;
148
+ this.focus = "list";
149
+ } else if (this.focus === "document" || this.focus === "list") {
150
+ if (this.focus === "list") this.selectedTraceId = undefined;
151
+ this.focus = "tabs";
152
+ } else {
153
+ this.done();
154
+ }
155
+ this.tui.requestRender();
156
+ return;
157
+ }
158
+ if (this.focus === "select") {
159
+ this.handleSelectorInput(data, runs);
160
+ this.tui.requestRender();
161
+ return;
162
+ }
163
+ if (this.focus === "detail") {
164
+ this.handleScrollableInput(data, "detail");
165
+ this.tui.requestRender();
166
+ return;
167
+ }
168
+ if (this.focus === "document") {
169
+ if (matchesKey(data, "left")) this.focus = "tabs";
170
+ else if (matchesKey(data, "up") && this.documentScroll === 0) this.focus = "tabs";
171
+ else this.handleScrollableInput(data, "document");
172
+ this.tui.requestRender();
173
+ return;
174
+ }
175
+ if (this.focus === "runs") {
176
+ if (matchesKey(data, "left")) this.cycleRun(runs, -1);
177
+ else if (matchesKey(data, "right")) this.cycleRun(runs, 1);
178
+ else if (matchesKey(data, "down")) this.focus = "tabs";
179
+ else if (matchesKey(data, "return") && runs.length > 0) {
180
+ this.selectorMode = "run";
181
+ this.selectorIndex = this.runIndex;
182
+ this.focus = "select";
183
+ }
184
+ } else if (this.focus === "tabs") {
185
+ if (matchesKey(data, "left") || matchesKey(data, "right") || matchesKey(data, "tab")) {
186
+ const direction = matchesKey(data, "left") ? -1 : 1;
187
+ this.tabIndex = (this.tabIndex + direction + TABS.length) % TABS.length;
188
+ this.resetContentPosition();
189
+ } else if (matchesKey(data, "up")) {
190
+ this.focus = "runs";
191
+ } else if (matchesKey(data, "down")) {
192
+ const items = this.tab === "trace" ? this.traceItems(runs[this.runIndex]) : [];
193
+ this.focus = items.length > 0 ? "list" : "document";
194
+ if (this.focus === "list") {
195
+ this.rowIndex = 0;
196
+ this.selectedTraceId = items[0]?.id;
197
+ }
198
+ } else if (matchesKey(data, "return")) {
199
+ if (this.tab === "trace") this.openSourceSelector(runs[this.runIndex]);
200
+ else this.focus = "document";
201
+ }
202
+ } else if (this.focus === "list") {
203
+ const items = this.traceItems(runs[this.runIndex]);
204
+ const count = items.length;
205
+ if (matchesKey(data, "left")) {
206
+ this.selectedTraceId = undefined;
207
+ this.focus = "tabs";
208
+ } else if (matchesKey(data, "up")) {
209
+ if (this.rowIndex === 0) {
210
+ this.selectedTraceId = undefined;
211
+ this.focus = "tabs";
212
+ } else this.rowIndex -= 1;
213
+ } else if (matchesKey(data, "down")) {
214
+ this.rowIndex = Math.min(Math.max(0, count - 1), this.rowIndex + 1);
215
+ } else if (matchesKey(data, "pageUp")) {
216
+ this.rowIndex = Math.max(0, this.rowIndex - this.contentViewportRows());
217
+ } else if (matchesKey(data, "pageDown")) {
218
+ this.rowIndex = Math.min(
219
+ Math.max(0, count - 1),
220
+ this.rowIndex + this.contentViewportRows(),
221
+ );
222
+ } else if (matchesKey(data, "return") || matchesKey(data, "right")) {
223
+ const item = items[this.rowIndex];
224
+ if (item) {
225
+ this.traceDetail = item;
226
+ this.detailScroll = 0;
227
+ this.focus = "detail";
228
+ }
229
+ }
230
+ if (this.focus === "list") this.selectedTraceId = items[this.rowIndex]?.id;
231
+ }
232
+ if (data.toLowerCase() === "f" && this.tab === "trace") {
233
+ this.cycleTraceSource(runs[this.runIndex]);
234
+ }
235
+ this.tui.requestRender();
236
+ }
237
+
238
+ render(width: number): string[] {
239
+ const safeWidth = Math.max(24, width);
240
+ const innerWidth = safeWidth - 2;
241
+ const runs = this.runs();
242
+ this.runIndex = Math.min(this.runIndex, Math.max(0, runs.length - 1));
243
+ const run = runs[this.runIndex];
244
+ if (this.killConfirmation) return this.renderKillDialog(innerWidth);
245
+
246
+ const lines = [this.border("╭", " Actor Inspector ", "╮", innerWidth)];
247
+ lines.push(this.row(this.renderRunControl(run, runs.length - this.runIndex), innerWidth));
248
+ lines.push(this.row(this.renderTabs(run), innerWidth));
249
+ lines.push(this.border("├", "", "┤", innerWidth));
250
+
251
+ this.contentStripeIndices = [];
252
+ let content = this.renderContent(run, innerWidth);
253
+ if (this.feedback) {
254
+ const color = this.feedback.ok
255
+ ? "success"
256
+ : /^Kill (failed|rejected)/u.test(this.feedback.message)
257
+ ? "error"
258
+ : "warning";
259
+ content = [this.theme.fg(color, ` ${this.feedback.message}`), ...content];
260
+ this.contentStripeIndices = [0, ...this.contentStripeIndices];
261
+ }
262
+ const viewportRows = this.contentViewportRows();
263
+ content = content.slice(0, viewportRows);
264
+ for (let index = 0; index < viewportRows; index += 1) {
265
+ lines.push(this.stripedRow(
266
+ content[index] ?? "",
267
+ innerWidth,
268
+ this.contentStripeIndices[index] ?? index,
269
+ ));
270
+ }
271
+ lines.push(this.footerBorder(this.renderKeyHints(), innerWidth));
272
+ return lines;
273
+ }
274
+
275
+ private get tab(): ActorInspectorTab {
276
+ return TABS[this.tabIndex]!;
277
+ }
278
+
279
+ private runs(): ActorInspector.ActorInspectorRunItem[] {
280
+ if (this.runCache) return this.runCache;
281
+ this.runCache = this.readRuns(this.stateRoot, this.ownerId);
282
+ return this.runCache;
283
+ }
284
+
285
+ private contentViewportRows(): number {
286
+ const rows = (this.tui as TUI & { terminal?: { rows?: number } }).terminal?.rows ?? 30;
287
+ const overlayRows = Math.floor(rows * 0.94);
288
+ return Math.max(4, Math.min(24, overlayRows - 5));
289
+ }
290
+
291
+ private resetContentPosition(): void {
292
+ this.documentScroll = 0;
293
+ this.detailScroll = 0;
294
+ this.rowIndex = 0;
295
+ this.selectedTraceId = undefined;
296
+ this.traceDetail = undefined;
297
+ }
298
+
299
+ private cycleRun(runs: ActorInspector.ActorInspectorRunItem[], direction: -1 | 1): void {
300
+ if (runs.length === 0) return;
301
+ this.runIndex = (this.runIndex + direction + runs.length) % runs.length;
302
+ this.resetContentPosition();
303
+ }
304
+
305
+ private handleScrollableInput(data: string, target: "detail" | "document"): void {
306
+ const key = target === "detail" ? "detailScroll" : "documentScroll";
307
+ if (matchesKey(data, "up")) this[key] = Math.max(0, this[key] - 1);
308
+ else if (matchesKey(data, "down")) this[key] += 1;
309
+ else if (matchesKey(data, "pageUp")) {
310
+ this[key] = Math.max(0, this[key] - this.contentViewportRows());
311
+ } else if (matchesKey(data, "pageDown")) {
312
+ this[key] += this.contentViewportRows();
313
+ } else if (matchesKey(data, "left") && target === "detail") {
314
+ this.selectedTraceId = this.traceDetail?.id;
315
+ this.traceDetail = undefined;
316
+ this.detailScroll = 0;
317
+ this.focus = "list";
318
+ }
319
+ }
320
+
321
+ private handleSelectorInput(
322
+ data: string,
323
+ runs: ActorInspector.ActorInspectorRunItem[],
324
+ ): void {
325
+ const run = runs[this.runIndex];
326
+ const options = this.selectorMode === "run"
327
+ ? runs.map((item) => item.run)
328
+ : this.traceSources(run);
329
+ if (matchesKey(data, "up")) this.selectorIndex = Math.max(0, this.selectorIndex - 1);
330
+ else if (matchesKey(data, "down")) {
331
+ this.selectorIndex = Math.min(Math.max(0, options.length - 1), this.selectorIndex + 1);
332
+ } else if (matchesKey(data, "left")) {
333
+ this.focus = this.selectorMode === "run" ? "runs" : "tabs";
334
+ this.selectorMode = undefined;
335
+ } else if (matchesKey(data, "return") || matchesKey(data, "right")) {
336
+ if (this.selectorMode === "run") {
337
+ this.runIndex = this.selectorIndex;
338
+ this.focus = "runs";
339
+ } else {
340
+ this.traceSourceIndex = this.selectorIndex;
341
+ this.focus = "tabs";
342
+ }
343
+ this.selectorMode = undefined;
344
+ this.resetContentPosition();
345
+ }
346
+ }
347
+
348
+ private openSourceSelector(run?: ActorInspector.ActorInspectorRunItem): void {
349
+ const sources = this.traceSources(run);
350
+ this.selectorMode = "source";
351
+ this.selectorIndex = Math.min(this.traceSourceIndex, sources.length - 1);
352
+ this.focus = "select";
353
+ }
354
+
355
+ private cycleTraceSource(run?: ActorInspector.ActorInspectorRunItem): void {
356
+ const sources = this.traceSources(run);
357
+ this.traceSourceIndex = (this.traceSourceIndex + 1) % sources.length;
358
+ this.resetContentPosition();
359
+ }
360
+
361
+ private requestKill(run?: ActorInspector.ActorInspectorRunItem): void {
362
+ this.feedback = undefined;
363
+ if (this.focus !== "runs") {
364
+ this.feedback = { ok: false, message: "Focus Run before using Kill." };
365
+ return;
366
+ }
367
+ if (!run) {
368
+ this.feedback = { ok: false, message: "Kill unavailable: no owned run." };
369
+ return;
370
+ }
371
+ if (!this.killRun) {
372
+ this.feedback = { ok: false, message: "Kill unavailable in this Inspector." };
373
+ return;
374
+ }
375
+ if (run.status !== "running") {
376
+ this.feedback = { ok: false, message: `Kill unavailable: run is ${run.status}.` };
377
+ return;
378
+ }
379
+ if (!run.runInstanceId) {
380
+ this.feedback = { ok: false, message: "Kill unavailable: run generation unavailable." };
381
+ return;
382
+ }
383
+ this.killConfirmation = {
384
+ run: run.run,
385
+ runInstanceId: run.runInstanceId,
386
+ status: run.status,
387
+ };
388
+ this.killDialogChoice = "cancel";
389
+ }
390
+
391
+ private handleKillInput(data: string): void {
392
+ const key = data.toLowerCase();
393
+ if (matchesKey(data, "escape") || key === "n") {
394
+ this.feedback = { ok: false, message: "Kill cancelled." };
395
+ this.killConfirmation = undefined;
396
+ this.killDialogChoice = "cancel";
397
+ } else if (matchesKey(data, "left") || matchesKey(data, "right") || matchesKey(data, "tab")) {
398
+ this.killDialogChoice = this.killDialogChoice === "cancel" ? "kill" : "cancel";
399
+ } else if (key === "y") {
400
+ this.confirmKill();
401
+ } else if (matchesKey(data, "return")) {
402
+ if (this.killDialogChoice === "kill") this.confirmKill();
403
+ else {
404
+ this.feedback = { ok: false, message: "Kill cancelled." };
405
+ this.killConfirmation = undefined;
406
+ }
407
+ }
408
+ }
409
+
410
+ private confirmKill(): void {
411
+ const confirmation = this.killConfirmation;
412
+ this.killConfirmation = undefined;
413
+ this.killDialogChoice = "cancel";
414
+ if (!confirmation || !this.killRun) return;
415
+ try {
416
+ const result = this.killRun(confirmation.run, confirmation.runInstanceId);
417
+ this.feedback = result.ok ? undefined : result;
418
+ if (result.ok) this.invalidate();
419
+ } catch (error) {
420
+ const message = error instanceof Error ? error.message : String(error);
421
+ this.feedback = {
422
+ ok: false,
423
+ message: `Kill failed: ${message.replaceAll(/\s+/g, " ").slice(0, 160)}.`,
424
+ };
425
+ }
426
+ }
427
+
428
+ private renderKillDialog(innerWidth: number): string[] {
429
+ const confirmation = this.killConfirmation!;
430
+ const cancel = this.killDialogChoice === "cancel"
431
+ ? this.theme.bg("customMessageBg", this.theme.fg("accent", " Cancel "))
432
+ : this.theme.fg("muted", " Cancel ");
433
+ const kill = this.killDialogChoice === "kill"
434
+ ? this.theme.bg("customMessageBg", this.theme.fg("error", " Kill actor "))
435
+ : this.theme.fg("error", " Kill actor ");
436
+ const body = [
437
+ "",
438
+ this.theme.fg("error", "Kill this running actor?"),
439
+ "",
440
+ `${this.theme.fg("muted", "Run:")} ${this.theme.fg("accent", `run:${confirmation.run}`)}`,
441
+ `${this.theme.fg("muted", "Current status:")} ${this.theme.fg("warning", confirmation.status)}`,
442
+ "",
443
+ this.theme.fg("text", "This invokes generation-fenced runtime kill."),
444
+ "",
445
+ `${cancel} ${kill}`,
446
+ "",
447
+ ];
448
+ const lines = [this.border("╭", " Confirm Actor Kill ", "╮", innerWidth)];
449
+ const availableRows = this.contentViewportRows() + 3;
450
+ const topPadding = Math.max(0, Math.floor((availableRows - body.length) / 2));
451
+ const rows = [...Array.from({ length: topPadding }, () => ""), ...body].slice(0, availableRows);
452
+ while (rows.length < availableRows) rows.push("");
453
+ for (const line of rows) lines.push(this.row(this.center(line, innerWidth), innerWidth));
454
+ lines.push(this.footerBorder(this.renderKeyHints(), innerWidth));
455
+ return lines;
456
+ }
457
+
458
+ private renderRunControl(
459
+ run: ActorInspector.ActorInspectorRunItem | undefined,
460
+ sequence: number,
461
+ ): string {
462
+ const active = this.focus === "runs" || (this.focus === "select" && this.selectorMode === "run");
463
+ const prefix = active ? this.theme.fg("accent", " ← ") : " ";
464
+ const suffix = active ? this.theme.fg("accent", " → ") : " ";
465
+ if (!run) {
466
+ const empty = this.theme.fg("muted", `${prefix}Run: none${suffix}`);
467
+ return this.focus === "runs" ? this.theme.bg("customMessageBg", empty) : empty;
468
+ }
469
+ const value = `${prefix}${this.theme.fg("muted", "Run: ")}${this.theme.fg("text", `#${sequence}`)} ${this.theme.fg("accent", run.run)} ${this.theme.fg(this.statusColor(run.status), run.status)}${suffix}`;
470
+ return this.focus === "runs" ? this.theme.bg("customMessageBg", value) : value;
471
+ }
472
+
473
+ private renderTabs(run?: ActorInspector.ActorInspectorRunItem): string {
474
+ const source = this.traceSource(run);
475
+ return TABS.map((tab, index) => {
476
+ const base = `${tab[0]!.toUpperCase()}${tab.slice(1)}`;
477
+ const label = tab === "trace" && source !== "all" ? `${base} (${source})` : base;
478
+ const selected = index === this.tabIndex;
479
+ const display = selected && this.focus !== "runs" ? `[ ${label} ]` : ` ${label} `;
480
+ const value = ` ${display} `;
481
+ if (!selected) return this.theme.fg("muted", value);
482
+ const colored = this.theme.fg("accent", value);
483
+ return this.focus === "tabs" ? this.theme.bg("customMessageBg", colored) : colored;
484
+ }).join(" ");
485
+ }
486
+
487
+ private renderContent(
488
+ run: ActorInspector.ActorInspectorRunItem | undefined,
489
+ width: number,
490
+ ): string[] {
491
+ if (!run) return [this.theme.fg("muted", " No owned actor runs")];
492
+ if (this.focus === "select") return this.renderSelector(run);
493
+ if (this.focus === "detail") return this.renderTraceDetail(width);
494
+ if (this.tab === "trace") return this.renderTraceList(run);
495
+ const stateDir = path.join(this.stateRoot, run.run);
496
+ const value = this.tab === "recipe"
497
+ ? ActorInspector.readActorInspectorRecipe(stateDir)
498
+ : this.controlDocument(run, stateDir);
499
+ const projection = this.documentProjection(value, width);
500
+ const maxStart = Math.max(0, projection.lines.length - this.contentViewportRows());
501
+ this.documentScroll = Math.min(this.documentScroll, maxStart);
502
+ this.contentStripeIndices = projection.stripes.slice(
503
+ this.documentScroll,
504
+ this.documentScroll + this.contentViewportRows(),
505
+ );
506
+ return projection.lines.slice(
507
+ this.documentScroll,
508
+ this.documentScroll + this.contentViewportRows(),
509
+ );
510
+ }
511
+
512
+ private renderSelector(run: ActorInspector.ActorInspectorRunItem): string[] {
513
+ const options = this.selectorMode === "run"
514
+ ? this.runs().map((item) => `run:${item.run} ${item.status}`)
515
+ : this.traceSources(run).map((source) => `Trace source: ${source}`);
516
+ const lines = this.renderMenuBox(options, this.selectorIndex);
517
+ this.contentStripeIndices = lines.map(() => 0);
518
+ return lines;
519
+ }
520
+
521
+ private renderMenuBox(options: string[], focusedIndex: number): string[] {
522
+ if (options.length === 0) return [this.theme.fg("muted", " No options")];
523
+ const visibleLimit = Math.max(1, Math.min(this.contentViewportRows(), options.length));
524
+ const maxStart = Math.max(0, options.length - visibleLimit);
525
+ const start = Math.max(0, Math.min(focusedIndex - Math.floor(visibleLimit / 2), maxStart));
526
+ const visible = options.slice(start, start + visibleLimit);
527
+ const width = Math.max(8, ...options.map((option) => visibleWidth(option) + 4));
528
+ const border = (left: string, right: string, marker = "") =>
529
+ this.theme.fg("borderAccent", `${left}${marker}${"─".repeat(Math.max(0, width - visibleWidth(marker)))}${right}`);
530
+ return [
531
+ border("╭", "╮", start > 0 ? "↑" : ""),
532
+ ...visible.map((option, offset) => {
533
+ const index = start + offset;
534
+ const row = this.fit(`${index === focusedIndex ? " ▶ " : " "}${option}`, width);
535
+ const colored = index === focusedIndex ? this.theme.fg("accent", row) : row;
536
+ const styled = index === focusedIndex ? this.theme.bg("customMessageBg", colored) : colored;
537
+ return `${this.theme.fg("borderAccent", "│")}${styled}${this.theme.fg("borderAccent", "│")}`;
538
+ }),
539
+ border("╰", "╯", start + visible.length < options.length ? "↓" : ""),
540
+ ];
541
+ }
542
+
543
+ private renderTraceList(run: ActorInspector.ActorInspectorRunItem): string[] {
544
+ const items = this.traceItems(run);
545
+ const summary = RunsTrace.summarizeRunTraceJournal(
546
+ RunsTrace.readRunTraceJournal(path.join(this.stateRoot, run.run)));
547
+ const banner = summary.history_complete ? [] : [this.theme.fg("warning",
548
+ ` ! Trace history incomplete: ${summary.compacted ? `${summary.compactions_total} compaction(s), ` : ""}${summary.dropped_event_count_exact ? summary.dropped_events : "unknown"} dropped event(s), ${summary.dropped_bytes} bytes`)];
549
+ if (items.length === 0) return [...banner, this.theme.fg("muted", " No Trace evidence")];
550
+ if (this.selectedTraceId) {
551
+ const selectedIndex = items.findIndex((item) => item.id === this.selectedTraceId);
552
+ if (selectedIndex >= 0) this.rowIndex = selectedIndex;
553
+ else this.selectedTraceId = undefined;
554
+ }
555
+ this.rowIndex = Math.min(this.rowIndex, items.length - 1);
556
+ if (this.focus === "list" && !this.selectedTraceId) {
557
+ this.selectedTraceId = items[this.rowIndex]?.id;
558
+ }
559
+ const viewportRows = this.contentViewportRows();
560
+ const maxStart = Math.max(0, items.length - viewportRows);
561
+ const start = Math.max(0, Math.min(this.rowIndex - Math.floor(viewportRows / 2), maxStart));
562
+ this.contentStripeIndices = items
563
+ .slice(start, start + viewportRows)
564
+ .map((_item, offset) => start + offset);
565
+ return [...banner, ...items.slice(start, start + viewportRows - banner.length).map((item, offset) => {
566
+ const index = start + offset;
567
+ const detail = item.detail && typeof item.detail === "object"
568
+ ? item.detail as Record<string, unknown>
569
+ : {};
570
+ const marker = item.level === "error"
571
+ ? this.theme.fg("error", "!")
572
+ : detail.attention
573
+ ? this.theme.fg("warning", "A")
574
+ : " ";
575
+ const prefix = this.focus === "list" && index === this.rowIndex
576
+ ? this.theme.fg("accent", " ▶ ")
577
+ : " ";
578
+ const row = `${prefix}${this.theme.fg("text", `#${items.length - index}`)} ${marker} ${this.theme.fg("muted", item.source)}/${this.theme.fg(item.level === "error" ? "error" : "accent", item.kind)} ${this.theme.fg("text", item.summary)}`;
579
+ return this.focus === "list" && index === this.rowIndex
580
+ ? this.theme.fg("accent", row)
581
+ : row;
582
+ })];
583
+ }
584
+
585
+ private renderTraceDetail(width: number): string[] {
586
+ if (!this.traceDetail) return [this.theme.fg("warning", " Trace row is no longer available")];
587
+ const projection = this.documentProjection(this.traceDetail, width);
588
+ const maxStart = Math.max(0, projection.lines.length - this.contentViewportRows());
589
+ this.detailScroll = Math.min(this.detailScroll, maxStart);
590
+ this.contentStripeIndices = projection.stripes.slice(
591
+ this.detailScroll,
592
+ this.detailScroll + this.contentViewportRows(),
593
+ );
594
+ return projection.lines.slice(
595
+ this.detailScroll,
596
+ this.detailScroll + this.contentViewportRows(),
597
+ );
598
+ }
599
+
600
+ private controlDocument(
601
+ run: ActorInspector.ActorInspectorRunItem,
602
+ stateDir: string,
603
+ ): Record<string, unknown> {
604
+ const endpoint = run.runInstanceId
605
+ ? RunControlDelivery.readRunControlEndpoint(stateDir, run.runInstanceId)
606
+ : undefined;
607
+ const meta = this.readRunMeta(stateDir);
608
+ const journal = RunsControls.readRunControlJournalFromStateDir(stateDir);
609
+ const capacity = computeRunControlCapacity(journal.records);
610
+ const stalePending = journal.records.reduce<number>((count, control) => count + Number(Boolean(
611
+ RuntimeTriage.classifyRuntimeControl({ run: run.run,
612
+ runInstanceId: run.runInstanceId, status: run.status }, control, Date.now()).stale)), 0);
613
+ return {
614
+ status: run.status,
615
+ run_instance_id: run.runInstanceId,
616
+ pending: capacity.pending, pending_limit: capacity.limit,
617
+ available: capacity.available, backpressured: capacity.backpressured,
618
+ journal_bytes: (() => { try { return statSync(RunsControls.runControlsFile(stateDir)).size; } catch { return 0; } })(),
619
+ journal_limit: Limits.RUN_CONTROL_JOURNAL_MAX_BYTES,
620
+ stale_pending: stalePending,
621
+ diagnostics: journal.diagnostics.map((item) => item.line === undefined
622
+ ? { reason: "unreadable_control_journal" } : { line: item.line, reason: "invalid_control_json" }),
623
+ actor_actions: Array.isArray(meta.control) ? meta.control : [],
624
+ runtime_actions: run.status === "running" ? ["kill"] : ["archive", "prune"],
625
+ endpoint,
626
+ recent_controls: journal.records.slice(-20).reverse().map((control) =>
627
+ ControlProjection.projectRunControl(control as RunsControls.RunControlRecord)),
628
+ };
629
+ }
630
+
631
+ private allTraceItems(run?: ActorInspector.ActorInspectorRunItem): TraceProjection.TraceItem[] {
632
+ if (!run) return [];
633
+ if (
634
+ this.traceCache?.run === run.run &&
635
+ this.traceCache.runInstanceId === run.runInstanceId
636
+ ) {
637
+ return this.traceCache.items;
638
+ }
639
+ const items = this.readTrace(path.join(this.stateRoot, run.run), {
640
+ limit: 100,
641
+ source: "all",
642
+ });
643
+ this.traceCache = { run: run.run, runInstanceId: run.runInstanceId, items };
644
+ return items;
645
+ }
646
+
647
+ private traceSources(run?: ActorInspector.ActorInspectorRunItem): TraceProjection.TraceSourceFilter[] {
648
+ const present = new Set(this.allTraceItems(run).map((item) => item.source));
649
+ return TRACE_SOURCES.filter((source) => source === "all" || present.has(source));
650
+ }
651
+
652
+ private traceSource(run?: ActorInspector.ActorInspectorRunItem): TraceProjection.TraceSourceFilter {
653
+ const sources = this.traceSources(run);
654
+ this.traceSourceIndex %= sources.length;
655
+ return sources[this.traceSourceIndex] ?? "all";
656
+ }
657
+
658
+ private traceItems(run?: ActorInspector.ActorInspectorRunItem): TraceProjection.TraceItem[] {
659
+ const source = this.traceSource(run);
660
+ const items = this.allTraceItems(run);
661
+ return source === "all" ? items : items.filter((item) => item.source === source);
662
+ }
663
+
664
+ private readRunMeta(stateDir: string): Record<string, unknown> {
665
+ try {
666
+ return JSON.parse(readFileSync(path.join(stateDir, "run.json"), "utf8")) as Record<string, unknown>;
667
+ } catch {
668
+ return {};
669
+ }
670
+ }
671
+
672
+ private documentProjection(
673
+ value: unknown,
674
+ width: number,
675
+ ): { lines: string[]; stripes: number[] } {
676
+ const sections = value && typeof value === "object" && !Array.isArray(value)
677
+ ? Object.entries(value as Record<string, unknown>).map(([key, item]) =>
678
+ this.labeledDocumentLines(key, item)
679
+ )
680
+ : [this.document(value)];
681
+ const lines: string[] = [];
682
+ const stripes: number[] = [];
683
+ sections.forEach((section, sectionIndex) => {
684
+ const wrapped = this.wrapDocument(section, width);
685
+ lines.push(...wrapped.map((line) => this.styleDocumentLine(line)));
686
+ stripes.push(...wrapped.map(() => sectionIndex));
687
+ });
688
+ return { lines, stripes };
689
+ }
690
+
691
+ private inlineDocumentValue(value: unknown): string | undefined {
692
+ if (Array.isArray(value)) {
693
+ if (value.length === 0) return "[]";
694
+ if (value.every((item) =>
695
+ (item === null || typeof item !== "object") &&
696
+ !(typeof item === "string" && /[\r\n]/u.test(item))
697
+ )) {
698
+ return `[${value.map((item) => String(item ?? "none")).join(", ")}]`;
699
+ }
700
+ return undefined;
701
+ }
702
+ if (value && typeof value === "object") {
703
+ if (Object.keys(value as Record<string, unknown>).length === 0) return "{}";
704
+ }
705
+ return undefined;
706
+ }
707
+
708
+ private labeledDocumentLines(key: string, value: unknown, depth = 0): string[] {
709
+ const inline = this.inlineDocumentValue(value);
710
+ if (inline !== undefined) return [`${" ".repeat(depth)}${key}: ${inline}`];
711
+ if (value && typeof value === "object") {
712
+ const indent = " ".repeat(depth);
713
+ const nested = this.document(value, depth);
714
+ return [`${indent}${key}: ${nested[0]!.slice(indent.length)}`, ...nested.slice(1)];
715
+ }
716
+ return this.labeledScalarLines(key, value, depth);
717
+ }
718
+
719
+ private labeledScalarLines(key: string, value: unknown, depth = 0): string[] {
720
+ const indent = " ".repeat(depth);
721
+ const [first = "", ...rest] = String(value ?? "none").split(/\r?\n/u);
722
+ return [
723
+ `${indent}${key}: ${first}`,
724
+ ...rest.map((line) => `${indent} ${line}`),
725
+ ];
726
+ }
727
+
728
+ private document(value: unknown, depth = 0): string[] {
729
+ if (value === null || value === undefined) return [`${" ".repeat(depth)}none`];
730
+ const inline = this.inlineDocumentValue(value);
731
+ if (inline !== undefined) return [`${" ".repeat(depth)}${inline}`];
732
+ if (Array.isArray(value)) {
733
+ const indent = " ".repeat(depth);
734
+ return [
735
+ `${indent}[`,
736
+ ...value.flatMap((item, index) => {
737
+ const marker = `${indent} - #${index + 1}`;
738
+ const itemInline = this.inlineDocumentValue(item);
739
+ return itemInline !== undefined
740
+ ? [`${marker}: ${itemInline}`]
741
+ : [marker, ...this.document(item, depth + 2)];
742
+ }),
743
+ `${indent}]`,
744
+ ];
745
+ }
746
+ if (typeof value === "object") {
747
+ const indent = " ".repeat(depth);
748
+ const entries = Object.entries(value as Record<string, unknown>);
749
+ return [
750
+ `${indent}{`,
751
+ ...entries.flatMap(([key, item], index) => {
752
+ const lines = this.labeledDocumentLines(key, item, depth + 1);
753
+ if (index < entries.length - 1) lines[lines.length - 1] += ",";
754
+ return lines;
755
+ }),
756
+ `${indent}}`,
757
+ ];
758
+ }
759
+ return String(value)
760
+ .split(/\r?\n/u)
761
+ .map((line) => `${" ".repeat(depth)}${line}`);
762
+ }
763
+
764
+ private wrapDocument(lines: string[], width: number): string[] {
765
+ return lines.flatMap((line) => {
766
+ const normalized = line.replaceAll("\t", " ");
767
+ if (visibleWidth(normalized) <= width) return [normalized];
768
+ const leading = normalized.match(/^ */u)?.[0] ?? "";
769
+ const continuation = `${leading} `;
770
+ const wrapped: string[] = [];
771
+ let rest = normalized.slice(leading.length);
772
+ let prefix = leading;
773
+ while (rest && visibleWidth(`${prefix}${rest}`) > width) {
774
+ const available = Math.max(1, width - visibleWidth(prefix));
775
+ const candidate = this.visiblePrefix(rest, available);
776
+ const minimumBreak = Math.floor(candidate.length * 0.6);
777
+ const preferred = Math.max(
778
+ candidate.lastIndexOf(" "),
779
+ candidate.lastIndexOf("/"),
780
+ candidate.lastIndexOf(","),
781
+ );
782
+ const cut = preferred >= minimumBreak ? preferred + 1 : candidate.length;
783
+ wrapped.push(`${prefix}${rest.slice(0, cut).trimEnd()}`);
784
+ rest = rest.slice(cut).trimStart();
785
+ prefix = continuation;
786
+ }
787
+ if (rest) wrapped.push(`${prefix}${rest}`);
788
+ return wrapped;
789
+ });
790
+ }
791
+
792
+ private styleDocumentLine(line: string): string {
793
+ const indent = line.match(/^ */u)?.[0] ?? "";
794
+ const content = line.slice(indent.length);
795
+ if (/^- #\d+$/u.test(content) || content.endsWith(":")) {
796
+ return `${indent}${this.theme.fg("accent", content)}`;
797
+ }
798
+ const labeled = /^([^:]+:)(.*)$/u.exec(content);
799
+ if (labeled) {
800
+ return `${indent}${this.theme.fg("muted", labeled[1])}${this.theme.fg("text", labeled[2])}`;
801
+ }
802
+ return `${indent}${this.theme.fg(content === "none" || content === "[]" ? "muted" : "text", content)}`;
803
+ }
804
+
805
+ private visiblePrefix(value: string, width: number): string {
806
+ let consumed = 0;
807
+ let result = "";
808
+ for (const character of value) {
809
+ const characterWidth = visibleWidth(character);
810
+ if (consumed + characterWidth > width) break;
811
+ result += character;
812
+ consumed += characterWidth;
813
+ }
814
+ return result;
815
+ }
816
+
817
+ private renderKeyHints(): string {
818
+ const hint = (keys: string, description: string) =>
819
+ `${this.theme.fg("accent", keys)}${this.theme.fg("borderAccent", ` ${description}`)}`;
820
+ const divider = this.theme.fg("borderAccent", " ─ ");
821
+ const hints = (...items: Array<[string, string]>) =>
822
+ items.map(([keys, description]) => hint(keys, description)).join(divider);
823
+ if (this.killConfirmation) {
824
+ return hints(["←→/tab", "choose"], ["enter/y", "confirm"], ["esc/n", "cancel"]);
825
+ }
826
+ if (this.focus === "select") {
827
+ return hints(["↑↓", "option"], ["enter/→", "apply"], ["←/esc", "back"]);
828
+ }
829
+ if (this.focus === "detail") {
830
+ return hints(["↑↓/pgup/pgdn", "scroll"], ["←/esc", "back"]);
831
+ }
832
+ if (this.focus === "document") {
833
+ return hints(["↑↓/pgup/pgdn", "scroll"], ["↑ at top", "tabs"], ["←/esc", "tabs"]);
834
+ }
835
+ if (this.focus === "list") {
836
+ return hints(["↑↓/pgup/pgdn", "row"], ["→/enter", "open"], ["←", "tabs"], ["esc", "close"]);
837
+ }
838
+ if (this.focus === "runs") {
839
+ const items: Array<[string, string]> = [["←→", "run"], ["↓", "tabs"], ["enter", "list"]];
840
+ const run = this.runs()[this.runIndex];
841
+ if (this.killRun && run?.status === "running" && run.runInstanceId) items.push(["k", "kill"]);
842
+ items.push(["esc", "close"]);
843
+ return hints(...items);
844
+ }
845
+ return this.tab === "trace"
846
+ ? hints(["←→", "tabs"], ["↑↓", "focus"], ["enter/f", "source"], ["esc", "close"])
847
+ : hints(["←→", "tabs"], ["↑↓", "focus"], ["enter", "open"], ["esc", "close"]);
848
+ }
849
+
850
+ private statusColor(status: string): "error" | "warning" | "success" | "muted" {
851
+ if (status === "failed") return "error";
852
+ if (status === "running") return "warning";
853
+ if (status === "done" || status === "terminal") return "success";
854
+ return "muted";
855
+ }
856
+
857
+ private footerBorder(hints: string, width: number): string {
858
+ const prefix = " ";
859
+ const suffix = " ─";
860
+ const content = truncateToWidth(
861
+ hints,
862
+ Math.max(0, width - visibleWidth(prefix) - visibleWidth(suffix)),
863
+ "",
864
+ );
865
+ const fill = "─".repeat(
866
+ Math.max(0, width - visibleWidth(prefix) - visibleWidth(suffix) - visibleWidth(content)),
867
+ );
868
+ return `${this.theme.fg("borderAccent", `╰${prefix}`)}${content}${this.theme.fg("borderAccent", `${suffix}${fill}╯`)}`;
869
+ }
870
+
871
+ private stripeBackground(content: string, index: number): string {
872
+ return index % 2 === 0 ? content : this.theme.bg("customMessageBg", content);
873
+ }
874
+
875
+ private stripedRow(content: string, width: number, index: number): string {
876
+ const fitted = this.fit(content, width);
877
+ return `${this.theme.fg("borderAccent", "│")}${this.stripeBackground(fitted, index)}${this.theme.fg("borderAccent", "│")}`;
878
+ }
879
+
880
+ private row(content: string, width: number): string {
881
+ return `${this.theme.fg("borderAccent", "│")}${this.fit(content, width)}${this.theme.fg("borderAccent", "│")}`;
882
+ }
883
+
884
+ private border(left: string, label: string, right: string, width: number): string {
885
+ const bounded = truncateToWidth(label, width, "");
886
+ return this.theme.fg(
887
+ "borderAccent",
888
+ `${left}${bounded}${"─".repeat(Math.max(0, width - visibleWidth(bounded)))}${right}`,
889
+ );
890
+ }
891
+
892
+ private fit(content: string, width: number): string {
893
+ const bounded = truncateToWidth(content, width, "");
894
+ return `${bounded}${" ".repeat(Math.max(0, width - visibleWidth(bounded)))}`;
895
+ }
896
+
897
+ private center(content: string, width: number): string {
898
+ const padding = Math.max(0, Math.floor((width - visibleWidth(content)) / 2));
899
+ return `${" ".repeat(padding)}${content}`;
900
+ }
901
+ }