@desplega.ai/agent-swarm 1.20.0 → 1.51.2

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 (561) hide show
  1. package/README.md +271 -169
  2. package/openapi.json +5015 -0
  3. package/package.json +40 -7
  4. package/plugin/commands/close-issue.md +7 -3
  5. package/plugin/commands/create-pr.md +18 -12
  6. package/plugin/commands/implement-issue.md +7 -3
  7. package/plugin/commands/respond-github.md +8 -4
  8. package/plugin/commands/review-pr.md +44 -10
  9. package/plugin/commands/start-leader.md +1 -3
  10. package/plugin/commands/start-worker.md +1 -3
  11. package/plugin/commands/work-on-task.md +22 -3
  12. package/plugin/pi-skills/close-issue/SKILL.md +90 -0
  13. package/plugin/pi-skills/create-pr/SKILL.md +99 -0
  14. package/plugin/pi-skills/implement-issue/SKILL.md +135 -0
  15. package/plugin/pi-skills/investigate-sentry-issue/SKILL.md +138 -0
  16. package/plugin/pi-skills/respond-github/SKILL.md +98 -0
  17. package/plugin/pi-skills/review-offered-task/SKILL.md +45 -0
  18. package/plugin/pi-skills/review-pr/SKILL.md +261 -0
  19. package/plugin/pi-skills/start-leader/SKILL.md +121 -0
  20. package/plugin/pi-skills/start-worker/SKILL.md +60 -0
  21. package/plugin/pi-skills/swarm-chat/SKILL.md +82 -0
  22. package/plugin/pi-skills/todos/SKILL.md +66 -0
  23. package/plugin/pi-skills/work-on-task/SKILL.md +65 -0
  24. package/plugin/skills/artifacts/examples/approval-flow.ts +34 -0
  25. package/plugin/skills/artifacts/examples/hono-dashboard.ts +31 -0
  26. package/plugin/skills/artifacts/examples/multi-artifact.ts +20 -0
  27. package/plugin/skills/artifacts/examples/static-report.sh +17 -0
  28. package/plugin/skills/artifacts/skill.md +71 -0
  29. package/src/agentmail/app.ts +65 -0
  30. package/src/agentmail/handlers.ts +262 -0
  31. package/src/agentmail/index.ts +9 -0
  32. package/src/agentmail/templates.ts +111 -0
  33. package/src/agentmail/types.ts +51 -0
  34. package/src/artifact-sdk/browser-sdk.ts +30 -0
  35. package/src/artifact-sdk/index.ts +2 -0
  36. package/src/artifact-sdk/localtunnel.d.ts +20 -0
  37. package/src/artifact-sdk/port.ts +12 -0
  38. package/src/artifact-sdk/server.ts +156 -0
  39. package/src/artifact-sdk/tunnel.ts +19 -0
  40. package/src/be/chunking.ts +193 -0
  41. package/src/be/db-queries/oauth.ts +90 -0
  42. package/src/be/db-queries/tracker.ts +182 -0
  43. package/src/be/db.ts +3327 -784
  44. package/src/be/embedding.ts +80 -0
  45. package/src/be/migrations/001_initial.sql +409 -0
  46. package/src/be/migrations/002_one_time_schedules.sql +59 -0
  47. package/src/be/migrations/003_workflows.sql +51 -0
  48. package/src/be/migrations/004_workflow_source.sql +81 -0
  49. package/src/be/migrations/005_epic_next_steps.sql +2 -0
  50. package/src/be/migrations/006_vcs_provider.sql +94 -0
  51. package/src/be/migrations/007_task_dir.sql +2 -0
  52. package/src/be/migrations/008_workflow_redesign.sql +85 -0
  53. package/src/be/migrations/009_tracker_integration.sql +144 -0
  54. package/src/be/migrations/010_step_diagnostics.sql +1 -0
  55. package/src/be/migrations/011_step_next_port.sql +1 -0
  56. package/src/be/migrations/012_trigger_schema.sql +1 -0
  57. package/src/be/migrations/013_task_output_schema.sql +2 -0
  58. package/src/be/migrations/014_prompt_templates.sql +33 -0
  59. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  60. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  61. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  62. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  63. package/src/be/migrations/runner.ts +188 -0
  64. package/src/be/seed.ts +62 -0
  65. package/src/cli.tsx +231 -299
  66. package/src/commands/artifact.ts +241 -0
  67. package/src/commands/onboard/compose-generator.ts +169 -0
  68. package/src/commands/onboard/env-generator.ts +79 -0
  69. package/src/commands/onboard/manifest.ts +37 -0
  70. package/src/commands/onboard/presets.ts +85 -0
  71. package/src/commands/onboard/service-names.ts +47 -0
  72. package/src/commands/onboard/steps/core-credentials.tsx +111 -0
  73. package/src/commands/onboard/steps/custom-templates.tsx +168 -0
  74. package/src/commands/onboard/steps/generate.tsx +154 -0
  75. package/src/commands/onboard/steps/harness-credentials.tsx +195 -0
  76. package/src/commands/onboard/steps/harness.tsx +21 -0
  77. package/src/commands/onboard/steps/health-check.tsx +171 -0
  78. package/src/commands/onboard/steps/integration-github.tsx +105 -0
  79. package/src/commands/onboard/steps/integration-gitlab.tsx +79 -0
  80. package/src/commands/onboard/steps/integration-menu.tsx +58 -0
  81. package/src/commands/onboard/steps/integration-sentry.tsx +79 -0
  82. package/src/commands/onboard/steps/integration-slack.tsx +165 -0
  83. package/src/commands/onboard/steps/post-connect.tsx +145 -0
  84. package/src/commands/onboard/steps/post-dashboard.tsx +34 -0
  85. package/src/commands/onboard/steps/post-task.tsx +103 -0
  86. package/src/commands/onboard/steps/prereq-check.tsx +178 -0
  87. package/src/commands/onboard/steps/review.tsx +82 -0
  88. package/src/commands/onboard/steps/start.tsx +97 -0
  89. package/src/commands/onboard/templates.ts +34 -0
  90. package/src/commands/onboard/types.ts +259 -0
  91. package/src/commands/onboard.tsx +425 -0
  92. package/src/commands/runner.ts +1540 -630
  93. package/src/commands/setup.tsx +23 -38
  94. package/src/commands/shared/client-config.ts +41 -0
  95. package/src/commands/templates.ts +172 -0
  96. package/src/github/app.ts +8 -0
  97. package/src/github/handlers.ts +384 -151
  98. package/src/github/index.ts +1 -0
  99. package/src/github/mentions-aliases.test.ts +73 -0
  100. package/src/github/mentions.test.ts +3 -3
  101. package/src/github/mentions.ts +32 -6
  102. package/src/github/templates.ts +398 -0
  103. package/src/github/types.ts +1 -0
  104. package/src/gitlab/auth.ts +63 -0
  105. package/src/gitlab/handlers.ts +368 -0
  106. package/src/gitlab/index.ts +19 -0
  107. package/src/gitlab/reactions.ts +104 -0
  108. package/src/gitlab/templates.ts +140 -0
  109. package/src/gitlab/types.ts +130 -0
  110. package/src/heartbeat/heartbeat.ts +434 -0
  111. package/src/heartbeat/index.ts +1 -0
  112. package/src/heartbeat/templates.ts +30 -0
  113. package/src/hooks/hook.ts +555 -4
  114. package/src/hooks/tool-loop-detection.test.ts +158 -0
  115. package/src/hooks/tool-loop-detection.ts +167 -0
  116. package/src/http/active-sessions.ts +199 -0
  117. package/src/http/agents.ts +328 -0
  118. package/src/http/config.ts +191 -0
  119. package/src/http/core.ts +309 -0
  120. package/src/http/db-query.ts +91 -0
  121. package/src/http/ecosystem.ts +63 -0
  122. package/src/http/epics.ts +460 -0
  123. package/src/http/index.ts +216 -0
  124. package/src/http/mcp.ts +77 -0
  125. package/src/http/memory.ts +168 -0
  126. package/src/http/openapi.ts +109 -0
  127. package/src/http/poll.ts +299 -0
  128. package/src/http/prompt-templates.ts +412 -0
  129. package/src/http/repos.ts +195 -0
  130. package/src/http/route-def.ts +123 -0
  131. package/src/http/schedules.ts +426 -0
  132. package/src/http/session-data.ts +241 -0
  133. package/src/http/stats.ts +174 -0
  134. package/src/http/tasks.ts +468 -0
  135. package/src/http/trackers/index.ts +10 -0
  136. package/src/http/trackers/linear.ts +187 -0
  137. package/src/http/types.ts +12 -0
  138. package/src/http/utils.ts +87 -0
  139. package/src/http/webhooks.ts +432 -0
  140. package/src/http/workflows.ts +530 -0
  141. package/src/http.ts +1 -1890
  142. package/src/linear/README.md +65 -0
  143. package/src/linear/app.ts +48 -0
  144. package/src/linear/client.ts +18 -0
  145. package/src/linear/index.ts +1 -0
  146. package/src/linear/oauth.ts +35 -0
  147. package/src/linear/outbound.ts +212 -0
  148. package/src/linear/sync.ts +567 -0
  149. package/src/linear/templates.ts +47 -0
  150. package/src/linear/types.ts +7 -0
  151. package/src/linear/webhook.ts +104 -0
  152. package/src/oauth/README.md +66 -0
  153. package/src/oauth/index.ts +6 -0
  154. package/src/oauth/wrapper.ts +204 -0
  155. package/src/prompts/base-prompt.ts +150 -265
  156. package/src/prompts/defaults.ts +196 -0
  157. package/src/prompts/registry.ts +57 -0
  158. package/src/prompts/resolver.ts +296 -0
  159. package/src/prompts/session-templates.ts +604 -0
  160. package/src/providers/claude-adapter.ts +442 -0
  161. package/src/providers/index.ts +24 -0
  162. package/src/providers/pi-mono-adapter.ts +442 -0
  163. package/src/providers/pi-mono-extension.ts +624 -0
  164. package/src/providers/pi-mono-mcp-client.ts +124 -0
  165. package/src/providers/types.ts +75 -0
  166. package/src/scheduler/scheduler.test.ts +2 -0
  167. package/src/scheduler/scheduler.ts +231 -40
  168. package/src/server.ts +97 -6
  169. package/src/slack/HEURISTICS.md +105 -0
  170. package/src/slack/actions.ts +133 -0
  171. package/src/slack/app.ts +7 -0
  172. package/src/slack/assistant.ts +118 -0
  173. package/src/slack/blocks.ts +233 -0
  174. package/src/slack/channel-activity.ts +177 -0
  175. package/src/slack/commands.ts +31 -17
  176. package/src/slack/files.ts +1 -1
  177. package/src/slack/handlers.test.ts +114 -1
  178. package/src/slack/handlers.ts +230 -55
  179. package/src/slack/responses.ts +120 -67
  180. package/src/slack/router.ts +17 -99
  181. package/src/slack/templates.ts +55 -0
  182. package/src/slack/thread-buffer.ts +213 -0
  183. package/src/slack/watcher.ts +119 -4
  184. package/src/tests/agent-activity.test.ts +247 -0
  185. package/src/tests/agentmail-filters.test.ts +97 -0
  186. package/src/tests/artifact-sdk.test.ts +800 -0
  187. package/src/tests/base-prompt.test.ts +264 -0
  188. package/src/tests/build-pi-skills.test.ts +127 -0
  189. package/src/tests/channel-activity.test.ts +363 -0
  190. package/src/tests/claude-adapter.test.ts +126 -0
  191. package/src/tests/context-versioning.test.ts +425 -0
  192. package/src/tests/db-queries-oauth.test.ts +197 -0
  193. package/src/tests/db-queries-tracker.test.ts +230 -0
  194. package/src/tests/epics.test.ts +3 -3
  195. package/src/tests/error-tracker.test.ts +368 -0
  196. package/src/tests/fetch-resolved-env.test.ts +167 -0
  197. package/src/tests/generate-default-claude-md.test.ts +9 -1
  198. package/src/tests/generate-identity-templates.test.ts +124 -0
  199. package/src/tests/gitlab-auth.test.ts +109 -0
  200. package/src/tests/gitlab-handlers.test.ts +691 -0
  201. package/src/tests/gitlab-vcs-db.test.ts +177 -0
  202. package/src/tests/heartbeat.test.ts +364 -0
  203. package/src/tests/http-api-integration.test.ts +1698 -0
  204. package/src/tests/linear-outbound-sync.test.ts +200 -0
  205. package/src/tests/linear-webhook.test.ts +406 -0
  206. package/src/tests/match-route.test.ts +187 -0
  207. package/src/tests/memory.test.ts +737 -0
  208. package/src/tests/migration-runner-regressions.test.ts +86 -0
  209. package/src/tests/model-control.test.ts +338 -0
  210. package/src/tests/oauth-wrapper.test.ts +147 -0
  211. package/src/tests/onboard-compose.test.ts +138 -0
  212. package/src/tests/onboard-env.test.ts +174 -0
  213. package/src/tests/onboard-manifest.test.ts +137 -0
  214. package/src/tests/pi-mono-adapter.test.ts +234 -0
  215. package/src/tests/pool-session-logs.test.ts +199 -0
  216. package/src/tests/progress-dedup.test.ts +98 -0
  217. package/src/tests/prompt-template-github.test.ts +682 -0
  218. package/src/tests/prompt-template-remaining.test.ts +504 -0
  219. package/src/tests/prompt-template-resolver.test.ts +621 -0
  220. package/src/tests/prompt-template-session.test.ts +363 -0
  221. package/src/tests/prompt-templates-db.test.ts +616 -0
  222. package/src/tests/provider-adapter.test.ts +122 -0
  223. package/src/tests/provider-command-format.test.ts +98 -0
  224. package/src/tests/reload-config.test.ts +170 -0
  225. package/src/tests/runner-polling-api.test.ts +25 -20
  226. package/src/tests/scheduled-tasks.test.ts +104 -0
  227. package/src/tests/scheduler-backoff.test.ts +166 -0
  228. package/src/tests/self-improvement.test.ts +541 -0
  229. package/src/tests/session-attach.test.ts +536 -0
  230. package/src/tests/session-costs.test.ts +267 -1
  231. package/src/tests/slack-actions.test.ts +133 -0
  232. package/src/tests/slack-assistant.test.ts +136 -0
  233. package/src/tests/slack-blocks.test.ts +246 -0
  234. package/src/tests/slack-metadata-inheritance.test.ts +243 -0
  235. package/src/tests/slack-queue-offline.test.ts +174 -0
  236. package/src/tests/slack-router.test.ts +181 -0
  237. package/src/tests/slack-thread-buffer.test.ts +305 -0
  238. package/src/tests/slack-thread-followups.test.ts +298 -0
  239. package/src/tests/slack-watcher.test.ts +101 -0
  240. package/src/tests/structured-output.test.ts +307 -0
  241. package/src/tests/swarm-repos.test.ts +198 -0
  242. package/src/tests/task-cancellation.test.ts +6 -4
  243. package/src/tests/task-working-dir.test.ts +176 -0
  244. package/src/tests/template-fetch.test.ts +490 -0
  245. package/src/tests/tool-annotations.test.ts +371 -0
  246. package/src/tests/tracker-tools.test.ts +184 -0
  247. package/src/tests/update-profile-agentid.test.ts +248 -0
  248. package/src/tests/update-profile-api.test.ts +143 -3
  249. package/src/tests/update-profile-auth.test.ts +195 -0
  250. package/src/tests/validation-adapters.test.ts +86 -0
  251. package/src/tests/vcs-provider.test.ts +27 -0
  252. package/src/tests/workflow-agent-task.test.ts +196 -0
  253. package/src/tests/workflow-async-v2.test.ts +508 -0
  254. package/src/tests/workflow-convergence.test.ts +541 -0
  255. package/src/tests/workflow-definition-validation.test.ts +366 -0
  256. package/src/tests/workflow-engine-v2.test.ts +691 -0
  257. package/src/tests/workflow-executors.test.ts +736 -0
  258. package/src/tests/workflow-http-v2.test.ts +599 -0
  259. package/src/tests/workflow-integration-io.test.ts +902 -0
  260. package/src/tests/workflow-io-schemas.test.ts +624 -0
  261. package/src/tests/workflow-registry.test.ts +592 -0
  262. package/src/tests/workflow-retry-v2.test.ts +401 -0
  263. package/src/tests/workflow-retry-validation.test.ts +282 -0
  264. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  265. package/src/tests/workflow-template.test.ts +288 -0
  266. package/src/tests/workflow-trigger-schema.test.ts +359 -0
  267. package/src/tests/workflow-triggers-v2.test.ts +264 -0
  268. package/src/tests/workflow-versions.test.ts +208 -0
  269. package/src/tests/workflow-workspace.test.ts +272 -0
  270. package/src/tests/x402-client.test.ts +117 -0
  271. package/src/tests/x402-config.test.ts +182 -0
  272. package/src/tests/x402-spending-tracker.test.ts +185 -0
  273. package/src/tools/cancel-task.ts +2 -0
  274. package/src/tools/context-diff.ts +171 -0
  275. package/src/tools/context-history.ts +138 -0
  276. package/src/tools/create-channel.ts +1 -0
  277. package/src/tools/db-query.ts +78 -0
  278. package/src/tools/delete-channel.ts +132 -0
  279. package/src/tools/epics/assign-task-to-epic.ts +1 -0
  280. package/src/tools/epics/create-epic.ts +3 -2
  281. package/src/tools/epics/delete-epic.ts +2 -0
  282. package/src/tools/epics/get-epic-details.ts +2 -0
  283. package/src/tools/epics/list-epics.ts +2 -0
  284. package/src/tools/epics/unassign-task-from-epic.ts +1 -0
  285. package/src/tools/epics/update-epic.ts +7 -4
  286. package/src/tools/get-swarm.ts +2 -0
  287. package/src/tools/get-task-details.ts +2 -0
  288. package/src/tools/get-tasks.ts +27 -1
  289. package/src/tools/inject-learning.ts +106 -0
  290. package/src/tools/join-swarm.ts +17 -7
  291. package/src/tools/list-channels.ts +2 -0
  292. package/src/tools/list-services.ts +2 -0
  293. package/src/tools/memory-get.ts +56 -0
  294. package/src/tools/memory-search.ts +131 -0
  295. package/src/tools/my-agent-info.ts +2 -0
  296. package/src/tools/poll-task.ts +2 -20
  297. package/src/tools/post-message.ts +1 -0
  298. package/src/tools/prompt-templates/delete.ts +86 -0
  299. package/src/tools/prompt-templates/get.ts +89 -0
  300. package/src/tools/prompt-templates/index.ts +5 -0
  301. package/src/tools/prompt-templates/list.ts +95 -0
  302. package/src/tools/prompt-templates/preview.ts +84 -0
  303. package/src/tools/prompt-templates/set.ts +117 -0
  304. package/src/tools/read-messages.ts +2 -0
  305. package/src/tools/register-agentmail-inbox.ts +166 -0
  306. package/src/tools/register-service.ts +2 -0
  307. package/src/tools/schedules/create-schedule.ts +134 -24
  308. package/src/tools/schedules/delete-schedule.ts +2 -0
  309. package/src/tools/schedules/list-schedules.ts +20 -4
  310. package/src/tools/schedules/run-schedule-now.ts +1 -0
  311. package/src/tools/schedules/update-schedule.ts +49 -17
  312. package/src/tools/send-task.ts +132 -10
  313. package/src/tools/slack-download-file.ts +4 -2
  314. package/src/tools/slack-list-channels.ts +2 -0
  315. package/src/tools/slack-post.ts +2 -0
  316. package/src/tools/slack-read.ts +2 -0
  317. package/src/tools/slack-reply.ts +2 -0
  318. package/src/tools/slack-upload-file.ts +2 -0
  319. package/src/tools/store-progress.ts +205 -4
  320. package/src/tools/swarm-config/delete-config.ts +87 -0
  321. package/src/tools/swarm-config/get-config.ts +108 -0
  322. package/src/tools/swarm-config/index.ts +4 -0
  323. package/src/tools/swarm-config/list-config.ts +99 -0
  324. package/src/tools/swarm-config/set-config.ts +118 -0
  325. package/src/tools/task-action.ts +50 -5
  326. package/src/tools/task-dedup.ts +97 -0
  327. package/src/tools/templates.ts +53 -0
  328. package/src/tools/tool-config.ts +124 -0
  329. package/src/tools/tracker/index.ts +6 -0
  330. package/src/tools/tracker/tracker-link-epic.ts +64 -0
  331. package/src/tools/tracker/tracker-link-task.ts +64 -0
  332. package/src/tools/tracker/tracker-map-agent.ts +57 -0
  333. package/src/tools/tracker/tracker-status.ts +56 -0
  334. package/src/tools/tracker/tracker-sync-status.ts +42 -0
  335. package/src/tools/tracker/tracker-unlink.ts +41 -0
  336. package/src/tools/unregister-service.ts +2 -0
  337. package/src/tools/update-profile.ts +172 -17
  338. package/src/tools/update-service-status.ts +2 -0
  339. package/src/tools/utils.ts +10 -1
  340. package/src/tools/workflows/create-workflow.ts +129 -0
  341. package/src/tools/workflows/delete-workflow.ts +42 -0
  342. package/src/tools/workflows/get-workflow-run.ts +59 -0
  343. package/src/tools/workflows/get-workflow.ts +53 -0
  344. package/src/tools/workflows/index.ts +9 -0
  345. package/src/tools/workflows/list-workflow-runs.ts +48 -0
  346. package/src/tools/workflows/list-workflows.ts +42 -0
  347. package/src/tools/workflows/retry-workflow-run.ts +40 -0
  348. package/src/tools/workflows/trigger-workflow.ts +96 -0
  349. package/src/tools/workflows/update-workflow.ts +133 -0
  350. package/src/tracker/types.ts +51 -0
  351. package/src/types.ts +530 -14
  352. package/src/utils/credentials.test.ts +156 -0
  353. package/src/utils/credentials.ts +50 -0
  354. package/src/utils/error-tracker.ts +190 -0
  355. package/src/vcs/index.ts +15 -0
  356. package/src/vcs/types.ts +5 -0
  357. package/src/workflows/checkpoint.ts +121 -0
  358. package/src/workflows/cooldown.ts +28 -0
  359. package/src/workflows/definition.ts +235 -0
  360. package/src/workflows/engine.ts +580 -0
  361. package/src/workflows/event-bus.ts +29 -0
  362. package/src/workflows/executors/agent-task.ts +103 -0
  363. package/src/workflows/executors/base.ts +86 -0
  364. package/src/workflows/executors/code-match.ts +88 -0
  365. package/src/workflows/executors/index.ts +16 -0
  366. package/src/workflows/executors/notify.ts +93 -0
  367. package/src/workflows/executors/property-match.ts +104 -0
  368. package/src/workflows/executors/raw-llm.ts +83 -0
  369. package/src/workflows/executors/registry.ts +76 -0
  370. package/src/workflows/executors/script.ts +103 -0
  371. package/src/workflows/executors/validate.ts +215 -0
  372. package/src/workflows/executors/vcs.ts +58 -0
  373. package/src/workflows/index.ts +61 -0
  374. package/src/workflows/input.ts +46 -0
  375. package/src/workflows/json-schema-validator.ts +118 -0
  376. package/src/workflows/recovery.ts +139 -0
  377. package/src/workflows/resume.ts +229 -0
  378. package/src/workflows/retry-poller.ts +216 -0
  379. package/src/workflows/template.ts +74 -0
  380. package/src/workflows/templates.ts +86 -0
  381. package/src/workflows/triggers.ts +124 -0
  382. package/src/workflows/validation.ts +104 -0
  383. package/src/workflows/version.ts +44 -0
  384. package/src/x402/cli.ts +140 -0
  385. package/src/x402/client.ts +192 -0
  386. package/src/x402/config.ts +131 -0
  387. package/src/x402/index.ts +37 -0
  388. package/src/x402/openfort-signer.ts +83 -0
  389. package/src/x402/spending-tracker.ts +109 -0
  390. package/templates/official/coder/CLAUDE.md +49 -0
  391. package/templates/official/coder/IDENTITY.md +28 -0
  392. package/templates/official/coder/SOUL.md +43 -0
  393. package/templates/official/coder/TOOLS.md +40 -0
  394. package/templates/official/coder/config.json +23 -0
  395. package/templates/official/coder/start-up.sh +23 -0
  396. package/templates/official/content-reviewer/CLAUDE.md +68 -0
  397. package/templates/official/content-reviewer/IDENTITY.md +28 -0
  398. package/templates/official/content-reviewer/SOUL.md +44 -0
  399. package/templates/official/content-reviewer/TOOLS.md +37 -0
  400. package/templates/official/content-reviewer/config.json +23 -0
  401. package/templates/official/content-reviewer/start-up.sh +23 -0
  402. package/templates/official/content-strategist/CLAUDE.md +63 -0
  403. package/templates/official/content-strategist/IDENTITY.md +33 -0
  404. package/templates/official/content-strategist/SOUL.md +48 -0
  405. package/templates/official/content-strategist/TOOLS.md +47 -0
  406. package/templates/official/content-strategist/config.json +23 -0
  407. package/templates/official/content-strategist/start-up.sh +23 -0
  408. package/templates/official/content-writer/CLAUDE.md +72 -0
  409. package/templates/official/content-writer/IDENTITY.md +30 -0
  410. package/templates/official/content-writer/SOUL.md +46 -0
  411. package/templates/official/content-writer/TOOLS.md +44 -0
  412. package/templates/official/content-writer/config.json +23 -0
  413. package/templates/official/content-writer/start-up.sh +23 -0
  414. package/templates/official/forward-deployed-engineer/CLAUDE.md +54 -0
  415. package/templates/official/forward-deployed-engineer/IDENTITY.md +37 -0
  416. package/templates/official/forward-deployed-engineer/SOUL.md +55 -0
  417. package/templates/official/forward-deployed-engineer/config.json +21 -0
  418. package/templates/official/lead/CLAUDE.md +33 -0
  419. package/templates/official/lead/IDENTITY.md +36 -0
  420. package/templates/official/lead/SOUL.md +51 -0
  421. package/templates/official/lead/config.json +22 -0
  422. package/templates/official/researcher/CLAUDE.md +46 -0
  423. package/templates/official/researcher/IDENTITY.md +28 -0
  424. package/templates/official/researcher/SOUL.md +43 -0
  425. package/templates/official/researcher/config.json +21 -0
  426. package/templates/official/reviewer/CLAUDE.md +63 -0
  427. package/templates/official/reviewer/IDENTITY.md +28 -0
  428. package/templates/official/reviewer/SOUL.md +45 -0
  429. package/templates/official/reviewer/config.json +21 -0
  430. package/templates/official/tester/CLAUDE.md +53 -0
  431. package/templates/official/tester/IDENTITY.md +28 -0
  432. package/templates/official/tester/SOUL.md +55 -0
  433. package/templates/official/tester/config.json +21 -0
  434. package/templates/schema.ts +35 -0
  435. package/.claude/settings.local.json +0 -115
  436. package/.dockerignore +0 -61
  437. package/.editorconfig +0 -15
  438. package/.env.docker.example +0 -39
  439. package/.env.example +0 -40
  440. package/.github/workflows/ci.yml +0 -76
  441. package/.github/workflows/docker-and-deploy.yml +0 -117
  442. package/.wts-config.json +0 -4
  443. package/.wts-setup.ts +0 -102
  444. package/CLAUDE.md +0 -104
  445. package/CONTRIBUTING.md +0 -270
  446. package/DEPLOYMENT.md +0 -605
  447. package/Dockerfile +0 -57
  448. package/Dockerfile.worker +0 -157
  449. package/FAQ.md +0 -19
  450. package/MCP.md +0 -406
  451. package/UI.md +0 -40
  452. package/assets/agent-swarm-logo-orange.png +0 -0
  453. package/assets/agent-swarm-logo.png +0 -0
  454. package/assets/agent-swarm.mp4 +0 -0
  455. package/assets/agent-swarm.png +0 -0
  456. package/biome.json +0 -39
  457. package/deploy/DEPLOY.md +0 -60
  458. package/deploy/agent-swarm.service +0 -17
  459. package/deploy/docker-push.ts +0 -30
  460. package/deploy/install.ts +0 -85
  461. package/deploy/prod-db.ts +0 -42
  462. package/deploy/uninstall.ts +0 -12
  463. package/deploy/update.ts +0 -21
  464. package/docker-compose.example.yml +0 -159
  465. package/docker-entrypoint.sh +0 -352
  466. package/ecosystem.config.cjs +0 -66
  467. package/plugin/README.md +0 -1
  468. package/plugin/hooks/hooks.json +0 -71
  469. package/pyproject.toml +0 -9
  470. package/scripts/generate-mcp-docs.ts +0 -415
  471. package/slack-manifest.json +0 -71
  472. package/src/tests/get-inbox-message.test.ts +0 -145
  473. package/src/tools/get-inbox-message.ts +0 -89
  474. package/src/tools/inbox-delegate.ts +0 -113
  475. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  476. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  477. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  478. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  479. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  480. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  481. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  482. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  483. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  484. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  485. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  486. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  487. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  488. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  489. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  490. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  491. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  492. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  493. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  494. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  495. package/thoughts/shared/research/.gitkeep +0 -0
  496. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  497. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  498. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  499. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  500. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  501. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  502. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  503. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  504. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  505. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  506. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  507. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  508. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  509. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  510. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  511. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  512. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  513. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  514. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  515. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  516. package/tsconfig.json +0 -37
  517. package/ui/CLAUDE.md +0 -49
  518. package/ui/bun.lock +0 -771
  519. package/ui/index.html +0 -22
  520. package/ui/package-lock.json +0 -5290
  521. package/ui/package.json +0 -33
  522. package/ui/pnpm-lock.yaml +0 -3341
  523. package/ui/postcss.config.js +0 -6
  524. package/ui/public/logo.png +0 -0
  525. package/ui/src/App.tsx +0 -63
  526. package/ui/src/components/ActivityFeed.tsx +0 -440
  527. package/ui/src/components/AgentDetailPanel.tsx +0 -733
  528. package/ui/src/components/AgentsPanel.tsx +0 -815
  529. package/ui/src/components/ChatPanel.tsx +0 -1920
  530. package/ui/src/components/ConfigModal.tsx +0 -253
  531. package/ui/src/components/Dashboard.tsx +0 -832
  532. package/ui/src/components/EditAgentProfileModal.tsx +0 -433
  533. package/ui/src/components/EpicDetailPage.tsx +0 -741
  534. package/ui/src/components/EpicsPanel.tsx +0 -566
  535. package/ui/src/components/Header.tsx +0 -160
  536. package/ui/src/components/JsonViewer.tsx +0 -171
  537. package/ui/src/components/ScheduledTaskDetailPanel.tsx +0 -517
  538. package/ui/src/components/ScheduledTasksPanel.tsx +0 -639
  539. package/ui/src/components/ServicesPanel.tsx +0 -622
  540. package/ui/src/components/SessionLogPanel.tsx +0 -1219
  541. package/ui/src/components/StatsBar.tsx +0 -321
  542. package/ui/src/components/StatusBadge.tsx +0 -168
  543. package/ui/src/components/TaskDetailPanel.tsx +0 -903
  544. package/ui/src/components/TasksPanel.tsx +0 -614
  545. package/ui/src/components/UsageCharts.tsx +0 -216
  546. package/ui/src/components/UsageTab.tsx +0 -394
  547. package/ui/src/hooks/queries.ts +0 -353
  548. package/ui/src/hooks/useAutoScroll.ts +0 -83
  549. package/ui/src/index.css +0 -257
  550. package/ui/src/lib/api.ts +0 -268
  551. package/ui/src/lib/config.ts +0 -35
  552. package/ui/src/lib/contentPreview.ts +0 -208
  553. package/ui/src/lib/theme.ts +0 -214
  554. package/ui/src/lib/utils.ts +0 -88
  555. package/ui/src/main.tsx +0 -28
  556. package/ui/src/types/api.ts +0 -323
  557. package/ui/src/vite-env.d.ts +0 -1
  558. package/ui/tailwind.config.js +0 -37
  559. package/ui/tsconfig.json +0 -31
  560. package/ui/vite.config.ts +0 -35
  561. /package/{thoughts/shared/plans → templates/community}/.gitkeep +0 -0
