@opengeni/contracts 3.1.0-canary.2 → 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 (429) 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 +0 -2
  4. package/dist/allowance-refusal.d.ts +9 -0
  5. package/dist/allowance-refusal.js +50 -0
  6. package/dist/allowance-refusal.js.map +1 -0
  7. package/dist/analytics-consent-report.d.ts +19 -0
  8. package/dist/analytics-consent-report.js +10 -0
  9. package/dist/analytics-consent-report.js.map +1 -0
  10. package/dist/api-key-presets.d.ts +19 -0
  11. package/dist/artifact-catalog.d.ts +188 -0
  12. package/dist/artifacts.d.ts +86 -0
  13. package/dist/atlassian-native-retirement.d.ts +16 -0
  14. package/dist/atlassian-native-retirement.js +30 -0
  15. package/dist/atlassian-native-retirement.js.map +1 -0
  16. package/dist/atlassian.d.ts +1 -0
  17. package/dist/atlassian.js +34 -19
  18. package/dist/browser-storage.d.ts +5 -0
  19. package/dist/browser-storage.js +9 -0
  20. package/dist/browser-storage.js.map +1 -0
  21. package/dist/bundled-skills.d.ts +24 -1
  22. package/dist/canonical-human-identities.js +2 -1
  23. package/dist/chunk-2ZIHHL72.js +153 -0
  24. package/dist/chunk-2ZIHHL72.js.map +1 -0
  25. package/dist/{chunk-5LYFSZ7O.js → chunk-352X6ENP.js} +31 -31
  26. package/dist/chunk-4JGHSSB7.js +11 -0
  27. package/dist/chunk-4JGHSSB7.js.map +1 -0
  28. package/dist/chunk-4QO6GJUX.js +85 -0
  29. package/dist/chunk-4QO6GJUX.js.map +1 -0
  30. package/dist/chunk-4VDMHLLL.js +49 -0
  31. package/dist/chunk-4VDMHLLL.js.map +1 -0
  32. package/dist/chunk-56SNIMDO.js +9 -0
  33. package/dist/chunk-56SNIMDO.js.map +1 -0
  34. package/dist/chunk-6C2HKFTU.js +207 -0
  35. package/dist/chunk-6C2HKFTU.js.map +1 -0
  36. package/dist/chunk-6IXO76Z6.js +72 -0
  37. package/dist/chunk-6IXO76Z6.js.map +1 -0
  38. package/dist/chunk-7272KVWZ.js +60 -0
  39. package/dist/chunk-7272KVWZ.js.map +1 -0
  40. package/dist/{chunk-7ABONTXE.js → chunk-E3GGUBHS.js} +49 -5
  41. package/dist/chunk-E3GGUBHS.js.map +1 -0
  42. package/dist/chunk-EFZYKUE2.js +767 -0
  43. package/dist/chunk-EFZYKUE2.js.map +1 -0
  44. package/dist/chunk-EKWNTOG3.js +154 -0
  45. package/dist/chunk-EKWNTOG3.js.map +1 -0
  46. package/dist/chunk-HABQ7ADB.js +234 -0
  47. package/dist/chunk-HABQ7ADB.js.map +1 -0
  48. package/dist/chunk-HRRU4QPI.js +91 -0
  49. package/dist/chunk-HRRU4QPI.js.map +1 -0
  50. package/dist/{chunk-3SIZGL3O.js → chunk-IK36LXKC.js} +18 -2
  51. package/dist/chunk-IK36LXKC.js.map +1 -0
  52. package/dist/{chunk-TXTQIYCV.js → chunk-ILJ72KPO.js} +56 -3
  53. package/dist/chunk-ILJ72KPO.js.map +1 -0
  54. package/dist/chunk-J4HQ3UKY.js +93 -0
  55. package/dist/chunk-J4HQ3UKY.js.map +1 -0
  56. package/dist/chunk-KHHZTBP7.js +11 -0
  57. package/dist/chunk-KHHZTBP7.js.map +1 -0
  58. package/dist/{chunk-WYBDERIY.js → chunk-LZ2LAHIX.js} +47 -41
  59. package/dist/chunk-LZ2LAHIX.js.map +1 -0
  60. package/dist/chunk-NDZHPTCL.js +400 -0
  61. package/dist/chunk-NDZHPTCL.js.map +1 -0
  62. package/dist/chunk-OF6OKOBF.js +54793 -0
  63. package/dist/chunk-OF6OKOBF.js.map +1 -0
  64. package/dist/chunk-OL23ARTF.js +94 -0
  65. package/dist/chunk-OL23ARTF.js.map +1 -0
  66. package/dist/chunk-PUIUXIOL.js +189 -0
  67. package/dist/chunk-PUIUXIOL.js.map +1 -0
  68. package/dist/{chunk-Y3KNXVTD.js → chunk-RMWXDZEO.js} +128 -21
  69. package/dist/chunk-RMWXDZEO.js.map +1 -0
  70. package/dist/{chunk-MRWYRAS5.js → chunk-SHO4YO4B.js} +27 -35
  71. package/dist/chunk-SHO4YO4B.js.map +1 -0
  72. package/dist/chunk-SWRN2DJ3.js +153 -0
  73. package/dist/chunk-SWRN2DJ3.js.map +1 -0
  74. package/dist/chunk-TCXCRBPF.js +267 -0
  75. package/dist/chunk-TCXCRBPF.js.map +1 -0
  76. package/dist/chunk-TLU3UEMD.js +324 -0
  77. package/dist/chunk-TLU3UEMD.js.map +1 -0
  78. package/dist/chunk-TSWWZMUS.js +186 -0
  79. package/dist/chunk-TSWWZMUS.js.map +1 -0
  80. package/dist/{chunk-PX3VCKAU.js → chunk-WVCFSOUZ.js} +1 -1
  81. package/dist/{chunk-PX3VCKAU.js.map → chunk-WVCFSOUZ.js.map} +1 -1
  82. package/dist/chunk-XDLAGX66.js +127 -0
  83. package/dist/chunk-XDLAGX66.js.map +1 -0
  84. package/dist/chunk-YKZ4WU4P.js +33 -0
  85. package/dist/chunk-YKZ4WU4P.js.map +1 -0
  86. package/dist/{chunk-O5LEQHDM.js → chunk-Z7WEVGCL.js} +3 -3
  87. package/dist/{chunk-YBW5JSA3.js → chunk-ZDCRWCGZ.js} +119 -101
  88. package/dist/chunk-ZDCRWCGZ.js.map +1 -0
  89. package/dist/claude-provider-account-authority.d.ts +18 -0
  90. package/dist/claude-subscription-oauth.d.ts +42 -0
  91. package/dist/claude-subscription-usage.d.ts +159 -0
  92. package/dist/client-error-report.d.ts +158 -0
  93. package/dist/client-error-report.js +164 -0
  94. package/dist/client-error-report.js.map +1 -0
  95. package/dist/code-search.d.ts +52 -0
  96. package/dist/code-search.js +40 -0
  97. package/dist/code-search.js.map +1 -0
  98. package/dist/codex-provider-account-authority.js +20 -12
  99. package/dist/codex-provider-account-authority.js.map +1 -1
  100. package/dist/company-profile.d.ts +144 -6
  101. package/dist/connect.d.ts +37 -0
  102. package/dist/connect.js +216 -159
  103. package/dist/connect.js.map +1 -1
  104. package/dist/connection-account-label.d.ts +2 -0
  105. package/dist/connection-account-label.js +35 -0
  106. package/dist/connection-account-label.js.map +1 -0
  107. package/dist/connection-authority.d.ts +9 -317
  108. package/dist/connection-authority.js +37 -42
  109. package/dist/connector-attachments.js +2 -1
  110. package/dist/connector-destinations.js +2 -1
  111. package/dist/connector-tool-permissions.d.ts +137 -0
  112. package/dist/cua-desktop-tools.d.ts +17 -0
  113. package/dist/define-schema.d.ts +8 -0
  114. package/dist/direct-model-provider.d.ts +36 -0
  115. package/dist/editable-artifact-codec-registry.js +5 -5
  116. package/dist/editable-artifact-committed-transaction.js +3 -2
  117. package/dist/editable-artifact-live.js +5 -5
  118. package/dist/editable-artifact-serialized-commit.js +6 -6
  119. package/dist/editable-artifact-versions.d.ts +7 -1
  120. package/dist/editable-artifact-versions.js +1 -1
  121. package/dist/editable-artifacts.js +62 -56
  122. package/dist/event-preview.d.ts +22 -0
  123. package/dist/external-identities.d.ts +138 -0
  124. package/dist/external-identities.js +9 -4
  125. package/dist/first-party-tool-authorization.d.ts +815 -0
  126. package/dist/github-repository-contracts.js +60 -43
  127. package/dist/github-repository-contracts.js.map +1 -1
  128. package/dist/google-drive.d.ts +2 -1
  129. package/dist/google-drive.js +305 -238
  130. package/dist/google-drive.js.map +1 -1
  131. package/dist/host-mcp-bindings.d.ts +5 -0
  132. package/dist/host-mcp-bindings.js +233 -170
  133. package/dist/host-mcp-bindings.js.map +1 -1
  134. package/dist/image-generation.d.ts +1 -0
  135. package/dist/index.d.ts +16761 -5946
  136. package/dist/index.js +1973 -260
  137. package/dist/insights-usage.d.ts +877 -0
  138. package/dist/insights-usage.js +559 -0
  139. package/dist/insights-usage.js.map +1 -0
  140. package/dist/interaction.d.ts +1176 -829
  141. package/dist/knowledge-entries.d.ts +81 -2
  142. package/dist/knowledge-preparation.d.ts +239 -0
  143. package/dist/managed-auth-session-sets.d.ts +7 -0
  144. package/dist/managed-auth-session-sets.js +198 -132
  145. package/dist/managed-auth-session-sets.js.map +1 -1
  146. package/dist/managed-sign-in-methods.d.ts +56 -0
  147. package/dist/managed-sign-in-methods.js +64 -0
  148. package/dist/managed-sign-in-methods.js.map +1 -0
  149. package/dist/mcp-catalog-limits.d.ts +2 -0
  150. package/dist/mcp-oauth.d.ts +2 -2
  151. package/dist/mcp-structured-content.d.ts +25 -0
  152. package/dist/modal-native-proof-v2.d.ts +587 -0
  153. package/dist/modal-native-proof-v2.js +38 -0
  154. package/dist/modal-native-proof-v2.js.map +1 -0
  155. package/dist/model-account-choice.d.ts +235 -0
  156. package/dist/model-account-settings.d.ts +422 -0
  157. package/dist/model-availability.d.ts +15 -0
  158. package/dist/model-connection-access.d.ts +13 -0
  159. package/dist/model-context-inspector.d.ts +98 -0
  160. package/dist/model-display.d.ts +43 -0
  161. package/dist/model-display.js +17 -0
  162. package/dist/model-display.js.map +1 -0
  163. package/dist/model-picker-order.d.ts +3 -1
  164. package/dist/model-picker-order.js +3 -0
  165. package/dist/model-picker-order.js.map +1 -1
  166. package/dist/organization-access.d.ts +412 -0
  167. package/dist/organization-access.js +39 -0
  168. package/dist/organization-access.js.map +1 -0
  169. package/dist/organization-integration-policy.d.ts +27 -0
  170. package/dist/organization-membership-lifecycle.d.ts +38 -0
  171. package/dist/organization-model-usage.d.ts +146 -0
  172. package/dist/organization-model-usage.js +78 -0
  173. package/dist/organization-model-usage.js.map +1 -0
  174. package/dist/organization-recovery.js +2 -1
  175. package/dist/organization-usage.d.ts +138 -0
  176. package/dist/permissions.d.ts +18 -0
  177. package/dist/personal-github.d.ts +1 -0
  178. package/dist/personal-github.js +199 -144
  179. package/dist/personal-github.js.map +1 -1
  180. package/dist/prepared-mcp-setup.d.ts +54 -0
  181. package/dist/prepared-mcp-setup.js +12 -0
  182. package/dist/prepared-mcp-setup.js.map +1 -0
  183. package/dist/product-analytics.d.ts +116 -0
  184. package/dist/product-lifecycle-facts.d.ts +73 -0
  185. package/dist/remember.d.ts +98 -6
  186. package/dist/retained-output.d.ts +8 -0
  187. package/dist/sandbox-file-artifacts.d.ts +1 -0
  188. package/dist/sandbox-provider-command.d.ts +91 -1
  189. package/dist/sandbox-recovery.d.ts +146 -0
  190. package/dist/secret-generator.d.ts +44 -0
  191. package/dist/secret-references.d.ts +90 -0
  192. package/dist/secret-resolution.d.ts +111 -0
  193. package/dist/secret-totp.d.ts +41 -0
  194. package/dist/session-final-reply.d.ts +6 -0
  195. package/dist/session-final-reply.js +9 -0
  196. package/dist/session-final-reply.js.map +1 -0
  197. package/dist/session-goal-reports.d.ts +21 -0
  198. package/dist/session-history-import.d.ts +1272 -0
  199. package/dist/session-list-entries.d.ts +4 -0
  200. package/dist/session-list-entries.js +56 -0
  201. package/dist/session-list-entries.js.map +1 -0
  202. package/dist/session-mcp-projections.d.ts +6 -0
  203. package/dist/session-mcp-tool-permissions.d.ts +62 -0
  204. package/dist/session-message-search.d.ts +68 -0
  205. package/dist/session-target.d.ts +18 -0
  206. package/dist/session-titles.d.ts +8 -0
  207. package/dist/session-titles.js +5 -1
  208. package/dist/session-usage-limit-refusal.d.ts +34 -0
  209. package/dist/session-usage-limit-refusal.js +15 -0
  210. package/dist/session-usage-limit-refusal.js.map +1 -0
  211. package/dist/session-usage-limits.d.ts +127 -0
  212. package/dist/session-usage-limits.js +41 -0
  213. package/dist/session-usage-limits.js.map +1 -0
  214. package/dist/signup-attribution.d.ts +39 -0
  215. package/dist/site-data.d.ts +286 -0
  216. package/dist/site-operations.d.ts +39 -0
  217. package/dist/site-publishing.d.ts +778 -0
  218. package/dist/site-session-http.d.ts +89 -4
  219. package/dist/site-session-http.js +25 -1
  220. package/dist/site-sql.d.ts +421 -0
  221. package/dist/skill-catalog-context.d.ts +7 -0
  222. package/dist/skill-files.d.ts +1 -1
  223. package/dist/skill-use.d.ts +61 -0
  224. package/dist/skills.d.ts +15 -0
  225. package/dist/slack-bot-scopes.d.ts +17 -12
  226. package/dist/slack-bot-scopes.js +10 -3
  227. package/dist/slack-rest-mcp.d.ts +36 -0
  228. package/dist/slack-rest-mcp.js +25 -0
  229. package/dist/slack-rest-mcp.js.map +1 -0
  230. package/dist/spreadsheet-artifact-commands.d.ts +14 -1
  231. package/dist/spreadsheet-artifact-commands.js +8 -2
  232. package/dist/spreadsheet-artifact-query.d.ts +13 -6
  233. package/dist/spreadsheet-artifact-query.js +3 -3
  234. package/dist/subscription-account-actions.d.ts +64 -0
  235. package/dist/subscription-account-pools.d.ts +292 -0
  236. package/dist/subscription-personal-authority-v2.d.ts +28 -0
  237. package/dist/subscription-personal-authority-v2.js +12 -0
  238. package/dist/subscription-personal-authority-v2.js.map +1 -0
  239. package/dist/tool-action-review.d.ts +132 -0
  240. package/dist/tool-catalog.d.ts +408 -0
  241. package/dist/tool-policy.d.ts +5 -0
  242. package/dist/tool-review-presentation.d.ts +12 -0
  243. package/dist/tool-review-presentation.js +17 -0
  244. package/dist/tool-review-presentation.js.map +1 -0
  245. package/dist/transcription-recordings.d.ts +21 -0
  246. package/dist/turn-serving-policy.d.ts +221 -0
  247. package/dist/usage-allowances.d.ts +314 -0
  248. package/dist/usage-allowances.js +52 -0
  249. package/dist/usage-allowances.js.map +1 -0
  250. package/dist/vaults.d.ts +1286 -0
  251. package/dist/video-generation.d.ts +3 -0
  252. package/dist/video-generation.js +2 -1
  253. package/dist/workspace-integration-wire.d.ts +36 -0
  254. package/dist/workspace-integration-wire.js +23 -0
  255. package/dist/workspace-integration-wire.js.map +1 -0
  256. package/dist/workspace-integrations.d.ts +1028 -0
  257. package/dist/xai-provider-account-authority.js +2 -1
  258. package/package.json +93 -5
  259. package/src/agent-authored-durable-text.ts +14 -11
  260. package/src/agent-config.ts +1698 -0
  261. package/src/agent-instruction-changes.ts +91 -74
  262. package/src/agent-learning.ts +94 -67
  263. package/src/agent-topology.ts +57 -52
  264. package/src/allowance-refusal.ts +81 -0
  265. package/src/analytics-consent-report.ts +20 -0
  266. package/src/api-key-presets.ts +28 -0
  267. package/src/artifact-catalog.ts +82 -0
  268. package/src/artifacts.ts +299 -227
  269. package/src/atlassian-native-retirement.ts +33 -0
  270. package/src/atlassian.ts +135 -108
  271. package/src/browser-storage.ts +10 -0
  272. package/src/bundled-skills.ts +60 -17
  273. package/src/canonical-human-identities.ts +60 -58
  274. package/src/claude-provider-account-authority.ts +12 -0
  275. package/src/claude-subscription-oauth.ts +73 -0
  276. package/src/claude-subscription-usage.ts +68 -0
  277. package/src/client-error-report.ts +343 -0
  278. package/src/code-search.ts +105 -0
  279. package/src/codex-provider-account-authority.ts +21 -16
  280. package/src/company-brain-governed-writes.ts +255 -233
  281. package/src/company-brain.ts +164 -153
  282. package/src/company-profile.ts +365 -292
  283. package/src/connect.ts +212 -173
  284. package/src/connection-account-label.ts +46 -0
  285. package/src/connection-authority.ts +183 -364
  286. package/src/connector-attachments.ts +137 -122
  287. package/src/connector-destinations.ts +46 -42
  288. package/src/connector-tool-permissions.ts +117 -0
  289. package/src/cua-desktop-tools.gen.json +6512 -0
  290. package/src/cua-desktop-tools.linux.gen.json +6600 -0
  291. package/src/cua-desktop-tools.ts +36 -0
  292. package/src/cua-desktop-tools.windows.gen.json +6353 -0
  293. package/src/define-schema.ts +10 -0
  294. package/src/direct-model-provider.ts +108 -0
  295. package/src/editable-artifact-committed-transaction.ts +17 -0
  296. package/src/editable-artifact-versions.ts +7 -1
  297. package/src/event-preview.ts +53 -3
  298. package/src/external-identities.ts +249 -176
  299. package/src/feedback.ts +43 -30
  300. package/src/first-party-tool-authorization.ts +356 -0
  301. package/src/github-repository-contracts.ts +78 -64
  302. package/src/google-drive.ts +285 -234
  303. package/src/governed-learning-activation.ts +152 -131
  304. package/src/governed-learning-evaluator.ts +140 -133
  305. package/src/host-mcp-bindings.ts +252 -198
  306. package/src/image-generation.ts +104 -95
  307. package/src/index.ts +13235 -8687
  308. package/src/insights-usage.ts +727 -0
  309. package/src/interaction.ts +3070 -2326
  310. package/src/knowledge-entries.ts +361 -276
  311. package/src/knowledge-preparation.ts +57 -0
  312. package/src/knowledge.ts +246 -213
  313. package/src/managed-auth-session-sets.ts +220 -144
  314. package/src/managed-sign-in-methods.ts +52 -0
  315. package/src/mcp-catalog-limits.ts +2 -0
  316. package/src/mcp-oauth.ts +43 -34
  317. package/src/mcp-receipts.ts +192 -192
  318. package/src/mcp-structured-content.ts +81 -0
  319. package/src/memory-slack-delivery.ts +171 -142
  320. package/src/modal-native-proof-v2.ts +429 -0
  321. package/src/model-account-choice.ts +177 -0
  322. package/src/model-account-settings.ts +210 -0
  323. package/src/model-availability.ts +22 -0
  324. package/src/model-connection-access.ts +61 -14
  325. package/src/model-context-inspector.ts +133 -99
  326. package/src/model-display.ts +221 -0
  327. package/src/model-picker-order.ts +12 -1
  328. package/src/organization-access.ts +217 -0
  329. package/src/organization-integration-policy.ts +63 -0
  330. package/src/organization-membership-lifecycle.ts +528 -382
  331. package/src/organization-model-usage.ts +81 -0
  332. package/src/organization-recovery.ts +147 -135
  333. package/src/organization-usage.ts +94 -0
  334. package/src/permissions.ts +88 -52
  335. package/src/personal-github.ts +210 -171
  336. package/src/preference-registry.ts +314 -258
  337. package/src/prepared-mcp-setup.ts +189 -0
  338. package/src/product-analytics.ts +261 -0
  339. package/src/product-lifecycle-facts.ts +122 -0
  340. package/src/remember.ts +181 -167
  341. package/src/retained-output.ts +194 -165
  342. package/src/sandbox-file-artifacts.ts +60 -47
  343. package/src/sandbox-provider-command.ts +88 -20
  344. package/src/sandbox-recovery.ts +129 -0
  345. package/src/scoped-knowledge.ts +61 -43
  346. package/src/secret-generator.ts +155 -0
  347. package/src/secret-references.ts +414 -0
  348. package/src/secret-resolution.ts +274 -0
  349. package/src/secret-totp.ts +188 -0
  350. package/src/session-final-reply.ts +16 -0
  351. package/src/session-goal-reports.ts +64 -0
  352. package/src/session-history-import.ts +177 -0
  353. package/src/session-list-entries.ts +96 -0
  354. package/src/session-mcp-projections.ts +11 -0
  355. package/src/session-mcp-tool-permissions.ts +108 -0
  356. package/src/session-message-search.ts +61 -0
  357. package/src/session-target.ts +57 -0
  358. package/src/session-titles.ts +80 -10
  359. package/src/session-topology-primitives.ts +19 -12
  360. package/src/session-usage-limit-refusal.ts +101 -0
  361. package/src/session-usage-limits.ts +171 -0
  362. package/src/signup-attribution.ts +86 -0
  363. package/src/site-data.ts +339 -0
  364. package/src/site-operations.ts +154 -0
  365. package/src/site-publishing.ts +876 -0
  366. package/src/site-session-http.ts +294 -16
  367. package/src/site-sql.ts +1123 -0
  368. package/src/skill-catalog-context.ts +50 -0
  369. package/src/skill-files.ts +3 -3
  370. package/src/skill-use.ts +80 -0
  371. package/src/skills.ts +82 -54
  372. package/src/slack-bot-scopes.ts +31 -39
  373. package/src/slack-rest-mcp.ts +222 -0
  374. package/src/slack-task-policy.ts +96 -73
  375. package/src/spreadsheet-artifact-commands.ts +73 -2
  376. package/src/spreadsheet-artifact-query.ts +187 -39
  377. package/src/subscription-account-actions.ts +84 -0
  378. package/src/subscription-account-pools.ts +53 -0
  379. package/src/subscription-personal-authority-v2.ts +66 -0
  380. package/src/task-notes.ts +55 -51
  381. package/src/tool-action-review.ts +258 -0
  382. package/src/tool-catalog.ts +609 -372
  383. package/src/tool-policy.ts +82 -0
  384. package/src/tool-result-spill.ts +12 -9
  385. package/src/tool-review-presentation.ts +385 -0
  386. package/src/transcription-recordings.ts +145 -131
  387. package/src/turn-serving-policy.ts +166 -0
  388. package/src/usage-allowances.ts +248 -0
  389. package/src/vaults.ts +850 -0
  390. package/src/video-generation.ts +385 -360
  391. package/src/work-claims.ts +173 -149
  392. package/src/workspace-instruction-policies.ts +349 -276
  393. package/src/workspace-integration-wire.ts +101 -0
  394. package/src/workspace-integrations.ts +724 -0
  395. package/src/workspace-learning-administration.ts +57 -44
  396. package/src/workspace-learning-policy.ts +127 -96
  397. package/src/workspace-state.ts +250 -220
  398. package/src/xai-provider-account-authority.ts +22 -17
  399. package/dist/chunk-2AC63F4S.js +0 -171
  400. package/dist/chunk-2AC63F4S.js.map +0 -1
  401. package/dist/chunk-3SIZGL3O.js.map +0 -1
  402. package/dist/chunk-7ABONTXE.js.map +0 -1
  403. package/dist/chunk-BCS7WHCK.js +0 -139
  404. package/dist/chunk-BCS7WHCK.js.map +0 -1
  405. package/dist/chunk-GRG7PHWQ.js +0 -25
  406. package/dist/chunk-GRG7PHWQ.js.map +0 -1
  407. package/dist/chunk-JUFK3T4Q.js +0 -80
  408. package/dist/chunk-JUFK3T4Q.js.map +0 -1
  409. package/dist/chunk-M5ZGRVIQ.js +0 -719
  410. package/dist/chunk-M5ZGRVIQ.js.map +0 -1
  411. package/dist/chunk-MRWYRAS5.js.map +0 -1
  412. package/dist/chunk-OVFORMPW.js +0 -348
  413. package/dist/chunk-OVFORMPW.js.map +0 -1
  414. package/dist/chunk-P3HLDT77.js +0 -59
  415. package/dist/chunk-P3HLDT77.js.map +0 -1
  416. package/dist/chunk-QQUJ6NPW.js +0 -23093
  417. package/dist/chunk-QQUJ6NPW.js.map +0 -1
  418. package/dist/chunk-TXTQIYCV.js.map +0 -1
  419. package/dist/chunk-WYBDERIY.js.map +0 -1
  420. package/dist/chunk-Y3KNXVTD.js.map +0 -1
  421. package/dist/chunk-YBW5JSA3.js.map +0 -1
  422. package/dist/chunk-YRXAWWCU.js +0 -45
  423. package/dist/chunk-YRXAWWCU.js.map +0 -1
  424. package/dist/host-mcp-resolvers.d.ts +0 -32
  425. package/dist/host-mcp-resolvers.js +0 -34
  426. package/dist/host-mcp-resolvers.js.map +0 -1
  427. package/src/host-mcp-resolvers.ts +0 -50
  428. /package/dist/{chunk-5LYFSZ7O.js.map → chunk-352X6ENP.js.map} +0 -0
  429. /package/dist/{chunk-O5LEQHDM.js.map → chunk-Z7WEVGCL.js.map} +0 -0
