heyio 3.4.0 → 4.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 (289) hide show
  1. package/CODE_OF_CONDUCT.md +83 -0
  2. package/LICENSE +21 -0
  3. package/README.md +203 -151
  4. package/dist/daemon/cli.js +7153 -0
  5. package/dist/daemon/index.js +6421 -0
  6. package/dist/web/assets/index-CbptHIYU.js +520 -0
  7. package/{public → dist/web}/index.html +1 -1
  8. package/package.json +45 -48
  9. package/dist/api/middleware/auth.d.ts +0 -14
  10. package/dist/api/middleware/auth.d.ts.map +0 -1
  11. package/dist/api/middleware/auth.js +0 -130
  12. package/dist/api/middleware/auth.js.map +0 -1
  13. package/dist/api/notifications.d.ts +0 -14
  14. package/dist/api/notifications.d.ts.map +0 -1
  15. package/dist/api/notifications.js +0 -114
  16. package/dist/api/notifications.js.map +0 -1
  17. package/dist/api/routes/activity.d.ts +0 -3
  18. package/dist/api/routes/activity.d.ts.map +0 -1
  19. package/dist/api/routes/activity.js +0 -28
  20. package/dist/api/routes/activity.js.map +0 -1
  21. package/dist/api/routes/attachments.d.ts +0 -3
  22. package/dist/api/routes/attachments.d.ts.map +0 -1
  23. package/dist/api/routes/attachments.js +0 -83
  24. package/dist/api/routes/attachments.js.map +0 -1
  25. package/dist/api/routes/config.d.ts +0 -3
  26. package/dist/api/routes/config.d.ts.map +0 -1
  27. package/dist/api/routes/config.js +0 -107
  28. package/dist/api/routes/config.js.map +0 -1
  29. package/dist/api/routes/conversations.d.ts +0 -3
  30. package/dist/api/routes/conversations.d.ts.map +0 -1
  31. package/dist/api/routes/conversations.js +0 -25
  32. package/dist/api/routes/conversations.js.map +0 -1
  33. package/dist/api/routes/health.d.ts +0 -3
  34. package/dist/api/routes/health.d.ts.map +0 -1
  35. package/dist/api/routes/health.js +0 -39
  36. package/dist/api/routes/health.js.map +0 -1
  37. package/dist/api/routes/inbox.d.ts +0 -3
  38. package/dist/api/routes/inbox.d.ts.map +0 -1
  39. package/dist/api/routes/inbox.js +0 -139
  40. package/dist/api/routes/inbox.js.map +0 -1
  41. package/dist/api/routes/schedules.d.ts +0 -3
  42. package/dist/api/routes/schedules.d.ts.map +0 -1
  43. package/dist/api/routes/schedules.js +0 -116
  44. package/dist/api/routes/schedules.js.map +0 -1
  45. package/dist/api/routes/skills.d.ts +0 -2
  46. package/dist/api/routes/skills.d.ts.map +0 -1
  47. package/dist/api/routes/skills.js +0 -127
  48. package/dist/api/routes/skills.js.map +0 -1
  49. package/dist/api/routes/squads.d.ts +0 -3
  50. package/dist/api/routes/squads.d.ts.map +0 -1
  51. package/dist/api/routes/squads.js +0 -578
  52. package/dist/api/routes/squads.js.map +0 -1
  53. package/dist/api/routes/usage.d.ts +0 -3
  54. package/dist/api/routes/usage.d.ts.map +0 -1
  55. package/dist/api/routes/usage.js +0 -55
  56. package/dist/api/routes/usage.js.map +0 -1
  57. package/dist/api/routes/wiki.d.ts +0 -2
  58. package/dist/api/routes/wiki.d.ts.map +0 -1
  59. package/dist/api/routes/wiki.js +0 -75
  60. package/dist/api/routes/wiki.js.map +0 -1
  61. package/dist/api/server.d.ts +0 -7
  62. package/dist/api/server.d.ts.map +0 -1
  63. package/dist/api/server.js +0 -183
  64. package/dist/api/server.js.map +0 -1
  65. package/dist/config.d.ts +0 -3
  66. package/dist/config.d.ts.map +0 -1
  67. package/dist/config.js +0 -3
  68. package/dist/config.js.map +0 -1
  69. package/dist/copilot/client.d.ts +0 -5
  70. package/dist/copilot/client.d.ts.map +0 -1
  71. package/dist/copilot/client.js +0 -38
  72. package/dist/copilot/client.js.map +0 -1
  73. package/dist/copilot/health-monitor.d.ts +0 -14
  74. package/dist/copilot/health-monitor.d.ts.map +0 -1
  75. package/dist/copilot/health-monitor.js +0 -70
  76. package/dist/copilot/health-monitor.js.map +0 -1
  77. package/dist/copilot/orchestrator.d.ts +0 -5
  78. package/dist/copilot/orchestrator.d.ts.map +0 -1
  79. package/dist/copilot/orchestrator.js +0 -227
  80. package/dist/copilot/orchestrator.js.map +0 -1
  81. package/dist/copilot/tools.d.ts +0 -80
  82. package/dist/copilot/tools.d.ts.map +0 -1
  83. package/dist/copilot/tools.js +0 -1067
  84. package/dist/copilot/tools.js.map +0 -1
  85. package/dist/index.d.ts +0 -3
  86. package/dist/index.d.ts.map +0 -1
  87. package/dist/index.js +0 -94
  88. package/dist/index.js.map +0 -1
  89. package/dist/logging/logger.d.ts +0 -6
  90. package/dist/logging/logger.d.ts.map +0 -1
  91. package/dist/logging/logger.js +0 -33
  92. package/dist/logging/logger.js.map +0 -1
  93. package/dist/models/index.d.ts +0 -6
  94. package/dist/models/index.d.ts.map +0 -1
  95. package/dist/models/index.js +0 -4
  96. package/dist/models/index.js.map +0 -1
  97. package/dist/models/pricing.d.ts +0 -25
  98. package/dist/models/pricing.d.ts.map +0 -1
  99. package/dist/models/pricing.js +0 -96
  100. package/dist/models/pricing.js.map +0 -1
  101. package/dist/models/registry.d.ts +0 -34
  102. package/dist/models/registry.d.ts.map +0 -1
  103. package/dist/models/registry.js +0 -109
  104. package/dist/models/registry.js.map +0 -1
  105. package/dist/models/token-tracker.d.ts +0 -41
  106. package/dist/models/token-tracker.d.ts.map +0 -1
  107. package/dist/models/token-tracker.js +0 -103
  108. package/dist/models/token-tracker.js.map +0 -1
  109. package/dist/scheduler/engine.d.ts +0 -12
  110. package/dist/scheduler/engine.d.ts.map +0 -1
  111. package/dist/scheduler/engine.js +0 -128
  112. package/dist/scheduler/engine.js.map +0 -1
  113. package/dist/skills/discover.d.ts +0 -22
  114. package/dist/skills/discover.d.ts.map +0 -1
  115. package/dist/skills/discover.js +0 -228
  116. package/dist/skills/discover.js.map +0 -1
  117. package/dist/skills/index.d.ts +0 -5
  118. package/dist/skills/index.d.ts.map +0 -1
  119. package/dist/skills/index.js +0 -3
  120. package/dist/skills/index.js.map +0 -1
  121. package/dist/skills/store.d.ts +0 -56
  122. package/dist/skills/store.d.ts.map +0 -1
  123. package/dist/skills/store.js +0 -154
  124. package/dist/skills/store.js.map +0 -1
  125. package/dist/squad/agent.d.ts +0 -65
  126. package/dist/squad/agent.d.ts.map +0 -1
  127. package/dist/squad/agent.js +0 -544
  128. package/dist/squad/agent.js.map +0 -1
  129. package/dist/squad/autonomy.d.ts +0 -16
  130. package/dist/squad/autonomy.d.ts.map +0 -1
  131. package/dist/squad/autonomy.js +0 -63
  132. package/dist/squad/autonomy.js.map +0 -1
  133. package/dist/squad/event-bus.d.ts +0 -22
  134. package/dist/squad/event-bus.d.ts.map +0 -1
  135. package/dist/squad/event-bus.js +0 -56
  136. package/dist/squad/event-bus.js.map +0 -1
  137. package/dist/squad/execution/index.d.ts +0 -14
  138. package/dist/squad/execution/index.d.ts.map +0 -1
  139. package/dist/squad/execution/index.js +0 -8
  140. package/dist/squad/execution/index.js.map +0 -1
  141. package/dist/squad/execution/instance.d.ts +0 -45
  142. package/dist/squad/execution/instance.d.ts.map +0 -1
  143. package/dist/squad/execution/instance.js +0 -165
  144. package/dist/squad/execution/instance.js.map +0 -1
  145. package/dist/squad/execution/planning.d.ts +0 -20
  146. package/dist/squad/execution/planning.d.ts.map +0 -1
  147. package/dist/squad/execution/planning.js +0 -62
  148. package/dist/squad/execution/planning.js.map +0 -1
  149. package/dist/squad/execution/pr.d.ts +0 -15
  150. package/dist/squad/execution/pr.d.ts.map +0 -1
  151. package/dist/squad/execution/pr.js +0 -109
  152. package/dist/squad/execution/pr.js.map +0 -1
  153. package/dist/squad/execution/review.d.ts +0 -21
  154. package/dist/squad/execution/review.d.ts.map +0 -1
  155. package/dist/squad/execution/review.js +0 -157
  156. package/dist/squad/execution/review.js.map +0 -1
  157. package/dist/squad/execution/runner.d.ts +0 -52
  158. package/dist/squad/execution/runner.d.ts.map +0 -1
  159. package/dist/squad/execution/runner.js +0 -93
  160. package/dist/squad/execution/runner.js.map +0 -1
  161. package/dist/squad/execution/tasks.d.ts +0 -22
  162. package/dist/squad/execution/tasks.d.ts.map +0 -1
  163. package/dist/squad/execution/tasks.js +0 -111
  164. package/dist/squad/execution/tasks.js.map +0 -1
  165. package/dist/squad/execution/worktree.d.ts +0 -27
  166. package/dist/squad/execution/worktree.d.ts.map +0 -1
  167. package/dist/squad/execution/worktree.js +0 -141
  168. package/dist/squad/execution/worktree.js.map +0 -1
  169. package/dist/squad/hiring.d.ts +0 -57
  170. package/dist/squad/hiring.d.ts.map +0 -1
  171. package/dist/squad/hiring.js +0 -588
  172. package/dist/squad/hiring.js.map +0 -1
  173. package/dist/squad/index.d.ts +0 -8
  174. package/dist/squad/index.d.ts.map +0 -1
  175. package/dist/squad/index.js +0 -6
  176. package/dist/squad/index.js.map +0 -1
  177. package/dist/squad/manager.d.ts +0 -58
  178. package/dist/squad/manager.d.ts.map +0 -1
  179. package/dist/squad/manager.js +0 -351
  180. package/dist/squad/manager.js.map +0 -1
  181. package/dist/squad/model-selector.d.ts +0 -29
  182. package/dist/squad/model-selector.d.ts.map +0 -1
  183. package/dist/squad/model-selector.js +0 -64
  184. package/dist/squad/model-selector.js.map +0 -1
  185. package/dist/squad/name-generator.d.ts +0 -16
  186. package/dist/squad/name-generator.d.ts.map +0 -1
  187. package/dist/squad/name-generator.js +0 -111
  188. package/dist/squad/name-generator.js.map +0 -1
  189. package/dist/squad/roles/templates.d.ts +0 -7
  190. package/dist/squad/roles/templates.d.ts.map +0 -1
  191. package/dist/squad/roles/templates.js +0 -104
  192. package/dist/squad/roles/templates.js.map +0 -1
  193. package/dist/squad/skill-parser.d.ts +0 -36
  194. package/dist/squad/skill-parser.d.ts.map +0 -1
  195. package/dist/squad/skill-parser.js +0 -90
  196. package/dist/squad/skill-parser.js.map +0 -1
  197. package/dist/squad/source-resolver.d.ts +0 -20
  198. package/dist/squad/source-resolver.d.ts.map +0 -1
  199. package/dist/squad/source-resolver.js +0 -51
  200. package/dist/squad/source-resolver.js.map +0 -1
  201. package/dist/store/activity.d.ts +0 -51
  202. package/dist/store/activity.d.ts.map +0 -1
  203. package/dist/store/activity.js +0 -197
  204. package/dist/store/activity.js.map +0 -1
  205. package/dist/store/conversations.d.ts +0 -25
  206. package/dist/store/conversations.d.ts.map +0 -1
  207. package/dist/store/conversations.js +0 -76
  208. package/dist/store/conversations.js.map +0 -1
  209. package/dist/store/db.d.ts +0 -5
  210. package/dist/store/db.d.ts.map +0 -1
  211. package/dist/store/db.js +0 -290
  212. package/dist/store/db.js.map +0 -1
  213. package/dist/store/inbox.d.ts +0 -67
  214. package/dist/store/inbox.d.ts.map +0 -1
  215. package/dist/store/inbox.js +0 -192
  216. package/dist/store/inbox.js.map +0 -1
  217. package/dist/store/schedules.d.ts +0 -53
  218. package/dist/store/schedules.d.ts.map +0 -1
  219. package/dist/store/schedules.js +0 -160
  220. package/dist/store/schedules.js.map +0 -1
  221. package/dist/wiki/index.d.ts +0 -3
  222. package/dist/wiki/index.d.ts.map +0 -1
  223. package/dist/wiki/index.js +0 -2
  224. package/dist/wiki/index.js.map +0 -1
  225. package/dist/wiki/store.d.ts +0 -81
  226. package/dist/wiki/store.d.ts.map +0 -1
  227. package/dist/wiki/store.js +0 -270
  228. package/dist/wiki/store.js.map +0 -1
  229. package/node_modules/@io/shared/dist/config.d.ts +0 -26
  230. package/node_modules/@io/shared/dist/config.d.ts.map +0 -1
  231. package/node_modules/@io/shared/dist/config.js +0 -53
  232. package/node_modules/@io/shared/dist/config.js.map +0 -1
  233. package/node_modules/@io/shared/dist/constants.d.ts +0 -19
  234. package/node_modules/@io/shared/dist/constants.d.ts.map +0 -1
  235. package/node_modules/@io/shared/dist/constants.js +0 -51
  236. package/node_modules/@io/shared/dist/constants.js.map +0 -1
  237. package/node_modules/@io/shared/dist/index.d.ts +0 -12
  238. package/node_modules/@io/shared/dist/index.d.ts.map +0 -1
  239. package/node_modules/@io/shared/dist/index.js +0 -3
  240. package/node_modules/@io/shared/dist/index.js.map +0 -1
  241. package/node_modules/@io/shared/dist/types/agents.d.ts +0 -3
  242. package/node_modules/@io/shared/dist/types/agents.d.ts.map +0 -1
  243. package/node_modules/@io/shared/dist/types/agents.js +0 -2
  244. package/node_modules/@io/shared/dist/types/agents.js.map +0 -1
  245. package/node_modules/@io/shared/dist/types/api.d.ts +0 -33
  246. package/node_modules/@io/shared/dist/types/api.d.ts.map +0 -1
  247. package/node_modules/@io/shared/dist/types/api.js +0 -2
  248. package/node_modules/@io/shared/dist/types/api.js.map +0 -1
  249. package/node_modules/@io/shared/dist/types/attachments.d.ts +0 -10
  250. package/node_modules/@io/shared/dist/types/attachments.d.ts.map +0 -1
  251. package/node_modules/@io/shared/dist/types/attachments.js +0 -2
  252. package/node_modules/@io/shared/dist/types/attachments.js.map +0 -1
  253. package/node_modules/@io/shared/dist/types/events.d.ts +0 -44
  254. package/node_modules/@io/shared/dist/types/events.d.ts.map +0 -1
  255. package/node_modules/@io/shared/dist/types/events.js +0 -2
  256. package/node_modules/@io/shared/dist/types/events.js.map +0 -1
  257. package/node_modules/@io/shared/dist/types/history.d.ts +0 -33
  258. package/node_modules/@io/shared/dist/types/history.d.ts.map +0 -1
  259. package/node_modules/@io/shared/dist/types/history.js +0 -2
  260. package/node_modules/@io/shared/dist/types/history.js.map +0 -1
  261. package/node_modules/@io/shared/dist/types/messages.d.ts +0 -15
  262. package/node_modules/@io/shared/dist/types/messages.d.ts.map +0 -1
  263. package/node_modules/@io/shared/dist/types/messages.js +0 -2
  264. package/node_modules/@io/shared/dist/types/messages.js.map +0 -1
  265. package/node_modules/@io/shared/dist/types/squads.d.ts +0 -46
  266. package/node_modules/@io/shared/dist/types/squads.d.ts.map +0 -1
  267. package/node_modules/@io/shared/dist/types/squads.js +0 -2
  268. package/node_modules/@io/shared/dist/types/squads.js.map +0 -1
  269. package/node_modules/@io/shared/dist/types/tokens.d.ts +0 -19
  270. package/node_modules/@io/shared/dist/types/tokens.d.ts.map +0 -1
  271. package/node_modules/@io/shared/dist/types/tokens.js +0 -2
  272. package/node_modules/@io/shared/dist/types/tokens.js.map +0 -1
  273. package/node_modules/@io/shared/package.json +0 -18
  274. package/node_modules/@io/shared/src/config.ts +0 -85
  275. package/node_modules/@io/shared/src/constants.ts +0 -54
  276. package/node_modules/@io/shared/src/index.ts +0 -46
  277. package/node_modules/@io/shared/src/types/agents.ts +0 -3
  278. package/node_modules/@io/shared/src/types/api.ts +0 -35
  279. package/node_modules/@io/shared/src/types/attachments.ts +0 -9
  280. package/node_modules/@io/shared/src/types/events.ts +0 -86
  281. package/node_modules/@io/shared/src/types/history.ts +0 -37
  282. package/node_modules/@io/shared/src/types/messages.ts +0 -15
  283. package/node_modules/@io/shared/src/types/squads.ts +0 -56
  284. package/node_modules/@io/shared/src/types/tokens.ts +0 -19
  285. package/node_modules/@io/shared/tsconfig.json +0 -9
  286. package/node_modules/@io/shared/tsconfig.tsbuildinfo +0 -1
  287. package/public/assets/index-CoSJG-14.js +0 -510
  288. package/public/assets/index-CoSJG-14.js.map +0 -1
  289. /package/{public → dist/web}/assets/index-B6F0UZkW.css +0 -0
