@opengeni/contracts 0.44.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 (382) hide show
  1. package/dist/agent-authored-durable-text.d.ts +70 -0
  2. package/dist/agent-config.d.ts +869 -0
  3. package/dist/agent-instruction-changes.d.ts +110 -0
  4. package/dist/agent-learning.d.ts +243 -0
  5. package/dist/agent-topology.d.ts +292 -0
  6. package/dist/allowance-refusal.d.ts +9 -0
  7. package/dist/allowance-refusal.js +50 -0
  8. package/dist/allowance-refusal.js.map +1 -0
  9. package/dist/analytics-consent-report.d.ts +19 -0
  10. package/dist/analytics-consent-report.js +10 -0
  11. package/dist/analytics-consent-report.js.map +1 -0
  12. package/dist/api-key-presets.d.ts +19 -0
  13. package/dist/artifact-catalog.d.ts +161 -0
  14. package/dist/artifacts.d.ts +135 -11
  15. package/dist/atlassian-native-retirement.d.ts +16 -0
  16. package/dist/atlassian-native-retirement.js +30 -0
  17. package/dist/atlassian-native-retirement.js.map +1 -0
  18. package/dist/atlassian.d.ts +2 -0
  19. package/dist/atlassian.js +27 -11
  20. package/dist/browser-storage.d.ts +5 -0
  21. package/dist/browser-storage.js +9 -0
  22. package/dist/browser-storage.js.map +1 -0
  23. package/dist/bundled-skills.d.ts +40 -0
  24. package/dist/canonical-human-identities.d.ts +157 -0
  25. package/dist/canonical-human-identities.js +23 -0
  26. package/dist/canonical-human-identities.js.map +1 -0
  27. package/dist/chunk-2ACYHZFB.js +292 -0
  28. package/dist/chunk-2ACYHZFB.js.map +1 -0
  29. package/dist/chunk-2VORLN2R.js +353 -0
  30. package/dist/chunk-2VORLN2R.js.map +1 -0
  31. package/dist/{chunk-Y3MLSLB4.js → chunk-3SIZGL3O.js} +42 -30
  32. package/dist/chunk-3SIZGL3O.js.map +1 -0
  33. package/dist/chunk-46KLD2UH.js +186 -0
  34. package/dist/chunk-46KLD2UH.js.map +1 -0
  35. package/dist/chunk-4JGHSSB7.js +11 -0
  36. package/dist/chunk-4JGHSSB7.js.map +1 -0
  37. package/dist/{chunk-52SGB2QO.js → chunk-5IXYF6XN.js} +50 -10
  38. package/dist/chunk-5IXYF6XN.js.map +1 -0
  39. package/dist/chunk-BCS7WHCK.js +139 -0
  40. package/dist/chunk-BCS7WHCK.js.map +1 -0
  41. package/dist/chunk-EK7NDGFR.js +128 -0
  42. package/dist/chunk-EK7NDGFR.js.map +1 -0
  43. package/dist/{chunk-5UDNP7AO.js → chunk-FZ6BXQHL.js} +78 -38
  44. package/dist/chunk-FZ6BXQHL.js.map +1 -0
  45. package/dist/chunk-GRG7PHWQ.js +25 -0
  46. package/dist/chunk-GRG7PHWQ.js.map +1 -0
  47. package/dist/chunk-JUFK3T4Q.js +80 -0
  48. package/dist/chunk-JUFK3T4Q.js.map +1 -0
  49. package/dist/chunk-KHHZTBP7.js +11 -0
  50. package/dist/chunk-KHHZTBP7.js.map +1 -0
  51. package/dist/chunk-KR2V42UZ.js +187 -0
  52. package/dist/chunk-KR2V42UZ.js.map +1 -0
  53. package/dist/chunk-MZLBPKFE.js +168 -0
  54. package/dist/chunk-MZLBPKFE.js.map +1 -0
  55. package/dist/{chunk-H5BVCZKF.js → chunk-NRMCVHAU.js} +6 -5
  56. package/dist/chunk-NRMCVHAU.js.map +1 -0
  57. package/dist/{chunk-TZ6YEYN4.js → chunk-NVJMJWLL.js} +3 -1
  58. package/dist/chunk-NVJMJWLL.js.map +1 -0
  59. package/dist/chunk-O77VSFYZ.js +70 -0
  60. package/dist/chunk-O77VSFYZ.js.map +1 -0
  61. package/dist/chunk-PX3VCKAU.js +29 -0
  62. package/dist/chunk-PX3VCKAU.js.map +1 -0
  63. package/dist/chunk-QR5D2IQC.js +61 -0
  64. package/dist/chunk-QR5D2IQC.js.map +1 -0
  65. package/dist/chunk-RJ76DRPO.js +117 -0
  66. package/dist/chunk-RJ76DRPO.js.map +1 -0
  67. package/dist/chunk-RKX3NQYS.js +28 -0
  68. package/dist/chunk-RKX3NQYS.js.map +1 -0
  69. package/dist/{chunk-FJBG5E4O.js → chunk-SIOU2K4U.js} +45 -22
  70. package/dist/chunk-SIOU2K4U.js.map +1 -0
  71. package/dist/chunk-TSCDAGET.js +75 -0
  72. package/dist/chunk-TSCDAGET.js.map +1 -0
  73. package/dist/{chunk-LSB7GRLG.js → chunk-TXTQIYCV.js} +15 -11
  74. package/dist/chunk-TXTQIYCV.js.map +1 -0
  75. package/dist/chunk-X7ETVO4P.js +26544 -0
  76. package/dist/chunk-X7ETVO4P.js.map +1 -0
  77. package/dist/{chunk-CADSX6UN.js → chunk-Y3KNXVTD.js} +2 -2
  78. package/dist/chunk-YBW5JSA3.js +251 -0
  79. package/dist/chunk-YBW5JSA3.js.map +1 -0
  80. package/dist/chunk-YRXAWWCU.js +45 -0
  81. package/dist/chunk-YRXAWWCU.js.map +1 -0
  82. package/dist/claude-provider-account-authority.d.ts +18 -0
  83. package/dist/claude-subscription-oauth.d.ts +42 -0
  84. package/dist/claude-subscription-usage.d.ts +159 -0
  85. package/dist/client-error-report.d.ts +109 -0
  86. package/dist/client-error-report.js +87 -0
  87. package/dist/client-error-report.js.map +1 -0
  88. package/dist/code-search.d.ts +52 -0
  89. package/dist/code-search.js +40 -0
  90. package/dist/code-search.js.map +1 -0
  91. package/dist/codex-provider-account-authority.d.ts +23 -0
  92. package/dist/codex-provider-account-authority.js +23 -0
  93. package/dist/codex-provider-account-authority.js.map +1 -0
  94. package/dist/company-brain-governed-writes.d.ts +475 -0
  95. package/dist/company-brain.d.ts +336 -0
  96. package/dist/company-profile.d.ts +566 -0
  97. package/dist/connect.d.ts +325 -0
  98. package/dist/connect.js +191 -0
  99. package/dist/connect.js.map +1 -0
  100. package/dist/connection-account-label.d.ts +2 -0
  101. package/dist/connection-account-label.js +35 -0
  102. package/dist/connection-account-label.js.map +1 -0
  103. package/dist/connection-authority.d.ts +193 -0
  104. package/dist/connection-authority.js +50 -0
  105. package/dist/connection-authority.js.map +1 -0
  106. package/dist/connector-attachments.d.ts +95 -0
  107. package/dist/connector-attachments.js +51 -0
  108. package/dist/connector-attachments.js.map +1 -0
  109. package/dist/connector-tool-permissions.d.ts +73 -0
  110. package/dist/direct-model-provider.d.ts +36 -0
  111. package/dist/editable-artifact-codec-registry.d.ts +16 -7
  112. package/dist/editable-artifact-codec-registry.js +19 -9
  113. package/dist/editable-artifact-committed-transaction.d.ts +2 -2
  114. package/dist/editable-artifact-committed-transaction.js +2 -2
  115. package/dist/editable-artifact-live.d.ts +11 -12
  116. package/dist/editable-artifact-live.js +110 -45
  117. package/dist/editable-artifact-live.js.map +1 -1
  118. package/dist/editable-artifact-serialized-commit.d.ts +2 -1
  119. package/dist/editable-artifact-serialized-commit.js +8 -7
  120. package/dist/editable-artifact-versions.d.ts +20 -5
  121. package/dist/editable-artifact-versions.js +23 -5
  122. package/dist/editable-artifacts.d.ts +2 -0
  123. package/dist/editable-artifacts.js +48 -36
  124. package/dist/external-identities.d.ts +784 -0
  125. package/dist/external-identities.js +44 -0
  126. package/dist/external-identities.js.map +1 -0
  127. package/dist/feedback.d.ts +51 -0
  128. package/dist/github-repository-contracts.d.ts +36 -0
  129. package/dist/github-repository-contracts.js +59 -0
  130. package/dist/github-repository-contracts.js.map +1 -0
  131. package/dist/github-repository.d.ts +14 -0
  132. package/dist/github-repository.js +36 -0
  133. package/dist/github-repository.js.map +1 -0
  134. package/dist/google-drive.d.ts +90 -1
  135. package/dist/google-drive.js +91 -15
  136. package/dist/google-drive.js.map +1 -1
  137. package/dist/governed-learning-activation.d.ts +154 -0
  138. package/dist/governed-learning-evaluator.d.ts +152 -0
  139. package/dist/host-mcp-bindings.d.ts +326 -0
  140. package/dist/host-mcp-bindings.js +252 -0
  141. package/dist/host-mcp-bindings.js.map +1 -0
  142. package/dist/image-generation.d.ts +1 -0
  143. package/dist/index.d.ts +27574 -5374
  144. package/dist/index.js +2531 -177
  145. package/dist/insights-usage.d.ts +877 -0
  146. package/dist/insights-usage.js +509 -0
  147. package/dist/insights-usage.js.map +1 -0
  148. package/dist/interaction.d.ts +1752 -13
  149. package/dist/knowledge-entries.d.ts +982 -0
  150. package/dist/knowledge-preparation.d.ts +237 -0
  151. package/dist/knowledge.d.ts +740 -0
  152. package/dist/managed-auth-session-sets.d.ts +241 -0
  153. package/dist/managed-auth-session-sets.js +191 -0
  154. package/dist/managed-auth-session-sets.js.map +1 -0
  155. package/dist/managed-sign-in-methods.d.ts +56 -0
  156. package/dist/managed-sign-in-methods.js +46 -0
  157. package/dist/managed-sign-in-methods.js.map +1 -0
  158. package/dist/mcp-catalog-limits.d.ts +2 -0
  159. package/dist/mcp-endpoint.d.ts +7 -0
  160. package/dist/mcp-endpoint.js +9 -0
  161. package/dist/mcp-endpoint.js.map +1 -0
  162. package/dist/mcp-oauth.d.ts +71 -0
  163. package/dist/modal-native-proof-v2.d.ts +587 -0
  164. package/dist/modal-native-proof-v2.js +37 -0
  165. package/dist/modal-native-proof-v2.js.map +1 -0
  166. package/dist/model-availability.d.ts +15 -0
  167. package/dist/model-connection-access.d.ts +24 -0
  168. package/dist/model-context-inspector.d.ts +329 -0
  169. package/dist/model-display.d.ts +38 -0
  170. package/dist/model-display.js +134 -0
  171. package/dist/model-display.js.map +1 -0
  172. package/dist/model-picker-order.d.ts +25 -0
  173. package/dist/model-picker-order.js +42 -0
  174. package/dist/model-picker-order.js.map +1 -0
  175. package/dist/organization-access.d.ts +231 -0
  176. package/dist/organization-access.js +34 -0
  177. package/dist/organization-access.js.map +1 -0
  178. package/dist/organization-integration-policy.d.ts +27 -0
  179. package/dist/organization-membership-lifecycle.d.ts +1022 -0
  180. package/dist/organization-model-usage.d.ts +146 -0
  181. package/dist/organization-model-usage.js +67 -0
  182. package/dist/organization-model-usage.js.map +1 -0
  183. package/dist/organization-recovery.d.ts +337 -0
  184. package/dist/organization-recovery.js +37 -0
  185. package/dist/organization-recovery.js.map +1 -0
  186. package/dist/organization-usage.d.ts +138 -0
  187. package/dist/permissions.d.ts +54 -0
  188. package/dist/personal-github.d.ts +320 -0
  189. package/dist/personal-github.js +222 -0
  190. package/dist/personal-github.js.map +1 -0
  191. package/dist/plugin-discovery.d.ts +35 -0
  192. package/dist/plugin-discovery.js +7 -0
  193. package/dist/plugin-discovery.js.map +1 -0
  194. package/dist/preference-registry.d.ts +44 -1
  195. package/dist/product-analytics.d.ts +113 -0
  196. package/dist/product-lifecycle-facts.d.ts +73 -0
  197. package/dist/remember.d.ts +350 -0
  198. package/dist/retained-output.d.ts +8 -0
  199. package/dist/sandbox-file-artifacts.d.ts +57 -0
  200. package/dist/sandbox-provider-command.d.ts +113 -0
  201. package/dist/sandbox-recovery.d.ts +146 -0
  202. package/dist/sandbox-snapshots.d.ts +39 -0
  203. package/dist/session-final-reply.d.ts +6 -0
  204. package/dist/session-final-reply.js +9 -0
  205. package/dist/session-final-reply.js.map +1 -0
  206. package/dist/session-goal-reports.d.ts +21 -0
  207. package/dist/session-history-import.d.ts +947 -0
  208. package/dist/session-list-entries.d.ts +4 -0
  209. package/dist/session-list-entries.js +51 -0
  210. package/dist/session-list-entries.js.map +1 -0
  211. package/dist/session-mcp-projections.d.ts +215 -0
  212. package/dist/session-message-search.d.ts +68 -0
  213. package/dist/session-titles.d.ts +68 -0
  214. package/dist/session-titles.js +25 -0
  215. package/dist/session-titles.js.map +1 -0
  216. package/dist/session-topology-primitives.d.ts +22 -0
  217. package/dist/signup-attribution.d.ts +39 -0
  218. package/dist/site-request-headers.test.d.ts +1 -0
  219. package/dist/site-session-http.d.ts +11 -0
  220. package/dist/site-session-http.js +11 -0
  221. package/dist/site-session-http.js.map +1 -0
  222. package/dist/skill-catalog-context.d.ts +7 -0
  223. package/dist/skill-files.d.ts +12 -0
  224. package/dist/skill-metadata.d.ts +9 -0
  225. package/dist/skill-use.d.ts +61 -0
  226. package/dist/skills.d.ts +185 -0
  227. package/dist/slack-bot-scopes.d.ts +46 -21
  228. package/dist/slack-bot-scopes.js +14 -3
  229. package/dist/slack-rest-mcp.d.ts +31 -0
  230. package/dist/slack-rest-mcp.js +19 -0
  231. package/dist/slack-rest-mcp.js.map +1 -0
  232. package/dist/slack-task-policy.d.ts +294 -0
  233. package/dist/spreadsheet-artifact-commands.d.ts +2 -3
  234. package/dist/spreadsheet-artifact-commands.js +4 -2
  235. package/dist/spreadsheet-artifact-query.js +3 -2
  236. package/dist/subscription-account-pools.d.ts +292 -0
  237. package/dist/task-notes.d.ts +169 -0
  238. package/dist/tool-catalog.d.ts +286 -0
  239. package/dist/tool-result-spill.d.ts +16 -0
  240. package/dist/usage-allowances.d.ts +285 -0
  241. package/dist/usage-allowances.js +49 -0
  242. package/dist/usage-allowances.js.map +1 -0
  243. package/dist/video-generation.d.ts +51 -0
  244. package/dist/video-generation.js +9 -1
  245. package/dist/work-claims.d.ts +411 -0
  246. package/dist/workspace-instruction-policies.d.ts +94 -0
  247. package/dist/workspace-integration-wire.d.ts +36 -0
  248. package/dist/workspace-integration-wire.js +23 -0
  249. package/dist/workspace-integration-wire.js.map +1 -0
  250. package/dist/workspace-integrations.d.ts +948 -0
  251. package/dist/workspace-learning-administration.d.ts +289 -0
  252. package/dist/workspace-learning-policy.d.ts +1 -1
  253. package/dist/workspace-state.d.ts +85 -416
  254. package/dist/xai-provider-account-authority.d.ts +26 -0
  255. package/dist/xai-provider-account-authority.js +9 -0
  256. package/dist/xai-provider-account-authority.js.map +1 -0
  257. package/package.json +146 -1
  258. package/src/agent-authored-durable-text.ts +116 -0
  259. package/src/agent-config.ts +1527 -0
  260. package/src/agent-instruction-changes.ts +98 -0
  261. package/src/agent-learning.ts +161 -0
  262. package/src/agent-topology.ts +69 -0
  263. package/src/allowance-refusal.ts +81 -0
  264. package/src/analytics-consent-report.ts +20 -0
  265. package/src/api-key-presets.ts +25 -0
  266. package/src/artifact-catalog.ts +60 -0
  267. package/src/artifacts.ts +146 -18
  268. package/src/atlassian-native-retirement.ts +33 -0
  269. package/src/browser-storage.ts +10 -0
  270. package/src/bundled-skills.ts +73 -0
  271. package/src/canonical-human-identities.ts +93 -0
  272. package/src/claude-provider-account-authority.ts +12 -0
  273. package/src/claude-subscription-oauth.ts +62 -0
  274. package/src/claude-subscription-usage.ts +59 -0
  275. package/src/client-error-report.ts +184 -0
  276. package/src/code-search.ts +105 -0
  277. package/src/codex-provider-account-authority.ts +37 -0
  278. package/src/company-brain-governed-writes.ts +356 -0
  279. package/src/company-brain.ts +201 -0
  280. package/src/company-profile.ts +167 -1
  281. package/src/connect.ts +202 -0
  282. package/src/connection-account-label.ts +46 -0
  283. package/src/connection-authority.ts +213 -0
  284. package/src/connector-attachments.ts +327 -0
  285. package/src/connector-tool-permissions.ts +60 -0
  286. package/src/direct-model-provider.ts +98 -0
  287. package/src/editable-artifact-codec-registry.ts +55 -17
  288. package/src/editable-artifact-committed-transaction.ts +44 -31
  289. package/src/editable-artifact-live.ts +123 -57
  290. package/src/editable-artifact-serialized-commit.ts +2 -1
  291. package/src/editable-artifact-versions.ts +26 -5
  292. package/src/editable-artifacts.ts +2 -0
  293. package/src/external-identities.ts +285 -0
  294. package/src/feedback.ts +39 -0
  295. package/src/github-repository-contracts.ts +85 -0
  296. package/src/github-repository.ts +59 -0
  297. package/src/google-drive.ts +76 -4
  298. package/src/governed-learning-activation.ts +191 -0
  299. package/src/governed-learning-evaluator.ts +176 -0
  300. package/src/host-mcp-bindings.ts +298 -0
  301. package/src/image-generation.ts +8 -2
  302. package/src/index.ts +8019 -1799
  303. package/src/insights-usage.ts +679 -0
  304. package/src/interaction.ts +1102 -6
  305. package/src/knowledge-entries.ts +375 -0
  306. package/src/knowledge-preparation.ts +50 -0
  307. package/src/knowledge.ts +335 -0
  308. package/src/managed-auth-session-sets.ts +253 -0
  309. package/src/managed-sign-in-methods.ts +37 -0
  310. package/src/mcp-catalog-limits.ts +2 -0
  311. package/src/mcp-endpoint.ts +30 -0
  312. package/src/mcp-oauth.ts +66 -0
  313. package/src/modal-native-proof-v2.ts +398 -0
  314. package/src/model-availability.ts +22 -0
  315. package/src/model-connection-access.ts +17 -0
  316. package/src/model-context-inspector.ts +139 -0
  317. package/src/model-display.ts +195 -0
  318. package/src/model-picker-order.ts +97 -0
  319. package/src/organization-access.ts +176 -0
  320. package/src/organization-integration-policy.ts +54 -0
  321. package/src/organization-membership-lifecycle.ts +559 -0
  322. package/src/organization-model-usage.ts +72 -0
  323. package/src/organization-recovery.ts +186 -0
  324. package/src/organization-usage.ts +79 -0
  325. package/src/permissions.ts +58 -0
  326. package/src/personal-github.ts +267 -0
  327. package/src/plugin-discovery.ts +33 -0
  328. package/src/preference-registry.ts +20 -1
  329. package/src/product-analytics.ts +253 -0
  330. package/src/product-lifecycle-facts.ts +121 -0
  331. package/src/remember.ts +243 -0
  332. package/src/retained-output.ts +20 -3
  333. package/src/sandbox-file-artifacts.ts +73 -0
  334. package/src/sandbox-provider-command.ts +82 -0
  335. package/src/sandbox-recovery.ts +116 -0
  336. package/src/sandbox-snapshots.ts +142 -0
  337. package/src/session-final-reply.ts +16 -0
  338. package/src/session-goal-reports.ts +55 -0
  339. package/src/session-history-import.ts +159 -0
  340. package/src/session-list-entries.ts +91 -0
  341. package/src/session-mcp-projections.ts +273 -0
  342. package/src/session-message-search.ts +54 -0
  343. package/src/session-titles.ts +467 -0
  344. package/src/session-topology-primitives.ts +21 -0
  345. package/src/signup-attribution.ts +81 -0
  346. package/src/site-request-headers.test.ts +28 -0
  347. package/src/site-session-http.ts +63 -0
  348. package/src/skill-catalog-context.ts +50 -0
  349. package/src/skill-files.ts +52 -0
  350. package/src/skill-metadata.ts +40 -0
  351. package/src/skill-use.ts +77 -0
  352. package/src/skills.ts +136 -0
  353. package/src/slack-bot-scopes.ts +106 -42
  354. package/src/slack-rest-mcp.ts +194 -0
  355. package/src/slack-task-policy.ts +215 -0
  356. package/src/spreadsheet-artifact-commands.ts +12 -13
  357. package/src/subscription-account-pools.ts +44 -0
  358. package/src/task-notes.ts +105 -0
  359. package/src/tool-catalog.ts +155 -0
  360. package/src/tool-result-spill.ts +35 -0
  361. package/src/usage-allowances.ts +187 -0
  362. package/src/video-generation.ts +43 -6
  363. package/src/work-claims.ts +266 -0
  364. package/src/workspace-instruction-policies.ts +31 -0
  365. package/src/workspace-integration-wire.ts +99 -0
  366. package/src/workspace-integrations.ts +640 -0
  367. package/src/workspace-learning-administration.ts +88 -0
  368. package/src/workspace-learning-policy.ts +4 -3
  369. package/src/workspace-state.ts +16 -126
  370. package/src/xai-provider-account-authority.ts +38 -0
  371. package/dist/chunk-52SGB2QO.js.map +0 -1
  372. package/dist/chunk-5UDNP7AO.js.map +0 -1
  373. package/dist/chunk-BVGIYW7D.js +0 -11
  374. package/dist/chunk-BVGIYW7D.js.map +0 -1
  375. package/dist/chunk-FJBG5E4O.js.map +0 -1
  376. package/dist/chunk-H5BVCZKF.js.map +0 -1
  377. package/dist/chunk-LSB7GRLG.js.map +0 -1
  378. package/dist/chunk-TZ6YEYN4.js.map +0 -1
  379. package/dist/chunk-VA22KRHS.js +0 -15177
  380. package/dist/chunk-VA22KRHS.js.map +0 -1
  381. package/dist/chunk-Y3MLSLB4.js.map +0 -1
  382. /package/dist/{chunk-CADSX6UN.js.map → chunk-Y3KNXVTD.js.map} +0 -0
