@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
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
-- identity.oauth-server — OPTIONAL pack for products that issue their own
|
|
2
|
+
-- client IDs, authorization codes, access tokens, and refresh tokens.
|
|
3
|
+
-- Do not apply unless the installed product is an OAuth authorization server.
|
|
4
|
+
|
|
5
|
+
INSERT OR IGNORE INTO identity_schema_meta (key, value)
|
|
6
|
+
VALUES ('pack_oauth_server', '1');
|
|
7
|
+
|
|
8
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_clients (
|
|
9
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
10
|
+
client_id TEXT NOT NULL UNIQUE,
|
|
11
|
+
client_secret_hash TEXT,
|
|
12
|
+
name TEXT NOT NULL,
|
|
13
|
+
redirect_uris_json TEXT NOT NULL DEFAULT '[]',
|
|
14
|
+
grant_types_json TEXT NOT NULL DEFAULT '["authorization_code"]',
|
|
15
|
+
token_endpoint_auth_method TEXT NOT NULL DEFAULT 'none',
|
|
16
|
+
created_at INTEGER NOT NULL,
|
|
17
|
+
updated_at INTEGER NOT NULL
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_authorization_codes (
|
|
21
|
+
code_hash TEXT PRIMARY KEY NOT NULL,
|
|
22
|
+
client_id TEXT NOT NULL,
|
|
23
|
+
user_id TEXT NOT NULL,
|
|
24
|
+
redirect_uri TEXT NOT NULL,
|
|
25
|
+
scopes_json TEXT NOT NULL DEFAULT '[]',
|
|
26
|
+
code_challenge TEXT,
|
|
27
|
+
code_challenge_method TEXT,
|
|
28
|
+
expires_at INTEGER NOT NULL,
|
|
29
|
+
consumed_at INTEGER,
|
|
30
|
+
created_at INTEGER NOT NULL,
|
|
31
|
+
FOREIGN KEY (user_id) REFERENCES identity_users(id)
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_access_tokens (
|
|
35
|
+
token_hash TEXT PRIMARY KEY NOT NULL,
|
|
36
|
+
client_id TEXT NOT NULL,
|
|
37
|
+
user_id TEXT NOT NULL,
|
|
38
|
+
scopes_json TEXT NOT NULL DEFAULT '[]',
|
|
39
|
+
expires_at INTEGER NOT NULL,
|
|
40
|
+
revoked_at INTEGER,
|
|
41
|
+
created_at INTEGER NOT NULL,
|
|
42
|
+
FOREIGN KEY (user_id) REFERENCES identity_users(id)
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_refresh_tokens (
|
|
46
|
+
token_hash TEXT PRIMARY KEY NOT NULL,
|
|
47
|
+
client_id TEXT NOT NULL,
|
|
48
|
+
user_id TEXT NOT NULL,
|
|
49
|
+
scopes_json TEXT NOT NULL DEFAULT '[]',
|
|
50
|
+
expires_at INTEGER NOT NULL,
|
|
51
|
+
revoked_at INTEGER,
|
|
52
|
+
created_at INTEGER NOT NULL,
|
|
53
|
+
FOREIGN KEY (user_id) REFERENCES identity_users(id)
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_grants (
|
|
57
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
58
|
+
client_id TEXT NOT NULL,
|
|
59
|
+
user_id TEXT NOT NULL,
|
|
60
|
+
scopes_json TEXT NOT NULL DEFAULT '[]',
|
|
61
|
+
created_at INTEGER NOT NULL,
|
|
62
|
+
revoked_at INTEGER,
|
|
63
|
+
FOREIGN KEY (user_id) REFERENCES identity_users(id)
|
|
64
|
+
);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
-- identity.oauth-server consent catalog.
|
|
2
|
+
-- Issuer branding remains owned by the portable company table.
|
|
3
|
+
|
|
4
|
+
INSERT OR IGNORE INTO identity_schema_meta (key, value)
|
|
5
|
+
VALUES ('pack_oauth_consent_catalog', '1');
|
|
6
|
+
|
|
7
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_resources (
|
|
8
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
9
|
+
audience TEXT NOT NULL UNIQUE,
|
|
10
|
+
resource_type TEXT NOT NULL DEFAULT 'mcp',
|
|
11
|
+
display_name TEXT NOT NULL,
|
|
12
|
+
description TEXT,
|
|
13
|
+
logo_url TEXT,
|
|
14
|
+
homepage_url TEXT,
|
|
15
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
16
|
+
is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
|
|
17
|
+
created_at INTEGER NOT NULL,
|
|
18
|
+
updated_at INTEGER NOT NULL
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_scopes (
|
|
22
|
+
scope TEXT PRIMARY KEY NOT NULL,
|
|
23
|
+
label TEXT NOT NULL,
|
|
24
|
+
description TEXT NOT NULL,
|
|
25
|
+
category TEXT NOT NULL DEFAULT 'general',
|
|
26
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal'
|
|
27
|
+
CHECK (sensitivity IN ('normal','elevated','sensitive')),
|
|
28
|
+
is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
|
|
29
|
+
sort_order INTEGER NOT NULL DEFAULT 50,
|
|
30
|
+
created_at INTEGER NOT NULL,
|
|
31
|
+
updated_at INTEGER NOT NULL
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE TABLE IF NOT EXISTS identity_oauth_resource_scopes (
|
|
35
|
+
resource_id TEXT NOT NULL,
|
|
36
|
+
scope TEXT NOT NULL,
|
|
37
|
+
required INTEGER NOT NULL DEFAULT 0 CHECK (required IN (0,1)),
|
|
38
|
+
sort_order INTEGER NOT NULL DEFAULT 50,
|
|
39
|
+
PRIMARY KEY (resource_id, scope),
|
|
40
|
+
FOREIGN KEY (resource_id) REFERENCES identity_oauth_resources(id) ON DELETE CASCADE,
|
|
41
|
+
FOREIGN KEY (scope) REFERENCES identity_oauth_scopes(scope) ON DELETE CASCADE
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_identity_oauth_resources_active
|
|
45
|
+
ON identity_oauth_resources(is_active, resource_type);
|
|
46
|
+
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_identity_oauth_resource_scopes_sort
|
|
48
|
+
ON identity_oauth_resource_scopes(resource_id, sort_order, scope);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inneranimalmedia/agentsam-sdk-identity",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.5",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Identity module for @inneranimalmedia/agentsam-sdk (workspace \u2014 publish via root SDK)",
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
"./contracts/auth-config": "./src/contracts/auth-config.js",
|
|
30
30
|
"./oauth/callback": "./src/oauth/callback.js",
|
|
31
31
|
"./frontend/auth-portal/*": "./src/frontend/auth-portal/*",
|
|
32
|
-
"./providers/cloudflare": "./src/providers/cloudflare/index.js"
|
|
32
|
+
"./providers/cloudflare": "./src/providers/cloudflare/index.js",
|
|
33
|
+
"./oauth/consent-view": "./src/oauth/consent-view.js"
|
|
33
34
|
},
|
|
34
35
|
"scripts": {
|
|
35
36
|
"test": "node --test tests/*.test.mjs",
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import process from 'node:process';
|
|
5
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
6
|
+
import {
|
|
7
|
+
applySqliteIdentityMigrations,
|
|
8
|
+
createSqliteIdentityAdapter,
|
|
9
|
+
} from '../src/adapters/sqlite/index.js';
|
|
10
|
+
import {
|
|
11
|
+
createRouteRegistry,
|
|
12
|
+
projectionFromAppManifest,
|
|
13
|
+
} from '../src/contracts/route-projection.js';
|
|
14
|
+
import { createIdentityService } from '../src/server/identity-service.js';
|
|
15
|
+
import { hashPassword } from '../src/core/password-crypto.js';
|
|
16
|
+
|
|
17
|
+
function readStdin() {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
let body = '';
|
|
20
|
+
process.stdin.setEncoding('utf8');
|
|
21
|
+
process.stdin.on('data', (chunk) => { body += chunk; });
|
|
22
|
+
process.stdin.on('end', () => {
|
|
23
|
+
try { resolve(body.trim() ? JSON.parse(body) : {}); }
|
|
24
|
+
catch (error) { reject(error); }
|
|
25
|
+
});
|
|
26
|
+
process.stdin.on('error', reject);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function wrapDatabase(database, filePath) {
|
|
31
|
+
return {
|
|
32
|
+
filePath,
|
|
33
|
+
prepare(sql) {
|
|
34
|
+
const statement = database.prepare(sql);
|
|
35
|
+
const bound = (values = []) => ({
|
|
36
|
+
async run() { return statement.run(...values); },
|
|
37
|
+
async first() { return statement.get(...values) ?? null; },
|
|
38
|
+
async all() { return { results: statement.all(...values) }; },
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
bind(...values) { return bound(values); },
|
|
42
|
+
async run() { return statement.run(); },
|
|
43
|
+
async first() { return statement.get() ?? null; },
|
|
44
|
+
async all() { return { results: statement.all() }; },
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
exec(sql) { database.exec(sql); },
|
|
48
|
+
close() { database.close(); },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function sanitizeUser(user) {
|
|
53
|
+
if (!user) return null;
|
|
54
|
+
return {
|
|
55
|
+
id: user.id,
|
|
56
|
+
email: user.email,
|
|
57
|
+
display_name: user.display_name ?? null,
|
|
58
|
+
status: user.status ?? null,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const request = await readStdin();
|
|
63
|
+
const dbPath = path.resolve(
|
|
64
|
+
process.env.AGENTSAM_IDENTITY_DB || '.agentsam/data/local-studio-identity.sqlite',
|
|
65
|
+
);
|
|
66
|
+
const manifestPath = path.resolve(
|
|
67
|
+
process.env.AGENTSAM_IDENTITY_APP_MANIFEST
|
|
68
|
+
|| new URL('../../../apps/local-studio/agentsam.app.json', import.meta.url).pathname,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true, mode: 0o700 });
|
|
72
|
+
const nativeDb = new DatabaseSync(dbPath);
|
|
73
|
+
try {
|
|
74
|
+
if (process.platform !== 'win32') {
|
|
75
|
+
try { fs.chmodSync(dbPath, 0o600); } catch {}
|
|
76
|
+
}
|
|
77
|
+
const db = wrapDatabase(nativeDb, dbPath);
|
|
78
|
+
await applySqliteIdentityMigrations(db);
|
|
79
|
+
const adapter = createSqliteIdentityAdapter(db);
|
|
80
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
81
|
+
const routeRegistry = createRouteRegistry([projectionFromAppManifest(manifest)]);
|
|
82
|
+
const identity = createIdentityService({
|
|
83
|
+
adapter,
|
|
84
|
+
app: { id: manifest.id },
|
|
85
|
+
routeRegistry,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
let result;
|
|
89
|
+
switch (request.op) {
|
|
90
|
+
case 'status': {
|
|
91
|
+
const sessionId = String(request.session_id || '').trim();
|
|
92
|
+
if (!sessionId) {
|
|
93
|
+
result = { ok: true, authenticated: false, user: null };
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
const session = await identity.sessionFromRequest(new Request('http://local.identity/session', {
|
|
97
|
+
headers: { Authorization: `Bearer ${sessionId}` },
|
|
98
|
+
}));
|
|
99
|
+
result = {
|
|
100
|
+
ok: true,
|
|
101
|
+
authenticated: Boolean(session),
|
|
102
|
+
user: sanitizeUser(session?.user),
|
|
103
|
+
};
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
case 'login': {
|
|
108
|
+
const login = await identity.loginWithPassword({
|
|
109
|
+
email: request.email,
|
|
110
|
+
password: request.password,
|
|
111
|
+
});
|
|
112
|
+
result = login.ok
|
|
113
|
+
? {
|
|
114
|
+
ok: true,
|
|
115
|
+
authenticated: true,
|
|
116
|
+
session_id: login.sessionId,
|
|
117
|
+
user: sanitizeUser(login.user),
|
|
118
|
+
redirect: identity.resolvePostLoginPath(request.next || null),
|
|
119
|
+
}
|
|
120
|
+
: login;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
case 'signup': {
|
|
125
|
+
const signup = await identity.signup({
|
|
126
|
+
email: request.email,
|
|
127
|
+
password: request.password,
|
|
128
|
+
displayName: request.display_name,
|
|
129
|
+
});
|
|
130
|
+
result = signup.ok
|
|
131
|
+
? {
|
|
132
|
+
ok: true,
|
|
133
|
+
authenticated: true,
|
|
134
|
+
session_id: signup.sessionId,
|
|
135
|
+
user: sanitizeUser(signup.user),
|
|
136
|
+
redirect: identity.resolvePostLoginPath(request.next || null),
|
|
137
|
+
}
|
|
138
|
+
: signup;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
case 'logout': {
|
|
143
|
+
const sessionId = String(request.session_id || '').trim();
|
|
144
|
+
if (sessionId) {
|
|
145
|
+
await identity.logout(new Request('http://local.identity/logout', {
|
|
146
|
+
headers: { Authorization: `Bearer ${sessionId}` },
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
result = { ok: true };
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
case 'reset_password': {
|
|
154
|
+
const email = String(request.email || '').trim().toLowerCase();
|
|
155
|
+
const password = String(request.password || '');
|
|
156
|
+
if (!email || password.length < 8) {
|
|
157
|
+
result = { ok: false, error: 'email_and_valid_password_required' };
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
const user = await adapter.findUserByEmail(email);
|
|
161
|
+
if (!user) {
|
|
162
|
+
result = { ok: false, error: 'account_not_found' };
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
const { saltHex, hashHex } = await hashPassword(password);
|
|
166
|
+
await adapter.updateUserPassword(user.id, hashHex, saltHex);
|
|
167
|
+
result = { ok: true };
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
default:
|
|
172
|
+
result = { ok: false, error: 'unsupported_identity_operation' };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
process.stdout.write(JSON.stringify(result));
|
|
176
|
+
} catch (error) {
|
|
177
|
+
process.stdout.write(JSON.stringify({
|
|
178
|
+
ok: false,
|
|
179
|
+
error: error?.message || String(error),
|
|
180
|
+
}));
|
|
181
|
+
process.exitCode = 1;
|
|
182
|
+
} finally {
|
|
183
|
+
try { nativeDb.close(); } catch {}
|
|
184
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Local static preview for
|
|
3
|
+
* Local static preview for the portable AgentSam auth portal HTML (1:1 paths: /auth/login, /auth/signup, /auth/reset).
|
|
4
4
|
* API routes are stubbed so forms and globe-exit transitions work without a Worker.
|
|
5
5
|
*/
|
|
6
6
|
import http from 'node:http';
|
|
@@ -119,14 +119,14 @@ function hubHtml(baseUrl) {
|
|
|
119
119
|
const PREVIEW_COMPANY = {
|
|
120
120
|
id: 'co_default',
|
|
121
121
|
slug: 'default',
|
|
122
|
-
name: '
|
|
123
|
-
legalName: '
|
|
124
|
-
logoUrl: '
|
|
125
|
-
faviconUrl:
|
|
122
|
+
name: 'AgentSam',
|
|
123
|
+
legalName: 'AgentSam',
|
|
124
|
+
logoUrl: '/shared/agentsam-mark.svg',
|
|
125
|
+
faviconUrl: null,
|
|
126
126
|
primaryColor: '#007AFF',
|
|
127
127
|
authBgColor: '#050508',
|
|
128
|
-
supportEmail: '
|
|
129
|
-
websiteUrl: 'https://
|
|
128
|
+
supportEmail: 'support@agentsam.dev',
|
|
129
|
+
websiteUrl: 'https://agentsam.dev',
|
|
130
130
|
tagline: 'Instant Access',
|
|
131
131
|
meta: {
|
|
132
132
|
privacyUrl: '/privacy',
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { SESSION_POLICY } from '../../core/constants.js';
|
|
2
|
+
import { IdentitySchemaError } from '../../contracts/identity-store.js';
|
|
3
|
+
import { IDENTITY_STORE_SCHEMA_VERSION } from '../../contracts/identity-store.js';
|
|
1
4
|
import { newAccountIdentityId, newAuthUserId, newSessionId, newAuthEventId, nowUnix } from './ids.js';
|
|
2
|
-
import { AUTH_SESSION_TTL_SECONDS } from '../../core/constants.js';
|
|
3
5
|
import { DEFAULT_COMPANY_ID, DEFAULT_COMPANY_SLUG, normalizeCompanyRow } from '../../contracts/company.js';
|
|
4
6
|
|
|
7
|
+
|
|
5
8
|
/**
|
|
6
9
|
* @typedef {object} D1Database
|
|
7
10
|
* @property {(sql: string) => { bind: (...args: unknown[]) => { first: () => Promise<unknown>, run: () => Promise<unknown>, all: () => Promise<{ results?: unknown[] }> } }} prepare
|
|
@@ -24,22 +27,45 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
24
27
|
if (!db?.prepare) {
|
|
25
28
|
throw new Error('cloudflare_d1_adapter_requires_db_binding');
|
|
26
29
|
}
|
|
27
|
-
const sessionTtlSeconds = options.sessionTtlSeconds ??
|
|
30
|
+
const sessionTtlSeconds = options.sessionTtlSeconds ?? SESSION_POLICY.browser.ttlSeconds;
|
|
28
31
|
|
|
29
32
|
return Object.freeze({
|
|
33
|
+
schemaVersion: IDENTITY_STORE_SCHEMA_VERSION,
|
|
30
34
|
sessionTtlSeconds,
|
|
35
|
+
backend: 'cloudflare-d1',
|
|
31
36
|
|
|
32
37
|
/**
|
|
33
38
|
* Append-only login/logout/failed-attempt audit trail (auth_event_log).
|
|
34
|
-
* Never throws
|
|
35
|
-
*
|
|
36
|
-
*
|
|
39
|
+
* Never throws — an observability write must not break a real auth flow.
|
|
40
|
+
* status remains the event outcome only ('ok' | 'failed').
|
|
41
|
+
* Richer context (session, capabilities, activity, client) goes in metadata_json.
|
|
42
|
+
* ip/userAgent are hashed (SHA-256) — raw values are never persisted.
|
|
37
43
|
*/
|
|
38
|
-
async logAuthEvent({
|
|
44
|
+
async logAuthEvent({
|
|
45
|
+
userId,
|
|
46
|
+
accountId,
|
|
47
|
+
eventType,
|
|
48
|
+
status = 'ok',
|
|
49
|
+
provider,
|
|
50
|
+
session,
|
|
51
|
+
capabilities,
|
|
52
|
+
activity,
|
|
53
|
+
client,
|
|
54
|
+
metadata,
|
|
55
|
+
request,
|
|
56
|
+
}) {
|
|
39
57
|
try {
|
|
40
58
|
const ip = request?.headers?.get?.('cf-connecting-ip') || request?.headers?.get?.('x-forwarded-for') || '';
|
|
41
59
|
const ua = request?.headers?.get?.('user-agent') || '';
|
|
42
60
|
const [ipHash, uaHash] = await Promise.all([hashValue(ip), hashValue(ua)]);
|
|
61
|
+
const envelope = {
|
|
62
|
+
...(metadata && typeof metadata === 'object' ? metadata : {}),
|
|
63
|
+
...(accountId ? { accountId } : {}),
|
|
64
|
+
...(session ? { session } : {}),
|
|
65
|
+
...(capabilities ? { capabilities } : {}),
|
|
66
|
+
...(activity ? { activity } : {}),
|
|
67
|
+
...(client ? { client } : {}),
|
|
68
|
+
};
|
|
43
69
|
await db.prepare(
|
|
44
70
|
`INSERT INTO auth_event_log
|
|
45
71
|
(id, user_id, event_type, status, provider, metadata_json, ip_hash, user_agent_hash)
|
|
@@ -50,7 +76,7 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
50
76
|
eventType,
|
|
51
77
|
status,
|
|
52
78
|
provider || null,
|
|
53
|
-
|
|
79
|
+
JSON.stringify(envelope),
|
|
54
80
|
ipHash,
|
|
55
81
|
uaHash,
|
|
56
82
|
).run();
|
|
@@ -59,6 +85,34 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
59
85
|
}
|
|
60
86
|
},
|
|
61
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Account/session activity snapshot for auth receipts (not event outcome).
|
|
90
|
+
* @param {string} userId
|
|
91
|
+
*/
|
|
92
|
+
async countAuthActivity(userId) {
|
|
93
|
+
if (!userId) {
|
|
94
|
+
return { loginCount: 0, activeSessionCount: 0, lastLoginAt: null };
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const logins = await db.prepare(
|
|
98
|
+
`SELECT COUNT(*) AS c, MAX(created_at) AS last_at
|
|
99
|
+
FROM auth_event_log
|
|
100
|
+
WHERE user_id = ? AND event_type = 'login' AND status = 'ok'`,
|
|
101
|
+
).bind(userId).first();
|
|
102
|
+
const sessions = await db.prepare(
|
|
103
|
+
`SELECT COUNT(*) AS c FROM auth_sessions
|
|
104
|
+
WHERE user_id = ? AND revoked_at IS NULL AND expires_at > ?`,
|
|
105
|
+
).bind(userId, nowUnix()).first();
|
|
106
|
+
return {
|
|
107
|
+
loginCount: Number(logins?.c || 0),
|
|
108
|
+
activeSessionCount: Number(sessions?.c || 0),
|
|
109
|
+
lastLoginAt: logins?.last_at != null ? Number(logins.last_at) : null,
|
|
110
|
+
};
|
|
111
|
+
} catch {
|
|
112
|
+
return { loginCount: 0, activeSessionCount: 0, lastLoginAt: null };
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
|
|
62
116
|
async findUserByEmail(email) {
|
|
63
117
|
const row = await db.prepare(
|
|
64
118
|
`SELECT id, email, display_name, password_hash, salt, status, created_at, updated_at
|
|
@@ -79,6 +133,11 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
79
133
|
const id = newAuthUserId();
|
|
80
134
|
const ts = nowUnix();
|
|
81
135
|
const normalizedEmail = String(email || '').trim().toLowerCase();
|
|
136
|
+
// accounts = SSOT; auth_users = login principal (1:1 id in portable scaffold).
|
|
137
|
+
await db.prepare(
|
|
138
|
+
`INSERT INTO accounts (id, email, display_name, status, created_at, updated_at)
|
|
139
|
+
VALUES (?, ?, ?, 'active', ?, ?)`,
|
|
140
|
+
).bind(id, normalizedEmail, displayName || null, ts, ts).run();
|
|
82
141
|
await db.prepare(
|
|
83
142
|
`INSERT INTO auth_users (id, email, display_name, password_hash, salt, status, created_at, updated_at)
|
|
84
143
|
VALUES (?, ?, ?, ?, ?, 'active', ?, ?)`,
|
|
@@ -91,24 +150,48 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
91
150
|
await db.prepare(
|
|
92
151
|
`UPDATE auth_users SET password_hash = ?, salt = ?, updated_at = ? WHERE id = ?`,
|
|
93
152
|
).bind(passwordHash, salt, ts, userId).run();
|
|
153
|
+
await db.prepare(
|
|
154
|
+
`UPDATE accounts SET updated_at = ? WHERE id = ?`,
|
|
155
|
+
).bind(ts, userId).run().catch(() => {});
|
|
94
156
|
},
|
|
95
157
|
|
|
96
158
|
async findUserByProvider(provider, providerSubject) {
|
|
97
159
|
const row = await db.prepare(
|
|
98
160
|
`SELECT u.id, u.email, u.display_name, u.password_hash, u.salt, u.status, u.created_at, u.updated_at
|
|
99
161
|
FROM account_identities ai
|
|
100
|
-
JOIN
|
|
162
|
+
JOIN accounts a ON a.id = ai.account_id
|
|
163
|
+
JOIN auth_users u ON u.id = a.id
|
|
101
164
|
WHERE ai.provider = ? AND ai.provider_subject = ?
|
|
165
|
+
AND COALESCE(a.status, 'active') = 'active'
|
|
102
166
|
LIMIT 1`,
|
|
103
167
|
).bind(provider, providerSubject).first();
|
|
104
168
|
return row || null;
|
|
105
169
|
},
|
|
106
170
|
|
|
107
171
|
async upsertProviderIdentity({ accountId, provider, providerSubject, email }) {
|
|
172
|
+
// Ensure SSOT account row exists (OAuth may create identity before password user).
|
|
173
|
+
const ts = nowUnix();
|
|
174
|
+
const account = await db.prepare(
|
|
175
|
+
`SELECT id FROM accounts WHERE id = ? LIMIT 1`,
|
|
176
|
+
).bind(accountId).first();
|
|
177
|
+
if (!account?.id) {
|
|
178
|
+
const authUser = await this.findUserById(accountId);
|
|
179
|
+
if (!authUser) throw new Error('account_ssot_missing');
|
|
180
|
+
await db.prepare(
|
|
181
|
+
`INSERT INTO accounts (id, email, display_name, status, created_at, updated_at)
|
|
182
|
+
VALUES (?, ?, ?, 'active', ?, ?)`,
|
|
183
|
+
).bind(
|
|
184
|
+
accountId,
|
|
185
|
+
authUser.email,
|
|
186
|
+
authUser.display_name || null,
|
|
187
|
+
authUser.created_at || ts,
|
|
188
|
+
ts,
|
|
189
|
+
).run();
|
|
190
|
+
}
|
|
191
|
+
|
|
108
192
|
const existing = await db.prepare(
|
|
109
193
|
`SELECT id FROM account_identities WHERE provider = ? AND provider_subject = ? LIMIT 1`,
|
|
110
194
|
).bind(provider, providerSubject).first();
|
|
111
|
-
const ts = nowUnix();
|
|
112
195
|
if (existing?.id) {
|
|
113
196
|
await db.prepare(
|
|
114
197
|
`UPDATE account_identities SET account_id = ?, email = ?, updated_at = ? WHERE id = ?`,
|
|
@@ -173,27 +256,73 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
173
256
|
return { ok: true, reason };
|
|
174
257
|
},
|
|
175
258
|
|
|
176
|
-
async
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
259
|
+
async createOAuthTransaction({ state, provider, codeVerifier, returnTo, redirectTo, appId, ttlSeconds = 600 }) {
|
|
260
|
+
if (!appId) {
|
|
261
|
+
throw new IdentitySchemaError(
|
|
262
|
+
'OAUTH_TRANSACTION_APP_ID_REQUIRED',
|
|
263
|
+
'OAuth transactions must include app_id',
|
|
264
|
+
);
|
|
265
|
+
}
|
|
182
266
|
const ts = nowUnix();
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
267
|
+
const expiresAt = ts + ttlSeconds;
|
|
268
|
+
try {
|
|
269
|
+
await db.prepare(
|
|
270
|
+
`INSERT INTO identity_oauth_states
|
|
271
|
+
(state, provider, code_verifier, redirect_to, app_id, expires_at, created_at)
|
|
272
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
273
|
+
).bind(state, provider, codeVerifier, returnTo ?? redirectTo ?? null, appId, expiresAt, ts).run();
|
|
274
|
+
} catch (err) {
|
|
275
|
+
throw new IdentitySchemaError(
|
|
276
|
+
'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
|
|
277
|
+
'identity_oauth_states.app_id required — apply migration 0015 (no silent pre-app_id fallback)',
|
|
278
|
+
{ cause: String(err?.message || err) },
|
|
279
|
+
);
|
|
280
|
+
}
|
|
187
281
|
},
|
|
188
282
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
283
|
+
/** @deprecated Use createOAuthTransaction */
|
|
284
|
+
async saveOAuthState(input) {
|
|
285
|
+
return this.createOAuthTransaction(input);
|
|
286
|
+
},
|
|
287
|
+
|
|
288
|
+
async consumeOAuthTransaction(state) {
|
|
289
|
+
let row;
|
|
290
|
+
try {
|
|
291
|
+
row = await db.prepare(
|
|
292
|
+
`SELECT state, provider, code_verifier, redirect_to, app_id, expires_at, created_at
|
|
293
|
+
FROM identity_oauth_states WHERE state = ? LIMIT 1`,
|
|
294
|
+
).bind(state).first();
|
|
295
|
+
} catch (err) {
|
|
296
|
+
throw new IdentitySchemaError(
|
|
297
|
+
'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
|
|
298
|
+
'identity_oauth_states.app_id column missing — apply migration 0015',
|
|
299
|
+
{ cause: String(err?.message || err) },
|
|
300
|
+
);
|
|
301
|
+
}
|
|
193
302
|
if (!row) return null;
|
|
194
303
|
await db.prepare(`DELETE FROM identity_oauth_states WHERE state = ?`).bind(state).run();
|
|
195
304
|
if (row.expires_at <= nowUnix()) return null;
|
|
196
|
-
|
|
305
|
+
if (!row.app_id) {
|
|
306
|
+
throw new IdentitySchemaError(
|
|
307
|
+
'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
|
|
308
|
+
'OAuth transaction missing app_id — refuse silent pre-app_id semantics',
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
return {
|
|
312
|
+
state: row.state,
|
|
313
|
+
provider: row.provider,
|
|
314
|
+
code_verifier: row.code_verifier,
|
|
315
|
+
redirect_to: row.redirect_to,
|
|
316
|
+
return_to: row.redirect_to,
|
|
317
|
+
app_id: row.app_id,
|
|
318
|
+
expires_at: row.expires_at,
|
|
319
|
+
created_at: row.created_at,
|
|
320
|
+
};
|
|
321
|
+
},
|
|
322
|
+
|
|
323
|
+
/** @deprecated Use consumeOAuthTransaction */
|
|
324
|
+
async consumeOAuthState(state) {
|
|
325
|
+
return this.consumeOAuthTransaction(state);
|
|
197
326
|
},
|
|
198
327
|
|
|
199
328
|
async getCompanyBySlug(slug = DEFAULT_COMPANY_SLUG) {
|