@inneranimalmedia/agentsam-sdk 2.6.4 → 2.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTSAM.md +11 -0
- package/README.md +15 -9
- package/apps/client-cms-editor/AGENTS.md +12 -0
- package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
- package/apps/client-cms-editor/README.md +72 -0
- package/apps/client-cms-editor/agentsam.app.json +57 -0
- package/apps/client-cms-editor/backend/README.md +5 -0
- package/apps/client-cms-editor/backend/package.json +22 -0
- package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
- package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
- package/apps/client-cms-editor/backend/src/index.ts +6 -0
- package/apps/client-cms-editor/backend/src/model.ts +115 -0
- package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
- package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
- package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
- package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
- package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
- package/apps/client-cms-editor/backend/tsconfig.json +15 -0
- package/apps/client-cms-editor/backend/worker/index.js +34 -0
- package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
- package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
- package/apps/client-cms-editor/frontend/index.html +12 -0
- package/apps/client-cms-editor/frontend/package.json +33 -0
- package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
- package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
- package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
- package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
- package/apps/client-cms-editor/frontend/src/index.ts +8 -0
- package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
- package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
- package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
- package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
- package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
- package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
- package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
- package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
- package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
- package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
- package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
- package/apps/client-cms-editor/package-lock.json +3832 -0
- package/apps/client-cms-editor/package.json +23 -0
- package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
- package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
- package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
- package/apps/client-cms-editor/shared/cms/package.json +21 -0
- package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
- package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
- package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
- package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
- package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
- package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
- package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
- package/bin/agentsam-rapid-rust +36 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
- package/docs/MACHINE_INTELLIGENCE.md +120 -0
- package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
- package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
- package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
- package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
- package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
- package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
- package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
- package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
- package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
- package/docs/contracts/capability-install-planner.md +67 -0
- package/docs/contracts/environment-vocabulary.md +195 -0
- package/docs/contracts/google-cloud-oauth-setup.md +199 -0
- package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
- package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
- package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
- package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
- package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
- package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
- package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
- package/docs/plugins.md +2 -2
- package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
- package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
- package/docs/product/README.md +8 -0
- package/docs/rapid-rust-wasm.md +35 -0
- package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
- package/package.json +73 -14
- package/packages/agentsam-brand/README.md +106 -11
- package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
- package/packages/agentsam-brand/package.json +39 -7
- package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
- package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
- package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
- package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
- package/packages/agentsam-brand/src/adapters/memory.js +31 -0
- package/packages/agentsam-brand/src/cli/controller.js +503 -0
- package/packages/agentsam-brand/src/cli/wizard.js +526 -0
- package/packages/agentsam-brand/src/core/capabilities.js +201 -0
- package/packages/agentsam-brand/src/core/derivatives.js +211 -0
- package/packages/agentsam-brand/src/core/errors.js +12 -0
- package/packages/agentsam-brand/src/core/ingest.js +195 -0
- package/packages/agentsam-brand/src/core/inspect.js +109 -0
- package/packages/agentsam-brand/src/core/keys.js +83 -0
- package/packages/agentsam-brand/src/core/naming.js +142 -0
- package/packages/agentsam-brand/src/core/optimize.js +316 -0
- package/packages/agentsam-brand/src/core/pack.js +305 -0
- package/packages/agentsam-brand/src/core/plan.js +276 -0
- package/packages/agentsam-brand/src/core/preview.js +159 -0
- package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
- package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
- package/packages/agentsam-brand/src/core/processors/index.js +148 -0
- package/packages/agentsam-brand/src/core/processors/native.js +82 -0
- package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
- package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
- package/packages/agentsam-brand/src/core/promote.js +288 -0
- package/packages/agentsam-brand/src/core/receipts.js +155 -0
- package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
- package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
- package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
- package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
- package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
- package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
- package/packages/agentsam-brand/src/index.js +193 -36
- package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
- package/packages/agentsam-brand/src/presets/favicon.json +17 -0
- package/packages/agentsam-brand/src/presets/hero.json +12 -0
- package/packages/agentsam-brand/src/presets/index.js +40 -0
- package/packages/agentsam-brand/src/presets/logo.json +12 -0
- package/packages/agentsam-brand/src/presets/model.json +8 -0
- package/packages/agentsam-brand/src/presets/og-image.json +10 -0
- package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
- package/packages/agentsam-brand/src/presets/social-image.json +10 -0
- package/packages/agentsam-brand/src/presets/web-image.json +10 -0
- package/packages/agentsam-contracts/src/artifacts.ts +41 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
- package/packages/agentsam-knowledge/src/providers/index.js +6 -4
- package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
- package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
- package/packages/agentsam-nav/package.json +2 -2
- package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
- package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
- package/packages/agentsam-rapid-rust/README.md +5 -0
- package/packages/agentsam-rapid-rust/src/main.rs +718 -0
- package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
- package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
- package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
- package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
- package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
- package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
- package/packages/agentsam-repository/src/index.js +1 -0
- package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
- package/packages/agentsam-repository/src/source-types.js +85 -0
- package/packages/agentsam-vault/README.md +96 -0
- package/packages/agentsam-vault/package.json +32 -0
- package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
- package/packages/agentsam-vault/src/contracts/credential.js +132 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
- package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
- package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
- package/packages/agentsam-vault/src/index.d.ts +9 -0
- package/packages/agentsam-vault/src/index.js +27 -0
- package/packages/agentsam-vault/src/providers/registry.js +90 -0
- package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
- package/packages/agentsam-workbench/README.md +24 -0
- package/packages/agentsam-workbench/package.json +38 -0
- package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
- package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
- package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
- package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
- package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
- package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
- package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
- package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
- package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
- package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
- package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
- package/packages/agentsam-workbench/src/agent/index.ts +10 -0
- package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
- package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
- package/packages/agentsam-workbench/src/browser/index.ts +1 -0
- package/packages/agentsam-workbench/src/index.ts +6 -0
- package/packages/agentsam-workbench/src/project-control.css +160 -0
- package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
- package/packages/agentsam-workbench/src/projects/index.ts +1 -0
- package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
- package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
- package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
- package/packages/agentsam-workbench/src/shell/index.ts +4 -0
- package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
- package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
- package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
- package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
- package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
- package/packages/agentsam-workbench/tsconfig.json +13 -0
- package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
- package/packages/connectors/cloudflare/package.json +3 -1
- package/packages/connectors/cloudflare/src/api-client.js +279 -0
- package/packages/connectors/cloudflare/src/capabilities.js +585 -0
- package/packages/connectors/cloudflare/src/credential.js +318 -0
- package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
- package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
- package/packages/connectors/cloudflare/src/families/pages.js +151 -0
- package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
- package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
- package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
- package/packages/connectors/cloudflare/src/families/tags.js +124 -0
- package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
- package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
- package/packages/connectors/cloudflare/src/index.js +102 -265
- package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
- package/packages/connectors/cloudflare/src/owner.js +42 -12
- package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
- package/packages/connectors/cloudflare/src/routes.js +309 -144
- package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
- package/packages/connectors/cloudflare/src/vault.js +2 -2
- package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
- package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
- package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
- package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
- package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
- package/packages/identity/README.md +1 -1
- package/packages/identity/backend/README.md +1 -1
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
- package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
- package/packages/identity/package.json +4 -3
- package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
- package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
- package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
- package/packages/identity/src/adapters/sqlite/index.js +4 -1
- package/packages/identity/src/contracts/auth-config.js +28 -8
- package/packages/identity/src/contracts/external-identity.js +1 -1
- package/packages/identity/src/contracts/provider.js +1 -0
- package/packages/identity/src/frontend/auth-portal/README.md +2 -1
- package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
- package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
- package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
- package/packages/identity/src/index.js +16 -0
- package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
- package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
- package/packages/identity/src/migrations/README.md +5 -2
- package/packages/identity/src/oauth/README.md +10 -5
- package/packages/identity/src/oauth/consent-view.js +388 -0
- package/packages/identity/src/oauth/credentials.js +31 -11
- package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
- package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
- package/packages/identity/src/providers/cloudflare/profile.js +49 -14
- package/packages/identity/src/providers/iam/index.js +27 -5
- package/packages/identity/src/server/identity-service.js +31 -2
- package/packages/identity/src/server/worker-router.js +111 -81
- package/packages/identity/tests/auth-config.test.mjs +3 -2
- package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
- package/packages/identity/tests/identity-service.test.mjs +16 -0
- package/packages/identity/tests/native-session-worker.test.mjs +64 -0
- package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
- package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
- package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
- package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
- package/packages/runtime-protocol/src/index.js +154 -0
- package/packages/theme-scenes/README.md +164 -0
- package/packages/theme-scenes/package.json +53 -0
- package/packages/theme-scenes/src/blocks/index.js +30 -0
- package/packages/theme-scenes/src/contracts/index.js +286 -0
- package/packages/theme-scenes/src/demos/index.js +65 -0
- package/packages/theme-scenes/src/index.js +75 -0
- package/packages/theme-scenes/src/presets/index.js +263 -0
- package/packages/theme-scenes/src/runtime/compile.js +119 -0
- package/packages/theme-scenes/src/scenes/index.js +146 -0
- package/packages/theme-scenes/src/shell/index.js +47 -0
- package/packages/theme-scenes/src/themes/index.js +129 -0
- package/packages/theme-scenes/src/visuals/index.js +41 -0
- package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
- package/packages/work-graph/src/index.js +34 -1
- package/packages/work-graph/src/renderers/gantt-model.js +24 -0
- package/packages/work-graph/test/work-graph.test.mjs +27 -7
- package/protocol/README.md +15 -7
- package/protocol/apps/agentsam.app.v1.schema.json +89 -7
- package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
- package/protocol/assets/README.md +9 -0
- package/protocol/assets/asset-record.v1.schema.json +64 -0
- package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
- package/protocol/scoring/README.md +10 -0
- package/protocol/scoring/scorecard.v1.schema.json +65 -0
- package/protocol/ui/icon-registry.mjs +1 -0
- package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
- package/registry/cms-rust-machine-20260928/manifest.json +22 -0
- package/registry/cms-rust-machine-20260928/migration.sql +237 -0
- package/registry/cms-rust-machine-20260928/receipt.json +21 -0
- package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
- package/scripts/build_rapid_rust_cli.py +83 -0
- package/src/attachments/index.js +6 -0
- package/src/attachments/intake.js +235 -0
- package/src/capabilities/repository-snapshot.js +19 -2
- package/src/cli/command-catalog.js +8 -0
- package/src/cli.js +182 -26
- package/src/commands/account-auth.js +94 -8
- package/src/commands/app.js +307 -3
- package/src/commands/billing.js +127 -0
- package/src/commands/brand.js +74 -60
- package/src/commands/cheat-sheet.js +154 -0
- package/src/commands/cloudflare-login.js +222 -0
- package/src/commands/cloudflare.js +453 -23
- package/src/commands/codebaseindex.js +6 -1
- package/src/commands/compute.js +4 -0
- package/src/commands/connections.js +11 -5
- package/src/commands/credentials.js +116 -0
- package/src/commands/gcloud-auth.js +427 -0
- package/src/commands/google-cloud.js +375 -0
- package/src/commands/identity-init.js +2 -2
- package/src/commands/mcp.js +226 -33
- package/src/commands/ollama.js +3 -2
- package/src/commands/plugins.js +7 -2
- package/src/commands/product.js +36 -0
- package/src/commands/runtime-status.js +28 -9
- package/src/commands/runtime.js +313 -0
- package/src/commands/rust.js +24 -0
- package/src/commands/setup.js +279 -0
- package/src/commands/shell.js +16 -3
- package/src/commands/start-local.js +2 -2
- package/src/commands/terminal.js +171 -0
- package/src/commands/update.js +140 -0
- package/src/commands/whoami.js +329 -65
- package/src/features/resolve.js +1 -0
- package/src/index.js +4 -0
- package/src/indexing/ingest/inventory.js +254 -19
- package/src/indexing/ingest/materials.js +3 -9
- package/src/indexing/ingest/style-evidence.js +181 -0
- package/src/knowledge/source.js +3 -3
- package/src/lib/account-session.js +11 -4
- package/src/lib/app-authority.js +172 -0
- package/src/lib/auth.js +94 -21
- package/src/lib/core-client.js +5 -6
- package/src/lib/credentials-audit.js +451 -0
- package/src/lib/deploy/health.js +24 -6
- package/src/lib/detect-context.js +7 -1
- package/src/lib/google-cloud-connection.js +270 -0
- package/src/lib/google-cloud-inventory.js +385 -0
- package/src/lib/google-desktop-oauth.js +372 -0
- package/src/lib/google-studio-brokered-oauth.js +158 -0
- package/src/lib/identity-scaffold.js +24 -6
- package/src/lib/init-options.js +192 -0
- package/src/lib/local-scaffold.js +48 -16
- package/src/lib/provider-command-remediation.js +308 -0
- package/src/lib/provider-credentials.js +8 -0
- package/src/lib/scaffold/index.js +8 -2
- package/src/lib/scaffold/mcp-server.js +43 -0
- package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
- package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
- package/src/lib/scaffold/wizards/cms.js +93 -0
- package/src/lib/scaffold/wizards/mcp-server.js +61 -0
- package/src/lib/setup/contract.js +26 -0
- package/src/lib/setup/discover.js +116 -0
- package/src/lib/setup/execute.js +205 -0
- package/src/lib/setup/planner.js +134 -0
- package/src/lib/setup/recipes.js +235 -0
- package/src/lib/setup/runtime-persist.js +197 -0
- package/src/lib/setup/runtime.js +394 -0
- package/src/lib/slash-commands.js +2 -0
- package/src/lib/terminal/machine-identity.js +95 -0
- package/src/lib/terminal-local.js +164 -0
- package/src/lib/terminal-scopes.js +52 -0
- package/src/lib/whoami-capabilities.js +184 -0
- package/src/local-pty/server.js +34 -5
- package/src/mcp/authority.js +58 -108
- package/src/mcp/client-adapters.js +68 -144
- package/src/mcp/client.js +142 -122
- package/src/mcp/cloudflare-bundles.js +225 -0
- package/src/mcp/index.js +12 -0
- package/src/plugins/cloudflare.js +1 -1
- package/src/providers/ollama-chat.js +2 -1
- package/src/sam/types.js +27 -2
- package/src/security/inventory.js +12 -2
- package/src/security/local-vault.js +2 -0
- package/src/security/scan.js +1 -1
- package/test/account-session.test.mjs +3 -3
- package/test/app-authority-context.test.mjs +32 -0
- package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
- package/test/cli/mcp-client.test.mjs +21 -10
- package/test/cli/runtime-persist.test.mjs +56 -0
- package/test/cli/rust-command.test.mjs +21 -0
- package/test/credentials-audit.test.mjs +113 -0
- package/test/deploy-health-scan.test.mjs +29 -1
- package/test/gcloud-auth.test.mjs +111 -0
- package/test/google-cloud-connection.test.mjs +83 -0
- package/test/google-cloud-inventory.test.mjs +64 -0
- package/test/init-options.test.mjs +35 -0
- package/test/integration/app-command.test.mjs +30 -0
- package/test/integration/cad-project.test.mjs +4 -1
- package/test/integration/cms-app-scaffold.test.mjs +71 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
- package/test/integration/codebaseindex-ingest.test.mjs +48 -0
- package/test/integration/features-resolve.test.mjs +30 -11
- package/test/integration/inspect-path-cli.test.mjs +46 -0
- package/test/integration/inventory-evidence.test.mjs +125 -0
- package/test/integration/runtime-status.integration.test.mjs +2 -1
- package/test/knowledge.test.mjs +35 -1
- package/test/loopback-oauth.test.mjs +53 -0
- package/test/ollama.test.mjs +22 -0
- package/test/security.test.mjs +23 -0
- package/test/setup-planner.test.mjs +74 -0
- package/test/setup-runtime.test.mjs +51 -0
- package/test/terminal/local-pty.mock.test.mjs +3 -1
- package/test/terminal-machine-identity.test.mjs +88 -0
- package/test/whoami-resume.test.mjs +27 -6
- package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
- package/packages/work-graph/prototype/README.md +0 -32
- package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
- package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
- package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
- package/packages/work-graph/prototype-gnantt.html +0 -655
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "{{PROJECT_NAME}}"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
|
|
6
|
+
[lib]
|
|
7
|
+
crate-type = ["cdylib"]
|
|
8
|
+
|
|
9
|
+
[dependencies]
|
|
10
|
+
worker = "{{WORKER_VERSION}}"
|
|
11
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
12
|
+
serde_json = "1.0"
|
|
13
|
+
|
|
14
|
+
[profile.release]
|
|
15
|
+
lto = true
|
|
16
|
+
strip = "debuginfo"
|
|
17
|
+
codegen-units = 1
|
|
18
|
+
opt-level = "s"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
use serde_json::json;
|
|
2
|
+
use worker::*;
|
|
3
|
+
|
|
4
|
+
#[event(fetch)]
|
|
5
|
+
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
|
|
6
|
+
Router::new()
|
|
7
|
+
.get("/", |_req, _ctx| Response::ok("AgentSam Rust/Wasm Worker"))
|
|
8
|
+
.get("/health", |_req, _ctx| {
|
|
9
|
+
Response::from_json(&json!({
|
|
10
|
+
"status": "ok",
|
|
11
|
+
"runtime": "cloudflare-workers-rust-wasm",
|
|
12
|
+
"project": "{{PROJECT_NAME}}"
|
|
13
|
+
}))
|
|
14
|
+
})
|
|
15
|
+
.run(req, env)
|
|
16
|
+
.await
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
AgentSam Rapid Rust template: `{{TEMPLATE}}`.
|
|
4
|
+
|
|
5
|
+
## Local first
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
agentsam rust doctor --bootstrap
|
|
10
|
+
agentsam rust check
|
|
11
|
+
agentsam rust build
|
|
12
|
+
agentsam rust dev
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Explicit cloud graduation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
agentsam rust deploy --dry-run
|
|
19
|
+
agentsam rust deploy --yes
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
No scaffold/build/check command deploys this Worker.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "{{PROJECT_NAME}}"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
|
|
6
|
+
[lib]
|
|
7
|
+
crate-type = ["cdylib"]
|
|
8
|
+
|
|
9
|
+
[dependencies]
|
|
10
|
+
worker = "{{WORKER_VERSION}}"
|
|
11
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
12
|
+
serde_json = "1.0"
|
|
13
|
+
hmac = "0.12"
|
|
14
|
+
sha2 = "0.10"
|
|
15
|
+
hex = "0.4"
|
|
16
|
+
|
|
17
|
+
[profile.release]
|
|
18
|
+
lto = true
|
|
19
|
+
strip = "debuginfo"
|
|
20
|
+
codegen-units = 1
|
|
21
|
+
opt-level = "s"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
use hmac::{Hmac, Mac};
|
|
2
|
+
use sha2::Sha256;
|
|
3
|
+
use worker::*;
|
|
4
|
+
|
|
5
|
+
type HmacSha256 = Hmac<Sha256>;
|
|
6
|
+
|
|
7
|
+
#[event(fetch)]
|
|
8
|
+
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
|
|
9
|
+
Router::new()
|
|
10
|
+
.post_async("/verify-signature", |mut req, ctx| async move {
|
|
11
|
+
let secret = ctx.secret("API_SECRET")?.to_string();
|
|
12
|
+
let provided = match req.headers().get("X-Signature")? {
|
|
13
|
+
Some(value) => value,
|
|
14
|
+
None => return Response::error("missing X-Signature", 401),
|
|
15
|
+
};
|
|
16
|
+
let provided = match hex::decode(provided.trim()) {
|
|
17
|
+
Ok(value) => value,
|
|
18
|
+
Err(_) => return Response::error("invalid signature encoding", 400),
|
|
19
|
+
};
|
|
20
|
+
let payload = req.bytes().await?;
|
|
21
|
+
let mut mac = HmacSha256::new_from_slice(secret.as_bytes())
|
|
22
|
+
.map_err(|_| Error::RustError("invalid HMAC key".into()))?;
|
|
23
|
+
mac.update(&payload);
|
|
24
|
+
if mac.verify_slice(&provided).is_ok() {
|
|
25
|
+
Response::ok("signature valid")
|
|
26
|
+
} else {
|
|
27
|
+
Response::error("invalid signature", 403)
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
.run(req, env)
|
|
31
|
+
.await
|
|
32
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "{{PROJECT_NAME}}"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
|
|
6
|
+
[lib]
|
|
7
|
+
crate-type = ["cdylib"]
|
|
8
|
+
|
|
9
|
+
[dependencies]
|
|
10
|
+
worker = "{{WORKER_VERSION}}"
|
|
11
|
+
serde = { version = "1.0", features = ["derive"] }
|
|
12
|
+
serde_json = "1.0"
|
|
13
|
+
|
|
14
|
+
[profile.release]
|
|
15
|
+
lto = true
|
|
16
|
+
strip = "debuginfo"
|
|
17
|
+
codegen-units = 1
|
|
18
|
+
opt-level = "s"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
use serde::{Deserialize, Serialize};
|
|
2
|
+
use worker::*;
|
|
3
|
+
|
|
4
|
+
#[derive(Debug, Deserialize, Serialize)]
|
|
5
|
+
struct BatchInput {
|
|
6
|
+
items: Vec<RawItem>,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
#[derive(Debug, Deserialize, Serialize)]
|
|
10
|
+
struct RawItem {
|
|
11
|
+
id: u64,
|
|
12
|
+
value: f64,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
#[derive(Serialize)]
|
|
16
|
+
struct BatchResult {
|
|
17
|
+
processed_count: usize,
|
|
18
|
+
total_sum: f64,
|
|
19
|
+
average: f64,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#[event(fetch)]
|
|
23
|
+
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
|
|
24
|
+
Router::new()
|
|
25
|
+
.post_async("/process", |mut req, _ctx| async move {
|
|
26
|
+
let data: BatchInput = match req.json().await {
|
|
27
|
+
Ok(value) => value,
|
|
28
|
+
Err(_) => return Response::error("invalid JSON payload", 400),
|
|
29
|
+
};
|
|
30
|
+
let count = data.items.len();
|
|
31
|
+
let sum: f64 = data.items.iter().map(|item| item.value).sum();
|
|
32
|
+
let average = if count == 0 { 0.0 } else { sum / count as f64 };
|
|
33
|
+
Response::from_json(&BatchResult {
|
|
34
|
+
processed_count: count,
|
|
35
|
+
total_sum: sum,
|
|
36
|
+
average,
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
.run(req, env)
|
|
40
|
+
.await
|
|
41
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/// Pure Rust domain logic: no Cloudflare, browser, or Tauri dependency.
|
|
2
|
+
pub fn normalize_resource_key(input: &str) -> String {
|
|
3
|
+
input
|
|
4
|
+
.trim()
|
|
5
|
+
.to_ascii_lowercase()
|
|
6
|
+
.chars()
|
|
7
|
+
.map(|ch| if ch.is_ascii_alphanumeric() { ch } else { '-' })
|
|
8
|
+
.collect::<String>()
|
|
9
|
+
.split('-')
|
|
10
|
+
.filter(|part| !part.is_empty())
|
|
11
|
+
.collect::<Vec<_>>()
|
|
12
|
+
.join("-")
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
#[cfg(test)]
|
|
16
|
+
mod tests {
|
|
17
|
+
use super::*;
|
|
18
|
+
|
|
19
|
+
#[test]
|
|
20
|
+
fn normalizes_keys_deterministically() {
|
|
21
|
+
assert_eq!(normalize_resource_key(" Hello / World "), "hello-world");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "{{PROJECT_NAME}}-worker"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
edition = "2021"
|
|
5
|
+
|
|
6
|
+
[lib]
|
|
7
|
+
crate-type = ["cdylib"]
|
|
8
|
+
|
|
9
|
+
[dependencies]
|
|
10
|
+
shared_core = { package = "{{PROJECT_NAME}}-core", path = "../core" }
|
|
11
|
+
worker = "{{WORKER_VERSION}}"
|
|
12
|
+
serde_json = "1.0"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
use serde_json::json;
|
|
2
|
+
use worker::*;
|
|
3
|
+
|
|
4
|
+
#[event(fetch)]
|
|
5
|
+
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
|
|
6
|
+
Router::new()
|
|
7
|
+
.get("/normalize/:value", |_req, ctx| {
|
|
8
|
+
let value = ctx.param("value").map(String::as_str).unwrap_or("");
|
|
9
|
+
Response::from_json(&json!({
|
|
10
|
+
"input": value,
|
|
11
|
+
"normalized": shared_core::normalize_resource_key(value)
|
|
12
|
+
}))
|
|
13
|
+
})
|
|
14
|
+
.run(req, env)
|
|
15
|
+
.await
|
|
16
|
+
}
|
|
@@ -3,16 +3,9 @@ import path from 'node:path';
|
|
|
3
3
|
import ts from 'typescript';
|
|
4
4
|
import { comparePaths, fileHasher } from './hash.js';
|
|
5
5
|
import { FILEMETA_FORMAT, FILEMETA_VERSION, metadataRoot } from './filemeta.js';
|
|
6
|
+
import { isAstSourceExtension, sourceLanguageIdForExtension } from '../source-types.js';
|
|
6
7
|
const MAX_AST_BYTES = 2 * 1024 * 1024;
|
|
7
8
|
|
|
8
|
-
const LANGUAGE_BY_EXTENSION = Object.freeze({
|
|
9
|
-
'.c': 'c', '.cc': 'cpp', '.cpp': 'cpp', '.cxx': 'cpp', '.css': 'css', '.go': 'go',
|
|
10
|
-
'.h': 'c', '.hpp': 'cpp', '.html': 'html', '.java': 'java', '.js': 'javascript',
|
|
11
|
-
'.jsx': 'javascript', '.json': 'json', '.md': 'markdown', '.mjs': 'javascript',
|
|
12
|
-
'.cjs': 'javascript', '.py': 'python', '.rs': 'rust', '.scss': 'scss', '.sql': 'sql',
|
|
13
|
-
'.ts': 'typescript', '.tsx': 'typescript', '.yaml': 'yaml', '.yml': 'yaml',
|
|
14
|
-
});
|
|
15
|
-
const AST_EXTENSIONS = new Set(['.js', '.jsx', '.mjs', '.cjs', '.ts', '.tsx']);
|
|
16
9
|
const ASSET_EXTENSIONS = new Set([
|
|
17
10
|
'.avif', '.eot', '.gif', '.ico', '.jpeg', '.jpg', '.mp3', '.mp4', '.ogg', '.otf', '.pdf',
|
|
18
11
|
'.png', '.svg', '.ttf', '.wav', '.webm', '.webp', '.woff', '.woff2',
|
|
@@ -305,7 +298,7 @@ export async function buildSemanticMetadata(rootPath, tree) {
|
|
|
305
298
|
const pkg = nearestPackage(contentEntry.path, packages);
|
|
306
299
|
const localPath = pkg?.root && contentEntry.path.startsWith(pkg.root + '/') ? contentEntry.path.slice(pkg.root.length + 1) : contentEntry.path;
|
|
307
300
|
const ext = extensionOf(contentEntry.path);
|
|
308
|
-
const language =
|
|
301
|
+
const language = sourceLanguageIdForExtension(ext);
|
|
309
302
|
const layer = inferLayer(contentEntry.path, pkg?.root || '');
|
|
310
303
|
const kind = contentEntry.type === 'symlink' ? 'symlink' : inferKind(contentEntry.path, language);
|
|
311
304
|
const structuralSystem = (contentEntry.path.startsWith('packages/') || contentEntry.path.startsWith('apps/')) ? contentEntry.path.split('/')[1] : null;
|
|
@@ -314,7 +307,7 @@ export async function buildSemanticMetadata(rootPath, tree) {
|
|
|
314
307
|
const tags = new Set([...(Array.isArray(pkg?.agentsam?.tags) ? pkg.agentsam.tags : []), ...(explicit.tags || [])].filter((tag) => typeof tag === 'string' && tag));
|
|
315
308
|
let mode = contentEntry.mode;
|
|
316
309
|
let sourceBuffer = null;
|
|
317
|
-
if (contentEntry.type === 'file' &&
|
|
310
|
+
if (contentEntry.type === 'file' && isAstSourceExtension(ext) && contentEntry.size <= MAX_AST_BYTES) {
|
|
318
311
|
const verified = await readVerifiedFile(rootPath, contentEntry);
|
|
319
312
|
if (mode != null && verified.mode !== mode) throw new Error(`File mode changed while building semantic metadata: ${contentEntry.path}`);
|
|
320
313
|
mode = verified.mode;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
|
|
3
|
+
const DEFINITIONS = [
|
|
4
|
+
{ id: 'javascript', label: 'JavaScript', kind: 'code', extensions: ['.js', '.mjs', '.cjs', '.jsx'], knowledge: true, ast: true },
|
|
5
|
+
{ id: 'typescript', label: 'TypeScript', kind: 'code', extensions: ['.ts', '.tsx'], knowledge: true, ast: true },
|
|
6
|
+
{ id: 'rust', label: 'Rust', kind: 'code', extensions: ['.rs'], knowledge: true },
|
|
7
|
+
{ id: 'python', label: 'Python', kind: 'code', extensions: ['.py'], knowledge: true },
|
|
8
|
+
{ id: 'go', label: 'Go', kind: 'code', extensions: ['.go'], knowledge: true },
|
|
9
|
+
{ id: 'java', label: 'Java', kind: 'code', extensions: ['.java'] },
|
|
10
|
+
{ id: 'kotlin', label: 'Kotlin', kind: 'code', extensions: ['.kt'] },
|
|
11
|
+
{ id: 'swift', label: 'Swift', kind: 'code', extensions: ['.swift'] },
|
|
12
|
+
{ id: 'c', label: 'C', kind: 'code', extensions: ['.c', '.h'] },
|
|
13
|
+
{ id: 'cpp', label: 'C++', kind: 'code', extensions: ['.cc', '.cpp', '.cxx', '.hpp'] },
|
|
14
|
+
{ id: 'csharp', label: 'C#', kind: 'code', extensions: ['.cs'] },
|
|
15
|
+
{ id: 'ruby', label: 'Ruby', kind: 'code', extensions: ['.rb'] },
|
|
16
|
+
{ id: 'php', label: 'PHP', kind: 'code', extensions: ['.php'] },
|
|
17
|
+
{ id: 'sql', label: 'SQL', kind: 'code', extensions: ['.sql'], knowledge: true },
|
|
18
|
+
{ id: 'shell', label: 'Shell', kind: 'code', extensions: ['.sh', '.bash', '.zsh'] },
|
|
19
|
+
{ id: 'yaml', label: 'YAML', kind: 'code', extensions: ['.yaml', '.yml'] },
|
|
20
|
+
{ id: 'toml', label: 'TOML', kind: 'code', extensions: ['.toml'] },
|
|
21
|
+
{ id: 'vue', label: 'Vue', kind: 'code', extensions: ['.vue'] },
|
|
22
|
+
{ id: 'svelte', label: 'Svelte', kind: 'code', extensions: ['.svelte'] },
|
|
23
|
+
{ id: 'markdown', label: 'Markdown', kind: 'document', extensions: ['.md', '.mdx'], knowledge: true },
|
|
24
|
+
{ id: 'json', label: 'JSON', kind: 'document', extensions: ['.json'], knowledge: true },
|
|
25
|
+
{ id: 'html', label: 'HTML', kind: 'document', extensions: ['.html', '.htm'] },
|
|
26
|
+
{ id: 'css', label: 'CSS', kind: 'document', extensions: ['.css', '.scss'] },
|
|
27
|
+
{ id: 'text', label: 'Text', kind: 'document', extensions: ['.txt'] },
|
|
28
|
+
{ id: 'xml', label: 'XML', kind: 'document', extensions: ['.xml'] },
|
|
29
|
+
{ id: 'csv', label: 'CSV', kind: 'document', extensions: ['.csv'] },
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
export const SOURCE_TYPES = Object.freeze(
|
|
33
|
+
DEFINITIONS.map((definition) => Object.freeze({
|
|
34
|
+
...definition,
|
|
35
|
+
extensions: Object.freeze([...definition.extensions]),
|
|
36
|
+
})),
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const BY_EXTENSION = new Map(
|
|
40
|
+
SOURCE_TYPES.flatMap((definition) => definition.extensions.map((extension) => [extension, definition])),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
export function normalizeSourceExtension(value) {
|
|
44
|
+
const raw = String(value || '').trim().toLowerCase();
|
|
45
|
+
if (!raw) return '';
|
|
46
|
+
return raw.startsWith('.') ? raw : '.' + raw;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function sourceTypeForExtension(value) {
|
|
50
|
+
return BY_EXTENSION.get(normalizeSourceExtension(value)) || null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function sourceTypeForPath(filePath) {
|
|
54
|
+
const lower = String(filePath || '').toLowerCase();
|
|
55
|
+
if (lower.endsWith('.d.ts')) return sourceTypeForExtension('.ts');
|
|
56
|
+
return sourceTypeForExtension(path.posix.extname(lower));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function sourceLanguageForExtension(value) {
|
|
60
|
+
return sourceTypeForExtension(value)?.label || null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function sourceLanguageIdForExtension(value) {
|
|
64
|
+
return sourceTypeForExtension(value)?.id || null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function isCodeSourceExtension(value) {
|
|
68
|
+
return sourceTypeForExtension(value)?.kind === 'code';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function isDocumentSourceExtension(value) {
|
|
72
|
+
return sourceTypeForExtension(value)?.kind === 'document';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function isKnowledgeSourceExtension(value) {
|
|
76
|
+
return sourceTypeForExtension(value)?.knowledge === true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function isKnowledgeSourcePath(filePath) {
|
|
80
|
+
return sourceTypeForPath(filePath)?.knowledge === true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function isAstSourceExtension(value) {
|
|
84
|
+
return sourceTypeForExtension(value)?.ast === true;
|
|
85
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# AgentSam Credential System
|
|
2
|
+
|
|
3
|
+
## Answers (current Worker)
|
|
4
|
+
|
|
5
|
+
### How does `/api/vault/*` work?
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Browser /settings/keys
|
|
9
|
+
│
|
|
10
|
+
▼
|
|
11
|
+
POST /api/vault/secrets { service_name, value }
|
|
12
|
+
│
|
|
13
|
+
▼
|
|
14
|
+
AES-256-GCM encrypt with VAULT_MASTER_KEY
|
|
15
|
+
AAD = userId:service:name
|
|
16
|
+
│
|
|
17
|
+
▼
|
|
18
|
+
D1 user_secrets (ciphertext + metadata + last4)
|
|
19
|
+
│
|
|
20
|
+
GET list → metadata only (never plaintext)
|
|
21
|
+
POST unwrap → service lane only (bridge / internal)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Auth lanes on the vault Worker:
|
|
25
|
+
|
|
26
|
+
| Lane | Header / cookie | Use |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| Browser session | identity session cookie | user manages own BYOK keys |
|
|
29
|
+
| Bridge | `AGENTSAM_BRIDGE_KEY` | machine unwrap / inventory |
|
|
30
|
+
|
|
31
|
+
## VAULT_MASTER_KEY format
|
|
32
|
+
|
|
33
|
+
Required:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
v1.<base64 of exactly 32 bytes>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Generate / rotate:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
node -e "import('node:crypto').then(({randomBytes})=>console.log('v1.'+randomBytes(32).toString('base64')))" \
|
|
43
|
+
| npx wrangler secret put VAULT_MASTER_KEY -c apps/local-studio/backend/wrangler.jsonc
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Or: `node apps/local-studio/scripts/ensure-vault-secret.mjs` (mints `v1.` when missing; does **not** rotate an existing secret).
|
|
47
|
+
|
|
48
|
+
Arbitrary strings are **rejected** (no silent truncate/hash).
|
|
49
|
+
|
|
50
|
+
### App-owned keys (no cross-app coupling)
|
|
51
|
+
|
|
52
|
+
Each Worker owns its own `VAULT_MASTER_KEY`. Rotating Local Studio (`agentsam-sdk` Worker via `apps/local-studio/backend/wrangler.jsonc`) has **zero** effect on Inner Animal Media’s Worker secret of the same name, and vice versa. Never copy a vault master key between apps.
|
|
53
|
+
|
|
54
|
+
### After rotation — BYOK re-save
|
|
55
|
+
|
|
56
|
+
Existing `user_secrets` ciphertext encrypted under the previous master key will not decrypt. There is no safe server-side re-encrypt without plaintext.
|
|
57
|
+
|
|
58
|
+
Operational plan:
|
|
59
|
+
|
|
60
|
+
1. Rotate `VAULT_MASTER_KEY` on the target Worker only (pipe into `wrangler secret put`; never log/print the value).
|
|
61
|
+
2. Deploy that Worker so runtime imports the new `v1.` key.
|
|
62
|
+
3. In Local Studio → **Settings → Keys**, delete orphaned provider rows (or they will fail on unwrap), then re-enter each BYOK value and save. New ciphertext is sealed under the new key.
|
|
63
|
+
4. Do **not** bulk-wipe shared D1 `user_secrets` unless you intend to invalidate every consumer of that table — scope cleanup to the users/services you manage in this app.
|
|
64
|
+
|
|
65
|
+
### Where is `AGENTSAM_API_KEY` minted / used?
|
|
66
|
+
|
|
67
|
+
| Concern | Detail |
|
|
68
|
+
|---|---|
|
|
69
|
+
| Format | `aak_*` |
|
|
70
|
+
| Store | IAM D1 `agentsam_api_credentials` (**hash only**) |
|
|
71
|
+
| Verify | `resolveAgentsamApiCredential` on inneranimalmedia |
|
|
72
|
+
| Consume | `Authorization: Bearer aak_…` in SDK/CLI for remote control-plane |
|
|
73
|
+
| Env | Customer sets `AGENTSAM_API_KEY` in wrangler/env — **compatibility adapter**, not primary UX |
|
|
74
|
+
| Not | Browser OAuth session, bridge key, or vault ciphertext |
|
|
75
|
+
|
|
76
|
+
Mint path: account credential rows are verified today; product mint UI belongs on `/settings/keys` under kind `agentsam_api_key` (registry already defines the provider). Hash insert against `agentsam_api_credentials` is the IAM-side write still to productize.
|
|
77
|
+
|
|
78
|
+
## New packages (this change)
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
packages/agentsam-vault/ contracts, AES-GCM, provider registry, resolver
|
|
82
|
+
packages/agentsam-key-manager/ SensitiveInput, KeysPage, IntegrationsPage
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Local Studio `/settings/keys` and `/settings/integrations` now consume key-manager; vault API remains the hosted backend.
|
|
86
|
+
|
|
87
|
+
## Authority split (from your CF dashboard)
|
|
88
|
+
|
|
89
|
+
| Secret / var | Role |
|
|
90
|
+
|---|---|
|
|
91
|
+
| `VAULT_MASTER_KEY` | Encrypt user_secrets |
|
|
92
|
+
| `AGENTSAM_BRIDGE_KEY` | Machine service auth |
|
|
93
|
+
| `IAM_CLIENT_ID` / `IAM_CLIENT_SECRET` | Hosted OAuth confidential client |
|
|
94
|
+
| `CLOUDFLARE_OAUTH_CLIENT_ID` (+ optional secret) | CF OAuth (PKCE-only OK without secret) |
|
|
95
|
+
| `OPENAI_API_KEY` etc. | Env fallback until vault wins |
|
|
96
|
+
| `AGENTSAM_API_KEY` | Delegated `aak_*` for customers' Workers |
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@inneranimalmedia/agentsam-vault",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "AgentSam credential vault core \u2014 contracts, AES-GCM crypto, provider registry, resolver. UI lives in agentsam-key-manager.",
|
|
7
|
+
"main": "./src/index.js",
|
|
8
|
+
"types": "./src/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./src/index.d.ts",
|
|
12
|
+
"default": "./src/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./contracts": {
|
|
15
|
+
"types": "./src/contracts/credential.d.ts",
|
|
16
|
+
"default": "./src/contracts/credential.js"
|
|
17
|
+
},
|
|
18
|
+
"./providers": "./src/providers/registry.js",
|
|
19
|
+
"./crypto": {
|
|
20
|
+
"types": "./src/crypto/aes-gcm.d.ts",
|
|
21
|
+
"default": "./src/crypto/aes-gcm.js"
|
|
22
|
+
},
|
|
23
|
+
"./resolver": "./src/runtime/resolver.js",
|
|
24
|
+
"./oauth": "./src/crypto/oauth-envelope.js"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"test": "node --test tests/*.test.mjs"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portable AgentSam credential / vault contracts (types).
|
|
3
|
+
* Secrets never live on CredentialRecord — only credential_ref.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type CredentialOwnerType = "user" | "account" | "app";
|
|
7
|
+
export type CredentialKind =
|
|
8
|
+
| "provider_api_key"
|
|
9
|
+
| "oauth_connection"
|
|
10
|
+
| "agentsam_api_key"
|
|
11
|
+
| "app_secret";
|
|
12
|
+
export type CredentialStatus = "active" | "expired" | "revoked" | "invalid";
|
|
13
|
+
|
|
14
|
+
export interface CredentialRecord {
|
|
15
|
+
id: string;
|
|
16
|
+
owner_type: CredentialOwnerType;
|
|
17
|
+
owner_id: string;
|
|
18
|
+
kind: CredentialKind;
|
|
19
|
+
provider?: string;
|
|
20
|
+
label: string;
|
|
21
|
+
credential_ref: string;
|
|
22
|
+
status: CredentialStatus;
|
|
23
|
+
capabilities?: string[];
|
|
24
|
+
granted_scopes?: string[];
|
|
25
|
+
expires_at?: string | null;
|
|
26
|
+
validated_at?: string | null;
|
|
27
|
+
last_used_at?: string | null;
|
|
28
|
+
rotated_at?: string | null;
|
|
29
|
+
last4?: string;
|
|
30
|
+
created_at: string;
|
|
31
|
+
updated_at: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface CredentialProviderField {
|
|
35
|
+
id: string;
|
|
36
|
+
type: "secret" | "text" | "url";
|
|
37
|
+
required?: boolean;
|
|
38
|
+
label?: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface CredentialProviderDefinition {
|
|
42
|
+
id: string;
|
|
43
|
+
label: string;
|
|
44
|
+
credential: { kind: CredentialKind; sensitive?: boolean };
|
|
45
|
+
fields: CredentialProviderField[];
|
|
46
|
+
capabilities?: string[];
|
|
47
|
+
operations?: { test?: boolean; rotate?: boolean; revoke?: boolean };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export declare const CREDENTIAL_KINDS: Readonly<{
|
|
51
|
+
PROVIDER_API_KEY: "provider_api_key";
|
|
52
|
+
OAUTH_CONNECTION: "oauth_connection";
|
|
53
|
+
AGENTSAM_API_KEY: "agentsam_api_key";
|
|
54
|
+
APP_SECRET: "app_secret";
|
|
55
|
+
}>;
|
|
56
|
+
|
|
57
|
+
export declare const CREDENTIAL_STATUSES: Readonly<{
|
|
58
|
+
ACTIVE: "active";
|
|
59
|
+
EXPIRED: "expired";
|
|
60
|
+
REVOKED: "revoked";
|
|
61
|
+
INVALID: "invalid";
|
|
62
|
+
}>;
|
|
63
|
+
|
|
64
|
+
export declare const CREDENTIAL_AUTHORITY: Readonly<{
|
|
65
|
+
vaultMasterKey: "VAULT_MASTER_KEY";
|
|
66
|
+
agentsamApiKey: "AGENTSAM_API_KEY";
|
|
67
|
+
agentsamApiKeyPrefix: "aak_";
|
|
68
|
+
agentsamApiKeyStore: "agentsam_api_credentials";
|
|
69
|
+
bridgeKey: "AGENTSAM_BRIDGE_KEY";
|
|
70
|
+
}>;
|
|
71
|
+
|
|
72
|
+
export function normalizeCredentialRecord(
|
|
73
|
+
input: Partial<CredentialRecord> & Record<string, unknown>,
|
|
74
|
+
): CredentialRecord;
|
|
75
|
+
|
|
76
|
+
export function defineCredentialProvider(
|
|
77
|
+
def: CredentialProviderDefinition,
|
|
78
|
+
): CredentialProviderDefinition;
|