@opengeni/api-router 0.30.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/dist/access-grant-rls.d.ts +3 -0
  2. package/dist/admission-trace.d.ts +8 -0
  3. package/dist/api-websocket.d.ts +18 -0
  4. package/dist/app.d.ts +50 -2
  5. package/dist/app.js +12 -1
  6. package/dist/artifact-catalog-cursor.d.ts +27 -0
  7. package/dist/auth/managed-auth-attempt-context.d.ts +10 -0
  8. package/dist/auth/managed-auth-rate-limits.d.ts +167 -0
  9. package/dist/auth/managed-auth-session-adapter.d.ts +6 -0
  10. package/dist/auth/managed-auth.d.ts +102 -3
  11. package/dist/auth/managed-email.d.ts +29 -0
  12. package/dist/auth/managed-sign-in-notifications.d.ts +4 -0
  13. package/dist/auth/new-signups-gate.d.ts +23 -0
  14. package/dist/auth/organization-user-setup.d.ts +80 -0
  15. package/dist/auth/signup-funnel-metrics.d.ts +44 -0
  16. package/dist/browser-controller-authority.d.ts +1 -61
  17. package/dist/browser-ephemeral.d.ts +5 -0
  18. package/dist/browser-state-authority.d.ts +1 -27
  19. package/dist/chunk-6TZ5LG3O.js +123948 -0
  20. package/dist/chunk-6TZ5LG3O.js.map +1 -0
  21. package/dist/chunk-OGQDXVXY.js +18 -0
  22. package/dist/chunk-OGQDXVXY.js.map +1 -0
  23. package/dist/claude-subscription-account-conflicts.d.ts +1 -0
  24. package/dist/claude-subscription-account-usage.d.ts +39 -0
  25. package/dist/claude-subscription-oauth.d.ts +25 -0
  26. package/dist/claude-subscription-profile.d.ts +9 -0
  27. package/dist/claude-subscription-usage.d.ts +44 -0
  28. package/dist/claude-workspace-connection.d.ts +15 -0
  29. package/dist/codemode.d.ts +32 -1
  30. package/dist/company-brain-okf.d.ts +24 -0
  31. package/dist/connected-machine-computer-access.d.ts +11 -0
  32. package/dist/connection-ownership.d.ts +54 -0
  33. package/dist/controller-data-plane.d.ts +32 -0
  34. package/dist/editable-artifact-office-import.d.ts +7 -4
  35. package/dist/editable-artifact-source-session.d.ts +3 -0
  36. package/dist/editable-artifact-websocket.d.ts +10 -18
  37. package/dist/editable-artifact-workspace-files.d.ts +1 -1
  38. package/dist/fatal-process-boundary.d.ts +25 -0
  39. package/dist/github-access.d.ts +31 -2
  40. package/dist/http/acting-person.d.ts +24 -0
  41. package/dist/http/api-contract-compat.d.ts +19 -0
  42. package/dist/http/api-error.d.ts +27 -1
  43. package/dist/http/cors.d.ts +17 -0
  44. package/dist/http/deprecation.d.ts +42 -0
  45. package/dist/http/interaction-control-error.d.ts +13 -0
  46. package/dist/http/keyed-admission.d.ts +12 -0
  47. package/dist/http/local-browser-boundary.d.ts +72 -0
  48. package/dist/http/metrics-listener.d.ts +22 -0
  49. package/dist/http/path-identifier.d.ts +17 -0
  50. package/dist/http/registered-route-label.d.ts +16 -0
  51. package/dist/http/request-body.d.ts +27 -0
  52. package/dist/http/request-source.d.ts +52 -0
  53. package/dist/http/sse.d.ts +17 -6
  54. package/dist/http/unmatched-route.d.ts +18 -0
  55. package/dist/http/user-content.d.ts +36 -0
  56. package/dist/http/websocket-upgrade-dispatch.d.ts +18 -0
  57. package/dist/index.d.ts +10 -3
  58. package/dist/index.js +1129 -166
  59. package/dist/index.js.map +1 -1
  60. package/dist/integration-endpoint-test.d.ts +20 -0
  61. package/dist/integrations/api-integrations.d.ts +2 -2
  62. package/dist/integrations/atlassian.d.ts +29 -3
  63. package/dist/integrations/connect-authority.d.ts +1 -0
  64. package/dist/integrations/connect-callback-return.d.ts +6 -0
  65. package/dist/integrations/fiken.d.ts +16 -2
  66. package/dist/integrations/github-app-connect.d.ts +47 -0
  67. package/dist/integrations/github-installation-proof.d.ts +3 -0
  68. package/dist/integrations/github-lens-connect.d.ts +116 -0
  69. package/dist/integrations/github-skill-source.d.ts +1 -5
  70. package/dist/integrations/google-drive.d.ts +25 -0
  71. package/dist/integrations/integration-commit-authority.d.ts +13 -0
  72. package/dist/integrations/marketplace-plugin.d.ts +2691 -0
  73. package/dist/integrations/oauth-client.d.ts +178 -18
  74. package/dist/integrations/oauth-profiles.d.ts +222 -0
  75. package/dist/integrations/oauth-return-path.d.ts +1 -0
  76. package/dist/integrations/personal-github-repositories.d.ts +84 -0
  77. package/dist/integrations/personal-github.d.ts +42 -0
  78. package/dist/integrations/pr-review-provider.d.ts +22 -0
  79. package/dist/integrations/provider-oauth.d.ts +19 -1
  80. package/dist/integrations/slack-app-home.d.ts +24 -0
  81. package/dist/integrations/slack-bot.d.ts +367 -12
  82. package/dist/integrations/slack-file-upload-flow.d.ts +62 -0
  83. package/dist/integrations/slack-install.d.ts +20 -0
  84. package/dist/integrations/slack-interactions.d.ts +113 -10
  85. package/dist/integrations/slack-mrkdwn.d.ts +41 -0
  86. package/dist/integrations/slack-routing.d.ts +120 -0
  87. package/dist/integrations/slack-session-defaults.d.ts +58 -0
  88. package/dist/integrations/slack-task-file-upload.d.ts +36 -0
  89. package/dist/integrations/social-oauth.d.ts +7 -0
  90. package/dist/interaction-agent-access.d.ts +15 -0
  91. package/dist/interaction-frame-proxy.d.ts +68 -0
  92. package/dist/interaction-metrics.d.ts +2 -0
  93. package/dist/mcp/action-catalog-types.d.ts +9 -0
  94. package/dist/mcp/action-catalog.gen.d.ts +2 -0
  95. package/dist/mcp/capability-account-readiness.d.ts +7 -0
  96. package/dist/mcp/child-read-evidence.d.ts +9 -0
  97. package/dist/mcp/command-read.d.ts +24 -0
  98. package/dist/mcp/company-profile-agent-admin.d.ts +44 -0
  99. package/dist/mcp/contract-input.d.ts +11 -0
  100. package/dist/mcp/documents.d.ts +7 -5
  101. package/dist/mcp/files.d.ts +2 -2
  102. package/dist/mcp/first-party-tool-permissions.d.ts +650 -0
  103. package/dist/mcp/knowledge-entries.d.ts +5 -0
  104. package/dist/mcp/orchestration-failure-diagnostic.d.ts +43 -0
  105. package/dist/mcp/receipts.d.ts +9 -0
  106. package/dist/mcp/request-abort.d.ts +19 -0
  107. package/dist/mcp/scheduled-task-input.d.ts +1189 -0
  108. package/dist/mcp/scheduled-task-view.d.ts +22 -4
  109. package/dist/mcp/server.d.ts +255 -3
  110. package/dist/mcp/session-event-view.d.ts +94 -0
  111. package/dist/mcp/session-view.d.ts +66 -2
  112. package/dist/mcp/session-wait.d.ts +174 -0
  113. package/dist/mcp-oauth.d.ts +52 -0
  114. package/dist/model-catalog.d.ts +11 -31
  115. package/dist/observability.d.ts +3 -1
  116. package/dist/organization-mcp.d.ts +52 -0
  117. package/dist/organization-recovery-notifications.d.ts +41 -0
  118. package/dist/routes/analytics-consent.d.ts +26 -0
  119. package/dist/routes/api-integrations.d.ts +25 -0
  120. package/dist/routes/api-keys.d.ts +17 -0
  121. package/dist/routes/artifact-catalog.d.ts +6 -0
  122. package/dist/routes/automations.d.ts +19 -0
  123. package/dist/routes/billing.d.ts +49 -0
  124. package/dist/routes/browser-sessions.d.ts +71 -3
  125. package/dist/routes/claude-subscription-accounts.d.ts +3 -0
  126. package/dist/routes/claude-subscription-oauth.d.ts +3 -0
  127. package/dist/routes/client-errors.d.ts +146 -0
  128. package/dist/routes/codex.d.ts +76 -2
  129. package/dist/routes/company-brain.d.ts +3 -0
  130. package/dist/routes/company-profile.d.ts +2 -1
  131. package/dist/routes/computer-sessions.d.ts +14 -0
  132. package/dist/routes/connect.d.ts +5 -0
  133. package/dist/routes/editable-artifacts.d.ts +2 -0
  134. package/dist/routes/external-identity-links.d.ts +6 -0
  135. package/dist/routes/feedback.d.ts +3 -0
  136. package/dist/routes/files.d.ts +4 -0
  137. package/dist/routes/github-browser-pages.d.ts +12 -0
  138. package/dist/routes/github.d.ts +2 -0
  139. package/dist/routes/insights-response-cache.d.ts +10 -0
  140. package/dist/routes/insights-usage.d.ts +12 -0
  141. package/dist/routes/insights.d.ts +30 -1
  142. package/dist/routes/knowledge.d.ts +3 -0
  143. package/dist/routes/managed-auth-session-sets.d.ts +26 -0
  144. package/dist/routes/managed-onboarding.d.ts +29 -0
  145. package/dist/routes/managed-sign-in-methods.d.ts +6 -0
  146. package/dist/routes/model-connection-access.d.ts +3 -0
  147. package/dist/routes/organization-integration-policy.d.ts +3 -0
  148. package/dist/routes/organization-integrations.d.ts +6 -0
  149. package/dist/routes/organization-mcp-connections.d.ts +3 -0
  150. package/dist/routes/organization-model-providers.d.ts +3 -0
  151. package/dist/routes/organization-recovery.d.ts +19 -0
  152. package/dist/routes/organization-service-accounts.d.ts +3 -0
  153. package/dist/routes/organization-sessions.d.ts +26 -0
  154. package/dist/routes/personal-github-git-broker.d.ts +29 -0
  155. package/dist/routes/personal-github.d.ts +3 -0
  156. package/dist/routes/pr-review-github.d.ts +3 -0
  157. package/dist/routes/pr-review.d.ts +3 -0
  158. package/dist/routes/session-artifact-associations.d.ts +4 -0
  159. package/dist/routes/session-history-imports.d.ts +9 -0
  160. package/dist/routes/sessions.d.ts +44 -6
  161. package/dist/routes/skill-content.d.ts +4 -0
  162. package/dist/routes/skill-install-authority.d.ts +6 -0
  163. package/dist/routes/subscription-account-pools.d.ts +34 -0
  164. package/dist/routes/subscription-pool-access.d.ts +16 -0
  165. package/dist/routes/supergrok.d.ts +6 -1
  166. package/dist/routes/usage-allowances.d.ts +12 -0
  167. package/dist/routes/user-resource-authorities.d.ts +3 -0
  168. package/dist/routes/workspace-artifacts.d.ts +2 -1
  169. package/dist/routes/workspace-capture.d.ts +10 -2
  170. package/dist/routes/workspace-integrations.d.ts +35 -0
  171. package/dist/routes/workspace-learning.d.ts +3 -0
  172. package/dist/routes/workspace-model-providers.d.ts +4 -0
  173. package/dist/routes/workspaces.d.ts +29 -0
  174. package/dist/sandbox/auth-callout.d.ts +8 -0
  175. package/dist/sandbox/channel-a.d.ts +19 -1
  176. package/dist/sandbox/connection-authority.d.ts +3 -0
  177. package/dist/sandbox/enrollment.d.ts +9 -1
  178. package/dist/sandbox/machines.d.ts +5 -2
  179. package/dist/sandbox/metrics-ingestion.d.ts +28 -20
  180. package/dist/sandbox/rematerialize.d.ts +2 -0
  181. package/dist/sandbox/session-attach-variable-sets.d.ts +30 -0
  182. package/dist/sandbox/viewer.d.ts +26 -1
  183. package/dist/sandbox-file-artifacts.d.ts +50 -0
  184. package/dist/scheduled-task-deletion.d.ts +13 -0
  185. package/dist/session-create-observability.d.ts +5 -0
  186. package/dist/session-event-view-MPS2OZD3.js +292 -0
  187. package/dist/session-event-view-MPS2OZD3.js.map +1 -0
  188. package/dist/site-session-origin.d.ts +13 -0
  189. package/dist/site-uploads.d.ts +41 -0
  190. package/dist/slack-reaction-files.d.ts +1 -1
  191. package/dist/temporal-schedule-cleanup.d.ts +1 -0
  192. package/dist/temporal-schedule-sync.d.ts +26 -0
  193. package/dist/transcription/providers/xai-subscription.d.ts +1 -0
  194. package/dist/transcription/service.d.ts +2 -1
  195. package/dist/work-discovery-observability.d.ts +33 -0
  196. package/dist/workspace-artifact-content.d.ts +28 -0
  197. package/dist/workspace-artifact-provenance.d.ts +7 -0
  198. package/dist/workspace-delete-observability.d.ts +10 -0
  199. package/dist/workspace-deletion.d.ts +6 -0
  200. package/dist/workspace-state-projection.d.ts +3 -5
  201. package/dist/workspace-tool-gateway-observability.d.ts +17 -0
  202. package/dist/workspace-tool-gateway.d.ts +123 -0
  203. package/dist/workspace-webhook-dispatch.d.ts +26 -0
  204. package/package.json +23 -19
  205. package/src/access-grant-rls.ts +75 -0
  206. package/src/admission-trace.ts +14 -0
  207. package/src/api-websocket.ts +23 -0
  208. package/src/app.ts +1974 -256
  209. package/src/artifact-catalog-cursor.ts +60 -0
  210. package/src/auth/managed-auth-attempt-context.ts +70 -0
  211. package/src/auth/managed-auth-rate-limits.ts +252 -0
  212. package/src/auth/managed-auth-session-adapter.ts +222 -0
  213. package/src/auth/managed-auth.ts +536 -60
  214. package/src/auth/managed-email.ts +174 -0
  215. package/src/auth/managed-sign-in-notifications.ts +81 -0
  216. package/src/auth/new-signups-gate.ts +49 -0
  217. package/src/auth/organization-user-setup.ts +307 -0
  218. package/src/auth/signup-funnel-metrics.ts +164 -0
  219. package/src/browser-controller-authority.ts +1 -186
  220. package/src/browser-ephemeral.ts +39 -0
  221. package/src/browser-state-authority.ts +1 -236
  222. package/src/claude-subscription-account-conflicts.ts +12 -0
  223. package/src/claude-subscription-account-usage.ts +48 -0
  224. package/src/claude-subscription-oauth.ts +362 -0
  225. package/src/claude-subscription-profile.ts +73 -0
  226. package/src/claude-subscription-usage.ts +97 -0
  227. package/src/claude-workspace-connection.ts +82 -0
  228. package/src/codemode.ts +194 -30
  229. package/src/codex-realtime.ts +8 -2
  230. package/src/company-brain-okf.ts +340 -0
  231. package/src/connected-machine-computer-access.ts +33 -0
  232. package/src/connection-ownership.ts +199 -0
  233. package/src/controller-data-plane.ts +81 -0
  234. package/src/editable-artifact-native-kernel.ts +26 -15
  235. package/src/editable-artifact-office-import.ts +77 -9
  236. package/src/editable-artifact-production.ts +23 -7
  237. package/src/editable-artifact-source-session.ts +123 -0
  238. package/src/editable-artifact-websocket.ts +27 -21
  239. package/src/editable-artifact-workspace-files.ts +31 -6
  240. package/src/fatal-process-boundary.ts +246 -0
  241. package/src/gateway-realtime.ts +1 -1
  242. package/src/github-access.ts +147 -5
  243. package/src/http/acting-person.ts +71 -0
  244. package/src/http/api-contract-compat.ts +49 -0
  245. package/src/http/api-error.ts +115 -1
  246. package/src/http/auth.ts +48 -0
  247. package/src/http/cors.ts +67 -0
  248. package/src/http/deprecation.ts +118 -0
  249. package/src/http/interaction-control-error.ts +164 -0
  250. package/src/http/keyed-admission.ts +29 -0
  251. package/src/http/local-browser-boundary.ts +343 -0
  252. package/src/http/metrics-listener.ts +57 -0
  253. package/src/http/path-identifier.ts +54 -0
  254. package/src/http/registered-route-label.ts +34 -0
  255. package/src/http/request-body.ts +127 -0
  256. package/src/http/request-source.ts +178 -0
  257. package/src/http/sse.ts +486 -132
  258. package/src/http/unmatched-route.ts +60 -0
  259. package/src/http/user-content.ts +158 -0
  260. package/src/http/websocket-upgrade-dispatch.ts +29 -0
  261. package/src/index.ts +157 -52
  262. package/src/integration-endpoint-test.ts +291 -0
  263. package/src/integrations/api-integrations.ts +98 -11
  264. package/src/integrations/atlassian.ts +474 -136
  265. package/src/integrations/connect-authority.ts +2 -0
  266. package/src/integrations/connect-callback-return.ts +86 -0
  267. package/src/integrations/fiken.ts +354 -64
  268. package/src/integrations/github-app-connect.ts +435 -0
  269. package/src/integrations/github-installation-proof.ts +60 -0
  270. package/src/integrations/github-lens-connect.ts +76 -0
  271. package/src/integrations/github-skill-source.ts +2 -142
  272. package/src/integrations/google-drive.ts +820 -222
  273. package/src/integrations/integration-commit-authority.ts +69 -0
  274. package/src/integrations/marketplace-plugin.ts +48 -0
  275. package/src/integrations/oauth-client.ts +1356 -459
  276. package/src/integrations/oauth-profiles.ts +537 -0
  277. package/src/integrations/oauth-return-path.ts +18 -0
  278. package/src/integrations/personal-github-repositories.ts +674 -0
  279. package/src/integrations/personal-github.ts +825 -0
  280. package/src/integrations/pr-review-provider.ts +246 -0
  281. package/src/integrations/provider-oauth.ts +250 -22
  282. package/src/integrations/slack-app-home.ts +300 -0
  283. package/src/integrations/slack-bot.ts +963 -239
  284. package/src/integrations/slack-file-upload-flow.ts +147 -0
  285. package/src/integrations/slack-install.ts +83 -0
  286. package/src/integrations/slack-interactions.ts +3170 -474
  287. package/src/integrations/slack-mrkdwn.ts +193 -0
  288. package/src/integrations/slack-routing.ts +337 -0
  289. package/src/integrations/slack-session-defaults.ts +224 -0
  290. package/src/integrations/slack-task-file-upload.ts +323 -0
  291. package/src/integrations/social-oauth.ts +213 -15
  292. package/src/interaction-agent-access.ts +48 -0
  293. package/src/interaction-frame-proxy.ts +409 -0
  294. package/src/interaction-metrics.ts +30 -0
  295. package/src/mcp/action-catalog-types.ts +9 -0
  296. package/src/mcp/action-catalog.gen.ts +6696 -0
  297. package/src/mcp/capability-account-readiness.ts +17 -0
  298. package/src/mcp/child-read-evidence.ts +19 -0
  299. package/src/mcp/command-read.ts +109 -0
  300. package/src/mcp/company-profile-agent-admin.ts +198 -0
  301. package/src/mcp/contract-input.ts +141 -0
  302. package/src/mcp/documents.ts +65 -377
  303. package/src/mcp/editable-artifacts.ts +12 -6
  304. package/src/mcp/files.ts +80 -38
  305. package/src/mcp/first-party-tool-permissions.ts +305 -0
  306. package/src/mcp/knowledge-entries.ts +322 -0
  307. package/src/mcp/orchestration-failure-diagnostic.ts +43 -0
  308. package/src/mcp/receipts.ts +34 -0
  309. package/src/mcp/request-abort.ts +44 -0
  310. package/src/mcp/scheduled-task-input.ts +76 -0
  311. package/src/mcp/scheduled-task-view.ts +44 -3
  312. package/src/mcp/server.ts +3030 -1267
  313. package/src/mcp/session-event-view.ts +383 -0
  314. package/src/mcp/session-view.ts +84 -3
  315. package/src/mcp/session-wait.ts +665 -0
  316. package/src/mcp-oauth.ts +1123 -0
  317. package/src/model-catalog.ts +91 -333
  318. package/src/observability.ts +15 -1
  319. package/src/organization-mcp.ts +397 -0
  320. package/src/organization-recovery-notifications.ts +103 -0
  321. package/src/routes/analytics-consent.ts +123 -0
  322. package/src/routes/api-integrations.ts +364 -74
  323. package/src/routes/api-keys.ts +336 -10
  324. package/src/routes/artifact-catalog.ts +279 -0
  325. package/src/routes/automations.ts +768 -0
  326. package/src/routes/billing.ts +461 -46
  327. package/src/routes/browser-sessions.ts +839 -131
  328. package/src/routes/canonical-human-identities.ts +90 -14
  329. package/src/routes/capabilities.ts +107 -6
  330. package/src/routes/channels.ts +20 -3
  331. package/src/routes/claude-subscription-accounts.ts +334 -0
  332. package/src/routes/claude-subscription-oauth.ts +142 -0
  333. package/src/routes/client-errors.ts +362 -0
  334. package/src/routes/codex.ts +833 -116
  335. package/src/routes/company-brain.ts +322 -0
  336. package/src/routes/company-profile.ts +65 -1
  337. package/src/routes/computer-sessions.ts +557 -106
  338. package/src/routes/connect.ts +1938 -0
  339. package/src/routes/connections.ts +1040 -349
  340. package/src/routes/documents.ts +488 -287
  341. package/src/routes/editable-artifacts.ts +79 -9
  342. package/src/routes/enrollments.ts +135 -39
  343. package/src/routes/environments.ts +154 -58
  344. package/src/routes/external-identity-links.ts +201 -0
  345. package/src/routes/feedback.ts +113 -0
  346. package/src/routes/files.ts +337 -39
  347. package/src/routes/github-browser-pages.ts +162 -0
  348. package/src/routes/github.ts +446 -144
  349. package/src/routes/insights-response-cache.ts +83 -0
  350. package/src/routes/insights-usage.ts +345 -0
  351. package/src/routes/insights.ts +153 -19
  352. package/src/routes/install.ts +133 -38
  353. package/src/routes/integration-facets.ts +107 -33
  354. package/src/routes/interaction-resources.ts +30 -3
  355. package/src/routes/knowledge.ts +488 -0
  356. package/src/routes/machines.ts +313 -15
  357. package/src/routes/managed-auth-session-sets.ts +1218 -0
  358. package/src/routes/managed-onboarding.ts +337 -0
  359. package/src/routes/managed-sign-in-methods.ts +433 -0
  360. package/src/routes/memory-slack-publications.ts +3 -2
  361. package/src/routes/model-connection-access.ts +208 -0
  362. package/src/routes/organization-integration-policy.ts +116 -0
  363. package/src/routes/organization-integrations.ts +326 -0
  364. package/src/routes/organization-mcp-connections.ts +178 -0
  365. package/src/routes/organization-memberships.ts +1019 -27
  366. package/src/routes/organization-model-providers.ts +293 -0
  367. package/src/routes/organization-recovery.ts +325 -0
  368. package/src/routes/organization-service-accounts.ts +128 -0
  369. package/src/routes/organization-sessions.ts +350 -0
  370. package/src/routes/personal-github-git-broker.ts +785 -0
  371. package/src/routes/personal-github.ts +370 -0
  372. package/src/routes/plugins.ts +251 -22
  373. package/src/routes/pr-review-github.ts +881 -0
  374. package/src/routes/pr-review.ts +622 -0
  375. package/src/routes/preference-registry.ts +12 -93
  376. package/src/routes/rigs.ts +167 -50
  377. package/src/routes/scheduled-tasks.ts +346 -41
  378. package/src/routes/session-artifact-associations.ts +87 -0
  379. package/src/routes/session-history-imports.ts +280 -0
  380. package/src/routes/sessions.ts +2306 -264
  381. package/src/routes/skill-content.ts +297 -0
  382. package/src/routes/skill-install-authority.ts +64 -0
  383. package/src/routes/skills.ts +62 -9
  384. package/src/routes/social.ts +46 -18
  385. package/src/routes/subscription-account-pools.ts +436 -0
  386. package/src/routes/subscription-pool-access.ts +126 -0
  387. package/src/routes/supergrok.ts +219 -303
  388. package/src/routes/transcription-recordings.ts +38 -3
  389. package/src/routes/transcriptions.ts +4 -0
  390. package/src/routes/usage-allowances.ts +378 -0
  391. package/src/routes/user-resource-authorities.ts +138 -0
  392. package/src/routes/video-generation.ts +14 -10
  393. package/src/routes/workspace-artifacts.ts +275 -69
  394. package/src/routes/workspace-capture.ts +21 -0
  395. package/src/routes/workspace-integrations.ts +576 -0
  396. package/src/routes/workspace-learning.ts +159 -0
  397. package/src/routes/workspace-model-providers.ts +148 -0
  398. package/src/routes/workspace-state.ts +38 -25
  399. package/src/routes/workspaces.ts +1004 -127
  400. package/src/sandbox/auth-callout.ts +96 -19
  401. package/src/sandbox/channel-a.ts +323 -24
  402. package/src/sandbox/connection-authority.ts +3 -0
  403. package/src/sandbox/enrollment.ts +81 -6
  404. package/src/sandbox/machines.ts +218 -76
  405. package/src/sandbox/metrics-ingestion.ts +411 -62
  406. package/src/sandbox/rematerialize.ts +121 -19
  407. package/src/sandbox/session-attach-variable-sets.ts +131 -0
  408. package/src/sandbox/viewer.ts +280 -25
  409. package/src/sandbox-file-artifacts.ts +413 -0
  410. package/src/scheduled-task-deletion.ts +138 -0
  411. package/src/session-create-observability.ts +46 -0
  412. package/src/session-realtime-context.ts +6 -3
  413. package/src/site-session-origin.ts +48 -0
  414. package/src/site-uploads.ts +224 -0
  415. package/src/slack-reaction-files.ts +16 -5
  416. package/src/temporal-schedule-cleanup.ts +13 -0
  417. package/src/temporal-schedule-sync.ts +74 -0
  418. package/src/transcription/providers/codex-subscription.ts +2 -0
  419. package/src/transcription/providers/openai.ts +1 -0
  420. package/src/transcription/providers/xai-subscription.ts +49 -3
  421. package/src/transcription/segmenter.ts +8 -2
  422. package/src/transcription/service.ts +43 -6
  423. package/src/work-discovery-observability.ts +121 -0
  424. package/src/workspace-artifact-content.ts +144 -0
  425. package/src/workspace-artifact-provenance.ts +104 -0
  426. package/src/workspace-delete-observability.ts +75 -0
  427. package/src/workspace-deletion.ts +73 -0
  428. package/src/workspace-state-projection.ts +18 -148
  429. package/src/workspace-tool-gateway-observability.ts +100 -0
  430. package/src/workspace-tool-gateway.ts +870 -0
  431. package/src/workspace-webhook-dispatch.ts +190 -0
  432. package/src/xai-subscription-auth.ts +9 -2
  433. package/dist/chunk-2PQMSRCB.js +0 -49759
  434. package/dist/chunk-2PQMSRCB.js.map +0 -1
  435. package/dist/routes/packs.d.ts +0 -3
  436. package/src/routes/packs.ts +0 -729
