@opengeni/contracts 3.1.0-canary.1 → 3.1.2

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 (434) hide show
  1. package/dist/agent-authored-durable-text.d.ts +9 -9
  2. package/dist/agent-config.d.ts +971 -0
  3. package/dist/agent-instruction-changes.d.ts +110 -0
  4. package/dist/agent-learning.d.ts +243 -0
  5. package/dist/allowance-refusal.d.ts +9 -0
  6. package/dist/allowance-refusal.js +50 -0
  7. package/dist/allowance-refusal.js.map +1 -0
  8. package/dist/analytics-consent-report.d.ts +19 -0
  9. package/dist/analytics-consent-report.js +10 -0
  10. package/dist/analytics-consent-report.js.map +1 -0
  11. package/dist/api-key-presets.d.ts +19 -0
  12. package/dist/artifact-catalog.d.ts +188 -0
  13. package/dist/artifacts.d.ts +86 -0
  14. package/dist/atlassian-native-retirement.d.ts +16 -0
  15. package/dist/atlassian-native-retirement.js +30 -0
  16. package/dist/atlassian-native-retirement.js.map +1 -0
  17. package/dist/atlassian.d.ts +1 -0
  18. package/dist/atlassian.js +34 -19
  19. package/dist/browser-storage.d.ts +5 -0
  20. package/dist/browser-storage.js +9 -0
  21. package/dist/browser-storage.js.map +1 -0
  22. package/dist/bundled-skills.d.ts +24 -1
  23. package/dist/canonical-human-identities.js +2 -1
  24. package/dist/chunk-2ZIHHL72.js +153 -0
  25. package/dist/chunk-2ZIHHL72.js.map +1 -0
  26. package/dist/{chunk-5LYFSZ7O.js → chunk-352X6ENP.js} +31 -31
  27. package/dist/chunk-4JGHSSB7.js +11 -0
  28. package/dist/chunk-4JGHSSB7.js.map +1 -0
  29. package/dist/chunk-4QO6GJUX.js +85 -0
  30. package/dist/chunk-4QO6GJUX.js.map +1 -0
  31. package/dist/chunk-4VDMHLLL.js +49 -0
  32. package/dist/chunk-4VDMHLLL.js.map +1 -0
  33. package/dist/chunk-56SNIMDO.js +9 -0
  34. package/dist/chunk-56SNIMDO.js.map +1 -0
  35. package/dist/chunk-6C2HKFTU.js +207 -0
  36. package/dist/chunk-6C2HKFTU.js.map +1 -0
  37. package/dist/chunk-6IXO76Z6.js +72 -0
  38. package/dist/chunk-6IXO76Z6.js.map +1 -0
  39. package/dist/chunk-7272KVWZ.js +60 -0
  40. package/dist/chunk-7272KVWZ.js.map +1 -0
  41. package/dist/{chunk-7ABONTXE.js → chunk-E3GGUBHS.js} +49 -5
  42. package/dist/chunk-E3GGUBHS.js.map +1 -0
  43. package/dist/chunk-EFZYKUE2.js +767 -0
  44. package/dist/chunk-EFZYKUE2.js.map +1 -0
  45. package/dist/chunk-EKWNTOG3.js +154 -0
  46. package/dist/chunk-EKWNTOG3.js.map +1 -0
  47. package/dist/chunk-HABQ7ADB.js +234 -0
  48. package/dist/chunk-HABQ7ADB.js.map +1 -0
  49. package/dist/chunk-HRRU4QPI.js +91 -0
  50. package/dist/chunk-HRRU4QPI.js.map +1 -0
  51. package/dist/{chunk-3SIZGL3O.js → chunk-IK36LXKC.js} +18 -2
  52. package/dist/chunk-IK36LXKC.js.map +1 -0
  53. package/dist/{chunk-TXTQIYCV.js → chunk-ILJ72KPO.js} +56 -3
  54. package/dist/chunk-ILJ72KPO.js.map +1 -0
  55. package/dist/chunk-J4HQ3UKY.js +93 -0
  56. package/dist/chunk-J4HQ3UKY.js.map +1 -0
  57. package/dist/chunk-KHHZTBP7.js +11 -0
  58. package/dist/chunk-KHHZTBP7.js.map +1 -0
  59. package/dist/{chunk-WYBDERIY.js → chunk-LZ2LAHIX.js} +47 -41
  60. package/dist/chunk-LZ2LAHIX.js.map +1 -0
  61. package/dist/chunk-NDZHPTCL.js +400 -0
  62. package/dist/chunk-NDZHPTCL.js.map +1 -0
  63. package/dist/chunk-OF6OKOBF.js +54793 -0
  64. package/dist/chunk-OF6OKOBF.js.map +1 -0
  65. package/dist/chunk-OL23ARTF.js +94 -0
  66. package/dist/chunk-OL23ARTF.js.map +1 -0
  67. package/dist/chunk-PUIUXIOL.js +189 -0
  68. package/dist/chunk-PUIUXIOL.js.map +1 -0
  69. package/dist/{chunk-WBYTNVIW.js → chunk-RKX3NQYS.js} +1 -1
  70. package/dist/{chunk-Y3KNXVTD.js → chunk-RMWXDZEO.js} +128 -21
  71. package/dist/chunk-RMWXDZEO.js.map +1 -0
  72. package/dist/{chunk-MRWYRAS5.js → chunk-SHO4YO4B.js} +27 -35
  73. package/dist/chunk-SHO4YO4B.js.map +1 -0
  74. package/dist/chunk-SWRN2DJ3.js +153 -0
  75. package/dist/chunk-SWRN2DJ3.js.map +1 -0
  76. package/dist/chunk-TCXCRBPF.js +267 -0
  77. package/dist/chunk-TCXCRBPF.js.map +1 -0
  78. package/dist/chunk-TLU3UEMD.js +324 -0
  79. package/dist/chunk-TLU3UEMD.js.map +1 -0
  80. package/dist/chunk-TSWWZMUS.js +186 -0
  81. package/dist/chunk-TSWWZMUS.js.map +1 -0
  82. package/dist/{chunk-PX3VCKAU.js → chunk-WVCFSOUZ.js} +1 -1
  83. package/dist/{chunk-PX3VCKAU.js.map → chunk-WVCFSOUZ.js.map} +1 -1
  84. package/dist/chunk-XDLAGX66.js +127 -0
  85. package/dist/chunk-XDLAGX66.js.map +1 -0
  86. package/dist/chunk-YKZ4WU4P.js +33 -0
  87. package/dist/chunk-YKZ4WU4P.js.map +1 -0
  88. package/dist/{chunk-O5LEQHDM.js → chunk-Z7WEVGCL.js} +3 -3
  89. package/dist/{chunk-YBW5JSA3.js → chunk-ZDCRWCGZ.js} +119 -101
  90. package/dist/chunk-ZDCRWCGZ.js.map +1 -0
  91. package/dist/claude-provider-account-authority.d.ts +18 -0
  92. package/dist/claude-subscription-oauth.d.ts +42 -0
  93. package/dist/claude-subscription-usage.d.ts +159 -0
  94. package/dist/client-error-report.d.ts +158 -0
  95. package/dist/client-error-report.js +164 -0
  96. package/dist/client-error-report.js.map +1 -0
  97. package/dist/code-search.d.ts +52 -0
  98. package/dist/code-search.js +40 -0
  99. package/dist/code-search.js.map +1 -0
  100. package/dist/codex-provider-account-authority.js +20 -12
  101. package/dist/codex-provider-account-authority.js.map +1 -1
  102. package/dist/company-brain.d.ts +19 -81
  103. package/dist/company-profile.d.ts +144 -6
  104. package/dist/connect.d.ts +37 -0
  105. package/dist/connect.js +216 -159
  106. package/dist/connect.js.map +1 -1
  107. package/dist/connection-account-label.d.ts +2 -0
  108. package/dist/connection-account-label.js +35 -0
  109. package/dist/connection-account-label.js.map +1 -0
  110. package/dist/connection-authority.d.ts +9 -317
  111. package/dist/connection-authority.js +37 -42
  112. package/dist/connector-attachments.js +2 -1
  113. package/dist/connector-destinations.js +2 -1
  114. package/dist/connector-tool-permissions.d.ts +137 -0
  115. package/dist/cua-desktop-tools.d.ts +17 -0
  116. package/dist/define-schema.d.ts +8 -0
  117. package/dist/direct-model-provider.d.ts +36 -0
  118. package/dist/editable-artifact-codec-registry.js +5 -5
  119. package/dist/editable-artifact-committed-transaction.js +3 -2
  120. package/dist/editable-artifact-live.js +5 -5
  121. package/dist/editable-artifact-serialized-commit.js +6 -6
  122. package/dist/editable-artifact-versions.d.ts +7 -1
  123. package/dist/editable-artifact-versions.js +1 -1
  124. package/dist/editable-artifacts.js +62 -56
  125. package/dist/event-preview.d.ts +22 -0
  126. package/dist/external-identities.d.ts +174 -0
  127. package/dist/external-identities.js +15 -4
  128. package/dist/first-party-tool-authorization.d.ts +815 -0
  129. package/dist/github-repository-contracts.js +60 -43
  130. package/dist/github-repository-contracts.js.map +1 -1
  131. package/dist/google-drive.d.ts +2 -1
  132. package/dist/google-drive.js +305 -238
  133. package/dist/google-drive.js.map +1 -1
  134. package/dist/host-mcp-bindings.d.ts +39 -10
  135. package/dist/host-mcp-bindings.js +256 -171
  136. package/dist/host-mcp-bindings.js.map +1 -1
  137. package/dist/image-generation.d.ts +1 -0
  138. package/dist/index.d.ts +15715 -3850
  139. package/dist/index.js +2088 -289
  140. package/dist/insights-usage.d.ts +877 -0
  141. package/dist/insights-usage.js +559 -0
  142. package/dist/insights-usage.js.map +1 -0
  143. package/dist/interaction.d.ts +1176 -829
  144. package/dist/knowledge-entries.d.ts +984 -0
  145. package/dist/knowledge-preparation.d.ts +239 -0
  146. package/dist/managed-auth-session-sets.d.ts +7 -0
  147. package/dist/managed-auth-session-sets.js +198 -132
  148. package/dist/managed-auth-session-sets.js.map +1 -1
  149. package/dist/managed-sign-in-methods.d.ts +56 -0
  150. package/dist/managed-sign-in-methods.js +64 -0
  151. package/dist/managed-sign-in-methods.js.map +1 -0
  152. package/dist/mcp-catalog-limits.d.ts +2 -0
  153. package/dist/mcp-endpoint.js +9 -0
  154. package/dist/mcp-endpoint.js.map +1 -0
  155. package/dist/mcp-oauth.d.ts +2 -2
  156. package/dist/mcp-structured-content.d.ts +25 -0
  157. package/dist/modal-native-proof-v2.d.ts +587 -0
  158. package/dist/modal-native-proof-v2.js +38 -0
  159. package/dist/modal-native-proof-v2.js.map +1 -0
  160. package/dist/model-account-choice.d.ts +235 -0
  161. package/dist/model-account-settings.d.ts +422 -0
  162. package/dist/model-availability.d.ts +15 -0
  163. package/dist/model-connection-access.d.ts +13 -0
  164. package/dist/model-context-inspector.d.ts +98 -0
  165. package/dist/model-display.d.ts +43 -0
  166. package/dist/model-display.js +17 -0
  167. package/dist/model-display.js.map +1 -0
  168. package/dist/model-picker-order.d.ts +3 -1
  169. package/dist/model-picker-order.js +3 -0
  170. package/dist/model-picker-order.js.map +1 -1
  171. package/dist/organization-access.d.ts +412 -0
  172. package/dist/organization-access.js +39 -0
  173. package/dist/organization-access.js.map +1 -0
  174. package/dist/organization-integration-policy.d.ts +27 -0
  175. package/dist/organization-membership-lifecycle.d.ts +38 -0
  176. package/dist/organization-model-usage.d.ts +146 -0
  177. package/dist/organization-model-usage.js +78 -0
  178. package/dist/organization-model-usage.js.map +1 -0
  179. package/dist/organization-recovery.js +2 -1
  180. package/dist/organization-usage.d.ts +138 -0
  181. package/dist/permissions.d.ts +18 -0
  182. package/dist/personal-github.d.ts +1 -0
  183. package/dist/personal-github.js +199 -144
  184. package/dist/personal-github.js.map +1 -1
  185. package/dist/plugin-discovery.js +1 -1
  186. package/dist/prepared-mcp-setup.d.ts +54 -0
  187. package/dist/prepared-mcp-setup.js +12 -0
  188. package/dist/prepared-mcp-setup.js.map +1 -0
  189. package/dist/product-analytics.d.ts +116 -0
  190. package/dist/product-lifecycle-facts.d.ts +73 -0
  191. package/dist/remember.d.ts +98 -6
  192. package/dist/retained-output.d.ts +8 -0
  193. package/dist/sandbox-file-artifacts.d.ts +1 -0
  194. package/dist/sandbox-provider-command.d.ts +91 -1
  195. package/dist/sandbox-recovery.d.ts +146 -0
  196. package/dist/secret-generator.d.ts +44 -0
  197. package/dist/secret-references.d.ts +90 -0
  198. package/dist/secret-resolution.d.ts +111 -0
  199. package/dist/secret-totp.d.ts +41 -0
  200. package/dist/session-final-reply.d.ts +6 -0
  201. package/dist/session-final-reply.js +9 -0
  202. package/dist/session-final-reply.js.map +1 -0
  203. package/dist/session-goal-reports.d.ts +21 -0
  204. package/dist/session-history-import.d.ts +1272 -0
  205. package/dist/session-list-entries.d.ts +4 -0
  206. package/dist/session-list-entries.js +56 -0
  207. package/dist/session-list-entries.js.map +1 -0
  208. package/dist/session-mcp-projections.d.ts +6 -0
  209. package/dist/session-mcp-tool-permissions.d.ts +62 -0
  210. package/dist/session-message-search.d.ts +68 -0
  211. package/dist/session-target.d.ts +18 -0
  212. package/dist/session-titles.d.ts +8 -0
  213. package/dist/session-titles.js +5 -1
  214. package/dist/session-usage-limit-refusal.d.ts +34 -0
  215. package/dist/session-usage-limit-refusal.js +15 -0
  216. package/dist/session-usage-limit-refusal.js.map +1 -0
  217. package/dist/session-usage-limits.d.ts +127 -0
  218. package/dist/session-usage-limits.js +41 -0
  219. package/dist/session-usage-limits.js.map +1 -0
  220. package/dist/signup-attribution.d.ts +39 -0
  221. package/dist/site-data.d.ts +286 -0
  222. package/dist/site-operations.d.ts +39 -0
  223. package/dist/site-publishing.d.ts +778 -0
  224. package/dist/site-session-http.d.ts +89 -4
  225. package/dist/site-session-http.js +25 -1
  226. package/dist/site-sql.d.ts +421 -0
  227. package/dist/skill-catalog-context.d.ts +7 -0
  228. package/dist/skill-files.d.ts +1 -1
  229. package/dist/skill-use.d.ts +61 -0
  230. package/dist/skills.d.ts +15 -0
  231. package/dist/slack-bot-scopes.d.ts +17 -12
  232. package/dist/slack-bot-scopes.js +10 -3
  233. package/dist/slack-rest-mcp.d.ts +36 -0
  234. package/dist/slack-rest-mcp.js +25 -0
  235. package/dist/slack-rest-mcp.js.map +1 -0
  236. package/dist/spreadsheet-artifact-commands.d.ts +14 -1
  237. package/dist/spreadsheet-artifact-commands.js +8 -2
  238. package/dist/spreadsheet-artifact-query.d.ts +13 -6
  239. package/dist/spreadsheet-artifact-query.js +3 -3
  240. package/dist/subscription-account-actions.d.ts +64 -0
  241. package/dist/subscription-account-pools.d.ts +292 -0
  242. package/dist/subscription-personal-authority-v2.d.ts +28 -0
  243. package/dist/subscription-personal-authority-v2.js +12 -0
  244. package/dist/subscription-personal-authority-v2.js.map +1 -0
  245. package/dist/tool-action-review.d.ts +132 -0
  246. package/dist/tool-catalog.d.ts +408 -0
  247. package/dist/tool-policy.d.ts +5 -0
  248. package/dist/tool-review-presentation.d.ts +12 -0
  249. package/dist/tool-review-presentation.js +17 -0
  250. package/dist/tool-review-presentation.js.map +1 -0
  251. package/dist/transcription-recordings.d.ts +21 -0
  252. package/dist/turn-serving-policy.d.ts +221 -0
  253. package/dist/usage-allowances.d.ts +314 -0
  254. package/dist/usage-allowances.js +52 -0
  255. package/dist/usage-allowances.js.map +1 -0
  256. package/dist/vaults.d.ts +1286 -0
  257. package/dist/video-generation.d.ts +3 -0
  258. package/dist/video-generation.js +2 -1
  259. package/dist/workspace-instruction-policies.d.ts +13 -0
  260. package/dist/workspace-integration-wire.d.ts +36 -0
  261. package/dist/workspace-integration-wire.js +23 -0
  262. package/dist/workspace-integration-wire.js.map +1 -0
  263. package/dist/workspace-integrations.d.ts +1028 -0
  264. package/dist/workspace-state.d.ts +85 -416
  265. package/dist/xai-provider-account-authority.js +2 -1
  266. package/package.json +98 -2
  267. package/src/agent-authored-durable-text.ts +14 -11
  268. package/src/agent-config.ts +1698 -0
  269. package/src/agent-instruction-changes.ts +115 -0
  270. package/src/agent-learning.ts +188 -0
  271. package/src/agent-topology.ts +57 -52
  272. package/src/allowance-refusal.ts +81 -0
  273. package/src/analytics-consent-report.ts +20 -0
  274. package/src/api-key-presets.ts +28 -0
  275. package/src/artifact-catalog.ts +82 -0
  276. package/src/artifacts.ts +299 -227
  277. package/src/atlassian-native-retirement.ts +33 -0
  278. package/src/atlassian.ts +135 -108
  279. package/src/browser-storage.ts +10 -0
  280. package/src/bundled-skills.ts +60 -17
  281. package/src/canonical-human-identities.ts +60 -58
  282. package/src/claude-provider-account-authority.ts +12 -0
  283. package/src/claude-subscription-oauth.ts +73 -0
  284. package/src/claude-subscription-usage.ts +68 -0
  285. package/src/client-error-report.ts +343 -0
  286. package/src/code-search.ts +105 -0
  287. package/src/codex-provider-account-authority.ts +21 -16
  288. package/src/company-brain-governed-writes.ts +255 -233
  289. package/src/company-brain.ts +164 -153
  290. package/src/company-profile.ts +365 -292
  291. package/src/connect.ts +212 -173
  292. package/src/connection-account-label.ts +46 -0
  293. package/src/connection-authority.ts +183 -364
  294. package/src/connector-attachments.ts +137 -122
  295. package/src/connector-destinations.ts +46 -42
  296. package/src/connector-tool-permissions.ts +117 -0
  297. package/src/cua-desktop-tools.gen.json +6512 -0
  298. package/src/cua-desktop-tools.linux.gen.json +6600 -0
  299. package/src/cua-desktop-tools.ts +36 -0
  300. package/src/cua-desktop-tools.windows.gen.json +6353 -0
  301. package/src/define-schema.ts +10 -0
  302. package/src/direct-model-provider.ts +108 -0
  303. package/src/editable-artifact-committed-transaction.ts +17 -0
  304. package/src/editable-artifact-versions.ts +7 -1
  305. package/src/event-preview.ts +53 -3
  306. package/src/external-identities.ts +262 -145
  307. package/src/feedback.ts +43 -30
  308. package/src/first-party-tool-authorization.ts +356 -0
  309. package/src/github-repository-contracts.ts +78 -64
  310. package/src/google-drive.ts +285 -234
  311. package/src/governed-learning-activation.ts +152 -131
  312. package/src/governed-learning-evaluator.ts +140 -133
  313. package/src/host-mcp-bindings.ts +292 -198
  314. package/src/image-generation.ts +104 -95
  315. package/src/index.ts +13354 -8654
  316. package/src/insights-usage.ts +727 -0
  317. package/src/interaction.ts +3070 -2326
  318. package/src/knowledge-entries.ts +428 -0
  319. package/src/knowledge-preparation.ts +57 -0
  320. package/src/knowledge.ts +246 -213
  321. package/src/managed-auth-session-sets.ts +220 -144
  322. package/src/managed-sign-in-methods.ts +52 -0
  323. package/src/mcp-catalog-limits.ts +2 -0
  324. package/src/mcp-oauth.ts +43 -34
  325. package/src/mcp-receipts.ts +192 -192
  326. package/src/mcp-structured-content.ts +81 -0
  327. package/src/memory-slack-delivery.ts +171 -142
  328. package/src/modal-native-proof-v2.ts +429 -0
  329. package/src/model-account-choice.ts +177 -0
  330. package/src/model-account-settings.ts +210 -0
  331. package/src/model-availability.ts +22 -0
  332. package/src/model-connection-access.ts +61 -14
  333. package/src/model-context-inspector.ts +133 -99
  334. package/src/model-display.ts +221 -0
  335. package/src/model-picker-order.ts +12 -1
  336. package/src/organization-access.ts +217 -0
  337. package/src/organization-integration-policy.ts +63 -0
  338. package/src/organization-membership-lifecycle.ts +528 -382
  339. package/src/organization-model-usage.ts +81 -0
  340. package/src/organization-recovery.ts +147 -135
  341. package/src/organization-usage.ts +94 -0
  342. package/src/permissions.ts +88 -52
  343. package/src/personal-github.ts +210 -171
  344. package/src/preference-registry.ts +314 -258
  345. package/src/prepared-mcp-setup.ts +189 -0
  346. package/src/product-analytics.ts +261 -0
  347. package/src/product-lifecycle-facts.ts +122 -0
  348. package/src/remember.ts +181 -167
  349. package/src/retained-output.ts +194 -165
  350. package/src/sandbox-file-artifacts.ts +60 -47
  351. package/src/sandbox-provider-command.ts +88 -20
  352. package/src/sandbox-recovery.ts +129 -0
  353. package/src/scoped-knowledge.ts +61 -43
  354. package/src/secret-generator.ts +155 -0
  355. package/src/secret-references.ts +414 -0
  356. package/src/secret-resolution.ts +274 -0
  357. package/src/secret-totp.ts +188 -0
  358. package/src/session-final-reply.ts +16 -0
  359. package/src/session-goal-reports.ts +64 -0
  360. package/src/session-history-import.ts +177 -0
  361. package/src/session-list-entries.ts +96 -0
  362. package/src/session-mcp-projections.ts +11 -0
  363. package/src/session-mcp-tool-permissions.ts +108 -0
  364. package/src/session-message-search.ts +61 -0
  365. package/src/session-target.ts +57 -0
  366. package/src/session-titles.ts +80 -10
  367. package/src/session-topology-primitives.ts +19 -12
  368. package/src/session-usage-limit-refusal.ts +101 -0
  369. package/src/session-usage-limits.ts +171 -0
  370. package/src/signup-attribution.ts +86 -0
  371. package/src/site-data.ts +339 -0
  372. package/src/site-operations.ts +154 -0
  373. package/src/site-publishing.ts +876 -0
  374. package/src/site-session-http.ts +294 -16
  375. package/src/site-sql.ts +1123 -0
  376. package/src/skill-catalog-context.ts +50 -0
  377. package/src/skill-files.ts +3 -3
  378. package/src/skill-use.ts +80 -0
  379. package/src/skills.ts +82 -54
  380. package/src/slack-bot-scopes.ts +31 -39
  381. package/src/slack-rest-mcp.ts +222 -0
  382. package/src/slack-task-policy.ts +96 -73
  383. package/src/spreadsheet-artifact-commands.ts +73 -2
  384. package/src/spreadsheet-artifact-query.ts +187 -39
  385. package/src/subscription-account-actions.ts +84 -0
  386. package/src/subscription-account-pools.ts +53 -0
  387. package/src/subscription-personal-authority-v2.ts +66 -0
  388. package/src/task-notes.ts +55 -51
  389. package/src/tool-action-review.ts +258 -0
  390. package/src/tool-catalog.ts +609 -372
  391. package/src/tool-policy.ts +82 -0
  392. package/src/tool-result-spill.ts +12 -9
  393. package/src/tool-review-presentation.ts +385 -0
  394. package/src/transcription-recordings.ts +145 -131
  395. package/src/turn-serving-policy.ts +166 -0
  396. package/src/usage-allowances.ts +248 -0
  397. package/src/vaults.ts +850 -0
  398. package/src/video-generation.ts +385 -360
  399. package/src/work-claims.ts +173 -149
  400. package/src/workspace-instruction-policies.ts +349 -275
  401. package/src/workspace-integration-wire.ts +101 -0
  402. package/src/workspace-integrations.ts +724 -0
  403. package/src/workspace-learning-administration.ts +57 -44
  404. package/src/workspace-learning-policy.ts +127 -96
  405. package/src/workspace-state.ts +253 -333
  406. package/src/xai-provider-account-authority.ts +22 -17
  407. package/dist/chunk-3SIZGL3O.js.map +0 -1
  408. package/dist/chunk-7ABONTXE.js.map +0 -1
  409. package/dist/chunk-BCS7WHCK.js +0 -139
  410. package/dist/chunk-BCS7WHCK.js.map +0 -1
  411. package/dist/chunk-GRG7PHWQ.js +0 -25
  412. package/dist/chunk-GRG7PHWQ.js.map +0 -1
  413. package/dist/chunk-JUFK3T4Q.js +0 -80
  414. package/dist/chunk-JUFK3T4Q.js.map +0 -1
  415. package/dist/chunk-M5ZGRVIQ.js +0 -719
  416. package/dist/chunk-M5ZGRVIQ.js.map +0 -1
  417. package/dist/chunk-MRWYRAS5.js.map +0 -1
  418. package/dist/chunk-OSBYTE3O.js +0 -348
  419. package/dist/chunk-OSBYTE3O.js.map +0 -1
  420. package/dist/chunk-P3HLDT77.js +0 -59
  421. package/dist/chunk-P3HLDT77.js.map +0 -1
  422. package/dist/chunk-TEMFILR7.js +0 -143
  423. package/dist/chunk-TEMFILR7.js.map +0 -1
  424. package/dist/chunk-TXTQIYCV.js.map +0 -1
  425. package/dist/chunk-UR2GFYIE.js +0 -22598
  426. package/dist/chunk-UR2GFYIE.js.map +0 -1
  427. package/dist/chunk-WYBDERIY.js.map +0 -1
  428. package/dist/chunk-Y3KNXVTD.js.map +0 -1
  429. package/dist/chunk-YBW5JSA3.js.map +0 -1
  430. package/dist/chunk-YRXAWWCU.js +0 -45
  431. package/dist/chunk-YRXAWWCU.js.map +0 -1
  432. /package/dist/{chunk-5LYFSZ7O.js.map → chunk-352X6ENP.js.map} +0 -0
  433. /package/dist/{chunk-WBYTNVIW.js.map → chunk-RKX3NQYS.js.map} +0 -0
  434. /package/dist/{chunk-O5LEQHDM.js.map → chunk-Z7WEVGCL.js.map} +0 -0
