@relaycast/engine 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/dist/adapters/node/database.d.ts +25 -0
  2. package/dist/adapters/node/database.d.ts.map +1 -0
  3. package/dist/adapters/node/database.js +71 -0
  4. package/dist/adapters/node/database.js.map +1 -0
  5. package/dist/adapters/node/event-queue.d.ts +15 -0
  6. package/dist/adapters/node/event-queue.d.ts.map +1 -0
  7. package/dist/adapters/node/event-queue.js +27 -0
  8. package/dist/adapters/node/event-queue.js.map +1 -0
  9. package/dist/adapters/node/files.d.ts +47 -0
  10. package/dist/adapters/node/files.d.ts.map +1 -0
  11. package/dist/adapters/node/files.js +128 -0
  12. package/dist/adapters/node/files.js.map +1 -0
  13. package/dist/adapters/node/index.d.ts +60 -0
  14. package/dist/adapters/node/index.d.ts.map +1 -0
  15. package/dist/adapters/node/index.js +79 -0
  16. package/dist/adapters/node/index.js.map +1 -0
  17. package/dist/adapters/node/kv.d.ts +27 -0
  18. package/dist/adapters/node/kv.d.ts.map +1 -0
  19. package/dist/adapters/node/kv.js +67 -0
  20. package/dist/adapters/node/kv.js.map +1 -0
  21. package/dist/adapters/node/mcp.d.ts +18 -0
  22. package/dist/adapters/node/mcp.d.ts.map +1 -0
  23. package/dist/adapters/node/mcp.js +53 -0
  24. package/dist/adapters/node/mcp.js.map +1 -0
  25. package/dist/adapters/node/presence.d.ts +33 -0
  26. package/dist/adapters/node/presence.d.ts.map +1 -0
  27. package/dist/adapters/node/presence.js +113 -0
  28. package/dist/adapters/node/presence.js.map +1 -0
  29. package/dist/adapters/node/rate-limit.d.ts +17 -0
  30. package/dist/adapters/node/rate-limit.d.ts.map +1 -0
  31. package/dist/adapters/node/rate-limit.js +36 -0
  32. package/dist/adapters/node/rate-limit.js.map +1 -0
  33. package/dist/adapters/node/realtime.d.ts +72 -0
  34. package/dist/adapters/node/realtime.d.ts.map +1 -0
  35. package/dist/adapters/node/realtime.js +274 -0
  36. package/dist/adapters/node/realtime.js.map +1 -0
  37. package/dist/auth/index.d.ts +21 -0
  38. package/dist/auth/index.d.ts.map +1 -0
  39. package/dist/auth/index.js +50 -0
  40. package/dist/auth/index.js.map +1 -0
  41. package/dist/bin/serve.d.ts +3 -0
  42. package/dist/bin/serve.d.ts.map +1 -0
  43. package/dist/bin/serve.js +74 -0
  44. package/dist/bin/serve.js.map +1 -0
  45. package/dist/db/index.d.ts +16 -0
  46. package/dist/db/index.d.ts.map +1 -0
  47. package/dist/db/index.js +24 -0
  48. package/dist/db/index.js.map +1 -0
  49. package/dist/db/migrate.d.ts +14 -0
  50. package/dist/db/migrate.d.ts.map +1 -0
  51. package/dist/db/migrate.js +16 -0
  52. package/dist/db/migrate.js.map +1 -0
  53. package/dist/db/migrations/0000_broad_dagger.sql +227 -0
  54. package/dist/db/migrations/0001_fts5_search.sql +23 -0
  55. package/dist/db/migrations/0002_add_metadata_columns.sql +16 -0
  56. package/dist/db/migrations/0003_add_channel_mute.sql +5 -0
  57. package/dist/db/migrations/0004_a2a_agents.sql +21 -0
  58. package/dist/db/migrations/0005_certifications.sql +24 -0
  59. package/dist/db/migrations/0006_message_logs.sql +30 -0
  60. package/dist/db/migrations/0007_directory.sql +125 -0
  61. package/dist/db/migrations/0008_smart_routing.sql +30 -0
  62. package/dist/db/migrations/0009_drop_workspace_name_unique.sql +4 -0
  63. package/dist/db/migrations/0010_actions_and_harness.sql +108 -0
  64. package/dist/db/migrations/0011_stable_handle.sql +5 -0
  65. package/dist/db/migrations/0012_delivery_and_sequence_constraints.sql +26 -0
  66. package/dist/db/migrations/0013_status_active.sql +9 -0
  67. package/dist/db/migrations/meta/0000_snapshot.json +1694 -0
  68. package/dist/db/migrations/meta/_journal.json +13 -0
  69. package/dist/db/schema.d.ts +4742 -0
  70. package/dist/db/schema.d.ts.map +1 -0
  71. package/dist/db/schema.js +572 -0
  72. package/dist/db/schema.js.map +1 -0
  73. package/dist/engine/a2a-health.d.ts +11 -0
  74. package/dist/engine/a2a-health.d.ts.map +1 -0
  75. package/dist/engine/a2a-health.js +65 -0
  76. package/dist/engine/a2a-health.js.map +1 -0
  77. package/dist/engine/a2a.d.ts +73 -0
  78. package/dist/engine/a2a.d.ts.map +1 -0
  79. package/dist/engine/a2a.js +549 -0
  80. package/dist/engine/a2a.js.map +1 -0
  81. package/dist/engine/action.d.ts +85 -0
  82. package/dist/engine/action.d.ts.map +1 -0
  83. package/dist/engine/action.js +220 -0
  84. package/dist/engine/action.js.map +1 -0
  85. package/dist/engine/activity.d.ts +21 -0
  86. package/dist/engine/activity.d.ts.map +1 -0
  87. package/dist/engine/activity.js +46 -0
  88. package/dist/engine/activity.js.map +1 -0
  89. package/dist/engine/agent.d.ts +155 -0
  90. package/dist/engine/agent.d.ts.map +1 -0
  91. package/dist/engine/agent.js +408 -0
  92. package/dist/engine/agent.js.map +1 -0
  93. package/dist/engine/cache.d.ts +19 -0
  94. package/dist/engine/cache.d.ts.map +1 -0
  95. package/dist/engine/cache.js +40 -0
  96. package/dist/engine/cache.js.map +1 -0
  97. package/dist/engine/certify.d.ts +84 -0
  98. package/dist/engine/certify.d.ts.map +1 -0
  99. package/dist/engine/certify.js +452 -0
  100. package/dist/engine/certify.js.map +1 -0
  101. package/dist/engine/channel.d.ts +67 -0
  102. package/dist/engine/channel.d.ts.map +1 -0
  103. package/dist/engine/channel.js +375 -0
  104. package/dist/engine/channel.js.map +1 -0
  105. package/dist/engine/console.d.ts +83 -0
  106. package/dist/engine/console.d.ts.map +1 -0
  107. package/dist/engine/console.js +189 -0
  108. package/dist/engine/console.js.map +1 -0
  109. package/dist/engine/directory.d.ts +241 -0
  110. package/dist/engine/directory.d.ts.map +1 -0
  111. package/dist/engine/directory.js +528 -0
  112. package/dist/engine/directory.js.map +1 -0
  113. package/dist/engine/dm.d.ts +63 -0
  114. package/dist/engine/dm.d.ts.map +1 -0
  115. package/dist/engine/dm.js +397 -0
  116. package/dist/engine/dm.js.map +1 -0
  117. package/dist/engine/dmAll.d.ts +11 -0
  118. package/dist/engine/dmAll.d.ts.map +1 -0
  119. package/dist/engine/dmAll.js +117 -0
  120. package/dist/engine/dmAll.js.map +1 -0
  121. package/dist/engine/event-id.d.ts +2 -0
  122. package/dist/engine/event-id.d.ts.map +1 -0
  123. package/dist/engine/event-id.js +0 -0
  124. package/dist/engine/event-id.js.map +1 -0
  125. package/dist/engine/eventDelivery.d.ts +12 -0
  126. package/dist/engine/eventDelivery.d.ts.map +1 -0
  127. package/dist/engine/eventDelivery.js +103 -0
  128. package/dist/engine/eventDelivery.js.map +1 -0
  129. package/dist/engine/eventQueue.d.ts +6 -0
  130. package/dist/engine/eventQueue.d.ts.map +1 -0
  131. package/dist/engine/eventQueue.js +23 -0
  132. package/dist/engine/eventQueue.js.map +1 -0
  133. package/dist/engine/eventSubscription.d.ts +59 -0
  134. package/dist/engine/eventSubscription.d.ts.map +1 -0
  135. package/dist/engine/eventSubscription.js +74 -0
  136. package/dist/engine/eventSubscription.js.map +1 -0
  137. package/dist/engine/file.d.ts +43 -0
  138. package/dist/engine/file.d.ts.map +1 -0
  139. package/dist/engine/file.js +115 -0
  140. package/dist/engine/file.js.map +1 -0
  141. package/dist/engine/groupDm.d.ts +54 -0
  142. package/dist/engine/groupDm.d.ts.map +1 -0
  143. package/dist/engine/groupDm.js +262 -0
  144. package/dist/engine/groupDm.js.map +1 -0
  145. package/dist/engine/inboundWebhook.d.ts +45 -0
  146. package/dist/engine/inboundWebhook.d.ts.map +1 -0
  147. package/dist/engine/inboundWebhook.js +170 -0
  148. package/dist/engine/inboundWebhook.js.map +1 -0
  149. package/dist/engine/inbox.d.ts +34 -0
  150. package/dist/engine/inbox.d.ts.map +1 -0
  151. package/dist/engine/inbox.js +141 -0
  152. package/dist/engine/inbox.js.map +1 -0
  153. package/dist/engine/index.d.ts +10 -0
  154. package/dist/engine/index.d.ts.map +1 -0
  155. package/dist/engine/index.js +10 -0
  156. package/dist/engine/index.js.map +1 -0
  157. package/dist/engine/message.d.ts +81 -0
  158. package/dist/engine/message.d.ts.map +1 -0
  159. package/dist/engine/message.js +293 -0
  160. package/dist/engine/message.js.map +1 -0
  161. package/dist/engine/presence.d.ts +12 -0
  162. package/dist/engine/presence.d.ts.map +1 -0
  163. package/dist/engine/presence.js +24 -0
  164. package/dist/engine/presence.js.map +1 -0
  165. package/dist/engine/reaction.d.ts +19 -0
  166. package/dist/engine/reaction.d.ts.map +1 -0
  167. package/dist/engine/reaction.js +97 -0
  168. package/dist/engine/reaction.js.map +1 -0
  169. package/dist/engine/receipt.d.ts +19 -0
  170. package/dist/engine/receipt.d.ts.map +1 -0
  171. package/dist/engine/receipt.js +96 -0
  172. package/dist/engine/receipt.js.map +1 -0
  173. package/dist/engine/resyncQuery.d.ts +15 -0
  174. package/dist/engine/resyncQuery.d.ts.map +1 -0
  175. package/dist/engine/resyncQuery.js +124 -0
  176. package/dist/engine/resyncQuery.js.map +1 -0
  177. package/dist/engine/routing.d.ts +45 -0
  178. package/dist/engine/routing.d.ts.map +1 -0
  179. package/dist/engine/routing.js +390 -0
  180. package/dist/engine/routing.js.map +1 -0
  181. package/dist/engine/search.d.ts +19 -0
  182. package/dist/engine/search.d.ts.map +1 -0
  183. package/dist/engine/search.js +60 -0
  184. package/dist/engine/search.js.map +1 -0
  185. package/dist/engine/searchQuery.d.ts +8 -0
  186. package/dist/engine/searchQuery.d.ts.map +1 -0
  187. package/dist/engine/searchQuery.js +19 -0
  188. package/dist/engine/searchQuery.js.map +1 -0
  189. package/dist/engine/sessionEvent.d.ts +29 -0
  190. package/dist/engine/sessionEvent.d.ts.map +1 -0
  191. package/dist/engine/sessionEvent.js +76 -0
  192. package/dist/engine/sessionEvent.js.map +1 -0
  193. package/dist/engine/snowflake.d.ts +14 -0
  194. package/dist/engine/snowflake.d.ts.map +1 -0
  195. package/dist/engine/snowflake.js +88 -0
  196. package/dist/engine/snowflake.js.map +1 -0
  197. package/dist/engine/systemPrompt.d.ts +13 -0
  198. package/dist/engine/systemPrompt.d.ts.map +1 -0
  199. package/dist/engine/systemPrompt.js +31 -0
  200. package/dist/engine/systemPrompt.js.map +1 -0
  201. package/dist/engine/thread.d.ts +56 -0
  202. package/dist/engine/thread.d.ts.map +1 -0
  203. package/dist/engine/thread.js +158 -0
  204. package/dist/engine/thread.js.map +1 -0
  205. package/dist/engine/tokenRotate.d.ts +8 -0
  206. package/dist/engine/tokenRotate.d.ts.map +1 -0
  207. package/dist/engine/tokenRotate.js +25 -0
  208. package/dist/engine/tokenRotate.js.map +1 -0
  209. package/dist/engine/usage.d.ts +16 -0
  210. package/dist/engine/usage.d.ts.map +1 -0
  211. package/dist/engine/usage.js +24 -0
  212. package/dist/engine/usage.js.map +1 -0
  213. package/dist/engine/workspace.d.ts +44 -0
  214. package/dist/engine/workspace.d.ts.map +1 -0
  215. package/dist/engine/workspace.js +127 -0
  216. package/dist/engine/workspace.js.map +1 -0
  217. package/dist/engine/wsTransform.d.ts +14 -0
  218. package/dist/engine/wsTransform.d.ts.map +1 -0
  219. package/dist/engine/wsTransform.js +196 -0
  220. package/dist/engine/wsTransform.js.map +1 -0
  221. package/dist/engine.d.ts +18 -0
  222. package/dist/engine.d.ts.map +1 -0
  223. package/dist/engine.js +275 -0
  224. package/dist/engine.js.map +1 -0
  225. package/dist/entrypoints/node.d.ts +35 -0
  226. package/dist/entrypoints/node.d.ts.map +1 -0
  227. package/dist/entrypoints/node.js +114 -0
  228. package/dist/entrypoints/node.js.map +1 -0
  229. package/dist/env.d.ts +38 -0
  230. package/dist/env.d.ts.map +1 -0
  231. package/dist/env.js +2 -0
  232. package/dist/env.js.map +1 -0
  233. package/dist/index.d.ts +14 -0
  234. package/dist/index.d.ts.map +1 -0
  235. package/dist/index.js +16 -0
  236. package/dist/index.js.map +1 -0
  237. package/dist/lib/logger.d.ts +47 -0
  238. package/dist/lib/logger.d.ts.map +1 -0
  239. package/dist/lib/logger.js +214 -0
  240. package/dist/lib/logger.js.map +1 -0
  241. package/dist/lib/origin.d.ts +25 -0
  242. package/dist/lib/origin.d.ts.map +1 -0
  243. package/dist/lib/origin.js +80 -0
  244. package/dist/lib/origin.js.map +1 -0
  245. package/dist/lib/serverTelemetry.d.ts +12 -0
  246. package/dist/lib/serverTelemetry.d.ts.map +1 -0
  247. package/dist/lib/serverTelemetry.js +46 -0
  248. package/dist/lib/serverTelemetry.js.map +1 -0
  249. package/dist/lib/ssrf.d.ts +23 -0
  250. package/dist/lib/ssrf.d.ts.map +1 -0
  251. package/dist/lib/ssrf.js +57 -0
  252. package/dist/lib/ssrf.js.map +1 -0
  253. package/dist/lib/workspaceStream.d.ts +9 -0
  254. package/dist/lib/workspaceStream.d.ts.map +1 -0
  255. package/dist/lib/workspaceStream.js +53 -0
  256. package/dist/lib/workspaceStream.js.map +1 -0
  257. package/dist/middleware/auth.d.ts +9 -0
  258. package/dist/middleware/auth.d.ts.map +1 -0
  259. package/dist/middleware/auth.js +40 -0
  260. package/dist/middleware/auth.js.map +1 -0
  261. package/dist/middleware/engine-context.d.ts +9 -0
  262. package/dist/middleware/engine-context.d.ts.map +1 -0
  263. package/dist/middleware/engine-context.js +15 -0
  264. package/dist/middleware/engine-context.js.map +1 -0
  265. package/dist/middleware/idempotency.d.ts +24 -0
  266. package/dist/middleware/idempotency.d.ts.map +1 -0
  267. package/dist/middleware/idempotency.js +148 -0
  268. package/dist/middleware/idempotency.js.map +1 -0
  269. package/dist/middleware/logger.d.ts +4 -0
  270. package/dist/middleware/logger.d.ts.map +1 -0
  271. package/dist/middleware/logger.js +163 -0
  272. package/dist/middleware/logger.js.map +1 -0
  273. package/dist/middleware/planLimits.d.ts +5 -0
  274. package/dist/middleware/planLimits.d.ts.map +1 -0
  275. package/dist/middleware/planLimits.js +35 -0
  276. package/dist/middleware/planLimits.js.map +1 -0
  277. package/dist/middleware/presenceRefresh.d.ts +3 -0
  278. package/dist/middleware/presenceRefresh.d.ts.map +1 -0
  279. package/dist/middleware/presenceRefresh.js +18 -0
  280. package/dist/middleware/presenceRefresh.js.map +1 -0
  281. package/dist/middleware/rateLimit.d.ts +3 -0
  282. package/dist/middleware/rateLimit.d.ts.map +1 -0
  283. package/dist/middleware/rateLimit.js +69 -0
  284. package/dist/middleware/rateLimit.js.map +1 -0
  285. package/dist/middleware/usageTracker.d.ts +3 -0
  286. package/dist/middleware/usageTracker.d.ts.map +1 -0
  287. package/dist/middleware/usageTracker.js +10 -0
  288. package/dist/middleware/usageTracker.js.map +1 -0
  289. package/dist/ports/auth.d.ts +45 -0
  290. package/dist/ports/auth.d.ts.map +1 -0
  291. package/dist/ports/auth.js +2 -0
  292. package/dist/ports/auth.js.map +1 -0
  293. package/dist/ports/database.d.ts +20 -0
  294. package/dist/ports/database.d.ts.map +1 -0
  295. package/dist/ports/database.js +2 -0
  296. package/dist/ports/database.js.map +1 -0
  297. package/dist/ports/entitlements.d.ts +25 -0
  298. package/dist/ports/entitlements.d.ts.map +1 -0
  299. package/dist/ports/entitlements.js +2 -0
  300. package/dist/ports/entitlements.js.map +1 -0
  301. package/dist/ports/event-queue.d.ts +19 -0
  302. package/dist/ports/event-queue.d.ts.map +1 -0
  303. package/dist/ports/event-queue.js +2 -0
  304. package/dist/ports/event-queue.js.map +1 -0
  305. package/dist/ports/files.d.ts +28 -0
  306. package/dist/ports/files.d.ts.map +1 -0
  307. package/dist/ports/files.js +2 -0
  308. package/dist/ports/files.js.map +1 -0
  309. package/dist/ports/index.d.ts +84 -0
  310. package/dist/ports/index.d.ts.map +1 -0
  311. package/dist/ports/index.js +2 -0
  312. package/dist/ports/index.js.map +1 -0
  313. package/dist/ports/kv.d.ts +25 -0
  314. package/dist/ports/kv.d.ts.map +1 -0
  315. package/dist/ports/kv.js +2 -0
  316. package/dist/ports/kv.js.map +1 -0
  317. package/dist/ports/mcp.d.ts +18 -0
  318. package/dist/ports/mcp.d.ts.map +1 -0
  319. package/dist/ports/mcp.js +2 -0
  320. package/dist/ports/mcp.js.map +1 -0
  321. package/dist/ports/presence.d.ts +18 -0
  322. package/dist/ports/presence.d.ts.map +1 -0
  323. package/dist/ports/presence.js +2 -0
  324. package/dist/ports/presence.js.map +1 -0
  325. package/dist/ports/rate-limit.d.ts +20 -0
  326. package/dist/ports/rate-limit.d.ts.map +1 -0
  327. package/dist/ports/rate-limit.js +2 -0
  328. package/dist/ports/rate-limit.js.map +1 -0
  329. package/dist/ports/realtime.d.ts +104 -0
  330. package/dist/ports/realtime.d.ts.map +1 -0
  331. package/dist/ports/realtime.js +19 -0
  332. package/dist/ports/realtime.js.map +1 -0
  333. package/dist/ports/telemetry.d.ts +20 -0
  334. package/dist/ports/telemetry.d.ts.map +1 -0
  335. package/dist/ports/telemetry.js +2 -0
  336. package/dist/ports/telemetry.js.map +1 -0
  337. package/dist/providers/noop-telemetry.d.ts +13 -0
  338. package/dist/providers/noop-telemetry.d.ts.map +1 -0
  339. package/dist/providers/noop-telemetry.js +16 -0
  340. package/dist/providers/noop-telemetry.js.map +1 -0
  341. package/dist/providers/static-entitlements.d.ts +23 -0
  342. package/dist/providers/static-entitlements.d.ts.map +1 -0
  343. package/dist/providers/static-entitlements.js +42 -0
  344. package/dist/providers/static-entitlements.js.map +1 -0
  345. package/dist/routes/a2a.d.ts +4 -0
  346. package/dist/routes/a2a.d.ts.map +1 -0
  347. package/dist/routes/a2a.js +375 -0
  348. package/dist/routes/a2a.js.map +1 -0
  349. package/dist/routes/action.d.ts +4 -0
  350. package/dist/routes/action.d.ts.map +1 -0
  351. package/dist/routes/action.js +213 -0
  352. package/dist/routes/action.js.map +1 -0
  353. package/dist/routes/agent.d.ts +4 -0
  354. package/dist/routes/agent.d.ts.map +1 -0
  355. package/dist/routes/agent.js +431 -0
  356. package/dist/routes/agent.js.map +1 -0
  357. package/dist/routes/background.d.ts +13 -0
  358. package/dist/routes/background.d.ts.map +1 -0
  359. package/dist/routes/background.js +33 -0
  360. package/dist/routes/background.js.map +1 -0
  361. package/dist/routes/certify.d.ts +4 -0
  362. package/dist/routes/certify.d.ts.map +1 -0
  363. package/dist/routes/certify.js +119 -0
  364. package/dist/routes/certify.js.map +1 -0
  365. package/dist/routes/channel.d.ts +4 -0
  366. package/dist/routes/channel.d.ts.map +1 -0
  367. package/dist/routes/channel.js +492 -0
  368. package/dist/routes/channel.js.map +1 -0
  369. package/dist/routes/console.d.ts +4 -0
  370. package/dist/routes/console.d.ts.map +1 -0
  371. package/dist/routes/console.js +117 -0
  372. package/dist/routes/console.js.map +1 -0
  373. package/dist/routes/directory.d.ts +4 -0
  374. package/dist/routes/directory.d.ts.map +1 -0
  375. package/dist/routes/directory.js +236 -0
  376. package/dist/routes/directory.js.map +1 -0
  377. package/dist/routes/dm.d.ts +4 -0
  378. package/dist/routes/dm.d.ts.map +1 -0
  379. package/dist/routes/dm.js +157 -0
  380. package/dist/routes/dm.js.map +1 -0
  381. package/dist/routes/eventSubscription.d.ts +4 -0
  382. package/dist/routes/eventSubscription.d.ts.map +1 -0
  383. package/dist/routes/eventSubscription.js +115 -0
  384. package/dist/routes/eventSubscription.js.map +1 -0
  385. package/dist/routes/fanout.d.ts +17 -0
  386. package/dist/routes/fanout.d.ts.map +1 -0
  387. package/dist/routes/fanout.js +150 -0
  388. package/dist/routes/fanout.js.map +1 -0
  389. package/dist/routes/file.d.ts +4 -0
  390. package/dist/routes/file.d.ts.map +1 -0
  391. package/dist/routes/file.js +166 -0
  392. package/dist/routes/file.js.map +1 -0
  393. package/dist/routes/groupDm.d.ts +4 -0
  394. package/dist/routes/groupDm.d.ts.map +1 -0
  395. package/dist/routes/groupDm.js +204 -0
  396. package/dist/routes/groupDm.js.map +1 -0
  397. package/dist/routes/health.d.ts +4 -0
  398. package/dist/routes/health.d.ts.map +1 -0
  399. package/dist/routes/health.js +10 -0
  400. package/dist/routes/health.js.map +1 -0
  401. package/dist/routes/inboundWebhook.d.ts +4 -0
  402. package/dist/routes/inboundWebhook.d.ts.map +1 -0
  403. package/dist/routes/inboundWebhook.js +149 -0
  404. package/dist/routes/inboundWebhook.js.map +1 -0
  405. package/dist/routes/inbox.d.ts +4 -0
  406. package/dist/routes/inbox.d.ts.map +1 -0
  407. package/dist/routes/inbox.js +23 -0
  408. package/dist/routes/inbox.js.map +1 -0
  409. package/dist/routes/message.d.ts +4 -0
  410. package/dist/routes/message.d.ts.map +1 -0
  411. package/dist/routes/message.js +164 -0
  412. package/dist/routes/message.js.map +1 -0
  413. package/dist/routes/presence.d.ts +4 -0
  414. package/dist/routes/presence.d.ts.map +1 -0
  415. package/dist/routes/presence.js +70 -0
  416. package/dist/routes/presence.js.map +1 -0
  417. package/dist/routes/reaction.d.ts +4 -0
  418. package/dist/routes/reaction.d.ts.map +1 -0
  419. package/dist/routes/reaction.js +152 -0
  420. package/dist/routes/reaction.js.map +1 -0
  421. package/dist/routes/receipt.d.ts +4 -0
  422. package/dist/routes/receipt.d.ts.map +1 -0
  423. package/dist/routes/receipt.js +100 -0
  424. package/dist/routes/receipt.js.map +1 -0
  425. package/dist/routes/routing.d.ts +4 -0
  426. package/dist/routes/routing.d.ts.map +1 -0
  427. package/dist/routes/routing.js +186 -0
  428. package/dist/routes/routing.js.map +1 -0
  429. package/dist/routes/search.d.ts +4 -0
  430. package/dist/routes/search.d.ts.map +1 -0
  431. package/dist/routes/search.js +48 -0
  432. package/dist/routes/search.js.map +1 -0
  433. package/dist/routes/systemPrompt.d.ts +4 -0
  434. package/dist/routes/systemPrompt.d.ts.map +1 -0
  435. package/dist/routes/systemPrompt.js +66 -0
  436. package/dist/routes/systemPrompt.js.map +1 -0
  437. package/dist/routes/thread.d.ts +4 -0
  438. package/dist/routes/thread.d.ts.map +1 -0
  439. package/dist/routes/thread.js +126 -0
  440. package/dist/routes/thread.js.map +1 -0
  441. package/dist/routes/workspace.d.ts +4 -0
  442. package/dist/routes/workspace.d.ts.map +1 -0
  443. package/dist/routes/workspace.js +355 -0
  444. package/dist/routes/workspace.js.map +1 -0
  445. package/package.json +71 -0
