@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,48 @@
1
+ import { Hono } from 'hono';
2
+ import { requireAuth } from '../middleware/auth.js';
3
+ import { rateLimit } from '../middleware/rateLimit.js';
4
+ import * as searchEngine from '../engine/search.js';
5
+ import { emitServerEvent } from '../lib/serverTelemetry.js';
6
+ export const searchRoutes = new Hono();
7
+ // GET /v1/search?q=...&channel=...&from=...&limit=...&before=...&after=...
8
+ searchRoutes.get('/search', requireAuth, rateLimit, async (c) => {
9
+ try {
10
+ const db = c.get('db');
11
+ const workspace = c.get('workspace');
12
+ const q = c.req.query('q');
13
+ if (!q || typeof q !== 'string' || !q.trim()) {
14
+ return c.json({
15
+ ok: false,
16
+ error: { code: 'invalid_request', message: 'q (search query) is required' },
17
+ }, 400);
18
+ }
19
+ const channel = c.req.query('channel');
20
+ const from = c.req.query('from');
21
+ const limit = c.req.query('limit') ? parseInt(c.req.query('limit'), 10) : undefined;
22
+ const before = c.req.query('before');
23
+ const after = c.req.query('after');
24
+ const results = await searchEngine.searchMessages(db, workspace.id, {
25
+ q,
26
+ channel,
27
+ from,
28
+ limit,
29
+ before,
30
+ after,
31
+ });
32
+ emitServerEvent(c, workspace.id, 'relaycast_server_search_executed', {
33
+ query_length: q.trim().length,
34
+ result_count: results.length,
35
+ has_channel_filter: Boolean(channel),
36
+ has_from_filter: Boolean(from),
37
+ });
38
+ return c.json({ ok: true, data: results });
39
+ }
40
+ catch (err) {
41
+ const error = err;
42
+ return c.json({
43
+ ok: false,
44
+ error: { code: error.code || 'internal_error', message: error.message },
45
+ }, (error.status || 500));
46
+ }
47
+ });
48
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/routes/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,IAAI,EAAU,CAAC;AAE/C,2EAA2E;AAC3E,YAAY,CAAC,GAAG,CACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,KAAK,EAAE,CAAC,EAAE,EAAE;IACV,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,8BAA8B,EAAE;aAC5E,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE;YAClE,CAAC;YACD,OAAO;YACP,IAAI;YACJ,KAAK;YACL,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QAEH,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,kCAAkC,EAAE;YACnE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM;YAC7B,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC;YACpC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC;SAC/B,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAiD,CAAC;QAChE,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;SACxE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAQ,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../env.js';
3
+ export declare const systemPromptRoutes: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=systemPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemPrompt.d.ts","sourceRoot":"","sources":["../../src/routes/systemPrompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAMxC,eAAO,MAAM,kBAAkB,qDAAqB,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { Hono } from 'hono';
2
+ import { z } from 'zod';
3
+ import { requireAuth, requireWorkspaceKey } from '../middleware/auth.js';
4
+ import { rateLimit } from '../middleware/rateLimit.js';
5
+ import * as systemPromptEngine from '../engine/systemPrompt.js';
6
+ import { emitServerEvent } from '../lib/serverTelemetry.js';
7
+ export const systemPromptRoutes = new Hono();
8
+ const updateSystemPromptSchema = z.object({
9
+ prompt: z.unknown().optional(),
10
+ reset: z.boolean().optional(),
11
+ }).passthrough();
12
+ systemPromptRoutes.get('/workspace/system-prompt', requireAuth, rateLimit, async (c) => {
13
+ try {
14
+ const db = c.get('db');
15
+ const workspace = c.get('workspace');
16
+ const result = await systemPromptEngine.getSystemPrompt(db, workspace.id);
17
+ return c.json({ ok: true, data: result });
18
+ }
19
+ catch (err) {
20
+ const error = err;
21
+ return c.json({
22
+ ok: false,
23
+ error: { code: error.code || 'internal_error', message: error.message },
24
+ }, (error.status || 500));
25
+ }
26
+ });
27
+ systemPromptRoutes.put('/workspace/system-prompt', requireWorkspaceKey, rateLimit, async (c) => {
28
+ try {
29
+ const db = c.get('db');
30
+ const workspace = c.get('workspace');
31
+ const parsed = updateSystemPromptSchema.safeParse(await c.req.json());
32
+ if (!parsed.success) {
33
+ return c.json({
34
+ ok: false,
35
+ error: { code: 'invalid_request', message: 'invalid system prompt body' },
36
+ }, 400);
37
+ }
38
+ const { prompt, reset } = parsed.data;
39
+ if (reset === true || prompt === null) {
40
+ const result = await systemPromptEngine.setSystemPrompt(db, workspace.id, null);
41
+ emitServerEvent(c, workspace.id, 'relaycast_server_system_prompt_updated', {
42
+ operation: 'reset',
43
+ });
44
+ return c.json({ ok: true, data: result });
45
+ }
46
+ if (!prompt || typeof prompt !== 'string') {
47
+ return c.json({
48
+ ok: false,
49
+ error: { code: 'invalid_request', message: 'prompt must be a non-empty string' },
50
+ }, 400);
51
+ }
52
+ const result = await systemPromptEngine.setSystemPrompt(db, workspace.id, prompt);
53
+ emitServerEvent(c, workspace.id, 'relaycast_server_system_prompt_updated', {
54
+ operation: 'set',
55
+ });
56
+ return c.json({ ok: true, data: result });
57
+ }
58
+ catch (err) {
59
+ const error = err;
60
+ return c.json({
61
+ ok: false,
62
+ error: { code: error.code || 'internal_error', message: error.message },
63
+ }, (error.status || 500));
64
+ }
65
+ });
66
+ //# sourceMappingURL=systemPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemPrompt.js","sourceRoot":"","sources":["../../src/routes/systemPrompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../env.js';
3
+ export declare const threadRoutes: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/routes/thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AASxC,eAAO,MAAM,YAAY,qDAAqB,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { Hono } from 'hono';
2
+ import { z } from 'zod';
3
+ import { requireAuth } from '../middleware/auth.js';
4
+ import { rateLimit } from '../middleware/rateLimit.js';
5
+ import { parseIdempotencyKey, runIdempotent } from '../middleware/idempotency.js';
6
+ import * as threadEngine from '../engine/thread.js';
7
+ import { fanoutToChannel, fanoutToAgents, getDmParticipantAgentIds } from './fanout.js';
8
+ import { runInBackground } from './background.js';
9
+ import { emitServerEvent } from '../lib/serverTelemetry.js';
10
+ export const threadRoutes = new Hono();
11
+ const postReplySchema = z.object({
12
+ text: z.string().min(1),
13
+ blocks: z.array(z.unknown()).nullable().optional(),
14
+ data: z.record(z.string(), z.unknown()).nullable().optional(),
15
+ });
16
+ // POST /v1/messages/:id/replies - post a reply
17
+ threadRoutes.post('/messages/:id/replies', requireAuth, rateLimit, async (c) => {
18
+ try {
19
+ const db = c.get('db');
20
+ const workspace = c.get('workspace');
21
+ const agent = c.get('agent');
22
+ const parsed = postReplySchema.safeParse(await c.req.json());
23
+ if (!parsed.success) {
24
+ return c.json({
25
+ ok: false,
26
+ error: { code: 'invalid_request', message: 'text is required' },
27
+ }, 400);
28
+ }
29
+ const { text, blocks, data } = parsed.data;
30
+ const { key: idempotencyKey, error: idempotencyError } = parseIdempotencyKey(c.req.header('Idempotency-Key'));
31
+ if (idempotencyError) {
32
+ return c.json({
33
+ ok: false,
34
+ error: { code: 'invalid_idempotency_key', message: idempotencyError },
35
+ }, 400);
36
+ }
37
+ const agentId = agent?.id;
38
+ if (!agentId) {
39
+ return c.json({
40
+ ok: false,
41
+ error: { code: 'agent_token_required', message: 'Agent token required to post replies' },
42
+ }, 403);
43
+ }
44
+ const parentId = c.req.param('id');
45
+ const idempotent = await runIdempotent({
46
+ workspaceId: workspace.id,
47
+ actorId: agentId,
48
+ scope: `thread-reply:${parentId}`,
49
+ key: idempotencyKey,
50
+ status: 201,
51
+ fingerprint: JSON.stringify({ parentId, text, blocks, data }),
52
+ kv: c.get('engine').kv,
53
+ operation: () => threadEngine.postReply(db, workspace.id, parentId, agentId, { text, blocks, data }),
54
+ });
55
+ if (idempotent.replayed) {
56
+ c.header('Idempotency-Replayed', 'true');
57
+ }
58
+ if (!idempotent.replayed) {
59
+ const { _deliveries, ...publicReplyData } = idempotent.data;
60
+ const eventData = { ...publicReplyData, from_name: agent?.name };
61
+ if (publicReplyData.channel_id) {
62
+ const channelId = publicReplyData.channel_id;
63
+ runInBackground(c, (async () => {
64
+ const dmAgentIds = await getDmParticipantAgentIds(c, channelId);
65
+ if (dmAgentIds) {
66
+ await fanoutToAgents(c, dmAgentIds, 'thread.reply', eventData);
67
+ }
68
+ else {
69
+ await fanoutToChannel(c, channelId, 'thread.reply', eventData);
70
+ }
71
+ })(), 'fanout thread.reply');
72
+ }
73
+ // Emit delivery.accepted individually to each recipient's AgentDO
74
+ if (_deliveries && _deliveries.length > 0) {
75
+ for (const d of _deliveries) {
76
+ runInBackground(c, fanoutToAgents(c, [d.agentId], 'delivery.accepted', {
77
+ delivery_id: d.id,
78
+ message_id: String(publicReplyData.id),
79
+ channel_id: publicReplyData.channel_id ?? null,
80
+ reason: 'thread-reply',
81
+ }), 'fanout delivery.accepted');
82
+ }
83
+ }
84
+ runInBackground(c, c.get('engine').webhookQueue.send({
85
+ type: 'thread.reply',
86
+ workspaceId: workspace.id,
87
+ data: eventData,
88
+ }), 'queue thread.reply');
89
+ emitServerEvent(c, workspace.id, 'relaycast_server_thread_reply_created', {
90
+ message_id: publicReplyData.id,
91
+ parent_message_id: parentId,
92
+ channel_id: publicReplyData.channel_id ?? null,
93
+ });
94
+ }
95
+ const { _deliveries: _drop, ...responseData } = idempotent.data;
96
+ return c.json({ ok: true, data: responseData }, idempotent.status);
97
+ }
98
+ catch (err) {
99
+ const error = err;
100
+ return c.json({
101
+ ok: false,
102
+ error: { code: error.code || 'internal_error', message: error.message },
103
+ }, (error.status || 500));
104
+ }
105
+ });
106
+ // GET /v1/messages/:id/replies - get thread
107
+ threadRoutes.get('/messages/:id/replies', requireAuth, rateLimit, async (c) => {
108
+ try {
109
+ const db = c.get('db');
110
+ const workspace = c.get('workspace');
111
+ const limit = c.req.query('limit') ? parseInt(c.req.query('limit'), 10) : undefined;
112
+ const before = c.req.query('before');
113
+ const after = c.req.query('after');
114
+ const parentId = c.req.param('id');
115
+ const result = await threadEngine.getThread(db, workspace.id, parentId, { limit, before, after });
116
+ return c.json({ ok: true, data: result });
117
+ }
118
+ catch (err) {
119
+ const error = err;
120
+ return c.json({
121
+ ok: false,
122
+ error: { code: error.code || 'internal_error', message: error.message },
123
+ }, (error.status || 500));
124
+ }
125
+ });
126
+ //# sourceMappingURL=thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.js","sourceRoot":"","sources":["../../src/routes/thread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AppEnv } from '../env.js';
3
+ export declare const workspaceRoutes: Hono<AppEnv, import("hono/types").BlankSchema, "/">;
4
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/routes/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAcxC,eAAO,MAAM,eAAe,qDAAqB,CAAC"}
@@ -0,0 +1,355 @@
1
+ import { Hono } from 'hono';
2
+ import { createMiddleware } from 'hono/factory';
3
+ import { z } from 'zod';
4
+ import { requireWorkspaceKey } from '../middleware/auth.js';
5
+ import { rateLimit } from '../middleware/rateLimit.js';
6
+ import * as workspaceEngine from '../engine/workspace.js';
7
+ import * as activityEngine from '../engine/activity.js';
8
+ import * as dmAllEngine from '../engine/dmAll.js';
9
+ import * as tokenRotateEngine from '../engine/tokenRotate.js';
10
+ import { getWorkspaceStreamConfig, setWorkspaceStreamOverride, } from '../lib/workspaceStream.js';
11
+ import { getRequestLogger, toErrorDetails } from '../lib/logger.js';
12
+ import { emitServerEvent } from '../lib/serverTelemetry.js';
13
+ export const workspaceRoutes = new Hono();
14
+ const createWorkspaceSchema = z.object({
15
+ name: z.string().min(1),
16
+ });
17
+ const updateWorkspaceSchema = z.object({
18
+ name: z.string().optional(),
19
+ system_prompt: z.string().nullable().optional(),
20
+ });
21
+ const updateWorkspaceStreamSchema = z.object({
22
+ enabled: z.boolean().optional(),
23
+ mode: z.string().optional(),
24
+ }).passthrough();
25
+ const PUBLIC_WORKSPACE_LOOKUP_LIMIT = 30;
26
+ const publicWorkspaceLookupBuckets = new Map();
27
+ let lastPublicWorkspaceLookupCleanup = Date.now();
28
+ function getPublicLookupClientId(c) {
29
+ const forwardedFor = c.req.header('X-Forwarded-For');
30
+ const clientIp = c.req.header('CF-Connecting-IP')
31
+ ?? forwardedFor?.split(',')[0]?.trim()
32
+ ?? 'unknown';
33
+ return clientIp;
34
+ }
35
+ function inMemoryPublicLookupRateCheck(clientId, limit) {
36
+ const now = Date.now();
37
+ if (now - lastPublicWorkspaceLookupCleanup > 60_000) {
38
+ lastPublicWorkspaceLookupCleanup = now;
39
+ for (const [key, bucket] of publicWorkspaceLookupBuckets) {
40
+ if (now - bucket.lastSeen > 120_000) {
41
+ publicWorkspaceLookupBuckets.delete(key);
42
+ }
43
+ }
44
+ }
45
+ const window = Math.floor(now / 60_000);
46
+ const bucketKey = `${clientId}:${window}`;
47
+ const bucket = publicWorkspaceLookupBuckets.get(bucketKey) ?? { count: 0, lastSeen: now };
48
+ bucket.count += 1;
49
+ bucket.lastSeen = now;
50
+ publicWorkspaceLookupBuckets.set(bucketKey, bucket);
51
+ return {
52
+ allowed: bucket.count <= limit,
53
+ remaining: Math.max(0, limit - bucket.count),
54
+ };
55
+ }
56
+ function extractOwnerApiKey(authHeader) {
57
+ if (!authHeader?.startsWith('Bearer '))
58
+ return undefined;
59
+ const token = authHeader.slice(7);
60
+ return token.startsWith('rk_') ? token : undefined;
61
+ }
62
+ const publicWorkspaceLookupRateLimit = createMiddleware(async (c, next) => {
63
+ const clientId = getPublicLookupClientId(c);
64
+ const limit = PUBLIC_WORKSPACE_LOOKUP_LIMIT;
65
+ const window = Math.floor(Date.now() / 60_000);
66
+ const bucketKey = `public-workspace-lookup:${clientId}:${window}`;
67
+ try {
68
+ const { count, allowed } = await c.get('engine').rateLimiter.check({
69
+ bucketKey,
70
+ limit,
71
+ windowMs: 60_000,
72
+ });
73
+ const remaining = Math.max(0, limit - count);
74
+ c.header('X-RateLimit-Limit', String(limit));
75
+ c.header('X-RateLimit-Remaining', String(remaining));
76
+ if (!allowed) {
77
+ return c.json({
78
+ ok: false,
79
+ error: {
80
+ code: 'rate_limit_exceeded',
81
+ message: `Rate limit exceeded. ${limit} requests per minute allowed for public workspace lookups.`,
82
+ },
83
+ }, 429);
84
+ }
85
+ }
86
+ catch {
87
+ const { allowed, remaining } = inMemoryPublicLookupRateCheck(clientId, limit);
88
+ c.header('X-RateLimit-Limit', String(limit));
89
+ c.header('X-RateLimit-Remaining', String(remaining));
90
+ if (!allowed) {
91
+ return c.json({
92
+ ok: false,
93
+ error: {
94
+ code: 'rate_limit_exceeded',
95
+ message: `Rate limit exceeded. ${limit} requests per minute allowed for public workspace lookups.`,
96
+ },
97
+ }, 429);
98
+ }
99
+ }
100
+ await next();
101
+ });
102
+ // POST /workspaces - create workspace (no auth required, workspace key optional)
103
+ workspaceRoutes.post('/workspaces', async (c) => {
104
+ try {
105
+ const parsed = createWorkspaceSchema.safeParse(await c.req.json());
106
+ if (!parsed.success) {
107
+ return c.json({ ok: false, error: { code: 'invalid_request', message: 'name is required' } }, 400);
108
+ }
109
+ const { name } = parsed.data;
110
+ const db = c.get('db');
111
+ const ownerApiKey = extractOwnerApiKey(c.req.header('Authorization'));
112
+ const result = await workspaceEngine.createWorkspace(db, name, ownerApiKey ? { ownerApiKey } : undefined);
113
+ if (result.created) {
114
+ emitServerEvent(c, result.workspace.workspace_id, 'relaycast_server_workspace_created', {
115
+ created_via: 'api',
116
+ });
117
+ }
118
+ return c.json({ ok: true, data: result.workspace }, result.created ? 201 : 200);
119
+ }
120
+ catch (err) {
121
+ const error = err;
122
+ return c.json({ ok: false, error: { code: error.code || 'internal_error', message: error.message } }, (error.status || 500));
123
+ }
124
+ });
125
+ // GET /workspaces/by-name/:name - lookup public workspace metadata by name
126
+ workspaceRoutes.get('/workspaces/by-name/:name', publicWorkspaceLookupRateLimit, async (c) => {
127
+ try {
128
+ const db = c.get('db');
129
+ const workspace = await workspaceEngine.getWorkspaceByName(db, c.req.param('name'));
130
+ if (!workspace) {
131
+ return c.json({ ok: false, error: { code: 'workspace_not_found', message: 'Workspace not found' } }, 404);
132
+ }
133
+ return c.json({ ok: true, data: workspace });
134
+ }
135
+ catch (err) {
136
+ const error = err;
137
+ return c.json({ ok: false, error: { code: error.code || 'internal_error', message: error.message } }, (error.status || 500));
138
+ }
139
+ });
140
+ // GET /workspace - get current workspace
141
+ workspaceRoutes.get('/workspace', requireWorkspaceKey, rateLimit, async (c) => {
142
+ try {
143
+ const db = c.get('db');
144
+ const workspace = await workspaceEngine.getWorkspace(db, c.get('workspace').id);
145
+ if (!workspace) {
146
+ return c.json({ ok: false, error: { code: 'workspace_not_found', message: 'Workspace not found' } }, 404);
147
+ }
148
+ return c.json({ ok: true, data: workspace });
149
+ }
150
+ catch (err) {
151
+ const error = err;
152
+ return c.json({ ok: false, error: { code: error.code || 'internal_error', message: error.message } }, (error.status || 500));
153
+ }
154
+ });
155
+ // PATCH /workspace - update workspace
156
+ workspaceRoutes.patch('/workspace', requireWorkspaceKey, rateLimit, async (c) => {
157
+ try {
158
+ const db = c.get('db');
159
+ const workspace = c.get('workspace');
160
+ const parsed = updateWorkspaceSchema.safeParse(await c.req.json());
161
+ if (!parsed.success) {
162
+ return c.json({ ok: false, error: { code: 'invalid_request', message: 'invalid workspace update body' } }, 400);
163
+ }
164
+ const body = parsed.data;
165
+ const updated = await workspaceEngine.updateWorkspace(db, workspace.id, body);
166
+ if (!updated) {
167
+ return c.json({ ok: false, error: { code: 'workspace_not_found', message: 'Workspace not found' } }, 404);
168
+ }
169
+ emitServerEvent(c, workspace.id, 'relaycast_server_workspace_updated', {
170
+ changed_name: typeof body?.name === 'string',
171
+ changed_system_prompt: typeof body?.system_prompt === 'string',
172
+ });
173
+ return c.json({ ok: true, data: updated });
174
+ }
175
+ catch (err) {
176
+ const error = err;
177
+ return c.json({ ok: false, error: { code: error.code || 'internal_error', message: error.message } }, (error.status || 500));
178
+ }
179
+ });
180
+ // DELETE /workspace - delete workspace
181
+ workspaceRoutes.delete('/workspace', requireWorkspaceKey, rateLimit, async (c) => {
182
+ try {
183
+ const db = c.get('db');
184
+ const workspace = c.get('workspace');
185
+ await workspaceEngine.deleteWorkspace(db, workspace.id);
186
+ emitServerEvent(c, workspace.id, 'relaycast_server_workspace_deleted', {
187
+ deleted_via: 'api',
188
+ });
189
+ return c.body(null, 204);
190
+ }
191
+ catch (err) {
192
+ const error = err;
193
+ return c.json({ ok: false, error: { code: error.code || 'internal_error', message: error.message } }, (error.status || 500));
194
+ }
195
+ });
196
+ // GET /activity — recent activity feed
197
+ workspaceRoutes.get('/activity', requireWorkspaceKey, rateLimit, async (c) => {
198
+ try {
199
+ const db = c.get('db');
200
+ const workspace = c.get('workspace');
201
+ const limitStr = c.req.query('limit');
202
+ const limit = limitStr ? parseInt(limitStr, 10) : 20;
203
+ const items = await activityEngine.getActivityFeed(db, workspace.id, limit);
204
+ return c.json({ ok: true, data: items });
205
+ }
206
+ catch (err) {
207
+ const error = err;
208
+ return c.json({
209
+ ok: false,
210
+ error: { code: error.code || 'internal_error', message: error.message },
211
+ }, (error.status || 500));
212
+ }
213
+ });
214
+ // GET /dm/conversations/all — workspace-wide DM list
215
+ workspaceRoutes.get('/dm/conversations/all', requireWorkspaceKey, rateLimit, async (c) => {
216
+ try {
217
+ const db = c.get('db');
218
+ const workspace = c.get('workspace');
219
+ const conversations = await dmAllEngine.listAllDmConversations(db, workspace.id);
220
+ return c.json({ ok: true, data: conversations });
221
+ }
222
+ catch (err) {
223
+ const error = err;
224
+ return c.json({
225
+ ok: false,
226
+ error: { code: error.code || 'internal_error', message: error.message },
227
+ }, (error.status || 500));
228
+ }
229
+ });
230
+ // GET /dm/conversations/:conversation_id/messages — DM messages by conversation
231
+ workspaceRoutes.get('/dm/conversations/:conversation_id/messages', requireWorkspaceKey, rateLimit, async (c) => {
232
+ try {
233
+ const db = c.get('db');
234
+ const workspace = c.get('workspace');
235
+ const conversationId = c.req.param('conversation_id');
236
+ const limitStr = c.req.query('limit');
237
+ const limit = limitStr ? parseInt(limitStr, 10) : undefined;
238
+ const before = c.req.query('before') || undefined;
239
+ const after = c.req.query('after') || undefined;
240
+ const msgs = await dmAllEngine.getDmMessagesForWorkspace(db, workspace.id, conversationId, { limit, before, after });
241
+ return c.json({ ok: true, data: msgs });
242
+ }
243
+ catch (err) {
244
+ const error = err;
245
+ return c.json({
246
+ ok: false,
247
+ error: { code: error.code || 'internal_error', message: error.message },
248
+ }, (error.status || 500));
249
+ }
250
+ });
251
+ // POST /agents/:name/rotate-token — token rotation
252
+ workspaceRoutes.post('/agents/:name/rotate-token', requireWorkspaceKey, rateLimit, async (c) => {
253
+ try {
254
+ const db = c.get('db');
255
+ const workspace = c.get('workspace');
256
+ const result = await tokenRotateEngine.rotateAgentToken(db, workspace.id, c.req.param('name'));
257
+ emitServerEvent(c, workspace.id, 'relaycast_server_agent_token_rotated', {
258
+ agent_name: c.req.param('name'),
259
+ });
260
+ return c.json({ ok: true, data: result });
261
+ }
262
+ catch (err) {
263
+ const error = err;
264
+ return c.json({
265
+ ok: false,
266
+ error: { code: error.code || 'internal_error', message: error.message },
267
+ }, (error.status || 500));
268
+ }
269
+ });
270
+ // GET /workspace/stream - get workspace stream effective config
271
+ workspaceRoutes.get('/workspace/stream', requireWorkspaceKey, rateLimit, async (c) => {
272
+ const logger = getRequestLogger(c, 'workspace.stream.get');
273
+ const workspaceId = c.get('workspace').id;
274
+ try {
275
+ const { kv, config: engineConfig } = c.get('engine');
276
+ const config = await getWorkspaceStreamConfig(kv, workspaceId, engineConfig.workspaceStreamEnabled ?? false);
277
+ return c.json({
278
+ ok: true,
279
+ data: {
280
+ enabled: config.enabled,
281
+ default_enabled: config.defaultEnabled,
282
+ override: config.override,
283
+ },
284
+ });
285
+ }
286
+ catch (err) {
287
+ const error = err;
288
+ logger.error('Failed to get stream config', {
289
+ workspaceId,
290
+ code: error.code,
291
+ status: error.status,
292
+ ...toErrorDetails(error),
293
+ });
294
+ return c.json({
295
+ ok: false,
296
+ error: { code: error.code || 'internal_error', message: error.message },
297
+ }, (error.status || 500));
298
+ }
299
+ });
300
+ // PUT /workspace/stream - set workspace stream override
301
+ workspaceRoutes.put('/workspace/stream', requireWorkspaceKey, rateLimit, async (c) => {
302
+ const logger = getRequestLogger(c, 'workspace.stream.put');
303
+ const workspaceId = c.get('workspace').id;
304
+ try {
305
+ const parsed = updateWorkspaceStreamSchema.safeParse(await c.req.json());
306
+ if (!parsed.success) {
307
+ return c.json({
308
+ ok: false,
309
+ error: { code: 'invalid_request', message: 'Provide { enabled: boolean } or { mode: "inherit" }' },
310
+ }, 400);
311
+ }
312
+ const body = parsed.data;
313
+ let override;
314
+ if (body?.mode === 'inherit') {
315
+ override = null;
316
+ }
317
+ else if (typeof body?.enabled === 'boolean') {
318
+ override = body.enabled;
319
+ }
320
+ else {
321
+ return c.json({
322
+ ok: false,
323
+ error: { code: 'invalid_request', message: 'Provide { enabled: boolean } or { mode: "inherit" }' },
324
+ }, 400);
325
+ }
326
+ const { kv, config: engineConfig } = c.get('engine');
327
+ await setWorkspaceStreamOverride(kv, workspaceId, override);
328
+ const config = await getWorkspaceStreamConfig(kv, workspaceId, engineConfig.workspaceStreamEnabled ?? false);
329
+ emitServerEvent(c, workspaceId, 'relaycast_server_workspace_stream_updated', {
330
+ stream_mode: override === null ? 'inherit' : (override ? 'enabled' : 'disabled'),
331
+ });
332
+ return c.json({
333
+ ok: true,
334
+ data: {
335
+ enabled: config.enabled,
336
+ default_enabled: config.defaultEnabled,
337
+ override: config.override,
338
+ },
339
+ });
340
+ }
341
+ catch (err) {
342
+ const error = err;
343
+ logger.error('Failed to update stream config', {
344
+ workspaceId,
345
+ code: error.code,
346
+ status: error.status,
347
+ ...toErrorDetails(error),
348
+ });
349
+ return c.json({
350
+ ok: false,
351
+ error: { code: error.code || 'internal_error', message: error.message },
352
+ }, (error.status || 500));
353
+ }
354
+ });
355
+ //# sourceMappingURL=workspace.js.map