@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,186 @@
1
+ import { z } from "zod";
2
+
3
+ const Uuid = z.string().uuid();
4
+ const Timestamp = z.string().datetime({ offset: true });
5
+
6
+ export const OrganizationRecoveryPolicyState = z.enum([
7
+ "pending_acceptance",
8
+ "active",
9
+ "degraded",
10
+ "superseded",
11
+ "disabled",
12
+ ]);
13
+ export type OrganizationRecoveryPolicyState = z.infer<typeof OrganizationRecoveryPolicyState>;
14
+
15
+ export const OrganizationRecoveryOperationState = z.enum([
16
+ "collecting",
17
+ "cooling",
18
+ "executed",
19
+ "cancelled",
20
+ "expired",
21
+ "superseded",
22
+ ]);
23
+ export type OrganizationRecoveryOperationState = z.infer<typeof OrganizationRecoveryOperationState>;
24
+
25
+ export const OrganizationRecoveryUnavailableReason = z.enum([
26
+ "no_policy",
27
+ "pending_acceptance",
28
+ "degraded",
29
+ "disabled",
30
+ "identity_unavailable",
31
+ ]);
32
+ export type OrganizationRecoveryUnavailableReason = z.infer<
33
+ typeof OrganizationRecoveryUnavailableReason
34
+ >;
35
+
36
+ export const OrganizationRecoveryMemberSummary = z
37
+ .object({
38
+ membershipId: Uuid,
39
+ name: z.string().trim().min(1).max(1024).nullable(),
40
+ email: z.string().email().max(320).nullable(),
41
+ })
42
+ .strict();
43
+ export type OrganizationRecoveryMemberSummary = z.infer<typeof OrganizationRecoveryMemberSummary>;
44
+
45
+ export const OrganizationRecoveryCustodian = OrganizationRecoveryMemberSummary.extend({
46
+ ordinal: z.number().int().min(1).max(3),
47
+ enrollmentState: z.enum(["pending_acceptance", "accepted", "ineligible"]),
48
+ acceptedAt: Timestamp.nullable(),
49
+ }).strict();
50
+ export type OrganizationRecoveryCustodian = z.infer<typeof OrganizationRecoveryCustodian>;
51
+
52
+ export const OrganizationRecoveryPolicy = z
53
+ .object({
54
+ id: Uuid,
55
+ organizationId: Uuid,
56
+ revision: z.number().int().positive(),
57
+ state: OrganizationRecoveryPolicyState,
58
+ custodians: z.array(OrganizationRecoveryCustodian).length(3),
59
+ createdAt: Timestamp,
60
+ updatedAt: Timestamp,
61
+ })
62
+ .strict();
63
+ export type OrganizationRecoveryPolicy = z.infer<typeof OrganizationRecoveryPolicy>;
64
+
65
+ export const OrganizationRecoveryApproval = OrganizationRecoveryMemberSummary.extend({
66
+ approvedAt: Timestamp,
67
+ }).strict();
68
+ export type OrganizationRecoveryApproval = z.infer<typeof OrganizationRecoveryApproval>;
69
+
70
+ export const OrganizationRecoveryOperation = z
71
+ .object({
72
+ id: Uuid,
73
+ organizationId: Uuid,
74
+ policyId: Uuid,
75
+ policyRevision: z.number().int().positive(),
76
+ revision: z.number().int().positive(),
77
+ state: OrganizationRecoveryOperationState,
78
+ target: OrganizationRecoveryMemberSummary,
79
+ approvals: z.array(OrganizationRecoveryApproval).max(3),
80
+ approvalCount: z.number().int().min(0).max(3),
81
+ quorumAt: Timestamp.nullable(),
82
+ executableAt: Timestamp.nullable(),
83
+ expiresAt: Timestamp,
84
+ executedAt: Timestamp.nullable(),
85
+ cancelledAt: Timestamp.nullable(),
86
+ notificationJournaled: z.boolean(),
87
+ createdAt: Timestamp,
88
+ updatedAt: Timestamp,
89
+ })
90
+ .strict();
91
+ export type OrganizationRecoveryOperation = z.infer<typeof OrganizationRecoveryOperation>;
92
+
93
+ export const OrganizationRecoveryCapabilities = z
94
+ .object({
95
+ configure: z.boolean(),
96
+ accept: z.boolean(),
97
+ disable: z.boolean(),
98
+ start: z.boolean(),
99
+ approve: z.boolean(),
100
+ cancel: z.boolean(),
101
+ execute: z.boolean(),
102
+ })
103
+ .strict();
104
+ export type OrganizationRecoveryCapabilities = z.infer<typeof OrganizationRecoveryCapabilities>;
105
+
106
+ export const OrganizationRecoveryOverview = z
107
+ .object({
108
+ organizationId: Uuid,
109
+ availability: z.enum(["available", "recovery_unavailable"]),
110
+ unavailableReason: OrganizationRecoveryUnavailableReason.nullable(),
111
+ recentReauthenticationAt: Timestamp.nullable(),
112
+ eligibleMembers: z.array(OrganizationRecoveryMemberSummary).max(1000),
113
+ policy: OrganizationRecoveryPolicy.nullable(),
114
+ operation: OrganizationRecoveryOperation.nullable(),
115
+ capabilities: OrganizationRecoveryCapabilities,
116
+ })
117
+ .strict();
118
+ export type OrganizationRecoveryOverview = z.infer<typeof OrganizationRecoveryOverview>;
119
+
120
+ const ExpectedPolicyRevision = z.number().int().nonnegative();
121
+ const ExpectedOperationRevision = z.number().int().positive();
122
+ const CommandOperationId = Uuid;
123
+
124
+ export const ConfigureOrganizationRecoveryPolicyRequest = z
125
+ .object({
126
+ custodianMembershipIds: z.tuple([Uuid, Uuid, Uuid]).superRefine((ids, context) => {
127
+ if (new Set(ids).size !== 3) {
128
+ context.addIssue({
129
+ code: "custom",
130
+ message: "recovery custodians must be three distinct memberships",
131
+ });
132
+ }
133
+ }),
134
+ expectedPolicyRevision: ExpectedPolicyRevision,
135
+ operationId: CommandOperationId,
136
+ })
137
+ .strict();
138
+ export type ConfigureOrganizationRecoveryPolicyRequest = z.infer<
139
+ typeof ConfigureOrganizationRecoveryPolicyRequest
140
+ >;
141
+
142
+ export const AcceptOrganizationRecoveryCustodyRequest = z
143
+ .object({
144
+ expectedPolicyRevision: ExpectedPolicyRevision,
145
+ operationId: CommandOperationId,
146
+ })
147
+ .strict();
148
+ export type AcceptOrganizationRecoveryCustodyRequest = z.infer<
149
+ typeof AcceptOrganizationRecoveryCustodyRequest
150
+ >;
151
+
152
+ export const DisableOrganizationRecoveryPolicyRequest = AcceptOrganizationRecoveryCustodyRequest;
153
+ export type DisableOrganizationRecoveryPolicyRequest = z.infer<
154
+ typeof DisableOrganizationRecoveryPolicyRequest
155
+ >;
156
+
157
+ export const StartOrganizationRecoveryOperationRequest = z
158
+ .object({
159
+ targetMembershipId: Uuid,
160
+ expectedPolicyRevision: z.number().int().positive(),
161
+ operationId: CommandOperationId,
162
+ })
163
+ .strict();
164
+ export type StartOrganizationRecoveryOperationRequest = z.infer<
165
+ typeof StartOrganizationRecoveryOperationRequest
166
+ >;
167
+
168
+ export const OrganizationRecoveryOperationCommandRequest = z
169
+ .object({
170
+ expectedOperationRevision: ExpectedOperationRevision,
171
+ operationId: CommandOperationId,
172
+ })
173
+ .strict();
174
+ export type OrganizationRecoveryOperationCommandRequest = z.infer<
175
+ typeof OrganizationRecoveryOperationCommandRequest
176
+ >;
177
+
178
+ export const OrganizationRecoveryMutationResponse = z
179
+ .object({
180
+ replay: z.boolean(),
181
+ overview: OrganizationRecoveryOverview,
182
+ })
183
+ .strict();
184
+ export type OrganizationRecoveryMutationResponse = z.infer<
185
+ typeof OrganizationRecoveryMutationResponse
186
+ >;
@@ -0,0 +1,79 @@
1
+ import { z } from "zod";
2
+
3
+ export const OrganizationUsagePeriod = z.enum(["today", "week", "month", "ytd"]);
4
+ export type OrganizationUsagePeriod = z.infer<typeof OrganizationUsagePeriod>;
5
+ export const OrganizationUsageQuery = z.object({
6
+ period: OrganizationUsagePeriod.default("month"),
7
+ });
8
+ export const OrganizationUsageWorkspacePageQuery = OrganizationUsageQuery.extend({
9
+ until: z.string().datetime(),
10
+ afterWorkspaceId: z.string().uuid().optional(),
11
+ });
12
+ // PostgreSQL SUM(bigint) must never pass through a JavaScript number.
13
+ export const OrganizationUsageTotal = z.object({
14
+ eventType: z.string(),
15
+ unit: z.string(),
16
+ quantity: z.string().regex(/^-?\d+$/),
17
+ eventCount: z.string().regex(/^\d+$/),
18
+ });
19
+ /** One member's Personal workspace, as usage only. */
20
+ export const OrganizationUsagePersonalWorkspace = z.object({
21
+ membershipId: z.string().uuid(),
22
+ totals: z.array(OrganizationUsageTotal),
23
+ });
24
+ export type OrganizationUsagePersonalWorkspace = z.infer<typeof OrganizationUsagePersonalWorkspace>;
25
+ export const OrganizationUsageSummary = z.object({
26
+ accountId: z.string().uuid(),
27
+ period: OrganizationUsagePeriod,
28
+ since: z.string().datetime(),
29
+ until: z.string().datetime(),
30
+ granularity: z.enum(["hour", "day"]),
31
+ totals: z.array(OrganizationUsageTotal),
32
+ buckets: z.array(z.object({ bucket: z.string(), totals: z.array(OrganizationUsageTotal) })),
33
+ workspaces: z
34
+ .array(
35
+ z.object({
36
+ workspaceId: z.string().uuid(),
37
+ name: z.string().nullable(),
38
+ totals: z.array(OrganizationUsageTotal),
39
+ }),
40
+ )
41
+ .max(50),
42
+ nextWorkspaceCursor: z.string().uuid().nullable(),
43
+ /**
44
+ * Usage in each member's Personal workspace, keyed by the owner's
45
+ * organization membership: amounts only, never the workspace's id, name or
46
+ * content. Only Personal workspaces with usage in the period, the 50 that
47
+ * spent the most. Absent before migration 0543, hence the defaults.
48
+ */
49
+ personalWorkspaces: z.array(OrganizationUsagePersonalWorkspace).max(50).default([]),
50
+ /** How many Personal workspaces had usage in the period, listed or not. */
51
+ personalWorkspaceCount: z.number().int().nonnegative().default(0),
52
+ /** Other people's Only-me chats in shared workspaces: member amounts only. */
53
+ privateChats: z
54
+ .array(
55
+ z.object({
56
+ workspaceId: z.string().uuid(),
57
+ membershipId: z.string().uuid().nullable(),
58
+ name: z.string().nullable(),
59
+ totals: z.array(OrganizationUsageTotal),
60
+ }),
61
+ )
62
+ .default([]),
63
+ privateChatsTruncated: z.boolean().default(false),
64
+ });
65
+ export type OrganizationUsageSummary = z.infer<typeof OrganizationUsageSummary>;
66
+
67
+ /**
68
+ * A page deliberately excludes totals, charts and Personal rows: those are not
69
+ * recomputed. Pages continue the shared workspaces only.
70
+ */
71
+ export const OrganizationUsageWorkspacePage = OrganizationUsageSummary.omit({
72
+ totals: true,
73
+ buckets: true,
74
+ personalWorkspaces: true,
75
+ personalWorkspaceCount: true,
76
+ privateChats: true,
77
+ privateChatsTruncated: true,
78
+ });
79
+ export type OrganizationUsageWorkspacePage = z.infer<typeof OrganizationUsageWorkspacePage>;
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+
3
+ /** Canonical public permission vocabulary shared by operational and control-plane contracts. */
4
+ export const Permission = z.enum([
5
+ "account:read",
6
+ "account:admin",
7
+ "members:manage",
8
+ "workspace:create",
9
+ "billing:read",
10
+ "billing:manage",
11
+ "workspace:read",
12
+ "workspace:admin",
13
+ "sessions:create",
14
+ "sessions:read",
15
+ "sessions:control",
16
+ "stream:view",
17
+ "stream:control",
18
+ "stream:acknowledge",
19
+ "files:upload",
20
+ "files:read",
21
+ "files:write",
22
+ "terminal:attach",
23
+ "documents:manage",
24
+ "documents:search",
25
+ "scheduled_tasks:manage",
26
+ "scheduled_tasks:run",
27
+ "github:manage",
28
+ "github:use",
29
+ "api_keys:manage",
30
+ /** Literal organization-key authority to configure workspace usage allowances. */
31
+ "usage_allowances:manage",
32
+ "connections:read",
33
+ "connections:write",
34
+ "capabilities:manage",
35
+ /** @deprecated alias of variable-sets:manage */
36
+ "environments:manage",
37
+ /** @deprecated alias of variable-sets:use */
38
+ "environments:use",
39
+ "variable-sets:list",
40
+ "variable-sets:read",
41
+ "variable-sets:write",
42
+ "variable-sets:manage",
43
+ "variable-sets:attach",
44
+ "variable-sets:use",
45
+ "secrets:list",
46
+ "secrets:read",
47
+ "secrets:write",
48
+ "mcp_servers:attach",
49
+ "codemode:call",
50
+ "goals:manage",
51
+ "enrollments:read",
52
+ "enrollments:manage",
53
+ "rigs:use",
54
+ "rigs:manage",
55
+ "artifacts:read",
56
+ "artifacts:publish",
57
+ ]);
58
+ export type Permission = z.infer<typeof Permission>;
@@ -0,0 +1,267 @@
1
+ import { z } from "zod";
2
+
3
+ import { ConnectionMetadata } from "./index";
4
+
5
+ export const PERSONAL_GITHUB_PROVIDER_DOMAIN = "github.com" as const;
6
+ export const PERSONAL_GITHUB_PROVIDER_FAMILY = "github" as const;
7
+ export const PERSONAL_GITHUB_CREDENTIAL_ROLE = "opengeni_github_personal" as const;
8
+ export const PERSONAL_GITHUB_CONNECTION_SURFACE_ID = "github:personal" as const;
9
+ export const PERSONAL_GITHUB_REQUESTED_SCOPES = ["repo"] as const;
10
+ export const PERSONAL_GITHUB_AUTHORIZATION_URL =
11
+ "https://github.com/login/oauth/authorize" as const;
12
+ export const PERSONAL_GITHUB_TOKEN_URL = "https://github.com/login/oauth/access_token" as const;
13
+ export const PERSONAL_GITHUB_USER_URL = "https://api.github.com/user" as const;
14
+ export const PERSONAL_GITHUB_API_ORIGIN = "https://api.github.com" as const;
15
+ export const PERSONAL_GITHUB_REPOSITORY_CATALOG_MAX = 100 as const;
16
+
17
+ export const PersonalGitHubRepositoryId = z.string().regex(/^[1-9]\d*$/u);
18
+ export type PersonalGitHubRepositoryId = z.infer<typeof PersonalGitHubRepositoryId>;
19
+
20
+ export const PersonalGitHubRepositoryAccess = z.enum(["read", "write"]);
21
+ export type PersonalGitHubRepositoryAccess = z.infer<typeof PersonalGitHubRepositoryAccess>;
22
+
23
+ export const PersonalGitHubRepositoryPermissions = z
24
+ .object({
25
+ pull: z.boolean(),
26
+ push: z.boolean(),
27
+ admin: z.boolean(),
28
+ maintain: z.boolean(),
29
+ triage: z.boolean(),
30
+ })
31
+ .strict();
32
+ export type PersonalGitHubRepositoryPermissions = z.infer<
33
+ typeof PersonalGitHubRepositoryPermissions
34
+ >;
35
+
36
+ export const PersonalGitHubRepositoryVisibility = z.enum(["public", "private", "internal"]);
37
+ export type PersonalGitHubRepositoryVisibility = z.infer<typeof PersonalGitHubRepositoryVisibility>;
38
+
39
+ const PersonalGitHubRepositoryFullName = z
40
+ .string()
41
+ .min(3)
42
+ .max(140)
43
+ .regex(/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})\/[A-Za-z0-9_.-]{1,100}$/u);
44
+
45
+ export function canonicalPersonalGitHubRepositoryUrl(fullName: string): string {
46
+ return `https://github.com/${fullName}`;
47
+ }
48
+
49
+ /** A bounded, credential-free projection verified directly against GitHub. */
50
+ export const PersonalGitHubRepository = z
51
+ .object({
52
+ repositoryId: PersonalGitHubRepositoryId,
53
+ fullName: PersonalGitHubRepositoryFullName,
54
+ canonicalUrl: z.string().url().max(512),
55
+ defaultBranch: z.string().min(1).max(255),
56
+ visibility: PersonalGitHubRepositoryVisibility,
57
+ private: z.boolean(),
58
+ archived: z.boolean(),
59
+ disabled: z.boolean(),
60
+ permissions: PersonalGitHubRepositoryPermissions,
61
+ })
62
+ .strict()
63
+ .superRefine((repository, context) => {
64
+ if (repository.canonicalUrl !== canonicalPersonalGitHubRepositoryUrl(repository.fullName)) {
65
+ context.addIssue({
66
+ code: "custom",
67
+ path: ["canonicalUrl"],
68
+ message: "canonicalUrl must be derived from fullName",
69
+ });
70
+ }
71
+ if (repository.private !== (repository.visibility === "private")) {
72
+ context.addIssue({
73
+ code: "custom",
74
+ path: ["private"],
75
+ message: "private must agree with visibility",
76
+ });
77
+ }
78
+ });
79
+ export type PersonalGitHubRepository = z.infer<typeof PersonalGitHubRepository>;
80
+
81
+ export const PersonalGitHubSelectedRepository = PersonalGitHubRepository.safeExtend({
82
+ selectedAccess: PersonalGitHubRepositoryAccess,
83
+ selectionGeneration: z.number().int().positive(),
84
+ selectedAt: z.string().datetime({ offset: true }),
85
+ lastVerifiedAt: z.string().datetime({ offset: true }),
86
+ }).strict();
87
+ export type PersonalGitHubSelectedRepository = z.infer<typeof PersonalGitHubSelectedRepository>;
88
+
89
+ export const PersonalGitHubRepositorySelectionState = z
90
+ .object({
91
+ connectionAuthorityGeneration: z.number().int().positive(),
92
+ credentialBindingId: z.string().uuid(),
93
+ providerPrincipalId: PersonalGitHubRepositoryId,
94
+ selectionGeneration: z.number().int().nonnegative(),
95
+ repositories: z
96
+ .array(PersonalGitHubSelectedRepository)
97
+ .max(PERSONAL_GITHUB_REPOSITORY_CATALOG_MAX),
98
+ })
99
+ .strict();
100
+ export type PersonalGitHubRepositorySelectionState = z.infer<
101
+ typeof PersonalGitHubRepositorySelectionState
102
+ >;
103
+
104
+ export const ListPersonalGitHubRepositoriesQuery = z
105
+ .object({
106
+ cursor: z.coerce.number().int().positive().max(10_000).default(1),
107
+ limit: z.coerce.number().int().min(1).max(PERSONAL_GITHUB_REPOSITORY_CATALOG_MAX).default(50),
108
+ })
109
+ .strict();
110
+ export type ListPersonalGitHubRepositoriesQuery = z.infer<
111
+ typeof ListPersonalGitHubRepositoriesQuery
112
+ >;
113
+
114
+ export const PersonalGitHubRepositoryCatalogItem = PersonalGitHubRepository.safeExtend({
115
+ selectedAccess: PersonalGitHubRepositoryAccess.nullable(),
116
+ }).strict();
117
+ export type PersonalGitHubRepositoryCatalogItem = z.infer<
118
+ typeof PersonalGitHubRepositoryCatalogItem
119
+ >;
120
+
121
+ export const ListPersonalGitHubRepositoriesResponse = z
122
+ .object({
123
+ repositories: z
124
+ .array(PersonalGitHubRepositoryCatalogItem)
125
+ .max(PERSONAL_GITHUB_REPOSITORY_CATALOG_MAX),
126
+ nextCursor: z.number().int().positive().nullable(),
127
+ selection: PersonalGitHubRepositorySelectionState,
128
+ })
129
+ .strict();
130
+ export type ListPersonalGitHubRepositoriesResponse = z.infer<
131
+ typeof ListPersonalGitHubRepositoriesResponse
132
+ >;
133
+
134
+ export const PersonalGitHubRepositorySelectionInput = z
135
+ .object({
136
+ repositoryId: PersonalGitHubRepositoryId,
137
+ fullName: PersonalGitHubRepositoryFullName,
138
+ access: PersonalGitHubRepositoryAccess,
139
+ })
140
+ .strict();
141
+ export type PersonalGitHubRepositorySelectionInput = z.infer<
142
+ typeof PersonalGitHubRepositorySelectionInput
143
+ >;
144
+
145
+ export const ReplacePersonalGitHubRepositorySelectionsRequest = z
146
+ .object({
147
+ expectedConnectionAuthorityGeneration: z.number().int().positive(),
148
+ expectedSelectionGeneration: z.number().int().nonnegative(),
149
+ idempotencyKey: z.string().trim().min(1).max(200),
150
+ repositories: z
151
+ .array(PersonalGitHubRepositorySelectionInput)
152
+ .max(PERSONAL_GITHUB_REPOSITORY_CATALOG_MAX),
153
+ })
154
+ .strict()
155
+ .superRefine((request, context) => {
156
+ const repositoryIds = new Set<string>();
157
+ const fullNames = new Set<string>();
158
+ request.repositories.forEach((repository, index) => {
159
+ const normalizedFullName = repository.fullName.toLowerCase();
160
+ if (repositoryIds.has(repository.repositoryId)) {
161
+ context.addIssue({
162
+ code: "custom",
163
+ path: ["repositories", index, "repositoryId"],
164
+ message: "repositoryId must be unique",
165
+ });
166
+ }
167
+ if (fullNames.has(normalizedFullName)) {
168
+ context.addIssue({
169
+ code: "custom",
170
+ path: ["repositories", index, "fullName"],
171
+ message: "fullName must be unique",
172
+ });
173
+ }
174
+ repositoryIds.add(repository.repositoryId);
175
+ fullNames.add(normalizedFullName);
176
+ });
177
+ });
178
+ export type ReplacePersonalGitHubRepositorySelectionsRequest = z.infer<
179
+ typeof ReplacePersonalGitHubRepositorySelectionsRequest
180
+ >;
181
+
182
+ export const VerifyPersonalGitHubRepositorySelectionsRequest = z
183
+ .object({
184
+ expectedConnectionAuthorityGeneration: z.number().int().positive(),
185
+ expectedSelectionGeneration: z.number().int().nonnegative(),
186
+ idempotencyKey: z.string().trim().min(1).max(200),
187
+ })
188
+ .strict();
189
+ export type VerifyPersonalGitHubRepositorySelectionsRequest = z.infer<
190
+ typeof VerifyPersonalGitHubRepositorySelectionsRequest
191
+ >;
192
+
193
+ /**
194
+ * Owner-visible, credential-free metadata for one dedicated personal GitHub
195
+ * OAuth connection. Repository selections are a separate authority and never
196
+ * live in this credential record.
197
+ */
198
+ export const PersonalGitHubConnectionMetadata = z
199
+ .object({
200
+ credentialRole: z.literal(PERSONAL_GITHUB_CREDENTIAL_ROLE),
201
+ providerFamily: z.literal(PERSONAL_GITHUB_PROVIDER_FAMILY),
202
+ providerPrincipalId: z.string().regex(/^\d+$/u),
203
+ githubUserId: z.string().regex(/^\d+$/u),
204
+ githubLogin: z.string().min(1).max(100),
205
+ oauthEnvironment: z.string().min(1).max(128),
206
+ oauthClientMarker: z.string().regex(/^[a-f0-9]{32}$/u),
207
+ credentialBindingId: z.string().uuid(),
208
+ connectedAt: z.string().datetime({ offset: true }),
209
+ lastVerifiedAt: z.string().datetime({ offset: true }),
210
+ disconnectedAt: z.string().datetime({ offset: true }).nullable().optional(),
211
+ refreshTokenExpiresAt: z.string().datetime({ offset: true }).nullable().optional(),
212
+ })
213
+ .passthrough();
214
+ export type PersonalGitHubConnectionMetadata = z.infer<typeof PersonalGitHubConnectionMetadata>;
215
+
216
+ export const PersonalGitHubOAuthStartRequest = z
217
+ .object({
218
+ /** Existing exact connection generation to re-authorize in place. */
219
+ connectionId: z.string().uuid().optional(),
220
+ /** Same-workspace UI path restored after the callback. */
221
+ returnPath: z.string().min(1).max(2048).optional(),
222
+ })
223
+ .strict();
224
+ export type PersonalGitHubOAuthStartRequest = z.infer<typeof PersonalGitHubOAuthStartRequest>;
225
+
226
+ export const PersonalGitHubOAuthStartResponse = z
227
+ .object({
228
+ authorizationUrl: z.string().url(),
229
+ expiresAt: z.string().datetime({ offset: true }),
230
+ })
231
+ .strict();
232
+ export type PersonalGitHubOAuthStartResponse = z.infer<typeof PersonalGitHubOAuthStartResponse>;
233
+
234
+ export const PersonalGitHubConnectionStatusResponse = z
235
+ .object({
236
+ enabled: z.boolean(),
237
+ connection: ConnectionMetadata.nullable(),
238
+ reviewUrl: z.string().url().nullable(),
239
+ })
240
+ .strict();
241
+ export type PersonalGitHubConnectionStatusResponse = z.infer<
242
+ typeof PersonalGitHubConnectionStatusResponse
243
+ >;
244
+
245
+ export const PersonalGitHubDisconnectRequest = z
246
+ .object({
247
+ expectedVersion: z.number().int().positive(),
248
+ idempotencyKey: z.string().trim().min(1).max(200),
249
+ })
250
+ .strict();
251
+ export type PersonalGitHubDisconnectRequest = z.infer<typeof PersonalGitHubDisconnectRequest>;
252
+
253
+ export function isPersonalGitHubConnection(
254
+ connection: Pick<z.infer<typeof ConnectionMetadata>, "providerDomain" | "kind" | "metadata">,
255
+ ): boolean {
256
+ return (
257
+ connection.providerDomain.toLowerCase() === PERSONAL_GITHUB_PROVIDER_DOMAIN &&
258
+ connection.kind === "oauth2" &&
259
+ PersonalGitHubConnectionMetadata.safeParse(connection.metadata).success
260
+ );
261
+ }
262
+
263
+ export function hasReservedPersonalGitHubMetadata(
264
+ metadata: Record<string, unknown> | undefined,
265
+ ): boolean {
266
+ return metadata?.credentialRole === PERSONAL_GITHUB_CREDENTIAL_ROLE;
267
+ }
@@ -0,0 +1,33 @@
1
+ /** Public discovery metadata; listing does not imply runtime compatibility. */
2
+ export { pluginMcpUnavailableReason } from "./mcp-endpoint";
3
+
4
+ export type PluginDiscoveryItem = {
5
+ id: string;
6
+ name: string;
7
+ displayName: string;
8
+ description: string;
9
+ longDescription: string;
10
+ provider: string;
11
+ category: string | null;
12
+ logoUrl: string | null;
13
+ darkLogoUrl: string | null;
14
+ sourceUrl: string | null;
15
+ author: { name?: string } | null;
16
+ version: string | null;
17
+ skills?: { name: string; sourceUrl: string }[] | null;
18
+ mcpServers?:
19
+ | {
20
+ name: string;
21
+ transport: string;
22
+ requiresConfiguration?: boolean;
23
+ endpoint: string | null;
24
+ }[]
25
+ | null;
26
+ components: string[] | null;
27
+ installation: string;
28
+ };
29
+ export type PluginDiscoveryPage = {
30
+ items: PluginDiscoveryItem[];
31
+ total: number;
32
+ nextOffset: number | null;
33
+ };
@@ -1,7 +1,7 @@
1
1
  import { z } from "zod";
