@desplega.ai/agent-swarm 2.7.6 → 2.7.7

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 (244) hide show
  1. package/dist/{acp-adapter-bp91d37f.js → acp-adapter-7b4vk3h5.js} +5 -4
  2. package/dist/{actions-yj0eeaqh.js → actions-3tt153af.js} +18 -18
  3. package/dist/{amp-adapter-4pg9h34q.js → amp-adapter-njpts0yr.js} +1 -1
  4. package/dist/{anthropic-messages-x4q6rfq5.js → anthropic-messages-xey2skwx.js} +7 -7
  5. package/dist/{app-909e97cr.js → app-nky4378f.js} +3 -3
  6. package/dist/{assistant-qdyb5fyy.js → assistant-jnb669pa.js} +19 -19
  7. package/dist/{azure-openai-responses-s1w5n70z.js → azure-openai-responses-26t7j9ra.js} +5 -5
  8. package/dist/{boot-reembed-fk0s9z18.js → boot-reembed-9mgvaztt.js} +1 -1
  9. package/dist/{boot-reembed-gs1rzrnh.js → boot-reembed-qs2djdej.js} +1 -1
  10. package/dist/{boot-scrub-sweep-4qfd4kfx.js → boot-scrub-sweep-yjpdj7s1.js} +3 -3
  11. package/dist/{boot-seeds-yr00k13d.js → boot-seeds-5cm6ambd.js} +4 -4
  12. package/dist/{boxd-vdmfssd9.js → boxd-nv507va8.js} +1 -1
  13. package/dist/{claude-adapter-qta1f1xn.js → claude-adapter-fn287zmm.js} +5 -4
  14. package/dist/{claude-managed-setup-sc6j4dm0.js → claude-managed-setup-wtdz2mj2.js} +1 -1
  15. package/dist/{claude-sdk-session-zgrz6yvc.js → claude-sdk-session-x91kqyhm.js} +8288 -8224
  16. package/dist/{cli-wp9sp1qb.js → cli-08bmz9z9.js} +1 -1
  17. package/dist/{cli-yy3rhsdw.js → cli-1c6tzt8g.js} +7 -7
  18. package/dist/{cli-q0k1w5zd.js → cli-35rsp8ye.js} +1 -1
  19. package/dist/{cli-xnrwazav.js → cli-3fg0bdcv.js} +1 -1
  20. package/dist/{cli-89knwags.js → cli-5b456bpf.js} +2 -2
  21. package/dist/{cli-drr5v6av.js → cli-5jnhv72d.js} +1 -1
  22. package/dist/{cli-dxae2yg7.js → cli-5zx699j9.js} +2 -2
  23. package/dist/{cli-0at8w34w.js → cli-6g0hb4cp.js} +8 -8
  24. package/dist/{cli-e3r2neck.js → cli-6pfd54vx.js} +5 -5
  25. package/dist/{cli-bsn8nhrq.js → cli-6vcp76qk.js} +3 -3
  26. package/dist/{cli-ekwks2vs.js → cli-72v799xn.js} +1 -1
  27. package/dist/cli-82j36f2m.js +45 -0
  28. package/dist/{cli-yx4kfngt.js → cli-8305gbq0.js} +29 -16
  29. package/dist/{cli-4necwtsv.js → cli-8sckt74b.js} +8 -8
  30. package/dist/{cli-vvpx3gsx.js → cli-95jzxcp3.js} +1 -1
  31. package/dist/{cli-hr2e2fft.js → cli-adeegh7d.js} +7 -7
  32. package/dist/{cli-m48g6p95.js → cli-afkqkrtw.js} +3 -3
  33. package/dist/{cli-0qatpy8q.js → cli-ayayvfg4.js} +24 -4
  34. package/dist/{cli-bqt1mptt.js → cli-az48n0nr.js} +4 -4
  35. package/dist/{cli-zm72anhg.js → cli-bfv7vdg6.js} +9 -9
  36. package/dist/{cli-hgaazk69.js → cli-caj33vcq.js} +5 -5
  37. package/dist/{cli-3ypk9vk1.js → cli-cb2a8pna.js} +1 -1
  38. package/dist/{cli-waqbxg08.js → cli-cppkf404.js} +17 -17
  39. package/dist/{cli-yn4kxs06.js → cli-ddaanqkd.js} +4 -4
  40. package/dist/{cli-386tyxxg.js → cli-e0kmphd6.js} +2 -2
  41. package/dist/{cli-54t00gt8.js → cli-e46hg0xw.js} +1 -1
  42. package/dist/{cli-jm2vfpfd.js → cli-e5bzrn01.js} +1 -1
  43. package/dist/{cli-436532ck.js → cli-excnnjg2.js} +165 -153
  44. package/dist/{cli-71ptav7x.js → cli-ferkkrg9.js} +1 -1
  45. package/dist/{cli-vpf89f34.js → cli-fmjd0t1y.js} +3 -3
  46. package/dist/{cli-pd7vagab.js → cli-fyt2g4wd.js} +3 -3
  47. package/dist/{cli-gdhpcbhf.js → cli-g08zdaec.js} +1 -1
  48. package/dist/{cli-ehq736cn.js → cli-g7s47cc5.js} +4 -4
  49. package/dist/{cli-svj5090z.js → cli-gz6q4eve.js} +3 -3
  50. package/dist/{cli-8snvgs5r.js → cli-je518txm.js} +10 -10
  51. package/dist/{cli-rmmmrjkd.js → cli-jtjtabxe.js} +1 -1
  52. package/dist/{cli-611a1294.js → cli-k0wwfqbg.js} +18 -1
  53. package/dist/{cli-es6va8jk.js → cli-k1nje3v3.js} +38 -43
  54. package/dist/{cli-p5gp8pcx.js → cli-k8196sh2.js} +6 -6
  55. package/dist/{cli-nwj0ee2w.js → cli-k899ehvh.js} +2 -2
  56. package/dist/{cli-decfb6v8.js → cli-m0da8j35.js} +23 -9
  57. package/dist/{cli-he9wchme.js → cli-mkk9rnzz.js} +4 -4
  58. package/dist/{cli-nhrvpaj7.js → cli-n6bv12jn.js} +510 -4
  59. package/dist/{cli-8bc1w0tw.js → cli-nmzhp1b5.js} +14 -12
  60. package/dist/{cli-0yv5z2pg.js → cli-p82cnnjq.js} +1 -1
  61. package/dist/{cli-c60vetmm.js → cli-pc6n7fre.js} +1 -1
  62. package/dist/{cli-xds5f77d.js → cli-pjctyea3.js} +2 -2
  63. package/dist/{cli-xbbndvjy.js → cli-pq73h5mz.js} +3 -3
  64. package/dist/{cli-aa6yxc7m.js → cli-pz4rk021.js} +1 -1
  65. package/dist/{cli-xnqgpshy.js → cli-q3tkegby.js} +1 -1
  66. package/dist/cli-qghe0h66.js +67 -0
  67. package/dist/{cli-zbbwez0r.js → cli-qh4d4tvk.js} +4 -4
  68. package/dist/{cli-w6dt9ged.js → cli-rtt8g4v9.js} +1 -1
  69. package/dist/{cli-1h3wcpbw.js → cli-snpj5zbj.js} +2 -2
  70. package/dist/{cli-a7v854rf.js → cli-tgrv9cjx.js} +263 -12
  71. package/dist/{cli-faxe6thg.js → cli-vz22fyqv.js} +186 -54
  72. package/dist/{cli-k2gzwsj2.js → cli-wk5yrfwd.js} +160 -26
  73. package/dist/{cli-shpbx5ee.js → cli-ws19768n.js} +1641 -49
  74. package/dist/{cli-70r77n04.js → cli-xae4g51r.js} +1 -1
  75. package/dist/{cli-kqdg1bsb.js → cli-yndmfxb3.js} +2 -2
  76. package/dist/{cli-bjb3z51z.js → cli-yyj3j5m4.js} +2 -2
  77. package/dist/cli.js +21 -21
  78. package/dist/{cloudflare-workers-ai-system-one-bm60fjm0.js → cloudflare-workers-ai-system-one-ef2a980q.js} +2 -2
  79. package/dist/{codex-adapter-ayd1fb6h.js → codex-adapter-cf2yxe9m.js} +3 -2
  80. package/dist/{codex-hook-9efm2x1m.js → codex-hook-a0c6g6t6.js} +1 -1
  81. package/dist/{codex-session-runner-jesa32xc.js → codex-session-runner-6vfzdgbd.js} +3 -2
  82. package/dist/{commands-hanewgf2.js → commands-t3mfy7vn.js} +3 -3
  83. package/dist/{controller-dt1n3c1q.js → controller-q7xrbaz0.js} +3 -3
  84. package/dist/{controllers-connect-xx8x64n5.js → controllers-connect-c6nm70kg.js} +19 -19
  85. package/dist/{cursor-adapter-9s4dwwdw.js → cursor-adapter-ftd81ga8.js} +1 -1
  86. package/dist/{db-3vttcbv4.js → db-dk572x25.js} +3 -3
  87. package/dist/{db-9dv0g1ab.js → db-vemtpmcc.js} +4 -2
  88. package/dist/{dispatcher-tx9hd1sv.js → dispatcher-kh7ecxh9.js} +17 -17
  89. package/dist/{dsh-adapter-007y4ejs.js → dsh-adapter-v8628r89.js} +1 -1
  90. package/dist/{e2b-we6hs6q5.js → e2b-fr12yccx.js} +1 -1
  91. package/dist/{e2b-a19d28rz.js → e2b-x6ywzak3.js} +1 -1
  92. package/dist/{easter-egg-3d-rgbrqb8s.js → easter-egg-3d-nenw4x63.js} +1 -1
  93. package/dist/{embedding-space-ny1e2940.js → embedding-space-0jepb239.js} +6 -6
  94. package/dist/{embeddings-2t386t13.js → embeddings-xxt49yxg.js} +1 -1
  95. package/dist/{execute-pksh0ceh.js → execute-1mhw6e4x.js} +1 -1
  96. package/dist/{external-channel-phgmhmd7.js → external-channel-55v12e60.js} +2 -2
  97. package/dist/{fx-adapter-fy8rr921.js → fx-adapter-bs8wqrk5.js} +6 -5
  98. package/dist/{google-generative-ai-8y3m3k4b.js → google-generative-ai-v94hr7h0.js} +5 -5
  99. package/dist/{google-vertex-w3v98n7b.js → google-vertex-g7vr6cf8.js} +5 -5
  100. package/dist/{grok-adapter-q0abvpaj.js → grok-adapter-gpjqmkcq.js} +6 -5
  101. package/dist/handlers-zxmp1ta4.js +32 -0
  102. package/dist/{heartbeat-kadyek8p.js → heartbeat-k42svnr0.js} +20 -20
  103. package/dist/{hook-9k551xnj.js → hook-114m7hap.js} +4 -3
  104. package/dist/{hook-5zs3msf6.js → hook-6nphweh0.js} +24 -9
  105. package/dist/{http-mhz9vw1f.js → http-r8cc4wz7.js} +1025 -173
  106. package/dist/index-a8phxqnk.js +37 -0
  107. package/dist/{index-vdygbq10.js → index-e3s8wmxy.js} +1 -1
  108. package/dist/{index-q361cg2f.js → index-fpk4bcd9.js} +1 -1
  109. package/dist/index-k6h00t4c.js +30 -0
  110. package/dist/{index-rvr00sg7.js → index-nh3wyqdt.js} +1017 -574
  111. package/dist/index-xrz7te8h.js +33 -0
  112. package/dist/{keepalive-w56f32cg.js → keepalive-x060nt9p.js} +3 -3
  113. package/dist/lead-956sd2yc.js +71 -0
  114. package/dist/{maintenance-7mdgxcea.js → maintenance-2xxfexhf.js} +1 -1
  115. package/dist/{mistral-conversations-4pmwj1c0.js → mistral-conversations-3gjpdb4b.js} +4 -4
  116. package/dist/{oauth-refresh-sweep-29txy9vk.js → oauth-refresh-sweep-fckc4ar5.js} +2 -2
  117. package/dist/{onboard-kpsrkarj.js → onboard-zc48j237.js} +3 -3
  118. package/dist/{openai-codex-responses-44j573nm.js → openai-codex-responses-8pbxq9h5.js} +5 -5
  119. package/dist/{openai-completions-a4gee2a8.js → openai-completions-rm00s912.js} +4 -4
  120. package/dist/{openai-decisions-w4qkrcar.js → openai-decisions-8v957r2r.js} +1 -1
  121. package/dist/{openai-responses-rbp6h5kr.js → openai-responses-agxpf96k.js} +5 -5
  122. package/dist/{opencode-adapter-j25vm3rr.js → opencode-adapter-r690h1cr.js} +4 -3
  123. package/dist/{otel-impl-6kkct7a8.js → otel-impl-r5xbh81q.js} +4 -4
  124. package/dist/{pi-mono-adapter-exhkzhn2.js → pi-mono-adapter-c7v8sdec.js} +7 -6
  125. package/dist/{pricing-refresh-n2x7jh6k.js → pricing-refresh-3pmre11v.js} +3 -3
  126. package/dist/{rbac-roles-81ypx6es.js → rbac-roles-3vbshwsb.js} +1 -1
  127. package/dist/{rbac-roles-b5htkjby.js → rbac-roles-910mmkgz.js} +2 -2
  128. package/dist/{render-v2-qn6jmpk4.js → render-v2-pxykkbab.js} +3 -3
  129. package/dist/{resume-wd30wx23.js → resume-adda0bwy.js} +6 -6
  130. package/dist/{runtime-4hsg7h60.js → runtime-fnbm7stk.js} +1 -1
  131. package/dist/{session-access-5qvfevhk.js → session-access-2fvamrdc.js} +4 -4
  132. package/dist/{session-source-backfill-n1czavbr.js → session-source-backfill-08xvv0sm.js} +2 -2
  133. package/dist/{setup-dnb56qy5.js → setup-1aqmvmh1.js} +1 -1
  134. package/dist/{typesafe-system-one-5mavm259.js → typesafe-system-one-0bmqcxfg.js} +2 -2
  135. package/dist/{virtual-modules-76xxv9fs.js → virtual-modules-d2pjk9j1.js} +5 -5
  136. package/dist/{work-objects-4n21tfkm.js → work-objects-9s0yrm5j.js} +20 -20
  137. package/dist/{worker-follow-up-77hvzxww.js → worker-follow-up-3q78fqmr.js} +17 -17
  138. package/dist/worker-y15hy08h.js +71 -0
  139. package/openapi.json +197 -4
  140. package/package.json +5 -5
  141. package/src/apps/definition.ts +6 -5
  142. package/src/be/db/page-theme-tokens.ts +12 -0
  143. package/src/be/db/tasks/read.ts +9 -1
  144. package/src/be/db/tasks/write.ts +19 -0
  145. package/src/be/db-client.ts +107 -7
  146. package/src/be/db.ts +34 -2
  147. package/src/be/migrations/269_pages_design_system.sql +23 -0
  148. package/src/be/seed/schedules-seeder.ts +0 -10
  149. package/src/be/seed-scripts/catalog/catalog-report.inline.ts +2 -0
  150. package/src/be/seed-scripts/catalog/catalog-report.ts +2 -0
  151. package/src/be/seed-scripts/catalog/memory-eval.ts +2 -0
  152. package/src/be/seed-scripts/catalog/swarm-update-check.ts +150 -0
  153. package/src/be/seed-scripts/index.ts +9 -0
  154. package/src/be/seed-skills/bundled-files.generated.json +3 -3
  155. package/src/be/swarm-config-guard.ts +32 -0
  156. package/src/be/task-auto-title-listener.ts +127 -0
  157. package/src/commands/onboard/agent-fs-version.ts +1 -1
  158. package/src/commands/profile-sync.ts +151 -16
  159. package/src/commands/runner.ts +15 -7
  160. package/src/hooks/hook.ts +20 -9
  161. package/src/http/index.ts +3 -0
  162. package/src/http/pages-public.ts +93 -129
  163. package/src/http/pages.ts +94 -21
  164. package/src/pages/browser-sdk.ts +48 -21
  165. package/src/pages/color-literals.ts +115 -0
  166. package/src/pages/page-head.ts +766 -0
  167. package/src/pages/version.ts +3 -0
  168. package/src/providers/amp-adapter.ts +1 -1
  169. package/src/providers/codex-adapter.ts +1 -0
  170. package/src/providers/codex-app-server.ts +27 -1
  171. package/src/providers/pi-mono-extension.ts +30 -15
  172. package/src/tasks/follow-up-gate.ts +318 -0
  173. package/src/tasks/worker-follow-up.ts +21 -1
  174. package/src/tests/codex-app-server.test.ts +59 -0
  175. package/src/tests/codex-gateway-route.test.ts +50 -1
  176. package/src/tests/create-page-tool.test.ts +501 -0
  177. package/src/tests/db-client-busy-retry.test.ts +81 -0
  178. package/src/tests/db-task-read-contract.test.ts +1 -0
  179. package/src/tests/db-task-write-contract.test.ts +2 -0
  180. package/src/tests/db-tasks-read.test.ts +21 -0
  181. package/src/tests/fixtures/pages/head-v1.html +56 -0
  182. package/src/tests/follow-up-gate-shadow.test.ts +513 -0
  183. package/src/tests/identity-field-budget.test.ts +1 -1
  184. package/src/tests/internal-ai/credentials.test.ts +62 -0
  185. package/src/tests/internal-ai/task-title.test.ts +283 -0
  186. package/src/tests/merge-gate-detect-changes.test.ts +145 -0
  187. package/src/tests/page-proxy.test.ts +1 -1
  188. package/src/tests/page-session-dev-cookie.test.ts +188 -0
  189. package/src/tests/pages-frame-ancestors.test.ts +28 -1
  190. package/src/tests/pages-head-v2.test.ts +534 -0
  191. package/src/tests/pages-http.test.ts +330 -0
  192. package/src/tests/pages-public-html.test.ts +43 -0
  193. package/src/tests/pages-storage.test.ts +182 -0
  194. package/src/tests/pages-versioning.test.ts +72 -0
  195. package/src/tests/profile-sync-stale-writeback.test.ts +334 -0
  196. package/src/tests/profile-sync.test.ts +11 -15
  197. package/src/tests/scheduled-task-required-params-migration.test.ts +3 -1
  198. package/src/tests/script-connections.test.ts +2 -0
  199. package/src/tests/seed-registry.test.ts +28 -6
  200. package/src/tests/seed-schedules.test.ts +61 -8
  201. package/src/tests/seed-scripts.test.ts +142 -2
  202. package/src/tests/swarm-diff.test.ts +121 -2
  203. package/src/tests/task-auto-title-config-guard.test.ts +37 -0
  204. package/src/tests/task-auto-title-listener.test.ts +165 -0
  205. package/src/tests/theme-import.test.ts +758 -0
  206. package/src/tests/themes-page-theme.test.ts +155 -0
  207. package/src/tests/themes-presets.test.ts +172 -0
  208. package/src/tests/workflow-script-principal.test.ts +2 -1
  209. package/src/themes/classics.ts +949 -0
  210. package/src/themes/import.ts +420 -0
  211. package/src/themes/page-fields.ts +40 -0
  212. package/src/themes/page-theme.ts +102 -0
  213. package/src/themes/presets.ts +561 -0
  214. package/src/themes/tokens.ts +218 -0
  215. package/src/tools/app-upsert.ts +1 -1
  216. package/src/tools/create-page.ts +118 -12
  217. package/src/tools/utils.ts +33 -0
  218. package/src/types.ts +45 -3
  219. package/src/utils/constants.ts +19 -0
  220. package/src/utils/follow-up-gate-schedule-ids.ts +13 -0
  221. package/src/utils/internal-ai/credentials.ts +146 -93
  222. package/src/utils/internal-ai/index.ts +10 -0
  223. package/src/utils/internal-ai/models.ts +18 -0
  224. package/src/utils/internal-ai/task-title.ts +282 -0
  225. package/src/utils/page-session.ts +37 -0
  226. package/templates/schedules/daily-status-report/content.md +88 -2
  227. package/templates/schedules/daily-swarm-update-check/content.md +16 -40
  228. package/templates/skills/apps/SKILL.md +1 -1
  229. package/templates/skills/apps/content.md +1 -1
  230. package/templates/skills/heartbeat-runbook/content.md +1 -1
  231. package/templates/skills/pages/config.json +1 -1
  232. package/templates/skills/pages/content.md +539 -86
  233. package/templates/skills/pages/files/examples/annotated-pr.html +21 -12
  234. package/templates/skills/pages/files/examples/multiplayer-board.html +41 -41
  235. package/templates/skills/pages/files/examples/report-page.html +125 -124
  236. package/dist/cli-2pnswgh8.js +0 -189
  237. package/dist/handlers-by3sfxyx.js +0 -32
  238. package/dist/index-4f2pvxae.js +0 -37
  239. package/dist/index-98gz7tmp.js +0 -30
  240. package/dist/index-k08z2cak.js +0 -33
  241. package/dist/lead-enq35nqp.js +0 -70
  242. package/dist/worker-gg1576j3.js +0 -70
  243. package/templates/schedules/daily-workflow-health-audit/config.json +0 -19
  244. package/templates/schedules/daily-workflow-health-audit/content.md +0 -191
