primitive-admin 1.1.0-alpha.9 → 1.1.0
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/README.md +523 -109
- package/assets/skill/skills/primitive-platform/SKILL.md +289 -0
- package/dist/bin/primitive.d.ts +2 -0
- package/dist/bin/primitive.js +372 -21
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/admins.d.ts +2 -0
- package/dist/src/commands/admins.js +136 -30
- package/dist/src/commands/admins.js.map +1 -1
- package/dist/src/commands/analytics.d.ts +2 -0
- package/dist/src/commands/analytics.js +713 -55
- package/dist/src/commands/analytics.js.map +1 -1
- package/dist/src/commands/apps.d.ts +2 -0
- package/dist/src/commands/apps.js +65 -100
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth-sessions.d.ts +7 -0
- package/dist/src/commands/auth-sessions.js +144 -0
- package/dist/src/commands/auth-sessions.js.map +1 -0
- package/dist/src/commands/auth.d.ts +2 -0
- package/dist/src/commands/auth.js +238 -108
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/blob-buckets.d.ts +2 -0
- package/dist/src/commands/blob-buckets.js +331 -0
- package/dist/src/commands/blob-buckets.js.map +1 -0
- package/dist/src/commands/catalog.d.ts +2 -0
- package/dist/src/commands/catalog.js +63 -48
- package/dist/src/commands/catalog.js.map +1 -1
- package/dist/src/commands/collection-type-configs.d.ts +2 -0
- package/dist/src/commands/collection-type-configs.js +85 -0
- package/dist/src/commands/collection-type-configs.js.map +1 -0
- package/dist/src/commands/collections.d.ts +2 -0
- package/dist/src/commands/collections.js +1282 -0
- package/dist/src/commands/collections.js.map +1 -0
- package/dist/src/commands/comparisons.d.ts +2 -0
- package/dist/src/commands/comparisons.js +6 -6
- package/dist/src/commands/comparisons.js.map +1 -1
- package/dist/src/commands/config.d.ts +46 -0
- package/dist/src/commands/config.js +465 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/connections.d.ts +2 -0
- package/dist/src/commands/connections.js +99 -0
- package/dist/src/commands/connections.js.map +1 -0
- package/dist/src/commands/cron-triggers.d.ts +2 -0
- package/dist/src/commands/cron-triggers.js +266 -0
- package/dist/src/commands/cron-triggers.js.map +1 -0
- package/dist/src/commands/database-type-configs.d.ts +2 -0
- package/dist/src/commands/database-type-configs.js +164 -0
- package/dist/src/commands/database-type-configs.js.map +1 -0
- package/dist/src/commands/database-types.d.ts +2 -0
- package/dist/src/commands/database-types.js +471 -0
- package/dist/src/commands/database-types.js.map +1 -0
- package/dist/src/commands/databases.d.ts +65 -0
- package/dist/src/commands/databases.js +1887 -243
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.d.ts +60 -0
- package/dist/src/commands/documents.js +2888 -22
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.d.ts +2 -0
- package/dist/src/commands/email-templates.js +175 -0
- package/dist/src/commands/email-templates.js.map +1 -0
- package/dist/src/commands/env.d.ts +23 -0
- package/dist/src/commands/env.js +395 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/feature-flags.d.ts +14 -0
- package/dist/src/commands/feature-flags.js +117 -0
- package/dist/src/commands/feature-flags.js.map +1 -0
- package/dist/src/commands/functions.d.ts +20 -0
- package/dist/src/commands/functions.js +1630 -0
- package/dist/src/commands/functions.js.map +1 -0
- package/dist/src/commands/group-type-configs.d.ts +2 -0
- package/dist/src/commands/group-type-configs.js +87 -0
- package/dist/src/commands/group-type-configs.js.map +1 -0
- package/dist/src/commands/groups.d.ts +2 -0
- package/dist/src/commands/groups.js +65 -113
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/guides.d.ts +223 -0
- package/dist/src/commands/guides.js +627 -69
- package/dist/src/commands/guides.js.map +1 -1
- package/dist/src/commands/init.d.ts +37 -0
- package/dist/src/commands/init.js +1693 -208
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.d.ts +2 -0
- package/dist/src/commands/integrations.js +428 -187
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/llm.d.ts +2 -0
- package/dist/src/commands/llm.js +4 -2
- package/dist/src/commands/llm.js.map +1 -1
- package/dist/src/commands/locks.d.ts +8 -0
- package/dist/src/commands/locks.js +175 -0
- package/dist/src/commands/locks.js.map +1 -0
- package/dist/src/commands/metadata-category-configs.d.ts +12 -0
- package/dist/src/commands/metadata-category-configs.js +113 -0
- package/dist/src/commands/metadata-category-configs.js.map +1 -0
- package/dist/src/commands/metadata.d.ts +2 -0
- package/dist/src/commands/metadata.js +288 -0
- package/dist/src/commands/metadata.js.map +1 -0
- package/dist/src/commands/prompts.d.ts +2 -0
- package/dist/src/commands/prompts.js +322 -634
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.d.ts +3 -0
- package/dist/src/commands/rule-sets.js +139 -148
- package/dist/src/commands/rule-sets.js.map +1 -1
- package/dist/src/commands/scripts.d.ts +30 -0
- package/dist/src/commands/scripts.js +688 -0
- package/dist/src/commands/scripts.js.map +1 -0
- package/dist/src/commands/secrets.d.ts +2 -0
- package/dist/src/commands/secrets.js +109 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/sessions.d.ts +2 -0
- package/dist/src/commands/sessions.js +76 -0
- package/dist/src/commands/sessions.js.map +1 -0
- package/dist/src/commands/skill.d.ts +2 -0
- package/dist/src/commands/skill.js +29 -0
- package/dist/src/commands/skill.js.map +1 -0
- package/dist/src/commands/sync-app-settings.d.ts +158 -0
- package/dist/src/commands/sync-app-settings.js +328 -0
- package/dist/src/commands/sync-app-settings.js.map +1 -0
- package/dist/src/commands/sync.d.ts +2670 -0
- package/dist/src/commands/sync.js +17144 -834
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.d.ts +2 -0
- package/dist/src/commands/tokens.js +132 -22
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.d.ts +2 -0
- package/dist/src/commands/users.js +542 -24
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/vars.d.ts +8 -0
- package/dist/src/commands/vars.js +97 -0
- package/dist/src/commands/vars.js.map +1 -0
- package/dist/src/commands/waitlist.d.ts +2 -0
- package/dist/src/commands/waitlist.js +12 -11
- package/dist/src/commands/waitlist.js.map +1 -1
- package/dist/src/commands/webhooks.d.ts +31 -0
- package/dist/src/commands/webhooks.js +633 -0
- package/dist/src/commands/webhooks.js.map +1 -0
- package/dist/src/commands/workflows.d.ts +88 -0
- package/dist/src/commands/workflows.js +1568 -742
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/access-rule-display.d.ts +21 -0
- package/dist/src/lib/access-rule-display.js +34 -0
- package/dist/src/lib/access-rule-display.js.map +1 -0
- package/dist/src/lib/api-client.d.ts +2550 -0
- package/dist/src/lib/api-client.js +2503 -160
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
- package/dist/src/lib/app-settings-descriptor.js +583 -0
- package/dist/src/lib/app-settings-descriptor.js.map +1 -0
- package/dist/src/lib/auth-flow.d.ts +8 -0
- package/dist/src/lib/batch.d.ts +26 -0
- package/dist/src/lib/batch.js +32 -0
- package/dist/src/lib/batch.js.map +1 -0
- package/dist/src/lib/block-layout.d.ts +160 -0
- package/dist/src/lib/block-layout.js +451 -0
- package/dist/src/lib/block-layout.js.map +1 -0
- package/dist/src/lib/block-selector.d.ts +58 -0
- package/dist/src/lib/block-selector.js +92 -0
- package/dist/src/lib/block-selector.js.map +1 -0
- package/dist/src/lib/canonical-json.d.ts +12 -0
- package/dist/src/lib/canonical-json.js +35 -0
- package/dist/src/lib/canonical-json.js.map +1 -0
- package/dist/src/lib/channel.d.ts +30 -0
- package/dist/src/lib/channel.js +68 -0
- package/dist/src/lib/channel.js.map +1 -0
- package/dist/src/lib/cli-manifest.d.ts +68 -0
- package/dist/src/lib/cli-manifest.js +71 -0
- package/dist/src/lib/cli-manifest.js.map +1 -0
- package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
- package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
- package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
- package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +38 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +46 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
- package/dist/src/lib/collection-export.d.ts +184 -0
- package/dist/src/lib/collection-export.js +252 -0
- package/dist/src/lib/collection-export.js.map +1 -0
- package/dist/src/lib/config-json-field.d.ts +28 -0
- package/dist/src/lib/config-json-field.js +56 -0
- package/dist/src/lib/config-json-field.js.map +1 -0
- package/dist/src/lib/config-object-descriptor.d.ts +127 -0
- package/dist/src/lib/config-object-descriptor.js +740 -0
- package/dist/src/lib/config-object-descriptor.js.map +1 -0
- package/dist/src/lib/config-payload.d.ts +92 -0
- package/dist/src/lib/config-payload.js +161 -0
- package/dist/src/lib/config-payload.js.map +1 -0
- package/dist/src/lib/config-surface.d.ts +141 -0
- package/dist/src/lib/config-surface.js +368 -0
- package/dist/src/lib/config-surface.js.map +1 -0
- package/dist/src/lib/config-toml.d.ts +10 -0
- package/dist/src/lib/config-toml.js +42 -0
- package/dist/src/lib/config-toml.js.map +1 -0
- package/dist/src/lib/config.d.ts +71 -0
- package/dist/src/lib/config.js +71 -68
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/confirm-prompt.d.ts +83 -0
- package/dist/src/lib/confirm-prompt.js +110 -0
- package/dist/src/lib/confirm-prompt.js.map +1 -0
- package/dist/src/lib/constants.d.ts +11 -0
- package/dist/src/lib/constants.js +12 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/crash-handlers.d.ts +20 -0
- package/dist/src/lib/crash-handlers.js +49 -0
- package/dist/src/lib/crash-handlers.js.map +1 -0
- package/dist/src/lib/credentials-store.d.ts +104 -0
- package/dist/src/lib/credentials-store.js +336 -0
- package/dist/src/lib/credentials-store.js.map +1 -0
- package/dist/src/lib/csv.d.ts +47 -0
- package/dist/src/lib/csv.js +172 -0
- package/dist/src/lib/csv.js.map +1 -0
- package/dist/src/lib/data-input.d.ts +23 -0
- package/dist/src/lib/data-input.js +50 -0
- package/dist/src/lib/data-input.js.map +1 -0
- package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
- package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
- package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
- package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
- package/dist/src/lib/db-codegen/dbNaming.js +180 -0
- package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
- package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
- package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js +525 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
- package/dist/src/lib/deprecation.d.ts +22 -0
- package/dist/src/lib/deprecation.js +43 -0
- package/dist/src/lib/deprecation.js.map +1 -0
- package/dist/src/lib/document-export-permissions.d.ts +30 -0
- package/dist/src/lib/document-export-permissions.js +54 -0
- package/dist/src/lib/document-export-permissions.js.map +1 -0
- package/dist/src/lib/document-ingest-artifact.d.ts +120 -0
- package/dist/src/lib/document-ingest-artifact.js +505 -0
- package/dist/src/lib/document-ingest-artifact.js.map +1 -0
- package/dist/src/lib/document-ingest-input.d.ts +51 -0
- package/dist/src/lib/document-ingest-input.js +132 -0
- package/dist/src/lib/document-ingest-input.js.map +1 -0
- package/dist/src/lib/document-ingest-rows.d.ts +137 -0
- package/dist/src/lib/document-ingest-rows.js +181 -0
- package/dist/src/lib/document-ingest-rows.js.map +1 -0
- package/dist/src/lib/document-ingest.d.ts +101 -0
- package/dist/src/lib/document-ingest.js +384 -0
- package/dist/src/lib/document-ingest.js.map +1 -0
- package/dist/src/lib/env-resolver-core.d.ts +258 -0
- package/dist/src/lib/env-resolver-core.js +447 -0
- package/dist/src/lib/env-resolver-core.js.map +1 -0
- package/dist/src/lib/env-resolver.d.ts +99 -0
- package/dist/src/lib/env-resolver.js +153 -0
- package/dist/src/lib/env-resolver.js.map +1 -0
- package/dist/src/lib/fetch.d.ts +5 -0
- package/dist/src/lib/function-bundle.d.ts +147 -0
- package/dist/src/lib/function-bundle.js +341 -0
- package/dist/src/lib/function-bundle.js.map +1 -0
- package/dist/src/lib/function-collect.d.ts +123 -0
- package/dist/src/lib/function-collect.js +610 -0
- package/dist/src/lib/function-collect.js.map +1 -0
- package/dist/src/lib/function-db-types.d.ts +202 -0
- package/dist/src/lib/function-db-types.js +870 -0
- package/dist/src/lib/function-db-types.js.map +1 -0
- package/dist/src/lib/function-document-types.d.ts +144 -0
- package/dist/src/lib/function-document-types.js +370 -0
- package/dist/src/lib/function-document-types.js.map +1 -0
- package/dist/src/lib/function-grants-preflight.d.ts +64 -0
- package/dist/src/lib/function-grants-preflight.js +105 -0
- package/dist/src/lib/function-grants-preflight.js.map +1 -0
- package/dist/src/lib/function-log-lines.d.ts +76 -0
- package/dist/src/lib/function-log-lines.js +160 -0
- package/dist/src/lib/function-log-lines.js.map +1 -0
- package/dist/src/lib/function-log-row.d.ts +29 -0
- package/dist/src/lib/function-log-row.js +73 -0
- package/dist/src/lib/function-log-row.js.map +1 -0
- package/dist/src/lib/function-log-tail.d.ts +132 -0
- package/dist/src/lib/function-log-tail.js +262 -0
- package/dist/src/lib/function-log-tail.js.map +1 -0
- package/dist/src/lib/function-run.d.ts +289 -0
- package/dist/src/lib/function-run.js +389 -0
- package/dist/src/lib/function-run.js.map +1 -0
- package/dist/src/lib/function-schema-codegen.d.ts +143 -0
- package/dist/src/lib/function-schema-codegen.js +420 -0
- package/dist/src/lib/function-schema-codegen.js.map +1 -0
- package/dist/src/lib/function-sync.d.ts +459 -0
- package/dist/src/lib/function-sync.js +1258 -0
- package/dist/src/lib/function-sync.js.map +1 -0
- package/dist/src/lib/function-trigger-listing.d.ts +27 -0
- package/dist/src/lib/function-trigger-listing.js +70 -0
- package/dist/src/lib/function-trigger-listing.js.map +1 -0
- package/dist/src/lib/function-typecheck.d.ts +86 -0
- package/dist/src/lib/function-typecheck.js +370 -0
- package/dist/src/lib/function-typecheck.js.map +1 -0
- package/dist/src/lib/function-versions.d.ts +122 -0
- package/dist/src/lib/function-versions.js +182 -0
- package/dist/src/lib/function-versions.js.map +1 -0
- package/dist/src/lib/generated-allowlist.d.ts +28 -0
- package/dist/src/lib/generated-allowlist.js +281 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -0
- package/dist/src/lib/generated-config-surfaces.d.ts +2936 -0
- package/dist/src/lib/generated-config-surfaces.js +10569 -0
- package/dist/src/lib/generated-config-surfaces.js.map +1 -0
- package/dist/src/lib/generated-sdk-types.d.ts +12 -0
- package/dist/src/lib/generated-sdk-types.js +13 -0
- package/dist/src/lib/generated-sdk-types.js.map +1 -0
- package/dist/src/lib/generated-template-lint.d.ts +212 -0
- package/dist/src/lib/generated-template-lint.js +624 -0
- package/dist/src/lib/generated-template-lint.js.map +1 -0
- package/dist/src/lib/init-adopt.d.ts +16 -0
- package/dist/src/lib/init-adopt.js +34 -0
- package/dist/src/lib/init-adopt.js.map +1 -0
- package/dist/src/lib/init-assets.d.ts +39 -0
- package/dist/src/lib/init-assets.js +97 -0
- package/dist/src/lib/init-assets.js.map +1 -0
- package/dist/src/lib/init-client-platforms.d.ts +14 -0
- package/dist/src/lib/init-client-platforms.js +71 -0
- package/dist/src/lib/init-client-platforms.js.map +1 -0
- package/dist/src/lib/init-config.d.ts +98 -0
- package/dist/src/lib/init-config.js +186 -0
- package/dist/src/lib/init-config.js.map +1 -0
- package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
- package/dist/src/lib/init-email-redirect-uris.js +46 -0
- package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
- package/dist/src/lib/init-ios-links.d.ts +91 -0
- package/dist/src/lib/init-ios-links.js +219 -0
- package/dist/src/lib/init-ios-links.js.map +1 -0
- package/dist/src/lib/init-plan.d.ts +80 -0
- package/dist/src/lib/init-plan.js +95 -0
- package/dist/src/lib/init-plan.js.map +1 -0
- package/dist/src/lib/init-production-env.d.ts +48 -0
- package/dist/src/lib/init-production-env.js +59 -0
- package/dist/src/lib/init-production-env.js.map +1 -0
- package/dist/src/lib/init-schema.d.ts +74 -0
- package/dist/src/lib/init-schema.js +358 -0
- package/dist/src/lib/init-schema.js.map +1 -0
- package/dist/src/lib/init-xcode.d.ts +34 -0
- package/dist/src/lib/init-xcode.js +138 -0
- package/dist/src/lib/init-xcode.js.map +1 -0
- package/dist/src/lib/integration-request-config.d.ts +30 -0
- package/dist/src/lib/integration-request-config.js +145 -0
- package/dist/src/lib/integration-request-config.js.map +1 -0
- package/dist/src/lib/integration-selector.d.ts +42 -0
- package/dist/src/lib/integration-selector.js +46 -0
- package/dist/src/lib/integration-selector.js.map +1 -0
- package/dist/src/lib/ios-app-id.d.ts +34 -0
- package/dist/src/lib/ios-app-id.js +69 -0
- package/dist/src/lib/ios-app-id.js.map +1 -0
- package/dist/src/lib/list-options.d.ts +68 -0
- package/dist/src/lib/list-options.js +89 -0
- package/dist/src/lib/list-options.js.map +1 -0
- package/dist/src/lib/local-state.d.ts +55 -0
- package/dist/src/lib/local-state.js +167 -0
- package/dist/src/lib/local-state.js.map +1 -0
- package/dist/src/lib/local-test-cases.d.ts +63 -0
- package/dist/src/lib/local-test-cases.js +136 -0
- package/dist/src/lib/local-test-cases.js.map +1 -0
- package/dist/src/lib/log-inspection.d.ts +715 -0
- package/dist/src/lib/log-inspection.js +816 -0
- package/dist/src/lib/log-inspection.js.map +1 -0
- package/dist/src/lib/logout-admin-session.d.ts +33 -0
- package/dist/src/lib/logout-admin-session.js +70 -0
- package/dist/src/lib/logout-admin-session.js.map +1 -0
- package/dist/src/lib/migration-nag.d.ts +49 -0
- package/dist/src/lib/migration-nag.js +163 -0
- package/dist/src/lib/migration-nag.js.map +1 -0
- package/dist/src/lib/object-status-filter.d.ts +22 -0
- package/dist/src/lib/object-status-filter.js +45 -0
- package/dist/src/lib/object-status-filter.js.map +1 -0
- package/dist/src/lib/output.d.ts +124 -0
- package/dist/src/lib/output.js +219 -8
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/package-manager.d.ts +140 -0
- package/dist/src/lib/package-manager.js +305 -0
- package/dist/src/lib/package-manager.js.map +1 -0
- package/dist/src/lib/paginate.d.ts +98 -0
- package/dist/src/lib/paginate.js +112 -0
- package/dist/src/lib/paginate.js.map +1 -0
- package/dist/src/lib/platform-owned.d.ts +63 -0
- package/dist/src/lib/platform-owned.js +85 -0
- package/dist/src/lib/platform-owned.js.map +1 -0
- package/dist/src/lib/project-config.d.ts +122 -0
- package/dist/src/lib/project-config.js +244 -0
- package/dist/src/lib/project-config.js.map +1 -0
- package/dist/src/lib/prompt-cost-format.d.ts +11 -0
- package/dist/src/lib/prompt-cost-format.js +41 -0
- package/dist/src/lib/prompt-cost-format.js.map +1 -0
- package/dist/src/lib/prompt-schema-codegen.d.ts +147 -0
- package/dist/src/lib/prompt-schema-codegen.js +462 -0
- package/dist/src/lib/prompt-schema-codegen.js.map +1 -0
- package/dist/src/lib/query-operators.d.ts +43 -0
- package/dist/src/lib/query-operators.js +80 -0
- package/dist/src/lib/query-operators.js.map +1 -0
- package/dist/src/lib/record-filter.d.ts +18 -0
- package/dist/src/lib/record-filter.js +55 -0
- package/dist/src/lib/record-filter.js.map +1 -0
- package/dist/src/lib/refresh-admin-credentials.d.ts +73 -0
- package/dist/src/lib/refresh-admin-credentials.js +123 -0
- package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
- package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
- package/dist/src/lib/resolve-init-dev-port.js +55 -0
- package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
- package/dist/src/lib/resolve-init-server.d.ts +64 -0
- package/dist/src/lib/resolve-init-server.js +77 -0
- package/dist/src/lib/resolve-init-server.js.map +1 -0
- package/dist/src/lib/resolve-owner.d.ts +19 -0
- package/dist/src/lib/resolve-owner.js +20 -0
- package/dist/src/lib/resolve-owner.js.map +1 -0
- package/dist/src/lib/resolve-platform.d.ts +74 -0
- package/dist/src/lib/resolve-platform.js +105 -0
- package/dist/src/lib/resolve-platform.js.map +1 -0
- package/dist/src/lib/run-status.d.ts +19 -0
- package/dist/src/lib/run-status.generated.d.ts +39 -0
- package/dist/src/lib/run-status.generated.js +66 -0
- package/dist/src/lib/run-status.generated.js.map +1 -0
- package/dist/src/lib/run-status.js +19 -0
- package/dist/src/lib/run-status.js.map +1 -0
- package/dist/src/lib/server-text-normalization.d.ts +51 -0
- package/dist/src/lib/server-text-normalization.js +90 -0
- package/dist/src/lib/server-text-normalization.js.map +1 -0
- package/dist/src/lib/server-url.d.ts +22 -0
- package/dist/src/lib/server-url.js +33 -0
- package/dist/src/lib/server-url.js.map +1 -0
- package/dist/src/lib/signing-secret-status.d.ts +81 -0
- package/dist/src/lib/signing-secret-status.js +116 -0
- package/dist/src/lib/signing-secret-status.js.map +1 -0
- package/dist/src/lib/skill-installer.d.ts +71 -0
- package/dist/src/lib/skill-installer.js +441 -0
- package/dist/src/lib/skill-installer.js.map +1 -0
- package/dist/src/lib/snapshot-audit-source.d.ts +45 -0
- package/dist/src/lib/snapshot-audit-source.js +58 -0
- package/dist/src/lib/snapshot-audit-source.js.map +1 -0
- package/dist/src/lib/snapshot-audit-store.d.ts +52 -0
- package/dist/src/lib/snapshot-audit-store.js +196 -0
- package/dist/src/lib/snapshot-audit-store.js.map +1 -0
- package/dist/src/lib/snapshot-audit.d.ts +207 -0
- package/dist/src/lib/snapshot-audit.js +431 -0
- package/dist/src/lib/snapshot-audit.js.map +1 -0
- package/dist/src/lib/snapshot-build-rows.d.ts +60 -0
- package/dist/src/lib/snapshot-build-rows.js +87 -0
- package/dist/src/lib/snapshot-build-rows.js.map +1 -0
- package/dist/src/lib/snapshot-build.d.ts +50 -0
- package/dist/src/lib/snapshot-build.js +111 -0
- package/dist/src/lib/snapshot-build.js.map +1 -0
- package/dist/src/lib/snapshot-manifest-layout.d.ts +61 -0
- package/dist/src/lib/snapshot-manifest-layout.js +70 -0
- package/dist/src/lib/snapshot-manifest-layout.js.map +1 -0
- package/dist/src/lib/snapshots.d.ts +98 -0
- package/dist/src/lib/snapshots.js +294 -0
- package/dist/src/lib/snapshots.js.map +1 -0
- package/dist/src/lib/step-run-table.d.ts +43 -0
- package/dist/src/lib/step-run-table.js +129 -0
- package/dist/src/lib/step-run-table.js.map +1 -0
- package/dist/src/lib/storage-pending-retry.d.ts +26 -0
- package/dist/src/lib/storage-pending-retry.js +42 -0
- package/dist/src/lib/storage-pending-retry.js.map +1 -0
- package/dist/src/lib/swift-codegen/agentGenerator.d.ts +42 -0
- package/dist/src/lib/swift-codegen/agentGenerator.js +118 -0
- package/dist/src/lib/swift-codegen/agentGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/banners.d.ts +24 -0
- package/dist/src/lib/swift-codegen/banners.js +25 -0
- package/dist/src/lib/swift-codegen/banners.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js +926 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
- package/dist/src/lib/swift-codegen/functionGenerator.d.ts +139 -0
- package/dist/src/lib/swift-codegen/functionGenerator.js +462 -0
- package/dist/src/lib/swift-codegen/functionGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/generator.d.ts +100 -0
- package/dist/src/lib/swift-codegen/generator.js +457 -0
- package/dist/src/lib/swift-codegen/generator.js.map +1 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +87 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js +661 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
- package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
- package/dist/src/lib/sync-dir-selector.d.ts +21 -0
- package/dist/src/lib/sync-dir-selector.js +30 -0
- package/dist/src/lib/sync-dir-selector.js.map +1 -0
- package/dist/src/lib/sync-paths.d.ts +128 -0
- package/dist/src/lib/sync-paths.js +195 -0
- package/dist/src/lib/sync-paths.js.map +1 -0
- package/dist/src/lib/sync-resource-types.d.ts +563 -0
- package/dist/src/lib/sync-resource-types.js +1073 -0
- package/dist/src/lib/sync-resource-types.js.map +1 -0
- package/dist/src/lib/sync-selectors.d.ts +138 -0
- package/dist/src/lib/sync-selectors.js +289 -0
- package/dist/src/lib/sync-selectors.js.map +1 -0
- package/dist/src/lib/template.d.ts +170 -0
- package/dist/src/lib/template.js +484 -68
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/test-case-file-names.d.ts +40 -0
- package/dist/src/lib/test-case-file-names.js +91 -0
- package/dist/src/lib/test-case-file-names.js.map +1 -0
- package/dist/src/lib/test-case-keys.d.ts +29 -0
- package/dist/src/lib/test-case-keys.js +55 -0
- package/dist/src/lib/test-case-keys.js.map +1 -0
- package/dist/src/lib/test-case-variables.d.ts +29 -0
- package/dist/src/lib/test-case-variables.js +71 -0
- package/dist/src/lib/test-case-variables.js.map +1 -0
- package/dist/src/lib/token-inject.d.ts +56 -0
- package/dist/src/lib/token-inject.js +204 -0
- package/dist/src/lib/token-inject.js.map +1 -0
- package/dist/src/lib/toml-database-config.d.ts +123 -0
- package/dist/src/lib/toml-database-config.js +544 -0
- package/dist/src/lib/toml-database-config.js.map +1 -0
- package/dist/src/lib/toml-metadata-config.d.ts +151 -0
- package/dist/src/lib/toml-metadata-config.js +476 -0
- package/dist/src/lib/toml-metadata-config.js.map +1 -0
- package/dist/src/lib/toml-native-form.d.ts +46 -0
- package/dist/src/lib/toml-native-form.js +78 -0
- package/dist/src/lib/toml-native-form.js.map +1 -0
- package/dist/src/lib/toml-params-validator.d.ts +129 -0
- package/dist/src/lib/toml-params-validator.js +298 -0
- package/dist/src/lib/toml-params-validator.js.map +1 -0
- package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
- package/dist/src/lib/toml-scalar-edit.js +283 -0
- package/dist/src/lib/toml-scalar-edit.js.map +1 -0
- package/dist/src/lib/user-selector.d.ts +24 -0
- package/dist/src/lib/user-selector.js +33 -0
- package/dist/src/lib/user-selector.js.map +1 -0
- package/dist/src/lib/version-check.d.ts +35 -0
- package/dist/src/lib/version-check.js +241 -0
- package/dist/src/lib/version-check.js.map +1 -0
- package/dist/src/lib/watch.d.ts +121 -0
- package/dist/src/lib/watch.js +169 -0
- package/dist/src/lib/watch.js.map +1 -0
- package/dist/src/lib/web-url.d.ts +40 -0
- package/dist/src/lib/web-url.js +76 -0
- package/dist/src/lib/web-url.js.map +1 -0
- package/dist/src/lib/webhook-deliver.d.ts +209 -0
- package/dist/src/lib/webhook-deliver.js +519 -0
- package/dist/src/lib/webhook-deliver.js.map +1 -0
- package/dist/src/lib/workflow-apply.d.ts +110 -0
- package/dist/src/lib/workflow-apply.js +164 -0
- package/dist/src/lib/workflow-apply.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
- package/dist/src/lib/workflow-codegen/generator.js +361 -0
- package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
- package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
- package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
- package/dist/src/lib/workflow-codegen/naming.js +81 -0
- package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
- package/dist/src/lib/workflow-config-apply.d.ts +70 -0
- package/dist/src/lib/workflow-config-apply.js +137 -0
- package/dist/src/lib/workflow-config-apply.js.map +1 -0
- package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
- package/dist/src/lib/workflow-config-sidecar.js +96 -0
- package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
- package/dist/src/lib/workflow-defaults.d.ts +29 -0
- package/dist/src/lib/workflow-defaults.js +41 -0
- package/dist/src/lib/workflow-defaults.js.map +1 -0
- package/dist/src/lib/workflow-fragments.d.ts +64 -0
- package/dist/src/lib/workflow-fragments.js +342 -0
- package/dist/src/lib/workflow-fragments.js.map +1 -0
- package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
- package/dist/src/lib/workflow-include-preserve.js +286 -0
- package/dist/src/lib/workflow-include-preserve.js.map +1 -0
- package/dist/src/lib/workflow-payload.d.ts +98 -0
- package/dist/src/lib/workflow-payload.js +178 -0
- package/dist/src/lib/workflow-payload.js.map +1 -0
- package/dist/src/lib/workflow-toml-validator.d.ts +211 -0
- package/dist/src/lib/workflow-toml-validator.js +770 -0
- package/dist/src/lib/workflow-toml-validator.js.map +1 -0
- package/dist/src/lib/workflow-usage.d.ts +196 -0
- package/dist/src/lib/workflow-usage.js +310 -0
- package/dist/src/lib/workflow-usage.js.map +1 -0
- package/dist/src/types/index.d.ts +591 -0
- package/dist/src/validators.d.ts +65 -0
- package/dist/src/validators.js +64 -0
- package/dist/src/validators.js.map +1 -0
- package/package.json +34 -9
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deliver a signed preview through a webhook's real receive path (#3321).
|
|
3
|
+
*
|
|
4
|
+
* `primitive webhooks test --deliver` adds no server dispatch surface. It
|
|
5
|
+
* composes two capabilities that already exist:
|
|
6
|
+
*
|
|
7
|
+
* 1. the admin-gated preview `POST /admin/api/apps/{appId}/webhooks/{id}/test`,
|
|
8
|
+
* which signs a payload with the same rule the receiver verifies with, and
|
|
9
|
+
* 2. the public receive endpoint `POST /app/{appId}/webhook/{webhookKey}`,
|
|
10
|
+
* the unauthenticated path a provider posts to.
|
|
11
|
+
*
|
|
12
|
+
* So the delivery is a real delivery: the body cap, the availability check, the
|
|
13
|
+
* IP allowlist, signature verification, handshake rules, deduplication, the run
|
|
14
|
+
* row and the delivery log all run exactly as they do for a provider. Nobody
|
|
15
|
+
* gains authority they did not have — only someone who can already administer
|
|
16
|
+
* the app can obtain a signature — and nothing bypasses verification, because
|
|
17
|
+
* the signature is checked for real at the receive endpoint.
|
|
18
|
+
*
|
|
19
|
+
* ── What this module owes the caller ──────────────────────────────────────
|
|
20
|
+
*
|
|
21
|
+
* An honest report. The receive endpoint answers `{received: true}` and
|
|
22
|
+
* discloses nothing else (it must not: it is unauthenticated), so "did the
|
|
23
|
+
* function actually run?" is answered from the delivery log and the runs
|
|
24
|
+
* surface, and only positive evidence may be reported as a dispatch:
|
|
25
|
+
*
|
|
26
|
+
* - **Correlation is one rule.** A delivery-log row NEWER than a baseline
|
|
27
|
+
* snapshot taken before the POST, whose `dedupKey` equals the one the
|
|
28
|
+
* preview returned. That key hashes the whole signed payload including its
|
|
29
|
+
* timestamp prefix, so it is unique to this request rather than a
|
|
30
|
+
* heuristic; the baseline is what keeps a replay of the same signed bytes
|
|
31
|
+
* from being attributed here. There is no body-hash fallback: identical
|
|
32
|
+
* bodies collide, and attributing another request's row is worse than
|
|
33
|
+
* declining to.
|
|
34
|
+
* - **The key names dispatched deliveries only.** The receiver writes
|
|
35
|
+
* `dedupKey` on an `accepted` row that really dispatched and OMITS it
|
|
36
|
+
* everywhere else — on a handshake row, a duplicate, a rejection, a 202
|
|
37
|
+
* non-dispatch, and on the `accepted` row of a delivery whose target was
|
|
38
|
+
* not found (`webhook-receiver.ts`, `logEvent`). That omission is what
|
|
39
|
+
* keeps the `eventsByDedupKey` index holding exactly the deliveries that
|
|
40
|
+
* may suppress a later one, so it is load-bearing, not incidental. The
|
|
41
|
+
* consequence here: a delivery the receiver did not dispatch has no row
|
|
42
|
+
* this correlator can reach, and is reported as unconfirmed — with what
|
|
43
|
+
* the absence of the key means — rather than named from a row.
|
|
44
|
+
* - **A run is confirmed, not assumed.** An `accepted` row names a run id
|
|
45
|
+
* before the run finishes, and the legacy workflow branch keeps its
|
|
46
|
+
* `accepted` row and its HTTP 200 even when the launch is skipped or
|
|
47
|
+
* throws. So the named run is looked up on the authenticated runs surface
|
|
48
|
+
* before dispatch is claimed.
|
|
49
|
+
* - **Everything else is named for what it was** — a suppressed replay, a
|
|
50
|
+
* 410/403/401 refusal, each of which the receive endpoint reports for
|
|
51
|
+
* itself — or reported as "dispatch unconfirmed", which is where a
|
|
52
|
+
* handshake short-circuit (it can legally answer 200 `{received:true}`
|
|
53
|
+
* before any dispatch) and a 202 non-dispatch land, since neither records
|
|
54
|
+
* a correlatable row. Only a confirmed dispatch exits `0`.
|
|
55
|
+
*/
|
|
56
|
+
import { fetchWithTLS } from "./fetch.js";
|
|
57
|
+
/** ~5 attempts over ~4 s: the accepted row is written before execution ends. */
|
|
58
|
+
export const DELIVER_POLL_ATTEMPTS = 5;
|
|
59
|
+
export const DELIVER_POLL_INTERVAL_MS = 800;
|
|
60
|
+
/** Cursor pages walked per attempt, so a busy log cannot outrun the poll. */
|
|
61
|
+
export const DELIVER_PAGE_CAP = 10;
|
|
62
|
+
export const DELIVER_PAGE_LIMIT = 25;
|
|
63
|
+
/** The same bound on the runs surface, where runs start while this one waits. */
|
|
64
|
+
export const DELIVER_RUN_PAGE_CAP = 5;
|
|
65
|
+
export const DELIVER_RUN_PAGE_LIMIT = 50;
|
|
66
|
+
/** Comfortably above the sync-function ceiling. */
|
|
67
|
+
export const DELIVER_TIMEOUT_MS = 60_000;
|
|
68
|
+
/**
|
|
69
|
+
* What the user is told before a delivery happens, in the terminal rather than
|
|
70
|
+
* only in the guide: a diagnostic that mutates the app has to say so where the
|
|
71
|
+
* user is looking (criterion 4).
|
|
72
|
+
*/
|
|
73
|
+
export function deliveryNotice(scheme) {
|
|
74
|
+
const lines = [
|
|
75
|
+
"This is a real delivery: the signed body is posted to the webhook's " +
|
|
76
|
+
"receive endpoint, a real event row is written to the delivery log, and " +
|
|
77
|
+
"the signed body's dedup key is spent — delivering these exact bytes " +
|
|
78
|
+
"again is suppressed as a replay.",
|
|
79
|
+
];
|
|
80
|
+
if (scheme === "github") {
|
|
81
|
+
lines.push("On the 'github' scheme dedup entries never expire, so this body can " +
|
|
82
|
+
"never be delivered to this webhook again. Vary the payload between " +
|
|
83
|
+
"test deliveries.");
|
|
84
|
+
}
|
|
85
|
+
return lines;
|
|
86
|
+
}
|
|
87
|
+
const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
88
|
+
/**
|
|
89
|
+
* The one correlation rule: the newest row above `baselineEventId` whose
|
|
90
|
+
* `dedupKey` equals this preview's.
|
|
91
|
+
*
|
|
92
|
+
* The walk is newest-first and follows `nextCursor`, stopping at the baseline
|
|
93
|
+
* row (every row below it predates this delivery) or at `pageCap`. A null
|
|
94
|
+
* baseline means the log was empty when the snapshot was taken, so every row
|
|
95
|
+
* walked is a candidate.
|
|
96
|
+
*/
|
|
97
|
+
export async function findDeliveryEvent(input) {
|
|
98
|
+
const pageCap = input.pageCap ?? DELIVER_PAGE_CAP;
|
|
99
|
+
const pageLimit = input.pageLimit ?? DELIVER_PAGE_LIMIT;
|
|
100
|
+
let cursor;
|
|
101
|
+
for (let page = 0; page < pageCap; page++) {
|
|
102
|
+
const result = await input.client.listWebhookEvents(input.appId, input.webhookId, { limit: pageLimit, ...(cursor ? { cursor } : {}) });
|
|
103
|
+
for (const row of result.items || []) {
|
|
104
|
+
if (input.baselineEventId && row.eventId === input.baselineEventId) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
if (row.dedupKey && row.dedupKey === input.dedupKey)
|
|
108
|
+
return row;
|
|
109
|
+
}
|
|
110
|
+
if (!result.nextCursor)
|
|
111
|
+
return null;
|
|
112
|
+
cursor = result.nextCursor;
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Poll `findDeliveryEvent` within the budget — the row lands asynchronously.
|
|
118
|
+
*
|
|
119
|
+
* A failed read is retried rather than thrown: the delivery has already
|
|
120
|
+
* happened by the time this runs, so a network blip or an expired credential
|
|
121
|
+
* on the way to the log must not abort the command and lose the report of what
|
|
122
|
+
* was delivered. The last error is returned alongside an unresolved row so the
|
|
123
|
+
* caller can say why it is unconfirmed.
|
|
124
|
+
*/
|
|
125
|
+
async function pollForDeliveryEvent(input) {
|
|
126
|
+
let error = null;
|
|
127
|
+
for (let attempt = 0; attempt < input.attempts; attempt++) {
|
|
128
|
+
try {
|
|
129
|
+
const found = await findDeliveryEvent(input);
|
|
130
|
+
if (found)
|
|
131
|
+
return { event: found, error: null };
|
|
132
|
+
error = null;
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
error = messageOf(err);
|
|
136
|
+
}
|
|
137
|
+
if (attempt < input.attempts - 1)
|
|
138
|
+
await input.sleep(input.intervalMs);
|
|
139
|
+
}
|
|
140
|
+
return { event: null, error };
|
|
141
|
+
}
|
|
142
|
+
function messageOf(err) {
|
|
143
|
+
return err?.message ? String(err.message) : String(err);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Confirm the run an `accepted` row names really exists.
|
|
147
|
+
*
|
|
148
|
+
* A function-owned row is confirmed on `functions/{id}/runs`, the only surface
|
|
149
|
+
* that lists a function run. A legacy row is confirmed on the workflow runs
|
|
150
|
+
* surface, which needs the webhook's `workflowId` — a legacy row is visible to
|
|
151
|
+
* `webhooks get`, so that read is available (a function-owned row's is not,
|
|
152
|
+
* which is why the preview publishes `functionId`).
|
|
153
|
+
*/
|
|
154
|
+
async function confirmRun(input) {
|
|
155
|
+
const { client, appId, event } = input;
|
|
156
|
+
const runId = (event.workflowRunId || event.workflowRunKey || null);
|
|
157
|
+
if (!runId) {
|
|
158
|
+
return {
|
|
159
|
+
runId: null,
|
|
160
|
+
confirmed: false,
|
|
161
|
+
surface: null,
|
|
162
|
+
reason: "the accepted delivery row names no run",
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const matches = (row) => row?.runId === runId ||
|
|
166
|
+
row?.runKey === runId ||
|
|
167
|
+
(event.workflowRunKey && row?.runKey === event.workflowRunKey) ||
|
|
168
|
+
(event.workflowRunId && row?.runId === event.workflowRunId);
|
|
169
|
+
if (input.functionId) {
|
|
170
|
+
try {
|
|
171
|
+
const found = await findRun((params) => client.listFunctionRuns(appId, input.functionId, params), matches, input);
|
|
172
|
+
return {
|
|
173
|
+
runId,
|
|
174
|
+
confirmed: found,
|
|
175
|
+
surface: "function",
|
|
176
|
+
reason: found ? null : `run ${runId} is not on the function's runs`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return {
|
|
181
|
+
runId,
|
|
182
|
+
confirmed: false,
|
|
183
|
+
surface: "function",
|
|
184
|
+
reason: `the runs surface could not be read: ${messageOf(err)}`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const webhook = await client.getWebhook(appId, input.webhookId);
|
|
190
|
+
const workflowId = webhook?.workflowId;
|
|
191
|
+
if (!workflowId) {
|
|
192
|
+
return {
|
|
193
|
+
runId,
|
|
194
|
+
confirmed: false,
|
|
195
|
+
surface: null,
|
|
196
|
+
reason: "the webhook names no workflow to confirm the run against",
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const found = await findRun((params) => client.listWorkflowRuns(appId, workflowId, params), matches, input);
|
|
200
|
+
return {
|
|
201
|
+
runId,
|
|
202
|
+
confirmed: found,
|
|
203
|
+
surface: "workflow",
|
|
204
|
+
reason: found ? null : `run ${runId} is not on the workflow's runs`,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
return {
|
|
209
|
+
runId,
|
|
210
|
+
confirmed: false,
|
|
211
|
+
surface: "workflow",
|
|
212
|
+
reason: `the runs surface could not be read: ${messageOf(err)}`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Walk a runs listing, newest first, for the run the delivery row names.
|
|
218
|
+
*
|
|
219
|
+
* Both runs surfaces are cursor-paginated and newest-first, and a synchronous
|
|
220
|
+
* delivery holds this flow open while other runs start, so the newest page is
|
|
221
|
+
* not a safe place to stop looking: enough newer runs push this one off it and
|
|
222
|
+
* a real, inspectable run reads as unconfirmed. Following the cursor within a
|
|
223
|
+
* bounded page budget is the same shape the delivery log walk uses, and for the
|
|
224
|
+
* same reason.
|
|
225
|
+
*/
|
|
226
|
+
async function findRun(list, matches, bounds) {
|
|
227
|
+
const pageCap = bounds.runPageCap ?? DELIVER_RUN_PAGE_CAP;
|
|
228
|
+
const pageLimit = bounds.runPageLimit ?? DELIVER_RUN_PAGE_LIMIT;
|
|
229
|
+
let cursor;
|
|
230
|
+
for (let page = 0; page < pageCap; page++) {
|
|
231
|
+
const result = await list({
|
|
232
|
+
limit: pageLimit,
|
|
233
|
+
...(cursor ? { cursor } : {}),
|
|
234
|
+
});
|
|
235
|
+
if ((result.items || []).some(matches))
|
|
236
|
+
return true;
|
|
237
|
+
if (!result.nextCursor)
|
|
238
|
+
return false;
|
|
239
|
+
cursor = result.nextCursor;
|
|
240
|
+
}
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
const eventsHint = (webhookId) => `Read the delivery log with \`primitive webhooks events ${webhookId}\`.`;
|
|
244
|
+
/**
|
|
245
|
+
* The transport the delivery goes out on.
|
|
246
|
+
*
|
|
247
|
+
* The same one every other CLI request uses: a local dev server may speak
|
|
248
|
+
* HTTPS on localhost with a self-signed certificate, which `fetchWithTLS`
|
|
249
|
+
* accepts and bare `fetch` rejects. Sending the delivery on a different
|
|
250
|
+
* transport from the preview would fail exactly where this command is most
|
|
251
|
+
* used, and report it as "sent, dispatch unconfirmed" — the request never left.
|
|
252
|
+
* The receive endpoint is unauthenticated, so nothing else about the request
|
|
253
|
+
* changes: only the preview's bytes and its signature headers go out.
|
|
254
|
+
*/
|
|
255
|
+
const deliveryFetch = (url, init) => fetchWithTLS(url, init);
|
|
256
|
+
/** POST the preview's bytes to the receive endpoint, verbatim. */
|
|
257
|
+
async function postDelivery(input) {
|
|
258
|
+
const attempt = {
|
|
259
|
+
url: input.url,
|
|
260
|
+
sent: true,
|
|
261
|
+
status: null,
|
|
262
|
+
body: null,
|
|
263
|
+
duplicate: false,
|
|
264
|
+
error: null,
|
|
265
|
+
};
|
|
266
|
+
const controller = typeof AbortController === "function" ? new AbortController() : null;
|
|
267
|
+
// Two bounds, because the localhost-HTTPS transport issues its own request
|
|
268
|
+
// and honours no abort signal: the signal stops a `fetch`, and losing the
|
|
269
|
+
// race stops the wait either way.
|
|
270
|
+
let timer = null;
|
|
271
|
+
const expiry = new Promise((_, reject) => {
|
|
272
|
+
timer = setTimeout(() => {
|
|
273
|
+
controller?.abort();
|
|
274
|
+
reject(new Error(`no response within ${input.timeoutMs}ms`));
|
|
275
|
+
}, input.timeoutMs);
|
|
276
|
+
});
|
|
277
|
+
try {
|
|
278
|
+
const response = await Promise.race([
|
|
279
|
+
input.fetchImpl(input.url, {
|
|
280
|
+
method: "POST",
|
|
281
|
+
headers: { ...input.preview.signatureHeaders },
|
|
282
|
+
body: input.preview.rawBody,
|
|
283
|
+
...(controller ? { signal: controller.signal } : {}),
|
|
284
|
+
}),
|
|
285
|
+
expiry,
|
|
286
|
+
]);
|
|
287
|
+
attempt.status = response?.status ?? null;
|
|
288
|
+
const text = typeof response?.text === "function" ? await response.text() : "";
|
|
289
|
+
try {
|
|
290
|
+
attempt.body = text ? JSON.parse(text) : null;
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
attempt.body = text || null;
|
|
294
|
+
}
|
|
295
|
+
attempt.duplicate = attempt.body?.duplicate === true;
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
attempt.error = messageOf(err);
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
if (timer)
|
|
302
|
+
clearTimeout(timer);
|
|
303
|
+
}
|
|
304
|
+
return attempt;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Preview, deliver, correlate, confirm — the whole flow, as one result a caller
|
|
308
|
+
* renders however it likes.
|
|
309
|
+
*/
|
|
310
|
+
export async function deliverWebhookTest(input, deps) {
|
|
311
|
+
const client = deps.client;
|
|
312
|
+
const fetchImpl = deps.fetchImpl ?? deliveryFetch;
|
|
313
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
314
|
+
const base = {
|
|
315
|
+
outcome: "unconfirmed",
|
|
316
|
+
headline: "",
|
|
317
|
+
details: [],
|
|
318
|
+
notice: [],
|
|
319
|
+
preview: null,
|
|
320
|
+
refusal: null,
|
|
321
|
+
delivery: null,
|
|
322
|
+
event: null,
|
|
323
|
+
run: null,
|
|
324
|
+
};
|
|
325
|
+
// 1. The correlation baseline, BEFORE anything is delivered. Its job is to
|
|
326
|
+
// scope the match to rows this delivery could have written, so a row left
|
|
327
|
+
// by an earlier delivery of the same signed bytes is never claimed here.
|
|
328
|
+
// Never the client clock: server and client clocks are not synchronized.
|
|
329
|
+
let baselineEventId = null;
|
|
330
|
+
try {
|
|
331
|
+
const page = await client.listWebhookEvents(input.appId, input.webhookId, {
|
|
332
|
+
limit: 1,
|
|
333
|
+
});
|
|
334
|
+
baselineEventId = page.items?.[0]?.eventId ?? null;
|
|
335
|
+
}
|
|
336
|
+
catch (err) {
|
|
337
|
+
return {
|
|
338
|
+
...base,
|
|
339
|
+
outcome: "refused",
|
|
340
|
+
refusal: { message: messageOf(err), code: err?.code ?? null },
|
|
341
|
+
headline: "The delivery log could not be read, so a delivery could not be " +
|
|
342
|
+
`correlated to its event row. Nothing was delivered: ${messageOf(err)}`,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
// 2. The preview, unchanged — every existing refusal propagates as it does
|
|
346
|
+
// without `--deliver`, and refuses before anything is delivered.
|
|
347
|
+
let preview;
|
|
348
|
+
try {
|
|
349
|
+
preview = (await client.testWebhook(input.appId, input.webhookId, input.payload ?? {}));
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
return {
|
|
353
|
+
...base,
|
|
354
|
+
outcome: "refused",
|
|
355
|
+
refusal: { message: messageOf(err), code: err?.code ?? null },
|
|
356
|
+
headline: `The preview was refused, so nothing was delivered: ${messageOf(err)}`,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
// 3. The receive path. `webhooks get` answers 404 for a function-owned
|
|
360
|
+
// trigger row, so the preview is normally where the key comes from; the
|
|
361
|
+
// fallback is for a server that predates #3321.
|
|
362
|
+
let webhookKey = preview.webhookKey ?? null;
|
|
363
|
+
if (!webhookKey) {
|
|
364
|
+
try {
|
|
365
|
+
const webhook = await client.getWebhook(input.appId, input.webhookId);
|
|
366
|
+
webhookKey = webhook?.webhookKey ?? null;
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
webhookKey = null;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (!webhookKey) {
|
|
373
|
+
return {
|
|
374
|
+
...base,
|
|
375
|
+
preview,
|
|
376
|
+
outcome: "refused",
|
|
377
|
+
refusal: {
|
|
378
|
+
message: "this server's webhook preview does not report the receive path " +
|
|
379
|
+
"for this webhook, so --deliver cannot address it — upgrade the " +
|
|
380
|
+
"platform, or post the signed body from `--json` to " +
|
|
381
|
+
"`/app/{appId}/webhook/{webhookKey}` yourself",
|
|
382
|
+
code: "WEBHOOK_DELIVER_UNSUPPORTED",
|
|
383
|
+
},
|
|
384
|
+
headline: "Nothing was delivered: this server does not report the webhook's " +
|
|
385
|
+
"receive path, so --deliver cannot address it. Upgrade the platform.",
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
const notice = deliveryNotice(preview.verificationScheme);
|
|
389
|
+
deps.onBeforeDeliver?.(notice);
|
|
390
|
+
const url = `${input.serverUrl.replace(/\/$/, "")}/app/${input.appId}/webhook/${webhookKey}`;
|
|
391
|
+
const delivery = await postDelivery({
|
|
392
|
+
url,
|
|
393
|
+
preview,
|
|
394
|
+
fetchImpl,
|
|
395
|
+
timeoutMs: deps.timeoutMs ?? DELIVER_TIMEOUT_MS,
|
|
396
|
+
});
|
|
397
|
+
const resolved = { ...base, notice, preview, delivery };
|
|
398
|
+
// 4. The refusals the receive path reports for itself. Each is positive
|
|
399
|
+
// evidence that nothing was dispatched, so none of them needs the log.
|
|
400
|
+
const refusalHeadline = (message, details = []) => ({
|
|
401
|
+
...resolved,
|
|
402
|
+
outcome: "refused",
|
|
403
|
+
headline: message,
|
|
404
|
+
details,
|
|
405
|
+
});
|
|
406
|
+
if (delivery.status === 410) {
|
|
407
|
+
return refusalHeadline("The receive endpoint refused the delivery: this webhook is not in " +
|
|
408
|
+
"service (410), so nothing ran.", [
|
|
409
|
+
`Put it back in service with \`primitive webhooks enable ${input.webhookId}\`, ` +
|
|
410
|
+
"or, for a function's trigger, re-push its config.",
|
|
411
|
+
]);
|
|
412
|
+
}
|
|
413
|
+
if (delivery.status === 403) {
|
|
414
|
+
return refusalHeadline("The receive endpoint refused the delivery (403): this client's IP is " +
|
|
415
|
+
"not on the webhook's IP allowlist, so nothing ran.");
|
|
416
|
+
}
|
|
417
|
+
if (delivery.status === 401) {
|
|
418
|
+
return refusalHeadline("The receive endpoint rejected the delivery's signature (401), so " +
|
|
419
|
+
"nothing ran.", [eventsHint(input.webhookId)]);
|
|
420
|
+
}
|
|
421
|
+
if (delivery.duplicate) {
|
|
422
|
+
return refusalHeadline("The delivery was suppressed as a replay (duplicate): these signed " +
|
|
423
|
+
"bytes were delivered to this webhook before, so nothing ran.", preview.verificationScheme === "github"
|
|
424
|
+
? [
|
|
425
|
+
"On the 'github' scheme dedup entries never expire, so this body " +
|
|
426
|
+
"can never be delivered to this webhook again — vary the payload.",
|
|
427
|
+
eventsHint(input.webhookId),
|
|
428
|
+
]
|
|
429
|
+
: [eventsHint(input.webhookId)]);
|
|
430
|
+
}
|
|
431
|
+
// 5. Correlate. One rule, and it needs the preview's key: scheme `none`
|
|
432
|
+
// derives one only from a caller-supplied `X-Webhook-Event-Id`, so a
|
|
433
|
+
// `none` delivery is reported uncorrelated rather than guessed at.
|
|
434
|
+
const unconfirmed = (reason, details = []) => ({
|
|
435
|
+
...resolved,
|
|
436
|
+
outcome: "unconfirmed",
|
|
437
|
+
headline: `The delivery was sent, but dispatch is unconfirmed: ${reason}`,
|
|
438
|
+
details: [...details, eventsHint(input.webhookId)],
|
|
439
|
+
});
|
|
440
|
+
const httpSummary = delivery.error
|
|
441
|
+
? `the request was sent but no response was observed (${delivery.error})`
|
|
442
|
+
: `the receive endpoint answered ${delivery.status}`;
|
|
443
|
+
if (!preview.dedupKey) {
|
|
444
|
+
return unconfirmed(`the '${preview.verificationScheme}' scheme derives no dedup key, so ` +
|
|
445
|
+
`this delivery's event row cannot be identified — ${httpSummary}.`);
|
|
446
|
+
}
|
|
447
|
+
const { event, error: logError } = await pollForDeliveryEvent({
|
|
448
|
+
client,
|
|
449
|
+
appId: input.appId,
|
|
450
|
+
webhookId: input.webhookId,
|
|
451
|
+
dedupKey: preview.dedupKey,
|
|
452
|
+
baselineEventId,
|
|
453
|
+
attempts: deps.pollAttempts ?? DELIVER_POLL_ATTEMPTS,
|
|
454
|
+
intervalMs: deps.pollIntervalMs ?? DELIVER_POLL_INTERVAL_MS,
|
|
455
|
+
pageCap: deps.pageCap ?? DELIVER_PAGE_CAP,
|
|
456
|
+
pageLimit: deps.pageLimit ?? DELIVER_PAGE_LIMIT,
|
|
457
|
+
sleep,
|
|
458
|
+
});
|
|
459
|
+
if (!event) {
|
|
460
|
+
// The read itself failed — say that, rather than implying the receiver
|
|
461
|
+
// recorded nothing.
|
|
462
|
+
if (logError) {
|
|
463
|
+
return unconfirmed(`the delivery log could not be read (${logError}) — ${httpSummary}.`);
|
|
464
|
+
}
|
|
465
|
+
// The log was read and holds no row carrying this key. That is more than
|
|
466
|
+
// "not found": the receiver records the key ONLY on a delivery it accepted
|
|
467
|
+
// and dispatched, so this delivery was not dispatched — unless its row has
|
|
468
|
+
// yet to become visible, which is the one thing this cannot rule out.
|
|
469
|
+
return unconfirmed(`no dispatched-delivery row carrying this request's dedup key became ` +
|
|
470
|
+
`visible — ${httpSummary}.`, [
|
|
471
|
+
"The receiver records that key only on a delivery it accepted and " +
|
|
472
|
+
"dispatched, so this one was most likely short-circuited by a " +
|
|
473
|
+
"handshake rule, suppressed as a replay, or acknowledged without " +
|
|
474
|
+
"dispatch (a 202 with its reason). The delivery log names which.",
|
|
475
|
+
]);
|
|
476
|
+
}
|
|
477
|
+
resolved.event = event;
|
|
478
|
+
// 6. Claim a dispatch only with a run behind it. A row carrying the key is
|
|
479
|
+
// an `accepted`, dispatched row by the receiver's own contract; the guard
|
|
480
|
+
// is here so a server that ever widened the key reads as unconfirmed
|
|
481
|
+
// rather than as a dispatch nobody checked.
|
|
482
|
+
if (event.status !== "accepted") {
|
|
483
|
+
const reason = event.rejectionReason || event.status || "no reason recorded";
|
|
484
|
+
return unconfirmed(`the correlated row (event ${event.eventId}) is recorded as ` +
|
|
485
|
+
`'${event.status}', not as a dispatched delivery: ${reason}.`);
|
|
486
|
+
}
|
|
487
|
+
const run = await confirmRun({
|
|
488
|
+
client,
|
|
489
|
+
appId: input.appId,
|
|
490
|
+
webhookId: input.webhookId,
|
|
491
|
+
functionId: preview.functionId,
|
|
492
|
+
event,
|
|
493
|
+
...(deps.runPageCap !== undefined ? { runPageCap: deps.runPageCap } : {}),
|
|
494
|
+
...(deps.runPageLimit !== undefined
|
|
495
|
+
? { runPageLimit: deps.runPageLimit }
|
|
496
|
+
: {}),
|
|
497
|
+
});
|
|
498
|
+
resolved.run = run;
|
|
499
|
+
if (!run.confirmed) {
|
|
500
|
+
return {
|
|
501
|
+
...resolved,
|
|
502
|
+
outcome: "unconfirmed",
|
|
503
|
+
headline: `The delivery was accepted (event ${event.eventId}), but dispatch is ` +
|
|
504
|
+
`unconfirmed: ${run.reason}.`,
|
|
505
|
+
details: [eventsHint(input.webhookId)],
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
const inspect = preview.functionId
|
|
509
|
+
? `Inspect it with \`primitive functions runs ${preview.functionId}\`.`
|
|
510
|
+
: "Inspect it with `primitive workflows runs <workflow-id>`.";
|
|
511
|
+
return {
|
|
512
|
+
...resolved,
|
|
513
|
+
outcome: "dispatched",
|
|
514
|
+
headline: `Delivered through the real webhook path. Event ${event.eventId} ` +
|
|
515
|
+
`dispatched; run ${run.runId} records the outcome.`,
|
|
516
|
+
details: [inspect],
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=webhook-deliver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-deliver.js","sourceRoot":"","sources":["../../../src/lib/webhook-deliver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared "apply a TOML body to an existing workflow" helper.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from the `config push` update-existing path (#1249, Fork 4) so that
|
|
5
|
+
* both `config push` and `workflows update --from-file` push a revised body the
|
|
6
|
+
* same way. A second inlined copy would regress #807: the update is
|
|
7
|
+
* ordering-sensitive and a naive metadata-then-body sequence rejects valid
|
|
8
|
+
* sync-callable edits.
|
|
9
|
+
*
|
|
10
|
+
* Ordering invariant (#807 / codex review, revised by #2743). `syncCallable` is
|
|
11
|
+
* sequenced BY TARGET VALUE, because the two directions have opposite
|
|
12
|
+
* constraints:
|
|
13
|
+
* 1. metadata PATCH — carries `syncCallable: false` when the target is false
|
|
14
|
+
* (the TOML omits the key or sets it to `false`), and NOTHING when the
|
|
15
|
+
* target is true. Enabling here would be validated against the workflow's
|
|
16
|
+
* CURRENTLY-active server steps (`loadCurrentActiveSteps`,
|
|
17
|
+
* src/admin-api.ts), not the steps being pushed in the same call, so it
|
|
18
|
+
* would be rejected on the stale list. Disabling has no such check — the
|
|
19
|
+
* server re-validates steps only when flipping TO true — and it must
|
|
20
|
+
* happen here, because the step-write endpoints
|
|
21
|
+
* (`updateWorkflowDraft` / `updateWorkflowConfig`) reject
|
|
22
|
+
* sync-incompatible steps while the STORED flag is still true. Clearing
|
|
23
|
+
* the flag first is what lets a single push both drop `syncCallable` and
|
|
24
|
+
* introduce an incompatible step.
|
|
25
|
+
* 2. body write — steps to the active config (config-model) or the legacy
|
|
26
|
+
* draft slot (no active config).
|
|
27
|
+
* 3. a SECOND `syncCallable` PATCH, for ENABLING only — issued AFTER the new
|
|
28
|
+
* steps are active, so it validates against the new (compatible) steps.
|
|
29
|
+
* Skipped when the first PATCH's response already reports the flag on;
|
|
30
|
+
* sent unconditionally when that response is unreadable (fail closed
|
|
31
|
+
* toward convergence).
|
|
32
|
+
*
|
|
33
|
+
* #2743 also removed the "only send it when the TOML carries the key"
|
|
34
|
+
* no-clobber rule: the file fully describes the workflow, so deleting
|
|
35
|
+
* `syncCallable = true` from it disables the flag in one push.
|
|
36
|
+
*/
|
|
37
|
+
import type { ApiClient } from "./api-client.js";
|
|
38
|
+
import { safeJsonParse } from "./workflow-payload.js";
|
|
39
|
+
export { safeJsonParse };
|
|
40
|
+
export interface ApplyWorkflowBodyOptions {
|
|
41
|
+
/** Optimistic-concurrency guard for the metadata + syncCallable PATCHes. */
|
|
42
|
+
expectedModifiedAt?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Active config to overwrite in place (config-model workflows). When absent,
|
|
45
|
+
* the body falls back to the legacy draft slot — non-live for config-model
|
|
46
|
+
* workflows, which the server rejects with 409 WORKFLOW_CONFIG_MODEL.
|
|
47
|
+
*/
|
|
48
|
+
activeConfigId?: string;
|
|
49
|
+
/** When true, skip the optimistic-concurrency check (mirrors `--force`). */
|
|
50
|
+
force?: boolean;
|
|
51
|
+
}
|
|
52
|
+
/** The slot label a body gets when the workflow has no active config. */
|
|
53
|
+
export declare const LEGACY_DRAFT_SLOT_LABEL = "draft (legacy)";
|
|
54
|
+
/** What the push knows about the workflow once every write has landed. */
|
|
55
|
+
export interface LegacyDraftSlotState {
|
|
56
|
+
/** The workflow's active configuration once the push finished, if any. */
|
|
57
|
+
activeConfigId?: string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Whether THIS push activated that configuration — the TOML carried a
|
|
60
|
+
* sidecar plus `activeConfigName`, so the authored body is what runs now.
|
|
61
|
+
*/
|
|
62
|
+
activatedByPush?: boolean;
|
|
63
|
+
/** The workflow's latest legacy revision, when it has one. */
|
|
64
|
+
latestRevision?: string | null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The warning a push owes the user when its body landed in the legacy draft
|
|
68
|
+
* slot and is NOT what the workflow runs (#2768).
|
|
69
|
+
*
|
|
70
|
+
* `workflows publish`, the one thing that promoted that slot, is gone, so those
|
|
71
|
+
* steps sit there unread — a silent no-op otherwise, since the push reports
|
|
72
|
+
* success either way.
|
|
73
|
+
*
|
|
74
|
+
* Reading a workflow is not neutral, which is why this takes more than an
|
|
75
|
+
* active config id. `getAppWorkflow` (src/admin-api.ts) auto-migrates a
|
|
76
|
+
* workflow that has NO configurations: it copies the latest revision — or, only
|
|
77
|
+
* when there is none, the draft slot — into a configuration and activates it.
|
|
78
|
+
* `applyWorkflowBody` reads the workflow immediately after writing the draft,
|
|
79
|
+
* so a legacy workflow WITH a published revision comes back carrying a
|
|
80
|
+
* brand-new `activeConfigId` holding the OLD body. Keyed on that id alone, the
|
|
81
|
+
* warning stayed silent for exactly the population it exists for. So:
|
|
82
|
+
*
|
|
83
|
+
* - the push activated a configuration itself (sidecar + `activeConfigName`):
|
|
84
|
+
* silent — that push IS the migration;
|
|
85
|
+
* - an active configuration and no revision behind it: silent — the server
|
|
86
|
+
* adopted the draft this push just wrote, and it is live;
|
|
87
|
+
* - an active configuration with a revision behind it: warn — that revision is
|
|
88
|
+
* what runs, not the pushed steps;
|
|
89
|
+
* - no active configuration at all: warn, and name the TOML migration.
|
|
90
|
+
*
|
|
91
|
+
* Exported for testability — the end-to-end path needs a workflow that can no
|
|
92
|
+
* longer be created through the API.
|
|
93
|
+
*/
|
|
94
|
+
export declare function legacyDraftSlotWarning(updateSlotLabel: string, state: LegacyDraftSlotState): string | null;
|
|
95
|
+
export interface ApplyWorkflowBodyResult {
|
|
96
|
+
/** The freshest workflow `modifiedAt` after all PATCHes (for sync state). */
|
|
97
|
+
latestModifiedAt?: string;
|
|
98
|
+
/** Which slot the steps landed in: "active config" or "draft (legacy)". */
|
|
99
|
+
updateSlotLabel: string;
|
|
100
|
+
/** A fresh `getWorkflow` result so callers can read back configs/state. */
|
|
101
|
+
fullWorkflow: any;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Apply a parsed workflow body (metadata + steps) to an existing workflow,
|
|
105
|
+
* preserving the key/id. `workflow` is the TOML's `[workflow]` table (already
|
|
106
|
+
* merged with any explicit CLI flag overrides by the caller); `steps` is the
|
|
107
|
+
* TOML's `steps` array. The function performs the three-step ordered update
|
|
108
|
+
* and returns the latest `modifiedAt`, the slot label, and a fresh workflow.
|
|
109
|
+
*/
|
|
110
|
+
export declare function applyWorkflowBody(client: ApiClient, appId: string, workflowId: string, workflow: any, steps: any[], opts?: ApplyWorkflowBodyOptions): Promise<ApplyWorkflowBodyResult>;
|