@opengeni/contracts 3.1.0-canary.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +110 -0
- package/dist/agent-learning.d.ts +243 -0
- 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-WBYTNVIW.js → chunk-RKX3NQYS.js} +1 -1
- 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-brain.d.ts +19 -81
- 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 +174 -0
- package/dist/external-identities.js +15 -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 +39 -10
- package/dist/host-mcp-bindings.js +256 -171
- package/dist/host-mcp-bindings.js.map +1 -1
- package/dist/image-generation.d.ts +1 -0
- package/dist/index.d.ts +15715 -3850
- package/dist/index.js +2088 -289
- 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 +984 -0
- 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-endpoint.js +9 -0
- package/dist/mcp-endpoint.js.map +1 -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/plugin-discovery.js +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-instruction-policies.d.ts +13 -0
- 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/workspace-state.d.ts +85 -416
- package/dist/xai-provider-account-authority.js +2 -1
- package/package.json +98 -2
- package/src/agent-authored-durable-text.ts +14 -11
- package/src/agent-config.ts +1698 -0
- package/src/agent-instruction-changes.ts +115 -0
- package/src/agent-learning.ts +188 -0
- 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 +262 -145
- 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 +292 -198
- package/src/image-generation.ts +104 -95
- package/src/index.ts +13354 -8654
- package/src/insights-usage.ts +727 -0
- package/src/interaction.ts +3070 -2326
- package/src/knowledge-entries.ts +428 -0
- 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 -275
- 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 +253 -333
- package/src/xai-provider-account-authority.ts +22 -17
- 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-OSBYTE3O.js +0 -348
- package/dist/chunk-OSBYTE3O.js.map +0 -1
- package/dist/chunk-P3HLDT77.js +0 -59
- package/dist/chunk-P3HLDT77.js.map +0 -1
- package/dist/chunk-TEMFILR7.js +0 -143
- package/dist/chunk-TEMFILR7.js.map +0 -1
- package/dist/chunk-TXTQIYCV.js.map +0 -1
- package/dist/chunk-UR2GFYIE.js +0 -22598
- package/dist/chunk-UR2GFYIE.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/{chunk-5LYFSZ7O.js.map → chunk-352X6ENP.js.map} +0 -0
- /package/dist/{chunk-WBYTNVIW.js.map → chunk-RKX3NQYS.js.map} +0 -0
- /package/dist/{chunk-O5LEQHDM.js.map → chunk-Z7WEVGCL.js.map} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineSchema
|
|
3
|
+
} from "./chunk-56SNIMDO.js";
|
|
4
|
+
|
|
5
|
+
// src/canonical-human-identities.ts
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
var CanonicalHumanIdentityStatus = /* @__PURE__ */ defineSchema(
|
|
8
|
+
() => z.enum(["active", "recovery_required", "disputed", "disabled"])
|
|
9
|
+
);
|
|
10
|
+
var CanonicalHumanLoginBindingStatus = /* @__PURE__ */ defineSchema(
|
|
11
|
+
() => z.enum(["active", "recovery_pending", "stale", "disputed", "revoked"])
|
|
12
|
+
);
|
|
13
|
+
var CanonicalHumanRecoveryState = /* @__PURE__ */ defineSchema(
|
|
14
|
+
() => z.enum(["ready", "recovery_required", "lost_factor", "disputed", "disabled"])
|
|
15
|
+
);
|
|
16
|
+
var CanonicalHumanLoginBinding = /* @__PURE__ */ defineSchema(
|
|
17
|
+
() => z.object({
|
|
18
|
+
id: z.string().uuid(),
|
|
19
|
+
providerId: z.string().min(1).max(128),
|
|
20
|
+
providerAccountId: z.string().min(1).max(1024),
|
|
21
|
+
status: CanonicalHumanLoginBindingStatus,
|
|
22
|
+
revision: z.number().int().positive(),
|
|
23
|
+
verifiedAt: z.string().datetime(),
|
|
24
|
+
lastVerifiedAt: z.string().datetime(),
|
|
25
|
+
revokedAt: z.string().datetime().nullable(),
|
|
26
|
+
createdAt: z.string().datetime(),
|
|
27
|
+
updatedAt: z.string().datetime()
|
|
28
|
+
})
|
|
29
|
+
);
|
|
30
|
+
var CanonicalHumanIdentityProjection = /* @__PURE__ */ defineSchema(
|
|
31
|
+
() => z.object({
|
|
32
|
+
activeIdentity: z.object({
|
|
33
|
+
id: z.string().uuid(),
|
|
34
|
+
displayName: z.string().min(1).max(256),
|
|
35
|
+
status: CanonicalHumanIdentityStatus,
|
|
36
|
+
identityRevision: z.number().int().positive(),
|
|
37
|
+
authRevision: z.number().int().positive(),
|
|
38
|
+
activeLoginBindingId: z.string().uuid().nullable(),
|
|
39
|
+
recoveryState: CanonicalHumanRecoveryState,
|
|
40
|
+
createdAt: z.string().datetime(),
|
|
41
|
+
updatedAt: z.string().datetime()
|
|
42
|
+
}),
|
|
43
|
+
loginBindings: z.array(CanonicalHumanLoginBinding).max(64)
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
var OperationFields = {
|
|
47
|
+
operationId: z.string().uuid().optional(),
|
|
48
|
+
expectedIdentityRevision: z.number().int().positive(),
|
|
49
|
+
reason: z.string().trim().min(1).max(512)
|
|
50
|
+
};
|
|
51
|
+
var LinkCanonicalHumanLoginBindingRequest = /* @__PURE__ */ defineSchema(
|
|
52
|
+
() => z.object({
|
|
53
|
+
...OperationFields,
|
|
54
|
+
providerId: z.string().trim().min(1).max(128),
|
|
55
|
+
providerAccountId: z.string().trim().min(1).max(1024)
|
|
56
|
+
})
|
|
57
|
+
);
|
|
58
|
+
var CanonicalHumanBindingOperationRequest = /* @__PURE__ */ defineSchema(
|
|
59
|
+
() => z.object({
|
|
60
|
+
...OperationFields
|
|
61
|
+
})
|
|
62
|
+
);
|
|
63
|
+
var CanonicalHumanIdentityMutationOutcome = /* @__PURE__ */ defineSchema(
|
|
64
|
+
() => z.enum(["applied", "lost_factor", "disputed"])
|
|
65
|
+
);
|
|
66
|
+
var CanonicalHumanIdentityMutationResponse = /* @__PURE__ */ defineSchema(
|
|
67
|
+
() => z.object({
|
|
68
|
+
outcome: CanonicalHumanIdentityMutationOutcome,
|
|
69
|
+
operationId: z.string().uuid(),
|
|
70
|
+
identity: CanonicalHumanIdentityProjection
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
export {
|
|
75
|
+
CanonicalHumanIdentityStatus,
|
|
76
|
+
CanonicalHumanLoginBindingStatus,
|
|
77
|
+
CanonicalHumanRecoveryState,
|
|
78
|
+
CanonicalHumanLoginBinding,
|
|
79
|
+
CanonicalHumanIdentityProjection,
|
|
80
|
+
LinkCanonicalHumanLoginBindingRequest,
|
|
81
|
+
CanonicalHumanBindingOperationRequest,
|
|
82
|
+
CanonicalHumanIdentityMutationOutcome,
|
|
83
|
+
CanonicalHumanIdentityMutationResponse
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=chunk-4QO6GJUX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/canonical-human-identities.ts"],"sourcesContent":["import { defineSchema } from \"./define-schema\";\nimport { z } from \"zod\";\n\nexport const CanonicalHumanIdentityStatus = /* @__PURE__ */ defineSchema(() =>\n z.enum([\"active\", \"recovery_required\", \"disputed\", \"disabled\"]),\n);\nexport type CanonicalHumanIdentityStatus = z.infer<typeof CanonicalHumanIdentityStatus>;\n\nexport const CanonicalHumanLoginBindingStatus = /* @__PURE__ */ defineSchema(() =>\n z.enum([\"active\", \"recovery_pending\", \"stale\", \"disputed\", \"revoked\"]),\n);\nexport type CanonicalHumanLoginBindingStatus = z.infer<typeof CanonicalHumanLoginBindingStatus>;\n\nexport const CanonicalHumanRecoveryState = /* @__PURE__ */ defineSchema(() =>\n z.enum([\"ready\", \"recovery_required\", \"lost_factor\", \"disputed\", \"disabled\"]),\n);\nexport type CanonicalHumanRecoveryState = z.infer<typeof CanonicalHumanRecoveryState>;\n\nexport const CanonicalHumanLoginBinding = /* @__PURE__ */ defineSchema(() =>\n z.object({\n id: z.string().uuid(),\n providerId: z.string().min(1).max(128),\n providerAccountId: z.string().min(1).max(1024),\n status: CanonicalHumanLoginBindingStatus,\n revision: z.number().int().positive(),\n verifiedAt: z.string().datetime(),\n lastVerifiedAt: z.string().datetime(),\n revokedAt: z.string().datetime().nullable(),\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n }),\n);\nexport type CanonicalHumanLoginBinding = z.infer<typeof CanonicalHumanLoginBinding>;\n\nexport const CanonicalHumanIdentityProjection = /* @__PURE__ */ defineSchema(() =>\n z.object({\n activeIdentity: z.object({\n id: z.string().uuid(),\n displayName: z.string().min(1).max(256),\n status: CanonicalHumanIdentityStatus,\n identityRevision: z.number().int().positive(),\n authRevision: z.number().int().positive(),\n activeLoginBindingId: z.string().uuid().nullable(),\n recoveryState: CanonicalHumanRecoveryState,\n createdAt: z.string().datetime(),\n updatedAt: z.string().datetime(),\n }),\n loginBindings: z.array(CanonicalHumanLoginBinding).max(64),\n }),\n);\nexport type CanonicalHumanIdentityProjection = z.infer<typeof CanonicalHumanIdentityProjection>;\n\nconst OperationFields = {\n operationId: z.string().uuid().optional(),\n expectedIdentityRevision: z.number().int().positive(),\n reason: z.string().trim().min(1).max(512),\n} as const;\n\nexport const LinkCanonicalHumanLoginBindingRequest = /* @__PURE__ */ defineSchema(() =>\n z.object({\n ...OperationFields,\n providerId: z.string().trim().min(1).max(128),\n providerAccountId: z.string().trim().min(1).max(1024),\n }),\n);\nexport type LinkCanonicalHumanLoginBindingRequest = z.infer<\n typeof LinkCanonicalHumanLoginBindingRequest\n>;\n\nexport const CanonicalHumanBindingOperationRequest = /* @__PURE__ */ defineSchema(() =>\n z.object({\n ...OperationFields,\n }),\n);\nexport type CanonicalHumanBindingOperationRequest = z.infer<\n typeof CanonicalHumanBindingOperationRequest\n>;\n\nexport const CanonicalHumanIdentityMutationOutcome = /* @__PURE__ */ defineSchema(() =>\n z.enum([\"applied\", \"lost_factor\", \"disputed\"]),\n);\nexport type CanonicalHumanIdentityMutationOutcome = z.infer<\n typeof CanonicalHumanIdentityMutationOutcome\n>;\n\nexport const CanonicalHumanIdentityMutationResponse = /* @__PURE__ */ defineSchema(() =>\n z.object({\n outcome: CanonicalHumanIdentityMutationOutcome,\n operationId: z.string().uuid(),\n identity: CanonicalHumanIdentityProjection,\n }),\n);\nexport type CanonicalHumanIdentityMutationResponse = z.infer<\n typeof CanonicalHumanIdentityMutationResponse\n>;\n"],"mappings":";;;;;AACA,SAAS,SAAS;AAEX,IAAM,+BAA+C;AAAA,EAAa,MACvE,EAAE,KAAK,CAAC,UAAU,qBAAqB,YAAY,UAAU,CAAC;AAChE;AAGO,IAAM,mCAAmD;AAAA,EAAa,MAC3E,EAAE,KAAK,CAAC,UAAU,oBAAoB,SAAS,YAAY,SAAS,CAAC;AACvE;AAGO,IAAM,8BAA8C;AAAA,EAAa,MACtE,EAAE,KAAK,CAAC,SAAS,qBAAqB,eAAe,YAAY,UAAU,CAAC;AAC9E;AAGO,IAAM,6BAA6C;AAAA,EAAa,MACrE,EAAE,OAAO;AAAA,IACP,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,IACpB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACrC,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;AAAA,IAC7C,QAAQ;AAAA,IACR,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACpC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,IACpC,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IAC1C,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,CAAC;AACH;AAGO,IAAM,mCAAmD;AAAA,EAAa,MAC3E,EAAE,OAAO;AAAA,IACP,gBAAgB,EAAE,OAAO;AAAA,MACvB,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,MACpB,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MACtC,QAAQ;AAAA,MACR,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MAC5C,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MACxC,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,MACjD,eAAe;AAAA,MACf,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,IACD,eAAe,EAAE,MAAM,0BAA0B,EAAE,IAAI,EAAE;AAAA,EAC3D,CAAC;AACH;AAGA,IAAM,kBAAkB;AAAA,EACtB,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACxC,0BAA0B,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpD,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAC1C;AAEO,IAAM,wCAAwD;AAAA,EAAa,MAChF,EAAE,OAAO;AAAA,IACP,GAAG;AAAA,IACH,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC5C,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI;AAAA,EACtD,CAAC;AACH;AAKO,IAAM,wCAAwD;AAAA,EAAa,MAChF,EAAE,OAAO;AAAA,IACP,GAAG;AAAA,EACL,CAAC;AACH;AAKO,IAAM,wCAAwD;AAAA,EAAa,MAChF,EAAE,KAAK,CAAC,WAAW,eAAe,UAAU,CAAC;AAC/C;AAKO,IAAM,yCAAyD;AAAA,EAAa,MACjF,EAAE,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa,EAAE,OAAO,EAAE,KAAK;AAAA,IAC7B,UAAU;AAAA,EACZ,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineSchema
|
|
3
|
+
} from "./chunk-56SNIMDO.js";
|
|
4
|
+
|
|
5
|
+
// src/subscription-personal-authority-v2.ts
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
var PositiveSafeInteger = /* @__PURE__ */ defineSchema(
|
|
8
|
+
() => z.number().int().positive().max(Number.MAX_SAFE_INTEGER)
|
|
9
|
+
);
|
|
10
|
+
var CanonicalUuid = /* @__PURE__ */ defineSchema(
|
|
11
|
+
() => z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/)
|
|
12
|
+
);
|
|
13
|
+
var SubscriptionPersonalAuthorityV2 = /* @__PURE__ */ defineSchema(
|
|
14
|
+
() => z.object({
|
|
15
|
+
version: z.literal(2),
|
|
16
|
+
personal: z.array(
|
|
17
|
+
z.object({
|
|
18
|
+
provider: z.enum(["codex", "claude", "xai"]),
|
|
19
|
+
ownerMembershipId: CanonicalUuid,
|
|
20
|
+
authorityGeneration: PositiveSafeInteger,
|
|
21
|
+
/**
|
|
22
|
+
* Explicit personal consent accepted in a shared chat. Unlike the
|
|
23
|
+
* historical private-work pool, this authorizes only this connection
|
|
24
|
+
* in this session. Copies retain the restriction verbatim.
|
|
25
|
+
*/
|
|
26
|
+
sharedSessionChoice: z.object({ sessionId: CanonicalUuid, connectionId: CanonicalUuid }).strict().optional()
|
|
27
|
+
}).strict()
|
|
28
|
+
).max(3)
|
|
29
|
+
}).strict().superRefine((snapshot, ctx) => {
|
|
30
|
+
const providers = snapshot.personal.map((authority) => authority.provider);
|
|
31
|
+
if (new Set(providers).size !== providers.length) {
|
|
32
|
+
ctx.addIssue({ code: "custom", message: "Duplicate provider personal authority" });
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
);
|
|
36
|
+
function subscriptionPersonalAuthorityForProviderV2(snapshot, provider) {
|
|
37
|
+
return snapshot.personal.find((authority) => authority.provider === provider) ?? null;
|
|
38
|
+
}
|
|
39
|
+
var EMPTY_SUBSCRIPTION_PERSONAL_AUTHORITY_V2 = {
|
|
40
|
+
version: 2,
|
|
41
|
+
personal: []
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
SubscriptionPersonalAuthorityV2,
|
|
46
|
+
subscriptionPersonalAuthorityForProviderV2,
|
|
47
|
+
EMPTY_SUBSCRIPTION_PERSONAL_AUTHORITY_V2
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=chunk-4VDMHLLL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/subscription-personal-authority-v2.ts"],"sourcesContent":["import { defineSchema } from \"./define-schema\";\nimport { z } from \"zod\";\n\nconst PositiveSafeInteger = /* @__PURE__ */ defineSchema(() =>\n z.number().int().positive().max(Number.MAX_SAFE_INTEGER),\n);\n/**\n * Canonical lowercase UUID, matching PostgreSQL uuid::text and the\n * session_turns CHECK, so an accepted snapshot can never silently mismatch.\n */\nconst CanonicalUuid = /* @__PURE__ */ defineSchema(() =>\n z.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/),\n);\n\n/**\n * Immutable personal authority for accepted subscription work. Shared pool\n * eligibility is live and deliberately absent from this snapshot.\n */\nexport const SubscriptionPersonalAuthorityV2 = /* @__PURE__ */ defineSchema(() =>\n z\n .object({\n version: z.literal(2),\n personal: z\n .array(\n z\n .object({\n provider: z.enum([\"codex\", \"claude\", \"xai\"]),\n ownerMembershipId: CanonicalUuid,\n authorityGeneration: PositiveSafeInteger,\n /**\n * Explicit personal consent accepted in a shared chat. Unlike the\n * historical private-work pool, this authorizes only this connection\n * in this session. Copies retain the restriction verbatim.\n */\n sharedSessionChoice: z\n .object({ sessionId: CanonicalUuid, connectionId: CanonicalUuid })\n .strict()\n .optional(),\n })\n .strict(),\n )\n .max(3),\n })\n .strict()\n .superRefine((snapshot, ctx) => {\n const providers = snapshot.personal.map((authority) => authority.provider);\n if (new Set(providers).size !== providers.length) {\n ctx.addIssue({ code: \"custom\", message: \"Duplicate provider personal authority\" });\n }\n }),\n);\n\nexport type SubscriptionPersonalAuthorityV2 = z.infer<typeof SubscriptionPersonalAuthorityV2>;\n\n/** Return one provider's immutable personal authority from a parsed snapshot. */\nexport function subscriptionPersonalAuthorityForProviderV2(\n snapshot: SubscriptionPersonalAuthorityV2,\n provider: SubscriptionPersonalAuthorityV2[\"personal\"][number][\"provider\"],\n): SubscriptionPersonalAuthorityV2[\"personal\"][number] | null {\n return snapshot.personal.find((authority) => authority.provider === provider) ?? null;\n}\n\nexport const EMPTY_SUBSCRIPTION_PERSONAL_AUTHORITY_V2 = {\n version: 2,\n personal: [],\n} as const satisfies SubscriptionPersonalAuthorityV2;\n"],"mappings":";;;;;AACA,SAAS,SAAS;AAElB,IAAM,sBAAsC;AAAA,EAAa,MACvD,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,OAAO,gBAAgB;AACzD;AAKA,IAAM,gBAAgC;AAAA,EAAa,MACjD,EAAE,OAAO,EAAE,MAAM,2EAA2E;AAC9F;AAMO,IAAM,kCAAkD;AAAA,EAAa,MAC1E,EACG,OAAO;AAAA,IACN,SAAS,EAAE,QAAQ,CAAC;AAAA,IACpB,UAAU,EACP;AAAA,MACC,EACG,OAAO;AAAA,QACN,UAAU,EAAE,KAAK,CAAC,SAAS,UAAU,KAAK,CAAC;AAAA,QAC3C,mBAAmB;AAAA,QACnB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMrB,qBAAqB,EAClB,OAAO,EAAE,WAAW,eAAe,cAAc,cAAc,CAAC,EAChE,OAAO,EACP,SAAS;AAAA,MACd,CAAC,EACA,OAAO;AAAA,IACZ,EACC,IAAI,CAAC;AAAA,EACV,CAAC,EACA,OAAO,EACP,YAAY,CAAC,UAAU,QAAQ;AAC9B,UAAM,YAAY,SAAS,SAAS,IAAI,CAAC,cAAc,UAAU,QAAQ;AACzE,QAAI,IAAI,IAAI,SAAS,EAAE,SAAS,UAAU,QAAQ;AAChD,UAAI,SAAS,EAAE,MAAM,UAAU,SAAS,wCAAwC,CAAC;AAAA,IACnF;AAAA,EACF,CAAC;AACL;AAKO,SAAS,2CACd,UACA,UAC4D;AAC5D,SAAO,SAAS,SAAS,KAAK,CAAC,cAAc,UAAU,aAAa,QAAQ,KAAK;AACnF;AAEO,IAAM,2CAA2C;AAAA,EACtD,SAAS;AAAA,EACT,UAAU,CAAC;AACb;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/define-schema.ts"],"sourcesContent":["/**\n * Construct a schema eagerly, but give bundlers one removable boundary around\n * the whole initializer (including nested schemas and chained builders).\n * Annotate calls with @__PURE__ only when the factory has no effects beyond\n * constructing its returned schema. This is not lazy validation: used schemas\n * are created once, in the same module evaluation order as ordinary constants.\n */\nexport function defineSchema<Schema>(factory: () => Schema): Schema {\n return factory();\n}\n"],"mappings":";AAOO,SAAS,aAAqB,SAA+B;AAClE,SAAO,QAAQ;AACjB;","names":[]}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ConnectionKind,
|
|
3
|
+
SessionTenancyVisibility
|
|
4
|
+
} from "./chunk-OF6OKOBF.js";
|
|
5
|
+
import {
|
|
6
|
+
defineSchema
|
|
7
|
+
} from "./chunk-56SNIMDO.js";
|
|
8
|
+
|
|
9
|
+
// src/connection-authority.ts
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
var ConnectionAuthoritySelectionSource = /* @__PURE__ */ defineSchema(
|
|
12
|
+
() => z.enum(["explicit_workspace", "sender"])
|
|
13
|
+
);
|
|
14
|
+
var ConnectionUseSelectionSource = /* @__PURE__ */ defineSchema(
|
|
15
|
+
() => z.string().min(1).max(128).regex(/^[a-z0-9](?:[a-z0-9._:-]*[a-z0-9])?$/u)
|
|
16
|
+
);
|
|
17
|
+
var AcceptedConnectionWork = /* @__PURE__ */ defineSchema(
|
|
18
|
+
() => z.discriminatedUnion("kind", [
|
|
19
|
+
z.object({
|
|
20
|
+
kind: z.literal("turn"),
|
|
21
|
+
turnId: z.string().uuid()
|
|
22
|
+
}).strict(),
|
|
23
|
+
z.object({
|
|
24
|
+
kind: z.literal("scheduled_task"),
|
|
25
|
+
taskId: z.string().uuid(),
|
|
26
|
+
taskAuthorityRevision: z.number().int().positive(),
|
|
27
|
+
runId: z.string().uuid()
|
|
28
|
+
}).strict()
|
|
29
|
+
])
|
|
30
|
+
);
|
|
31
|
+
var ConnectionUseAuthoritySnapshot = /* @__PURE__ */ defineSchema(
|
|
32
|
+
() => z.object({
|
|
33
|
+
organizationId: z.string().uuid(),
|
|
34
|
+
originWorkspaceId: z.string().uuid(),
|
|
35
|
+
targetWorkspaceId: z.string().uuid(),
|
|
36
|
+
targetSessionId: z.string().uuid(),
|
|
37
|
+
targetSessionVisibility: SessionTenancyVisibility,
|
|
38
|
+
targetSessionAuthorityEpoch: z.number().int().positive(),
|
|
39
|
+
acceptedWork: AcceptedConnectionWork,
|
|
40
|
+
connectionId: z.string().uuid(),
|
|
41
|
+
connectionGeneration: z.number().int().positive(),
|
|
42
|
+
connectionStatus: z.literal("active"),
|
|
43
|
+
providerDomain: z.string().min(1).max(2048),
|
|
44
|
+
connectionKind: ConnectionKind,
|
|
45
|
+
scope: z.enum(["workspace", "user"]),
|
|
46
|
+
ownerSubjectId: z.string().min(1).max(512).nullable(),
|
|
47
|
+
ownerOrganizationMembershipId: z.string().uuid().nullable(),
|
|
48
|
+
ownerMembershipAuthorizationRevision: z.number().int().positive().nullable().default(null),
|
|
49
|
+
authoritySource: ConnectionAuthoritySelectionSource,
|
|
50
|
+
selectionSources: z.array(ConnectionUseSelectionSource).min(1).max(128),
|
|
51
|
+
userDelegation: z.null()
|
|
52
|
+
}).strict().superRefine((value, context) => {
|
|
53
|
+
const ownedBySubject = value.scope !== "workspace";
|
|
54
|
+
const delegated = value.scope === "user";
|
|
55
|
+
if (ownedBySubject !== (value.ownerSubjectId !== null)) {
|
|
56
|
+
context.addIssue({
|
|
57
|
+
code: "custom",
|
|
58
|
+
path: ["ownerSubjectId"],
|
|
59
|
+
message: "personal connections retain an owner subject"
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (delegated !== (value.ownerOrganizationMembershipId !== null)) {
|
|
63
|
+
context.addIssue({
|
|
64
|
+
code: "custom",
|
|
65
|
+
path: ["ownerOrganizationMembershipId"],
|
|
66
|
+
message: "only user connections retain an owner membership"
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (delegated !== (value.ownerMembershipAuthorizationRevision !== null)) {
|
|
70
|
+
context.addIssue({
|
|
71
|
+
code: "custom",
|
|
72
|
+
path: ["ownerMembershipAuthorizationRevision"],
|
|
73
|
+
message: "only user connections retain an owner membership revision"
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (delegated && value.authoritySource !== "sender") {
|
|
77
|
+
context.addIssue({
|
|
78
|
+
code: "custom",
|
|
79
|
+
path: ["authoritySource"],
|
|
80
|
+
message: "user connections require authenticated sender provenance"
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (!delegated && value.authoritySource === "sender") {
|
|
84
|
+
context.addIssue({
|
|
85
|
+
code: "custom",
|
|
86
|
+
path: ["authoritySource"],
|
|
87
|
+
message: "workspace connections cannot claim sender provenance"
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (!delegated && value.originWorkspaceId !== value.targetWorkspaceId) {
|
|
91
|
+
context.addIssue({
|
|
92
|
+
code: "custom",
|
|
93
|
+
path: ["originWorkspaceId"],
|
|
94
|
+
message: "workspace connections must be owned by the target workspace"
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
);
|
|
99
|
+
var ConnectionUseDenialReason = /* @__PURE__ */ defineSchema(
|
|
100
|
+
() => z.enum([
|
|
101
|
+
"tenant_mismatch",
|
|
102
|
+
"workspace_access_inactive",
|
|
103
|
+
"session_inactive",
|
|
104
|
+
"session_identity_changed",
|
|
105
|
+
"session_visibility_changed",
|
|
106
|
+
"session_authority_epoch_changed",
|
|
107
|
+
"accepted_attempt_authority_required",
|
|
108
|
+
"accepted_snapshot_digest_changed",
|
|
109
|
+
"connection_missing",
|
|
110
|
+
"connection_identity_changed",
|
|
111
|
+
"connection_generation_changed",
|
|
112
|
+
"connection_status_inactive",
|
|
113
|
+
"connection_owner_changed",
|
|
114
|
+
"owner_membership_inactive",
|
|
115
|
+
"authority_missing",
|
|
116
|
+
"authority_identity_changed",
|
|
117
|
+
"authority_generation_changed",
|
|
118
|
+
"authority_status_inactive",
|
|
119
|
+
"grant_missing",
|
|
120
|
+
"grant_identity_changed",
|
|
121
|
+
"grant_generation_changed",
|
|
122
|
+
"grant_status_inactive",
|
|
123
|
+
"grant_expired",
|
|
124
|
+
"grant_already_consumed"
|
|
125
|
+
])
|
|
126
|
+
);
|
|
127
|
+
var ConnectionUseAttributionFields = /* @__PURE__ */ defineSchema(
|
|
128
|
+
() => z.object({
|
|
129
|
+
organizationId: z.string().uuid(),
|
|
130
|
+
workspaceId: z.string().uuid(),
|
|
131
|
+
sessionId: z.string().uuid(),
|
|
132
|
+
connectionId: z.string().uuid(),
|
|
133
|
+
connectionGeneration: z.number().int().positive(),
|
|
134
|
+
scope: z.enum(["workspace", "user", "legacy_user"]),
|
|
135
|
+
ownerSubjectId: z.string().min(1).max(512).nullable(),
|
|
136
|
+
authorityId: z.string().uuid().nullable(),
|
|
137
|
+
grantId: z.string().uuid().nullable()
|
|
138
|
+
}).strict()
|
|
139
|
+
);
|
|
140
|
+
function refineConnectionUseAttribution(value, context) {
|
|
141
|
+
const personal = value.scope !== "workspace";
|
|
142
|
+
for (const field of ["ownerSubjectId"]) {
|
|
143
|
+
if (personal !== (value[field] !== null)) {
|
|
144
|
+
context.addIssue({
|
|
145
|
+
code: "custom",
|
|
146
|
+
path: [field],
|
|
147
|
+
message: personal ? `personal attribution requires ${field}` : `workspace attribution cannot carry ${field}`
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const owned = value.scope === "user";
|
|
152
|
+
for (const field of ["authorityId"]) {
|
|
153
|
+
if (owned !== (value[field] !== null)) {
|
|
154
|
+
context.addIssue({
|
|
155
|
+
code: "custom",
|
|
156
|
+
path: [field],
|
|
157
|
+
message: owned ? `personal attribution requires ${field}` : `non-personal attribution cannot carry ${field}`
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (!owned && value.grantId !== null) {
|
|
162
|
+
context.addIssue({
|
|
163
|
+
code: "custom",
|
|
164
|
+
path: ["grantId"],
|
|
165
|
+
message: "only historical personal attribution can carry a grant"
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
var ConnectionUseAttribution = /* @__PURE__ */ defineSchema(
|
|
170
|
+
() => ConnectionUseAttributionFields.extend({
|
|
171
|
+
scope: z.enum(["workspace", "user"]),
|
|
172
|
+
grantId: z.null()
|
|
173
|
+
}).superRefine(refineConnectionUseAttribution)
|
|
174
|
+
);
|
|
175
|
+
var ConnectionUseAuditFact = /* @__PURE__ */ defineSchema(
|
|
176
|
+
() => ConnectionUseAttributionFields.extend({
|
|
177
|
+
outcome: z.enum(["authorized", "denied"]),
|
|
178
|
+
denialReason: ConnectionUseDenialReason.nullable(),
|
|
179
|
+
occurredAt: z.string().datetime({ offset: true })
|
|
180
|
+
}).superRefine((value, context) => {
|
|
181
|
+
refineConnectionUseAttribution(value, context);
|
|
182
|
+
if (value.outcome === "denied" !== (value.denialReason !== null)) {
|
|
183
|
+
context.addIssue({
|
|
184
|
+
code: "custom",
|
|
185
|
+
path: ["denialReason"],
|
|
186
|
+
message: "only denied connection use carries a denial reason"
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
})
|
|
190
|
+
);
|
|
191
|
+
var ConnectionUseAuthorizationResult = /* @__PURE__ */ defineSchema(
|
|
192
|
+
() => z.discriminatedUnion("status", [
|
|
193
|
+
z.object({ status: z.literal("authorized"), attribution: ConnectionUseAttribution }).strict(),
|
|
194
|
+
z.object({ status: z.literal("denied"), reason: ConnectionUseDenialReason }).strict()
|
|
195
|
+
])
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
export {
|
|
199
|
+
ConnectionAuthoritySelectionSource,
|
|
200
|
+
ConnectionUseSelectionSource,
|
|
201
|
+
ConnectionUseAuthoritySnapshot,
|
|
202
|
+
ConnectionUseDenialReason,
|
|
203
|
+
ConnectionUseAttribution,
|
|
204
|
+
ConnectionUseAuditFact,
|
|
205
|
+
ConnectionUseAuthorizationResult
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=chunk-6C2HKFTU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/connection-authority.ts"],"sourcesContent":["import { defineSchema } from \"./define-schema\";\nimport { z } from \"zod\";\nimport { ConnectionKind, SessionTenancyVisibility } from \"./index\";\n\nexport const ConnectionAuthoritySelectionSource = /* @__PURE__ */ defineSchema(() =>\n z.enum([\"explicit_workspace\", \"sender\"]),\n);\nexport type ConnectionAuthoritySelectionSource = z.infer<typeof ConnectionAuthoritySelectionSource>;\n\nexport const ConnectionUseSelectionSource = /* @__PURE__ */ defineSchema(() =>\n z\n .string()\n .min(1)\n .max(128)\n .regex(/^[a-z0-9](?:[a-z0-9._:-]*[a-z0-9])?$/u),\n);\nexport type ConnectionUseSelectionSource = z.infer<typeof ConnectionUseSelectionSource>;\n\nconst AcceptedConnectionWork = /* @__PURE__ */ defineSchema(() =>\n z.discriminatedUnion(\"kind\", [\n z\n .object({\n kind: z.literal(\"turn\"),\n turnId: z.string().uuid(),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"scheduled_task\"),\n taskId: z.string().uuid(),\n taskAuthorityRevision: z.number().int().positive(),\n runId: z.string().uuid(),\n })\n .strict(),\n ]),\n);\n\n/**\n * Internal, credential-free authority frozen when work is accepted. Personal\n * owner identity is retained only for live authorization and usage/audit\n * attribution; it is never part of the public delegation envelope.\n */\nexport const ConnectionUseAuthoritySnapshot = /* @__PURE__ */ defineSchema(() =>\n z\n .object({\n organizationId: z.string().uuid(),\n originWorkspaceId: z.string().uuid(),\n targetWorkspaceId: z.string().uuid(),\n targetSessionId: z.string().uuid(),\n targetSessionVisibility: SessionTenancyVisibility,\n targetSessionAuthorityEpoch: z.number().int().positive(),\n acceptedWork: AcceptedConnectionWork,\n connectionId: z.string().uuid(),\n connectionGeneration: z.number().int().positive(),\n connectionStatus: z.literal(\"active\"),\n providerDomain: z.string().min(1).max(2048),\n connectionKind: ConnectionKind,\n scope: z.enum([\"workspace\", \"user\"]),\n ownerSubjectId: z.string().min(1).max(512).nullable(),\n ownerOrganizationMembershipId: z.string().uuid().nullable(),\n ownerMembershipAuthorizationRevision: z.number().int().positive().nullable().default(null),\n authoritySource: ConnectionAuthoritySelectionSource,\n selectionSources: z.array(ConnectionUseSelectionSource).min(1).max(128),\n userDelegation: z.null(),\n })\n .strict()\n .superRefine((value, context) => {\n const ownedBySubject = value.scope !== \"workspace\";\n const delegated = value.scope === \"user\";\n if (ownedBySubject !== (value.ownerSubjectId !== null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"ownerSubjectId\"],\n message: \"personal connections retain an owner subject\",\n });\n }\n if (delegated !== (value.ownerOrganizationMembershipId !== null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"ownerOrganizationMembershipId\"],\n message: \"only user connections retain an owner membership\",\n });\n }\n if (delegated !== (value.ownerMembershipAuthorizationRevision !== null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"ownerMembershipAuthorizationRevision\"],\n message: \"only user connections retain an owner membership revision\",\n });\n }\n if (delegated && value.authoritySource !== \"sender\") {\n context.addIssue({\n code: \"custom\",\n path: [\"authoritySource\"],\n message: \"user connections require authenticated sender provenance\",\n });\n }\n if (!delegated && value.authoritySource === \"sender\") {\n context.addIssue({\n code: \"custom\",\n path: [\"authoritySource\"],\n message: \"workspace connections cannot claim sender provenance\",\n });\n }\n if (!delegated && value.originWorkspaceId !== value.targetWorkspaceId) {\n context.addIssue({\n code: \"custom\",\n path: [\"originWorkspaceId\"],\n message: \"workspace connections must be owned by the target workspace\",\n });\n }\n }),\n);\nexport type ConnectionUseAuthoritySnapshot = z.infer<typeof ConnectionUseAuthoritySnapshot>;\n\nexport const ConnectionUseDenialReason = /* @__PURE__ */ defineSchema(() =>\n z.enum([\n \"tenant_mismatch\",\n \"workspace_access_inactive\",\n \"session_inactive\",\n \"session_identity_changed\",\n \"session_visibility_changed\",\n \"session_authority_epoch_changed\",\n \"accepted_attempt_authority_required\",\n \"accepted_snapshot_digest_changed\",\n \"connection_missing\",\n \"connection_identity_changed\",\n \"connection_generation_changed\",\n \"connection_status_inactive\",\n \"connection_owner_changed\",\n \"owner_membership_inactive\",\n \"authority_missing\",\n \"authority_identity_changed\",\n \"authority_generation_changed\",\n \"authority_status_inactive\",\n \"grant_missing\",\n \"grant_identity_changed\",\n \"grant_generation_changed\",\n \"grant_status_inactive\",\n \"grant_expired\",\n \"grant_already_consumed\",\n ]),\n);\nexport type ConnectionUseDenialReason = z.infer<typeof ConnectionUseDenialReason>;\n\nconst ConnectionUseAttributionFields = /* @__PURE__ */ defineSchema(() =>\n z\n .object({\n organizationId: z.string().uuid(),\n workspaceId: z.string().uuid(),\n sessionId: z.string().uuid(),\n connectionId: z.string().uuid(),\n connectionGeneration: z.number().int().positive(),\n scope: z.enum([\"workspace\", \"user\", \"legacy_user\"]),\n ownerSubjectId: z.string().min(1).max(512).nullable(),\n authorityId: z.string().uuid().nullable(),\n grantId: z.string().uuid().nullable(),\n })\n .strict(),\n);\n\nfunction refineConnectionUseAttribution(\n value: z.infer<typeof ConnectionUseAttributionFields>,\n context: z.RefinementCtx,\n): void {\n const personal = value.scope !== \"workspace\";\n for (const field of [\"ownerSubjectId\"] as const) {\n if (personal !== (value[field] !== null)) {\n context.addIssue({\n code: \"custom\",\n path: [field],\n message: personal\n ? `personal attribution requires ${field}`\n : `workspace attribution cannot carry ${field}`,\n });\n }\n }\n const owned = value.scope === \"user\";\n for (const field of [\"authorityId\"] as const) {\n if (owned !== (value[field] !== null)) {\n context.addIssue({\n code: \"custom\",\n path: [field],\n message: owned\n ? `personal attribution requires ${field}`\n : `non-personal attribution cannot carry ${field}`,\n });\n }\n }\n if (!owned && value.grantId !== null) {\n context.addIssue({\n code: \"custom\",\n path: [\"grantId\"],\n message: \"only historical personal attribution can carry a grant\",\n });\n }\n}\n\n/** Metadata-only attribution emitted after pre-use authorization. */\nexport const ConnectionUseAttribution = /* @__PURE__ */ defineSchema(() =>\n ConnectionUseAttributionFields.extend({\n scope: z.enum([\"workspace\", \"user\"]),\n grantId: z.null(),\n }).superRefine(refineConnectionUseAttribution),\n);\nexport type ConnectionUseAttribution = z.infer<typeof ConnectionUseAttribution>;\n\nexport const ConnectionUseAuditFact = /* @__PURE__ */ defineSchema(() =>\n ConnectionUseAttributionFields.extend({\n outcome: z.enum([\"authorized\", \"denied\"]),\n denialReason: ConnectionUseDenialReason.nullable(),\n occurredAt: z.string().datetime({ offset: true }),\n }).superRefine((value, context) => {\n refineConnectionUseAttribution(value, context);\n if ((value.outcome === \"denied\") !== (value.denialReason !== null)) {\n context.addIssue({\n code: \"custom\",\n path: [\"denialReason\"],\n message: \"only denied connection use carries a denial reason\",\n });\n }\n }),\n);\nexport type ConnectionUseAuditFact = z.infer<typeof ConnectionUseAuditFact>;\n\nexport const ConnectionUseAuthorizationResult = /* @__PURE__ */ defineSchema(() =>\n z.discriminatedUnion(\"status\", [\n z.object({ status: z.literal(\"authorized\"), attribution: ConnectionUseAttribution }).strict(),\n z.object({ status: z.literal(\"denied\"), reason: ConnectionUseDenialReason }).strict(),\n ]),\n);\nexport type ConnectionUseAuthorizationResult = z.infer<typeof ConnectionUseAuthorizationResult>;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/workspace-integration-wire.ts
|
|
2
|
+
var WORKSPACE_WEBHOOK_EVENT_TYPES = [
|
|
3
|
+
"turn.completed",
|
|
4
|
+
"turn.failed",
|
|
5
|
+
"turn.cancelled",
|
|
6
|
+
"session.status.changed",
|
|
7
|
+
"session.requiresAction",
|
|
8
|
+
"session.humanInput.requested",
|
|
9
|
+
"session.notification.posted",
|
|
10
|
+
"session.notification.withdrawn",
|
|
11
|
+
"usage.threshold_reached",
|
|
12
|
+
"usage.exhausted",
|
|
13
|
+
"usage.period_reset"
|
|
14
|
+
];
|
|
15
|
+
var OPENGENI_WEBHOOK_TEST_EVENT_TYPE = "webhook.test";
|
|
16
|
+
var OPENGENI_TEST_REQUEST_NIL_ID = "00000000-0000-0000-0000-000000000000";
|
|
17
|
+
var OPENGENI_SIGNATURE_HEADER = "OpenGeni-Signature";
|
|
18
|
+
var OPENGENI_EVENT_ID_HEADER = "OpenGeni-Event-Id";
|
|
19
|
+
var OPENGENI_DELIVERY_ID_HEADER = "OpenGeni-Delivery-Id";
|
|
20
|
+
var OPENGENI_SIGNATURE_TOLERANCE_SECONDS = 300;
|
|
21
|
+
var encoder = new TextEncoder();
|
|
22
|
+
async function hmacSha256Hex(secret, message) {
|
|
23
|
+
const key = await crypto.subtle.importKey(
|
|
24
|
+
"raw",
|
|
25
|
+
encoder.encode(secret),
|
|
26
|
+
{ name: "HMAC", hash: "SHA-256" },
|
|
27
|
+
false,
|
|
28
|
+
["sign"]
|
|
29
|
+
);
|
|
30
|
+
const signature = new Uint8Array(await crypto.subtle.sign("HMAC", key, encoder.encode(message)));
|
|
31
|
+
return Array.from(signature, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
32
|
+
}
|
|
33
|
+
function constantTimeEqualHex(left, right) {
|
|
34
|
+
if (left.length !== right.length) return false;
|
|
35
|
+
let difference = 0;
|
|
36
|
+
for (let index = 0; index < left.length; index += 1) {
|
|
37
|
+
difference |= left.charCodeAt(index) ^ right.charCodeAt(index);
|
|
38
|
+
}
|
|
39
|
+
return difference === 0;
|
|
40
|
+
}
|
|
41
|
+
async function signOpenGeniPayload(secret, body, timestampSeconds = Math.floor(Date.now() / 1e3)) {
|
|
42
|
+
return `t=${timestampSeconds},v1=${await hmacSha256Hex(secret, `${timestampSeconds}.${body}`)}`;
|
|
43
|
+
}
|
|
44
|
+
async function verifyOpenGeniSignature(input) {
|
|
45
|
+
if (!input.signature) return false;
|
|
46
|
+
let timestamp = null;
|
|
47
|
+
const candidates = [];
|
|
48
|
+
for (const part of input.signature.split(",")) {
|
|
49
|
+
const [key, value] = part.trim().split("=", 2);
|
|
50
|
+
if (key === "t" && value && /^\d{1,12}$/.test(value)) timestamp = Number(value);
|
|
51
|
+
if (key === "v1" && value && /^[0-9a-f]{64}$/.test(value)) candidates.push(value);
|
|
52
|
+
}
|
|
53
|
+
if (timestamp === null || candidates.length === 0) return false;
|
|
54
|
+
const now = input.nowSeconds ?? Math.floor(Date.now() / 1e3);
|
|
55
|
+
const tolerance = input.toleranceSeconds ?? OPENGENI_SIGNATURE_TOLERANCE_SECONDS;
|
|
56
|
+
if (Math.abs(now - timestamp) > tolerance) return false;
|
|
57
|
+
const expected = await hmacSha256Hex(input.secret, `${timestamp}.${input.body}`);
|
|
58
|
+
return candidates.some((candidate) => constantTimeEqualHex(candidate, expected));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export {
|
|
62
|
+
WORKSPACE_WEBHOOK_EVENT_TYPES,
|
|
63
|
+
OPENGENI_WEBHOOK_TEST_EVENT_TYPE,
|
|
64
|
+
OPENGENI_TEST_REQUEST_NIL_ID,
|
|
65
|
+
OPENGENI_SIGNATURE_HEADER,
|
|
66
|
+
OPENGENI_EVENT_ID_HEADER,
|
|
67
|
+
OPENGENI_DELIVERY_ID_HEADER,
|
|
68
|
+
OPENGENI_SIGNATURE_TOLERANCE_SECONDS,
|
|
69
|
+
signOpenGeniPayload,
|
|
70
|
+
verifyOpenGeniSignature
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=chunk-6IXO76Z6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/workspace-integration-wire.ts"],"sourcesContent":["/**\n * Dependency-free wire constants and the OpenGeni-Signature scheme shared by\n * workspace webhooks and credential providers. Kept free of zod so browser and\n * React Native bundles can verify signatures without the schema runtime.\n */\n\nexport const WORKSPACE_WEBHOOK_EVENT_TYPES = [\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"session.status.changed\",\n \"session.requiresAction\",\n \"session.humanInput.requested\",\n \"session.notification.posted\",\n \"session.notification.withdrawn\",\n \"usage.threshold_reached\",\n \"usage.exhausted\",\n \"usage.period_reset\",\n] as const;\n\n/**\n * Sent only when an administrator presses \"Send test event\". It is never a\n * subscribable type: every endpoint can receive it, and a receiver that does\n * not care acknowledges it with any 2xx.\n */\nexport const OPENGENI_WEBHOOK_TEST_EVENT_TYPE = \"webhook.test\";\n\n/**\n * The session, turn and attempt ids of a credential-provider test request\n * (`purpose: \"test\"`). A test is not a run, so no real ids exist.\n */\nexport const OPENGENI_TEST_REQUEST_NIL_ID = \"00000000-0000-0000-0000-000000000000\";\n\nexport const OPENGENI_SIGNATURE_HEADER = \"OpenGeni-Signature\";\nexport const OPENGENI_EVENT_ID_HEADER = \"OpenGeni-Event-Id\";\nexport const OPENGENI_DELIVERY_ID_HEADER = \"OpenGeni-Delivery-Id\";\nexport const OPENGENI_SIGNATURE_TOLERANCE_SECONDS = 300;\n\nconst encoder = new TextEncoder();\n\nasync function hmacSha256Hex(secret: string, message: string): Promise<string> {\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const signature = new Uint8Array(await crypto.subtle.sign(\"HMAC\", key, encoder.encode(message)));\n return Array.from(signature, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction constantTimeEqualHex(left: string, right: string): boolean {\n if (left.length !== right.length) return false;\n let difference = 0;\n for (let index = 0; index < left.length; index += 1) {\n difference |= left.charCodeAt(index) ^ right.charCodeAt(index);\n }\n return difference === 0;\n}\n\n/**\n * `OpenGeni-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256(secret, \"<t>.<body>\")>`.\n * The timestamp is signed so a captured request cannot be replayed later.\n */\nexport async function signOpenGeniPayload(\n secret: string,\n body: string,\n timestampSeconds = Math.floor(Date.now() / 1000),\n): Promise<string> {\n return `t=${timestampSeconds},v1=${await hmacSha256Hex(secret, `${timestampSeconds}.${body}`)}`;\n}\n\nexport type VerifyOpenGeniSignatureInput = {\n secret: string;\n /** The exact raw request body, before JSON parsing. */\n body: string;\n /** The `OpenGeni-Signature` header value. */\n signature: string | null | undefined;\n toleranceSeconds?: number;\n nowSeconds?: number;\n};\n\nexport async function verifyOpenGeniSignature(\n input: VerifyOpenGeniSignatureInput,\n): Promise<boolean> {\n if (!input.signature) return false;\n let timestamp: number | null = null;\n const candidates: string[] = [];\n for (const part of input.signature.split(\",\")) {\n const [key, value] = part.trim().split(\"=\", 2);\n if (key === \"t\" && value && /^\\d{1,12}$/.test(value)) timestamp = Number(value);\n if (key === \"v1\" && value && /^[0-9a-f]{64}$/.test(value)) candidates.push(value);\n }\n if (timestamp === null || candidates.length === 0) return false;\n const now = input.nowSeconds ?? Math.floor(Date.now() / 1000);\n const tolerance = input.toleranceSeconds ?? OPENGENI_SIGNATURE_TOLERANCE_SECONDS;\n if (Math.abs(now - timestamp) > tolerance) return false;\n const expected = await hmacSha256Hex(input.secret, `${timestamp}.${input.body}`);\n return candidates.some((candidate) => constantTimeEqualHex(candidate, expected));\n}\n"],"mappings":";AAMO,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,IAAM,mCAAmC;AAMzC,IAAM,+BAA+B;AAErC,IAAM,4BAA4B;AAClC,IAAM,2BAA2B;AACjC,IAAM,8BAA8B;AACpC,IAAM,uCAAuC;AAEpD,IAAM,UAAU,IAAI,YAAY;AAEhC,eAAe,cAAc,QAAgB,SAAkC;AAC7E,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,QAAQ,OAAO,MAAM;AAAA,IACrB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACA,QAAM,YAAY,IAAI,WAAW,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,OAAO,CAAC,CAAC;AAC/F,SAAO,MAAM,KAAK,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACpF;AAEA,SAAS,qBAAqB,MAAc,OAAwB;AAClE,MAAI,KAAK,WAAW,MAAM,OAAQ,QAAO;AACzC,MAAI,aAAa;AACjB,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,kBAAc,KAAK,WAAW,KAAK,IAAI,MAAM,WAAW,KAAK;AAAA,EAC/D;AACA,SAAO,eAAe;AACxB;AAMA,eAAsB,oBACpB,QACA,MACA,mBAAmB,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,GAC9B;AACjB,SAAO,KAAK,gBAAgB,OAAO,MAAM,cAAc,QAAQ,GAAG,gBAAgB,IAAI,IAAI,EAAE,CAAC;AAC/F;AAYA,eAAsB,wBACpB,OACkB;AAClB,MAAI,CAAC,MAAM,UAAW,QAAO;AAC7B,MAAI,YAA2B;AAC/B,QAAM,aAAuB,CAAC;AAC9B,aAAW,QAAQ,MAAM,UAAU,MAAM,GAAG,GAAG;AAC7C,UAAM,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AAC7C,QAAI,QAAQ,OAAO,SAAS,aAAa,KAAK,KAAK,EAAG,aAAY,OAAO,KAAK;AAC9E,QAAI,QAAQ,QAAQ,SAAS,iBAAiB,KAAK,KAAK,EAAG,YAAW,KAAK,KAAK;AAAA,EAClF;AACA,MAAI,cAAc,QAAQ,WAAW,WAAW,EAAG,QAAO;AAC1D,QAAM,MAAM,MAAM,cAAc,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAC5D,QAAM,YAAY,MAAM,oBAAoB;AAC5C,MAAI,KAAK,IAAI,MAAM,SAAS,IAAI,UAAW,QAAO;AAClD,QAAM,WAAW,MAAM,cAAc,MAAM,QAAQ,GAAG,SAAS,IAAI,MAAM,IAAI,EAAE;AAC/E,SAAO,WAAW,KAAK,CAAC,cAAc,qBAAqB,WAAW,QAAQ,CAAC;AACjF;","names":[]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// src/session-usage-limit-refusal.ts
|
|
2
|
+
var SESSION_USAGE_LIMIT_SEGMENT = "session_usage_limit";
|
|
3
|
+
var SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON = "session_usage_limit";
|
|
4
|
+
var BASIS = "model_api_equivalent_v1";
|
|
5
|
+
var MAX_LIMIT_MICROS = 1e7 * 1e6;
|
|
6
|
+
var MESSAGE_MAX_UTF8_BYTES = 1024;
|
|
7
|
+
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
8
|
+
function record(value) {
|
|
9
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
10
|
+
}
|
|
11
|
+
function micros(value, max = Number.MAX_SAFE_INTEGER) {
|
|
12
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 && value <= max;
|
|
13
|
+
}
|
|
14
|
+
function boundedMessage(value) {
|
|
15
|
+
const normalized = value.slice(0, MESSAGE_MAX_UTF8_BYTES * 2).replace(/[\u0000-\u001f\u007f]+/g, " ").trim();
|
|
16
|
+
const bytes = new TextEncoder().encode(normalized);
|
|
17
|
+
let end = Math.min(bytes.length, MESSAGE_MAX_UTF8_BYTES);
|
|
18
|
+
while (end > 0 && end < bytes.length && (bytes[end] & 192) === 128) end -= 1;
|
|
19
|
+
return new TextDecoder().decode(bytes.slice(0, end)).trim();
|
|
20
|
+
}
|
|
21
|
+
function parseSessionUsageLimitReachedRefusal(value) {
|
|
22
|
+
const outer = record(value);
|
|
23
|
+
if (!outer) return null;
|
|
24
|
+
const source = record(outer.sessionUsageLimit) ?? outer;
|
|
25
|
+
if (source.code !== "session_usage_limit_reached") return null;
|
|
26
|
+
const fields = record(source.details) ?? source;
|
|
27
|
+
if (fields.basis !== BASIS || typeof fields.rootSessionId !== "string" || !UUID.test(fields.rootSessionId) || !micros(fields.limitMicros, MAX_LIMIT_MICROS) || !micros(fields.usedMicros)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const refusal = {
|
|
31
|
+
code: "session_usage_limit_reached",
|
|
32
|
+
basis: BASIS,
|
|
33
|
+
rootSessionId: fields.rootSessionId.toLowerCase(),
|
|
34
|
+
limitMicros: fields.limitMicros,
|
|
35
|
+
usedMicros: fields.usedMicros,
|
|
36
|
+
message: ""
|
|
37
|
+
};
|
|
38
|
+
const message = typeof source.message === "string" ? boundedMessage(source.message) : "";
|
|
39
|
+
return { ...refusal, message: message || sessionUsageLimitReachedMessage(refusal) };
|
|
40
|
+
}
|
|
41
|
+
function formatSessionUsageMicros(value) {
|
|
42
|
+
if (value > 0 && value < 1e4) return "<$0.01";
|
|
43
|
+
const dollars = value / 1e6;
|
|
44
|
+
return `$${dollars.toLocaleString("en-US", {
|
|
45
|
+
minimumFractionDigits: 2,
|
|
46
|
+
maximumFractionDigits: 2
|
|
47
|
+
})}`;
|
|
48
|
+
}
|
|
49
|
+
function sessionUsageLimitReachedMessage(refusal) {
|
|
50
|
+
return `This task's usage limit is reached (${formatSessionUsageMicros(refusal.usedMicros)} of ${formatSessionUsageMicros(refusal.limitMicros)} API-equivalent model usage). A person can raise or remove the limit to continue.`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export {
|
|
54
|
+
SESSION_USAGE_LIMIT_SEGMENT,
|
|
55
|
+
SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON,
|
|
56
|
+
parseSessionUsageLimitReachedRefusal,
|
|
57
|
+
formatSessionUsageMicros,
|
|
58
|
+
sessionUsageLimitReachedMessage
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=chunk-7272KVWZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/session-usage-limit-refusal.ts"],"sourcesContent":["/**\n * Browser/React Native-safe session usage limit helpers. Deliberately free of\n * the zod runtime so synchronous timeline projection can use it; contract\n * parity tests keep it aligned with `session-usage-limits.ts`.\n */\n\n/** `turn.completed.segmentLimit` for a stop caused by a task usage limit. */\nexport const SESSION_USAGE_LIMIT_SEGMENT = \"session_usage_limit\" as const;\n/** `SessionGoal.pausedReason` for a goal paused by a task usage limit. */\nexport const SESSION_USAGE_LIMIT_GOAL_PAUSED_REASON = \"session_usage_limit\" as const;\n\nconst BASIS = \"model_api_equivalent_v1\";\nconst MAX_LIMIT_MICROS = 10_000_000 * 1_000_000;\nconst MESSAGE_MAX_UTF8_BYTES = 1_024;\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport type ParsedSessionUsageLimitReachedRefusal = {\n code: \"session_usage_limit_reached\";\n basis: \"model_api_equivalent_v1\";\n rootSessionId: string;\n limitMicros: number;\n usedMicros: number;\n message: string;\n};\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction micros(value: unknown, max = Number.MAX_SAFE_INTEGER): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0 && value <= max;\n}\n\nfunction boundedMessage(value: string): string {\n const normalized = value\n .slice(0, MESSAGE_MAX_UTF8_BYTES * 2)\n .replace(/[\\u0000-\\u001f\\u007f]+/g, \" \")\n .trim();\n const bytes = new TextEncoder().encode(normalized);\n let end = Math.min(bytes.length, MESSAGE_MAX_UTF8_BYTES);\n while (end > 0 && end < bytes.length && (bytes[end]! & 0xc0) === 0x80) end -= 1;\n return new TextDecoder().decode(bytes.slice(0, end)).trim();\n}\n\n/**\n * Select only the public refusal fields from an API error body (fields may sit\n * in `details`), a `turn.completed` payload's `sessionUsageLimit` record, or a\n * refusal object. Anything malformed returns null instead of a guessed amount.\n */\nexport function parseSessionUsageLimitReachedRefusal(\n value: unknown,\n): ParsedSessionUsageLimitReachedRefusal | null {\n const outer = record(value);\n if (!outer) return null;\n const source = record(outer.sessionUsageLimit) ?? outer;\n if (source.code !== \"session_usage_limit_reached\") return null;\n const fields = record(source.details) ?? source;\n if (\n fields.basis !== BASIS ||\n typeof fields.rootSessionId !== \"string\" ||\n !UUID.test(fields.rootSessionId) ||\n !micros(fields.limitMicros, MAX_LIMIT_MICROS) ||\n !micros(fields.usedMicros)\n ) {\n return null;\n }\n const refusal = {\n code: \"session_usage_limit_reached\" as const,\n basis: BASIS as \"model_api_equivalent_v1\",\n rootSessionId: fields.rootSessionId.toLowerCase(),\n limitMicros: fields.limitMicros,\n usedMicros: fields.usedMicros,\n message: \"\",\n };\n const message = typeof source.message === \"string\" ? boundedMessage(source.message) : \"\";\n return { ...refusal, message: message || sessionUsageLimitReachedMessage(refusal) };\n}\n\n/**\n * \"$12.34\" for known amounts, \"<$0.01\" for a positive amount under a cent.\n * Callers must not pass unknown usage: render \"Preparing usage\" or\n * \"Usage unavailable\" instead of a dollar figure.\n */\nexport function formatSessionUsageMicros(value: number): string {\n if (value > 0 && value < 10_000) return \"<$0.01\";\n const dollars = value / 1_000_000;\n return `$${dollars.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n })}`;\n}\n\n/** Fixed, bounded wording: no reset date, purchase remedy or invoice claim. */\nexport function sessionUsageLimitReachedMessage(refusal: {\n limitMicros: number;\n usedMicros: number;\n}): string {\n return `This task's usage limit is reached (${formatSessionUsageMicros(refusal.usedMicros)} of ${formatSessionUsageMicros(refusal.limitMicros)} API-equivalent model usage). A person can raise or remove the limit to continue.`;\n}\n"],"mappings":";AAOO,IAAM,8BAA8B;AAEpC,IAAM,yCAAyC;AAEtD,IAAM,QAAQ;AACd,IAAM,mBAAmB,MAAa;AACtC,IAAM,yBAAyB;AAC/B,IAAM,OAAO;AAWb,SAAS,OAAO,OAAgD;AAC9D,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAEA,SAAS,OAAO,OAAgB,MAAM,OAAO,kBAAmC;AAC9E,SAAO,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,KAAK,SAAS,KAAK,SAAS;AAC5F;AAEA,SAAS,eAAe,OAAuB;AAC7C,QAAM,aAAa,MAChB,MAAM,GAAG,yBAAyB,CAAC,EACnC,QAAQ,2BAA2B,GAAG,EACtC,KAAK;AACR,QAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,UAAU;AACjD,MAAI,MAAM,KAAK,IAAI,MAAM,QAAQ,sBAAsB;AACvD,SAAO,MAAM,KAAK,MAAM,MAAM,WAAW,MAAM,GAAG,IAAK,SAAU,IAAM,QAAO;AAC9E,SAAO,IAAI,YAAY,EAAE,OAAO,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,KAAK;AAC5D;AAOO,SAAS,qCACd,OAC8C;AAC9C,QAAM,QAAQ,OAAO,KAAK;AAC1B,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,OAAO,MAAM,iBAAiB,KAAK;AAClD,MAAI,OAAO,SAAS,8BAA+B,QAAO;AAC1D,QAAM,SAAS,OAAO,OAAO,OAAO,KAAK;AACzC,MACE,OAAO,UAAU,SACjB,OAAO,OAAO,kBAAkB,YAChC,CAAC,KAAK,KAAK,OAAO,aAAa,KAC/B,CAAC,OAAO,OAAO,aAAa,gBAAgB,KAC5C,CAAC,OAAO,OAAO,UAAU,GACzB;AACA,WAAO;AAAA,EACT;AACA,QAAM,UAAU;AAAA,IACd,MAAM;AAAA,IACN,OAAO;AAAA,IACP,eAAe,OAAO,cAAc,YAAY;AAAA,IAChD,aAAa,OAAO;AAAA,IACpB,YAAY,OAAO;AAAA,IACnB,SAAS;AAAA,EACX;AACA,QAAM,UAAU,OAAO,OAAO,YAAY,WAAW,eAAe,OAAO,OAAO,IAAI;AACtF,SAAO,EAAE,GAAG,SAAS,SAAS,WAAW,gCAAgC,OAAO,EAAE;AACpF;AAOO,SAAS,yBAAyB,OAAuB;AAC9D,MAAI,QAAQ,KAAK,QAAQ,IAAQ,QAAO;AACxC,QAAM,UAAU,QAAQ;AACxB,SAAO,IAAI,QAAQ,eAAe,SAAS;AAAA,IACzC,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,EACzB,CAAC,CAAC;AACJ;AAGO,SAAS,gCAAgC,SAGrC;AACT,SAAO,uCAAuC,yBAAyB,QAAQ,UAAU,CAAC,OAAO,yBAAyB,QAAQ,WAAW,CAAC;AAChJ;","names":[]}
|