@inneranimalmedia/agentsam-sdk 2.6.1 → 2.6.3
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 +45 -1
- package/README.md +80 -0
- package/apps/README.md +34 -0
- package/apps/cad-creator/README.md +728 -0
- package/apps/cad-creator/shared/cad/package.json +19 -0
- package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
- package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
- package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
- package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
- package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
- package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
- package/apps/cad-creator/shared/cad/src/index.ts +4 -0
- package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
- package/apps/cad-creator/shared/cad/src/types.ts +507 -0
- package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +25 -27
- package/docs/AUTORAG.md +58 -0
- package/docs/BRAND_INTELLIGENCE.md +30 -0
- package/docs/CLI_SHELL.md +4 -2
- package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
- package/docs/MERKLE.md +4 -0
- package/docs/PROJECT_CONFIG.md +3 -0
- package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
- package/docs/SDK_WORKER.md +4 -3
- package/docs/THEME_REFINERY.md +120 -0
- package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
- package/docs/architecture/STORAGE.md +87 -0
- package/docs/cad-project-tools.md +69 -0
- package/docs/cms-scaffolding-pattern-reference.md +73 -0
- package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
- package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
- package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
- package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
- package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
- package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
- package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
- package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
- package/docs/plugins.md +43 -0
- package/docs/tools/README.md +57 -0
- package/docs/tools/agent-and-orchestration.md +49 -0
- package/docs/tools/browser-and-research.md +46 -0
- package/docs/tools/cloudflare-platform.md +32 -0
- package/docs/tools/cms.md +25 -0
- package/docs/tools/communications.md +41 -0
- package/docs/tools/database-and-storage.md +62 -0
- package/docs/tools/design-and-media.md +64 -0
- package/docs/tools/filesystem-and-code.md +55 -0
- package/docs/tools/github.md +56 -0
- package/docs/tools/integrations-and-misc.md +16 -0
- package/docs/tools/memory.md +21 -0
- package/docs/tools/terminal-and-execution.md +29 -0
- package/docs/tools/tickets-and-platform.md +30 -0
- package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
- package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
- package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
- package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
- package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
- package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
- package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
- package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
- package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
- package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
- package/migrations/runtime/0001_cli_runtime.sql +67 -0
- package/migrations/runtime/0002_project_sessions.sql +15 -0
- package/migrations/runtime/0003_provider_continuations.sql +8 -0
- package/package.json +92 -12
- package/packages/agentsam-brand/README.md +21 -0
- package/packages/agentsam-brand/package.json +22 -0
- package/packages/agentsam-brand/src/contract.js +59 -0
- package/packages/agentsam-brand/src/extract.js +126 -0
- package/packages/agentsam-brand/src/goap-actions.js +73 -0
- package/packages/agentsam-brand/src/index.js +48 -0
- package/packages/agentsam-brand/src/plan.js +115 -0
- package/packages/agentsam-brand/src/resolve.js +139 -0
- package/packages/agentsam-brand/src/scan.js +250 -0
- package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
- package/packages/agentsam-contracts/README.md +23 -0
- package/packages/agentsam-contracts/package.json +32 -0
- package/packages/agentsam-contracts/src/adapter.ts +25 -0
- package/packages/agentsam-contracts/src/agent.ts +35 -0
- package/packages/agentsam-contracts/src/artifacts.ts +33 -0
- package/packages/agentsam-contracts/src/authority.ts +29 -0
- package/packages/agentsam-contracts/src/context.ts +16 -0
- package/packages/agentsam-contracts/src/errors.ts +46 -0
- package/packages/agentsam-contracts/src/events.ts +47 -0
- package/packages/agentsam-contracts/src/execution.ts +50 -0
- package/packages/agentsam-contracts/src/hooks.ts +40 -0
- package/packages/agentsam-contracts/src/identity.ts +16 -0
- package/packages/agentsam-contracts/src/index.ts +14 -0
- package/packages/agentsam-contracts/src/models.ts +9 -0
- package/packages/agentsam-contracts/src/providers.ts +33 -0
- package/packages/agentsam-contracts/src/repository.ts +64 -0
- package/packages/agentsam-contracts/src/tools.ts +98 -0
- package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
- package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
- package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
- package/packages/agentsam-contracts/tsconfig.json +12 -0
- package/packages/agentsam-errors/package.json +17 -0
- package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
- package/packages/agentsam-errors/src/adapters/cad.js +109 -0
- package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
- package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
- package/packages/agentsam-errors/src/adapters/device.js +38 -0
- package/packages/agentsam-errors/src/adapters/docker.js +28 -0
- package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
- package/packages/agentsam-errors/src/adapters/github.js +22 -0
- package/packages/agentsam-errors/src/adapters/google.js +17 -0
- package/packages/agentsam-errors/src/adapters/index.js +55 -0
- package/packages/agentsam-errors/src/adapters/internal.js +40 -0
- package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
- package/packages/agentsam-errors/src/adapters/openai.js +17 -0
- package/packages/agentsam-errors/src/adapters/process.js +35 -0
- package/packages/agentsam-errors/src/adapters/provider.js +114 -0
- package/packages/agentsam-errors/src/envelope.js +186 -0
- package/packages/agentsam-errors/src/error.js +24 -0
- package/packages/agentsam-errors/src/fingerprint.js +35 -0
- package/packages/agentsam-errors/src/index.js +10 -0
- package/packages/agentsam-errors/src/normalize.js +30 -0
- package/packages/agentsam-errors/src/redaction.js +52 -0
- package/packages/agentsam-errors/src/render.js +16 -0
- package/packages/agentsam-errors/src/retry.js +10 -0
- package/packages/agentsam-errors/src/transport.js +52 -0
- package/packages/agentsam-errors/src/vocabulary.js +320 -0
- package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
- package/packages/agentsam-errors/test/providers.test.mjs +99 -0
- package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
- package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
- package/packages/agentsam-errors/test/transport.test.mjs +46 -0
- package/packages/agentsam-knowledge/package.json +15 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
- package/packages/agentsam-knowledge/src/backends/index.js +26 -0
- package/packages/agentsam-knowledge/src/index.js +3 -0
- package/packages/agentsam-knowledge/src/providers/index.js +95 -0
- package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
- package/packages/agentsam-nav/README.md +40 -0
- package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
- package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
- package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
- package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
- package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
- package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
- package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
- package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
- package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
- package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
- package/packages/agentsam-nav/dist/browser.d.ts +11 -0
- package/packages/agentsam-nav/dist/browser.global.js +132 -0
- package/packages/agentsam-nav/dist/browser.js +613 -0
- package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
- package/packages/agentsam-nav/dist/index.d.ts +11 -0
- package/packages/agentsam-nav/dist/index.js +614 -0
- package/packages/agentsam-nav/dist/legacy.css +83 -0
- package/packages/agentsam-nav/dist/shell.css +113 -0
- package/packages/agentsam-nav/dist/theme.css +113 -0
- package/packages/agentsam-nav/dist/utils.d.ts +1 -0
- package/packages/agentsam-nav/package.json +43 -0
- package/packages/agentsam-queue-control/README.md +107 -0
- package/packages/agentsam-queue-control/package.json +31 -0
- package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
- package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
- package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
- package/packages/agentsam-queue-control/src/contracts.js +130 -0
- package/packages/agentsam-queue-control/src/control-plane.js +141 -0
- package/packages/agentsam-queue-control/src/dispatch.js +43 -0
- package/packages/agentsam-queue-control/src/index.js +7 -0
- package/packages/agentsam-queue-control/src/policy.js +88 -0
- package/packages/agentsam-queue-control/src/topology.js +66 -0
- package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
- package/packages/agentsam-repository/src/goap.js +718 -0
- package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
- package/packages/agentsam-repository/src/index.js +5 -0
- package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
- package/packages/agentsam-repository/src/tickets.js +184 -0
- package/packages/agentsam-repository/src/work-tracking.js +199 -0
- package/packages/agentsam-repository/src/workspace-state.js +176 -0
- package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
- package/packages/connectors/cloudflare/src/index.js +297 -15
- package/packages/connectors/cloudflare/src/owner.js +43 -40
- package/packages/connectors/cloudflare/src/routes.js +167 -26
- package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
- package/packages/heuristic-theme/README.md +11 -0
- package/packages/heuristic-theme/package.json +25 -0
- package/packages/heuristic-theme/src/index.js +2 -0
- package/packages/heuristic-theme/src/registry.js +36 -0
- package/packages/heuristic-theme/src/theme.js +41 -0
- package/packages/heuristic-theme/test/theme.test.mjs +26 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
- package/packages/identity/package.json +4 -3
- package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
- package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
- package/packages/identity/src/contracts/auth-config.js +23 -40
- package/packages/identity/src/contracts/provider.js +3 -2
- package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
- package/packages/identity/src/index.js +2 -0
- package/packages/identity/src/oauth/credentials.js +13 -0
- package/packages/identity/src/oauth/iam-platform.js +5 -5
- package/packages/identity/src/providers/cloudflare/index.js +19 -0
- package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
- package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
- package/packages/identity/src/providers/cloudflare/profile.js +28 -0
- package/packages/identity/src/providers/index.js +18 -2
- package/packages/identity/src/server/identity-service.js +13 -3
- package/packages/identity/src/server/worker-router.js +63 -8
- package/packages/identity/tests/auth-config.test.mjs +14 -23
- package/packages/identity/tests/identity-service.test.mjs +15 -0
- package/packages/providers/completeful/README.md +38 -0
- package/packages/providers/completeful/package.json +29 -0
- package/packages/providers/completeful/src/client.js +162 -0
- package/packages/providers/completeful/src/events.js +49 -0
- package/packages/providers/completeful/src/index.js +22 -0
- package/packages/providers/completeful/src/tools.js +579 -0
- package/packages/providers/completeful/src/webhooks.js +55 -0
- package/packages/providers/completeful/test/provider.test.mjs +196 -0
- package/packages/theme-church-site/README.md +10 -0
- package/packages/theme-church-site/package.json +30 -0
- package/packages/theme-church-site/src/harvest.json +14 -0
- package/packages/theme-church-site/src/index.js +84 -0
- package/packages/theme-church-site/test/theme.test.mjs +19 -0
- package/packages/theme-companions-site/README.md +10 -0
- package/packages/theme-companions-site/package.json +30 -0
- package/packages/theme-companions-site/src/harvest.json +12 -0
- package/packages/theme-companions-site/src/index.js +82 -0
- package/packages/theme-companions-site/test/theme.test.mjs +19 -0
- package/packages/theme-floors-site/README.md +10 -0
- package/packages/theme-floors-site/package.json +30 -0
- package/packages/theme-floors-site/src/harvest.json +14 -0
- package/packages/theme-floors-site/src/index.js +82 -0
- package/packages/theme-floors-site/test/theme.test.mjs +19 -0
- package/packages/theme-fuelnfree-site/README.md +10 -0
- package/packages/theme-fuelnfree-site/package.json +30 -0
- package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
- package/packages/theme-fuelnfree-site/src/index.js +81 -0
- package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
- package/packages/theme-handyman-site/README.md +10 -0
- package/packages/theme-handyman-site/package.json +30 -0
- package/packages/theme-handyman-site/src/harvest.json +10 -0
- package/packages/theme-handyman-site/src/index.js +83 -0
- package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
- package/packages/theme-insurance-site/README.md +10 -0
- package/packages/theme-insurance-site/package.json +30 -0
- package/packages/theme-insurance-site/src/harvest.json +10 -0
- package/packages/theme-insurance-site/src/index.js +83 -0
- package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
- package/packages/theme-shinshu-site/README.md +10 -0
- package/packages/theme-shinshu-site/package.json +30 -0
- package/packages/theme-shinshu-site/src/harvest.json +12 -0
- package/packages/theme-shinshu-site/src/index.js +83 -0
- package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
- package/packages/work-graph/README.md +49 -0
- package/packages/work-graph/package.json +19 -0
- package/packages/work-graph/prototype/README.md +32 -0
- package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
- package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
- package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
- package/packages/work-graph/prototype-gnantt.html +655 -0
- package/packages/work-graph/src/adapters/business/projects.js +23 -0
- package/packages/work-graph/src/adapters/engineering/git.js +22 -0
- package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
- package/packages/work-graph/src/index.js +76 -0
- package/packages/work-graph/src/renderers/gantt-model.js +11 -0
- package/packages/work-graph/src/renderers/timeline.js +16 -0
- package/packages/work-graph/test/work-graph.test.mjs +37 -0
- package/protocol/README.md +12 -0
- package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
- package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
- package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
- package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
- package/protocol/capabilities/manifest.json +163 -1
- package/protocol/capabilities/repository-audit-input.schema.json +39 -6
- package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
- package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
- package/protocol/commerce/catalog.v1.json +50 -0
- package/protocol/errors/error-catalog.json +164 -0
- package/protocol/errors/error-envelope.schema.json +544 -0
- package/protocol/features/README.md +57 -0
- package/protocol/features/agentsam.feature.v1.schema.json +290 -0
- package/protocol/features/catalog.json +65 -0
- package/protocol/features/examples/provider-resend.feature.json +17 -0
- package/protocol/go/agentsam-go-runtime.v1.json +17 -0
- package/protocol/knowledge/LIFECYCLE.md +140 -0
- package/protocol/knowledge/README.md +4 -0
- package/protocol/presets/catalog.json +128 -19
- package/protocol/rpc/v1/errors.proto +24 -0
- package/protocol/theme-refinery/d1-reconciliation.md +48 -0
- package/protocol/theme-refinery/product-metadata.schema.json +27 -0
- package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
- package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
- package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
- package/services/cad/server.py +249 -2
- package/src/agent/capability-adapter.js +15 -5
- package/src/agent/index.js +2 -1
- package/src/agent/model-turn.js +51 -0
- package/src/agent/responses-runner.js +304 -38
- package/src/capabilities/index.js +1 -0
- package/src/capabilities/terminal-exec.js +78 -0
- package/src/cli.js +129 -31
- package/src/cloudflare/index.js +6 -0
- package/src/cloudflare/runtime-status.js +393 -0
- package/src/cloudflare/wrangler.js +17 -1
- package/src/commands/account-auth.js +1 -1
- package/src/commands/app.js +106 -0
- package/src/commands/autorag.js +77 -0
- package/src/commands/brand.js +293 -0
- package/src/commands/cad.js +1 -0
- package/src/commands/connections.js +126 -29
- package/src/commands/context-economics.js +8 -0
- package/src/commands/db.js +7 -0
- package/src/commands/deploy.js +2 -2
- package/src/commands/env.js +5 -4
- package/src/commands/eval.js +209 -14
- package/src/commands/go.js +365 -0
- package/src/commands/goap.js +176 -0
- package/src/commands/identity-init.js +27 -3
- package/src/commands/identity-protocol.js +195 -0
- package/src/commands/knowledge.js +64 -5
- package/src/commands/mcp.js +341 -0
- package/src/commands/merkle-persist.js +3 -1
- package/src/commands/merkle.js +18 -3
- package/src/commands/models.js +109 -23
- package/src/commands/plugins.js +175 -0
- package/src/commands/preferences.js +28 -8
- package/src/commands/product.js +53 -10
- package/src/commands/providers.js +389 -0
- package/src/commands/resume.js +9 -5
- package/src/commands/runtime-status.js +154 -0
- package/src/commands/shell.js +469 -54
- package/src/commands/status.js +82 -7
- package/src/commands/tunnel.js +228 -195
- package/src/commands/whoami.js +115 -22
- package/src/context/budget.js +6 -0
- package/src/context/index.js +2 -1
- package/src/context/project-card.js +75 -0
- package/src/errors/contract.js +34 -211
- package/src/errors/diagnostic.js +95 -50
- package/src/errors/index.js +6 -13
- package/src/eval/index.js +6 -0
- package/src/eval/live.js +439 -0
- package/src/features/resolve.js +242 -0
- package/src/go/build.js +108 -0
- package/src/go/cloudflare.js +207 -0
- package/src/go/contract.js +139 -0
- package/src/go/discover.js +96 -0
- package/src/go/index.js +13 -0
- package/src/go/receipts.js +77 -0
- package/src/go/registry.js +223 -0
- package/src/go/verify.js +31 -0
- package/src/index.js +100 -1
- package/src/knowledge/config.js +13 -5
- package/src/knowledge/engine.js +23 -8
- package/src/knowledge/index.js +1 -0
- package/src/knowledge/lane-registry.js +46 -0
- package/src/knowledge/providers/gemini.js +48 -8
- package/src/knowledge/service/client.js +13 -1
- package/src/knowledge/service/grpc-codec.js +156 -53
- package/src/knowledge/service/job-engine.js +133 -11
- package/src/knowledge/service/job-worker.js +34 -5
- package/src/knowledge/service/server.js +10 -1
- package/src/knowledge/store-discovery.js +77 -0
- package/src/lib/account-session.js +100 -25
- package/src/lib/agent-instructions.js +3 -0
- package/src/lib/auth.js +318 -51
- package/src/lib/cad/blender.js +42 -3
- package/src/lib/cad/d1-project-store.js +43 -0
- package/src/lib/cad/discovery.js +616 -0
- package/src/lib/cad/docker-executor.js +352 -0
- package/src/lib/cad/freecad.js +253 -0
- package/src/lib/cad/index.js +40 -0
- package/src/lib/cad/openscad.js +198 -0
- package/src/lib/cad/project-cli.d.ts +2 -0
- package/src/lib/cad/project-cli.js +21 -0
- package/src/lib/cad/project-contract.d.ts +3 -0
- package/src/lib/cad/project-contract.js +1 -0
- package/src/lib/cad/project-recipe.js +30 -0
- package/src/lib/cad/project-runtime.d.ts +2 -0
- package/src/lib/cad/project-runtime.js +53 -0
- package/src/lib/cad/project-store.js +25 -0
- package/src/lib/cad/project-workflows.js +31 -0
- package/src/lib/cad-docker.js +21 -2
- package/src/lib/cli-preferences.js +17 -2
- package/src/lib/core-client.js +97 -33
- package/src/lib/deploy/local-studio.js +6 -5
- package/src/lib/detect-context.js +14 -16
- package/src/lib/dockerize.js +3 -0
- package/src/lib/execution-approvals.js +1 -0
- package/src/lib/identity-scaffold.js +4 -1
- package/src/lib/knowledge-docker.js +9 -1
- package/src/lib/local-sessions.js +124 -34
- package/src/lib/local-status.js +35 -14
- package/src/lib/project-config.js +9 -0
- package/src/lib/provider-credentials.js +233 -55
- package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
- package/src/lib/scaffold/wizards/cms.js +2 -8
- package/src/lib/scaffold/wizards/worker-api.js +2 -8
- package/src/lib/slash-commands.js +10 -2
- package/src/local/migrations.js +109 -1
- package/src/local/runtime-store.js +31 -5
- package/src/local/sqlite.js +36 -1
- package/src/mcp/authority.js +348 -0
- package/src/mcp/client-adapters.js +431 -0
- package/src/mcp/client.js +172 -0
- package/src/mcp/index.js +47 -0
- package/src/mcp/telemetry.js +103 -0
- package/src/models/catalog.js +329 -51
- package/src/models/discovery.js +59 -4
- package/src/models/index.js +2 -0
- package/src/models/inventory-core.js +182 -0
- package/src/models/policy.js +20 -0
- package/src/plugins/cloudflare.js +103 -0
- package/src/plugins/completeful.js +69 -0
- package/src/plugins/contracts.js +86 -0
- package/src/plugins/index.js +11 -0
- package/src/plugins/registry.js +207 -0
- package/src/plugins/resource-scope.js +45 -0
- package/src/plugins/runtime.js +118 -0
- package/src/plugins/vectorize.js +31 -0
- package/src/progression/engine.js +171 -0
- package/src/progression/index.js +1 -0
- package/src/providers/cloudflare-chat.js +1 -1
- package/src/providers/gemini-generate-content.js +2 -1
- package/src/providers/openai-responses.js +45 -16
- package/src/providers/tool-schema.js +85 -0
- package/src/repository/index.js +29 -0
- package/src/rpc/generated/errors_pb.js +961 -1
- package/src/security/local-vault.js +415 -0
- package/src/security/process.js +20 -4
- package/src/status/actions.js +192 -0
- package/src/tools/hydrate.js +5 -1
- package/src/tools/index.js +7 -0
- package/src/tools/redact.js +64 -0
- package/src/tools/registry.js +83 -0
- package/src/tools/runtime.js +257 -0
- package/src/tools/search.js +21 -8
- package/src/ui/ansi.js +117 -3
- package/src/ui/cli/activity.js +76 -7
- package/src/ui/cli/footer.js +110 -9
- package/src/ui/cli/help.js +14 -5
- package/src/ui/wireframes.js +166 -0
- package/test/account-session.test.mjs +76 -11
- package/test/apps-scaffold-contract.test.mjs +58 -0
- package/test/capabilities.test.mjs +1 -1
- package/test/cli/eval-live.test.mjs +219 -0
- package/test/cli/go.test.mjs +71 -0
- package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
- package/test/cli/mcp-client.test.mjs +245 -0
- package/test/cli/runtime-ui.test.mjs +69 -2
- package/test/cli/status-actions.test.mjs +88 -0
- package/test/cli/wireframes-go-registry.test.mjs +54 -0
- package/test/cloudflare-connector.test.mjs +3 -6
- package/test/cloudflare-runtime.test.mjs +8 -1
- package/test/context.test.mjs +15 -0
- package/test/error-diagnostics.test.mjs +9 -0
- package/test/fixtures/cad/courtyard-house.json +208 -0
- package/test/go/cloudflare-probe.test.mjs +53 -0
- package/test/integration/app-command.test.mjs +55 -0
- package/test/integration/cad-discovery.test.mjs +158 -0
- package/test/integration/cad-docker-executor.test.mjs +249 -0
- package/test/integration/cad-execution.test.mjs +184 -0
- package/test/integration/cad-project-app.test.mjs +31 -0
- package/test/integration/cad-project-d1.test.mjs +25 -0
- package/test/integration/cad-project-native.test.mjs +24 -0
- package/test/integration/cad-project-workflow.test.mjs +9 -0
- package/test/integration/cad-project.test.mjs +82 -0
- package/test/integration/cli-help.test.mjs +4 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
- package/test/integration/core-client.integration.test.mjs +55 -0
- package/test/integration/error-runtime-rpc.test.mjs +71 -0
- package/test/integration/features-resolve.test.mjs +128 -0
- package/test/integration/install-script.test.mjs +107 -0
- package/test/integration/inventory-core.test.mjs +53 -0
- package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
- package/test/integration/provider-env-cli.test.mjs +1 -1
- package/test/integration/runtime-migrations.test.mjs +6 -1
- package/test/integration/runtime-status.integration.test.mjs +211 -0
- package/test/integration/scaffold-cloudflare.test.mjs +46 -0
- package/test/integration/storage-architecture.test.mjs +154 -0
- package/test/integration/store-discovery.test.mjs +44 -0
- package/test/integration/terminal-exec.integration.test.mjs +86 -0
- package/test/integration/tool-runtime.test.mjs +124 -0
- package/test/integration/tool-schema.test.mjs +59 -0
- package/test/knowledge-service.test.mjs +4 -0
- package/test/local-sessions.test.mjs +11 -2
- package/test/local-studio-deploy.test.mjs +1 -1
- package/test/model-catalog.test.mjs +28 -1
- package/test/models.test.mjs +159 -5
- package/test/openai-responses.test.mjs +60 -0
- package/test/provider-credentials.test.mjs +15 -5
- package/test/responses-runner.test.mjs +321 -6
- package/test/sdk-worker-contract.test.mjs +5 -1
- package/test/shell.test.mjs +149 -4
- package/test/smoke.mjs +4 -3
- package/test/tools-search.test.mjs +33 -0
- package/test/unit/website-assets-bindings.test.mjs +60 -0
- package/test/whoami-resume.test.mjs +87 -7
- package/examples/gorilla-shell/README.md +0 -15
- package/src/lib/gorilla-template.js +0 -54
- package/src/lib/prompt-byok.js +0 -57
- package/src/lib/save-sdk-token.js +0 -19
- package/templates/gorilla-shell/App.tsx +0 -639
- package/templates/gorilla-shell/README.md +0 -34
- package/templates/gorilla-shell/index.html +0 -15
- package/templates/gorilla-shell/main.jsx +0 -9
- package/templates/gorilla-shell/package.json +0 -19
- package/templates/gorilla-shell/vite.config.js +0 -21
package/src/lib/local-status.js
CHANGED
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
1
|
import path from 'node:path';
|
|
3
2
|
import { tryResolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
|
|
4
3
|
import { inspectLocalSqlite } from '../local/sqlite.js';
|
|
5
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
getCreatedWithVersion,
|
|
6
|
+
getDefaultProfile,
|
|
7
|
+
getDeployTarget,
|
|
8
|
+
getLocalDatabasePath,
|
|
9
|
+
getProjectName,
|
|
10
|
+
getProjectPreset,
|
|
11
|
+
getRepositoryId,
|
|
12
|
+
tryReadProjectConfig,
|
|
13
|
+
} from './project-config.js';
|
|
14
|
+
import { findCliProjectRoot } from './cli-preferences.js';
|
|
6
15
|
|
|
7
16
|
export function findAgentSamProjectRoot(startDir = process.cwd()) {
|
|
8
|
-
|
|
9
|
-
for (let i = 0; i < 16; i += 1) {
|
|
10
|
-
if (fs.existsSync(path.join(dir, '.agentsam', 'config.json'))) return dir;
|
|
11
|
-
const parent = path.dirname(dir);
|
|
12
|
-
if (parent === dir) break;
|
|
13
|
-
dir = parent;
|
|
14
|
-
}
|
|
15
|
-
return path.resolve(startDir);
|
|
17
|
+
return findCliProjectRoot(startDir);
|
|
16
18
|
}
|
|
17
19
|
|
|
18
20
|
async function probe(url) {
|
|
19
21
|
try {
|
|
20
|
-
const response = await fetch(url, { signal: AbortSignal.timeout(
|
|
22
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(1500) });
|
|
21
23
|
return { online: response.ok, status: response.status, url };
|
|
22
24
|
} catch {
|
|
23
25
|
return { online: false, status: null, url };
|
|
24
26
|
}
|
|
25
27
|
}
|
|
26
28
|
|
|
29
|
+
function resolveLiveHealthUrl(config) {
|
|
30
|
+
const fromDeploy = config?.deployment?.cloudflare?.health_url;
|
|
31
|
+
if (fromDeploy != null && String(fromDeploy).trim()) return String(fromDeploy).trim();
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
27
35
|
export async function collectLocalStatus(cwd = process.cwd()) {
|
|
28
36
|
const root = findAgentSamProjectRoot(cwd);
|
|
29
37
|
const config = tryReadProjectConfig(root);
|
|
@@ -36,10 +44,16 @@ export async function collectLocalStatus(cwd = process.cwd()) {
|
|
|
36
44
|
|
|
37
45
|
const devPort = config?.dev_port ?? 8787;
|
|
38
46
|
const ptyPort = config?.pty_port ?? 3099;
|
|
39
|
-
const
|
|
47
|
+
const liveUrl = resolveLiveHealthUrl(config);
|
|
48
|
+
const probes = [
|
|
40
49
|
probe(`http://127.0.0.1:${devPort}/api/health`),
|
|
41
50
|
probe(`http://127.0.0.1:${ptyPort}/health`),
|
|
42
|
-
]
|
|
51
|
+
];
|
|
52
|
+
if (liveUrl) probes.push(probe(liveUrl));
|
|
53
|
+
const results = await Promise.all(probes);
|
|
54
|
+
const api = results[0];
|
|
55
|
+
const pty = results[1];
|
|
56
|
+
const live = liveUrl ? results[2] : null;
|
|
43
57
|
|
|
44
58
|
return {
|
|
45
59
|
schemaVersion: 'agentsam-local-status-v1',
|
|
@@ -60,12 +74,19 @@ export async function collectLocalStatus(cwd = process.cwd()) {
|
|
|
60
74
|
}
|
|
61
75
|
: null,
|
|
62
76
|
db: {
|
|
63
|
-
ready: Boolean(
|
|
77
|
+
ready: Boolean(
|
|
78
|
+
db.exists &&
|
|
79
|
+
db.tables?.includes('agentsam_schema_migrations') &&
|
|
80
|
+
db.tables?.includes('agentsam_project_sessions'),
|
|
81
|
+
),
|
|
64
82
|
path: db.dbPath || path.join(root, '.agentsam/data/agentsam.sqlite'),
|
|
65
83
|
tables: db.tables || [],
|
|
66
84
|
sizeBytes: db.sizeBytes || 0,
|
|
67
85
|
},
|
|
68
86
|
api,
|
|
69
87
|
pty,
|
|
88
|
+
live: liveUrl
|
|
89
|
+
? live || { online: false, status: null, url: liveUrl }
|
|
90
|
+
: { online: false, status: null, url: null },
|
|
70
91
|
};
|
|
71
92
|
}
|
|
@@ -76,6 +76,9 @@ export function createProjectManifest({
|
|
|
76
76
|
knowledge: {
|
|
77
77
|
config: '.agentsam/knowledge.json',
|
|
78
78
|
},
|
|
79
|
+
// Project-owned plugin/resource declarations. Bindings, indexes, models,
|
|
80
|
+
// and dimensions belong here rather than in a global SDK default.
|
|
81
|
+
plugins: {},
|
|
79
82
|
local: {
|
|
80
83
|
database: '.agentsam/data/agentsam.sqlite',
|
|
81
84
|
schema: 'db/schema.sql',
|
|
@@ -151,6 +154,12 @@ export function getKnowledgeConfigPath(config) {
|
|
|
151
154
|
return clean(config?.knowledge?.config) || '.agentsam/knowledge.json';
|
|
152
155
|
}
|
|
153
156
|
|
|
157
|
+
export function getProjectPluginConfig(config, pluginKey) {
|
|
158
|
+
const key = clean(pluginKey).replace(/^@/, '');
|
|
159
|
+
const plugins = config?.plugins || config?.integrations || {};
|
|
160
|
+
return plugins[key] || plugins[`@${key}`] || null;
|
|
161
|
+
}
|
|
162
|
+
|
|
154
163
|
export function getLocalDatabasePath(config) {
|
|
155
164
|
return clean(config?.local?.database || config?.db_path) || '.agentsam/data/agentsam.sqlite';
|
|
156
165
|
}
|
|
@@ -1,16 +1,50 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
+
import {
|
|
5
|
+
getSecureProviderKey,
|
|
6
|
+
setSecureProviderKey,
|
|
7
|
+
deleteSecureProviderKey,
|
|
8
|
+
hydrateSecureCredentials,
|
|
9
|
+
} from '../security/local-vault.js';
|
|
4
10
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
export { hydrateSecureCredentials };
|
|
12
|
+
|
|
13
|
+
export const PROVIDER_CREDENTIALS = Object.freeze({
|
|
14
|
+
openai: Object.freeze({ label: 'OpenAI', env: 'OPENAI_API_KEY', files: ['openai.env'], modelProvider: 'openai' }),
|
|
15
|
+
anthropic: Object.freeze({ label: 'Anthropic', env: 'ANTHROPIC_API_KEY', files: ['anthropic.env'], modelProvider: 'anthropic' }),
|
|
16
|
+
gemini: Object.freeze({ label: 'Gemini', env: 'GEMINI_API_KEY', files: ['gemini.env'], modelProvider: 'gemini' }),
|
|
17
|
+
cursor: Object.freeze({ label: 'Cursor', env: 'CURSOR_API_KEY', files: ['cursor.env'], modelProvider: 'cursor' }),
|
|
18
|
+
xai: Object.freeze({ label: 'xAI', env: 'XAI_API_KEY', files: ['xai.env', 'grok.env'], modelProvider: 'xai' }),
|
|
19
|
+
cloudflare: Object.freeze({
|
|
20
|
+
label: 'Cloudflare',
|
|
21
|
+
env: 'CLOUDFLARE_API_TOKEN',
|
|
22
|
+
files: ['cloudflare.env'],
|
|
23
|
+
modelProvider: 'cloudflare',
|
|
24
|
+
accountEnv: ['CLOUDFLARE_ACCOUNT_ID'],
|
|
25
|
+
}),
|
|
26
|
+
inneranimalmedia: Object.freeze({
|
|
27
|
+
label: 'InnerAnimalMedia',
|
|
28
|
+
env: 'AGENTSAM_API_KEY',
|
|
29
|
+
files: ['inneranimalmedia.env'],
|
|
30
|
+
tokenPrefix: 'aak_',
|
|
31
|
+
platformCredential: true,
|
|
32
|
+
}),
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const PROVIDER_ALIASES = Object.freeze({
|
|
36
|
+
grok: 'xai',
|
|
37
|
+
iam: 'inneranimalmedia',
|
|
38
|
+
inneranimal: 'inneranimalmedia',
|
|
11
39
|
});
|
|
12
40
|
|
|
13
41
|
function clean(value) { return value == null ? '' : String(value).trim(); }
|
|
42
|
+
|
|
43
|
+
export function normalizeProviderId(provider) {
|
|
44
|
+
const id = clean(provider).toLowerCase();
|
|
45
|
+
return PROVIDER_ALIASES[id] || id;
|
|
46
|
+
}
|
|
47
|
+
|
|
14
48
|
function normalizeCloudflareAccountId(value) {
|
|
15
49
|
const id = clean(value);
|
|
16
50
|
if (!id) return '';
|
|
@@ -18,6 +52,16 @@ function normalizeCloudflareAccountId(value) {
|
|
|
18
52
|
return id;
|
|
19
53
|
}
|
|
20
54
|
|
|
55
|
+
function validateCredentialValue(spec, value) {
|
|
56
|
+
const secret = clean(value);
|
|
57
|
+
if (!secret) throw new Error('credential_required');
|
|
58
|
+
if (/[\r\n\0]/.test(secret)) throw new Error('credential_must_be_single_line');
|
|
59
|
+
if (spec.tokenPrefix && !secret.startsWith(spec.tokenPrefix)) {
|
|
60
|
+
throw new Error(`credential_prefix_required:${spec.tokenPrefix}`);
|
|
61
|
+
}
|
|
62
|
+
return secret;
|
|
63
|
+
}
|
|
64
|
+
|
|
21
65
|
function homeDirectory(options = {}) {
|
|
22
66
|
return path.resolve(clean(options.home) || clean(options.env?.HOME) || clean(options.env?.USERPROFILE) || os.homedir());
|
|
23
67
|
}
|
|
@@ -58,6 +102,23 @@ function firstRuntimeValue(env, names = []) {
|
|
|
58
102
|
return '';
|
|
59
103
|
}
|
|
60
104
|
|
|
105
|
+
function atomicWrite(filename, source, mode = 0o600) {
|
|
106
|
+
const dir = path.dirname(filename);
|
|
107
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
108
|
+
if (process.platform !== 'win32') fs.chmodSync(dir, 0o700);
|
|
109
|
+
const temp = `${filename}.${process.pid}.${Date.now()}.tmp`;
|
|
110
|
+
fs.writeFileSync(temp, source, { mode });
|
|
111
|
+
if (process.platform !== 'win32') fs.chmodSync(temp, mode);
|
|
112
|
+
fs.renameSync(temp, filename);
|
|
113
|
+
if (process.platform !== 'win32') fs.chmodSync(filename, mode);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function envLiteral(value) {
|
|
117
|
+
const text = String(value ?? '');
|
|
118
|
+
if (/['"\r\n\0]/.test(text)) throw new Error('credential_contains_unsupported_profile_character');
|
|
119
|
+
return `"${text}"`;
|
|
120
|
+
}
|
|
121
|
+
|
|
61
122
|
export function agentEnvDirectory(options = {}) {
|
|
62
123
|
return path.join(homeDirectory(options), '.agentsam', 'env.d');
|
|
63
124
|
}
|
|
@@ -68,83 +129,197 @@ export function agentEnvLoaderPath(options = {}) {
|
|
|
68
129
|
|
|
69
130
|
export function ensureAgentEnvLoader(options = {}) {
|
|
70
131
|
const filename = agentEnvLoaderPath(options);
|
|
71
|
-
|
|
132
|
+
const supported = Object.keys(PROVIDER_CREDENTIALS).join('|');
|
|
72
133
|
const source = `# AgentSam provider environment loader. Source this file; do not execute it.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
*) echo \"usage: source ~/.agentsam/load-agent-env.sh <openai|anthropic|gemini|grok|cloudflare>\" >&2; return 2 2>/dev/null || exit 2 ;;
|
|
77
|
-
esac
|
|
78
|
-
_agentsam_file=\"\${HOME}/.agentsam/env.d/\${_agentsam_profile}.env\"
|
|
79
|
-
if [ ! -f \"\$_agentsam_file\" ]; then
|
|
80
|
-
echo \"AgentSam provider profile not found: \$_agentsam_file\" >&2
|
|
81
|
-
return 1 2>/dev/null || exit 1
|
|
82
|
-
fi
|
|
83
|
-
set -a
|
|
84
|
-
. \"\$_agentsam_file\"
|
|
85
|
-
set +a
|
|
86
|
-
if [ \"\$_agentsam_profile\" = cloudflare ]; then
|
|
87
|
-
if [ -z \"\${ACCOUNT_ID:-}\" ] && [ -n \"\${CLOUDFLARE_ACCOUNT_ID:-}\" ]; then export ACCOUNT_ID=\"\$CLOUDFLARE_ACCOUNT_ID\"; fi
|
|
88
|
-
if [ -z \"\${CLOUDFLARE_ACCOUNT_ID:-}\" ] && [ -n \"\${ACCOUNT_ID:-}\" ]; then export CLOUDFLARE_ACCOUNT_ID=\"\$ACCOUNT_ID\"; fi
|
|
134
|
+
if [ "$#" -eq 0 ]; then
|
|
135
|
+
echo "usage: source ~/.agentsam/load-agent-env.sh <profile> [profile ...]" >&2
|
|
136
|
+
return 2 2>/dev/null || exit 2
|
|
89
137
|
fi
|
|
138
|
+
for _agentsam_profile in "$@"; do
|
|
139
|
+
case "$_agentsam_profile" in
|
|
140
|
+
grok) _agentsam_profile="xai" ;;
|
|
141
|
+
${supported}) ;;
|
|
142
|
+
*) echo "unknown AgentSam provider profile: $_agentsam_profile" >&2; return 2 2>/dev/null || exit 2 ;;
|
|
143
|
+
esac
|
|
144
|
+
_agentsam_file="\${HOME}/.agentsam/env.d/\${_agentsam_profile}.env"
|
|
145
|
+
if [ ! -f "$_agentsam_file" ]; then
|
|
146
|
+
echo "AgentSam provider profile not found: $_agentsam_file" >&2
|
|
147
|
+
return 1 2>/dev/null || exit 1
|
|
148
|
+
fi
|
|
149
|
+
set -a
|
|
150
|
+
. "$_agentsam_file"
|
|
151
|
+
set +a
|
|
152
|
+
done
|
|
90
153
|
unset _agentsam_file _agentsam_profile
|
|
91
154
|
`;
|
|
92
|
-
|
|
93
|
-
if (process.platform !== 'win32') fs.chmodSync(filename, 0o700);
|
|
155
|
+
atomicWrite(filename, source, 0o700);
|
|
94
156
|
return filename;
|
|
95
157
|
}
|
|
96
158
|
|
|
97
|
-
function
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
159
|
+
function profileSource(provider, credential = '', options = {}) {
|
|
160
|
+
const spec = providerCredentialSpec(provider);
|
|
161
|
+
if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
|
|
162
|
+
const lines = [`# AgentSam ${spec.label} provider profile`];
|
|
163
|
+
if (spec.provider === 'cloudflare') {
|
|
164
|
+
lines.push('# CLOUDFLARE_ACCOUNT_ID is your Cloudflare account identifier; it is not a secret.');
|
|
165
|
+
lines.push(`export CLOUDFLARE_ACCOUNT_ID=${envLiteral(normalizeCloudflareAccountId(options.accountId))}`);
|
|
101
166
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
167
|
+
lines.push(`export ${spec.env}=${envLiteral(credential)}`);
|
|
168
|
+
return `${lines.join('\n')}\n`;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function providerCredentialSpec(provider) {
|
|
172
|
+
const id = normalizeProviderId(provider);
|
|
173
|
+
const spec = PROVIDER_CREDENTIALS[id];
|
|
174
|
+
return spec ? Object.freeze({ provider: id, ...spec }) : null;
|
|
105
175
|
}
|
|
106
176
|
|
|
107
177
|
export function ensureProviderEnvProfile(provider, options = {}) {
|
|
108
178
|
const spec = providerCredentialSpec(provider);
|
|
109
|
-
if (!spec) throw new Error(`unsupported_provider:${
|
|
179
|
+
if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
|
|
110
180
|
const dir = agentEnvDirectory(options);
|
|
111
181
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
112
182
|
if (process.platform !== 'win32') fs.chmodSync(dir, 0o700);
|
|
113
183
|
const filename = path.join(dir, spec.files[0]);
|
|
114
184
|
let created = false;
|
|
115
185
|
if (!fs.existsSync(filename)) {
|
|
116
|
-
|
|
186
|
+
atomicWrite(filename, profileSource(spec.provider, '', options), 0o600);
|
|
117
187
|
created = true;
|
|
118
|
-
} else
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
188
|
+
} else {
|
|
189
|
+
const safety = secureFile(filename);
|
|
190
|
+
if (!safety.ok) throw new Error(safety.error);
|
|
191
|
+
if (process.platform !== 'win32') fs.chmodSync(filename, 0o600);
|
|
192
|
+
if (spec.provider === 'cloudflare' && clean(options.accountId)) {
|
|
193
|
+
const source = fs.readFileSync(filename, 'utf8');
|
|
194
|
+
const current = firstEnvValue(source, spec.accountEnv || []);
|
|
195
|
+
if (!current) {
|
|
196
|
+
const accountId = normalizeCloudflareAccountId(options.accountId);
|
|
197
|
+
const line = `export CLOUDFLARE_ACCOUNT_ID=${envLiteral(accountId)}`;
|
|
198
|
+
const next = /^(?:export\s+)?CLOUDFLARE_ACCOUNT_ID=.*$/m.test(source)
|
|
199
|
+
? source.replace(/^(?:export\s+)?CLOUDFLARE_ACCOUNT_ID=.*$/m, line)
|
|
200
|
+
: `${line}\n${source}`;
|
|
201
|
+
atomicWrite(filename, next, 0o600);
|
|
202
|
+
}
|
|
128
203
|
}
|
|
129
204
|
}
|
|
130
|
-
if (process.platform !== 'win32') fs.chmodSync(filename, 0o600);
|
|
131
205
|
const loader = ensureAgentEnvLoader(options);
|
|
132
|
-
return Object.freeze({
|
|
206
|
+
return Object.freeze({
|
|
207
|
+
provider: spec.provider,
|
|
208
|
+
file: filename,
|
|
209
|
+
loader,
|
|
210
|
+
created,
|
|
211
|
+
source_command: `source ~/.agentsam/load-agent-env.sh ${spec.provider}`,
|
|
212
|
+
});
|
|
133
213
|
}
|
|
134
214
|
|
|
135
|
-
export function
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
215
|
+
export function setProviderCredential(provider, credential, options = {}) {
|
|
216
|
+
const spec = providerCredentialSpec(provider);
|
|
217
|
+
if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
|
|
218
|
+
const value = validateCredentialValue(spec, credential);
|
|
219
|
+
setSecureProviderKey(spec.provider, { value, accountId: options.accountId }, options);
|
|
220
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
221
|
+
process.env[spec.env] = value;
|
|
222
|
+
if (spec.provider === 'cloudflare' && options.accountId) {
|
|
223
|
+
process.env.CLOUDFLARE_ACCOUNT_ID = options.accountId;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
let file = null;
|
|
227
|
+
let loader = null;
|
|
228
|
+
let sourceCommand = null;
|
|
229
|
+
if (options.exportProfile === true || options.writeEnvProfile === true) {
|
|
230
|
+
const filename = path.join(agentEnvDirectory(options), spec.files[0]);
|
|
231
|
+
atomicWrite(filename, profileSource(spec.provider, value, options), 0o600);
|
|
232
|
+
loader = ensureAgentEnvLoader(options);
|
|
233
|
+
file = filename;
|
|
234
|
+
sourceCommand = `source ~/.agentsam/load-agent-env.sh ${spec.provider}`;
|
|
235
|
+
}
|
|
236
|
+
return Object.freeze({
|
|
237
|
+
provider: spec.provider,
|
|
238
|
+
file,
|
|
239
|
+
loader,
|
|
240
|
+
source_command: sourceCommand,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Exports a configured provider credential from the secure vault to a plaintext .env file.
|
|
246
|
+
* This is an explicit opt-in action for operators who need to source credentials into external shells.
|
|
247
|
+
* The standard AgentSam setup flows (interactive picker, models --setup, providers add)
|
|
248
|
+
* intentionally do NOT invoke this, keeping the credential strictly inside the encrypted vault.
|
|
249
|
+
*/
|
|
250
|
+
export function exportProviderEnvProfile(provider, options = {}) {
|
|
251
|
+
const spec = providerCredentialSpec(provider);
|
|
252
|
+
if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
|
|
253
|
+
const resolved = resolveProviderCredential(spec.provider, options);
|
|
254
|
+
if (!resolved.configured || !resolved.value) {
|
|
255
|
+
throw new Error(`provider_not_configured:${spec.provider}`);
|
|
256
|
+
}
|
|
257
|
+
const filename = path.join(agentEnvDirectory(options), spec.files[0]);
|
|
258
|
+
atomicWrite(filename, profileSource(spec.provider, resolved.value, { ...options, accountId: resolved.account_id }), 0o600);
|
|
259
|
+
const loader = ensureAgentEnvLoader(options);
|
|
260
|
+
return Object.freeze({
|
|
261
|
+
provider: spec.provider,
|
|
262
|
+
file: filename,
|
|
263
|
+
loader,
|
|
264
|
+
source_command: `source ~/.agentsam/load-agent-env.sh ${spec.provider}`,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export function removeProviderCredential(provider, options = {}) {
|
|
269
|
+
const spec = providerCredentialSpec(provider);
|
|
270
|
+
if (!spec) throw new Error(`unsupported_provider:${normalizeProviderId(provider)}`);
|
|
271
|
+
deleteSecureProviderKey(spec.provider, options);
|
|
272
|
+
const dir = agentEnvDirectory(options);
|
|
273
|
+
let removed = false;
|
|
274
|
+
for (const basename of spec.files) {
|
|
275
|
+
const filename = path.join(dir, basename);
|
|
276
|
+
if (!fs.existsSync(filename)) continue;
|
|
277
|
+
const safety = secureFile(filename);
|
|
278
|
+
if (!safety.ok) throw new Error(safety.error);
|
|
279
|
+
fs.rmSync(filename, { force: true });
|
|
280
|
+
removed = true;
|
|
281
|
+
}
|
|
282
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
283
|
+
delete process.env[spec.env];
|
|
284
|
+
}
|
|
285
|
+
return Object.freeze({ provider: spec.provider, removed });
|
|
139
286
|
}
|
|
140
287
|
|
|
141
288
|
export function resolveProviderCredential(provider, options = {}) {
|
|
142
289
|
const spec = providerCredentialSpec(provider);
|
|
143
|
-
if (!spec) return Object.freeze({ provider:
|
|
290
|
+
if (!spec) return Object.freeze({ provider: normalizeProviderId(provider), configured: false, source: null, error: 'unsupported_provider', value: '' });
|
|
144
291
|
const env = options.env || process.env;
|
|
145
292
|
const accountIdFromEnv = firstRuntimeValue(env, spec.accountEnv || []);
|
|
146
293
|
const fromEnv = clean(env?.[spec.env]);
|
|
147
|
-
if (fromEnv)
|
|
294
|
+
if (fromEnv) {
|
|
295
|
+
const prefixError = spec.tokenPrefix && !fromEnv.startsWith(spec.tokenPrefix) ? `credential_prefix_required:${spec.tokenPrefix}` : null;
|
|
296
|
+
return Object.freeze({
|
|
297
|
+
provider: spec.provider,
|
|
298
|
+
configured: !prefixError,
|
|
299
|
+
source: 'environment',
|
|
300
|
+
env: spec.env,
|
|
301
|
+
file: null,
|
|
302
|
+
error: prefixError,
|
|
303
|
+
value: prefixError ? '' : fromEnv,
|
|
304
|
+
account_id: accountIdFromEnv || null,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const secure = getSecureProviderKey(spec.provider, options);
|
|
309
|
+
if (secure && clean(secure.value)) {
|
|
310
|
+
const val = clean(secure.value);
|
|
311
|
+
const prefixError = spec.tokenPrefix && !val.startsWith(spec.tokenPrefix) ? `credential_prefix_required:${spec.tokenPrefix}` : null;
|
|
312
|
+
return Object.freeze({
|
|
313
|
+
provider: spec.provider,
|
|
314
|
+
configured: !prefixError,
|
|
315
|
+
source: secure.source || 'local_vault',
|
|
316
|
+
env: spec.env,
|
|
317
|
+
file: null,
|
|
318
|
+
error: prefixError,
|
|
319
|
+
value: prefixError ? '' : val,
|
|
320
|
+
account_id: accountIdFromEnv || secure.accountId || null,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
148
323
|
|
|
149
324
|
const dir = agentEnvDirectory({ ...options, env });
|
|
150
325
|
for (const basename of spec.files) {
|
|
@@ -156,19 +331,22 @@ export function resolveProviderCredential(provider, options = {}) {
|
|
|
156
331
|
const source = fs.readFileSync(filename, 'utf8');
|
|
157
332
|
const value = clean(parseEnvValue(source, spec.env));
|
|
158
333
|
const accountId = accountIdFromEnv || firstEnvValue(source, spec.accountEnv || []);
|
|
159
|
-
|
|
160
|
-
return Object.freeze({ provider: spec.provider, configured:
|
|
334
|
+
const prefixError = spec.tokenPrefix && value && !value.startsWith(spec.tokenPrefix) ? `credential_prefix_required:${spec.tokenPrefix}` : null;
|
|
335
|
+
if (value && !prefixError) return Object.freeze({ provider: spec.provider, configured: true, source: 'agentsam_env_file', env: spec.env, file: filename, error: null, value, account_id: accountId || null });
|
|
336
|
+
return Object.freeze({ provider: spec.provider, configured: false, source: 'agentsam_env_file', env: spec.env, file: filename, error: prefixError || 'credential_variable_missing', value: '' });
|
|
161
337
|
} catch (error) {
|
|
162
338
|
return Object.freeze({ provider: spec.provider, configured: false, source: 'agentsam_env_file', env: spec.env, file: filename, error: error?.message || String(error), value: '' });
|
|
163
339
|
}
|
|
164
340
|
}
|
|
165
|
-
return Object.freeze({ provider: spec.provider, configured: false, source: null, env: spec.env, file: null, error: null, value: '' });
|
|
341
|
+
return Object.freeze({ provider: spec.provider, configured: false, source: null, env: spec.env, file: null, error: null, value: '', account_id: accountIdFromEnv || null });
|
|
166
342
|
}
|
|
167
343
|
|
|
168
344
|
export function describeProviderCredential(provider, options = {}) {
|
|
169
345
|
const resolved = resolveProviderCredential(provider, options);
|
|
346
|
+
const spec = providerCredentialSpec(provider);
|
|
170
347
|
return Object.freeze({
|
|
171
348
|
provider: resolved.provider,
|
|
349
|
+
label: spec?.label || resolved.provider,
|
|
172
350
|
configured: resolved.configured,
|
|
173
351
|
source: resolved.source,
|
|
174
352
|
env: resolved.env || null,
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cloudflare account resolution for scaffold wizards.
|
|
3
|
+
* Reuses the same detection the CLI's `agentsam env init cloudflare` flow
|
|
4
|
+
* already relies on — never ask the user to hand-paste an account ID that
|
|
5
|
+
* `wrangler whoami` (or an existing env override) can already answer.
|
|
6
|
+
*/
|
|
7
|
+
import { detectCloudflareAccounts } from '../../commands/env.js';
|
|
8
|
+
|
|
9
|
+
export async function resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc, detectAccounts = detectCloudflareAccounts }) {
|
|
10
|
+
const detected = detectAccounts();
|
|
11
|
+
|
|
12
|
+
if (detected.accounts.length === 1) {
|
|
13
|
+
const acct = detected.accounts[0];
|
|
14
|
+
note(`Detected Cloudflare account: ${pc.cyan(acct.name || acct.id)}`, 'Cloudflare account');
|
|
15
|
+
return acct.id;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (detected.accounts.length > 1) {
|
|
19
|
+
const choice = await select({
|
|
20
|
+
message: 'Which Cloudflare account?',
|
|
21
|
+
options: detected.accounts.map((a) => ({ value: a.id, label: a.name || a.id, hint: a.id })),
|
|
22
|
+
});
|
|
23
|
+
if (isCancel(choice)) { cancel('Cancelled.'); process.exit(0); }
|
|
24
|
+
return choice;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
note('Could not auto-detect a Cloudflare account (run `agentsam cloudflare` to check login status).', 'Cloudflare account');
|
|
28
|
+
const cfAccountId = await text({
|
|
29
|
+
message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
|
|
30
|
+
placeholder: 'abc123...',
|
|
31
|
+
validate(val) {
|
|
32
|
+
if (!val || val.trim().length === 0) return 'Required.';
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
|
|
36
|
+
return cfAccountId.trim();
|
|
37
|
+
}
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
import pc from 'picocolors';
|
|
23
23
|
import { writeFileTree } from '../writer.js';
|
|
24
24
|
import { cmsTemplates } from '../templates/cms/index.js';
|
|
25
|
+
import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
|
|
25
26
|
|
|
26
27
|
export async function runCmsWizard() {
|
|
27
28
|
note('A Cloudflare Worker + D1 + R2 CMS site with reusable page templates.', 'CMS Site');
|
|
@@ -111,14 +112,7 @@ export async function runCmsWizard() {
|
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
// ── Step 7: Cloudflare account details ────────────────────────────────────
|
|
114
|
-
const cfAccountId = await
|
|
115
|
-
message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
|
|
116
|
-
placeholder: 'abc123...',
|
|
117
|
-
validate(val) {
|
|
118
|
-
if (!val || val.trim().length === 0) return 'Required for wrangler.toml.';
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
|
|
115
|
+
const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
|
|
122
116
|
|
|
123
117
|
// ── Step 8: Confirm before writing ───────────────────────────────────────
|
|
124
118
|
const summary = [
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
import pc from 'picocolors';
|
|
17
17
|
import { writeFileTree } from '../writer.js';
|
|
18
18
|
import { workerApiTemplates } from '../templates/worker-api/index.js';
|
|
19
|
+
import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
|
|
19
20
|
|
|
20
21
|
export async function runWorkerApiWizard() {
|
|
21
22
|
note('A typed Cloudflare Worker with route handlers, D1 binding, and CORS ready.', 'Worker API');
|
|
@@ -52,14 +53,7 @@ export async function runWorkerApiWizard() {
|
|
|
52
53
|
});
|
|
53
54
|
if (isCancel(dbKind)) { cancel('Cancelled.'); process.exit(0); }
|
|
54
55
|
|
|
55
|
-
const cfAccountId = await
|
|
56
|
-
message: 'Cloudflare account ID?',
|
|
57
|
-
placeholder: 'abc123...',
|
|
58
|
-
validate(val) {
|
|
59
|
-
if (!val || val.trim().length === 0) return 'Required.';
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
|
|
56
|
+
const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
|
|
63
57
|
|
|
64
58
|
const confirmed = await confirm({ message: `Write files to ./${projectName.trim()}/?` });
|
|
65
59
|
if (isCancel(confirmed) || !confirmed) { cancel('Cancelled.'); process.exit(0); }
|
|
@@ -8,22 +8,30 @@ export const SLASH_COMMANDS = [
|
|
|
8
8
|
{ cmd: '/fast', description: 'Use provider Fast processing when the selected model supports it', lane: 'model' },
|
|
9
9
|
{ cmd: '/flex', description: 'Use provider Flex processing when the selected model supports it', lane: 'model' },
|
|
10
10
|
{ cmd: '/standard', description: 'Return to Standard provider processing', lane: 'model' },
|
|
11
|
+
{ cmd: '/compact', description: 'Compact active provider context; status shows support, threshold, and receipt', lane: 'context' },
|
|
11
12
|
{ cmd: '/context', description: 'Show model context economics; add repo for Git bridge context', lane: 'context' },
|
|
12
|
-
{ cmd: '/status', description: '
|
|
13
|
+
{ cmd: '/status', description: 'Honest project awareness: account, models, terminal, live deploy', lane: 'local' },
|
|
13
14
|
{ cmd: '/models', description: 'Probe providers and provider-verified known models', lane: 'model' },
|
|
15
|
+
{ cmd: '/providers', description: 'Configure and verify machine provider credentials', lane: 'model' },
|
|
14
16
|
{ cmd: '/login', description: 'Sign in to Inner Animal Media and save the machine-local Agent Sam session', lane: 'identity' },
|
|
15
17
|
{ cmd: '/logout', description: 'Sign out locally without deleting provider credentials', lane: 'identity' },
|
|
16
18
|
{ cmd: '/whoami', description: 'Show authenticated account identity and safe credential status', lane: 'identity' },
|
|
17
19
|
{ cmd: '/session', description: 'Show current session usage, cost, and resume receipt', lane: 'observability' },
|
|
18
20
|
{ cmd: '/usage', description: 'Show token usage, spend breakdown, and resume command', lane: 'observability' },
|
|
19
21
|
{ cmd: '/cf', description: 'Cloudflare native reads, Wrangler status, and CPU profile analysis', lane: 'cloudflare' },
|
|
22
|
+
{ cmd: '/connections', description: 'Inspect live account, terminal, Worker, and Cloudflare connection evidence', lane: 'cloudflare' },
|
|
23
|
+
{ cmd: '/tunnel', description: 'Choose and run a real Cloudflare Tunnel through Wrangler', lane: 'cloudflare' },
|
|
20
24
|
{ cmd: '/settings', description: 'Choose project, runtime, terminal, and model policy' },
|
|
21
25
|
{ cmd: '/pwd', description: 'Print working directory', lane: 'terminal' },
|
|
22
26
|
{ cmd: '/cd', description: 'Change working directory', lane: 'terminal' },
|
|
23
27
|
{ cmd: '/git', description: 'Run an explicit Git subcommand', lane: 'git' },
|
|
24
28
|
{ cmd: '/diff', description: 'Show the current Git diff', lane: 'git' },
|
|
25
|
-
{ cmd: '/db', description: '
|
|
29
|
+
{ cmd: '/db', description: 'SQLite status; sources discovers stores; select knowledge sqlite|postgres [ENV]', lane: 'data' },
|
|
26
30
|
{ cmd: '/agent', description: 'Send a goal to the configured local Agent Sam runtime', lane: 'agent' },
|
|
31
|
+
{ cmd: '/goap', description: 'Inspect and manage GOAP blackboard: /goap [status|goal|why|plan|list|new|switch|close]', lane: 'agent' },
|
|
32
|
+
{ cmd: '/brand', description: 'Brand intelligence: /brand [scan|resolve|plan|inspect]', lane: 'product' },
|
|
33
|
+
{ cmd: '/plan', description: 'Composable plans: /plan brand', lane: 'product' },
|
|
34
|
+
{ cmd: '/next', description: 'Suggested next actions from session progression', lane: 'product' },
|
|
27
35
|
{ cmd: '/logs', description: 'Show local Agent Sam execution events', lane: 'observability' },
|
|
28
36
|
{ cmd: '/deploy', description: 'Add a cloud adapter and deploy intentionally', lane: 'deploy' },
|
|
29
37
|
{ cmd: '/clear', description: 'Clear the terminal display', lane: 'terminal' },
|