2
2
 
3
3
  export const PREFERENCE_REGISTRY_CONTENT_MAX_CHARS = 262_144;
4
- export const PREFERENCE_REGISTRY_DESCRIPTOR_DESCRIPTION_MAX_CHARS = 240;
4
+ export const PREFERENCE_REGISTRY_DESCRIPTOR_DESCRIPTION_MAX_CHARS = 1024;
5
5
  export const PREFERENCE_REGISTRY_DESCRIPTOR_MAX_COUNT = 64;
6
6
  export const PREFERENCE_REGISTRY_DESCRIPTOR_MAX_UTF8_BYTES = 16_384;
7
7
  export const PREFERENCE_REGISTRY_REASON_MAX_CHARS = 4_096;
@@ -30,6 +30,8 @@ export const PreferenceRegistryProvenanceSource = z.enum([
30
30
  "slack",
31
31
  "meeting_transcript",
32
32
  "call_transcript",
33
+ "agent",
34
+ "portable_skill",
33
35
  ]);
34
36
  export type PreferenceRegistryProvenanceSource = z.infer<typeof PreferenceRegistryProvenanceSource>;
35
37
 
@@ -174,6 +176,11 @@ export const PreferenceRegistryEvent = z.object({
174
176
  });
175
177
  export type PreferenceRegistryEvent = z.infer<typeof PreferenceRegistryEvent>;
