@meetquinn/animactl 0.1.2 → 0.1.3

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 (289) hide show
  1. package/README.md +11 -6
  2. package/dist/server/{runtime/activity-payload.d.ts → activities/format.d.ts} +4 -1
  3. package/dist/server/activities/format.d.ts.map +1 -0
  4. package/dist/server/{runtime/activity-payload.js → activities/format.js} +16 -1
  5. package/dist/server/agents/agent-skills.d.ts +7 -3
  6. package/dist/server/agents/agent-skills.d.ts.map +1 -1
  7. package/dist/server/agents/agent-skills.js +243 -38
  8. package/dist/server/agents/agent-slack.service.d.ts +15 -0
  9. package/dist/server/agents/agent-slack.service.d.ts.map +1 -1
  10. package/dist/server/agents/agent-slack.service.js +43 -6
  11. package/dist/server/agents/default-skills.d.ts +9 -0
  12. package/dist/server/agents/default-skills.d.ts.map +1 -0
  13. package/dist/server/agents/default-skills.js +52 -0
  14. package/dist/server/cli/runtime-cli.d.ts +7 -1
  15. package/dist/server/cli/runtime-cli.d.ts.map +1 -1
  16. package/dist/server/cli/runtime-cli.js +107 -3
  17. package/dist/server/cli/services-cli.d.ts.map +1 -1
  18. package/dist/server/cli/services-cli.js +39 -0
  19. package/dist/server/inbox/slack-subscriber.d.ts +2 -0
  20. package/dist/server/inbox/slack-subscriber.d.ts.map +1 -1
  21. package/dist/server/inbox/slack-subscriber.js +28 -2
  22. package/dist/server/inbox/slack-subscription.service.d.ts.map +1 -1
  23. package/dist/server/inbox/slack-subscription.service.js +13 -1
  24. package/dist/server/inbox/wake-queue.service.d.ts +3 -1
  25. package/dist/server/inbox/wake-queue.service.d.ts.map +1 -1
  26. package/dist/server/inbox/wake-queue.service.js +5 -3
  27. package/dist/server/provider-usage/http.d.ts +1 -0
  28. package/dist/server/provider-usage/http.d.ts.map +1 -1
  29. package/dist/server/provider-usage/http.js +23 -1
  30. package/dist/server/provider-usage/provider-usage.service.d.ts +1 -4
  31. package/dist/server/provider-usage/provider-usage.service.d.ts.map +1 -1
  32. package/dist/server/provider-usage/provider-usage.service.js +1 -18
  33. package/dist/server/provider-usage/providers/claude.d.ts +1 -1
  34. package/dist/server/provider-usage/providers/claude.d.ts.map +1 -1
  35. package/dist/server/provider-usage/providers/claude.js +1 -1
  36. package/dist/server/provider-usage/providers/codex.d.ts +1 -1
  37. package/dist/server/provider-usage/providers/codex.d.ts.map +1 -1
  38. package/dist/server/provider-usage/providers/codex.js +1 -1
  39. package/dist/server/provider-usage/providers/kimi.d.ts +1 -1
  40. package/dist/server/provider-usage/providers/kimi.d.ts.map +1 -1
  41. package/dist/server/provider-usage/providers/kimi.js +4 -4
  42. package/dist/server/provider-usage/result.d.ts +5 -0
  43. package/dist/server/provider-usage/result.d.ts.map +1 -0
  44. package/dist/server/provider-usage/result.js +18 -0
  45. package/dist/server/providers/active-runtime.d.ts +1 -1
  46. package/dist/server/providers/active-runtime.d.ts.map +1 -1
  47. package/dist/server/providers/claude-events.d.ts +1 -1
  48. package/dist/server/providers/claude-events.d.ts.map +1 -1
  49. package/dist/server/providers/claude-events.js +2 -2
  50. package/dist/server/providers/claude.d.ts +1 -1
  51. package/dist/server/providers/claude.d.ts.map +1 -1
  52. package/dist/server/providers/claude.js +2 -2
  53. package/dist/server/providers/codex-app-server.d.ts +1 -1
  54. package/dist/server/providers/codex-app-server.d.ts.map +1 -1
  55. package/dist/server/providers/codex-app-server.js +1 -1
  56. package/dist/server/providers/codex-events.js +1 -1
  57. package/dist/server/providers/codex.d.ts +1 -1
  58. package/dist/server/providers/codex.d.ts.map +1 -1
  59. package/dist/server/providers/codex.js +2 -2
  60. package/dist/server/{runtime/provider-contract.d.ts → providers/contract.d.ts} +1 -1
  61. package/dist/server/providers/contract.d.ts.map +1 -0
  62. package/dist/server/providers/factory.d.ts +1 -1
  63. package/dist/server/providers/factory.d.ts.map +1 -1
  64. package/dist/server/providers/kimi-events.d.ts +1 -1
  65. package/dist/server/providers/kimi-events.d.ts.map +1 -1
  66. package/dist/server/providers/kimi-events.js +1 -1
  67. package/dist/server/providers/kimi.d.ts +1 -1
  68. package/dist/server/providers/kimi.d.ts.map +1 -1
  69. package/dist/server/providers/kimi.js +3 -2
  70. package/dist/server/providers/reasoning-events.js +1 -1
  71. package/dist/server/runtime/active-run-control.d.ts +19 -0
  72. package/dist/server/runtime/active-run-control.d.ts.map +1 -0
  73. package/dist/server/runtime/active-run-control.js +89 -0
  74. package/dist/server/runtime/activity.js +1 -1
  75. package/dist/server/runtime/agent-runner.d.ts +1 -1
  76. package/dist/server/runtime/agent-runner.d.ts.map +1 -1
  77. package/dist/server/runtime/delivery-prompt.d.ts +6 -0
  78. package/dist/server/runtime/delivery-prompt.d.ts.map +1 -1
  79. package/dist/server/runtime/delivery-prompt.js +53 -34
  80. package/dist/server/runtime/followup-appender.d.ts +20 -0
  81. package/dist/server/runtime/followup-appender.d.ts.map +1 -0
  82. package/dist/server/runtime/followup-appender.js +128 -0
  83. package/dist/server/runtime/host.d.ts +2 -0
  84. package/dist/server/runtime/host.d.ts.map +1 -1
  85. package/dist/server/runtime/host.js +8 -0
  86. package/dist/server/runtime/provider-runner.d.ts +16 -0
  87. package/dist/server/runtime/provider-runner.d.ts.map +1 -0
  88. package/dist/server/runtime/provider-runner.js +86 -0
  89. package/dist/server/runtime/runtime-bridge.d.ts +1 -1
  90. package/dist/server/runtime/runtime-bridge.d.ts.map +1 -1
  91. package/dist/server/runtime/runtime-session.service.d.ts +1 -1
  92. package/dist/server/runtime/runtime-session.service.d.ts.map +1 -1
  93. package/dist/server/runtime/runtime-session.service.js +1 -1
  94. package/dist/server/runtime/runtime-worker.d.ts +2 -10
  95. package/dist/server/runtime/runtime-worker.d.ts.map +1 -1
  96. package/dist/server/runtime/runtime-worker.js +60 -286
  97. package/dist/server/runtime-management/managed-runtime.d.ts.map +1 -0
  98. package/dist/server/runtime-management/runtime-release.d.ts.map +1 -0
  99. package/dist/server/{runtime → runtime-management}/runtime-upgrade.d.ts +1 -0
  100. package/dist/server/runtime-management/runtime-upgrade.d.ts.map +1 -0
  101. package/dist/server/{runtime → runtime-management}/runtime-upgrade.js +14 -0
  102. package/dist/server/services/system.service.d.ts +41 -0
  103. package/dist/server/services/system.service.d.ts.map +1 -0
  104. package/dist/server/services/system.service.js +154 -0
  105. package/dist/server/settings/settings.service.d.ts +2 -1
  106. package/dist/server/settings/settings.service.d.ts.map +1 -1
  107. package/dist/server/settings/settings.service.js +9 -1
  108. package/dist/server/slack/shortcuts.d.ts +0 -3
  109. package/dist/server/slack/shortcuts.d.ts.map +1 -1
  110. package/dist/server/slack/shortcuts.js +0 -3
  111. package/dist/server/slack-interactions/shortcut-ids.d.ts +4 -0
  112. package/dist/server/slack-interactions/shortcut-ids.d.ts.map +1 -0
  113. package/dist/server/slack-interactions/shortcut-ids.js +3 -0
  114. package/dist/server/slack-interactions/shortcut-views.d.ts +65 -0
  115. package/dist/server/slack-interactions/shortcut-views.d.ts.map +1 -0
  116. package/dist/server/slack-interactions/shortcut-views.js +211 -0
  117. package/dist/server/{slack → slack-interactions}/shortcut.service.d.ts +2 -47
  118. package/dist/server/slack-interactions/shortcut.service.d.ts.map +1 -0
  119. package/dist/server/slack-interactions/shortcut.service.js +227 -0
  120. package/dist/server/storage/jsonl-log.d.ts +9 -0
  121. package/dist/server/storage/jsonl-log.d.ts.map +1 -1
  122. package/dist/server/storage/jsonl-log.js +36 -1
  123. package/dist/server/storage/schema/server.store.d.ts +5 -0
  124. package/dist/server/storage/schema/server.store.d.ts.map +1 -1
  125. package/dist/server/storage/schema/server.store.js +2 -1
  126. package/dist/server/storage/schema/wake-queue.store.d.ts +15 -1
  127. package/dist/server/storage/schema/wake-queue.store.d.ts.map +1 -1
  128. package/dist/server/storage/schema/wake-queue.store.js +5 -3
  129. package/dist/server/tests/agent-config.test.d.ts +2 -0
  130. package/dist/server/tests/agent-config.test.d.ts.map +1 -0
  131. package/dist/server/tests/agent-config.test.js +229 -0
  132. package/dist/server/tests/agent-runtime.test.d.ts +2 -0
  133. package/dist/server/tests/agent-runtime.test.d.ts.map +1 -0
  134. package/dist/server/tests/agent-runtime.test.js +1110 -0
  135. package/dist/server/tests/agent-seed-memory.test.d.ts +2 -0
  136. package/dist/server/tests/agent-seed-memory.test.d.ts.map +1 -0
  137. package/dist/server/tests/agent-seed-memory.test.js +16 -0
  138. package/dist/server/tests/agent-skills.test.d.ts +2 -0
  139. package/dist/server/tests/agent-skills.test.d.ts.map +1 -0
  140. package/dist/server/tests/agent-skills.test.js +140 -0
  141. package/dist/server/tests/anima-home.d.ts +2 -0
  142. package/dist/server/tests/anima-home.d.ts.map +1 -0
  143. package/dist/server/tests/anima-home.js +4 -0
  144. package/dist/server/tests/cli-file.test.d.ts +2 -0
  145. package/dist/server/tests/cli-file.test.d.ts.map +1 -0
  146. package/dist/server/tests/cli-file.test.js +596 -0
  147. package/dist/server/tests/cli-message.test.d.ts +2 -0
  148. package/dist/server/tests/cli-message.test.d.ts.map +1 -0
  149. package/dist/server/tests/cli-message.test.js +1196 -0
  150. package/dist/server/tests/client-error-routes.test.d.ts +2 -0
  151. package/dist/server/tests/client-error-routes.test.d.ts.map +1 -0
  152. package/dist/server/tests/client-error-routes.test.js +163 -0
  153. package/dist/server/tests/config.test.d.ts +2 -0
  154. package/dist/server/tests/config.test.d.ts.map +1 -0
  155. package/dist/server/tests/config.test.js +497 -0
  156. package/dist/server/tests/default-skills.test.d.ts +2 -0
  157. package/dist/server/tests/default-skills.test.d.ts.map +1 -0
  158. package/dist/server/tests/default-skills.test.js +57 -0
  159. package/dist/server/tests/helpers/inbox.d.ts +10 -0
  160. package/dist/server/tests/helpers/inbox.d.ts.map +1 -0
  161. package/dist/server/tests/helpers/inbox.js +21 -0
  162. package/dist/server/tests/helpers/slack.d.ts +11 -0
  163. package/dist/server/tests/helpers/slack.d.ts.map +1 -0
  164. package/dist/server/tests/helpers/slack.js +17 -0
  165. package/dist/server/tests/helpers/state.d.ts +19 -0
  166. package/dist/server/tests/helpers/state.d.ts.map +1 -0
  167. package/dist/server/tests/helpers/state.js +69 -0
  168. package/dist/server/tests/inbox-slack-events.test.d.ts +2 -0
  169. package/dist/server/tests/inbox-slack-events.test.d.ts.map +1 -0
  170. package/dist/server/tests/inbox-slack-events.test.js +271 -0
  171. package/dist/server/tests/inbox.test.d.ts +2 -0
  172. package/dist/server/tests/inbox.test.d.ts.map +1 -0
  173. package/dist/server/tests/inbox.test.js +144 -0
  174. package/dist/server/tests/interactive-ask.test.d.ts +2 -0
  175. package/dist/server/tests/interactive-ask.test.d.ts.map +1 -0
  176. package/dist/server/tests/interactive-ask.test.js +387 -0
  177. package/dist/server/tests/kb.test.d.ts +2 -0
  178. package/dist/server/tests/kb.test.d.ts.map +1 -0
  179. package/dist/server/tests/kb.test.js +371 -0
  180. package/dist/server/tests/message.service.test.d.ts +2 -0
  181. package/dist/server/tests/message.service.test.d.ts.map +1 -0
  182. package/dist/server/tests/message.service.test.js +151 -0
  183. package/dist/server/tests/messages.test.d.ts +2 -0
  184. package/dist/server/tests/messages.test.d.ts.map +1 -0
  185. package/dist/server/tests/messages.test.js +12 -0
  186. package/dist/server/tests/prompt-attachments.test.d.ts +2 -0
  187. package/dist/server/tests/prompt-attachments.test.d.ts.map +1 -0
  188. package/dist/server/tests/prompt-attachments.test.js +274 -0
  189. package/dist/server/tests/provider-usage.test.d.ts +2 -0
  190. package/dist/server/tests/provider-usage.test.d.ts.map +1 -0
  191. package/dist/server/tests/provider-usage.test.js +97 -0
  192. package/dist/server/tests/reminders.test.d.ts +2 -0
  193. package/dist/server/tests/reminders.test.d.ts.map +1 -0
  194. package/dist/server/tests/reminders.test.js +383 -0
  195. package/dist/server/tests/runtime-cli.test.d.ts +2 -0
  196. package/dist/server/tests/runtime-cli.test.d.ts.map +1 -0
  197. package/dist/server/tests/runtime-cli.test.js +21 -0
  198. package/dist/server/tests/runtime-upgrade.test.d.ts +2 -0
  199. package/dist/server/tests/runtime-upgrade.test.d.ts.map +1 -0
  200. package/dist/server/tests/runtime-upgrade.test.js +307 -0
  201. package/dist/server/tests/runtime-worker.test.d.ts +2 -0
  202. package/dist/server/tests/runtime-worker.test.d.ts.map +1 -0
  203. package/dist/server/tests/runtime-worker.test.js +1021 -0
  204. package/dist/server/tests/runtime.test.d.ts +2 -0
  205. package/dist/server/tests/runtime.test.d.ts.map +1 -0
  206. package/dist/server/tests/runtime.test.js +354 -0
  207. package/dist/server/tests/services.test.d.ts +2 -0
  208. package/dist/server/tests/services.test.d.ts.map +1 -0
  209. package/dist/server/tests/services.test.js +636 -0
  210. package/dist/server/tests/slack-files.test.d.ts +2 -0
  211. package/dist/server/tests/slack-files.test.d.ts.map +1 -0
  212. package/dist/server/tests/slack-files.test.js +118 -0
  213. package/dist/server/tests/slack-shortcuts.test.d.ts +2 -0
  214. package/dist/server/tests/slack-shortcuts.test.d.ts.map +1 -0
  215. package/dist/server/tests/slack-shortcuts.test.js +310 -0
  216. package/dist/server/tests/slack.test.d.ts +2 -0
  217. package/dist/server/tests/slack.test.d.ts.map +1 -0
  218. package/dist/server/tests/slack.test.js +213 -0
  219. package/dist/server/tests/state-cache.test.d.ts +2 -0
  220. package/dist/server/tests/state-cache.test.d.ts.map +1 -0
  221. package/dist/server/tests/state-cache.test.js +184 -0
  222. package/dist/server/tests/subscriptions.test.d.ts +2 -0
  223. package/dist/server/tests/subscriptions.test.d.ts.map +1 -0
  224. package/dist/server/tests/subscriptions.test.js +292 -0
  225. package/dist/server/tests/system-service.test.d.ts +2 -0
  226. package/dist/server/tests/system-service.test.d.ts.map +1 -0
  227. package/dist/server/tests/system-service.test.js +20 -0
  228. package/dist/server/tests/url-routes.test.d.ts +2 -0
  229. package/dist/server/tests/url-routes.test.d.ts.map +1 -0
  230. package/dist/server/tests/url-routes.test.js +217 -0
  231. package/dist/server/tests/web-api.test.d.ts +2 -0
  232. package/dist/server/tests/web-api.test.d.ts.map +1 -0
  233. package/dist/server/tests/web-api.test.js +1759 -0
  234. package/dist/server/web/app.d.ts.map +1 -1
  235. package/dist/server/web/app.js +2 -0
  236. package/dist/server/web/client-error-routes.d.ts +3 -0
  237. package/dist/server/web/client-error-routes.d.ts.map +1 -0
  238. package/dist/server/web/client-error-routes.js +101 -0
  239. package/dist/server/web/system-routes.d.ts.map +1 -1
  240. package/dist/server/web/system-routes.js +21 -131
  241. package/dist/shared/agent-config.d.ts +8 -18
  242. package/dist/shared/agent-config.d.ts.map +1 -1
  243. package/dist/shared/agent-config.js +3 -4
  244. package/dist/shared/inbox.d.ts +27 -0
  245. package/dist/shared/inbox.d.ts.map +1 -1
  246. package/dist/shared/inbox.js +1 -0
  247. package/dist/shared/server-info.d.ts +6 -5
  248. package/dist/shared/server-info.d.ts.map +1 -1
  249. package/dist/shared/server-info.js +3 -1
  250. package/dist/shared/server-settings.d.ts +6 -0
  251. package/dist/shared/server-settings.d.ts.map +1 -1
  252. package/dist/shared/server-settings.js +1 -0
  253. package/dist/shared/skills.d.ts +24 -3
  254. package/dist/shared/skills.d.ts.map +1 -1
  255. package/dist/web/assets/activity-DHjip8tY.js +7 -0
  256. package/dist/web/assets/clipboard-D2NSC52v.js +1 -0
  257. package/dist/web/assets/{external-link-Dt0qTpmV.js → external-link-Bhr1WdRS.js} +1 -1
  258. package/dist/web/assets/{file-text-Dd9ys6py.js → file-text-CYMA_SMA.js} +1 -1
  259. package/dist/web/assets/{index-CzAQnbuO.js → index-CVpew409.js} +5 -5
  260. package/dist/web/assets/index-mh0uJTkY.css +2 -0
  261. package/dist/web/assets/kb-DDVpYkT9.js +35 -0
  262. package/dist/web/assets/profile-CBy6GNzp.js +1 -0
  263. package/dist/web/assets/reminders-Bbwb9QNT.js +1 -0
  264. package/dist/web/favicon.svg +1 -1
  265. package/dist/web/index.html +2 -2
  266. package/package.json +1 -1
  267. package/templates/runtime-standing-prompt.md +16 -2
  268. package/templates/skills/find-skills/SKILL.md +133 -0
  269. package/dist/server/runtime/activity-payload.d.ts.map +0 -1
  270. package/dist/server/runtime/activity-text.d.ts +0 -4
  271. package/dist/server/runtime/activity-text.d.ts.map +0 -1
  272. package/dist/server/runtime/activity-text.js +0 -16
  273. package/dist/server/runtime/managed-runtime.d.ts.map +0 -1
  274. package/dist/server/runtime/provider-contract.d.ts.map +0 -1
  275. package/dist/server/runtime/runtime-release.d.ts.map +0 -1
  276. package/dist/server/runtime/runtime-upgrade.d.ts.map +0 -1
  277. package/dist/server/slack/shortcut.service.d.ts.map +0 -1
  278. package/dist/server/slack/shortcut.service.js +0 -493
  279. package/dist/web/assets/activity-BP0C81IV.js +0 -7
  280. package/dist/web/assets/globe-DmDZSgDP.js +0 -1
  281. package/dist/web/assets/index-DKecrvN0.css +0 -2
  282. package/dist/web/assets/kb-3wFeP2Jt.js +0 -32
  283. package/dist/web/assets/profile-D7wPZXW_.js +0 -1
  284. package/dist/web/assets/reminders-DOhroVwo.js +0 -1
  285. /package/dist/server/{runtime/provider-contract.js → providers/contract.js} +0 -0
  286. /package/dist/server/{runtime → runtime-management}/managed-runtime.d.ts +0 -0
  287. /package/dist/server/{runtime → runtime-management}/managed-runtime.js +0 -0
  288. /package/dist/server/{runtime → runtime-management}/runtime-release.d.ts +0 -0
  289. /package/dist/server/{runtime → runtime-management}/runtime-release.js +0 -0
