@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTSAM.md +11 -0
- package/README.md +15 -9
- package/apps/client-cms-editor/AGENTS.md +12 -0
- package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
- package/apps/client-cms-editor/README.md +72 -0
- package/apps/client-cms-editor/agentsam.app.json +57 -0
- package/apps/client-cms-editor/backend/README.md +5 -0
- package/apps/client-cms-editor/backend/package.json +22 -0
- package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
- package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
- package/apps/client-cms-editor/backend/src/index.ts +6 -0
- package/apps/client-cms-editor/backend/src/model.ts +115 -0
- package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
- package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
- package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
- package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
- package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
- package/apps/client-cms-editor/backend/tsconfig.json +15 -0
- package/apps/client-cms-editor/backend/worker/index.js +34 -0
- package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
- package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
- package/apps/client-cms-editor/frontend/index.html +12 -0
- package/apps/client-cms-editor/frontend/package.json +33 -0
- package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
- package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
- package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
- package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
- package/apps/client-cms-editor/frontend/src/index.ts +8 -0
- package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
- package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
- package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
- package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
- package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
- package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
- package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
- package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
- package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
- package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
- package/apps/client-cms-editor/package-lock.json +3832 -0
- package/apps/client-cms-editor/package.json +23 -0
- package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
- package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
- package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
- package/apps/client-cms-editor/shared/cms/package.json +21 -0
- package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
- package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
- package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
- package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
- package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
- package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
- package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
- package/bin/agentsam-rapid-rust +36 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
- package/docs/MACHINE_INTELLIGENCE.md +120 -0
- package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
- package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
- package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
- package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
- package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
- package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
- package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
- package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
- package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
- package/docs/contracts/capability-install-planner.md +67 -0
- package/docs/contracts/environment-vocabulary.md +195 -0
- package/docs/contracts/google-cloud-oauth-setup.md +199 -0
- package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
- package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
- package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
- package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
- package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
- package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
- package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
- package/docs/plugins.md +2 -2
- package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
- package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
- package/docs/product/README.md +8 -0
- package/docs/rapid-rust-wasm.md +35 -0
- package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
- package/package.json +73 -14
- package/packages/agentsam-brand/README.md +106 -11
- package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
- package/packages/agentsam-brand/package.json +39 -7
- package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
- package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
- package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
- package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
- package/packages/agentsam-brand/src/adapters/memory.js +31 -0
- package/packages/agentsam-brand/src/cli/controller.js +503 -0
- package/packages/agentsam-brand/src/cli/wizard.js +526 -0
- package/packages/agentsam-brand/src/core/capabilities.js +201 -0
- package/packages/agentsam-brand/src/core/derivatives.js +211 -0
- package/packages/agentsam-brand/src/core/errors.js +12 -0
- package/packages/agentsam-brand/src/core/ingest.js +195 -0
- package/packages/agentsam-brand/src/core/inspect.js +109 -0
- package/packages/agentsam-brand/src/core/keys.js +83 -0
- package/packages/agentsam-brand/src/core/naming.js +142 -0
- package/packages/agentsam-brand/src/core/optimize.js +316 -0
- package/packages/agentsam-brand/src/core/pack.js +305 -0
- package/packages/agentsam-brand/src/core/plan.js +276 -0
- package/packages/agentsam-brand/src/core/preview.js +159 -0
- package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
- package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
- package/packages/agentsam-brand/src/core/processors/index.js +148 -0
- package/packages/agentsam-brand/src/core/processors/native.js +82 -0
- package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
- package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
- package/packages/agentsam-brand/src/core/promote.js +288 -0
- package/packages/agentsam-brand/src/core/receipts.js +155 -0
- package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
- package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
- package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
- package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
- package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
- package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
- package/packages/agentsam-brand/src/index.js +193 -36
- package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
- package/packages/agentsam-brand/src/presets/favicon.json +17 -0
- package/packages/agentsam-brand/src/presets/hero.json +12 -0
- package/packages/agentsam-brand/src/presets/index.js +40 -0
- package/packages/agentsam-brand/src/presets/logo.json +12 -0
- package/packages/agentsam-brand/src/presets/model.json +8 -0
- package/packages/agentsam-brand/src/presets/og-image.json +10 -0
- package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
- package/packages/agentsam-brand/src/presets/social-image.json +10 -0
- package/packages/agentsam-brand/src/presets/web-image.json +10 -0
- package/packages/agentsam-contracts/src/artifacts.ts +41 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
- package/packages/agentsam-knowledge/src/providers/index.js +6 -4
- package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
- package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
- package/packages/agentsam-nav/package.json +2 -2
- package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
- package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
- package/packages/agentsam-rapid-rust/README.md +5 -0
- package/packages/agentsam-rapid-rust/src/main.rs +718 -0
- package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
- package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
- package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-repository/src/index.js +1 -0
- package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
- package/packages/agentsam-repository/src/source-types.js +85 -0
- package/packages/agentsam-vault/README.md +96 -0
- package/packages/agentsam-vault/package.json +32 -0
- package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
- package/packages/agentsam-vault/src/contracts/credential.js +132 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
- package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
- package/packages/agentsam-vault/src/index.d.ts +9 -0
- package/packages/agentsam-vault/src/index.js +27 -0
- package/packages/agentsam-vault/src/providers/registry.js +90 -0
- package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
- package/packages/agentsam-workbench/README.md +24 -0
- package/packages/agentsam-workbench/package.json +38 -0
- package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
- package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
- package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
- package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
- package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
- package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
- package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
- package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
- package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
- package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
- package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
- package/packages/agentsam-workbench/src/agent/index.ts +10 -0
- package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
- package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
- package/packages/agentsam-workbench/src/browser/index.ts +1 -0
- package/packages/agentsam-workbench/src/index.ts +6 -0
- package/packages/agentsam-workbench/src/project-control.css +160 -0
- package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
- package/packages/agentsam-workbench/src/projects/index.ts +1 -0
- package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
- package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
- package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
- package/packages/agentsam-workbench/src/shell/index.ts +4 -0
- package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
- package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
- package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
- package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
- package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
- package/packages/agentsam-workbench/tsconfig.json +13 -0
- package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
- package/packages/connectors/cloudflare/package.json +3 -1
- package/packages/connectors/cloudflare/src/api-client.js +279 -0
- package/packages/connectors/cloudflare/src/capabilities.js +585 -0
- package/packages/connectors/cloudflare/src/credential.js +318 -0
- package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
- package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
- package/packages/connectors/cloudflare/src/families/pages.js +151 -0
- package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
- package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
- package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
- package/packages/connectors/cloudflare/src/families/tags.js +124 -0
- package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
- package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
- package/packages/connectors/cloudflare/src/index.js +102 -265
- package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
- package/packages/connectors/cloudflare/src/owner.js +42 -12
- package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
- package/packages/connectors/cloudflare/src/routes.js +309 -144
- package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
- package/packages/connectors/cloudflare/src/vault.js +2 -2
- package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
- package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
- package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
- package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
- package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
- package/packages/identity/README.md +1 -1
- package/packages/identity/backend/README.md +1 -1
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
- package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
- package/packages/identity/package.json +4 -3
- package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
- package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
- package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
- package/packages/identity/src/adapters/sqlite/index.js +4 -1
- package/packages/identity/src/contracts/auth-config.js +28 -8
- package/packages/identity/src/contracts/external-identity.js +1 -1
- package/packages/identity/src/contracts/provider.js +1 -0
- package/packages/identity/src/frontend/auth-portal/README.md +2 -1
- package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
- package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
- package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
- package/packages/identity/src/index.js +16 -0
- package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
- package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
- package/packages/identity/src/migrations/README.md +5 -2
- package/packages/identity/src/oauth/README.md +10 -5
- package/packages/identity/src/oauth/consent-view.js +388 -0
- package/packages/identity/src/oauth/credentials.js +31 -11
- package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
- package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
- package/packages/identity/src/providers/cloudflare/profile.js +49 -14
- package/packages/identity/src/providers/iam/index.js +27 -5
- package/packages/identity/src/server/identity-service.js +31 -2
- package/packages/identity/src/server/worker-router.js +111 -81
- package/packages/identity/tests/auth-config.test.mjs +3 -2
- package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
- package/packages/identity/tests/identity-service.test.mjs +16 -0
- package/packages/identity/tests/native-session-worker.test.mjs +64 -0
- package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
- package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
- package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
- package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
- package/packages/runtime-protocol/src/index.js +154 -0
- package/packages/theme-scenes/README.md +164 -0
- package/packages/theme-scenes/package.json +53 -0
- package/packages/theme-scenes/src/blocks/index.js +30 -0
- package/packages/theme-scenes/src/contracts/index.js +286 -0
- package/packages/theme-scenes/src/demos/index.js +65 -0
- package/packages/theme-scenes/src/index.js +75 -0
- package/packages/theme-scenes/src/presets/index.js +263 -0
- package/packages/theme-scenes/src/runtime/compile.js +119 -0
- package/packages/theme-scenes/src/scenes/index.js +146 -0
- package/packages/theme-scenes/src/shell/index.js +47 -0
- package/packages/theme-scenes/src/themes/index.js +129 -0
- package/packages/theme-scenes/src/visuals/index.js +41 -0
- package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
- package/packages/work-graph/src/index.js +34 -1
- package/packages/work-graph/src/renderers/gantt-model.js +24 -0
- package/packages/work-graph/test/work-graph.test.mjs +27 -7
- package/protocol/README.md +15 -7
- package/protocol/apps/agentsam.app.v1.schema.json +89 -7
- package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
- package/protocol/assets/README.md +9 -0
- package/protocol/assets/asset-record.v1.schema.json +64 -0
- package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
- package/protocol/scoring/README.md +10 -0
- package/protocol/scoring/scorecard.v1.schema.json +65 -0
- package/protocol/ui/icon-registry.mjs +1 -0
- package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
- package/registry/cms-rust-machine-20260928/manifest.json +22 -0
- package/registry/cms-rust-machine-20260928/migration.sql +237 -0
- package/registry/cms-rust-machine-20260928/receipt.json +21 -0
- package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
- package/scripts/build_rapid_rust_cli.py +83 -0
- package/src/attachments/index.js +6 -0
- package/src/attachments/intake.js +235 -0
- package/src/capabilities/repository-snapshot.js +19 -2
- package/src/cli/command-catalog.js +8 -0
- package/src/cli.js +182 -26
- package/src/commands/account-auth.js +94 -8
- package/src/commands/app.js +307 -3
- package/src/commands/billing.js +127 -0
- package/src/commands/brand.js +74 -60
- package/src/commands/cheat-sheet.js +154 -0
- package/src/commands/cloudflare-login.js +222 -0
- package/src/commands/cloudflare.js +453 -23
- package/src/commands/codebaseindex.js +6 -1
- package/src/commands/compute.js +4 -0
- package/src/commands/connections.js +11 -5
- package/src/commands/credentials.js +116 -0
- package/src/commands/gcloud-auth.js +427 -0
- package/src/commands/google-cloud.js +375 -0
- package/src/commands/identity-init.js +2 -2
- package/src/commands/mcp.js +226 -33
- package/src/commands/ollama.js +3 -2
- package/src/commands/plugins.js +7 -2
- package/src/commands/product.js +36 -0
- package/src/commands/runtime-status.js +28 -9
- package/src/commands/runtime.js +313 -0
- package/src/commands/rust.js +24 -0
- package/src/commands/setup.js +279 -0
- package/src/commands/shell.js +16 -3
- package/src/commands/start-local.js +2 -2
- package/src/commands/terminal.js +171 -0
- package/src/commands/update.js +140 -0
- package/src/commands/whoami.js +329 -65
- package/src/features/resolve.js +1 -0
- package/src/index.js +4 -0
- package/src/indexing/ingest/inventory.js +254 -19
- package/src/indexing/ingest/materials.js +3 -9
- package/src/indexing/ingest/style-evidence.js +181 -0
- package/src/knowledge/source.js +3 -3
- package/src/lib/account-session.js +11 -4
- package/src/lib/app-authority.js +172 -0
- package/src/lib/auth.js +94 -21
- package/src/lib/core-client.js +5 -6
- package/src/lib/credentials-audit.js +451 -0
- package/src/lib/deploy/health.js +24 -6
- package/src/lib/detect-context.js +7 -1
- package/src/lib/google-cloud-connection.js +270 -0
- package/src/lib/google-cloud-inventory.js +385 -0
- package/src/lib/google-desktop-oauth.js +372 -0
- package/src/lib/google-studio-brokered-oauth.js +158 -0
- package/src/lib/identity-scaffold.js +24 -6
- package/src/lib/init-options.js +192 -0
- package/src/lib/local-scaffold.js +48 -16
- package/src/lib/provider-command-remediation.js +308 -0
- package/src/lib/provider-credentials.js +8 -0
- package/src/lib/scaffold/index.js +8 -2
- package/src/lib/scaffold/mcp-server.js +43 -0
- package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
- package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
- package/src/lib/scaffold/wizards/cms.js +93 -0
- package/src/lib/scaffold/wizards/mcp-server.js +61 -0
- package/src/lib/setup/contract.js +26 -0
- package/src/lib/setup/discover.js +116 -0
- package/src/lib/setup/execute.js +205 -0
- package/src/lib/setup/planner.js +134 -0
- package/src/lib/setup/recipes.js +235 -0
- package/src/lib/setup/runtime-persist.js +197 -0
- package/src/lib/setup/runtime.js +394 -0
- package/src/lib/slash-commands.js +2 -0
- package/src/lib/terminal/machine-identity.js +95 -0
- package/src/lib/terminal-local.js +164 -0
- package/src/lib/terminal-scopes.js +52 -0
- package/src/lib/whoami-capabilities.js +184 -0
- package/src/local-pty/server.js +34 -5
- package/src/mcp/authority.js +58 -108
- package/src/mcp/client-adapters.js +68 -144
- package/src/mcp/client.js +142 -122
- package/src/mcp/cloudflare-bundles.js +225 -0
- package/src/mcp/index.js +12 -0
- package/src/plugins/cloudflare.js +1 -1
- package/src/providers/ollama-chat.js +2 -1
- package/src/sam/types.js +27 -2
- package/src/security/inventory.js +12 -2
- package/src/security/local-vault.js +2 -0
- package/src/security/scan.js +1 -1
- package/test/account-session.test.mjs +3 -3
- package/test/app-authority-context.test.mjs +32 -0
- package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
- package/test/cli/mcp-client.test.mjs +21 -10
- package/test/cli/runtime-persist.test.mjs +56 -0
- package/test/cli/rust-command.test.mjs +21 -0
- package/test/credentials-audit.test.mjs +113 -0
- package/test/deploy-health-scan.test.mjs +29 -1
- package/test/gcloud-auth.test.mjs +111 -0
- package/test/google-cloud-connection.test.mjs +83 -0
- package/test/google-cloud-inventory.test.mjs +64 -0
- package/test/init-options.test.mjs +35 -0
- package/test/integration/app-command.test.mjs +30 -0
- package/test/integration/cad-project.test.mjs +4 -1
- package/test/integration/cms-app-scaffold.test.mjs +71 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
- package/test/integration/codebaseindex-ingest.test.mjs +48 -0
- package/test/integration/features-resolve.test.mjs +30 -11
- package/test/integration/inspect-path-cli.test.mjs +46 -0
- package/test/integration/inventory-evidence.test.mjs +125 -0
- package/test/integration/runtime-status.integration.test.mjs +2 -1
- package/test/knowledge.test.mjs +35 -1
- package/test/loopback-oauth.test.mjs +53 -0
- package/test/ollama.test.mjs +22 -0
- package/test/security.test.mjs +23 -0
- package/test/setup-planner.test.mjs +74 -0
- package/test/setup-runtime.test.mjs +51 -0
- package/test/terminal/local-pty.mock.test.mjs +3 -1
- package/test/terminal-machine-identity.test.mjs +88 -0
- package/test/whoami-resume.test.mjs +27 -6
- package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
- package/packages/work-graph/prototype/README.md +0 -32
- package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
- package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
- package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
- package/packages/work-graph/prototype-gnantt.html +0 -655
|
@@ -133,6 +133,11 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
133
133
|
const id = newAuthUserId();
|
|
134
134
|
const ts = nowUnix();
|
|
135
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();
|
|
136
141
|
await db.prepare(
|
|
137
142
|
`INSERT INTO auth_users (id, email, display_name, password_hash, salt, status, created_at, updated_at)
|
|
138
143
|
VALUES (?, ?, ?, ?, ?, 'active', ?, ?)`,
|
|
@@ -145,24 +150,48 @@ export function createCloudflareD1Adapter(db, options = {}) {
|
|
|
145
150
|
await db.prepare(
|
|
146
151
|
`UPDATE auth_users SET password_hash = ?, salt = ?, updated_at = ? WHERE id = ?`,
|
|
147
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(() => {});
|
|
148
156
|
},
|
|
149
157
|
|
|
150
158
|
async findUserByProvider(provider, providerSubject) {
|
|
151
159
|
const row = await db.prepare(
|
|
152
160
|
`SELECT u.id, u.email, u.display_name, u.password_hash, u.salt, u.status, u.created_at, u.updated_at
|
|
153
161
|
FROM account_identities ai
|
|
154
|
-
JOIN
|
|
162
|
+
JOIN accounts a ON a.id = ai.account_id
|
|
163
|
+
JOIN auth_users u ON u.id = a.id
|
|
155
164
|
WHERE ai.provider = ? AND ai.provider_subject = ?
|
|
165
|
+
AND COALESCE(a.status, 'active') = 'active'
|
|
156
166
|
LIMIT 1`,
|
|
157
167
|
).bind(provider, providerSubject).first();
|
|
158
168
|
return row || null;
|
|
159
169
|
},
|
|
160
170
|
|
|
161
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
|
+
|
|
162
192
|
const existing = await db.prepare(
|
|
163
193
|
`SELECT id FROM account_identities WHERE provider = ? AND provider_subject = ? LIMIT 1`,
|
|
164
194
|
).bind(provider, providerSubject).first();
|
|
165
|
-
const ts = nowUnix();
|
|
166
195
|
if (existing?.id) {
|
|
167
196
|
await db.prepare(
|
|
168
197
|
`UPDATE account_identities SET account_id = ?, email = ?, updated_at = ? WHERE id = ?`,
|
|
@@ -23,7 +23,10 @@ export async function applySqliteIdentityMigrations(db, opts = {}) {
|
|
|
23
23
|
'001_identity_core.sql',
|
|
24
24
|
'002_identity_oauth_client.sql',
|
|
25
25
|
];
|
|
26
|
-
if (opts.includeOAuthServer)
|
|
26
|
+
if (opts.includeOAuthServer) {
|
|
27
|
+
files.push('003_identity_oauth_server.sql');
|
|
28
|
+
files.push('004_identity_oauth_consent_catalog.sql');
|
|
29
|
+
}
|
|
27
30
|
|
|
28
31
|
for (const file of files) {
|
|
29
32
|
const sql = fs.readFileSync(path.join(SQLITE_MIGRATIONS_DIR, file), 'utf8');
|
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
* Browser login sessions and reusable API credentials are intentionally
|
|
5
5
|
* separate: login sessions are opaque, machine-local session state while
|
|
6
6
|
* AGENTSAM_API_KEY is an explicit delegated account credential.
|
|
7
|
+
*
|
|
8
|
+
* Namespaces (do not collapse):
|
|
9
|
+
* PLATFORM issuer → IAM_OAUTH_ISSUER (account API)
|
|
10
|
+
* APP host → agentsam.app.json hosts[] (e.g. local-studio)
|
|
11
|
+
* Never treat Local Studio host origin as an alias of IAM_OAUTH_ISSUER.
|
|
7
12
|
*/
|
|
8
13
|
|
|
9
|
-
export const DEFAULT_IAM_OAUTH_ISSUER = 'https://inneranimalmedia.com';
|
|
10
|
-
/** @deprecated Use DEFAULT_IAM_OAUTH_ISSUER. */
|
|
11
|
-
export const DEFAULT_IAM_ORIGIN = DEFAULT_IAM_OAUTH_ISSUER;
|
|
12
|
-
|
|
13
14
|
export const AGENTSAM_AUTH_ENV = Object.freeze({
|
|
14
15
|
iamIssuer: 'IAM_OAUTH_ISSUER',
|
|
15
16
|
iamOrigin: 'IAM_ORIGIN',
|
|
@@ -17,8 +18,23 @@ export const AGENTSAM_AUTH_ENV = Object.freeze({
|
|
|
17
18
|
iamClientSecret: 'IAM_CLIENT_SECRET',
|
|
18
19
|
apiKey: 'AGENTSAM_API_KEY',
|
|
19
20
|
bridgeKey: 'AGENTSAM_BRIDGE_KEY',
|
|
21
|
+
googleClientId: 'GOOGLE_CLIENT_ID',
|
|
22
|
+
googleClientSecret: 'GOOGLE_CLIENT_SECRET',
|
|
23
|
+
googleDesktopClientId: 'GOOGLE_DESKTOP_CLIENT_ID',
|
|
24
|
+
googleDesktopClientSecret: 'GOOGLE_DESKTOP_CLIENT_SECRET',
|
|
25
|
+
githubClientId: 'GITHUB_CLIENT_ID',
|
|
26
|
+
githubClientSecret: 'GITHUB_CLIENT_SECRET',
|
|
27
|
+
cloudflareOauthClientId: 'CLOUDFLARE_OAUTH_CLIENT_ID',
|
|
28
|
+
cloudflareOauthClientSecret: 'CLOUDFLARE_OAUTH_CLIENT_SECRET',
|
|
20
29
|
});
|
|
21
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Hosted AgentSam platform compatibility issuer — not an APP host and never a
|
|
33
|
+
* portable Local Studio default. Portable apps use packages/identity locally
|
|
34
|
+
* unless an installation explicitly selects a remote IAM adapter.
|
|
35
|
+
*/
|
|
36
|
+
export const PLATFORM_ACCOUNT_ISSUER = 'https://inneranimalmedia.com';
|
|
37
|
+
|
|
22
38
|
export const AGENTSAM_AUTH_CONTRACT = Object.freeze({
|
|
23
39
|
version: 2,
|
|
24
40
|
authority: 'agentsam-sdk',
|
|
@@ -27,6 +43,7 @@ export const AGENTSAM_AUTH_CONTRACT = Object.freeze({
|
|
|
27
43
|
origin: AGENTSAM_AUTH_ENV.iamOrigin,
|
|
28
44
|
clientId: AGENTSAM_AUTH_ENV.iamClientId,
|
|
29
45
|
clientSecret: AGENTSAM_AUTH_ENV.iamClientSecret,
|
|
46
|
+
defaultIssuer: PLATFORM_ACCOUNT_ISSUER,
|
|
30
47
|
}),
|
|
31
48
|
apiKey: Object.freeze({
|
|
32
49
|
env: AGENTSAM_AUTH_ENV.apiKey,
|
|
@@ -55,11 +72,14 @@ function normalizeOrigin(value) {
|
|
|
55
72
|
return clean(value).replace(/\/+$/, '');
|
|
56
73
|
}
|
|
57
74
|
|
|
58
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* Resolve PLATFORM account issuer.
|
|
77
|
+
* Order: explicit → IAM_OAUTH_ISSUER → IAM_ORIGIN → PLATFORM_ACCOUNT_ISSUER.
|
|
78
|
+
* Does not read APP host origins.
|
|
79
|
+
*/
|
|
59
80
|
export function resolveIamIssuer(env = {}, explicit = '') {
|
|
60
|
-
return normalizeOrigin(
|
|
61
|
-
|
|
62
|
-
);
|
|
81
|
+
return normalizeOrigin(explicit || env?.IAM_OAUTH_ISSUER || env?.IAM_ORIGIN || '')
|
|
82
|
+
|| PLATFORM_ACCOUNT_ISSUER;
|
|
63
83
|
}
|
|
64
84
|
|
|
65
85
|
/** @deprecated Use resolveIamIssuer. Same resolution order as issuer. */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Portable external identity shape — storage-agnostic.
|
|
3
|
-
* Adapters map this into
|
|
3
|
+
* Adapters map this into account_identities rows that point at accounts (SSOT).
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
/** @typedef {import('../provider-contract.js').NormalizedExternalIdentity} NormalizedExternalIdentity */
|
|
@@ -26,7 +26,8 @@ The CLI can now scaffold the reusable identity app surfaces directly with `agent
|
|
|
26
26
|
- `POST /api/auth/login`
|
|
27
27
|
- `POST /api/auth/signup` — create account (email/password); portal form must call this, not login
|
|
28
28
|
- `GET /api/company` — public branding SSOT (loaded by `shared/company-branding.js`)
|
|
29
|
-
- OAuth: `/api/oauth/google/start`, `/api/oauth/github/start`
|
|
29
|
+
- OAuth: `/api/oauth/google/start`, `/api/oauth/github/start`, `/api/oauth/cloudflare/start`
|
|
30
|
+
- Desktop PKCE broker: `POST /api/oauth/google/desktop-exchange` (`GOOGLE_DESKTOP_CLIENT_ID`)
|
|
30
31
|
- GCP: per-client when demanded — scaffold only until requested
|
|
31
32
|
|
|
32
33
|
Sensitive finalize stays server-side (`oauth/callback` → Identity Service).
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<head>
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<title>Sign in |
|
|
7
|
+
<title>Sign in | AgentSam</title>
|
|
8
8
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
|
|
9
9
|
rel="stylesheet">
|
|
10
10
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
|
|
@@ -360,12 +360,12 @@
|
|
|
360
360
|
<div class="login-card">
|
|
361
361
|
<img
|
|
362
362
|
class="auth-logo"
|
|
363
|
-
src="
|
|
364
|
-
alt="
|
|
363
|
+
src="/shared/agentsam-mark.svg"
|
|
364
|
+
alt="AgentSam"
|
|
365
365
|
/>
|
|
366
366
|
|
|
367
367
|
<h1 data-company-tagline>Instant Access</h1>
|
|
368
|
-
<p class="subtitle" data-company-subtitle="signin">Sign in to
|
|
368
|
+
<p class="subtitle" data-company-subtitle="signin">Sign in to AgentSam</p>
|
|
369
369
|
<p id="registeredMsg" class="subtitle" style="color: #10B981; display: none; margin-top: -16px; margin-bottom: 16px;">Account created. Sign in below.</p>
|
|
370
370
|
<p id="resetMsg" class="subtitle" style="color: #10B981; display: none; margin-top: -16px; margin-bottom: 16px;">Password updated. Sign in with your new password.</p>
|
|
371
371
|
<p id="oauthErrorMsg" class="subtitle" style="color: #FF3B30; display: none; margin-top: -16px; margin-bottom: 16px;"></p>
|
|
@@ -451,7 +451,7 @@
|
|
|
451
451
|
</div>
|
|
452
452
|
|
|
453
453
|
<footer class="auth-min-footer" aria-label="Legal">
|
|
454
|
-
<span data-company-name>
|
|
454
|
+
<span data-company-name>AgentSam</span>
|
|
455
455
|
<span class="auth-min-footer-sep" aria-hidden="true">|</span>
|
|
456
456
|
<a href="/privacy">Privacy</a>
|
|
457
457
|
<span class="auth-min-footer-sep" aria-hidden="true">|</span>
|
|
@@ -824,6 +824,7 @@
|
|
|
824
824
|
});
|
|
825
825
|
})();
|
|
826
826
|
</script>
|
|
827
|
+
<script src="/shared/desktop-identity-bridge.js" defer></script>
|
|
827
828
|
<script src="/shared/company-branding.js" defer></script>
|
|
828
829
|
</body>
|
|
829
830
|
</html>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<head>
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<title>Reset password |
|
|
7
|
+
<title>Reset password | AgentSam</title>
|
|
8
8
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
|
|
9
9
|
rel="stylesheet">
|
|
10
10
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
|
|
@@ -280,8 +280,8 @@
|
|
|
280
280
|
<div class="login-card">
|
|
281
281
|
<img
|
|
282
282
|
class="auth-logo"
|
|
283
|
-
src="
|
|
284
|
-
alt="
|
|
283
|
+
src="/shared/agentsam-mark.svg"
|
|
284
|
+
alt="AgentSam"
|
|
285
285
|
style="width:120px;height:120px;object-fit:contain;display:block;margin:0 auto 20px;"
|
|
286
286
|
/>
|
|
287
287
|
|
|
@@ -290,7 +290,7 @@
|
|
|
290
290
|
<p class="subtitle">We'll send you a secure verification code.</p>
|
|
291
291
|
|
|
292
292
|
<div class="email-note">
|
|
293
|
-
You'll receive an email from <strong data-company-support-email>
|
|
293
|
+
You'll receive an email from <strong data-company-support-email>support@agentsam.dev</strong>.<br>
|
|
294
294
|
Check your inbox and spam folder.
|
|
295
295
|
</div>
|
|
296
296
|
|
|
@@ -365,7 +365,7 @@
|
|
|
365
365
|
</div>
|
|
366
366
|
|
|
367
367
|
<footer class="auth-min-footer" aria-label="Legal">
|
|
368
|
-
<span data-company-name>
|
|
368
|
+
<span data-company-name>AgentSam</span>
|
|
369
369
|
<span class="auth-min-footer-sep" aria-hidden="true">|</span>
|
|
370
370
|
<a href="/privacy">Privacy</a>
|
|
371
371
|
<span class="auth-min-footer-sep" aria-hidden="true">|</span>
|
|
@@ -579,6 +579,7 @@
|
|
|
579
579
|
}
|
|
580
580
|
})();
|
|
581
581
|
</script>
|
|
582
|
+
<script src="/shared/desktop-identity-bridge.js" defer></script>
|
|
582
583
|
<script src="/shared/company-branding.js" defer></script>
|
|
583
584
|
</body>
|
|
584
585
|
</html>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<head>
|
|
5
5
|
<meta charset="UTF-8">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<title>Sign up |
|
|
7
|
+
<title>Sign up | AgentSam</title>
|
|
8
8
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
|
|
9
9
|
rel="stylesheet">
|
|
10
10
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
|
|
@@ -398,12 +398,12 @@
|
|
|
398
398
|
<div class="login-card">
|
|
399
399
|
<img
|
|
400
400
|
class="auth-logo"
|
|
401
|
-
src="
|
|
402
|
-
alt="
|
|
401
|
+
src="/shared/agentsam-mark.svg"
|
|
402
|
+
alt="AgentSam"
|
|
403
403
|
/>
|
|
404
404
|
|
|
405
405
|
<h1>Create account</h1>
|
|
406
|
-
<p class="subtitle" data-company-subtitle="signup">Join
|
|
406
|
+
<p class="subtitle" data-company-subtitle="signup">Join AgentSam</p>
|
|
407
407
|
<p id="registeredMsg" class="subtitle" style="color: #10B981; display: none; margin-top: -16px; margin-bottom: 16px;">Account created. Sign in below.</p>
|
|
408
408
|
<p id="oauthErrorMsg" class="subtitle" style="color: #FF3B30; display: none; margin-top: -16px; margin-bottom: 16px;"></p>
|
|
409
409
|
<p id="cfConnectNotice" class="subtitle" style="color: #fdba74; display: none; margin-top: -12px; margin-bottom: 12px; font-size: 12px; line-height: 1.45; text-align: center; max-width: 320px;">Sign in with Google, GitHub, or Supabase first, then connect Cloudflare from Integrations.</p>
|
|
@@ -485,7 +485,7 @@
|
|
|
485
485
|
</div>
|
|
486
486
|
|
|
487
487
|
<footer class="auth-min-footer" aria-label="Legal">
|
|
488
|
-
<span data-company-name>
|
|
488
|
+
<span data-company-name>AgentSam</span>
|
|
489
489
|
<span class="auth-min-footer-sep" aria-hidden="true">|</span>
|
|
490
490
|
<a href="/privacy">Privacy</a>
|
|
491
491
|
<span class="auth-min-footer-sep" aria-hidden="true">|</span>
|
|
@@ -835,6 +835,7 @@
|
|
|
835
835
|
});
|
|
836
836
|
})();
|
|
837
837
|
</script>
|
|
838
|
+
<script src="/shared/desktop-identity-bridge.js" defer></script>
|
|
838
839
|
<script src="/shared/company-branding.js" defer></script>
|
|
839
840
|
</body>
|
|
840
841
|
</html>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Auth portal branding from D1 `company` via GET /api/company.
|
|
3
|
-
* Static HTML keeps
|
|
3
|
+
* Static HTML keeps portable AgentSam defaults as fallback when host branding is unavailable.
|
|
4
4
|
*/
|
|
5
5
|
(function () {
|
|
6
6
|
var SUBTITLE_PREFIX = {
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
function getInvoke() {
|
|
3
|
+
try {
|
|
4
|
+
return window.__TAURI__?.core?.invoke
|
|
5
|
+
|| window.parent?.__TAURI__?.core?.invoke
|
|
6
|
+
|| null;
|
|
7
|
+
} catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
var invoke = getInvoke();
|
|
13
|
+
if (!invoke) return;
|
|
14
|
+
|
|
15
|
+
var APP_ID = 'local-studio';
|
|
16
|
+
var SESSION_ACCOUNT = 'identity_session';
|
|
17
|
+
var originalFetch = window.fetch.bind(window);
|
|
18
|
+
|
|
19
|
+
async function callIdentity(payload) {
|
|
20
|
+
var raw = await invoke('identity_bridge', {
|
|
21
|
+
requestJson: JSON.stringify(payload || {}),
|
|
22
|
+
});
|
|
23
|
+
var body = typeof raw === 'string' ? JSON.parse(raw) : raw;
|
|
24
|
+
if (!body || body.ok === false) {
|
|
25
|
+
throw new Error(body?.error || 'identity_request_failed');
|
|
26
|
+
}
|
|
27
|
+
return body;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function getSessionId() {
|
|
31
|
+
return await invoke('secure_store_get', {
|
|
32
|
+
appId: APP_ID,
|
|
33
|
+
account: SESSION_ACCOUNT,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function setSessionId(sessionId) {
|
|
38
|
+
await invoke('secure_store_set', {
|
|
39
|
+
appId: APP_ID,
|
|
40
|
+
account: SESSION_ACCOUNT,
|
|
41
|
+
value: String(sessionId || ''),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function clearSessionId() {
|
|
46
|
+
try {
|
|
47
|
+
await invoke('secure_store_delete', {
|
|
48
|
+
appId: APP_ID,
|
|
49
|
+
account: SESSION_ACCOUNT,
|
|
50
|
+
});
|
|
51
|
+
} catch {}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function jsonResponse(body, status) {
|
|
55
|
+
return new Response(JSON.stringify(body), {
|
|
56
|
+
status: status || 200,
|
|
57
|
+
headers: { 'content-type': 'application/json' },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function parseBody(init) {
|
|
62
|
+
if (!init?.body) return {};
|
|
63
|
+
try {
|
|
64
|
+
return typeof init.body === 'string' ? JSON.parse(init.body) : {};
|
|
65
|
+
} catch {
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function notifyAuthenticated(body) {
|
|
71
|
+
try {
|
|
72
|
+
window.parent?.postMessage({
|
|
73
|
+
type: 'agentsam:desktop-identity',
|
|
74
|
+
authenticated: true,
|
|
75
|
+
user: body?.user || null,
|
|
76
|
+
}, '*');
|
|
77
|
+
} catch {}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
window.fetch = async function packagedIdentityFetch(input, init) {
|
|
81
|
+
var url;
|
|
82
|
+
try {
|
|
83
|
+
url = new URL(typeof input === 'string' ? input : input.url, window.location.href);
|
|
84
|
+
} catch {
|
|
85
|
+
return originalFetch(input, init);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (url.pathname === '/api/company') {
|
|
89
|
+
return jsonResponse({
|
|
90
|
+
name: 'AgentSam',
|
|
91
|
+
tagline: 'Instant Access',
|
|
92
|
+
logoUrl: '/shared/agentsam-mark.svg',
|
|
93
|
+
authBgColor: '#050508',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (url.pathname === '/api/auth/login') {
|
|
98
|
+
try {
|
|
99
|
+
var loginBody = parseBody(init);
|
|
100
|
+
var login = await callIdentity({
|
|
101
|
+
op: 'login',
|
|
102
|
+
email: loginBody.email,
|
|
103
|
+
password: loginBody.password,
|
|
104
|
+
next: loginBody.next || '/agentsam',
|
|
105
|
+
});
|
|
106
|
+
await setSessionId(login.session_id);
|
|
107
|
+
notifyAuthenticated(login);
|
|
108
|
+
return jsonResponse({ ok: true, user: login.user, redirect: '/agentsam' });
|
|
109
|
+
} catch (error) {
|
|
110
|
+
return jsonResponse({ ok: false, error: error?.message || String(error) }, 401);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (url.pathname === '/api/auth/signup') {
|
|
115
|
+
try {
|
|
116
|
+
var signupBody = parseBody(init);
|
|
117
|
+
var signup = await callIdentity({
|
|
118
|
+
op: 'signup',
|
|
119
|
+
email: signupBody.email,
|
|
120
|
+
password: signupBody.password,
|
|
121
|
+
displayName: signupBody.name || signupBody.displayName || signupBody.display_name,
|
|
122
|
+
next: signupBody.next || '/agentsam',
|
|
123
|
+
});
|
|
124
|
+
await setSessionId(signup.session_id);
|
|
125
|
+
notifyAuthenticated(signup);
|
|
126
|
+
return jsonResponse({ ok: true, user: signup.user, redirect: '/agentsam' });
|
|
127
|
+
} catch (error) {
|
|
128
|
+
return jsonResponse({ ok: false, error: error?.message || String(error) }, 400);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (url.pathname === '/api/auth/password-reset/request') {
|
|
133
|
+
try {
|
|
134
|
+
var requestBody = parseBody(init);
|
|
135
|
+
var requested = await callIdentity({
|
|
136
|
+
op: 'reset_request',
|
|
137
|
+
email: requestBody.email,
|
|
138
|
+
});
|
|
139
|
+
return jsonResponse(requested);
|
|
140
|
+
} catch (error) {
|
|
141
|
+
return jsonResponse({ ok: false, error: error?.message || String(error) }, 400);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (url.pathname === '/api/auth/password-reset/confirm') {
|
|
146
|
+
try {
|
|
147
|
+
var resetBody = parseBody(init);
|
|
148
|
+
var reset = await callIdentity({
|
|
149
|
+
op: 'reset_confirm',
|
|
150
|
+
email: resetBody.email,
|
|
151
|
+
code: resetBody.code,
|
|
152
|
+
password: resetBody.password,
|
|
153
|
+
confirm_password: resetBody.confirm_password || resetBody.confirmPassword || resetBody.confirm,
|
|
154
|
+
});
|
|
155
|
+
return jsonResponse(reset);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
return jsonResponse({ ok: false, error: error?.message || String(error) }, 400);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (url.pathname === '/api/auth/logout') {
|
|
162
|
+
var sessionId = await getSessionId();
|
|
163
|
+
if (sessionId) {
|
|
164
|
+
try {
|
|
165
|
+
await callIdentity({ op: 'logout', session_id: sessionId });
|
|
166
|
+
} catch {}
|
|
167
|
+
}
|
|
168
|
+
await clearSessionId();
|
|
169
|
+
return jsonResponse({ ok: true });
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return originalFetch(input, init);
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
function localizeAuthLinks() {
|
|
176
|
+
var map = {
|
|
177
|
+
'/auth/login': './login.html',
|
|
178
|
+
'/auth/signup': './signup.html',
|
|
179
|
+
'/auth/reset': './reset.html',
|
|
180
|
+
};
|
|
181
|
+
document.querySelectorAll('a[href]').forEach(function (link) {
|
|
182
|
+
var href = link.getAttribute('href');
|
|
183
|
+
if (!href) return;
|
|
184
|
+
var base = href.split('?')[0];
|
|
185
|
+
if (map[base]) {
|
|
186
|
+
var query = href.indexOf('?') >= 0 ? href.slice(href.indexOf('?')) : '';
|
|
187
|
+
link.setAttribute('href', map[base] + query);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// Provider OAuth belongs to installed provider adapters. Do not render
|
|
192
|
+
// decorative/dead login buttons in the packaged native surface.
|
|
193
|
+
['googleSignIn', 'githubSignIn', 'cloudflareSignIn'].forEach(function (id) {
|
|
194
|
+
var link = document.getElementById(id);
|
|
195
|
+
if (link) link.style.display = 'none';
|
|
196
|
+
});
|
|
197
|
+
var backupToggle = document.getElementById('backupCodeToggle');
|
|
198
|
+
if (backupToggle) {
|
|
199
|
+
var backupPrompt = backupToggle.closest('p');
|
|
200
|
+
if (backupPrompt) backupPrompt.style.display = 'none';
|
|
201
|
+
else backupToggle.style.display = 'none';
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
window.addEventListener('DOMContentLoaded', localizeAuthLinks);
|
|
206
|
+
window.__AGENTSAM_DESKTOP_IDENTITY__ = true;
|
|
207
|
+
})();
|
|
@@ -66,12 +66,28 @@ export {
|
|
|
66
66
|
} from './server/post-auth.js';
|
|
67
67
|
export { verifyAppAuthContract, verifyAppPackage } from './app/verify-app.js';
|
|
68
68
|
export { DEFAULT_COMPANY_ID, DEFAULT_COMPANY_SLUG, normalizeCompanyRow } from './contracts/company.js';
|
|
69
|
+
export {
|
|
70
|
+
buildOAuthConsentView,
|
|
71
|
+
normalizeOAuthConsentCompany,
|
|
72
|
+
normalizeOAuthConsentResource,
|
|
73
|
+
normalizeOAuthConsentClient,
|
|
74
|
+
normalizeOAuthConsentScope,
|
|
75
|
+
} from './oauth/consent-view.js';
|
|
69
76
|
export * from './contracts/auth-config.js';
|
|
70
77
|
export { createPasswordResetService } from './recovery/password-reset.js';
|
|
71
78
|
export {
|
|
72
79
|
finalizeInboundOAuth,
|
|
73
80
|
registerFinalizeInboundOAuth,
|
|
74
81
|
} from './oauth/callback.js';
|
|
82
|
+
export {
|
|
83
|
+
resolveOAuthCredentialLane,
|
|
84
|
+
resolveIamPlatformCredentials,
|
|
85
|
+
requireIamPlatformCredentials,
|
|
86
|
+
} from './oauth/credentials.js';
|
|
87
|
+
export {
|
|
88
|
+
handleGoogleDesktopExchangeRequest,
|
|
89
|
+
resolveGoogleExchangeSecret,
|
|
90
|
+
} from './oauth/google-desktop-exchange.js';
|
|
75
91
|
export { createCloudflareD1Adapter } from './adapters/cloudflare-d1/index.js';
|
|
76
92
|
export {
|
|
77
93
|
createSqliteIdentityAdapter,
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
-- AgentSam Identity — customer D1 core (portable, boring, growable)
|
|
2
2
|
-- Timestamps: INTEGER unixepoch seconds (AGENTS.md §2)
|
|
3
|
+
--
|
|
4
|
+
-- SSOT: `accounts` is the account row of record.
|
|
5
|
+
-- `auth_users` is the login principal (1:1 with accounts.id in this portable scaffold).
|
|
6
|
+
-- `account_identities` is IdP linkage only (provider + subject → accounts.id) — never the account SSOT.
|
|
7
|
+
|
|
8
|
+
CREATE TABLE IF NOT EXISTS accounts (
|
|
9
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
10
|
+
email TEXT NOT NULL COLLATE NOCASE,
|
|
11
|
+
display_name TEXT,
|
|
12
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
13
|
+
created_at INTEGER NOT NULL,
|
|
14
|
+
updated_at INTEGER NOT NULL
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_accounts_email ON accounts(email);
|
|
3
18
|
|
|
4
19
|
CREATE TABLE IF NOT EXISTS auth_users (
|
|
5
20
|
id TEXT PRIMARY KEY NOT NULL,
|
|
@@ -9,7 +24,8 @@ CREATE TABLE IF NOT EXISTS auth_users (
|
|
|
9
24
|
salt TEXT,
|
|
10
25
|
status TEXT NOT NULL DEFAULT 'active',
|
|
11
26
|
created_at INTEGER NOT NULL,
|
|
12
|
-
updated_at INTEGER NOT NULL
|
|
27
|
+
updated_at INTEGER NOT NULL,
|
|
28
|
+
FOREIGN KEY (id) REFERENCES accounts(id)
|
|
13
29
|
);
|
|
14
30
|
|
|
15
31
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_auth_users_email ON auth_users(email);
|
|
@@ -31,6 +47,7 @@ CREATE TABLE IF NOT EXISTS auth_sessions (
|
|
|
31
47
|
CREATE INDEX IF NOT EXISTS idx_auth_sessions_user_expires
|
|
32
48
|
ON auth_sessions(user_id, expires_at);
|
|
33
49
|
|
|
50
|
+
-- IdP linkage only — points at accounts (SSOT), not a substitute for accounts.
|
|
34
51
|
CREATE TABLE IF NOT EXISTS account_identities (
|
|
35
52
|
id TEXT PRIMARY KEY NOT NULL,
|
|
36
53
|
account_id TEXT NOT NULL,
|
|
@@ -39,7 +56,7 @@ CREATE TABLE IF NOT EXISTS account_identities (
|
|
|
39
56
|
email TEXT,
|
|
40
57
|
created_at INTEGER NOT NULL,
|
|
41
58
|
updated_at INTEGER NOT NULL,
|
|
42
|
-
FOREIGN KEY (account_id) REFERENCES
|
|
59
|
+
FOREIGN KEY (account_id) REFERENCES accounts(id)
|
|
43
60
|
);
|
|
44
61
|
|
|
45
62
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_account_identities_provider_subject
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- Additive upgrade: accounts as SSOT for scaffolds that already applied an older 0001.
|
|
2
|
+
-- Safe to re-run. New scaffolds get accounts from 0001_identity_core.sql directly.
|
|
3
|
+
--
|
|
4
|
+
-- account_identities remains IdP linkage only (provider + subject → accounts.id).
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS accounts (
|
|
7
|
+
id TEXT PRIMARY KEY NOT NULL,
|
|
8
|
+
email TEXT NOT NULL COLLATE NOCASE,
|
|
9
|
+
display_name TEXT,
|
|
10
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
11
|
+
created_at INTEGER NOT NULL,
|
|
12
|
+
updated_at INTEGER NOT NULL
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_accounts_email ON accounts(email);
|
|
16
|
+
|
|
17
|
+
-- Backfill from auth_users (1:1 portable scaffold).
|
|
18
|
+
INSERT OR IGNORE INTO accounts (id, email, display_name, status, created_at, updated_at)
|
|
19
|
+
SELECT id, email, display_name, COALESCE(status, 'active'), created_at, updated_at
|
|
20
|
+
FROM auth_users;
|
|
@@ -14,13 +14,16 @@ wrangler d1 execute <database_name> --remote --file=migrations/0001_identity_cor
|
|
|
14
14
|
|
|
15
15
|
`agentsam identity init` copies this migration into the customer project automatically.
|
|
16
16
|
|
|
17
|
+
Existing scaffolds missing `accounts`: also apply `0003_accounts_ssot.sql`.
|
|
18
|
+
|
|
17
19
|
## Tables
|
|
18
20
|
|
|
19
21
|
| Table | Purpose |
|
|
20
22
|
|-------|---------|
|
|
21
|
-
| `
|
|
23
|
+
| `accounts` | **Account SSOT** — row of record (`au_*` ids shared with auth_users in portable scaffold) |
|
|
24
|
+
| `auth_users` | Login principal (password hash, 1:1 with accounts.id) |
|
|
22
25
|
| `auth_sessions` | Browser sessions |
|
|
23
|
-
| `account_identities` |
|
|
26
|
+
| `account_identities` | IdP linkage only (provider + subject → accounts.id) — **not** the account SSOT |
|
|
24
27
|
| `oauth_states` | PKCE/state for OAuth start |
|
|
25
28
|
| `password_reset_tokens` | Reset flow (grow when wired) |
|
|
26
29
|
| `company` | Branding SSOT — name, logo, colors, support info (`GET /api/company`) |
|