@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,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one secret reference grammar (design §10B.2, normative).
|
|
3
|
+
*
|
|
4
|
+
* ```
|
|
5
|
+
* reference = "{{" kind ":" body "}}" ; no whitespace after "{{" or before "}}"
|
|
6
|
+
* kind = "secret" | "secretfile"
|
|
7
|
+
* body = id-form | path-form
|
|
8
|
+
* id-form = "id:" uuid [ "/" segment ] [ "/otp" ] [ "#previous" ]
|
|
9
|
+
* path-form = segment *2( "/" segment ) [ "/otp" ] [ "#previous" ]
|
|
10
|
+
* segment = 1*120( any char except "/" "{" "}" "#" "\" and control chars ),
|
|
11
|
+
* no leading/trailing whitespace
|
|
12
|
+
* escape = "\" reference ; the reference text, literally
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Text that starts with `{{secret:` or `{{secretfile:` and does not parse is
|
|
16
|
+
* an `invalid` token: callers fail it with `invalid_reference` and never pass
|
|
17
|
+
* it through. References are at most 300 characters long.
|
|
18
|
+
*
|
|
19
|
+
* Pure and isomorphic: no I/O, no runtime imports from `./index`.
|
|
20
|
+
*/
|
|
21
|
+
import { isValidSecretName, VAULT_LIMITS } from "./vaults";
|
|
22
|
+
|
|
23
|
+
export type SecretReferenceKind = "secret" | "secretfile";
|
|
24
|
+
export type SecretReferenceTarget =
|
|
25
|
+
| { form: "id"; itemId: string; field: string | null }
|
|
26
|
+
| { form: "path"; segments: [string] | [string, string] | [string, string, string] };
|
|
27
|
+
export interface SecretReference {
|
|
28
|
+
kind: SecretReferenceKind;
|
|
29
|
+
raw: string;
|
|
30
|
+
/** Offsets in the source text; `end` is exclusive. */
|
|
31
|
+
start: number;
|
|
32
|
+
end: number;
|
|
33
|
+
target: SecretReferenceTarget;
|
|
34
|
+
otp: boolean;
|
|
35
|
+
previous: boolean;
|
|
36
|
+
}
|
|
37
|
+
export type SecretTextToken =
|
|
38
|
+
/** Escapes already unescaped. */
|
|
39
|
+
| { type: "text"; value: string }
|
|
40
|
+
| { type: "reference"; reference: SecretReference }
|
|
41
|
+
| { type: "invalid"; raw: string; start: number; end: number; reason: string };
|
|
42
|
+
|
|
43
|
+
/** Fast-path needle; also matches `{{secretfile:`. */
|
|
44
|
+
export const SECRET_REFERENCE_MARKER = "{{secret";
|
|
45
|
+
|
|
46
|
+
export class SecretReferenceSyntaxError extends Error {
|
|
47
|
+
readonly reason: string;
|
|
48
|
+
constructor(reason: string, message?: string) {
|
|
49
|
+
super(message ?? `invalid secret reference: ${reason}`);
|
|
50
|
+
this.name = "SecretReferenceSyntaxError";
|
|
51
|
+
this.reason = reason;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const PREFIXES: ReadonlyArray<{ prefix: string; kind: SecretReferenceKind }> = [
|
|
56
|
+
// Longest first: "{{secretfile:" must win over "{{secret".
|
|
57
|
+
{ prefix: "{{secretfile:", kind: "secretfile" },
|
|
58
|
+
{ prefix: "{{secret:", kind: "secret" },
|
|
59
|
+
];
|
|
60
|
+
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
61
|
+
const PREVIOUS_SUFFIX = "#previous";
|
|
62
|
+
const ID_PREFIX = "id:";
|
|
63
|
+
|
|
64
|
+
export function containsSecretReference(text: string): boolean {
|
|
65
|
+
return text.includes(SECRET_REFERENCE_MARKER);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function prefixAt(
|
|
69
|
+
text: string,
|
|
70
|
+
index: number,
|
|
71
|
+
): { prefix: string; kind: SecretReferenceKind } | null {
|
|
72
|
+
for (const candidate of PREFIXES) {
|
|
73
|
+
if (text.startsWith(candidate.prefix, index)) return candidate;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function isControl(code: number): boolean {
|
|
79
|
+
return code <= 0x1f || (code >= 0x7f && code <= 0x9f);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Parse the body (between `kind:` and `}}`). Throws SecretReferenceSyntaxError. */
|
|
83
|
+
function parseBody(body: string): {
|
|
84
|
+
target: SecretReferenceTarget;
|
|
85
|
+
otp: boolean;
|
|
86
|
+
previous: boolean;
|
|
87
|
+
} {
|
|
88
|
+
if (body.length === 0)
|
|
89
|
+
throw new SecretReferenceSyntaxError("empty_body", "secret reference is empty");
|
|
90
|
+
let rest = body;
|
|
91
|
+
let previous = false;
|
|
92
|
+
if (rest.endsWith(PREVIOUS_SUFFIX)) {
|
|
93
|
+
previous = true;
|
|
94
|
+
rest = rest.slice(0, -PREVIOUS_SUFFIX.length);
|
|
95
|
+
}
|
|
96
|
+
if (rest.includes("#")) {
|
|
97
|
+
throw new SecretReferenceSyntaxError(
|
|
98
|
+
"unsupported_version_suffix",
|
|
99
|
+
"only #previous is supported, and it must be last",
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
const parts = rest.split("/");
|
|
103
|
+
let otp = false;
|
|
104
|
+
if (parts.length >= 2 && parts[parts.length - 1]!.toLowerCase() === "otp") {
|
|
105
|
+
otp = true;
|
|
106
|
+
parts.pop();
|
|
107
|
+
}
|
|
108
|
+
if (parts[0]!.toLowerCase().startsWith(ID_PREFIX)) {
|
|
109
|
+
const itemId = parts[0]!.slice(ID_PREFIX.length);
|
|
110
|
+
if (!UUID_PATTERN.test(itemId)) {
|
|
111
|
+
throw new SecretReferenceSyntaxError("invalid_id", "id: must be followed by an item UUID");
|
|
112
|
+
}
|
|
113
|
+
if (parts.length > 2) {
|
|
114
|
+
throw new SecretReferenceSyntaxError("too_many_segments", "id form takes at most one field");
|
|
115
|
+
}
|
|
116
|
+
const field = parts[1] ?? null;
|
|
117
|
+
if (field !== null) assertSegment(field);
|
|
118
|
+
return { target: { form: "id", itemId: itemId.toLowerCase(), field }, otp, previous };
|
|
119
|
+
}
|
|
120
|
+
if (parts.length > 3) {
|
|
121
|
+
throw new SecretReferenceSyntaxError(
|
|
122
|
+
"too_many_segments",
|
|
123
|
+
"a reference has at most Vault/Item/field",
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
for (const segment of parts) assertSegment(segment);
|
|
127
|
+
return {
|
|
128
|
+
target: {
|
|
129
|
+
form: "path",
|
|
130
|
+
segments: parts as [string] | [string, string] | [string, string, string],
|
|
131
|
+
},
|
|
132
|
+
otp,
|
|
133
|
+
previous,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function assertSegment(segment: string): void {
|
|
138
|
+
if (segment.length === 0) {
|
|
139
|
+
throw new SecretReferenceSyntaxError("empty_segment", "a reference has an empty name");
|
|
140
|
+
}
|
|
141
|
+
if (!isValidSecretName(segment)) {
|
|
142
|
+
throw new SecretReferenceSyntaxError(
|
|
143
|
+
"invalid_segment",
|
|
144
|
+
`"${segment.slice(0, 40)}" is not a valid vault, item or field name`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Scan one candidate starting at `index` (where a prefix matched). Returns the
|
|
151
|
+
* candidate's end (exclusive) and either the parsed reference or a reason.
|
|
152
|
+
*/
|
|
153
|
+
function scanCandidate(
|
|
154
|
+
text: string,
|
|
155
|
+
index: number,
|
|
156
|
+
prefix: { prefix: string; kind: SecretReferenceKind },
|
|
157
|
+
):
|
|
158
|
+
| { ok: true; end: number; reference: SecretReference }
|
|
159
|
+
| { ok: false; end: number; reason: string } {
|
|
160
|
+
const bodyStart = index + prefix.prefix.length;
|
|
161
|
+
const limit = Math.min(text.length, index + VAULT_LIMITS.referenceMaxChars);
|
|
162
|
+
let cursor = bodyStart;
|
|
163
|
+
while (cursor < text.length) {
|
|
164
|
+
const code = text.charCodeAt(cursor);
|
|
165
|
+
const character = text[cursor]!;
|
|
166
|
+
if (character === "}" && text[cursor + 1] === "}") {
|
|
167
|
+
const end = cursor + 2;
|
|
168
|
+
if (end - index > VAULT_LIMITS.referenceMaxChars) {
|
|
169
|
+
return { ok: false, end, reason: "too_long" };
|
|
170
|
+
}
|
|
171
|
+
const raw = text.slice(index, end);
|
|
172
|
+
try {
|
|
173
|
+
const parsed = parseBody(text.slice(bodyStart, cursor));
|
|
174
|
+
return {
|
|
175
|
+
ok: true,
|
|
176
|
+
end,
|
|
177
|
+
reference: { kind: prefix.kind, raw, start: index, end, ...parsed },
|
|
178
|
+
};
|
|
179
|
+
} catch (error) {
|
|
180
|
+
return {
|
|
181
|
+
ok: false,
|
|
182
|
+
end,
|
|
183
|
+
reason: error instanceof SecretReferenceSyntaxError ? error.reason : "invalid",
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (character === "{" || character === "}" || isControl(code) || cursor >= limit) {
|
|
188
|
+
// Unterminated: the invalid token stops before the offending character.
|
|
189
|
+
const end = Math.max(cursor, bodyStart);
|
|
190
|
+
return { ok: false, end, reason: cursor >= limit ? "too_long" : "unterminated" };
|
|
191
|
+
}
|
|
192
|
+
cursor += 1;
|
|
193
|
+
}
|
|
194
|
+
return { ok: false, end: text.length, reason: "unterminated" };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Split text into literal text, references and invalid candidates. Adjacent
|
|
199
|
+
* text is merged; an escaped reference (`\{{secret:…}}`) becomes literal
|
|
200
|
+
* text without the backslash. Never throws.
|
|
201
|
+
*/
|
|
202
|
+
export function tokenizeSecretText(text: string): SecretTextToken[] {
|
|
203
|
+
if (!containsSecretReference(text)) return text.length > 0 ? [{ type: "text", value: text }] : [];
|
|
204
|
+
const tokens: SecretTextToken[] = [];
|
|
205
|
+
let buffer = "";
|
|
206
|
+
let cursor = 0;
|
|
207
|
+
const flush = () => {
|
|
208
|
+
if (buffer.length > 0) tokens.push({ type: "text", value: buffer });
|
|
209
|
+
buffer = "";
|
|
210
|
+
};
|
|
211
|
+
while (cursor < text.length) {
|
|
212
|
+
const next = text.indexOf(SECRET_REFERENCE_MARKER, cursor);
|
|
213
|
+
if (next < 0) {
|
|
214
|
+
buffer += text.slice(cursor);
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
const prefix = prefixAt(text, next);
|
|
218
|
+
if (prefix === null) {
|
|
219
|
+
// "{{secret" not followed by ":" or "file:" is ordinary text.
|
|
220
|
+
buffer += text.slice(cursor, next + SECRET_REFERENCE_MARKER.length);
|
|
221
|
+
cursor = next + SECRET_REFERENCE_MARKER.length;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// A backslash immediately before the candidate (and not already consumed)
|
|
225
|
+
// escapes it: the candidate is emitted literally, without the backslash.
|
|
226
|
+
const escaped = next - 1 >= cursor && text[next - 1] === "\\";
|
|
227
|
+
const scanned = scanCandidate(text, next, prefix);
|
|
228
|
+
if (escaped) {
|
|
229
|
+
buffer += text.slice(cursor, next - 1) + text.slice(next, scanned.end);
|
|
230
|
+
cursor = scanned.end;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
buffer += text.slice(cursor, next);
|
|
234
|
+
flush();
|
|
235
|
+
if (scanned.ok) {
|
|
236
|
+
tokens.push({ type: "reference", reference: scanned.reference });
|
|
237
|
+
} else {
|
|
238
|
+
tokens.push({
|
|
239
|
+
type: "invalid",
|
|
240
|
+
raw: text.slice(next, scanned.end),
|
|
241
|
+
start: next,
|
|
242
|
+
end: scanned.end,
|
|
243
|
+
reason: scanned.reason,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
cursor = scanned.end;
|
|
247
|
+
}
|
|
248
|
+
flush();
|
|
249
|
+
return tokens;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** Valid references only, in text order. */
|
|
253
|
+
export function findSecretReferences(text: string): SecretReference[] {
|
|
254
|
+
if (!containsSecretReference(text)) return [];
|
|
255
|
+
return tokenizeSecretText(text).flatMap((token) =>
|
|
256
|
+
token.type === "reference" ? [token.reference] : [],
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** Invalid candidates only, in text order. */
|
|
261
|
+
export function findInvalidSecretReferences(
|
|
262
|
+
text: string,
|
|
263
|
+
): Array<Extract<SecretTextToken, { type: "invalid" }>> {
|
|
264
|
+
if (!containsSecretReference(text)) return [];
|
|
265
|
+
return tokenizeSecretText(text).filter(
|
|
266
|
+
(token): token is Extract<SecretTextToken, { type: "invalid" }> => token.type === "invalid",
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** Parse exactly one reference (`{{…}}`). Throws SecretReferenceSyntaxError. */
|
|
271
|
+
export function parseSecretReference(raw: string): SecretReference {
|
|
272
|
+
const prefix = prefixAt(raw, 0);
|
|
273
|
+
if (prefix === null) {
|
|
274
|
+
throw new SecretReferenceSyntaxError(
|
|
275
|
+
"missing_prefix",
|
|
276
|
+
"a secret reference starts with {{secret: or {{secretfile:",
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
const scanned = scanCandidate(raw, 0, prefix);
|
|
280
|
+
if (!scanned.ok) throw new SecretReferenceSyntaxError(scanned.reason);
|
|
281
|
+
if (scanned.end !== raw.length) {
|
|
282
|
+
throw new SecretReferenceSyntaxError("trailing_text", "unexpected text after the reference");
|
|
283
|
+
}
|
|
284
|
+
return scanned.reference;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export type FormatSecretReferenceInput =
|
|
288
|
+
| {
|
|
289
|
+
kind?: SecretReferenceKind;
|
|
290
|
+
vault?: string;
|
|
291
|
+
item: string;
|
|
292
|
+
field?: string;
|
|
293
|
+
otp?: boolean;
|
|
294
|
+
previous?: boolean;
|
|
295
|
+
}
|
|
296
|
+
| {
|
|
297
|
+
kind?: SecretReferenceKind;
|
|
298
|
+
itemId: string;
|
|
299
|
+
field?: string;
|
|
300
|
+
otp?: boolean;
|
|
301
|
+
previous?: boolean;
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
/** Build a reference. Throws SecretReferenceSyntaxError when a name cannot be referenced. */
|
|
305
|
+
export function formatSecretReference(input: FormatSecretReferenceInput): string {
|
|
306
|
+
const kind = input.kind ?? "secret";
|
|
307
|
+
const parts: string[] = [];
|
|
308
|
+
if ("itemId" in input) {
|
|
309
|
+
if (!UUID_PATTERN.test(input.itemId)) throw new SecretReferenceSyntaxError("invalid_id");
|
|
310
|
+
parts.push(`${ID_PREFIX}${input.itemId.toLowerCase()}`);
|
|
311
|
+
} else {
|
|
312
|
+
if (input.vault !== undefined) parts.push(input.vault);
|
|
313
|
+
parts.push(input.item);
|
|
314
|
+
}
|
|
315
|
+
if (input.field !== undefined) parts.push(input.field);
|
|
316
|
+
for (const part of "itemId" in input ? parts.slice(1) : parts) assertSegment(part);
|
|
317
|
+
const body = `${parts.join("/")}${input.otp ? "/otp" : ""}${input.previous ? PREVIOUS_SUFFIX : ""}`;
|
|
318
|
+
const raw = `{{${kind}:${body}}}`;
|
|
319
|
+
if (raw.length > VAULT_LIMITS.referenceMaxChars) throw new SecretReferenceSyntaxError("too_long");
|
|
320
|
+
return raw;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/** NFC + trim + lowercase. For UI and dedupe only; SQL `vault_name_key` is authoritative. */
|
|
324
|
+
export function secretNameKey(name: string): string {
|
|
325
|
+
return name.normalize("NFC").trim().toLowerCase();
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/** Canonical dedupe key within one call (same target and modifiers → same key). */
|
|
329
|
+
export function referenceKey(ref: SecretReference): string {
|
|
330
|
+
const target =
|
|
331
|
+
ref.target.form === "id"
|
|
332
|
+
? `id:${ref.target.itemId.toLowerCase()}/${ref.target.field === null ? "" : secretNameKey(ref.target.field)}`
|
|
333
|
+
: `path:${ref.target.segments.map(secretNameKey).join("/")}`;
|
|
334
|
+
return `${ref.kind}|${target}|${ref.otp ? "otp" : ""}|${ref.previous ? "previous" : ""}`;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** Remove escapes (`\{{secret:…}}` → `{{secret:…}}`); references stay as written. */
|
|
338
|
+
export function unescapeSecretText(text: string): string {
|
|
339
|
+
if (!containsSecretReference(text)) return text;
|
|
340
|
+
return tokenizeSecretText(text)
|
|
341
|
+
.map((token) =>
|
|
342
|
+
token.type === "text"
|
|
343
|
+
? token.value
|
|
344
|
+
: token.type === "reference"
|
|
345
|
+
? token.reference.raw
|
|
346
|
+
: token.raw,
|
|
347
|
+
)
|
|
348
|
+
.join("");
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function walkStrings(value: unknown, visit: (text: string) => void, seen: Set<object>): void {
|
|
352
|
+
if (typeof value === "string") {
|
|
353
|
+
visit(value);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
if (value === null || typeof value !== "object") return;
|
|
357
|
+
if (seen.has(value)) return;
|
|
358
|
+
seen.add(value);
|
|
359
|
+
if (Array.isArray(value)) {
|
|
360
|
+
for (const entry of value) walkStrings(entry, visit, seen);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
for (const entry of Object.values(value as Record<string, unknown>))
|
|
364
|
+
walkStrings(entry, visit, seen);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Every valid reference in every string value of a JSON-like structure. */
|
|
368
|
+
export function collectReferencesDeep(value: unknown): SecretReference[] {
|
|
369
|
+
const out: SecretReference[] = [];
|
|
370
|
+
walkStrings(value, (text) => out.push(...findSecretReferences(text)), new Set());
|
|
371
|
+
return out;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/** Every invalid candidate in every string value of a JSON-like structure. */
|
|
375
|
+
export function collectInvalidReferencesDeep(
|
|
376
|
+
value: unknown,
|
|
377
|
+
): Array<Extract<SecretTextToken, { type: "invalid" }>> {
|
|
378
|
+
const out: Array<Extract<SecretTextToken, { type: "invalid" }>> = [];
|
|
379
|
+
walkStrings(value, (text) => out.push(...findInvalidSecretReferences(text)), new Set());
|
|
380
|
+
return out;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Deep copy with each reference replaced by `replace(ref)` and escapes
|
|
385
|
+
* removed. Strings without the marker are copied unchanged; invalid
|
|
386
|
+
* candidates are kept verbatim (callers reject them before replacing).
|
|
387
|
+
* Object keys are not rewritten.
|
|
388
|
+
*/
|
|
389
|
+
export function replaceReferencesDeep<T>(value: T, replace: (ref: SecretReference) => string): T {
|
|
390
|
+
const replaceText = (text: string): string => {
|
|
391
|
+
if (!containsSecretReference(text)) return text;
|
|
392
|
+
return tokenizeSecretText(text)
|
|
393
|
+
.map((token) =>
|
|
394
|
+
token.type === "text"
|
|
395
|
+
? token.value
|
|
396
|
+
: token.type === "reference"
|
|
397
|
+
? replace(token.reference)
|
|
398
|
+
: token.raw,
|
|
399
|
+
)
|
|
400
|
+
.join("");
|
|
401
|
+
};
|
|
402
|
+
const copy = (input: unknown): unknown => {
|
|
403
|
+
if (typeof input === "string") return replaceText(input);
|
|
404
|
+
if (input === null || typeof input !== "object") return input;
|
|
405
|
+
if (Array.isArray(input)) return input.map(copy);
|
|
406
|
+
if (input instanceof Uint8Array || input instanceof Date) return input;
|
|
407
|
+
const out: Record<string, unknown> = {};
|
|
408
|
+
for (const [key, entry] of Object.entries(input as Record<string, unknown>)) {
|
|
409
|
+
out[key] = copy(entry);
|
|
410
|
+
}
|
|
411
|
+
return out;
|
|
412
|
+
};
|
|
413
|
+
return copy(value) as T;
|
|
414
|
+
}
|