@raybase/core 0.0.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/LICENSE +21 -0
  2. package/dist/.admin-build/AdminApp.css +2 -0
  3. package/dist/.admin-build/AdminApp.js +77 -0
  4. package/dist/.admin-docs-build/AdminDocsApp.css +2 -0
  5. package/dist/.admin-docs-build/AdminDocsApp.js +45 -0
  6. package/dist/actions.d.ts +347 -0
  7. package/dist/actions.d.ts.map +1 -0
  8. package/dist/actions.js +661 -0
  9. package/dist/actions.js.map +1 -0
  10. package/dist/admin-assets/admin.7738f50720a8ed7b.css +2 -0
  11. package/dist/admin-assets/admin.8678cb61db34dc81.js +77 -0
  12. package/dist/admin-boot.d.ts +94 -0
  13. package/dist/admin-boot.d.ts.map +1 -0
  14. package/dist/admin-boot.js +139 -0
  15. package/dist/admin-boot.js.map +1 -0
  16. package/dist/admin-docs-content.d.ts +95 -0
  17. package/dist/admin-docs-content.d.ts.map +1 -0
  18. package/dist/admin-docs-content.js +463 -0
  19. package/dist/admin-docs-content.js.map +1 -0
  20. package/dist/admin-docs-ui.d.ts +11 -0
  21. package/dist/admin-docs-ui.d.ts.map +1 -0
  22. package/dist/admin-docs-ui.js +23 -0
  23. package/dist/admin-docs-ui.js.map +1 -0
  24. package/dist/admin-kit.d.ts +29 -0
  25. package/dist/admin-kit.js +1557 -0
  26. package/dist/admin-role.d.ts +8 -0
  27. package/dist/admin-role.d.ts.map +1 -0
  28. package/dist/admin-role.js +22 -0
  29. package/dist/admin-role.js.map +1 -0
  30. package/dist/admin-ui.d.ts +3 -0
  31. package/dist/admin-ui.d.ts.map +1 -0
  32. package/dist/admin-ui.js +16 -0
  33. package/dist/admin-ui.js.map +1 -0
  34. package/dist/agent-ai-chat.d.ts +127 -0
  35. package/dist/agent-ai-chat.d.ts.map +1 -0
  36. package/dist/agent-ai-chat.js +5975 -0
  37. package/dist/agent-ai-chat.js.map +1 -0
  38. package/dist/agent-chapter-archive.d.ts +214 -0
  39. package/dist/agent-chapter-archive.d.ts.map +1 -0
  40. package/dist/agent-chapter-archive.js +696 -0
  41. package/dist/agent-chapter-archive.js.map +1 -0
  42. package/dist/agent-chapter-search.d.ts +116 -0
  43. package/dist/agent-chapter-search.d.ts.map +1 -0
  44. package/dist/agent-chapter-search.js +605 -0
  45. package/dist/agent-chapter-search.js.map +1 -0
  46. package/dist/agent-chapter-tools.d.ts +45 -0
  47. package/dist/agent-chapter-tools.d.ts.map +1 -0
  48. package/dist/agent-chapter-tools.js +344 -0
  49. package/dist/agent-chapter-tools.js.map +1 -0
  50. package/dist/agent-chapters.d.ts +228 -0
  51. package/dist/agent-chapters.d.ts.map +1 -0
  52. package/dist/agent-chapters.js +737 -0
  53. package/dist/agent-chapters.js.map +1 -0
  54. package/dist/agent-data-parts.d.ts +167 -0
  55. package/dist/agent-data-parts.d.ts.map +1 -0
  56. package/dist/agent-data-parts.js +68 -0
  57. package/dist/agent-data-parts.js.map +1 -0
  58. package/dist/agent-errors.d.ts +41 -0
  59. package/dist/agent-errors.d.ts.map +1 -0
  60. package/dist/agent-errors.js +191 -0
  61. package/dist/agent-errors.js.map +1 -0
  62. package/dist/agent-follow-up-store.d.ts +273 -0
  63. package/dist/agent-follow-up-store.d.ts.map +1 -0
  64. package/dist/agent-follow-up-store.js +703 -0
  65. package/dist/agent-follow-up-store.js.map +1 -0
  66. package/dist/agent-follow-ups.d.ts +314 -0
  67. package/dist/agent-follow-ups.d.ts.map +1 -0
  68. package/dist/agent-follow-ups.js +840 -0
  69. package/dist/agent-follow-ups.js.map +1 -0
  70. package/dist/agent-memory.d.ts +323 -0
  71. package/dist/agent-memory.d.ts.map +1 -0
  72. package/dist/agent-memory.js +1270 -0
  73. package/dist/agent-memory.js.map +1 -0
  74. package/dist/agent-message-parts.d.ts +58 -0
  75. package/dist/agent-message-parts.d.ts.map +1 -0
  76. package/dist/agent-message-parts.js +163 -0
  77. package/dist/agent-message-parts.js.map +1 -0
  78. package/dist/agent-remote-mcp-credentials.d.ts +154 -0
  79. package/dist/agent-remote-mcp-credentials.d.ts.map +1 -0
  80. package/dist/agent-remote-mcp-credentials.js +287 -0
  81. package/dist/agent-remote-mcp-credentials.js.map +1 -0
  82. package/dist/agent-remote-mcp-crypto.d.ts +32 -0
  83. package/dist/agent-remote-mcp-crypto.d.ts.map +1 -0
  84. package/dist/agent-remote-mcp-crypto.js +101 -0
  85. package/dist/agent-remote-mcp-crypto.js.map +1 -0
  86. package/dist/agent-remote-mcp-install.d.ts +299 -0
  87. package/dist/agent-remote-mcp-install.d.ts.map +1 -0
  88. package/dist/agent-remote-mcp-install.js +785 -0
  89. package/dist/agent-remote-mcp-install.js.map +1 -0
  90. package/dist/agent-remote-mcp-oauth.d.ts +73 -0
  91. package/dist/agent-remote-mcp-oauth.d.ts.map +1 -0
  92. package/dist/agent-remote-mcp-oauth.js +344 -0
  93. package/dist/agent-remote-mcp-oauth.js.map +1 -0
  94. package/dist/agent-remote-mcp-transport.d.ts +46 -0
  95. package/dist/agent-remote-mcp-transport.d.ts.map +1 -0
  96. package/dist/agent-remote-mcp-transport.js +225 -0
  97. package/dist/agent-remote-mcp-transport.js.map +1 -0
  98. package/dist/agent-remote-mcp.d.ts +147 -0
  99. package/dist/agent-remote-mcp.d.ts.map +1 -0
  100. package/dist/agent-remote-mcp.js +681 -0
  101. package/dist/agent-remote-mcp.js.map +1 -0
  102. package/dist/agent-room-redaction.d.ts +66 -0
  103. package/dist/agent-room-redaction.d.ts.map +1 -0
  104. package/dist/agent-room-redaction.js +264 -0
  105. package/dist/agent-room-redaction.js.map +1 -0
  106. package/dist/agent-rooms.d.ts +209 -0
  107. package/dist/agent-rooms.d.ts.map +1 -0
  108. package/dist/agent-rooms.js +244 -0
  109. package/dist/agent-rooms.js.map +1 -0
  110. package/dist/agent-runtime.d.ts +541 -0
  111. package/dist/agent-runtime.d.ts.map +1 -0
  112. package/dist/agent-runtime.js +4260 -0
  113. package/dist/agent-runtime.js.map +1 -0
  114. package/dist/agent-skill-archive.d.ts +20 -0
  115. package/dist/agent-skill-archive.d.ts.map +1 -0
  116. package/dist/agent-skill-archive.js +316 -0
  117. package/dist/agent-skill-archive.js.map +1 -0
  118. package/dist/agent-skill-discovery.d.ts +96 -0
  119. package/dist/agent-skill-discovery.d.ts.map +1 -0
  120. package/dist/agent-skill-discovery.js +464 -0
  121. package/dist/agent-skill-discovery.js.map +1 -0
  122. package/dist/agent-skill-format.d.ts +57 -0
  123. package/dist/agent-skill-format.d.ts.map +1 -0
  124. package/dist/agent-skill-format.js +238 -0
  125. package/dist/agent-skill-format.js.map +1 -0
  126. package/dist/agent-skill-import.d.ts +64 -0
  127. package/dist/agent-skill-import.d.ts.map +1 -0
  128. package/dist/agent-skill-import.js +295 -0
  129. package/dist/agent-skill-import.js.map +1 -0
  130. package/dist/agent-skill-publish.d.ts +51 -0
  131. package/dist/agent-skill-publish.d.ts.map +1 -0
  132. package/dist/agent-skill-publish.js +136 -0
  133. package/dist/agent-skill-publish.js.map +1 -0
  134. package/dist/agent-skill-store.d.ts +252 -0
  135. package/dist/agent-skill-store.d.ts.map +1 -0
  136. package/dist/agent-skill-store.js +514 -0
  137. package/dist/agent-skill-store.js.map +1 -0
  138. package/dist/agent-skills.d.ts +85 -0
  139. package/dist/agent-skills.d.ts.map +1 -0
  140. package/dist/agent-skills.js +291 -0
  141. package/dist/agent-skills.js.map +1 -0
  142. package/dist/agent-transcript-pager.d.ts +77 -0
  143. package/dist/agent-transcript-pager.d.ts.map +1 -0
  144. package/dist/agent-transcript-pager.js +210 -0
  145. package/dist/agent-transcript-pager.js.map +1 -0
  146. package/dist/agent-user-data-parts.d.ts +20 -0
  147. package/dist/agent-user-data-parts.d.ts.map +1 -0
  148. package/dist/agent-user-data-parts.js +161 -0
  149. package/dist/agent-user-data-parts.js.map +1 -0
  150. package/dist/agent-user-transcript.d.ts +46 -0
  151. package/dist/agent-user-transcript.d.ts.map +1 -0
  152. package/dist/agent-user-transcript.js +106 -0
  153. package/dist/agent-user-transcript.js.map +1 -0
  154. package/dist/agent-voice-notes.d.ts +15 -0
  155. package/dist/agent-voice-notes.d.ts.map +1 -0
  156. package/dist/agent-voice-notes.js +17 -0
  157. package/dist/agent-voice-notes.js.map +1 -0
  158. package/dist/agent-wakes.d.ts +213 -0
  159. package/dist/agent-wakes.d.ts.map +1 -0
  160. package/dist/agent-wakes.js +534 -0
  161. package/dist/agent-wakes.js.map +1 -0
  162. package/dist/agent.d.ts +1780 -0
  163. package/dist/agent.d.ts.map +1 -0
  164. package/dist/agent.js +3123 -0
  165. package/dist/agent.js.map +1 -0
  166. package/dist/ai.d.ts +583 -0
  167. package/dist/ai.d.ts.map +1 -0
  168. package/dist/ai.js +1858 -0
  169. package/dist/ai.js.map +1 -0
  170. package/dist/app-manifest.d.ts +255 -0
  171. package/dist/app-manifest.d.ts.map +1 -0
  172. package/dist/app-manifest.js +372 -0
  173. package/dist/app-manifest.js.map +1 -0
  174. package/dist/app-users.d.ts +30 -0
  175. package/dist/app-users.d.ts.map +1 -0
  176. package/dist/app-users.js +91 -0
  177. package/dist/app-users.js.map +1 -0
  178. package/dist/audit-archive.d.ts +85 -0
  179. package/dist/audit-archive.d.ts.map +1 -0
  180. package/dist/audit-archive.js +178 -0
  181. package/dist/audit-archive.js.map +1 -0
  182. package/dist/audit.d.ts +54 -0
  183. package/dist/audit.d.ts.map +1 -0
  184. package/dist/audit.js +95 -0
  185. package/dist/audit.js.map +1 -0
  186. package/dist/auth-logger.d.ts +28 -0
  187. package/dist/auth-logger.d.ts.map +1 -0
  188. package/dist/auth-logger.js +53 -0
  189. package/dist/auth-logger.js.map +1 -0
  190. package/dist/auth-password-secret.d.ts +59 -0
  191. package/dist/auth-password-secret.d.ts.map +1 -0
  192. package/dist/auth-password-secret.js +409 -0
  193. package/dist/auth-password-secret.js.map +1 -0
  194. package/dist/auth-schema.d.ts +120 -0
  195. package/dist/auth-schema.d.ts.map +1 -0
  196. package/dist/auth-schema.js +285 -0
  197. package/dist/auth-schema.js.map +1 -0
  198. package/dist/auth.d.ts +321 -0
  199. package/dist/auth.d.ts.map +1 -0
  200. package/dist/auth.js +1562 -0
  201. package/dist/auth.js.map +1 -0
  202. package/dist/backup-archive.d.ts +257 -0
  203. package/dist/backup-archive.d.ts.map +1 -0
  204. package/dist/backup-archive.js +2068 -0
  205. package/dist/backup-archive.js.map +1 -0
  206. package/dist/backup-crypto.d.ts +313 -0
  207. package/dist/backup-crypto.d.ts.map +1 -0
  208. package/dist/backup-crypto.js +693 -0
  209. package/dist/backup-crypto.js.map +1 -0
  210. package/dist/backup-format.d.ts +200 -0
  211. package/dist/backup-format.d.ts.map +1 -0
  212. package/dist/backup-format.js +1247 -0
  213. package/dist/backup-format.js.map +1 -0
  214. package/dist/cli.d.ts +9 -0
  215. package/dist/cli.d.ts.map +1 -0
  216. package/dist/cli.js +15 -0
  217. package/dist/cli.js.map +1 -0
  218. package/dist/clock.d.ts +35 -0
  219. package/dist/clock.d.ts.map +1 -0
  220. package/dist/clock.js +83 -0
  221. package/dist/clock.js.map +1 -0
  222. package/dist/data-client.d.ts +187 -0
  223. package/dist/data-client.d.ts.map +1 -0
  224. package/dist/data-client.js +590 -0
  225. package/dist/data-client.js.map +1 -0
  226. package/dist/data-secrets.d.ts +164 -0
  227. package/dist/data-secrets.d.ts.map +1 -0
  228. package/dist/data-secrets.js +383 -0
  229. package/dist/data-secrets.js.map +1 -0
  230. package/dist/db.d.ts +453 -0
  231. package/dist/db.d.ts.map +1 -0
  232. package/dist/db.js +324 -0
  233. package/dist/db.js.map +1 -0
  234. package/dist/dev-activity.d.ts +48 -0
  235. package/dist/dev-activity.d.ts.map +1 -0
  236. package/dist/dev-activity.js +50 -0
  237. package/dist/dev-activity.js.map +1 -0
  238. package/dist/do.d.ts +429 -0
  239. package/dist/do.d.ts.map +1 -0
  240. package/dist/do.js +4526 -0
  241. package/dist/do.js.map +1 -0
  242. package/dist/email.d.ts +137 -0
  243. package/dist/email.d.ts.map +1 -0
  244. package/dist/email.js +527 -0
  245. package/dist/email.js.map +1 -0
  246. package/dist/generated/admin-assets.d.ts +16 -0
  247. package/dist/generated/admin-assets.d.ts.map +1 -0
  248. package/dist/generated/admin-assets.js +16 -0
  249. package/dist/generated/admin-assets.js.map +1 -0
  250. package/dist/generated/admin-docs-assets.d.ts +3 -0
  251. package/dist/generated/admin-docs-assets.d.ts.map +1 -0
  252. package/dist/generated/admin-docs-assets.js +3 -0
  253. package/dist/generated/admin-docs-assets.js.map +1 -0
  254. package/dist/handoff-consumer.d.ts +79 -0
  255. package/dist/handoff-consumer.d.ts.map +1 -0
  256. package/dist/handoff-consumer.js +300 -0
  257. package/dist/handoff-consumer.js.map +1 -0
  258. package/dist/handoff.d.ts +70 -0
  259. package/dist/handoff.d.ts.map +1 -0
  260. package/dist/handoff.js +228 -0
  261. package/dist/handoff.js.map +1 -0
  262. package/dist/host-auth.d.ts +47 -0
  263. package/dist/host-auth.d.ts.map +1 -0
  264. package/dist/host-auth.js +59 -0
  265. package/dist/host-auth.js.map +1 -0
  266. package/dist/host-user.d.ts +15 -0
  267. package/dist/host-user.d.ts.map +1 -0
  268. package/dist/host-user.js +23 -0
  269. package/dist/host-user.js.map +1 -0
  270. package/dist/html.d.ts +35 -0
  271. package/dist/html.d.ts.map +1 -0
  272. package/dist/html.js +634 -0
  273. package/dist/html.js.map +1 -0
  274. package/dist/http-error.d.ts +13 -0
  275. package/dist/http-error.d.ts.map +1 -0
  276. package/dist/http-error.js +15 -0
  277. package/dist/http-error.js.map +1 -0
  278. package/dist/imports.d.ts +219 -0
  279. package/dist/imports.d.ts.map +1 -0
  280. package/dist/imports.js +571 -0
  281. package/dist/imports.js.map +1 -0
  282. package/dist/index.d.ts +78 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/index.js +76 -0
  285. package/dist/index.js.map +1 -0
  286. package/dist/inference-tape.d.ts +64 -0
  287. package/dist/inference-tape.d.ts.map +1 -0
  288. package/dist/inference-tape.js +278 -0
  289. package/dist/inference-tape.js.map +1 -0
  290. package/dist/internal.d.ts +15 -0
  291. package/dist/internal.d.ts.map +1 -0
  292. package/dist/internal.js +48 -0
  293. package/dist/internal.js.map +1 -0
  294. package/dist/jobs.d.ts +796 -0
  295. package/dist/jobs.d.ts.map +1 -0
  296. package/dist/jobs.js +538 -0
  297. package/dist/jobs.js.map +1 -0
  298. package/dist/json-schema.d.ts +91 -0
  299. package/dist/json-schema.d.ts.map +1 -0
  300. package/dist/json-schema.js +884 -0
  301. package/dist/json-schema.js.map +1 -0
  302. package/dist/knowledge.d.ts +33 -0
  303. package/dist/knowledge.d.ts.map +1 -0
  304. package/dist/knowledge.js +348 -0
  305. package/dist/knowledge.js.map +1 -0
  306. package/dist/local-dev-chrome.d.ts +29 -0
  307. package/dist/local-dev-chrome.d.ts.map +1 -0
  308. package/dist/local-dev-chrome.js +514 -0
  309. package/dist/local-dev-chrome.js.map +1 -0
  310. package/dist/local-dev-personas.d.ts +15 -0
  311. package/dist/local-dev-personas.d.ts.map +1 -0
  312. package/dist/local-dev-personas.js +46 -0
  313. package/dist/local-dev-personas.js.map +1 -0
  314. package/dist/mcp.d.ts +567 -0
  315. package/dist/mcp.d.ts.map +1 -0
  316. package/dist/mcp.js +2480 -0
  317. package/dist/mcp.js.map +1 -0
  318. package/dist/modules.d.ts +145 -0
  319. package/dist/modules.d.ts.map +1 -0
  320. package/dist/modules.js +164 -0
  321. package/dist/modules.js.map +1 -0
  322. package/dist/notification-client.d.ts +94 -0
  323. package/dist/notification-client.d.ts.map +1 -0
  324. package/dist/notification-client.js +127 -0
  325. package/dist/notification-client.js.map +1 -0
  326. package/dist/notifications.d.ts +447 -0
  327. package/dist/notifications.d.ts.map +1 -0
  328. package/dist/notifications.js +1625 -0
  329. package/dist/notifications.js.map +1 -0
  330. package/dist/operator-data-query.d.ts +117 -0
  331. package/dist/operator-data-query.d.ts.map +1 -0
  332. package/dist/operator-data-query.js +431 -0
  333. package/dist/operator-data-query.js.map +1 -0
  334. package/dist/operator-mcp.d.ts +63 -0
  335. package/dist/operator-mcp.d.ts.map +1 -0
  336. package/dist/operator-mcp.js +2828 -0
  337. package/dist/operator-mcp.js.map +1 -0
  338. package/dist/outbound-https.d.ts +24 -0
  339. package/dist/outbound-https.d.ts.map +1 -0
  340. package/dist/outbound-https.js +172 -0
  341. package/dist/outbound-https.js.map +1 -0
  342. package/dist/pitr.d.ts +60 -0
  343. package/dist/pitr.d.ts.map +1 -0
  344. package/dist/pitr.js +94 -0
  345. package/dist/pitr.js.map +1 -0
  346. package/dist/platform.d.ts +199 -0
  347. package/dist/platform.d.ts.map +1 -0
  348. package/dist/platform.js +196 -0
  349. package/dist/platform.js.map +1 -0
  350. package/dist/policies.d.ts +115 -0
  351. package/dist/policies.d.ts.map +1 -0
  352. package/dist/policies.js +158 -0
  353. package/dist/policies.js.map +1 -0
  354. package/dist/principal.d.ts +143 -0
  355. package/dist/principal.d.ts.map +1 -0
  356. package/dist/principal.js +174 -0
  357. package/dist/principal.js.map +1 -0
  358. package/dist/realtime.d.ts +280 -0
  359. package/dist/realtime.d.ts.map +1 -0
  360. package/dist/realtime.js +578 -0
  361. package/dist/realtime.js.map +1 -0
  362. package/dist/retrieval.d.ts +263 -0
  363. package/dist/retrieval.d.ts.map +1 -0
  364. package/dist/retrieval.js +602 -0
  365. package/dist/retrieval.js.map +1 -0
  366. package/dist/runtime-error-client.d.ts +10 -0
  367. package/dist/runtime-error-client.d.ts.map +1 -0
  368. package/dist/runtime-error-client.js +70 -0
  369. package/dist/runtime-error-client.js.map +1 -0
  370. package/dist/runtime-errors.d.ts +180 -0
  371. package/dist/runtime-errors.d.ts.map +1 -0
  372. package/dist/runtime-errors.js +572 -0
  373. package/dist/runtime-errors.js.map +1 -0
  374. package/dist/schema.d.ts +434 -0
  375. package/dist/schema.d.ts.map +1 -0
  376. package/dist/schema.js +232 -0
  377. package/dist/schema.js.map +1 -0
  378. package/dist/search.d.ts +216 -0
  379. package/dist/search.d.ts.map +1 -0
  380. package/dist/search.js +785 -0
  381. package/dist/search.js.map +1 -0
  382. package/dist/settings.d.ts +191 -0
  383. package/dist/settings.d.ts.map +1 -0
  384. package/dist/settings.js +478 -0
  385. package/dist/settings.js.map +1 -0
  386. package/dist/sql.d.ts +7 -0
  387. package/dist/sql.d.ts.map +1 -0
  388. package/dist/sql.js +30 -0
  389. package/dist/sql.js.map +1 -0
  390. package/dist/storage-client.d.ts +69 -0
  391. package/dist/storage-client.d.ts.map +1 -0
  392. package/dist/storage-client.js +469 -0
  393. package/dist/storage-client.js.map +1 -0
  394. package/dist/storage.d.ts +21 -0
  395. package/dist/storage.d.ts.map +1 -0
  396. package/dist/storage.js +82 -0
  397. package/dist/storage.js.map +1 -0
  398. package/dist/subject-domains.d.ts +15 -0
  399. package/dist/subject-domains.d.ts.map +1 -0
  400. package/dist/subject-domains.js +38 -0
  401. package/dist/subject-domains.js.map +1 -0
  402. package/dist/support.d.ts +132 -0
  403. package/dist/support.d.ts.map +1 -0
  404. package/dist/support.js +483 -0
  405. package/dist/support.js.map +1 -0
  406. package/dist/system-tables.d.ts +12 -0
  407. package/dist/system-tables.d.ts.map +1 -0
  408. package/dist/system-tables.js +225 -0
  409. package/dist/system-tables.js.map +1 -0
  410. package/dist/test.d.ts +57 -0
  411. package/dist/test.d.ts.map +1 -0
  412. package/dist/test.js +454 -0
  413. package/dist/test.js.map +1 -0
  414. package/dist/vite.d.ts +82 -0
  415. package/dist/vite.d.ts.map +1 -0
  416. package/dist/vite.js +82 -0
  417. package/dist/vite.js.map +1 -0
  418. package/dist/webpush-crypto.d.ts +39 -0
  419. package/dist/webpush-crypto.d.ts.map +1 -0
  420. package/dist/webpush-crypto.js +213 -0
  421. package/dist/webpush-crypto.js.map +1 -0
  422. package/dist/webpush-private.d.ts +11 -0
  423. package/dist/webpush-private.d.ts.map +1 -0
  424. package/dist/webpush-private.js +11 -0
  425. package/dist/webpush-private.js.map +1 -0
  426. package/dist/webpush.d.ts +86 -0
  427. package/dist/webpush.d.ts.map +1 -0
  428. package/dist/webpush.js +375 -0
  429. package/dist/webpush.js.map +1 -0
  430. package/dist/worker.d.ts +185 -0
  431. package/dist/worker.d.ts.map +1 -0
  432. package/dist/worker.js +13021 -0
  433. package/dist/worker.js.map +1 -0
  434. package/package.json +161 -8
  435. package/README.md +0 -3
