@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,876 @@
1
+ /**
2
+ * Telegram settings menu UI helpers
3
+ * Zones: telegram ui, settings controls, menu composition
4
+ * Owns hidden settings-menu rendering, settings callbacks, and persisted toggle wiring
5
+ */
6
+
7
+ import type {
8
+ TelegramActivityVerbosity,
9
+ TelegramAssistantRenderingMode,
10
+ TelegramTimeMode,
11
+ } from "./config.ts";
12
+ import type { TelegramInlineKeyboardMarkup } from "./keyboard.ts";
13
+ import type { TelegramModelMenuState } from "./menu-model.ts";
14
+ import type { MenuModel } from "./model.ts";
15
+ import {
16
+ getTelegramExtensionSettingsRows,
17
+ type TelegramSectionRegistry,
18
+ } from "./sections.ts";
19
+ import type { TelegramVoiceReplyMode } from "./voice.ts";
20
+
21
+ export type TelegramSettingsMenuReplyMarkup = TelegramInlineKeyboardMarkup;
22
+
23
+ export interface TelegramSettingsStateDeps {
24
+ isProactivePushEnabled: () => boolean;
25
+ areDraftPreviewsEnabled: () => boolean;
26
+ getAssistantRenderingMode: () => TelegramAssistantRenderingMode;
27
+ getActivityVerbosity: () => TelegramActivityVerbosity;
28
+ getTimeInjectionMode: () => TelegramTimeMode;
29
+ getVoiceReplyMode: () => TelegramVoiceReplyMode;
30
+ isVoiceReplyModeConfigured: () => boolean;
31
+ isAutomaticThreadCleanupEnabled: () => boolean;
32
+ }
33
+
34
+ export interface TelegramSettingsMutationDeps extends TelegramSettingsStateDeps {
35
+ setProactivePushEnabled: (enabled: boolean) => Promise<void>;
36
+ setDraftPreviewsEnabled: (enabled: boolean) => Promise<void>;
37
+ setAssistantRenderingMode: (
38
+ mode: TelegramAssistantRenderingMode,
39
+ ) => Promise<void>;
40
+ setActivityVerbosity: (
41
+ verbosity: TelegramActivityVerbosity,
42
+ ) => Promise<void>;
43
+ setVoiceReplyMode: (
44
+ mode: TelegramVoiceReplyMode | undefined,
45
+ ) => Promise<void>;
46
+ setTimeInjectionMode: (mode: TelegramTimeMode) => Promise<void>;
47
+ setAutomaticThreadCleanupEnabled: (enabled: boolean) => Promise<void>;
48
+ }
49
+
50
+ export interface TelegramSettingsMenuOpenDeps<
51
+ TModel extends MenuModel = MenuModel,
52
+ > extends TelegramSettingsStateDeps {
53
+ getModelMenuState: () => Promise<TelegramModelMenuState<TModel>>;
54
+ sendSettingsMenu: (
55
+ state: TelegramModelMenuState<TModel>,
56
+ text: string,
57
+ replyMarkup: TelegramSettingsMenuReplyMarkup,
58
+ ) => Promise<number | undefined>;
59
+ storeModelMenuState: (state: TelegramModelMenuState<TModel>) => void;
60
+ }
61
+
62
+ export interface TelegramSettingsMenuCallbackDeps extends TelegramSettingsMutationDeps {
63
+ updateSettingsMessage: (
64
+ text: string,
65
+ replyMarkup: TelegramSettingsMenuReplyMarkup,
66
+ ) => Promise<void>;
67
+ answerCallbackQuery: (
68
+ callbackQueryId: string,
69
+ text?: string,
70
+ ) => Promise<void>;
71
+ sectionRegistry?: TelegramSectionRegistry;
72
+ }
73
+
74
+ export interface TelegramSettingsMenuRuntime<TContext> {
75
+ openSettingsMenu: (
76
+ chatId: number,
77
+ replyToMessageId: number,
78
+ ctx: TContext,
79
+ ) => Promise<void>;
80
+ handleCallbackQuery: (
81
+ query: {
82
+ id: string;
83
+ data?: string;
84
+ message?: {
85
+ message_id?: number;
86
+ message_thread_id?: number;
87
+ chat?: { id?: number };
88
+ };
89
+ },
90
+ ctx: TContext,
91
+ ) => Promise<boolean>;
92
+ updateSettingsMenuMessage: (
93
+ state: TelegramModelMenuState,
94
+ ctx: TContext,
95
+ ) => Promise<void>;
96
+ }
97
+
98
+ export interface TelegramSettingsMenuMessageUpdateDeps extends TelegramSettingsStateDeps {
99
+ updateSettingsMessage: (
100
+ text: string,
101
+ replyMarkup: TelegramSettingsMenuReplyMarkup,
102
+ ) => Promise<void>;
103
+ }
104
+
105
+ export interface TelegramSettingsMenuRuntimeDeps<
106
+ TContext,
107
+ TModel extends MenuModel = MenuModel,
108
+ > extends TelegramSettingsMutationDeps {
109
+ reloadConfig?: () => Promise<void>;
110
+ getModelMenuState: (
111
+ chatId: number,
112
+ ctx: TContext,
113
+ threadId?: number,
114
+ ) => Promise<TelegramModelMenuState<TModel>>;
115
+ getStoredModelMenuState: (
116
+ messageId: number | undefined,
117
+ chatId?: number,
118
+ ) => TelegramModelMenuState<TModel> | undefined;
119
+ storeModelMenuState: (state: TelegramModelMenuState<TModel>) => void;
120
+ editInteractiveMessage: (
121
+ chatId: number,
122
+ messageId: number,
123
+ text: string,
124
+ mode: "markdown" | "html" | "plain",
125
+ replyMarkup: TelegramSettingsMenuReplyMarkup,
126
+ ) => Promise<void>;
127
+ sendInteractiveMessage: (
128
+ chatId: number,
129
+ text: string,
130
+ mode: "markdown" | "html" | "plain",
131
+ replyMarkup: TelegramSettingsMenuReplyMarkup,
132
+ ) => Promise<number | undefined>;
133
+ answerCallbackQuery: (
134
+ callbackQueryId: string,
135
+ text?: string,
136
+ ) => Promise<void>;
137
+ }
138
+
139
+ export const SETTINGS_MENU_TITLE = "<b>⚙️ Settings:</b>";
140
+ export const AUTOMATIC_THREAD_CLEANUP_SETTINGS_TITLE =
141
+ "<b>🧹 Thread cleanup:</b>";
142
+ export const PROACTIVE_PUSH_SETTINGS_TITLE = "<b>📌 Proactive push:</b>";
143
+ export const DRAFT_PREVIEWS_SETTINGS_TITLE = "<b>📝 Draft previews:</b>";
144
+ export const ASSISTANT_RENDERING_SETTINGS_TITLE =
145
+ "<b>🧾 Assistant rendering:</b>";
146
+ export const ACTIVITY_VERBOSITY_SETTINGS_TITLE =
147
+ "<b>🔬 Activity:</b>";
148
+ export const TIME_INJECTION_MODE_SETTINGS_TITLE =
149
+ "<b>🕒 Time injection mode:</b>";
150
+ export const VOICE_REPLY_MODE_SETTINGS_TITLE = "<b>👄 Voice reply mode:</b>";
151
+
152
+ type TelegramVoiceReplyModeSetting = TelegramVoiceReplyMode | "hidden";
153
+
154
+ function getVoiceReplyModeLabel(mode: TelegramVoiceReplyModeSetting): string {
155
+ return mode;
156
+ }
157
+
158
+ function getTelegramSettingsStateValueLabel(value: string): string {
159
+ return value.toLowerCase();
160
+ }
161
+
162
+ function getVoiceReplyModeSetting(
163
+ mode: TelegramVoiceReplyMode,
164
+ configured: boolean,
165
+ ): TelegramVoiceReplyModeSetting {
166
+ return configured ? mode : "hidden";
167
+ }
168
+
169
+ export function buildTelegramSettingsMenuText(): string {
170
+ return SETTINGS_MENU_TITLE;
171
+ }
172
+
173
+ export function buildAutomaticThreadCleanupSettingsText(
174
+ enabled: boolean,
175
+ ): string {
176
+ return [
177
+ `${AUTOMATIC_THREAD_CLEANUP_SETTINGS_TITLE} <code>${enabled ? "on" : "off"}</code>`,
178
+ "",
179
+ "Delete this Pi instance's Telegram tab when Pi quits normally.",
180
+ "",
181
+ "<code>-</code> <code>on</code> (default): delete the bound thread and release Telegram authority on graceful quit.",
182
+ "<code>-</code> <code>off</code>: preserve the tab as a restart hint; manual <code>/telegram-disconnect</code> still confirms and deletes it.",
183
+ ].join("\n");
184
+ }
185
+
186
+ export function buildProactivePushSettingsText(
187
+ proactivePushEnabled: boolean,
188
+ ): string {
189
+ return [
190
+ `${PROACTIVE_PUSH_SETTINGS_TITLE} <code>${proactivePushEnabled ? "on" : "off"}</code>`,
191
+ "",
192
+ "Control whether public assistant output from local/autonomous work is projected to Telegram.",
193
+ "",
194
+ "<code>-</code> <code>on</code> (default): send each completed public block, including visible checkpoints and the final answer, while connected.",
195
+ "<code>-</code> <code>off</code>: keep local/autonomous assistant blocks in Pi; Telegram-originated replies still use their normal delivery path.",
196
+ ].join("\n");
197
+ }
198
+
199
+ export function buildDraftPreviewsSettingsText(enabled: boolean): string {
200
+ return [
201
+ `${DRAFT_PREVIEWS_SETTINGS_TITLE} <code>${enabled ? "on" : "off"}</code>`,
202
+ "",
203
+ "Show live answer drafts while the model is answering.",
204
+ "",
205
+ "<code>-</code> <code>on</code>: stream safe Telegram Rich Draft frames before the final answer.",
206
+ "<code>-</code> <code>off</code> (default): show native active status, then send one final answer.",
207
+ ].join("\n");
208
+ }
209
+
210
+ export function buildAssistantRenderingSettingsText(
211
+ mode: TelegramAssistantRenderingMode,
212
+ ): string {
213
+ return [
214
+ `${ASSISTANT_RENDERING_SETTINGS_TITLE} <code>${mode}</code>`,
215
+ "",
216
+ "Choose how final assistant Markdown answers are delivered.",
217
+ "",
218
+ "<code>-</code> <code>rich</code> (default): use Telegram Native Rich Markdown.",
219
+ "<code>-</code> <code>html</code>: use the legacy Markdown-to-HTML renderer.",
220
+ ].join("\n");
221
+ }
222
+
223
+ export function buildActivityVerbositySettingsText(
224
+ verbosity: TelegramActivityVerbosity,
225
+ ): string {
226
+ return [
227
+ `${ACTIVITY_VERBOSITY_SETTINGS_TITLE} <code>${verbosity}</code>`,
228
+ "",
229
+ "Choose how much technical model activity Telegram shows.",
230
+ "",
231
+ "<code>-</code> <code>quiet</code>: show no thinking or tool traffic.",
232
+ "<code>-</code> <code>thinking</code>: show persistent collapsed thinking.",
233
+ "<code>-</code> <code>tools</code>: show persistent Rich tool details.",
234
+ "<code>-</code> <code>verbose</code> (default): show both thinking and tools.",
235
+ ].join("\n");
236
+ }
237
+
238
+ export function buildVoiceReplyModeSettingsText(
239
+ mode: TelegramVoiceReplyMode,
240
+ configured = true,
241
+ ): string {
242
+ return [
243
+ `${VOICE_REPLY_MODE_SETTINGS_TITLE} <code>${getVoiceReplyModeLabel(
244
+ getVoiceReplyModeSetting(mode, configured),
245
+ )}</code>`,
246
+ "",
247
+ "Controls when pi-telegram converts assistant text replies into Telegram voice messages.",
248
+ "",
249
+ "<code>-</code> <code>hidden</code> (default): add no automatic voice context; explicit 'telegram_voice' actions still work.",
250
+ "<code>-</code> <code>mirror</code>: voice input activates automatic voice delivery; text input follows 'hidden' behavior.",
251
+ "<code>-</code> <code>always</code>: activate automatic voice delivery for every reply.",
252
+ ].join("\n");
253
+ }
254
+
255
+ export function buildTimeInjectionModeSettingsText(
256
+ mode: TelegramTimeMode,
257
+ ): string {
258
+ return [
259
+ `${TIME_INJECTION_MODE_SETTINGS_TITLE} <code>${mode}</code>`,
260
+ "",
261
+ "Controls whether Telegram-originated prompts include a compact wall-clock [time] line.",
262
+ "",
263
+ "<code>-</code> <code>hidden</code>: no time line is added to prompt context.",
264
+ "<code>-</code> <code>always</code>: add time to every Telegram turn.",
265
+ "<code>-</code> <code>interval</code> (default): add time at most once per chat interval (1 hour unless configured).",
266
+ ].join("\n");
267
+ }
268
+
269
+ export function buildTelegramSettingsMenuReplyMarkup(
270
+ proactivePushEnabled: boolean,
271
+ draftPreviewsEnabled: boolean,
272
+ assistantRenderingModeOrVoiceReplyMode:
273
+ TelegramAssistantRenderingMode | TelegramVoiceReplyMode,
274
+ voiceReplyModeOrTimeInjectionMode: TelegramVoiceReplyMode | TelegramTimeMode,
275
+ timeInjectionModeOrSectionRegistry?:
276
+ TelegramTimeMode | TelegramSectionRegistry,
277
+ sectionRegistryOrVoiceReplyModeConfigured?: TelegramSectionRegistry | boolean,
278
+ voiceReplyModeConfigured = true,
279
+ automaticThreadCleanupEnabled = true,
280
+ activityVerbosity: TelegramActivityVerbosity = "quiet",
281
+ ): TelegramSettingsMenuReplyMarkup {
282
+ const hasRenderingMode =
283
+ assistantRenderingModeOrVoiceReplyMode === "rich" ||
284
+ assistantRenderingModeOrVoiceReplyMode === "html";
285
+ const assistantRenderingMode: TelegramAssistantRenderingMode =
286
+ hasRenderingMode ? assistantRenderingModeOrVoiceReplyMode : "rich";
287
+ const voiceReplyMode = hasRenderingMode
288
+ ? (voiceReplyModeOrTimeInjectionMode as TelegramVoiceReplyMode)
289
+ : (assistantRenderingModeOrVoiceReplyMode as TelegramVoiceReplyMode);
290
+ const timeInjectionMode = hasRenderingMode
291
+ ? (timeInjectionModeOrSectionRegistry as TelegramTimeMode)
292
+ : (voiceReplyModeOrTimeInjectionMode as TelegramTimeMode);
293
+ const sectionRegistry = hasRenderingMode
294
+ ? (sectionRegistryOrVoiceReplyModeConfigured as
295
+ TelegramSectionRegistry | undefined)
296
+ : (timeInjectionModeOrSectionRegistry as
297
+ TelegramSectionRegistry | undefined);
298
+ const effectiveVoiceReplyModeConfigured = hasRenderingMode
299
+ ? voiceReplyModeConfigured
300
+ : typeof sectionRegistryOrVoiceReplyModeConfigured === "boolean"
301
+ ? sectionRegistryOrVoiceReplyModeConfigured
302
+ : true;
303
+ const rows: Array<Array<{ text: string; callback_data: string }>> = [
304
+ [{ text: "⬆️ Main menu", callback_data: "menu:back" }],
305
+ ];
306
+ const settingsButtons: Array<{ text: string; callback_data: string }> = [
307
+ {
308
+ text: `📝 Draft previews: ${draftPreviewsEnabled ? "on" : "off"}`,
309
+ callback_data: "settings:open:draft-previews",
310
+ },
311
+ {
312
+ text: `🧾 Rendering: ${assistantRenderingMode}`,
313
+ callback_data: "settings:open:assistant-rendering",
314
+ },
315
+ {
316
+ text: `👄 Voice reply: ${getTelegramSettingsStateValueLabel(
317
+ getVoiceReplyModeLabel(
318
+ getVoiceReplyModeSetting(
319
+ voiceReplyMode,
320
+ effectiveVoiceReplyModeConfigured,
321
+ ),
322
+ ),
323
+ )}`,
324
+ callback_data: "settings:open:voice-reply",
325
+ },
326
+ {
327
+ text: `🔬 Activity: ${activityVerbosity}`,
328
+ callback_data: "settings:open:activity-verbosity",
329
+ },
330
+ {
331
+ text: `📌 Proactive push: ${proactivePushEnabled ? "on" : "off"}`,
332
+ callback_data: "settings:open:proactive",
333
+ },
334
+ {
335
+ text: `🕒 Time injection: ${getTelegramSettingsStateValueLabel(timeInjectionMode)}`,
336
+ callback_data: "settings:open:time-injection",
337
+ },
338
+ {
339
+ text: `🧹 Thread cleanup: ${automaticThreadCleanupEnabled ? "on" : "off"}`,
340
+ callback_data: "settings:open:automatic-thread-cleanup",
341
+ },
342
+ ];
343
+ if (sectionRegistry) {
344
+ const extensionRows = getTelegramExtensionSettingsRows(sectionRegistry);
345
+ settingsButtons.push(
346
+ ...extensionRows.map((row) => ({
347
+ text: row.label,
348
+ callback_data: row.callback_data,
349
+ })),
350
+ );
351
+ }
352
+ rows.push(...settingsButtons.map((button) => [button]));
353
+ return { inline_keyboard: rows };
354
+ }
355
+
356
+ export async function openTelegramSettingsMenu<
357
+ TModel extends MenuModel = MenuModel,
358
+ >(
359
+ deps: TelegramSettingsMenuOpenDeps<TModel>,
360
+ sectionRegistry?: TelegramSectionRegistry,
361
+ ): Promise<void> {
362
+ const state = await deps.getModelMenuState();
363
+ const messageId = await deps.sendSettingsMenu(
364
+ state,
365
+ buildTelegramSettingsMenuText(),
366
+ buildTelegramSettingsMenuReplyMarkup(
367
+ deps.isProactivePushEnabled(),
368
+ deps.areDraftPreviewsEnabled(),
369
+ deps.getAssistantRenderingMode(),
370
+ deps.getVoiceReplyMode(),
371
+ deps.getTimeInjectionMode(),
372
+ sectionRegistry,
373
+ deps.isVoiceReplyModeConfigured(),
374
+ deps.isAutomaticThreadCleanupEnabled(),
375
+ deps.getActivityVerbosity(),
376
+ ),
377
+ );
378
+ if (messageId === undefined) return;
379
+ state.messageId = messageId;
380
+ state.mode = "settings";
381
+ deps.storeModelMenuState(state);
382
+ }
383
+
384
+ export function buildAutomaticThreadCleanupSettingsReplyMarkup(
385
+ enabled: boolean,
386
+ ): TelegramSettingsMenuReplyMarkup {
387
+ return {
388
+ inline_keyboard: [
389
+ [{ text: "⬆️ Back", callback_data: "settings:list" }],
390
+ [
391
+ {
392
+ text: enabled ? "🟢 On" : "⚫️ On",
393
+ callback_data: "settings:set:automatic-thread-cleanup:on",
394
+ },
395
+ {
396
+ text: enabled ? "⚫️ Off" : "🟡 Off",
397
+ callback_data: "settings:set:automatic-thread-cleanup:off",
398
+ },
399
+ ],
400
+ ],
401
+ };
402
+ }
403
+
404
+ export function buildProactivePushSettingsReplyMarkup(
405
+ proactivePushEnabled: boolean,
406
+ ): TelegramSettingsMenuReplyMarkup {
407
+ return {
408
+ inline_keyboard: [
409
+ [{ text: "⬆️ Back", callback_data: "settings:list" }],
410
+ [
411
+ {
412
+ text: proactivePushEnabled ? "🟢 On" : "⚫️ On",
413
+ callback_data: "settings:set:proactive:on",
414
+ },
415
+ {
416
+ text: proactivePushEnabled ? "⚫️ Off" : "🟡 Off",
417
+ callback_data: "settings:set:proactive:off",
418
+ },
419
+ ],
420
+ ],
421
+ };
422
+ }
423
+
424
+ export function buildDraftPreviewsSettingsReplyMarkup(
425
+ enabled: boolean,
426
+ ): TelegramSettingsMenuReplyMarkup {
427
+ return {
428
+ inline_keyboard: [
429
+ [{ text: "⬆️ Back", callback_data: "settings:list" }],
430
+ [
431
+ {
432
+ text: enabled ? "🟢 On" : "⚫️ On",
433
+ callback_data: "settings:set:draft-previews:on",
434
+ },
435
+ {
436
+ text: enabled ? "⚫️ Off" : "🟡 Off",
437
+ callback_data: "settings:set:draft-previews:off",
438
+ },
439
+ ],
440
+ ],
441
+ };
442
+ }
443
+
444
+ export function buildAssistantRenderingSettingsReplyMarkup(
445
+ mode: TelegramAssistantRenderingMode,
446
+ ): TelegramSettingsMenuReplyMarkup {
447
+ const modes: TelegramAssistantRenderingMode[] = ["rich", "html"];
448
+ return {
449
+ inline_keyboard: [
450
+ [{ text: "⬆️ Back", callback_data: "settings:list" }],
451
+ ...modes.map((value) => [
452
+ {
453
+ text: `${value === mode ? "🟢 " : ""}${value}`,
454
+ callback_data: `settings:set:assistant-rendering:${value}`,
455
+ },
456
+ ]),
457
+ ],
458
+ };
459
+ }
460
+
461
+ export function buildActivityVerbositySettingsReplyMarkup(
462
+ verbosity: TelegramActivityVerbosity,
463
+ ): TelegramSettingsMenuReplyMarkup {
464
+ const values: TelegramActivityVerbosity[] = [
465
+ "quiet",
466
+ "thinking",
467
+ "tools",
468
+ "verbose",
469
+ ];
470
+ return {
471
+ inline_keyboard: [
472
+ [{ text: "⬆️ Back", callback_data: "settings:list" }],
473
+ ...values.map((value) => [
474
+ {
475
+ text: `${value === verbosity ? "🟢 " : ""}${value}`,
476
+ callback_data: `settings:set:activity-verbosity:${value}`,
477
+ },
478
+ ]),
479
+ ],
480
+ };
481
+ }
482
+
483
+ export function buildTimeInjectionModeSettingsReplyMarkup(
484
+ mode: TelegramTimeMode,
485
+ ): TelegramSettingsMenuReplyMarkup {
486
+ const modes: TelegramTimeMode[] = ["hidden", "always", "interval"];
487
+ return {
488
+ inline_keyboard: [
489
+ [{ text: "⬆️ Back", callback_data: "settings:list" }],
490
+ ...modes.map((value) => [
491
+ {
492
+ text: `${value === mode ? "🟢 " : ""}${value}`,
493
+ callback_data: `settings:set:time-injection:${value}`,
494
+ },
495
+ ]),
496
+ ],
497
+ };
498
+ }
499
+
500
+ export function buildVoiceReplyModeSettingsReplyMarkup(
501
+ mode: TelegramVoiceReplyMode,
502
+ configured = true,
503
+ ): TelegramSettingsMenuReplyMarkup {
504
+ const activeMode = getVoiceReplyModeSetting(mode, configured);
505
+ const modes: TelegramVoiceReplyModeSetting[] = ["hidden", "mirror", "always"];
506
+ return {
507
+ inline_keyboard: [
508
+ [{ text: "⬆️ Back", callback_data: "settings:list" }],
509
+ ...modes.map((value) => [
510
+ {
511
+ text: `${value === activeMode ? "🟢 " : ""}${getVoiceReplyModeLabel(value)}`,
512
+ callback_data: `settings:set:voice-reply:${value}`,
513
+ },
514
+ ]),
515
+ ],
516
+ };
517
+ }
518
+
519
+ export async function updateTelegramSettingsMenuMessage(
520
+ deps: TelegramSettingsMenuMessageUpdateDeps,
521
+ sectionRegistry?: TelegramSectionRegistry,
522
+ ): Promise<void> {
523
+ await deps.updateSettingsMessage(
524
+ buildTelegramSettingsMenuText(),
525
+ buildTelegramSettingsMenuReplyMarkup(
526
+ deps.isProactivePushEnabled(),
527
+ deps.areDraftPreviewsEnabled(),
528
+ deps.getAssistantRenderingMode(),
529
+ deps.getVoiceReplyMode(),
530
+ deps.getTimeInjectionMode(),
531
+ sectionRegistry,
532
+ deps.isVoiceReplyModeConfigured(),
533
+ deps.isAutomaticThreadCleanupEnabled(),
534
+ deps.getActivityVerbosity(),
535
+ ),
536
+ );
537
+ }
538
+
539
+ export async function updateAutomaticThreadCleanupSettingsMessage(
540
+ deps: TelegramSettingsMenuCallbackDeps,
541
+ ): Promise<void> {
542
+ const enabled = deps.isAutomaticThreadCleanupEnabled();
543
+ await deps.updateSettingsMessage(
544
+ buildAutomaticThreadCleanupSettingsText(enabled),
545
+ buildAutomaticThreadCleanupSettingsReplyMarkup(enabled),
546
+ );
547
+ }
548
+
549
+ export async function updateProactivePushSettingsMessage(
550
+ deps: TelegramSettingsMenuCallbackDeps,
551
+ ): Promise<void> {
552
+ const proactivePushEnabled = deps.isProactivePushEnabled();
553
+ await deps.updateSettingsMessage(
554
+ buildProactivePushSettingsText(proactivePushEnabled),
555
+ buildProactivePushSettingsReplyMarkup(proactivePushEnabled),
556
+ );
557
+ }
558
+
559
+ export async function updateDraftPreviewsSettingsMessage(
560
+ deps: TelegramSettingsMenuCallbackDeps,
561
+ ): Promise<void> {
562
+ const enabled = deps.areDraftPreviewsEnabled();
563
+ await deps.updateSettingsMessage(
564
+ buildDraftPreviewsSettingsText(enabled),
565
+ buildDraftPreviewsSettingsReplyMarkup(enabled),
566
+ );
567
+ }
568
+
569
+ export async function updateAssistantRenderingSettingsMessage(
570
+ deps: TelegramSettingsMenuCallbackDeps,
571
+ ): Promise<void> {
572
+ const mode = deps.getAssistantRenderingMode();
573
+ await deps.updateSettingsMessage(
574
+ buildAssistantRenderingSettingsText(mode),
575
+ buildAssistantRenderingSettingsReplyMarkup(mode),
576
+ );
577
+ }
578
+
579
+ export async function updateActivityVerbositySettingsMessage(
580
+ deps: TelegramSettingsMenuCallbackDeps,
581
+ ): Promise<void> {
582
+ const verbosity = deps.getActivityVerbosity();
583
+ await deps.updateSettingsMessage(
584
+ buildActivityVerbositySettingsText(verbosity),
585
+ buildActivityVerbositySettingsReplyMarkup(verbosity),
586
+ );
587
+ }
588
+
589
+ export async function updateTimeInjectionModeSettingsMessage(
590
+ deps: TelegramSettingsMenuCallbackDeps,
591
+ ): Promise<void> {
592
+ const mode = deps.getTimeInjectionMode();
593
+ await deps.updateSettingsMessage(
594
+ buildTimeInjectionModeSettingsText(mode),
595
+ buildTimeInjectionModeSettingsReplyMarkup(mode),
596
+ );
597
+ }
598
+
599
+ export async function updateVoiceReplyModeSettingsMessage(
600
+ deps: TelegramSettingsMenuCallbackDeps,
601
+ ): Promise<void> {
602
+ const mode = deps.getVoiceReplyMode();
603
+ const configured = deps.isVoiceReplyModeConfigured();
604
+ await deps.updateSettingsMessage(
605
+ buildVoiceReplyModeSettingsText(mode, configured),
606
+ buildVoiceReplyModeSettingsReplyMarkup(mode, configured),
607
+ );
608
+ }
609
+
610
+ export async function handleTelegramSettingsMenuCallbackAction(
611
+ callbackQueryId: string,
612
+ data: string | undefined,
613
+ deps: TelegramSettingsMenuCallbackDeps,
614
+ ): Promise<boolean> {
615
+ if (!data?.startsWith("settings:")) return false;
616
+ if (data === "settings:list") {
617
+ await updateTelegramSettingsMenuMessage(deps, deps.sectionRegistry);
618
+ await deps.answerCallbackQuery(callbackQueryId);
619
+ return true;
620
+ }
621
+ if (data === "settings:open:automatic-thread-cleanup") {
622
+ await updateAutomaticThreadCleanupSettingsMessage(deps);
623
+ await deps.answerCallbackQuery(callbackQueryId);
624
+ return true;
625
+ }
626
+ if (data === "settings:open:proactive") {
627
+ await updateProactivePushSettingsMessage(deps);
628
+ await deps.answerCallbackQuery(callbackQueryId);
629
+ return true;
630
+ }
631
+ if (
632
+ data === "settings:open:draft-previews" ||
633
+ data === "settings:open:rich-drafts"
634
+ ) {
635
+ await updateDraftPreviewsSettingsMessage(deps);
636
+ await deps.answerCallbackQuery(callbackQueryId);
637
+ return true;
638
+ }
639
+ if (data === "settings:open:assistant-rendering") {
640
+ await updateAssistantRenderingSettingsMessage(deps);
641
+ await deps.answerCallbackQuery(callbackQueryId);
642
+ return true;
643
+ }
644
+ if (data === "settings:open:activity-verbosity") {
645
+ await updateActivityVerbositySettingsMessage(deps);
646
+ await deps.answerCallbackQuery(callbackQueryId);
647
+ return true;
648
+ }
649
+ if (data === "settings:open:voice-reply") {
650
+ await updateVoiceReplyModeSettingsMessage(deps);
651
+ await deps.answerCallbackQuery(callbackQueryId);
652
+ return true;
653
+ }
654
+ if (
655
+ data === "settings:open:time-injection" ||
656
+ data === "settings:open:time"
657
+ ) {
658
+ await updateTimeInjectionModeSettingsMessage(deps);
659
+ await deps.answerCallbackQuery(callbackQueryId);
660
+ return true;
661
+ }
662
+ if (data.startsWith("settings:set:voice-reply:")) {
663
+ const mode = data.slice("settings:set:voice-reply:".length);
664
+ if (mode === "hidden" || mode === "mirror" || mode === "always") {
665
+ await deps.setVoiceReplyMode(mode === "hidden" ? undefined : mode);
666
+ await updateVoiceReplyModeSettingsMessage(deps);
667
+ await deps.answerCallbackQuery(
668
+ callbackQueryId,
669
+ `Voice reply mode: ${mode}`,
670
+ );
671
+ return true;
672
+ }
673
+ }
674
+ if (
675
+ data.startsWith("settings:set:time-injection:") ||
676
+ data.startsWith("settings:set:time:")
677
+ ) {
678
+ const mode = data.startsWith("settings:set:time-injection:")
679
+ ? data.slice("settings:set:time-injection:".length)
680
+ : data.slice("settings:set:time:".length);
681
+ const normalizedMode = mode === "off" ? "hidden" : mode;
682
+ if (
683
+ normalizedMode === "hidden" ||
684
+ normalizedMode === "always" ||
685
+ normalizedMode === "interval"
686
+ ) {
687
+ await deps.setTimeInjectionMode(normalizedMode);
688
+ await updateTimeInjectionModeSettingsMessage(deps);
689
+ await deps.answerCallbackQuery(
690
+ callbackQueryId,
691
+ `Time injection: ${normalizedMode}`,
692
+ );
693
+ return true;
694
+ }
695
+ }
696
+ if (
697
+ data === "settings:set:draft-previews:on" ||
698
+ data === "settings:set:draft-previews:off" ||
699
+ data === "settings:set:rich-drafts:on" ||
700
+ data === "settings:set:rich-drafts:off"
701
+ ) {
702
+ const enabled = data.endsWith(":on");
703
+ await deps.setDraftPreviewsEnabled(enabled);
704
+ await updateDraftPreviewsSettingsMessage(deps);
705
+ await deps.answerCallbackQuery(
706
+ callbackQueryId,
707
+ `Draft previews ${enabled ? "enabled" : "disabled"}`,
708
+ );
709
+ return true;
710
+ }
711
+ if (data.startsWith("settings:set:assistant-rendering:")) {
712
+ const mode = data.slice("settings:set:assistant-rendering:".length);
713
+ if (mode === "rich" || mode === "html") {
714
+ await deps.setAssistantRenderingMode(mode);
715
+ await updateAssistantRenderingSettingsMessage(deps);
716
+ await deps.answerCallbackQuery(callbackQueryId, `Rendering: ${mode}`);
717
+ return true;
718
+ }
719
+ }
720
+ if (data.startsWith("settings:set:activity-verbosity:")) {
721
+ const verbosity = data.slice("settings:set:activity-verbosity:".length);
722
+ if (
723
+ verbosity === "quiet" ||
724
+ verbosity === "thinking" ||
725
+ verbosity === "tools" ||
726
+ verbosity === "verbose"
727
+ ) {
728
+ await deps.setActivityVerbosity(verbosity);
729
+ await updateActivityVerbositySettingsMessage(deps);
730
+ await deps.answerCallbackQuery(
731
+ callbackQueryId,
732
+ `Activity: ${verbosity}`,
733
+ );
734
+ return true;
735
+ }
736
+ }
737
+ if (
738
+ data === "settings:set:automatic-thread-cleanup:on" ||
739
+ data === "settings:set:automatic-thread-cleanup:off"
740
+ ) {
741
+ const enabled = data.endsWith(":on");
742
+ await deps.setAutomaticThreadCleanupEnabled(enabled);
743
+ await updateAutomaticThreadCleanupSettingsMessage(deps);
744
+ await deps.answerCallbackQuery(
745
+ callbackQueryId,
746
+ `Thread cleanup ${enabled ? "enabled" : "disabled"}`,
747
+ );
748
+ return true;
749
+ }
750
+ if (
751
+ data === "settings:set:proactive:on" ||
752
+ data === "settings:set:proactive:off"
753
+ ) {
754
+ const enabled = data.endsWith(":on");
755
+ await deps.setProactivePushEnabled(enabled);
756
+ await updateProactivePushSettingsMessage(deps);
757
+ await deps.answerCallbackQuery(
758
+ callbackQueryId,
759
+ `Proactive push ${enabled ? "enabled" : "disabled"}`,
760
+ );
761
+ return true;
762
+ }
763
+ await deps.answerCallbackQuery(callbackQueryId);
764
+ return true;
765
+ }
766
+
767
+ export function createTelegramSettingsMenuRuntime<
768
+ TContext,
769
+ TModel extends MenuModel = MenuModel,
770
+ >(
771
+ deps: TelegramSettingsMenuRuntimeDeps<TContext, TModel>,
772
+ sectionRegistry?: TelegramSectionRegistry,
773
+ ): TelegramSettingsMenuRuntime<TContext> {
774
+ return {
775
+ openSettingsMenu: async (chatId, _replyToMessageId, ctx) => {
776
+ await deps.reloadConfig?.();
777
+ return openTelegramSettingsMenu(
778
+ {
779
+ getModelMenuState: () => deps.getModelMenuState(chatId, ctx),
780
+ isProactivePushEnabled: deps.isProactivePushEnabled,
781
+ areDraftPreviewsEnabled: deps.areDraftPreviewsEnabled,
782
+ getAssistantRenderingMode: deps.getAssistantRenderingMode,
783
+ getActivityVerbosity: deps.getActivityVerbosity,
784
+ getVoiceReplyMode: deps.getVoiceReplyMode,
785
+ isVoiceReplyModeConfigured: deps.isVoiceReplyModeConfigured,
786
+ getTimeInjectionMode: deps.getTimeInjectionMode,
787
+ isAutomaticThreadCleanupEnabled: deps.isAutomaticThreadCleanupEnabled,
788
+ sendSettingsMenu: (state, text, replyMarkup) =>
789
+ deps.sendInteractiveMessage(
790
+ state.chatId,
791
+ text,
792
+ "html",
793
+ replyMarkup,
794
+ ),
795
+ storeModelMenuState: deps.storeModelMenuState,
796
+ },
797
+ sectionRegistry,
798
+ );
799
+ },
800
+ updateSettingsMenuMessage: async (state) => {
801
+ await deps.reloadConfig?.();
802
+ return updateTelegramSettingsMenuMessage(
803
+ {
804
+ isProactivePushEnabled: deps.isProactivePushEnabled,
805
+ areDraftPreviewsEnabled: deps.areDraftPreviewsEnabled,
806
+ getAssistantRenderingMode: deps.getAssistantRenderingMode,
807
+ getActivityVerbosity: deps.getActivityVerbosity,
808
+ getVoiceReplyMode: deps.getVoiceReplyMode,
809
+ isVoiceReplyModeConfigured: deps.isVoiceReplyModeConfigured,
810
+ getTimeInjectionMode: deps.getTimeInjectionMode,
811
+ isAutomaticThreadCleanupEnabled: deps.isAutomaticThreadCleanupEnabled,
812
+ updateSettingsMessage: (text, replyMarkup) =>
813
+ deps.editInteractiveMessage(
814
+ state.chatId,
815
+ state.messageId,
816
+ text,
817
+ "html",
818
+ replyMarkup,
819
+ ),
820
+ },
821
+ sectionRegistry,
822
+ );
823
+ },
824
+ handleCallbackQuery: async (query, ctx) => {
825
+ if (!query.data?.startsWith("settings:")) return false;
826
+ await deps.reloadConfig?.();
827
+ const messageId = query.message?.message_id;
828
+ const chatId = query.message?.chat?.id;
829
+ let state = deps.getStoredModelMenuState(messageId, chatId);
830
+ if (!state) {
831
+ if (typeof messageId !== "number" || typeof chatId !== "number") {
832
+ await deps.answerCallbackQuery(
833
+ query.id,
834
+ "Interactive message expired.",
835
+ );
836
+ return true;
837
+ }
838
+ state = await deps.getModelMenuState(
839
+ chatId,
840
+ ctx,
841
+ query.message?.message_thread_id,
842
+ );
843
+ state.messageId = messageId;
844
+ state.mode = "settings";
845
+ deps.storeModelMenuState(state);
846
+ }
847
+ return handleTelegramSettingsMenuCallbackAction(query.id, query.data, {
848
+ isProactivePushEnabled: deps.isProactivePushEnabled,
849
+ areDraftPreviewsEnabled: deps.areDraftPreviewsEnabled,
850
+ getAssistantRenderingMode: deps.getAssistantRenderingMode,
851
+ getActivityVerbosity: deps.getActivityVerbosity,
852
+ getVoiceReplyMode: deps.getVoiceReplyMode,
853
+ isVoiceReplyModeConfigured: deps.isVoiceReplyModeConfigured,
854
+ getTimeInjectionMode: deps.getTimeInjectionMode,
855
+ isAutomaticThreadCleanupEnabled: deps.isAutomaticThreadCleanupEnabled,
856
+ setProactivePushEnabled: deps.setProactivePushEnabled,
857
+ setDraftPreviewsEnabled: deps.setDraftPreviewsEnabled,
858
+ setAssistantRenderingMode: deps.setAssistantRenderingMode,
859
+ setActivityVerbosity: deps.setActivityVerbosity,
860
+ setVoiceReplyMode: deps.setVoiceReplyMode,
861
+ setTimeInjectionMode: deps.setTimeInjectionMode,
862
+ setAutomaticThreadCleanupEnabled: deps.setAutomaticThreadCleanupEnabled,
863
+ updateSettingsMessage: (text, replyMarkup) =>
864
+ deps.editInteractiveMessage(
865
+ state.chatId,
866
+ state.messageId,
867
+ text,
868
+ "html",
869
+ replyMarkup,
870
+ ),
871
+ answerCallbackQuery: deps.answerCallbackQuery,
872
+ sectionRegistry,
873
+ });
874
+ },
875
+ };
876
+ }