@@ -0,0 +1,163 @@
1
+ import crypto from 'node:crypto';
2
+ import { createRequestLogger } from '../lib/logger.js';
3
+ import { deriveClientName, extractHarness, extractOriginInfo } from '../lib/origin.js';
4
+ function getExecutionCtx(c) {
5
+ try {
6
+ const executionCtx = c.executionCtx;
7
+ if (executionCtx && typeof executionCtx.waitUntil === 'function')
8
+ return executionCtx;
9
+ }
10
+ catch {
11
+ // Hono's test context can throw when executionCtx is accessed.
12
+ }
13
+ return undefined;
14
+ }
15
+ function sanitizeReason(reason) {
16
+ return reason.replace(/\s+/g, ' ').trim().slice(0, 200);
17
+ }
18
+ function parseBearerToken(authorization) {
19
+ if (!authorization)
20
+ return undefined;
21
+ const [scheme, rawToken] = authorization.split(' ');
22
+ if (scheme?.toLowerCase() !== 'bearer' || !rawToken)
23
+ return undefined;
24
+ return rawToken;
25
+ }
26
+ function tokenType(token) {
27
+ if (token.startsWith('at_live_'))
28
+ return 'agent';
29
+ if (token.startsWith('rk_live_'))
30
+ return 'workspace';
31
+ return 'unknown';
32
+ }
33
+ function hashIdentifier(value) {
34
+ return crypto.createHash('sha256').update(value).digest('hex').slice(0, 16);
35
+ }
36
+ function routeGroupForPath(path) {
37
+ if (path === '/v1/ws')
38
+ return 'ws';
39
+ if (path === '/mcp')
40
+ return 'mcp';
41
+ if (path.startsWith('/v1/'))
42
+ return 'api_v1';
43
+ if (path.startsWith('/.well-known/'))
44
+ return 'well_known';
45
+ if (path.startsWith('/health'))
46
+ return 'health';
47
+ return 'other';
48
+ }
49
+ function classifyAuthScheme(authHeader, queryToken) {
50
+ if (authHeader) {
51
+ const bearerToken = parseBearerToken(authHeader);
52
+ if (!bearerToken)
53
+ return 'authorization_other';
54
+ const type = tokenType(bearerToken);
55
+ if (type === 'agent')
56
+ return 'bearer_agent_token';
57
+ if (type === 'workspace')
58
+ return 'bearer_workspace_key';
59
+ return 'bearer_unknown';
60
+ }
61
+ if (queryToken) {
62
+ const type = tokenType(queryToken);
63
+ if (type === 'agent')
64
+ return 'query_agent_token';
65
+ if (type === 'workspace')
66
+ return 'query_workspace_key';
67
+ return 'query_unknown';
68
+ }
69
+ return 'none';
70
+ }
71
+ async function extractErrorInfo(response) {
72
+ const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
73
+ if (!contentType.includes('application/json'))
74
+ return {};
75
+ try {
76
+ const body = await response.clone().json();
77
+ if (!body || typeof body !== 'object')
78
+ return {};
79
+ const maybeError = body.error;
80
+ if (!maybeError || typeof maybeError !== 'object')
81
+ return {};
82
+ const code = maybeError.code;
83
+ const message = maybeError.message;
84
+ return {
85
+ ...(typeof code === 'string' ? { error_code: code } : {}),
86
+ ...(typeof message === 'string' ? { error_reason: sanitizeReason(message) } : {}),
87
+ };
88
+ }
89
+ catch {
90
+ return {};
91
+ }
92
+ }
93
+ function statusClass(statusCode) {
94
+ if (statusCode >= 500)
95
+ return '5xx';
96
+ if (statusCode >= 400)
97
+ return '4xx';
98
+ if (statusCode >= 300)
99
+ return '3xx';
100
+ if (statusCode >= 200)
101
+ return '2xx';
102
+ return '1xx';
103
+ }
104
+ export const loggerMiddleware = async (c, next) => {
105
+ const requestId = crypto.randomUUID();
106
+ c.set('requestId', requestId);
107
+ const requestHeaders = c.req.raw.headers;
108
+ const clientName = deriveClientName(requestHeaders);
109
+ const originInfo = extractOriginInfo(c.req.raw, clientName);
110
+ const harness = extractHarness(requestHeaders);
111
+ c.set('harness', harness);
112
+ const logger = createRequestLogger(c, 'request', {
113
+ request_id: requestId,
114
+ ...(clientName ? { client_name: clientName } : {}),
115
+ ...originInfo,
116
+ harness,
117
+ });
118
+ c.set('logger', logger);
119
+ const startedAt = Date.now();
120
+ await next();
121
+ const durationMs = Date.now() - startedAt;
122
+ const statusCode = c.res.status;
123
+ const authHeader = requestHeaders.get('authorization') ?? undefined;
124
+ const queryToken = c.req.query('token');
125
+ const bearerToken = parseBearerToken(authHeader);
126
+ const presentedToken = bearerToken ?? queryToken;
127
+ const authScheme = classifyAuthScheme(authHeader, queryToken);
128
+ const contentType = requestHeaders.get('content-type');
129
+ const accept = requestHeaders.get('accept');
130
+ const connectingIp = requestHeaders.get('cf-connecting-ip');
131
+ const userAgent = requestHeaders.get('user-agent');
132
+ const errorInfo = statusCode >= 400 ? await extractErrorInfo(c.res) : {};
133
+ const metadata = {
134
+ status_code: statusCode,
135
+ status_class: statusClass(statusCode),
136
+ duration_ms: durationMs,
137
+ route_group: routeGroupForPath(c.req.path),
138
+ auth_scheme: authScheme,
139
+ ...(contentType ? { content_type: contentType } : {}),
140
+ ...(accept ? { accept } : {}),
141
+ ...(clientName ? { client_name: clientName } : {}),
142
+ ...(presentedToken ? { actor_fingerprint: hashIdentifier(presentedToken) } : {}),
143
+ ...(connectingIp ? { ip_hash: hashIdentifier(connectingIp) } : {}),
144
+ ...(userAgent ? { ua_hash: hashIdentifier(userAgent) } : {}),
145
+ ...originInfo,
146
+ harness,
147
+ ...errorInfo,
148
+ };
149
+ if (statusCode >= 500) {
150
+ logger.error('Request failed', metadata);
151
+ }
152
+ else if (statusCode >= 400) {
153
+ logger.warn('Request client error', metadata);
154
+ }
155
+ const flushPromise = logger.flush();
156
+ const executionCtx = getExecutionCtx(c);
157
+ if (executionCtx) {
158
+ executionCtx.waitUntil(flushPromise);
159
+ return;
160
+ }
161
+ void flushPromise;
162
+ };
163
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { AppEnv } from '../env.js';
2
+ import type { UsageMetric } from '../ports/entitlements.js';
3
+ export { PLAN_LIMITS } from '../providers/static-entitlements.js';
4
+ export declare function checkPlanLimit(metric: UsageMetric): import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
5
+ //# sourceMappingURL=planLimits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planLimits.d.ts","sourceRoot":"","sources":["../../src/middleware/planLimits.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,kEA6BjD"}
@@ -0,0 +1,35 @@
1
+ import { createMiddleware } from 'hono/factory';
2
+ // Re-exported for back-compat with callers/tests that imported the table here.
3
+ export { PLAN_LIMITS } from '../providers/static-entitlements.js';
4
+ export function checkPlanLimit(metric) {
5
+ return createMiddleware(async (c, next) => {
6
+ const workspace = c.get('workspace');
7
+ if (!workspace) {
8
+ await next();
9
+ return;
10
+ }
11
+ const { entitlements } = c.get('engine');
12
+ const limits = await entitlements.getLimits(workspace);
13
+ const limit = limits[metric];
14
+ if (limit === Infinity) {
15
+ await next();
16
+ return;
17
+ }
18
+ try {
19
+ const current = await entitlements.getUsage(workspace.id, metric);
20
+ if (current >= limit) {
21
+ const plan = workspace.plan || 'free';
22
+ return c.json({
23
+ ok: false,
24
+ error: {
25
+ code: 'plan_limit_exceeded',
26
+ message: `Plan limit exceeded for ${metric}. Current plan: ${plan}. Limit: ${limit}. Current usage: ${current}. Upgrade your plan to increase limits.`,
27
+ },
28
+ }, 429);
29
+ }
30
+ }
31
+ catch { /* fail open */ }
32
+ await next();
33
+ });
34
+ }
35
+ //# sourceMappingURL=planLimits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planLimits.js","sourceRoot":"","sources":["../../src/middleware/planLimits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIhD,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAElE,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,OAAO,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAChD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,MAAM,IAAI,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAEzC,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAAC,MAAM,IAAI,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAClE,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC;gBACtC,OAAO,CAAC,CAAC,IAAI,CACX;oBACE,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE;wBACL,IAAI,EAAE,qBAAqB;wBAC3B,OAAO,EAAE,2BAA2B,MAAM,mBAAmB,IAAI,YAAY,KAAK,oBAAoB,OAAO,yCAAyC;qBACvJ;iBACF,EACD,GAAG,CACJ,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;QAE3B,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AppEnv } from '../env.js';
2
+ export declare const presenceRefresh: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
3
+ //# sourceMappingURL=presenceRefresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presenceRefresh.d.ts","sourceRoot":"","sources":["../../src/middleware/presenceRefresh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,eAAe,gEAc1B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { createMiddleware } from 'hono/factory';
2
+ export const presenceRefresh = createMiddleware(async (c, next) => {
3
+ try {
4
+ const agent = c.get('agent');
5
+ const workspace = c.get('workspace');
6
+ if (agent && workspace) {
7
+ // Fire-and-forget heartbeat via the presence port
8
+ c.get('engine').presence
9
+ .heartbeat(workspace.id, agent.id, agent.name)
10
+ .catch(() => { });
11
+ }
12
+ }
13
+ catch {
14
+ // Don't block the request if presence refresh fails
15
+ }
16
+ await next();
17
+ });
18
+ //# sourceMappingURL=presenceRefresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presenceRefresh.js","sourceRoot":"","sources":["../../src/middleware/presenceRefresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IACxE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACvB,kDAAkD;YAClD,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ;iBACrB,SAAS,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;iBAC7C,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IACD,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AppEnv } from '../env.js';
2
+ export declare const rateLimit: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
3
+ //# sourceMappingURL=rateLimit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AA4BxC,eAAO,MAAM,SAAS,gEAkDpB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { createMiddleware } from 'hono/factory';
2
+ // Conservative per-minute ceiling applied when the entitlements lookup fails,
3
+ // so an entitlements outage degrades to a safe default rather than no limit.
4
+ const FALLBACK_RATE_PER_MIN = 300;
5
+ // Per-route rate limit multipliers (fraction of the global per-minute limit).
6
+ // POST endpoints get tighter limits, GET endpoints get looser.
7
+ const ROUTE_MULTIPLIERS = {
8
+ 'POST:/channels/*/messages': 0.5, // message send: half the global limit
9
+ 'POST:/dm': 0.5,
10
+ 'POST:/dm/group': 0.3,
11
+ 'POST:/messages/*/reactions': 0.4,
12
+ 'GET:/channels/*/messages': 1.0,
13
+ 'GET:/agents/presence': 0.3,
14
+ };
15
+ function getRouteKey(method, path) {
16
+ // Normalize path: /v1/channels/foo/messages -> /channels/*/messages
17
+ const normalized = path
18
+ .replace(/^\/v1/, '')
19
+ .replace(/\/[a-zA-Z0-9_-]+\/messages/, '/*/messages')
20
+ .replace(/\/[a-zA-Z0-9_-]+\/reactions/, '/*/reactions')
21
+ .replace(/\/[a-zA-Z0-9_-]+\/replies/, '/*/replies');
22
+ const key = `${method}:${normalized}`;
23
+ return ROUTE_MULTIPLIERS[key] !== undefined ? key : null;
24
+ }
25
+ export const rateLimit = createMiddleware(async (c, next) => {
26
+ const workspace = c.get('workspace');
27
+ if (!workspace) {
28
+ await next();
29
+ return;
30
+ }
31
+ const { entitlements, rateLimiter } = c.get('engine');
32
+ // Apply route-specific multiplier if applicable
33
+ const routeKey = getRouteKey(c.req.method, c.req.path);
34
+ // The rate limiter port is not workspace-scoped, so the workspace id is part
35
+ // of the bucket key (the Cloudflare adapter previously scoped via the DO id).
36
+ const window = Math.floor(Date.now() / 60000);
37
+ const bucketKey = `${workspace.id}:${routeKey ?? 'global'}:${window}`;
38
+ // Resolve the per-minute limit. If entitlements are unavailable, fall back to
39
+ // a conservative default and still enforce it — an entitlements outage must
40
+ // NOT translate into unlimited throughput.
41
+ let globalLimit;
42
+ try {
43
+ globalLimit = (await entitlements.getLimits(workspace)).rate_per_min;
44
+ }
45
+ catch {
46
+ globalLimit = FALLBACK_RATE_PER_MIN;
47
+ }
48
+ const limit = routeKey ? Math.ceil(globalLimit * ROUTE_MULTIPLIERS[routeKey]) : globalLimit;
49
+ try {
50
+ const { allowed, count, remaining } = await rateLimiter.check({ bucketKey, limit, windowMs: 60_000 });
51
+ c.header('X-RateLimit-Limit', String(limit));
52
+ c.header('X-RateLimit-Remaining', String(remaining ?? Math.max(0, limit - count)));
53
+ if (!allowed) {
54
+ return c.json({
55
+ ok: false,
56
+ error: {
57
+ code: 'rate_limit_exceeded',
58
+ message: `Rate limit exceeded. ${limit} requests per minute allowed for ${workspace.plan} plan.`,
59
+ },
60
+ }, 429);
61
+ }
62
+ }
63
+ catch {
64
+ // Only the limiter backend failing is fail-open — a transient infra hiccup
65
+ // shouldn't 500 the request (the limit was still computed above).
66
+ }
67
+ await next();
68
+ });
69
+ //# sourceMappingURL=rateLimit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AppEnv } from '../env.js';
2
+ export declare const usageTracker: import("hono").MiddlewareHandler<AppEnv, string, {}, Response>;
3
+ //# sourceMappingURL=usageTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageTracker.d.ts","sourceRoot":"","sources":["../../src/middleware/usageTracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,eAAO,MAAM,YAAY,gEAOvB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { createMiddleware } from 'hono/factory';
2
+ export const usageTracker = createMiddleware(async (c, next) => {
3
+ const workspace = c.get('workspace');
4
+ if (workspace) {
5
+ // Fire-and-forget atomic usage increment via the key/value port.
6
+ c.get('engine').kv.increment(`usage:${workspace.id}:api_calls`, 1).catch(() => { });
7
+ }
8
+ await next();
9
+ });
10
+ //# sourceMappingURL=usageTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usageTracker.js","sourceRoot":"","sources":["../../src/middleware/usageTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAS,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;IACrE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACd,iEAAiE;QACjE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,IAAI,EAAE,CAAC;AACf,CAAC,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { workspaces, agents } from '../db/schema.js';
2
+ import type { EngineDb } from './database.js';
3
+ export type Workspace = typeof workspaces.$inferSelect;
4
+ export type Agent = typeof agents.$inferSelect;
5
+ export type AuthRequire = 'workspace' | 'agent' | 'any';
6
+ export type AuthResult = {
7
+ ok: true;
8
+ workspace: Workspace;
9
+ agent?: Agent;
10
+ } | {
11
+ ok: false;
12
+ status: number;
13
+ code: string;
14
+ message: string;
15
+ };
16
+ /**
17
+ * Pluggable authentication — the hosting seam.
18
+ *
19
+ * Self-host uses the built-in `SqliteApiKeyAuthProvider` (today's
20
+ * `middleware/auth.ts` logic: SHA-256 hash of `rk_live_`/`at_live_` tokens looked
21
+ * up in the `workspaces`/`agents` tables). The cloud product injects its own
22
+ * provider backed by its accounts/billing system — it may validate against the
23
+ * same gateway D1 or a different identity store entirely. The engine never
24
+ * assumes how a token maps to a workspace/agent.
25
+ */
26
+ export interface AuthProvider {
27
+ /**
28
+ * Resolve a bearer token to a workspace (and optionally an agent). `require`
29
+ * narrows the acceptable token kind for routes that demand one specifically.
30
+ * The engine passes its `db` handle so the default provider can query without
31
+ * holding its own connection; custom providers may ignore it.
32
+ */
33
+ authenticate(args: {
34
+ token: string;
35
+ require: AuthRequire;
36
+ db: EngineDb;
37
+ }): Promise<AuthResult>;
38
+ /**
39
+ * Hash a raw token to its stored form. Used by the `/v1/ws` upgrade and MCP
40
+ * key handling, which look tokens up directly. Providers that don't use hashed
41
+ * keys may return the token unchanged.
42
+ */
43
+ hashToken(token: string): string;
44
+ }
45
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/ports/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,YAAY,CAAC;AACvD,MAAM,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,YAAY,CAAC;AAE/C,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,WAAW,CAAC;QAAC,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE/F;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/ports/auth.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import type { BaseSQLiteDatabase } from 'drizzle-orm/sqlite-core';
2
+ import type * as schema from '../db/schema.js';
3
+ /**
4
+ * Driver-agnostic Drizzle handle used by every engine module.
5
+ *
6
+ * Both the Cloudflare D1 driver (`drizzle-orm/d1`, async) and the Node
7
+ * better-sqlite3 driver (`drizzle-orm/better-sqlite3`, sync) produce a
8
+ * `BaseSQLiteDatabase` over the shared schema. Drizzle query builders are
9
+ * thenable, so `await db.select()...` works against both. The engine never
10
+ * imports a concrete driver — adapters construct the handle and inject it.
11
+ *
12
+ * The one place the drivers genuinely diverge is interactive transactions:
13
+ * better-sqlite3 runs them synchronously; D1 has no interactive transactions
14
+ * and relies on `db.batch()`. Engine code that needs atomicity across rows must
15
+ * use a single statement (e.g. a `... SELECT COALESCE(MAX(seq),0)+1 ...`
16
+ * scalar-subquery insert guarded by a UNIQUE index) rather than a multi-step
17
+ * read-modify-write, so the same code is correct on both drivers.
18
+ */
19
+ export type EngineDb = BaseSQLiteDatabase<'async', any, typeof schema>;
20
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/ports/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AASH,MAAM,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,MAAM,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/ports/database.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import type { Workspace } from './auth.js';
2
+ export type UsageMetric = 'messages' | 'agents' | 'file_bytes';
3
+ export interface PlanLimits {
4
+ messages: number;
5
+ agents: number;
6
+ file_bytes: number;
7
+ /** Global requests-per-minute ceiling, fed into the rate limiter. */
8
+ rate_per_min: number;
9
+ }
10
+ /**
11
+ * Pluggable plan limits / usage — the billing seam.
12
+ *
13
+ * Self-host uses `StaticEntitlementsProvider`, seeded from today's hardcoded
14
+ * `PLAN_LIMITS` (free/pro/enterprise), defaulting single-tenant deployments to a
15
+ * generous/unlimited tier. The cloud product injects a provider that resolves
16
+ * quotas from its billing system (e.g. a Stripe subscription) per workspace and
17
+ * reports metered usage.
18
+ */
19
+ export interface EntitlementsProvider {
20
+ /** Resolve the active plan limits for a workspace. */
21
+ getLimits(workspace: Workspace): Promise<PlanLimits>;
22
+ /** Current usage for a metric, compared against the limit before allowing an action. */
23
+ getUsage(workspaceId: string, metric: UsageMetric): Promise<number>;
24
+ }
25
+ //# sourceMappingURL=entitlements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlements.d.ts","sourceRoot":"","sources":["../../src/ports/entitlements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,sDAAsD;IACtD,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAErD,wFAAwF;IACxF,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entitlements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entitlements.js","sourceRoot":"","sources":["../../src/ports/entitlements.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Outbound event queue port — replaces the Cloudflare `WEBHOOK_QUEUE` binding.
3
+ *
4
+ * After a mutation, routes enqueue a delivery message; the consumer fans it out
5
+ * to the workspace's registered webhook subscribers (`engine/eventDelivery.ts`).
6
+ * On Cloudflare this is a Queue producer + a separate consumer Worker. The Node
7
+ * adapter implements it as an in-process async worker that calls `deliverEvent`
8
+ * directly (best-effort, single process).
9
+ */
10
+ export interface QueuedEvent {
11
+ type: string;
12
+ workspaceId: string;
13
+ data: Record<string, unknown>;
14
+ }
15
+ export interface EventQueue {
16
+ /** Enqueue an event for asynchronous webhook delivery. Returns once accepted. */
17
+ send(message: QueuedEvent): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=event-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/ports/event-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/ports/event-queue.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * File storage port — replaces the R2/S3 presigned-URL surface in `engine/file.ts`.
3
+ *
4
+ * The database rows (the `files` table: pending → complete → deleted lifecycle)
5
+ * are portable domain logic and stay in the engine. Only the blob backend is the
6
+ * port: Cloudflare signs R2 (S3-compatible) URLs; the Node adapter stores blobs
7
+ * on local disk and serves them through an engine-mounted download route using a
8
+ * short-lived signed token.
9
+ */
10
+ export interface FileStorage {
11
+ /**
12
+ * Return a URL the client can `PUT` the file bytes to, valid ~1h.
13
+ * `storageKey` is the engine-assigned object key (`<workspaceId>/<id>/<name>`).
14
+ */
15
+ createUploadUrl(args: {
16
+ storageKey: string;
17
+ contentType: string;
18
+ sizeBytes: number;
19
+ }): Promise<{
20
+ uploadUrl: string;
21
+ expiresAt: string;
22
+ }>;
23
+ /** Return a URL the client can `GET` the file bytes from, valid ~1h. */
24
+ createDownloadUrl(args: {
25
+ storageKey: string;
26
+ }): Promise<string>;
27
+ }
28
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/ports/files.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEtD,wEAAwE;IACxE,iBAAiB,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/ports/files.ts"],"names":[],"mappings":""}