@@ -1,189 +0,0 @@
1
- import {
2
- registerTemplate,
3
- init_registry3
4
- } from "./cli-cm5yqn35.js";
5
- import {
6
- __esm
7
- } from "./cli-242037k3.js";
8
-
9
- // src/commands/templates.ts
10
- var init_templates4 = __esm(() => {
11
- init_registry3();
12
- registerTemplate({
13
- eventType: "task.trigger.assigned",
14
- header: "",
15
- defaultBody: `{{work_on_task_cmd}} {{task_id}}{{task_desc_section}}{{attachments_section}}{{output_instructions}}`,
16
- variables: [
17
- { name: "work_on_task_cmd", description: "Formatted /work-on-task command" },
18
- { name: "task_id", description: "Task ID" },
19
- { name: "task_desc_section", description: "Task description section or empty string" },
20
- {
21
- name: "attachments_section",
22
- description: "Ready-to-run fetch recipe per task attachment (or empty string if none) — lets the agent download an attachment in one call instead of discovering the path/provider itself"
23
- },
24
- {
25
- name: "output_instructions",
26
- description: "Output format instructions (with outputSchema if present, or generic store-progress)"
27
- }
28
- ],
29
- category: "task_lifecycle"
30
- });
31
- registerTemplate({
32
- eventType: "task.trigger.offered",
33
- header: "",
34
- defaultBody: `{{review_offered_task_cmd}} {{task_id}}{{task_desc_section}}
35
-
36
- Accept if you have capacity and skills. Reject with a reason if you cannot handle it.`,
37
- variables: [
38
- { name: "review_offered_task_cmd", description: "Formatted /review-offered-task command" },
39
- { name: "task_id", description: "Task ID" },
40
- { name: "task_desc_section", description: "Task description section or empty string" }
41
- ],
42
- category: "task_lifecycle"
43
- });
44
- registerTemplate({
45
- eventType: "task.profile_sync_rejection",
46
- header: "",
47
- defaultBody: `=== PERSISTED PROFILE SYNC REJECTION ===
48
- A {{timestamp}} sync of {{field_label}} did not reach the database. Disk size: {{disk_size}}; DB size: {{db_size}}; budget: {{budget}}; delta: {{delta}}.
49
- Audit event: {{event_id}}. {{recovery_guidance}}
50
- === END PROFILE SYNC REJECTION ===
51
-
52
- `,
53
- variables: [
54
- { name: "timestamp", description: "UTC timestamp of the rejected sync" },
55
- { name: "field_label", description: "Profile field and its harness-specific file path" },
56
- { name: "disk_size", description: "Rejected local file size" },
57
- { name: "db_size", description: "Stored database field size" },
58
- { name: "budget", description: "Configured field budget" },
59
- { name: "delta", description: "Signed size delta" },
60
- { name: "event_id", description: "Persisted audit event ID" },
61
- { name: "recovery_guidance", description: "Accurate field-specific recovery instructions" }
62
- ],
63
- category: "task_lifecycle"
64
- });
65
- registerTemplate({
66
- eventType: "task.nudge.empty_final_turn",
67
- header: "",
68
- defaultBody: `Your last turn returned no text and no tool call. Finish now: if the task needs a result, call store-progress with it.`,
69
- variables: [],
70
- category: "task_lifecycle"
71
- });
72
- registerTemplate({
73
- eventType: "task.trigger.unread_mentions",
74
- header: "",
75
- defaultBody: `You have {{mention_count}} mention(s) in chat channels.
76
-
77
- 1. Use \`read-messages\` with unreadOnly: true to see them
78
- 2. Respond to questions or requests directed at you
79
- 3. If a message requires work, create a task using \`send-task\``,
80
- variables: [{ name: "mention_count", description: "Number of unread mentions or 'unread'" }],
81
- category: "task_lifecycle"
82
- });
83
- registerTemplate({
84
- eventType: "task.trigger.pool_available",
85
- header: "",
86
- defaultBody: `{{task_count}} task(s) available in the pool.
87
-
88
- 1. Run \`get-tasks\` with unassigned: true to browse
89
- 2. Pick one matching your skills
90
- 3. Run \`task-action\` with action: "claim" and taskId: "<id>"
91
-
92
- Note: Claims are first-come-first-serve. If claim fails, pick another.`,
93
- variables: [{ name: "task_count", description: "Number of available pool tasks" }],
94
- category: "task_lifecycle"
95
- });
96
- registerTemplate({
97
- eventType: "task.trigger.channel_activity",
98
- header: "",
99
- defaultBody: `## Slack Channel Activity
100
-
101
- {{message_count}} new message(s) in monitored Slack channels:
102
-
103
- {{messages_detail}}
104
- ## Your Task
105
-
106
- Review these messages and decide if any require action:
107
- 1. If a message is a question or request, respond using \`slack-reply\` or create a task with \`send-task\`
108
- 2. If a message is informational, no action needed
109
- 3. Use \`slack-read\` with the channelId to get more context if needed`,
110
- variables: [
111
- { name: "message_count", description: "Number of new messages" },
112
- {
113
- name: "messages_detail",
114
- description: "Formatted list of messages with channel and user info"
115
- }
116
- ],
117
- category: "task_lifecycle"
118
- });
119
- registerTemplate({
120
- eventType: "task.resumption.with_progress",
121
- header: "",
122
- defaultBody: `{{work_on_task_cmd}} {{task_id}}
123
-
124
- **RESUMED TASK** - This task was interrupted during a deployment and is being resumed.
125
-
126
- Task: "{{task_description}}"{{attachments_section}}
127
-
128
- Previous Progress:
129
- {{progress}}
130
-
131
- Continue from where you left off. Review the progress above and complete the remaining work.{{completion_instructions}}`,
132
- variables: [
133
- { name: "work_on_task_cmd", description: "Formatted /work-on-task command" },
134
- { name: "task_id", description: "Task ID" },
135
- { name: "task_description", description: "Original task description" },
136
- { name: "attachments_section", description: "Task attachment fetch recipes" },
137
- { name: "progress", description: "Previous progress text" },
138
- {
139
- name: "completion_instructions",
140
- description: "Completion instructions (empty for providers without MCP)"
141
- }
142
- ],
143
- category: "task_lifecycle"
144
- });
145
- registerTemplate({
146
- eventType: "task.resumption.no_progress",
147
- header: "",
148
- defaultBody: `{{work_on_task_cmd}} {{task_id}}
149
-
150
- **RESUMED TASK** - This task was interrupted during a deployment and is being resumed.
151
-
152
- Task: "{{task_description}}"{{attachments_section}}
153
-
154
- No progress was saved before the interruption. Start the task fresh but be aware files may have been partially modified.{{completion_instructions}}`,
155
- variables: [
156
- { name: "work_on_task_cmd", description: "Formatted /work-on-task command" },
157
- { name: "task_id", description: "Task ID" },
158
- { name: "task_description", description: "Original task description" },
159
- { name: "attachments_section", description: "Task attachment fetch recipes" },
160
- {
161
- name: "completion_instructions",
162
- description: "Completion instructions (empty for providers without MCP)"
163
- }
164
- ],
165
- category: "task_lifecycle"
166
- });
167
- registerTemplate({
168
- eventType: "task.output.schema",
169
- header: "",
170
- defaultBody: `
171
-
172
- **Required Output Format**: When completing this task, you MUST call store-progress with output that is valid JSON conforming to this schema:
173
- \`\`\`json
174
- {{schema}}
175
- \`\`\`
176
- Call store-progress with status "completed" and your JSON output. If your output doesn't match the schema, the tool call will fail and you should fix and retry.`,
177
- variables: [{ name: "schema", description: "Required output JSON schema" }],
178
- category: "task_lifecycle"
179
- });
180
- registerTemplate({
181
- eventType: "task.output.generic",
182
- header: "",
183
- defaultBody: '\n\nWhen done, use `store-progress` with status: "completed" and include your output.',
184
- variables: [],
185
- category: "task_lifecycle"
186
- });
187
- });
188
-
189
- export { init_templates4 };
@@ -1,32 +0,0 @@
1
- import {
2
- isUserAllowed2,
3
- registerMessageHandler2,
4
- init_handlers
5
- } from "./cli-yy3rhsdw.js";
6
- import"./cli-p5gp8pcx.js";
7
- import"./cli-xbbndvjy.js";
8
- import"./cli-shpbx5ee.js";
9
- import"./cli-zbbwez0r.js";
10
- import"./cli-89knwags.js";
11
- import"./cli-c60vetmm.js";
12
- import"./cli-hr2e2fft.js";
13
- import"./cli-xnqgpshy.js";
14
- import"./cli-3xj33nrx.js";
15
- import"./cli-4necwtsv.js";
16
- import"./cli-m48g6p95.js";
17
- import"./cli-8bc1w0tw.js";
18
- import"./cli-waqbxg08.js";
19
- import"./cli-gdhpcbhf.js";
20
- import"./cli-w6dt9ged.js";
21
- import"./cli-hgaazk69.js";
22
- import"./cli-yn4kxs06.js";
23
- import"./cli-drr5v6av.js";
24
- import"./cli-rmmmrjkd.js";
25
- import"./cli-k2gzwsj2.js";
26
- import"./cli-wx3rhnm0.js";
27
- init_handlers();
28
-
29
- export {
30
- isUserAllowed2 as isUserAllowed,
31
- registerMessageHandler2 as registerMessageHandler
32
- };
@@ -1,37 +0,0 @@
1
- import {
2
- getExecutorRegistry2,
3
- initWorkflows2,
4
- init_workflows
5
- } from "./cli-shpbx5ee.js";
6
- import"./cli-zbbwez0r.js";
7
- import"./cli-89knwags.js";
8
- import"./cli-c60vetmm.js";
9
- import"./cli-hr2e2fft.js";
10
- import"./cli-xnqgpshy.js";
11
- import"./cli-3xj33nrx.js";
12
- import"./cli-4necwtsv.js";
13
- import {
14
- retryFailedRun2,
15
- cancelWorkflowRun2
16
- } from "./cli-m48g6p95.js";
17
- import {
18
- startWorkflowExecution2
19
- } from "./cli-8bc1w0tw.js";
20
- import"./cli-waqbxg08.js";
21
- import"./cli-gdhpcbhf.js";
22
- import"./cli-w6dt9ged.js";
23
- import"./cli-hgaazk69.js";
24
- import"./cli-yn4kxs06.js";
25
- import"./cli-drr5v6av.js";
26
- import"./cli-rmmmrjkd.js";
27
- import"./cli-k2gzwsj2.js";
28
- import"./cli-wx3rhnm0.js";
29
- init_workflows();
30
-
31
- export {
32
- cancelWorkflowRun2 as cancelWorkflowRun,
33
- getExecutorRegistry2 as getExecutorRegistry,
34
- initWorkflows2 as initWorkflows,
35
- retryFailedRun2 as retryFailedRun,
36
- startWorkflowExecution2 as startWorkflowExecution
37
- };
@@ -1,30 +0,0 @@
1
- import"./cli-ns59dc6r.js";
2
- import {
3
- startHeartbeat2,
4
- stopHeartbeat2
5
- } from "./cli-zm72anhg.js";
6
- import"./cli-8snvgs5r.js";
7
- import"./cli-xnrwazav.js";
8
- import"./cli-shpbx5ee.js";
9
- import"./cli-zbbwez0r.js";
10
- import"./cli-89knwags.js";
11
- import"./cli-c60vetmm.js";
12
- import"./cli-hr2e2fft.js";
13
- import"./cli-xnqgpshy.js";
14
- import"./cli-3xj33nrx.js";
15
- import"./cli-4necwtsv.js";
16
- import"./cli-m48g6p95.js";
17
- import"./cli-8bc1w0tw.js";
18
- import"./cli-waqbxg08.js";
19
- import"./cli-gdhpcbhf.js";
20
- import"./cli-w6dt9ged.js";
21
- import"./cli-hgaazk69.js";
22
- import"./cli-yn4kxs06.js";
23
- import"./cli-drr5v6av.js";
24
- import"./cli-rmmmrjkd.js";
25
- import"./cli-k2gzwsj2.js";
26
- import"./cli-wx3rhnm0.js";
27
- export {
28
- startHeartbeat2 as startHeartbeat,
29
- stopHeartbeat2 as stopHeartbeat
30
- };
@@ -1,33 +0,0 @@
1
- import {
2
- calculateNextRun2,
3
- startScheduler2,
4
- stopScheduler2,
5
- runScheduleNow2,
6
- init_scheduler2
7
- } from "./cli-shpbx5ee.js";
8
- import"./cli-zbbwez0r.js";
9
- import"./cli-89knwags.js";
10
- import"./cli-c60vetmm.js";
11
- import"./cli-hr2e2fft.js";
12
- import"./cli-xnqgpshy.js";
13
- import"./cli-3xj33nrx.js";
14
- import"./cli-4necwtsv.js";
15
- import"./cli-m48g6p95.js";
16
- import"./cli-8bc1w0tw.js";
17
- import"./cli-waqbxg08.js";
18
- import"./cli-gdhpcbhf.js";
19
- import"./cli-w6dt9ged.js";
20
- import"./cli-hgaazk69.js";
21
- import"./cli-yn4kxs06.js";
22
- import"./cli-drr5v6av.js";
23
- import"./cli-rmmmrjkd.js";
24
- import"./cli-k2gzwsj2.js";
25
- import"./cli-wx3rhnm0.js";
26
- init_scheduler2();
27
-
28
- export {
29
- calculateNextRun2 as calculateNextRun,
30
- runScheduleNow2 as runScheduleNow,
31
- startScheduler2 as startScheduler,
32
- stopScheduler2 as stopScheduler
33
- };
@@ -1,70 +0,0 @@
1
- import"./cli-k2gzwsj2.js";
2
- import"./cli-rmmmrjkd.js";
3
- import"./cli-zbbwez0r.js";
4
- import"./cli-89knwags.js";
5
- import"./cli-wx3rhnm0.js";
6
- import"./cli-w6dt9ged.js";
7
- import"./cli-waqbxg08.js";
8
- import"./cli-m48g6p95.js";
9
- import {
10
- getEnabledCapabilities,
11
- init_server
12
- } from "./cli-shpbx5ee.js";
13
- import"./cli-3xj33nrx.js";
14
- import"./cli-yn4kxs06.js";
15
- import"./cli-4necwtsv.js";
16
- import"./cli-bjb3z51z.js";
17
- import"./cli-ftyxyspd.js";
18
- import {
19
- runAgent
20
- } from "./cli-es6va8jk.js";
21
- import"./cli-98rw5dt5.js";
22
- import"./cli-77cd6gy8.js";
23
- import"./cli-mthwvjre.js";
24
- import"./cli-a22h291q.js";
25
- import"./cli-dhar9qay.js";
26
- import"./cli-jc1g9ndz.js";
27
- import"./cli-nwj0ee2w.js";
28
- import"./cli-jm2vfpfd.js";
29
- import"./cli-faxe6thg.js";
30
- import"./cli-d82btycs.js";
31
- import"./cli-0726awxw.js";
32
- import"./cli-decfb6v8.js";
33
- import"./cli-svj5090z.js";
34
- import"./cli-4bd1rck6.js";
35
- import"./cli-98rwmcyc.js";
36
- import"./cli-318r69gq.js";
37
- import"./cli-vfym7wmz.js";
38
- import"./cli-kr5tjjtz.js";
39
- import"./cli-0qatpy8q.js";
40
- import"./cli-wp9sp1qb.js";
41
- import"./cli-srye3vdt.js";
42
- import"./cli-vvpx3gsx.js";
43
- import"./cli-pd7vagab.js";
44
- import"./cli-yx4kfngt.js";
45
- import"./cli-ekwks2vs.js";
46
- import"./cli-54t00gt8.js";
47
- import"./cli-3ypk9vk1.js";
48
- import"./cli-4zsenjhy.js";
49
- import"./cli-c60vetmm.js";
50
- import"./cli-hr2e2fft.js";
51
- import"./cli-xnqgpshy.js";
52
- import"./cli-8bc1w0tw.js";
53
- import"./cli-gdhpcbhf.js";
54
- import"./cli-hgaazk69.js";
55
- import"./cli-drr5v6av.js";
56
-
57
- // src/commands/lead.ts
58
- init_server();
59
- var leadConfig = {
60
- role: "lead",
61
- defaultPrompt: "/start-leader",
62
- metadataType: "lead_metadata",
63
- capabilities: getEnabledCapabilities()
64
- };
65
- async function runLead(opts) {
66
- return runAgent(leadConfig, opts);
67
- }
68
- export {
69
- runLead
70
- };
@@ -1,70 +0,0 @@
1
- import"./cli-k2gzwsj2.js";
2
- import"./cli-rmmmrjkd.js";
3
- import"./cli-zbbwez0r.js";
4
- import"./cli-89knwags.js";
5
- import"./cli-wx3rhnm0.js";
6
- import"./cli-w6dt9ged.js";
7
- import"./cli-waqbxg08.js";
8
- import"./cli-m48g6p95.js";
9
- import {
10
- getEnabledCapabilities,
11
- init_server
12
- } from "./cli-shpbx5ee.js";
13
- import"./cli-3xj33nrx.js";
14
- import"./cli-yn4kxs06.js";
15
- import"./cli-4necwtsv.js";
16
- import"./cli-bjb3z51z.js";
17
- import"./cli-ftyxyspd.js";
18
- import {
19
- runAgent
20
- } from "./cli-es6va8jk.js";
21
- import"./cli-98rw5dt5.js";
22
- import"./cli-77cd6gy8.js";
23
- import"./cli-mthwvjre.js";
24
- import"./cli-a22h291q.js";
25
- import"./cli-dhar9qay.js";
26
- import"./cli-jc1g9ndz.js";
27
- import"./cli-nwj0ee2w.js";
28
- import"./cli-jm2vfpfd.js";
29
- import"./cli-faxe6thg.js";
30
- import"./cli-d82btycs.js";
31
- import"./cli-0726awxw.js";
32
- import"./cli-decfb6v8.js";
33
- import"./cli-svj5090z.js";
34
- import"./cli-4bd1rck6.js";
35
- import"./cli-98rwmcyc.js";
36
- import"./cli-318r69gq.js";
37
- import"./cli-vfym7wmz.js";
38
- import"./cli-kr5tjjtz.js";
39
- import"./cli-0qatpy8q.js";
40
- import"./cli-wp9sp1qb.js";
41
- import"./cli-srye3vdt.js";
42
- import"./cli-vvpx3gsx.js";
43
- import"./cli-pd7vagab.js";
44
- import"./cli-yx4kfngt.js";
45
- import"./cli-ekwks2vs.js";
46
- import"./cli-54t00gt8.js";
47
- import"./cli-3ypk9vk1.js";
48
- import"./cli-4zsenjhy.js";
49
- import"./cli-c60vetmm.js";
50
- import"./cli-hr2e2fft.js";
51
- import"./cli-xnqgpshy.js";
52
- import"./cli-8bc1w0tw.js";
53
- import"./cli-gdhpcbhf.js";
54
- import"./cli-hgaazk69.js";
55
- import"./cli-drr5v6av.js";
56
-
57
- // src/commands/worker.ts
58
- init_server();
59
- var workerConfig = {
60
- role: "worker",
61
- defaultPrompt: "/start-worker",
62
- metadataType: "worker_metadata",
63
- capabilities: getEnabledCapabilities()
64
- };
65
- async function runWorker(opts) {
66
- return runAgent(workerConfig, opts);
67
- }
68
- export {
69
- runWorker
70
- };
@@ -1,19 +0,0 @@
1
- {
2
- "kind": "schedule",
3
- "name": "daily-workflow-health-audit",
4
- "displayName": "Daily Workflow Health Audit",
5
- "slug": "daily-workflow-health-audit",
6
- "title": "Daily Workflow Health Audit",
7
- "description": "Check scheduled jobs and workflows for repeated failures, stale runs, and silent drift.",
8
- "version": "1.0.0",
9
- "category": "schedules",
10
- "placeholders": [],
11
- "requires": [],
12
- "runAllSeedersCandidate": true,
13
- "autoEnableCandidate": true,
14
- "tags": [
15
- "workflows",
16
- "schedules",
17
- "reliability"
18
- ]
19
- }
@@ -1,191 +0,0 @@
1
- # Daily Workflow Health Audit
2
-
3
- Delivery uses configured admin channels with an in-app fallback.
4
-
5
- Check scheduled jobs and workflows for repeated failures, stale runs, and silent drift.
6
-
7
- ## Schedule
8
-
9
- ```json
10
- {
11
- "cron": "0 8 * * *",
12
- "timezone": "UTC",
13
- "agentRole": "lead",
14
- "enabled": true
15
- }
16
- ```
17
-
18
- ## Scheduled Task
19
-
20
- This is the full task prompt the schedule runs on each fire. Adapt the channel IDs, mentions, app URLs, and escalation rules to your environment before enabling. As you learn from real incidents, expand this prompt with your own local failure modes and recovery notes.
21
-
22
- Task Type: Daily Workflow + Schedule Health Audit
23
-
24
- You are Lead. Run this audit and post a single Slack digest. Cadence: daily at 08:00 UTC. Purpose: surface any workflow run or scheduled-task fire from the last 24h that hard-failed or silently failed (completed but produced nothing useful) so the team catches broken cron/workflow plumbing before it ages out.
25
-
26
- ---
27
-
28
- ## Phase 1 — Query the six failure modes
29
-
30
- Use `db-query` for each.
31
-
32
- ### 1A. Hard-failed workflow runs (last 24h)
33
-
34
- ```sql
35
- SELECT wr.id, w.name AS workflowName, wr.status,
36
- wr.finishedAt, wr.lastUpdatedAt,
37
- SUBSTR(COALESCE(wr.error, ''), 1, 220) AS errSnippet
38
- FROM workflow_runs wr
39
- JOIN workflows w ON w.id = wr.workflowId
40
- WHERE wr.status = 'failed'
41
- AND datetime(COALESCE(wr.finishedAt, wr.lastUpdatedAt, wr.startedAt)) > datetime('now', '-24 hours')
42
- ORDER BY wr.lastUpdatedAt DESC;
43
- ```
44
-
45
- ### 1B. Hard-failed schedule-spawned tasks (last 24h)
46
-
47
- ```sql
48
- SELECT t.id, s.name AS scheduleName, t.status,
49
- SUBSTR(COALESCE(t.failureReason, ''), 1, 220) AS reasonSnippet,
50
- SUBSTR(COALESCE(t.output, ''), 1, 220) AS outSnippet,
51
- t.lastUpdatedAt
52
- FROM agent_tasks t
53
- LEFT JOIN scheduled_tasks s ON s.id = t.scheduleId
54
- WHERE t.status = 'failed'
55
- AND t.scheduleId IS NOT NULL
56
- AND datetime(t.lastUpdatedAt) > datetime('now', '-24 hours')
57
- ORDER BY t.lastUpdatedAt DESC;
58
- ```
59
-
60
- ### 1C. Halted >24h workflow runs (silent stuck)
61
-
62
- ```sql
63
- SELECT wr.id, w.name AS workflowName, wr.status, wr.lastUpdatedAt
64
- FROM workflow_runs wr
65
- JOIN workflows w ON w.id = wr.workflowId
66
- WHERE wr.status IN ('running', 'waiting')
67
- AND datetime(wr.lastUpdatedAt) < datetime('now', '-24 hours')
68
- ORDER BY wr.lastUpdatedAt ASC;
69
- ```
70
-
71
- ### 1D. Silent: schedule-spawned task completed with empty/sentinel output
72
-
73
- ```sql
74
- SELECT t.id, s.name AS scheduleName, t.status,
75
- SUBSTR(COALESCE(t.output, ''), 1, 220) AS outSnippet,
76
- LENGTH(TRIM(COALESCE(t.output, ''))) AS outLen,
77
- t.lastUpdatedAt
78
- FROM agent_tasks t
79
- LEFT JOIN scheduled_tasks s ON s.id = t.scheduleId
80
- WHERE t.status = 'completed'
81
- AND t.scheduleId IS NOT NULL
82
- AND datetime(t.lastUpdatedAt) > datetime('now', '-24 hours')
83
- AND (
84
- t.output IS NULL
85
- OR TRIM(t.output) = ''
86
- OR TRIM(t.output) = '⚡ Running shell command'
87
- OR LENGTH(TRIM(t.output)) < 10
88
- )
89
- ORDER BY t.lastUpdatedAt DESC;
90
- ```
91
-
92
- ### 1E. Cron didn't fire (nextRunAt in the past)
93
-
94
- ```sql
95
- SELECT s.id, s.name, s.cronExpression, s.lastRunAt, s.nextRunAt, s.consecutiveErrors,
96
- SUBSTR(COALESCE(s.lastErrorMessage, ''), 1, 220) AS lastErrSnippet
97
- FROM scheduled_tasks s
98
- WHERE s.enabled = 1
99
- AND s.scheduleType = 'recurring'
100
- AND s.nextRunAt IS NOT NULL
101
- AND datetime(s.nextRunAt) < datetime('now', '-1 hour')
102
- ORDER BY s.nextRunAt ASC;
103
- ```
104
-
105
- ### 1F. Schedules with consecutive errors (defensive)
106
-
107
- ```sql
108
- SELECT s.id, s.name, s.cronExpression, s.consecutiveErrors, s.lastErrorAt,
109
- SUBSTR(COALESCE(s.lastErrorMessage, ''), 1, 220) AS lastErrSnippet
110
- FROM scheduled_tasks s
111
- WHERE s.enabled = 1
112
- AND s.consecutiveErrors >= 3
113
- ORDER BY s.consecutiveErrors DESC;
114
- ```
115
-
116
- ### 1G. Totals (for the "all clear" denominator)
117
-
118
- ```sql
119
- SELECT
120
- (SELECT COUNT(*) FROM workflow_runs WHERE datetime(lastUpdatedAt) > datetime('now','-24 hours')) AS workflowRuns24h,
121
- (SELECT COUNT(*) FROM agent_tasks WHERE scheduleId IS NOT NULL AND datetime(lastUpdatedAt) > datetime('now','-24 hours')) AS scheduledFires24h;
122
- ```
123
-
124
- ---
125
-
126
- ## Phase 2 — Render the digest
127
-
128
- Each bullet must include a clickable URL.
129
-
130
- - Workflow run URL: `https://app.agent-swarm.dev/workflow-runs/<id>` → Slack format: `<https://app.agent-swarm.dev/workflow-runs/<id>|workflow:<workflowName>>`
131
- - Task URL: `https://app.agent-swarm.dev/tasks/<id>` → Slack format: `<https://app.agent-swarm.dev/tasks/<id>|schedule:<scheduleName>>`
132
-
133
- Truncate error/output snippets to 200 chars + `…` if longer. Replace newlines with ` ⏎ `.
134
-
135
- ### Template
136
-
137
- If TOTAL issues across 1A–1F is zero:
138
-
139
- ```
140
- :white_check_mark: *Daily Workflow + Schedule Health Audit* — <YYYY-MM-DD>
141
-
142
- <OWNER_OR_TEAM_MENTION> All clear — <workflowRuns24h> workflow runs + <scheduledFires24h> scheduled fires in the last 24h, all produced expected output.
143
- ```
144
-
145
- Otherwise:
146
-
147
- ```
148
- :stethoscope: *Daily Workflow + Schedule Health Audit* — <YYYY-MM-DD>
149
-
150
- <OWNER_OR_TEAM_MENTION> Audit window: last 24h. Totals: <workflowRuns24h> workflow runs · <scheduledFires24h> scheduled fires · *<TOTAL_ISSUES> issues*
151
-
152
- *Hard failures — workflow runs* (<N1A>)
153
- • <url|workflow:name> — failed <relative-time>
154
- ↳ <errSnippet>
155
-
156
- *Hard failures — scheduled tasks* (<N1B>)
157
- • <url|schedule:name> — failed <relative-time>
158
- ↳ <reasonSnippet OR outSnippet OR "(no failureReason set)">
159
-
160
- *Silent: halted >24h* (<N1C>)
161
- • <url|workflow:name> — status=<status>, no progress since <timestamp>
162
-
163
- *Silent: empty output* (<N1D>)
164
- • <url|schedule:name> — completed, output=<"empty" | first-N-chars>
165
-
166
- *Cron didn't fire on time* (<N1E>)
167
- • schedule:<name> (cron `<expr>`) — nextRunAt=<past-timestamp>, lastRunAt=<timestamp or "never">
168
-
169
- *Schedules with ≥3 consecutive errors* (<N1F>)
170
- • schedule:<name> — consecutiveErrors=<n>, last error: <lastErrSnippet>
171
- ```
172
-
173
- Omit any section whose count is 0. **HARD CEILING 700 characters — not the 4000-char Slack limit.** (Operator feedback, 2026-09-23: "too verbose every day".) Keep at most the top 3 items across ALL sections combined, one line each; everything else goes in the `store-progress` output, not the post. Over 700 chars ⇒ cut until it fits. A long digest is a failed run, not a thorough one.
174
-
175
- ---
176
-
177
- ## Phase 3 — Post to Slack and complete
178
-
179
- 1. Post `message=<rendered digest>` through configured admin delivery channels, using the in-app fallback when no external channel is configured. Prefer a top-level daily fire unless your team's convention is to thread recurring audit messages.
180
- 2. Call `store-progress` with `status: "completed"` and a one-paragraph `output` summary:
181
- - `Issues found: hard-fail-wf=<N1A>, hard-fail-task=<N1B>, halted-24h=<N1C>, silent-empty=<N1D>, cron-stuck=<N1E>, consec-err=<N1F>.`
182
- - `Totals: workflowRuns24h=<X>, scheduledFires24h=<Y>.`
183
- - `Slack message ts: <ts from slack-post response>.`
184
-
185
- ## Anti-patterns
186
-
187
- - ❌ Posting a separate Slack message per failure mode — ONE digest.
188
- - ❌ Raw IDs without clickable URLs.
189
- - ❌ Dumping full `error` / `output` content — truncate to 220 chars per item.
190
- - ❌ Threading the daily digest somewhere your team will not scan.
191
- - ❌ Skipping the "all clear" message when zero issues — the heartbeat itself is the signal that the audit ran.