@@ -0,0 +1,222 @@
1
+ /** The catalog and OAuth identity stay stable while calls use the ordinary Web API. */
2
+ export const OFFICIAL_SLACK_MCP_URL = "https://mcp.slack.com/mcp";
3
+ export const SLACK_REST_API_BASE = "https://slack.com/api/";
4
+ /** Private Slack file bytes are served only from this origin and path. */
5
+ export const SLACK_PRIVATE_FILE_ORIGIN = "https://files.slack.com";
6
+ export const SLACK_PRIVATE_FILE_PATH_PREFIX = "/files-pri/";
7
+
8
+ /** A private Slack file download URL that may carry a Slack user token. */
9
+ export function isSlackPrivateFileUrl(value: string | URL): boolean {
10
+ try {
11
+ const url = new URL(value);
12
+ return (
13
+ url.origin === SLACK_PRIVATE_FILE_ORIGIN &&
14
+ !url.username &&
15
+ !url.password &&
16
+ !url.hash &&
17
+ url.pathname.startsWith(SLACK_PRIVATE_FILE_PATH_PREFIX) &&
18
+ !url.pathname.split("/").some((segment) => segment === "." || segment === "..")
19
+ );
20
+ } catch {
21
+ return false;
22
+ }
23
+ }
24
+
25
+ export const OPENGENI_SLACK_REST_USER_SCOPES = [
26
+ "channels:read",
27
+ "groups:read",
28
+ "im:read",
29
+ "mpim:read",
30
+ "channels:history",
31
+ "groups:history",
32
+ "im:history",
33
+ "mpim:history",
34
+ "users:read",
35
+ "files:read",
36
+ "im:write",
37
+ "chat:write",
38
+ ] as const;
39
+
40
+ /** Slack returns comma-delimited scopes, including in existing saved grants. */
41
+ export function normalizeSlackScopes(
42
+ scopes: readonly string[] | string | undefined | null,
43
+ ): string[] {
44
+ return [
45
+ ...new Set(
46
+ (typeof scopes === "string" ? [scopes] : (scopes ?? []))
47
+ .flatMap((entry) => entry.split(/[\s,]+/u))
48
+ .filter(Boolean),
49
+ ),
50
+ ].sort();
51
+ }
52
+
53
+ export type SlackRestMcpTool = {
54
+ name: string;
55
+ description: string;
56
+ inputSchema: {
57
+ type: "object";
58
+ properties: Record<string, unknown>;
59
+ required: string[];
60
+ additionalProperties: false;
61
+ };
62
+ annotations: {
63
+ readOnlyHint: boolean;
64
+ destructiveHint: false;
65
+ idempotentHint: boolean;
66
+ openWorldHint: true;
67
+ };
68
+ };
69
+
70
+ const conversationScopes = ["channels:read", "groups:read", "im:read", "mpim:read"];
71
+ const historyScopes = ["channels:history", "groups:history", "im:history", "mpim:history"];
72
+ const channel = { type: "string", description: "Slack conversation ID, such as C123 or D123." };
73
+ const cursor = { type: "string", maxLength: 4096, description: "Cursor from the previous page." };
74
+ const directoryPage = { type: "integer", minimum: 1, maximum: 100, default: 100 };
75
+ const historyPage = { type: "integer", minimum: 1, maximum: 15, default: 15 };
76
+ const timestamp = { type: "string", pattern: "^[0-9]+\\.[0-9]+$" };
77
+
78
+ function tool(
79
+ name: string,
80
+ description: string,
81
+ properties: Record<string, unknown>,
82
+ required: string[] = [],
83
+ mutation = false,
84
+ ): SlackRestMcpTool {
85
+ return {
86
+ name,
87
+ description,
88
+ inputSchema: { type: "object", properties, required, additionalProperties: false },
89
+ annotations: {
90
+ readOnlyHint: !mutation,
91
+ destructiveHint: false,
92
+ idempotentHint: !mutation,
93
+ openWorldHint: true,
94
+ },
95
+ };
96
+ }
97
+
98
+ /** Static reviewed pilot surface. Each call reads only one explicitly requested page. */
99
+ export const SLACK_REST_MCP_TOOLS: SlackRestMcpTool[] = [
100
+ tool(
101
+ "slack_list_channels",
102
+ "Lists one page of conversations visible to your connected Slack account. Conversation types without a granted read scope are omitted.",
103
+ {
104
+ types: {
105
+ type: "array",
106
+ items: { type: "string", enum: ["public_channel", "private_channel", "im", "mpim"] },
107
+ minItems: 1,
108
+ maxItems: 4,
109
+ },
110
+ cursor,
111
+ limit: directoryPage,
112
+ exclude_archived: { type: "boolean", default: true },
113
+ },
114
+ ),
115
+ tool(
116
+ "slack_get_channel_info",
117
+ "Gets metadata for one conversation visible to your connected Slack account.",
118
+ { channel },
119
+ ["channel"],
120
+ ),
121
+ tool(
122
+ "slack_list_channel_members",
123
+ "Lists one page of members in a visible channel or group conversation.",
124
+ { channel, cursor, limit: directoryPage },
125
+ ["channel"],
126
+ ),
127
+ tool("slack_list_users", "Lists one page of users in the connected Slack workspace.", {
128
+ cursor,
129
+ limit: directoryPage,
130
+ }),
131
+ tool(
132
+ "slack_get_user_info",
133
+ "Gets a user's profile by their Slack user ID. Email is included only when Slack has granted that scope.",
134
+ { user: { type: "string" } },
135
+ ["user"],
136
+ ),
137
+ tool(
138
+ "slack_read_channel",
139
+ "Reads one page of at most 15 messages from a selected conversation. Slack history limits are shared across the workspace. No automatic pagination or backfill.",
140
+ {
141
+ channel,
142
+ cursor,
143
+ limit: historyPage,
144
+ oldest: timestamp,
145
+ latest: timestamp,
146
+ inclusive: { type: "boolean", default: false },
147
+ },
148
+ ["channel"],
149
+ ),
150
+ tool(
151
+ "slack_read_thread",
152
+ "Reads one page of at most 15 messages in a selected thread. Slack thread limits are shared across the workspace. No automatic pagination or backfill.",
153
+ {
154
+ channel,
155
+ ts: { ...timestamp, description: "Thread root message timestamp." },
156
+ cursor,
157
+ limit: historyPage,
158
+ },
159
+ ["channel", "ts"],
160
+ ),
161
+ tool(
162
+ "slack_download_file",
163
+ "Downloads one file shared in Slack, such as a PDF or image, into your workspace like an attachment and returns its path. Use the file ID (F...) from a message's files.",
164
+ { file: { type: "string", pattern: "^F[A-Z0-9]+$", description: "Slack file ID." } },
165
+ ["file"],
166
+ ),
167
+ tool(
168
+ "slack_open_dm",
169
+ "Opens or resumes a direct message with one Slack user as your connected account.",
170
+ { user: { type: "string" } },
171
+ ["user"],
172
+ true,
173
+ ),
174
+ tool(
175
+ "slack_send_message",
176
+ "Sends a message as your connected Slack account. Supply thread_ts to reply in a thread. Review the recipient and text before approving. An uncertain submission is never automatically retried.",
177
+ {
178
+ channel,
179
+ text: { type: "string", minLength: 1, maxLength: 40000 },
180
+ thread_ts: { ...timestamp, description: "Optional thread root timestamp for a reply." },
181
+ unfurl_links: { type: "boolean", default: false },
182
+ unfurl_media: { type: "boolean", default: false },
183
+ },
184
+ ["channel", "text"],
185
+ true,
186
+ ),
187
+ ];
188
+
189
+ const REQUIRED_ANY_SCOPES: Readonly<Record<string, readonly string[]>> = {
190
+ slack_list_channels: conversationScopes,
191
+ slack_get_channel_info: conversationScopes,
192
+ slack_list_channel_members: ["channels:read", "groups:read", "mpim:read"],
193
+ slack_list_users: ["users:read"],
194
+ slack_get_user_info: ["users:read"],
195
+ slack_read_channel: historyScopes,
196
+ slack_read_thread: historyScopes,
197
+ slack_download_file: ["files:read"],
198
+ slack_open_dm: ["im:write"],
199
+ slack_send_message: ["chat:write"],
200
+ };
201
+
202
+ export function slackRestMcpToolsForScopes(scopes: readonly string[] | string): SlackRestMcpTool[] {
203
+ const granted = new Set(normalizeSlackScopes(scopes));
204
+ return SLACK_REST_MCP_TOOLS.filter((entry) =>
205
+ REQUIRED_ANY_SCOPES[entry.name]?.some((scope) => granted.has(scope)),
206
+ ).map((entry) => ({
207
+ ...entry,
208
+ inputSchema: {
209
+ ...entry.inputSchema,
210
+ required: [...entry.inputSchema.required],
211
+ properties: { ...entry.inputSchema.properties },
212
+ },
213
+ annotations: { ...entry.annotations },
214
+ }));
215
+ }
216
+
217
+ export const SLACK_CONVERSATION_READ_SCOPE_BY_TYPE = {
218
+ public_channel: "channels:read",
219
+ private_channel: "groups:read",
220
+ im: "im:read",
221
+ mpim: "mpim:read",
222
+ } as const;
@@ -1,38 +1,47 @@
1
+ import { defineSchema } from "./define-schema";
1
2
  import { z } from "zod";
