@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.
- package/dist/agent-authored-durable-text.d.ts +9 -9
- package/dist/agent-config.d.ts +971 -0
- package/dist/agent-instruction-changes.d.ts +0 -2
- package/dist/allowance-refusal.d.ts +9 -0
- package/dist/allowance-refusal.js +50 -0
- package/dist/allowance-refusal.js.map +1 -0
- package/dist/analytics-consent-report.d.ts +19 -0
- package/dist/analytics-consent-report.js +10 -0
- package/dist/analytics-consent-report.js.map +1 -0
- package/dist/api-key-presets.d.ts +19 -0
- package/dist/artifact-catalog.d.ts +188 -0
- package/dist/artifacts.d.ts +86 -0
- package/dist/atlassian-native-retirement.d.ts +16 -0
- package/dist/atlassian-native-retirement.js +30 -0
- package/dist/atlassian-native-retirement.js.map +1 -0
- package/dist/atlassian.d.ts +1 -0
- package/dist/atlassian.js +34 -19
- package/dist/browser-storage.d.ts +5 -0
- package/dist/browser-storage.js +9 -0
- package/dist/browser-storage.js.map +1 -0
- package/dist/bundled-skills.d.ts +24 -1
- package/dist/canonical-human-identities.js +2 -1
- package/dist/chunk-2ZIHHL72.js +153 -0
- package/dist/chunk-2ZIHHL72.js.map +1 -0
- package/dist/{chunk-5LYFSZ7O.js → chunk-352X6ENP.js} +31 -31
- package/dist/chunk-4JGHSSB7.js +11 -0
- package/dist/chunk-4JGHSSB7.js.map +1 -0
- package/dist/chunk-4QO6GJUX.js +85 -0
- package/dist/chunk-4QO6GJUX.js.map +1 -0
- package/dist/chunk-4VDMHLLL.js +49 -0
- package/dist/chunk-4VDMHLLL.js.map +1 -0
- package/dist/chunk-56SNIMDO.js +9 -0
- package/dist/chunk-56SNIMDO.js.map +1 -0
- package/dist/chunk-6C2HKFTU.js +207 -0
- package/dist/chunk-6C2HKFTU.js.map +1 -0
- package/dist/chunk-6IXO76Z6.js +72 -0
- package/dist/chunk-6IXO76Z6.js.map +1 -0
- package/dist/chunk-7272KVWZ.js +60 -0
- package/dist/chunk-7272KVWZ.js.map +1 -0
- package/dist/{chunk-7ABONTXE.js → chunk-E3GGUBHS.js} +49 -5
- package/dist/chunk-E3GGUBHS.js.map +1 -0
- package/dist/chunk-EFZYKUE2.js +767 -0
- package/dist/chunk-EFZYKUE2.js.map +1 -0
- package/dist/chunk-EKWNTOG3.js +154 -0
- package/dist/chunk-EKWNTOG3.js.map +1 -0
- package/dist/chunk-HABQ7ADB.js +234 -0
- package/dist/chunk-HABQ7ADB.js.map +1 -0
- package/dist/chunk-HRRU4QPI.js +91 -0
- package/dist/chunk-HRRU4QPI.js.map +1 -0
- package/dist/{chunk-3SIZGL3O.js → chunk-IK36LXKC.js} +18 -2
- package/dist/chunk-IK36LXKC.js.map +1 -0
- package/dist/{chunk-TXTQIYCV.js → chunk-ILJ72KPO.js} +56 -3
- package/dist/chunk-ILJ72KPO.js.map +1 -0
- package/dist/chunk-J4HQ3UKY.js +93 -0
- package/dist/chunk-J4HQ3UKY.js.map +1 -0
- package/dist/chunk-KHHZTBP7.js +11 -0
- package/dist/chunk-KHHZTBP7.js.map +1 -0
- package/dist/{chunk-WYBDERIY.js → chunk-LZ2LAHIX.js} +47 -41
- package/dist/chunk-LZ2LAHIX.js.map +1 -0
- package/dist/chunk-NDZHPTCL.js +400 -0
- package/dist/chunk-NDZHPTCL.js.map +1 -0
- package/dist/chunk-OF6OKOBF.js +54793 -0
- package/dist/chunk-OF6OKOBF.js.map +1 -0
- package/dist/chunk-OL23ARTF.js +94 -0
- package/dist/chunk-OL23ARTF.js.map +1 -0
- package/dist/chunk-PUIUXIOL.js +189 -0
- package/dist/chunk-PUIUXIOL.js.map +1 -0
- package/dist/{chunk-Y3KNXVTD.js → chunk-RMWXDZEO.js} +128 -21
- package/dist/chunk-RMWXDZEO.js.map +1 -0
- package/dist/{chunk-MRWYRAS5.js → chunk-SHO4YO4B.js} +27 -35
- package/dist/chunk-SHO4YO4B.js.map +1 -0
- package/dist/chunk-SWRN2DJ3.js +153 -0
- package/dist/chunk-SWRN2DJ3.js.map +1 -0
- package/dist/chunk-TCXCRBPF.js +267 -0
- package/dist/chunk-TCXCRBPF.js.map +1 -0
- package/dist/chunk-TLU3UEMD.js +324 -0
- package/dist/chunk-TLU3UEMD.js.map +1 -0
- package/dist/chunk-TSWWZMUS.js +186 -0
- package/dist/chunk-TSWWZMUS.js.map +1 -0
- package/dist/{chunk-PX3VCKAU.js → chunk-WVCFSOUZ.js} +1 -1
- package/dist/{chunk-PX3VCKAU.js.map → chunk-WVCFSOUZ.js.map} +1 -1
- package/dist/chunk-XDLAGX66.js +127 -0
- package/dist/chunk-XDLAGX66.js.map +1 -0
- package/dist/chunk-YKZ4WU4P.js +33 -0
- package/dist/chunk-YKZ4WU4P.js.map +1 -0
- package/dist/{chunk-O5LEQHDM.js → chunk-Z7WEVGCL.js} +3 -3
- package/dist/{chunk-YBW5JSA3.js → chunk-ZDCRWCGZ.js} +119 -101
- package/dist/chunk-ZDCRWCGZ.js.map +1 -0
- package/dist/claude-provider-account-authority.d.ts +18 -0
- package/dist/claude-subscription-oauth.d.ts +42 -0
- package/dist/claude-subscription-usage.d.ts +159 -0
- package/dist/client-error-report.d.ts +158 -0
- package/dist/client-error-report.js +164 -0
- package/dist/client-error-report.js.map +1 -0
- package/dist/code-search.d.ts +52 -0
- package/dist/code-search.js +40 -0
- package/dist/code-search.js.map +1 -0
- package/dist/codex-provider-account-authority.js +20 -12
- package/dist/codex-provider-account-authority.js.map +1 -1
- package/dist/company-profile.d.ts +144 -6
- package/dist/connect.d.ts +37 -0
- package/dist/connect.js +216 -159
- package/dist/connect.js.map +1 -1
- package/dist/connection-account-label.d.ts +2 -0
- package/dist/connection-account-label.js +35 -0
- package/dist/connection-account-label.js.map +1 -0
- package/dist/connection-authority.d.ts +9 -317
- package/dist/connection-authority.js +37 -42
- package/dist/connector-attachments.js +2 -1
- package/dist/connector-destinations.js +2 -1
- package/dist/connector-tool-permissions.d.ts +137 -0
- package/dist/cua-desktop-tools.d.ts +17 -0
- package/dist/define-schema.d.ts +8 -0
- package/dist/direct-model-provider.d.ts +36 -0
- package/dist/editable-artifact-codec-registry.js +5 -5
- package/dist/editable-artifact-committed-transaction.js +3 -2
- package/dist/editable-artifact-live.js +5 -5
- package/dist/editable-artifact-serialized-commit.js +6 -6
- package/dist/editable-artifact-versions.d.ts +7 -1
- package/dist/editable-artifact-versions.js +1 -1
- package/dist/editable-artifacts.js +62 -56
- package/dist/event-preview.d.ts +22 -0
- package/dist/external-identities.d.ts +138 -0
- package/dist/external-identities.js +9 -4
- package/dist/first-party-tool-authorization.d.ts +815 -0
- package/dist/github-repository-contracts.js +60 -43
- package/dist/github-repository-contracts.js.map +1 -1
- package/dist/google-drive.d.ts +2 -1
- package/dist/google-drive.js +305 -238
- package/dist/google-drive.js.map +1 -1
- package/dist/host-mcp-bindings.d.ts +5 -0
- package/dist/host-mcp-bindings.js +233 -170
- package/dist/host-mcp-bindings.js.map +1 -1
- package/dist/image-generation.d.ts +1 -0
- package/dist/index.d.ts +16761 -5946
- package/dist/index.js +1973 -260
- package/dist/insights-usage.d.ts +877 -0
- package/dist/insights-usage.js +559 -0
- package/dist/insights-usage.js.map +1 -0
- package/dist/interaction.d.ts +1176 -829
- package/dist/knowledge-entries.d.ts +81 -2
- package/dist/knowledge-preparation.d.ts +239 -0
- package/dist/managed-auth-session-sets.d.ts +7 -0
- package/dist/managed-auth-session-sets.js +198 -132
- package/dist/managed-auth-session-sets.js.map +1 -1
- package/dist/managed-sign-in-methods.d.ts +56 -0
- package/dist/managed-sign-in-methods.js +64 -0
- package/dist/managed-sign-in-methods.js.map +1 -0
- package/dist/mcp-catalog-limits.d.ts +2 -0
- package/dist/mcp-oauth.d.ts +2 -2
- package/dist/mcp-structured-content.d.ts +25 -0
- package/dist/modal-native-proof-v2.d.ts +587 -0
- package/dist/modal-native-proof-v2.js +38 -0
- package/dist/modal-native-proof-v2.js.map +1 -0
- package/dist/model-account-choice.d.ts +235 -0
- package/dist/model-account-settings.d.ts +422 -0
- package/dist/model-availability.d.ts +15 -0
- package/dist/model-connection-access.d.ts +13 -0
- package/dist/model-context-inspector.d.ts +98 -0
- package/dist/model-display.d.ts +43 -0
- package/dist/model-display.js +17 -0
- package/dist/model-display.js.map +1 -0
- package/dist/model-picker-order.d.ts +3 -1
- package/dist/model-picker-order.js +3 -0
- package/dist/model-picker-order.js.map +1 -1
- package/dist/organization-access.d.ts +412 -0
- package/dist/organization-access.js +39 -0
- package/dist/organization-access.js.map +1 -0
- package/dist/organization-integration-policy.d.ts +27 -0
- package/dist/organization-membership-lifecycle.d.ts +38 -0
- package/dist/organization-model-usage.d.ts +146 -0
- package/dist/organization-model-usage.js +78 -0
- package/dist/organization-model-usage.js.map +1 -0
- package/dist/organization-recovery.js +2 -1
- package/dist/organization-usage.d.ts +138 -0
- package/dist/permissions.d.ts +18 -0
- package/dist/personal-github.d.ts +1 -0
- package/dist/personal-github.js +199 -144
- package/dist/personal-github.js.map +1 -1
- package/dist/prepared-mcp-setup.d.ts +54 -0
- package/dist/prepared-mcp-setup.js +12 -0
- package/dist/prepared-mcp-setup.js.map +1 -0
- package/dist/product-analytics.d.ts +116 -0
- package/dist/product-lifecycle-facts.d.ts +73 -0
- package/dist/remember.d.ts +98 -6
- package/dist/retained-output.d.ts +8 -0
- package/dist/sandbox-file-artifacts.d.ts +1 -0
- package/dist/sandbox-provider-command.d.ts +91 -1
- package/dist/sandbox-recovery.d.ts +146 -0
- package/dist/secret-generator.d.ts +44 -0
- package/dist/secret-references.d.ts +90 -0
- package/dist/secret-resolution.d.ts +111 -0
- package/dist/secret-totp.d.ts +41 -0
- package/dist/session-final-reply.d.ts +6 -0
- package/dist/session-final-reply.js +9 -0
- package/dist/session-final-reply.js.map +1 -0
- package/dist/session-goal-reports.d.ts +21 -0
- package/dist/session-history-import.d.ts +1272 -0
- package/dist/session-list-entries.d.ts +4 -0
- package/dist/session-list-entries.js +56 -0
- package/dist/session-list-entries.js.map +1 -0
- package/dist/session-mcp-projections.d.ts +6 -0
- package/dist/session-mcp-tool-permissions.d.ts +62 -0
- package/dist/session-message-search.d.ts +68 -0
- package/dist/session-target.d.ts +18 -0
- package/dist/session-titles.d.ts +8 -0
- package/dist/session-titles.js +5 -1
- package/dist/session-usage-limit-refusal.d.ts +34 -0
- package/dist/session-usage-limit-refusal.js +15 -0
- package/dist/session-usage-limit-refusal.js.map +1 -0
- package/dist/session-usage-limits.d.ts +127 -0
- package/dist/session-usage-limits.js +41 -0
- package/dist/session-usage-limits.js.map +1 -0
- package/dist/signup-attribution.d.ts +39 -0
- package/dist/site-data.d.ts +286 -0
- package/dist/site-operations.d.ts +39 -0
- package/dist/site-publishing.d.ts +778 -0
- package/dist/site-session-http.d.ts +89 -4
- package/dist/site-session-http.js +25 -1
- package/dist/site-sql.d.ts +421 -0
- package/dist/skill-catalog-context.d.ts +7 -0
- package/dist/skill-files.d.ts +1 -1
- package/dist/skill-use.d.ts +61 -0
- package/dist/skills.d.ts +15 -0
- package/dist/slack-bot-scopes.d.ts +17 -12
- package/dist/slack-bot-scopes.js +10 -3
- package/dist/slack-rest-mcp.d.ts +36 -0
- package/dist/slack-rest-mcp.js +25 -0
- package/dist/slack-rest-mcp.js.map +1 -0
- package/dist/spreadsheet-artifact-commands.d.ts +14 -1
- package/dist/spreadsheet-artifact-commands.js +8 -2
- package/dist/spreadsheet-artifact-query.d.ts +13 -6
- package/dist/spreadsheet-artifact-query.js +3 -3
- package/dist/subscription-account-actions.d.ts +64 -0
- package/dist/subscription-account-pools.d.ts +292 -0
- package/dist/subscription-personal-authority-v2.d.ts +28 -0
- package/dist/subscription-personal-authority-v2.js +12 -0
- package/dist/subscription-personal-authority-v2.js.map +1 -0
- package/dist/tool-action-review.d.ts +132 -0
- package/dist/tool-catalog.d.ts +408 -0
- package/dist/tool-policy.d.ts +5 -0
- package/dist/tool-review-presentation.d.ts +12 -0
- package/dist/tool-review-presentation.js +17 -0
- package/dist/tool-review-presentation.js.map +1 -0
- package/dist/transcription-recordings.d.ts +21 -0
- package/dist/turn-serving-policy.d.ts +221 -0
- package/dist/usage-allowances.d.ts +314 -0
- package/dist/usage-allowances.js +52 -0
- package/dist/usage-allowances.js.map +1 -0
- package/dist/vaults.d.ts +1286 -0
- package/dist/video-generation.d.ts +3 -0
- package/dist/video-generation.js +2 -1
- package/dist/workspace-integration-wire.d.ts +36 -0
- package/dist/workspace-integration-wire.js +23 -0
- package/dist/workspace-integration-wire.js.map +1 -0
- package/dist/workspace-integrations.d.ts +1028 -0
- package/dist/xai-provider-account-authority.js +2 -1
- package/package.json +93 -5
- package/src/agent-authored-durable-text.ts +14 -11
- package/src/agent-config.ts +1698 -0
- package/src/agent-instruction-changes.ts +91 -74
- package/src/agent-learning.ts +94 -67
- package/src/agent-topology.ts +57 -52
- package/src/allowance-refusal.ts +81 -0
- package/src/analytics-consent-report.ts +20 -0
- package/src/api-key-presets.ts +28 -0
- package/src/artifact-catalog.ts +82 -0
- package/src/artifacts.ts +299 -227
- package/src/atlassian-native-retirement.ts +33 -0
- package/src/atlassian.ts +135 -108
- package/src/browser-storage.ts +10 -0
- package/src/bundled-skills.ts +60 -17
- package/src/canonical-human-identities.ts +60 -58
- package/src/claude-provider-account-authority.ts +12 -0
- package/src/claude-subscription-oauth.ts +73 -0
- package/src/claude-subscription-usage.ts +68 -0
- package/src/client-error-report.ts +343 -0
- package/src/code-search.ts +105 -0
- package/src/codex-provider-account-authority.ts +21 -16
- package/src/company-brain-governed-writes.ts +255 -233
- package/src/company-brain.ts +164 -153
- package/src/company-profile.ts +365 -292
- package/src/connect.ts +212 -173
- package/src/connection-account-label.ts +46 -0
- package/src/connection-authority.ts +183 -364
- package/src/connector-attachments.ts +137 -122
- package/src/connector-destinations.ts +46 -42
- package/src/connector-tool-permissions.ts +117 -0
- package/src/cua-desktop-tools.gen.json +6512 -0
- package/src/cua-desktop-tools.linux.gen.json +6600 -0
- package/src/cua-desktop-tools.ts +36 -0
- package/src/cua-desktop-tools.windows.gen.json +6353 -0
- package/src/define-schema.ts +10 -0
- package/src/direct-model-provider.ts +108 -0
- package/src/editable-artifact-committed-transaction.ts +17 -0
- package/src/editable-artifact-versions.ts +7 -1
- package/src/event-preview.ts +53 -3
- package/src/external-identities.ts +249 -176
- package/src/feedback.ts +43 -30
- package/src/first-party-tool-authorization.ts +356 -0
- package/src/github-repository-contracts.ts +78 -64
- package/src/google-drive.ts +285 -234
- package/src/governed-learning-activation.ts +152 -131
- package/src/governed-learning-evaluator.ts +140 -133
- package/src/host-mcp-bindings.ts +252 -198
- package/src/image-generation.ts +104 -95
- package/src/index.ts +13235 -8687
- package/src/insights-usage.ts +727 -0
- package/src/interaction.ts +3070 -2326
- package/src/knowledge-entries.ts +361 -276
- package/src/knowledge-preparation.ts +57 -0
- package/src/knowledge.ts +246 -213
- package/src/managed-auth-session-sets.ts +220 -144
- package/src/managed-sign-in-methods.ts +52 -0
- package/src/mcp-catalog-limits.ts +2 -0
- package/src/mcp-oauth.ts +43 -34
- package/src/mcp-receipts.ts +192 -192
- package/src/mcp-structured-content.ts +81 -0
- package/src/memory-slack-delivery.ts +171 -142
- package/src/modal-native-proof-v2.ts +429 -0
- package/src/model-account-choice.ts +177 -0
- package/src/model-account-settings.ts +210 -0
- package/src/model-availability.ts +22 -0
- package/src/model-connection-access.ts +61 -14
- package/src/model-context-inspector.ts +133 -99
- package/src/model-display.ts +221 -0
- package/src/model-picker-order.ts +12 -1
- package/src/organization-access.ts +217 -0
- package/src/organization-integration-policy.ts +63 -0
- package/src/organization-membership-lifecycle.ts +528 -382
- package/src/organization-model-usage.ts +81 -0
- package/src/organization-recovery.ts +147 -135
- package/src/organization-usage.ts +94 -0
- package/src/permissions.ts +88 -52
- package/src/personal-github.ts +210 -171
- package/src/preference-registry.ts +314 -258
- package/src/prepared-mcp-setup.ts +189 -0
- package/src/product-analytics.ts +261 -0
- package/src/product-lifecycle-facts.ts +122 -0
- package/src/remember.ts +181 -167
- package/src/retained-output.ts +194 -165
- package/src/sandbox-file-artifacts.ts +60 -47
- package/src/sandbox-provider-command.ts +88 -20
- package/src/sandbox-recovery.ts +129 -0
- package/src/scoped-knowledge.ts +61 -43
- package/src/secret-generator.ts +155 -0
- package/src/secret-references.ts +414 -0
- package/src/secret-resolution.ts +274 -0
- package/src/secret-totp.ts +188 -0
- package/src/session-final-reply.ts +16 -0
- package/src/session-goal-reports.ts +64 -0
- package/src/session-history-import.ts +177 -0
- package/src/session-list-entries.ts +96 -0
- package/src/session-mcp-projections.ts +11 -0
- package/src/session-mcp-tool-permissions.ts +108 -0
- package/src/session-message-search.ts +61 -0
- package/src/session-target.ts +57 -0
- package/src/session-titles.ts +80 -10
- package/src/session-topology-primitives.ts +19 -12
- package/src/session-usage-limit-refusal.ts +101 -0
- package/src/session-usage-limits.ts +171 -0
- package/src/signup-attribution.ts +86 -0
- package/src/site-data.ts +339 -0
- package/src/site-operations.ts +154 -0
- package/src/site-publishing.ts +876 -0
- package/src/site-session-http.ts +294 -16
- package/src/site-sql.ts +1123 -0
- package/src/skill-catalog-context.ts +50 -0
- package/src/skill-files.ts +3 -3
- package/src/skill-use.ts +80 -0
- package/src/skills.ts +82 -54
- package/src/slack-bot-scopes.ts +31 -39
- package/src/slack-rest-mcp.ts +222 -0
- package/src/slack-task-policy.ts +96 -73
- package/src/spreadsheet-artifact-commands.ts +73 -2
- package/src/spreadsheet-artifact-query.ts +187 -39
- package/src/subscription-account-actions.ts +84 -0
- package/src/subscription-account-pools.ts +53 -0
- package/src/subscription-personal-authority-v2.ts +66 -0
- package/src/task-notes.ts +55 -51
- package/src/tool-action-review.ts +258 -0
- package/src/tool-catalog.ts +609 -372
- package/src/tool-policy.ts +82 -0
- package/src/tool-result-spill.ts +12 -9
- package/src/tool-review-presentation.ts +385 -0
- package/src/transcription-recordings.ts +145 -131
- package/src/turn-serving-policy.ts +166 -0
- package/src/usage-allowances.ts +248 -0
- package/src/vaults.ts +850 -0
- package/src/video-generation.ts +385 -360
- package/src/work-claims.ts +173 -149
- package/src/workspace-instruction-policies.ts +349 -276
- package/src/workspace-integration-wire.ts +101 -0
- package/src/workspace-integrations.ts +724 -0
- package/src/workspace-learning-administration.ts +57 -44
- package/src/workspace-learning-policy.ts +127 -96
- package/src/workspace-state.ts +250 -220
- package/src/xai-provider-account-authority.ts +22 -17
- package/dist/chunk-2AC63F4S.js +0 -171
- package/dist/chunk-2AC63F4S.js.map +0 -1
- package/dist/chunk-3SIZGL3O.js.map +0 -1
- package/dist/chunk-7ABONTXE.js.map +0 -1
- package/dist/chunk-BCS7WHCK.js +0 -139
- package/dist/chunk-BCS7WHCK.js.map +0 -1
- package/dist/chunk-GRG7PHWQ.js +0 -25
- package/dist/chunk-GRG7PHWQ.js.map +0 -1
- package/dist/chunk-JUFK3T4Q.js +0 -80
- package/dist/chunk-JUFK3T4Q.js.map +0 -1
- package/dist/chunk-M5ZGRVIQ.js +0 -719
- package/dist/chunk-M5ZGRVIQ.js.map +0 -1
- package/dist/chunk-MRWYRAS5.js.map +0 -1
- package/dist/chunk-OVFORMPW.js +0 -348
- package/dist/chunk-OVFORMPW.js.map +0 -1
- package/dist/chunk-P3HLDT77.js +0 -59
- package/dist/chunk-P3HLDT77.js.map +0 -1
- package/dist/chunk-QQUJ6NPW.js +0 -23093
- package/dist/chunk-QQUJ6NPW.js.map +0 -1
- package/dist/chunk-TXTQIYCV.js.map +0 -1
- package/dist/chunk-WYBDERIY.js.map +0 -1
- package/dist/chunk-Y3KNXVTD.js.map +0 -1
- package/dist/chunk-YBW5JSA3.js.map +0 -1
- package/dist/chunk-YRXAWWCU.js +0 -45
- package/dist/chunk-YRXAWWCU.js.map +0 -1
- package/dist/host-mcp-resolvers.d.ts +0 -32
- package/dist/host-mcp-resolvers.js +0 -34
- package/dist/host-mcp-resolvers.js.map +0 -1
- package/src/host-mcp-resolvers.ts +0 -50
- /package/dist/{chunk-5LYFSZ7O.js.map → chunk-352X6ENP.js.map} +0 -0
- /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":";AACO,IAAM,yBAAyB;AAC/B,IAAM,sBAAsB;AAE5B,IAAM,4BAA4B;AAClC,IAAM,iCAAiC;AAGvC,SAAS,sBAAsB,OAA8B;AAClE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WACE,IAAI,WAAW,6BACf,CAAC,IAAI,YACL,CAAC,IAAI,YACL,CAAC,IAAI,QACL,IAAI,SAAS,WAAW,8BAA8B,KACtD,CAAC,IAAI,SAAS,MAAM,GAAG,EAAE,KAAK,CAAC,YAAY,YAAY,OAAO,YAAY,IAAI;AAAA,EAElF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,kCAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,SAAS,qBACd,QACU;AACV,SAAO;AAAA,IACL,GAAG,IAAI;AAAA,OACJ,OAAO,WAAW,WAAW,CAAC,MAAM,IAAK,UAAU,CAAC,GAClD,QAAQ,CAAC,UAAU,MAAM,MAAM,SAAS,CAAC,EACzC,OAAO,OAAO;AAAA,IACnB;AAAA,EACF,EAAE,KAAK;AACT;AAmBA,IAAM,qBAAqB,CAAC,iBAAiB,eAAe,WAAW,WAAW;AAClF,IAAM,gBAAgB,CAAC,oBAAoB,kBAAkB,cAAc,cAAc;AACzF,IAAM,UAAU,EAAE,MAAM,UAAU,aAAa,+CAA+C;AAC9F,IAAM,SAAS,EAAE,MAAM,UAAU,WAAW,MAAM,aAAa,iCAAiC;AAChG,IAAM,gBAAgB,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,KAAK,SAAS,IAAI;AAChF,IAAM,cAAc,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,IAAI,SAAS,GAAG;AAC5E,IAAM,YAAY,EAAE,MAAM,UAAU,SAAS,oBAAoB;AAEjE,SAAS,KACP,MACA,aACA,YACA,WAAqB,CAAC,GACtB,WAAW,OACO;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,EAAE,MAAM,UAAU,YAAY,UAAU,sBAAsB,MAAM;AAAA,IACjF,aAAa;AAAA,MACX,cAAc,CAAC;AAAA,MACf,iBAAiB;AAAA,MACjB,gBAAgB,CAAC;AAAA,MACjB,eAAe;AAAA,IACjB;AAAA,EACF;AACF;AAGO,IAAM,uBAA2C;AAAA,EACtD;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO,EAAE,MAAM,UAAU,MAAM,CAAC,kBAAkB,mBAAmB,MAAM,MAAM,EAAE;AAAA,QACnF,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,kBAAkB,EAAE,MAAM,WAAW,SAAS,KAAK;AAAA,IACrD;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,QAAQ;AAAA,IACV,CAAC,SAAS;AAAA,EACZ;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,SAAS,QAAQ,OAAO,cAAc;AAAA,IACxC,CAAC,SAAS;AAAA,EACZ;AAAA,EACA,KAAK,oBAAoB,6DAA6D;AAAA,IACpF;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AAAA,EACD;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE;AAAA,IAC3B,CAAC,MAAM;AAAA,EACT;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAC/C;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,IAAI,EAAE,GAAG,WAAW,aAAa,iCAAiC;AAAA,MAClE;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,CAAC,WAAW,IAAI;AAAA,EAClB;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,MAAM,EAAE,MAAM,UAAU,SAAS,gBAAgB,aAAa,iBAAiB,EAAE;AAAA,IACnF,CAAC,MAAM;AAAA,EACT;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE;AAAA,IAC3B,CAAC,MAAM;AAAA,IACP;AAAA,EACF;AAAA,EACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,MACA,MAAM,EAAE,MAAM,UAAU,WAAW,GAAG,WAAW,IAAM;AAAA,MACvD,WAAW,EAAE,GAAG,WAAW,aAAa,8CAA8C;AAAA,MACtF,cAAc,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAChD,cAAc,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAClD;AAAA,IACA,CAAC,WAAW,MAAM;AAAA,IAClB;AAAA,EACF;AACF;AAEA,IAAM,sBAAmE;AAAA,EACvE,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,4BAA4B,CAAC,iBAAiB,eAAe,WAAW;AAAA,EACxE,kBAAkB,CAAC,YAAY;AAAA,EAC/B,qBAAqB,CAAC,YAAY;AAAA,EAClC,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,qBAAqB,CAAC,YAAY;AAAA,EAClC,eAAe,CAAC,UAAU;AAAA,EAC1B,oBAAoB,CAAC,YAAY;AACnC;AAEO,SAAS,2BAA2B,QAAwD;AACjG,QAAM,UAAU,IAAI,IAAI,qBAAqB,MAAM,CAAC;AACpD,SAAO,qBAAqB;AAAA,IAAO,CAAC,UAClC,oBAAoB,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,QAAQ,IAAI,KAAK,CAAC;AAAA,EACrE,EAAE,IAAI,CAAC,WAAW;AAAA,IAChB,GAAG;AAAA,IACH,aAAa;AAAA,MACX,GAAG,MAAM;AAAA,MACT,UAAU,CAAC,GAAG,MAAM,YAAY,QAAQ;AAAA,MACxC,YAAY,EAAE,GAAG,MAAM,YAAY,WAAW;AAAA,IAChD;AAAA,IACA,aAAa,EAAE,GAAG,MAAM,YAAY;AAAA,EACtC,EAAE;AACJ;AAEO,IAAM,wCAAwC;AAAA,EACnD,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,IAAI;AAAA,EACJ,MAAM;AACR;","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-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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 !==
|
|
558
|
-
throw projectionError("
|
|
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(
|
|
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(
|
|
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:
|
|
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-
|
|
1252
|
+
//# sourceMappingURL=chunk-RMWXDZEO.js.map
|