heyio 1.12.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/dist/api/middleware/auth.d.ts +14 -0
  2. package/dist/api/middleware/auth.d.ts.map +1 -0
  3. package/dist/api/middleware/auth.js +66 -0
  4. package/dist/api/middleware/auth.js.map +1 -0
  5. package/dist/api/notifications.d.ts +14 -0
  6. package/dist/api/notifications.d.ts.map +1 -0
  7. package/dist/api/notifications.js +112 -0
  8. package/dist/api/notifications.js.map +1 -0
  9. package/dist/api/routes/activity.d.ts +3 -0
  10. package/dist/api/routes/activity.d.ts.map +1 -0
  11. package/dist/api/routes/activity.js +28 -0
  12. package/dist/api/routes/activity.js.map +1 -0
  13. package/dist/api/routes/attachments.d.ts +3 -0
  14. package/dist/api/routes/attachments.d.ts.map +1 -0
  15. package/dist/api/routes/attachments.js +83 -0
  16. package/dist/api/routes/attachments.js.map +1 -0
  17. package/dist/api/routes/config.d.ts +3 -0
  18. package/dist/api/routes/config.d.ts.map +1 -0
  19. package/dist/api/routes/config.js +106 -0
  20. package/dist/api/routes/config.js.map +1 -0
  21. package/dist/api/routes/conversations.d.ts +3 -0
  22. package/dist/api/routes/conversations.d.ts.map +1 -0
  23. package/dist/api/routes/conversations.js +69 -0
  24. package/dist/api/routes/conversations.js.map +1 -0
  25. package/dist/api/routes/health.d.ts +3 -0
  26. package/dist/api/routes/health.d.ts.map +1 -0
  27. package/dist/api/routes/health.js +16 -0
  28. package/dist/api/routes/health.js.map +1 -0
  29. package/dist/api/routes/inbox.d.ts +3 -0
  30. package/dist/api/routes/inbox.d.ts.map +1 -0
  31. package/dist/api/routes/inbox.js +88 -0
  32. package/dist/api/routes/inbox.js.map +1 -0
  33. package/dist/api/routes/schedules.d.ts +3 -0
  34. package/dist/api/routes/schedules.d.ts.map +1 -0
  35. package/dist/api/routes/schedules.js +96 -0
  36. package/dist/api/routes/schedules.js.map +1 -0
  37. package/dist/api/routes/skills.d.ts +2 -0
  38. package/dist/api/routes/skills.d.ts.map +1 -0
  39. package/dist/api/routes/skills.js +85 -0
  40. package/dist/api/routes/skills.js.map +1 -0
  41. package/dist/api/routes/squads.d.ts +3 -0
  42. package/dist/api/routes/squads.d.ts.map +1 -0
  43. package/dist/api/routes/squads.js +129 -0
  44. package/dist/api/routes/squads.js.map +1 -0
  45. package/dist/api/routes/usage.d.ts +3 -0
  46. package/dist/api/routes/usage.d.ts.map +1 -0
  47. package/dist/api/routes/usage.js +55 -0
  48. package/dist/api/routes/usage.js.map +1 -0
  49. package/dist/api/routes/wiki.d.ts +2 -0
  50. package/dist/api/routes/wiki.d.ts.map +1 -0
  51. package/dist/api/routes/wiki.js +43 -0
  52. package/dist/api/routes/wiki.js.map +1 -0
  53. package/dist/api/server.d.ts +7 -0
  54. package/dist/api/server.d.ts.map +1 -0
  55. package/dist/api/server.js +136 -634
  56. package/dist/api/server.js.map +1 -0
  57. package/dist/config.d.ts +3 -0
  58. package/dist/config.d.ts.map +1 -0
  59. package/dist/config.js +2 -91
  60. package/dist/config.js.map +1 -0
  61. package/dist/copilot/client.d.ts +5 -0
  62. package/dist/copilot/client.d.ts.map +1 -0
  63. package/dist/copilot/client.js +19 -11
  64. package/dist/copilot/client.js.map +1 -0
  65. package/dist/copilot/health-monitor.d.ts +14 -0
  66. package/dist/copilot/health-monitor.d.ts.map +1 -0
  67. package/dist/copilot/health-monitor.js +70 -0
  68. package/dist/copilot/health-monitor.js.map +1 -0
  69. package/dist/copilot/orchestrator.d.ts +5 -0
  70. package/dist/copilot/orchestrator.d.ts.map +1 -0
  71. package/dist/copilot/orchestrator.js +127 -123
  72. package/dist/copilot/orchestrator.js.map +1 -0
  73. package/dist/copilot/tools.d.ts +49 -0
  74. package/dist/copilot/tools.d.ts.map +1 -0
  75. package/dist/copilot/tools.js +545 -321
  76. package/dist/copilot/tools.js.map +1 -0
  77. package/dist/index.d.ts +3 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +82 -26
  80. package/dist/index.js.map +1 -0
  81. package/dist/logging/logger.d.ts +6 -0
  82. package/dist/logging/logger.d.ts.map +1 -0
  83. package/dist/logging/logger.js +21 -0
  84. package/dist/logging/logger.js.map +1 -0
  85. package/dist/models/index.d.ts +6 -0
  86. package/dist/models/index.d.ts.map +1 -0
  87. package/dist/models/index.js +4 -0
  88. package/dist/models/index.js.map +1 -0
  89. package/dist/models/pricing.d.ts +25 -0
  90. package/dist/models/pricing.d.ts.map +1 -0
  91. package/dist/models/pricing.js +96 -0
  92. package/dist/models/pricing.js.map +1 -0
  93. package/dist/models/registry.d.ts +34 -0
  94. package/dist/models/registry.d.ts.map +1 -0
  95. package/dist/models/registry.js +109 -0
  96. package/dist/models/registry.js.map +1 -0
  97. package/dist/models/token-tracker.d.ts +40 -0
  98. package/dist/models/token-tracker.d.ts.map +1 -0
  99. package/dist/models/token-tracker.js +102 -0
  100. package/dist/models/token-tracker.js.map +1 -0
  101. package/dist/scheduler/engine.d.ts +9 -0
  102. package/dist/scheduler/engine.d.ts.map +1 -0
  103. package/dist/scheduler/engine.js +127 -0
  104. package/dist/scheduler/engine.js.map +1 -0
  105. package/dist/skills/index.d.ts +3 -0
  106. package/dist/skills/index.d.ts.map +1 -0
  107. package/dist/skills/index.js +2 -0
  108. package/dist/skills/index.js.map +1 -0
  109. package/dist/skills/store.d.ts +52 -0
  110. package/dist/skills/store.d.ts.map +1 -0
  111. package/dist/skills/store.js +148 -0
  112. package/dist/skills/store.js.map +1 -0
  113. package/dist/squad/agent.d.ts +46 -0
  114. package/dist/squad/agent.d.ts.map +1 -0
  115. package/dist/squad/agent.js +261 -0
  116. package/dist/squad/agent.js.map +1 -0
  117. package/dist/squad/autonomy.d.ts +16 -0
  118. package/dist/squad/autonomy.d.ts.map +1 -0
  119. package/dist/squad/autonomy.js +63 -0
  120. package/dist/squad/autonomy.js.map +1 -0
  121. package/dist/squad/event-bus.d.ts +22 -0
  122. package/dist/squad/event-bus.d.ts.map +1 -0
  123. package/dist/squad/event-bus.js +56 -0
  124. package/dist/squad/event-bus.js.map +1 -0
  125. package/dist/squad/execution/index.d.ts +12 -0
  126. package/dist/squad/execution/index.d.ts.map +1 -0
  127. package/dist/squad/execution/index.js +7 -0
  128. package/dist/squad/execution/index.js.map +1 -0
  129. package/dist/squad/execution/instance.d.ts +40 -0
  130. package/dist/squad/execution/instance.d.ts.map +1 -0
  131. package/dist/squad/execution/instance.js +138 -0
  132. package/dist/squad/execution/instance.js.map +1 -0
  133. package/dist/squad/execution/meeting.d.ts +25 -0
  134. package/dist/squad/execution/meeting.d.ts.map +1 -0
  135. package/dist/squad/execution/meeting.js +140 -0
  136. package/dist/squad/execution/meeting.js.map +1 -0
  137. package/dist/squad/execution/pr.d.ts +15 -0
  138. package/dist/squad/execution/pr.d.ts.map +1 -0
  139. package/dist/squad/execution/pr.js +93 -0
  140. package/dist/squad/execution/pr.js.map +1 -0
  141. package/dist/squad/execution/runner.d.ts +22 -0
  142. package/dist/squad/execution/runner.d.ts.map +1 -0
  143. package/dist/squad/execution/runner.js +68 -0
  144. package/dist/squad/execution/runner.js.map +1 -0
  145. package/dist/squad/execution/tasks.d.ts +11 -0
  146. package/dist/squad/execution/tasks.d.ts.map +1 -0
  147. package/dist/squad/execution/tasks.js +85 -0
  148. package/dist/squad/execution/tasks.js.map +1 -0
  149. package/dist/squad/execution/worktree.d.ts +26 -0
  150. package/dist/squad/execution/worktree.d.ts.map +1 -0
  151. package/dist/squad/execution/worktree.js +111 -0
  152. package/dist/squad/execution/worktree.js.map +1 -0
  153. package/dist/squad/hiring.d.ts +32 -0
  154. package/dist/squad/hiring.d.ts.map +1 -0
  155. package/dist/squad/hiring.js +200 -0
  156. package/dist/squad/hiring.js.map +1 -0
  157. package/dist/squad/index.d.ts +8 -0
  158. package/dist/squad/index.d.ts.map +1 -0
  159. package/dist/squad/index.js +6 -0
  160. package/dist/squad/index.js.map +1 -0
  161. package/dist/squad/manager.d.ts +48 -0
  162. package/dist/squad/manager.d.ts.map +1 -0
  163. package/dist/squad/manager.js +274 -0
  164. package/dist/squad/manager.js.map +1 -0
  165. package/dist/squad/name-generator.d.ts +16 -0
  166. package/dist/squad/name-generator.d.ts.map +1 -0
  167. package/dist/squad/name-generator.js +113 -0
  168. package/dist/squad/name-generator.js.map +1 -0
  169. package/dist/squad/roles/templates.d.ts +5 -0
  170. package/dist/squad/roles/templates.d.ts.map +1 -0
  171. package/dist/squad/roles/templates.js +102 -0
  172. package/dist/squad/roles/templates.js.map +1 -0
  173. package/dist/squad/skill-parser.d.ts +36 -0
  174. package/dist/squad/skill-parser.d.ts.map +1 -0
  175. package/dist/squad/skill-parser.js +83 -0
  176. package/dist/squad/skill-parser.js.map +1 -0
  177. package/dist/squad/source-resolver.d.ts +20 -0
  178. package/dist/squad/source-resolver.d.ts.map +1 -0
  179. package/dist/squad/source-resolver.js +52 -0
  180. package/dist/squad/source-resolver.js.map +1 -0
  181. package/dist/store/activity.d.ts +43 -0
  182. package/dist/store/activity.d.ts.map +1 -0
  183. package/dist/store/activity.js +131 -0
  184. package/dist/store/activity.js.map +1 -0
  185. package/dist/store/db.d.ts +5 -0
  186. package/dist/store/db.d.ts.map +1 -0
  187. package/dist/store/db.js +209 -248
  188. package/dist/store/db.js.map +1 -0
  189. package/dist/store/inbox.d.ts +53 -0
  190. package/dist/store/inbox.d.ts.map +1 -0
  191. package/dist/store/inbox.js +151 -0
  192. package/dist/store/inbox.js.map +1 -0
  193. package/dist/store/schedules.d.ts +53 -0
  194. package/dist/store/schedules.d.ts.map +1 -0
  195. package/dist/store/schedules.js +149 -54
  196. package/dist/store/schedules.js.map +1 -0
  197. package/dist/wiki/index.d.ts +3 -0
  198. package/dist/wiki/index.d.ts.map +1 -0
  199. package/dist/wiki/index.js +2 -0
  200. package/dist/wiki/index.js.map +1 -0
  201. package/dist/wiki/store.d.ts +49 -0
  202. package/dist/wiki/store.d.ts.map +1 -0
  203. package/dist/wiki/store.js +115 -0
  204. package/dist/wiki/store.js.map +1 -0
  205. package/package.json +52 -56
  206. package/src/api/middleware/auth.ts +76 -0
  207. package/src/api/notifications.ts +122 -0
  208. package/src/api/routes/activity.ts +29 -0
  209. package/src/api/routes/attachments.ts +93 -0
  210. package/src/api/routes/config.ts +115 -0
  211. package/src/api/routes/conversations.ts +87 -0
  212. package/src/api/routes/health.ts +18 -0
  213. package/src/api/routes/inbox.ts +98 -0
  214. package/src/api/routes/schedules.ts +121 -0
  215. package/src/api/routes/skills.ts +105 -0
  216. package/src/api/routes/squads.ts +145 -0
  217. package/src/api/routes/usage.ts +57 -0
  218. package/src/api/routes/wiki.ts +49 -0
  219. package/src/api/server.ts +186 -0
  220. package/src/config.ts +3 -0
  221. package/src/copilot/client.ts +42 -0
  222. package/src/copilot/health-monitor.ts +85 -0
  223. package/src/copilot/orchestrator.ts +222 -0
  224. package/src/copilot/tools.ts +707 -0
  225. package/src/index.ts +112 -0
  226. package/src/logging/logger.ts +26 -0
  227. package/src/models/index.ts +11 -0
  228. package/src/models/pricing.ts +121 -0
  229. package/src/models/registry.ts +131 -0
  230. package/src/models/token-tracker.ts +151 -0
  231. package/src/scheduler/engine.ts +146 -0
  232. package/src/skills/index.ts +13 -0
  233. package/src/skills/store.ts +188 -0
  234. package/src/squad/agent.ts +326 -0
  235. package/src/squad/autonomy.ts +78 -0
  236. package/src/squad/event-bus.ts +71 -0
  237. package/src/squad/execution/index.ts +17 -0
  238. package/src/squad/execution/instance.ts +186 -0
  239. package/src/squad/execution/meeting.ts +191 -0
  240. package/src/squad/execution/pr.ts +127 -0
  241. package/src/squad/execution/runner.ts +97 -0
  242. package/src/squad/execution/tasks.ts +111 -0
  243. package/src/squad/execution/worktree.ts +138 -0
  244. package/src/squad/hiring.ts +222 -0
  245. package/src/squad/index.ts +17 -0
  246. package/src/squad/manager.ts +337 -0
  247. package/src/squad/name-generator.ts +135 -0
  248. package/src/squad/roles/templates.ts +104 -0
  249. package/src/squad/skill-parser.ts +120 -0
  250. package/src/squad/source-resolver.ts +57 -0
  251. package/src/store/activity.ts +176 -0
  252. package/src/store/db.ts +237 -0
  253. package/src/store/inbox.ts +199 -0
  254. package/src/store/schedules.ts +199 -0
  255. package/src/wiki/index.ts +12 -0
  256. package/src/wiki/store.ts +139 -0
  257. package/tsconfig.json +9 -0
  258. package/LICENSE +0 -21
  259. package/README.md +0 -333
  260. package/dist/api/auth.js +0 -46
  261. package/dist/chat/attachments.js +0 -112
  262. package/dist/copilot/agents.js +0 -309
  263. package/dist/copilot/ceremonies.js +0 -174
  264. package/dist/copilot/gh-token.js +0 -64
  265. package/dist/copilot/io-scheduler.js +0 -79
  266. package/dist/copilot/model-router.js +0 -114
  267. package/dist/copilot/scheduler.js +0 -88
  268. package/dist/copilot/skills.js +0 -246
  269. package/dist/copilot/specialist-runner.js +0 -191
  270. package/dist/copilot/squad-tools.js +0 -258
  271. package/dist/copilot/system-message.js +0 -86
  272. package/dist/copilot/token-tracker.js +0 -98
  273. package/dist/copilot/trigger-schedule.js +0 -33
  274. package/dist/daemon.js +0 -67
  275. package/dist/logging.js +0 -27
  276. package/dist/mcp/config.js +0 -29
  277. package/dist/mcp/index.js +0 -3
  278. package/dist/mcp/registry.js +0 -42
  279. package/dist/notify.js +0 -25
  280. package/dist/paths.js +0 -17
  281. package/dist/setup.js +0 -35
  282. package/dist/store/agent-events.js +0 -19
  283. package/dist/store/audit-log.js +0 -71
  284. package/dist/store/conversations.js +0 -164
  285. package/dist/store/feed.js +0 -44
  286. package/dist/store/instances.js +0 -75
  287. package/dist/store/squad-colors.js +0 -23
  288. package/dist/store/squads.js +0 -60
  289. package/dist/store/tasks.js +0 -78
  290. package/dist/store/token-usage.js +0 -94
  291. package/dist/telegram/bot.js +0 -41
  292. package/dist/telegram/handlers.js +0 -42
  293. package/dist/watchdog.js +0 -37
  294. package/dist/wiki/backlinks.js +0 -51
  295. package/dist/wiki/fs.js +0 -108
  296. package/dist/wiki/search.js +0 -47
  297. package/web-dist/assets/AuditLogView-C5QtUQBq.js +0 -6
  298. package/web-dist/assets/ChatView-DLu9BMg8.js +0 -1
  299. package/web-dist/assets/FeedView-6OV-l6Gl.js +0 -6
  300. package/web-dist/assets/HistoryView-DizPqv0y.js +0 -1
  301. package/web-dist/assets/LoginView-CG1O9fmR.js +0 -1
  302. package/web-dist/assets/McpView-TJN-fZvI.js +0 -1
  303. package/web-dist/assets/SchedulesView-BDFpImX6.js +0 -6
  304. package/web-dist/assets/SettingsView-D-K1iC1c.js +0 -1
  305. package/web-dist/assets/SkillsView-DnNmO192.js +0 -15
  306. package/web-dist/assets/SquadDetailView-BBvrgHzn.js +0 -26
  307. package/web-dist/assets/SquadHealthView-DF2zF9D3.js +0 -11
  308. package/web-dist/assets/SquadsView-CPVzko7k.js +0 -6
  309. package/web-dist/assets/ToggleSwitch.vue_vue_type_script_setup_true_lang-Bk_t9_Rn.js +0 -1
  310. package/web-dist/assets/UsageView-OcyM5k14.js +0 -16
  311. package/web-dist/assets/WikiView-KhFqBZI0.js +0 -26
  312. package/web-dist/assets/api-BiDVwQrs.js +0 -1
  313. package/web-dist/assets/arrow-left-DFbf2tii.js +0 -6
  314. package/web-dist/assets/git-branch-BLstr_Gr.js +0 -6
  315. package/web-dist/assets/index-B-o45ao1.css +0 -1
  316. package/web-dist/assets/index-DCJUYZtV.js +0 -269
  317. package/web-dist/assets/pencil-D4Zz_t0y.js +0 -6
  318. package/web-dist/assets/plus-gmwiZVfr.js +0 -6
  319. package/web-dist/assets/save-BvtAs5WB.js +0 -6
  320. package/web-dist/assets/search-BabUvoGD.js +0 -6
  321. package/web-dist/assets/squad-colors-B8B_Y-lz.js +0 -1
  322. package/web-dist/assets/trash-2-C21cNLJl.js +0 -6
  323. package/web-dist/assets/triangle-alert-BrzY_E1n.js +0 -6
  324. package/web-dist/assets/x-xgLSmc9e.js +0 -6
  325. package/web-dist/favicon.svg +0 -10
  326. package/web-dist/index.html +0 -14
  327. package/web-dist/logo.svg +0 -10