2
3
 
3
4
  export const SLACK_TASK_POLICY_ID_MAX_CHARS = 128;
4
5
  export const SLACK_TASK_POLICY_REASON_MAX_CHARS = 4_096;
5
6
  export const SLACK_TASK_POLICY_MAX_IDS = 256;
6
7
 
7
- const SlackOpaqueId = z.string().min(1).max(SLACK_TASK_POLICY_ID_MAX_CHARS);
8
+ const SlackOpaqueId = /* @__PURE__ */ defineSchema(() =>
9
+ z.string().min(1).max(SLACK_TASK_POLICY_ID_MAX_CHARS),
10
+ );
8
11
 
9
- export const SlackSharedConversationMode = z.enum(["deny", "private_handoff"]);
12
+ export const SlackSharedConversationMode = /* @__PURE__ */ defineSchema(() =>
13
+ z.enum(["deny", "private_handoff"]),
14
+ );
10
15
  export type SlackSharedConversationMode = z.infer<typeof SlackSharedConversationMode>;
11
16
 
12
- export const SlackResultPublicationMode = z.enum(["never", "approval_required", "allow"]);
17
+ export const SlackResultPublicationMode = /* @__PURE__ */ defineSchema(() =>
18
+ z.enum(["never", "approval_required", "allow"]),
19
+ );
13
20
  export type SlackResultPublicationMode = z.infer<typeof SlackResultPublicationMode>;