@@ -1,493 +0,0 @@
1
- import { defaultActivityRecorder } from '../activities/activity.service.js';
2
- import { defaultAgentRegistryService } from '../agents/agent.service.js';
3
- import { nowIso } from '../ids.js';
4
- import { WakeQueueService } from '../inbox/wake-queue.service.js';
5
- import { reminderServiceForAgent } from '../reminders/reminder.service.js';
6
- import { defaultRuntimeService, RuntimeServiceError } from '../runtime/runtime.service.js';
7
- import { SLACK_STOP_CONFIRM_VIEW_CALLBACK_ID, SLACK_VIEW_REMINDER_DETAIL_ACTION_ID, SLACK_VIEW_REMINDERS_ACTION_ID, } from './shortcuts.js';
8
- export class SlackShortcutService {
9
- activityRecorder;
10
- agentService;
11
- now;
12
- reminderServiceForAgent;
13
- runtimeService;
14
- constructor(deps = {}) {
15
- this.activityRecorder = deps.activityRecorder ?? defaultActivityRecorder;
16
- this.agentService = deps.agentService ?? defaultAgentRegistryService;
17
- this.now = deps.now ?? (() => new Date());
18
- this.reminderServiceForAgent = deps.reminderServiceForAgent ?? reminderServiceForAgent;
19
- this.runtimeService = deps.runtimeService ?? defaultRuntimeService;
20
- }
21
- async handleShortcut(input) {
22
- switch (input.body.callback_id) {
23
- case 'anima.home':
24
- await this.showHome(input);
25
- return;
26
- default:
27
- await this.openModal(input.client, input.body, {
28
- title: 'Shortcut unavailable',
29
- lines: ['This shortcut is not supported by this Anima build yet.'],
30
- });
31
- }
32
- }
33
- async confirmStop(input) {
34
- const status = await this.runtimeService.getStatus(input.agentId);
35
- const metadata = stopConfirmMetadata(input.view);
36
- if (!status.currentItemId) {
37
- await this.recordShortcutActivity(input.agentId, 'anima.shortcut.stop', {
38
- outcome: 'idle',
39
- userId: input.userId,
40
- });
41
- return shortcutModal({
42
- title: 'Nothing running',
43
- lines: ['This agent is idle. No current turn was stopped.'],
44
- });
45
- }
46
- if (metadata.itemId && metadata.itemId !== status.currentItemId) {
47
- await this.recordShortcutActivity(input.agentId, 'anima.shortcut.stop', {
48
- currentItemId: status.currentItemId,
49
- requestedItemId: metadata.itemId,
50
- outcome: 'item_changed',
51
- userId: input.userId,
52
- });
53
- return shortcutModal({
54
- title: 'Item changed',
55
- lines: [
56
- 'The current turn changed after this confirmation opened.',
57
- 'Open Stop again to interrupt the new current turn.',
58
- ],
59
- });
60
- }
61
- try {
62
- await this.runtimeService.stopCurrentItem(input.agentId);
63
- }
64
- catch (error) {
65
- if (!(error instanceof RuntimeServiceError) || error.statusCode !== 409)
66
- throw error;
67
- await this.recordShortcutActivity(input.agentId, 'anima.shortcut.stop', {
68
- outcome: 'idle',
69
- userId: input.userId,
70
- });
71
- return shortcutModal({
72
- title: 'Nothing running',
73
- lines: ['This agent became idle before Stop was applied.'],
74
- });
75
- }
76
- await this.recordShortcutActivity(input.agentId, 'anima.shortcut.stop', {
77
- itemId: status.currentItemId,
78
- outcome: 'stop_requested',
79
- userId: input.userId,
80
- });
81
- return shortcutModal({
82
- title: 'Stop requested',
83
- lines: [
84
- `Requested stop for current item \`${escapeMrkdwn(status.currentItemId)}\`.`,
85
- ],
86
- });
87
- }
88
- /** Handles the "View all reminders" button — pushes a read-only reminder list. */
89
- async showRemindersView(input) {
90
- const reminders = await this.reminderServiceForAgent(input.agentId).listReminders({
91
- statuses: ['scheduled'],
92
- });
93
- await input.client.views.push({
94
- trigger_id: input.triggerId,
95
- view: remindersView(reminders, this.now()),
96
- });
97
- }
98
- /** Handles a per-reminder "View →" button — pushes a single-reminder detail view. */
99
- async showReminderDetailView(input) {
100
- const reminders = await this.reminderServiceForAgent(input.agentId).listReminders({
101
- statuses: ['scheduled'],
102
- });
103
- const reminder = reminders.find((r) => r.reminderId === input.reminderId);
104
- if (!reminder)
105
- return; // reminder cancelled or not found — silently ignore
106
- await input.client.views.push({
107
- trigger_id: input.triggerId,
108
- view: reminderDetailView(reminder, this.now()),
109
- });
110
- }
111
- async showHome(input) {
112
- const [agent, status, reminders] = await Promise.all([
113
- this.agentService.serviceFor(input.agentId).getConfig(),
114
- this.runtimeService.getStatus(input.agentId),
115
- this.reminderServiceForAgent(input.agentId).listReminders({ statuses: ['scheduled'] }),
116
- ]);
117
- if (!input.body.trigger_id)
118
- return;
119
- await input.client.views.open({
120
- trigger_id: input.body.trigger_id,
121
- view: homeView(agent, status, reminders, this.now()),
122
- });
123
- }
124
- async handMessageToAgent(input) {
125
- const message = input.body.message;
126
- const channelId = input.body.channel?.id;
127
- const teamId = input.body.team?.id;
128
- if (!message?.ts || !channelId || !teamId) {
129
- await this.respondToMessageShortcut(input.body, { text: 'I could not read the source message for this handoff.' });
130
- return;
131
- }
132
- const receivedAt = slackTsToIsoOrNow(message.ts);
133
- const now = nowIso();
134
- const threadTs = message.thread_ts ?? message.ts;
135
- const item = {
136
- actor: {
137
- ...(message.user ? { userId: message.user } : {}),
138
- },
139
- channelId,
140
- ...(input.body.channel?.name ? { channelName: input.body.channel.name } : {}),
141
- handling: { createdAt: now, queuedAt: now, status: 'queued', updatedAt: now },
142
- id: `slack-shortcut-handoff:${teamId}:${channelId}:${message.ts}`,
143
- kind: 'slack',
144
- messageTs: message.ts,
145
- receivedAt,
146
- teamId,
147
- text: handoffText(message.text ?? '', input.body.user?.id),
148
- threadTs,
149
- };
150
- const result = await new WakeQueueService(input.agentId).enqueue(item);
151
- await this.recordShortcutActivity(input.agentId, 'anima.shortcut.handoff', {
152
- channelId,
153
- duplicate: result.duplicate,
154
- itemId: result.item.id,
155
- messageTs: message.ts,
156
- queued: result.queued,
157
- threadTs,
158
- userId: input.body.user?.id,
159
- });
160
- await this.respondToMessageShortcut(input.body, {
161
- text: result.duplicate
162
- ? 'This message was already handed to the agent.'
163
- : 'Handed to the agent. It will reply in this thread.',
164
- });
165
- }
166
- async openModal(client, body, input) {
167
- if (!body.trigger_id)
168
- return;
169
- await client.views.open({
170
- trigger_id: body.trigger_id,
171
- view: shortcutModal(input),
172
- });
173
- }
174
- async respondToMessageShortcut(body, input) {
175
- if (!body.response_url)
176
- return;
177
- await fetch(body.response_url, {
178
- body: JSON.stringify({ response_type: 'ephemeral', text: input.text }),
179
- headers: { 'content-type': 'application/json; charset=utf-8' },
180
- method: 'POST',
181
- });
182
- }
183
- async recordShortcutActivity(agentId, type, payload) {
184
- await this.activityRecorder.record(agentId, { type, payload });
185
- }
186
- }
187
- export const defaultSlackShortcutService = new SlackShortcutService();
188
- export function userIdFromShortcutBody(body) {
189
- if (!isRecord(body))
190
- return undefined;
191
- const user = body['user'];
192
- return isRecord(user) && typeof user['id'] === 'string' ? user['id'] : undefined;
193
- }
194
- // ---------------------------------------------------------------------------
195
- // Home view builder
196
- // ---------------------------------------------------------------------------
197
- /**
198
- * Builds the redesigned Home modal:
199
- *
200
- * ┌─ agent identity (name + role) ─────────────────────────────┐
201
- * ├─ divider ───────────────────────────────────────────────────┤
202
- * ├─ status (✅ Idle / ⚙️ Working · 14m / ⏳ Queued) ──────────┤
203
- * │ [queued context line if state='queued'] │
204
- * ├─ divider ───────────────────────────────────────────────────┤
205
- * ├─ reminders (preview or "None scheduled") ──────────────────┤
206
- * │ [View all (N) →] button if N > 0 │
207
- * └─────────────────────────────────────────────────────────────┘
208
- *
209
- * Busy state: modal submit = "Stop" (carries itemId in private_metadata,
210
- * triggers the existing confirmStop flow — no raw ID shown in the UI).
211
- */
212
- function homeView(agent, status, reminders, now) {
213
- const displayName = agent.profile.displayName;
214
- const role = agent.profile.role;
215
- const state = status.currentItemId
216
- ? 'busy'
217
- : status.queueDepth > 0
218
- ? 'queued'
219
- : 'idle';
220
- const blocks = [];
221
- // ── Agent identity ──────────────────────────────────────────
222
- // Name + role (if set) + owner attribution on a context line below
223
- const identityText = role.trim()
224
- ? `*${escapeMrkdwn(displayName)}*\n${escapeMrkdwn(role)}`
225
- : `*${escapeMrkdwn(displayName)}*`;
226
- blocks.push({ type: 'section', text: { type: 'mrkdwn', text: identityText } });
227
- if (agent.owner) {
228
- const ownerLabel = agent.owner.handle
229
- ? `@${escapeMrkdwn(agent.owner.handle)}`
230
- : escapeMrkdwn(agent.owner.displayName);
231
- blocks.push({
232
- type: 'context',
233
- elements: [{ type: 'mrkdwn', text: `Owner: ${ownerLabel}` }],
234
- });
235
- }
236
- blocks.push({ type: 'divider' });
237
- // ── Status ──────────────────────────────────────────────────
238
- const statusEmoji = state === 'busy' ? ':gear:' : state === 'queued' ? ':hourglass_flowing_sand:' : ':white_check_mark:';
239
- const statusLabel = state === 'busy' ? 'Working' : state === 'queued' ? 'Queued' : 'Idle';
240
- const elapsed = state === 'busy' && status.currentItemStartedAt
241
- ? ` · ${elapsedLabel(status.currentItemStartedAt, now)}`
242
- : '';
243
- blocks.push({
244
- type: 'section',
245
- text: { type: 'mrkdwn', text: `${statusEmoji} *${statusLabel}*${elapsed}` },
246
- });
247
- // Queue depth intentionally omitted — "X items queued" is engine jargon
248
- // that most users don't need to see (steering mode).
249
- blocks.push({ type: 'divider' });
250
- // ── Reminders ───────────────────────────────────────────────
251
- if (reminders.length === 0) {
252
- blocks.push({
253
- type: 'section',
254
- text: { type: 'mrkdwn', text: ':alarm_clock: *Reminders*\n_None scheduled_' },
255
- });
256
- }
257
- else {
258
- // Preview: first upcoming reminder (listReminders returns sorted by nextDueAt)
259
- const next = reminders[0];
260
- const nextDue = next.nextDueAt ? humanDueLabel(next.nextDueAt, now) : '';
261
- const preview = nextDue
262
- ? `_Next: "${escapeMrkdwn(next.title)}" · ${nextDue}_`
263
- : `_${escapeMrkdwn(next.title)}_`;
264
- const count = reminders.length;
265
- blocks.push({
266
- type: 'section',
267
- text: {
268
- type: 'mrkdwn',
269
- text: `:alarm_clock: *Reminders* · ${count} scheduled\n${preview}`,
270
- },
271
- });
272
- blocks.push({
273
- type: 'actions',
274
- elements: [{
275
- action_id: SLACK_VIEW_REMINDERS_ACTION_ID,
276
- text: { emoji: true, text: `View all (${count}) →`, type: 'plain_text' },
277
- type: 'button',
278
- }],
279
- });
280
- }
281
- return {
282
- blocks,
283
- close: { text: 'Close', type: 'plain_text' },
284
- // Busy state: carry Stop confirmation — itemId in private_metadata, submit = 'Stop'.
285
- // The raw itemId never appears in any block text, only in metadata for confirmStop().
286
- ...(state === 'busy' ? {
287
- callback_id: SLACK_STOP_CONFIRM_VIEW_CALLBACK_ID,
288
- private_metadata: JSON.stringify({ itemId: status.currentItemId }),
289
- submit: { text: 'Stop', type: 'plain_text' },
290
- } : {}),
291
- title: { text: 'Home', type: 'plain_text' },
292
- type: 'modal',
293
- };
294
- }
295
- // ---------------------------------------------------------------------------
296
- // Reminders drill-down view builder (views.push, read-only)
297
- // ---------------------------------------------------------------------------
298
- /**
299
- * Read-only list of scheduled reminders. Each item has a "View →" accessory
300
- * button that pushes a detail view for that reminder (title + due + instructions).
301
- */
302
- function remindersView(reminders, now) {
303
- const blocks = [];
304
- if (reminders.length === 0) {
305
- blocks.push({
306
- type: 'section',
307
- text: { type: 'mrkdwn', text: '_No reminders scheduled._' },
308
- });
309
- }
310
- else {
311
- for (const r of reminders) {
312
- const due = r.nextDueAt ? humanDueLabel(r.nextDueAt, now) : '';
313
- const recurrence = scheduleLabel(r.schedule);
314
- const meta = [due, recurrence].filter(Boolean).join(' · ');
315
- blocks.push({
316
- accessory: {
317
- action_id: SLACK_VIEW_REMINDER_DETAIL_ACTION_ID,
318
- text: { emoji: false, text: 'View →', type: 'plain_text' },
319
- type: 'button',
320
- value: r.reminderId,
321
- },
322
- text: {
323
- text: `*${escapeMrkdwn(r.title)}*${meta ? `\n_${escapeMrkdwn(meta)}_` : ''}`,
324
- type: 'mrkdwn',
325
- },
326
- type: 'section',
327
- });
328
- }
329
- }
330
- return {
331
- blocks,
332
- close: { text: 'Close', type: 'plain_text' },
333
- title: { text: 'Reminders', type: 'plain_text' },
334
- type: 'modal',
335
- };
336
- }
337
- /**
338
- * Single-reminder detail view (views.push from the reminders list).
339
- * Shows full instructions — the main reason totoday wants to drill down.
340
- */
341
- function reminderDetailView(reminder, now) {
342
- const blocks = [];
343
- const due = reminder.nextDueAt ? humanDueLabel(reminder.nextDueAt, now) : '';
344
- const recurrence = scheduleLabel(reminder.schedule);
345
- const meta = [due, recurrence].filter(Boolean).join(' · ');
346
- // Title + due/schedule row
347
- blocks.push({
348
- type: 'section',
349
- text: {
350
- type: 'mrkdwn',
351
- text: `*${escapeMrkdwn(reminder.title)}*${meta ? `\n_${escapeMrkdwn(meta)}_` : ''}`,
352
- },
353
- });
354
- // Instructions (the main content totoday wants to see).
355
- // Truncated to ~2900 chars to stay under Slack's 3000-char section limit;
356
- // in practice instructions are almost always under this, but agent-written
357
- // reminders can be long and Slack silently rejects the whole view if exceeded.
358
- // Limit is applied *after* escapeMrkdwn so HTML entity expansion
359
- // (< > & = 3-4 chars each) doesn't sneak us past 3000.
360
- const SECTION_LIMIT = 2900;
361
- if (reminder.instructions.trim()) {
362
- const escaped = escapeMrkdwn(reminder.instructions);
363
- const text = escaped.length > SECTION_LIMIT
364
- ? `${escaped.slice(0, SECTION_LIMIT)}…`
365
- : escaped;
366
- blocks.push({ type: 'divider' });
367
- blocks.push({
368
- type: 'section',
369
- text: { type: 'mrkdwn', text },
370
- });
371
- }
372
- return {
373
- blocks,
374
- // Use "Close" not "Back" — in a views.push stack, Slack's bottom close button
375
- // closes the *entire* modal (not just the top view). Navigation back one level
376
- // uses Slack's native ← arrow in the top-left. "Back" would be misleading.
377
- close: { text: 'Close', type: 'plain_text' },
378
- title: { text: 'Reminder', type: 'plain_text' },
379
- type: 'modal',
380
- };
381
- }
382
- // ---------------------------------------------------------------------------
383
- // Simple modal (confirmations, errors) — unchanged from previous design
384
- // ---------------------------------------------------------------------------
385
- function shortcutModal(input) {
386
- const blocks = [
387
- ...input.lines.map((line) => ({
388
- text: { text: line, type: 'mrkdwn' },
389
- type: 'section',
390
- })),
391
- ...(input.context ? [{
392
- elements: [{ text: input.context, type: 'mrkdwn' }],
393
- type: 'context',
394
- }] : []),
395
- ];
396
- return {
397
- blocks,
398
- ...(input.callbackId ? { callback_id: input.callbackId } : {}),
399
- close: { text: input.close ?? 'Close', type: 'plain_text' },
400
- ...(input.privateMetadata ? { private_metadata: input.privateMetadata } : {}),
401
- ...(input.submit ? { submit: { text: input.submit, type: 'plain_text' } } : {}),
402
- title: { text: input.title.slice(0, 24), type: 'plain_text' },
403
- type: 'modal',
404
- };
405
- }
406
- // ---------------------------------------------------------------------------
407
- // Helpers
408
- // ---------------------------------------------------------------------------
409
- /** "in 2h", "in 45m", "in 1d 3h", "overdue" */
410
- function humanDueLabel(dueAt, now) {
411
- const ms = Date.parse(dueAt) - now.getTime();
412
- if (ms < 0)
413
- return 'overdue';
414
- const totalMin = Math.round(ms / 60_000);
415
- if (totalMin < 1)
416
- return 'in <1m';
417
- if (totalMin < 60)
418
- return `in ${totalMin}m`;
419
- const h = Math.floor(totalMin / 60);
420
- const m = totalMin % 60;
421
- if (h < 24)
422
- return m > 0 ? `in ${h}h ${m}m` : `in ${h}h`;
423
- const d = Math.floor(h / 24);
424
- const rh = h % 24;
425
- return rh > 0 ? `in ${d}d ${rh}h` : `in ${d}d`;
426
- }
427
- /** "repeating daily", "weekly Mon/Wed", "every 4h", "once" */
428
- function scheduleLabel(schedule) {
429
- switch (schedule.kind) {
430
- case 'once': return 'once';
431
- case 'daily': return 'repeating daily';
432
- case 'weekly': return `weekly ${schedule.weekdays.slice(0, 3).join('/')}`;
433
- case 'interval': {
434
- const ms = schedule.intervalMs;
435
- if (ms < 3_600_000)
436
- return `every ${Math.round(ms / 60_000)}m`;
437
- if (ms < 86_400_000)
438
- return `every ${Math.round(ms / 3_600_000)}h`;
439
- return `every ${Math.round(ms / 86_400_000)}d`;
440
- }
441
- }
442
- }
443
- function elapsedLabel(startedAt, now) {
444
- const startedMs = Date.parse(startedAt);
445
- if (!Number.isFinite(startedMs))
446
- return 'elapsed unknown';
447
- const seconds = Math.max(0, Math.floor((now.getTime() - startedMs) / 1000));
448
- if (seconds < 60)
449
- return `${seconds}s`;
450
- const minutes = Math.floor(seconds / 60);
451
- if (minutes < 60)
452
- return `${minutes}m`;
453
- const hours = Math.floor(minutes / 60);
454
- const remMinutes = minutes % 60;
455
- return `${hours}h ${remMinutes}m`;
456
- }
457
- function slackTsToIsoOrNow(ts) {
458
- const seconds = Number(ts.split('.')[0]);
459
- if (!Number.isFinite(seconds))
460
- return nowIso();
461
- return new Date(seconds * 1000).toISOString();
462
- }
463
- function stopConfirmMetadata(view) {
464
- if (!view.private_metadata)
465
- return {};
466
- try {
467
- const parsed = JSON.parse(view.private_metadata);
468
- if (!isRecord(parsed))
469
- return {};
470
- const itemId = typeof parsed['itemId'] === 'string' ? parsed['itemId'] : undefined;
471
- return itemId ? { itemId } : {};
472
- }
473
- catch {
474
- return {};
475
- }
476
- }
477
- function handoffText(text, handedByUserId) {
478
- const body = text.trim() || '(message had no text)';
479
- return [
480
- handedByUserId
481
- ? `<@${handedByUserId}> used the Slack message shortcut to hand you this message as a task.`
482
- : 'A teammate used the Slack message shortcut to hand you this message as a task.',
483
- 'Reply in this thread with your result.',
484
- '',
485
- body,
486
- ].join('\n');
487
- }
488
- function escapeMrkdwn(value) {
489
- return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
490
- }
491
- function isRecord(value) {
492
- return Boolean(value && typeof value === 'object' && !Array.isArray(value));
493
- }
@@ -1,7 +0,0 @@
1
- import{t as e}from"./external-link-Dt0qTpmV.js";import{t}from"./file-text-Dd9ys6py.js";import{Ct as n,Et as r,F as i,G as a,I as o,Mt as s,N as c,Ot as l,P as u,Q as d,St as f,Tt as p,U as m,X as h,Y as ee,at as te,dt as g,et as _,kt as v,ot as ne,t as re,tt as y,vt as b,wt as x,xt as ie,yt as ae,z as S}from"./index-CzAQnbuO.js";var C=class extends x{constructor(e,t){super(e,t)}bindMethods(){super.bindMethods(),this.fetchNextPage=this.fetchNextPage.bind(this),this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(e){e._type=`infinite`,super.setOptions(e)}getOptimisticResult(e){return e._type=`infinite`,super.getOptimisticResult(e)}fetchNextPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(e){return this.fetch({...e,meta:{fetchMore:{direction:`backward`}}})}createResult(e,t){let{state:n}=e,i=super.createResult(e,t),{isFetching:a,isRefetching:o,isError:s,isRefetchError:c}=i,l=n.fetchMeta?.fetchMore?.direction,u=s&&l===`forward`,d=a&&l===`forward`,f=s&&l===`backward`,m=a&&l===`backward`;return{...i,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:p(t,n.data),hasPreviousPage:r(t,n.data),isFetchNextPageError:u,isFetchingNextPage:d,isFetchPreviousPageError:f,isFetchingPreviousPage:m,isRefetchError:c&&!u&&!f,isRefetching:o&&!d&&!m}}};function oe(e,t){return f(e,C,t)}var w=y(`file-exclamation-point`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),T=y(`paperclip`,[[`path`,{d:`m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551`,key:`1miecu`}]]),E=s(v(),1),D=new Set([`runtime.started`,`runtime.output`,`runtime.followup_appended`,`runtime.steered`,`runtime.pending`,`runtime.steer_failed`]);function O(e){return!!(e===`provider.reasoning`||e.endsWith(`.context.stats`)||e.endsWith(`.system.init`)||e.includes(`.stream.`)||e.includes(`.reasoning.`)||e.endsWith(`.thinking.delta`)||e.endsWith(`.content.part`)||e.endsWith(`.tool.call.part`)||e.endsWith(`.tool_result`)||e.endsWith(`.hook.triggered`)||e.endsWith(`.hook.resolved`)||e.endsWith(`.plan.display`)||e.endsWith(`.plan.updated`)||e.endsWith(`.diff.updated`)||e.endsWith(`.subagent.event`)||e.endsWith(`.mcp.progress`)||e.endsWith(`.raw_response_item.completed`)||e.endsWith(`.steer.consumed`)||e.endsWith(`.turn.started`)||e.endsWith(`.turn.completed`)||e.endsWith(`.step.started`)||e.includes(`.outputDelta`)||e.includes(`.patchUpdated`))}function se(e,t=!1){let n=e.events.flatMap(e=>e.kind===`activity`?[e.activity]:[]),r=e.events.flatMap(e=>e.kind===`inbox`?[e.item]:[]),i=new Map;for(let e of n){let t=typeof e.payload?.parentToolCallId==`string`?e.payload.parentToolCallId:void 0;if(!t)continue;let n=typeof e.payload?.subRunId==`string`?e.payload.subRunId:`__default__`;i.has(t)||i.set(t,new Map);let r=i.get(t),a=r.get(n)??[];a.push(e),r.set(n,a)}let a=new Map;for(let e of n){if(e.type!==`tool.call.completed`||e.payload?.tool!==`anima.reminder.fire`)continue;let t=typeof e.payload.reminderId==`string`?e.payload.reminderId:``;if(!t)continue;let n=typeof e.payload.firedCount==`number`?e.payload.firedCount:1,r=typeof e.payload.scheduleKind==`string`?e.payload.scheduleKind:`once`;a.set(t,{firedCount:n,scheduleKind:r})}let o=[];for(let e of r){let t=e.kind===`reminder`?R(e):void 0,n=t?a.get(t):void 0;o.push({kind:`message-in`,event:e,timestamp:le(e),surface:N(e,n),followupAppended:!1,...n?{wakeMeta:n}:{}})}for(let e of n){if(typeof e.payload?.parentToolCallId==`string`||e.type===`runtime.steer_failed`)continue;if(e.type===`tool.call.completed`||e.type===`external.effect.completed`){let t=e.payload?.tool,n=e.payload?.effect;if(t===`anima.message.send`||t===`anima.message.update`||n===`slack.message.send`||n===`slack.message.update`){let r=e.payload?.text;o.push({kind:`message-out`,activity:e,text:typeof r==`string`?r:``,timestamp:e.createdAt,surface:L(e),isEdit:t===`anima.message.update`||n===`slack.message.update`});continue}if(t===`anima.file.send`||n===`slack.file.send`){let t=e.payload??{},n=typeof t.caption==`string`?t.caption:``,r=typeof t.permalink==`string`?t.permalink:void 0,i=M(t.uploads);o.push({kind:`file-out`,activity:e,caption:n,files:i,...r?{permalink:r}:{},timestamp:e.createdAt,surface:L(e)});continue}if(t===`anima.reminder.fire`)continue;if(t===`anima.message.react`||n===`slack.reaction`){let t=e.payload??{},n=t.action===`removed`?`removed`:`added`,r=typeof t.name==`string`?t.name:``,i=t.noop===!0;o.push({kind:`reaction-out`,activity:e,action:n,emoji:r,noop:i,timestamp:e.createdAt,surface:L(e)});continue}}if(e.type===`tool.call.started`||e.type===`tool.call.completed`||e.type===`external.effect.started`){let t=e.payload??{},n=String(t.tool??``);if(e.type===`external.effect.started`||e.type===`tool.call.started`&&n.startsWith(`anima.`))continue;let r=String(t.providerToolName??``).toLowerCase();if(r===`shell`||r===`bash`){let e=String(t.command??t.target??``).trim();if(/^(\/\S*sh\s+-l?c\s+['"])?\s*anima\s+(message|file|reminder|follow|subscription|ask)\b/.test(e))continue}}if(e.type===`runtime.event`){if(O(String(e.payload?.eventType??``)))continue}else if(!t&&D.has(e.type))continue;let n=typeof e.payload?.providerToolId==`string`?e.payload.providerToolId:void 0,r=n?i.get(n):void 0,a=r?ue(r,t):void 0;o.push({kind:`step`,activity:e,timestamp:e.createdAt,...a?{subagentStreams:a}:{}})}return o.sort((e,t)=>{let n=e.timestamp.localeCompare(t.timestamp);return n===0?j(e)-j(t):n}),o}function ce(e){let t=[];for(let n of e.entries){if(n.direction===`in`){let e=k(n);t.push({kind:`message-in`,event:e,timestamp:n.timestamp,surface:N(e),followupAppended:!1});continue}if(n.kind===`message`){let e=A(n);t.push({kind:`message-out`,activity:e,text:n.text,timestamp:n.timestamp,surface:L(e),isEdit:n.isEdit===!0});continue}if(n.kind===`file`){let e=A(n);t.push({kind:`file-out`,activity:e,caption:n.text.split(/\r?\nFiles:/)[0]??``,files:(n.files??[]).map((e,t)=>({fileId:e.fileId??`${n.messageId}:file:${t}`,filename:e.filename,mimetype:e.mimetype??`application/octet-stream`,...e.permalink?{permalink:e.permalink}:{},sizeBytes:e.sizeBytes??0,...e.thumb360?{thumb360:e.thumb360}:{},...e.thumb720?{thumb720:e.thumb720}:{}})),...n.permalink?{permalink:n.permalink}:{},timestamp:n.timestamp,surface:L(e)});continue}if(n.kind===`reaction`){let e=A(n);t.push({kind:`reaction-out`,activity:e,action:n.reaction?.action??`added`,emoji:n.reaction?.name??``,noop:n.reaction?.noop===!0,timestamp:n.timestamp,surface:L(e)})}}return t.sort((e,t)=>e.timestamp.localeCompare(t.timestamp))}function k(e){let t={handling:{completedAt:e.timestamp,createdAt:e.timestamp,status:`completed`,updatedAt:e.timestamp},id:e.source.kind===`inbox`?e.source.id:e.messageId,receivedAt:e.timestamp};return e.kind===`reminder`?{...t,kind:`reminder`,reminderId:e.reminderId??e.source.id}:e.kind===`onboarding`?{...t,channelId:e.channelId??``,kind:`onboarding`,operator:{displayName:e.actorDisplayName??e.actor??`Owner`,...e.actorHandle?{handle:e.actorHandle}:{},slackUserId:e.actorUserId??``},teamId:``,text:e.text}:e.kind===`choice_response`?{...t,answeredBy:{...e.actorDisplayName?{displayName:e.actorDisplayName}:{},...e.actorHandle?{handle:e.actorHandle}:{},slackUserId:e.actorUserId??``},askId:e.source.id,channelId:e.channelId??``,...e.channelName?{channelName:e.channelName}:{},kind:`choice_response`,messageTs:e.messageTs??``,optionId:e.optionLabel??e.messageId,optionLabel:e.optionLabel??e.text,question:e.question??``,teamId:``,threadTs:e.threadTs??``}:{...t,actor:{...e.actorDisplayName?{displayName:e.actorDisplayName}:{},...e.actorHandle?{handle:e.actorHandle}:{},...e.actorUserId?{userId:e.actorUserId}:{}},channelId:e.channelId??``,...e.channelName?{channelName:e.channelName}:{},...e.files?.length?{files:e.files.map((t,n)=>({id:t.fileId??`${e.messageId}:file:${n}`,mimetype:t.mimetype??`application/octet-stream`,name:t.filename,sizeBytes:t.sizeBytes??0}))}:{},kind:`slack`,messageTs:e.messageTs??``,...e.permalink?{permalink:e.permalink}:{},teamId:``,text:e.text,...e.threadTs?{threadTs:e.threadTs}:{}}}function A(e){let t={channel:e.channelId,channelDisplayName:e.channelDisplayName,channelKind:e.channelKind,channelName:e.channelName,dmHandle:e.dmHandle,dmUserId:e.dmUserId,permalink:e.permalink,status:`completed`,text:e.text,threadTs:e.threadTs,ts:e.messageTs};return e.kind===`message`?t.effect=e.isEdit?`slack.message.update`:`slack.message.send`:e.kind===`file`?(t.effect=`slack.file.send`,t.caption=e.text.split(/\r?\nFiles:/)[0]??``,t.uploads=(e.files??[]).map((t,n)=>({fileId:t.fileId??`${e.messageId}:file:${n}`,filename:t.filename,mimetype:t.mimetype??`application/octet-stream`,permalink:t.permalink,sizeBytes:t.sizeBytes??0,thumb360:t.thumb360,thumb720:t.thumb720}))):e.kind===`reaction`&&(t.effect=`slack.reaction`,t.action=e.reaction?.action??`added`,t.name=e.reaction?.name??``,t.noop=e.reaction?.noop===!0,t.targetTs=e.messageTs),{activityId:e.source.kind===`activity`?e.source.id:e.messageId,createdAt:e.timestamp,payload:t,type:`external.effect.completed`}}function j(e){return e.kind===`message-in`?0:e.kind===`message-out`||e.kind===`file-out`||e.kind===`reaction-out`?1:e.kind===`step`&&e.activity.type===`runtime.completed`?3:2}function M(e){return Array.isArray(e)?e.flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e,n=typeof t.fileId==`string`?t.fileId:``,r=typeof t.filename==`string`?t.filename:``;return!n||!r?[]:[{fileId:n,filename:r,mimetype:typeof t.mimetype==`string`?t.mimetype:`application/octet-stream`,sizeBytes:typeof t.sizeBytes==`number`?t.sizeBytes:0,...typeof t.permalink==`string`?{permalink:t.permalink}:{},...typeof t.thumb360==`string`?{thumb360:t.thumb360}:{},...typeof t.thumb720==`string`?{thumb720:t.thumb720}:{}}]}):[]}function N(e,t){return P(e)?{kind:`onboarding`,label:`Onboarding`}:e.kind===`reminder`?{kind:`reminder`,label:t&&t.scheduleKind!==`once`?`Reminder · fire #${t.firedCount}`:`Reminder`}:e.kind===`choice_response`?I(e):e.kind===`slack`?F(e):{kind:`onboarding`,label:`Onboarding`}}function P(e){return e.kind===`onboarding`||e.id.startsWith(`agent-onboarding:`)}function F(e){let t=e.channelId??`unknown-channel`,n=e.channelName,r=e.threadTs,i=t.startsWith(`D`)?`dm`:r?`thread`:`channel`,a=n?`#${n}`:t;if(i===`dm`){let t=e.actor?.handle||e.actor?.displayName;return{kind:`dm`,label:t?`@${t.replace(/^@/,``)}`:`DM`}}return i===`thread`?{kind:`thread`,label:`${a} · thread`}:{kind:`channel`,label:a}}function I(e){let t=e.channelId??`unknown-channel`,n=e.channelName,r=e.threadTs,i=t.startsWith(`D`)?`dm`:r?`thread`:`channel`,a=n?n.startsWith(`#`)?n:`#${n}`:t;if(i===`dm`){let t=e.answeredBy.handle||e.answeredBy.displayName;return{kind:`dm`,label:t?`@${t.replace(/^@/,``)}`:`DM`}}return i===`thread`?{kind:`thread`,label:`${a} · thread`}:{kind:`channel`,label:a}}function L(e){let t=e.payload??{},n=typeof t.channel==`string`?t.channel:``,r=typeof t.channelName==`string`?t.channelName:``,i=typeof t.channelDisplayName==`string`?t.channelDisplayName:``,a=typeof t.channelKind==`string`?t.channelKind:``,o=typeof t.dmHandle==`string`?t.dmHandle:``,s=typeof t.threadTs==`string`?t.threadTs:``;if(o)return{kind:`dm`,label:`@${o.replace(/^@/,``)}`};if(n){if(a===`dm`||n.startsWith(`D`)&&!r&&!i){let e=i.replace(/^DM with /i,``),t=e&&e!==i?e:``;return{kind:`dm`,label:t?`@${t.replace(/^@/,``)}`:`DM`}}let e=r?`#${r}`:i?i.startsWith(`#`)?i:`#${i}`:n;return s?{kind:`thread`,label:e}:{kind:`channel`,label:e}}return{kind:`reminder`,label:`Reminder`}}function le(e){return e.receivedAt??new Date(0).toISOString()}function R(e){if(e.kind===`reminder`)return e.reminderId}function ue(e,t){let n=[];for(let[r,i]of e.entries()){let e=i[0],a=e&&typeof e.payload?.name==`string`?e.payload.name:void 0,o=e&&typeof e.payload?.role==`string`?e.payload.role:void 0,s=e&&typeof e.payload?.depth==`number`?e.payload.depth:1,c=de(i,t);n.push({subRunId:r,...a?{name:a}:{},...o?{role:o}:{},depth:s,items:c})}return n.sort((e,t)=>{let n=e.items[0]?.timestamp??``,r=t.items[0]?.timestamp??``;return n.localeCompare(r)}),n}function de(e,t){let n=[];for(let r of e)if(r.type!==`runtime.steer_failed`){if(r.type===`tool.call.completed`||r.type===`external.effect.completed`){let e=r.payload?.tool,t=r.payload?.effect;if(e===`anima.message.send`||e===`anima.message.update`||t===`slack.message.send`||t===`slack.message.update`){let i=r.payload?.text;n.push({kind:`message-out`,activity:r,text:typeof i==`string`?i:``,timestamp:r.createdAt,surface:L(r),isEdit:e===`anima.message.update`||t===`slack.message.update`});continue}if(e===`anima.file.send`||t===`slack.file.send`){let e=r.payload??{},t=typeof e.caption==`string`?e.caption:``,i=typeof e.permalink==`string`?e.permalink:void 0,a=M(e.uploads);n.push({kind:`file-out`,activity:r,caption:t,files:a,...i?{permalink:i}:{},timestamp:r.createdAt,surface:L(r)});continue}if(e===`anima.reminder.fire`)continue;if(e===`anima.message.react`||t===`slack.reaction`){let e=r.payload??{},t=e.action===`removed`?`removed`:`added`,i=typeof e.name==`string`?e.name:``,a=e.noop===!0;n.push({kind:`reaction-out`,activity:r,action:t,emoji:i,noop:a,timestamp:r.createdAt,surface:L(r)});continue}}if(r.type===`tool.call.started`||r.type===`tool.call.completed`||r.type===`external.effect.started`){let e=r.payload??{},t=String(e.tool??``);if(r.type===`external.effect.started`||r.type===`tool.call.started`&&t.startsWith(`anima.`))continue;let n=String(e.providerToolName??``).toLowerCase();if(n===`shell`||n===`bash`){let t=String(e.command??e.target??``).trim();if(/^(\/\S*sh\s+-l?c\s+['"])?\s*anima\s+(message|file|reminder|follow|subscription|ask)\b/.test(t))continue}}if(r.type===`runtime.event`){if(O(String(r.payload?.eventType??``)))continue}else if(!t&&D.has(r.type))continue;n.push({kind:`step`,activity:r,timestamp:r.createdAt})}return n.sort((e,t)=>e.timestamp.localeCompare(t.timestamp)),n}var z=`var(--color-activity-tool)`,B=`var(--color-health-error)`,V=`var(--color-health-warn)`,fe=`var(--color-health-ok)`;function pe(e){if(H(e))return!0;if(e.type===`tool.call.started`){let t=e.payload??{},n=String(t.providerToolName||t.tool||``).toLowerCase().replace(/^(claude|codex|kimi)\./,``);return[`read`,`readfile`,`readmediafile`,`write`,`writefile`,`edit`,`multiedit`,`bash`,`shell`,`webfetch`,`fetchurl`,`websearch`,`searchweb`,`grep`,`glob`,`ls`,`todowrite`,`settodolist`,`filechange`,`strreplacefile`,`agent`,`skill`,`taskcreate`,`taskupdate`].includes(n)}if(e.type===`tool.call.completed`||e.type===`external.effect.completed`){let t=String(e.payload?.tool??``).toLowerCase(),n=String(e.payload?.effect??``).toLowerCase();return!!(n===`slack.message.send`||n===`slack.message.update`||n===`slack.file.send`||n===`slack.reaction`||n===`slack.ask.post`||t===`anima.message.read`||t.startsWith(`anima.reminder.`)&&t!==`anima.reminder.list`)}if(e.type===`runtime.completed`||e.type===`runtime.aborted`||e.type===`anima.session.rotate`||e.type===`anima.subscription.add`||e.type===`anima.subscription.remove`||e.type===`agent.text`)return!0;if(e.type===`runtime.event`){let t=String(e.payload?.eventType??``);return!!(t.endsWith(`.compact.completed`)||t.endsWith(`.compact.failed`))}return!1}function H(e){return e.type===`runtime.event`&&String(e.payload?.eventType??``).endsWith(`.failed`)?!0:e.type.endsWith(`.failed`)||e.type===`runtime.followup_failed`||e.type===`runtime.steer_failed`}function me(e){let t=e.payload??{},n=String(t.providerToolName||t.tool||``).replace(/^claude\./,``),r=n.toLowerCase();if(e.type!==`runtime.event`&&H(e)){let i=K(t,[`summary`,`text`,`error`]);if(e.type===`runtime.failed`)return{title:t.failureSource===`provider`?`Provider failure`:`Run failed`,...J(i,200),color:B,kind:`failure`};if(e.type===`runtime.followup_failed`)return{title:`Follow-up failed`,...J(K(t,[`reason`,`error`]),200),color:B,kind:`failure`};let a=he(r,i);if(a)return a;if(e.type===`external.effect.failed`){let e=he(String(t.effect??``).toLowerCase(),i);if(e)return e}if(r===`bash`||r===`shell`){let e=ye(K(t,[`command`,`target`]));if(e){let t=Oe(i);return{title:n?`Failed: ${n}`:`Failed`,...J(t?`${e} · ${t}`:e,200),color:B,kind:`failure`}}}let o=K(t,[`target`,`command`]);if(o){let e=[o,Oe(i)].filter(Boolean).join(` · `),t=[o,i].filter(Boolean).join(`
2
-
3
- `);return{title:n?`Failed: ${n}`:`Failed`,...J(e,200),...t&&t!==e?{targetFull:t}:{},color:B,kind:`failure`}}return{title:n?`Failed: ${n}`:`Failed`,...J(i,200),color:B,kind:`failure`}}if(r===`read`||r===`readfile`||r===`readmediafile`)return U(`Read`,K(t,[`target`]));if(r===`write`||r===`writefile`)return U(`Wrote`,K(t,[`target`]));if(r===`edit`||r===`multiedit`)return U(`Edited`,K(t,[`target`]),K(t,[`diff`]));if(r===`grep`)return U(`Searched`,K(t,[`target`]));if(r===`glob`||r===`ls`)return U(`Listed`,K(t,[`target`]));if(r===`webfetch`||r===`fetchurl`)return U(`Fetched`,K(t,[`target`]));if(r===`websearch`||r===`searchweb`)return U(`Searched`,K(t,[`target`,`query`]));if(r===`todowrite`||r===`settodolist`)return U(`Updated todos`);if(r===`toolsearch`)return U(`Searched tools`,K(t,[`target`]));if(r===`bash`||r===`shell`)return{title:`Ran`,...J(ye(K(t,[`command`,`target`]))||r,120),color:z,kind:`tool`};let i=String(t.effect??``).toLowerCase();if(r===`anima.file.send`||i===`slack.file.send`){let e=t.fileCount,n=K(t,[`channelName`]),r=K(t,[`channel`]),i=n?`#${n}`:r||void 0;return{title:typeof e==`number`&&e!==1?`Sent ${e} files`:`Sent file`,target:i,color:z,kind:`tool`}}if(r===`anima.message.read`){let e=K(t,[`channelName`]),n=K(t,[`channelId`]),r=t.messageCount;return{title:`Read messages`,target:[e?`#${e}`:n||`?`,be(t),r===void 0?void 0:`${r} messages`].filter(Boolean).join(` · `),color:z,kind:`tool`}}if(r===`anima.reminder.schedule`){let e=W(t),n=K(t,[`nextDueAt`]);return{title:`Scheduled reminder`,target:n?e?`${e} · at ${S(n)}`:`at ${S(n)}`:e,color:`var(--color-activity-reminder)`,kind:`tool`}}if(r===`anima.reminder.cancel`)return{title:`Cancelled reminder`,target:W(t),color:`var(--color-activity-reminder)`,kind:`tool`};if(r===`anima.reminder.snooze`){let e=W(t),n=K(t,[`snoozedUntil`,`nextDueAt`]);return{title:`Snoozed reminder`,target:e&&n?`${e} · until ${S(n)}`:e,color:`var(--color-activity-reminder)`,kind:`tool`}}if(r===`anima.reminder.list`)return{title:`Listed reminders`,color:`var(--color-activity-reminder)`,kind:`tool`};if(r===`anima.reminder.fire`)return{title:`Reminder fired`,target:W(t),color:`var(--color-activity-reminder)`,kind:`lifecycle`};if(e.type===`anima.subscription.add`){let e=K(t,[`channelName`]),n=K(t,[`channelId`]),r=K(t,[`kind`]),i=e?`#${e}`:n||void 0;return{title:`Subscribed to`,target:i&&r?`${i} · ${r}`:i,color:`var(--color-activity-subscription)`,kind:`tool`}}if(e.type===`anima.subscription.remove`){let e=K(t,[`channelName`]),n=K(t,[`channelId`]);return{title:`Unsubscribed from`,target:e?`#${e}`:n||void 0,color:`var(--color-activity-subscription)`,kind:`tool`}}if(e.type===`anima.session.rotate`){let e=t.archivedCount,n=K(t,[`note`]);return{title:`Session rotated`,target:[typeof e==`number`?`Archived ${e} provider session${e===1?``:`s`}`:void 0,n].filter(Boolean).join(` · `)||void 0,color:V,kind:`lifecycle`}}if(e.type===`runtime.started`)return{title:`Working`,target:`Message received`,color:V,kind:`lifecycle`};if(e.type===`runtime.completed`)return{title:`Idle`,color:fe,kind:`lifecycle`};if(e.type===`runtime.aborted`){let e=K(t,[`reason`]);return{title:e===`shutdown`?`Runtime restarted`:e===`user_stop`?`Stopped by user`:e===`idle_timeout`?`Idle timeout`:`Runtime stopped`,target:e===`idle_timeout`?_e(t):void 0,color:V,kind:`lifecycle`}}if(e.type===`runtime.pending`)return{title:`Queued behind current item`,color:z,kind:`lifecycle`};if(e.type===`runtime.output`){let e=K(t,[`stream`]),n=String(t.text||``);return{title:`Process output`,...J(e?`[${e}] ${n}`:n,300),color:z,kind:`output`}}if(e.type===`runtime.followup_appended`)return{title:`Follow-up added to current run`,...J(String(t.text||``),120),color:V,kind:`lifecycle`};if(e.type===`external.effect.started`)return{title:`Sending`,color:z,kind:`tool`};if(e.type===`external.effect.completed`){if(String(t.effect??``).toLowerCase()===`slack.ask.post`){let e=K(t,[`allowedUserLabel`]);return{title:t.allowAnyone===!0?`Asked anyone`:e?`Asked ${e}`:`Asked`,...J(Se(t),220),color:z,kind:`tool`}}return{title:G(String(t.effect??`external.effect`)),color:z,kind:`tool`}}if(e.type===`external.effect.failed`)return{title:`External effect failed`,...J(K(t,[`summary`,`text`,`error`]),200),color:B,kind:`failure`};if(e.type===`runtime.event`){let e=String(t.eventType??``);if(e.endsWith(`.compact.started`))return{title:`Compacting context`,color:V,kind:`lifecycle`};if(e.endsWith(`.compact.completed`))return{title:`Context compacted`,color:fe,kind:`lifecycle`};if(e.endsWith(`.compact.failed`))return{title:`Compact failed`,...J(K(t,[`error`]),160),color:B,kind:`failure`};if(e.endsWith(`.session.stats`))return{title:`Session stats`,target:Te(t),color:z,kind:`lifecycle`};let n=ge(e,t);if(n)return n}if(e.type===`agent.text`)return{title:`Output`,...J(String(t.text||``),280),color:z,kind:`output`};let a=r.replace(/^(claude|codex|kimi|anima)\./,``);if(a===`filechange`||a===`strreplacefile`)return U(`Edited`,K(t,[`target`]),K(t,[`diff`]));if(a===`agent`)return U(`Delegated to subagent`,K(t,[`target`,`description`]));if(a===`skill`)return U(`Ran skill`,K(t,[`target`,`name`]));if(a===`taskcreate`)return U(`Created task`,K(t,[`target`,`title`]));if(a===`taskupdate`)return U(`Updated task`,K(t,[`target`,`title`]));if(n){let e=K(t,[`target`,`command`]);return{title:`Used ${G(n)}`,target:e||void 0,color:z,kind:`tool`}}return{title:G(e.type),color:z,kind:`unknown`}}function U(e,t,n){return{title:e,target:t||void 0,...n&&n!==t?{targetFull:n}:{},color:z,kind:`tool`}}function he(e,t){let n;if(e===`anima.message.send`||e===`slack.message.send`?n=`Message failed`:e===`anima.message.update`||e===`slack.message.update`?n=`Edit failed`:e===`anima.file.send`||e===`slack.file.send`?n=`File upload failed`:e===`anima.message.react`||e===`slack.reaction`?n=`Reaction failed`:e===`anima.message.read`?n=`Read failed`:e.startsWith(`anima.reminder.`)&&(n=`Reminder ${e.replace(`anima.reminder.`,``)} failed`),n)return{title:n,...J(t,200),color:B,kind:`failure`}}function ge(e,t){if(e===`provider.crash.retry`){let e=t.attempt,n=t.maxRetries;return{title:`Provider retry`,...J([typeof e==`number`&&typeof n==`number`?`Retry ${e}/${n}`:`Retrying`,K(t,[`error`])].filter(Boolean).join(` · `),200),color:V,kind:`lifecycle`}}if(e===`codex.model.rerouted`){let e=K(t,[`fromModel`]),n=K(t,[`toModel`]),r=K(t,[`reason`]);return{title:`Model rerouted`,target:[e&&n?`${e} → ${n}`:n||e,r].filter(Boolean).join(` · `)||void 0,color:V,kind:`lifecycle`}}if(e===`codex.rate_limits.updated`||e===`claude.rate_limit`)return{title:`Rate limit updated`,target:[K(t,[`limitName`,`rateLimitType`,`status`]),Ce(t)].filter(Boolean).join(` · `)||void 0,color:V,kind:`lifecycle`};if(e.startsWith(`codex.`)&&e.toLowerCase().includes(`warning`))return{title:`Provider warning`,...J(K(t,[`message`,`summary`,`details`]),200),color:V,kind:`lifecycle`};if(e===`claude.provider.retry`||e===`claude.provider.resume_retry`){let n=K(t,[`reason`]),r=K(t,[`error`]);return{title:e.endsWith(`.resume_retry`)?`Provider resume retry`:`Provider retry`,...J([n,r].filter(Boolean).join(` · `),200),color:V,kind:`lifecycle`}}if(e===`claude.session.resume_missing`)return{title:`Provider session expired`,target:`Started a fresh session`,color:V,kind:`lifecycle`};if(e===`kimi.approval.response`)return{title:`Approval answered`,target:K(t,[`response`]),color:z,kind:`tool`};if(e===`kimi.step.interrupted`)return{title:`Step interrupted`,color:V,kind:`lifecycle`}}function _e(e){let t=e.timeoutMs;return typeof t!=`number`||!Number.isFinite(t)||t<=0?`No provider activity`:`${ve(t)} with no provider activity`}function ve(e){let t=Math.round(e/6e4);if(t<60)return`${t}m`;let n=Math.floor(t/60),r=t%60;return r?`${n}h ${r}m`:`${n}h`}function ye(e){let t=e.match(/^\/\S*sh\s+-l?c\s+['"]/);return t?e.slice(t[0].length).replace(/['"]\s*$/,``):e}function W(e){return K(e,[`title`,`reminderId`])||void 0}function be(e){if(e.threadTs)return`thread`;let t=K(e,[`around`]);if(t)return`around ${S(xe(t))}`;let n=e.limit;return typeof n==`number`?`last ${n}`:``}function xe(e){let t=Number(e.split(`.`)[0]);return Number.isFinite(t)?new Date(t*1e3).toISOString():e}function Se(e){let t=K(e,[`question`,`target`]),n=Array.isArray(e.optionLabels)?e.optionLabels.filter(e=>typeof e==`string`&&!!e.trim()):[],r=n.length?`[${n.join(` / `)}]`:``;return[t?`"${t}"`:``,r].filter(Boolean).join(` - `)}function G(e){let t=e.replace(/^(claude|codex|kimi|anima)[._-]/i,``).replace(/([a-z0-9])([A-Z])/g,`$1 $2`).replace(/[._-]+/g,` `).trim().toLowerCase();return t?t.charAt(0).toUpperCase()+t.slice(1):`tool`}function Ce(e){let t=K(e,[`resetsAt`]);if(t)return`resets ${we(t)}`;for(let t of[`primary`,`secondary`]){let n=e[t];if(!n||typeof n!=`object`)continue;let r=n.resetsAt;if(typeof r==`number`&&Number.isFinite(r))return`resets ${we(r)}`}return``}function we(e){if(typeof e==`number`){let t=new Date(e>1e10?e:e*1e3);return Number.isNaN(t.getTime())?String(e):S(t.toISOString())}return S(e)}function K(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}return``}function Te(e){let t=[K(e,[`model`]),q(`context`,e.contextWindow),q(`cached`,e.cacheReadInputTokens),q(`output`,e.outputTokens)].filter(Boolean);return t.length>0?t.join(` · `):void 0}function q(e,t){if(!(typeof t!=`number`||!Number.isFinite(t)))return`${e} ${Ee(t)}`}function Ee(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}k`:String(e)}function De(e,t){return e.length<=t?e:e.slice(0,t).trimEnd()+`…`}function Oe(e){if(!e)return``;let t=e.match(/exit(?: code)? (\d+)/i);return t?`exit ${t[1]}`:De(e.split(`
4
- `).map(e=>e.trim()).find(Boolean)??``,60)}function J(e,t){if(!e)return{};let n=De(e,t);return n===e?{target:n}:{target:n,targetFull:e}}var ke={white_check_mark:`✅`,heavy_check_mark:`✔️`,ballot_box_with_check:`☑️`,x:`❌`,heavy_multiplication_x:`✖️`,negative_squared_cross_mark:`❎`,question:`❓`,grey_question:`❔`,exclamation:`❗`,warning:`⚠️`,no_entry:`⛔`,"+1":`👍`,thumbsup:`👍`,"-1":`👎`,thumbsdown:`👎`,ok_hand:`👌`,clap:`👏`,raised_hands:`🙌`,muscle:`💪`,pray:`🙏`,wave:`👋`,point_up:`☝️`,eyes:`👀`,tada:`🎉`,fire:`🔥`,rocket:`🚀`,sparkles:`✨`,star:`⭐`,star2:`🌟`,100:`💯`,zap:`⚡`,boom:`💥`,heart:`❤️`,yellow_heart:`💛`,green_heart:`💚`,blue_heart:`💙`,purple_heart:`💜`,black_heart:`🖤`,white_heart:`🤍`,orange_heart:`🧡`,broken_heart:`💔`,smile:`😄`,grinning:`😀`,laughing:`😆`,joy:`😂`,rofl:`🤣`,sweat_smile:`😅`,wink:`😉`,blush:`😊`,thinking_face:`🤔`,thinking:`🤔`,pensive:`😔`,cry:`😢`,sob:`😭`,rage:`😡`,angry:`😠`,exploding_head:`🤯`,nerd_face:`🤓`,sunglasses:`😎`,flushed:`😳`,scream:`😱`,raised_eyebrow:`🤨`,face_with_monocle:`🧐`,robot_face:`🤖`,see_no_evil:`🙈`,hear_no_evil:`🙉`,speak_no_evil:`🙊`,gear:`⚙️`,hammer_and_wrench:`🛠️`,wrench:`🔧`,hammer:`🔨`,lock:`🔒`,unlock:`🔓`,key:`🔑`,mag:`🔍`,mag_right:`🔎`,bell:`🔔`,no_bell:`🔕`,bookmark:`🔖`,pushpin:`📌`,paperclip:`📎`,link:`🔗`,memo:`📝`,pencil:`📝`,pencil2:`✏️`,notebook:`📓`,scroll:`📜`,bulb:`💡`,flashlight:`🔦`,chart_with_upwards_trend:`📈`,chart_with_downwards_trend:`📉`,bar_chart:`📊`,calendar:`📅`,spiral_calendar_pad:`🗓️`,hourglass:`⌛`,hourglass_flowing_sand:`⏳`,clock:`🕐`,alarm_clock:`⏰`,speech_balloon:`💬`,thought_balloon:`💭`,email:`📧`,"e-mail":`📧`,inbox_tray:`📥`,outbox_tray:`📤`,package:`📦`,computer:`💻`,iphone:`📱`,bug:`🐛`,ghost:`👻`,alien:`👽`,crown:`👑`,trophy:`🏆`,medal:`🏅`,art:`🎨`,rainbow:`🌈`};function Ae(e){if(e)return ke[e.replace(/^:|:$/g,``).toLowerCase()]}var Y=n(),je=/```([\s\S]*?)```|\*\*([^*\n]+)\*\*|\*([^*\n]+)\*|_([^_\n]+)_|`([^`\n]+)`|<!date\^[^|>]*(?:\|([^>]*))?>|<!subteam\^([A-Z0-9]+)(?:\|([^>]*))?>|<!(channel|here|everyone)>|<(https?:\/\/[^|>\s]+)\|([^>]+)>|<(https?:\/\/[^>\s]+)>|<#([A-Z0-9]+)\|([^>]+)>|<@([A-Z0-9]+)(?:\|([^>]*))?>|:([a-z0-9_+-]+):/g;function X(e){if(!e)return null;let t=Me(e),n=[],r=0,i=0;for(let e of t.matchAll(je)){let a=e.index;if(a>r&&Z(n,t.slice(r,a),i++),e[1]!==void 0)n.push((0,Y.jsx)(`pre`,{className:`mt-1 overflow-x-auto rounded bg-surface-elevated px-2 py-1.5 font-mono text-[12px]`,children:(0,Y.jsx)(`code`,{children:e[1].trim()})},i++));else if(e[2])n.push((0,Y.jsx)(`strong`,{className:`font-semibold`,children:e[2]},i++));else if(e[3])n.push((0,Y.jsx)(`strong`,{className:`font-semibold`,children:e[3]},i++));else if(e[4])n.push((0,Y.jsx)(`em`,{children:e[4]},i++));else if(e[5])n.push((0,Y.jsx)(`code`,{className:`rounded border border-border-soft bg-surface-elevated px-1 font-mono text-[0.9em]`,children:e[5]},i++));else if(e[6]!==void 0)Z(n,e[6],i++);else if(e[7])n.push((0,Y.jsxs)(`span`,{className:`font-medium text-accent`,children:[`@`,(e[8]||e[7]).replace(/^@/,``)]},i++));else if(e[9])n.push((0,Y.jsxs)(`span`,{className:`font-medium text-accent`,children:[`@`,e[9]]},i++));else if(e[10]&&e[11])n.push((0,Y.jsx)(`a`,{href:e[10],target:`_blank`,rel:`noreferrer`,className:`text-accent underline decoration-accent/40 underline-offset-2 hover:decoration-accent`,children:e[11]},i++));else if(e[12])n.push((0,Y.jsx)(`a`,{href:e[12],target:`_blank`,rel:`noreferrer`,className:`text-accent underline decoration-accent/40 underline-offset-2 hover:decoration-accent`,children:e[12]},i++));else if(e[13]&&e[14])n.push((0,Y.jsxs)(`span`,{className:`font-medium text-accent`,children:[`#`,e[14]]},i++));else if(e[15]){let t=e[16]||e[15];n.push((0,Y.jsxs)(`span`,{className:`font-medium text-accent`,children:[`@`,t]},i++))}else e[17]&&n.push(Ae(e[17])??`:${e[17]}:`);r=a+e[0].length}return r<t.length&&Z(n,t.slice(r),i),n.length===0?null:n.length===1?n[0]:(0,Y.jsx)(Y.Fragment,{children:n})}function Me(e){return e.replace(/&amp;/g,`&`).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`)}function Z(e,t,n){t&&t.split(`
5
- `).forEach((t,r)=>{r>0&&e.push((0,Y.jsx)(`br`,{},`${n}-${r}`)),t&&e.push(t)})}var Ne=`var(--color-activity-inbound)`,Pe=`var(--color-activity-outbound)`,Fe=`var(--color-activity-reminder)`;function Q({chip:e}){let t=e.kind===`reminder`?_:null;return(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-1 font-sans text-text-muted`,children:[t&&(0,Y.jsx)(t,{className:`h-3 w-3 shrink-0`}),(0,Y.jsx)(`span`,{className:`truncate`,children:e.label})]})}function $({time:e,dotColor:t,title:n,secondary:r,body:i,register:a=`editorial`,voice:o,failed:s,expandableBody:c}){let[l,u]=(0,E.useState)(!1),[f,p]=(0,E.useState)(!1),m=(0,E.useRef)(null),h=!!c&&!!r;(0,E.useEffect)(()=>{if(!h)return;let e=m.current;if(!e)return;let t=()=>p(e.scrollWidth>e.clientWidth+1);t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[h,r,l]);let te=!!c?.upstreamTruncated,g=h&&(f||te),_=g,v=[`relative grid grid-cols-[2.5rem_0.75rem_minmax(0,1fr)] items-baseline gap-2 py-2 pr-2 md:grid-cols-[3.5rem_0.75rem_minmax(0,1fr)] md:gap-3 md:py-2.5 md:pr-3`,o===`outbound`?`voice-outbound`:``,s?`row-failed`:``,_?`cursor-pointer min-h-[44px] rounded-sm transition-colors hover:bg-surface-elevated/60`:``].filter(Boolean).join(` `),ne=a===`chrome`?[`chrome text-[11px] font-medium uppercase tracking-[0.14em]`,s?`text-health-error`:`text-text-muted`].join(` `):[`font-serif text-[16px] leading-[1.4] text-text`,s?`font-semibold`:`font-medium`].join(` `),re=(0,Y.jsxs)(`span`,{className:`flex shrink-0 items-baseline gap-x-2`,children:[s&&(0,Y.jsx)(ee,{className:`h-3.5 w-3.5 shrink-0 self-center text-health-error`,"aria-hidden":!0}),(0,Y.jsx)(`span`,{className:ne,children:n})]}),y=r&&!(g&&l)?(0,Y.jsx)(`span`,{ref:m,className:`chrome min-w-0 truncate text-[11px] tracking-wide text-text-subtle`,children:r}):null,b=g?(0,Y.jsx)(d,{className:[`h-3 w-3 shrink-0 self-center text-text-subtle transition-transform`,l?`rotate-180`:``].join(` `),"aria-hidden":!0}):null,x=()=>u(e=>!e);return(0,Y.jsxs)(`div`,{className:v,...(0,E.useMemo)(()=>_?{role:`button`,tabIndex:0,onClick:x,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),x())},"aria-expanded":l}:{},[_,l]),children:[(0,Y.jsx)(`span`,{className:`text-right font-mono text-[10px] leading-6 text-text-subtle md:text-[11px]`,children:e}),(0,Y.jsx)(`span`,{className:`flex h-6 items-center self-start`,"aria-hidden":!0,children:(0,Y.jsx)(`span`,{className:`inline-block h-2 w-2 rounded-full`,style:{background:t}})}),(0,Y.jsxs)(`div`,{className:`min-w-0 overflow-hidden`,children:[(0,Y.jsxs)(`div`,{className:`flex items-baseline gap-x-2.5 leading-6`,children:[re,y,b]}),(i||g&&l)&&(0,Y.jsx)(`div`,{className:a===`chrome`?`mt-0.5 font-sans text-[12px] leading-[1.55] text-text-muted`:`mt-1 font-serif text-[15px] leading-[1.65] text-text`,children:g&&l?c.full:i})]})]})}function Ie(e){return e.startsWith(`image/`)}function Le(e,t){return`/api/agents/${encodeURIComponent(e)}/files/${encodeURIComponent(t)}`}function Re(e,t,n){return`/api/agents/${encodeURIComponent(e)}/slack-thumb/${encodeURIComponent(t)}?size=${n}`}function ze({files:e,agentId:t}){return(0,Y.jsx)(`div`,{className:`mt-1 flex flex-wrap gap-2`,children:e.map(e=>(0,Y.jsx)(Be,{file:e,agentId:t},e.id))})}function Be({file:e,agentId:n}){let r=!!e.localPath,i=Ie(e.mimetype),a=r?Le(n,e.id):void 0;if(e.downloadError)return(0,Y.jsxs)(`span`,{className:`inline-flex max-w-full items-center gap-1.5 rounded-sm border border-health-error/60 bg-health-error-soft px-2 py-1 font-sans text-[11px] text-health-error`,title:e.downloadError,children:[(0,Y.jsx)(w,{className:`h-3.5 w-3.5 shrink-0`}),(0,Y.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.name}),(0,Y.jsx)(`span`,{className:`shrink-0 text-text-subtle`,children:`download failed`})]});if(i&&a)return(0,Y.jsx)(`a`,{href:a,target:`_blank`,rel:`noreferrer`,className:`block max-w-full overflow-hidden rounded-sm border border-border-soft hover:border-border-strong`,title:`${e.name} · ${o(e.sizeBytes)}`,children:(0,Y.jsx)(`img`,{src:a,alt:e.name,loading:`lazy`,className:`block max-h-32 max-w-[14rem] object-cover`})});let s=(0,Y.jsxs)(Y.Fragment,{children:[i?(0,Y.jsx)(T,{className:`h-3.5 w-3.5 shrink-0`}):(0,Y.jsx)(t,{className:`h-3.5 w-3.5 shrink-0`}),(0,Y.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.name}),(0,Y.jsx)(`span`,{className:`shrink-0 text-text-subtle`,children:o(e.sizeBytes)})]});return a?(0,Y.jsx)(`a`,{href:a,target:`_blank`,rel:`noreferrer`,className:`inline-flex max-w-full items-center gap-1.5 rounded-sm border border-border-soft bg-surface-raised px-2 py-1 font-sans text-[11px] text-text-muted hover:border-border-strong hover:text-text`,title:`${e.mimetype} · ${o(e.sizeBytes)}`,children:s}):(0,Y.jsx)(`span`,{className:`inline-flex max-w-full items-center gap-1.5 rounded-sm border border-border-soft bg-surface-raised px-2 py-1 font-sans text-[11px] text-text-subtle`,title:`${e.mimetype} · ${o(e.sizeBytes)} (not cached — call \`anima file fetch ${e.id}\`)`,children:s})}function Ve({file:e,agentId:n}){let r=Ie(e.mimetype),i=e.permalink,a=r?Re(n,e.fileId,360):void 0,[s,c]=(0,E.useState)(!1),[l,u]=(0,E.useState)(!1);if(r&&a&&!s)return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`button`,{type:`button`,onClick:()=>u(!0),className:`block max-w-full overflow-hidden rounded-sm border border-border-soft transition-colors hover:border-border-strong focus-visible:outline focus-visible:outline-2 focus-visible:outline-accent`,title:`${e.filename} · ${o(e.sizeBytes)} · click to enlarge`,children:(0,Y.jsx)(`img`,{src:a,alt:e.filename,loading:`lazy`,onError:()=>c(!0),className:`block max-h-32 max-w-[14rem] object-cover`})}),l&&(0,Y.jsx)(He,{file:e,agentId:n,permalink:i,onClose:()=>u(!1)})]});let d=(0,Y.jsxs)(Y.Fragment,{children:[r?(0,Y.jsx)(T,{className:`h-3.5 w-3.5 shrink-0`}):(0,Y.jsx)(t,{className:`h-3.5 w-3.5 shrink-0`}),(0,Y.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.filename}),(0,Y.jsx)(`span`,{className:`shrink-0 text-text-subtle`,children:o(e.sizeBytes)})]});return i?(0,Y.jsx)(`a`,{href:i,target:`_blank`,rel:`noreferrer`,className:`inline-flex max-w-full items-center gap-1.5 rounded-sm border border-border-soft bg-surface-raised px-2 py-1 font-sans text-[11px] text-text-muted hover:border-border-strong hover:text-text`,title:`${e.mimetype} · ${o(e.sizeBytes)}`,children:d}):(0,Y.jsx)(`span`,{className:`inline-flex max-w-full items-center gap-1.5 rounded-sm border border-border-soft bg-surface-raised px-2 py-1 font-sans text-[11px] text-text-subtle`,title:`${e.mimetype} · ${o(e.sizeBytes)}`,children:d})}function He({file:t,agentId:n,permalink:r,onClose:i}){let a=Re(n,t.fileId,720),[s,c]=(0,E.useState)(!1);return(0,E.useEffect)(()=>{function e(e){e.key===`Escape`&&i()}window.addEventListener(`keydown`,e);let t=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{window.removeEventListener(`keydown`,e),document.body.style.overflow=t}},[i]),(0,Y.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center bg-page/85 p-6 backdrop-blur-md`,role:`dialog`,"aria-modal":`true`,"aria-label":`${t.filename} preview`,onClick:i,children:[(0,Y.jsx)(`button`,{type:`button`,onClick:i,className:`absolute right-4 top-4 flex h-9 w-9 items-center justify-center rounded-sm border border-border-soft bg-surface text-text-muted shadow-deep hover:border-border-strong hover:text-text`,title:`Close (Esc)`,"aria-label":`Close preview`,children:(0,Y.jsx)(m,{className:`h-4 w-4`})}),(0,Y.jsxs)(`div`,{className:`flex max-h-full max-w-full flex-col items-center gap-3`,onClick:e=>e.stopPropagation(),children:[s?(0,Y.jsxs)(`div`,{className:`flex flex-col items-center gap-2 rounded-sm border border-border-soft bg-surface px-8 py-10 text-center shadow-deep`,children:[(0,Y.jsx)(w,{className:`h-6 w-6 text-text-subtle`}),(0,Y.jsx)(`div`,{className:`font-serif text-[15px] text-text-muted`,children:`Preview unavailable`}),(0,Y.jsx)(`div`,{className:`font-sans text-[12px] text-text-subtle`,children:`Slack didn't generate a thumbnail for this image.`})]}):(0,Y.jsx)(`img`,{src:a,alt:t.filename,onError:()=>c(!0),className:`block max-h-[80vh] max-w-[90vw] rounded-sm border border-border-soft bg-surface object-contain shadow-deep`}),(0,Y.jsxs)(`div`,{className:`flex max-w-full items-center gap-3 rounded-sm border border-border-soft bg-surface px-3 py-2 font-sans text-[12px] text-text-muted shadow-deep`,children:[(0,Y.jsx)(`span`,{className:`truncate`,title:t.filename,children:t.filename}),(0,Y.jsx)(`span`,{className:`text-text-subtle`,children:`·`}),(0,Y.jsx)(`span`,{className:`shrink-0 text-text-subtle`,children:o(t.sizeBytes)}),r&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`span`,{className:`text-text-subtle`,children:`·`}),(0,Y.jsxs)(`a`,{href:r,target:`_blank`,rel:`noreferrer`,className:`inline-flex shrink-0 items-center gap-1 text-accent hover:underline`,children:[`Open in Slack`,(0,Y.jsx)(e,{className:`h-3 w-3`})]})]})]})]})]})}function Ue(e){if(e.permalink)return e.permalink;let t=e.messageTs??``;return`https://slack.com/app_redirect?channel=${encodeURIComponent(e.channelId)}&message_ts=${encodeURIComponent(t)}`}function We(e){let t=e.permalink;return typeof t==`string`&&t?t:void 0}function Ge({href:t}){return(0,Y.jsx)(`a`,{href:t,target:`_blank`,rel:`noreferrer`,title:`Open in Slack`,onClick:e=>e.stopPropagation(),className:`inline-flex shrink-0 items-center self-center text-text-subtle opacity-30 transition-opacity hover:opacity-100 focus-visible:opacity-100`,children:(0,Y.jsx)(e,{className:`h-3 w-3`})})}function Ke(e){return e.actor?.handle?.replace(/^@/,``)||e.actor?.displayName||`Unknown user`}function qe(e){return e.kind===`reminder`?``:e.kind===`onboarding`?e.text:e.kind===`choice_response`?`Selected: ${e.optionLabel}\nQuestion: ${e.question}`:e.text??``}function Je(e){return e.kind===`slack`}function Ye(e){return e.reminderId??e.id??`Reminder`}function Xe(){return`Onboarding`}function Ze(e){return e.answeredBy.handle?.replace(/^@/,``)||e.answeredBy.displayName||`Choice response`}function Qe(e){return e.files??[]}function $e({item:e,time:t,agentId:n,mode:r}){let i=P(e.event),a;a=e.event.kind===`onboarding`||e.event.id.startsWith(`agent-onboarding:`)?Xe():e.event.kind===`reminder`?Ye(e.event):e.event.kind===`choice_response`?Ze(e.event):Ke(e.event);let o=e.event.kind===`reminder`||i?Fe:Ne,s=qe(e.event).trim(),c=Je(e.event)?Qe(e.event):[],l=c.length>0,u=e.followupAppended&&r===`audit`,d=Je(e.event)?Ue(e.event):void 0;return(0,Y.jsx)($,{time:t,dotColor:o,title:u?(0,Y.jsxs)(`span`,{className:`inline-flex items-baseline gap-1.5`,children:[(0,Y.jsx)(`span`,{"aria-label":`continued conversation`,title:`continued conversation`,className:`font-sans text-[12px] text-text-subtle`,children:`↳`}),(0,Y.jsx)(`span`,{children:a})]}):a,secondary:(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,Y.jsx)(Q,{chip:e.surface}),d&&(0,Y.jsx)(Ge,{href:d})]}),body:s||l?(0,Y.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[s&&(0,Y.jsx)(`span`,{className:`whitespace-pre-wrap break-words`,children:X(s)}),l&&(0,Y.jsx)(ze,{files:c,agentId:n})]}):void 0})}function et({item:e,time:t}){let n=e.text.trim(),r=e.surface.kind===`thread`,i=e.surface.kind===`dm`,a=e.isEdit?`Edited`:`Replied`,o=r?`${a} in thread`:i&&e.surface.label?`${a} to ${e.surface.label.replace(/^@/,``)}`:a,s=We(e.activity.payload??{});return(0,Y.jsx)($,{time:t,dotColor:Pe,voice:`outbound`,title:o,secondary:(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,Y.jsx)(Q,{chip:e.surface}),s&&(0,Y.jsx)(Ge,{href:s})]}),body:n?(0,Y.jsx)(`span`,{className:`whitespace-pre-wrap break-words`,children:X(n)}):void 0})}function tt({item:e,time:t,agentId:n}){let r=e.caption.trim(),i=e.files.length===1?`file`:`files`,a=e.surface.kind===`thread`,o=e.surface.kind===`dm`,s=`Sent ${e.files.length} ${i}`,c=a?`${s} in thread`:o&&e.surface.label&&e.surface.label!==`DM`?`${s} to ${e.surface.label.replace(/^@/,``)}`:s,l=e.permalink??We(e.activity.payload??{});return(0,Y.jsx)($,{time:t,dotColor:Pe,voice:`outbound`,title:c,secondary:(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,Y.jsx)(Q,{chip:e.surface}),l&&(0,Y.jsx)(Ge,{href:l})]}),body:(0,Y.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[r&&(0,Y.jsx)(`span`,{className:`whitespace-pre-wrap break-words`,children:X(r)}),(0,Y.jsx)(`div`,{className:`mt-1 flex flex-wrap gap-2`,children:e.files.map(e=>(0,Y.jsx)(Ve,{file:e,agentId:n},e.fileId))})]})})}function nt({item:e,time:t}){let n=e.action===`added`?`Reacted`:`Unreacted`,r=Ae(e.emoji);return(0,Y.jsx)($,{time:t,dotColor:Pe,register:`chrome`,title:(0,Y.jsxs)(`span`,{className:`inline-flex items-baseline gap-2`,children:[(0,Y.jsx)(`span`,{children:n}),e.emoji&&(r?(0,Y.jsx)(`span`,{className:`text-[14px] leading-none normal-case`,title:e.emoji,"aria-label":e.emoji,children:r}):(0,Y.jsxs)(`span`,{className:`font-mono text-[11px] tracking-normal text-text normal-case`,title:e.emoji,children:[`:`,e.emoji,`:`]}))]}),secondary:(0,Y.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,Y.jsx)(Q,{chip:e.surface}),e.noop&&(0,Y.jsx)(`span`,{className:`chrome text-[10px] text-text-subtle`,children:e.action===`added`?`already present`:`already absent`})]})})}function rt(e){return(e.split(`
6
- `).map(e=>e.replace(/\s+/g,` `).trim()).find(e=>e.length>0)??``).replace(/\*{1,3}|_{1,3}|`+|~~|^#+\s*/g,``).trim()}function it({item:e,time:t}){let[n,r]=(0,E.useState)(!1),i=me(e.activity);if(i.kind===`unknown`)return null;let a=H(e.activity),o=!!e.subagentStreams?.length,s=e.subagentStreams?e.subagentStreams.reduce((e,t)=>e+t.items.length,0):0,c=i.kind===`output`,l=i.targetFull??i.target??``,u=c?rt(l):null,d=c&&!!l&&(l.includes(`
7
- `)||l.trim()!==u),f=c?u:i.target,p=(0,Y.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-2 overflow-hidden`,children:[f?(0,Y.jsx)(`span`,{className:`chrome min-w-0 truncate text-[11px] tracking-normal text-text-subtle normal-case`,children:f}):null,o&&(0,Y.jsxs)(`button`,{onClick:e=>{e.stopPropagation(),r(e=>!e)},className:`inline-flex shrink-0 items-center gap-0.5 chrome text-[10px] uppercase tracking-[0.1em] text-accent hover:text-accent/80 focus-visible:outline-none`,"aria-expanded":n,"aria-label":n?`Collapse subagent steps`:`Expand subagent steps`,children:[(0,Y.jsx)(h,{className:[`h-2.5 w-2.5 transition-transform`,n?`rotate-90`:``].join(` `),"aria-hidden":!0}),e.subagentStreams.length>1?`${e.subagentStreams.length} subagents`:`${s} step${s===1?``:`s`}`]})]}),m=c?l||void 0:i.targetFull??i.target,ee=m?{full:(0,Y.jsx)(`pre`,{className:`whitespace-pre-wrap break-words font-mono text-[12px] leading-[1.55] text-text-muted`,children:m}),upstreamTruncated:c?d:!!i.targetFull}:void 0;return(0,Y.jsxs)(`div`,{children:[(0,Y.jsx)($,{time:t,dotColor:i.color,register:`chrome`,failed:a,title:i.title,secondary:p,expandableBody:ee}),o&&n&&(0,Y.jsx)(at,{streams:e.subagentStreams,multipleStreams:e.subagentStreams.length>1})]})}function at({streams:e,multipleStreams:t}){return(0,Y.jsx)(`div`,{className:`ml-[2.5rem] mt-0.5 mb-2 border-l-2 border-spine-border/40 pl-3 md:ml-[3.5rem]`,children:e.map(e=>(0,Y.jsx)(ot,{stream:e,showHeader:t},e.subRunId))})}function ot({stream:e,showHeader:t}){let n=[e.name,e.role].filter(Boolean).join(` · `);return(0,Y.jsxs)(`div`,{className:`py-0.5`,children:[t&&n&&(0,Y.jsx)(`span`,{className:`chrome block mb-0.5 text-[10px] uppercase tracking-[0.12em] text-text-subtle`,children:n}),e.items.map((e,t)=>{let n=c(e.timestamp);if(e.kind===`message-out`)return(0,Y.jsx)(et,{item:e,time:n},t);if(e.kind===`file-out`)return(0,Y.jsx)(tt,{item:e,time:n,agentId:``},t);if(e.kind===`reaction-out`)return(0,Y.jsx)(nt,{item:e,time:n},t);if(e.kind===`step`){let r=me(e.activity);if(r.kind===`unknown`)return null;let i=H(e.activity),a=r.target?(0,Y.jsx)(`span`,{className:`chrome min-w-0 truncate text-[11px] tracking-normal text-text-subtle normal-case`,children:r.target}):void 0,o=r.targetFull??r.target,s=o?{full:(0,Y.jsx)(`pre`,{className:`whitespace-pre-wrap break-words font-mono text-[12px] leading-[1.55] text-text-muted`,children:o}),upstreamTruncated:!!r.targetFull}:void 0;return(0,Y.jsx)($,{time:n,dotColor:r.color,register:`chrome`,failed:i,title:r.title,secondary:a,expandableBody:s},t)}return null})]})}function st({latestActivity:e}){let t=e?.type===`tool.call.started`?`Working`:`Thinking`;return(0,Y.jsxs)(`div`,{className:`grid grid-cols-[2.5rem_0.75rem_minmax(0,1fr)] items-center gap-2 py-2 md:grid-cols-[3.5rem_0.75rem_minmax(0,1fr)] md:gap-3`,children:[(0,Y.jsx)(`span`,{}),(0,Y.jsx)(`span`,{className:`flex h-6 items-center`,"aria-hidden":!0,children:(0,Y.jsx)(`span`,{className:`inline-block h-2 w-2 animate-pulse rounded-full`,style:{background:`var(--color-health-warn)`}})}),(0,Y.jsxs)(`span`,{className:`chrome text-[11px] font-medium uppercase tracking-[0.12em] text-text-muted`,children:[t,`…`]})]})}function ct({date:e,children:t}){return(0,Y.jsxs)(`div`,{children:[(0,Y.jsxs)(`div`,{className:`mt-8 mb-3 flex items-center gap-4 first:mt-2`,children:[(0,Y.jsx)(`span`,{className:`caps text-text-muted`,children:i(e)}),(0,Y.jsx)(`span`,{className:`h-px flex-1 bg-border-soft`})]}),(0,Y.jsx)(`div`,{children:t})]})}function lt({dir:e,onChange:t}){return(0,Y.jsx)(`div`,{className:`flex items-center rounded-sm border border-border-soft p-0.5`,children:[`all`,`in`,`out`].map(n=>(0,Y.jsx)(`button`,{type:`button`,onClick:()=>t(n),className:[`chrome px-2.5 py-1.5 text-[11px] tracking-wide rounded-sm transition-colors min-h-[36px] flex items-center`,e===n?`bg-accent/10 text-accent font-medium`:`text-text-muted hover:text-text`].join(` `),children:n===`all`?`All`:n===`in`?`Inbox`:`Outbox`},n))})}function ut({lens:e,onChange:t}){let n=`chrome px-2.5 py-1.5 text-[11px] tracking-wide rounded-sm transition-colors min-h-[36px] flex items-center`,r=`bg-accent/10 text-accent font-medium`,i=`text-text-muted hover:text-text`;return(0,Y.jsxs)(`div`,{className:`flex items-center rounded-sm border border-border-soft p-0.5`,children:[(0,Y.jsx)(`button`,{type:`button`,onClick:()=>t(`messages`),className:[n,e===`messages`?r:i].join(` `),children:`Conversation`}),(0,Y.jsx)(`button`,{type:`button`,onClick:()=>t(`activity`),className:[n,e===`activity`?r:i].join(` `),children:`Activity`})]})}function dt(e){return e.kind===`message-in`||e.kind===`message-out`||e.kind===`file-out`||e.kind===`reaction-out`}function ft(){let{data:e=[]}=ie({queryKey:b.agentStatuses(),queryFn:g}),{agentId:t}=l(),{failedOnly:n,lens:r,dir:i,showAllSteps:o,setFailedOnly:s,setLens:d,setDir:f,setShowAllSteps:p}=re(),m=(0,E.useRef)(null),h=(0,E.useRef)(null),_=(0,E.useRef)(!0),v=(0,E.useRef)(0),y=oe({queryKey:b.agentActivities(t??``),queryFn:({pageParam:e})=>te(t,100,e),enabled:!!t&&r===`activity`,initialPageParam:void 0,getPreviousPageParam:e=>e.nextCursor??void 0,getNextPageParam:()=>void 0,refetchInterval:t?ae.agentActivities:!1}),x=i===`all`?void 0:i,S=oe({queryKey:b.agentMessages(t??``,i),queryFn:({pageParam:e})=>ne(t,{before:e,direction:x,limit:100}),enabled:!!t&&r===`messages`,initialPageParam:void 0,getPreviousPageParam:e=>e.nextCursor??void 0,getNextPageParam:()=>void 0,refetchInterval:t?ae.agentActivities:!1}),C=r===`messages`?S.error:y.error,w=r===`messages`?S.isLoading:y.isLoading,T=r===`messages`?S.fetchPreviousPage:y.fetchPreviousPage,D=r===`messages`?S.hasPreviousPage:y.hasPreviousPage,O=r===`messages`?S.isFetchingPreviousPage:y.isFetchingPreviousPage,k=(0,E.useMemo)(()=>{if(!y.data?.pages.length)return;let e=new Map;for(let t of y.data.pages)for(let n of t.events??[]){let t=n.kind===`activity`?`activity:${n.activity.activityId}`:`inbox:${n.item.id}`;e.set(t,n)}return{events:Array.from(e.values())}},[y.data]),A=(0,E.useMemo)(()=>{if(!S.data?.pages.length)return;let e=new Map;for(let t of S.data.pages)for(let n of t.entries??[])e.set(n.messageId,n);return{entries:Array.from(e.values())}},[S.data]),j=e.find(e=>e.agentId===t),M=j?.currentItemId,N=j?.currentItemStartedAt,P=(0,E.useMemo)(()=>r===`messages`?A?ce(A):[]:k?se(k,o):[],[k,A,r,o]),F=(0,E.useMemo)(()=>{if(r===`messages`)return P.filter(e=>!(!dt(e)||i===`in`&&e.kind!==`message-in`||i===`out`&&e.kind===`message-in`));if(!o){let e=new Set;for(let t of P)if(t.kind===`step`&&t.activity.type===`tool.call.failed`){let n=t.activity.payload?.providerToolId;typeof n==`string`&&n&&e.add(n)}return P.filter(t=>{if(t.kind===`step`){if(!pe(t.activity))return!1;if(t.activity.type===`tool.call.started`&&e.size>0){let n=t.activity.payload?.providerToolId;if(typeof n==`string`&&n&&e.has(n))return!1}}return!(n&&(t.kind!==`step`||!H(t.activity)))})}return P.filter(e=>!(n&&(e.kind!==`step`||!H(e.activity))))},[P,r,i,n,o]),I=(0,E.useMemo)(()=>{if(!M||!k)return;let e=k.events.flatMap(e=>e.kind===`activity`?[e.activity]:[]),t=N?e.filter(e=>e.createdAt>=N):e;if(t.length)return t.reduce((e,t)=>t.createdAt>e.createdAt?t:e)},[M,N,k]),L=C instanceof Error?C.message:C?String(C):null,le=(0,E.useMemo)(()=>{let e=new Map;for(let t of F){let n=u(t.timestamp),r=e.get(n);r||(r=[],e.set(n,r)),r.push(t)}return Array.from(e.entries()).sort(([e],[t])=>e.localeCompare(t))},[F]),R=(0,E.useRef)(null);(0,E.useEffect)(()=>{let e=m.current;if(!e)return;function t(){_.current=e.scrollHeight-e.scrollTop-e.clientHeight<80,e.scrollTop<100&&D&&!O&&(v.current=e.scrollHeight,T())}return e.addEventListener(`scroll`,t,{passive:!0}),()=>e.removeEventListener(`scroll`,t)},[D,O,T]),(0,E.useEffect)(()=>{if(v.current===0)return;let e=m.current;e&&requestAnimationFrame(()=>{let t=e.scrollHeight-v.current;t>0&&(e.scrollTop+=t),v.current=0})},[r===`messages`?S.data?.pages.length??0:y.data?.pages.length??0]),(0,E.useEffect)(()=>{let e=t?`${t}:${r}:${i}`:null;if(!(r===`messages`?A:k)||!e||R.current===e)return;R.current=e,_.current=!0;let n=m.current;if(!n)return;let a,o=requestAnimationFrame(()=>{a=requestAnimationFrame(()=>{n.scrollTop=n.scrollHeight})});return()=>{cancelAnimationFrame(o),cancelAnimationFrame(a)}},[t,k,A,r,i]),(0,E.useEffect)(()=>{if(!M)return;_.current=!0;let e=m.current;if(!e)return;let t=requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight});return()=>cancelAnimationFrame(t)},[M]),(0,E.useEffect)(()=>{if(!I||!_.current)return;let e=m.current;if(!e)return;let t=requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight});return()=>cancelAnimationFrame(t)},[I]);let ue=r===`activity`&&o?`audit`:`conversation`;return(0,Y.jsxs)(`div`,{className:`flex h-full flex-col overflow-hidden bg-surface`,children:[L&&(0,Y.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2.5 border-b border-health-error/30 bg-health-error-soft px-4 py-2 text-health-error`,children:[(0,Y.jsx)(ee,{className:`h-3.5 w-3.5 shrink-0`}),(0,Y.jsx)(`span`,{className:`flex-1 font-mono text-[11px] leading-snug`,children:`Could not load activity`})]}),(0,Y.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 border-b border-border-soft px-4 py-2 md:hidden`,children:[(0,Y.jsx)(ut,{lens:r,onChange:d}),r===`messages`&&(0,Y.jsx)(lt,{dir:i,onChange:f}),r===`activity`&&(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`label`,{className:`chrome inline-flex cursor-pointer items-center gap-1.5 min-h-[36px] px-1 text-[11px] tracking-wide text-text-muted`,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:n,onChange:e=>s(e.target.checked),className:`h-3 w-3 accent-[color:var(--color-accent)]`}),`Failed only`]}),(0,Y.jsxs)(`label`,{className:`chrome inline-flex cursor-pointer items-center gap-1.5 min-h-[36px] px-1 text-[11px] tracking-wide text-text-muted`,children:[(0,Y.jsx)(`input`,{type:`checkbox`,checked:o,onChange:e=>p(e.target.checked),className:`h-3 w-3 accent-[color:var(--color-accent)]`}),`Show all steps`]})]})]}),(0,Y.jsxs)(`div`,{ref:m,className:`flex-1 overflow-x-hidden overflow-y-auto px-4 pt-3 pb-[calc(64px+env(safe-area-inset-bottom))] md:px-10 md:pt-5 md:pb-10`,children:[O&&(0,Y.jsx)(`div`,{className:`flex justify-center py-3`,children:(0,Y.jsx)(a,{className:`h-3.5 w-3.5 animate-spin text-text-subtle`,"aria-label":`Loading older activity`})}),F.length===0&&(0,Y.jsx)(`div`,{className:`mt-20 text-center`,children:(0,Y.jsx)(`p`,{className:`font-serif italic text-[15px] text-text-subtle`,children:w?`Loading activity...`:r===`messages`&&i!==`all`?`No ${i===`in`?`inbox`:`outbox`} messages yet.`:r===`messages`?`No messages yet.`:n?`No activity matches the current filters.`:`No activity yet.`})}),F.length>0&&le.map(([e,n])=>{let r=``;return(0,Y.jsx)(ct,{date:n[0].timestamp,children:n.map((n,i)=>{let a=c(n.timestamp),o=a===r?``:a;r=a;let s=`${e}::${i}`;return n.kind===`message-in`?(0,Y.jsx)($e,{item:n,time:o,agentId:t??``,mode:ue},s):n.kind===`message-out`?(0,Y.jsx)(et,{item:n,time:o},s):n.kind===`file-out`?(0,Y.jsx)(tt,{item:n,time:o,agentId:t??``},s):n.kind===`reaction-out`?(0,Y.jsx)(nt,{item:n,time:o},s):(0,Y.jsx)(it,{item:n,time:o},s)})},e)}),M&&!w&&(0,Y.jsx)(st,{latestActivity:I}),(0,Y.jsx)(`div`,{ref:h,className:`h-4`})]})]})}export{ft as default};
@@ -1 +0,0 @@
1
- import{tt as e}from"./index-CzAQnbuO.js";var t=e(`globe`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]);export{t};