@@ -0,0 +1,94 @@
1
+ // src/session-usage-limits.ts
2
+ import { z } from "zod";
3
+ var SESSION_USAGE_LIMIT_BASIS = "model_api_equivalent_v1";
4
+ var SessionUsageLimitBasis = z.literal(SESSION_USAGE_LIMIT_BASIS);
5
+ var SESSION_USAGE_LIMIT_MICROS_PER_DOLLAR = 1e6;
6
+ var SESSION_USAGE_LIMIT_MAX_MICROS = 1e7 * SESSION_USAGE_LIMIT_MICROS_PER_DOLLAR;
7
+ var SessionUsageLimitMicros = z.number().int().nonnegative().safe().max(SESSION_USAGE_LIMIT_MAX_MICROS);
8
+ var UsageMicros = z.number().int().nonnegative().safe();
9
+ var Count = z.number().int().nonnegative().safe();
10
+ var Version = z.number().int().nonnegative().safe();
11
+ var OperationId = z.string().min(1).max(256).refine(
12
+ (value) => value.trim().length > 0 && !value.includes("\0") && !/[\uD800-\uDFFF]/u.test(value) && new TextEncoder().encode(value).byteLength <= 256
13
+ );
14
+ var SessionUsageLimitStatus = z.enum([
15
+ "unlimited",
16
+ "within",
17
+ "reached",
18
+ "preparing",
19
+ "unavailable"
20
+ ]);
21
+ var SessionUsageLimitHistory = z.enum(["complete", "legacy_partial", "preparing"]);
22
+ var SessionUsageLimit = z.object({
23
+ basis: SessionUsageLimitBasis,
24
+ /** The task root whose limit applies. Equal to the session id for a root. */
25
+ rootSessionId: z.string().uuid(),
26
+ /** True when this projection was read through a descendant: edit the root's limit instead. */
27
+ inherited: z.boolean(),
28
+ status: SessionUsageLimitStatus,
29
+ /** Configured limit; null means no limit. Meaningless while `status` is `unavailable`. */
30
+ limitMicros: SessionUsageLimitMicros.nullable(),
31
+ /**
32
+ * Recorded known (priced or known-free) usage of the whole task tree, in USD
33
+ * micros. Null while `preparing` or `unavailable`: never render it as $0.
34
+ * May exceed `limitMicros`.
35
+ */
36
+ usedMicros: UsageMicros.nullable(),
37
+ /** Configuration version for compare-and-set writes. Survives clearing. */
38
+ version: Version,
39
+ /** Monotonic usage revision; increases whenever a usage receipt changes the total or coverage. */
40
+ usageRevision: Version,
41
+ history: SessionUsageLimitHistory,
42
+ /** `partial` when any usage has unknown cost or history is legacy/preparing: show "at least". */
43
+ coverage: z.enum(["complete", "partial"]),
44
+ pricedCalls: Count,
45
+ /** Responses with a known price of zero; they count as zero, unlike unpriced usage. */
46
+ freeCalls: Count,
47
+ /** Responses whose cost is unknown; they are excluded from `usedMicros`. */
48
+ unpricedCalls: Count,
49
+ updatedAt: z.string().datetime({ offset: true }).nullable()
50
+ }).strict();
51
+ var SetSessionUsageLimitRequest = z.object({
52
+ limitMicros: SessionUsageLimitMicros.nullable(),
53
+ expectedVersion: Version,
54
+ operationId: OperationId
55
+ }).strict();
56
+ var SessionUsageLimitReachedRefusal = z.object({
57
+ code: z.literal("session_usage_limit_reached"),
58
+ basis: SessionUsageLimitBasis,
59
+ rootSessionId: z.string().uuid(),
60
+ limitMicros: SessionUsageLimitMicros,
61
+ usedMicros: UsageMicros,
62
+ message: z.string().max(1024)
63
+ }).strict();
64
+ var SessionUsageLimitErrorCode = z.enum([
65
+ "session_usage_limit_reached",
66
+ "session_usage_limit_conflict",
67
+ "session_usage_limit_not_root",
68
+ "session_usage_limit_preparing",
69
+ "session_usage_limit_unavailable",
70
+ "session_usage_limit_disabled",
71
+ "session_usage_limit_forbidden"
72
+ ]);
73
+ var SessionUsageLimitUpdatedPayload = z.object({
74
+ basis: SessionUsageLimitBasis,
75
+ limitMicros: SessionUsageLimitMicros.nullable(),
76
+ previousLimitMicros: SessionUsageLimitMicros.nullable(),
77
+ version: Version
78
+ }).strict();
79
+
80
+ export {
81
+ SESSION_USAGE_LIMIT_BASIS,
82
+ SessionUsageLimitBasis,
83
+ SESSION_USAGE_LIMIT_MICROS_PER_DOLLAR,
84
+ SESSION_USAGE_LIMIT_MAX_MICROS,
85
+ SessionUsageLimitMicros,
86
+ SessionUsageLimitStatus,
87
+ SessionUsageLimitHistory,
88
+ SessionUsageLimit,
89
+ SetSessionUsageLimitRequest,
90
+ SessionUsageLimitReachedRefusal,
91
+ SessionUsageLimitErrorCode,
92
+ SessionUsageLimitUpdatedPayload
93
+ };
94
+ //# sourceMappingURL=chunk-OL23ARTF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/session-usage-limits.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Per-task (root session) usage limits.\n *\n * One optional limit belongs to a root session and is shared by every\n * descendant. It is measured in integer USD micros ($1 = 1,000,000) of the\n * canonical pre-margin API-equivalent model cost (`estimatedProviderCostMicros`)\n * recorded when a model response settles, whatever funds the call (Opengeni\n * credits, a connected subscription or a workspace-owned key).\n *\n * The limit is checked before each new model request; it is not a reservation.\n * Requests already admitted may finish and take recorded usage above the\n * limit, and concurrently admitted requests may overshoot together. Usage\n * without a known price is excluded from the total and disclosed as partial\n * coverage instead of being valued at zero. It is not an invoice cap.\n */\n\n/** Versioned measurement basis, exposed so a future basis cannot be confused with this one. */\nexport const SESSION_USAGE_LIMIT_BASIS = \"model_api_equivalent_v1\" as const;\nexport const SessionUsageLimitBasis = z.literal(SESSION_USAGE_LIMIT_BASIS);\nexport type SessionUsageLimitBasis = z.infer<typeof SessionUsageLimitBasis>;\n\nexport const SESSION_USAGE_LIMIT_MICROS_PER_DOLLAR = 1_000_000;\n/** $10M: the largest configurable limit, far inside safe integers. Usage itself is never clamped. */\nexport const SESSION_USAGE_LIMIT_MAX_MICROS = 10_000_000 * SESSION_USAGE_LIMIT_MICROS_PER_DOLLAR;\n\n/** A configured limit. Zero is a valid immediate stop; `null` (not this schema) means no limit. */\nexport const SessionUsageLimitMicros = z\n .number()\n .int()\n .nonnegative()\n .safe()\n .max(SESSION_USAGE_LIMIT_MAX_MICROS);\nexport type SessionUsageLimitMicros = z.infer<typeof SessionUsageLimitMicros>;\n\n/** Recorded usage is a non-negative safe integer and may exceed the configured maximum. */\nconst UsageMicros = z.number().int().nonnegative().safe();\nconst Count = z.number().int().nonnegative().safe();\nconst Version = z.number().int().nonnegative().safe();\n\nconst OperationId = z\n .string()\n .min(1)\n .max(256)\n .refine(\n (value) =>\n value.trim().length > 0 &&\n !value.includes(\"\\0\") &&\n !/[\\uD800-\\uDFFF]/u.test(value) &&\n new TextEncoder().encode(value).byteLength <= 256,\n );\n\n/**\n * - `unlimited`: no limit is configured; usage is still recorded.\n * - `within`: a limit is configured and recorded usage is below it.\n * - `reached`: recorded usage is at or above the limit; new model requests are refused.\n * - `preparing`: historical usage for a task created before this feature is\n * still being imported; the total is not yet meaningful and a new limit\n * cannot be set until it finishes.\n * - `unavailable`: the usage state could not be read. Never treat it as zero or unlimited.\n */\nexport const SessionUsageLimitStatus = z.enum([\n \"unlimited\",\n \"within\",\n \"reached\",\n \"preparing\",\n \"unavailable\",\n]);\nexport type SessionUsageLimitStatus = z.infer<typeof SessionUsageLimitStatus>;\n\n/**\n * `complete`: every recorded model response of this task was metered live.\n * `legacy_partial`: the task predates usage limits; available historical cost\n * snapshots were imported, but older usage may be missing. This never upgrades\n * to complete, because a missing old record is not proof of no usage.\n * `preparing`: the historical import has not finished.\n */\nexport const SessionUsageLimitHistory = z.enum([\"complete\", \"legacy_partial\", \"preparing\"]);\nexport type SessionUsageLimitHistory = z.infer<typeof SessionUsageLimitHistory>;\n\nexport const SessionUsageLimit = z\n .object({\n basis: SessionUsageLimitBasis,\n /** The task root whose limit applies. Equal to the session id for a root. */\n rootSessionId: z.string().uuid(),\n /** True when this projection was read through a descendant: edit the root's limit instead. */\n inherited: z.boolean(),\n status: SessionUsageLimitStatus,\n /** Configured limit; null means no limit. Meaningless while `status` is `unavailable`. */\n limitMicros: SessionUsageLimitMicros.nullable(),\n /**\n * Recorded known (priced or known-free) usage of the whole task tree, in USD\n * micros. Null while `preparing` or `unavailable`: never render it as $0.\n * May exceed `limitMicros`.\n */\n usedMicros: UsageMicros.nullable(),\n /** Configuration version for compare-and-set writes. Survives clearing. */\n version: Version,\n /** Monotonic usage revision; increases whenever a usage receipt changes the total or coverage. */\n usageRevision: Version,\n history: SessionUsageLimitHistory,\n /** `partial` when any usage has unknown cost or history is legacy/preparing: show \"at least\". */\n coverage: z.enum([\"complete\", \"partial\"]),\n pricedCalls: Count,\n /** Responses with a known price of zero; they count as zero, unlike unpriced usage. */\n freeCalls: Count,\n /** Responses whose cost is unknown; they are excluded from `usedMicros`. */\n unpricedCalls: Count,\n updatedAt: z.string().datetime({ offset: true }).nullable(),\n })\n .strict();\nexport type SessionUsageLimit = z.infer<typeof SessionUsageLimit>;\n\n/**\n * Compare-and-set write of a root task's limit. `expectedVersion` is the\n * `version` the caller last read; a stale version returns 409. A replay of the\n * same `operationId` with the same request returns the committed result.\n */\nexport const SetSessionUsageLimitRequest = z\n .object({\n limitMicros: SessionUsageLimitMicros.nullable(),\n expectedVersion: Version,\n operationId: OperationId,\n })\n .strict();\nexport type SetSessionUsageLimitRequest = z.infer<typeof SetSessionUsageLimitRequest>;\n\n/** Typed refusal for a fresh model request, message or goal resume after the limit is reached. */\nexport const SessionUsageLimitReachedRefusal = z\n .object({\n code: z.literal(\"session_usage_limit_reached\"),\n basis: SessionUsageLimitBasis,\n rootSessionId: z.string().uuid(),\n limitMicros: SessionUsageLimitMicros,\n usedMicros: UsageMicros,\n message: z.string().max(1_024),\n })\n .strict();\nexport type SessionUsageLimitReachedRefusal = z.infer<typeof SessionUsageLimitReachedRefusal>;\n\n/** Typed error codes for the usage-limit routes. */\nexport const SessionUsageLimitErrorCode = z.enum([\n \"session_usage_limit_reached\",\n \"session_usage_limit_conflict\",\n \"session_usage_limit_not_root\",\n \"session_usage_limit_preparing\",\n \"session_usage_limit_unavailable\",\n \"session_usage_limit_disabled\",\n \"session_usage_limit_forbidden\",\n]);\nexport type SessionUsageLimitErrorCode = z.infer<typeof SessionUsageLimitErrorCode>;\n\n/** The durable event appended to a root's stream when an authorized person changes its limit. */\nexport const SessionUsageLimitUpdatedPayload = z\n .object({\n basis: SessionUsageLimitBasis,\n limitMicros: SessionUsageLimitMicros.nullable(),\n previousLimitMicros: SessionUsageLimitMicros.nullable(),\n version: Version,\n })\n .strict();\nexport type SessionUsageLimitUpdatedPayload = z.infer<typeof SessionUsageLimitUpdatedPayload>;\n\nexport {\n formatSessionUsageMicros,\n parseSessionUsageLimitReachedRefusal,\n SESSION_USAGE_LIMIT_SEGMENT,\n SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON,\n sessionUsageLimitReachedMessage,\n} from \"./session-usage-limit-refusal\";\n"],"mappings":";AAAA,SAAS,SAAS;AAmBX,IAAM,4BAA4B;AAClC,IAAM,yBAAyB,EAAE,QAAQ,yBAAyB;AAGlE,IAAM,wCAAwC;AAE9C,IAAM,iCAAiC,MAAa;AAGpD,IAAM,0BAA0B,EACpC,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,IAAI,8BAA8B;AAIrC,IAAM,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK;AACxD,IAAM,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK;AAClD,IAAM,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK;AAEpD,IAAM,cAAc,EACjB,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAG,EACP;AAAA,EACC,CAAC,UACC,MAAM,KAAK,EAAE,SAAS,KACtB,CAAC,MAAM,SAAS,IAAI,KACpB,CAAC,mBAAmB,KAAK,KAAK,KAC9B,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE,cAAc;AAClD;AAWK,IAAM,0BAA0B,EAAE,KAAK;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUM,IAAM,2BAA2B,EAAE,KAAK,CAAC,YAAY,kBAAkB,WAAW,CAAC;AAGnF,IAAM,oBAAoB,EAC9B,OAAO;AAAA,EACN,OAAO;AAAA;AAAA,EAEP,eAAe,EAAE,OAAO,EAAE,KAAK;AAAA;AAAA,EAE/B,WAAW,EAAE,QAAQ;AAAA,EACrB,QAAQ;AAAA;AAAA,EAER,aAAa,wBAAwB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,YAAY,YAAY,SAAS;AAAA;AAAA,EAEjC,SAAS;AAAA;AAAA,EAET,eAAe;AAAA,EACf,SAAS;AAAA;AAAA,EAET,UAAU,EAAE,KAAK,CAAC,YAAY,SAAS,CAAC;AAAA,EACxC,aAAa;AAAA;AAAA,EAEb,WAAW;AAAA;AAAA,EAEX,eAAe;AAAA,EACf,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAC5D,CAAC,EACA,OAAO;AAQH,IAAM,8BAA8B,EACxC,OAAO;AAAA,EACN,aAAa,wBAAwB,SAAS;AAAA,EAC9C,iBAAiB;AAAA,EACjB,aAAa;AACf,CAAC,EACA,OAAO;AAIH,IAAM,kCAAkC,EAC5C,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,6BAA6B;AAAA,EAC7C,OAAO;AAAA,EACP,eAAe,EAAE,OAAO,EAAE,KAAK;AAAA,EAC/B,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,SAAS,EAAE,OAAO,EAAE,IAAI,IAAK;AAC/B,CAAC,EACA,OAAO;AAIH,IAAM,6BAA6B,EAAE,KAAK;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,kCAAkC,EAC5C,OAAO;AAAA,EACN,OAAO;AAAA,EACP,aAAa,wBAAwB,SAAS;AAAA,EAC9C,qBAAqB,wBAAwB,SAAS;AAAA,EACtD,SAAS;AACX,CAAC,EACA,OAAO;","names":[]}
@@ -0,0 +1,189 @@
1
+ // src/slack-rest-mcp.ts
2
+ var OFFICIAL_SLACK_MCP_URL = "https://mcp.slack.com/mcp";
3
+ var SLACK_REST_API_BASE = "https://slack.com/api/";
4
+ var SLACK_PRIVATE_FILE_ORIGIN = "https://files.slack.com";
5
+ var SLACK_PRIVATE_FILE_PATH_PREFIX = "/files-pri/";
6
+ function isSlackPrivateFileUrl(value) {
7
+ try {
8
+ const url = new URL(value);
9
+ return url.origin === SLACK_PRIVATE_FILE_ORIGIN && !url.username && !url.password && !url.hash && url.pathname.startsWith(SLACK_PRIVATE_FILE_PATH_PREFIX) && !url.pathname.split("/").some((segment) => segment === "." || segment === "..");
10
+ } catch {
11
+ return false;
12
+ }
13
+ }
14
+ var OPENGENI_SLACK_REST_USER_SCOPES = [
15
+ "channels:read",
16
+ "groups:read",
17
+ "im:read",
18
+ "mpim:read",
19
+ "channels:history",
20
+ "groups:history",
21
+ "im:history",
22
+ "mpim:history",
23
+ "users:read",
24
+ "files:read",
25
+ "im:write",
26
+ "chat:write"
27
+ ];
28
+ function normalizeSlackScopes(scopes) {
29
+ return [
30
+ ...new Set(
31
+ (typeof scopes === "string" ? [scopes] : scopes ?? []).flatMap((entry) => entry.split(/[\s,]+/u)).filter(Boolean)
32
+ )
33
+ ].sort();
34
+ }
35
+ var conversationScopes = ["channels:read", "groups:read", "im:read", "mpim:read"];
36
+ var historyScopes = ["channels:history", "groups:history", "im:history", "mpim:history"];
37
+ var channel = { type: "string", description: "Slack conversation ID, such as C123 or D123." };
38
+ var cursor = { type: "string", maxLength: 4096, description: "Cursor from the previous page." };
39
+ var directoryPage = { type: "integer", minimum: 1, maximum: 100, default: 100 };
40
+ var historyPage = { type: "integer", minimum: 1, maximum: 15, default: 15 };
41
+ var timestamp = { type: "string", pattern: "^[0-9]+\\.[0-9]+$" };
42
+ function tool(name, description, properties, required = [], mutation = false) {
43
+ return {
44
+ name,
45
+ description,
46
+ inputSchema: { type: "object", properties, required, additionalProperties: false },
47
+ annotations: {
48
+ readOnlyHint: !mutation,
49
+ destructiveHint: false,
50
+ idempotentHint: !mutation,
51
+ openWorldHint: true
52
+ }
53
+ };
54
+ }
55
+ var SLACK_REST_MCP_TOOLS = [
56
+ tool(
57
+ "slack_list_channels",
58
+ "Lists one page of conversations visible to your connected Slack account. Conversation types without a granted read scope are omitted.",
59
+ {
60
+ types: {
61
+ type: "array",
62
+ items: { type: "string", enum: ["public_channel", "private_channel", "im", "mpim"] },
63
+ minItems: 1,
64
+ maxItems: 4
65
+ },
66
+ cursor,
67
+ limit: directoryPage,
68
+ exclude_archived: { type: "boolean", default: true }
69
+ }
70
+ ),
71
+ tool(
72
+ "slack_get_channel_info",
73
+ "Gets metadata for one conversation visible to your connected Slack account.",
74
+ { channel },
75
+ ["channel"]
76
+ ),
77
+ tool(
78
+ "slack_list_channel_members",
79
+ "Lists one page of members in a visible channel or group conversation.",
80
+ { channel, cursor, limit: directoryPage },
81
+ ["channel"]
82
+ ),
83
+ tool("slack_list_users", "Lists one page of users in the connected Slack workspace.", {
84
+ cursor,
85
+ limit: directoryPage
86
+ }),
87
+ tool(
88
+ "slack_get_user_info",
89
+ "Gets a user's profile by their Slack user ID. Email is included only when Slack has granted that scope.",
90
+ { user: { type: "string" } },
91
+ ["user"]
92
+ ),
93
+ tool(
94
+ "slack_read_channel",
95
+ "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.",
96
+ {
97
+ channel,
98
+ cursor,
99
+ limit: historyPage,
100
+ oldest: timestamp,
101
+ latest: timestamp,
102
+ inclusive: { type: "boolean", default: false }
103
+ },
104
+ ["channel"]
105
+ ),
106
+ tool(
107
+ "slack_read_thread",
108
+ "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.",
109
+ {
110
+ channel,
111
+ ts: { ...timestamp, description: "Thread root message timestamp." },
112
+ cursor,
113
+ limit: historyPage
114
+ },
115
+ ["channel", "ts"]
116
+ ),
117
+ tool(
118
+ "slack_download_file",
119
+ "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.",
120
+ { file: { type: "string", pattern: "^F[A-Z0-9]+$", description: "Slack file ID." } },
121
+ ["file"]
122
+ ),
123
+ tool(
124
+ "slack_open_dm",
125
+ "Opens or resumes a direct message with one Slack user as your connected account.",
126
+ { user: { type: "string" } },
127
+ ["user"],
128
+ true
129
+ ),
130
+ tool(
131
+ "slack_send_message",
132
+ "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.",
133
+ {
134
+ channel,
135
+ text: { type: "string", minLength: 1, maxLength: 4e4 },
136
+ thread_ts: { ...timestamp, description: "Optional thread root timestamp for a reply." },
137
+ unfurl_links: { type: "boolean", default: false },
138
+ unfurl_media: { type: "boolean", default: false }
139
+ },
140
+ ["channel", "text"],
141
+ true
142
+ )
143
+ ];
144
+ var REQUIRED_ANY_SCOPES = {
145
+ slack_list_channels: conversationScopes,
146
+ slack_get_channel_info: conversationScopes,
147
+ slack_list_channel_members: ["channels:read", "groups:read", "mpim:read"],
148
+ slack_list_users: ["users:read"],
149
+ slack_get_user_info: ["users:read"],
150
+ slack_read_channel: historyScopes,
151
+ slack_read_thread: historyScopes,
152
+ slack_download_file: ["files:read"],
153
+ slack_open_dm: ["im:write"],
154
+ slack_send_message: ["chat:write"]
155
+ };
156
+ function slackRestMcpToolsForScopes(scopes) {
157
+ const granted = new Set(normalizeSlackScopes(scopes));
158
+ return SLACK_REST_MCP_TOOLS.filter(
159
+ (entry) => REQUIRED_ANY_SCOPES[entry.name]?.some((scope) => granted.has(scope))
160
+ ).map((entry) => ({
161
+ ...entry,
162
+ inputSchema: {
163
+ ...entry.inputSchema,
164
+ required: [...entry.inputSchema.required],
165
+ properties: { ...entry.inputSchema.properties }
166
+ },
167
+ annotations: { ...entry.annotations }
168
+ }));
169
+ }
170
+ var SLACK_CONVERSATION_READ_SCOPE_BY_TYPE = {
171
+ public_channel: "channels:read",
172
+ private_channel: "groups:read",
173
+ im: "im:read",
174
+ mpim: "mpim:read"
175
+ };
176
+
177
+ export {
178
+ OFFICIAL_SLACK_MCP_URL,
179
+ SLACK_REST_API_BASE,
180
+ SLACK_PRIVATE_FILE_ORIGIN,
181
+ SLACK_PRIVATE_FILE_PATH_PREFIX,
182
+ isSlackPrivateFileUrl,
183
+ OPENGENI_SLACK_REST_USER_SCOPES,
184
+ normalizeSlackScopes,
185
+ SLACK_REST_MCP_TOOLS,
186
+ slackRestMcpToolsForScopes,
187
+ SLACK_CONVERSATION_READ_SCOPE_BY_TYPE
188
+ };
189
+ //# sourceMappingURL=chunk-PUIUXIOL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/slack-rest-mcp.ts"],"sourcesContent":["/** The catalog and OAuth identity stay stable while calls use the ordinary Web API. */\nexport const OFFICIAL_SLACK_MCP_URL = \"https://mcp.slack.com/mcp\";\nexport const SLACK_REST_API_BASE = \"https://slack.com/api/\";\n/** Private Slack file bytes are served only from this origin and path. */\nexport const SLACK_PRIVATE_FILE_ORIGIN = \"https://files.slack.com\";\nexport const SLACK_PRIVATE_FILE_PATH_PREFIX = \"/files-pri/\";\n\n/** A private Slack file download URL that may carry a Slack user token. */\nexport function isSlackPrivateFileUrl(value: string | URL): boolean {\n try {\n const url = new URL(value);\n return (\n url.origin === SLACK_PRIVATE_FILE_ORIGIN &&\n !url.username &&\n !url.password &&\n !url.hash &&\n url.pathname.startsWith(SLACK_PRIVATE_FILE_PATH_PREFIX) &&\n !url.pathname.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n );\n } catch {\n return false;\n }\n}\n\nexport const OPENGENI_SLACK_REST_USER_SCOPES = [\n \"channels:read\",\n \"groups:read\",\n \"im:read\",\n \"mpim:read\",\n \"channels:history\",\n \"groups:history\",\n \"im:history\",\n \"mpim:history\",\n \"users:read\",\n \"files:read\",\n \"im:write\",\n \"chat:write\",\n] as const;\n\n/** Slack returns comma-delimited scopes, including in existing saved grants. */\nexport function normalizeSlackScopes(\n scopes: readonly string[] | string | undefined | null,\n): string[] {\n return [\n ...new Set(\n (typeof scopes === \"string\" ? [scopes] : (scopes ?? []))\n .flatMap((entry) => entry.split(/[\\s,]+/u))\n .filter(Boolean),\n ),\n ].sort();\n}\n\nexport type SlackRestMcpTool = {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required: string[];\n additionalProperties: false;\n };\n annotations: {\n readOnlyHint: boolean;\n destructiveHint: false;\n idempotentHint: boolean;\n openWorldHint: true;\n };\n};\n\nconst conversationScopes = [\"channels:read\", \"groups:read\", \"im:read\", \"mpim:read\"];\nconst historyScopes = [\"channels:history\", \"groups:history\", \"im:history\", \"mpim:history\"];\nconst channel = { type: \"string\", description: \"Slack conversation ID, such as C123 or D123.\" };\nconst cursor = { type: \"string\", maxLength: 4096, description: \"Cursor from the previous page.\" };\nconst directoryPage = { type: \"integer\", minimum: 1, maximum: 100, default: 100 };\nconst historyPage = { type: \"integer\", minimum: 1, maximum: 15, default: 15 };\nconst timestamp = { type: \"string\", pattern: \"^[0-9]+\\\\.[0-9]+$\" };\n\nfunction tool(\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[] = [],\n mutation = false,\n): SlackRestMcpTool {\n return {\n name,\n description,\n inputSchema: { type: \"object\", properties, required, additionalProperties: false },\n annotations: {\n readOnlyHint: !mutation,\n destructiveHint: false,\n idempotentHint: !mutation,\n openWorldHint: true,\n },\n };\n}\n\n/** Static reviewed pilot surface. Each call reads only one explicitly requested page. */\nexport const SLACK_REST_MCP_TOOLS: SlackRestMcpTool[] = [\n tool(\n \"slack_list_channels\",\n \"Lists one page of conversations visible to your connected Slack account. Conversation types without a granted read scope are omitted.\",\n {\n types: {\n type: \"array\",\n items: { type: \"string\", enum: [\"public_channel\", \"private_channel\", \"im\", \"mpim\"] },\n minItems: 1,\n maxItems: 4,\n },\n cursor,\n limit: directoryPage,\n exclude_archived: { type: \"boolean\", default: true },\n },\n ),\n tool(\n \"slack_get_channel_info\",\n \"Gets metadata for one conversation visible to your connected Slack account.\",\n { channel },\n [\"channel\"],\n ),\n tool(\n \"slack_list_channel_members\",\n \"Lists one page of members in a visible channel or group conversation.\",\n { channel, cursor, limit: directoryPage },\n [\"channel\"],\n ),\n tool(\"slack_list_users\", \"Lists one page of users in the connected Slack workspace.\", {\n cursor,\n limit: directoryPage,\n }),\n tool(\n \"slack_get_user_info\",\n \"Gets a user's profile by their Slack user ID. Email is included only when Slack has granted that scope.\",\n { user: { type: \"string\" } },\n [\"user\"],\n ),\n tool(\n \"slack_read_channel\",\n \"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.\",\n {\n channel,\n cursor,\n limit: historyPage,\n oldest: timestamp,\n latest: timestamp,\n inclusive: { type: \"boolean\", default: false },\n },\n [\"channel\"],\n ),\n tool(\n \"slack_read_thread\",\n \"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.\",\n {\n channel,\n ts: { ...timestamp, description: \"Thread root message timestamp.\" },\n cursor,\n limit: historyPage,\n },\n [\"channel\", \"ts\"],\n ),\n tool(\n \"slack_download_file\",\n \"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.\",\n { file: { type: \"string\", pattern: \"^F[A-Z0-9]+$\", description: \"Slack file ID.\" } },\n [\"file\"],\n ),\n tool(\n \"slack_open_dm\",\n \"Opens or resumes a direct message with one Slack user as your connected account.\",\n { user: { type: \"string\" } },\n [\"user\"],\n true,\n ),\n tool(\n \"slack_send_message\",\n \"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.\",\n {\n channel,\n text: { type: \"string\", minLength: 1, maxLength: 40000 },\n thread_ts: { ...timestamp, description: \"Optional thread root timestamp for a reply.\" },\n unfurl_links: { type: \"boolean\", default: false },\n unfurl_media: { type: \"boolean\", default: false },\n },\n [\"channel\", \"text\"],\n true,\n ),\n];\n\nconst REQUIRED_ANY_SCOPES: Readonly<Record<string, readonly string[]>> = {\n slack_list_channels: conversationScopes,\n slack_get_channel_info: conversationScopes,\n slack_list_channel_members: [\"channels:read\", \"groups:read\", \"mpim:read\"],\n slack_list_users: [\"users:read\"],\n slack_get_user_info: [\"users:read\"],\n slack_read_channel: historyScopes,\n slack_read_thread: historyScopes,\n slack_download_file: [\"files:read\"],\n slack_open_dm: [\"im:write\"],\n slack_send_message: [\"chat:write\"],\n};\n\nexport function slackRestMcpToolsForScopes(scopes: readonly string[] | string): SlackRestMcpTool[] {\n const granted = new Set(normalizeSlackScopes(scopes));\n return SLACK_REST_MCP_TOOLS.filter((entry) =>\n REQUIRED_ANY_SCOPES[entry.name]?.some((scope) => granted.has(scope)),\n ).map((entry) => ({\n ...entry,\n inputSchema: {\n ...entry.inputSchema,\n required: [...entry.inputSchema.required],\n properties: { ...entry.inputSchema.properties },\n },\n annotations: { ...entry.annotations },\n }));\n}\n\nexport const SLACK_CONVERSATION_READ_SCOPE_BY_TYPE = {\n public_channel: \"channels:read\",\n private_channel: \"groups:read\",\n im: \"im:read\",\n mpim: \"mpim:read\",\n} as const;\n"],"mappings":"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","names":[]}
@@ -1,8 +1,11 @@
1
1
  import {
2
+ SPREADSHEET_DEFAULT_COLUMN_WIDTH,
3
+ SPREADSHEET_DEFAULT_ROW_HEIGHT,
4
+ SPREADSHEET_MAX_DIMENSION_PIXELS,
2
5
  canonicalSpreadsheetDateFromMilliseconds,
3
6
  canonicalSpreadsheetDateMilliseconds,
4
7
  spreadsheetSheetId
5
- } from "./chunk-TXTQIYCV.js";
8
+ } from "./chunk-ILJ72KPO.js";
6
9
 
