@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.5
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/AGENTSAM.md +11 -0
- package/README.md +15 -9
- package/apps/client-cms-editor/AGENTS.md +12 -0
- package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
- package/apps/client-cms-editor/README.md +72 -0
- package/apps/client-cms-editor/agentsam.app.json +57 -0
- package/apps/client-cms-editor/backend/README.md +5 -0
- package/apps/client-cms-editor/backend/package.json +22 -0
- package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
- package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
- package/apps/client-cms-editor/backend/src/index.ts +6 -0
- package/apps/client-cms-editor/backend/src/model.ts +115 -0
- package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
- package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
- package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
- package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
- package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
- package/apps/client-cms-editor/backend/tsconfig.json +15 -0
- package/apps/client-cms-editor/backend/worker/index.js +34 -0
- package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
- package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
- package/apps/client-cms-editor/frontend/index.html +12 -0
- package/apps/client-cms-editor/frontend/package.json +33 -0
- package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
- package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
- package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
- package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
- package/apps/client-cms-editor/frontend/src/index.ts +8 -0
- package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
- package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
- package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
- package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
- package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
- package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
- package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
- package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
- package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
- package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
- package/apps/client-cms-editor/package-lock.json +3832 -0
- package/apps/client-cms-editor/package.json +23 -0
- package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
- package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
- package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
- package/apps/client-cms-editor/shared/cms/package.json +21 -0
- package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
- package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
- package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
- package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
- package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
- package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
- package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
- package/bin/agentsam-rapid-rust +36 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
- package/docs/MACHINE_INTELLIGENCE.md +120 -0
- package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
- package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
- package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
- package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
- package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
- package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
- package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
- package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
- package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
- package/docs/contracts/capability-install-planner.md +67 -0
- package/docs/contracts/environment-vocabulary.md +195 -0
- package/docs/contracts/google-cloud-oauth-setup.md +199 -0
- package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
- package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
- package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
- package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
- package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
- package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
- package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
- package/docs/plugins.md +2 -2
- package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
- package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
- package/docs/product/README.md +8 -0
- package/docs/rapid-rust-wasm.md +35 -0
- package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
- package/package.json +73 -14
- package/packages/agentsam-brand/README.md +106 -11
- package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
- package/packages/agentsam-brand/package.json +39 -7
- package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
- package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
- package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
- package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
- package/packages/agentsam-brand/src/adapters/memory.js +31 -0
- package/packages/agentsam-brand/src/cli/controller.js +503 -0
- package/packages/agentsam-brand/src/cli/wizard.js +526 -0
- package/packages/agentsam-brand/src/core/capabilities.js +201 -0
- package/packages/agentsam-brand/src/core/derivatives.js +211 -0
- package/packages/agentsam-brand/src/core/errors.js +12 -0
- package/packages/agentsam-brand/src/core/ingest.js +195 -0
- package/packages/agentsam-brand/src/core/inspect.js +109 -0
- package/packages/agentsam-brand/src/core/keys.js +83 -0
- package/packages/agentsam-brand/src/core/naming.js +142 -0
- package/packages/agentsam-brand/src/core/optimize.js +316 -0
- package/packages/agentsam-brand/src/core/pack.js +305 -0
- package/packages/agentsam-brand/src/core/plan.js +276 -0
- package/packages/agentsam-brand/src/core/preview.js +159 -0
- package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
- package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
- package/packages/agentsam-brand/src/core/processors/index.js +148 -0
- package/packages/agentsam-brand/src/core/processors/native.js +82 -0
- package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
- package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
- package/packages/agentsam-brand/src/core/promote.js +288 -0
- package/packages/agentsam-brand/src/core/receipts.js +155 -0
- package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
- package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
- package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
- package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
- package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
- package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
- package/packages/agentsam-brand/src/index.js +193 -36
- package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
- package/packages/agentsam-brand/src/presets/favicon.json +17 -0
- package/packages/agentsam-brand/src/presets/hero.json +12 -0
- package/packages/agentsam-brand/src/presets/index.js +40 -0
- package/packages/agentsam-brand/src/presets/logo.json +12 -0
- package/packages/agentsam-brand/src/presets/model.json +8 -0
- package/packages/agentsam-brand/src/presets/og-image.json +10 -0
- package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
- package/packages/agentsam-brand/src/presets/social-image.json +10 -0
- package/packages/agentsam-brand/src/presets/web-image.json +10 -0
- package/packages/agentsam-contracts/src/artifacts.ts +41 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
- package/packages/agentsam-knowledge/src/providers/index.js +6 -4
- package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
- package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
- package/packages/agentsam-nav/package.json +2 -2
- package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
- package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
- package/packages/agentsam-rapid-rust/README.md +5 -0
- package/packages/agentsam-rapid-rust/src/main.rs +718 -0
- package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
- package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
- package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-repository/src/index.js +1 -0
- package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
- package/packages/agentsam-repository/src/source-types.js +85 -0
- package/packages/agentsam-vault/README.md +96 -0
- package/packages/agentsam-vault/package.json +32 -0
- package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
- package/packages/agentsam-vault/src/contracts/credential.js +132 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
- package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
- package/packages/agentsam-vault/src/index.d.ts +9 -0
- package/packages/agentsam-vault/src/index.js +27 -0
- package/packages/agentsam-vault/src/providers/registry.js +90 -0
- package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
- package/packages/agentsam-workbench/README.md +24 -0
- package/packages/agentsam-workbench/package.json +38 -0
- package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
- package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
- package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
- package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
- package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
- package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
- package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
- package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
- package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
- package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
- package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
- package/packages/agentsam-workbench/src/agent/index.ts +10 -0
- package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
- package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
- package/packages/agentsam-workbench/src/browser/index.ts +1 -0
- package/packages/agentsam-workbench/src/index.ts +6 -0
- package/packages/agentsam-workbench/src/project-control.css +160 -0
- package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
- package/packages/agentsam-workbench/src/projects/index.ts +1 -0
- package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
- package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
- package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
- package/packages/agentsam-workbench/src/shell/index.ts +4 -0
- package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
- package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
- package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
- package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
- package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
- package/packages/agentsam-workbench/tsconfig.json +13 -0
- package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
- package/packages/connectors/cloudflare/package.json +3 -1
- package/packages/connectors/cloudflare/src/api-client.js +279 -0
- package/packages/connectors/cloudflare/src/capabilities.js +585 -0
- package/packages/connectors/cloudflare/src/credential.js +318 -0
- package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
- package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
- package/packages/connectors/cloudflare/src/families/pages.js +151 -0
- package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
- package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
- package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
- package/packages/connectors/cloudflare/src/families/tags.js +124 -0
- package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
- package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
- package/packages/connectors/cloudflare/src/index.js +102 -265
- package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
- package/packages/connectors/cloudflare/src/owner.js +42 -12
- package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
- package/packages/connectors/cloudflare/src/routes.js +309 -144
- package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
- package/packages/connectors/cloudflare/src/vault.js +2 -2
- package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
- package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
- package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
- package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
- package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
- package/packages/identity/README.md +1 -1
- package/packages/identity/backend/README.md +1 -1
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
- package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
- package/packages/identity/package.json +4 -3
- package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
- package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
- package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
- package/packages/identity/src/adapters/sqlite/index.js +4 -1
- package/packages/identity/src/contracts/auth-config.js +28 -8
- package/packages/identity/src/contracts/external-identity.js +1 -1
- package/packages/identity/src/contracts/provider.js +1 -0
- package/packages/identity/src/frontend/auth-portal/README.md +2 -1
- package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
- package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
- package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
- package/packages/identity/src/index.js +16 -0
- package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
- package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
- package/packages/identity/src/migrations/README.md +5 -2
- package/packages/identity/src/oauth/README.md +10 -5
- package/packages/identity/src/oauth/consent-view.js +388 -0
- package/packages/identity/src/oauth/credentials.js +31 -11
- package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
- package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
- package/packages/identity/src/providers/cloudflare/profile.js +49 -14
- package/packages/identity/src/providers/iam/index.js +27 -5
- package/packages/identity/src/server/identity-service.js +31 -2
- package/packages/identity/src/server/worker-router.js +111 -81
- package/packages/identity/tests/auth-config.test.mjs +3 -2
- package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
- package/packages/identity/tests/identity-service.test.mjs +16 -0
- package/packages/identity/tests/native-session-worker.test.mjs +64 -0
- package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
- package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
- package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
- package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
- package/packages/runtime-protocol/src/index.js +154 -0
- package/packages/theme-scenes/README.md +164 -0
- package/packages/theme-scenes/package.json +53 -0
- package/packages/theme-scenes/src/blocks/index.js +30 -0
- package/packages/theme-scenes/src/contracts/index.js +286 -0
- package/packages/theme-scenes/src/demos/index.js +65 -0
- package/packages/theme-scenes/src/index.js +75 -0
- package/packages/theme-scenes/src/presets/index.js +263 -0
- package/packages/theme-scenes/src/runtime/compile.js +119 -0
- package/packages/theme-scenes/src/scenes/index.js +146 -0
- package/packages/theme-scenes/src/shell/index.js +47 -0
- package/packages/theme-scenes/src/themes/index.js +129 -0
- package/packages/theme-scenes/src/visuals/index.js +41 -0
- package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
- package/packages/work-graph/src/index.js +34 -1
- package/packages/work-graph/src/renderers/gantt-model.js +24 -0
- package/packages/work-graph/test/work-graph.test.mjs +27 -7
- package/protocol/README.md +15 -7
- package/protocol/apps/agentsam.app.v1.schema.json +89 -7
- package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
- package/protocol/assets/README.md +9 -0
- package/protocol/assets/asset-record.v1.schema.json +64 -0
- package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
- package/protocol/scoring/README.md +10 -0
- package/protocol/scoring/scorecard.v1.schema.json +65 -0
- package/protocol/ui/icon-registry.mjs +1 -0
- package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
- package/registry/cms-rust-machine-20260928/manifest.json +22 -0
- package/registry/cms-rust-machine-20260928/migration.sql +237 -0
- package/registry/cms-rust-machine-20260928/receipt.json +21 -0
- package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
- package/scripts/build_rapid_rust_cli.py +83 -0
- package/src/attachments/index.js +6 -0
- package/src/attachments/intake.js +235 -0
- package/src/capabilities/repository-snapshot.js +19 -2
- package/src/cli/command-catalog.js +8 -0
- package/src/cli.js +182 -26
- package/src/commands/account-auth.js +94 -8
- package/src/commands/app.js +307 -3
- package/src/commands/billing.js +127 -0
- package/src/commands/brand.js +74 -60
- package/src/commands/cheat-sheet.js +154 -0
- package/src/commands/cloudflare-login.js +222 -0
- package/src/commands/cloudflare.js +453 -23
- package/src/commands/codebaseindex.js +6 -1
- package/src/commands/compute.js +4 -0
- package/src/commands/connections.js +11 -5
- package/src/commands/credentials.js +116 -0
- package/src/commands/gcloud-auth.js +427 -0
- package/src/commands/google-cloud.js +375 -0
- package/src/commands/identity-init.js +2 -2
- package/src/commands/mcp.js +226 -33
- package/src/commands/ollama.js +3 -2
- package/src/commands/plugins.js +7 -2
- package/src/commands/product.js +36 -0
- package/src/commands/runtime-status.js +28 -9
- package/src/commands/runtime.js +313 -0
- package/src/commands/rust.js +24 -0
- package/src/commands/setup.js +279 -0
- package/src/commands/shell.js +16 -3
- package/src/commands/start-local.js +2 -2
- package/src/commands/terminal.js +171 -0
- package/src/commands/update.js +140 -0
- package/src/commands/whoami.js +329 -65
- package/src/features/resolve.js +1 -0
- package/src/index.js +4 -0
- package/src/indexing/ingest/inventory.js +254 -19
- package/src/indexing/ingest/materials.js +3 -9
- package/src/indexing/ingest/style-evidence.js +181 -0
- package/src/knowledge/source.js +3 -3
- package/src/lib/account-session.js +11 -4
- package/src/lib/app-authority.js +172 -0
- package/src/lib/auth.js +94 -21
- package/src/lib/core-client.js +5 -6
- package/src/lib/credentials-audit.js +451 -0
- package/src/lib/deploy/health.js +24 -6
- package/src/lib/detect-context.js +7 -1
- package/src/lib/google-cloud-connection.js +270 -0
- package/src/lib/google-cloud-inventory.js +385 -0
- package/src/lib/google-desktop-oauth.js +372 -0
- package/src/lib/google-studio-brokered-oauth.js +158 -0
- package/src/lib/identity-scaffold.js +24 -6
- package/src/lib/init-options.js +192 -0
- package/src/lib/local-scaffold.js +48 -16
- package/src/lib/provider-command-remediation.js +308 -0
- package/src/lib/provider-credentials.js +8 -0
- package/src/lib/scaffold/index.js +8 -2
- package/src/lib/scaffold/mcp-server.js +43 -0
- package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
- package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
- package/src/lib/scaffold/wizards/cms.js +93 -0
- package/src/lib/scaffold/wizards/mcp-server.js +61 -0
- package/src/lib/setup/contract.js +26 -0
- package/src/lib/setup/discover.js +116 -0
- package/src/lib/setup/execute.js +205 -0
- package/src/lib/setup/planner.js +134 -0
- package/src/lib/setup/recipes.js +235 -0
- package/src/lib/setup/runtime-persist.js +197 -0
- package/src/lib/setup/runtime.js +394 -0
- package/src/lib/slash-commands.js +2 -0
- package/src/lib/terminal/machine-identity.js +95 -0
- package/src/lib/terminal-local.js +164 -0
- package/src/lib/terminal-scopes.js +52 -0
- package/src/lib/whoami-capabilities.js +184 -0
- package/src/local-pty/server.js +34 -5
- package/src/mcp/authority.js +58 -108
- package/src/mcp/client-adapters.js +68 -144
- package/src/mcp/client.js +142 -122
- package/src/mcp/cloudflare-bundles.js +225 -0
- package/src/mcp/index.js +12 -0
- package/src/plugins/cloudflare.js +1 -1
- package/src/providers/ollama-chat.js +2 -1
- package/src/sam/types.js +27 -2
- package/src/security/inventory.js +12 -2
- package/src/security/local-vault.js +2 -0
- package/src/security/scan.js +1 -1
- package/test/account-session.test.mjs +3 -3
- package/test/app-authority-context.test.mjs +32 -0
- package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
- package/test/cli/mcp-client.test.mjs +21 -10
- package/test/cli/runtime-persist.test.mjs +56 -0
- package/test/cli/rust-command.test.mjs +21 -0
- package/test/credentials-audit.test.mjs +113 -0
- package/test/deploy-health-scan.test.mjs +29 -1
- package/test/gcloud-auth.test.mjs +111 -0
- package/test/google-cloud-connection.test.mjs +83 -0
- package/test/google-cloud-inventory.test.mjs +64 -0
- package/test/init-options.test.mjs +35 -0
- package/test/integration/app-command.test.mjs +30 -0
- package/test/integration/cad-project.test.mjs +4 -1
- package/test/integration/cms-app-scaffold.test.mjs +71 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
- package/test/integration/codebaseindex-ingest.test.mjs +48 -0
- package/test/integration/features-resolve.test.mjs +30 -11
- package/test/integration/inspect-path-cli.test.mjs +46 -0
- package/test/integration/inventory-evidence.test.mjs +125 -0
- package/test/integration/runtime-status.integration.test.mjs +2 -1
- package/test/knowledge.test.mjs +35 -1
- package/test/loopback-oauth.test.mjs +53 -0
- package/test/ollama.test.mjs +22 -0
- package/test/security.test.mjs +23 -0
- package/test/setup-planner.test.mjs +74 -0
- package/test/setup-runtime.test.mjs +51 -0
- package/test/terminal/local-pty.mock.test.mjs +3 -1
- package/test/terminal-machine-identity.test.mjs +88 -0
- package/test/whoami-resume.test.mjs +27 -6
- package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
- package/packages/work-graph/prototype/README.md +0 -32
- package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
- package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
- package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
- package/packages/work-graph/prototype-gnantt.html +0 -655
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare credential resolution — OAuth connection OR API token.
|
|
3
|
+
*
|
|
4
|
+
* Authority law:
|
|
5
|
+
* - OAuth (user_oauth_tokens, provider=cloudflare) is the Local Studio product path — SSOT
|
|
6
|
+
* - CLOUDFLARE_API_TOKEN remains valid for CLI / CI / headless
|
|
7
|
+
* - CLOUDFLARE_IMAGES_API_TOKEN is Images-family only — never a generic CF API fallback
|
|
8
|
+
*
|
|
9
|
+
* Never serialize bearerToken in status APIs or receipts.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { decryptSecret, vaultConfigured } from './vault.js';
|
|
13
|
+
import { oauthAad, sealOauthToken, unsealOauthToken } from '../../../agentsam-vault/src/crypto/oauth-envelope.js';
|
|
14
|
+
import { getCloudflareCapability } from './capabilities.js';
|
|
15
|
+
|
|
16
|
+
function clean(value) {
|
|
17
|
+
return value == null ? '' : String(value).trim();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function scopesFromRow(row) {
|
|
21
|
+
if (!row) return [];
|
|
22
|
+
if (row.scopes) return String(row.scopes).split(/[\s,]+/).filter(Boolean);
|
|
23
|
+
if (row.scope) return String(row.scope).split(/[\s,]+/).filter(Boolean);
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function accountIdFromRow(row) {
|
|
28
|
+
const stored = clean(row?.account_identifier);
|
|
29
|
+
if (/^[a-f0-9]{32}$/i.test(stored)) return stored;
|
|
30
|
+
if (row?.metadata_json) {
|
|
31
|
+
try {
|
|
32
|
+
const meta = JSON.parse(row.metadata_json);
|
|
33
|
+
const fromMeta = clean(meta.cloudflare_account_id || meta.account_id);
|
|
34
|
+
if (/^[a-f0-9]{32}$/i.test(fromMeta)) return fromMeta;
|
|
35
|
+
} catch {
|
|
36
|
+
/* ignore */
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function oauthVaultMaterial(env) {
|
|
43
|
+
return clean(env?.VAULT_MASTER_KEY || env?.VAULT_KEY);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Map a user_oauth_tokens Cloudflare row → connection status record
|
|
48
|
+
* (replaces agentsam_cloudflare_connections shape for APIs / registry).
|
|
49
|
+
*/
|
|
50
|
+
export function mapCloudflareOauthRowToConnection(row, ownerId) {
|
|
51
|
+
if (!row) return null;
|
|
52
|
+
const active = Number(row.is_active ?? 1) === 1 && !(Number(row.revoked_at) > 0);
|
|
53
|
+
let metaStatus = null;
|
|
54
|
+
try {
|
|
55
|
+
metaStatus = row.metadata_json ? JSON.parse(row.metadata_json)?.status : null;
|
|
56
|
+
} catch {
|
|
57
|
+
metaStatus = null;
|
|
58
|
+
}
|
|
59
|
+
// user_oauth_tokens PK is (user_id, provider, account_identifier) — no `id` column.
|
|
60
|
+
const accountKey = clean(row.account_identifier) || `cf_oauth_${ownerId}`;
|
|
61
|
+
return {
|
|
62
|
+
connectionId: accountKey,
|
|
63
|
+
ownerId,
|
|
64
|
+
cloudflareAccountId: accountIdFromRow(row),
|
|
65
|
+
scopes: scopesFromRow(row),
|
|
66
|
+
status: active ? 'connected' : (metaStatus === 'superseded' ? 'superseded' : 'revoked'),
|
|
67
|
+
createdAt: row.created_at,
|
|
68
|
+
updatedAt: row.updated_at,
|
|
69
|
+
expiresAt: row.expires_at,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Load active Cloudflare connection metadata from user_oauth_tokens (no token decrypt).
|
|
75
|
+
*/
|
|
76
|
+
export async function loadCloudflareConnectionRecord(env, ownerId) {
|
|
77
|
+
if (!env?.DB || !ownerId) return null;
|
|
78
|
+
let row;
|
|
79
|
+
try {
|
|
80
|
+
row = await env.DB.prepare(`
|
|
81
|
+
SELECT user_id, provider, account_identifier, account_display, account_email,
|
|
82
|
+
scope, scopes, expires_at, metadata_json, is_active, revoked_at,
|
|
83
|
+
created_at, updated_at
|
|
84
|
+
FROM user_oauth_tokens
|
|
85
|
+
WHERE user_id = ? AND LOWER(provider) = 'cloudflare'
|
|
86
|
+
AND COALESCE(is_active, 1) = 1
|
|
87
|
+
AND (revoked_at IS NULL OR revoked_at = 0)
|
|
88
|
+
ORDER BY updated_at DESC
|
|
89
|
+
LIMIT 1
|
|
90
|
+
`).bind(ownerId).first();
|
|
91
|
+
} catch (err) {
|
|
92
|
+
console.error('loadCloudflareConnectionRecord_failed', String(err?.message || err));
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return mapCloudflareOauthRowToConnection(row, ownerId);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Load Cloudflare credential from user_oauth_tokens (SSOT).
|
|
100
|
+
* Decrypt order: plaintext → host decryptUserOauthToken → connector vault AAD.
|
|
101
|
+
*/
|
|
102
|
+
export async function loadCloudflareFromUserOauthTokens(env, ownerId, options = {}) {
|
|
103
|
+
if (!env?.DB || !ownerId) return null;
|
|
104
|
+
let row;
|
|
105
|
+
try {
|
|
106
|
+
row = await env.DB.prepare(`
|
|
107
|
+
SELECT user_id, provider, account_identifier, account_display, account_email,
|
|
108
|
+
access_token, refresh_token, access_token_encrypted, refresh_token_encrypted,
|
|
109
|
+
scope, scopes, expires_at, metadata_json, is_active
|
|
110
|
+
FROM user_oauth_tokens
|
|
111
|
+
WHERE user_id = ? AND LOWER(provider) = 'cloudflare'
|
|
112
|
+
AND COALESCE(is_active, 1) = 1
|
|
113
|
+
AND (revoked_at IS NULL OR revoked_at = 0)
|
|
114
|
+
ORDER BY updated_at DESC
|
|
115
|
+
LIMIT 1
|
|
116
|
+
`).bind(ownerId).first();
|
|
117
|
+
} catch (err) {
|
|
118
|
+
// Table may not exist on SDK-only D1 fixtures
|
|
119
|
+
console.error('loadCloudflareFromUserOauthTokens_failed', String(err?.message || err));
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (!row) return null;
|
|
123
|
+
|
|
124
|
+
const accountId = accountIdFromRow(row);
|
|
125
|
+
let accessToken = clean(row.access_token);
|
|
126
|
+
const material = oauthVaultMaterial(env);
|
|
127
|
+
|
|
128
|
+
if (!accessToken && row.access_token_encrypted && material && accountId) {
|
|
129
|
+
try {
|
|
130
|
+
accessToken = clean(await unsealOauthToken(
|
|
131
|
+
material,
|
|
132
|
+
row.access_token_encrypted,
|
|
133
|
+
oauthAad('cloudflare', ownerId, accountId),
|
|
134
|
+
));
|
|
135
|
+
} catch {
|
|
136
|
+
/* fall through to legacy host/connector formats */
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!accessToken && row.access_token_encrypted && options.decryptUserOauthToken) {
|
|
141
|
+
try {
|
|
142
|
+
accessToken = clean(await options.decryptUserOauthToken(env, row.access_token_encrypted));
|
|
143
|
+
} catch {
|
|
144
|
+
/* host legacy vault packing may differ — fall through */
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Migration path for the pre-v2 Local Studio connector format:
|
|
149
|
+
// raw AES key + AAD cloudflare-connection:<owner>. If we can open it, re-seal
|
|
150
|
+
// both tokens immediately into the portable OAuth envelope.
|
|
151
|
+
if (!accessToken && row.access_token_encrypted && vaultConfigured(env) && material && accountId) {
|
|
152
|
+
try {
|
|
153
|
+
const legacyAad = `cloudflare-connection:${ownerId}`;
|
|
154
|
+
accessToken = clean(await decryptSecret(env, row.access_token_encrypted, legacyAad));
|
|
155
|
+
if (accessToken) {
|
|
156
|
+
const aad = oauthAad('cloudflare', ownerId, accountId);
|
|
157
|
+
const accessEnc = await sealOauthToken(material, accessToken, aad);
|
|
158
|
+
let refreshEnc = row.refresh_token_encrypted || null;
|
|
159
|
+
if (row.refresh_token_encrypted) {
|
|
160
|
+
const refreshToken = clean(await decryptSecret(env, row.refresh_token_encrypted, legacyAad));
|
|
161
|
+
refreshEnc = refreshToken ? await sealOauthToken(material, refreshToken, aad) : null;
|
|
162
|
+
}
|
|
163
|
+
await env.DB.prepare(`
|
|
164
|
+
UPDATE user_oauth_tokens
|
|
165
|
+
SET access_token_encrypted = ?, refresh_token_encrypted = ?,
|
|
166
|
+
last_refresh_error_code = NULL, refresh_failure_count = 0,
|
|
167
|
+
is_active = 1, revoked_at = NULL, updated_at = unixepoch()
|
|
168
|
+
WHERE user_id = ? AND LOWER(provider) = 'cloudflare' AND account_identifier = ?
|
|
169
|
+
`).bind(accessEnc, refreshEnc, ownerId, accountId).run();
|
|
170
|
+
}
|
|
171
|
+
} catch {
|
|
172
|
+
/* unreadable legacy connector ciphertext — leave null */
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (!accessToken) return null;
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
bearerToken: accessToken,
|
|
180
|
+
accountId,
|
|
181
|
+
source: 'oauth_connection',
|
|
182
|
+
connectionId: row.id != null ? String(row.id) : null,
|
|
183
|
+
grantedScopes: scopesFromRow(row),
|
|
184
|
+
expiresAt: row.expires_at ? Number(row.expires_at) : null,
|
|
185
|
+
accountLabel: row.account_display || row.account_email || accountId || null,
|
|
186
|
+
provider: 'cloudflare',
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @deprecated Removed — user_oauth_tokens is SSOT. Kept as no-op for import compatibility.
|
|
192
|
+
*/
|
|
193
|
+
export async function loadCloudflareFromLegacyConnections() {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @param {object} opts
|
|
199
|
+
* @param {'auto'|'oauth'|'token'} [opts.authMode]
|
|
200
|
+
* @returns {Promise<{
|
|
201
|
+
* bearerToken: string|null,
|
|
202
|
+
* accountId: string|null,
|
|
203
|
+
* source: 'explicit'|'oauth_connection'|'api_token'|'images_api_token'|'missing',
|
|
204
|
+
* connectionId: string|null,
|
|
205
|
+
* grantedScopes: string[],
|
|
206
|
+
* expiresAt: number|null,
|
|
207
|
+
* capabilityId: string|null,
|
|
208
|
+
* status: 'ready'|'authorization_required'|'token_required'|'configuration_required',
|
|
209
|
+
* }>}
|
|
210
|
+
*/
|
|
211
|
+
export async function resolveCloudflareCredential(opts = {}) {
|
|
212
|
+
const {
|
|
213
|
+
env = process.env,
|
|
214
|
+
ownerId = '',
|
|
215
|
+
capabilityId = null,
|
|
216
|
+
explicitToken = '',
|
|
217
|
+
explicitAccountId = '',
|
|
218
|
+
authMode = 'auto',
|
|
219
|
+
decryptUserOauthToken = null,
|
|
220
|
+
} = opts;
|
|
221
|
+
|
|
222
|
+
const accountFallback = clean(explicitAccountId || env.CLOUDFLARE_ACCOUNT_ID);
|
|
223
|
+
const cap = capabilityId ? getCloudflareCapability(capabilityId) : null;
|
|
224
|
+
|
|
225
|
+
const pack = (partial) => ({
|
|
226
|
+
bearerToken: null,
|
|
227
|
+
accountId: accountFallback || null,
|
|
228
|
+
source: 'missing',
|
|
229
|
+
connectionId: null,
|
|
230
|
+
grantedScopes: [],
|
|
231
|
+
expiresAt: null,
|
|
232
|
+
capabilityId: capabilityId || null,
|
|
233
|
+
accountLabel: null,
|
|
234
|
+
status: 'authorization_required',
|
|
235
|
+
...partial,
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
// 1. Explicit internal credential (never from CLI argv)
|
|
239
|
+
if (clean(explicitToken)) {
|
|
240
|
+
return pack({
|
|
241
|
+
bearerToken: clean(explicitToken),
|
|
242
|
+
accountId: accountFallback || null,
|
|
243
|
+
source: 'explicit',
|
|
244
|
+
status: 'ready',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const wantOauth = authMode === 'auto' || authMode === 'oauth';
|
|
249
|
+
const wantToken = authMode === 'auto' || authMode === 'token';
|
|
250
|
+
|
|
251
|
+
// 2. Connected OAuth — user_oauth_tokens only
|
|
252
|
+
if (wantOauth && ownerId) {
|
|
253
|
+
const canonical = await loadCloudflareFromUserOauthTokens(env, ownerId, { decryptUserOauthToken });
|
|
254
|
+
if (canonical?.bearerToken) {
|
|
255
|
+
return pack({
|
|
256
|
+
...canonical,
|
|
257
|
+
accountId: canonical.accountId || accountFallback || null,
|
|
258
|
+
status: 'ready',
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
if (authMode === 'oauth') {
|
|
262
|
+
return pack({
|
|
263
|
+
source: 'missing',
|
|
264
|
+
status: 'authorization_required',
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// 3. Generic API token
|
|
270
|
+
if (wantToken) {
|
|
271
|
+
const apiToken = clean(env.CLOUDFLARE_API_TOKEN);
|
|
272
|
+
if (apiToken) {
|
|
273
|
+
return pack({
|
|
274
|
+
bearerToken: apiToken,
|
|
275
|
+
accountId: accountFallback || null,
|
|
276
|
+
source: 'api_token',
|
|
277
|
+
status: 'ready',
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// 4. Capability-specific Images token ONLY for Images family
|
|
283
|
+
if (wantToken && capabilityId === 'cloudflare.images') {
|
|
284
|
+
const imagesToken = clean(env.CLOUDFLARE_IMAGES_API_TOKEN || env.CLOUDFLARE_IMAGES_TOKEN);
|
|
285
|
+
if (imagesToken) {
|
|
286
|
+
return pack({
|
|
287
|
+
bearerToken: imagesToken,
|
|
288
|
+
accountId: accountFallback || null,
|
|
289
|
+
source: 'images_api_token',
|
|
290
|
+
status: 'ready',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Snippets: OAuth catalog may not expose a scope — mark token_required when no oauth scope known
|
|
296
|
+
if (cap && (!cap.oauthScopes || cap.oauthScopes.length === 0) && cap.tokenRequired) {
|
|
297
|
+
return pack({ status: 'token_required', source: 'missing' });
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return pack({
|
|
301
|
+
status: ownerId ? 'authorization_required' : 'token_required',
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** Safe metadata for receipts/status — NEVER includes bearerToken. */
|
|
306
|
+
export function credentialSafeMeta(cred) {
|
|
307
|
+
if (!cred) return null;
|
|
308
|
+
return {
|
|
309
|
+
auth_source: cred.source,
|
|
310
|
+
account_id: cred.accountId || null,
|
|
311
|
+
connection_id: cred.connectionId || null,
|
|
312
|
+
granted_scopes_count: (cred.grantedScopes || []).length,
|
|
313
|
+
expires_at: cred.expiresAt || null,
|
|
314
|
+
status: cred.status,
|
|
315
|
+
capability_id: cred.capabilityId || null,
|
|
316
|
+
account_label: cred.accountLabel || null,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brand Protection — subscription-gated.
|
|
3
|
+
* Prefer /accounts/{id}/brand-protection/* ; Cloudforce One v2 when available.
|
|
4
|
+
*/
|
|
5
|
+
import { receipt } from '../api-client.js';
|
|
6
|
+
|
|
7
|
+
const CAP = 'cloudflare.brand_protection';
|
|
8
|
+
|
|
9
|
+
export async function brandProtectionStatus(client) {
|
|
10
|
+
client.requireAccount('brand.status');
|
|
11
|
+
try {
|
|
12
|
+
const res = await client.request('GET', client.accountPath('/brand-protection/total-queries'), {
|
|
13
|
+
capabilityId: CAP,
|
|
14
|
+
operation: 'brand.status',
|
|
15
|
+
});
|
|
16
|
+
return receipt(CAP, 'status', {
|
|
17
|
+
ok: true,
|
|
18
|
+
availability: 'available',
|
|
19
|
+
authorized: true,
|
|
20
|
+
total_queries: res.result,
|
|
21
|
+
account_id: client.accountId,
|
|
22
|
+
});
|
|
23
|
+
} catch (err) {
|
|
24
|
+
if (err.httpStatus === 403 || err.httpStatus === 401) {
|
|
25
|
+
return receipt(CAP, 'status', {
|
|
26
|
+
ok: false,
|
|
27
|
+
availability: 'subscription',
|
|
28
|
+
authorized: false,
|
|
29
|
+
message: 'Brand Protection unavailable or not authorized',
|
|
30
|
+
learn: 'Cloudflare → Cloudforce One → Brand Protection',
|
|
31
|
+
...err.toJSON(),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (err.httpStatus === 404 || /not.?entitled|subscription|forbidden/i.test(err.message)) {
|
|
35
|
+
return receipt(CAP, 'status', {
|
|
36
|
+
ok: false,
|
|
37
|
+
availability: 'unavailable',
|
|
38
|
+
authorized: false,
|
|
39
|
+
message: 'Cloudforce One / Brand Protection subscription required',
|
|
40
|
+
learn: 'Cloudflare → Cloudforce One → Brand Protection',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function brandQueries(client) {
|
|
48
|
+
client.requireAccount('brand.queries');
|
|
49
|
+
const res = await client.request('GET', client.accountPath('/brand-protection/queries'), {
|
|
50
|
+
capabilityId: CAP,
|
|
51
|
+
operation: 'brand.queries',
|
|
52
|
+
});
|
|
53
|
+
return receipt(CAP, 'queries', { ok: true, queries: res.result });
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function brandQueryAdd(client, body) {
|
|
57
|
+
client.requireAccount('brand.query_add');
|
|
58
|
+
const res = await client.request('POST', client.accountPath('/brand-protection/queries'), {
|
|
59
|
+
capabilityId: CAP,
|
|
60
|
+
operation: 'brand.query.add',
|
|
61
|
+
body,
|
|
62
|
+
});
|
|
63
|
+
return receipt(CAP, 'query_add', { ok: true, query: res.result });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function brandQueryRemove(client, queryId) {
|
|
67
|
+
client.requireAccount('brand.query_remove');
|
|
68
|
+
const res = await client.request('DELETE', client.accountPath(`/brand-protection/queries`), {
|
|
69
|
+
capabilityId: CAP,
|
|
70
|
+
operation: 'brand.query.remove',
|
|
71
|
+
query: { id: queryId },
|
|
72
|
+
});
|
|
73
|
+
// Some delete variants use path — try path if query delete unsupported
|
|
74
|
+
void res;
|
|
75
|
+
try {
|
|
76
|
+
const del = await client.request('DELETE', client.accountPath(`/brand-protection/queries/${encodeURIComponent(queryId)}`), {
|
|
77
|
+
capabilityId: CAP,
|
|
78
|
+
operation: 'brand.query.remove',
|
|
79
|
+
});
|
|
80
|
+
return receipt(CAP, 'query_remove', { ok: true, query_id: queryId, result: del.result });
|
|
81
|
+
} catch {
|
|
82
|
+
return receipt(CAP, 'query_remove', { ok: true, query_id: queryId, result: res.result });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export async function brandMatches(client, query = {}) {
|
|
87
|
+
client.requireAccount('brand.matches');
|
|
88
|
+
const res = await client.request('GET', client.accountPath('/brand-protection/matches'), {
|
|
89
|
+
capabilityId: CAP,
|
|
90
|
+
operation: 'brand.matches',
|
|
91
|
+
query,
|
|
92
|
+
});
|
|
93
|
+
return receipt(CAP, 'matches', { ok: true, matches: res.result });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function brandLogos(client) {
|
|
97
|
+
client.requireAccount('brand.logos');
|
|
98
|
+
const res = await client.request('GET', client.accountPath('/brand-protection/logos'), {
|
|
99
|
+
capabilityId: CAP,
|
|
100
|
+
operation: 'brand.logos',
|
|
101
|
+
});
|
|
102
|
+
return receipt(CAP, 'logos', { ok: true, logos: res.result });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function brandLogoMatches(client, logoId) {
|
|
106
|
+
client.requireAccount('brand.logo_matches');
|
|
107
|
+
const res = await client.request('GET', client.accountPath('/brand-protection/logo-matches'), {
|
|
108
|
+
capabilityId: CAP,
|
|
109
|
+
operation: 'brand.logo_matches',
|
|
110
|
+
query: logoId ? { logo_id: logoId } : {},
|
|
111
|
+
});
|
|
112
|
+
return receipt(CAP, 'logo_matches', { ok: true, logo_id: logoId || null, matches: res.result });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export async function brandScanPage(client, url) {
|
|
116
|
+
client.requireAccount('brand.scan');
|
|
117
|
+
const res = await client.request('POST', client.accountPath('/brand-protection/scan-page'), {
|
|
118
|
+
capabilityId: CAP,
|
|
119
|
+
operation: 'brand.scan',
|
|
120
|
+
body: { url },
|
|
121
|
+
});
|
|
122
|
+
return receipt(CAP, 'scan', { ok: true, result: res.result });
|
|
123
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyless SSL — Enterprise add-on. Advanced TLS only.
|
|
3
|
+
* Private key NEVER travels through AgentSam / D1 / R2 / Local Studio vault.
|
|
4
|
+
*/
|
|
5
|
+
import { receipt } from '../api-client.js';
|
|
6
|
+
|
|
7
|
+
const CAP = 'cloudflare.keyless_ssl';
|
|
8
|
+
|
|
9
|
+
export async function keylessStatus(client, zoneId) {
|
|
10
|
+
if (!zoneId) {
|
|
11
|
+
return receipt(CAP, 'status', {
|
|
12
|
+
ok: false,
|
|
13
|
+
availability: 'enterprise_addon',
|
|
14
|
+
authorized: null,
|
|
15
|
+
message: 'zone_id required to probe Keyless SSL',
|
|
16
|
+
learn: 'Cloudflare → SSL/TLS → Keyless SSL',
|
|
17
|
+
note: 'Enterprise add-on. TLS private key stays on customer key server / HSM.',
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const res = await client.request('GET', client.zonePath(zoneId, '/keyless_certificates'), {
|
|
22
|
+
capabilityId: CAP,
|
|
23
|
+
operation: 'keyless.list',
|
|
24
|
+
});
|
|
25
|
+
return receipt(CAP, 'status', {
|
|
26
|
+
ok: true,
|
|
27
|
+
availability: 'available',
|
|
28
|
+
authorized: true,
|
|
29
|
+
zone_id: zoneId,
|
|
30
|
+
configurations: res.result || [],
|
|
31
|
+
private_key: 'customer_infrastructure',
|
|
32
|
+
default_port: 2407,
|
|
33
|
+
});
|
|
34
|
+
} catch (err) {
|
|
35
|
+
if (err.httpStatus === 403 || err.httpStatus === 401) {
|
|
36
|
+
return receipt(CAP, 'status', {
|
|
37
|
+
ok: false,
|
|
38
|
+
availability: 'enterprise_addon',
|
|
39
|
+
authorized: false,
|
|
40
|
+
zone_id: zoneId,
|
|
41
|
+
learn: 'Cloudflare → SSL/TLS → Keyless SSL',
|
|
42
|
+
...err.toJSON(),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return receipt(CAP, 'status', {
|
|
46
|
+
ok: false,
|
|
47
|
+
availability: 'unavailable',
|
|
48
|
+
authorized: false,
|
|
49
|
+
zone_id: zoneId,
|
|
50
|
+
message: err.message,
|
|
51
|
+
learn: 'Cloudflare → SSL/TLS → Keyless SSL',
|
|
52
|
+
required: 'Enterprise + Keyless SSL add-on',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function keylessList(client, zoneId) {
|
|
58
|
+
const res = await client.request('GET', client.zonePath(zoneId, '/keyless_certificates'), {
|
|
59
|
+
capabilityId: CAP,
|
|
60
|
+
operation: 'keyless.list',
|
|
61
|
+
});
|
|
62
|
+
return receipt(CAP, 'list', { ok: true, zone_id: zoneId, keyless: res.result || [] });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function keylessInspect(client, zoneId, id) {
|
|
66
|
+
const res = await client.request(
|
|
67
|
+
'GET',
|
|
68
|
+
client.zonePath(zoneId, `/keyless_certificates/${encodeURIComponent(id)}`),
|
|
69
|
+
{ capabilityId: CAP, operation: 'keyless.inspect' },
|
|
70
|
+
);
|
|
71
|
+
return receipt(CAP, 'inspect', { ok: true, zone_id: zoneId, keyless: res.result });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export async function keylessEnable(client, zoneId, id) {
|
|
75
|
+
const res = await client.request(
|
|
76
|
+
'PATCH',
|
|
77
|
+
client.zonePath(zoneId, `/keyless_certificates/${encodeURIComponent(id)}`),
|
|
78
|
+
{ capabilityId: CAP, operation: 'keyless.enable', body: { enabled: true } },
|
|
79
|
+
);
|
|
80
|
+
return receipt(CAP, 'enable', { ok: true, zone_id: zoneId, keyless: res.result });
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function keylessDisable(client, zoneId, id) {
|
|
84
|
+
const res = await client.request(
|
|
85
|
+
'PATCH',
|
|
86
|
+
client.zonePath(zoneId, `/keyless_certificates/${encodeURIComponent(id)}`),
|
|
87
|
+
{ capabilityId: CAP, operation: 'keyless.disable', body: { enabled: false } },
|
|
88
|
+
);
|
|
89
|
+
return receipt(CAP, 'disable', { ok: true, zone_id: zoneId, keyless: res.result });
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Create Keyless config — certificate public material + key server address.
|
|
94
|
+
* Does NOT accept or transmit the TLS private key.
|
|
95
|
+
*/
|
|
96
|
+
export async function keylessCreate(client, zoneId, body) {
|
|
97
|
+
if (body?.private_key || body?.privateKey) {
|
|
98
|
+
throw Object.assign(
|
|
99
|
+
new Error('TLS private key must not be sent to AgentSam or Cloudflare Keyless create API'),
|
|
100
|
+
{ code: 'keyless_private_key_forbidden' },
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
const res = await client.request('POST', client.zonePath(zoneId, '/keyless_certificates'), {
|
|
104
|
+
capabilityId: CAP,
|
|
105
|
+
operation: 'keyless.create',
|
|
106
|
+
body,
|
|
107
|
+
});
|
|
108
|
+
return receipt(CAP, 'create', {
|
|
109
|
+
ok: true,
|
|
110
|
+
zone_id: zoneId,
|
|
111
|
+
keyless: res.result,
|
|
112
|
+
private_key: 'customer_infrastructure',
|
|
113
|
+
});
|
|
114
|
+
}
|