@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,883 @@
1
+ /**
2
+ * Telegram synchronization helpers
3
+ * Zones: Telegram bot reality mirror, demand-driven reconciliation, status diagnostics
4
+ * Owns pure contracts for deciding when local Telegram mirror state should be refreshed without querying Telegram on every action
5
+ */
6
+
7
+ import { getTelegramTargetKey, type TelegramTarget } from "./target.ts";
8
+ import * as ThreadReconciler from "./thread-reconciler.ts";
9
+ import {
10
+ getTelegramTargetFromApiBody,
11
+ isTelegramTopicTargetStaleError,
12
+ provisionOwnBusTopic,
13
+ type TelegramOwnTopicProvisionResult,
14
+ type TelegramTopicTargetStore,
15
+ } from "./threads.ts";
16
+
17
+ export interface TelegramTopicLifecycleSyncUpdate<TMessage = unknown> {
18
+ kind: "created" | "closed" | "reopened";
19
+ target: TelegramTarget & { threadId: number };
20
+ message: TMessage;
21
+ }
22
+
23
+ export interface TelegramLeaderThreadSyncDeps {
24
+ getAllowedUserId: () => number | undefined;
25
+ instanceId: string;
26
+ cwd?: string;
27
+ telegramProfile?: string;
28
+ forceFreshUnnamed?: boolean;
29
+ getNowMs?: () => number;
30
+ getRandom?: () => number;
31
+ getCurrentLeaderEpoch?: () => number | string | undefined;
32
+ getThreadReconciliationMachineState?: () =>
33
+ ThreadReconciler.ThreadReconciliationMachineState | undefined;
34
+ recordThreadReconciliationPlan?: (
35
+ plan: ThreadReconciler.ThreadReconciliationPlan,
36
+ ) => void;
37
+ topicTargetStore: TelegramTopicTargetStore;
38
+ callApi: <TResponse>(
39
+ method: string,
40
+ body: Record<string, unknown>,
41
+ ) => Promise<TResponse>;
42
+ recordEvent: (
43
+ category: string,
44
+ message: unknown,
45
+ details?: Record<string, unknown>,
46
+ ) => void;
47
+ }
48
+
49
+ export interface TelegramTopicLifecycleSyncDeps {
50
+ topicTargetStore: Pick<
51
+ TelegramTopicTargetStore,
52
+ | "load"
53
+ | "list"
54
+ | "listReservations"
55
+ | "listPendingProvisions"
56
+ | "markStaleByTarget"
57
+ | "markActiveByTarget"
58
+ | "removePendingProvision"
59
+ | "persist"
60
+ >;
61
+ isBusEnabled: () => boolean;
62
+ callApi: <TResponse>(
63
+ method: string,
64
+ body: Record<string, unknown>,
65
+ ) => Promise<TResponse>;
66
+ isTopicProvisioningActive?: () => boolean;
67
+ getCurrentLeaderEpoch?: () => number | string | undefined;
68
+ getThreadReconciliationMachineState?: () =>
69
+ ThreadReconciler.ThreadReconciliationMachineState | undefined;
70
+ recordThreadReconciliationPlan?: (
71
+ plan: ThreadReconciler.ThreadReconciliationPlan,
72
+ ) => void;
73
+ assertExecutionCurrent?: (message: unknown) => void;
74
+ recordEvent?: (
75
+ category: string,
76
+ message: unknown,
77
+ details?: Record<string, unknown>,
78
+ ) => void;
79
+ }
80
+
81
+ export type TelegramTopicLifecycleSyncHandler<TMessage = unknown> = (
82
+ lifecycle: TelegramTopicLifecycleSyncUpdate<TMessage>,
83
+ ) => Promise<void>;
84
+
85
+ export interface TelegramObservedTopicLifecycleSyncDeps<
86
+ TSyncState,
87
+ > extends TelegramTopicLifecycleSyncDeps {
88
+ getSyncState: () => TSyncState;
89
+ setSyncState: (state: TSyncState) => void;
90
+ getNowMs?: () => number;
91
+ }
92
+
93
+ export interface TelegramLeaderHealthRuntimeDeps<TSyncState> {
94
+ getNowMs?: () => number;
95
+ intervalMs?: number;
96
+ callGetMe: () => Promise<unknown>;
97
+ getSyncState: () => TSyncState;
98
+ setSyncState: (state: TSyncState) => void;
99
+ recordEvent: (
100
+ category: string,
101
+ message: unknown,
102
+ details?: Record<string, unknown>,
103
+ ) => void;
104
+ }
105
+
106
+ export interface TelegramLeaderHealthRuntime {
107
+ start: () => void;
108
+ stop: () => void;
109
+ }
110
+
111
+ export interface TelegramManualThreadDisconnectDeps<TSyncState> {
112
+ instanceId: string;
113
+ getCurrentThreadRecord: () =>
114
+ | {
115
+ target: TelegramTarget;
116
+ instanceId?: string;
117
+ profileKey?: string;
118
+ owner?: { kind?: string };
119
+ }
120
+ | undefined;
121
+ topicTargetStore: Pick<
122
+ TelegramTopicTargetStore,
123
+ | "markStaleByTarget"
124
+ | "persist"
125
+ | "upsertPendingCleanup"
126
+ | "removePendingCleanup"
127
+ >;
128
+ callApi: <TResponse>(
129
+ method: string,
130
+ body: Record<string, unknown>,
131
+ ) => Promise<TResponse>;
132
+ getLeaderTarget: () => TelegramTarget | undefined;
133
+ getCurrentLeaderEpoch?: () => number | string | undefined;
134
+ clearLeaderTarget: () => void;
135
+ disconnectFollowerThread?: () => Promise<boolean>;
136
+ getSyncState: () => TSyncState;
137
+ setSyncState: (state: TSyncState) => void;
138
+ stopPolling: () => Promise<string>;
139
+ recordRuntimeEvent: (
140
+ category: string,
141
+ error: unknown,
142
+ details?: Record<string, unknown>,
143
+ ) => void;
144
+ getNowMs?: () => number;
145
+ }
146
+
147
+ export function markTelegramConfigSyncChange<
148
+ TSyncState extends TelegramSyncState,
149
+ >(state: TSyncState, action: string, options?: { nowMs?: number }): TSyncState {
150
+ const nowMs = options?.nowMs ?? Date.now();
151
+ let nextState = markTelegramSyncSliceFresh(state, "pairing", {
152
+ nowMs,
153
+ action,
154
+ }) as TSyncState;
155
+ nextState = markTelegramSyncSliceFresh(nextState, "allowed-user", {
156
+ nowMs,
157
+ action,
158
+ }) as TSyncState;
159
+ nextState = markTelegramSyncSliceFresh(nextState, "bot-identity", {
160
+ nowMs,
161
+ action,
162
+ }) as TSyncState;
163
+ return nextState;
164
+ }
165
+
166
+ export interface TelegramSessionRestartThreadCleanupDeps<
167
+ TSyncState extends TelegramSyncState,
168
+ > extends Omit<TelegramManualThreadDisconnectDeps<TSyncState>, "stopPolling"> {
169
+ suspendPolling: () => Promise<void>;
170
+ }
171
+
172
+ export function createTelegramSessionRestartThreadCleanupHandler<
173
+ TSyncState extends TelegramSyncState,
174
+ >(
175
+ deps: TelegramSessionRestartThreadCleanupDeps<TSyncState>,
176
+ ): () => Promise<string> {
177
+ return createTelegramManualThreadDisconnectHandler({
178
+ ...deps,
179
+ async stopPolling() {
180
+ await deps.suspendPolling();
181
+ return "Telegram bridge suspended for session restart.";
182
+ },
183
+ });
184
+ }
185
+
186
+ export interface TelegramThreadDisconnectAssembly {
187
+ disconnect: () => Promise<string>;
188
+ cleanupForSessionRestart: () => Promise<string>;
189
+ }
190
+
191
+ export function createTelegramThreadDisconnectAssembly<
192
+ TSyncState extends TelegramSyncState,
193
+ >(
194
+ deps: Omit<TelegramManualThreadDisconnectDeps<TSyncState>, "stopPolling"> & {
195
+ stopPolling: () => Promise<string>;
196
+ suspendPolling: () => Promise<void>;
197
+ },
198
+ ): TelegramThreadDisconnectAssembly {
199
+ return {
200
+ disconnect: createTelegramManualThreadDisconnectHandler({
201
+ ...deps,
202
+ stopPolling: deps.stopPolling,
203
+ }),
204
+ cleanupForSessionRestart:
205
+ createTelegramSessionRestartThreadCleanupHandler({
206
+ ...deps,
207
+ suspendPolling: deps.suspendPolling,
208
+ }),
209
+ };
210
+ }
211
+
212
+ export function createTelegramManualThreadDisconnectHandler<
213
+ TSyncState extends TelegramSyncState,
214
+ >(deps: TelegramManualThreadDisconnectDeps<TSyncState>): () => Promise<string> {
215
+ return async () => {
216
+ const currentRecord = deps.getCurrentThreadRecord();
217
+ let cleanupPending = false;
218
+ if (currentRecord?.target.threadId) {
219
+ const isManualFollower = currentRecord.owner?.kind === "manual-follower";
220
+ const leaderEpoch = deps.getCurrentLeaderEpoch?.();
221
+ const ownsLeader = deps.getCurrentLeaderEpoch
222
+ ? leaderEpoch !== undefined
223
+ : !isManualFollower;
224
+ if (isManualFollower && !ownsLeader) {
225
+ if (deps.disconnectFollowerThread) {
226
+ const disconnected = await deps.disconnectFollowerThread();
227
+ if (!disconnected) {
228
+ throw new Error(
229
+ "Telegram follower thread deletion requires a live leader registration.",
230
+ );
231
+ }
232
+ }
233
+ } else {
234
+ const target = currentRecord.target as TelegramTarget & {
235
+ threadId: number;
236
+ };
237
+ const runtimeGeneration = currentRecord.instanceId ?? deps.instanceId;
238
+ const intent: ThreadReconciler.TelegramThreadCleanupIntent = {
239
+ id: `cleanup:${deps.instanceId}:${runtimeGeneration}:${target.chatId}:${target.threadId}`,
240
+ owner: isManualFollower ? "manual-follower" : "leader",
241
+ instanceId: deps.instanceId,
242
+ runtimeGeneration,
243
+ ...(currentRecord.profileKey
244
+ ? { profileKey: currentRecord.profileKey }
245
+ : {}),
246
+ target,
247
+ requestedAtMs: (deps.getNowMs ?? Date.now)(),
248
+ };
249
+ deps.topicTargetStore.upsertPendingCleanup(intent);
250
+ await deps.topicTargetStore.persist();
251
+ const cleanup = await ThreadReconciler.applyThreadReconciliationPlan(
252
+ ThreadReconciler.planThreadReconciliation({
253
+ nowMs: (deps.getNowMs ?? Date.now)(),
254
+ currentLeaderEpoch: leaderEpoch,
255
+ records: [],
256
+ pendingCleanups: [intent],
257
+ }),
258
+ {
259
+ callApi(method, body) {
260
+ return deps.callApi(method, body);
261
+ },
262
+ markStaleByTarget(targetToMark, syncStatus, lastSyncError) {
263
+ return deps.topicTargetStore.markStaleByTarget(
264
+ targetToMark,
265
+ syncStatus,
266
+ lastSyncError,
267
+ );
268
+ },
269
+ removeCleanupIntentById(id) {
270
+ return deps.topicTargetStore.removePendingCleanup(id);
271
+ },
272
+ persist() {
273
+ return deps.topicTargetStore.persist();
274
+ },
275
+ getCurrentLeaderEpoch: deps.getCurrentLeaderEpoch,
276
+ recordRuntimeEvent: deps.recordRuntimeEvent,
277
+ },
278
+ );
279
+ cleanupPending = Boolean(cleanup.incompleteActions?.length);
280
+ }
281
+ const leaderTarget = deps.getLeaderTarget();
282
+ if (
283
+ leaderTarget?.chatId === currentRecord.target.chatId &&
284
+ leaderTarget.threadId === currentRecord.target.threadId
285
+ ) {
286
+ deps.clearLeaderTarget();
287
+ }
288
+ deps.setSyncState(
289
+ markTelegramSyncSliceFresh(deps.getSyncState(), "target-bindings", {
290
+ nowMs: (deps.getNowMs ?? Date.now)(),
291
+ action: "manual-disconnect",
292
+ }) as TSyncState,
293
+ );
294
+ }
295
+ const stopped = await deps.stopPolling();
296
+ return cleanupPending
297
+ ? `${stopped} Telegram thread cleanup remains pending for the next leader.`
298
+ : stopped;
299
+ };
300
+ }
301
+
302
+ export function createTelegramLeaderHealthRuntime<
303
+ TSyncState extends TelegramSyncState,
304
+ >(
305
+ deps: TelegramLeaderHealthRuntimeDeps<TSyncState>,
306
+ ): TelegramLeaderHealthRuntime {
307
+ const intervalMs = deps.intervalMs ?? 60_000;
308
+ const getNowMs = deps.getNowMs ?? Date.now;
309
+ let interval: ReturnType<typeof setInterval> | undefined;
310
+ let generation = 0;
311
+ let tickPromise: Promise<void> | undefined;
312
+
313
+ const markFresh = (): void => {
314
+ let state = markTelegramSyncSliceFresh(
315
+ deps.getSyncState(),
316
+ "transport-health",
317
+ { nowMs: getNowMs(), action: "leader-health-tick" },
318
+ ) as TSyncState;
319
+ state = markTelegramSyncSliceFresh(state, "bot-identity", {
320
+ nowMs: getNowMs(),
321
+ action: "leader-health-tick",
322
+ }) as TSyncState;
323
+ deps.setSyncState(state);
324
+ };
325
+
326
+ const markSuspect = (error: unknown): void => {
327
+ deps.setSyncState(
328
+ markTelegramSyncSliceSuspect(deps.getSyncState(), "transport-health", {
329
+ nowMs: getNowMs(),
330
+ reason: String(error),
331
+ action: "leader-health-tick",
332
+ }) as TSyncState,
333
+ );
334
+ try {
335
+ deps.recordEvent("telegram", error, { phase: "leader-health-tick" });
336
+ } catch {
337
+ // Health diagnostics cannot create an unhandled timer rejection.
338
+ }
339
+ };
340
+
341
+ const stop = (): void => {
342
+ generation += 1;
343
+ if (interval) clearInterval(interval);
344
+ interval = undefined;
345
+ tickPromise = undefined;
346
+ };
347
+ const requestTick = (): Promise<void> => {
348
+ if (tickPromise) return tickPromise;
349
+ const expectedGeneration = generation;
350
+ let tracked: Promise<void>;
351
+ tracked = Promise.resolve()
352
+ .then(deps.callGetMe)
353
+ .then(
354
+ () => {
355
+ if (generation !== expectedGeneration) return;
356
+ try {
357
+ markFresh();
358
+ } catch (stateError) {
359
+ try {
360
+ deps.recordEvent("telegram", stateError, {
361
+ phase: "leader-health-state",
362
+ });
363
+ } catch {
364
+ // State and diagnostic failure remain contained by this owner.
365
+ }
366
+ }
367
+ },
368
+ (error) => {
369
+ if (generation !== expectedGeneration) return;
370
+ try {
371
+ markSuspect(error);
372
+ } catch (stateError) {
373
+ try {
374
+ deps.recordEvent("telegram", stateError, {
375
+ phase: "leader-health-state",
376
+ });
377
+ } catch {
378
+ // State and diagnostic failure remain contained by this owner.
379
+ }
380
+ }
381
+ },
382
+ )
383
+ .finally(() => {
384
+ if (tickPromise === tracked) tickPromise = undefined;
385
+ });
386
+ tickPromise = tracked;
387
+ return tracked;
388
+ };
389
+
390
+ return {
391
+ start() {
392
+ stop();
393
+ interval = setInterval(() => {
394
+ void requestTick();
395
+ }, intervalMs);
396
+ interval.unref?.();
397
+ },
398
+ stop,
399
+ };
400
+ }
401
+
402
+ export interface TelegramStaleTopicApiErrorRecoveryDeps<TSyncState> {
403
+ topicTargetStore: Pick<
404
+ TelegramTopicTargetStore,
405
+ "load" | "markStaleByTarget" | "persist"
406
+ >;
407
+ getSyncState: () => TSyncState;
408
+ setSyncState: (state: TSyncState) => void;
409
+ recordEvent: (
410
+ category: string,
411
+ message: unknown,
412
+ details?: Record<string, unknown>,
413
+ ) => void;
414
+ getNowMs?: () => number;
415
+ }
416
+
417
+ export function createTelegramStaleTopicApiErrorRecoveryRuntime<
418
+ TSyncState extends TelegramSyncState,
419
+ >(
420
+ deps: TelegramStaleTopicApiErrorRecoveryDeps<TSyncState>,
421
+ ): (apiBody: unknown, error: unknown) => Promise<boolean> {
422
+ return (apiBody, error) =>
423
+ recoverStaleTelegramTopicApiError(apiBody, error, deps);
424
+ }
425
+
426
+ export async function recoverStaleTelegramTopicApiError<
427
+ TSyncState extends TelegramSyncState,
428
+ >(
429
+ apiBody: unknown,
430
+ error: unknown,
431
+ deps: TelegramStaleTopicApiErrorRecoveryDeps<TSyncState>,
432
+ ): Promise<boolean> {
433
+ const target = getTelegramTargetFromApiBody(apiBody);
434
+ if (!target || !isTelegramTopicTargetStaleError(error)) return false;
435
+ await deps.topicTargetStore.load();
436
+ if (
437
+ !deps.topicTargetStore.markStaleByTarget(target, "deleted", String(error))
438
+ ) {
439
+ return false;
440
+ }
441
+ const nowMs = (deps.getNowMs ?? Date.now)();
442
+ let state = markTelegramSyncSliceSuspect(deps.getSyncState(), "topic-state", {
443
+ nowMs,
444
+ reason: "stale-api-error",
445
+ action: "topic-target-stale",
446
+ }) as TSyncState;
447
+ state = markTelegramSyncSliceSuspect(state, "transport-health", {
448
+ nowMs,
449
+ reason: "stale-api-error",
450
+ action: "topic-target-stale",
451
+ }) as TSyncState;
452
+ deps.setSyncState(state);
453
+ await deps.topicTargetStore.persist();
454
+ deps.recordEvent("bus", error, {
455
+ phase: "topic-target-stale",
456
+ chatId: target.chatId,
457
+ threadId: target.threadId,
458
+ });
459
+ return true;
460
+ }
461
+
462
+ export async function ensureTelegramLeaderThreadBinding(
463
+ deps: TelegramLeaderThreadSyncDeps,
464
+ ): Promise<TelegramOwnTopicProvisionResult | undefined> {
465
+ const leaderEpoch = deps.getCurrentLeaderEpoch?.();
466
+ const assertLeaderEpoch = (phase: string): void => {
467
+ if (
468
+ deps.getCurrentLeaderEpoch &&
469
+ (leaderEpoch === undefined ||
470
+ deps.getCurrentLeaderEpoch() !== leaderEpoch)
471
+ ) {
472
+ throw new Error(
473
+ `Telegram leader thread binding lost ownership (${phase}).`,
474
+ );
475
+ }
476
+ };
477
+ assertLeaderEpoch("start");
478
+ await deps.topicTargetStore.load();
479
+ assertLeaderEpoch("after-load");
480
+ const unavailableTargetKeys = new Set([
481
+ ...deps.topicTargetStore
482
+ .listSyncObservations()
483
+ .filter((observation) => observation.syncStatus === "deleted")
484
+ .map((observation) => getTelegramTargetKey(observation.target)),
485
+ ...deps.topicTargetStore
486
+ .listPendingCleanups()
487
+ .map((intent) => getTelegramTargetKey(intent.target)),
488
+ ]);
489
+ let invalidatedUnavailableTarget = false;
490
+ for (const record of deps.topicTargetStore.list()) {
491
+ if (
492
+ record.instanceId !== deps.instanceId ||
493
+ !unavailableTargetKeys.has(getTelegramTargetKey(record.target))
494
+ ) {
495
+ continue;
496
+ }
497
+ invalidatedUnavailableTarget =
498
+ deps.topicTargetStore.markStaleByTarget(record.target) ||
499
+ invalidatedUnavailableTarget;
500
+ }
501
+ if (invalidatedUnavailableTarget) {
502
+ assertLeaderEpoch("before-unavailable-persist");
503
+ await deps.topicTargetStore.persist();
504
+ assertLeaderEpoch("after-unavailable-persist");
505
+ }
506
+ const priorTargets = deps.topicTargetStore.list().filter((record) => {
507
+ return (
508
+ record.instanceId === deps.instanceId &&
509
+ (record.status === "active" || record.status === "starting")
510
+ );
511
+ });
512
+ // Short-circuit: when the instance already has an active thread and we are not
513
+ // force-freshing, reuse it without re-provisioning. A thread belongs to the
514
+ // live instance binding, not to one transient Pi session lifecycle.
515
+ if (!deps.forceFreshUnnamed && priorTargets.length > 0) {
516
+ const record = priorTargets[0];
517
+ deps.recordEvent(
518
+ "telegram",
519
+ "Leader thread preserved after session lifecycle change",
520
+ {
521
+ phase: "leader-thread-reused",
522
+ instanceId: deps.instanceId,
523
+ chatId: record.target.chatId,
524
+ threadId: record.target.threadId,
525
+ slot: record.slot,
526
+ },
527
+ );
528
+ assertLeaderEpoch("before-reuse");
529
+ return {
530
+ target: record.target,
531
+ slot: record.slot ?? "A",
532
+ ...(record.threadName ? { threadName: record.threadName } : {}),
533
+ reused: true,
534
+ };
535
+ }
536
+ let forcedUnnamedStale = false;
537
+ if (deps.forceFreshUnnamed) {
538
+ for (const record of priorTargets) {
539
+ const isLeaderOwned =
540
+ record.owner?.kind === "leader" ||
541
+ (!record.owner &&
542
+ (record.profileKey.startsWith("cwd:") ||
543
+ record.profileKey.startsWith("leader:")));
544
+ if (!isLeaderOwned) continue;
545
+ if (record.threadName) continue;
546
+ forcedUnnamedStale =
547
+ deps.topicTargetStore.markStaleByTarget(record.target) ||
548
+ forcedUnnamedStale;
549
+ deps.recordEvent("telegram", "Unnamed leader thread binding refreshed", {
550
+ phase: "leader-thread-force-fresh-unnamed",
551
+ instanceId: deps.instanceId,
552
+ chatId: record.target.chatId,
553
+ threadId: record.target.threadId,
554
+ slot: record.slot,
555
+ });
556
+ }
557
+ if (forcedUnnamedStale) await deps.topicTargetStore.persist();
558
+ }
559
+ assertLeaderEpoch("before-provision");
560
+ const ownTarget = await provisionOwnBusTopic({
561
+ getAllowedUserId: deps.getAllowedUserId,
562
+ instanceId: deps.instanceId,
563
+ cwd: deps.cwd,
564
+ telegramProfile: deps.telegramProfile,
565
+ getCurrentLeaderEpoch: deps.getCurrentLeaderEpoch,
566
+ getThreadReconciliationMachineState:
567
+ deps.getThreadReconciliationMachineState,
568
+ recordThreadReconciliationPlan: deps.recordThreadReconciliationPlan,
569
+ store: deps.topicTargetStore,
570
+ callApi: deps.callApi,
571
+ getNowMs: deps.getNowMs,
572
+ getRandom: deps.getRandom,
573
+ recordEvent: deps.recordEvent,
574
+ });
575
+ assertLeaderEpoch("after-provision");
576
+ if (!ownTarget) return undefined;
577
+ const replacementPlan = ThreadReconciler.planThreadReconciliation({
578
+ nowMs: Date.now(),
579
+ currentLeaderEpoch: deps.getCurrentLeaderEpoch?.(),
580
+ previousState: deps.getThreadReconciliationMachineState?.(),
581
+ records: priorTargets,
582
+ pendingProvisions: deps.topicTargetStore.listPendingProvisions(),
583
+ replacedBindings: [
584
+ {
585
+ instanceId: deps.instanceId,
586
+ replacementTarget: ownTarget.target,
587
+ },
588
+ ],
589
+ });
590
+ deps.recordThreadReconciliationPlan?.(replacementPlan);
591
+ await ThreadReconciler.applyThreadReconciliationPlan(replacementPlan, {
592
+ callApi: deps.callApi,
593
+ markStaleByTarget: (target, syncStatus, lastSyncError) =>
594
+ deps.topicTargetStore.markStaleByTarget(
595
+ target,
596
+ syncStatus,
597
+ lastSyncError,
598
+ ),
599
+ persist: () => deps.topicTargetStore.persist(),
600
+ removePendingProvisionById: (id) =>
601
+ deps.topicTargetStore.removePendingProvision(id),
602
+ getCurrentLeaderEpoch: deps.getCurrentLeaderEpoch,
603
+ recordRuntimeEvent: deps.recordEvent,
604
+ });
605
+ assertLeaderEpoch("before-final-persist");
606
+ await deps.topicTargetStore.persist();
607
+ assertLeaderEpoch("after-final-persist");
608
+ return ownTarget;
609
+ }
610
+
611
+ export const TELEGRAM_SYNC_SLICE_TARGET_BINDINGS = "target-bindings";
612
+
613
+ export const TELEGRAM_SYNC_SLICES = [
614
+ "bot-identity",
615
+ "bot-capabilities",
616
+ "pairing",
617
+ "allowed-user",
618
+ "topic-capability",
619
+ "topic-state",
620
+ TELEGRAM_SYNC_SLICE_TARGET_BINDINGS,
621
+ "reservations",
622
+ "transport-health",
623
+ ] as const;
624
+
625
+ export type TelegramSyncSlice = (typeof TELEGRAM_SYNC_SLICES)[number];
626
+
627
+ export type TelegramSyncTrigger =
628
+ | "startup"
629
+ | "reload"
630
+ | "topic-lifecycle"
631
+ | "stale-api-error"
632
+ | "setup-change"
633
+ | "pairing-change"
634
+ | "follower-register"
635
+ | "follower-prune"
636
+ | "status-request"
637
+ | "leader-health-tick"
638
+ | "ordinary-message"
639
+ | "ordinary-send";
640
+
641
+ export interface TelegramSyncSliceState {
642
+ status: "fresh" | "suspect" | "unknown";
643
+ updatedAtMs?: number;
644
+ suspectAtMs?: number;
645
+ reason?: string;
646
+ lastReconcileAction?: string;
647
+ }
648
+
649
+ export type TelegramSyncState = Partial<
650
+ Record<TelegramSyncSlice, TelegramSyncSliceState>
651
+ >;
652
+
653
+ export function createUnknownTelegramSyncState(): TelegramSyncState {
654
+ return Object.fromEntries(
655
+ TELEGRAM_SYNC_SLICES.map((slice) => [slice, { status: "unknown" }]),
656
+ ) as TelegramSyncState;
657
+ }
658
+
659
+ export interface TelegramSyncStateRuntime {
660
+ getState(): TelegramSyncState;
661
+ setState(state: TelegramSyncState): void;
662
+ markConfigChange(action: string): void;
663
+ markSliceFresh(
664
+ slice: TelegramSyncSlice,
665
+ options: { nowMs: number; action: string },
666
+ ): void;
667
+ }
668
+
669
+ export function createTelegramConfigSyncPersister<TConfig>(deps: {
670
+ persist: (config?: TConfig) => Promise<void>;
671
+ markConfigChange: (action: string) => void;
672
+ }): (config?: TConfig) => Promise<void> {
673
+ return async (config) => {
674
+ await deps.persist(config);
675
+ deps.markConfigChange("config-persist");
676
+ };
677
+ }
678
+
679
+ export function createTelegramSyncStateRuntime(
680
+ initialState = createUnknownTelegramSyncState(),
681
+ ): TelegramSyncStateRuntime {
682
+ let state = initialState;
683
+ return {
684
+ getState: () => state,
685
+ setState(nextState) {
686
+ state = nextState;
687
+ },
688
+ markConfigChange(action) {
689
+ state = markTelegramConfigSyncChange(state, action);
690
+ },
691
+ markSliceFresh(slice, options) {
692
+ state = markTelegramSyncSliceFresh(state, slice, options);
693
+ },
694
+ };
695
+ }
696
+
697
+ export interface TelegramProvisioningActivityRuntime {
698
+ isActive(): boolean;
699
+ start(): void;
700
+ end(): void;
701
+ }
702
+
703
+ export function createTelegramProvisioningActivityRuntime(): TelegramProvisioningActivityRuntime {
704
+ let activeCount = 0;
705
+ return {
706
+ isActive: () => activeCount > 0,
707
+ start() {
708
+ activeCount += 1;
709
+ },
710
+ end() {
711
+ activeCount = Math.max(0, activeCount - 1);
712
+ },
713
+ };
714
+ }
715
+
716
+ const RECONCILE_TRIGGERS = new Set<TelegramSyncTrigger>([
717
+ "startup",
718
+ "reload",
719
+ "topic-lifecycle",
720
+ "stale-api-error",
721
+ "setup-change",
722
+ "pairing-change",
723
+ "follower-register",
724
+ "follower-prune",
725
+ "status-request",
726
+ "leader-health-tick",
727
+ ]);
728
+
729
+ export function shouldReconcileTelegramSync(
730
+ trigger: TelegramSyncTrigger,
731
+ ): boolean {
732
+ return RECONCILE_TRIGGERS.has(trigger);
733
+ }
734
+
735
+ export function markTelegramSyncSliceSuspect(
736
+ state: TelegramSyncState,
737
+ slice: TelegramSyncSlice,
738
+ input: {
739
+ reason: string;
740
+ nowMs: number;
741
+ action?: string;
742
+ },
743
+ ): TelegramSyncState {
744
+ return {
745
+ ...state,
746
+ [slice]: {
747
+ ...(state[slice] ?? { status: "unknown" }),
748
+ status: "suspect",
749
+ suspectAtMs: input.nowMs,
750
+ reason: input.reason,
751
+ lastReconcileAction: input.action,
752
+ },
753
+ };
754
+ }
755
+
756
+ export function markTelegramSyncSliceFresh(
757
+ state: TelegramSyncState,
758
+ slice: TelegramSyncSlice,
759
+ input: {
760
+ nowMs: number;
761
+ action: string;
762
+ },
763
+ ): TelegramSyncState {
764
+ return {
765
+ ...state,
766
+ [slice]: {
767
+ status: "fresh",
768
+ updatedAtMs: input.nowMs,
769
+ lastReconcileAction: input.action,
770
+ },
771
+ };
772
+ }
773
+
774
+ export function createTelegramObservedTopicLifecycleSyncHandler<
775
+ TMessage = unknown,
776
+ TSyncState extends TelegramSyncState = TelegramSyncState,
777
+ >(
778
+ deps: TelegramObservedTopicLifecycleSyncDeps<TSyncState>,
779
+ ): TelegramTopicLifecycleSyncHandler<TMessage> {
780
+ const syncTopicLifecycle =
781
+ createTelegramTopicLifecycleSyncHandler<TMessage>(deps);
782
+ return async (lifecycle) => {
783
+ const nowMs = deps.getNowMs ?? Date.now;
784
+ deps.assertExecutionCurrent?.(lifecycle.message);
785
+ deps.setSyncState(
786
+ markTelegramSyncSliceSuspect(deps.getSyncState(), "topic-state", {
787
+ nowMs: nowMs(),
788
+ reason: `topic-${lifecycle.kind}`,
789
+ action: "topic-lifecycle",
790
+ }) as TSyncState,
791
+ );
792
+ await syncTopicLifecycle(lifecycle);
793
+ deps.assertExecutionCurrent?.(lifecycle.message);
794
+ deps.setSyncState(
795
+ markTelegramSyncSliceFresh(deps.getSyncState(), "topic-state", {
796
+ nowMs: nowMs(),
797
+ action: "topic-lifecycle",
798
+ }) as TSyncState,
799
+ );
800
+ };
801
+ }
802
+
803
+ export function createTelegramTopicLifecycleSyncHandler<TMessage = unknown>(
804
+ deps: TelegramTopicLifecycleSyncDeps,
805
+ ): TelegramTopicLifecycleSyncHandler<TMessage> {
806
+ return async (lifecycle) => {
807
+ deps.assertExecutionCurrent?.(lifecycle.message);
808
+ await deps.topicTargetStore.load();
809
+ deps.assertExecutionCurrent?.(lifecycle.message);
810
+ const nowMs = Date.now();
811
+ const plan = ThreadReconciler.planThreadReconciliation({
812
+ nowMs,
813
+ currentLeaderEpoch: deps.getCurrentLeaderEpoch?.(),
814
+ previousState: deps.getThreadReconciliationMachineState?.(),
815
+ records: deps.topicTargetStore.list(),
816
+ reservations: deps.topicTargetStore.listReservations(),
817
+ pendingProvisions: deps.topicTargetStore.listPendingProvisions(),
818
+ observations: [
819
+ {
820
+ target: lifecycle.target,
821
+ syncStatus: lifecycle.kind === "closed" ? "closed" : "open",
822
+ observedAtMs: nowMs,
823
+ },
824
+ ],
825
+ });
826
+ deps.recordThreadReconciliationPlan?.(plan);
827
+ const result = await ThreadReconciler.applyThreadReconciliationPlan(plan, {
828
+ markActiveByTarget: (target) =>
829
+ deps.topicTargetStore.markActiveByTarget(target),
830
+ markStaleByTarget: (target, syncStatus, lastSyncError) =>
831
+ deps.topicTargetStore.markStaleByTarget(
832
+ target,
833
+ syncStatus,
834
+ lastSyncError,
835
+ ),
836
+ persist: () => deps.topicTargetStore.persist(),
837
+ removePendingProvisionById: (id) =>
838
+ deps.topicTargetStore.removePendingProvision(id),
839
+ getCurrentLeaderEpoch: deps.getCurrentLeaderEpoch,
840
+ recordRuntimeEvent: deps.recordEvent,
841
+ });
842
+ const changed = result.changed;
843
+ if (lifecycle.kind === "created" && deps.isBusEnabled()) {
844
+ const target = lifecycle.target;
845
+ const isKnownInRecords = deps.topicTargetStore.list().some((record) => {
846
+ return (
847
+ record.target.chatId === target.chatId &&
848
+ record.target.threadId === target.threadId
849
+ );
850
+ });
851
+ const isKnownInReservations = deps.topicTargetStore
852
+ .listReservations()
853
+ .some((reservation) => {
854
+ return (
855
+ reservation.target.chatId === target.chatId &&
856
+ reservation.target.threadId === target.threadId
857
+ );
858
+ });
859
+ if (!isKnownInRecords && !isKnownInReservations) {
860
+ deps.recordEvent?.(
861
+ "telegram",
862
+ deps.isTopicProvisioningActive?.()
863
+ ? "Telegram unknown topic creation observed during provisioning"
864
+ : "Telegram unknown topic creation observed",
865
+ {
866
+ phase: deps.isTopicProvisioningActive?.()
867
+ ? "topic-lifecycle-provisioning-skip"
868
+ : "topic-lifecycle-unknown-created-observed",
869
+ chatId: target.chatId,
870
+ threadId: target.threadId,
871
+ },
872
+ );
873
+ }
874
+ }
875
+ deps.recordEvent?.("telegram", "Telegram topic lifecycle update", {
876
+ phase: "topic-lifecycle",
877
+ lifecycle: lifecycle.kind,
878
+ chatId: lifecycle.target.chatId,
879
+ threadId: lifecycle.target.threadId,
880
+ changed,
881
+ });
882
+ };
883
+ }