@@ -1,353 +0,0 @@
1
- import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2
- import { useMemo } from "react";
3
- import { api } from "../lib/api";
4
- import type { AgentWithTasks, SessionCost, UsageStats } from "../types/api";
5
-
6
- export function useAgents() {
7
- return useQuery({
8
- queryKey: ["agents"],
9
- queryFn: () => api.fetchAgents(true),
10
- select: (data) => data.agents as AgentWithTasks[],
11
- });
12
- }
13
-
14
- export function useAgent(id: string) {
15
- return useQuery({
16
- queryKey: ["agent", id],
17
- queryFn: () => api.fetchAgent(id),
18
- enabled: !!id,
19
- });
20
- }
21
-
22
- export function useUpdateAgentName() {
23
- const queryClient = useQueryClient();
24
-
25
- return useMutation({
26
- mutationFn: ({ id, name }: { id: string; name: string }) => api.updateAgentName(id, name),
27
- onSuccess: () => {
28
- queryClient.invalidateQueries({ queryKey: ["agents"] });
29
- queryClient.invalidateQueries({ queryKey: ["agent"] });
30
- },
31
- });
32
- }
33
-
34
- export function useUpdateAgentProfile() {
35
- const queryClient = useQueryClient();
36
-
37
- return useMutation({
38
- mutationFn: ({
39
- id,
40
- profile,
41
- }: {
42
- id: string;
43
- profile: { role?: string; description?: string; capabilities?: string[]; claudeMd?: string };
44
- }) => api.updateAgentProfile(id, profile),
45
- onSuccess: () => {
46
- queryClient.invalidateQueries({ queryKey: ["agents"] });
47
- queryClient.invalidateQueries({ queryKey: ["agent"] });
48
- },
49
- });
50
- }
51
-
52
- export interface TaskFilters {
53
- status?: string;
54
- agentId?: string;
55
- search?: string;
56
- }
57
-
58
- export function useTasks(filters?: TaskFilters) {
59
- return useQuery({
60
- queryKey: ["tasks", filters],
61
- queryFn: () => api.fetchTasks(filters),
62
- select: (data) => ({ tasks: data.tasks, total: data.total }),
63
- });
64
- }
65
-
66
- export function useTask(id: string) {
67
- return useQuery({
68
- queryKey: ["task", id],
69
- queryFn: () => api.fetchTask(id),
70
- enabled: !!id,
71
- });
72
- }
73
-
74
- export function useTaskSessionLogs(taskId: string) {
75
- return useQuery({
76
- queryKey: ["task", taskId, "session-logs"],
77
- queryFn: () => api.fetchTaskSessionLogs(taskId),
78
- enabled: !!taskId,
79
- refetchInterval: 5000, // Refresh every 5 seconds for live updates
80
- });
81
- }
82
-
83
- export function useLogs(limit = 50, agentId?: string) {
84
- return useQuery({
85
- queryKey: ["logs", limit, agentId],
86
- queryFn: () => api.fetchLogs(limit, agentId),
87
- select: (data) => data.logs,
88
- });
89
- }
90
-
91
- export function useStats() {
92
- return useQuery({
93
- queryKey: ["stats"],
94
- queryFn: () => api.fetchStats(),
95
- });
96
- }
97
-
98
- export function useHealth() {
99
- return useQuery({
100
- queryKey: ["health"],
101
- queryFn: () => api.checkHealth(),
102
- refetchInterval: 10000, // Check every 10 seconds
103
- retry: 2,
104
- retryDelay: 1000,
105
- });
106
- }
107
-
108
- export function useChannels() {
109
- return useQuery({
110
- queryKey: ["channels"],
111
- queryFn: () => api.fetchChannels(),
112
- select: (data) => data.channels,
113
- });
114
- }
115
-
116
- export interface MessageFilters {
117
- limit?: number;
118
- since?: string;
119
- before?: string;
120
- }
121
-
122
- export function useMessages(channelId: string, filters?: MessageFilters) {
123
- return useQuery({
124
- queryKey: ["messages", channelId, filters],
125
- queryFn: () => api.fetchMessages(channelId, filters),
126
- select: (data) => data.messages,
127
- enabled: !!channelId,
128
- });
129
- }
130
-
131
- const DEFAULT_MESSAGE_LIMIT = 100;
132
-
133
- export function useInfiniteMessages(channelId: string, pageSize = DEFAULT_MESSAGE_LIMIT) {
134
- return useInfiniteQuery({
135
- queryKey: ["infiniteMessages", channelId],
136
- queryFn: async ({ pageParam }) => {
137
- const result = await api.fetchMessages(channelId, {
138
- limit: pageSize,
139
- before: pageParam,
140
- });
141
- return result.messages;
142
- },
143
- initialPageParam: undefined as string | undefined,
144
- getNextPageParam: (lastPage) => {
145
- // If we got fewer messages than requested, there are no more
146
- if (lastPage.length < pageSize) return undefined;
147
- // Get the oldest message's createdAt for the next page
148
- const oldest = lastPage[0]; // Messages are in chronological order, first is oldest
149
- return oldest?.createdAt;
150
- },
151
- enabled: !!channelId,
152
- select: (data) => {
153
- // Flatten all pages and dedupe by id, keeping chronological order
154
- const allMessages = data.pages.flat();
155
- const seen = new Set<string>();
156
- const deduped = allMessages.filter((msg) => {
157
- if (seen.has(msg.id)) return false;
158
- seen.add(msg.id);
159
- return true;
160
- });
161
- // Sort chronologically (oldest first)
162
- return deduped.sort(
163
- (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),
164
- );
165
- },
166
- });
167
- }
168
-
169
- export function useThreadMessages(channelId: string, messageId: string) {
170
- return useQuery({
171
- queryKey: ["thread", channelId, messageId],
172
- queryFn: () => api.fetchThreadMessages(channelId, messageId),
173
- select: (data) => data.messages,
174
- enabled: !!channelId && !!messageId,
175
- });
176
- }
177
-
178
- export function usePostMessage(channelId: string) {
179
- const queryClient = useQueryClient();
180
-
181
- return useMutation({
182
- mutationFn: (params: {
183
- content: string;
184
- agentId?: string;
185
- replyToId?: string;
186
- mentions?: string[];
187
- }) =>
188
- api.postMessage(channelId, params.content, {
189
- agentId: params.agentId,
190
- replyToId: params.replyToId,
191
- mentions: params.mentions,
192
- }),
193
- onSuccess: (_data, variables) => {
194
- // Invalidate channel messages (both regular and infinite)
195
- queryClient.invalidateQueries({ queryKey: ["messages", channelId] });
196
- queryClient.invalidateQueries({ queryKey: ["infiniteMessages", channelId] });
197
- // Also invalidate thread if this was a reply
198
- if (variables.replyToId) {
199
- queryClient.invalidateQueries({ queryKey: ["thread", channelId, variables.replyToId] });
200
- }
201
- },
202
- });
203
- }
204
-
205
- export interface ServiceFilters {
206
- status?: string;
207
- agentId?: string;
208
- name?: string;
209
- }
210
-
211
- export function useServices(filters?: ServiceFilters) {
212
- return useQuery({
213
- queryKey: ["services", filters],
214
- queryFn: () => api.fetchServices(filters),
215
- select: (data) => data.services,
216
- });
217
- }
218
-
219
- // Session Cost hooks for Usage/Cost Tracking
220
-
221
- export interface SessionCostFilters {
222
- agentId?: string;
223
- taskId?: string;
224
- limit?: number;
225
- }
226
-
227
- export function useSessionCosts(filters?: SessionCostFilters) {
228
- return useQuery({
229
- queryKey: ["session-costs", filters],
230
- queryFn: () => api.fetchSessionCosts(filters),
231
- select: (data) => data.costs,
232
- });
233
- }
234
-
235
- // Helper function for aggregation
236
- function aggregateUsage(costs: SessionCost[]): UsageStats {
237
- return {
238
- totalCostUsd: costs.reduce((sum, c) => sum + c.totalCostUsd, 0),
239
- totalTokens: costs.reduce((sum, c) => sum + c.inputTokens + c.outputTokens, 0),
240
- inputTokens: costs.reduce((sum, c) => sum + c.inputTokens, 0),
241
- outputTokens: costs.reduce((sum, c) => sum + c.outputTokens, 0),
242
- cacheReadTokens: costs.reduce((sum, c) => sum + c.cacheReadTokens, 0),
243
- cacheWriteTokens: costs.reduce((sum, c) => sum + c.cacheWriteTokens, 0),
244
- sessionCount: costs.length,
245
- totalDurationMs: costs.reduce((sum, c) => sum + c.durationMs, 0),
246
- avgCostPerSession:
247
- costs.length > 0 ? costs.reduce((sum, c) => sum + c.totalCostUsd, 0) / costs.length : 0,
248
- };
249
- }
250
-
251
- // Hook for aggregated usage stats (monthly)
252
- export function useMonthlyUsageStats() {
253
- const { data: costs, ...rest } = useSessionCosts({ limit: 1000 });
254
-
255
- const stats = useMemo(() => {
256
- if (!costs) return null;
257
-
258
- const now = new Date();
259
- const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
260
-
261
- const monthlyCosts = costs.filter((c) => new Date(c.createdAt) >= startOfMonth);
262
-
263
- return {
264
- totalCostUsd: monthlyCosts.reduce((sum, c) => sum + c.totalCostUsd, 0),
265
- totalTokens: monthlyCosts.reduce((sum, c) => sum + c.inputTokens + c.outputTokens, 0),
266
- inputTokens: monthlyCosts.reduce((sum, c) => sum + c.inputTokens, 0),
267
- outputTokens: monthlyCosts.reduce((sum, c) => sum + c.outputTokens, 0),
268
- cacheReadTokens: monthlyCosts.reduce((sum, c) => sum + c.cacheReadTokens, 0),
269
- cacheWriteTokens: monthlyCosts.reduce((sum, c) => sum + c.cacheWriteTokens, 0),
270
- sessionCount: monthlyCosts.length,
271
- totalDurationMs: monthlyCosts.reduce((sum, c) => sum + c.durationMs, 0),
272
- avgCostPerSession:
273
- monthlyCosts.length > 0
274
- ? monthlyCosts.reduce((sum, c) => sum + c.totalCostUsd, 0) / monthlyCosts.length
275
- : 0,
276
- };
277
- }, [costs]);
278
-
279
- return { data: stats, ...rest };
280
- }
281
-
282
- // Hook for agent usage summary
283
- export function useAgentUsageSummary(agentId: string) {
284
- return useQuery({
285
- queryKey: ["agent-usage", agentId],
286
- queryFn: () => api.fetchSessionCosts({ agentId, limit: 500 }),
287
- select: (data) => {
288
- const costs = data.costs;
289
- const now = new Date();
290
- const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
291
- const startOfWeek = new Date(now);
292
- startOfWeek.setDate(now.getDate() - now.getDay());
293
- const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate());
294
-
295
- const filterByDate = (start: Date) => costs.filter((c) => new Date(c.createdAt) >= start);
296
-
297
- return {
298
- daily: aggregateUsage(filterByDate(startOfDay)),
299
- weekly: aggregateUsage(filterByDate(startOfWeek)),
300
- monthly: aggregateUsage(filterByDate(startOfMonth)),
301
- all: aggregateUsage(costs),
302
- };
303
- },
304
- enabled: !!agentId,
305
- });
306
- }
307
-
308
- // Hook for task usage
309
- export function useTaskUsage(taskId: string) {
310
- return useQuery({
311
- queryKey: ["task-usage", taskId],
312
- queryFn: () => api.fetchSessionCosts({ taskId }),
313
- select: (data) => aggregateUsage(data.costs),
314
- enabled: !!taskId,
315
- });
316
- }
317
-
318
- // Scheduled Tasks hooks
319
- export interface ScheduledTaskFilters {
320
- enabled?: boolean;
321
- name?: string;
322
- }
323
-
324
- export function useScheduledTasks(filters?: ScheduledTaskFilters) {
325
- return useQuery({
326
- queryKey: ["scheduled-tasks", filters],
327
- queryFn: () => api.fetchScheduledTasks(filters),
328
- select: (data) => data.scheduledTasks,
329
- });
330
- }
331
-
332
- // Epic hooks
333
- export interface EpicFilters {
334
- status?: string;
335
- search?: string;
336
- leadAgentId?: string;
337
- }
338
-
339
- export function useEpics(filters?: EpicFilters) {
340
- return useQuery({
341
- queryKey: ["epics", filters],
342
- queryFn: () => api.fetchEpics(filters),
343
- select: (data) => ({ epics: data.epics, total: data.total }),
344
- });
345
- }
346
-
347
- export function useEpic(id: string) {
348
- return useQuery({
349
- queryKey: ["epic", id],
350
- queryFn: () => api.fetchEpic(id),
351
- enabled: !!id,
352
- });
353
- }
@@ -1,83 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState } from "react";
2
-
3
- interface UseAutoScrollResult {
4
- /** Whether auto-scroll is currently following new content */
5
- isFollowing: boolean;
6
- /** Manually scroll to bottom and re-enable auto-follow */
7
- scrollToBottom: () => void;
8
- }
9
-
10
- /**
11
- * Auto-scroll hook that scrolls to bottom when dependencies change,
12
- * but only if the user was already at/near the bottom.
13
- * If user has scrolled up to read history, it won't interrupt them.
14
- *
15
- * Returns state and controls to show a "Follow" button when auto-scroll is disabled.
16
- *
17
- * @param element - The scrollable element ref
18
- * @param deps - Array of dependencies that trigger scroll check
19
- * @returns Object with isFollowing state and scrollToBottom function
20
- */
21
- export function useAutoScroll(
22
- element: HTMLDivElement | null,
23
- deps: unknown[],
24
- ): UseAutoScrollResult {
25
- const [isFollowing, setIsFollowing] = useState(true);
26
- const hasInitializedRef = useRef(false);
27
-
28
- // Track scroll position to determine if user is near bottom
29
- const handleScroll = useCallback(() => {
30
- if (element) {
31
- const { scrollTop, scrollHeight, clientHeight } = element;
32
- // Consider "near bottom" if within 100px of the bottom
33
- const nearBottom = scrollHeight - scrollTop - clientHeight < 100;
34
- setIsFollowing(nearBottom);
35
- }
36
- }, [element]);
37
-
38
- // Manual scroll to bottom function
39
- const scrollToBottom = useCallback(() => {
40
- if (element) {
41
- element.scrollTo({
42
- top: element.scrollHeight,
43
- behavior: "smooth",
44
- });
45
- setIsFollowing(true);
46
- }
47
- }, [element]);
48
-
49
- // Attach scroll listener
50
- useEffect(() => {
51
- if (!element) return;
52
-
53
- element.addEventListener("scroll", handleScroll);
54
- return () => element.removeEventListener("scroll", handleScroll);
55
- }, [element, handleScroll]);
56
-
57
- // Auto-scroll when dependencies change
58
- useEffect(() => {
59
- if (!element) return;
60
-
61
- const doScrollToBottom = () => {
62
- setTimeout(() => {
63
- element.scrollTo({
64
- top: element.scrollHeight,
65
- behavior: hasInitializedRef.current ? "smooth" : "instant",
66
- });
67
- }, 50);
68
- };
69
-
70
- if (!hasInitializedRef.current) {
71
- // Initial load - scroll to bottom immediately
72
- doScrollToBottom();
73
- hasInitializedRef.current = true;
74
- setIsFollowing(true);
75
- } else if (isFollowing) {
76
- // Subsequent updates - only scroll if user was near bottom
77
- doScrollToBottom();
78
- }
79
- // eslint-disable-next-line react-hooks/exhaustive-deps
80
- }, [element, isFollowing, ...deps]);
81
-
82
- return { isFollowing, scrollToBottom };
83
- }
package/ui/src/index.css DELETED
@@ -1,257 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- :root {
6
- /* Beehive color palette - dark mode defaults */
7
- --hive-amber: #f5a623;
8
- --hive-honey: #ffb84d;
9
- --hive-gold: #d4a574;
10
- --hive-deep: #c67c00;
11
- --hive-rust: #a85454;
12
- --hive-blue: #3b82f6;
13
- --hive-cream: #fff8e7;
14
- --hive-body: #0d0906;
15
- --hive-surface: #1a130e;
16
- --hive-earth: #251c15;
17
- --hive-border: #3a2d1f;
18
- --hive-text-primary: #fff8e7;
19
- --hive-text-secondary: #c9b896;
20
- --hive-text-tertiary: #8b7355;
21
-
22
- font-family: "Space Grotesk", sans-serif;
23
- font-synthesis: none;
24
- text-rendering: optimizeLegibility;
25
- -webkit-font-smoothing: antialiased;
26
- -moz-osx-font-smoothing: grayscale;
27
- }
28
-
29
- /* Light mode color overrides */
30
- [data-joy-color-scheme="light"] {
31
- --hive-amber: #d48806;
32
- --hive-honey: #b87300;
33
- --hive-gold: #8b6914;
34
- --hive-deep: #9a5f00;
35
- --hive-rust: #b54242;
36
- --hive-cream: #1a130e;
37
- --hive-body: #fdf8f3;
38
- --hive-surface: #ffffff;
39
- --hive-earth: #f5ede4;
40
- --hive-border: #e5d9ca;
41
- --hive-text-primary: #1a130e;
42
- --hive-text-secondary: #5c4a3d;
43
- --hive-text-tertiary: #8b7355;
44
- }
45
-
46
- body {
47
- margin: 0;
48
- background: var(--hive-body);
49
- color: var(--hive-text-primary);
50
- min-height: 100vh;
51
- }
52
-
53
- /* Honeycomb pattern background */
54
- .honeycomb-bg {
55
- position: relative;
56
- }
57
-
58
- .honeycomb-bg::before {
59
- content: "";
60
- position: absolute;
61
- inset: 0;
62
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23F5A623' fill-opacity='0.08'%3E%3Cpath d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
63
- pointer-events: none;
64
- z-index: 0;
65
- }
66
-
67
- /* Light mode honeycomb pattern - darker color */
68
- [data-joy-color-scheme="light"] .honeycomb-bg::before {
69
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='49' viewBox='0 0 28 49'%3E%3Cg fill-rule='evenodd'%3E%3Cg fill='%23D48806' fill-opacity='0.1'%3E%3Cpath d='M13.99 9.25l13 7.5v15l-13 7.5L1 31.75v-15l12.99-7.5zM3 17.9v12.7l10.99 6.34 11-6.35V17.9l-11-6.34L3 17.9zM0 15l12.98-7.5V0h-2v6.35L0 12.69v2.3zm0 18.5L12.98 41v8h-2v-6.85L0 35.81v-2.3zM15 0v7.5L27.99 15H28v-2.31h-.01L17 6.35V0h-2zm0 49v-8l12.99-7.5H28v2.31h-.01L17 42.15V49h-2z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
70
- }
71
-
72
- .honeycomb-bg > * {
73
- position: relative;
74
- z-index: 1;
75
- }
76
-
77
- /* Warm amber scrollbar */
78
- ::-webkit-scrollbar {
79
- width: 8px;
80
- height: 8px;
81
- }
82
-
83
- ::-webkit-scrollbar-track {
84
- background: var(--hive-body);
85
- }
86
-
87
- ::-webkit-scrollbar-thumb {
88
- background: var(--hive-border);
89
- border-radius: 4px;
90
- }
91
-
92
- ::-webkit-scrollbar-thumb:hover {
93
- background: var(--hive-text-tertiary);
94
- }
95
-
96
- /* Amber glow effects */
97
- .glow-amber {
98
- text-shadow:
99
- 0 0 10px rgba(245, 166, 35, 0.5),
100
- 0 0 20px rgba(245, 166, 35, 0.3);
101
- }
102
-
103
- .glow-gold {
104
- text-shadow:
105
- 0 0 10px rgba(212, 165, 116, 0.5),
106
- 0 0 20px rgba(212, 165, 116, 0.3);
107
- }
108
-
109
- .glow-rust {
110
- text-shadow:
111
- 0 0 10px rgba(168, 84, 84, 0.5),
112
- 0 0 20px rgba(168, 84, 84, 0.3);
113
- }
114
-
115
- .glow-blue {
116
- text-shadow:
117
- 0 0 10px rgba(59, 130, 246, 0.5),
118
- 0 0 20px rgba(59, 130, 246, 0.3);
119
- }
120
-
121
- /* Box glow effects */
122
- .box-glow-amber {
123
- box-shadow:
124
- 0 0 15px rgba(245, 166, 35, 0.3),
125
- 0 0 30px rgba(245, 166, 35, 0.15);
126
- }
127
-
128
- .box-glow-gold {
129
- box-shadow:
130
- 0 0 15px rgba(212, 165, 116, 0.3),
131
- 0 0 30px rgba(212, 165, 116, 0.15);
132
- }
133
-
134
- /* Breathing animation for active elements */
135
- @keyframes breathe {
136
- 0%,
137
- 100% {
138
- opacity: 0.85;
139
- transform: scale(1);
140
- }
141
- 50% {
142
- opacity: 1;
143
- transform: scale(1.02);
144
- }
145
- }
146
-
147
- .animate-breathe {
148
- animation: breathe 3s ease-in-out infinite;
149
- }
150
-
151
- /* Pulse animation */
152
- @keyframes pulse-amber {
153
- 0%,
154
- 100% {
155
- box-shadow: 0 0 5px rgba(245, 166, 35, 0.4);
156
- }
157
- 50% {
158
- box-shadow:
159
- 0 0 15px rgba(245, 166, 35, 0.6),
160
- 0 0 25px rgba(245, 166, 35, 0.3);
161
- }
162
- }
163
-
164
- .animate-pulse-amber {
165
- animation: pulse-amber 2s ease-in-out infinite;
166
- }
167
-
168
- /* Heartbeat animation for connection status */
169
- @keyframes heartbeat {
170
- 0%,
171
- 100% {
172
- transform: scale(1);
173
- }
174
- 14% {
175
- transform: scale(1.1);
176
- }
177
- 28% {
178
- transform: scale(1);
179
- }
180
- 42% {
181
- transform: scale(1.1);
182
- }
183
- 70% {
184
- transform: scale(1);
185
- }
186
- }
187
-
188
- .animate-heartbeat {
189
- animation: heartbeat 1.5s ease-in-out infinite;
190
- }
191
-
192
- /* Hexagonal clip path utility */
193
- .clip-hex {
194
- clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
195
- }
196
-
197
- /* Hexagonal border (using drop-shadow trick) */
198
- .hex-border {
199
- position: relative;
200
- }
201
-
202
- .hex-border::before {
203
- content: "";
204
- position: absolute;
205
- inset: -2px;
206
- clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
207
- background: linear-gradient(135deg, var(--hive-amber) 0%, var(--hive-deep) 100%);
208
- z-index: -1;
209
- }
210
-
211
- /* Gradient text for headers */
212
- .text-gradient-amber {
213
- background: linear-gradient(
214
- 135deg,
215
- var(--hive-amber) 0%,
216
- var(--hive-honey) 50%,
217
- var(--hive-deep) 100%
218
- );
219
- -webkit-background-clip: text;
220
- background-clip: text;
221
- -webkit-text-fill-color: transparent;
222
- }
223
-
224
- /* Card hover effect */
225
- .card-hover {
226
- transition: all 0.3s ease;
227
- }
228
-
229
- .card-hover:hover {
230
- border-color: rgba(245, 166, 35, 0.3);
231
- box-shadow: 0 0 20px rgba(245, 166, 35, 0.1);
232
- }
233
-
234
- /* Table row hover */
235
- .row-hover {
236
- transition: background-color 0.2s ease;
237
- }
238
-
239
- .row-hover:hover {
240
- background-color: rgba(245, 166, 35, 0.05);
241
- }
242
-
243
- /* Focus ring */
244
- .focus-amber:focus-visible {
245
- outline: 2px solid var(--hive-amber);
246
- outline-offset: 2px;
247
- }
248
-
249
- /* Subtle grain overlay for texture */
250
- .grain-overlay::after {
251
- content: "";
252
- position: absolute;
253
- inset: 0;
254
- background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.02'/%3E%3C/svg%3E");
255
- pointer-events: none;
256
- z-index: 0;
257
- }