@@ -0,0 +1,335 @@
1
+ import { z } from "zod";
2
+
3
+ export const KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS = 1_024;
4
+ export const KNOWLEDGE_BROWSE_DEFAULT_LIMIT = 20;
5
+ export const KNOWLEDGE_BROWSE_MAX_LIMIT = 50;
6
+ export const KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES = 64 * 1_024;
7
+ export const KNOWLEDGE_TITLE_MAX_BYTES = 1_024;
8
+ export const KNOWLEDGE_BODY_MAX_BYTES = 16 * 1_024;
9
+ export const KNOWLEDGE_SUMMARY_MAX_BYTES = 4 * 1_024;
10
+ export const KNOWLEDGE_TOPIC_MAX_BYTES = 256;
11
+ export const KNOWLEDGE_TOPICS_MAX_ITEMS = 32;
12
+ export const KNOWLEDGE_METADATA_MAX_BYTES = 8 * 1_024;
13
+ export const KNOWLEDGE_METADATA_MAX_ITEMS = 64;
14
+ export const KNOWLEDGE_METADATA_MAX_DEPTH = 4;
15
+ export const KNOWLEDGE_SOURCE_STRING_MAX_BYTES = 2_048;
16
+ export const KNOWLEDGE_SOURCE_URI_MAX_BYTES = 8_192;
17
+ export const KNOWLEDGE_SEARCH_MAX_RESULTS = 50;
18
+ export const KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES = 64 * 1_024;
19
+ export const KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN = 4;
20
+ export const KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS = 200;
21
+ // Cosine similarity for unrelated embeddings clusters around 0.5 after the
22
+ // distance conversion used by Documents. Keyword search already excludes
23
+ // non-matches in SQL, but a small normalized floor removes incidental hits.
24
+ export const KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE = 0.52;
25
+ export const KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE = 0.01;
26
+ export const KNOWLEDGE_QUERY_MAX_BYTES = 4 * 1_024;
27
+
28
+ const utf8Bytes = (value: string): number => new TextEncoder().encode(value).byteLength;
29
+ const boundedUtf8 = (maxBytes: number) =>
30
+ z.string().superRefine((value, ctx) => {
31
+ if (utf8Bytes(value) > maxBytes) {
32
+ ctx.addIssue({
33
+ code: z.ZodIssueCode.custom,
34
+ message: `must be at most ${maxBytes} UTF-8 bytes`,
35
+ });
36
+ }
37
+ });
38
+
39
+ function boundedJson(value: unknown): boolean {
40
+ let items = 0;
41
+ let valid = true;
42
+ const visit = (candidate: unknown, depth: number): void => {
43
+ if (!valid || ++items > KNOWLEDGE_METADATA_MAX_ITEMS || depth > KNOWLEDGE_METADATA_MAX_DEPTH) {
44
+ valid = false;
45
+ return;
46
+ }
47
+ if (
48
+ candidate === null ||
49
+ typeof candidate === "boolean" ||
50
+ (typeof candidate === "number" && Number.isFinite(candidate))
51
+ ) {
52
+ return;
53
+ }
54
+ if (typeof candidate === "string") {
55
+ if (utf8Bytes(candidate) > KNOWLEDGE_SOURCE_STRING_MAX_BYTES) valid = false;
56
+ return;
57
+ }
58
+ if (Array.isArray(candidate)) {
59
+ for (const item of candidate) visit(item, depth + 1);
60
+ return;
61
+ }
62
+ if (typeof candidate === "object") {
63
+ for (const [key, item] of Object.entries(candidate as Record<string, unknown>)) {
64
+ if (utf8Bytes(key) > KNOWLEDGE_TOPIC_MAX_BYTES) valid = false;
65
+ visit(item, depth + 1);
66
+ }
67
+ return;
68
+ }
69
+ valid = false;
70
+ };
71
+ visit(value, 0);
72
+ if (!valid) return false;
73
+ try {
74
+ return utf8Bytes(JSON.stringify(value)) <= KNOWLEDGE_METADATA_MAX_BYTES;
75
+ } catch {
76
+ return false;
77
+ }
78
+ }
79
+
80
+ export const KnowledgeRecordId = z
81
+ .string()
82
+ .regex(
83
+ /^(document|document_chunk):[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu,
84
+ );
85
+ export type KnowledgeRecordId = z.infer<typeof KnowledgeRecordId>;
86
+
87
+ export const KnowledgeRecordKind = z.enum(["document", "document_chunk"]);
88
+ export type KnowledgeRecordKind = z.infer<typeof KnowledgeRecordKind>;
89
+
90
+ export const KnowledgeAuthority = z.object({
91
+ kind: z.enum(["organization", "workspace", "personal"]),
92
+ });
93
+ export type KnowledgeAuthority = z.infer<typeof KnowledgeAuthority>;
94
+
95
+ export const KnowledgeSource = z.object({
96
+ kind: z.enum([
97
+ "manual_upload",
98
+ "meeting_transcript",
99
+ "repository",
100
+ "email",
101
+ "chat",
102
+ "document",
103
+ "web",
104
+ "other",
105
+ ]),
106
+ uri: boundedUtf8(KNOWLEDGE_SOURCE_URI_MAX_BYTES).pipe(z.string().min(1)).nullable(),
107
+ externalId: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES).nullable(),
108
+ title: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES).nullable(),
109
+ author: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES).nullable(),
110
+ createdAt: z.string().nullable(),
111
+ updatedAt: z.string().nullable(),
112
+ version: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES).nullable(),
113
+ });
114
+ export type KnowledgeSource = z.infer<typeof KnowledgeSource>;
115
+
116
+ export const KnowledgeSearchRequest = z
117
+ .object({
118
+ query: boundedUtf8(KNOWLEDGE_QUERY_MAX_BYTES).pipe(z.string().min(1)),
119
+ baseIds: z.array(z.string().uuid()).max(50).optional(),
120
+ mode: z.enum(["hybrid", "vector", "keyword"]).optional(),
121
+ sourceKinds: z.array(KnowledgeSource.shape.kind).max(8).optional(),
122
+ authorityKinds: z.array(KnowledgeAuthority.shape.kind).max(3).optional(),
123
+ aclTags: z
124
+ .array(boundedUtf8(KNOWLEDGE_TOPIC_MAX_BYTES).pipe(z.string().min(1)))
125
+ .max(64)
126
+ .optional(),
127
+ limit: z.number().int().positive().max(KNOWLEDGE_SEARCH_MAX_RESULTS).default(5),
128
+ })
129
+ .strict();
130
+ export type KnowledgeSearchRequest = z.input<typeof KnowledgeSearchRequest>;
131
+
132
+ export const KnowledgeBrowseRequest = z
133
+ .object({
134
+ parentId: KnowledgeRecordId.optional(),
135
+ topic: boundedUtf8(KNOWLEDGE_TOPIC_MAX_BYTES).pipe(z.string().min(1)).optional(),
136
+ sourceKinds: z.array(KnowledgeSource.shape.kind).max(8).optional(),
137
+ cursor: z.string().min(1).max(KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS).optional(),
138
+ limit: z
139
+ .number()
140
+ .int()
141
+ .positive()
142
+ .max(KNOWLEDGE_BROWSE_MAX_LIMIT)
143
+ .default(KNOWLEDGE_BROWSE_DEFAULT_LIMIT),
144
+ })
145
+ .strict()
146
+ .superRefine((value, context) => {
147
+ if (value.parentId && (value.topic || (value.sourceKinds?.length ?? 0) > 0)) {
148
+ context.addIssue({
149
+ code: z.ZodIssueCode.custom,
150
+ message: "document contents do not accept topic or source filters",
151
+ });
152
+ }
153
+ });
154
+ export type KnowledgeBrowseRequest = z.input<typeof KnowledgeBrowseRequest>;
155
+
156
+ export const KnowledgeProviderCitation = z.object({
157
+ provider: z.literal("google_drive"),
158
+ externalObjectId: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES),
159
+ providerRevision: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES).nullable(),
160
+ sourceVersion: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES),
161
+ driveId: boundedUtf8(KNOWLEDGE_SOURCE_STRING_MAX_BYTES).nullable(),
162
+ deepLink: boundedUtf8(KNOWLEDGE_SOURCE_URI_MAX_BYTES).pipe(z.string().min(1)).nullable(),
163
+ aclRevision: z.string().regex(/^[0-9a-f]{64}$/u),
164
+ authorizationObservedAt: z.string().datetime({ offset: true }),
165
+ authorizationExpiresAt: z.string().datetime({ offset: true }),
166
+ reauthorizedAt: z.string().datetime({ offset: true }),
167
+ });
168
+ export type KnowledgeProviderCitation = z.infer<typeof KnowledgeProviderCitation>;
169
+
170
+ export const KnowledgeLinkTarget = z.discriminatedUnion("kind", [
171
+ z.object({
172
+ kind: z.literal("knowledge"),
173
+ id: KnowledgeRecordId,
174
+ }),
175
+ z.object({
176
+ kind: z.literal("external"),
177
+ uri: boundedUtf8(KNOWLEDGE_SOURCE_URI_MAX_BYTES).pipe(z.string().min(1)),
178
+ }),
179
+ ]);
180
+ export type KnowledgeLinkTarget = z.infer<typeof KnowledgeLinkTarget>;
181
+
182
+ export const KnowledgeLink = z.object({
183
+ relation: z.enum(["parent", "contents", "previous", "next", "source"]),
184
+ target: KnowledgeLinkTarget,
185
+ });
186
+ export type KnowledgeLink = z.infer<typeof KnowledgeLink>;
187
+
188
+ /**
189
+ * Permission-safe agent projection over one flexible knowledge record. Scope,
190
+ * provenance, lifecycle, and stable identity are strict. The body and metadata
191
+ * stay source-shaped so varied company knowledge does not require one rigid
192
+ * taxonomy. Personal subject ids and inaccessible linked-record metadata are
193
+ * deliberately absent.
194
+ */
195
+ export const KnowledgeRecord = z.object({
196
+ id: KnowledgeRecordId,
197
+ kind: KnowledgeRecordKind,
198
+ title: boundedUtf8(KNOWLEDGE_TITLE_MAX_BYTES),
199
+ content: z.object({
200
+ format: z.literal("markdown"),
201
+ body: boundedUtf8(KNOWLEDGE_BODY_MAX_BYTES).nullable(),
202
+ summary: boundedUtf8(KNOWLEDGE_SUMMARY_MAX_BYTES).nullable(),
203
+ topics: z.array(boundedUtf8(KNOWLEDGE_TOPIC_MAX_BYTES)).max(KNOWLEDGE_TOPICS_MAX_ITEMS),
204
+ metadata: z.record(z.string(), z.unknown()).refine(boundedJson, {
205
+ message: "knowledge metadata exceeds its JSON projection boundary",
206
+ }),
207
+ }),
208
+ authority: KnowledgeAuthority,
209
+ provenance: z.object({
210
+ source: KnowledgeSource,
211
+ indexedAt: z.string(),
212
+ citation: KnowledgeProviderCitation.nullable().optional(),
213
+ }),
214
+ lifecycle: z.object({
215
+ state: z.literal("active"),
216
+ updatedAt: z.string(),
217
+ }),
218
+ quality: z.object({
219
+ trust: z.literal("sourced"),
220
+ freshnessAt: z.string(),
221
+ conflict: z.literal("not_evaluated"),
222
+ correction: z.literal("current_source_version"),
223
+ }),
224
+ links: z.array(KnowledgeLink).max(8),
225
+ projection: z.object({
226
+ truncated: z.boolean(),
227
+ fields: z
228
+ .array(
229
+ z.enum([
230
+ "title",
231
+ "content.body",
232
+ "content.summary",
233
+ "content.topics",
234
+ "content.metadata",
235
+ "provenance.source.uri",
236
+ "provenance.source.externalId",
237
+ "provenance.source.title",
238
+ "provenance.source.author",
239
+ "provenance.source.version",
240
+ "provenance.citation",
241
+ ]),
242
+ )
243
+ .max(11),
244
+ }),
245
+ });
246
+ export type KnowledgeRecord = z.infer<typeof KnowledgeRecord>;
247
+
248
+ export const KnowledgeSearchResult = z.object({
249
+ record: KnowledgeRecord,
250
+ retrieval: z.object({
251
+ /** Final bounded ordering score after the documented quality adjustment. */
252
+ score: z.number().min(0).max(1),
253
+ /** Semantic score before the quality adjustment. */
254
+ semanticScore: z.number().min(0).max(1),
255
+ matchType: z.enum(["hybrid", "vector", "keyword"]),
256
+ vectorScore: z.number().min(0).max(1).nullable(),
257
+ keywordScore: z.number().min(0).max(1).nullable(),
258
+ relevanceSignals: z
259
+ .array(z.enum(["vector", "keyword"]))
260
+ .min(1)
261
+ .max(2),
262
+ freshness: z.enum(["current", "aging", "stale"]),
263
+ qualityAdjustment: z.number().min(0).max(1),
264
+ duplicateCount: z.number().int().nonnegative(),
265
+ }),
266
+ });
267
+ export type KnowledgeSearchResult = z.infer<typeof KnowledgeSearchResult>;
268
+
269
+ export const KnowledgeSearchResponse = z.object({
270
+ results: z.array(KnowledgeSearchResult).max(KNOWLEDGE_SEARCH_MAX_RESULTS),
271
+ selection: z.object({
272
+ relevanceFloor: z.object({
273
+ policy: z.literal("any_signal"),
274
+ vectorScore: z.literal(KNOWLEDGE_SEARCH_MIN_VECTOR_SCORE),
275
+ keywordScore: z.literal(KNOWLEDGE_SEARCH_MIN_KEYWORD_SCORE),
276
+ }),
277
+ dedupe: z.object({
278
+ policy: z.literal("exact_textual_content"),
279
+ }),
280
+ candidates: z.object({
281
+ ranked: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_RESULTS),
282
+ rechecked: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_RESULTS),
283
+ omittedOnRecheck: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_RESULTS),
284
+ }),
285
+ omitted: z.object({
286
+ belowRelevanceFloor: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_FLOOR_OMISSIONS),
287
+ asDuplicate: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_RESULTS),
288
+ forLimit: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_RESULTS),
289
+ forResponseBudget: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_RESULTS),
290
+ }),
291
+ budget: z.object({
292
+ maxResults: z.literal(KNOWLEDGE_SEARCH_MAX_RESULTS),
293
+ maxResponseBytes: z.literal(KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES),
294
+ responseBytes: z.number().int().nonnegative().max(KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES),
295
+ tokenEstimateBytesPerToken: z.literal(KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN),
296
+ estimatedTokens: z.number().int().nonnegative(),
297
+ maxEstimatedTokens: z.literal(
298
+ Math.ceil(
299
+ KNOWLEDGE_SEARCH_MAX_RESPONSE_BYTES / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,
300
+ ),
301
+ ),
302
+ }),
303
+ }),
304
+ });
305
+ export type KnowledgeSearchResponse = z.infer<typeof KnowledgeSearchResponse>;
306
+
307
+ export const KnowledgeGetResponse = z.object({
308
+ record: KnowledgeRecord,
309
+ });
310
+ export type KnowledgeGetResponse = z.infer<typeof KnowledgeGetResponse>;
311
+
312
+ export const KnowledgeBrowseResponse = z.object({
313
+ records: z.array(KnowledgeRecord).max(KNOWLEDGE_BROWSE_MAX_LIMIT),
314
+ nextCursor: z.string().min(1).max(KNOWLEDGE_BROWSE_CURSOR_MAX_CHARS).nullable(),
315
+ hasMore: z.boolean(),
316
+ selection: z.object({
317
+ omitted: z.object({
318
+ forResponseBudget: z.number().int().nonnegative().max(KNOWLEDGE_BROWSE_MAX_LIMIT),
319
+ }),
320
+ compactedRecordCount: z.number().int().nonnegative().max(1),
321
+ budget: z.object({
322
+ maxResults: z.literal(KNOWLEDGE_BROWSE_MAX_LIMIT),
323
+ maxResponseBytes: z.literal(KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES),
324
+ responseBytes: z.number().int().nonnegative().max(KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES),
325
+ tokenEstimateBytesPerToken: z.literal(KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN),
326
+ estimatedTokens: z.number().int().nonnegative(),
327
+ maxEstimatedTokens: z.literal(
328
+ Math.ceil(
329
+ KNOWLEDGE_BROWSE_MAX_RESPONSE_BYTES / KNOWLEDGE_SEARCH_TOKEN_ESTIMATE_BYTES_PER_TOKEN,
330
+ ),
331
+ ),
332
+ }),
333
+ }),
334
+ });
335
+ export type KnowledgeBrowseResponse = z.infer<typeof KnowledgeBrowseResponse>;
@@ -0,0 +1,253 @@
1
+ import { z } from "zod";
2
+
3
+ export const MANAGED_AUTH_SESSION_SET_MAX_SLOTS = 8 as const;
4
+ export const MANAGED_AUTH_TRANSACTION_TTL_SECONDS = 600 as const;
5
+ export const MANAGED_AUTH_RETURN_INTENT_MAX_BYTES = 2_048 as const;
6
+ export const MANAGED_AUTH_SESSION_SET_API_CONTRACT_HEADER = "x-opengeni-api-contract" as const;
7
+ export const MANAGED_AUTH_SESSION_SET_API_CONTRACT_REVISION =
8
+ "2026-08-personal-only-organization-setup-v1" as const;
9
+
10
+ export const ManagedAuthSessionSetMode = z.enum(["legacy", "dual", "broker"]);
11
+ export type ManagedAuthSessionSetMode = z.infer<typeof ManagedAuthSessionSetMode>;
12
+
13
+ export const ManagedAuthLoginSlotState = z.enum(["active", "reauth_required"]);
14
+ export type ManagedAuthLoginSlotState = z.infer<typeof ManagedAuthLoginSlotState>;
15
+
16
+ export const ManagedAuthVerifiedClaim = z.object({
17
+ kind: z.literal("email"),
18
+ value: z.string().email().max(320),
19
+ });
20
+ export type ManagedAuthVerifiedClaim = z.infer<typeof ManagedAuthVerifiedClaim>;
21
+
22
+ /** Secret-free, browser-safe summary. Provider session ids and tokens never enter this shape. */
23
+ export const ManagedAuthLoginSlot = z.object({
24
+ id: z.string().uuid(),
25
+ displayName: z.string().min(1).max(256),
26
+ verifiedClaim: ManagedAuthVerifiedClaim,
27
+ state: ManagedAuthLoginSlotState,
28
+ });
29
+ export type ManagedAuthLoginSlot = z.infer<typeof ManagedAuthLoginSlot>;
30
+
31
+ export const ManagedAuthSessionSetState = z.enum(["ready", "actor_change_required"]);
32
+ export type ManagedAuthSessionSetState = z.infer<typeof ManagedAuthSessionSetState>;
33
+
34
+ export const ManagedAuthSessionSetProjection = z.object({
35
+ mode: ManagedAuthSessionSetMode,
36
+ generation: z.string().regex(/^[1-9][0-9]*$/),
37
+ actorEpoch: z.string().regex(/^[1-9][0-9]*$/),
38
+ csrfToken: z.string().min(32).max(512),
39
+ selectedSlotId: z.string().uuid().nullable(),
40
+ state: ManagedAuthSessionSetState,
41
+ slots: z.array(ManagedAuthLoginSlot).max(MANAGED_AUTH_SESSION_SET_MAX_SLOTS),
42
+ });
43
+ export type ManagedAuthSessionSetProjection = z.infer<typeof ManagedAuthSessionSetProjection>;
44
+
45
+ export const ManagedAuthOperationIdentity = z.object({
46
+ operationId: z.string().uuid(),
47
+ expectedGeneration: z.string().regex(/^[1-9][0-9]*$/),
48
+ });
49
+ export type ManagedAuthOperationIdentity = z.infer<typeof ManagedAuthOperationIdentity>;
50
+
51
+ export const BootstrapManagedAuthSessionSetRequest = ManagedAuthOperationIdentity;
52
+ export type BootstrapManagedAuthSessionSetRequest = z.infer<
53
+ typeof BootstrapManagedAuthSessionSetRequest
54
+ >;
55
+
56
+ export const ManagedAuthReturnIntent = z
57
+ .string()
58
+ .min(1)
59
+ .superRefine((value, context) => {
60
+ if (new TextEncoder().encode(value).byteLength > MANAGED_AUTH_RETURN_INTENT_MAX_BYTES) {
61
+ context.addIssue({ code: "custom", message: "return intent exceeds its UTF-8 byte limit" });
62
+ }
63
+ if (
64
+ !value.startsWith("/") ||
65
+ value.startsWith("//") ||
66
+ value.includes("?") ||
67
+ value.includes("#") ||
68
+ /[\u0000-\u001f\u007f\\]/.test(value)
69
+ ) {
70
+ context.addIssue({
71
+ code: "custom",
72
+ message: "return intent must be a safe same-origin path",
73
+ });
74
+ return;
75
+ }
76
+ try {
77
+ const parsed = new URL(value, "https://opengeni.invalid");
78
+ const uuid = "[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}";
79
+ const supportedPath = new RegExp(
80
+ `^/(?:sessions/${uuid}|workspaces/${uuid}(?:/sessions(?:/${uuid})?)?)$`,
81
+ "i",
82
+ );
83
+ if (
84
+ parsed.origin !== "https://opengeni.invalid" ||
85
+ parsed.username ||
86
+ parsed.password ||
87
+ parsed.search ||
88
+ parsed.hash ||
89
+ !supportedPath.test(value) ||
90
+ parsed.pathname !== value
91
+ ) {
92
+ context.addIssue({
93
+ code: "custom",
94
+ message: "return intent contains unsafe authority data",
95
+ });
96
+ }
97
+ } catch {
98
+ context.addIssue({
99
+ code: "custom",
100
+ message: "return intent is not a valid same-origin path",
101
+ });
102
+ }
103
+ });
104
+
105
+ export const BeginManagedAuthLoginTransactionRequest = ManagedAuthOperationIdentity.extend({
106
+ kind: z.enum(["add", "reauth"]),
107
+ slotId: z.string().uuid().optional(),
108
+ returnIntent: ManagedAuthReturnIntent.optional(),
109
+ }).superRefine((value, context) => {
110
+ if ((value.kind === "reauth") !== Boolean(value.slotId)) {
111
+ context.addIssue({
112
+ code: "custom",
113
+ path: ["slotId"],
114
+ message: "reauth requires exactly one slot id and add forbids one",
115
+ });
116
+ }
117
+ });
118
+ export type BeginManagedAuthLoginTransactionRequest = z.infer<
119
+ typeof BeginManagedAuthLoginTransactionRequest
120
+ >;
121
+
122
+ export const ManagedAuthLoginTransaction = z.object({
123
+ id: z.string().uuid(),
124
+ kind: z.enum(["add", "reauth"]),
125
+ expiresAt: z.string().datetime(),
126
+ returnIntentId: z.string().uuid().nullable(),
127
+ });
128
+ export type ManagedAuthLoginTransaction = z.infer<typeof ManagedAuthLoginTransaction>;
129
+
130
+ export const ManagedAuthSocialProvider = z.enum(["google", "github"]);
131
+ export type ManagedAuthSocialProvider = z.infer<typeof ManagedAuthSocialProvider>;
132
+
133
+ /**
134
+ * Mirrors `SignupAttribution` from `./signup-attribution` (a contract test pins
135
+ * them together). Declared here, not imported, so the browser session-set
136
+ * client does not pull the attribution module into a new shared web chunk.
137
+ */
138
+ const SocialStartAttributionValue = z
139
+ .string()
140
+ .trim()
141
+ .min(1)
142
+ .max(100)
143
+ .regex(/^[A-Za-z0-9._~+-]+$/);
144
+ const SocialStartAttribution = z
145
+ .object({
146
+ utmSource: SocialStartAttributionValue.optional(),
147
+ utmMedium: SocialStartAttributionValue.optional(),
148
+ utmCampaign: SocialStartAttributionValue.optional(),
149
+ utmContent: SocialStartAttributionValue.optional(),
150
+ ref: SocialStartAttributionValue.optional(),
151
+ })
152
+ .strict();
153
+
154
+ export const StartManagedAuthSocialTransactionRequest = ManagedAuthOperationIdentity.extend({
155
+ transactionId: z.string().uuid(),
156
+ provider: ManagedAuthSocialProvider,
157
+ /**
158
+ * Optional untrusted first-touch campaign tokens, used only by the
159
+ * content-free sign-up acquisition counter when this start creates a new
160
+ * account. Invalid attribution is dropped rather than failing the sign-in.
161
+ */
162
+ attribution: SocialStartAttribution.optional().catch(undefined),
163
+ });
164
+ export type StartManagedAuthSocialTransactionRequest = z.infer<
165
+ typeof StartManagedAuthSocialTransactionRequest
166
+ >;
167
+
168
+ export const StartManagedAuthSocialTransactionResponse = z.object({
169
+ url: z.string().url().max(4_096),
170
+ });
171
+ export type StartManagedAuthSocialTransactionResponse = z.infer<
172
+ typeof StartManagedAuthSocialTransactionResponse
173
+ >;
174
+
175
+ export const CompleteManagedAuthEmailPasswordTransactionRequest =
176
+ ManagedAuthOperationIdentity.extend({
177
+ transactionId: z.string().uuid(),
178
+ email: z.string().email().max(320),
179
+ password: z.string().min(1).max(1_024),
180
+ });
181
+ export type CompleteManagedAuthEmailPasswordTransactionRequest = z.infer<
182
+ typeof CompleteManagedAuthEmailPasswordTransactionRequest
183
+ >;
184
+
185
+ export const CompleteManagedAuthLoginTransactionResponse = z.object({
186
+ projection: ManagedAuthSessionSetProjection,
187
+ returnIntent: ManagedAuthReturnIntent.nullable(),
188
+ });
189
+ export type CompleteManagedAuthLoginTransactionResponse = z.infer<
190
+ typeof CompleteManagedAuthLoginTransactionResponse
191
+ >;
192
+
193
+ export const CancelManagedAuthLoginTransactionRequest = ManagedAuthOperationIdentity.extend({
194
+ transactionId: z.string().uuid(),
195
+ });
196
+ export type CancelManagedAuthLoginTransactionRequest = z.infer<
197
+ typeof CancelManagedAuthLoginTransactionRequest
198
+ >;
199
+
200
+ export const SelectManagedAuthLoginSlotRequest = ManagedAuthOperationIdentity.extend({
201
+ slotId: z.string().uuid(),
202
+ });
203
+ export type SelectManagedAuthLoginSlotRequest = z.infer<typeof SelectManagedAuthLoginSlotRequest>;
204
+
205
+ export const LogoutManagedAuthLoginSlotRequest = ManagedAuthOperationIdentity.extend({
206
+ slotId: z.string().uuid(),
207
+ replacementSlotId: z.string().uuid().nullable(),
208
+ });
209
+ export type LogoutManagedAuthLoginSlotRequest = z.infer<typeof LogoutManagedAuthLoginSlotRequest>;
210
+
211
+ export const LogoutManagedAuthSessionSetRequest = ManagedAuthOperationIdentity;
212
+ export type LogoutManagedAuthSessionSetRequest = z.infer<typeof LogoutManagedAuthSessionSetRequest>;
213
+
214
+ export const ManagedAuthLogoutAllReceipt = z.object({
215
+ generation: z.string().regex(/^[1-9][0-9]*$/),
216
+ actorEpoch: z.string().regex(/^[1-9][0-9]*$/),
217
+ state: z.literal("logged_out"),
218
+ });
219
+ export type ManagedAuthLogoutAllReceipt = z.infer<typeof ManagedAuthLogoutAllReceipt>;
220
+
221
+ export const ResolveManagedAuthDeepLinkRequest = z.object({
222
+ path: ManagedAuthReturnIntent,
223
+ });
224
+ export type ResolveManagedAuthDeepLinkRequest = z.infer<typeof ResolveManagedAuthDeepLinkRequest>;
225
+
226
+ export const ManagedAuthDeepLinkResolution = z.discriminatedUnion("kind", [
227
+ z.object({ kind: z.literal("current") }),
228
+ z.object({ kind: z.literal("switch_required"), slot: ManagedAuthLoginSlot }),
229
+ z.object({ kind: z.literal("unavailable") }),
230
+ ]);
231
+ export type ManagedAuthDeepLinkResolution = z.infer<typeof ManagedAuthDeepLinkResolution>;
232
+
233
+ export const ManagedAuthSessionSetErrorCode = z.enum([
234
+ "actor_change_required",
235
+ "actor_mutation_in_flight",
236
+ "api_contract_changed",
237
+ "browser_session_set_required",
238
+ "browser_session_set_unavailable",
239
+ "generation_conflict",
240
+ "invalid_browser_session_set_request",
241
+ "invalid_transaction",
242
+ "managed_authentication_required",
243
+ "managed_authentication_unavailable",
244
+ "operation_outcome_unknown",
245
+ "operation_reused",
246
+ "origin_rejected",
247
+ "login_transaction_rate_limited",
248
+ "provider_route_blocked",
249
+ "slot_limit_reached",
250
+ "slot_already_exists",
251
+ "slot_unavailable",
252
+ ]);
253
+ export type ManagedAuthSessionSetErrorCode = z.infer<typeof ManagedAuthSessionSetErrorCode>;
@@ -0,0 +1,37 @@
1
+ import { z } from "zod";
2
+
3
+ export const ManagedSignInProvider = z.enum(["google", "github"]);
4
+ export const ManagedSignInMethods = z.object({
5
+ identityId: z.string().uuid(),
6
+ email: z.string().email(),
7
+ emailVerified: z.boolean(),
8
+ identityRevision: z.number().int().positive(),
9
+ freshAuthenticationRequired: z.boolean(),
10
+ methods: z.array(
11
+ z.object({
12
+ provider: z.enum(["credential", "google", "github"]),
13
+ connected: z.boolean(),
14
+ available: z.boolean(),
15
+ canDisconnect: z.boolean(),
16
+ implicitRelinkingSuppressed: z.boolean(),
17
+ }),
18
+ ),
19
+ });
20
+ export type ManagedSignInMethods = z.infer<typeof ManagedSignInMethods>;
21
+ export const ManagedSignInMutation = z.object({
22
+ expectedIdentityId: z.string().uuid(),
23
+ operationId: z.string().uuid(),
24
+ expectedIdentityRevision: z.number().int().positive(),
25
+ });
26
+ export const ManagedSignInProviderMutation = ManagedSignInMutation.extend({
27
+ provider: ManagedSignInProvider,
28
+ }).strict();
29
+ export const ManagedSignInPasswordMutation = ManagedSignInMutation.extend({
30
+ newPassword: z.string().min(8).max(128),
31
+ currentPassword: z.string().min(1).max(1024).optional(),
32
+ }).strict();
33
+ export const ManagedSignInMutationResponse = z.object({
34
+ reauthenticationRequired: z.literal(true),
35
+ notification: z.enum(["sent", "failed", "outcome_unknown"]),
36
+ });
37
+ export const ManagedSignInConnectResponse = z.object({ url: z.string().url() });
@@ -0,0 +1,2 @@
1
+ /** Shared discovery and explicit permission-selection count allowance. */
2
+ export const MCP_MAX_CATALOG_TOOL_ENTRIES = 4_096;
@@ -0,0 +1,30 @@
1
+ /** Exact endpoint identity: normalize URL syntax, preserve paths and query parameters. */
2
+ export function mcpEndpointIdentity(value: string | null | undefined): string | null {
3
+ if (!value) return null;
4
+ try {
5
+ const url = new URL(value);
6
+ if (!["https:", "http:"].includes(url.protocol) || url.username || url.password) return null;
7
+ url.hash = "";
8
+ return url.href;
9
+ } catch {
10
+ return null;
11
+ }
12
+ }
13
+
14
+ export function pluginMcpUnavailableReason(server: {
15
+ endpoint: string | null;
16
+ transport?: string;
17
+ requiresConfiguration?: boolean;
18
+ }): string | null {
19
+ if (server.transport === "stdio" || !server.endpoint) return "Requires a local runtime";
20
+ if (
21
+ server.transport &&
22
+ !["http", "streamable-http", "streamable_http"].includes(server.transport)
23
+ )
24
+ return "Unsupported transport: " + server.transport;
25
+ if (server.requiresConfiguration || server.endpoint.includes("{"))
26
+ return "Requires custom connection configuration";
27
+ const endpoint = mcpEndpointIdentity(server.endpoint);
28
+ if (!endpoint?.startsWith("https://")) return "Requires a valid HTTPS endpoint";
29
+ return null;
30
+ }