@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,804 @@
1
+ /**
2
+ * Command-template execution standard.
3
+ * Zones: shell-free command parsing, placeholder expansion, local process execution, composition semantics
4
+ * Owns portable command-template parsing, expansion, risk checks, retries, timeouts, and direct execution.
5
+ */
6
+ import { spawn } from "node:child_process";
7
+ import { accessSync, appendFileSync, constants, mkdirSync, mkdtempSync, statSync, writeFileSync } from "node:fs";
8
+ import { homedir, tmpdir } from "node:os";
9
+ import { basename, delimiter, extname, isAbsolute, join, resolve as resolvePath } from "node:path";
10
+ const DEFAULT_COMMAND_CAPTURE_LIMIT_BYTES = 1024 * 1024;
11
+ const COMMAND_TEMPLATE_RISK_LABEL_ORDER = [
12
+ "risk.shell",
13
+ "risk.eval",
14
+ "risk.destructive_fs",
15
+ "risk.broad_fs_write",
16
+ "risk.external_side_effect",
17
+ "risk.secret_touching",
18
+ "risk.network",
19
+ "risk.long_running",
20
+ "risk.platform_specific",
21
+ ];
22
+ function normalizeCommandTemplateArgs(value) {
23
+ if (!Array.isArray(value))
24
+ return [];
25
+ return value.map(String).map((item) => item.trim());
26
+ }
27
+ export function normalizeCommandTemplateConfig(config) {
28
+ return typeof config === "string" ? { template: config } : config;
29
+ }
30
+ function normalizeRecoverConfig(config) {
31
+ if (config === undefined)
32
+ return undefined;
33
+ return Array.isArray(config) ? { template: config } : config;
34
+ }
35
+ function normalizeCommandTemplateDefaults(defaults) {
36
+ if (!defaults)
37
+ return undefined;
38
+ const normalized = {};
39
+ for (const [key, value] of Object.entries(defaults)) {
40
+ normalized[key] = Array.isArray(value)
41
+ ? value
42
+ : value === undefined || value === null
43
+ ? ""
44
+ : String(value);
45
+ }
46
+ return normalized;
47
+ }
48
+ export function resolveInheritedDefaultReferences(ownDefaults, inheritedDefaults, runtimeValues = {}) {
49
+ if (!ownDefaults)
50
+ return ownDefaults;
51
+ const resolved = { ...ownDefaults };
52
+ const values = { ...(inheritedDefaults ?? {}), ...runtimeValues };
53
+ for (const [key, value] of Object.entries(ownDefaults)) {
54
+ if (typeof value !== "string")
55
+ continue;
56
+ const exact = /^\{([A-Za-z_][A-Za-z0-9_-]*)\}$/.exec(value);
57
+ if (exact && Object.hasOwn(values, exact[1])) {
58
+ resolved[key] = values[exact[1]];
59
+ continue;
60
+ }
61
+ const indexed = value.match(/^\{([A-Za-z_][A-Za-z0-9_-]*)\[([A-Za-z_][A-Za-z0-9_-]*|\d+)\]\}$/);
62
+ if (!indexed)
63
+ continue;
64
+ const source = values[indexed[1]];
65
+ const indexValue = /^\d+$/.test(indexed[2])
66
+ ? indexed[2]
67
+ : values[indexed[2]];
68
+ const index = Number(indexValue);
69
+ if (Array.isArray(source) &&
70
+ Number.isInteger(index) &&
71
+ index >= 0 &&
72
+ index < source.length) {
73
+ resolved[key] = source[index] ?? "";
74
+ }
75
+ }
76
+ return resolved;
77
+ }
78
+ export function resolveCommandTemplateRepeat(value, values = {}) {
79
+ if (value === undefined)
80
+ return undefined;
81
+ if (typeof value === "number") {
82
+ if (!Number.isInteger(value) || value < 1)
83
+ throw new Error("Command template repeat must be a positive integer.");
84
+ return value;
85
+ }
86
+ const trimmed = value.trim();
87
+ if (/^\d+$/.test(trimmed))
88
+ return Number(trimmed);
89
+ const lengthMatch = trimmed.match(/^\{?([A-Za-z_][A-Za-z0-9_-]*)\.length\}?$/);
90
+ if (lengthMatch) {
91
+ const source = values[lengthMatch[1]];
92
+ if (Array.isArray(source))
93
+ return source.length;
94
+ if (source === undefined)
95
+ return undefined;
96
+ }
97
+ throw new Error("Command template repeat must be a positive integer or {array.length}.");
98
+ }
99
+ function getExecutableName(command) {
100
+ if (!command)
101
+ return "";
102
+ return command.split(/[\\/]/).pop()?.toLowerCase() ?? "";
103
+ }
104
+ function matchesFlag(arg, flag) {
105
+ if (arg === flag)
106
+ return true;
107
+ if (/^-[A-Za-z]$/.test(flag) && /^-[A-Za-z]+$/.test(arg))
108
+ return arg.slice(1).includes(flag.slice(1));
109
+ return false;
110
+ }
111
+ function hasAnyFlag(args, flags) {
112
+ return args.some((arg) => flags.some((flag) => matchesFlag(arg, flag)));
113
+ }
114
+ function hasRiskyPathArg(args) {
115
+ return args.some((arg) => arg === "/" ||
116
+ arg === "~" ||
117
+ arg === "./" ||
118
+ arg === "../" ||
119
+ arg.includes("{") ||
120
+ arg.startsWith("~/") ||
121
+ arg.startsWith("/"));
122
+ }
123
+ function sortRiskLabels(labels) {
124
+ const unique = new Set(labels);
125
+ return COMMAND_TEMPLATE_RISK_LABEL_ORDER.filter((label) => unique.has(label));
126
+ }
127
+ function hasAnyArg(args, values) {
128
+ return args.some((arg) => values.includes(arg.toLowerCase()));
129
+ }
130
+ function hasSecretTouchingText(parts) {
131
+ return parts.some((part) => /(^|[{}._\-\s/])(?:secret|token|password|passwd|credential|api[_-]?key|private[_-]?key|\.env|ssh[_-]?key)(?:[{}._\-\s/]|$)/i.test(part));
132
+ }
133
+ function getLeafCommandTemplateRiskLabels(config) {
134
+ const parts = splitCommandTemplate(config.template);
135
+ const command = getExecutableName(parts[0]);
136
+ const args = parts.slice(1);
137
+ const labels = new Set();
138
+ if (["bash", "sh", "zsh", "fish"].includes(command) || command.endsWith(".sh")) {
139
+ labels.add("risk.shell");
140
+ if (hasAnyFlag(args, ["-c"]))
141
+ labels.add("risk.eval");
142
+ }
143
+ if (["node", "deno", "bun"].includes(command) &&
144
+ hasAnyFlag(args, ["-e", "--eval"])) {
145
+ labels.add("risk.eval");
146
+ }
147
+ if (["python", "python3", "perl", "ruby"].includes(command) &&
148
+ hasAnyFlag(args, ["-c", "-e"])) {
149
+ labels.add("risk.eval");
150
+ }
151
+ if (command === "rm" &&
152
+ (args.some((arg) => /^-[^-]*r/.test(arg) || /^-[^-]*f/.test(arg)) ||
153
+ hasRiskyPathArg(args))) {
154
+ labels.add("risk.destructive_fs");
155
+ }
156
+ if (["mv", "cp", "rsync"].includes(command) && hasRiskyPathArg(args)) {
157
+ labels.add("risk.broad_fs_write");
158
+ }
159
+ if (["curl", "wget", "ssh", "scp", "sftp", "rsync", "nc", "ncat", "telnet", "ftp"].includes(command) ||
160
+ (command === "git" &&
161
+ hasAnyArg(args, ["clone", "fetch", "pull", "push", "ls-remote"])) ||
162
+ ["npm", "pnpm", "yarn", "pip", "cargo"].includes(command)) {
163
+ labels.add("risk.network");
164
+ }
165
+ if (["gh", "glab", "hub", "kubectl", "terraform"].includes(command) ||
166
+ (command === "git" && hasAnyArg(args, ["push"])) ||
167
+ (["npm", "pnpm", "yarn"].includes(command) &&
168
+ hasAnyArg(args, ["publish", "login", "logout", "deprecate"]))) {
169
+ labels.add("risk.external_side_effect");
170
+ }
171
+ if (command === "sleep" ||
172
+ command === "watch" ||
173
+ (command === "tail" && hasAnyFlag(args, ["-f"])) ||
174
+ hasAnyArg(args, ["--watch", "--serve", "serve"])) {
175
+ labels.add("risk.long_running");
176
+ }
177
+ if (["systemctl", "launchctl", "osascript", "open", "xdg-open", "powershell", "pwsh", "cmd.exe", "apt", "apt-get", "dnf", "yum", "brew", "pacman", "apk", "xclip", "wl-copy"].includes(command)) {
178
+ labels.add("risk.platform_specific");
179
+ }
180
+ if (["pass", "gpg", "ssh-add"].includes(command) || hasSecretTouchingText(parts)) {
181
+ labels.add("risk.secret_touching");
182
+ }
183
+ return sortRiskLabels(labels);
184
+ }
185
+ function getLeafCommandTemplateWarnings(config) {
186
+ const parts = splitCommandTemplate(config.template);
187
+ const command = getExecutableName(parts[0]);
188
+ const args = parts.slice(1);
189
+ const warnings = [];
190
+ if (["bash", "sh", "zsh", "fish"].includes(command)) {
191
+ const shellContent = hasAnyFlag(args, ["-c"])
192
+ ? "shell command strings"
193
+ : "shell scripts";
194
+ warnings.push(`${config.label ?? command}: invokes ${command}; ${shellContent} are trusted executable content and are not sandboxed by command-template argv splitting. Mitigation: keep scripts local, reviewed, and parameterized with explicit placeholders.`);
195
+ }
196
+ if (["node", "deno", "bun"].includes(command) &&
197
+ hasAnyFlag(args, ["-e", "--eval"])) {
198
+ warnings.push(`${config.label ?? command}: invokes ${command} eval mode; code strings are trusted executable content and are not sandboxed. Mitigation: prefer a checked-in script file or keep eval input fixed and reviewed.`);
199
+ }
200
+ if (["python", "python3", "perl", "ruby"].includes(command) &&
201
+ hasAnyFlag(args, ["-c", "-e"])) {
202
+ warnings.push(`${config.label ?? command}: invokes ${command} code-eval mode; code strings are trusted executable content and are not sandboxed. Mitigation: prefer a checked-in script file or keep eval input fixed and reviewed.`);
203
+ }
204
+ if (command === "rm" &&
205
+ (args.some((arg) => /^-[^-]*r/.test(arg) || /^-[^-]*f/.test(arg)) ||
206
+ hasRiskyPathArg(args))) {
207
+ warnings.push(`${config.label ?? command}: removes filesystem paths; verify placeholders and paths before running trusted destructive commands. Mitigation: constrain path placeholders and consider dry-run or explicit confirmation.`);
208
+ }
209
+ if (["mv", "cp", "rsync"].includes(command) && hasRiskyPathArg(args)) {
210
+ warnings.push(`${config.label ?? command}: mutates broad filesystem paths; verify placeholders and paths before running trusted commands. Mitigation: constrain path placeholders and prefer narrow source/destination paths.`);
211
+ }
212
+ return warnings;
213
+ }
214
+ function pad(value, width) {
215
+ return String(value).padStart(width, "0");
216
+ }
217
+ export function isCommandTemplateRepeatPlaceholder(name) {
218
+ return /^_{0,6}(?:index|prev|next|repeat)$/.test(name);
219
+ }
220
+ export function getCommandTemplateRepeatDefaults(index, repeat) {
221
+ const prev = (index - 1 + repeat) % repeat;
222
+ const next = (index + 1) % repeat;
223
+ const values = {
224
+ index: String(index),
225
+ next: String(next),
226
+ prev: String(prev),
227
+ repeat: String(repeat),
228
+ };
229
+ for (const name of ["index", "prev", "next", "repeat"]) {
230
+ const numeric = Number(values[name]);
231
+ for (let underscores = 1; underscores <= 6; underscores += 1) {
232
+ values[`${"_".repeat(underscores)}${name}`] = pad(numeric, underscores + 1);
233
+ }
234
+ }
235
+ return values;
236
+ }
237
+ function expandRepeatConfig(config, context) {
238
+ const repeat = resolveCommandTemplateRepeat(config.repeat, context.defaults ?? {});
239
+ if (repeat === undefined)
240
+ return undefined;
241
+ return Array.from({ length: repeat }, (_unused, index0) => {
242
+ const { repeat: _repeat, ...rest } = config;
243
+ return {
244
+ ...rest,
245
+ defaults: {
246
+ ...(context.defaults ?? {}),
247
+ ...(rest.defaults ?? {}),
248
+ ...getCommandTemplateRepeatDefaults(index0, repeat),
249
+ },
250
+ };
251
+ });
252
+ }
253
+ export function expandCommandTemplateConfigs(config, inherited = {}) {
254
+ const normalizedConfig = normalizeCommandTemplateConfig(config);
255
+ const inheritedDefaults = normalizeCommandTemplateDefaults(inherited.defaults);
256
+ const ownDefaults = resolveInheritedDefaultReferences(normalizeCommandTemplateDefaults(normalizedConfig.defaults), inheritedDefaults);
257
+ const context = {
258
+ ...(inherited.args !== undefined ? { args: inherited.args } : {}),
259
+ ...(inheritedDefaults ? { defaults: inheritedDefaults } : {}),
260
+ ...(normalizedConfig.args !== undefined
261
+ ? { args: normalizedConfig.args }
262
+ : {}),
263
+ ...(ownDefaults
264
+ ? { defaults: { ...(inheritedDefaults ?? {}), ...ownDefaults } }
265
+ : {}),
266
+ };
267
+ const repeated = expandRepeatConfig(normalizedConfig, context);
268
+ if (repeated) {
269
+ return repeated.flatMap((step) => expandCommandTemplateConfigs(step, context));
270
+ }
271
+ const recoverConfig = normalizeRecoverConfig(normalizedConfig.recover);
272
+ const recoverSteps = recoverConfig
273
+ ? expandCommandTemplateConfigs(recoverConfig, context)
274
+ : [];
275
+ if (Array.isArray(normalizedConfig.template)) {
276
+ return [
277
+ ...normalizedConfig.template.flatMap((step) => expandCommandTemplateConfigs(step, context)),
278
+ ...recoverSteps,
279
+ ];
280
+ }
281
+ if (typeof normalizedConfig.template !== "string")
282
+ return recoverSteps;
283
+ return [
284
+ {
285
+ ...normalizedConfig,
286
+ ...context,
287
+ template: normalizedConfig.template,
288
+ retry: normalizedConfig.retry,
289
+ },
290
+ ...recoverSteps,
291
+ ];
292
+ }
293
+ export function getCommandTemplateWarnings(config) {
294
+ return [
295
+ ...new Set(expandCommandTemplateConfigs(config).flatMap((leaf) => getLeafCommandTemplateWarnings(leaf))),
296
+ ];
297
+ }
298
+ export function getCommandTemplateRiskLabels(config) {
299
+ return sortRiskLabels(expandCommandTemplateConfigs(config).flatMap((leaf) => getLeafCommandTemplateRiskLabels(leaf)));
300
+ }
301
+ function parseCommandTemplateArgToken(value) {
302
+ const separatorIndex = value.indexOf("=");
303
+ const rawName = separatorIndex === -1 ? value : value.slice(0, separatorIndex);
304
+ const colonIndex = rawName.indexOf(":");
305
+ return {
306
+ name: (colonIndex === -1 ? rawName : rawName.slice(0, colonIndex)).trim(),
307
+ ...(separatorIndex === -1
308
+ ? {}
309
+ : { defaultValue: value.slice(separatorIndex + 1).trim() }),
310
+ };
311
+ }
312
+ function parseCommandTemplatePlaceholderContent(content) {
313
+ const match = content.match(/^([A-Za-z_][A-Za-z0-9_-]*)(?::(?:string|path|int|number|bool|array|enum\([^)]*\)))?(?:=([^}]*))?$/);
314
+ if (!match)
315
+ return undefined;
316
+ return {
317
+ name: match[1],
318
+ ...(match[2] !== undefined ? { inlineDefault: match[2] } : {}),
319
+ };
320
+ }
321
+ export function getCommandTemplateDefaults(config) {
322
+ const normalizedConfig = config
323
+ ? normalizeCommandTemplateConfig(config)
324
+ : undefined;
325
+ const defaults = {};
326
+ for (const item of normalizeCommandTemplateArgs(normalizedConfig?.args)) {
327
+ if (!item)
328
+ continue;
329
+ const parsed = parseCommandTemplateArgToken(item);
330
+ if (!parsed.name || parsed.defaultValue === undefined)
331
+ continue;
332
+ defaults[parsed.name] = parsed.defaultValue;
333
+ }
334
+ for (const [key, value] of Object.entries(normalizedConfig?.defaults ?? {})) {
335
+ defaults[key] = value === undefined || value === null ? "" : String(value);
336
+ }
337
+ return defaults;
338
+ }
339
+ export function splitCommandTemplate(input) {
340
+ const words = [];
341
+ let current = "";
342
+ let quote;
343
+ let escaped = false;
344
+ let active = false;
345
+ for (const char of input) {
346
+ if (escaped) {
347
+ current += /[\s'"\\]/u.test(char) ? char : `\\${char}`;
348
+ escaped = false;
349
+ active = true;
350
+ continue;
351
+ }
352
+ if (char === "\\" && quote !== "'") {
353
+ escaped = true;
354
+ active = true;
355
+ continue;
356
+ }
357
+ if (quote) {
358
+ if (char === quote)
359
+ quote = undefined;
360
+ else
361
+ current += char;
362
+ active = true;
363
+ continue;
364
+ }
365
+ if (char === "'" || char === '"') {
366
+ quote = char;
367
+ active = true;
368
+ continue;
369
+ }
370
+ if (/\s/.test(char)) {
371
+ if (active)
372
+ words.push(current);
373
+ if (active)
374
+ current = "";
375
+ active = false;
376
+ continue;
377
+ }
378
+ current += char;
379
+ active = true;
380
+ }
381
+ if (escaped)
382
+ current += "\\";
383
+ if (active || current)
384
+ words.push(current);
385
+ return words;
386
+ }
387
+ export function expandCommandTemplateExecutable(command, cwd) {
388
+ if (command === "~")
389
+ return homedir();
390
+ if (command.startsWith("~/"))
391
+ return resolvePath(homedir(), command.slice(2));
392
+ if (command.includes("/") && !isAbsolute(command))
393
+ return resolvePath(cwd, command);
394
+ return command;
395
+ }
396
+ function resolveExecutableOnPath(name) {
397
+ if (name === "node" && /^node(?:\.exe)?$/i.test(basename(process.execPath)))
398
+ return process.execPath;
399
+ const pathValue = Object.entries(process.env)
400
+ .find(([key]) => key.toLowerCase() === "path")?.[1] ?? "";
401
+ const suffixes = process.platform === "win32" ? [".exe", ".com"] : [""];
402
+ for (const entry of pathValue.split(delimiter).filter(Boolean)) {
403
+ const directory = entry.replace(/^"|"$/g, "");
404
+ for (const suffix of suffixes) {
405
+ const candidate = join(directory, `${name}${suffix}`);
406
+ try {
407
+ accessSync(candidate, constants.X_OK);
408
+ if (statSync(candidate).isFile())
409
+ return candidate;
410
+ }
411
+ catch { }
412
+ }
413
+ }
414
+ return undefined;
415
+ }
416
+ export function resolveCommandTemplateScriptInvocation(invocation, resolveExecutable = resolveExecutableOnPath) {
417
+ const extension = extname(invocation.command).toLowerCase();
418
+ const interpreters = extension === ".js" || extension === ".mjs"
419
+ ? [["node"], ["bun"], ["deno", "run"]]
420
+ : extension === ".sh" ? [["bash"]] : [];
421
+ if (interpreters.length === 0)
422
+ return invocation;
423
+ for (const [name, ...prefix] of interpreters) {
424
+ const executable = resolveExecutable(name);
425
+ if (executable)
426
+ return { command: executable, args: [...prefix, invocation.command, ...invocation.args] };
427
+ }
428
+ throw new Error(`No interpreter available for command-template ${extension} script; tried ${interpreters.map(([name]) => name).join(", ")}.`);
429
+ }
430
+ function evaluateCommandTemplateExpression(expression, values) {
431
+ let index = 0;
432
+ const source = expression.replace(/\s+/g, "");
433
+ function peek() {
434
+ return source[index];
435
+ }
436
+ function consume(char) {
437
+ if (peek() !== char)
438
+ return false;
439
+ index += 1;
440
+ return true;
441
+ }
442
+ function parsePrimary() {
443
+ if (consume("(")) {
444
+ const value = parseExpression();
445
+ if (!consume(")"))
446
+ throw new Error(`Invalid command template expression: ${expression}`);
447
+ return value;
448
+ }
449
+ const numberMatch = source.slice(index).match(/^\d+/);
450
+ if (numberMatch) {
451
+ index += numberMatch[0].length;
452
+ return Number(numberMatch[0]);
453
+ }
454
+ const nameMatch = source.slice(index).match(/^[A-Za-z_][A-Za-z0-9_-]*/);
455
+ if (nameMatch) {
456
+ index += nameMatch[0].length;
457
+ const value = values[nameMatch[0]];
458
+ if (value === undefined || !/^-?\d+$/.test(String(value)))
459
+ throw new Error(`Invalid command template expression variable: ${nameMatch[0]}`);
460
+ return Number(value);
461
+ }
462
+ throw new Error(`Invalid command template expression: ${expression}`);
463
+ }
464
+ function parseTerm() {
465
+ let value = parsePrimary();
466
+ while (true) {
467
+ if (consume("*"))
468
+ value *= parsePrimary();
469
+ else if (consume("/"))
470
+ value = Math.trunc(value / parsePrimary());
471
+ else if (consume("%"))
472
+ value %= parsePrimary();
473
+ else
474
+ return value;
475
+ }
476
+ }
477
+ function parseExpression() {
478
+ let value = parseTerm();
479
+ while (true) {
480
+ if (consume("+"))
481
+ value += parseTerm();
482
+ else if (consume("-"))
483
+ value -= parseTerm();
484
+ else
485
+ return value;
486
+ }
487
+ }
488
+ const value = parseExpression();
489
+ if (index !== source.length)
490
+ throw new Error(`Invalid command template expression: ${expression}`);
491
+ return value;
492
+ }
493
+ function substituteCommandTemplateExpression(content, values) {
494
+ const padded = content.match(/^(_{1,6})\((.+)\)$/);
495
+ if (padded) {
496
+ return pad(evaluateCommandTemplateExpression(padded[2], values), padded[1].length + 1);
497
+ }
498
+ if (!/[()+\-*\/%]/.test(content))
499
+ return undefined;
500
+ return String(evaluateCommandTemplateExpression(content, values));
501
+ }
502
+ function shouldResolveEmbeddedCommandTemplateToken(token, values) {
503
+ const matches = [...token.matchAll(/\{([^{}]+)\}/g)];
504
+ if (matches.length === 0)
505
+ return false;
506
+ return matches.every((match) => {
507
+ const content = match[1];
508
+ if (resolveCommandTemplateNullish(content, values) !== undefined)
509
+ return true;
510
+ if (resolveCommandTemplateTernary(content, values) !== undefined)
511
+ return true;
512
+ const indexed = content.match(/^([A-Za-z_][A-Za-z0-9_-]*)\[([A-Za-z_][A-Za-z0-9_-]*|\d+)\]$/);
513
+ if (indexed)
514
+ return Object.hasOwn(values, indexed[1]);
515
+ const simple = parseCommandTemplatePlaceholderContent(content);
516
+ if (simple)
517
+ return (Object.hasOwn(values, simple.name) || simple.inlineDefault !== undefined);
518
+ try {
519
+ return substituteCommandTemplateExpression(content, values) !== undefined;
520
+ }
521
+ catch {
522
+ return false;
523
+ }
524
+ });
525
+ }
526
+ function isFalsyCommandTemplateValue(value) {
527
+ if (value === undefined || value === null || value === false)
528
+ return true;
529
+ const normalized = String(value).trim().toLowerCase();
530
+ return (normalized === "" ||
531
+ normalized === "0" ||
532
+ normalized === "false" ||
533
+ normalized === "no");
534
+ }
535
+ function resolveCommandTemplateCondition(condition, values) {
536
+ const trimmed = condition.trim();
537
+ const negated = trimmed.startsWith("!");
538
+ const name = negated ? trimmed.slice(1).trim() : trimmed;
539
+ const value = /^[A-Za-z_][A-Za-z0-9_-]*$/.test(name)
540
+ ? values[name]
541
+ : undefined;
542
+ return negated ? isFalsyCommandTemplateValue(value) : value;
543
+ }
544
+ export function shouldRunCommandTemplateNode(value, values) {
545
+ if (value === undefined)
546
+ return true;
547
+ if (typeof value === "boolean")
548
+ return value;
549
+ const trimmed = value.trim();
550
+ if (!trimmed)
551
+ return false;
552
+ const exact = /^\{([^{}]+)\}$/.exec(trimmed);
553
+ const resolved = exact
554
+ ? resolveCommandTemplateValue(exact[1], values, "command template when")
555
+ : resolveCommandTemplateCondition(trimmed, values);
556
+ return !isFalsyCommandTemplateValue(resolved);
557
+ }
558
+ function resolveCommandTemplateNullish(content, values) {
559
+ const coalescing = content.match(/^([A-Za-z_][A-Za-z0-9_-]*)\?\?(.*)$/);
560
+ if (!coalescing)
561
+ return undefined;
562
+ const value = values[coalescing[1]];
563
+ return isFalsyCommandTemplateValue(value) ? coalescing[2] : String(value);
564
+ }
565
+ function resolveCommandTemplateTernary(content, values) {
566
+ const ternary = content.match(/^([^?:]+)\?([^:]*):(.*)$/);
567
+ if (!ternary)
568
+ return undefined;
569
+ const condition = resolveCommandTemplateCondition(ternary[1], values);
570
+ return isFalsyCommandTemplateValue(condition) ? ternary[3] : ternary[2];
571
+ }
572
+ function resolveCommandTemplateValue(content, values, missingLabel, depth = 0) {
573
+ if (depth > 5)
574
+ throw new Error(`Command template value recursion exceeded: ${content}`);
575
+ const nullish = resolveCommandTemplateNullish(content, values);
576
+ if (nullish !== undefined)
577
+ return nullish;
578
+ const ternary = resolveCommandTemplateTernary(content, values);
579
+ if (ternary !== undefined)
580
+ return ternary;
581
+ const indexed = content.match(/^([A-Za-z_][A-Za-z0-9_-]*)\[([A-Za-z_][A-Za-z0-9_-]*|\d+)\]$/);
582
+ if (indexed) {
583
+ const source = values[indexed[1]];
584
+ const indexValue = /^\d+$/.test(indexed[2])
585
+ ? indexed[2]
586
+ : values[indexed[2]];
587
+ const index = Number(indexValue);
588
+ if (!Array.isArray(source) ||
589
+ !Number.isInteger(index) ||
590
+ index < 0 ||
591
+ index >= source.length) {
592
+ throw new Error(`Missing ${missingLabel} value: ${content}`);
593
+ }
594
+ return String(source[index] ?? "");
595
+ }
596
+ const simple = parseCommandTemplatePlaceholderContent(content);
597
+ if (simple) {
598
+ if (Object.hasOwn(values, simple.name)) {
599
+ const raw = values[simple.name] ?? "";
600
+ if (typeof raw === "string" &&
601
+ shouldResolveEmbeddedCommandTemplateToken(raw, values)) {
602
+ return substituteCommandTemplateToken(raw, values, missingLabel, depth + 1);
603
+ }
604
+ return Array.isArray(raw) ? JSON.stringify(raw) : String(raw);
605
+ }
606
+ if (simple.inlineDefault !== undefined)
607
+ return simple.inlineDefault;
608
+ }
609
+ const expression = substituteCommandTemplateExpression(content, values);
610
+ if (expression !== undefined)
611
+ return expression;
612
+ return undefined;
613
+ }
614
+ export function substituteCommandTemplateToken(token, values, missingLabel = "command template", depth = 0) {
615
+ return token.replace(/\{([^{}]+)\}/g, (_match, content) => {
616
+ const resolved = resolveCommandTemplateValue(content, values, missingLabel, depth);
617
+ if (resolved !== undefined)
618
+ return resolved;
619
+ throw new Error(`Missing ${missingLabel} value: ${content}`);
620
+ });
621
+ }
622
+ export async function execCommandTemplate(command, args, options = {}) {
623
+ const maxAttempts = options.retry ?? 1;
624
+ let lastResult = {
625
+ stdout: "",
626
+ stderr: "",
627
+ code: 1,
628
+ killed: false,
629
+ };
630
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
631
+ const attemptOptions = options.captureDir
632
+ ? {
633
+ ...options,
634
+ captureDir: join(options.captureDir, `attempt-${String(attempt).padStart(3, "0")}`),
635
+ }
636
+ : options;
637
+ const result = await execCommandTemplateOnce(command, args, attemptOptions);
638
+ if (result.code === 0)
639
+ return result;
640
+ lastResult = result;
641
+ }
642
+ return lastResult;
643
+ }
644
+ function trimCaptureTail(value, limit) {
645
+ if (value.length <= limit)
646
+ return value;
647
+ let start = value.length - limit;
648
+ while (start < value.length && (value[start] & 0xc0) === 0x80)
649
+ start += 1;
650
+ return value.subarray(start);
651
+ }
652
+ function createBoundedCommandCapture(stream, limit, getCaptureDir, persistCompleteStream) {
653
+ let bytes = 0;
654
+ let content = Buffer.alloc(0);
655
+ let file = persistCompleteStream
656
+ ? join(getCaptureDir(), `${stream}.log`)
657
+ : undefined;
658
+ if (file)
659
+ writeFileSync(file, Buffer.alloc(0));
660
+ let truncated = false;
661
+ return {
662
+ append(value) {
663
+ const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);
664
+ bytes += chunk.length;
665
+ if (bytes > limit)
666
+ truncated = true;
667
+ if (!file && bytes <= limit) {
668
+ content = Buffer.concat([content, chunk]);
669
+ return;
670
+ }
671
+ if (!file) {
672
+ file = join(getCaptureDir(), `${stream}.log`);
673
+ writeFileSync(file, content);
674
+ }
675
+ appendFileSync(file, chunk);
676
+ content = trimCaptureTail(Buffer.concat([content, chunk]), limit);
677
+ },
678
+ result() {
679
+ if (!file && persistCompleteStream) {
680
+ file = join(getCaptureDir(), `${stream}.log`);
681
+ writeFileSync(file, content);
682
+ }
683
+ return {
684
+ bytes,
685
+ content: content.toString("utf8"),
686
+ ...(file ? { file } : {}),
687
+ truncated,
688
+ };
689
+ },
690
+ };
691
+ }
692
+ function execCommandTemplateOnce(command, args, options = {}) {
693
+ return new Promise((resolve) => {
694
+ const proc = spawn(command, args, {
695
+ cwd: options.cwd,
696
+ shell: false,
697
+ stdio: [options.stdin === undefined ? "ignore" : "pipe", "pipe", "pipe"],
698
+ });
699
+ const captureLimit = Math.max(1, options.captureLimitBytes ?? DEFAULT_COMMAND_CAPTURE_LIMIT_BYTES);
700
+ let captureDir;
701
+ const getCaptureDir = () => {
702
+ if (captureDir)
703
+ return captureDir;
704
+ captureDir = options.captureDir
705
+ ? resolvePath(options.captureDir)
706
+ : mkdtempSync(join(tmpdir(), "pi-actors-command-"));
707
+ mkdirSync(captureDir, { recursive: true });
708
+ return captureDir;
709
+ };
710
+ const persistCompleteStreams = options.captureDir !== undefined;
711
+ const stdoutCapture = createBoundedCommandCapture("stdout", captureLimit, getCaptureDir, persistCompleteStreams);
712
+ const stderrCapture = createBoundedCommandCapture("stderr", captureLimit, getCaptureDir, persistCompleteStreams);
713
+ let killed = false;
714
+ let settled = false;
715
+ let timeoutId;
716
+ let killTimeoutId;
717
+ const killProcess = () => {
718
+ if (killed)
719
+ return;
720
+ killed = true;
721
+ proc.kill("SIGTERM");
722
+ killTimeoutId = setTimeout(() => {
723
+ if (!settled)
724
+ proc.kill("SIGKILL");
725
+ }, options.killGrace ?? 5000);
726
+ };
727
+ const settle = (code) => {
728
+ if (settled)
729
+ return;
730
+ settled = true;
731
+ if (timeoutId)
732
+ clearTimeout(timeoutId);
733
+ if (killTimeoutId)
734
+ clearTimeout(killTimeoutId);
735
+ if (options.signal)
736
+ options.signal.removeEventListener("abort", killProcess);
737
+ const stdout = stdoutCapture.result();
738
+ const stderr = stderrCapture.result();
739
+ resolve({
740
+ stdout: stdout.content,
741
+ stderr: stderr.content,
742
+ code,
743
+ killed,
744
+ stdoutBytes: stdout.bytes,
745
+ stderrBytes: stderr.bytes,
746
+ ...(stdout.file ? { stdoutFile: stdout.file } : {}),
747
+ ...(stderr.file ? { stderrFile: stderr.file } : {}),
748
+ ...(stdout.truncated ? { stdoutTruncated: true } : {}),
749
+ ...(stderr.truncated ? { stderrTruncated: true } : {}),
750
+ });
751
+ };
752
+ if (options.signal) {
753
+ if (options.signal.aborted)
754
+ killProcess();
755
+ else
756
+ options.signal.addEventListener("abort", killProcess, { once: true });
757
+ }
758
+ if (options.timeout !== undefined && options.timeout > 0)
759
+ timeoutId = setTimeout(killProcess, options.timeout);
760
+ proc.stdout?.on("data", (data) => {
761
+ stdoutCapture.append(data);
762
+ });
763
+ proc.stderr?.on("data", (data) => {
764
+ stderrCapture.append(data);
765
+ });
766
+ proc.stdin?.on("error", () => { });
767
+ if (options.stdin !== undefined)
768
+ proc.stdin?.end(options.stdin);
769
+ proc.on("error", (error) => {
770
+ stderrCapture.append(error instanceof Error ? error.message : String(error));
771
+ settle(1);
772
+ });
773
+ proc.on("close", (code) => {
774
+ settle(code ?? (killed ? 1 : 0));
775
+ });
776
+ });
777
+ }
778
+ export function buildCommandTemplateInvocation(config, values, cwd, options = {}) {
779
+ const normalizedConfig = normalizeCommandTemplateConfig(config);
780
+ if (Array.isArray(normalizedConfig.template)) {
781
+ throw new Error(options.emptyMessage ??
782
+ "Command template sequence cannot be executed as one command");
783
+ }
784
+ if (!normalizedConfig.template)
785
+ throw new Error(options.emptyMessage ?? "Command template is required");
786
+ if (typeof normalizedConfig.template !== "string") {
787
+ throw new Error(options.emptyMessage ??
788
+ "Command template object cannot be executed as one command");
789
+ }
790
+ const parts = splitCommandTemplate(normalizedConfig.template);
791
+ const commandPart = parts[0];
792
+ if (!commandPart)
793
+ throw new Error(options.emptyMessage ?? "Command template is empty");
794
+ const resolvedValues = {
795
+ ...getCommandTemplateDefaults(normalizedConfig),
796
+ ...values,
797
+ };
798
+ const command = expandCommandTemplateExecutable(substituteCommandTemplateToken(commandPart, resolvedValues, options.missingLabel), cwd);
799
+ const args = parts
800
+ .slice(1)
801
+ .map((part) => substituteCommandTemplateToken(part, resolvedValues, options.missingLabel))
802
+ .filter((part) => part !== "");
803
+ return resolveCommandTemplateScriptInvocation({ command, args });
804
+ }