@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.8
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 +29 -0
- package/README.md +37 -0
- package/apps/README.md +5 -0
- package/apps/cad-creator/README.md +4 -4
- package/apps/cad-creator/shared/cad/package.json +1 -1
- package/apps/client-cms-editor/AGENTS.md +12 -7
- package/apps/client-cms-editor/README.md +76 -48
- package/apps/client-cms-editor/agentsam.app.json +26 -9
- package/apps/client-cms-editor/backend/package.json +20 -3
- package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
- package/apps/client-cms-editor/backend/src/index.ts +1 -1
- package/apps/client-cms-editor/backend/src/model.ts +11 -115
- package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
- package/apps/client-cms-editor/backend/tsconfig.json +6 -1
- package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
- package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
- package/apps/client-cms-editor/frontend/package.json +16 -7
- package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
- package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
- package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
- package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
- package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
- package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
- package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
- package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
- package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
- package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
- package/apps/client-cms-editor/frontend/src/index.ts +19 -5
- package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
- package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
- package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
- package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
- package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
- package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
- package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
- package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
- package/apps/client-cms-editor/package-lock.json +973 -134
- package/apps/client-cms-editor/package.json +118 -6
- package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
- package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
- package/apps/client-cms-editor/reference/harvest/README.md +8 -0
- package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
- package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
- package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
- package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
- package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
- package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
- package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
- package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
- package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
- package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
- package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
- package/apps/client-cms-editor/shared/cms/package.json +17 -7
- package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
- package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
- package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
- package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
- package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
- package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
- package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
- package/contracts/source-types.v1.json +353 -0
- package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
- package/docs/PRODUCT_LIFECYCLE.md +566 -0
- package/docs/REPO_FILE_MAP.txt +132 -0
- package/docs/THEME_REFINERY.md +2 -2
- package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
- package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
- package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
- package/migrations/d1/0017_identity_native_oauth.sql +21 -0
- package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
- package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
- package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
- package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
- package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
- package/native/agentsam-machine/Cargo.lock +426 -0
- package/native/agentsam-machine/Cargo.toml +9 -0
- package/native/agentsam-machine/cli/Cargo.toml +21 -0
- package/native/agentsam-machine/cli/README.md +21 -0
- package/native/agentsam-machine/cli/src/main.rs +77 -0
- package/native/agentsam-machine/core/Cargo.toml +22 -0
- package/native/agentsam-machine/core/README.md +14 -0
- package/native/agentsam-machine/core/build.rs +33 -0
- package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
- package/native/agentsam-machine/core/src/assets.rs +790 -0
- package/native/agentsam-machine/core/src/bound.rs +298 -0
- package/native/agentsam-machine/core/src/enrich.rs +706 -0
- package/native/agentsam-machine/core/src/frontend.rs +442 -0
- package/native/agentsam-machine/core/src/lib.rs +1092 -0
- package/native/agentsam-machine/core/src/liquid.rs +528 -0
- package/native/agentsam-machine/core/src/source_types.rs +78 -0
- package/package.json +64 -24
- package/packages/agentsam-brand/README.md +1 -1
- package/packages/agentsam-brand/package.json +4 -4
- package/packages/agentsam-brand/src/index.js +1 -1
- package/packages/agentsam-contracts/package.json +13 -3
- package/packages/agentsam-contracts/src/tools.ts +22 -0
- package/packages/agentsam-errors/package.json +13 -3
- package/packages/agentsam-errors/src/index.js +1 -0
- package/packages/agentsam-errors/src/tool.js +56 -0
- package/packages/agentsam-errors/test/tool.test.mjs +58 -0
- package/packages/agentsam-goap/README.md +52 -0
- package/packages/agentsam-goap/package.json +37 -0
- package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
- package/packages/agentsam-goap/src/adapters/memory.js +199 -0
- package/packages/agentsam-goap/src/contracts.js +226 -0
- package/packages/agentsam-goap/src/control-plane.js +112 -0
- package/packages/agentsam-goap/src/errors.js +157 -0
- package/packages/agentsam-goap/src/index.js +5 -0
- package/packages/agentsam-goap/src/world.js +202 -0
- package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
- package/packages/agentsam-goap/test/world.test.mjs +79 -0
- package/packages/agentsam-knowledge/package.json +18 -4
- package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
- package/packages/agentsam-knowledge/src/backends/index.js +33 -1
- package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
- package/packages/agentsam-nav/dist/browser.global.js +21 -18
- package/packages/agentsam-nav/dist/browser.js +6807 -130
- package/packages/agentsam-nav/dist/index.js +6799 -122
- package/packages/agentsam-nav/package.json +24 -6
- package/packages/agentsam-queue-control/README.md +1 -1
- package/packages/agentsam-queue-control/package.json +7 -2
- package/packages/agentsam-rapid-rust/src/main.rs +1 -1
- package/packages/agentsam-repository/package.json +13 -3
- package/packages/agentsam-repository/src/goap.js +13 -14
- package/packages/agentsam-repository/src/source-types.js +8 -0
- package/packages/agentsam-repository/src/tickets.js +15 -22
- package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
- package/packages/agentsam-vault/package.json +14 -4
- package/packages/agentsam-workbench/package.json +15 -4
- package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
- package/packages/agentsam-workbench/src/agent/index.ts +2 -0
- package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
- package/packages/connectors/cloudflare/package.json +15 -3
- package/packages/connectors/cloudflare/src/api-client.js +3 -2
- package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
- package/packages/connectors/cloudflare/src/index.js +1 -0
- package/packages/heuristic-theme/README.md +2 -2
- package/packages/heuristic-theme/package.json +8 -3
- package/packages/heuristic-theme/src/registry.js +2 -2
- package/packages/heuristic-theme/src/theme.js +1 -1
- package/packages/heuristic-theme/test/theme.test.mjs +1 -1
- package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
- package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
- package/packages/identity/README.md +2 -2
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
- package/packages/identity/migrations/apply-portable.js +109 -0
- package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
- package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
- package/packages/identity/package.json +27 -6
- package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
- package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
- package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
- package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
- package/packages/identity/src/adapters/iam-compat/index.js +540 -0
- package/packages/identity/src/adapters/portable-d1/index.js +18 -0
- package/packages/identity/src/adapters/portable-store.js +479 -0
- package/packages/identity/src/adapters/sqlite/index.js +13 -312
- package/packages/identity/src/contracts/auth-config.js +0 -1
- package/packages/identity/src/contracts/identity-store.js +56 -5
- package/packages/identity/src/contracts/provider.js +1 -0
- package/packages/identity/src/contracts/sign-in-options.js +104 -0
- package/packages/identity/src/core/constants.js +1 -1
- package/packages/identity/src/core/session-policy.js +31 -0
- package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -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 +6 -37
- package/packages/identity/src/index.js +28 -1
- package/packages/identity/src/migrations/README.md +23 -23
- package/packages/identity/src/oauth/README.md +1 -1
- package/packages/identity/src/oauth/credentials.js +10 -11
- package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
- package/packages/identity/src/oauth/iam-platform.js +21 -9
- package/packages/identity/src/oauth/native-handoff.js +136 -0
- package/packages/identity/src/providers/chatgpt/headers.js +65 -0
- package/packages/identity/src/providers/chatgpt/index.js +86 -0
- package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
- package/packages/identity/src/providers/chatgpt/paths.js +45 -0
- package/packages/identity/src/providers/github/oauth.js +1 -2
- package/packages/identity/src/providers/github/profile.js +16 -2
- package/packages/identity/src/providers/index.js +11 -3
- package/packages/identity/src/server/identity-service.js +2 -1
- package/packages/identity/src/server/worker-router.js +71 -18
- package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
- package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
- package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
- package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
- package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
- package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
- package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
- package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
- package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
- package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
- package/packages/providers/completeful/package.json +7 -2
- package/packages/theme-church-site/package.json +17 -6
- package/packages/theme-church-site/src/harvest.json +4 -2
- package/packages/theme-church-site/src/index.js +7 -3
- package/packages/theme-church-site/test/theme.test.mjs +4 -2
- package/packages/theme-companions-site/package.json +17 -6
- package/packages/theme-companions-site/src/harvest.json +4 -2
- package/packages/theme-companions-site/src/index.js +7 -3
- package/packages/theme-companions-site/test/theme.test.mjs +4 -2
- package/packages/theme-floors-site/package.json +17 -6
- package/packages/theme-floors-site/src/harvest.json +4 -2
- package/packages/theme-floors-site/src/index.js +7 -3
- package/packages/theme-floors-site/test/theme.test.mjs +4 -2
- package/packages/theme-fuelnfree-site/package.json +17 -6
- package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
- package/packages/theme-fuelnfree-site/src/index.js +7 -3
- package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
- package/packages/theme-handyman-site/package.json +17 -6
- package/packages/theme-handyman-site/src/harvest.json +4 -2
- package/packages/theme-handyman-site/src/index.js +7 -3
- package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
- package/packages/theme-insurance-site/package.json +17 -6
- package/packages/theme-insurance-site/src/harvest.json +4 -2
- package/packages/theme-insurance-site/src/index.js +7 -3
- package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
- package/packages/theme-scenes/README.md +1 -1
- package/packages/theme-scenes/package.json +4 -3
- package/packages/theme-scenes/src/registry.js +187 -0
- package/packages/theme-shinshu-site/package.json +17 -6
- package/packages/theme-shinshu-site/src/harvest.json +4 -2
- package/packages/theme-shinshu-site/src/index.js +7 -3
- package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
- package/packages/work-graph/package.json +14 -4
- package/protocol/FILEMETA_V1.md +2 -2
- package/protocol/capabilities/manifest.json +1 -1
- package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
- package/protocol/presets/catalog.json +2 -2
- package/protocol/theme-refinery/lineage-registry.json +105 -0
- package/protocol/theme-refinery/product-metadata.schema.json +21 -1
- package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
- package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
- package/python/tests/test_repository_intelligence.py +30 -0
- package/src/cli/command-catalog.js +48 -5
- package/src/cli/dispatch.js +1 -0
- package/src/cli.js +20 -1
- package/src/cloudflare/runtime-status.js +2 -1
- package/src/commands/autorag.js +67 -13
- package/src/commands/cheat-sheet.js +29 -4
- package/src/commands/codebaseindex.js +45 -2
- package/src/commands/goap-world.js +134 -0
- package/src/commands/goap.js +11 -4
- package/src/commands/knowledge.js +59 -2
- package/src/commands/machine-binary.js +109 -0
- package/src/commands/machine-runtime.js +266 -0
- package/src/commands/machine.js +208 -0
- package/src/commands/package.js +530 -0
- package/src/commands/plan-ledger.js +370 -0
- package/src/commands/plan.js +183 -0
- package/src/commands/security.js +67 -4
- package/src/commands/setup.js +33 -16
- package/src/commands/skill.js +78 -17
- package/src/commands/status.js +8 -1
- package/src/features/resolve.js +1 -0
- package/src/knowledge/engine.js +21 -2
- package/src/knowledge/runtime-discovery.js +127 -0
- package/src/knowledge/source.js +1 -1
- package/src/lib/identity-scaffold.js +53 -13
- package/src/lib/setup/recipes.js +1 -1
- package/src/lib/slash-commands.js +1 -1
- package/src/local/runtime-store.js +24 -2
- package/src/local/sqlite.js +17 -0
- package/src/models/discovery.js +40 -22
- package/src/models/inventory-core.d.ts +105 -0
- package/src/models/inventory-core.js +54 -6
- package/src/sam/operations/package-audit.js +41 -0
- package/src/sam/seed.js +2 -0
- package/src/security/logs.js +3 -0
- package/src/ui/cli/help.js +41 -0
- package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
- package/test/account-session.test.mjs +0 -101
- package/test/agent-capabilities.test.mjs +0 -67
- package/test/app-authority-context.test.mjs +0 -32
- package/test/app-building-skills.test.mjs +0 -61
- package/test/apps-scaffold-contract.test.mjs +0 -114
- package/test/blender-cad.test.mjs +0 -146
- package/test/cad-docker.test.mjs +0 -96
- package/test/capabilities.test.mjs +0 -133
- package/test/cli/api-key-env-whoami.test.mjs +0 -129
- package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
- package/test/cli/eval-live.test.mjs +0 -219
- package/test/cli/go.test.mjs +0 -128
- package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
- package/test/cli/mcp-client.test.mjs +0 -256
- package/test/cli/preferences-runtime.test.mjs +0 -11
- package/test/cli/runtime-persist.test.mjs +0 -56
- package/test/cli/runtime-ui.test.mjs +0 -141
- package/test/cli/rust-command.test.mjs +0 -21
- package/test/cli/skill-npm-and-env.test.mjs +0 -52
- package/test/cli/status-actions.test.mjs +0 -88
- package/test/cli/wireframes-go-registry.test.mjs +0 -139
- package/test/cli-preferences.test.mjs +0 -46
- package/test/cloudflare-connector.test.mjs +0 -93
- package/test/cloudflare-runtime.test.mjs +0 -82
- package/test/context.test.mjs +0 -159
- package/test/credentials-audit.test.mjs +0 -113
- package/test/deploy-health-scan.test.mjs +0 -95
- package/test/deploy-receipt.test.mjs +0 -91
- package/test/dockerize.test.mjs +0 -93
- package/test/error-diagnostics.test.mjs +0 -124
- package/test/eval-context.test.mjs +0 -37
- package/test/execution-approvals.test.mjs +0 -27
- package/test/fixtures/cad/courtyard-house.json +0 -208
- package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
- package/test/gcloud-auth.test.mjs +0 -111
- package/test/go/build-source-identity.test.mjs +0 -31
- package/test/go/cloudflare-probe.test.mjs +0 -317
- package/test/go/distribution.test.mjs +0 -28
- package/test/google-cloud-connection.test.mjs +0 -83
- package/test/google-cloud-inventory.test.mjs +0 -64
- package/test/indexing-provider.test.mjs +0 -29
- package/test/init-options.test.mjs +0 -35
- package/test/integration/ai-access-onboarding.test.mjs +0 -47
- package/test/integration/app-command.test.mjs +0 -85
- package/test/integration/cad-discovery.test.mjs +0 -158
- package/test/integration/cad-docker-executor.test.mjs +0 -249
- package/test/integration/cad-execution.test.mjs +0 -184
- package/test/integration/cad-project-app.test.mjs +0 -31
- package/test/integration/cad-project-d1.test.mjs +0 -25
- package/test/integration/cad-project-native.test.mjs +0 -24
- package/test/integration/cad-project-workflow.test.mjs +0 -9
- package/test/integration/cad-project.test.mjs +0 -85
- package/test/integration/cli-help.test.mjs +0 -41
- package/test/integration/cms-app-scaffold.test.mjs +0 -71
- package/test/integration/cms-site-tenancy-contract.test.mjs +0 -257
- package/test/integration/codebaseindex-ingest.test.mjs +0 -214
- package/test/integration/core-client.integration.test.mjs +0 -55
- package/test/integration/error-runtime-rpc.test.mjs +0 -71
- package/test/integration/features-resolve.test.mjs +0 -147
- package/test/integration/icon-registry.test.mjs +0 -67
- package/test/integration/ingest-discover-models.test.mjs +0 -30
- package/test/integration/inspect-path-cli.test.mjs +0 -46
- package/test/integration/install-script.test.mjs +0 -110
- package/test/integration/inventory-core.test.mjs +0 -53
- package/test/integration/inventory-evidence.test.mjs +0 -125
- package/test/integration/knowledge-rpc.test.mjs +0 -112
- package/test/integration/local-fs.test.mjs +0 -113
- package/test/integration/merkle-cli.test.mjs +0 -61
- package/test/integration/merkle-persistence-identity.test.mjs +0 -48
- package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
- package/test/integration/provider-env-cli.test.mjs +0 -50
- package/test/integration/provider-factory.test.mjs +0 -197
- package/test/integration/repository-company-graph.test.mjs +0 -90
- package/test/integration/runtime-migrations.test.mjs +0 -87
- package/test/integration/runtime-status.integration.test.mjs +0 -212
- package/test/integration/sam-activity-recovery.test.mjs +0 -147
- package/test/integration/sam-decision.test.mjs +0 -584
- package/test/integration/sam-kernel.test.mjs +0 -99
- package/test/integration/sam-planning-astar.test.mjs +0 -279
- package/test/integration/scaffold-cloudflare.test.mjs +0 -46
- package/test/integration/skill-runtime.test.mjs +0 -240
- package/test/integration/storage-architecture.test.mjs +0 -154
- package/test/integration/store-discovery.test.mjs +0 -44
- package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
- package/test/integration/terminal-exec.integration.test.mjs +0 -86
- package/test/integration/tool-runtime.test.mjs +0 -124
- package/test/integration/tool-schema.test.mjs +0 -59
- package/test/jr-dev-skill.test.mjs +0 -26
- package/test/knowledge-context-pack.test.mjs +0 -19
- package/test/knowledge-postgres.test.mjs +0 -40
- package/test/knowledge-service.test.mjs +0 -110
- package/test/knowledge.test.mjs +0 -206
- package/test/live/terminal-transport.live.test.mjs +0 -24
- package/test/local-sessions.test.mjs +0 -57
- package/test/local-studio-deploy.test.mjs +0 -83
- package/test/loopback-oauth.test.mjs +0 -53
- package/test/merkle-render.test.mjs +0 -31
- package/test/mini.test.mjs +0 -140
- package/test/model-catalog.test.mjs +0 -70
- package/test/models.test.mjs +0 -309
- package/test/npm10-lock.test.mjs +0 -29
- package/test/ollama.test.mjs +0 -137
- package/test/open-url.test.mjs +0 -64
- package/test/openai-responses.test.mjs +0 -155
- package/test/portable-context.test.mjs +0 -94
- package/test/project-config.test.mjs +0 -81
- package/test/project-rules.test.mjs +0 -44
- package/test/provider-credentials.test.mjs +0 -106
- package/test/rehydrate.test.mjs +0 -25
- package/test/release-hygiene.test.mjs +0 -42
- package/test/repository-snapshot-view.test.mjs +0 -112
- package/test/responses-runner.test.mjs +0 -465
- package/test/runtime-activity.test.mjs +0 -98
- package/test/sdk-worker-contract.test.mjs +0 -72
- package/test/security.test.mjs +0 -252
- package/test/setup-planner.test.mjs +0 -74
- package/test/setup-runtime.test.mjs +0 -51
- package/test/shell.test.mjs +0 -281
- package/test/skills.test.mjs +0 -22
- package/test/smoke.mjs +0 -122
- package/test/telemetry.test.mjs +0 -79
- package/test/terminal/local-pty.mock.test.mjs +0 -153
- package/test/terminal-machine-identity.test.mjs +0 -88
- package/test/theme-portability.test.mjs +0 -14
- package/test/tools-search.test.mjs +0 -73
- package/test/unit/website-assets-bindings.test.mjs +0 -60
- package/test/whoami-resume.test.mjs +0 -157
package/src/commands/setup.js
CHANGED
|
@@ -18,11 +18,39 @@ import {
|
|
|
18
18
|
RUNTIME_PROFILES,
|
|
19
19
|
} from '../lib/setup/runtime.js';
|
|
20
20
|
import { runRuntime } from './runtime.js';
|
|
21
|
+
import { getCliCommand } from '../cli/command-catalog.js';
|
|
21
22
|
|
|
22
23
|
function writeLine(write, value = '') {
|
|
23
24
|
write(`${value}\n`);
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
function catalogCommand(id, args = '') {
|
|
28
|
+
const entry = getCliCommand(id);
|
|
29
|
+
if (!entry) throw new Error(`setup_next_command_not_catalogued: ${id}`);
|
|
30
|
+
return `agentsam ${entry.id}${args ? ` ${args}` : ''}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function setupNextCommands(capabilityIds = []) {
|
|
34
|
+
const commands = [
|
|
35
|
+
catalogCommand('status'),
|
|
36
|
+
catalogCommand('capabilities'),
|
|
37
|
+
catalogCommand('google-cloud', 'doctor'),
|
|
38
|
+
];
|
|
39
|
+
if (capabilityIds.includes('google.cloud')) {
|
|
40
|
+
commands.push(catalogCommand('setup', 'google.cloud --inventory'));
|
|
41
|
+
}
|
|
42
|
+
if (capabilityIds.includes('image.vectorize')) {
|
|
43
|
+
commands.push(catalogCommand('capabilities', 'image.vectorize'));
|
|
44
|
+
}
|
|
45
|
+
return [...new Set(commands)];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function writeSetupNext(write, capabilityIds = []) {
|
|
49
|
+
writeLine(write, ' Next');
|
|
50
|
+
for (const command of setupNextCommands(capabilityIds)) writeLine(write, ` ${command}`);
|
|
51
|
+
writeLine(write, '');
|
|
52
|
+
}
|
|
53
|
+
|
|
26
54
|
function printHelp(write) {
|
|
27
55
|
writeLine(write, '');
|
|
28
56
|
writeLine(write, ' Agent Sam · setup');
|
|
@@ -220,9 +248,9 @@ export async function runSetup(argv = [], options = {}) {
|
|
|
220
248
|
}
|
|
221
249
|
writeLine(write, '');
|
|
222
250
|
writeLine(write, ' Next');
|
|
223
|
-
writeLine(write, '
|
|
224
|
-
writeLine(write, '
|
|
225
|
-
writeLine(write, '
|
|
251
|
+
writeLine(write, ` ${catalogCommand('google-cloud', 'auth login')}`);
|
|
252
|
+
writeLine(write, ` ${catalogCommand('google-cloud', 'connection set --identity EMAIL --project PROJECT')}`);
|
|
253
|
+
writeLine(write, ` ${catalogCommand('google-cloud', 'doctor')}`);
|
|
226
254
|
writeLine(write, '');
|
|
227
255
|
}
|
|
228
256
|
return inv.errors?.length ? 2 : 0;
|
|
@@ -243,8 +271,7 @@ export async function runSetup(argv = [], options = {}) {
|
|
|
243
271
|
if (dryRun || !plan.would_install.length) {
|
|
244
272
|
if (!plan.would_install.length) {
|
|
245
273
|
writeLine(write, ' ✓ setup complete — requested capabilities already satisfied');
|
|
246
|
-
|
|
247
|
-
writeLine(write, '');
|
|
274
|
+
writeSetupNext(write, capabilityIds);
|
|
248
275
|
}
|
|
249
276
|
if (json) write(JSON.stringify({ environment, plan, executed: false }, null, 2) + '\n');
|
|
250
277
|
return 0;
|
|
@@ -262,17 +289,7 @@ export async function runSetup(argv = [], options = {}) {
|
|
|
262
289
|
writeLine(write, receipt.ok ? ' ✓ Agent Sam setup complete' : ' ✕ Setup finished with failures');
|
|
263
290
|
writeLine(write, ` Receipt ${receipt.path}`);
|
|
264
291
|
writeLine(write, '');
|
|
265
|
-
|
|
266
|
-
writeLine(write, ' agentsam doctor');
|
|
267
|
-
writeLine(write, ' agentsam capabilities');
|
|
268
|
-
if (capabilityIds.includes('google.cloud')) {
|
|
269
|
-
writeLine(write, ' agentsam setup google.cloud --inventory');
|
|
270
|
-
writeLine(write, ' agentsam gcloud auth login');
|
|
271
|
-
}
|
|
272
|
-
if (capabilityIds.includes('image.vectorize')) {
|
|
273
|
-
writeLine(write, ' agentsam image optimize ./logo.png # when image command ships');
|
|
274
|
-
}
|
|
275
|
-
writeLine(write, '');
|
|
292
|
+
writeSetupNext(write, capabilityIds);
|
|
276
293
|
|
|
277
294
|
if (json) write(JSON.stringify({ environment, plan, receipt }, null, 2) + '\n');
|
|
278
295
|
return receipt.ok ? 0 : 2;
|
package/src/commands/skill.js
CHANGED
|
@@ -49,25 +49,86 @@ function looksLikeNpmPackage(source) {
|
|
|
49
49
|
* Download an npm package tarball and return the extracted package root
|
|
50
50
|
* that contains agentsam.skill.json (or package root for relative resolve).
|
|
51
51
|
*/
|
|
52
|
+
|
|
53
|
+
function buildNpmPackEnv(baseEnv = process.env) {
|
|
54
|
+
const env = { ...baseEnv };
|
|
55
|
+
|
|
56
|
+
// resolveNpmSkillPackage requires a physical tarball.
|
|
57
|
+
// Parent npm lifecycle flags such as `npm publish --dry-run`
|
|
58
|
+
// must not change the semantics of this nested npm invocation.
|
|
59
|
+
for (const key of Object.keys(env)) {
|
|
60
|
+
if (/^npm_config_dry[_-]?run$/i.test(key)) {
|
|
61
|
+
delete env[key];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return env;
|
|
66
|
+
}
|
|
67
|
+
|
|
52
68
|
export function resolveNpmSkillPackage(spec, options = {}) {
|
|
53
69
|
const spawn = options.spawnSyncImpl || spawnSync;
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
const maxPackAttempts = 2;
|
|
71
|
+
|
|
72
|
+
let tmp = null;
|
|
73
|
+
let tgzPath = null;
|
|
74
|
+
let lastExpectedPath = null;
|
|
75
|
+
|
|
76
|
+
for (let attempt = 1; attempt <= maxPackAttempts; attempt += 1) {
|
|
77
|
+
tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-skill-npm-'));
|
|
78
|
+
|
|
79
|
+
const pack = spawn('npm', ['pack', spec, '--json', '--pack-destination', tmp], {
|
|
80
|
+
encoding: 'utf8',
|
|
81
|
+
cwd: options.cwd || process.cwd(),
|
|
82
|
+
env: buildNpmPackEnv(options.env || process.env),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if ((pack.status ?? 1) !== 0) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
`npm_pack_failed:${spec}:${String(pack.stderr || pack.stdout || '').trim() || 'unknown'}`,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let tgzName = null;
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const payload = JSON.parse(String(pack.stdout || ''));
|
|
95
|
+
const entry = Array.isArray(payload) ? payload[0] : payload;
|
|
96
|
+
if (entry?.filename) tgzName = path.basename(String(entry.filename));
|
|
97
|
+
} catch {
|
|
98
|
+
// Fall through to filesystem discovery.
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const packed = fs.readdirSync(tmp)
|
|
102
|
+
.filter((name) => name.endsWith('.tgz'))
|
|
103
|
+
.sort();
|
|
104
|
+
|
|
105
|
+
if (!tgzName && packed.length === 1) {
|
|
106
|
+
tgzName = packed[0];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (tgzName) {
|
|
110
|
+
const expected = path.join(tmp, tgzName);
|
|
111
|
+
lastExpectedPath = expected;
|
|
112
|
+
|
|
113
|
+
if (fs.existsSync(expected)) {
|
|
114
|
+
tgzPath = expected;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// npm occasionally reports success before producing no artifact.
|
|
120
|
+
// Treat only that narrow condition as transient and retry once.
|
|
121
|
+
if (attempt < maxPackAttempts) {
|
|
122
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
123
|
+
tmp = null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (!tmp || !tgzPath || !fs.existsSync(tgzPath)) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`npm_pack_missing:${lastExpectedPath || spec}:attempts=${maxPackAttempts}`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
71
132
|
|
|
72
133
|
const extractDir = path.join(tmp, 'pkg');
|
|
73
134
|
fs.mkdirSync(extractDir, { recursive: true });
|
package/src/commands/status.js
CHANGED
|
@@ -4,6 +4,7 @@ import { buildStatusActionPlan } from '../status/actions.js';
|
|
|
4
4
|
import { openExternalUrl } from '../lib/open-url.js';
|
|
5
5
|
import readline from 'node:readline/promises';
|
|
6
6
|
import { stdin as input, stdout as output } from 'node:process';
|
|
7
|
+
import { renderCommandHelp } from '../ui/cli/help.js';
|
|
7
8
|
|
|
8
9
|
function parseStatusArgs(argv = []) {
|
|
9
10
|
const opts = {
|
|
@@ -11,12 +12,14 @@ function parseStatusArgs(argv = []) {
|
|
|
11
12
|
offline: false,
|
|
12
13
|
discoverModels: true,
|
|
13
14
|
interactive: false,
|
|
15
|
+
help: false,
|
|
14
16
|
};
|
|
15
17
|
for (const arg of argv) {
|
|
16
18
|
if (arg === '--json') opts.json = true;
|
|
17
19
|
else if (arg === '--offline') opts.offline = true;
|
|
18
20
|
else if (arg === '--no-discover') opts.discoverModels = false;
|
|
19
21
|
else if (arg === '--interactive' || arg === '-i') opts.interactive = true;
|
|
22
|
+
else if (arg === '--help' || arg === '-h') opts.help = true;
|
|
20
23
|
else throw new Error(`unknown status option: ${arg}`);
|
|
21
24
|
}
|
|
22
25
|
return opts;
|
|
@@ -68,13 +71,17 @@ async function runInteractiveMenu(status, write) {
|
|
|
68
71
|
|
|
69
72
|
export async function runStatus(argv = [], opts = {}) {
|
|
70
73
|
const parsed = parseStatusArgs(argv);
|
|
74
|
+
const write = opts.write || ((value) => process.stdout.write(value));
|
|
75
|
+
if (parsed.help) {
|
|
76
|
+
write(renderCommandHelp('status'));
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
71
79
|
const status = await (opts.collectRuntime || collectRuntimeStatus)({
|
|
72
80
|
...opts,
|
|
73
81
|
cwd: opts.cwd || process.cwd(),
|
|
74
82
|
offline: parsed.offline,
|
|
75
83
|
discoverModels: parsed.discoverModels,
|
|
76
84
|
});
|
|
77
|
-
const write = opts.write || ((value) => process.stdout.write(value));
|
|
78
85
|
if (parsed.json) {
|
|
79
86
|
const plan = buildStatusActionPlan(status);
|
|
80
87
|
write(`${JSON.stringify({ ...status, next: plan }, null, 2)}\n`);
|
package/src/features/resolve.js
CHANGED
|
@@ -39,6 +39,7 @@ export function normalizeProviderTemplateId(id) {
|
|
|
39
39
|
if (!key) return '';
|
|
40
40
|
if (key === 'iam') return 'inneranimalmedia';
|
|
41
41
|
if (key === 'google-desktop') return 'google_desktop';
|
|
42
|
+
if (key === 'openai' || key === 'chatgpt-hosted' || key === 'chatgpt_hosted') return 'chatgpt';
|
|
42
43
|
return key;
|
|
43
44
|
}
|
|
44
45
|
|
package/src/knowledge/engine.js
CHANGED
|
@@ -59,7 +59,7 @@ export async function planIndex({ root, config: input, store, embed = false, lim
|
|
|
59
59
|
limits: Number.isFinite(maxFiles) || Number.isFinite(maxChunks) ? { max_files: maxFiles, max_chunks: maxChunks } : null } };
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
export async function runIndex({ root, config, store, embedder, embed = false, maxInputs = 100, maxCharacters = 200000, limits = null }) {
|
|
62
|
+
export async function runIndex({ root, config, store, embedder, embed = false, vectorBackend = null, vectorContext = {}, maxInputs = 100, maxCharacters = 200000, limits = null }) {
|
|
63
63
|
if (!store) throw new Error('A writable knowledge store is required.');
|
|
64
64
|
if (!Number.isInteger(maxInputs) || maxInputs < 0 || !Number.isInteger(maxCharacters) || maxCharacters < 0) throw new Error('Embedding budgets must be nonnegative integers.');
|
|
65
65
|
const plan = await planIndex({ root, config, store, embed, limits });
|
|
@@ -76,6 +76,25 @@ export async function runIndex({ root, config, store, embedder, embed = false, m
|
|
|
76
76
|
// Completed work remains reusable even if a later request or publication fails.
|
|
77
77
|
await store.cachePut(key, vector);
|
|
78
78
|
}
|
|
79
|
+
let vectorUpsert = null;
|
|
80
|
+
if (embed && plan.config.lane?.backend === 'cloudflare_vectorize') {
|
|
81
|
+
if (!vectorBackend?.upsert) throw new Error('cloudflare_vectorize_backend_required');
|
|
82
|
+
const records = [];
|
|
83
|
+
for (const chunk of plan.chunks) {
|
|
84
|
+
const vector = validateVector(await store.cacheGet(chunk.embedding_key), plan.config.embedding.dimensions);
|
|
85
|
+
records.push({
|
|
86
|
+
id: chunk.id,
|
|
87
|
+
vector,
|
|
88
|
+
metadata: { path: chunk.path, ordinal: chunk.ordinal, content_hash: chunk.content_hash },
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
vectorUpsert = await vectorBackend.upsert(records, {
|
|
92
|
+
...vectorContext,
|
|
93
|
+
binding: plan.config.lane.binding,
|
|
94
|
+
index: plan.config.lane.index,
|
|
95
|
+
profile: { ...plan.config.lane, dimensions: plan.config.embedding.dimensions },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
79
98
|
// A generation describes one coherent source snapshot. Never publish after a mid-run edit.
|
|
80
99
|
const check = [];
|
|
81
100
|
const checkFiles = inventory(root, plan.config.scope).slice(0, limits?.maxFiles == null ? Infinity : limits.maxFiles);
|
|
@@ -85,7 +104,7 @@ export async function runIndex({ root, config, store, embedder, embed = false, m
|
|
|
85
104
|
source_hash: receipt.source_hash, config_hash: receipt.config_hash, config: plan.config, profile_id: receipt.profile_id,
|
|
86
105
|
git: gitEvidence(root), files: plan.files, chunks: plan.chunks, symbols: plan.symbols, edges: plan.edges, receipt };
|
|
87
106
|
await store.publish(generation, plan.previous?.id || null);
|
|
88
|
-
return { ...receipt, generation_id: generation.id, published: true };
|
|
107
|
+
return { ...receipt, generation_id: generation.id, published: true, vector_upsert: vectorUpsert };
|
|
89
108
|
}
|
|
90
109
|
|
|
91
110
|
export async function retrieve({ store, config: input, text, semantic = false, embedder, topK = 8, tokenBudget = 6000, generationId, resultPolicy: requestedResultPolicy }) {
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { readCloudflareDeploymentContract } from '../cloudflare/runtime-status.js';
|
|
4
|
+
import { getRepositoryId, portableRepositoryIdFromGit, tryReadProjectConfig } from '../lib/project-config.js';
|
|
5
|
+
import { resolveProviderCredential } from '../lib/provider-credentials.js';
|
|
6
|
+
import { tryResolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
|
|
7
|
+
|
|
8
|
+
export const PROJECT_CONTEXT_SCHEMA = 'agentsam.project-context.v1';
|
|
9
|
+
const clean = value => value == null ? '' : String(value).trim();
|
|
10
|
+
const localIndexPath = root => path.join(root, '.agentsam', 'knowledge', 'index.sqlite');
|
|
11
|
+
function readJson(filename) { try { return JSON.parse(fs.readFileSync(filename, 'utf8')); } catch { return null; } }
|
|
12
|
+
function executionState({ observed = false, selected = false, local = false, remote = false, conflicting = false, source = null, reason = null } = {}) {
|
|
13
|
+
return { observed: Boolean(observed), explicitly_selected: Boolean(selected), locally_executable: Boolean(local), remotely_executable: Boolean(remote), missing: !observed, conflicting: Boolean(conflicting), source: source || null, reason: reason || null };
|
|
14
|
+
}
|
|
15
|
+
function cloudflareCredentialState(env) {
|
|
16
|
+
try {
|
|
17
|
+
const credential = resolveProviderCredential('cloudflare', { env });
|
|
18
|
+
const configured = Boolean(credential?.configured);
|
|
19
|
+
const accountResolved = Boolean(clean(credential?.account_id));
|
|
20
|
+
return { configured, account_resolved: accountResolved, executable: configured && accountResolved, source: credential?.source || null, error: credential?.error || (!configured ? 'cloudflare_authorization_required' : !accountResolved ? 'cloudflare_account_id_required' : null) };
|
|
21
|
+
} catch (error) {
|
|
22
|
+
return { configured: false, account_resolved: false, executable: false, source: null, error: error?.message || String(error) };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function policyConflict(policy, vectorize) {
|
|
26
|
+
if (policy?.lane?.backend !== 'cloudflare_vectorize') return [];
|
|
27
|
+
const binding = clean(policy.lane.binding), index = clean(policy.lane.index);
|
|
28
|
+
if (vectorize.some(row => row.binding === binding && row.index === index)) return [];
|
|
29
|
+
return [{ kind: 'knowledge_deployment_drift', backend: 'cloudflare_vectorize', policy: { binding: binding || null, index: index || null }, observed: vectorize.map(row => ({ binding: row.binding, index: row.index })), detail: 'Knowledge policy selects a Vectorize binding/index that is not declared by the active Wrangler deployment contract.' }];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function discoverProjectContext(root = process.cwd(), options = {}) {
|
|
33
|
+
const resolvedRoot = fs.realpathSync(path.resolve(root));
|
|
34
|
+
const env = options.env || process.env;
|
|
35
|
+
const policy = options.knowledgeConfig || null;
|
|
36
|
+
const projectConfig = options.projectConfig || tryReadProjectConfig(resolvedRoot);
|
|
37
|
+
const git = tryResolveGitContext({ cwd: resolvedRoot });
|
|
38
|
+
const repositoryId = getRepositoryId(projectConfig) || portableRepositoryIdFromGit(resolvedRoot) || `local:${path.basename(resolvedRoot)}`;
|
|
39
|
+
const hostInstallPath = path.join(resolvedRoot, '.agentsam', 'app.json');
|
|
40
|
+
const hostInstall = fs.existsSync(hostInstallPath) ? readJson(hostInstallPath) : null;
|
|
41
|
+
const productManifestPath = path.join(resolvedRoot, 'agentsam.app.json');
|
|
42
|
+
const productManifest = fs.existsSync(productManifestPath) ? readJson(productManifestPath) : null;
|
|
43
|
+
let contract = null, contractError = null;
|
|
44
|
+
try { contract = readCloudflareDeploymentContract(resolvedRoot, projectConfig || {}); } catch (error) { contractError = error?.message || String(error); }
|
|
45
|
+
const bindings = contract?.bindings || [];
|
|
46
|
+
const ai = bindings.find(row => row.type === 'ai') || null;
|
|
47
|
+
const vectorize = bindings.filter(row => row.type === 'vectorize').map(row => ({ binding: row.name, index: row.index_name || null, source: row.source || 'wrangler_config' }));
|
|
48
|
+
const d1 = bindings.filter(row => row.type === 'd1');
|
|
49
|
+
const r2 = bindings.filter(row => row.type === 'r2_bucket');
|
|
50
|
+
const credential = cloudflareCredentialState(env);
|
|
51
|
+
const remoteConfigured = Boolean(contract?.configured);
|
|
52
|
+
const conflicts = policyConflict(policy, vectorize);
|
|
53
|
+
const indexPath = localIndexPath(resolvedRoot);
|
|
54
|
+
const localIndex = { exists: fs.existsSync(indexPath), path: path.relative(resolvedRoot, indexPath) };
|
|
55
|
+
const policyBinding = clean(policy?.lane?.binding), policyIndex = clean(policy?.lane?.index);
|
|
56
|
+
const vectorizeResources = vectorize.map(row => {
|
|
57
|
+
const selected = policy?.lane?.backend === 'cloudflare_vectorize' && row.binding === policyBinding && row.index === policyIndex;
|
|
58
|
+
return {
|
|
59
|
+
...row,
|
|
60
|
+
configured: Boolean(row.binding && row.index),
|
|
61
|
+
...executionState({
|
|
62
|
+
observed: Boolean(row.binding && row.index), selected,
|
|
63
|
+
local: Boolean(row.binding && row.index && credential.executable),
|
|
64
|
+
remote: Boolean(row.binding && row.index && remoteConfigured),
|
|
65
|
+
conflicting: conflicts.length > 0 && !selected,
|
|
66
|
+
source: row.source,
|
|
67
|
+
reason: credential.executable ? null : 'Local CLI/Desktop Vectorize execution requires the current user Cloudflare authorization and account id.',
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
const workersAi = ai ? {
|
|
72
|
+
binding: ai.name, configured: true, credential_state: credential,
|
|
73
|
+
...executionState({ observed: true, selected: policy?.embedding?.provider === 'workers-ai', local: false, remote: remoteConfigured, source: ai.source || 'wrangler_config', reason: 'Workers AI binding is executable in the configured Worker runtime; a local Node process does not possess env.<AI_BINDING>.' }),
|
|
74
|
+
} : {
|
|
75
|
+
binding: null, configured: false, credential_state: credential,
|
|
76
|
+
...executionState({ observed: false, source: contract?.config || null, reason: 'No Workers AI binding declared.' }),
|
|
77
|
+
};
|
|
78
|
+
const mapBoundResource = row => ({
|
|
79
|
+
binding: row.name,
|
|
80
|
+
name: row.database_name || row.bucket_name || null,
|
|
81
|
+
id: row.database_id || null,
|
|
82
|
+
...executionState({ observed: true, local: false, remote: remoteConfigured, source: row.source || 'wrangler_config', reason: 'This receipt describes runtime binding execution; local provider API execution is a separate authorized transport.' }),
|
|
83
|
+
});
|
|
84
|
+
const lanes = [];
|
|
85
|
+
if (localIndex.exists) lanes.push({ id: 'local-index', backend: 'local_exact', source: 'local_index', configured: true, locally_executable: true, remotely_executable: false });
|
|
86
|
+
for (const row of vectorizeResources) lanes.push({ id: `cloudflare-vectorize:${row.binding}`, backend: 'cloudflare_vectorize', binding: row.binding, index: row.index, source: row.source, configured: row.configured, locally_executable: row.locally_executable, remotely_executable: row.remotely_executable, explicitly_selected: row.explicitly_selected, conflicting: row.conflicting });
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
schema: PROJECT_CONTEXT_SCHEMA,
|
|
90
|
+
version: 1,
|
|
91
|
+
repository: { root: resolvedRoot, identity: repositoryId, branch: git?.branch || null, revision: git?.revisionSha || null, dirty: git?.dirty ?? null, source: git ? 'git' : projectConfig ? '.agentsam/config.json' : 'filesystem' },
|
|
92
|
+
project: {
|
|
93
|
+
config_present: Boolean(projectConfig), config_source: projectConfig ? '.agentsam/config.json' : null,
|
|
94
|
+
product_manifest: productManifest ? { id: clean(productManifest.id) || null, source: 'agentsam.app.json' } : null,
|
|
95
|
+
host_install: hostInstall ? { app_id: clean(hostInstall.app_id || hostInstall.id) || null, name: clean(hostInstall.name) || null, role: clean(hostInstall.role) || null, mounts: hostInstall.mounts || null, schema: clean(hostInstall.schema) || null, source: '.agentsam/app.json' } : null,
|
|
96
|
+
},
|
|
97
|
+
deployment: { configured: remoteConfigured, worker_name: contract?.worker_name || null, config: contract?.config || null, error: contractError },
|
|
98
|
+
knowledge: {
|
|
99
|
+
policy_configured: Boolean(policy), policy_source: policy ? '.agentsam/knowledge.json' : null,
|
|
100
|
+
selected_backend: policy?.lane?.backend || null,
|
|
101
|
+
suggested_backend: !policy && vectorizeResources.length === 1 ? 'cloudflare_vectorize' : (!policy ? 'local_exact' : null),
|
|
102
|
+
local_index: { ...localIndex, ...executionState({ observed: localIndex.exists, selected: policy?.lane?.backend === 'local_exact', local: localIndex.exists, remote: false, source: localIndex.exists ? localIndex.path : null, reason: localIndex.exists ? null : 'No local knowledge SQLite index exists.' }) },
|
|
103
|
+
},
|
|
104
|
+
authorization: { cloudflare: credential },
|
|
105
|
+
resources: {
|
|
106
|
+
workers_ai: workersAi,
|
|
107
|
+
vectorize: vectorizeResources,
|
|
108
|
+
d1: d1.map(mapBoundResource),
|
|
109
|
+
r2: r2.map(mapBoundResource),
|
|
110
|
+
},
|
|
111
|
+
conflicts,
|
|
112
|
+
local_index: localIndex,
|
|
113
|
+
cloudflare: {
|
|
114
|
+
configured: remoteConfigured,
|
|
115
|
+
worker_name: contract?.worker_name || null,
|
|
116
|
+
config: contract?.config || null,
|
|
117
|
+
ai_binding: ai?.name || null,
|
|
118
|
+
vectorize: vectorizeResources.map(row => ({ binding: row.binding, index: row.index, source: row.source })),
|
|
119
|
+
error: contractError,
|
|
120
|
+
},
|
|
121
|
+
lanes,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function discoverKnowledgeRuntime(root = process.cwd(), options = {}) {
|
|
126
|
+
return discoverProjectContext(root, options);
|
|
127
|
+
}
|
package/src/knowledge/source.js
CHANGED
|
@@ -7,7 +7,7 @@ import { isKnowledgeSourcePath } from '../../packages/agentsam-repository/src/so
|
|
|
7
7
|
import { fingerprint } from './config.js';
|
|
8
8
|
|
|
9
9
|
export const PARSER = `typescript:${ts.version}:agentsam-1`;
|
|
10
|
-
const OMIT = /(^|\/)(?:\.git|\.agentsam|node_modules|dist|build|coverage|vendor|\.next|\.wrangler|\.venv|__pycache__)(\/|$)|(^|\/)(?:\.env[^/]*|\.dev\.vars[^/]*|package-lock\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|Cargo\.lock|poetry\.lock|uv\.lock|[^/]*\.(?:pem|key|p12|pfx|min\.js|map))$/i;
|
|
10
|
+
const OMIT = /(^|\/)(?:\.git|\.agentsam|node_modules|python_modules|dist|build|target|coverage|vendor|\.next|\.wrangler|\.venv|__pycache__)(\/|$)|(^|\/)(?:\.env[^/]*|\.dev\.vars[^/]*|package-lock\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|Cargo\.lock|poetry\.lock|uv\.lock|[^/]*\.(?:pem|key|p12|pfx|min\.js|bundle\.js|map))$/i;
|
|
11
11
|
const under = (file, scope) => scope === '.' || file === scope || file.startsWith(scope + '/');
|
|
12
12
|
export function inventory(root, scope) {
|
|
13
13
|
let files;
|
|
@@ -5,9 +5,15 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
const SDK_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
6
6
|
const IDENTITY_PKG = path.join(SDK_ROOT, 'packages', 'identity');
|
|
7
7
|
const AUTH_PAGES_DIR = path.join(IDENTITY_PKG, 'src', 'frontend', 'auth-portal', 'pages');
|
|
8
|
-
const
|
|
8
|
+
const PORTABLE_SQL_DIR = path.join(IDENTITY_PKG, 'migrations', 'sqlite');
|
|
9
9
|
const BRANDING_SCRIPT = path.join(IDENTITY_PKG, 'src', 'frontend', 'auth-portal', 'shared', 'company-branding.js');
|
|
10
10
|
|
|
11
|
+
const PORTABLE_SCAFFOLD_FILES = [
|
|
12
|
+
'001_identity_core.sql',
|
|
13
|
+
'002_identity_oauth_client.sql',
|
|
14
|
+
'005_identity_company_native.sql',
|
|
15
|
+
];
|
|
16
|
+
|
|
11
17
|
/**
|
|
12
18
|
* @param {{ projectName: string, brandName?: string, logoUrl?: string, sdkVersion?: string, provider?: string }} config
|
|
13
19
|
* @returns {Record<string, string>}
|
|
@@ -19,7 +25,10 @@ export function buildIdentityAppScaffold(config) {
|
|
|
19
25
|
const sdkVersion = config.sdkVersion || 'alpha';
|
|
20
26
|
const provider = config.provider || 'email';
|
|
21
27
|
|
|
22
|
-
const
|
|
28
|
+
const portableSql = PORTABLE_SCAFFOLD_FILES
|
|
29
|
+
.map((file) => fs.readFileSync(path.join(PORTABLE_SQL_DIR, file), 'utf8'))
|
|
30
|
+
.join('\n\n');
|
|
31
|
+
const migrationSql = `${portableSql}\n${buildCompanySeedSql({ brandName, logoUrl })}\n`;
|
|
23
32
|
const loginHtml = injectBrandingScript(applyBrandTokens(fs.readFileSync(path.join(AUTH_PAGES_DIR, 'login.html'), 'utf8'), {
|
|
24
33
|
brandName,
|
|
25
34
|
logoUrl,
|
|
@@ -43,8 +52,8 @@ export function buildIdentityAppScaffold(config) {
|
|
|
43
52
|
scripts: {
|
|
44
53
|
dev: 'wrangler dev',
|
|
45
54
|
deploy: 'wrangler deploy',
|
|
46
|
-
'db:migrate:local': `wrangler d1 execute ${projectName} --local --file=migrations/
|
|
47
|
-
'db:migrate': `wrangler d1 execute ${projectName} --remote --file=migrations/
|
|
55
|
+
'db:migrate:local': `wrangler d1 execute ${projectName} --local --file=migrations/0001_identity_portable.sql`,
|
|
56
|
+
'db:migrate': `wrangler d1 execute ${projectName} --remote --file=migrations/0001_identity_portable.sql`,
|
|
48
57
|
preview: 'npx agentsam identity preview --open',
|
|
49
58
|
},
|
|
50
59
|
dependencies: {
|
|
@@ -61,6 +70,9 @@ export function buildIdentityAppScaffold(config) {
|
|
|
61
70
|
main = "backend/src/index.js"
|
|
62
71
|
compatibility_date = "2024-06-01"
|
|
63
72
|
|
|
73
|
+
[vars]
|
|
74
|
+
IDENTITY_ADAPTER_PROFILE = "portable"
|
|
75
|
+
|
|
64
76
|
[assets]
|
|
65
77
|
directory = "app/frontend"
|
|
66
78
|
binding = "ASSETS"
|
|
@@ -76,7 +88,7 @@ migrations_dir = "migrations"
|
|
|
76
88
|
files['.env.example'] = `# Minted at install/build — secrets via wrangler secret put (never commit)
|
|
77
89
|
# IAM_CLIENT_ID= # plaintext var (public by OAuth design)
|
|
78
90
|
# IAM_CLIENT_SECRET= # wrangler secret put only
|
|
79
|
-
# IAM_ORIGIN=
|
|
91
|
+
# IAM_ORIGIN=
|
|
80
92
|
|
|
81
93
|
# Web browser OAuth (BYOK) — takes /api/oauth/{google|github}/start when set
|
|
82
94
|
# GOOGLE_CLIENT_ID=
|
|
@@ -103,11 +115,12 @@ migrations_dir = "migrations"
|
|
|
103
115
|
|
|
104
116
|
files['README.md'] = `# ${brandName} — identity app
|
|
105
117
|
|
|
106
|
-
Boring scaffold: **app/frontend** (auth UI) + **backend** (Worker API) + **migrations** (D1).
|
|
118
|
+
Boring scaffold: **app/frontend** (auth UI) + **backend** (Worker API) + **migrations** (portable \`identity_*\` D1).
|
|
107
119
|
|
|
108
120
|
Provider template: \`${provider}\` (see \`agentsam identity plan --provider ${provider}\`).
|
|
109
121
|
|
|
110
|
-
**
|
|
122
|
+
**Schema:** portable \`agentsam.identity\` pack (\`identity_users\`, \`identity_sessions\`, \`identity_companies\`, …).
|
|
123
|
+
Not the hosted IAM \`accounts\` / \`auth_users\` / \`company\` shape.
|
|
111
124
|
|
|
112
125
|
## Quick start
|
|
113
126
|
|
|
@@ -135,13 +148,13 @@ npm run dev
|
|
|
135
148
|
\`\`\`
|
|
136
149
|
app/frontend/ Auth portal HTML + dashboard stub
|
|
137
150
|
backend/src/ Cloudflare Worker (identity routes)
|
|
138
|
-
migrations/
|
|
151
|
+
migrations/ Portable identity_* schema (+ default identity_companies row)
|
|
139
152
|
|
|
140
153
|
Branding: \`GET /api/company\` (public). Update with \`PATCH /api/company\` when signed in.
|
|
141
154
|
\`\`\`
|
|
142
155
|
`;
|
|
143
156
|
|
|
144
|
-
files['migrations/
|
|
157
|
+
files['migrations/0001_identity_portable.sql'] = migrationSql;
|
|
145
158
|
|
|
146
159
|
files['app/frontend/auth/login.html'] = loginHtml;
|
|
147
160
|
files['app/frontend/auth/signup.html'] = signupHtml;
|
|
@@ -190,10 +203,31 @@ Branding: \`GET /api/company\` (public). Update with \`PATCH /api/company\` when
|
|
|
190
203
|
`;
|
|
191
204
|
|
|
192
205
|
files['backend/src/index.js'] = `import { handleIdentityWorkerRequest } from '@inneranimalmedia/agentsam-sdk/identity/server/worker-router';
|
|
206
|
+
import { IDENTITY_ROUTE_IDS } from '@inneranimalmedia/agentsam-sdk/identity';
|
|
207
|
+
import { createRouteRegistry, defineRouteProjection } from '@inneranimalmedia/agentsam-sdk/identity';
|
|
208
|
+
|
|
209
|
+
const app = { id: '${projectName}' };
|
|
210
|
+
const routeRegistry = createRouteRegistry([
|
|
211
|
+
defineRouteProjection({
|
|
212
|
+
appId: app.id,
|
|
213
|
+
routes: {
|
|
214
|
+
[IDENTITY_ROUTE_IDS.LOGIN]: '/auth/login',
|
|
215
|
+
[IDENTITY_ROUTE_IDS.SIGNUP]: '/auth/signup',
|
|
216
|
+
[IDENTITY_ROUTE_IDS.RESET]: '/auth/reset',
|
|
217
|
+
[IDENTITY_ROUTE_IDS.RECOVERY]: '/auth/reset',
|
|
218
|
+
[IDENTITY_ROUTE_IDS.APP_AUTHENTICATED]: '/dashboard/',
|
|
219
|
+
[IDENTITY_ROUTE_IDS.OAUTH_CALLBACK]: '/api/oauth/:provider/callback',
|
|
220
|
+
},
|
|
221
|
+
}),
|
|
222
|
+
]);
|
|
193
223
|
|
|
194
224
|
export default {
|
|
195
225
|
async fetch(request, env, ctx) {
|
|
196
|
-
return handleIdentityWorkerRequest(request, env
|
|
226
|
+
return handleIdentityWorkerRequest(request, env, {
|
|
227
|
+
app,
|
|
228
|
+
routeRegistry,
|
|
229
|
+
identityProfile: 'portable',
|
|
230
|
+
});
|
|
197
231
|
},
|
|
198
232
|
};
|
|
199
233
|
`;
|
|
@@ -202,10 +236,15 @@ export default {
|
|
|
202
236
|
}
|
|
203
237
|
|
|
204
238
|
function applyBrandTokens(html, { brandName, logoUrl }) {
|
|
239
|
+
// Package HTML ships neutral portable defaults; scaffold stamps the app brand.
|
|
205
240
|
return html
|
|
206
241
|
.replace(/Inner Animal Media/g, brandName)
|
|
207
242
|
.replace(/AgentSam/g, brandName)
|
|
243
|
+
.replace(/<h1 data-company-tagline>Welcome<\/h1>/g, `<h1 data-company-tagline>${brandName}</h1>`)
|
|
244
|
+
.replace(/<span data-company-name>App<\/span>/g, `<span data-company-name>${brandName}</span>`)
|
|
245
|
+
.replace(/alt="Sign in"/g, `alt="${brandName}"`)
|
|
208
246
|
.replace(/src="\/shared\/agentsam-mark\.svg"/g, `src="${logoUrl}"`)
|
|
247
|
+
.replace(/src="\/shared\/app-icon\.png"/g, `src="${logoUrl}"`)
|
|
209
248
|
.replace(/src="\/brand\/[^"]*"/g, `src="${logoUrl}"`)
|
|
210
249
|
.replace(/href="\/brand\/[^"]*"/g, `href="${logoUrl}"`);
|
|
211
250
|
}
|
|
@@ -221,9 +260,9 @@ function sqlLiteral(value) {
|
|
|
221
260
|
|
|
222
261
|
function buildCompanySeedSql({ brandName, logoUrl }) {
|
|
223
262
|
const ts = Math.floor(Date.now() / 1000);
|
|
224
|
-
return `-- Default company row (branding SSOT for portal + dashboard)
|
|
225
|
-
INSERT OR IGNORE INTO
|
|
226
|
-
id, slug, name, logo_url, auth_bg_color, primary_color, created_at, updated_at
|
|
263
|
+
return `-- Default company row (branding SSOT for portal + dashboard) — portable identity_companies
|
|
264
|
+
INSERT OR IGNORE INTO identity_companies (
|
|
265
|
+
id, slug, name, logo_url, auth_bg_color, primary_color, support_email, created_at, updated_at
|
|
227
266
|
) VALUES (
|
|
228
267
|
'co_default',
|
|
229
268
|
'default',
|
|
@@ -231,6 +270,7 @@ INSERT OR IGNORE INTO company (
|
|
|
231
270
|
${sqlLiteral(logoUrl)},
|
|
232
271
|
'#050508',
|
|
233
272
|
'#007AFF',
|
|
273
|
+
${sqlLiteral('support@example.test')},
|
|
234
274
|
${ts},
|
|
235
275
|
${ts}
|
|
236
276
|
);`;
|
package/src/lib/setup/recipes.js
CHANGED
|
@@ -39,7 +39,7 @@ export const imageRasterTransformCapability = {
|
|
|
39
39
|
provider: 'npm',
|
|
40
40
|
packages: ['sharp'],
|
|
41
41
|
notes: [
|
|
42
|
-
'Sharp is the portable default (declared dependency of @inneranimalmedia/agentsam-
|
|
42
|
+
'Sharp is the portable default (declared dependency of @inneranimalmedia/agentsam-brand).',
|
|
43
43
|
'Optional enrichment: Homebrew imagemagick for ICNS / exotic formats.',
|
|
44
44
|
'Brand packs: agentsam brand promote → pack → preview → optional publish',
|
|
45
45
|
' agentsam brand pack --brand acme --asset app-icon --source ./master.png --preset app-icon --out ./acme.zip',
|
|
@@ -32,7 +32,7 @@ export const SLASH_COMMANDS = [
|
|
|
32
32
|
{ cmd: '/agent', description: 'Send a goal to the configured local Agent Sam runtime', lane: 'agent' },
|
|
33
33
|
{ cmd: '/goap', description: 'Inspect and manage GOAP blackboard: /goap [status|goal|why|plan|list|new|switch|close]', lane: 'agent' },
|
|
34
34
|
{ cmd: '/brand', description: 'Brand intelligence: /brand [scan|resolve|plan|inspect]', lane: 'product' },
|
|
35
|
-
{ cmd: '/plan', description: '
|
|
35
|
+
{ cmd: '/plan', description: 'Durable local plans: /plan [new|list|show|add|start|done|block|complete|brand]', lane: 'product' },
|
|
36
36
|
{ cmd: '/next', description: 'Suggested next actions from session progression', lane: 'product' },
|
|
37
37
|
{ cmd: '/logs', description: 'Show local Agent Sam execution events', lane: 'observability' },
|
|
38
38
|
{ cmd: '/deploy', description: 'Add a cloud adapter and deploy intentionally', lane: 'deploy' },
|
|
@@ -43,14 +43,36 @@ export function createRuntimeRunId() {
|
|
|
43
43
|
export async function startRuntimeRun(value = {}) {
|
|
44
44
|
const id = clean(value.id) || createRuntimeRunId();
|
|
45
45
|
await withStore(value.projectRoot || value.cwd, async (db) => {
|
|
46
|
+
const activeStep = (!clean(value.plan_id) || !clean(value.todo_id))
|
|
47
|
+
? await db.prepare(`
|
|
48
|
+
SELECT t.id AS todo_id, t.plan_id
|
|
49
|
+
FROM agentsam_todo t
|
|
50
|
+
JOIN agentsam_plans p ON p.id = t.plan_id
|
|
51
|
+
WHERE t.status = 'running' AND p.status = 'active'
|
|
52
|
+
ORDER BY t.updated_at_unix DESC, t.created_at_unix DESC
|
|
53
|
+
LIMIT 1
|
|
54
|
+
`).first()
|
|
55
|
+
: null;
|
|
56
|
+
const activePlan = !clean(value.plan_id) && !activeStep?.plan_id
|
|
57
|
+
? await db.prepare(`
|
|
58
|
+
SELECT id AS plan_id FROM agentsam_plans
|
|
59
|
+
WHERE status = 'active'
|
|
60
|
+
ORDER BY updated_at_unix DESC, created_at_unix DESC
|
|
61
|
+
LIMIT 1
|
|
62
|
+
`).first()
|
|
63
|
+
: null;
|
|
64
|
+
const planId = clean(value.plan_id) || clean(activeStep?.plan_id) || clean(activePlan?.plan_id) || null;
|
|
65
|
+
const todoId = clean(value.todo_id) || clean(activeStep?.todo_id) || null;
|
|
46
66
|
await db.prepare(`
|
|
47
67
|
INSERT INTO agentsam_agent_run (
|
|
48
|
-
id, account_id, source_client, surface, mode, model_key,
|
|
68
|
+
id, account_id, plan_id, todo_id, source_client, surface, mode, model_key,
|
|
49
69
|
reasoning_effort, requested_service_tier, status, started_at_unix, updated_at_unix
|
|
50
|
-
) VALUES (?, ?, 'agentsam-cli', 'cli', ?, ?, ?, ?, 'running', unixepoch(), unixepoch())
|
|
70
|
+
) VALUES (?, ?, ?, ?, 'agentsam-cli', 'cli', ?, ?, ?, ?, 'running', unixepoch(), unixepoch())
|
|
51
71
|
`).bind(
|
|
52
72
|
id,
|
|
53
73
|
clean(value.account_id) || null,
|
|
74
|
+
planId,
|
|
75
|
+
todoId,
|
|
54
76
|
clean(value.mode) || 'agent',
|
|
55
77
|
clean(value.model_key) || null,
|
|
56
78
|
clean(value.reasoning_effort) || null,
|