14
21
 
15
22
  function uniqueSortedIds(values: string[]): string[] {
16
23
  return [...new Set(values)].sort();
17
24
  }
18
25
 
19
- export const SlackTaskPolicyContent = z
20
- .object({
21
- allowedTeamIds: z
22
- .array(SlackOpaqueId)
23
- .max(SLACK_TASK_POLICY_MAX_IDS)
24
- .transform(uniqueSortedIds),
25
- allowedConversationIds: z
26
- .array(SlackOpaqueId)
27
- .max(SLACK_TASK_POLICY_MAX_IDS)
28
- .transform(uniqueSortedIds),
29
- allowGuestInitiators: z.boolean(),
30
- allowExternalInitiators: z.boolean(),
31
- allowMpim: z.boolean(),
32
- sharedConversationMode: SlackSharedConversationMode,
33
- resultPublicationMode: SlackResultPublicationMode,
34
- })
35
- .strict();
26
+ export const SlackTaskPolicyContent = /* @__PURE__ */ defineSchema(() =>
27
+ z
28
+ .object({
29
+ allowedTeamIds: z
30
+ .array(SlackOpaqueId)
31
+ .max(SLACK_TASK_POLICY_MAX_IDS)
32
+ .transform(uniqueSortedIds),
33
+ allowedConversationIds: z
34
+ .array(SlackOpaqueId)
35
+ .max(SLACK_TASK_POLICY_MAX_IDS)
36
+ .transform(uniqueSortedIds),
37
+ allowGuestInitiators: z.boolean(),
38
+ allowExternalInitiators: z.boolean(),
39
+ allowMpim: z.boolean(),
40
+ sharedConversationMode: SlackSharedConversationMode,
41
+ resultPublicationMode: SlackResultPublicationMode,
42
+ })
43
+ .strict(),
44
+ );
36
45
  export type SlackTaskPolicyContent = z.infer<typeof SlackTaskPolicyContent>;