176
178
 
179
+ export const PreferenceRegistryActivationAuthority = z.enum(["human_confirmed", "automatic"]);
180
+ export type PreferenceRegistryActivationAuthority = z.infer<
181
+ typeof PreferenceRegistryActivationAuthority
182
+ >;
183
+
177
184
  export const PreferenceRegistryDescriptor = z.object({
178
185
  id: z.string().uuid(),
179
186
  stableKey: PreferenceRegistryStableKey,
@@ -185,6 +192,18 @@ export const PreferenceRegistryDescriptor = z.object({
185
192
  contentHash: hash,
186
193
  precedence: PreferenceRegistryPrecedence,
187
194
  provenance: PreferenceRegistryDescriptorProvenance,
195
+ // How the active revision became active, derived from the governed-learning
196
+ // activation receipt rather than stored on the revision. `provenance.trust`
197
+ // stays the frozen creation-time fact - a revision proposed by an agent is
198
+ // `untrusted_proposal` forever, which is correct and immutable - while this
199
+ // says whether a human explicitly confirmed the activation or policy
200
+ // activated it automatically. Null when the revision became active outside
201
+ // governed learning, so no receipt describes it.
202
+ // Defaulted, not merely nullable: snapshots written before this field
203
+ // existed are immutable and their stored JSON simply has no answer. Parsing
204
+ // those as null is the truthful reading, and it keeps their pinned
205
+ // descriptor hash valid because the stored text is untouched.
206
+ activationAuthority: PreferenceRegistryActivationAuthority.nullable().default(null),
188
207
  expiresAt: z.string().datetime().nullable(),
189
208
  retrievalHandle: z.string().min(1).max(512),
190
209
  });