@inneranimalmedia/agentsam-sdk 2.6.3 → 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 +17 -0
- package/README.md +31 -10
- 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 +16 -1
- package/bin/agentsam-rapid-rust +36 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
- package/docs/BRAND_INTELLIGENCE.md +1 -1
- 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_DISTRIBUTION_OWNERSHIP.md +176 -0
- package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
- package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
- package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
- package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
- package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
- package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +36 -0
- package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
- package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
- package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
- package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
- package/docs/architecture/SAM_KERNEL.md +181 -0
- package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
- package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
- package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
- package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
- package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
- package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -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/0010_portable_tickets_memory.sql +140 -0
- package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
- package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
- package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
- package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
- package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
- package/migrations/d1/0013_identity_oauth_states.sql +15 -0
- package/migrations/d1/0014_auth_event_log.sql +20 -0
- package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
- package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
- package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
- package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
- package/package.json +88 -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-contracts/src/errors.ts +16 -0
- package/packages/agentsam-errors/src/envelope.js +53 -0
- package/packages/agentsam-errors/src/index.js +1 -0
- package/packages/agentsam-errors/src/recovery.js +301 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
- package/packages/agentsam-knowledge/src/providers/index.js +20 -6
- 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 +318 -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 +51 -30
- package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
- 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 +31 -2
- package/packages/identity/README.md +1 -1
- package/packages/identity/backend/README.md +1 -1
- package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +32 -0
- package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
- package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
- package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
- package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
- package/packages/identity/package.json +3 -2
- 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 +153 -24
- package/packages/identity/src/adapters/sqlite/index.js +322 -0
- package/packages/identity/src/app/verify-app.js +95 -0
- 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/identity-store.js +115 -0
- package/packages/identity/src/contracts/provider.js +1 -0
- package/packages/identity/src/contracts/route-ids.js +30 -0
- package/packages/identity/src/contracts/route-projection.js +218 -0
- package/packages/identity/src/contracts/routes.js +11 -0
- package/packages/identity/src/core/browser-paths.js +4 -5
- package/packages/identity/src/core/constants.js +13 -8
- package/packages/identity/src/core/session-policy.js +32 -0
- package/packages/identity/src/frontend/auth-portal/README.md +2 -1
- package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -15
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +9 -8
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +9 -8
- package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
- 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 +41 -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 +19 -8
- package/packages/identity/src/oauth/consent-view.js +388 -0
- package/packages/identity/src/oauth/credentials.js +46 -19
- package/packages/identity/src/oauth/finalize-inbound.js +1 -1
- package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
- package/packages/identity/src/oauth/iam-platform.js +8 -7
- package/packages/identity/src/oauth/redirect-paths.js +27 -36
- 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 +61 -15
- package/packages/identity/src/server/mount-policy.js +30 -0
- package/packages/identity/src/server/post-auth.js +79 -0
- package/packages/identity/src/server/worker-router.js +208 -146
- package/packages/identity/tests/auth-config.test.mjs +3 -2
- package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
- package/packages/identity/tests/iam-provider.test.mjs +1 -1
- package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
- package/packages/identity/tests/identity-service.test.mjs +52 -5
- 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 +20 -5
- package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
- package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
- package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
- package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
- package/packages/runtime-protocol/src/index.js +154 -0
- package/packages/theme-church-site/package.json +2 -1
- package/packages/theme-church-site/src/index.js +1 -0
- package/packages/theme-companions-site/package.json +2 -1
- package/packages/theme-companions-site/src/index.js +1 -0
- package/packages/theme-floors-site/package.json +2 -1
- package/packages/theme-floors-site/src/index.js +1 -0
- package/packages/theme-fuelnfree-site/package.json +2 -1
- package/packages/theme-fuelnfree-site/src/index.js +1 -0
- package/packages/theme-handyman-site/package.json +2 -1
- package/packages/theme-handyman-site/src/index.js +1 -0
- package/packages/theme-insurance-site/package.json +2 -1
- package/packages/theme-insurance-site/src/index.js +1 -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/theme-shinshu-site/package.json +2 -1
- package/packages/theme-shinshu-site/src/index.js +1 -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 +133 -0
- 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/brand/brandpack.v1.schema.json +43 -0
- package/protocol/credentials/issue.v1.schema.json +38 -0
- package/protocol/database/connection.v1.schema.json +41 -0
- package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
- package/protocol/errors/error-envelope.schema.json +135 -1
- package/protocol/errors/recovery.v1.schema.json +50 -0
- package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
- package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
- package/protocol/sam/activity.v1.schema.json +48 -0
- package/protocol/sam/answer.v1.schema.json +35 -0
- package/protocol/sam/calibration.v1.schema.json +21 -0
- package/protocol/sam/decision-receipt.v1.schema.json +29 -0
- package/protocol/sam/evaluation.v1.schema.json +19 -0
- package/protocol/sam/operation.schema.json +66 -0
- package/protocol/sam/outcome.v1.schema.json +36 -0
- package/protocol/sam/question.v1.schema.json +26 -0
- package/protocol/sam/registry.seed.json +153 -0
- package/protocol/sam/result.schema.json +53 -0
- package/protocol/sam/state.v1.schema.json +23 -0
- package/protocol/scoring/README.md +10 -0
- package/protocol/scoring/scorecard.v1.schema.json +65 -0
- package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
- package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
- package/protocol/ui/icon-registry.mjs +227 -0
- package/protocol/ui/icon.v1.schema.json +51 -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/skills/README.md +22 -9
- package/skills/agentsam-codebaseindex/SKILL.md +225 -0
- package/skills/catalog.json +14 -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 +138 -0
- package/src/cli/dispatch.js +48 -0
- package/src/cli.js +225 -27
- package/src/commands/account-auth.js +94 -8
- package/src/commands/api-key.js +244 -0
- package/src/commands/app.js +365 -29
- package/src/commands/billing.js +127 -0
- package/src/commands/brand.js +86 -74
- 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 +693 -0
- package/src/commands/compute.js +4 -0
- package/src/commands/connections.js +11 -5
- package/src/commands/credentials.js +116 -0
- package/src/commands/env.js +152 -25
- package/src/commands/gcloud-auth.js +427 -0
- package/src/commands/go.js +366 -53
- package/src/commands/google-cloud.js +375 -0
- package/src/commands/identity-init.js +2 -2
- package/src/commands/interaction-clack.js +115 -0
- package/src/commands/mcp.js +226 -33
- package/src/commands/models.js +1 -1
- package/src/commands/ollama.js +3 -2
- package/src/commands/plugins.js +7 -2
- package/src/commands/product.js +36 -0
- package/src/commands/providers.js +62 -14
- 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 +59 -5
- package/src/commands/skill.js +248 -0
- package/src/commands/skills.js +1 -1
- package/src/commands/start-local.js +6 -2
- package/src/commands/terminal.js +171 -0
- package/src/commands/update.js +140 -0
- package/src/commands/whoami.js +392 -56
- package/src/features/resolve.js +1 -0
- package/src/go/build.js +229 -39
- package/src/go/cloudflare.js +506 -105
- package/src/go/container.js +120 -0
- package/src/go/contract.js +9 -4
- package/src/go/discover.js +149 -33
- package/src/go/index.js +15 -3
- package/src/go/native-probe-runner.mjs +119 -0
- package/src/go/{registry.js → official-registry.js} +64 -7
- package/src/go/official-release.js +10 -0
- package/src/go/receipts.js +77 -10
- package/src/go/verify.js +9 -2
- package/src/index.js +31 -0
- package/src/indexing/ingest/discover-models.js +298 -0
- package/src/indexing/ingest/inventory.js +478 -0
- package/src/indexing/ingest/job-graph.js +181 -0
- package/src/indexing/ingest/materials.js +204 -0
- 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 +71 -21
- 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 +3 -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-fs/capability.js +121 -0
- package/src/local-fs/freshness.js +75 -0
- package/src/local-fs/index.js +385 -0
- package/src/local-fs/paths.js +100 -0
- package/src/local-pty/server.js +326 -21
- 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/models/ai-access-onboarding.js +112 -0
- package/src/models/discovery.js +10 -2
- package/src/models/inventory-core.js +9 -1
- package/src/plugins/cloudflare.js +1 -1
- package/src/providers/ollama-chat.js +2 -1
- package/src/sam/activity/index.js +183 -0
- package/src/sam/client.js +252 -0
- package/src/sam/decision/calibration.js +109 -0
- package/src/sam/decision/confidence.js +126 -0
- package/src/sam/decision/evaluate.js +157 -0
- package/src/sam/decision/evaluators/deterministic.js +341 -0
- package/src/sam/decision/evaluators/heuristic.js +61 -0
- package/src/sam/decision/evaluators/select.js +50 -0
- package/src/sam/decision/evaluators/semantic.js +149 -0
- package/src/sam/decision/hierarchical.js +61 -0
- package/src/sam/decision/index.js +53 -0
- package/src/sam/decision/policy.js +86 -0
- package/src/sam/decision/questions.js +120 -0
- package/src/sam/decision/receipt.js +148 -0
- package/src/sam/decision/state.js +117 -0
- package/src/sam/decision/types.js +22 -0
- package/src/sam/decision/validate.js +200 -0
- package/src/sam/define.js +51 -0
- package/src/sam/index.js +65 -0
- package/src/sam/operations/brand-scan.js +62 -0
- package/src/sam/operations/cad-blender-inspect.js +36 -0
- package/src/sam/operations/codebaseindex-ingest.js +49 -0
- package/src/sam/operations/decision-evaluate.js +59 -0
- package/src/sam/operations/planning-astar.js +77 -0
- package/src/sam/operations/planning-goap.js +60 -0
- package/src/sam/operations/repository-inspect.js +72 -0
- package/src/sam/operations/security-scan.js +33 -0
- package/src/sam/operations/terminal-exec.js +29 -0
- package/src/sam/planning/astar.js +311 -0
- package/src/sam/planning/goap.js +177 -0
- package/src/sam/planning/index.js +21 -0
- package/src/sam/planning/state.js +84 -0
- package/src/sam/registry.js +48 -0
- package/src/sam/result.js +77 -0
- package/src/sam/seed.js +44 -0
- package/src/sam/types.js +116 -0
- package/src/security/inventory.js +12 -2
- package/src/security/local-vault.js +2 -0
- package/src/security/scan.js +1 -1
- package/src/skills/catalog.js +64 -0
- package/src/skills/content-resolver.js +124 -0
- package/src/skills/hosted-store.js +37 -0
- package/src/skills/index.js +29 -64
- package/src/skills/interaction.js +102 -0
- package/src/skills/local-store.js +228 -0
- package/src/skills/manifest.js +104 -0
- package/src/skills/metrics.js +31 -0
- package/src/skills/registry.js +184 -0
- package/src/skills/runtime.js +287 -0
- package/src/skills/slash.js +44 -0
- package/src/ui/cli/help.js +94 -101
- package/test/account-session.test.mjs +3 -3
- package/test/app-authority-context.test.mjs +32 -0
- package/test/cli/api-key-env-whoami.test.mjs +129 -0
- package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
- package/test/cli/go.test.mjs +62 -5
- 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/cli/skill-npm-and-env.test.mjs +52 -0
- package/test/cli/wireframes-go-registry.test.mjs +87 -2
- 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/go/build-source-identity.test.mjs +31 -0
- package/test/go/cloudflare-probe.test.mjs +274 -10
- package/test/go/distribution.test.mjs +28 -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/ai-access-onboarding.test.mjs +47 -0
- package/test/integration/app-command.test.mjs +30 -0
- package/test/integration/cad-project.test.mjs +4 -1
- package/test/integration/cli-help.test.mjs +1 -1
- package/test/integration/cms-app-scaffold.test.mjs +71 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +9 -8
- package/test/integration/codebaseindex-ingest.test.mjs +214 -0
- package/test/integration/features-resolve.test.mjs +30 -11
- package/test/integration/icon-registry.test.mjs +67 -0
- package/test/integration/ingest-discover-models.test.mjs +30 -0
- package/test/integration/inspect-path-cli.test.mjs +46 -0
- package/test/integration/install-script.test.mjs +12 -9
- package/test/integration/inventory-evidence.test.mjs +125 -0
- package/test/integration/local-fs.test.mjs +113 -0
- package/test/integration/provider-env-cli.test.mjs +2 -1
- package/test/integration/runtime-status.integration.test.mjs +2 -1
- package/test/integration/sam-activity-recovery.test.mjs +147 -0
- package/test/integration/sam-decision.test.mjs +584 -0
- package/test/integration/sam-kernel.test.mjs +99 -0
- package/test/integration/sam-planning-astar.test.mjs +279 -0
- package/test/integration/skill-runtime.test.mjs +240 -0
- package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
- package/test/knowledge.test.mjs +35 -1
- package/test/loopback-oauth.test.mjs +53 -0
- package/test/models.test.mjs +14 -7
- 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/shell.test.mjs +4 -4
- 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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
+
import { PLATFORM_ACCOUNT_ISSUER } from '../../packages/identity/src/contracts/auth-config.js';
|
|
4
5
|
import {
|
|
5
6
|
getSecureProviderKey,
|
|
6
7
|
setSecureProviderKey,
|
|
@@ -129,28 +130,17 @@ export function agentEnvLoaderPath(options = {}) {
|
|
|
129
130
|
|
|
130
131
|
export function ensureAgentEnvLoader(options = {}) {
|
|
131
132
|
const filename = agentEnvLoaderPath(options);
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
133
|
+
const source = `# AgentSam environment loader. Source this file; do not execute it.
|
|
134
|
+
# Credentials resolve from the OS keychain / local vault via \`agentsam env shell\`.
|
|
135
|
+
# Do not put plaintext secrets in this file.
|
|
136
|
+
if command -v agentsam >/dev/null 2>&1; then
|
|
137
|
+
eval "$(agentsam env shell --profile default)"
|
|
138
|
+
elif command -v agentsam-env >/dev/null 2>&1; then
|
|
139
|
+
eval "$(agentsam-env shell --profile default)"
|
|
140
|
+
else
|
|
141
|
+
echo "agentsam CLI not found on PATH; cannot load AgentSam credentials" >&2
|
|
142
|
+
return 1 2>/dev/null || exit 1
|
|
137
143
|
fi
|
|
138
|
-
for _agentsam_profile in "$@"; do
|
|
139
|
-
case "$_agentsam_profile" in
|
|
140
|
-
grok) _agentsam_profile="xai" ;;
|
|
141
|
-
${supported}) ;;
|
|
142
|
-
*) echo "unknown AgentSam provider profile: $_agentsam_profile" >&2; return 2 2>/dev/null || exit 2 ;;
|
|
143
|
-
esac
|
|
144
|
-
_agentsam_file="\${HOME}/.agentsam/env.d/\${_agentsam_profile}.env"
|
|
145
|
-
if [ ! -f "$_agentsam_file" ]; then
|
|
146
|
-
echo "AgentSam provider profile not found: $_agentsam_file" >&2
|
|
147
|
-
return 1 2>/dev/null || exit 1
|
|
148
|
-
fi
|
|
149
|
-
set -a
|
|
150
|
-
. "$_agentsam_file"
|
|
151
|
-
set +a
|
|
152
|
-
done
|
|
153
|
-
unset _agentsam_file _agentsam_profile
|
|
154
144
|
`;
|
|
155
145
|
atomicWrite(filename, source, 0o700);
|
|
156
146
|
return filename;
|
|
@@ -359,3 +349,63 @@ export function describeProviderCredential(provider, options = {}) {
|
|
|
359
349
|
export function listProviderCredentialStatus(options = {}) {
|
|
360
350
|
return Object.freeze(Object.keys(PROVIDER_CREDENTIALS).map((provider) => describeProviderCredential(provider, options)));
|
|
361
351
|
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Emit shell `export` lines for configured credentials from vault/keychain/env.
|
|
355
|
+
* Bootstrap-safe: does not require AGENTSAM_API_KEY already present to resolve it.
|
|
356
|
+
* Prefer vault/OS store over ambient env when `preferVault` is true (default for shell).
|
|
357
|
+
*/
|
|
358
|
+
export function renderEnvShellExports(options = {}) {
|
|
359
|
+
const profile = clean(options.profile || 'default').toLowerCase();
|
|
360
|
+
const wanted = Array.isArray(options.providers) && options.providers.length
|
|
361
|
+
? options.providers.map(normalizeProviderId).filter(Boolean)
|
|
362
|
+
: profile === 'default'
|
|
363
|
+
? Object.keys(PROVIDER_CREDENTIALS)
|
|
364
|
+
: profile.split(/[,\s]+/).map(normalizeProviderId).filter(Boolean);
|
|
365
|
+
|
|
366
|
+
const lines = ['# AgentSam env shell — evaluated by: eval "$(agentsam env shell)"'];
|
|
367
|
+
const emitted = [];
|
|
368
|
+
|
|
369
|
+
for (const provider of wanted) {
|
|
370
|
+
const spec = providerCredentialSpec(provider);
|
|
371
|
+
if (!spec) continue;
|
|
372
|
+
|
|
373
|
+
let resolved;
|
|
374
|
+
if (options.preferVault !== false) {
|
|
375
|
+
// Skip ambient process.env so a stale empty shell does not block keychain.
|
|
376
|
+
const vaultOnly = { ...options, env: { ...(options.env || {}), [spec.env]: undefined } };
|
|
377
|
+
if (spec.accountEnv) {
|
|
378
|
+
for (const name of spec.accountEnv) vaultOnly.env[name] = undefined;
|
|
379
|
+
}
|
|
380
|
+
resolved = resolveProviderCredential(spec.provider, vaultOnly);
|
|
381
|
+
if (!resolved.configured) {
|
|
382
|
+
resolved = resolveProviderCredential(spec.provider, options);
|
|
383
|
+
}
|
|
384
|
+
} else {
|
|
385
|
+
resolved = resolveProviderCredential(spec.provider, options);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
if (!resolved.configured || !resolved.value) continue;
|
|
389
|
+
lines.push(`export ${spec.env}=${envLiteral(resolved.value)}`);
|
|
390
|
+
if (spec.provider === 'cloudflare' && resolved.account_id) {
|
|
391
|
+
lines.push(`export CLOUDFLARE_ACCOUNT_ID=${envLiteral(resolved.account_id)}`);
|
|
392
|
+
}
|
|
393
|
+
emitted.push(spec.provider);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
if (!emitted.length) {
|
|
397
|
+
lines.push('# No AgentSam credentials configured. Run: agentsam api-key create --store keychain --activate');
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// PLATFORM namespace — always emit so whoami/core client work after `source load-agent-env.sh`.
|
|
401
|
+
// Not an APP host alias; Local Studio hosts live in agentsam.app.json hosts[].
|
|
402
|
+
const issuer = clean(options.env?.IAM_OAUTH_ISSUER || process.env.IAM_OAUTH_ISSUER)
|
|
403
|
+
|| PLATFORM_ACCOUNT_ISSUER;
|
|
404
|
+
lines.push(`export IAM_OAUTH_ISSUER=${envLiteral(issuer)}`);
|
|
405
|
+
|
|
406
|
+
return Object.freeze({
|
|
407
|
+
profile,
|
|
408
|
+
providers: emitted,
|
|
409
|
+
script: `${lines.join('\n')}\n`,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
@@ -11,12 +11,13 @@
|
|
|
11
11
|
import { intro, outro, select, cancel, isCancel, note } from '@clack/prompts';
|
|
12
12
|
import { runCmsWizard } from './wizards/cms.js';
|
|
13
13
|
import { runWorkerApiWizard } from './wizards/worker-api.js';
|
|
14
|
+
import { runMcpServerWizard } from './wizards/mcp-server.js';
|
|
14
15
|
import pc from 'picocolors';
|
|
15
16
|
|
|
16
17
|
const SCAFFOLDS = {
|
|
17
18
|
cms: {
|
|
18
|
-
label: 'CMS
|
|
19
|
-
description: '
|
|
19
|
+
label: 'CMS',
|
|
20
|
+
description: 'Choose a Cloudflare CMS site or the reusable CMS Editor app',
|
|
20
21
|
run: runCmsWizard,
|
|
21
22
|
},
|
|
22
23
|
'worker-api': {
|
|
@@ -24,6 +25,11 @@ const SCAFFOLDS = {
|
|
|
24
25
|
description: 'Bare Cloudflare Worker with typed route handlers and D1 binding',
|
|
25
26
|
run: runWorkerApiWizard,
|
|
26
27
|
},
|
|
28
|
+
'mcp-server': {
|
|
29
|
+
label: 'MCP Server',
|
|
30
|
+
description: 'Cloudflare Worker MCP server with OAuth resource metadata and portable identity branding',
|
|
31
|
+
run: runMcpServerWizard,
|
|
32
|
+
},
|
|
27
33
|
};
|
|
28
34
|
|
|
29
35
|
export async function runScaffold(type) {
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { writeFileTree } from './writer.js';
|
|
4
|
+
import {
|
|
5
|
+
mcpServerTemplates,
|
|
6
|
+
resolveMcpServerTemplateConfig,
|
|
7
|
+
} from './templates/mcp-server/index.js';
|
|
8
|
+
|
|
9
|
+
async function directoryHasEntries(dir) {
|
|
10
|
+
try {
|
|
11
|
+
const entries = await fs.readdir(dir);
|
|
12
|
+
return entries.length > 0;
|
|
13
|
+
} catch (error) {
|
|
14
|
+
if (error?.code === 'ENOENT') return false;
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function createMcpServerProject(input = {}, options = {}) {
|
|
20
|
+
const config = resolveMcpServerTemplateConfig(input);
|
|
21
|
+
const cwd = path.resolve(options.cwd || process.cwd());
|
|
22
|
+
const outputDir = path.resolve(cwd, input.outputDir || input.output || config.projectName);
|
|
23
|
+
const force = Boolean(input.force || options.force);
|
|
24
|
+
|
|
25
|
+
if (!force && await directoryHasEntries(outputDir)) {
|
|
26
|
+
throw new Error(`mcp_output_not_empty:${outputDir}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const files = mcpServerTemplates(config);
|
|
30
|
+
await writeFileTree(outputDir, files);
|
|
31
|
+
|
|
32
|
+
return Object.freeze({
|
|
33
|
+
ok: true,
|
|
34
|
+
preset: config.preset,
|
|
35
|
+
project_name: config.projectName,
|
|
36
|
+
display_name: config.displayName,
|
|
37
|
+
output_dir: outputDir,
|
|
38
|
+
file_count: Object.keys(files).length,
|
|
39
|
+
manifest_path: path.join(outputDir, 'agentsam.mcp.json'),
|
|
40
|
+
transport: 'streamable_http',
|
|
41
|
+
endpoint_path: '/mcp',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
import { getMcpServerPreset } from './presets.js';
|
|
2
|
+
|
|
3
|
+
function slug(value) {
|
|
4
|
+
const normalized = String(value || '')
|
|
5
|
+
.trim()
|
|
6
|
+
.toLowerCase()
|
|
7
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
8
|
+
.replace(/^-+|-+$/g, '');
|
|
9
|
+
if (!normalized) throw new Error('mcp_project_name_required');
|
|
10
|
+
return normalized;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Deterministic seed helpers for generated migrations. SQL literals only --
|
|
14
|
+
// no JS-generated timestamps (SQL unixepoch() is authoritative), no free
|
|
15
|
+
// text passed through unescaped.
|
|
16
|
+
function sqlString(value) {
|
|
17
|
+
return `'${String(value).replaceAll("'", "''")}'`;
|
|
18
|
+
}
|
|
19
|
+
function sqlStringOrNull(value) {
|
|
20
|
+
const v = value == null ? '' : String(value).trim();
|
|
21
|
+
return v ? sqlString(v) : 'NULL';
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function buildManifest(config) {
|
|
25
|
+
return {
|
|
26
|
+
schema_version: 'agentsam.mcp.v1',
|
|
27
|
+
name: config.projectName,
|
|
28
|
+
display_name: config.displayName,
|
|
29
|
+
runtime: { kind: 'cloudflare-worker', language: 'javascript' },
|
|
30
|
+
transport: { kind: 'streamable_http', path: '/mcp', stateless: true },
|
|
31
|
+
resource: {
|
|
32
|
+
audience: config.audience,
|
|
33
|
+
homepage_url: config.homepageUrl,
|
|
34
|
+
company_slug: config.companySlug,
|
|
35
|
+
},
|
|
36
|
+
auth: {
|
|
37
|
+
type: config.authMode,
|
|
38
|
+
issuer: config.issuer,
|
|
39
|
+
protected_resource_metadata: '/.well-known/oauth-protected-resource',
|
|
40
|
+
verifier_env: 'MCP_TOKEN_VERIFY_URL',
|
|
41
|
+
fail_closed: config.authMode === 'oauth',
|
|
42
|
+
},
|
|
43
|
+
scopes: config.scopes,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function workerSource(manifest) {
|
|
48
|
+
const manifestLiteral = JSON.stringify(manifest, null, 2);
|
|
49
|
+
return `import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
50
|
+
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
51
|
+
import { z } from 'zod';
|
|
52
|
+
import { authorizeMcpRequest, protectedResourceMetadata } from './oauth.js';
|
|
53
|
+
|
|
54
|
+
const manifest = ${manifestLiteral};
|
|
55
|
+
|
|
56
|
+
function jsonResponse(value, status = 200, headers = {}) {
|
|
57
|
+
return new Response(JSON.stringify(value, null, 2), {
|
|
58
|
+
status,
|
|
59
|
+
headers: { 'content-type': 'application/json; charset=utf-8', ...headers },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function createServer() {
|
|
64
|
+
const server = new McpServer({ name: manifest.name, version: '0.1.0' });
|
|
65
|
+
|
|
66
|
+
server.registerTool(
|
|
67
|
+
'mcp_manifest',
|
|
68
|
+
{
|
|
69
|
+
title: 'MCP Manifest',
|
|
70
|
+
description: 'Return this generated MCP server contract.',
|
|
71
|
+
inputSchema: {},
|
|
72
|
+
},
|
|
73
|
+
async () => ({
|
|
74
|
+
content: [{ type: 'text', text: JSON.stringify(manifest, null, 2) }],
|
|
75
|
+
}),
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
return server;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export default {
|
|
82
|
+
async fetch(request, env) {
|
|
83
|
+
const url = new URL(request.url);
|
|
84
|
+
|
|
85
|
+
if (url.pathname === '/health') {
|
|
86
|
+
return jsonResponse({
|
|
87
|
+
ok: true,
|
|
88
|
+
name: manifest.name,
|
|
89
|
+
transport: manifest.transport.kind,
|
|
90
|
+
auth: manifest.auth.type,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (url.pathname === '/.well-known/oauth-protected-resource') {
|
|
95
|
+
return jsonResponse(protectedResourceMetadata(manifest, env));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (url.pathname !== manifest.transport.path) {
|
|
99
|
+
return new Response('Not found', { status: 404 });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const auth = await authorizeMcpRequest(request, manifest, env);
|
|
103
|
+
if (!auth.ok) return auth.response;
|
|
104
|
+
|
|
105
|
+
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
106
|
+
sessionIdGenerator: undefined,
|
|
107
|
+
});
|
|
108
|
+
const server = createServer();
|
|
109
|
+
await server.connect(transport);
|
|
110
|
+
return transport.handleRequest(request);
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function oauthSource() {
|
|
117
|
+
return `function clean(value) {
|
|
118
|
+
return value == null ? '' : String(value).trim();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function list(value) {
|
|
122
|
+
if (Array.isArray(value)) return value.map(String).filter(Boolean);
|
|
123
|
+
return clean(value).split(/[\\\\s,]+/).filter(Boolean);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function bearer(request) {
|
|
127
|
+
const match = clean(request.headers.get('authorization')).match(/^Bearer\\\\s+(.+)$/i);
|
|
128
|
+
return match ? match[1].trim() : '';
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function unauthorized(request, error = 'invalid_token') {
|
|
132
|
+
const metadataUrl = new URL('/.well-known/oauth-protected-resource', request.url).toString();
|
|
133
|
+
return new Response(JSON.stringify({ ok: false, error }), {
|
|
134
|
+
status: 401,
|
|
135
|
+
headers: {
|
|
136
|
+
'content-type': 'application/json; charset=utf-8',
|
|
137
|
+
'www-authenticate': \`Bearer resource_metadata="\${metadataUrl}"\`,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function protectedResourceMetadata(manifest, env = {}) {
|
|
143
|
+
const issuer = clean(env.MCP_AUTH_ISSUER) || manifest.auth.issuer;
|
|
144
|
+
const audience = clean(env.MCP_RESOURCE_AUDIENCE) || manifest.resource.audience;
|
|
145
|
+
return {
|
|
146
|
+
resource: audience,
|
|
147
|
+
authorization_servers: issuer ? [issuer] : [],
|
|
148
|
+
scopes_supported: (manifest.scopes || []).map((item) => item.scope),
|
|
149
|
+
bearer_methods_supported: ['header'],
|
|
150
|
+
resource_documentation: manifest.resource.homepage_url || undefined,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export async function authorizeMcpRequest(request, manifest, env = {}) {
|
|
155
|
+
const mode = clean(env.MCP_AUTH_MODE) || manifest.auth.type || 'oauth';
|
|
156
|
+
if (mode === 'public') return { ok: true, principal: { kind: 'public' } };
|
|
157
|
+
if (mode !== 'oauth') {
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
response: new Response(JSON.stringify({ ok: false, error: 'unsupported_auth_mode' }), {
|
|
161
|
+
status: 500,
|
|
162
|
+
headers: { 'content-type': 'application/json; charset=utf-8' },
|
|
163
|
+
}),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const token = bearer(request);
|
|
168
|
+
if (!token) return { ok: false, response: unauthorized(request, 'bearer_token_required') };
|
|
169
|
+
|
|
170
|
+
const verifier = clean(env.MCP_TOKEN_VERIFY_URL);
|
|
171
|
+
if (!verifier) {
|
|
172
|
+
return {
|
|
173
|
+
ok: false,
|
|
174
|
+
response: new Response(JSON.stringify({ ok: false, error: 'oauth_verifier_not_configured' }), {
|
|
175
|
+
status: 503,
|
|
176
|
+
headers: { 'content-type': 'application/json; charset=utf-8' },
|
|
177
|
+
}),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
let verified;
|
|
182
|
+
try {
|
|
183
|
+
const response = await fetch(verifier, {
|
|
184
|
+
headers: { authorization: \`Bearer \${token}\`, accept: 'application/json' },
|
|
185
|
+
});
|
|
186
|
+
verified = await response.json().catch(() => ({}));
|
|
187
|
+
if (!response.ok || verified?.active === false || verified?.ok === false) {
|
|
188
|
+
return { ok: false, response: unauthorized(request) };
|
|
189
|
+
}
|
|
190
|
+
} catch {
|
|
191
|
+
return {
|
|
192
|
+
ok: false,
|
|
193
|
+
response: new Response(JSON.stringify({ ok: false, error: 'oauth_verifier_unreachable' }), {
|
|
194
|
+
status: 503,
|
|
195
|
+
headers: { 'content-type': 'application/json; charset=utf-8' },
|
|
196
|
+
}),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const expectedAudience = clean(env.MCP_RESOURCE_AUDIENCE) || manifest.resource.audience;
|
|
201
|
+
const audiences = list(verified?.aud ?? verified?.audience);
|
|
202
|
+
if (expectedAudience && !audiences.includes(expectedAudience)) {
|
|
203
|
+
return {
|
|
204
|
+
ok: false,
|
|
205
|
+
response: new Response(JSON.stringify({ ok: false, error: 'token_audience_mismatch' }), {
|
|
206
|
+
status: 403,
|
|
207
|
+
headers: { 'content-type': 'application/json; charset=utf-8' },
|
|
208
|
+
}),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return { ok: true, principal: verified };
|
|
213
|
+
}
|
|
214
|
+
`;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function companyMigration(config) {
|
|
218
|
+
return `-- Portable identity issuer-brand SSOT.
|
|
219
|
+
CREATE TABLE IF NOT EXISTS company (
|
|
220
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
221
|
+
slug TEXT NOT NULL,
|
|
222
|
+
name TEXT NOT NULL,
|
|
223
|
+
legal_name TEXT,
|
|
224
|
+
logo_url TEXT,
|
|
225
|
+
favicon_url TEXT,
|
|
226
|
+
primary_color TEXT,
|
|
227
|
+
auth_bg_color TEXT,
|
|
228
|
+
support_email TEXT,
|
|
229
|
+
website_url TEXT,
|
|
230
|
+
tagline TEXT,
|
|
231
|
+
meta_json TEXT,
|
|
232
|
+
created_at INTEGER NOT NULL,
|
|
233
|
+
updated_at INTEGER NOT NULL
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_company_slug ON company(slug);
|
|
237
|
+
|
|
238
|
+
INSERT OR IGNORE INTO company (
|
|
239
|
+
id, slug, name, website_url, created_at, updated_at
|
|
240
|
+
) VALUES (
|
|
241
|
+
${sqlString(`co_${config.companySlug}`)},
|
|
242
|
+
${sqlString(config.companySlug)},
|
|
243
|
+
${sqlString(config.displayName)},
|
|
244
|
+
${sqlStringOrNull(config.homepageUrl)},
|
|
245
|
+
unixepoch(),
|
|
246
|
+
unixepoch()
|
|
247
|
+
);
|
|
248
|
+
`;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function consentCatalogMigration(config) {
|
|
252
|
+
return `-- OAuth resource/scope semantics. Issuer branding remains in company.
|
|
253
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_resources (
|
|
254
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
255
|
+
audience TEXT NOT NULL UNIQUE,
|
|
256
|
+
resource_type TEXT NOT NULL DEFAULT 'mcp',
|
|
257
|
+
display_name TEXT NOT NULL,
|
|
258
|
+
description TEXT,
|
|
259
|
+
logo_url TEXT,
|
|
260
|
+
homepage_url TEXT,
|
|
261
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
262
|
+
is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
|
|
263
|
+
created_at INTEGER NOT NULL,
|
|
264
|
+
updated_at INTEGER NOT NULL
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_scopes (
|
|
268
|
+
scope TEXT PRIMARY KEY NOT NULL,
|
|
269
|
+
label TEXT NOT NULL,
|
|
270
|
+
description TEXT NOT NULL,
|
|
271
|
+
category TEXT NOT NULL DEFAULT 'general',
|
|
272
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal'
|
|
273
|
+
CHECK (sensitivity IN ('normal','elevated','sensitive')),
|
|
274
|
+
is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
|
|
275
|
+
sort_order INTEGER NOT NULL DEFAULT 50,
|
|
276
|
+
created_at INTEGER NOT NULL,
|
|
277
|
+
updated_at INTEGER NOT NULL
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_resource_scopes (
|
|
281
|
+
resource_id TEXT NOT NULL,
|
|
282
|
+
scope TEXT NOT NULL,
|
|
283
|
+
required INTEGER NOT NULL DEFAULT 0 CHECK (required IN (0,1)),
|
|
284
|
+
sort_order INTEGER NOT NULL DEFAULT 50,
|
|
285
|
+
PRIMARY KEY (resource_id, scope),
|
|
286
|
+
FOREIGN KEY (resource_id) REFERENCES identity_oauth_resources(id) ON DELETE CASCADE,
|
|
287
|
+
FOREIGN KEY (scope) REFERENCES identity_oauth_scopes(scope) ON DELETE CASCADE
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
INSERT OR IGNORE INTO identity_oauth_resources (
|
|
291
|
+
id, audience, display_name, homepage_url, created_at, updated_at
|
|
292
|
+
) VALUES (
|
|
293
|
+
${sqlString(`res_${config.projectName}`)},
|
|
294
|
+
${sqlString(config.audience)},
|
|
295
|
+
${sqlString(config.displayName)},
|
|
296
|
+
${sqlStringOrNull(config.homepageUrl)},
|
|
297
|
+
unixepoch(),
|
|
298
|
+
unixepoch()
|
|
299
|
+
);
|
|
300
|
+
${(config.scopes || []).map((s) => `
|
|
301
|
+
INSERT OR IGNORE INTO identity_oauth_scopes (
|
|
302
|
+
scope, label, description, category, sensitivity, created_at, updated_at
|
|
303
|
+
) VALUES (
|
|
304
|
+
${sqlString(s.scope)},
|
|
305
|
+
${sqlString(s.label)},
|
|
306
|
+
${sqlString(s.description)},
|
|
307
|
+
${sqlString(s.category)},
|
|
308
|
+
${sqlString(s.sensitivity)},
|
|
309
|
+
unixepoch(),
|
|
310
|
+
unixepoch()
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
INSERT OR IGNORE INTO identity_oauth_resource_scopes (
|
|
314
|
+
resource_id, scope
|
|
315
|
+
) VALUES (
|
|
316
|
+
${sqlString(`res_${config.projectName}`)},
|
|
317
|
+
${sqlString(s.scope)}
|
|
318
|
+
);
|
|
319
|
+
`).join('')}
|
|
320
|
+
`;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export function resolveMcpServerTemplateConfig(input = {}) {
|
|
324
|
+
const preset = getMcpServerPreset(input.preset || 'heuristics');
|
|
325
|
+
const projectName = slug(input.projectName || input.name || 'my-mcp-server');
|
|
326
|
+
return Object.freeze({
|
|
327
|
+
preset: preset.key,
|
|
328
|
+
projectName,
|
|
329
|
+
displayName: String(input.displayName || preset.displayName || projectName),
|
|
330
|
+
companyName: String(input.companyName || preset.companyName || 'Your Company'),
|
|
331
|
+
companySlug: String(input.companySlug || preset.companySlug || 'default'),
|
|
332
|
+
homepageUrl: String(input.homepageUrl || preset.homepageUrl),
|
|
333
|
+
audience: String(input.audience || preset.audience),
|
|
334
|
+
issuer: String(input.issuer || preset.issuer),
|
|
335
|
+
authMode: String(input.authMode || preset.authMode || 'oauth'),
|
|
336
|
+
scopes: Array.isArray(input.scopes) ? input.scopes : preset.scopes,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export function mcpServerTemplates(input = {}) {
|
|
341
|
+
const config = resolveMcpServerTemplateConfig(input);
|
|
342
|
+
const manifest = buildManifest(config);
|
|
343
|
+
|
|
344
|
+
return {
|
|
345
|
+
'package.json': JSON.stringify({
|
|
346
|
+
name: config.projectName,
|
|
347
|
+
version: '0.1.0',
|
|
348
|
+
private: true,
|
|
349
|
+
type: 'module',
|
|
350
|
+
scripts: { dev: 'wrangler dev', deploy: 'wrangler deploy' },
|
|
351
|
+
dependencies: {
|
|
352
|
+
'@modelcontextprotocol/sdk': '1.30.0',
|
|
353
|
+
zod: '4.6.5',
|
|
354
|
+
},
|
|
355
|
+
devDependencies: { wrangler: '4.141.0' },
|
|
356
|
+
}, null, 2) + '\n',
|
|
357
|
+
|
|
358
|
+
'agentsam.mcp.json': JSON.stringify(manifest, null, 2) + '\n',
|
|
359
|
+
|
|
360
|
+
'wrangler.jsonc': JSON.stringify({
|
|
361
|
+
name: config.projectName,
|
|
362
|
+
main: 'src/index.js',
|
|
363
|
+
compatibility_date: '2026-09-27',
|
|
364
|
+
vars: {
|
|
365
|
+
MCP_AUTH_MODE: config.authMode,
|
|
366
|
+
MCP_AUTH_ISSUER: config.issuer,
|
|
367
|
+
MCP_RESOURCE_AUDIENCE: config.audience,
|
|
368
|
+
},
|
|
369
|
+
}, null, 2) + '\n',
|
|
370
|
+
|
|
371
|
+
'.dev.vars.example': [
|
|
372
|
+
'# Local-only proof. Production remains fail-closed OAuth.',
|
|
373
|
+
'MCP_AUTH_MODE=public',
|
|
374
|
+
'# MCP_TOKEN_VERIFY_URL=https://your-issuer.example/api/oauth/token/verify',
|
|
375
|
+
'',
|
|
376
|
+
].join('\n'),
|
|
377
|
+
|
|
378
|
+
'src/index.js': workerSource(manifest),
|
|
379
|
+
'src/oauth.js': oauthSource(),
|
|
380
|
+
'migrations/001_identity_company.sql': companyMigration(config),
|
|
381
|
+
'migrations/002_oauth_consent_catalog.sql': consentCatalogMigration(config),
|
|
382
|
+
|
|
383
|
+
'README.md': `# ${config.displayName}
|
|
384
|
+
|
|
385
|
+
Generated by AgentSam MCP factory.
|
|
386
|
+
|
|
387
|
+
- MCP Streamable HTTP: \`/mcp\`
|
|
388
|
+
- Protected-resource metadata: \`/.well-known/oauth-protected-resource\`
|
|
389
|
+
- OAuth is fail-closed by default.
|
|
390
|
+
- Configure \`MCP_TOKEN_VERIFY_URL\` with a verifier that returns token audience and scope data.
|
|
391
|
+
- Issuer branding comes from the portable \`company\` table.
|
|
392
|
+
- OAuth resource and scope semantics are separate from issuer branding.
|
|
393
|
+
|
|
394
|
+
For local protocol testing only, copy \`.dev.vars.example\` to \`.dev.vars\`.
|
|
395
|
+
`,
|
|
396
|
+
};
|
|
397
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const MCP_SERVER_PRESETS = Object.freeze({
|
|
2
|
+
heuristics: Object.freeze({
|
|
3
|
+
key: 'heuristics',
|
|
4
|
+
displayName: 'Heuristics MCP',
|
|
5
|
+
description: 'Machine-first MCP starter with portable OAuth, identity branding, and deterministic diagnostics.',
|
|
6
|
+
companyName: 'Your Company',
|
|
7
|
+
companySlug: 'default',
|
|
8
|
+
homepageUrl: 'https://example.com',
|
|
9
|
+
audience: 'https://example.com/mcp',
|
|
10
|
+
issuer: 'https://example.com',
|
|
11
|
+
authMode: 'oauth',
|
|
12
|
+
scopes: [
|
|
13
|
+
{
|
|
14
|
+
scope: 'mcp:read',
|
|
15
|
+
label: 'MCP resources',
|
|
16
|
+
description: 'Read approved MCP resources.',
|
|
17
|
+
category: 'mcp',
|
|
18
|
+
sensitivity: 'normal',
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export function getMcpServerPreset(key = 'heuristics') {
|
|
25
|
+
const normalized = String(key || 'heuristics').trim().toLowerCase();
|
|
26
|
+
const preset = MCP_SERVER_PRESETS[normalized];
|
|
27
|
+
if (!preset) throw new Error('unknown_mcp_server_preset:' + normalized);
|
|
28
|
+
return preset;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function listMcpServerPresets() {
|
|
32
|
+
return Object.values(MCP_SERVER_PRESETS).map((preset) => ({
|
|
33
|
+
key: preset.key,
|
|
34
|
+
display_name: preset.displayName,
|
|
35
|
+
description: preset.description,
|
|
36
|
+
company_name: preset.companyName,
|
|
37
|
+
audience: preset.audience,
|
|
38
|
+
}));
|
|
39
|
+
}
|