7
10
  // src/spreadsheet-artifact-query.ts
8
11
  var SPREADSHEET_ARTIFACT_QUERY_VERSION = 1;
@@ -23,6 +26,13 @@ var VIEWPORT_QUERY_PAYLOAD_BYTES = 32;
23
26
  var VIEWPORT_PROJECTION_PREFIX_BYTES = 48;
24
27
  var METADATA_PROJECTION_PREFIX_BYTES = 4;
25
28
  var GENERATIONS_FLAG = 1;
29
+ var DIMENSIONS_FLAG = 2;
30
+ var DIMENSION_KEYS = [
31
+ "defaultRowHeight",
32
+ "defaultColumnWidth",
33
+ "rowHeights",
34
+ "columnWidths"
35
+ ];
26
36
  var UINT32_MAX = 4294967295;
27
37
  var UINT64_MAX = 0xffffffffffffffffn;
28
38
  var FNV_OFFSET = 0xcbf29ce484222325n;
@@ -107,6 +117,8 @@ function encodeSpreadsheetViewportKernelProjection(input, maximumBytes = SPREADS
107
117
  payload.u32(projection.startColumn);
108
118
  payload.u32(projection.rowCount);
109
119
  payload.u32(projection.columnCount);
120
+ const hasDimensions = projection.defaultRowHeight !== void 0;
121
+ if (hasDimensions) writeDimensions(payload, projection);
110
122
  for (const cell of projection.cells) {
111
123
  payload.u32(cell.row - projection.startRow);
112
124
  payload.u32(cell.column - projection.startColumn);
@@ -115,7 +127,7 @@ function encodeSpreadsheetViewportKernelProjection(input, maximumBytes = SPREADS
115
127
  return encodeProjectionFrame(
116
128
  0,
117
129
  projection.revision,
118
- projection.generationId === null ? 0 : GENERATIONS_FLAG,
130
+ (projection.generationId === null ? 0 : GENERATIONS_FLAG) | (hasDimensions ? DIMENSIONS_FLAG : 0),
119
131
  projection.cells.length,
120
132
  payload.finish(),
121
133
  maximum
@@ -128,7 +140,7 @@ function encodeSpreadsheetMetadataKernelProjection(input, maximumBytes = SPREADS
128
140
  SPREADSHEET_ARTIFACT_METADATA_MIN_RESPONSE_BYTES
129
141
  );
130
142
  const payload = new DynamicWriter(maximum - PROJECTION_HEADER_BYTES - CHECKSUM_BYTES);
131
- payload.u32(0);
143
+ payload.u32(projection.modeledFeatures.dimensions ? 1 : 0);
132
144
  for (const sheet of projection.sheets) {
133
145
  payload.stableId(sheet.sheetId);
134
146
  payload.optionalStableId(sheet.generationId);
@@ -142,12 +154,13 @@ function encodeSpreadsheetMetadataKernelProjection(input, maximumBytes = SPREADS
142
154
  payload.u32(sheet.usedBounds.endRow);
143
155
  payload.u32(sheet.usedBounds.endColumn);
144
156
  }
157
+ if (projection.modeledFeatures.dimensions) writeDimensions(payload, sheet);
145
158
  }
146
159
  const generations = projection.sheets.length > 0 && projection.sheets[0].generationId !== null;
147
160
  return encodeProjectionFrame(
148
161
  1,
149
162
  projection.revision,
150
- generations ? GENERATIONS_FLAG : 0,
163
+ (generations ? GENERATIONS_FLAG : 0) | (projection.modeledFeatures.dimensions ? DIMENSIONS_FLAG : 0),
151
164
  projection.sheets.length,
152
165
  payload.finish(),
153
166
  maximum
@@ -310,7 +323,7 @@ function decodeProjectionFrame(bytes) {
310
323
  throw projectionError(`unsupported spreadsheet projection version: ${version}`);
311
324
  }
312
325
  const flags = reader.u16();
313
- if ((flags & ~GENERATIONS_FLAG) !== 0) {
326
+ if ((flags & ~(GENERATIONS_FLAG | DIMENSIONS_FLAG)) !== 0) {
314
327
  throw projectionError("spreadsheet projection flags are noncanonical");
315
328
  }
316
329
  const kindTag = reader.u8();
@@ -360,6 +373,8 @@ function decodeViewportPayload(frame) {
360
373
  const rowCount = reader.u32();
361
374
  const columnCount = reader.u32();
362
375
  validateViewportGeometry(startRow, startColumn, rowCount, columnCount);
376
+ const dimensions = (frame.flags & DIMENSIONS_FLAG) !== 0 ? readDimensions(reader) : {};
377
+ validateDimensionExtent(dimensions, startRow, rowCount, startColumn, columnCount);
363
378
  const cells = [];
364
379
  let previousOrdinal = -1;
365
380
  for (let index = 0; index < frame.itemCount; index += 1) {
@@ -390,6 +405,7 @@ function decodeViewportPayload(frame) {
390
405
  reader.done("viewport projection payload contains trailing bytes");
391
406
  return Object.freeze({
392
407
  revision: frame.revision,
408
+ ...dimensions,
393
409
  sheetId,
394
410
  generationId,
395
411
  startRow,
@@ -407,7 +423,8 @@ function decodeMetadataPayload(frame) {
407
423
  throw projectionError("metadata projection payload is truncated");
408
424
  }
409
425
  const reader = new Reader(frame.payload);
410
- if (reader.u32() !== 0) {
426
+ const features = reader.u32();
427
+ if ((features & ~1) !== 0 || features === 1 !== ((frame.flags & DIMENSIONS_FLAG) !== 0)) {
411
428
  throw projectionError("metadata projection contains unknown modeled feature bits");
412
429
  }
413
430
  const hasGenerations = (frame.flags & GENERATIONS_FLAG) !== 0;
@@ -441,12 +458,13 @@ function decodeMetadataPayload(frame) {
441
458
  }
442
459
  usedBounds = Object.freeze({ startRow, startColumn, endRow, endColumn });
443
460
  }
444
- sheets.push(Object.freeze({ sheetId, generationId, name, usedBounds }));
461
+ const dimensions = (frame.flags & DIMENSIONS_FLAG) !== 0 ? readDimensions(reader) : {};
462
+ sheets.push(Object.freeze({ sheetId, generationId, name, usedBounds, ...dimensions }));
445
463
  }
446
464
  reader.done("metadata projection payload contains trailing bytes");
447
465
  return Object.freeze({
448
466
  revision: frame.revision,
449
- modeledFeatures: MODELED_FEATURES_NONE,
467
+ modeledFeatures: Object.freeze({ dimensions: features === 1, hidden: false, merges: false }),
450
468
  sheets: Object.freeze(sheets)
451
469
  });
452
470
  }
@@ -500,8 +518,9 @@ function normalizeViewportProjection(input) {
500
518
  "rowCount",
501
519
  "sheetId",
502
520
  "startColumn",
503
- "startRow"
504
- ],
521
+ "startRow",
522
+ ...projection.defaultRowHeight === void 0 ? [] : DIMENSION_KEYS
523
+ ].sort(),
505
524
  "spreadsheet viewport projection"
506
525
  );
507
526
  const revision = uint64(projection.revision, "viewport revision");
@@ -512,6 +531,8 @@ function normalizeViewportProjection(input) {
512
531
  const rowCount = positiveUint32(projection.rowCount, "viewport rowCount");
513
532
  const columnCount = positiveUint32(projection.columnCount, "viewport columnCount");
514
533
  validateViewportGeometry(startRow, startColumn, rowCount, columnCount);
534
+ const dimensions = projection.defaultRowHeight === void 0 ? {} : normalizeDimensions(projection);
535
+ validateDimensionExtent(dimensions, startRow, rowCount, startColumn, columnCount);
515
536
  if (!Array.isArray(projection.cells)) throw projectionError("viewport cells must be an array");
516
537
  if (projection.cells.length > SPREADSHEET_ARTIFACT_VIEWPORT_MAX_CELLS) {
517
538
  throw projectionError("viewport projection exceeds its hard cell limit");
@@ -535,6 +556,7 @@ function normalizeViewportProjection(input) {
535
556
  }
536
557
  return Object.freeze({
537
558
  revision,
559
+ ...dimensions,
538
560
  sheetId,
539
561
  generationId,
540
562
  startRow,
@@ -554,8 +576,8 @@ function normalizeMetadataProjection(input) {
554
576
  const revision = uint64(projection.revision, "metadata revision");
555
577
  const features = exactRecord(projection.modeledFeatures, "metadata modeledFeatures");
556
578
  exactKeys(features, ["dimensions", "hidden", "merges"], "metadata modeledFeatures");
557
- if (features.dimensions !== false || features.hidden !== false || features.merges !== false) {
558
- throw projectionError("version 1 metadata modeled features must all be false");
579
+ if (typeof features.dimensions !== "boolean" || features.hidden !== false || features.merges !== false) {
580
+ throw projectionError("metadata modeled features are invalid");
559
581
  }
560
582
  if (!Array.isArray(projection.sheets)) throw projectionError("metadata sheets must be an array");
561
583
  if (projection.sheets.length > SPREADSHEET_ARTIFACT_METADATA_MAX_SHEETS) {
@@ -570,7 +592,17 @@ function normalizeMetadataProjection(input) {
570
592
  ownArrayElement(projection.sheets, index, "metadata sheets"),
571
593
  "metadata sheet"
572
594
  );
573
- exactKeys(value, ["generationId", "name", "sheetId", "usedBounds"], "metadata sheet");
595
+ exactKeys(
596
+ value,
597
+ [
598
+ "generationId",
599
+ "name",
600
+ "sheetId",
601
+ "usedBounds",
602
+ ...features.dimensions ? DIMENSION_KEYS : []
603
+ ].sort(),
604
+ "metadata sheet"
605
+ );
574
606
  const sheetId = spreadsheetSheetId(requireString(value.sheetId, "metadata sheetId"));
575
607
  if (ids.has(sheetId)) throw projectionError("metadata projection contains duplicate sheet ids");
576
608
  ids.add(sheetId);
@@ -590,14 +622,94 @@ function normalizeMetadataProjection(input) {
590
622
  }
591
623
  names.add(foldedName);
592
624
  const usedBounds = value.usedBounds === null ? null : normalizeUsedBounds(value.usedBounds);
593
- sheets.push(Object.freeze({ sheetId, generationId, name, usedBounds }));
625
+ sheets.push(
626
+ Object.freeze({
627
+ sheetId,
628
+ generationId,
629
+ name,
630
+ usedBounds,
631
+ ...features.dimensions ? normalizeDimensions(value) : {}
632
+ })
633
+ );
594
634
  }
595
635
  return Object.freeze({
596
636
  revision,
597
- modeledFeatures: MODELED_FEATURES_NONE,
637
+ modeledFeatures: Object.freeze({
638
+ dimensions: features.dimensions,
639
+ hidden: false,
640
+ merges: false
641
+ }),
598
642
  sheets: Object.freeze(sheets)
599
643
  });
600
644
  }
645
+ function normalizeDimensions(input) {
646
+ if (input.defaultRowHeight !== SPREADSHEET_DEFAULT_ROW_HEIGHT || input.defaultColumnWidth !== SPREADSHEET_DEFAULT_COLUMN_WIDTH) {
647
+ throw projectionError("dimension defaults are invalid");
648
+ }
649
+ const normalizeEntries = (value, defaultPixels) => {
650
+ if (!Array.isArray(value) || value.length > SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES / 8)
651
+ throw projectionError("dimension entries exceed limits");
652
+ let previous = -1;
653
+ const entries = [];
654
+ for (let offset = 0; offset < value.length; offset += 1) {
655
+ const entry = ownArrayElement(value, offset, "dimension entries");
656
+ if (!Array.isArray(entry) || entry.length !== 2)
657
+ throw projectionError("dimension entry must be an index/pixels pair");
658
+ const index = uint32(ownArrayElement(entry, 0, "dimension index"), `dimension ${offset}`);
659
+ const pixels = positiveUint32(
660
+ ownArrayElement(entry, 1, "dimension pixels"),
661
+ "dimension pixels"
662
+ );
663
+ if (index <= previous || pixels > SPREADSHEET_MAX_DIMENSION_PIXELS || pixels === defaultPixels)
664
+ throw projectionError("dimensions must be sorted unique non-default entries within bounds");
665
+ previous = index;
666
+ entries.push(Object.freeze([index, pixels]));
667
+ }
668
+ return Object.freeze(entries);
669
+ };
670
+ return Object.freeze({
671
+ defaultRowHeight: SPREADSHEET_DEFAULT_ROW_HEIGHT,
672
+ defaultColumnWidth: SPREADSHEET_DEFAULT_COLUMN_WIDTH,
673
+ rowHeights: normalizeEntries(input.rowHeights, SPREADSHEET_DEFAULT_ROW_HEIGHT),
674
+ columnWidths: normalizeEntries(input.columnWidths, SPREADSHEET_DEFAULT_COLUMN_WIDTH)
675
+ });
676
+ }
677
+ function writeDimensions(writer, dimensions) {
678
+ writer.u32(dimensions.defaultRowHeight);
679
+ writer.u32(dimensions.defaultColumnWidth);
680
+ for (const entries of [dimensions.rowHeights, dimensions.columnWidths]) {
681
+ writer.u32(entries.length);
682
+ for (const [index, pixels] of entries) {
683
+ writer.u32(index);
684
+ writer.u32(pixels);
685
+ }
686
+ }
687
+ }
688
+ function readDimensions(reader) {
689
+ const defaultRowHeight = reader.u32();
690
+ const defaultColumnWidth = reader.u32();
691
+ const axes = [];
692
+ for (let axis = 0; axis < 2; axis += 1) {
693
+ const count = reader.u32();
694
+ if (count > SPREADSHEET_ARTIFACT_PROJECTION_MAX_BYTES / 8)
695
+ throw projectionError("dimension entries exceed limits");
696
+ const entries = [];
697
+ for (let index = 0; index < count; index += 1) entries.push([reader.u32(), reader.u32()]);
698
+ axes.push(entries);
699
+ }
700
+ return normalizeDimensions({
701
+ defaultRowHeight,
702
+ defaultColumnWidth,
703
+ rowHeights: axes[0],
704
+ columnWidths: axes[1]
705
+ });
706
+ }
707
+ function validateDimensionExtent(dimensions, startRow, rowCount, startColumn, columnCount) {
708
+ if (dimensions.rowHeights?.some(([index]) => index < startRow || index - startRow >= rowCount) || dimensions.columnWidths?.some(
709
+ ([index]) => index < startColumn || index - startColumn >= columnCount
710
+ ))
711
+ throw projectionError("dimensions lie outside viewport");
712
+ }
601
713
  function normalizeProjectedCell(input) {
602
714
  const cell = exactRecord(input, "projected cell");
603
715
  exactKeys(cell, ["column", "formula", "row", "value"], "projected cell");
@@ -810,11 +922,6 @@ function queryError(message) {
810
922
  function projectionError(message) {
811
923
  return new TypeError(message);
812
924
  }
813
- var MODELED_FEATURES_NONE = Object.freeze({
814
- dimensions: false,
815
- hidden: false,
816
- merges: false
817
- });
818
925
  var EMPTY_VALUE = Object.freeze({
819
926
  kind: "empty"
820
927
  });
@@ -1142,4 +1249,4 @@ export {
1142
1249
  decodeSpreadsheetMetadataKernelProjection,
1143
1250
  assertCanonicalSpreadsheetArtifactKernelProjectionBytes
1144
1251
  };
1145
- //# sourceMappingURL=chunk-Y3KNXVTD.js.map
1252
+ //# sourceMappingURL=chunk-RMWXDZEO.js.map