@@ -0,0 +1,681 @@
1
+ import { actionAudienceAllows, evaluateActionPolicy } from "./actions.js";
2
+ import { safeAgentToolSegment } from "./agent-skills.js";
3
+ import { sha256Hex, stableJson } from "./internal.js";
4
+ import { validateOutboundHttpsUrl } from "./outbound-https.js";
5
+ import { id, integer, longText, raybaseSystemTable, text } from "./schema.js";
6
+ import { nowIso, randomId } from "./sql.js";
7
+ import { RemoteMcpCredentialStore, remoteMcpCredentialSystemTables, remoteMcpKeyFromEnv } from "./agent-remote-mcp-credentials.js";
8
+ import { RemoteMcpCredentialError } from "./agent-remote-mcp-crypto.js";
9
+ import { refreshRemoteMcpOAuth } from "./agent-remote-mcp-oauth.js";
10
+ import { remoteMcpRequest, RemoteMcpTransportError } from "./agent-remote-mcp-transport.js";
11
+ /** The closed shape a runtime-installed server's secret name must have. */
12
+ export const remoteMcpSecretNamePattern = /^RAYBASE_MCP_[A-Z0-9_]+_TOKEN$/;
13
+ /** The conventional secret name for an installed server, e.g. `weather` → `RAYBASE_MCP_WEATHER_TOKEN`. */
14
+ export function remoteMcpSecretNameFor(serverName) {
15
+ const segment = serverName.toUpperCase().replace(/[^A-Z0-9]+/g, "_").replace(/^_+|_+$/g, "");
16
+ if (!segment)
17
+ throw new Error(`Cannot derive a remote MCP secret name from server name "${serverName}"`);
18
+ return `RAYBASE_MCP_${segment}_TOKEN`;
19
+ }
20
+ export const raybaseRemoteMcpSystemTables = [
21
+ ...remoteMcpCredentialSystemTables,
22
+ raybaseSystemTable("_agent_remote_mcp_events", {
23
+ id: id(),
24
+ agentName: text({ required: true }),
25
+ conversationId: text({ required: true }),
26
+ runId: text({ required: true }),
27
+ requestId: text({ required: true }),
28
+ toolCallId: text({ required: true }),
29
+ principalKind: text({ required: true }),
30
+ userId: text(),
31
+ publicScopeHash: text(),
32
+ organizationId: text(),
33
+ serverName: text({ required: true }),
34
+ remoteToolName: text({ required: true }),
35
+ modelToolName: text({ required: true }),
36
+ endpointHost: text({ required: true }),
37
+ argumentsHash: text({ required: true }),
38
+ argumentsPreviewJson: longText(),
39
+ resultStatus: text({ required: true }),
40
+ resultPreviewJson: longText(),
41
+ httpStatus: integer(),
42
+ latencyMs: integer({ required: true }),
43
+ error: longText(),
44
+ createdAt: text({ required: true })
45
+ }, {
46
+ indexes: [
47
+ ["agentName", "createdAt"],
48
+ ["conversationId", "createdAt"],
49
+ ["serverName", "remoteToolName", "createdAt"],
50
+ ["resultStatus", "createdAt"]
51
+ ]
52
+ }),
53
+ // Runtime-installed servers. `credentialRefJson` holds a *name* and never a
54
+ // value; `toolsJson` holds the descriptors pinned at the operator's
55
+ // discovery; `policyJson` holds the operator's per-tool access rule, which
56
+ // the server never supplies.
57
+ raybaseSystemTable("_agent_remote_mcp_servers", {
58
+ id: id(),
59
+ name: text({ required: true }),
60
+ endpoint: text({ required: true }),
61
+ credentialRefJson: longText({ required: true }),
62
+ // Added after the table first shipped (2026-08-23). Optional on purpose:
63
+ // a system table only auto-adds plain optional columns, and a required
64
+ // one here failed every queue message of an app whose table predates it
65
+ // (Birch, local). Readers treat a missing transport as "stateless", a
66
+ // missing discoveryState as "pinned", a missing serverRevision as 0.
67
+ transport: text(),
68
+ discoveryState: text(),
69
+ oauthMetadataJson: longText(),
70
+ serverRevision: integer(),
71
+ toolsJson: longText({ required: true }),
72
+ policyJson: longText({ required: true }),
73
+ discoveredAt: text({ required: true }),
74
+ discoveryHash: text({ required: true }),
75
+ status: text({ required: true }),
76
+ createdBy: text({ required: true }),
77
+ createdAt: text({ required: true }),
78
+ updatedAt: text({ required: true })
79
+ }, {
80
+ indexes: [
81
+ { columns: ["name"], unique: true },
82
+ ["status", "name"]
83
+ ]
84
+ }),
85
+ raybaseSystemTable("_agent_remote_mcp_bindings", {
86
+ id: id(),
87
+ agentName: text({ required: true }),
88
+ serverName: text({ required: true }),
89
+ toolNamesJson: longText({ required: true }),
90
+ // A binding whose pinned tool disappeared at rediscovery is disabled and
91
+ // kept, never silently dropped: the operator sees why it stopped.
92
+ status: text({ required: true }),
93
+ disabledReason: text(),
94
+ createdBy: text({ required: true }),
95
+ createdAt: text({ required: true })
96
+ }, {
97
+ indexes: [
98
+ { columns: ["agentName", "serverName"], unique: true },
99
+ ["serverName"]
100
+ ]
101
+ })
102
+ ];
103
+ export function defineRemoteMcpServer(definition) {
104
+ validateRemoteMcpServerName(definition.name);
105
+ validateRemoteMcpEndpoint(definition.endpoint);
106
+ validateRemoteMcpCredential(definition.credentials, definition.name);
107
+ if (definition.transport !== undefined && definition.transport !== "stateless" && definition.transport !== "sessioned") {
108
+ throw new Error(`Raybase remote MCP server ${definition.name} transport must be stateless or sessioned`);
109
+ }
110
+ validateRemoteMcpTools(definition.name, definition.tools);
111
+ return {
112
+ name: definition.name,
113
+ endpoint: definition.endpoint,
114
+ ...(definition.transport ? { transport: definition.transport } : {}),
115
+ ...(definition.credentials ? { credentials: definition.credentials } : {}),
116
+ tools: Object.fromEntries(Object.entries(definition.tools).map(([toolName, descriptor]) => [toolName, normalizeRemoteMcpToolDescriptor(definition.name, toolName, descriptor)]))
117
+ };
118
+ }
119
+ export function defineRemoteMcpServers(definitions) {
120
+ const normalized = {};
121
+ const seen = new Set();
122
+ for (const [key, definition] of Object.entries(definitions)) {
123
+ const name = definition.name || key;
124
+ validateRemoteMcpServerName(name);
125
+ if (seen.has(name))
126
+ throw new Error(`Duplicate Raybase remote MCP server name: ${name}`);
127
+ seen.add(name);
128
+ normalized[key] = defineRemoteMcpServer({ ...definition, name });
129
+ }
130
+ return normalized;
131
+ }
132
+ export function validateAgentRemoteMcpBindings(agent) {
133
+ agentRemoteMcpToolBindings(agent);
134
+ }
135
+ export function agentRemoteMcpToolBindings(agent) {
136
+ const entries = agent.remoteMcpServers ?? [];
137
+ if (!Array.isArray(entries))
138
+ throw new Error(`Raybase agent ${agent.name} remoteMcpServers must be an array`);
139
+ const bindings = [];
140
+ const seenModelTools = new Map();
141
+ for (const [index, entry] of entries.entries()) {
142
+ const binding = normalizeAgentRemoteMcpBinding(agent.name, entry, index);
143
+ for (const toolName of binding.tools) {
144
+ const descriptor = binding.server.tools[toolName];
145
+ if (!descriptor) {
146
+ throw new Error(`Raybase agent ${agent.name} remote MCP binding for ${binding.server.name} references undeclared tool ${toolName}`);
147
+ }
148
+ const modelToolName = remoteMcpModelToolName(binding.server.name, toolName);
149
+ const existing = seenModelTools.get(modelToolName);
150
+ if (existing) {
151
+ throw new Error(`Raybase agent ${agent.name} has duplicate remote MCP runtime tool name "${modelToolName}" from ${existing} and ${binding.server.name}/${toolName}`);
152
+ }
153
+ seenModelTools.set(modelToolName, `${binding.server.name}/${toolName}`);
154
+ bindings.push({ server: binding.server, toolName, descriptor, modelToolName });
155
+ }
156
+ }
157
+ return bindings;
158
+ }
159
+ /**
160
+ * Model-facing tools for one set of bindings. Callers pass the code-declared
161
+ * set by default; the runtime-installed resolver passes the installed set so
162
+ * both sources produce byte-identical tool shapes.
163
+ */
164
+ export function agentRemoteMcpRuntimeTools(input, bindings = agentRemoteMcpToolBindings(input.agent)) {
165
+ const audience = input.principal.kind === "public" ? "public" : "signed-in";
166
+ return bindings
167
+ .filter((binding) => remoteMcpAudienceAllowsForTool(binding.descriptor, audience, input.principal))
168
+ .map((binding) => ({
169
+ name: binding.modelToolName,
170
+ displayName: `${binding.server.name}/${binding.toolName}`,
171
+ description: binding.descriptor.description,
172
+ parameters: binding.descriptor.inputSchema,
173
+ dataChange: remoteMcpDataChangeDescriptor(binding),
174
+ run: (args, toolCallId) => runRemoteMcpRuntimeTool({
175
+ input,
176
+ binding,
177
+ args,
178
+ toolCallId
179
+ })
180
+ }));
181
+ }
182
+ export function remoteMcpServerSummaries(servers) {
183
+ const byName = new Map();
184
+ for (const server of servers)
185
+ byName.set(server.name, server);
186
+ return [...byName.values()]
187
+ .map((server) => ({
188
+ name: server.name,
189
+ endpointHost: remoteMcpEndpointHost(server.endpoint),
190
+ toolNames: Object.keys(server.tools).sort((left, right) => left.localeCompare(right)),
191
+ credentialRefs: credentialRefs(server.credentials)
192
+ }))
193
+ .sort((left, right) => left.name.localeCompare(right.name));
194
+ }
195
+ export function agentRemoteMcpBindingSummaries(agents) {
196
+ return agents.flatMap((agent) => {
197
+ const grouped = new Map();
198
+ for (const binding of agentRemoteMcpToolBindings(agent)) {
199
+ grouped.set(binding.server.name, [...(grouped.get(binding.server.name) ?? []), binding]);
200
+ }
201
+ return [...grouped.entries()].map(([serverName, bindings]) => ({
202
+ agentName: agent.name,
203
+ serverName,
204
+ toolNames: bindings.map((binding) => binding.toolName).sort((left, right) => left.localeCompare(right)),
205
+ modelToolNames: bindings.map((binding) => binding.modelToolName).sort((left, right) => left.localeCompare(right))
206
+ }));
207
+ });
208
+ }
209
+ export function remoteMcpModelToolName(serverName, toolName) {
210
+ return `${safeAgentToolSegment(serverName)}__${safeAgentToolSegment(toolName)}`;
211
+ }
212
+ export function validateRemoteMcpEndpoint(endpoint) {
213
+ try {
214
+ validateOutboundHttpsUrl(endpoint);
215
+ }
216
+ catch (error) {
217
+ const message = error instanceof Error ? error.message : String(error);
218
+ throw new Error(message.replace(/^Outbound URL/, "Remote MCP endpoint"));
219
+ }
220
+ }
221
+ export async function callRemoteMcpTool(input) {
222
+ const timeoutMs = boundedRemoteTimeout(input.descriptor.timeoutMs);
223
+ const maxResultBytes = boundedRemoteResultBytes(input.descriptor.maxResultBytes);
224
+ const controller = new AbortController();
225
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
226
+ const abort = () => controller.abort();
227
+ input.signal?.addEventListener("abort", abort, { once: true });
228
+ try {
229
+ const stored = input.server.credentials?.type === "stored";
230
+ const store = stored
231
+ ? new RemoteMcpCredentialStore(requiredControl(input.control), remoteMcpKeyFromEnv(input.env))
232
+ : null;
233
+ const authorization = async () => {
234
+ if (store) {
235
+ const resolved = await store.resolveAuthorization(input.server.name);
236
+ return { header: resolved.header.reveal(), generation: resolved.generation, revision: resolved.revision };
237
+ }
238
+ return { header: resolveRemoteMcpCredential(input.server.credentials, input.env), generation: 0 };
239
+ };
240
+ let payload;
241
+ let authRecovery = 0;
242
+ const recoveryBudget = { sessionRecoveries: 0 };
243
+ for (;;) {
244
+ try {
245
+ if (store) {
246
+ const oauth = await store.readOAuth(input.server.name);
247
+ if (oauth?.status.state === "ready" && oauth.status.expiresAt && Date.parse(oauth.status.expiresAt) <= Date.now() + 30_000) {
248
+ let refreshed;
249
+ try {
250
+ refreshed = await refreshRemoteMcpOAuth({
251
+ control: requiredControl(input.control), key: remoteMcpKeyFromEnv(input.env), serverName: input.server.name,
252
+ expectedRevision: oauth.status.revision, fetcher: input.fetcher, signal: controller.signal
253
+ });
254
+ }
255
+ catch (error) {
256
+ if (error instanceof RemoteMcpCredentialError) {
257
+ const current = await store.status(input.server.name);
258
+ if (current?.revision !== oauth.status.revision)
259
+ continue;
260
+ }
261
+ throw error;
262
+ }
263
+ if (refreshed.state !== "ready") {
264
+ input.sessionCoordinator?.evict(input.server.name);
265
+ throw new RemoteMcpRuntimeError("Remote MCP credential needs reconnection", "denied", 401);
266
+ }
267
+ }
268
+ }
269
+ payload = await remoteMcpRequest({
270
+ serverName: input.server.name,
271
+ endpoint: input.server.endpoint,
272
+ transport: input.server.transport,
273
+ method: "tools/call",
274
+ params: { name: input.toolName, arguments: input.args ?? {} },
275
+ authorization,
276
+ coordinator: input.sessionCoordinator,
277
+ fetcher: input.fetcher,
278
+ signal: controller.signal,
279
+ timeoutMs,
280
+ maxBytes: Math.min(2_000_000, Math.max(maxResultBytes * 4, maxResultBytes + 64_000)),
281
+ recoveryBudget
282
+ });
283
+ break;
284
+ }
285
+ catch (error) {
286
+ if (store && error instanceof RemoteMcpTransportError && error.httpStatus === 401 && authRecovery === 0) {
287
+ const oauth = await store.readOAuth(input.server.name);
288
+ if (!oauth || oauth.status.kind !== "oauth")
289
+ throw new RemoteMcpRuntimeError("Remote MCP credential was rejected", "denied", 401);
290
+ const failedRevision = error.authorization?.revision;
291
+ if (failedRevision !== undefined && oauth.status.revision !== failedRevision) {
292
+ throw new RemoteMcpRuntimeError("Remote MCP credential changed while the request was in flight; retry the call", "denied", 401);
293
+ }
294
+ authRecovery += 1;
295
+ const refreshed = await refreshRemoteMcpOAuth({
296
+ control: requiredControl(input.control), key: remoteMcpKeyFromEnv(input.env), serverName: input.server.name,
297
+ expectedRevision: failedRevision, fetcher: input.fetcher, signal: controller.signal
298
+ });
299
+ if (refreshed.state !== "ready") {
300
+ input.sessionCoordinator?.evict(input.server.name);
301
+ throw new RemoteMcpRuntimeError("Remote MCP credential needs reconnection", "denied", 401);
302
+ }
303
+ continue;
304
+ }
305
+ if (store && error instanceof RemoteMcpTransportError && error.httpStatus === 401 && authRecovery > 0) {
306
+ const failedRevision = error.authorization?.revision;
307
+ try {
308
+ await store.markReauthRequired(input.server.name, "runtime", failedRevision);
309
+ }
310
+ catch (transitionError) {
311
+ const current = await store.status(input.server.name);
312
+ if (failedRevision !== undefined && current?.revision !== failedRevision) {
313
+ throw new RemoteMcpRuntimeError("Remote MCP credential changed while the request was in flight; retry the call", "denied", 401);
314
+ }
315
+ throw transitionError;
316
+ }
317
+ input.sessionCoordinator?.evict(input.server.name);
318
+ throw new RemoteMcpRuntimeError("Remote MCP credential needs reconnection", "denied", 401);
319
+ }
320
+ if (error instanceof RemoteMcpTransportError)
321
+ throw new RemoteMcpRuntimeError(error.message, error.httpStatus === 401 ? "denied" : "error", error.httpStatus);
322
+ throw error;
323
+ }
324
+ }
325
+ const bounded = boundRemoteResult(payload, maxResultBytes, input.descriptor.redactionKeys);
326
+ return {
327
+ ok: true,
328
+ server: input.server.name,
329
+ tool: input.toolName,
330
+ result: bounded.value,
331
+ truncated: bounded.truncated
332
+ };
333
+ }
334
+ catch (error) {
335
+ if (error instanceof RemoteMcpRuntimeError)
336
+ throw error;
337
+ if (error instanceof RemoteMcpCredentialError)
338
+ throw new RemoteMcpRuntimeError(error.message, "denied");
339
+ if (controller.signal.aborted)
340
+ throw new RemoteMcpRuntimeError("Remote MCP tool timed out", "timeout");
341
+ throw new RemoteMcpRuntimeError("Remote MCP tool call failed", "error");
342
+ }
343
+ finally {
344
+ clearTimeout(timeout);
345
+ input.signal?.removeEventListener("abort", abort);
346
+ }
347
+ }
348
+ function requiredControl(control) {
349
+ if (!control)
350
+ throw new RemoteMcpRuntimeError("Remote MCP stored credentials require the control database", "denied");
351
+ return control;
352
+ }
353
+ export async function recordAgentRemoteMcpEvent(control, event) {
354
+ if (!control)
355
+ return;
356
+ try {
357
+ await control.run(`INSERT INTO "_agent_remote_mcp_events" (
358
+ "id", "agentName", "conversationId", "runId", "requestId", "toolCallId",
359
+ "principalKind", "userId", "publicScopeHash", "organizationId",
360
+ "serverName", "remoteToolName", "modelToolName", "endpointHost",
361
+ "argumentsHash", "argumentsPreviewJson", "resultStatus", "resultPreviewJson",
362
+ "httpStatus", "latencyMs", "error", "createdAt"
363
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
364
+ randomId("remote_mcp_event"),
365
+ event.agentName,
366
+ event.conversationId,
367
+ event.runId,
368
+ event.requestId,
369
+ event.toolCallId,
370
+ event.principal.kind,
371
+ event.principal.kind === "user" ? event.principal.user.id : null,
372
+ event.principal.kind === "public" ? event.principal.id : null,
373
+ event.organizationId ?? null,
374
+ event.serverName,
375
+ event.remoteToolName,
376
+ event.modelToolName,
377
+ remoteMcpEndpointHost(event.endpoint),
378
+ await sha256Hex(stableJson(redactRemoteMcpValue(event.arguments))),
379
+ previewJson(event.arguments),
380
+ event.resultStatus,
381
+ event.result === undefined ? null : previewJson(event.result),
382
+ event.httpStatus ?? null,
383
+ Math.max(0, Math.floor(event.latencyMs)),
384
+ event.error ?? null,
385
+ nowIso()
386
+ ]);
387
+ }
388
+ catch {
389
+ // Remote MCP audit must not make the Agent turn fail if a newly deployed
390
+ // Durable Object has not applied the manifest table yet.
391
+ }
392
+ }
393
+ export class RemoteMcpRuntimeError extends Error {
394
+ status;
395
+ httpStatus;
396
+ remoteError;
397
+ constructor(message, status, httpStatus, remoteError) {
398
+ super(message);
399
+ this.status = status;
400
+ this.httpStatus = httpStatus;
401
+ this.remoteError = remoteError;
402
+ this.name = "RemoteMcpRuntimeError";
403
+ }
404
+ }
405
+ async function runRemoteMcpRuntimeTool(input) {
406
+ const { descriptor, server, toolName, modelToolName } = input.binding;
407
+ const started = Date.now();
408
+ try {
409
+ assertRemoteMcpPolicyAllows(descriptor, input.input.principal);
410
+ const result = await callRemoteMcpTool({
411
+ server,
412
+ toolName,
413
+ descriptor,
414
+ args: input.args,
415
+ env: input.input.env,
416
+ control: input.input.control,
417
+ sessionCoordinator: input.input.remoteMcpSessions,
418
+ signal: input.input.abortSignal
419
+ });
420
+ await recordAgentRemoteMcpEvent(input.input.control, {
421
+ agentName: input.input.agent.name,
422
+ conversationId: input.input.conversationId,
423
+ runId: input.input.runId,
424
+ requestId: input.input.requestId,
425
+ toolCallId: input.toolCallId,
426
+ principal: input.input.principal,
427
+ organizationId: input.input.organizationId ?? null,
428
+ serverName: server.name,
429
+ remoteToolName: toolName,
430
+ modelToolName,
431
+ endpoint: server.endpoint,
432
+ arguments: input.args,
433
+ resultStatus: "ok",
434
+ result,
435
+ latencyMs: Date.now() - started
436
+ });
437
+ return result;
438
+ }
439
+ catch (error) {
440
+ const remoteError = error instanceof RemoteMcpRuntimeError ? error : new RemoteMcpRuntimeError("Remote MCP tool call failed", "error");
441
+ await recordAgentRemoteMcpEvent(input.input.control, {
442
+ agentName: input.input.agent.name,
443
+ conversationId: input.input.conversationId,
444
+ runId: input.input.runId,
445
+ requestId: input.input.requestId,
446
+ toolCallId: input.toolCallId,
447
+ principal: input.input.principal,
448
+ organizationId: input.input.organizationId ?? null,
449
+ serverName: server.name,
450
+ remoteToolName: toolName,
451
+ modelToolName,
452
+ endpoint: server.endpoint,
453
+ arguments: input.args,
454
+ resultStatus: remoteError.status,
455
+ httpStatus: remoteError.httpStatus ?? null,
456
+ latencyMs: Date.now() - started,
457
+ error: remoteError.message
458
+ });
459
+ throw remoteError;
460
+ }
461
+ }
462
+ function assertRemoteMcpPolicyAllows(descriptor, principal) {
463
+ if (principal.kind !== "user")
464
+ return;
465
+ if (!descriptor.policy || !evaluateActionPolicy(descriptor.policy, principal.user)) {
466
+ throw new RemoteMcpRuntimeError("Remote MCP tool denied by policy", "denied");
467
+ }
468
+ }
469
+ function remoteMcpAudienceAllowsForTool(descriptor, audience, principal) {
470
+ if (!actionAudienceAllows(descriptor.audience, audience))
471
+ return false;
472
+ if (principal.kind === "user")
473
+ return descriptor.policy ? evaluateActionPolicy(descriptor.policy, principal.user) : false;
474
+ return descriptor.audience === "public" || (Array.isArray(descriptor.audience) && descriptor.audience.includes("public"));
475
+ }
476
+ function remoteMcpDataChangeDescriptor(binding) {
477
+ if (binding.descriptor.annotations?.readOnlyHint === true)
478
+ return null;
479
+ return {
480
+ actionName: `remoteMcp:${binding.server.name}/${binding.toolName}`,
481
+ effects: []
482
+ };
483
+ }
484
+ function normalizeAgentRemoteMcpBinding(agentName, entry, index) {
485
+ if (!entry || typeof entry !== "object")
486
+ throw new Error(`Raybase agent ${agentName} remote MCP binding at index ${index} must be an object`);
487
+ const maybeBinding = entry;
488
+ const server = "server" in maybeBinding ? maybeBinding.server : entry;
489
+ if (!server || typeof server !== "object" || typeof server.name !== "string") {
490
+ throw new Error(`Raybase agent ${agentName} remote MCP binding at index ${index} requires a server`);
491
+ }
492
+ if (server.credentials?.type === "stored")
493
+ throw new Error("Stored remote MCP credentials are internal to runtime-installed servers");
494
+ const normalizedServer = defineRemoteMcpServer(server);
495
+ const tools = "server" in maybeBinding ? maybeBinding.tools : Object.keys(normalizedServer.tools);
496
+ if (!Array.isArray(tools) || tools.length === 0) {
497
+ throw new Error(`Raybase agent ${agentName} remote MCP binding for ${normalizedServer.name} must allow at least one tool`);
498
+ }
499
+ const uniqueTools = Array.from(new Set(tools));
500
+ if (uniqueTools.length !== tools.length)
501
+ throw new Error(`Raybase agent ${agentName} remote MCP binding for ${normalizedServer.name} declares duplicate tools`);
502
+ for (const toolName of uniqueTools) {
503
+ validateRemoteMcpToolName(toolName, normalizedServer.name);
504
+ if (!normalizedServer.tools[toolName]) {
505
+ throw new Error(`Raybase agent ${agentName} remote MCP binding for ${normalizedServer.name} references undeclared tool ${toolName}`);
506
+ }
507
+ }
508
+ return { server: normalizedServer, tools: uniqueTools };
509
+ }
510
+ function validateRemoteMcpTools(serverName, tools) {
511
+ if (!tools || typeof tools !== "object" || Array.isArray(tools) || Object.keys(tools).length === 0) {
512
+ throw new Error(`Raybase remote MCP server ${serverName} must declare at least one tool`);
513
+ }
514
+ const seen = new Set();
515
+ for (const [toolName, descriptor] of Object.entries(tools)) {
516
+ validateRemoteMcpToolName(toolName, serverName);
517
+ const modelToolName = remoteMcpModelToolName(serverName, toolName);
518
+ if (seen.has(modelToolName))
519
+ throw new Error(`Raybase remote MCP server ${serverName} has duplicate runtime tool name "${modelToolName}"`);
520
+ seen.add(modelToolName);
521
+ normalizeRemoteMcpToolDescriptor(serverName, toolName, descriptor);
522
+ }
523
+ }
524
+ function normalizeRemoteMcpToolDescriptor(serverName, toolName, descriptor) {
525
+ if (!descriptor || typeof descriptor !== "object" || Array.isArray(descriptor)) {
526
+ throw new Error(`Raybase remote MCP server ${serverName} tool ${toolName} must be an object`);
527
+ }
528
+ if (typeof descriptor.description !== "string" || !descriptor.description.trim()) {
529
+ throw new Error(`Raybase remote MCP server ${serverName} tool ${toolName} requires a description`);
530
+ }
531
+ if (!descriptor.inputSchema || typeof descriptor.inputSchema !== "object" || Array.isArray(descriptor.inputSchema)) {
532
+ throw new Error(`Raybase remote MCP server ${serverName} tool ${toolName} requires an inputSchema`);
533
+ }
534
+ if (descriptor.timeoutMs !== undefined && (!Number.isFinite(descriptor.timeoutMs) || descriptor.timeoutMs <= 0)) {
535
+ throw new Error(`Raybase remote MCP server ${serverName} tool ${toolName} timeoutMs must be positive`);
536
+ }
537
+ if (descriptor.maxResultBytes !== undefined && (!Number.isFinite(descriptor.maxResultBytes) || descriptor.maxResultBytes <= 0)) {
538
+ throw new Error(`Raybase remote MCP server ${serverName} tool ${toolName} maxResultBytes must be positive`);
539
+ }
540
+ const audience = descriptor.audience ?? "signed-in";
541
+ const audiences = Array.isArray(audience) ? audience : [audience];
542
+ if (audiences.includes("signed-in") && !descriptor.policy) {
543
+ throw new Error(`Raybase remote MCP server ${serverName} tool ${toolName} requires a policy for signed-in Agent use`);
544
+ }
545
+ if (audiences.includes("public") && descriptor.annotations?.readOnlyHint !== true) {
546
+ throw new Error(`Raybase remote MCP server ${serverName} tool ${toolName} must be explicitly read-only for public Agent use`);
547
+ }
548
+ return {
549
+ ...descriptor,
550
+ description: descriptor.description.trim(),
551
+ timeoutMs: descriptor.timeoutMs === undefined ? undefined : Math.floor(descriptor.timeoutMs),
552
+ maxResultBytes: descriptor.maxResultBytes === undefined ? undefined : Math.floor(descriptor.maxResultBytes)
553
+ };
554
+ }
555
+ function validateRemoteMcpServerName(name) {
556
+ if (!/^[A-Za-z][A-Za-z0-9_.:-]{0,127}$/.test(name)) {
557
+ throw new Error(`Invalid Raybase remote MCP server name "${name}". Use letters, numbers, "_", "-", ".", or ":".`);
558
+ }
559
+ }
560
+ export function validateRemoteMcpToolName(name, serverName) {
561
+ if (!/^[A-Za-z][A-Za-z0-9_.:-]{0,127}$/.test(name)) {
562
+ throw new Error(`Invalid Raybase remote MCP tool name "${name}" on server ${serverName}. Use letters, numbers, "_", "-", ".", or ":".`);
563
+ }
564
+ }
565
+ function validateRemoteMcpCredential(credential, serverName) {
566
+ if (credential === undefined)
567
+ return;
568
+ if (!credential || typeof credential !== "object" || Array.isArray(credential)) {
569
+ throw new Error(`Raybase remote MCP server ${serverName} credentials must be an object`);
570
+ }
571
+ if (credential.type === "env") {
572
+ if (!validEnvVarName(credential.envVar))
573
+ throw new Error(`Raybase remote MCP server ${serverName} credential envVar must be an uppercase env var name`);
574
+ if (credential.scheme !== undefined && credential.scheme !== "bearer" && credential.scheme !== "raw") {
575
+ throw new Error(`Raybase remote MCP server ${serverName} credential scheme must be bearer or raw`);
576
+ }
577
+ return;
578
+ }
579
+ if (credential.type === "secret") {
580
+ if (typeof credential.name !== "string" || !remoteMcpSecretNamePattern.test(credential.name)) {
581
+ throw new Error(`Raybase remote MCP server ${serverName} credential name must match RAYBASE_MCP_<NAME>_TOKEN`);
582
+ }
583
+ if (credential.scheme !== undefined && credential.scheme !== "bearer" && credential.scheme !== "raw") {
584
+ throw new Error(`Raybase remote MCP server ${serverName} credential scheme must be bearer or raw`);
585
+ }
586
+ return;
587
+ }
588
+ if (credential.type === "none")
589
+ return;
590
+ if (credential.type === "oauth") {
591
+ throw new Error(`Raybase remote MCP server ${serverName} uses oauth credentials, which are not implemented in Core v1`);
592
+ }
593
+ throw new Error(`Raybase remote MCP server ${serverName} has unsupported credential type`);
594
+ }
595
+ export function resolveRemoteMcpCredential(credential, env) {
596
+ if (!credential || credential.type === "none")
597
+ return undefined;
598
+ if (credential.type === "secret") {
599
+ // Re-check the closed name space at resolve time: a row edited outside the
600
+ // install path must never be able to read an arbitrary app binding.
601
+ if (!remoteMcpSecretNamePattern.test(credential.name)) {
602
+ throw new RemoteMcpRuntimeError("Remote MCP credential name is outside the RAYBASE_MCP_<NAME>_TOKEN name space", "error");
603
+ }
604
+ return authorizationHeader(credential.name, credential.scheme, env);
605
+ }
606
+ if (credential.type !== "env")
607
+ throw new RemoteMcpRuntimeError("Remote MCP credential type is not implemented in Core", "error");
608
+ return authorizationHeader(credential.envVar, credential.scheme, env);
609
+ }
610
+ function authorizationHeader(name, scheme, env) {
611
+ const value = env && typeof env === "object" ? env[name] : undefined;
612
+ if (typeof value !== "string" || !value.trim()) {
613
+ throw new RemoteMcpRuntimeError(`Remote MCP credential env var ${name} is not configured`, "error");
614
+ }
615
+ return scheme === "raw" ? value.trim() : `Bearer ${value.trim()}`;
616
+ }
617
+ function credentialRefs(credential) {
618
+ if (!credential)
619
+ return [];
620
+ if (credential.type === "env")
621
+ return [credential.envVar];
622
+ if (credential.type === "secret")
623
+ return [credential.name];
624
+ if (credential.type === "stored")
625
+ return ["stored"];
626
+ return [];
627
+ }
628
+ function validEnvVarName(value) {
629
+ return /^[A-Z][A-Z0-9_]{1,127}$/.test(value);
630
+ }
631
+ function remoteMcpEndpointHost(endpoint) {
632
+ try {
633
+ return new URL(endpoint).hostname.toLowerCase();
634
+ }
635
+ catch {
636
+ return "";
637
+ }
638
+ }
639
+ function boundedRemoteTimeout(timeoutMs) {
640
+ return Math.min(Math.max(Math.floor(timeoutMs ?? 5_000), 100), 30_000);
641
+ }
642
+ function boundedRemoteResultBytes(maxResultBytes) {
643
+ return Math.min(Math.max(Math.floor(maxResultBytes ?? 16_000), 1_000), 128_000);
644
+ }
645
+ function boundRemoteResult(value, maxBytes, extraRedactionKeys) {
646
+ const redacted = redactRemoteMcpValue(value, extraRedactionKeys);
647
+ const json = JSON.stringify(redacted);
648
+ if (new TextEncoder().encode(json).byteLength <= maxBytes)
649
+ return { value: redacted, truncated: false };
650
+ return {
651
+ value: {
652
+ truncated: true,
653
+ preview: json.slice(0, maxBytes)
654
+ },
655
+ truncated: true
656
+ };
657
+ }
658
+ function previewJson(value) {
659
+ const redacted = redactRemoteMcpValue(value);
660
+ const json = stableJson(redacted);
661
+ return json.length > 2_048 ? `${json.slice(0, 2_048)}...` : json;
662
+ }
663
+ function redactRemoteMcpValue(value, extraKeys = []) {
664
+ if (Array.isArray(value))
665
+ return value.map((item) => redactRemoteMcpValue(item, extraKeys));
666
+ if (!value || typeof value !== "object")
667
+ return value;
668
+ return Object.fromEntries(Object.entries(value).map(([key, item]) => [
669
+ key,
670
+ isRemoteMcpSensitiveKey(key, extraKeys) ? "[redacted]" : redactRemoteMcpValue(item, extraKeys)
671
+ ]));
672
+ }
673
+ function isRemoteMcpSensitiveKey(key, extraKeys) {
674
+ const normalized = key.toLowerCase().replace(/[^a-z0-9]/g, "");
675
+ const builtIn = new Set([
676
+ "authorization", "proxyauthorization", "cookie", "setcookie", "token", "accesstoken", "refreshtoken", "idtoken",
677
+ "secret", "clientsecret", "password", "apikey", "codeverifier", "authorizationcode"
678
+ ]);
679
+ return builtIn.has(normalized) || extraKeys.some((candidate) => candidate.toLowerCase().replace(/[^a-z0-9]/g, "") === normalized);
680
+ }
681
+ //# sourceMappingURL=agent-remote-mcp.js.map