37
46
 
38
47
  export const DEFAULT_SLACK_TASK_POLICY: SlackTaskPolicyContent = Object.freeze({
@@ -58,71 +67,85 @@ export function canonicalizeSlackTaskPolicy(value: SlackTaskPolicyContent): Slac
58
67
  };
59
68
  }
60
69
 
61
- export const SlackTaskPolicyRevisionIdentity = z.object({
62
- id: z.string().uuid(),
63
- revision: z.number().int().positive(),
64
- policyHash: z.string().regex(/^[0-9a-f]{64}$/),
65
- });
70
+ export const SlackTaskPolicyRevisionIdentity = /* @__PURE__ */ defineSchema(() =>
71
+ z.object({
72
+ id: z.string().uuid(),
73
+ revision: z.number().int().positive(),
74
+ policyHash: z.string().regex(/^[0-9a-f]{64}$/),
75
+ }),
76
+ );
66
77
  export type SlackTaskPolicyRevisionIdentity = z.infer<typeof SlackTaskPolicyRevisionIdentity>;
67
78
 
68
- export const SlackTaskPolicyRevision = SlackTaskPolicyRevisionIdentity.extend({
69
- operationId: z.string().uuid(),
70
- accountId: z.string().uuid(),
71
- workspaceId: z.string().uuid(),
72
- policy: SlackTaskPolicyContent,
73
- supersedesRevisionId: z.string().uuid().nullable(),
74
- createdBySubjectId: z.string().min(1).max(1_024),
75
- createdAt: z.string().datetime(),
76
- });
79
+ export const SlackTaskPolicyRevision = /* @__PURE__ */ defineSchema(() =>
80
+ SlackTaskPolicyRevisionIdentity.extend({
81
+ operationId: z.string().uuid(),
82
+ accountId: z.string().uuid(),
83
+ workspaceId: z.string().uuid(),
84
+ policy: SlackTaskPolicyContent,
85
+ supersedesRevisionId: z.string().uuid().nullable(),
86
+ createdBySubjectId: z.string().min(1).max(1_024),
87
+ createdAt: z.string().datetime(),
88
+ }),
89
+ );
77
90
  export type SlackTaskPolicyRevision = z.infer<typeof SlackTaskPolicyRevision>;