@@ -0,0 +1,102 @@
1
+ import { createChildLogger } from '../logging/logger.js';
2
+ import { getDatabase } from '../store/db.js';
3
+ const logger = () => createChildLogger('token-tracker');
4
+ /**
5
+ * Record token usage from an LLM call.
6
+ */
7
+ export async function recordTokenUsage(record) {
8
+ const db = getDatabase();
9
+ // Estimate cost if pricing is available
10
+ let cost = record.estimatedCostUsd;
11
+ if (cost === undefined) {
12
+ cost = await estimateCost(record.model, record.inputTokens, record.outputTokens);
13
+ }
14
+ await db.execute({
15
+ sql: `INSERT INTO token_usage (squad_id, instance_id, agent_role, model, input_tokens, output_tokens, estimated_cost_usd)
16
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
17
+ args: [
18
+ record.squadId ?? null,
19
+ record.instanceId ?? null,
20
+ record.agentRole ?? null,
21
+ record.model,
22
+ record.inputTokens,
23
+ record.outputTokens,
24
+ cost ?? null,
25
+ ],
26
+ });
27
+ }
28
+ /**
29
+ * Estimate cost for a call based on stored pricing.
30
+ */
31
+ async function estimateCost(model, inputTokens, outputTokens) {
32
+ const db = getDatabase();
33
+ const result = await db.execute({
34
+ sql: 'SELECT input_cost_per_1m, output_cost_per_1m FROM model_pricing WHERE model = ?',
35
+ args: [model],
36
+ });
37
+ if (result.rows.length === 0)
38
+ return undefined;
39
+ const row = result.rows[0];
40
+ const inputCost = (row.input_cost_per_1m / 1_000_000) * inputTokens;
41
+ const outputCost = (row.output_cost_per_1m / 1_000_000) * outputTokens;
42
+ return inputCost + outputCost;
43
+ }
44
+ /**
45
+ * Query token usage with filters.
46
+ */
47
+ export async function queryUsage(filters) {
48
+ const db = getDatabase();
49
+ const conditions = [];
50
+ const args = [];
51
+ if (filters?.squadId) {
52
+ conditions.push('squad_id = ?');
53
+ args.push(filters.squadId);
54
+ }
55
+ if (filters?.agentRole) {
56
+ conditions.push('agent_role = ?');
57
+ args.push(filters.agentRole);
58
+ }
59
+ if (filters?.model) {
60
+ conditions.push('model = ?');
61
+ args.push(filters.model);
62
+ }
63
+ if (filters?.since) {
64
+ conditions.push('timestamp >= ?');
65
+ args.push(filters.since);
66
+ }
67
+ if (filters?.until) {
68
+ conditions.push('timestamp <= ?');
69
+ args.push(filters.until);
70
+ }
71
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
72
+ const result = await db.execute({
73
+ sql: `SELECT model, input_tokens, output_tokens, estimated_cost_usd, timestamp, squad_id, agent_role
74
+ FROM token_usage ${where} ORDER BY timestamp DESC LIMIT 500`,
75
+ args,
76
+ });
77
+ const records = result.rows.map((row) => ({
78
+ model: row.model,
79
+ inputTokens: row.input_tokens,
80
+ outputTokens: row.output_tokens,
81
+ estimatedCostUsd: row.estimated_cost_usd,
82
+ timestamp: row.timestamp,
83
+ squadId: row.squad_id,
84
+ agentRole: row.agent_role,
85
+ }));
86
+ // Totals
87
+ const totalsResult = await db.execute({
88
+ sql: `SELECT COUNT(*) as cnt, COALESCE(SUM(input_tokens), 0) as total_in,
89
+ COALESCE(SUM(output_tokens), 0) as total_out, COALESCE(SUM(estimated_cost_usd), 0) as total_cost
90
+ FROM token_usage ${where}`,
91
+ args,
92
+ });
93
+ const totalsRow = totalsResult.rows[0];
94
+ const totals = {
95
+ callCount: totalsRow?.cnt ?? 0,
96
+ totalInputTokens: totalsRow?.total_in ?? 0,
97
+ totalOutputTokens: totalsRow?.total_out ?? 0,
98
+ totalCostUsd: totalsRow?.total_cost ?? 0,
99
+ };
100
+ return { records, totals };
101
+ }
102
+ //# sourceMappingURL=token-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/models/token-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Start the schedule engine. Evaluates due schedules every 60 seconds.
3
+ */
4
+ export declare function startScheduler(): void;
5
+ /**
6
+ * Stop the schedule engine.
7
+ */
8
+ export declare function stopScheduler(): void;
9
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/scheduler/engine.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAUrC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
@@ -0,0 +1,127 @@
1
+ import { sendMessage } from '../copilot/orchestrator.js';
2
+ import { createChildLogger } from '../logging/logger.js';
3
+ import { getEventBus } from '../squad/event-bus.js';
4
+ import { runInstance } from '../squad/execution/runner.js';
5
+ import { getSquadByName, listSquads } from '../squad/manager.js';
6
+ import { addInboxEntry } from '../store/inbox.js';
7
+ import { getDueSchedules, markScheduleFired } from '../store/schedules.js';
8
+ const logger = () => createChildLogger('scheduler');
9
+ let intervalHandle = null;
10
+ let running = false;
11
+ const TICK_INTERVAL_MS = 60_000; // Check every minute
12
+ /**
13
+ * Start the schedule engine. Evaluates due schedules every 60 seconds.
14
+ */
15
+ export function startScheduler() {
16
+ const log = logger();
17
+ log.info('Scheduler started');
18
+ // Initial tick
19
+ tick();
20
+ intervalHandle = setInterval(() => {
21
+ tick();
22
+ }, TICK_INTERVAL_MS);
23
+ }
24
+ /**
25
+ * Stop the schedule engine.
26
+ */
27
+ export function stopScheduler() {
28
+ if (intervalHandle) {
29
+ clearInterval(intervalHandle);
30
+ intervalHandle = null;
31
+ }
32
+ }
33
+ async function tick() {
34
+ if (running)
35
+ return; // Prevent overlapping ticks
36
+ running = true;
37
+ try {
38
+ const due = await getDueSchedules();
39
+ if (due.length === 0) {
40
+ running = false;
41
+ return;
42
+ }
43
+ const log = logger();
44
+ log.info({ count: due.length }, 'Firing due schedules');
45
+ for (const schedule of due) {
46
+ await fireSchedule(schedule);
47
+ }
48
+ }
49
+ catch (err) {
50
+ logger().error({ err }, 'Scheduler tick error');
51
+ }
52
+ finally {
53
+ running = false;
54
+ }
55
+ }
56
+ async function fireSchedule(schedule) {
57
+ const log = logger();
58
+ const bus = getEventBus();
59
+ // Emit fired event
60
+ bus.emit({
61
+ type: 'schedule:fired',
62
+ id: crypto.randomUUID(),
63
+ timestamp: new Date(),
64
+ data: { scheduleId: schedule.id, name: schedule.name },
65
+ });
66
+ log.info({ scheduleId: schedule.id, name: schedule.name }, 'Firing schedule');
67
+ // Mark as fired immediately (update next_run)
68
+ await markScheduleFired(schedule.id, schedule.cron);
69
+ try {
70
+ let result;
71
+ if (schedule.targetType === 'orchestrator') {
72
+ // Send as if user typed it
73
+ result = await sendMessage(schedule.prompt, 'web', () => { });
74
+ }
75
+ else {
76
+ // Squad target — run instance
77
+ const squads = await listSquads();
78
+ const squad = squads.find((s) => s.id === schedule.targetId || s.name === schedule.targetId);
79
+ if (!squad) {
80
+ throw new Error(`Target squad not found: ${schedule.targetId}`);
81
+ }
82
+ const runResult = await runInstance({
83
+ squad,
84
+ objective: schedule.prompt,
85
+ });
86
+ if (runResult.success) {
87
+ result = runResult.pr
88
+ ? `Completed successfully. PR: ${runResult.pr.url}`
89
+ : 'Completed successfully (no PR created).';
90
+ }
91
+ else {
92
+ result = `Failed: ${runResult.error ?? 'unknown error'}`;
93
+ }
94
+ }
95
+ // Post result to inbox as deliverable
96
+ const squadId = schedule.targetType === 'squad' && schedule.targetId ? schedule.targetId : 'orchestrator';
97
+ // Only post to inbox if we have a real squad target
98
+ if (schedule.targetType === 'squad' && schedule.targetId) {
99
+ await addInboxEntry({
100
+ squadId: schedule.targetId,
101
+ kind: 'deliverable',
102
+ title: `Schedule: ${schedule.name}`,
103
+ content: result,
104
+ });
105
+ }
106
+ // Emit completed event
107
+ bus.emit({
108
+ type: 'schedule:completed',
109
+ id: crypto.randomUUID(),
110
+ timestamp: new Date(),
111
+ data: { scheduleId: schedule.id, name: schedule.name, result: result.slice(0, 200) },
112
+ });
113
+ log.info({ scheduleId: schedule.id }, 'Schedule completed');
114
+ }
115
+ catch (err) {
116
+ const errorMsg = err instanceof Error ? err.message : String(err);
117
+ log.error({ err, scheduleId: schedule.id }, 'Schedule execution failed');
118
+ // Emit failed event
119
+ bus.emit({
120
+ type: 'schedule:failed',
121
+ id: crypto.randomUUID(),
122
+ timestamp: new Date(),
123
+ data: { scheduleId: schedule.id, name: schedule.name, error: errorMsg },
124
+ });
125
+ }
126
+ }
127
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/scheduler/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { initSkills, listInstalledSkills, getSkill, installSkill, installSkillFromUrl, removeSkill, activateSkill, deactivateSkill, getActiveSkills, getActiveSkillsContent, } from './store.js';
2
+ export type { Skill, SkillActivation } from './store.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,sBAAsB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { initSkills, listInstalledSkills, getSkill, installSkill, installSkillFromUrl, removeSkill, activateSkill, deactivateSkill, getActiveSkills, getActiveSkillsContent, } from './store.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,sBAAsB,GACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,52 @@
1
+ export interface Skill {
2
+ name: string;
3
+ content: string;
4
+ filePath: string;
5
+ }
6
+ export interface SkillActivation {
7
+ skillName: string;
8
+ targetType: 'orchestrator' | 'squad';
9
+ targetId: string | null;
10
+ activatedAt: string;
11
+ }
12
+ /**
13
+ * Initialize the skills directory.
14
+ */
15
+ export declare function initSkills(dataDir: string): void;
16
+ /**
17
+ * List all installed skills.
18
+ */
19
+ export declare function listInstalledSkills(): Skill[];
20
+ /**
21
+ * Read a specific skill by name.
22
+ */
23
+ export declare function getSkill(name: string): Skill | null;
24
+ /**
25
+ * Install a skill from content (e.g., fetched from URL or provided directly).
26
+ */
27
+ export declare function installSkill(name: string, content: string): Skill;
28
+ /**
29
+ * Install a skill from a URL (fetches raw content).
30
+ */
31
+ export declare function installSkillFromUrl(name: string, url: string): Promise<Skill>;
32
+ /**
33
+ * Remove an installed skill.
34
+ */
35
+ export declare function removeSkill(name: string): void;
36
+ /**
37
+ * Activate a skill for a target (orchestrator or a specific squad).
38
+ */
39
+ export declare function activateSkill(skillName: string, targetType: 'orchestrator' | 'squad', targetId?: string): Promise<void>;
40
+ /**
41
+ * Deactivate a skill for a target.
42
+ */
43
+ export declare function deactivateSkill(skillName: string, targetType: 'orchestrator' | 'squad', targetId?: string): Promise<void>;
44
+ /**
45
+ * Get all activations for a target.
46
+ */
47
+ export declare function getActiveSkills(targetType: 'orchestrator' | 'squad', targetId?: string): Promise<SkillActivation[]>;
48
+ /**
49
+ * Get the combined content of all active skills for a target (for system prompt injection).
50
+ */
51
+ export declare function getActiveSkillsContent(targetType: 'orchestrator' | 'squad', targetId?: string): Promise<string>;
52
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC;IACrC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACpB;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,KAAK,EAAE,CAiB7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAQnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAOjE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAOnF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQ9C;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,cAAc,GAAG,OAAO,EACpC,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,cAAc,GAAG,OAAO,EACpC,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAaD;;GAEG;AACH,wBAAsB,eAAe,CACpC,UAAU,EAAE,cAAc,GAAG,OAAO,EACpC,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,EAAE,CAAC,CAa5B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC3C,UAAU,EAAE,cAAc,GAAG,OAAO,EACpC,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAajB"}
@@ -0,0 +1,148 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { createChildLogger } from '../logging/logger.js';
4
+ import { getDatabase } from '../store/db.js';
5
+ const logger = () => createChildLogger('skills');
6
+ let skillsRoot = '';
7
+ /**
8
+ * Initialize the skills directory.
9
+ */
10
+ export function initSkills(dataDir) {
11
+ skillsRoot = join(dataDir, 'skills');
12
+ mkdirSync(skillsRoot, { recursive: true });
13
+ logger().info({ skillsRoot }, 'Skills directory initialized');
14
+ }
15
+ /**
16
+ * List all installed skills.
17
+ */
18
+ export function listInstalledSkills() {
19
+ if (!existsSync(skillsRoot))
20
+ return [];
21
+ const dirs = readdirSync(skillsRoot, { withFileTypes: true }).filter((d) => d.isDirectory());
22
+ const skills = [];
23
+ for (const dir of dirs) {
24
+ const skillPath = join(skillsRoot, dir.name, 'SKILL.md');
25
+ if (existsSync(skillPath)) {
26
+ skills.push({
27
+ name: dir.name,
28
+ content: readFileSync(skillPath, 'utf-8'),
29
+ filePath: skillPath,
30
+ });
31
+ }
32
+ }
33
+ return skills;
34
+ }
35
+ /**
36
+ * Read a specific skill by name.
37
+ */
38
+ export function getSkill(name) {
39
+ const skillPath = join(skillsRoot, name, 'SKILL.md');
40
+ if (!existsSync(skillPath))
41
+ return null;
42
+ return {
43
+ name,
44
+ content: readFileSync(skillPath, 'utf-8'),
45
+ filePath: skillPath,
46
+ };
47
+ }
48
+ /**
49
+ * Install a skill from content (e.g., fetched from URL or provided directly).
50
+ */
51
+ export function installSkill(name, content) {
52
+ const skillDir = join(skillsRoot, name);
53
+ mkdirSync(skillDir, { recursive: true });
54
+ const skillPath = join(skillDir, 'SKILL.md');
55
+ writeFileSync(skillPath, content, 'utf-8');
56
+ logger().info({ name }, 'Skill installed');
57
+ return { name, content, filePath: skillPath };
58
+ }
59
+ /**
60
+ * Install a skill from a URL (fetches raw content).
61
+ */
62
+ export async function installSkillFromUrl(name, url) {
63
+ const res = await fetch(url);
64
+ if (!res.ok) {
65
+ throw new Error(`Failed to fetch skill from ${url}: ${res.status} ${res.statusText}`);
66
+ }
67
+ const content = await res.text();
68
+ return installSkill(name, content);
69
+ }
70
+ /**
71
+ * Remove an installed skill.
72
+ */
73
+ export function removeSkill(name) {
74
+ const skillDir = join(skillsRoot, name);
75
+ if (existsSync(skillDir)) {
76
+ rmSync(skillDir, { recursive: true });
77
+ logger().info({ name }, 'Skill removed');
78
+ }
79
+ // Also remove all activations
80
+ deactivateSkillAll(name);
81
+ }
82
+ /**
83
+ * Activate a skill for a target (orchestrator or a specific squad).
84
+ */
85
+ export async function activateSkill(skillName, targetType, targetId) {
86
+ const db = await getDatabase();
87
+ await db.execute({
88
+ sql: `INSERT OR IGNORE INTO skill_activations (skill_name, target_type, target_id, activated_at)
89
+ VALUES (?, ?, ?, datetime('now'))`,
90
+ args: [skillName, targetType, targetId ?? null],
91
+ });
92
+ logger().info({ skillName, targetType, targetId }, 'Skill activated');
93
+ }
94
+ /**
95
+ * Deactivate a skill for a target.
96
+ */
97
+ export async function deactivateSkill(skillName, targetType, targetId) {
98
+ const db = await getDatabase();
99
+ await db.execute({
100
+ sql: 'DELETE FROM skill_activations WHERE skill_name = ? AND target_type = ? AND (target_id = ? OR (target_id IS NULL AND ? IS NULL))',
101
+ args: [skillName, targetType, targetId ?? null, targetId ?? null],
102
+ });
103
+ logger().info({ skillName, targetType, targetId }, 'Skill deactivated');
104
+ }
105
+ /**
106
+ * Remove all activations for a skill.
107
+ */
108
+ async function deactivateSkillAll(skillName) {
109
+ const db = await getDatabase();
110
+ await db.execute({
111
+ sql: 'DELETE FROM skill_activations WHERE skill_name = ?',
112
+ args: [skillName],
113
+ });
114
+ }
115
+ /**
116
+ * Get all activations for a target.
117
+ */
118
+ export async function getActiveSkills(targetType, targetId) {
119
+ const db = await getDatabase();
120
+ const result = await db.execute({
121
+ sql: `SELECT skill_name, target_type, target_id, activated_at FROM skill_activations
122
+ WHERE target_type = ? AND (target_id = ? OR (target_id IS NULL AND ? IS NULL))`,
123
+ args: [targetType, targetId ?? null, targetId ?? null],
124
+ });
125
+ return result.rows.map((r) => ({
126
+ skillName: r.skill_name,
127
+ targetType: r.target_type,
128
+ targetId: r.target_id,
129
+ activatedAt: r.activated_at,
130
+ }));
131
+ }
132
+ /**
133
+ * Get the combined content of all active skills for a target (for system prompt injection).
134
+ */
135
+ export async function getActiveSkillsContent(targetType, targetId) {
136
+ const activations = await getActiveSkills(targetType, targetId);
137
+ if (activations.length === 0)
138
+ return '';
139
+ const sections = [];
140
+ for (const activation of activations) {
141
+ const skill = getSkill(activation.skillName);
142
+ if (skill) {
143
+ sections.push(`### Skill: ${skill.name}\n${skill.content}`);
144
+ }
145
+ }
146
+ return sections.length > 0 ? `\n## Active Skills\n${sections.join('\n\n')}` : '';
147
+ }
148
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/skills/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { AgentStatus } from '@io/shared';
2
+ import { type SkillDefinition } from './skill-parser.js';
3
+ export interface AgentConfig {
4
+ skill: SkillDefinition;
5
+ squadId: string;
6
+ squadName: string;
7
+ instanceId?: string;
8
+ model?: string;
9
+ identity?: {
10
+ displayName: string;
11
+ persona?: string;
12
+ universe?: string;
13
+ };
14
+ }
15
+ export interface AgentMessage {
16
+ role: 'user' | 'system';
17
+ content: string;
18
+ }
19
+ /**
20
+ * Base agent class. Each agent has its own Copilot session, enforces
21
+ * tool allowlists from its SKILL.md, and emits events on the bus.
22
+ */
23
+ export declare class Agent {
24
+ readonly role: string;
25
+ readonly squadId: string;
26
+ readonly squadName: string;
27
+ readonly instanceId?: string;
28
+ private session;
29
+ private skill;
30
+ private model;
31
+ private identity?;
32
+ private logger;
33
+ private _status;
34
+ constructor(config: AgentConfig);
35
+ get status(): AgentStatus;
36
+ /** Initialize the agent's Copilot session */
37
+ init(squadContext?: string): Promise<void>;
38
+ /** Send a message and get a response */
39
+ send(content: string): Promise<string>;
40
+ /** Destroy the agent's session */
41
+ destroy(): Promise<void>;
42
+ /** Build allowed tools for this agent based on SKILL.md */
43
+ private buildTools;
44
+ private emitEvent;
45
+ }
46
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/squad/agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AAY1D,OAAO,EAAE,KAAK,eAAe,EAAuB,MAAM,mBAAmB,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,qBAAa,KAAK;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,CAA+D;IAChF,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,OAAO,CAAuB;gBAE1B,MAAM,EAAE,WAAW;IAa/B,IAAI,MAAM,IAAI,WAAW,CAExB;IAED,6CAA6C;IACvC,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhD,wCAAwC;IAClC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB5C,kCAAkC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,2DAA2D;IAC3D,OAAO,CAAC,UAAU;IA6LlB,OAAO,CAAC,SAAS;CAgBjB"}