@opengeni/contracts 5.5.0 → 5.5.2-canary.40656248492001
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 +148 -37
- package/dist/api-key-presets.d.ts +19 -0
- package/dist/app-action-catalog-types.d.ts +32 -0
- package/dist/app-action-catalog.gen.d.ts +2 -0
- package/dist/app-actions.d.ts +91 -0
- package/dist/app-actions.js +10130 -0
- package/dist/app-actions.js.map +1 -0
- package/dist/app-shot.d.ts +55 -0
- package/dist/artifact-catalog.d.ts +33 -0
- package/dist/artifacts.d.ts +166 -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.js +48 -23
- package/dist/automation-templates.d.ts +434 -0
- package/dist/automation-templates.js +31 -0
- package/dist/automation-templates.js.map +1 -0
- package/dist/billing-subscriptions.d.ts +61 -0
- package/dist/bots.d.ts +583 -0
- package/dist/bundled-skills.d.ts +58 -2
- package/dist/canonical-human-identities.js +3 -1
- package/dist/child-lifecycle-notice-protocol.d.ts +45 -0
- package/dist/chunk-2QKIEAGY.js +396 -0
- package/dist/chunk-2QKIEAGY.js.map +1 -0
- package/dist/chunk-2WOWEWXV.js +426 -0
- package/dist/chunk-2WOWEWXV.js.map +1 -0
- package/dist/chunk-2ZIHHL72.js +153 -0
- package/dist/chunk-2ZIHHL72.js.map +1 -0
- package/dist/chunk-32U6NKQQ.js +389 -0
- package/dist/chunk-32U6NKQQ.js.map +1 -0
- package/dist/chunk-4YDDHSO2.js +799 -0
- package/dist/chunk-4YDDHSO2.js.map +1 -0
- package/dist/chunk-56SNIMDO.js +9 -0
- package/dist/chunk-56SNIMDO.js.map +1 -0
- package/dist/chunk-5RWB6QVL.js +101 -0
- package/dist/chunk-5RWB6QVL.js.map +1 -0
- package/dist/chunk-5UGUOT3L.js +243 -0
- package/dist/chunk-5UGUOT3L.js.map +1 -0
- package/dist/chunk-6LAT33BH.js +130 -0
- package/dist/chunk-6LAT33BH.js.map +1 -0
- package/dist/chunk-7272KVWZ.js +60 -0
- package/dist/chunk-7272KVWZ.js.map +1 -0
- package/dist/chunk-72QC2GTL.js +36 -0
- package/dist/chunk-72QC2GTL.js.map +1 -0
- package/dist/chunk-7EQGGZBY.js +105 -0
- package/dist/chunk-7EQGGZBY.js.map +1 -0
- package/dist/chunk-A3LXWVYU.js +382 -0
- package/dist/chunk-A3LXWVYU.js.map +1 -0
- package/dist/chunk-AQYDZUJV.js +34 -0
- package/dist/chunk-AQYDZUJV.js.map +1 -0
- package/dist/chunk-BHCEVVUP.js +93 -0
- package/dist/chunk-BHCEVVUP.js.map +1 -0
- package/dist/chunk-BMUTAZX5.js +486 -0
- package/dist/chunk-BMUTAZX5.js.map +1 -0
- package/dist/chunk-DGG6IBBK.js +150 -0
- package/dist/chunk-DGG6IBBK.js.map +1 -0
- package/dist/{chunk-YBW5JSA3.js → chunk-FBCTUMHI.js} +123 -102
- package/dist/chunk-FBCTUMHI.js.map +1 -0
- package/dist/chunk-G2KJTFIC.js +97 -0
- package/dist/chunk-G2KJTFIC.js.map +1 -0
- package/dist/chunk-G4RKARXZ.js +1167 -0
- package/dist/chunk-G4RKARXZ.js.map +1 -0
- package/dist/chunk-H6UJJIUM.js +350 -0
- package/dist/chunk-H6UJJIUM.js.map +1 -0
- package/dist/chunk-JOTHDW4H.js +18 -0
- package/dist/chunk-JOTHDW4H.js.map +1 -0
- package/dist/chunk-L4GUEP7K.js +56480 -0
- package/dist/chunk-L4GUEP7K.js.map +1 -0
- package/dist/{chunk-SIOU2K4U.js → chunk-LJH2EYGT.js} +23 -23
- package/dist/chunk-MTJKSIGA.js +161 -0
- package/dist/chunk-MTJKSIGA.js.map +1 -0
- package/dist/chunk-MYHMB6GZ.js +202 -0
- package/dist/chunk-MYHMB6GZ.js.map +1 -0
- package/dist/chunk-PI5VIKJY.js +660 -0
- package/dist/chunk-PI5VIKJY.js.map +1 -0
- package/dist/{chunk-RIY7GYQS.js → chunk-PTSROVDG.js} +2 -2
- package/dist/chunk-PUIUXIOL.js +189 -0
- package/dist/chunk-PUIUXIOL.js.map +1 -0
- package/dist/chunk-R6VXJIMB.js +19 -0
- package/dist/chunk-R6VXJIMB.js.map +1 -0
- package/dist/chunk-RLJUNVAM.js +15 -0
- package/dist/chunk-RLJUNVAM.js.map +1 -0
- package/dist/chunk-RR6APCBK.js +213 -0
- package/dist/chunk-RR6APCBK.js.map +1 -0
- package/dist/{chunk-TXTQIYCV.js → chunk-RUQ4I6DO.js} +59 -13
- package/dist/chunk-RUQ4I6DO.js.map +1 -0
- package/dist/{chunk-WYBDERIY.js → chunk-RWEEUDHD.js} +53 -42
- package/dist/chunk-RWEEUDHD.js.map +1 -0
- package/dist/chunk-S7MSQQL6.js +158 -0
- package/dist/chunk-S7MSQQL6.js.map +1 -0
- package/dist/{chunk-5Q54VCCH.js → chunk-SHO4YO4B.js} +20 -36
- package/dist/chunk-SHO4YO4B.js.map +1 -0
- package/dist/{chunk-HHZSZYYF.js → chunk-T3HSWMA5.js} +20 -4
- package/dist/chunk-T3HSWMA5.js.map +1 -0
- package/dist/{chunk-YRKRZ6OF.js → chunk-TOOJIBJC.js} +2 -2
- package/dist/chunk-UCUOTRS6.js +431 -0
- package/dist/chunk-UCUOTRS6.js.map +1 -0
- package/dist/chunk-UH4K7GP7.js +424 -0
- package/dist/chunk-UH4K7GP7.js.map +1 -0
- package/dist/chunk-UIZWGPHV.js +120 -0
- package/dist/chunk-UIZWGPHV.js.map +1 -0
- package/dist/chunk-VLUKBV6Y.js +1170 -0
- package/dist/chunk-VLUKBV6Y.js.map +1 -0
- package/dist/chunk-W2QQ5Y6K.js +55 -0
- package/dist/chunk-W2QQ5Y6K.js.map +1 -0
- package/dist/{chunk-Y3KNXVTD.js → chunk-W3NBPR4E.js} +131 -31
- package/dist/chunk-W3NBPR4E.js.map +1 -0
- package/dist/{chunk-NRMCVHAU.js → chunk-WMGO4HJU.js} +11 -9
- package/dist/chunk-WMGO4HJU.js.map +1 -0
- package/dist/{chunk-MYBZRDTY.js → chunk-WQI7VNN4.js} +19 -9
- package/dist/chunk-WQI7VNN4.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-XB6GQLBH.js +76 -0
- package/dist/chunk-XB6GQLBH.js.map +1 -0
- package/dist/{chunk-D2HKF2EF.js → chunk-XP5M3IKT.js} +2 -2
- package/dist/{chunk-O77VSFYZ.js → chunk-ZMPU5BWE.js} +12 -2
- package/dist/chunk-ZMPU5BWE.js.map +1 -0
- package/dist/{chunk-3SIZGL3O.js → chunk-ZYVEJFNU.js} +22 -18
- package/dist/chunk-ZYVEJFNU.js.map +1 -0
- package/dist/claude-provider-account-authority.d.ts +18 -0
- package/dist/claude-subscription-oauth.d.ts +25 -0
- package/dist/claude-subscription-usage.d.ts +95 -1
- package/dist/client-error-report.d.ts +154 -8
- package/dist/client-error-report.js +157 -2
- package/dist/client-error-report.js.map +1 -1
- package/dist/code-search.d.ts +1 -1
- package/dist/code-search.js.map +1 -1
- package/dist/codex-provider-account-authority.js +23 -12
- package/dist/codex-provider-account-authority.js.map +1 -1
- package/dist/company-profile.d.ts +144 -0
- package/dist/connect.d.ts +38 -0
- package/dist/connect.js +244 -164
- package/dist/connect.js.map +1 -1
- package/dist/connection-account-label.d.ts +2 -0
- package/dist/connection-account-label.js +34 -0
- package/dist/connection-account-label.js.map +1 -0
- package/dist/connection-authority.js +49 -24
- package/dist/connector-attachments.js +3 -1
- package/dist/connector-destinations.js +3 -1
- package/dist/connector-tool-permissions.d.ts +68 -4
- package/dist/credential-profiles.d.ts +166 -0
- package/dist/cua-desktop-tools.d.ts +19 -0
- package/dist/define-schema.d.ts +8 -0
- package/dist/desktop-app.d.ts +28 -0
- package/dist/direct-model-provider.d.ts +38 -0
- package/dist/document-artifact-commands.js +2 -2
- package/dist/document-artifact-query.js +2 -2
- package/dist/editable-artifact-binary.d.ts +7 -0
- package/dist/editable-artifact-causal-frontier.js +2 -2
- package/dist/editable-artifact-codec-registry.js +7 -7
- package/dist/editable-artifact-committed-transaction.js +4 -2
- package/dist/editable-artifact-live.js +8 -8
- package/dist/editable-artifact-serialized-commit.js +9 -9
- package/dist/editable-artifact-versions.d.ts +7 -1
- package/dist/editable-artifact-versions.js +1 -1
- package/dist/editable-artifacts.js +49 -43
- package/dist/event-preview.d.ts +22 -0
- package/dist/event-triggers.d.ts +1253 -0
- package/dist/event-triggers.js +148 -0
- package/dist/event-triggers.js.map +1 -0
- package/dist/external-identities.d.ts +34 -0
- package/dist/external-identities.js +4 -2
- package/dist/feedback.d.ts +181 -0
- package/dist/file-access.d.ts +23 -0
- package/dist/first-party-tool-authorization.d.ts +852 -0
- package/dist/github-repository-contracts.js +64 -43
- package/dist/github-repository-contracts.js.map +1 -1
- package/dist/google-drive-native-retirement.d.ts +12 -0
- package/dist/google-drive-native-retirement.js +20 -0
- package/dist/google-drive-native-retirement.js.map +1 -0
- package/dist/google-drive.d.ts +1 -1
- package/dist/google-drive.js +323 -239
- package/dist/google-drive.js.map +1 -1
- package/dist/host-mcp-bindings.js +250 -198
- package/dist/host-mcp-bindings.js.map +1 -1
- package/dist/index.d.ts +29072 -20593
- package/dist/index.js +2432 -366
- package/dist/inference-residency.d.ts +22 -0
- package/dist/insights-usage.d.ts +948 -0
- package/dist/insights-usage.js +608 -0
- package/dist/insights-usage.js.map +1 -0
- package/dist/integration-capability-id.d.ts +8 -0
- package/dist/interaction-action-deadline.d.ts +48 -0
- package/dist/interaction-driver-diagnostic.d.ts +28 -0
- package/dist/interaction.d.ts +2126 -881
- package/dist/knowledge-entries.d.ts +38 -0
- package/dist/knowledge-preparation.d.ts +4 -0
- package/dist/learning-refusal.d.ts +43 -0
- package/dist/learning-refusal.js +49 -0
- package/dist/learning-refusal.js.map +1 -0
- package/dist/managed-auth-session-sets.d.ts +1 -0
- package/dist/managed-auth-session-sets.js +207 -146
- package/dist/managed-auth-session-sets.js.map +1 -1
- package/dist/managed-sign-in-methods.d.ts +96 -0
- package/dist/managed-sign-in-methods.js +157 -35
- package/dist/managed-sign-in-methods.js.map +1 -1
- package/dist/mcp-structured-content.d.ts +25 -0
- package/dist/message-time-zone.d.ts +38 -0
- package/dist/message-time-zone.js +19 -0
- package/dist/message-time-zone.js.map +1 -0
- package/dist/modal-native-proof-v2.d.ts +587 -0
- package/dist/modal-native-proof-v2.js +39 -0
- package/dist/modal-native-proof-v2.js.map +1 -0
- package/dist/model-account-choice.d.ts +237 -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 +8 -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.js.map +1 -1
- package/dist/model-residency.d.ts +304 -0
- package/dist/organization-access.d.ts +416 -0
- package/dist/organization-access.js +40 -0
- package/dist/organization-access.js.map +1 -0
- package/dist/organization-integration-policy.d.ts +18 -0
- package/dist/organization-membership-lifecycle.d.ts +66 -0
- package/dist/organization-model-usage.d.ts +146 -0
- package/dist/organization-model-usage.js +87 -0
- package/dist/organization-model-usage.js.map +1 -0
- package/dist/organization-recovery.js +3 -1
- package/dist/organization-usage.d.ts +12 -0
- package/dist/passkey-only-account.d.ts +14 -0
- package/dist/passkey-only-account.js +13 -0
- package/dist/passkey-only-account.js.map +1 -0
- package/dist/permissions.d.ts +19 -0
- package/dist/personal-github.js +220 -148
- package/dist/personal-github.js.map +1 -1
- package/dist/personal-integration-setup.d.ts +81 -0
- package/dist/personal-integration-setup.js +42 -0
- package/dist/personal-integration-setup.js.map +1 -0
- package/dist/prepared-mcp-setup.d.ts +54 -0
- package/dist/prepared-mcp-setup.js +13 -0
- package/dist/prepared-mcp-setup.js.map +1 -0
- package/dist/presentation-artifact-commands.js +2 -2
- package/dist/presentation-artifact-query.js +2 -2
- package/dist/primitives.d.ts +18 -0
- package/dist/product-analytics.d.ts +27 -10
- package/dist/product-lifecycle-facts.d.ts +26 -3
- package/dist/prompt-cache-diagnostics.d.ts +92 -0
- package/dist/recordings.d.ts +1371 -0
- package/dist/remember.d.ts +98 -2
- package/dist/retained-output.d.ts +4 -2
- package/dist/sandbox-file-artifacts.d.ts +19 -2
- package/dist/sandbox-provider-command.d.ts +5 -44
- package/dist/sandbox-recovery.d.ts +139 -8
- package/dist/secret-generator.d.ts +44 -0
- package/dist/secret-mask-strings.d.ts +32 -0
- package/dist/secret-references.d.ts +90 -0
- package/dist/secret-resolution.d.ts +143 -0
- package/dist/secret-shape-masking.d.ts +52 -0
- package/dist/secret-shape-masking.js +19 -0
- package/dist/secret-shape-masking.js.map +1 -0
- package/dist/secret-totp.d.ts +41 -0
- package/dist/secret-use-approval-question.d.ts +11 -0
- package/dist/secret-use-approval-question.js +11 -0
- package/dist/secret-use-approval-question.js.map +1 -0
- package/dist/secret-use-approvals.d.ts +106 -0
- package/dist/secret-value-masking.d.ts +299 -0
- package/dist/secret-value-masking.js +62 -0
- package/dist/secret-value-masking.js.map +1 -0
- package/dist/secret-value.d.ts +19 -0
- package/dist/session-history-import.d.ts +444 -8
- package/dist/session-history.d.ts +111 -0
- package/dist/session-history.js +35 -0
- package/dist/session-history.js.map +1 -0
- package/dist/session-list-entries.d.ts +8 -0
- package/dist/session-list-entries.js +61 -0
- package/dist/session-list-entries.js.map +1 -0
- package/dist/session-mcp-projections.d.ts +13 -1
- package/dist/session-mcp-tool-permissions.d.ts +62 -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 +43 -0
- package/dist/session-usage-limits.js.map +1 -0
- package/dist/site-data.d.ts +286 -0
- package/dist/site-operations.d.ts +39 -0
- package/dist/site-publishing.d.ts +813 -0
- package/dist/site-session-http.d.ts +103 -4
- package/dist/site-session-http.js +27 -1
- package/dist/site-sql.d.ts +425 -0
- package/dist/skills.d.ts +38 -0
- package/dist/slack-bot-scopes.d.ts +9 -7
- package/dist/slack-bot-scopes.js +6 -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 +9 -2
- package/dist/spreadsheet-artifact-query.d.ts +13 -6
- package/dist/spreadsheet-artifact-query.js +4 -3
- package/dist/subscription-account-actions.d.ts +83 -0
- package/dist/subscription-account-pools.d.ts +326 -0
- package/dist/subscription-personal-authority-v2.d.ts +28 -0
- package/dist/subscription-personal-authority-v2.js +13 -0
- package/dist/subscription-personal-authority-v2.js.map +1 -0
- package/dist/subscription-plans.d.ts +38 -0
- package/dist/subscription-usage-pool.d.ts +89 -0
- package/dist/tool-action-review.d.ts +141 -0
- package/dist/tool-catalog.d.ts +479 -0
- package/dist/tool-policy.d.ts +5 -0
- package/dist/tool-review-presentation.d.ts +29 -0
- package/dist/tool-review-presentation.js +21 -0
- package/dist/tool-review-presentation.js.map +1 -0
- package/dist/turn-serving-policy.d.ts +223 -0
- package/dist/usage-allowances.d.ts +30 -0
- package/dist/usage-allowances.js +5 -1
- package/dist/values.d.ts +11 -0
- package/dist/values.js +19 -0
- package/dist/values.js.map +1 -0
- package/dist/vault-provider-wire.d.ts +907 -0
- package/dist/vault-provider-wire.js +74 -0
- package/dist/vault-provider-wire.js.map +1 -0
- package/dist/vaults.d.ts +2185 -0
- package/dist/video-generation.d.ts +75 -0
- package/dist/video-generation.js +8 -1
- package/dist/workspace-control-event.d.ts +18 -0
- package/dist/workspace-control-event.js +18 -0
- package/dist/workspace-control-event.js.map +1 -0
- package/dist/workspace-governance-context.d.ts +18 -0
- package/dist/workspace-integration-wire.d.ts +1 -1
- package/dist/workspace-integration-wire.js +1 -1
- package/dist/workspace-integrations.d.ts +212 -12
- package/dist/xai-provider-account-authority.js +3 -1
- package/package.json +121 -4
- package/src/agent-authored-durable-text.ts +14 -11
- package/src/agent-config.ts +382 -203
- package/src/agent-instruction-changes.ts +94 -74
- package/src/agent-learning.ts +94 -66
- package/src/agent-topology.ts +58 -52
- package/src/api-key-presets.ts +28 -0
- package/src/app-action-catalog-types.ts +32 -0
- package/src/app-action-catalog.gen.ts +9905 -0
- package/src/app-actions.ts +365 -0
- package/src/app-shot.ts +176 -0
- package/src/artifact-catalog.ts +81 -46
- package/src/artifacts.ts +360 -227
- package/src/atlassian-native-retirement.ts +33 -0
- package/src/atlassian.ts +136 -108
- package/src/automation-templates.ts +201 -0
- package/src/billing-subscriptions.ts +48 -0
- package/src/bots.ts +238 -0
- package/src/bundled-skills.ts +79 -22
- package/src/canonical-human-identities.ts +65 -62
- package/src/child-lifecycle-notice-protocol.gen.json +1310 -0
- package/src/child-lifecycle-notice-protocol.ts +224 -0
- package/src/claude-provider-account-authority.ts +12 -0
- package/src/claude-subscription-oauth.ts +61 -19
- package/src/claude-subscription-usage.ts +64 -35
- package/src/client-error-report.ts +344 -9
- package/src/code-search.ts +1 -1
- package/src/codex-provider-account-authority.ts +22 -16
- package/src/company-brain-governed-writes.ts +265 -244
- package/src/company-brain.ts +165 -154
- package/src/company-profile.ts +362 -297
- package/src/connect.ts +222 -173
- package/src/connection-account-label.ts +45 -0
- package/src/connection-authority.ts +172 -152
- package/src/connector-attachments.ts +139 -123
- package/src/connector-destinations.ts +48 -43
- package/src/connector-tool-permissions.ts +104 -46
- package/src/credential-profiles.ts +161 -0
- package/src/cua-desktop-tools.gen.json +6722 -0
- package/src/cua-desktop-tools.linux.gen.json +6798 -0
- package/src/cua-desktop-tools.ts +42 -0
- package/src/cua-desktop-tools.windows.gen.json +6739 -0
- package/src/define-schema.ts +10 -0
- package/src/desktop-app.ts +50 -0
- package/src/direct-model-provider.ts +112 -0
- package/src/editable-artifact-binary.ts +29 -8
- package/src/editable-artifact-committed-transaction.ts +19 -18
- package/src/editable-artifact-serialized-commit.ts +8 -2
- package/src/editable-artifact-versions.ts +7 -1
- package/src/event-preview.ts +53 -3
- package/src/event-triggers.ts +891 -0
- package/src/external-identities.ts +239 -195
- package/src/feedback.ts +125 -30
- package/src/file-access.ts +26 -0
- package/src/first-party-tool-authorization.ts +383 -0
- package/src/github-repository-contracts.ts +78 -64
- package/src/google-drive-native-retirement.ts +20 -0
- package/src/google-drive.ts +286 -234
- package/src/governed-learning-activation.ts +159 -137
- package/src/governed-learning-evaluator.ts +141 -133
- package/src/host-mcp-bindings.ts +244 -221
- package/src/image-generation.ts +105 -95
- package/src/index.ts +13928 -9899
- package/src/inference-residency.ts +36 -0
- package/src/insights-usage.ts +774 -0
- package/src/integration-capability-id.ts +16 -0
- package/src/interaction-action-deadline.ts +143 -0
- package/src/interaction-driver-diagnostic.ts +89 -0
- package/src/interaction.ts +3527 -2427
- package/src/knowledge-entries.ts +386 -299
- package/src/knowledge-preparation.ts +49 -41
- package/src/knowledge.ts +242 -213
- package/src/learning-refusal.ts +90 -0
- package/src/managed-auth-session-sets.ts +180 -133
- package/src/managed-sign-in-methods.ts +156 -34
- package/src/mcp-oauth.ts +58 -46
- package/src/mcp-receipts.ts +199 -194
- package/src/mcp-structured-content.ts +81 -0
- package/src/memory-slack-delivery.ts +172 -142
- package/src/message-time-zone.ts +109 -0
- package/src/modal-native-proof-v2.ts +430 -0
- package/src/model-account-choice.ts +178 -0
- package/src/model-account-settings.ts +210 -0
- package/src/model-availability.ts +22 -0
- package/src/model-connection-access.ts +62 -14
- package/src/model-context-inspector.ts +130 -109
- package/src/model-display.ts +221 -0
- package/src/model-picker-order.ts +1 -1
- package/src/model-residency.ts +535 -0
- package/src/organization-access.ts +216 -0
- package/src/organization-integration-policy.ts +47 -28
- package/src/organization-membership-lifecycle.ts +558 -384
- package/src/organization-model-usage.ts +82 -0
- package/src/organization-recovery.ts +148 -135
- package/src/organization-usage.ts +84 -52
- package/src/passkey-only-account.ts +29 -0
- package/src/permissions.ts +94 -52
- package/src/personal-github.ts +211 -171
- package/src/personal-integration-setup.ts +150 -0
- package/src/preference-registry.ts +319 -263
- package/src/prepared-mcp-setup.ts +190 -0
- package/src/primitives.ts +22 -0
- package/src/product-analytics.ts +40 -15
- package/src/product-lifecycle-facts.ts +50 -20
- package/src/prompt-cache-diagnostics.ts +212 -0
- package/src/recordings.ts +1153 -0
- package/src/remember.ts +184 -172
- package/src/retained-output.ts +181 -168
- package/src/sandbox-file-artifacts.ts +78 -57
- package/src/sandbox-provider-command.ts +55 -72
- package/src/sandbox-recovery.ts +163 -77
- package/src/scoped-knowledge.ts +62 -43
- package/src/secret-generator.ts +156 -0
- package/src/secret-mask-strings.ts +175 -0
- package/src/secret-references.ts +414 -0
- package/src/secret-resolution.ts +322 -0
- package/src/secret-shape-masking.ts +573 -0
- package/src/secret-totp.ts +188 -0
- package/src/secret-use-approval-question.ts +22 -0
- package/src/secret-use-approvals.ts +219 -0
- package/src/secret-value-masking.ts +1283 -0
- package/src/secret-value.ts +22 -0
- package/src/session-goal-reports.ts +55 -49
- package/src/session-history-import.ts +84 -68
- package/src/session-history.ts +197 -0
- package/src/session-list-entries.ts +106 -0
- package/src/session-mcp-projections.ts +21 -3
- package/src/session-mcp-tool-permissions.ts +109 -0
- package/src/session-message-search.ts +46 -38
- package/src/session-target.ts +58 -0
- package/src/session-titles.ts +40 -4
- package/src/session-topology-primitives.ts +20 -12
- package/src/session-usage-limit-refusal.ts +101 -0
- package/src/session-usage-limits.ts +169 -0
- package/src/signup-attribution.ts +20 -15
- package/src/site-data.ts +337 -0
- package/src/site-operations.ts +154 -0
- package/src/site-publishing.ts +903 -0
- package/src/site-session-http.ts +344 -16
- package/src/site-sql.ts +1120 -0
- package/src/skill-use.ts +18 -17
- package/src/skills.ts +105 -50
- package/src/slack-bot-scopes.ts +18 -35
- package/src/slack-rest-mcp.ts +222 -0
- package/src/slack-task-policy.ts +97 -73
- package/src/spreadsheet-artifact-commands.ts +74 -13
- package/src/spreadsheet-artifact-query.ts +188 -50
- package/src/subscription-account-actions.ts +103 -0
- package/src/subscription-account-pools.ts +74 -0
- package/src/subscription-personal-authority-v2.ts +69 -0
- package/src/subscription-plans.ts +51 -0
- package/src/subscription-usage-pool.ts +44 -0
- package/src/task-notes.ts +70 -68
- package/src/tool-action-review.ts +271 -0
- package/src/tool-catalog.ts +694 -379
- package/src/tool-policy.ts +82 -0
- package/src/tool-result-spill.ts +13 -9
- package/src/tool-review-presentation.ts +643 -0
- package/src/turn-serving-policy.ts +167 -0
- package/src/usage-allowances.ts +212 -136
- package/src/values.ts +25 -0
- package/src/vault-provider-wire.ts +580 -0
- package/src/vaults.ts +1296 -0
- package/src/video-generation.ts +430 -361
- package/src/work-claims.ts +183 -166
- package/src/workspace-control-event.ts +134 -0
- package/src/workspace-governance-context.ts +63 -0
- package/src/workspace-instruction-policies.ts +346 -279
- package/src/workspace-integration-wire.ts +10 -0
- package/src/workspace-integrations.ts +488 -398
- package/src/workspace-learning-administration.ts +58 -44
- package/src/workspace-learning-policy.ts +126 -99
- package/src/workspace-state.ts +239 -220
- package/src/xai-provider-account-authority.ts +23 -17
- package/dist/chunk-3SIZGL3O.js.map +0 -1
- package/dist/chunk-566IFOVP.js +0 -26133
- package/dist/chunk-566IFOVP.js.map +0 -1
- package/dist/chunk-5IXYF6XN.js +0 -728
- package/dist/chunk-5IXYF6XN.js.map +0 -1
- package/dist/chunk-5Q54VCCH.js.map +0 -1
- package/dist/chunk-BCS7WHCK.js +0 -139
- package/dist/chunk-BCS7WHCK.js.map +0 -1
- package/dist/chunk-EK7NDGFR.js +0 -128
- package/dist/chunk-EK7NDGFR.js.map +0 -1
- package/dist/chunk-GRG7PHWQ.js +0 -25
- package/dist/chunk-GRG7PHWQ.js.map +0 -1
- package/dist/chunk-HHZSZYYF.js.map +0 -1
- package/dist/chunk-ICDZGUX2.js +0 -186
- package/dist/chunk-ICDZGUX2.js.map +0 -1
- package/dist/chunk-JUFK3T4Q.js +0 -80
- package/dist/chunk-JUFK3T4Q.js.map +0 -1
- package/dist/chunk-MYBZRDTY.js.map +0 -1
- package/dist/chunk-NRMCVHAU.js.map +0 -1
- package/dist/chunk-O77VSFYZ.js.map +0 -1
- package/dist/chunk-P3HLDT77.js +0 -59
- package/dist/chunk-P3HLDT77.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/chunk-YWMOIZ6A.js +0 -185
- package/dist/chunk-YWMOIZ6A.js.map +0 -1
- package/dist/site-request-headers.test.d.ts +0 -1
- package/dist/transcription-recordings.d.ts +0 -300
- package/src/transcription-recordings.ts +0 -169
- /package/dist/{chunk-SIOU2K4U.js.map → chunk-LJH2EYGT.js.map} +0 -0
- /package/dist/{chunk-RIY7GYQS.js.map → chunk-PTSROVDG.js.map} +0 -0
- /package/dist/{chunk-YRKRZ6OF.js.map → chunk-TOOJIBJC.js.map} +0 -0
- /package/dist/{chunk-D2HKF2EF.js.map → chunk-XP5M3IKT.js.map} +0 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import {
|
|
2
|
+
nonnegativeInteger,
|
|
3
|
+
positiveInteger,
|
|
4
|
+
string
|
|
5
|
+
} from "./chunk-AQYDZUJV.js";
|
|
6
|
+
import {
|
|
7
|
+
defineSchema
|
|
8
|
+
} from "./chunk-56SNIMDO.js";
|
|
9
|
+
|
|
10
|
+
// src/retained-output.ts
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
var RETAINED_OUTPUT_MAX_PAGE_BYTES = 1024 * 1024;
|
|
13
|
+
var RETAINED_OUTPUT_DEFAULT_PAGE_BYTES = 256 * 1024;
|
|
14
|
+
var RETAINED_OUTPUT_RECEIPT_MAX_BYTES = 2 * 1024;
|
|
15
|
+
var COMPUTER_SCREENSHOT_MAX_BYTES = 32 * 1024 * 1024;
|
|
16
|
+
var COMPUTER_SCREENSHOT_MAX_DIMENSION = 16384;
|
|
17
|
+
var COMPUTER_SCREENSHOT_MAX_PIXELS = 67108864;
|
|
18
|
+
var COMPUTER_SCREENSHOT_RETENTION_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
19
|
+
var GENERATED_IMAGE_MAX_BYTES = 64 * 1024 * 1024;
|
|
20
|
+
var GENERATED_VIDEO_MAX_BYTES = 512 * 1024 * 1024;
|
|
21
|
+
var encoder = new TextEncoder();
|
|
22
|
+
var LOWERCASE_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
|
23
|
+
var LOWERCASE_SHA256 = /^[0-9a-f]{64}$/;
|
|
24
|
+
var CANONICAL_MEDIA_TYPE = /^[a-z0-9][a-z0-9!#$&^_.+-]{0,62}\/[a-z0-9][a-z0-9!#$&^_.+-]{0,62}$/;
|
|
25
|
+
var WORKSPACE_RETRIEVAL_PATH = /^\/v1\/workspaces\/([0-9a-f-]+)\/artifacts\/([0-9a-f-]+)\/content$/;
|
|
26
|
+
var SESSION_RETRIEVAL_PATH = /^\/v1\/workspaces\/([0-9a-f-]+)\/sessions\/([0-9a-f-]+)\/artifacts\/([0-9a-f-]+)\/content$/;
|
|
27
|
+
var RetainedOutputKind = /* @__PURE__ */ defineSchema(
|
|
28
|
+
() => z.enum([
|
|
29
|
+
"tool_result",
|
|
30
|
+
"assistant_completion",
|
|
31
|
+
"internal_update",
|
|
32
|
+
"event_media",
|
|
33
|
+
"computer_screenshot",
|
|
34
|
+
"browser_screenshot",
|
|
35
|
+
"generated_image",
|
|
36
|
+
"generated_video",
|
|
37
|
+
"file"
|
|
38
|
+
])
|
|
39
|
+
);
|
|
40
|
+
var RetainedOutputUnavailableReason = /* @__PURE__ */ defineSchema(
|
|
41
|
+
() => z.enum([
|
|
42
|
+
"not_retained",
|
|
43
|
+
"pending",
|
|
44
|
+
"failed",
|
|
45
|
+
"expired",
|
|
46
|
+
"deleted",
|
|
47
|
+
"missing_storage",
|
|
48
|
+
"storage_write_failed",
|
|
49
|
+
"quota_exceeded",
|
|
50
|
+
"invalid_content",
|
|
51
|
+
"oversized",
|
|
52
|
+
"unsupported",
|
|
53
|
+
// The file exists but is Only me for someone else. Never says whose.
|
|
54
|
+
"private"
|
|
55
|
+
])
|
|
56
|
+
);
|
|
57
|
+
var RetainedOutputUnavailableEvidenceSchema = /* @__PURE__ */ defineSchema(
|
|
58
|
+
() => z.object({
|
|
59
|
+
available: z.literal(false),
|
|
60
|
+
reason: RetainedOutputUnavailableReason
|
|
61
|
+
}).strict()
|
|
62
|
+
);
|
|
63
|
+
var RetainedArtifactReferenceSchema = /* @__PURE__ */ defineSchema(
|
|
64
|
+
() => z.object({
|
|
65
|
+
available: z.literal(true),
|
|
66
|
+
artifactId: string.regex(LOWERCASE_UUID),
|
|
67
|
+
kind: RetainedOutputKind,
|
|
68
|
+
contentType: z.string().max(127).regex(CANONICAL_MEDIA_TYPE),
|
|
69
|
+
originalBytes: nonnegativeInteger.safe(),
|
|
70
|
+
sha256: string.regex(LOWERCASE_SHA256),
|
|
71
|
+
retainedAt: string.datetime({ offset: true }),
|
|
72
|
+
dimensions: z.object({
|
|
73
|
+
width: positiveInteger.max(COMPUTER_SCREENSHOT_MAX_DIMENSION),
|
|
74
|
+
height: positiveInteger.max(COMPUTER_SCREENSHOT_MAX_DIMENSION)
|
|
75
|
+
}).strict().optional(),
|
|
76
|
+
retention: z.union([
|
|
77
|
+
z.object({
|
|
78
|
+
policy: z.literal("workspace_file"),
|
|
79
|
+
expiresAt: z.null()
|
|
80
|
+
}).strict(),
|
|
81
|
+
z.object({
|
|
82
|
+
policy: z.literal("session_screenshot"),
|
|
83
|
+
expiresAt: string.datetime({ offset: true })
|
|
84
|
+
}).strict()
|
|
85
|
+
]),
|
|
86
|
+
retrieval: z.object({
|
|
87
|
+
method: z.literal("GET"),
|
|
88
|
+
path: z.string().max(256),
|
|
89
|
+
acceptRanges: z.literal("bytes"),
|
|
90
|
+
maxRangeBytes: positiveInteger.max(RETAINED_OUTPUT_MAX_PAGE_BYTES)
|
|
91
|
+
}).strict()
|
|
92
|
+
}).strict().superRefine((value, ctx) => {
|
|
93
|
+
const workspaceMatch = WORKSPACE_RETRIEVAL_PATH.exec(value.retrieval.path);
|
|
94
|
+
const sessionMatch = SESSION_RETRIEVAL_PATH.exec(value.retrieval.path);
|
|
95
|
+
const workspaceId = workspaceMatch?.[1] ?? sessionMatch?.[1];
|
|
96
|
+
const sessionId = sessionMatch?.[2];
|
|
97
|
+
const artifactId = workspaceMatch?.[2] ?? sessionMatch?.[3];
|
|
98
|
+
if (!workspaceId || !LOWERCASE_UUID.test(workspaceId) || sessionId !== void 0 && !LOWERCASE_UUID.test(sessionId) || artifactId !== value.artifactId) {
|
|
99
|
+
ctx.addIssue({
|
|
100
|
+
code: "custom",
|
|
101
|
+
path: ["retrieval", "path"],
|
|
102
|
+
message: "retrieval path must be a workspace/session API content path for this artifact"
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (value.kind === "computer_screenshot" || value.kind === "browser_screenshot" || value.kind === "generated_image" || value.kind === "generated_video") {
|
|
106
|
+
if (!value.dimensions) {
|
|
107
|
+
ctx.addIssue({
|
|
108
|
+
code: "custom",
|
|
109
|
+
path: ["dimensions"],
|
|
110
|
+
message: `${value.kind} receipts require exact dimensions`
|
|
111
|
+
});
|
|
112
|
+
} else if (value.dimensions.width * value.dimensions.height > COMPUTER_SCREENSHOT_MAX_PIXELS) {
|
|
113
|
+
ctx.addIssue({
|
|
114
|
+
code: "custom",
|
|
115
|
+
path: ["dimensions"],
|
|
116
|
+
message: `${value.kind} dimensions exceed the pixel limit`
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (value.kind === "generated_image") {
|
|
121
|
+
if (value.retention.policy !== "workspace_file" || !workspaceMatch || sessionMatch) {
|
|
122
|
+
ctx.addIssue({
|
|
123
|
+
code: "custom",
|
|
124
|
+
path: ["retention"],
|
|
125
|
+
message: "generated images require permanent workspace-file retrieval"
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
if (!["image/png", "image/jpeg", "image/webp"].includes(value.contentType) || value.originalBytes <= 0 || value.originalBytes > GENERATED_IMAGE_MAX_BYTES) {
|
|
129
|
+
ctx.addIssue({
|
|
130
|
+
code: "custom",
|
|
131
|
+
path: ["contentType"],
|
|
132
|
+
message: "generated image media metadata is invalid"
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (value.kind === "generated_video") {
|
|
137
|
+
if (value.retention.policy !== "workspace_file" || !workspaceMatch || sessionMatch) {
|
|
138
|
+
ctx.addIssue({
|
|
139
|
+
code: "custom",
|
|
140
|
+
path: ["retention"],
|
|
141
|
+
message: "generated videos require permanent workspace-file retrieval"
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (value.contentType !== "video/mp4" || value.originalBytes <= 0 || value.originalBytes > GENERATED_VIDEO_MAX_BYTES) {
|
|
145
|
+
ctx.addIssue({
|
|
146
|
+
code: "custom",
|
|
147
|
+
path: ["contentType"],
|
|
148
|
+
message: "generated video media metadata is invalid"
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (value.kind === "computer_screenshot" || value.kind === "browser_screenshot") {
|
|
153
|
+
if (value.retention.policy !== "session_screenshot" || !sessionMatch) {
|
|
154
|
+
ctx.addIssue({
|
|
155
|
+
code: "custom",
|
|
156
|
+
path: ["retention"],
|
|
157
|
+
message: "session screenshots require session-scoped expiring retrieval"
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (encoder.encode(JSON.stringify(value)).byteLength > RETAINED_OUTPUT_RECEIPT_MAX_BYTES) {
|
|
162
|
+
ctx.addIssue({
|
|
163
|
+
code: "custom",
|
|
164
|
+
message: "retained-output receipt exceeds its byte envelope"
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
})
|
|
168
|
+
);
|
|
169
|
+
var RetainedOutputEvidenceSchema = /* @__PURE__ */ defineSchema(
|
|
170
|
+
() => z.discriminatedUnion("available", [
|
|
171
|
+
RetainedOutputUnavailableEvidenceSchema,
|
|
172
|
+
RetainedArtifactReferenceSchema
|
|
173
|
+
])
|
|
174
|
+
);
|
|
175
|
+
var RetainedArtifactUnavailableSchema = /* @__PURE__ */ defineSchema(
|
|
176
|
+
() => z.object({
|
|
177
|
+
available: z.literal(false),
|
|
178
|
+
artifactId: string.regex(LOWERCASE_UUID),
|
|
179
|
+
reason: RetainedOutputUnavailableReason
|
|
180
|
+
}).strict()
|
|
181
|
+
);
|
|
182
|
+
var RetainedArtifactMetadataSchema = /* @__PURE__ */ defineSchema(
|
|
183
|
+
() => z.union([RetainedArtifactReferenceSchema, RetainedArtifactUnavailableSchema])
|
|
184
|
+
);
|
|
185
|
+
function retainedSessionScreenshotKindFromObjectKey(objectKey) {
|
|
186
|
+
const match = /^workspaces\/[0-9a-f-]+\/files\/[0-9a-f-]+\/retained\/(session-image|computer-screenshot|screenshot|browser-screenshot)\.(png|jpg|webp)$/.exec(
|
|
187
|
+
objectKey
|
|
188
|
+
);
|
|
189
|
+
if (!match) return null;
|
|
190
|
+
return match[1] === "browser-screenshot" ? "browser_screenshot" : "computer_screenshot";
|
|
191
|
+
}
|
|
192
|
+
function retainedArtifactReferenceFromFile(file, kind = "file") {
|
|
193
|
+
if (file.status !== "ready" || !file.sha256) return null;
|
|
194
|
+
const value = {
|
|
195
|
+
available: true,
|
|
196
|
+
artifactId: file.id,
|
|
197
|
+
kind,
|
|
198
|
+
contentType: canonicalRetainedContentType(file.contentType),
|
|
199
|
+
originalBytes: file.sizeBytes,
|
|
200
|
+
sha256: file.sha256,
|
|
201
|
+
retainedAt: file.updatedAt,
|
|
202
|
+
retention: {
|
|
203
|
+
policy: "workspace_file",
|
|
204
|
+
expiresAt: null
|
|
205
|
+
},
|
|
206
|
+
retrieval: {
|
|
207
|
+
method: "GET",
|
|
208
|
+
path: `/v1/workspaces/${file.workspaceId}/artifacts/${file.id}/content`,
|
|
209
|
+
acceptRanges: "bytes",
|
|
210
|
+
maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
const parsed = RetainedArtifactReferenceSchema.safeParse(value);
|
|
214
|
+
return parsed.success ? parsed.data : null;
|
|
215
|
+
}
|
|
216
|
+
function retainedScreenshotReferenceFromFile(file) {
|
|
217
|
+
if (file.status !== "ready" || !file.sha256 || file.sizeBytes <= 0) return null;
|
|
218
|
+
const value = {
|
|
219
|
+
available: true,
|
|
220
|
+
artifactId: file.id,
|
|
221
|
+
kind: file.kind ?? "computer_screenshot",
|
|
222
|
+
contentType: canonicalRetainedContentType(file.contentType),
|
|
223
|
+
originalBytes: file.sizeBytes,
|
|
224
|
+
sha256: file.sha256,
|
|
225
|
+
retainedAt: file.updatedAt,
|
|
226
|
+
dimensions: { width: file.width, height: file.height },
|
|
227
|
+
retention: {
|
|
228
|
+
policy: "session_screenshot",
|
|
229
|
+
expiresAt: file.expiresAt
|
|
230
|
+
},
|
|
231
|
+
retrieval: {
|
|
232
|
+
method: "GET",
|
|
233
|
+
path: `/v1/workspaces/${file.workspaceId}/sessions/${file.sessionId}/artifacts/${file.id}/content`,
|
|
234
|
+
acceptRanges: "bytes",
|
|
235
|
+
maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
const parsed = RetainedArtifactReferenceSchema.safeParse(value);
|
|
239
|
+
return parsed.success ? parsed.data : null;
|
|
240
|
+
}
|
|
241
|
+
function retainedGeneratedImageReferenceFromFile(file) {
|
|
242
|
+
if (file.status !== "ready" || !file.sha256 || file.sizeBytes <= 0 || file.sizeBytes > GENERATED_IMAGE_MAX_BYTES) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
const value = {
|
|
246
|
+
available: true,
|
|
247
|
+
artifactId: file.id,
|
|
248
|
+
kind: "generated_image",
|
|
249
|
+
contentType: canonicalRetainedContentType(file.contentType),
|
|
250
|
+
originalBytes: file.sizeBytes,
|
|
251
|
+
sha256: file.sha256,
|
|
252
|
+
retainedAt: file.updatedAt,
|
|
253
|
+
dimensions: { width: file.width, height: file.height },
|
|
254
|
+
retention: {
|
|
255
|
+
policy: "workspace_file",
|
|
256
|
+
expiresAt: null
|
|
257
|
+
},
|
|
258
|
+
retrieval: {
|
|
259
|
+
method: "GET",
|
|
260
|
+
path: `/v1/workspaces/${file.workspaceId}/artifacts/${file.id}/content`,
|
|
261
|
+
acceptRanges: "bytes",
|
|
262
|
+
maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
const parsed = RetainedArtifactReferenceSchema.safeParse(value);
|
|
266
|
+
return parsed.success ? parsed.data : null;
|
|
267
|
+
}
|
|
268
|
+
function retainedGeneratedVideoReferenceFromFile(file) {
|
|
269
|
+
if (file.status !== "ready" || file.contentType !== "video/mp4" || !file.sha256 || file.sizeBytes <= 0 || file.sizeBytes > GENERATED_VIDEO_MAX_BYTES) {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
const value = {
|
|
273
|
+
available: true,
|
|
274
|
+
artifactId: file.id,
|
|
275
|
+
kind: "generated_video",
|
|
276
|
+
contentType: "video/mp4",
|
|
277
|
+
originalBytes: file.sizeBytes,
|
|
278
|
+
sha256: file.sha256,
|
|
279
|
+
retainedAt: file.updatedAt,
|
|
280
|
+
dimensions: { width: file.width, height: file.height },
|
|
281
|
+
retention: {
|
|
282
|
+
policy: "workspace_file",
|
|
283
|
+
expiresAt: null
|
|
284
|
+
},
|
|
285
|
+
retrieval: {
|
|
286
|
+
method: "GET",
|
|
287
|
+
path: `/v1/workspaces/${file.workspaceId}/artifacts/${file.id}/content`,
|
|
288
|
+
acceptRanges: "bytes",
|
|
289
|
+
maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
const parsed = RetainedArtifactReferenceSchema.safeParse(value);
|
|
293
|
+
return parsed.success ? parsed.data : null;
|
|
294
|
+
}
|
|
295
|
+
function canonicalRetainedContentType(value) {
|
|
296
|
+
const mediaType = value.split(";", 1)[0]?.trim().toLowerCase() ?? "";
|
|
297
|
+
return CANONICAL_MEDIA_TYPE.test(mediaType) ? mediaType : "application/octet-stream";
|
|
298
|
+
}
|
|
299
|
+
function validateRetainedOutputEvidence(value) {
|
|
300
|
+
const parsed = RetainedOutputEvidenceSchema.safeParse(value);
|
|
301
|
+
return parsed.success ? parsed.data : null;
|
|
302
|
+
}
|
|
303
|
+
function retainedOutputUnavailable(reason = "not_retained") {
|
|
304
|
+
return { available: false, reason };
|
|
305
|
+
}
|
|
306
|
+
function resolveRetainedOutputRange(rangeHeader, totalBytes, maxPageBytes = RETAINED_OUTPUT_DEFAULT_PAGE_BYTES) {
|
|
307
|
+
assertRangeInputs(totalBytes, maxPageBytes);
|
|
308
|
+
if (rangeHeader === null || rangeHeader === void 0 || rangeHeader === "") {
|
|
309
|
+
if (totalBytes === 0) {
|
|
310
|
+
return {
|
|
311
|
+
kind: "empty",
|
|
312
|
+
length: 0,
|
|
313
|
+
totalBytes: 0,
|
|
314
|
+
status: 200,
|
|
315
|
+
contentRange: null,
|
|
316
|
+
acceptRanges: "bytes"
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
const end = Math.min(totalBytes - 1, maxPageBytes - 1);
|
|
320
|
+
const partial = end + 1 < totalBytes;
|
|
321
|
+
return resolvedRange(0, end, totalBytes, partial ? 206 : 200);
|
|
322
|
+
}
|
|
323
|
+
if (rangeHeader.length > 128 || /[^\x20-\x7e]/.test(rangeHeader)) {
|
|
324
|
+
return invalidRange("malformed", maxPageBytes);
|
|
325
|
+
}
|
|
326
|
+
if (rangeHeader.includes(",")) {
|
|
327
|
+
return invalidRange("multipart_not_supported", maxPageBytes);
|
|
328
|
+
}
|
|
329
|
+
const match = /^bytes=(\d*)-(\d*)$/.exec(rangeHeader);
|
|
330
|
+
if (!match || !match[1] && !match[2]) {
|
|
331
|
+
return invalidRange("malformed", maxPageBytes);
|
|
332
|
+
}
|
|
333
|
+
const first = parseRangeInteger(match[1]);
|
|
334
|
+
const second = parseRangeInteger(match[2]);
|
|
335
|
+
if (first === "overflow" || second === "overflow") {
|
|
336
|
+
return invalidRange("numeric_overflow", maxPageBytes);
|
|
337
|
+
}
|
|
338
|
+
if (first === null) {
|
|
339
|
+
const suffixLength = second;
|
|
340
|
+
if (suffixLength === null) return invalidRange("malformed", maxPageBytes);
|
|
341
|
+
if (suffixLength === 0) return unsatisfiableRange("zero_suffix", totalBytes);
|
|
342
|
+
if (suffixLength > maxPageBytes) return invalidRange("range_too_large", maxPageBytes);
|
|
343
|
+
if (totalBytes === 0) return unsatisfiableRange("empty_artifact", totalBytes);
|
|
344
|
+
const length = Math.min(suffixLength, totalBytes);
|
|
345
|
+
return resolvedRange(totalBytes - length, totalBytes - 1, totalBytes, 206);
|
|
346
|
+
}
|
|
347
|
+
if (totalBytes === 0) return unsatisfiableRange("empty_artifact", totalBytes);
|
|
348
|
+
if (first >= totalBytes) return unsatisfiableRange("start_out_of_bounds", totalBytes);
|
|
349
|
+
if (second === null) {
|
|
350
|
+
const end = Math.min(totalBytes - 1, first + maxPageBytes - 1);
|
|
351
|
+
return resolvedRange(first, end, totalBytes, 206);
|
|
352
|
+
}
|
|
353
|
+
if (second < first) return unsatisfiableRange("end_before_start", totalBytes);
|
|
354
|
+
if (second - first >= maxPageBytes) {
|
|
355
|
+
return invalidRange("range_too_large", maxPageBytes);
|
|
356
|
+
}
|
|
357
|
+
return resolvedRange(first, Math.min(second, totalBytes - 1), totalBytes, 206);
|
|
358
|
+
}
|
|
359
|
+
function assertRangeInputs(totalBytes, maxPageBytes) {
|
|
360
|
+
if (!Number.isSafeInteger(totalBytes) || totalBytes < 0) {
|
|
361
|
+
throw new RangeError("totalBytes must be a nonnegative safe integer");
|
|
362
|
+
}
|
|
363
|
+
if (!Number.isSafeInteger(maxPageBytes) || maxPageBytes <= 0 || maxPageBytes > RETAINED_OUTPUT_MAX_PAGE_BYTES) {
|
|
364
|
+
throw new RangeError(
|
|
365
|
+
`maxPageBytes must be an integer between 1 and ${RETAINED_OUTPUT_MAX_PAGE_BYTES}`
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
function parseRangeInteger(value) {
|
|
370
|
+
if (!value) return null;
|
|
371
|
+
if (value.length > 16) return "overflow";
|
|
372
|
+
const parsed = Number(value);
|
|
373
|
+
return Number.isSafeInteger(parsed) ? parsed : "overflow";
|
|
374
|
+
}
|
|
375
|
+
function resolvedRange(start, end, totalBytes, status) {
|
|
376
|
+
return {
|
|
377
|
+
kind: "range",
|
|
378
|
+
start,
|
|
379
|
+
end,
|
|
380
|
+
length: end - start + 1,
|
|
381
|
+
totalBytes,
|
|
382
|
+
status,
|
|
383
|
+
contentRange: status === 206 ? `bytes ${start}-${end}/${totalBytes}` : null,
|
|
384
|
+
acceptRanges: "bytes"
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
function invalidRange(reason, maxPageBytes) {
|
|
388
|
+
return { kind: "invalid", reason, maxPageBytes };
|
|
389
|
+
}
|
|
390
|
+
function unsatisfiableRange(reason, totalBytes) {
|
|
391
|
+
return {
|
|
392
|
+
kind: "unsatisfiable",
|
|
393
|
+
reason,
|
|
394
|
+
totalBytes,
|
|
395
|
+
contentRange: `bytes */${totalBytes}`
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export {
|
|
400
|
+
RETAINED_OUTPUT_MAX_PAGE_BYTES,
|
|
401
|
+
RETAINED_OUTPUT_DEFAULT_PAGE_BYTES,
|
|
402
|
+
RETAINED_OUTPUT_RECEIPT_MAX_BYTES,
|
|
403
|
+
COMPUTER_SCREENSHOT_MAX_BYTES,
|
|
404
|
+
COMPUTER_SCREENSHOT_MAX_DIMENSION,
|
|
405
|
+
COMPUTER_SCREENSHOT_MAX_PIXELS,
|
|
406
|
+
COMPUTER_SCREENSHOT_RETENTION_MS,
|
|
407
|
+
GENERATED_IMAGE_MAX_BYTES,
|
|
408
|
+
GENERATED_VIDEO_MAX_BYTES,
|
|
409
|
+
RetainedOutputKind,
|
|
410
|
+
RetainedOutputUnavailableReason,
|
|
411
|
+
RetainedArtifactReferenceSchema,
|
|
412
|
+
RetainedOutputEvidenceSchema,
|
|
413
|
+
RetainedArtifactUnavailableSchema,
|
|
414
|
+
RetainedArtifactMetadataSchema,
|
|
415
|
+
retainedSessionScreenshotKindFromObjectKey,
|
|
416
|
+
retainedArtifactReferenceFromFile,
|
|
417
|
+
retainedScreenshotReferenceFromFile,
|
|
418
|
+
retainedGeneratedImageReferenceFromFile,
|
|
419
|
+
retainedGeneratedVideoReferenceFromFile,
|
|
420
|
+
validateRetainedOutputEvidence,
|
|
421
|
+
retainedOutputUnavailable,
|
|
422
|
+
resolveRetainedOutputRange
|
|
423
|
+
};
|
|
424
|
+
//# sourceMappingURL=chunk-UH4K7GP7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/retained-output.ts"],"sourcesContent":["import * as primitives from \"./primitives\";\nimport { defineSchema } from \"./define-schema\";\nimport { z } from \"zod\";\n\n/** Hard server-side ceiling for one retained-output response body. */\nexport const RETAINED_OUTPUT_MAX_PAGE_BYTES = 1024 * 1024;\n/** Default first page when the client does not send a Range header. */\nexport const RETAINED_OUTPUT_DEFAULT_PAGE_BYTES = 256 * 1024;\n/** Receipts are timeline references, never an extensible metadata bag. */\nexport const RETAINED_OUTPUT_RECEIPT_MAX_BYTES = 2 * 1024;\n\n/** Screenshot bytes are accounted separately from the 10k-token text policy. */\nexport const COMPUTER_SCREENSHOT_MAX_BYTES = 32 * 1024 * 1024;\nexport const COMPUTER_SCREENSHOT_MAX_DIMENSION = 16_384;\nexport const COMPUTER_SCREENSHOT_MAX_PIXELS = 67_108_864;\n/** Canonical ready-object retention window: 30 days from successful settlement. */\nexport const COMPUTER_SCREENSHOT_RETENTION_MS = 30 * 24 * 60 * 60 * 1_000;\n/** Generated images are permanent workspace files, never inline history blobs. */\nexport const GENERATED_IMAGE_MAX_BYTES = 64 * 1024 * 1024;\n/** Generated videos are permanent workspace files and are always streamed. */\nexport const GENERATED_VIDEO_MAX_BYTES = 512 * 1024 * 1024;\n\nconst encoder = new TextEncoder();\nconst LOWERCASE_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\nconst LOWERCASE_SHA256 = /^[0-9a-f]{64}$/;\nconst CANONICAL_MEDIA_TYPE = /^[a-z0-9][a-z0-9!#$&^_.+-]{0,62}\\/[a-z0-9][a-z0-9!#$&^_.+-]{0,62}$/;\nconst WORKSPACE_RETRIEVAL_PATH =\n /^\\/v1\\/workspaces\\/([0-9a-f-]+)\\/artifacts\\/([0-9a-f-]+)\\/content$/;\nconst SESSION_RETRIEVAL_PATH =\n /^\\/v1\\/workspaces\\/([0-9a-f-]+)\\/sessions\\/([0-9a-f-]+)\\/artifacts\\/([0-9a-f-]+)\\/content$/;\n\nexport const RetainedOutputKind = /* @__PURE__ */ defineSchema(() =>\n z.enum([\n \"tool_result\",\n \"assistant_completion\",\n \"internal_update\",\n \"event_media\",\n \"computer_screenshot\",\n \"browser_screenshot\",\n \"generated_image\",\n \"generated_video\",\n \"file\",\n ]),\n);\nexport type RetainedOutputKind = z.infer<typeof RetainedOutputKind>;\n\nexport const RetainedOutputUnavailableReason = /* @__PURE__ */ defineSchema(() =>\n z.enum([\n \"not_retained\",\n \"pending\",\n \"failed\",\n \"expired\",\n \"deleted\",\n \"missing_storage\",\n \"storage_write_failed\",\n \"quota_exceeded\",\n \"invalid_content\",\n \"oversized\",\n \"unsupported\",\n // The file exists but is Only me for someone else. Never says whose.\n \"private\",\n ]),\n);\nexport type RetainedOutputUnavailableReason = z.infer<typeof RetainedOutputUnavailableReason>;\n\nconst RetainedOutputUnavailableEvidenceSchema = /* @__PURE__ */ defineSchema(() =>\n z\n .object({\n available: z.literal(false),\n reason: RetainedOutputUnavailableReason,\n })\n .strict(),\n);\n\nexport const RetainedArtifactReferenceSchema = /* @__PURE__ */ defineSchema(() =>\n z\n .object({\n available: z.literal(true),\n artifactId: primitives.string.regex(LOWERCASE_UUID),\n kind: RetainedOutputKind,\n contentType: z.string().max(127).regex(CANONICAL_MEDIA_TYPE),\n originalBytes: primitives.nonnegativeInteger.safe(),\n sha256: primitives.string.regex(LOWERCASE_SHA256),\n retainedAt: primitives.string.datetime({ offset: true }),\n dimensions: z\n .object({\n width: primitives.positiveInteger.max(COMPUTER_SCREENSHOT_MAX_DIMENSION),\n height: primitives.positiveInteger.max(COMPUTER_SCREENSHOT_MAX_DIMENSION),\n })\n .strict()\n .optional(),\n retention: z.union([\n z\n .object({\n policy: z.literal(\"workspace_file\"),\n expiresAt: z.null(),\n })\n .strict(),\n z\n .object({\n policy: z.literal(\"session_screenshot\"),\n expiresAt: primitives.string.datetime({ offset: true }),\n })\n .strict(),\n ]),\n retrieval: z\n .object({\n method: z.literal(\"GET\"),\n path: z.string().max(256),\n acceptRanges: z.literal(\"bytes\"),\n maxRangeBytes: primitives.positiveInteger.max(RETAINED_OUTPUT_MAX_PAGE_BYTES),\n })\n .strict(),\n })\n .strict()\n .superRefine((value, ctx) => {\n const workspaceMatch = WORKSPACE_RETRIEVAL_PATH.exec(value.retrieval.path);\n const sessionMatch = SESSION_RETRIEVAL_PATH.exec(value.retrieval.path);\n const workspaceId = workspaceMatch?.[1] ?? sessionMatch?.[1];\n const sessionId = sessionMatch?.[2];\n const artifactId = workspaceMatch?.[2] ?? sessionMatch?.[3];\n if (\n !workspaceId ||\n !LOWERCASE_UUID.test(workspaceId) ||\n (sessionId !== undefined && !LOWERCASE_UUID.test(sessionId)) ||\n artifactId !== value.artifactId\n ) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"retrieval\", \"path\"],\n message: \"retrieval path must be a workspace/session API content path for this artifact\",\n });\n }\n\n if (\n value.kind === \"computer_screenshot\" ||\n value.kind === \"browser_screenshot\" ||\n value.kind === \"generated_image\" ||\n value.kind === \"generated_video\"\n ) {\n if (!value.dimensions) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"dimensions\"],\n message: `${value.kind} receipts require exact dimensions`,\n });\n } else if (\n value.dimensions.width * value.dimensions.height >\n COMPUTER_SCREENSHOT_MAX_PIXELS\n ) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"dimensions\"],\n message: `${value.kind} dimensions exceed the pixel limit`,\n });\n }\n }\n\n if (value.kind === \"generated_image\") {\n if (value.retention.policy !== \"workspace_file\" || !workspaceMatch || sessionMatch) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"retention\"],\n message: \"generated images require permanent workspace-file retrieval\",\n });\n }\n if (\n ![\"image/png\", \"image/jpeg\", \"image/webp\"].includes(value.contentType) ||\n value.originalBytes <= 0 ||\n value.originalBytes > GENERATED_IMAGE_MAX_BYTES\n ) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"contentType\"],\n message: \"generated image media metadata is invalid\",\n });\n }\n }\n\n if (value.kind === \"generated_video\") {\n if (value.retention.policy !== \"workspace_file\" || !workspaceMatch || sessionMatch) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"retention\"],\n message: \"generated videos require permanent workspace-file retrieval\",\n });\n }\n if (\n value.contentType !== \"video/mp4\" ||\n value.originalBytes <= 0 ||\n value.originalBytes > GENERATED_VIDEO_MAX_BYTES\n ) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"contentType\"],\n message: \"generated video media metadata is invalid\",\n });\n }\n }\n\n if (value.kind === \"computer_screenshot\" || value.kind === \"browser_screenshot\") {\n if (value.retention.policy !== \"session_screenshot\" || !sessionMatch) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"retention\"],\n message: \"session screenshots require session-scoped expiring retrieval\",\n });\n }\n }\n\n if (encoder.encode(JSON.stringify(value)).byteLength > RETAINED_OUTPUT_RECEIPT_MAX_BYTES) {\n ctx.addIssue({\n code: \"custom\",\n message: \"retained-output receipt exceeds its byte envelope\",\n });\n }\n }),\n);\n\n/**\n * Canonical evidence fact carried by bounded audit/NATS/SSE/UI previews.\n *\n * The available variant is intentionally provider-neutral and closed: no bucket,\n * object key, signed URL, arbitrary metadata, or producer-controlled labels can\n * cross this boundary.\n */\nexport const RetainedOutputEvidenceSchema = /* @__PURE__ */ defineSchema(() =>\n z.discriminatedUnion(\"available\", [\n RetainedOutputUnavailableEvidenceSchema,\n RetainedArtifactReferenceSchema,\n ]),\n);\nexport type RetainedOutputEvidence = z.infer<typeof RetainedOutputEvidenceSchema>;\nexport type RetainedArtifactReference = z.infer<typeof RetainedArtifactReferenceSchema>;\n/** @deprecated use RetainedArtifactReference. */\nexport type RetainedOutputAvailableEvidence = RetainedArtifactReference;\n\nexport const RetainedArtifactUnavailableSchema = /* @__PURE__ */ defineSchema(() =>\n z\n .object({\n available: z.literal(false),\n artifactId: primitives.string.regex(LOWERCASE_UUID),\n reason: RetainedOutputUnavailableReason,\n })\n .strict(),\n);\nexport type RetainedArtifactUnavailable = z.infer<typeof RetainedArtifactUnavailableSchema>;\n\n/** Authenticated metadata result for one opaque workspace file identity. */\nexport const RetainedArtifactMetadataSchema = /* @__PURE__ */ defineSchema(() =>\n z.union([RetainedArtifactReferenceSchema, RetainedArtifactUnavailableSchema]),\n);\nexport type RetainedArtifactMetadata = z.infer<typeof RetainedArtifactMetadataSchema>;\n\nexport type RetainedArtifactFileInput = {\n id: string;\n workspaceId: string;\n status: string;\n contentType: string;\n sizeBytes: number;\n sha256: string | null;\n updatedAt: string;\n};\n\nexport type RetainedScreenshotArtifactInput = RetainedArtifactFileInput & {\n sessionId: string;\n width: number;\n height: number;\n expiresAt: string;\n kind?: \"computer_screenshot\" | \"browser_screenshot\";\n};\n\nexport type RetainedSessionScreenshotKind = \"computer_screenshot\" | \"browser_screenshot\";\n\n/** The persisted, server-authored storage key distinguishes browser captures from legacy computer captures. */\nexport function retainedSessionScreenshotKindFromObjectKey(\n objectKey: string,\n): RetainedSessionScreenshotKind | null {\n const match =\n /^workspaces\\/[0-9a-f-]+\\/files\\/[0-9a-f-]+\\/retained\\/(session-image|computer-screenshot|screenshot|browser-screenshot)\\.(png|jpg|webp)$/.exec(\n objectKey,\n );\n if (!match) return null;\n return match[1] === \"browser-screenshot\" ? \"browser_screenshot\" : \"computer_screenshot\";\n}\n\nexport type RetainedGeneratedImageArtifactInput = RetainedArtifactFileInput & {\n width: number;\n height: number;\n};\n\nexport type RetainedGeneratedVideoArtifactInput = RetainedArtifactFileInput & {\n width: number;\n height: number;\n};\n\n/**\n * Convert a ready, integrity-addressed workspace file into the only available\n * retained-output receipt shape. Invalid, pending, or checksum-less files fail\n * closed instead of implying that full evidence is retrievable.\n */\nexport function retainedArtifactReferenceFromFile(\n file: RetainedArtifactFileInput,\n kind: RetainedOutputKind = \"file\",\n): RetainedArtifactReference | null {\n if (file.status !== \"ready\" || !file.sha256) return null;\n const value = {\n available: true as const,\n artifactId: file.id,\n kind,\n contentType: canonicalRetainedContentType(file.contentType),\n originalBytes: file.sizeBytes,\n sha256: file.sha256,\n retainedAt: file.updatedAt,\n retention: {\n policy: \"workspace_file\" as const,\n expiresAt: null,\n },\n retrieval: {\n method: \"GET\" as const,\n path: `/v1/workspaces/${file.workspaceId}/artifacts/${file.id}/content`,\n acceptRanges: \"bytes\" as const,\n maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES,\n },\n };\n const parsed = RetainedArtifactReferenceSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\n/** Build the closed, session-scoped receipt for one ready screenshot file. */\nexport function retainedScreenshotReferenceFromFile(\n file: RetainedScreenshotArtifactInput,\n): RetainedArtifactReference | null {\n if (file.status !== \"ready\" || !file.sha256 || file.sizeBytes <= 0) return null;\n const value = {\n available: true as const,\n artifactId: file.id,\n kind: file.kind ?? \"computer_screenshot\",\n contentType: canonicalRetainedContentType(file.contentType),\n originalBytes: file.sizeBytes,\n sha256: file.sha256,\n retainedAt: file.updatedAt,\n dimensions: { width: file.width, height: file.height },\n retention: {\n policy: \"session_screenshot\" as const,\n expiresAt: file.expiresAt,\n },\n retrieval: {\n method: \"GET\" as const,\n path: `/v1/workspaces/${file.workspaceId}/sessions/${file.sessionId}/artifacts/${file.id}/content`,\n acceptRanges: \"bytes\" as const,\n maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES,\n },\n };\n const parsed = RetainedArtifactReferenceSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\n/** Build the permanent workspace receipt for one validated generated image. */\nexport function retainedGeneratedImageReferenceFromFile(\n file: RetainedGeneratedImageArtifactInput,\n): RetainedArtifactReference | null {\n if (\n file.status !== \"ready\" ||\n !file.sha256 ||\n file.sizeBytes <= 0 ||\n file.sizeBytes > GENERATED_IMAGE_MAX_BYTES\n ) {\n return null;\n }\n const value = {\n available: true as const,\n artifactId: file.id,\n kind: \"generated_image\" as const,\n contentType: canonicalRetainedContentType(file.contentType),\n originalBytes: file.sizeBytes,\n sha256: file.sha256,\n retainedAt: file.updatedAt,\n dimensions: { width: file.width, height: file.height },\n retention: {\n policy: \"workspace_file\" as const,\n expiresAt: null,\n },\n retrieval: {\n method: \"GET\" as const,\n path: `/v1/workspaces/${file.workspaceId}/artifacts/${file.id}/content`,\n acceptRanges: \"bytes\" as const,\n maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES,\n },\n };\n const parsed = RetainedArtifactReferenceSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\n/** Build the permanent workspace receipt for one validated generated video. */\nexport function retainedGeneratedVideoReferenceFromFile(\n file: RetainedGeneratedVideoArtifactInput,\n): RetainedArtifactReference | null {\n if (\n file.status !== \"ready\" ||\n file.contentType !== \"video/mp4\" ||\n !file.sha256 ||\n file.sizeBytes <= 0 ||\n file.sizeBytes > GENERATED_VIDEO_MAX_BYTES\n ) {\n return null;\n }\n const value = {\n available: true as const,\n artifactId: file.id,\n kind: \"generated_video\" as const,\n contentType: \"video/mp4\" as const,\n originalBytes: file.sizeBytes,\n sha256: file.sha256,\n retainedAt: file.updatedAt,\n dimensions: { width: file.width, height: file.height },\n retention: {\n policy: \"workspace_file\" as const,\n expiresAt: null,\n },\n retrieval: {\n method: \"GET\" as const,\n path: `/v1/workspaces/${file.workspaceId}/artifacts/${file.id}/content`,\n acceptRanges: \"bytes\" as const,\n maxRangeBytes: RETAINED_OUTPUT_MAX_PAGE_BYTES,\n },\n };\n const parsed = RetainedArtifactReferenceSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\nfunction canonicalRetainedContentType(value: string): string {\n const mediaType = value.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n return CANONICAL_MEDIA_TYPE.test(mediaType) ? mediaType : \"application/octet-stream\";\n}\n\n/** Parse and clone a trusted server receipt; invalid/untrusted data fails closed. */\nexport function validateRetainedOutputEvidence(value: unknown): RetainedOutputEvidence | null {\n const parsed = RetainedOutputEvidenceSchema.safeParse(value);\n return parsed.success ? parsed.data : null;\n}\n\nexport function retainedOutputUnavailable(\n reason: RetainedOutputUnavailableReason = \"not_retained\",\n): RetainedOutputEvidence {\n return { available: false, reason };\n}\n\nexport type RetainedOutputResolvedRange = {\n kind: \"range\";\n start: number;\n end: number;\n length: number;\n totalBytes: number;\n status: 200 | 206;\n contentRange: string | null;\n acceptRanges: \"bytes\";\n};\n\nexport type RetainedOutputRangeResolution =\n | RetainedOutputResolvedRange\n | {\n kind: \"empty\";\n length: 0;\n totalBytes: 0;\n status: 200;\n contentRange: null;\n acceptRanges: \"bytes\";\n }\n | {\n kind: \"invalid\";\n reason: \"malformed\" | \"multipart_not_supported\" | \"numeric_overflow\" | \"range_too_large\";\n maxPageBytes: number;\n }\n | {\n kind: \"unsatisfiable\";\n reason: \"empty_artifact\" | \"start_out_of_bounds\" | \"end_before_start\" | \"zero_suffix\";\n totalBytes: number;\n contentRange: string;\n };\n\n/**\n * Resolve one RFC-style bytes range without ever licensing a response larger\n * than `maxPageBytes`. Multipart ranges and oversized explicit/suffix requests\n * fail closed. An omitted or open-ended range becomes one resumable bounded page.\n */\nexport function resolveRetainedOutputRange(\n rangeHeader: string | null | undefined,\n totalBytes: number,\n maxPageBytes = RETAINED_OUTPUT_DEFAULT_PAGE_BYTES,\n): RetainedOutputRangeResolution {\n assertRangeInputs(totalBytes, maxPageBytes);\n\n if (rangeHeader === null || rangeHeader === undefined || rangeHeader === \"\") {\n if (totalBytes === 0) {\n return {\n kind: \"empty\",\n length: 0,\n totalBytes: 0,\n status: 200,\n contentRange: null,\n acceptRanges: \"bytes\",\n };\n }\n const end = Math.min(totalBytes - 1, maxPageBytes - 1);\n const partial = end + 1 < totalBytes;\n return resolvedRange(0, end, totalBytes, partial ? 206 : 200);\n }\n\n if (rangeHeader.length > 128 || /[^\\x20-\\x7e]/.test(rangeHeader)) {\n return invalidRange(\"malformed\", maxPageBytes);\n }\n if (rangeHeader.includes(\",\")) {\n return invalidRange(\"multipart_not_supported\", maxPageBytes);\n }\n const match = /^bytes=(\\d*)-(\\d*)$/.exec(rangeHeader);\n if (!match || (!match[1] && !match[2])) {\n return invalidRange(\"malformed\", maxPageBytes);\n }\n\n const first = parseRangeInteger(match[1]);\n const second = parseRangeInteger(match[2]);\n if (first === \"overflow\" || second === \"overflow\") {\n return invalidRange(\"numeric_overflow\", maxPageBytes);\n }\n\n if (first === null) {\n const suffixLength = second;\n if (suffixLength === null) return invalidRange(\"malformed\", maxPageBytes);\n if (suffixLength === 0) return unsatisfiableRange(\"zero_suffix\", totalBytes);\n if (suffixLength > maxPageBytes) return invalidRange(\"range_too_large\", maxPageBytes);\n if (totalBytes === 0) return unsatisfiableRange(\"empty_artifact\", totalBytes);\n const length = Math.min(suffixLength, totalBytes);\n return resolvedRange(totalBytes - length, totalBytes - 1, totalBytes, 206);\n }\n\n if (totalBytes === 0) return unsatisfiableRange(\"empty_artifact\", totalBytes);\n if (first >= totalBytes) return unsatisfiableRange(\"start_out_of_bounds\", totalBytes);\n\n if (second === null) {\n const end = Math.min(totalBytes - 1, first + maxPageBytes - 1);\n return resolvedRange(first, end, totalBytes, 206);\n }\n if (second < first) return unsatisfiableRange(\"end_before_start\", totalBytes);\n if (second - first >= maxPageBytes) {\n return invalidRange(\"range_too_large\", maxPageBytes);\n }\n return resolvedRange(first, Math.min(second, totalBytes - 1), totalBytes, 206);\n}\n\nfunction assertRangeInputs(totalBytes: number, maxPageBytes: number): void {\n if (!Number.isSafeInteger(totalBytes) || totalBytes < 0) {\n throw new RangeError(\"totalBytes must be a nonnegative safe integer\");\n }\n if (\n !Number.isSafeInteger(maxPageBytes) ||\n maxPageBytes <= 0 ||\n maxPageBytes > RETAINED_OUTPUT_MAX_PAGE_BYTES\n ) {\n throw new RangeError(\n `maxPageBytes must be an integer between 1 and ${RETAINED_OUTPUT_MAX_PAGE_BYTES}`,\n );\n }\n}\n\nfunction parseRangeInteger(value: string | undefined): number | null | \"overflow\" {\n if (!value) return null;\n // Avoid both precision loss and work proportional to an adversarial digit run.\n if (value.length > 16) return \"overflow\";\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) ? parsed : \"overflow\";\n}\n\nfunction resolvedRange(\n start: number,\n end: number,\n totalBytes: number,\n status: 200 | 206,\n): RetainedOutputResolvedRange {\n return {\n kind: \"range\",\n start,\n end,\n length: end - start + 1,\n totalBytes,\n status,\n contentRange: status === 206 ? `bytes ${start}-${end}/${totalBytes}` : null,\n acceptRanges: \"bytes\",\n };\n}\n\nfunction invalidRange(\n reason: Extract<RetainedOutputRangeResolution, { kind: \"invalid\" }>[\"reason\"],\n maxPageBytes: number,\n): RetainedOutputRangeResolution {\n return { kind: \"invalid\", reason, maxPageBytes };\n}\n\nfunction unsatisfiableRange(\n reason: Extract<RetainedOutputRangeResolution, { kind: \"unsatisfiable\" }>[\"reason\"],\n totalBytes: number,\n): RetainedOutputRangeResolution {\n return {\n kind: \"unsatisfiable\",\n reason,\n totalBytes,\n contentRange: `bytes */${totalBytes}`,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// src/session-history.ts
|
|
2
|
+
var SESSION_EVENT_CONTENT_STEP_TYPES = [
|
|
3
|
+
"agent.toolCall.created",
|
|
4
|
+
"agent.toolCall.output",
|
|
5
|
+
"agent.reasoning.delta",
|
|
6
|
+
"sandbox.command.output.delta",
|
|
7
|
+
"terminal.pty.output.delta"
|
|
8
|
+
];
|
|
9
|
+
var SESSION_EVENT_BOOKKEEPING_STEP_TYPES = [
|
|
10
|
+
"agent.model.request",
|
|
11
|
+
"agent.model.usage"
|
|
12
|
+
];
|
|
13
|
+
var SESSION_EVENT_STEP_TYPES = [
|
|
14
|
+
...SESSION_EVENT_CONTENT_STEP_TYPES,
|
|
15
|
+
...SESSION_EVENT_BOOKKEEPING_STEP_TYPES
|
|
16
|
+
];
|
|
17
|
+
var SESSION_EVENT_CONVERSATION_FILTER_VERSION = 2;
|
|
18
|
+
var SESSION_EVENT_CONVERSATION_FILTER_HEADER = "X-OpenGeni-Conversation-Filter";
|
|
19
|
+
var SESSION_EVENT_COMPAT_EXCLUDED_STEP_TYPES = [
|
|
20
|
+
"agent.toolCall.output",
|
|
21
|
+
"agent.reasoning.delta",
|
|
22
|
+
"sandbox.command.output.delta",
|
|
23
|
+
"terminal.pty.output.delta"
|
|
24
|
+
];
|
|
25
|
+
function isSessionModelResponsePhase(phase) {
|
|
26
|
+
return phase === "first_byte" || phase === "first_event";
|
|
27
|
+
}
|
|
28
|
+
var SESSION_EVENT_PRESENTED_TOOL_LEAVES = [
|
|
29
|
+
"generate_image",
|
|
30
|
+
"image_generation_call",
|
|
31
|
+
"sandbox_file_publish",
|
|
32
|
+
"skill_save",
|
|
33
|
+
"skill_remove",
|
|
34
|
+
"skill_install",
|
|
35
|
+
"skill_publish",
|
|
36
|
+
"instruction_policy_save",
|
|
37
|
+
"knowledge_save",
|
|
38
|
+
"knowledge_retain_file",
|
|
39
|
+
"knowledge_retain_message",
|
|
40
|
+
"knowledge_archive",
|
|
41
|
+
"task_note_promote_knowledge",
|
|
42
|
+
"remember_confirm",
|
|
43
|
+
"session_create",
|
|
44
|
+
"session_send_message"
|
|
45
|
+
];
|
|
46
|
+
function isPresentedSessionToolName(name) {
|
|
47
|
+
if (typeof name !== "string" || name.length === 0) return false;
|
|
48
|
+
return SESSION_EVENT_PRESENTED_TOOL_LEAVES.some(
|
|
49
|
+
(leaf) => name === leaf || name.endsWith(`__${leaf}`)
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
var SESSION_EVENT_APP_ACTION_CALL_LEAF = "admin_action_call";
|
|
53
|
+
var SESSION_EVENT_PRESENTED_APP_ACTIONS = {
|
|
54
|
+
createBillingCheckout: { route: "POST /v1/billing/checkout", page: "credits" },
|
|
55
|
+
createSubscriptionCheckout: {
|
|
56
|
+
route: "POST /v1/billing/subscription/checkout",
|
|
57
|
+
page: "subscription"
|
|
58
|
+
},
|
|
59
|
+
createBillingPortalSession: { route: "POST /v1/billing/portal", page: "portal" },
|
|
60
|
+
createSubscriptionPortalSession: {
|
|
61
|
+
route: "POST /v1/billing/subscription/portal",
|
|
62
|
+
page: "portal"
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
var SESSION_EVENT_APP_ACTION_ID_SPACE = " \n\v\f\r\xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF";
|
|
66
|
+
var SESSION_EVENT_PRESENTED_APP_ACTION_NAMES = Object.entries(
|
|
67
|
+
SESSION_EVENT_PRESENTED_APP_ACTIONS
|
|
68
|
+
).flatMap(([id, { route }]) => [id, route]);
|
|
69
|
+
var PRESENTED_APP_ACTION_BY_NAME = new Map(
|
|
70
|
+
Object.entries(SESSION_EVENT_PRESENTED_APP_ACTIONS).flatMap(([id, { route }]) => [
|
|
71
|
+
[id, id],
|
|
72
|
+
[route, id]
|
|
73
|
+
])
|
|
74
|
+
);
|
|
75
|
+
function trimActionId(value) {
|
|
76
|
+
let start = 0;
|
|
77
|
+
let end = value.length;
|
|
78
|
+
while (start < end && SESSION_EVENT_APP_ACTION_ID_SPACE.includes(value[start])) start += 1;
|
|
79
|
+
while (end > start && SESSION_EVENT_APP_ACTION_ID_SPACE.includes(value[end - 1])) end -= 1;
|
|
80
|
+
return value.slice(start, end);
|
|
81
|
+
}
|
|
82
|
+
function presentedAppActionId(id) {
|
|
83
|
+
return typeof id === "string" ? PRESENTED_APP_ACTION_BY_NAME.get(trimActionId(id)) : void 0;
|
|
84
|
+
}
|
|
85
|
+
function isPresentedSessionToolCall(call) {
|
|
86
|
+
if (!call || typeof call !== "object") return false;
|
|
87
|
+
const { name, arguments: args } = call;
|
|
88
|
+
if (isPresentedSessionToolName(name)) return true;
|
|
89
|
+
const leaf = SESSION_EVENT_APP_ACTION_CALL_LEAF;
|
|
90
|
+
if (typeof name !== "string" || name !== leaf && !name.endsWith(`__${leaf}`)) return false;
|
|
91
|
+
let parsed = args;
|
|
92
|
+
if (typeof args === "string") {
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(args);
|
|
95
|
+
} catch {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return false;
|
|
100
|
+
return presentedAppActionId(parsed.id) !== void 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
SESSION_EVENT_CONTENT_STEP_TYPES,
|
|
105
|
+
SESSION_EVENT_BOOKKEEPING_STEP_TYPES,
|
|
106
|
+
SESSION_EVENT_STEP_TYPES,
|
|
107
|
+
SESSION_EVENT_CONVERSATION_FILTER_VERSION,
|
|
108
|
+
SESSION_EVENT_CONVERSATION_FILTER_HEADER,
|
|
109
|
+
SESSION_EVENT_COMPAT_EXCLUDED_STEP_TYPES,
|
|
110
|
+
isSessionModelResponsePhase,
|
|
111
|
+
SESSION_EVENT_PRESENTED_TOOL_LEAVES,
|
|
112
|
+
isPresentedSessionToolName,
|
|
113
|
+
SESSION_EVENT_APP_ACTION_CALL_LEAF,
|
|
114
|
+
SESSION_EVENT_PRESENTED_APP_ACTIONS,
|
|
115
|
+
SESSION_EVENT_APP_ACTION_ID_SPACE,
|
|
116
|
+
SESSION_EVENT_PRESENTED_APP_ACTION_NAMES,
|
|
117
|
+
presentedAppActionId,
|
|
118
|
+
isPresentedSessionToolCall
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=chunk-UIZWGPHV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/session-history.ts"],"sourcesContent":["/**\n * Conversation-first session history: which durable events are the steps of a\n * turn, and which tool results stay visible without opening those steps.\n * Dependency-free so browser packages can import it without the schema bundle.\n */\n/**\n * The bulk of a long agent turn: tool calls, their outputs and streamed\n * reasoning or command output. A turn whose window skips any of these has\n * steps a reader can open.\n */\nexport const SESSION_EVENT_CONTENT_STEP_TYPES = [\n \"agent.toolCall.created\",\n \"agent.toolCall.output\",\n \"agent.reasoning.delta\",\n \"sandbox.command.output.delta\",\n \"terminal.pty.output.delta\",\n] as const;\n\n/**\n * Turn bookkeeping that renders nothing in the conversation: a turn writes a\n * few `agent.model.request` rows and an `agent.model.usage` row per model\n * call. Only a turn's request rows up to its first model response draw\n * anything (the \"first model response\" startup phase); a conversation-filter\n * server keeps those, and every bookkeeping row of a turn without other\n * steps, so it never looks like it has steps to open.\n */\nexport const SESSION_EVENT_BOOKKEEPING_STEP_TYPES = [\n \"agent.model.request\",\n \"agent.model.usage\",\n] as const;\n\n/**\n * Everything conversation-first history reads exclude and load per turn, only\n * when a reader asks for that turn's steps.\n */\nexport const SESSION_EVENT_STEP_TYPES = [\n ...SESSION_EVENT_CONTENT_STEP_TYPES,\n ...SESSION_EVENT_BOOKKEEPING_STEP_TYPES,\n] as const;\n\n/**\n * The conversation-filter behavior a server applies to a read that sends\n * `presentedToolCalls=include`, announced in the `X-OpenGeni-Conversation-Filter`\n * response header. Version 2 keeps presented tool calls and the bookkeeping\n * rows described by {@link SESSION_EVENT_BOOKKEEPING_STEP_TYPES}; excluded\n * turnless output (PTY and command output) stays out, for the sandbox dock to\n * read itself. A server without the header may ignore `presentedToolCalls`\n * entirely.\n */\nexport const SESSION_EVENT_CONVERSATION_FILTER_VERSION = 2;\nexport const SESSION_EVENT_CONVERSATION_FILTER_HEADER = \"X-OpenGeni-Conversation-Filter\";\n\n/**\n * What a reader excludes from a conversation read when the server has not\n * announced {@link SESSION_EVENT_CONVERSATION_FILTER_VERSION}: tool calls stay\n * in (an older server would otherwise drop presented calls with them) and the\n * reader drops the ones that are not presented.\n */\nexport const SESSION_EVENT_COMPAT_EXCLUDED_STEP_TYPES = [\n \"agent.toolCall.output\",\n \"agent.reasoning.delta\",\n \"sandbox.command.output.delta\",\n \"terminal.pty.output.delta\",\n] as const;\n\n/**\n * Whether an `agent.model.request` phase is the model's first response. A\n * turn's request rows after its first response no longer change what the\n * conversation draws.\n */\nexport function isSessionModelResponsePhase(phase: unknown): boolean {\n return phase === \"first_byte\" || phase === \"first_event\";\n}\n\n/**\n * Tools whose result is primary output a reader sees without opening the\n * turn's steps: presented images and published files, Skill changes that may\n * need review, learning writes whose refusal is told outside the folded work\n * row, and worker spawns or messages that a turn's wait counts. Matched on the\n * tool name's leaf (`x__leaf` or `leaf`).\n */\nexport const SESSION_EVENT_PRESENTED_TOOL_LEAVES = [\n \"generate_image\",\n \"image_generation_call\",\n \"sandbox_file_publish\",\n \"skill_save\",\n \"skill_remove\",\n \"skill_install\",\n \"skill_publish\",\n \"instruction_policy_save\",\n \"knowledge_save\",\n \"knowledge_retain_file\",\n \"knowledge_retain_message\",\n \"knowledge_archive\",\n \"task_note_promote_knowledge\",\n \"remember_confirm\",\n \"session_create\",\n \"session_send_message\",\n] as const;\n\n/** Whether a tool name is one of {@link SESSION_EVENT_PRESENTED_TOOL_LEAVES}. */\nexport function isPresentedSessionToolName(name: unknown): boolean {\n if (typeof name !== \"string\" || name.length === 0) return false;\n return SESSION_EVENT_PRESENTED_TOOL_LEAVES.some(\n (leaf) => name === leaf || name.endsWith(`__${leaf}`),\n );\n}\n\n/** The tool leaf a session runs the app's own actions through. */\nexport const SESSION_EVENT_APP_ACTION_CALL_LEAF = \"admin_action_call\";\n\n/** The page an app action opens: buying credits, starting a subscription, or the billing portal. */\nexport type PresentedAppActionPage = \"credits\" | \"subscription\" | \"portal\";\n\n/**\n * App actions whose call is primary output too: each opens a payment page,\n * and the chat shows it as a button that later confirms the payment, which a\n * person returning to the chat (often in a reloaded tab) needs to see.\n * Keyed by action id, with the \"METHOD /path\" a call may name it by instead\n * (as `findAppAction` accepts) and the page it opens.\n */\nexport const SESSION_EVENT_PRESENTED_APP_ACTIONS = {\n createBillingCheckout: { route: \"POST /v1/billing/checkout\", page: \"credits\" },\n createSubscriptionCheckout: {\n route: \"POST /v1/billing/subscription/checkout\",\n page: \"subscription\",\n },\n createBillingPortalSession: { route: \"POST /v1/billing/portal\", page: \"portal\" },\n createSubscriptionPortalSession: {\n route: \"POST /v1/billing/subscription/portal\",\n page: \"portal\",\n },\n} as const satisfies Record<string, { route: string; page: PresentedAppActionPage }>;\n\nexport type PresentedAppActionId = keyof typeof SESSION_EVENT_PRESENTED_APP_ACTIONS;\n\n/**\n * The whitespace a call's action id is trimmed of before it's matched: exactly\n * what `String.prototype.trim` removes, as the action runner trims the id\n * (`findAppAction`), spelled out so the history query (Postgres `btrim`) and\n * every client agree.\n */\nexport const SESSION_EVENT_APP_ACTION_ID_SPACE =\n \" \\t\\n\\v\\f\\r\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff\";\n\n/** Every name that calls one of {@link SESSION_EVENT_PRESENTED_APP_ACTIONS}: each id and its \"METHOD /path\". */\nexport const SESSION_EVENT_PRESENTED_APP_ACTION_NAMES: readonly string[] = Object.entries(\n SESSION_EVENT_PRESENTED_APP_ACTIONS,\n).flatMap(([id, { route }]) => [id, route]);\n\nconst PRESENTED_APP_ACTION_BY_NAME: ReadonlyMap<string, PresentedAppActionId> = new Map(\n Object.entries(SESSION_EVENT_PRESENTED_APP_ACTIONS).flatMap(([id, { route }]) => [\n [id, id as PresentedAppActionId],\n [route, id as PresentedAppActionId],\n ]),\n);\n\nfunction trimActionId(value: string): string {\n let start = 0;\n let end = value.length;\n while (start < end && SESSION_EVENT_APP_ACTION_ID_SPACE.includes(value[start]!)) start += 1;\n while (end > start && SESSION_EVENT_APP_ACTION_ID_SPACE.includes(value[end - 1]!)) end -= 1;\n return value.slice(start, end);\n}\n\n/**\n * Which of {@link SESSION_EVENT_PRESENTED_APP_ACTIONS} an app action call's\n * `id` names, by its id or its \"METHOD /path\"; undefined for anything else.\n */\nexport function presentedAppActionId(id: unknown): PresentedAppActionId | undefined {\n return typeof id === \"string\" ? PRESENTED_APP_ACTION_BY_NAME.get(trimActionId(id)) : undefined;\n}\n\n/**\n * Whether a tool call's result is primary output: a presented tool\n * ({@link isPresentedSessionToolName}), or an app action call that runs one of\n * {@link SESSION_EVENT_PRESENTED_APP_ACTIONS} (its arguments' top-level `id`,\n * see {@link presentedAppActionId}). Takes the `agent.toolCall.created`\n * payload (its `name` and `arguments`, an object or JSON text).\n */\nexport function isPresentedSessionToolCall(call: unknown): boolean {\n if (!call || typeof call !== \"object\") return false;\n const { name, arguments: args } = call as { name?: unknown; arguments?: unknown };\n if (isPresentedSessionToolName(name)) return true;\n const leaf = SESSION_EVENT_APP_ACTION_CALL_LEAF;\n if (typeof name !== \"string\" || (name !== leaf && !name.endsWith(`__${leaf}`))) return false;\n let parsed: unknown = args;\n if (typeof args === \"string\") {\n try {\n parsed = JSON.parse(args);\n } catch {\n return false;\n }\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n return presentedAppActionId((parsed as { id?: unknown }).id) !== undefined;\n}\n"],"mappings":";AAUO,IAAM,mCAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,IAAM,uCAAuC;AAAA,EAClD;AAAA,EACA;AACF;AAMO,IAAM,2BAA2B;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AACL;AAWO,IAAM,4CAA4C;AAClD,IAAM,2CAA2C;AAQjD,IAAM,2CAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,4BAA4B,OAAyB;AACnE,SAAO,UAAU,gBAAgB,UAAU;AAC7C;AASO,IAAM,sCAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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,2BAA2B,MAAwB;AACjE,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,EAAG,QAAO;AAC1D,SAAO,oCAAoC;AAAA,IACzC,CAAC,SAAS,SAAS,QAAQ,KAAK,SAAS,KAAK,IAAI,EAAE;AAAA,EACtD;AACF;AAGO,IAAM,qCAAqC;AAY3C,IAAM,sCAAsC;AAAA,EACjD,uBAAuB,EAAE,OAAO,6BAA6B,MAAM,UAAU;AAAA,EAC7E,4BAA4B;AAAA,IAC1B,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,4BAA4B,EAAE,OAAO,2BAA2B,MAAM,SAAS;AAAA,EAC/E,iCAAiC;AAAA,IAC/B,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;AAUO,IAAM,oCACX;AAGK,IAAM,2CAA8D,OAAO;AAAA,EAChF;AACF,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;AAE1C,IAAM,+BAA0E,IAAI;AAAA,EAClF,OAAO,QAAQ,mCAAmC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM;AAAA,IAC/E,CAAC,IAAI,EAA0B;AAAA,IAC/B,CAAC,OAAO,EAA0B;AAAA,EACpC,CAAC;AACH;AAEA,SAAS,aAAa,OAAuB;AAC3C,MAAI,QAAQ;AACZ,MAAI,MAAM,MAAM;AAChB,SAAO,QAAQ,OAAO,kCAAkC,SAAS,MAAM,KAAK,CAAE,EAAG,UAAS;AAC1F,SAAO,MAAM,SAAS,kCAAkC,SAAS,MAAM,MAAM,CAAC,CAAE,EAAG,QAAO;AAC1F,SAAO,MAAM,MAAM,OAAO,GAAG;AAC/B;AAMO,SAAS,qBAAqB,IAA+C;AAClF,SAAO,OAAO,OAAO,WAAW,6BAA6B,IAAI,aAAa,EAAE,CAAC,IAAI;AACvF;AASO,SAAS,2BAA2B,MAAwB;AACjE,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,EAAE,MAAM,WAAW,KAAK,IAAI;AAClC,MAAI,2BAA2B,IAAI,EAAG,QAAO;AAC7C,QAAM,OAAO;AACb,MAAI,OAAO,SAAS,YAAa,SAAS,QAAQ,CAAC,KAAK,SAAS,KAAK,IAAI,EAAE,EAAI,QAAO;AACvF,MAAI,SAAkB;AACtB,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO;AAC3E,SAAO,qBAAsB,OAA4B,EAAE,MAAM;AACnE;","names":[]}
|