78
91
 
79
- export const SlackTaskPolicyHead = z.object({
80
- accountId: z.string().uuid(),
81
- workspaceId: z.string().uuid(),
82
- revisionId: z.string().uuid(),
83
- revision: z.number().int().positive(),
84
- policyHash: z.string().regex(/^[0-9a-f]{64}$/),
85
- activationVersion: z.number().int().positive(),
86
- activatedAt: z.string().datetime(),
87
- });
92
+ export const SlackTaskPolicyHead = /* @__PURE__ */ defineSchema(() =>
93
+ z.object({
94
+ accountId: z.string().uuid(),
95
+ workspaceId: z.string().uuid(),
96
+ revisionId: z.string().uuid(),
97
+ revision: z.number().int().positive(),
98
+ policyHash: z.string().regex(/^[0-9a-f]{64}$/),
99
+ activationVersion: z.number().int().positive(),
100
+ activatedAt: z.string().datetime(),
101
+ }),
102
+ );
88
103
  export type SlackTaskPolicyHead = z.infer<typeof SlackTaskPolicyHead>;
89
104
 
90
- export const SlackTaskPolicyActivationEvent = z.object({
91
- id: z.string().uuid(),
92
- operationId: z.string().uuid(),
93
- accountId: z.string().uuid(),
94
- workspaceId: z.string().uuid(),
95
- activationVersion: z.number().int().positive(),
96
- oldRevision: SlackTaskPolicyRevisionIdentity.nullable(),
97
- newRevision: SlackTaskPolicyRevisionIdentity,
98
- actorSubjectId: z.string().min(1).max(1_024),
99
- reason: z.string().min(1).max(SLACK_TASK_POLICY_REASON_MAX_CHARS),
100
- createdAt: z.string().datetime(),
101
- });
105
+ export const SlackTaskPolicyActivationEvent = /* @__PURE__ */ defineSchema(() =>
106
+ z.object({
107
+ id: z.string().uuid(),
108
+ operationId: z.string().uuid(),
109
+ accountId: z.string().uuid(),
110
+ workspaceId: z.string().uuid(),
111
+ activationVersion: z.number().int().positive(),
112
+ oldRevision: SlackTaskPolicyRevisionIdentity.nullable(),
113
+ newRevision: SlackTaskPolicyRevisionIdentity,
114
+ actorSubjectId: z.string().min(1).max(1_024),
115
+ reason: z.string().min(1).max(SLACK_TASK_POLICY_REASON_MAX_CHARS),
116
+ createdAt: z.string().datetime(),
117
+ }),
118
+ );
102
119
  export type SlackTaskPolicyActivationEvent = z.infer<typeof SlackTaskPolicyActivationEvent>;