@@ -1,433 +1,121 @@
1
+ import { searchKnowledgeEntries } from "@opengeni/core";
2
+ import type { Settings } from "@opengeni/config";
3
+ import { KnowledgeEntryListRequest } from "@opengeni/contracts";
4
+ import type { DocumentServices } from "@opengeni/documents";
1
5
  import {
2
- KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS,
3
- KnowledgeBrowseResponse,
4
- KnowledgeGetResponse,
5
- KnowledgeRecordId,
6
- KnowledgeSearchResponse,
7
- ListIndexedDocumentsResponse,
8
- } from "@opengeni/contracts";
9
- import {
10
- browseEffectiveKnowledge,
11
- getEffectiveKnowledgeRecord,
12
- getDocumentChunk,
13
- listDocumentBases,
14
- listEffectiveIndexedDocuments,
15
- searchEffectiveKnowledge,
16
- searchEffectiveDocuments,
17
- type DocumentAccessFilter,
18
- type DocumentServices,
19
- } from "@opengeni/documents";
20
- import { createKnowledgeMemory, listKnowledgeMemories, type Database } from "@opengeni/db";
6
+ getKnowledgeEntry,
7
+ listKnowledgeEntries,
8
+ type KnowledgeContext,
9
+ type Database,
10
+ } from "@opengeni/db";
21
11
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
12
  import * as z from "zod/v4";
