@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,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret resolver contract (design §10B.1.3). Types live here; the hosted
|
|
3
|
+
* implementation is `createSecretResolver` in `@opengeni/core` and a static
|
|
4
|
+
* stub is `createStaticSecretResolver` in `@opengeni/vaults/testing`.
|
|
5
|
+
*
|
|
6
|
+
* Invariants: a call resolves all of its references or fails before
|
|
7
|
+
* dispatch (I2); plaintext only ever lives in `ResolvedSecretValue.material`
|
|
8
|
+
* and in delivery locals (I1); TOTP codes are computed at dispatch (I4).
|
|
9
|
+
*/
|
|
10
|
+
import type { RequestHumanInputToolInput } from "./index";
|
|
11
|
+
import { parseSecretReference, secretNameKey, type SecretReference } from "./secret-references";
|
|
12
|
+
import { totpCodeAtDispatch, type SecretClock, type TotpParams } from "./secret-totp";
|
|
13
|
+
import type { VaultFieldKind, VaultSource } from "./vaults";
|
|
14
|
+
|
|
15
|
+
export type SecretPrincipal =
|
|
16
|
+
| {
|
|
17
|
+
kind: "attempt";
|
|
18
|
+
accountId: string;
|
|
19
|
+
workspaceId: string;
|
|
20
|
+
sessionId: string;
|
|
21
|
+
turnId: string;
|
|
22
|
+
attemptId: string;
|
|
23
|
+
executionGeneration: number;
|
|
24
|
+
}
|
|
25
|
+
| {
|
|
26
|
+
kind: "site_viewer";
|
|
27
|
+
accountId: string;
|
|
28
|
+
workspaceId: string;
|
|
29
|
+
subjectId: string;
|
|
30
|
+
siteId: string;
|
|
31
|
+
siteVersion: string;
|
|
32
|
+
}
|
|
33
|
+
| {
|
|
34
|
+
kind: "human";
|
|
35
|
+
accountId: string;
|
|
36
|
+
workspaceId: string;
|
|
37
|
+
subjectId: string;
|
|
38
|
+
verifiedHuman: boolean;
|
|
39
|
+
viaApiKey: boolean;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const SECRET_USE_SURFACES = [
|
|
43
|
+
"shell",
|
|
44
|
+
"stdin",
|
|
45
|
+
"file_write",
|
|
46
|
+
"secretfile",
|
|
47
|
+
"view_image",
|
|
48
|
+
"run_on",
|
|
49
|
+
"mcp",
|
|
50
|
+
"codemode",
|
|
51
|
+
"site",
|
|
52
|
+
"browser",
|
|
53
|
+
"desktop",
|
|
54
|
+
"human_reveal",
|
|
55
|
+
] as const;
|
|
56
|
+
export type SecretUseSurface = (typeof SECRET_USE_SURFACES)[number];
|
|
57
|
+
export interface SecretUseContext {
|
|
58
|
+
surface: SecretUseSurface;
|
|
59
|
+
toolName: string;
|
|
60
|
+
operationId?: string;
|
|
61
|
+
sourceCallId?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Where the value goes, for a person approving the use: a page's host, a
|
|
64
|
+
* machine or a connector name. Never a value.
|
|
65
|
+
*/
|
|
66
|
+
destination?: string;
|
|
67
|
+
/**
|
|
68
|
+
* Looks the destination up when it costs a round trip (a browser page's
|
|
69
|
+
* host). Called only when a use must ask for approval; failures are ignored.
|
|
70
|
+
*/
|
|
71
|
+
lookupDestination?: () => Promise<string | null>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type SecretMaterial =
|
|
75
|
+
| { type: "text"; value: string }
|
|
76
|
+
/** File fields. */
|
|
77
|
+
| { type: "bytes"; value: Uint8Array }
|
|
78
|
+
/** The code is computed at dispatch (I4). */
|
|
79
|
+
| { type: "totp"; params: TotpParams };
|
|
80
|
+
|
|
81
|
+
export interface ResolvedSecretValue {
|
|
82
|
+
/** `referenceKey(reference)` */
|
|
83
|
+
key: string;
|
|
84
|
+
reference: SecretReference;
|
|
85
|
+
source: VaultSource;
|
|
86
|
+
vaultId: string;
|
|
87
|
+
vaultName: string;
|
|
88
|
+
itemId: string;
|
|
89
|
+
itemName: string;
|
|
90
|
+
fieldId: string | null;
|
|
91
|
+
fieldName: string;
|
|
92
|
+
/**
|
|
93
|
+
* The field's kind when the vault reports it. A `text` field (a username,
|
|
94
|
+
* a host) is not secret: known-value masking does not remember it.
|
|
95
|
+
*/
|
|
96
|
+
fieldKind?: VaultFieldKind | null;
|
|
97
|
+
version: number | null;
|
|
98
|
+
material: SecretMaterial;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface SecretResolver {
|
|
102
|
+
readonly principal: SecretPrincipal;
|
|
103
|
+
/** false when agent.capabilities.secrets is off: adapters must pass references through literally (Q-35). */
|
|
104
|
+
readonly enabled: boolean;
|
|
105
|
+
/** All-or-nothing (I2). Throws SecretReferenceError. Keys are referenceKey(ref). */
|
|
106
|
+
resolve(
|
|
107
|
+
refs: readonly SecretReference[],
|
|
108
|
+
use: SecretUseContext,
|
|
109
|
+
): Promise<Map<string, ResolvedSecretValue>>;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export const SECRET_REFERENCE_FAILURE_CODES = [
|
|
113
|
+
"invalid_reference",
|
|
114
|
+
"not_found",
|
|
115
|
+
"ambiguous",
|
|
116
|
+
"denied",
|
|
117
|
+
"no_primary_field",
|
|
118
|
+
"provider_unavailable",
|
|
119
|
+
"provider_rate_limited",
|
|
120
|
+
"provider_auth_expired",
|
|
121
|
+
"too_large",
|
|
122
|
+
"binary_value",
|
|
123
|
+
"unsupported_shell",
|
|
124
|
+
"secretfile_not_allowed",
|
|
125
|
+
"approval_required",
|
|
126
|
+
] as const;
|
|
127
|
+
export type SecretReferenceFailureCode = (typeof SECRET_REFERENCE_FAILURE_CODES)[number];
|
|
128
|
+
|
|
129
|
+
export interface SecretReferenceFailure {
|
|
130
|
+
raw: string;
|
|
131
|
+
code: SecretReferenceFailureCode;
|
|
132
|
+
message: string;
|
|
133
|
+
/** ambiguous: ready references to choose from (Q-49). */
|
|
134
|
+
candidates?: string[];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export const SECRET_REFERENCE_ERROR_CODE = "secret_reference_error" as const;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* approval_required: the stored request for the blocked use, and whether
|
|
141
|
+
* Opengeni itself asked the person (the host's card in the chat, their inbox
|
|
142
|
+
* and a phone notification). Their answer reaches the agent as a
|
|
143
|
+
* `secret_use_approval_decided` update; the agent never relays the card.
|
|
144
|
+
*/
|
|
145
|
+
export type SecretUseApprovalAsk = {
|
|
146
|
+
approvalId: string;
|
|
147
|
+
/** False only when this run could no longer post in the chat (it was superseded). */
|
|
148
|
+
asked: boolean;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
function failureHint(
|
|
152
|
+
failures: readonly SecretReferenceFailure[],
|
|
153
|
+
askCard: RequestHumanInputToolInput | null,
|
|
154
|
+
approval: SecretUseApprovalAsk | null,
|
|
155
|
+
): string {
|
|
156
|
+
const hints: string[] = [];
|
|
157
|
+
if (askCard !== null) {
|
|
158
|
+
hints.push(
|
|
159
|
+
failures.some((failure) => failure.code === "not_found")
|
|
160
|
+
? "Nothing was run. A secret is missing. If the reference was meant to reach another workspace, chat or later work unresolved, write it as \\{{secret:…}} and retry. Otherwise call request_human_input with askCard exactly as given, then retry with the returned references."
|
|
161
|
+
: "Nothing was run. A secret is missing: call request_human_input with askCard exactly as given, then retry with the returned references.",
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
if (approval?.asked === true) {
|
|
165
|
+
hints.push(
|
|
166
|
+
"Nothing was run. Opengeni has asked the person, in this chat and by notification, to allow this use of the secret; do not ask them yourself. Their answer reaches you as an update in this chat after this turn: if they allow it, retry the same call then; if they deny it, do not retry. Until then, continue with other work or end your turn.",
|
|
167
|
+
);
|
|
168
|
+
} else if (approval !== null) {
|
|
169
|
+
hints.push(
|
|
170
|
+
"Nothing was run. The person must allow each use of this secret, and this run could not ask them. Tell them the use is waiting for their approval.",
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
if (failures.some((failure) => failure.code === "ambiguous")) {
|
|
174
|
+
hints.push("Nothing was run. Retry with one of the candidate references.");
|
|
175
|
+
}
|
|
176
|
+
if (failures.some((failure) => failure.code === "invalid_reference")) {
|
|
177
|
+
hints.push(
|
|
178
|
+
"Nothing was run. Fix the reference syntax: {{secret:Item}}, {{secret:Item/field}}, {{secret:Vault/Item/field}}, {{secret:id:<uuid>}}, optional /otp and #previous. Escape a literal reference as \\{{secret:…}}.",
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
if (hints.length === 0) hints.push("Nothing was run. See each failure's message.");
|
|
182
|
+
return hints.join(" ");
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Thrown by `SecretResolver.resolve` and by delivery adapters before dispatch. */
|
|
186
|
+
export class SecretReferenceError extends Error {
|
|
187
|
+
readonly code = SECRET_REFERENCE_ERROR_CODE;
|
|
188
|
+
readonly failures: SecretReferenceFailure[];
|
|
189
|
+
readonly askCard: RequestHumanInputToolInput | null;
|
|
190
|
+
/** approval_required: the request the person was asked to decide. */
|
|
191
|
+
readonly approval: SecretUseApprovalAsk | null;
|
|
192
|
+
|
|
193
|
+
constructor(
|
|
194
|
+
failures: SecretReferenceFailure[],
|
|
195
|
+
askCard: RequestHumanInputToolInput | null = null,
|
|
196
|
+
approval: SecretUseApprovalAsk | null = null,
|
|
197
|
+
) {
|
|
198
|
+
const first = failures[0];
|
|
199
|
+
super(
|
|
200
|
+
first === undefined
|
|
201
|
+
? "secret reference error"
|
|
202
|
+
: `${first.code}: ${first.message}${failures.length > 1 ? ` (+${failures.length - 1} more)` : ""}`,
|
|
203
|
+
);
|
|
204
|
+
this.name = "SecretReferenceError";
|
|
205
|
+
this.failures = failures;
|
|
206
|
+
this.askCard = askCard;
|
|
207
|
+
this.approval = approval;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* JSON string for tool output: {error, failures, askCard, hint}. A use that
|
|
212
|
+
* needs approval is told in `hint` that the person was asked; the card
|
|
213
|
+
* itself never passes through the agent. Never contains values.
|
|
214
|
+
*/
|
|
215
|
+
toModelOutput(): string {
|
|
216
|
+
return JSON.stringify({
|
|
217
|
+
error: this.code,
|
|
218
|
+
failures: this.failures.map((failure) => ({
|
|
219
|
+
raw: failure.raw,
|
|
220
|
+
code: failure.code,
|
|
221
|
+
message: failure.message,
|
|
222
|
+
...(failure.candidates ? { candidates: failure.candidates } : {}),
|
|
223
|
+
})),
|
|
224
|
+
askCard: this.askCard,
|
|
225
|
+
hint: failureHint(this.failures, this.askCard, this.approval),
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export function isSecretReferenceError(error: unknown): error is SecretReferenceError {
|
|
231
|
+
return (
|
|
232
|
+
error instanceof SecretReferenceError ||
|
|
233
|
+
(typeof error === "object" &&
|
|
234
|
+
error !== null &&
|
|
235
|
+
(error as { code?: unknown }).code === SECRET_REFERENCE_ERROR_CODE &&
|
|
236
|
+
Array.isArray((error as { failures?: unknown }).failures))
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** Materialize at dispatch: text/bytes as-is; TOTP via totpCodeAtDispatch (waits when < 3 s remain). */
|
|
241
|
+
export async function secretValueAtDispatch(
|
|
242
|
+
v: ResolvedSecretValue,
|
|
243
|
+
clock?: SecretClock,
|
|
244
|
+
): Promise<string | Uint8Array> {
|
|
245
|
+
switch (v.material.type) {
|
|
246
|
+
case "text":
|
|
247
|
+
return v.material.value;
|
|
248
|
+
case "bytes":
|
|
249
|
+
return v.material.value;
|
|
250
|
+
case "totp":
|
|
251
|
+
return (await totpCodeAtDispatch(v.material.params, clock)).code;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const TEXT_FIELD_NAMES = new Set(["username", "user", "email", "login", "account"]);
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* The ready-made ask card for `not_found` failures (§10B.1.3, D11): one
|
|
259
|
+
* secret question per missing item. Path references name the item in their
|
|
260
|
+
* last item segment (`Item`, `Item/field` read as Item/field, `Vault/Item/field`);
|
|
261
|
+
* ID references cannot be asked for by name and are skipped. Returns null
|
|
262
|
+
* when nothing can be asked. The model submits it unchanged.
|
|
263
|
+
*/
|
|
264
|
+
export function buildMissingSecretAskCard(
|
|
265
|
+
failures: readonly SecretReferenceFailure[],
|
|
266
|
+
ctx: { hasActingHuman: boolean },
|
|
267
|
+
): RequestHumanInputToolInput | null {
|
|
268
|
+
const saveTo = ctx.hasActingHuman ? "user" : "workspace";
|
|
269
|
+
const questions: RequestHumanInputToolInput["questions"] = [];
|
|
270
|
+
const seen = new Set<string>();
|
|
271
|
+
for (const failure of failures) {
|
|
272
|
+
if (failure.code !== "not_found") continue;
|
|
273
|
+
let reference: SecretReference;
|
|
274
|
+
try {
|
|
275
|
+
reference = parseSecretReference(failure.raw);
|
|
276
|
+
} catch {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (reference.target.form !== "path") continue;
|
|
280
|
+
const segments = reference.target.segments;
|
|
281
|
+
const item = segments.length === 3 ? segments[1] : segments[0];
|
|
282
|
+
const requestedField = segments.length === 3 ? segments[2] : segments[1];
|
|
283
|
+
const totp = reference.otp && requestedField === undefined;
|
|
284
|
+
const field = requestedField ?? (totp ? "totp" : "password");
|
|
285
|
+
const key = `${secretNameKey(item)}/${secretNameKey(field)}`;
|
|
286
|
+
if (seen.has(key) || questions.length >= 20) continue;
|
|
287
|
+
seen.add(key);
|
|
288
|
+
const fieldKind =
|
|
289
|
+
totp || reference.otp
|
|
290
|
+
? "totp"
|
|
291
|
+
: TEXT_FIELD_NAMES.has(secretNameKey(field))
|
|
292
|
+
? "text"
|
|
293
|
+
: "concealed";
|
|
294
|
+
const prompt =
|
|
295
|
+
fieldKind === "totp"
|
|
296
|
+
? `Enter the two-factor setup key (or otpauth link) for ${item}. It is saved to a vault, never shown in chat.`
|
|
297
|
+
: `Enter the ${field} for ${item}. It is saved to a vault, never shown in chat.`;
|
|
298
|
+
questions.push({
|
|
299
|
+
id: `secret_${questions.length + 1}`,
|
|
300
|
+
kind: "secret",
|
|
301
|
+
prompt,
|
|
302
|
+
label: item.slice(0, 128),
|
|
303
|
+
helpText: null,
|
|
304
|
+
skillReview: null,
|
|
305
|
+
options: [],
|
|
306
|
+
required: true,
|
|
307
|
+
allowOther: false,
|
|
308
|
+
validation: null,
|
|
309
|
+
secret: {
|
|
310
|
+
item,
|
|
311
|
+
field,
|
|
312
|
+
fieldKind,
|
|
313
|
+
itemType: "login",
|
|
314
|
+
saveTo,
|
|
315
|
+
allowGenerate: false,
|
|
316
|
+
autocomplete: fieldKind === "concealed" ? "current-password" : "off",
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
if (questions.length === 0) return null;
|
|
321
|
+
return { questions, allowSkip: true, expiresInSeconds: null };
|
|
322
|
+
}
|