103
120
 
104
- export const SlackTaskPolicyListResponse = z.object({
105
- current: SlackTaskPolicyHead.nullable(),
106
- activeRevision: SlackTaskPolicyRevision.nullable(),
107
- revisions: z.array(SlackTaskPolicyRevision),
108
- activationEvents: z.array(SlackTaskPolicyActivationEvent),
109
- });
121
+ export const SlackTaskPolicyListResponse = /* @__PURE__ */ defineSchema(() =>
122
+ z.object({
123
+ current: SlackTaskPolicyHead.nullable(),
124
+ activeRevision: SlackTaskPolicyRevision.nullable(),
125
+ revisions: z.array(SlackTaskPolicyRevision),
126
+ activationEvents: z.array(SlackTaskPolicyActivationEvent),
127
+ }),
128
+ );
110
129
  export type SlackTaskPolicyListResponse = z.infer<typeof SlackTaskPolicyListResponse>;
111
130
 
112
- export const UpdateSlackTaskPolicyRequest = z.object({
113
- operationId: z.string().uuid().optional(),
114
- policy: SlackTaskPolicyContent,
115
- expectedCurrentRevisionId: z.string().uuid().nullable(),
116
- expectedActivationVersion: z.number().int().nonnegative(),
117
- reason: z.string().trim().min(1).max(SLACK_TASK_POLICY_REASON_MAX_CHARS),
118
- });
131
+ export const UpdateSlackTaskPolicyRequest = /* @__PURE__ */ defineSchema(() =>
132
+ z.object({
133
+ operationId: z.string().uuid().optional(),
134
+ policy: SlackTaskPolicyContent,
135
+ expectedCurrentRevisionId: z.string().uuid().nullable(),
136
+ expectedActivationVersion: z.number().int().nonnegative(),
137
+ reason: z.string().trim().min(1).max(SLACK_TASK_POLICY_REASON_MAX_CHARS),
138
+ }),
139
+ );
119
140
  export type UpdateSlackTaskPolicyRequest = z.infer<typeof UpdateSlackTaskPolicyRequest>;