@@ -11,7 +11,7 @@
11
11
  href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500;600&display=swap"
12
12
  />
13
13
  <title>IO</title>
14
- <script type="module" crossorigin src="/assets/index-CoSJG-14.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-CbptHIYU.js"></script>
15
15
  <link rel="stylesheet" crossorigin href="/assets/index-B6F0UZkW.css">
16
16
  </head>
17
17
  <body>
package/package.json CHANGED
@@ -1,62 +1,59 @@
1
1
  {
2
2
  "name": "heyio",
3
- "version": "3.4.0",
4
- "description": "IO — a personal AI assistant built on the GitHub Copilot SDK",
3
+ "version": "4.0.0",
4
+ "description": "AI orchestrator daemon with squad-based team delegation",
5
5
  "type": "module",
6
- "main": "./dist/index.js",
7
- "files": [
8
- "dist",
9
- "public",
10
- "README.md"
11
- ],
12
- "bin": {
13
- "io": "./dist/index.js"
14
- },
15
- "scripts": {
16
- "build": "tsc",
17
- "dev": "tsx --watch src/index.ts",
18
- "start": "node dist/index.js",
19
- "prepack": "node -e \"const fs=require('fs');const p=require('path');const src=p.resolve(__dirname,'../shared');const dst=p.resolve(__dirname,'node_modules/@io/shared');fs.mkdirSync(p.dirname(dst),{recursive:true});fs.cpSync(src,dst,{recursive:true});fs.copyFileSync(p.resolve(__dirname,'../../README.md'),p.resolve(__dirname,'README.md'));const webSrc=p.resolve(__dirname,'../web/dist');const webDst=p.resolve(__dirname,'public');if(fs.existsSync(webSrc)){fs.cpSync(webSrc,webDst,{recursive:true})}\""
6
+ "license": "MIT",
7
+ "author": "Michael Jolley",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/michaeljolley/io.git"
20
11
  },
21
12
  "engines": {
22
- "node": ">=22"
13
+ "node": ">=22.0.0"
23
14
  },
15
+ "bin": {
16
+ "io": "./dist/daemon/cli.js"
17
+ },
18
+ "files": [
19
+ "dist/",
20
+ "README.md",
21
+ "CODE_OF_CONDUCT.md",
22
+ "LICENSE",
23
+ "!dist/**/*.map"
24
+ ],
24
25
  "keywords": [
26
+ "ai",
25
27
  "copilot",
26
- "telegram",
27
28
  "orchestrator",
28
- "ai",
29
- "cli",
30
- "assistant"
29
+ "agent",
30
+ "squad",
31
+ "daemon"
31
32
  ],
32
- "author": "Michael Jolley",
33
- "license": "MIT",
34
- "repository": {
35
- "type": "git",
36
- "url": "git+https://github.com/michaeljolley/io.git"
37
- },
38
- "homepage": "https://github.com/michaeljolley/io#readme",
39
- "dependencies": {
40
- "@github/copilot-sdk": "^1.0.0-beta.9",
41
- "@io/shared": "*",
42
- "@libsql/client": "^0.14.0",
43
- "cron-parser": "^5.5.0",
44
- "express": "^5.1.0",
45
- "gray-matter": "^4.0.3",
46
- "jose": "^6.2.3",
47
- "multer": "^2.1.1",
48
- "pino": "^9.6.0",
49
- "ws": "^8.18.0",
50
- "zod": "^4.4.3"
51
- },
52
- "bundleDependencies": [
53
- "@io/shared"
33
+ "workspaces": [
34
+ "packages/shared",
35
+ "packages/daemon",
36
+ "packages/web"
54
37
  ],
38
+ "scripts": {
39
+ "build": "npm run build:shared && npm run build:daemon && npm run build:web",
40
+ "build:shared": "tsc --project packages/shared/tsconfig.json",
41
+ "build:daemon": "node scripts/build-daemon.js",
42
+ "build:web": "npm run build --workspace=packages/web",
43
+ "dev": "npx tsx --watch packages/daemon/src/index.ts",
44
+ "test": "vitest run",
45
+ "test:watch": "vitest",
46
+ "test:coverage": "vitest run --coverage",
47
+ "lint": "biome check .",
48
+ "lint:fix": "biome check --write .",
49
+ "format": "biome format --write .",
50
+ "clean": "rm -rf dist packages/*/dist coverage"
51
+ },
55
52
  "devDependencies": {
56
- "@types/express": "^5.0.0",
57
- "@types/multer": "^2.1.0",
58
- "@types/ws": "^8.5.13",
59
- "pino-pretty": "^13.1.3",
60
- "tsx": "^4.19.0"
53
+ "@biomejs/biome": "^1.9.0",
54
+ "esbuild": "^0.24.0",
55
+ "tsx": "^4.19.0",
56
+ "typescript": "^5.6.0",
57
+ "vitest": "^2.1.0"
61
58
  }
62
59
  }
@@ -1,14 +0,0 @@
1
- import type { NextFunction, Request, Response } from 'express';
2
- import type { IOConfig } from '../../config.js';
3
- /**
4
- * Express middleware that verifies Supabase JWT tokens.
5
- * If Supabase is not configured, all requests pass through.
6
- * Exempt routes always pass through regardless of config.
7
- */
8
- export declare function authMiddleware(config: IOConfig): (req: Request, res: Response, next: NextFunction) => void;
9
- /**
10
- * Verify a JWT token for WebSocket connections.
11
- * Returns true if valid or if auth is not configured.
12
- */
13
- export declare function verifyWsToken(config: IOConfig, token: string | null): Promise<boolean>;
14
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/api/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAgFhD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,IACtC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CAmC9D;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAc5F"}
@@ -1,130 +0,0 @@
1
- import { createRemoteJWKSet, jwtVerify } from 'jose';
2
- import { createChildLogger } from '../../logging/logger.js';
3
- const logger = () => createChildLogger('auth');
4
- // Routes that don't require authentication (paths relative to /api mount)
5
- const EXEMPT_ROUTES = [
6
- { method: 'GET', path: '/health' },
7
- { method: 'GET', path: '/config' },
8
- { method: 'GET', path: '/version' },
9
- ];
10
- function isExempt(method, path) {
11
- return EXEMPT_ROUTES.some((r) => r.method === method.toUpperCase() && path.startsWith(r.path));
12
- }
13
- // Cached JWKS fetcher
14
- let jwks = null;
15
- function getJwks(projectUrl) {
16
- if (!jwks) {
17
- const jwksUrl = new URL('/auth/v1/.well-known/jwks.json', projectUrl);
18
- jwks = createRemoteJWKSet(jwksUrl);
19
- }
20
- return jwks;
21
- }
22
- /**
23
- * Verify a Supabase JWT token using multiple strategies:
24
- * 1. JWKS (asymmetric RS256/ES256) if projectUrl is available
25
- * 2. Shared secret (HS256) if jwtSecret is available
26
- * 3. Supabase Auth server introspection as final fallback
27
- */
28
- async function verifyToken(config, token) {
29
- const errors = [];
30
- // Strategy 1: Try JWKS verification (asymmetric signing)
31
- if (config.supabase.projectUrl) {
32
- try {
33
- const keySet = getJwks(config.supabase.projectUrl);
34
- await jwtVerify(token, keySet, { clockTolerance: 30 });
35
- return true;
36
- }
37
- catch (err) {
38
- errors.push(`JWKS: ${err instanceof Error ? err.message : 'unknown'}`);
39
- }
40
- }
41
- // Strategy 2: Try shared secret (HS256)
42
- if (config.supabase.jwtSecret) {
43
- try {
44
- const secret = new TextEncoder().encode(config.supabase.jwtSecret);
45
- await jwtVerify(token, secret, { clockTolerance: 30 });
46
- return true;
47
- }
48
- catch (err) {
49
- errors.push(`HS256: ${err instanceof Error ? err.message : 'unknown'}`);
50
- }
51
- }
52
- // Strategy 3: Verify via Supabase Auth server (introspection)
53
- if (config.supabase.projectUrl && config.supabase.anonKey) {
54
- try {
55
- const res = await fetch(`${config.supabase.projectUrl}/auth/v1/user`, {
56
- headers: {
57
- apikey: config.supabase.anonKey,
58
- Authorization: `Bearer ${token}`,
59
- },
60
- });
61
- if (res.ok) {
62
- return true;
63
- }
64
- errors.push(`Auth server: HTTP ${res.status}`);
65
- }
66
- catch (err) {
67
- errors.push(`Auth server: ${err instanceof Error ? err.message : 'unknown'}`);
68
- }
69
- }
70
- logger().debug({ strategies: errors.join('; ') }, 'All JWT verification strategies failed');
71
- return false;
72
- }
73
- /**
74
- * Express middleware that verifies Supabase JWT tokens.
75
- * If Supabase is not configured, all requests pass through.
76
- * Exempt routes always pass through regardless of config.
77
- */
78
- export function authMiddleware(config) {
79
- return (req, res, next) => {
80
- // If no Supabase configured, skip auth entirely (local-only mode)
81
- if (!config.supabase.projectUrl && !config.supabase.jwtSecret) {
82
- next();
83
- return;
84
- }
85
- // Exempt routes don't require auth
86
- if (isExempt(req.method, req.path)) {
87
- next();
88
- return;
89
- }
90
- const authHeader = req.headers.authorization;
91
- if (!authHeader?.startsWith('Bearer ')) {
92
- res.status(401).json({ error: 'Missing or invalid Authorization header' });
93
- return;
94
- }
95
- const token = authHeader.slice(7);
96
- verifyToken(config, token)
97
- .then((valid) => {
98
- if (valid) {
99
- next();
100
- }
101
- else {
102
- res.status(401).json({ error: 'Invalid or expired token' });
103
- }
104
- })
105
- .catch((err) => {
106
- const errMessage = err instanceof Error ? err.message : 'Unknown error';
107
- logger().warn({ err: errMessage }, 'JWT verification failed');
108
- res.status(401).json({ error: 'Invalid or expired token' });
109
- });
110
- };
111
- }
112
- /**
113
- * Verify a JWT token for WebSocket connections.
114
- * Returns true if valid or if auth is not configured.
115
- */
116
- export async function verifyWsToken(config, token) {
117
- if (!config.supabase.projectUrl && !config.supabase.jwtSecret) {
118
- return true; // No auth configured — allow
119
- }
120
- if (!token) {
121
- return false;
122
- }
123
- try {
124
- return await verifyToken(config, token);
125
- }
126
- catch {
127
- return false;
128
- }
129
- }
130
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/api/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { WebSocket } from 'ws';
2
- /**
3
- * Register a WebSocket client for event notifications.
4
- */
5
- export declare function subscribeClient(connectionId: string, ws: WebSocket): void;
6
- /**
7
- * Unregister a WebSocket client.
8
- */
9
- export declare function unsubscribeClient(connectionId: string): void;
10
- /**
11
- * Initialize the notification system — subscribes to event bus and broadcasts to clients.
12
- */
13
- export declare function initNotifications(): void;
14
- //# sourceMappingURL=notifications.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/api/notifications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AASpC;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAE5D;AA8DD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAoCxC"}
@@ -1,114 +0,0 @@
1
- import { createChildLogger } from '../logging/logger.js';
2
- import { getEventBus } from '../squad/event-bus.js';
3
- const logger = () => createChildLogger('notifications');
4
- // Connected clients that want event notifications
5
- const subscribers = new Map();
6
- /**
7
- * Register a WebSocket client for event notifications.
8
- */
9
- export function subscribeClient(connectionId, ws) {
10
- subscribers.set(connectionId, ws);
11
- }
12
- /**
13
- * Unregister a WebSocket client.
14
- */
15
- export function unsubscribeClient(connectionId) {
16
- subscribers.delete(connectionId);
17
- }
18
- /**
19
- * Render an event to a human-readable notification string.
20
- */
21
- function renderNotification(event) {
22
- switch (event.type) {
23
- case 'squad:created':
24
- return `🆕 Squad "${event.squadName}" has been hired`;
25
- case 'squad:disbanded':
26
- return `🗑️ Squad "${event.squadName}" has been disbanded`;
27
- case 'squad:member_added':
28
- return `👋 New member added to "${event.squadName}"`;
29
- case 'squad:member_retired':
30
- return `👤 Member retired from "${event.squadName}"`;
31
- case 'instance:created':
32
- return '🚀 New work instance started';
33
- case 'instance:meeting_started':
34
- return '🤝 Round-table meeting in progress';
35
- case 'instance:meeting_complete':
36
- return '✅ Meeting complete — consensus reached';
37
- case 'instance:work_started':
38
- return '⚡ Squad is working on tasks';
39
- case 'instance:pr_created':
40
- return `📬 PR created: ${event.data?.prUrl ?? ''}`;
41
- case 'instance:complete':
42
- return '🎉 Work instance completed successfully';
43
- case 'instance:failed':
44
- return '❌ Work instance failed';
45
- case 'agent:task_started':
46
- return `🔧 ${event.agentRole} started a task`;
47
- case 'agent:task_completed':
48
- return `✔️ ${event.agentRole} completed a task`;
49
- case 'agent:error':
50
- return `⚠️ ${event.agentRole} encountered an error`;
51
- case 'agent:permission_denied':
52
- return `🚫 ${event.agentRole} was denied permission`;
53
- case 'agent:tool_call':
54
- return `🛠️ ${event.agentRole} used a tool`;
55
- case 'meeting:contribution':
56
- return `💬 ${event.agentRole}: "${event.content.slice(0, 80)}"`;
57
- case 'meeting:consensus_reached':
58
- return '🤝 Consensus reached in meeting';
59
- case 'meeting:veto':
60
- return `🛑 ${event.agentRole} vetoed the proposal`;
61
- case 'inbox:new':
62
- return event.kind === 'question'
63
- ? `❓ Squad has a question: "${event.title}"`
64
- : `📋 Squad delivered: "${event.title}"`;
65
- case 'inbox:resolved':
66
- return `✅ Inbox item resolved: "${event.title}"`;
67
- case 'schedule:fired':
68
- return `⏰ Schedule fired: "${event.data?.name ?? 'unknown'}"`;
69
- case 'schedule:completed':
70
- return `✅ Schedule completed: "${event.data?.name ?? 'unknown'}"`;
71
- case 'schedule:failed':
72
- return `❌ Schedule failed: "${event.data?.name ?? 'unknown'}"`;
73
- default:
74
- return `📣 Event: ${event.type}`;
75
- }
76
- }
77
- /**
78
- * Initialize the notification system — subscribes to event bus and broadcasts to clients.
79
- */
80
- export function initNotifications() {
81
- const log = logger();
82
- getEventBus().onAny((event) => {
83
- const notification = renderNotification(event);
84
- const payload = JSON.stringify({
85
- type: 'event',
86
- notification,
87
- event: {
88
- id: event.id,
89
- type: event.type,
90
- timestamp: event.timestamp.toISOString(),
91
- squadId: event.squadId,
92
- instanceId: event.instanceId,
93
- agentRole: 'agentRole' in event ? event.agentRole : undefined,
94
- model: 'model' in event ? event.model : undefined,
95
- data: 'data' in event ? event.data : undefined,
96
- },
97
- });
98
- let delivered = 0;
99
- for (const [connId, ws] of subscribers) {
100
- if (ws.readyState === ws.OPEN) {
101
- ws.send(payload);
102
- delivered++;
103
- }
104
- else {
105
- subscribers.delete(connId);
106
- }
107
- }
108
- if (delivered > 0) {
109
- log.debug({ eventType: event.type, delivered }, 'Event broadcast');
110
- }
111
- });
112
- log.info('Notification system initialized');
113
- }
114
- //# sourceMappingURL=notifications.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/api/notifications.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Router } from 'express';
2
- export declare function activityRouter(): Router;
3
- //# sourceMappingURL=activity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/api/routes/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,wBAAgB,cAAc,IAAI,MAAM,CAyBvC"}
@@ -1,28 +0,0 @@
1
- import { Router } from 'express';
2
- import { queryActivity } from '../../store/activity.js';
3
- export function activityRouter() {
4
- const router = Router();
5
- /**
6
- * GET /api/activity
7
- * Query agent activity log with optional filters.
8
- * Query params: squad, instance, agent, type, limit, offset
9
- */
10
- router.get('/activity', async (req, res) => {
11
- try {
12
- const entries = await queryActivity({
13
- squadId: req.query.squad,
14
- instanceId: req.query.instance,
15
- agentRole: req.query.agent,
16
- activityType: req.query.type,
17
- limit: req.query.limit ? Number.parseInt(req.query.limit, 10) : undefined,
18
- offset: req.query.offset ? Number.parseInt(req.query.offset, 10) : undefined,
19
- });
20
- res.json({ entries });
21
- }
22
- catch (err) {
23
- res.status(500).json({ error: 'Failed to query activity' });
24
- }
25
- });
26
- return router;
27
- }
28
- //# sourceMappingURL=activity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/api/routes/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAqB,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,UAAU,cAAc;IAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC;gBACnC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAA2B;gBAC9C,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,QAA8B;gBACpD,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,KAA2B;gBAChD,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,IAAgC;gBACxD,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnF,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;aACtF,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -1,3 +0,0 @@
1
- import { Router } from 'express';
2
- export declare function attachmentsRouter(dataDir: string): Router;
3
- //# sourceMappingURL=attachments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../src/api/routes/attachments.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAIjC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAqFzD"}
@@ -1,83 +0,0 @@
1
- import { createReadStream, existsSync, mkdirSync } from 'node:fs';
2
- import { writeFile } from 'node:fs/promises';
3
- import { join } from 'node:path';
4
- import { Router } from 'express';
5
- import multer from 'multer';
6
- import { getDatabase } from '../../store/db.js';
7
- export function attachmentsRouter(dataDir) {
8
- const router = Router();
9
- const attachmentsDir = join(dataDir, 'attachments');
10
- mkdirSync(attachmentsDir, { recursive: true });
11
- // Use memory storage — we'll write to disk ourselves with proper naming
12
- const upload = multer({
13
- storage: multer.memoryStorage(),
14
- limits: { fileSize: 50 * 1024 * 1024 },
15
- });
16
- /**
17
- * POST /api/attachments
18
- * Upload a file attachment. Returns the attachment metadata.
19
- */
20
- router.post('/attachments', upload.single('file'), async (req, res) => {
21
- try {
22
- const file = req.file;
23
- if (!file) {
24
- res.status(400).json({ error: 'No file uploaded' });
25
- return;
26
- }
27
- const id = crypto.randomUUID();
28
- const messageId = req.body?.messageId ?? null;
29
- const fileDir = join(attachmentsDir, id);
30
- mkdirSync(fileDir, { recursive: true });
31
- const diskPath = join(fileDir, file.originalname);
32
- await writeFile(diskPath, file.buffer);
33
- const db = getDatabase();
34
- await db.execute({
35
- sql: `INSERT INTO attachments (id, message_id, filename, mime_type, size_bytes, disk_path)
36
- VALUES (?, ?, ?, ?, ?, ?)`,
37
- args: [id, messageId, file.originalname, file.mimetype, file.size, diskPath],
38
- });
39
- res.status(201).json({
40
- id,
41
- filename: file.originalname,
42
- mimeType: file.mimetype,
43
- sizeBytes: file.size,
44
- });
45
- }
46
- catch (err) {
47
- res.status(500).json({ error: 'Failed to upload attachment' });
48
- }
49
- });
50
- /**
51
- * GET /api/attachments/:id
52
- * Download an attachment by ID.
53
- */
54
- router.get('/attachments/:id', async (req, res) => {
55
- try {
56
- const db = getDatabase();
57
- const result = await db.execute({
58
- sql: 'SELECT filename, mime_type, disk_path FROM attachments WHERE id = ?',
59
- args: [req.params.id],
60
- });
61
- if (result.rows.length === 0) {
62
- res.status(404).json({ error: 'Attachment not found' });
63
- return;
64
- }
65
- const row = result.rows[0];
66
- const diskPath = row.disk_path;
67
- const filename = row.filename;
68
- const mimeType = row.mime_type ?? 'application/octet-stream';
69
- if (!existsSync(diskPath)) {
70
- res.status(404).json({ error: 'Attachment file missing from disk' });
71
- return;
72
- }
73
- res.setHeader('Content-Type', mimeType);
74
- res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);
75
- createReadStream(diskPath).pipe(res);
76
- }
77
- catch (err) {
78
- res.status(500).json({ error: 'Failed to retrieve attachment' });
79
- }
80
- });
81
- return router;
82
- }
83
- //# sourceMappingURL=attachments.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/api/routes/attachments.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Router } from 'express';
2
- export declare function configRouter(): Router;
3
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/api/routes/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,wBAAgB,YAAY,IAAI,MAAM,CA6GrC"}