23
- import { mcpMutationReceipt } from "./receipts";
24
-
25
- const SearchInputSchema = {
26
- query: z.string().min(1),
27
- baseIds: z.array(z.string().uuid()).optional(),
28
- limit: z.number().int().positive().max(50).optional(),
29
- mode: z.enum(["hybrid", "vector", "keyword"]).optional(),
30
- sourceKinds: z
31
- .array(
32
- z.enum([
33
- "manual_upload",
34
- "meeting_transcript",
35
- "repository",
36
- "email",
37
- "chat",
38
- "document",
39
- "web",
40
- "other",
41
- ]),
42
- )
43
- .optional(),
44
- aclTags: z.array(z.string().min(1)).optional(),
45
- };
46
-
47
- const MemoryKindSchema = z.enum(["semantic", "episodic", "procedural", "decision", "preference"]);
48
- const SourceRefSchema = z.object({
49
- kind: z.enum(["document_chunk", "document", "session_event", "memory", "external"]),
50
- id: z.string().min(1),
51
- uri: z.string().min(1).optional(),
52
- title: z.string().min(1).optional(),
53
- metadata: z.record(z.string(), z.unknown()).optional(),
54
- });
55
13
 
14
+ /** The docs endpoint is a transport for canonical Knowledge retrieval. Legacy
15
+ * chunk/base retrieval is retired: it cannot bypass pending Knowledge review. */
56
16
  export function buildDocumentsMcpServer(
57
17
  db: Database,
58
18
  accountId: string,
59
19
  workspaceId: string,
60
20
  documentServices: DocumentServices,
61
- options: {
62
- createdBySessionId?: string | undefined;
63
- /** Immutable human subject whose agent is making this retrieval request. */
64
- initiatingSubjectId: string;
65
- },
21
+ options: { knowledge: KnowledgeContext; settings?: Settings },
66
22
  ): McpServer {
67
- const server = new McpServer({
68
- name: "opengeni-documents",
69
- version: "1.0.0",
70
- });
71
- // This server is the agent retrieval surface. Agent-disabled documents are
72
- // never reachable. Workspace-visible documents are shared; private
73
- // documents are available only to the creating subject's agent.
74
- const agentAccess: DocumentAccessFilter = {
75
- agentOnly: true,
76
- viewerSubjectId: options.initiatingSubjectId,
77
- };
78
-
79
- server.registerTool(
80
- "list_document_bases",
81
- {
82
- description: "List document bases available for retrieval.",
83
- inputSchema: {},
84
- },
85
- async () => ({
86
- content: [{ type: "text", text: JSON.stringify(await listDocumentBases(db, workspaceId)) }],
87
- }),
88
- );
89
-
90
- server.registerTool(
91
- "search_documents",
92
- {
93
- description: "Search indexed documents with hybrid, vector, or keyword retrieval.",
94
- inputSchema: SearchInputSchema,
95
- },
96
- async (input) =>
97
- searchContent(
98
- db,
99
- accountId,
100
- workspaceId,
101
- documentServices,
102
- input,
103
- options.initiatingSubjectId,
104
- ),
105
- );
106
-
23
+ const context = options.knowledge;
24
+ if (context.accountId !== accountId || context.workspaceId !== workspaceId)
25
+ throw new Error("Knowledge gateway authority mismatch");
26
+ const server = new McpServer({ name: "opengeni-knowledge", version: "2.0.0" });
107
27
  server.registerTool(
108
28
  "knowledge_search",
109
29
  {
110
30
  description:
111
- "Search the effective authorized organization, current-workspace, and immutable initiating-user personal document scope. Authorization is applied before ranking and every result retains source and authority provenance.",
112
- inputSchema: SearchInputSchema,
113
- },
114
- async (input) =>
115
- searchKnowledge(
116
- db,
117
- accountId,
118
- workspaceId,
119
- documentServices,
120
- input,
121
- options.initiatingSubjectId,
122
- ),
123
- );
124
-
125
- server.registerTool(
126
- "knowledge_get",
127
- {
128
- description:
129
- "Fetch one stable Knowledge record by the id returned from knowledge_search or knowledge_browse. Authorization and agent access are rechecked before content or links are returned.",
130
- inputSchema: { id: KnowledgeRecordId },
131
- },
132
- async ({ id }) => {
133
- const record = await getEffectiveKnowledgeRecord(db, {
134
- accountId,
135
- workspaceId,
136
- initiatingSubjectId: options.initiatingSubjectId,
137
- id,
138
- });
139
- return {
140
- content: [
141
- {
142
- type: "text",
143
- text: record
144
- ? JSON.stringify(KnowledgeGetResponse.parse({ record }))
145
- : `knowledge record not found: ${id}`,
146
- },
147
- ],
148
- isError: !record,
149
- };
150
- },
151
- );
152
-
153
- server.registerTool(
154
- "knowledge_browse",
155
- {
156
- description:
157
- "Browse authorized Knowledge without crawling folders. Omit parentId to list source documents; pass a document record id to inspect its chunks. Opaque cursors are bound to this user, workspace, parent, and filters.",
158
- inputSchema: {
159
- parentId: KnowledgeRecordId.optional(),
160
- topic: z.string().min(1).max(256).optional(),
161
- sourceKinds: SearchInputSchema.sourceKinds,
162
- cursor: z.string().min(1).max(KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS).optional(),
163
- limit: z.number().int().positive().max(50).optional(),
164
- },
165
- },
166
- async ({ parentId, topic, sourceKinds, cursor, limit }) => ({
31
+ "Search published structured Knowledge and retained source text in the current authorized scope. Use a concise subject or entity name first (for example Acme); omit scope to search all authorized scopes. If a query returns no entries, retry the key name alone in the same scope or browse groups before concluding the information is absent.",
32
+ inputSchema: KnowledgeEntryListRequest.omit({
33
+ view: true,
34
+ sessionId: true,
35
+ reviewBatchId: true,
36
+ }).shape,
37
+ },
38
+ async (input) => ({
167
39
  content: [
168
40
  {
169
41
  type: "text",
170
42
  text: JSON.stringify(
171
- KnowledgeBrowseResponse.parse(
172
- await browseEffectiveKnowledge(db, {
173
- accountId,
174
- workspaceId,
175
- initiatingSubjectId: options.initiatingSubjectId,
176
- ...(parentId ? { parentId } : {}),
177
- ...(topic ? { topic } : {}),
178
- ...(sourceKinds ? { sourceKinds } : {}),
179
- ...(cursor ? { cursor } : {}),
180
- ...(limit ? { limit } : {}),
181
- }),
43
+ await searchKnowledgeEntries(
44
+ db,
45
+ context,
46
+ input,
47
+ () => documentServices.embedder,
48
+ options.settings,
182
49
  ),
183
50
  ),
184
51
  },
185
52
  ],
186
53
  }),
187
54
  );
188
-
189
55
  server.registerTool(
190
- "list_indexed_documents",
191
- {
192
- description:
193
- "List agent-authorized documents that became ready after an opaque checkpoint, ordered by durable indexing completion. Results include source and authority/ingestion provenance. Persist nextCheckpoint only after successfully processing the returned page, then pass it on the next scheduled run to avoid repeats.",
194
- inputSchema: {
195
- checkpoint: z.string().min(1).max(1_024).optional(),
196
- limit: z.number().int().positive().max(100).optional(),
197
- },
198
- },
199
- async ({ checkpoint, limit }) => ({
200
- content: [
201
- {
202
- type: "text",
203
- text: JSON.stringify(
204
- ListIndexedDocumentsResponse.parse(
205
- await listEffectiveIndexedDocuments(db, {
206
- accountId,
207
- workspaceId,
208
- initiatingSubjectId: options.initiatingSubjectId,
209
- ...(checkpoint ? { checkpoint } : {}),
210
- ...(limit ? { limit } : {}),
211
- }),
212
- ),
213
- ),
214
- },
215
- ],
216
- }),
217
- );
218
-
219
- server.registerTool(
220
- "fetch_document_chunk",
221
- {
222
- description: "Fetch one indexed document chunk by id.",
223
- inputSchema: {
224
- chunkId: z.string().uuid(),
225
- },
226
- },
227
- async ({ chunkId }) => {
228
- const found = await getDocumentChunk(db, accountId, workspaceId, chunkId, agentAccess);
229
- return {
230
- content: [
231
- { type: "text", text: found ? JSON.stringify(found) : `chunk not found: ${chunkId}` },
232
- ],
233
- isError: !found,
234
- };
235
- },
236
- );
237
-
238
- server.registerTool(
239
- "knowledge_fetch",
240
- {
241
- description: "Fetch one knowledge source chunk by id.",
242
- inputSchema: {
243
- chunkId: z.string().uuid(),
244
- },
245
- },
246
- async ({ chunkId }) => {
247
- const found = await getDocumentChunk(db, accountId, workspaceId, chunkId, agentAccess);
248
- return {
249
- content: [
250
- { type: "text", text: found ? JSON.stringify(found) : `chunk not found: ${chunkId}` },
251
- ],
252
- isError: !found,
253
- };
254
- },
255
- );
256
-
257
- server.registerTool(
258
- "memory_search",
56
+ "knowledge_browse",
259
57
  {
260
- description: "Search approved company memory records.",
58
+ description: "Browse Knowledge groups or entries in one group, across sources.",
261
59
  inputSchema: {
262
- query: z.string().min(1).optional(),
263
- kind: MemoryKindSchema.optional(),
264
- scope: z.string().min(1).optional(),
265
- limit: z.number().int().positive().max(100).optional(),
60
+ groupId: z.uuid().optional(),
61
+ cursor: z.string().optional(),
62
+ limit: z.number().int().positive().max(50).optional(),
266
63
  },
267
64
  },
268
- async ({ query, kind, scope, limit }) => ({
65
+ async (input) => ({
269
66
  content: [
270
67
  {
271
68
  type: "text",
272
69
  text: JSON.stringify(
273
- await listKnowledgeMemories(db, workspaceId, {
274
- ...(query ? { query } : {}),
275
- status: ["active", "approved"],
276
- ...(kind ? { kind } : {}),
277
- ...(scope ? { scope } : {}),
278
- ...(limit ? { limit } : {}),
70
+ await listKnowledgeEntries(db, context, {
71
+ ...input,
72
+ ...(input.groupId ? {} : { kind: "group" }),
279
73
  }),
280
74
  ),
281
75
  },
282
76
  ],
283
77
  }),
284
78
  );
285
-
286
79
  server.registerTool(
287
- "memory_propose",
80
+ "knowledge_get",
288
81
  {
289
- description: "Propose a company memory record for human review.",
82
+ description:
83
+ "Read an exact published Knowledge revision and its evidence. Long source text is paginated.",
290
84
  inputSchema: {
291
- text: z.string().min(1),
292
- kind: MemoryKindSchema.optional(),
293
- scope: z.string().min(1).optional(),
294
- sourceRefs: z.array(SourceRefSchema).optional(),
295
- confidence: z.number().min(0).max(1).optional(),
296
- metadata: z.record(z.string(), z.unknown()).optional(),
85
+ entryId: z.uuid(),
86
+ revisionId: z.uuid().optional(),
87
+ offset: z.number().int().nonnegative().default(0),
88
+ maxChars: z.number().int().positive().max(16000).default(8000),
297
89
  },
298
90
  },
299
- async ({ text, kind, scope, sourceRefs, confidence, metadata }) => {
300
- const memory = await createKnowledgeMemory(db, {
301
- accountId,
302
- workspaceId,
303
- status: "proposed",
304
- kind: kind ?? "semantic",
305
- scope: scope ?? "workspace",
306
- text,
307
- sourceRefs:
308
- sourceRefs?.map((sourceRef) => ({
309
- ...sourceRef,
310
- metadata: sourceRef.metadata ?? {},
311
- })) ?? [],
312
- confidence: confidence ?? 0.5,
313
- metadata: metadata ?? {},
314
- createdBySessionId: options.createdBySessionId,
91
+ async (input) => {
92
+ const record = await getKnowledgeEntry(db, context, input.entryId, {
93
+ revisionId: input.revisionId,
315
94
  });
95
+ if (!record) return { content: [{ type: "text", text: JSON.stringify({ found: false }) }] };
96
+ const text = record.revision.entry.content;
97
+ const end = Math.min(text.length, input.offset + input.maxChars);
316
98
  return {
317
99
  content: [
318
100
  {
319
101
  type: "text",
320
- text: JSON.stringify(
321
- mcpMutationReceipt({
322
- operation: "memory_propose",
323
- committed: true,
324
- outcome: "created",
325
- changed: true,
326
- resource: {
327
- type: "knowledge_memory",
328
- id: memory.id,
329
- state: memory.status,
330
- },
331
- timestamp: memory.updatedAt,
332
- idempotency: { status: "not_supported" },
333
- nextAction: { tool: "memory_search", arguments: {} },
334
- }),
335
- ),
102
+ text: JSON.stringify({
103
+ ...record,
104
+ revision: {
105
+ ...record.revision,
106
+ entry: { ...record.revision.entry, content: text.slice(input.offset, end) },
107
+ },
108
+ contentRange: {
109
+ start: input.offset,
110
+ end,
111
+ total: text.length,
112
+ nextOffset: end < text.length ? end : null,
113
+ },
114
+ }),
336
115
  },
337
116
  ],
338
117
  };
339
118
  },
340
119
  );
341
-
342
120
  return server;
343
121
  }
344
-
345
- async function searchContent(
346
- db: Database,
347
- accountId: string,
348
- workspaceId: string,
349
- documentServices: DocumentServices,
350
- input: {
351
- query: string;
352
- baseIds?: string[] | undefined;
353
- limit?: number | undefined;
354
- mode?: "hybrid" | "vector" | "keyword" | undefined;
355
- sourceKinds?:
356
- | Array<
357
- | "manual_upload"
358
- | "meeting_transcript"
359
- | "repository"
360
- | "email"
361
- | "chat"
362
- | "document"
363
- | "web"
364
- | "other"
365
- >
366
- | undefined;
367
- aclTags?: string[] | undefined;
368
- },
369
- initiatingSubjectId: string,
370
- ) {
371
- const results = await searchEffectiveDocuments(
372
- db,
373
- {
374
- accountId,
375
- workspaceId,
376
- query: input.query,
377
- ...(input.baseIds ? { baseIds: input.baseIds } : {}),
378
- ...(input.limit ? { limit: input.limit } : {}),
379
- ...(input.mode ? { mode: input.mode } : {}),
380
- ...(input.sourceKinds ? { sourceKinds: input.sourceKinds } : {}),
381
- ...(input.aclTags ? { aclTags: input.aclTags } : {}),
382
- initiatingSubjectId,
383
- surface: "agent",
384
- },
385
- documentServices,
386
- );
387
- return {
388
- content: [
389
- {
390
- type: "text" as const,
391
- text: JSON.stringify(results),
392
- },
393
- ],
394
- };
395
- }
396
-
397
- async function searchKnowledge(
398
- db: Database,
399
- accountId: string,
400
- workspaceId: string,
401
- documentServices: DocumentServices,
402
- input: {
403
- query: string;
404
- baseIds?: string[] | undefined;
405
- limit?: number | undefined;
406
- mode?: "hybrid" | "vector" | "keyword" | undefined;
407
- sourceKinds?: Parameters<typeof searchContent>[4]["sourceKinds"];
408
- aclTags?: string[] | undefined;
409
- },
410
- initiatingSubjectId: string,
411
- ) {
412
- const response = await searchEffectiveKnowledge(
413
- db,
414
- {
415
- accountId,
416
- workspaceId,
417
- query: input.query,
418
- ...(input.baseIds ? { baseIds: input.baseIds } : {}),
419
- ...(input.limit ? { limit: input.limit } : {}),
420
- ...(input.mode ? { mode: input.mode } : {}),
421
- ...(input.sourceKinds ? { sourceKinds: input.sourceKinds } : {}),
422
- ...(input.aclTags ? { aclTags: input.aclTags } : {}),
423
- initiatingSubjectId,
424
- surface: "agent",
425
- },
426
- documentServices,
427
- );
428
- return {
429
- content: [
430
- { type: "text" as const, text: JSON.stringify(KnowledgeSearchResponse.parse(response)) },
431
- ],
432
- };
433
- }
@@ -32,12 +32,13 @@ const ArtifactCommand = z
32
32
  .object({ kind: z.string().min(1).max(128) })
33
33
  .passthrough()
34
34
  .describe(
35
- "One canonical modality command. Use the exact OpenGeni document, spreadsheet, or presentation skill command contract; never send local-file facade calls here.",
35
+ "One canonical modality command. Use the exact Opengeni document, spreadsheet, or presentation skill command contract; never send local-file facade calls here.",
36
36
  );
37
37
 
38
38
  const ArtifactMetadata = z
39
39
  .object({
40
40
  id: ArtifactId,
41
+ artifactReference: z.string(),
41
42
  modality: Modality,
42
43
  title: z.string(),
43
44
  lifecycle: z.enum(["active", "archived"]),
@@ -203,13 +204,17 @@ export function registerEditableArtifactAgentTools(
203
204
  {
204
205
  title: "Inspect editable artifact",
205
206
  description:
206
- "Query the artifact's current canonical head through the same native kernel used by the browser. Use bounded modality queries; results are current, not a sandbox-file snapshot.",
207
+ "Query the artifact's current canonical head through the same native kernel used by the browser. Use bounded modality queries; results are current, not a sandbox-file snapshot. Native document queries return a server-issued inspectionReceiptId; use a post-edit body inspection receipt for declared report completion. If the document changes during inspection, retry against its current head.",
207
208
  inputSchema: {
208
209
  artifactId: ArtifactId,
209
210
  modality: Modality,
210
211
  request: EditableArtifactQueryRequestSchema,
211
212
  },
212
- outputSchema: { artifact: ArtifactMetadata, projection: z.unknown() },
213
+ outputSchema: {
214
+ artifact: ArtifactMetadata,
215
+ projection: z.unknown(),
216
+ inspectionReceiptId: z.string().uuid().optional(),
217
+ },
213
218
  annotations: readOnlyAnnotations("Inspect editable artifact"),
214
219
  },
215
220
  async ({ artifactId, modality, request }, extra) =>
@@ -262,11 +267,12 @@ export function registerEditableArtifactAgentTools(
262
267
  "editable_artifact_export",
263
268
  {
264
269
  title: "Export editable artifact",
265
- description:
266
- "Pin the current artifact head and start an immutable Office/PDF/image export. This does not write into the sandbox. Poll opengeni__editable_artifact_export_status for the resulting workspace file ID.",
270
+ description: `Pin the current artifact head and start an immutable file export. ${input.deps.editableArtifactAgent?.describeExportFormats?.() ?? "No exporter capability description is available; query this deployment before promising a format."} This does not write into the sandbox. Poll opengeni__editable_artifact_export_status for the resulting workspace file ID.`,
267
271
  inputSchema: {
268
272
  artifactId: ArtifactId,
269
- format: Format,
273
+ format: Format.describe(
274
+ "Target file format. Only the formats listed in this tool's description are served; any other combination is refused with unsupported_format.",
275
+ ),
270
276
  options: JsonRecord.optional(),
271
277
  },
272
278
  outputSchema: {
package/src/mcp/files.ts CHANGED
@@ -1,11 +1,23 @@
1
1
  import type { AccessGrant } from "@opengeni/contracts";
2
- import { requireFile } from "@opengeni/db";
3
- import { hasPermission, type ApiRouteDeps } from "@opengeni/core";
2
+ import { recordAuditEvent, requireFileForSubject, withSessionRlsActorContext } from "@opengeni/db";
3
+ import {
4
+ hasPermission,
5
+ fileOwnerContextForAccess,
6
+ fileOwnerContextForAgent,
7
+ type AccessGrantAuthorization,
8
+ type ApiRouteDeps,
9
+ } from "@opengeni/core";
4
10
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
11
  import * as z from "zod/v4";
12
+ import { userContentSignedGetUrlOptions } from "../http/user-content";
6
13
 
7
14
  /** Dedicated file MCP surface. The broad `opengeni` server never registers it. */
8
- export function buildFilesMcpServer(deps: ApiRouteDeps, grant: AccessGrant): McpServer {
15
+ export function buildFilesMcpServer(
16
+ deps: ApiRouteDeps,
17
+ authority: AccessGrant | AccessGrantAuthorization,
18
+ ): McpServer {
19
+ const access = "grant" in authority ? authority : undefined;
20
+ const grant = access ? access.grant : (authority as AccessGrant);
9
21
  const server = new McpServer({
10
22
  name: "opengeni-files",
11
23
  version: "1.0.0",
@@ -34,42 +46,72 @@ export function buildFilesMcpServer(deps: ApiRouteDeps, grant: AccessGrant): Mcp
34
46
  inputSchema: { fileId: z.string().uuid() },
35
47
  },
36
48
  async ({ fileId }) => {
37
- if (!deps.objectStorage) {
38
- throw new Error("object storage is not configured");
39
- }
40
- const file = await requireFile(deps.db, grant.workspaceId, fileId);
41
- if (file.status !== "ready") {
42
- throw new Error(`file is ${file.status}`);
43
- }
44
- const signed = await deps.objectStorage.createGetUrl({ key: file.objectKey });
45
- return {
46
- content: [
47
- {
48
- type: "text" as const,
49
- text: JSON.stringify(
50
- {
51
- file: {
52
- id: file.id,
53
- filename: file.filename,
54
- safeFilename: file.safeFilename,
55
- contentType: file.contentType,
56
- sizeBytes: file.sizeBytes,
57
- sha256: file.sha256,
58
- status: file.status,
59
- createdAt: file.createdAt,
60
- updatedAt: file.updatedAt,
61
- },
62
- downloadUrl: {
63
- url: signed.url,
64
- expiresAt: signed.expiresAt.toISOString(),
65
- },
66
- },
67
- null,
68
- 2,
69
- ),
49
+ const actor = access
50
+ ? await fileOwnerContextForAccess(deps, access, "files:read")
51
+ : grant.principalKind === "agent_attempt"
52
+ ? await fileOwnerContextForAgent(deps, grant, "files:read")
53
+ : { subjectId: grant.subjectId, privateFileOwnerSubjectId: null };
54
+ return withSessionRlsActorContext(actor, async () => {
55
+ if (!deps.objectStorage) {
56
+ throw new Error("object storage is not configured");
57
+ }
58
+ const file = await requireFileForSubject(deps.db, {
59
+ accountId: grant.accountId,
60
+ workspaceId: grant.workspaceId,
61
+ subjectId: grant.subjectId,
62
+ fileId,
63
+ });
64
+ if (file.status !== "ready") {
65
+ throw new Error(`file is ${file.status}`);
66
+ }
67
+ const signed = await deps.objectStorage.createGetUrl({
68
+ key: file.objectKey,
69
+ ...userContentSignedGetUrlOptions(file.contentType, file.filename),
70
+ });
71
+ // Principal-facing signed URL issuance is a metadata-only audit
72
+ // fact, awaited before the URL leaves the platform. Never the URL/key.
73
+ await recordAuditEvent(deps.db, {
74
+ accountId: grant.accountId,
75
+ workspaceId: grant.workspaceId,
76
+ subjectId: grant.subjectId,
77
+ action: "file.signed_url.issued",
78
+ targetType: "workspace_file",
79
+ targetId: file.id,
80
+ metadata: {
81
+ fileId: file.id,
82
+ kind: "mcp_download",
83
+ expiresAt: signed.expiresAt.toISOString(),
70
84
  },
71
- ],
72
- };
85
+ });
86
+ return {
87
+ content: [
88
+ {
89
+ type: "text" as const,
90
+ text: JSON.stringify(
91
+ {
92
+ file: {
93
+ id: file.id,
94
+ filename: file.filename,
95
+ safeFilename: file.safeFilename,
96
+ contentType: file.contentType,
97
+ sizeBytes: file.sizeBytes,
98
+ sha256: file.sha256,
99
+ status: file.status,
100
+ createdAt: file.createdAt,
101
+ updatedAt: file.updatedAt,
102
+ },
103
+ downloadUrl: {
104
+ url: signed.url,
105
+ expiresAt: signed.expiresAt.toISOString(),
106
+ },
107
+ },
108
+ null,
109
+ 2,
110
+ ),
111
+ },
112
+ ],
113
+ };
114
+ });
73
115
  },
74
116
  );
75
117