120
141
 
121
- export const SlackTaskPolicyMutationResponse = z.object({
122
- revision: SlackTaskPolicyRevision,
123
- head: SlackTaskPolicyHead,
124
- event: SlackTaskPolicyActivationEvent,
125
- });
142
+ export const SlackTaskPolicyMutationResponse = /* @__PURE__ */ defineSchema(() =>
143
+ z.object({
144
+ revision: SlackTaskPolicyRevision,
145
+ head: SlackTaskPolicyHead,
146
+ event: SlackTaskPolicyActivationEvent,
147
+ }),
148
+ );
126
149
  export type SlackTaskPolicyMutationResponse = z.infer<typeof SlackTaskPolicyMutationResponse>;
127
150
 
128
151
  export type SlackTaskPolicyConversationFacts = Readonly<{
@@ -17,6 +17,9 @@ export const SPREADSHEET_ARTIFACT_COMMAND_MAX_COMMANDS = 4_096;
17
17
  export const SPREADSHEET_ARTIFACT_COMMAND_MAX_CELLS = 1_000_000;
18
18
  export const SPREADSHEET_ARTIFACT_COMMAND_MAX_STRING_BYTES = 1 * 1024 * 1024;
19
19
  export const SPREADSHEET_ARTIFACT_SHEET_NAME_MAX_UTF16_UNITS = 31;
20
+ export const SPREADSHEET_DEFAULT_ROW_HEIGHT = 24;
21
+ export const SPREADSHEET_DEFAULT_COLUMN_WIDTH = 96;
22
+ export const SPREADSHEET_MAX_DIMENSION_PIXELS = 4096;
20
23
 
21
24
  const MAGIC = new TextEncoder().encode("OGASC002");
22
25
  const HEADER_BYTES = 8 + 2 + 2 + 4 + 8;
@@ -121,7 +124,19 @@ export type SpreadsheetArtifactCommand =
121
124
  | SpreadsheetRenameSheetCommand
122
125
  | SpreadsheetDeleteSheetCommand
123
126
  | SpreadsheetSetCellsCommand
124
- | SpreadsheetClearRangeCommand;
127
+ | SpreadsheetClearRangeCommand
128
+ | Readonly<{
129
+ kind: "row.height.set";
130
+ sheet: SpreadsheetSheetPrecondition;
131
+ row: number;
132
+ height: number | null;
133
+ }>
134
+ | Readonly<{
135
+ kind: "column.width.set";
136
+ sheet: SpreadsheetSheetPrecondition;
137
+ column: number;
138
+ width: number | null;
139
+ }>;
125
140
 
126
141
  export type SpreadsheetArtifactCommandBatch = Readonly<{
127
142
  version: typeof SPREADSHEET_ARTIFACT_COMMAND_VERSION;
@@ -331,6 +346,27 @@ function encodeCommand(
331
346
  writer.u32(range.end.column);
332
347
  break;
333
348
  }
349
+ case "row.height.set":
350
+ case "column.width.set": {
351
+ const row = command.kind === "row.height.set";
352
+ const coordinate = row ? "row" : "column";
353
+ const size = row ? "height" : "width";
354
+ exactKeys(
355
+ command,
356
+ ["kind", "sheet", coordinate, size].sort(),
357
+ `spreadsheet command ${index}`,
358
+ );
359
+ writer.u8(row ? 5 : 6);
360
+ encodeSheetPrecondition(writer, command.sheet, index, context);
361
+ writer.u32(nonnegativeU32(command[coordinate], coordinate));
362
+ writer.u32(
363
+ dimensionPixels(
364
+ command[size],
365
+ row ? SPREADSHEET_DEFAULT_ROW_HEIGHT : SPREADSHEET_DEFAULT_COLUMN_WIDTH,
366
+ ),
367
+ );
368
+ break;
369
+ }
334
370
  default:
335
371
  throw commandError(index, "unknown command kind");
336
372
  }
@@ -341,7 +377,8 @@ function decodeCommand(
341
377
  index: number,
342
378
  context: CommandContext,
343
379
  ): SpreadsheetArtifactCommand {
344
- switch (reader.u8()) {
380
+ const tag = reader.u8();
381
+ switch (tag) {
345
382
  case 0: {
346
383
  const sheetId = reader.sheetObjectId();
347
384
  const name = decodedSheetName(
@@ -400,11 +437,45 @@ function decodeCommand(
400
437
  range: Object.freeze({ start, end }),
401
438
  });
402
439
  }
440
+ case 5:
441
+ case 6: {
442
+ const sheet = decodeSheetPrecondition(reader, index, context);
443
+ const coordinate = reader.u32();
444
+ const pixels = reader.u32();
445
+ const defaultPixels =
446
+ tag === 5 ? SPREADSHEET_DEFAULT_ROW_HEIGHT : SPREADSHEET_DEFAULT_COLUMN_WIDTH;
447
+ if (pixels === defaultPixels || pixels > SPREADSHEET_MAX_DIMENSION_PIXELS) {
448
+ throw commandError(index, "dimension pixels are noncanonical or outside bounds");
449
+ }
450
+ return tag === 5
451
+ ? Object.freeze({ kind: "row.height.set", sheet, row: coordinate, height: pixels || null })
452
+ : Object.freeze({
453
+ kind: "column.width.set",
454
+ sheet,
455
+ column: coordinate,
456
+ width: pixels || null,
457
+ });
458
+ }
403
459
  default:
404
460
  throw commandError(index, "unknown binary command tag");
405
461
  }
406
462
  }
407
463
 
464
+ function dimensionPixels(value: unknown, defaultPixels: number): number {
465
+ if (value === null) return 0;
466
+ if (
467
+ typeof value !== "number" ||
468
+ !Number.isInteger(value) ||
469
+ value < 1 ||
470
+ value > SPREADSHEET_MAX_DIMENSION_PIXELS
471
+ ) {
472
+ throw new RangeError(
473
+ "dimension pixels must be an integer from 1 through 4096, or null to reset",
474
+ );
475
+ }
476
+ return value === defaultPixels ? 0 : value;
477
+ }
478
+
408
479
  function encodeSheetPrecondition(
409
480
  writer: BinaryWriter,
410
481
  value: unknown,