@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/local/migrations.js
CHANGED
|
@@ -37,6 +37,52 @@ function checksumSource(source) {
|
|
|
37
37
|
return 'fnv1a32:' + (hash >>> 0).toString(16).padStart(8, '0');
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
// A naive source.split(';') breaks on ANY semicolon -- including one
|
|
41
|
+
// inside a wrapped comment line's prose ("...available; standalone...")
|
|
42
|
+
// and every semicolon inside a CREATE TRIGGER's BEGIN...END body. Both
|
|
43
|
+
// happen in real migration files (this one has both). Comment-strip first,
|
|
44
|
+
// then split statement-aware: only treat ';' as a terminator outside a
|
|
45
|
+
// BEGIN/END block, so a trigger body survives as one statement instead of
|
|
46
|
+
// fragmenting into pieces that don't individually look like anything.
|
|
47
|
+
function stripSqlComments(source) {
|
|
48
|
+
return source
|
|
49
|
+
.split('\n')
|
|
50
|
+
.map((line) => (line.trim().startsWith('--') ? '' : line))
|
|
51
|
+
.join('\n');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function splitSqlStatements(source) {
|
|
55
|
+
const clean = stripSqlComments(source);
|
|
56
|
+
// CASE ... END is also closed by the bare keyword END (no BEGIN of its
|
|
57
|
+
// own) -- a trigger body containing a CASE expression has one more END
|
|
58
|
+
// than BEGIN. Track BEGIN and CASE as the same depth-increasing class so
|
|
59
|
+
// a CASE's END doesn't prematurely close the enclosing trigger's depth.
|
|
60
|
+
const tokens = clean.split(/(\bBEGIN\b|\bCASE\b|\bEND\b|;)/i);
|
|
61
|
+
const statements = [];
|
|
62
|
+
let current = '';
|
|
63
|
+
let depth = 0;
|
|
64
|
+
for (const token of tokens) {
|
|
65
|
+
if (/^(BEGIN|CASE)$/i.test(token)) { depth += 1; current += token; continue; }
|
|
66
|
+
if (/^END$/i.test(token)) { depth = Math.max(0, depth - 1); current += token; continue; }
|
|
67
|
+
if (token === ';' && depth === 0) {
|
|
68
|
+
const trimmed = current.trim();
|
|
69
|
+
if (trimmed) statements.push(trimmed);
|
|
70
|
+
current = '';
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
current += token;
|
|
74
|
+
}
|
|
75
|
+
const trimmed = current.trim();
|
|
76
|
+
if (trimmed) statements.push(trimmed);
|
|
77
|
+
return statements;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function isIdempotentSafe(source) {
|
|
81
|
+
const statements = splitSqlStatements(source);
|
|
82
|
+
const IDEMPOTENT_RE = /^(CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS|CREATE\s+(UNIQUE\s+)?INDEX\s+IF\s+NOT\s+EXISTS|CREATE\s+TRIGGER\s+IF\s+NOT\s+EXISTS|PRAGMA)/i;
|
|
83
|
+
return statements.length > 0 && statements.every((stmt) => IDEMPOTENT_RE.test(stmt.trim()));
|
|
84
|
+
}
|
|
85
|
+
|
|
40
86
|
export async function listAppliedMigrations(db) {
|
|
41
87
|
ensureLedger(db);
|
|
42
88
|
const result = await db.prepare(
|
|
@@ -60,7 +106,23 @@ export async function applyRuntimeMigrations(db, options = {}) {
|
|
|
60
106
|
|
|
61
107
|
if (previous) {
|
|
62
108
|
if (previous.checksum && previous.checksum !== checksum) {
|
|
63
|
-
throw new Error('migration_checksum_mismatch:' + id);
|
|
109
|
+
if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
|
|
110
|
+
// File grew via additive, idempotent statements only (e.g. a new
|
|
111
|
+
// CREATE TABLE IF NOT EXISTS appended for a later feature). Safe to
|
|
112
|
+
// re-run and accept the new checksum rather than hard-lock the CLI.
|
|
113
|
+
db.exec('BEGIN IMMEDIATE');
|
|
114
|
+
try {
|
|
115
|
+
db.exec(source);
|
|
116
|
+
await db.prepare(
|
|
117
|
+
'UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?'
|
|
118
|
+
).bind(checksum, id).run();
|
|
119
|
+
db.exec('COMMIT');
|
|
120
|
+
results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
|
|
121
|
+
continue;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
try { db.exec('ROLLBACK'); } catch {}
|
|
124
|
+
throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
|
|
125
|
+
}
|
|
64
126
|
}
|
|
65
127
|
results.push({ id, filename, status: 'already_applied', checksum });
|
|
66
128
|
continue;
|
|
@@ -88,6 +150,52 @@ export async function applyRuntimeMigrations(db, options = {}) {
|
|
|
88
150
|
});
|
|
89
151
|
}
|
|
90
152
|
|
|
153
|
+
// Synchronous entry point for the interactive shell. Both runners consume the
|
|
154
|
+
// same versioned SQL and checksums; schema ownership stays in migrations/runtime.
|
|
155
|
+
export function applyRuntimeMigrationsSync(db, options = {}) {
|
|
156
|
+
const dir = path.resolve(options.migrationsDir || DEFAULT_MIGRATIONS_DIR);
|
|
157
|
+
ensureLedger(db);
|
|
158
|
+
const applied = new Map(db.prepare(
|
|
159
|
+
'SELECT id, applied_at_unix, checksum FROM agentsam_schema_migrations ORDER BY id'
|
|
160
|
+
).all().map((row) => [String(row.id), row]));
|
|
161
|
+
const results = [];
|
|
162
|
+
for (const filename of migrationFiles(dir)) {
|
|
163
|
+
const id = filename.replace(/\.sql$/i, '');
|
|
164
|
+
const source = fs.readFileSync(path.join(dir, filename), 'utf8');
|
|
165
|
+
const checksum = checksumSource(source);
|
|
166
|
+
const previous = applied.get(id);
|
|
167
|
+
if (previous) {
|
|
168
|
+
if (previous.checksum && previous.checksum !== checksum) {
|
|
169
|
+
if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
|
|
170
|
+
db.exec('BEGIN IMMEDIATE');
|
|
171
|
+
try {
|
|
172
|
+
db.exec(source);
|
|
173
|
+
db.prepare('UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?').run(checksum, id);
|
|
174
|
+
db.exec('COMMIT');
|
|
175
|
+
results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
|
|
176
|
+
continue;
|
|
177
|
+
} catch (error) {
|
|
178
|
+
try { db.exec('ROLLBACK'); } catch {}
|
|
179
|
+
throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
results.push({ id, filename, status: 'already_applied', checksum });
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
db.exec('BEGIN IMMEDIATE');
|
|
186
|
+
try {
|
|
187
|
+
db.exec(source);
|
|
188
|
+
db.prepare('INSERT INTO agentsam_schema_migrations (id, checksum) VALUES (?, ?)').run(id, checksum);
|
|
189
|
+
db.exec('COMMIT');
|
|
190
|
+
results.push({ id, filename, status: 'applied', checksum });
|
|
191
|
+
} catch (error) {
|
|
192
|
+
try { db.exec('ROLLBACK'); } catch {}
|
|
193
|
+
throw new Error('migration_failed:' + id + ':' + (error?.message || error));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return Object.freeze({ migrationsDir: dir, total: results.length, applied: results.filter((row) => row.status === 'applied').length, results: Object.freeze(results) });
|
|
197
|
+
}
|
|
198
|
+
|
|
91
199
|
export function runtimeMigrationsDirectory() {
|
|
92
200
|
return DEFAULT_MIGRATIONS_DIR;
|
|
93
201
|
}
|
|
@@ -2,12 +2,28 @@ import path from 'node:path';
|
|
|
2
2
|
import { createHash, randomUUID } from 'node:crypto';
|
|
3
3
|
import { createLocalSqliteDatabase } from './sqlite.js';
|
|
4
4
|
import { applyRuntimeMigrations } from './migrations.js';
|
|
5
|
+
import { findCliProjectRoot } from '../lib/cli-preferences.js';
|
|
6
|
+
import { getLocalDatabasePath, tryReadProjectConfig } from '../lib/project-config.js';
|
|
5
7
|
|
|
6
8
|
function clean(value) { return value == null ? '' : String(value).trim(); }
|
|
7
9
|
function hash(value) { return createHash('sha256').update(String(value || '')).digest('hex'); }
|
|
8
10
|
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
+
export const SQLITE_RUNTIME_CAPABILITIES = Object.freeze({
|
|
12
|
+
transactions: true,
|
|
13
|
+
relational_queries: true,
|
|
14
|
+
ttl_cleanup: 'application_managed',
|
|
15
|
+
remote_shared_state: false,
|
|
16
|
+
local_only: true,
|
|
17
|
+
concurrent_writers: 'sqlite_serialized',
|
|
18
|
+
migrations: true,
|
|
19
|
+
vector_search: false,
|
|
20
|
+
blob_storage: false,
|
|
21
|
+
distributed_actor_semantics: false,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export function runtimeDatabasePath(startDir = process.cwd()) {
|
|
25
|
+
const root = findCliProjectRoot(startDir);
|
|
26
|
+
return path.resolve(root, getLocalDatabasePath(tryReadProjectConfig(root)));
|
|
11
27
|
}
|
|
12
28
|
|
|
13
29
|
async function withStore(cwd, fn) {
|
|
@@ -26,7 +42,7 @@ export function createRuntimeRunId() {
|
|
|
26
42
|
|
|
27
43
|
export async function startRuntimeRun(value = {}) {
|
|
28
44
|
const id = clean(value.id) || createRuntimeRunId();
|
|
29
|
-
await withStore(value.cwd, async (db) => {
|
|
45
|
+
await withStore(value.projectRoot || value.cwd, async (db) => {
|
|
30
46
|
await db.prepare(`
|
|
31
47
|
INSERT INTO agentsam_agent_run (
|
|
32
48
|
id, account_id, source_client, surface, mode, model_key,
|
|
@@ -46,7 +62,7 @@ export async function startRuntimeRun(value = {}) {
|
|
|
46
62
|
|
|
47
63
|
export async function finishRuntimeRun(value = {}) {
|
|
48
64
|
if (!clean(value.id)) return;
|
|
49
|
-
await withStore(value.cwd, async (db) => {
|
|
65
|
+
await withStore(value.projectRoot || value.cwd, async (db) => {
|
|
50
66
|
const usage = value.usage || {};
|
|
51
67
|
await db.prepare(`
|
|
52
68
|
UPDATE agentsam_agent_run
|
|
@@ -87,7 +103,7 @@ export async function recordRuntimeCompaction(value = {}) {
|
|
|
87
103
|
const after = Math.max(0, Math.round(Number(value.tokens_after || 0)));
|
|
88
104
|
const sourceHash = hash(summary || JSON.stringify(value.metadata || {}));
|
|
89
105
|
|
|
90
|
-
await withStore(value.cwd, async (db) => {
|
|
106
|
+
await withStore(value.projectRoot || value.cwd, async (db) => {
|
|
91
107
|
await db.prepare(`
|
|
92
108
|
INSERT INTO agentsam_compaction_events (
|
|
93
109
|
id, account_id, agent_run_id, compaction_type, compaction_scope,
|
|
@@ -139,3 +155,13 @@ export async function recordRuntimeCompaction(value = {}) {
|
|
|
139
155
|
});
|
|
140
156
|
return id;
|
|
141
157
|
}
|
|
158
|
+
|
|
159
|
+
export async function pruneExpiredRuntimeState(value = {}) {
|
|
160
|
+
const nowUnix = Number.isFinite(Number(value.nowUnix)) ? Math.floor(Number(value.nowUnix)) : Math.floor(Date.now() / 1000);
|
|
161
|
+
return withStore(value.projectRoot || value.cwd, async (db) => {
|
|
162
|
+
const digests = await db.prepare('DELETE FROM agentsam_context_digest WHERE expires_at_unix IS NOT NULL AND expires_at_unix <= ?').bind(nowUnix).run();
|
|
163
|
+
const compactions = await db.prepare('DELETE FROM agentsam_compaction_events WHERE expires_at_epoch IS NOT NULL AND expires_at_epoch <= ?').bind(nowUnix).run();
|
|
164
|
+
const approvals = await db.prepare("UPDATE agentsam_approval_queue SET status = 'expired' WHERE status = 'pending' AND expires_at IS NOT NULL AND expires_at <= ?").bind(nowUnix).run();
|
|
165
|
+
return { digests: Number(digests.changes || 0), compactions: Number(compactions.changes || 0), approvals_expired: Number(approvals.changes || 0) };
|
|
166
|
+
});
|
|
167
|
+
}
|
package/src/local/sqlite.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
3
4
|
import { applyRuntimeMigrations } from './migrations.js';
|
|
4
5
|
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
|
|
5
8
|
async function loadSqlite() {
|
|
6
9
|
try {
|
|
7
10
|
return await import('node:sqlite');
|
|
@@ -18,11 +21,43 @@ function resolveFile(filePath) {
|
|
|
18
21
|
return path.resolve(String(filePath || '.agentsam/data/agentsam.sqlite'));
|
|
19
22
|
}
|
|
20
23
|
|
|
24
|
+
function prepareDatabaseFile(resolved) {
|
|
25
|
+
const dir = path.dirname(resolved);
|
|
26
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
27
|
+
if (process.platform !== 'win32') {
|
|
28
|
+
try { fs.chmodSync(dir, 0o700); } catch { /* platform policy may own directory mode */ }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function restrictDatabaseFile(resolved) {
|
|
33
|
+
if (process.platform !== 'win32') {
|
|
34
|
+
try { fs.chmodSync(resolved, 0o600); } catch { /* platform policy may own file mode */ }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The shell's session API is synchronous. It uses the same database file and
|
|
39
|
+
// migration directory as the async runtime store, with no second state store.
|
|
40
|
+
export function createLocalSqliteDatabaseSync(filePath = '.agentsam/data/agentsam.sqlite') {
|
|
41
|
+
let DatabaseSync;
|
|
42
|
+
try { ({ DatabaseSync } = require('node:sqlite')); }
|
|
43
|
+
catch (error) {
|
|
44
|
+
const wrapped = new Error('Local SQLite requires Node 22.5+ (node:sqlite). Upgrade Node, then retry.');
|
|
45
|
+
wrapped.cause = error;
|
|
46
|
+
throw wrapped;
|
|
47
|
+
}
|
|
48
|
+
const resolved = resolveFile(filePath);
|
|
49
|
+
prepareDatabaseFile(resolved);
|
|
50
|
+
const db = new DatabaseSync(resolved);
|
|
51
|
+
restrictDatabaseFile(resolved);
|
|
52
|
+
return db;
|
|
53
|
+
}
|
|
54
|
+
|
|
21
55
|
export async function createLocalSqliteDatabase(filePath = '.agentsam/data/agentsam.sqlite') {
|
|
22
56
|
const { DatabaseSync } = await loadSqlite();
|
|
23
57
|
const resolved = resolveFile(filePath);
|
|
24
|
-
|
|
58
|
+
prepareDatabaseFile(resolved);
|
|
25
59
|
const database = new DatabaseSync(resolved);
|
|
60
|
+
restrictDatabaseFile(resolved);
|
|
26
61
|
|
|
27
62
|
return {
|
|
28
63
|
filePath: resolved,
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
|
|
5
|
+
export const MCP_AUTHORITY_SCHEMA = 'agentsam.mcp.authority.v1';
|
|
6
|
+
export const SERVER_CATALOG_CACHE_SCHEMA = 'agentsam.mcp.server-catalog.v1';
|
|
7
|
+
export const DEFAULT_SERVER_CATALOG_URL = 'https://mcp.inneranimalmedia.com/api/mcp/servers';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Seed MCP server catalog snapshot derived directly from D1 table:
|
|
11
|
+
* `agentsam_mcp_servers`.
|
|
12
|
+
*
|
|
13
|
+
* Captures live server authority, authentication requirements, and live health metrics
|
|
14
|
+
* for offline and instantaneous CLI resolution.
|
|
15
|
+
*/
|
|
16
|
+
export const SEED_MCP_SERVER_CATALOG = Object.freeze([
|
|
17
|
+
{
|
|
18
|
+
name: 'inneranimalmedia',
|
|
19
|
+
display_name: 'InnerAnimalMedia Main MCP',
|
|
20
|
+
url: 'https://mcp.inneranimalmedia.com/mcp',
|
|
21
|
+
authUrl: 'https://mcp.inneranimalmedia.com/auth/connect',
|
|
22
|
+
auth_type: 'bearer',
|
|
23
|
+
protocol: 'sse',
|
|
24
|
+
defaultClients: ['cursor', 'claude'],
|
|
25
|
+
health_status: 'healthy',
|
|
26
|
+
avg_latency_ms: 443,
|
|
27
|
+
error_rate: 0,
|
|
28
|
+
description: 'Inner Animal Media canonical MCP server (~218 tools, D1 telemetry)',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'agent_sam_bridge',
|
|
32
|
+
display_name: 'Agent Sam Bridge MCP',
|
|
33
|
+
url: 'https://mcp.inneranimalmedia.com/mcp',
|
|
34
|
+
auth_type: 'bearer',
|
|
35
|
+
protocol: 'sse',
|
|
36
|
+
defaultClients: ['cursor'],
|
|
37
|
+
health_status: 'healthy',
|
|
38
|
+
avg_latency_ms: 432,
|
|
39
|
+
error_rate: 0,
|
|
40
|
+
description: 'Agent Sam Bridge MCP',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'cloudflare-api',
|
|
44
|
+
display_name: 'Cloudflare API',
|
|
45
|
+
url: 'https://mcp.cloudflare.com/mcp',
|
|
46
|
+
auth_type: 'bearer',
|
|
47
|
+
protocol: 'sse',
|
|
48
|
+
defaultClients: ['cursor'],
|
|
49
|
+
health_status: 'degraded',
|
|
50
|
+
avg_latency_ms: 9,
|
|
51
|
+
error_rate: 0,
|
|
52
|
+
description: 'Cloudflare API (Codex registered)',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'cloudflare-docs',
|
|
56
|
+
display_name: 'Cloudflare Docs',
|
|
57
|
+
url: 'https://docs.mcp.cloudflare.com/mcp',
|
|
58
|
+
auth_type: 'none',
|
|
59
|
+
protocol: 'sse',
|
|
60
|
+
defaultClients: ['cursor'],
|
|
61
|
+
health_status: 'degraded',
|
|
62
|
+
avg_latency_ms: 10,
|
|
63
|
+
error_rate: 0,
|
|
64
|
+
description: 'Cloudflare documentation reference tools',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'cloudflare-bindings',
|
|
68
|
+
display_name: 'Cloudflare Bindings',
|
|
69
|
+
url: 'https://bindings.mcp.cloudflare.com/mcp',
|
|
70
|
+
auth_type: 'user_oauth_cloudflare',
|
|
71
|
+
protocol: 'sse',
|
|
72
|
+
defaultClients: ['cursor'],
|
|
73
|
+
health_status: 'degraded',
|
|
74
|
+
avg_latency_ms: 8,
|
|
75
|
+
error_rate: 0,
|
|
76
|
+
description: 'Cloudflare Workers storage, AI, and compute bindings',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'cloudflare-builds',
|
|
80
|
+
display_name: 'Cloudflare Builds',
|
|
81
|
+
url: 'https://builds.mcp.cloudflare.com/mcp',
|
|
82
|
+
auth_type: 'bearer',
|
|
83
|
+
protocol: 'sse',
|
|
84
|
+
defaultClients: ['cursor'],
|
|
85
|
+
health_status: 'degraded',
|
|
86
|
+
avg_latency_ms: 6,
|
|
87
|
+
error_rate: 0,
|
|
88
|
+
description: 'Cloudflare Workers Builds and CI/CD operations',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'cloudflare-observability',
|
|
92
|
+
display_name: 'Cloudflare Observability',
|
|
93
|
+
url: 'https://observability.mcp.cloudflare.com/mcp',
|
|
94
|
+
auth_type: 'bearer',
|
|
95
|
+
protocol: 'sse',
|
|
96
|
+
defaultClients: ['cursor'],
|
|
97
|
+
health_status: 'degraded',
|
|
98
|
+
avg_latency_ms: 10,
|
|
99
|
+
error_rate: 0,
|
|
100
|
+
description: 'Cloudflare logs and analytics tools',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'github-official',
|
|
104
|
+
display_name: 'GitHub (official)',
|
|
105
|
+
url: 'https://api.githubcopilot.com/mcp/',
|
|
106
|
+
auth_type: 'user_oauth_github',
|
|
107
|
+
protocol: 'sse',
|
|
108
|
+
defaultClients: ['cursor'],
|
|
109
|
+
health_status: 'degraded',
|
|
110
|
+
avg_latency_ms: 338,
|
|
111
|
+
error_rate: 0,
|
|
112
|
+
description: 'Official GitHub Copilot MCP server',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'gmail-official',
|
|
116
|
+
display_name: 'Gmail (official Google MCP)',
|
|
117
|
+
url: 'https://gmailmcp.googleapis.com/mcp/v1',
|
|
118
|
+
auth_type: 'user_oauth_gmail',
|
|
119
|
+
protocol: 'sse',
|
|
120
|
+
defaultClients: ['cursor'],
|
|
121
|
+
health_status: 'degraded',
|
|
122
|
+
avg_latency_ms: 662,
|
|
123
|
+
error_rate: 0,
|
|
124
|
+
description: 'Official Google Gmail MCP server',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: 'cf_builds',
|
|
128
|
+
display_name: 'Cloudflare Builds System',
|
|
129
|
+
url: 'internal',
|
|
130
|
+
auth_type: 'bearer',
|
|
131
|
+
protocol: 'sse',
|
|
132
|
+
defaultClients: ['cursor'],
|
|
133
|
+
health_status: 'unknown',
|
|
134
|
+
avg_latency_ms: null,
|
|
135
|
+
error_rate: 0,
|
|
136
|
+
description: 'Cloudflare internal builds system',
|
|
137
|
+
},
|
|
138
|
+
]);
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Backward compatibility dictionary mapping server_key/name to preset definition.
|
|
142
|
+
*/
|
|
143
|
+
export const MCP_PRESETS = Object.freeze(
|
|
144
|
+
Object.fromEntries(SEED_MCP_SERVER_CATALOG.map((s) => [s.name, s])),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
function clean(value) {
|
|
148
|
+
return value == null ? '' : String(value).trim();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function homeDirectory(options = {}) {
|
|
152
|
+
return path.resolve(clean(options.home) || clean(options.env?.HOME) || clean(options.env?.USERPROFILE) || os.homedir());
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function getMcpDir(options = {}) {
|
|
156
|
+
return path.join(homeDirectory(options), '.agentsam', 'mcp');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function getServerCatalogCachePath(options = {}) {
|
|
160
|
+
return path.join(getMcpDir(options), 'server-catalog-cache.json');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function loadCachedServerCatalog(options = {}) {
|
|
164
|
+
try {
|
|
165
|
+
const cacheFile = getServerCatalogCachePath(options);
|
|
166
|
+
if (!fs.existsSync(cacheFile)) return null;
|
|
167
|
+
const raw = fs.readFileSync(cacheFile, 'utf8');
|
|
168
|
+
const parsed = JSON.parse(raw);
|
|
169
|
+
if (parsed && Array.isArray(parsed.servers)) {
|
|
170
|
+
return {
|
|
171
|
+
schema_version: parsed.schema_version,
|
|
172
|
+
fetched_at: parsed.fetched_at || null,
|
|
173
|
+
servers: parsed.servers.filter((s) => Number(s.is_active ?? 1) !== 0),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
} catch {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function writeCachedServerCatalog(servers = [], options = {}) {
|
|
183
|
+
const cacheFile = getServerCatalogCachePath(options);
|
|
184
|
+
fs.mkdirSync(path.dirname(cacheFile), { recursive: true });
|
|
185
|
+
const payload = {
|
|
186
|
+
schema_version: SERVER_CATALOG_CACHE_SCHEMA,
|
|
187
|
+
fetched_at: new Date().toISOString(),
|
|
188
|
+
servers: Array.isArray(servers) ? servers : [],
|
|
189
|
+
};
|
|
190
|
+
fs.writeFileSync(cacheFile, JSON.stringify(payload, null, 2) + '\n', 'utf8');
|
|
191
|
+
return payload;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export async function fetchMcpServerCatalog(options = {}) {
|
|
195
|
+
const url = options.catalogUrl || DEFAULT_SERVER_CATALOG_URL;
|
|
196
|
+
const timeoutMs = options.timeoutMs || 5000;
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
const controller = new AbortController();
|
|
200
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
201
|
+
const res = await fetch(url, {
|
|
202
|
+
signal: controller.signal,
|
|
203
|
+
headers: { Accept: 'application/json' },
|
|
204
|
+
});
|
|
205
|
+
clearTimeout(timer);
|
|
206
|
+
|
|
207
|
+
if (res.ok) {
|
|
208
|
+
const body = await res.json();
|
|
209
|
+
if (body?.ok && Array.isArray(body.servers)) {
|
|
210
|
+
writeCachedServerCatalog(body.servers, options);
|
|
211
|
+
return body.servers.filter((s) => Number(s.is_active ?? 1) !== 0);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
} catch {
|
|
215
|
+
// Network failure / timeout — fall through to cache
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const cached = loadCachedServerCatalog(options);
|
|
219
|
+
if (cached?.servers?.length) {
|
|
220
|
+
return cached.servers;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return SEED_MCP_SERVER_CATALOG;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function listKnownServers(options = {}) {
|
|
227
|
+
const cached = loadCachedServerCatalog(options);
|
|
228
|
+
if (cached?.servers?.length) {
|
|
229
|
+
return cached.servers;
|
|
230
|
+
}
|
|
231
|
+
return SEED_MCP_SERVER_CATALOG;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function resolveServerPreset(name, options = {}) {
|
|
235
|
+
const cleanName = clean(name).toLowerCase();
|
|
236
|
+
if (!cleanName) return null;
|
|
237
|
+
|
|
238
|
+
const catalog = listKnownServers(options);
|
|
239
|
+
const found = catalog.find((s) => (s.name || s.server_key || '').toLowerCase() === cleanName);
|
|
240
|
+
if (found) {
|
|
241
|
+
return {
|
|
242
|
+
name: found.name || found.server_key,
|
|
243
|
+
display_name: found.display_name || found.name || found.server_key,
|
|
244
|
+
url: found.url,
|
|
245
|
+
authUrl: found.authUrl || (found.name === 'inneranimalmedia' ? 'https://mcp.inneranimalmedia.com/auth/connect' : null),
|
|
246
|
+
auth_type: found.auth_type || 'bearer',
|
|
247
|
+
protocol: found.protocol || 'sse',
|
|
248
|
+
defaultClients: found.defaultClients || ['cursor'],
|
|
249
|
+
health_status: found.health_status || 'unknown',
|
|
250
|
+
avg_latency_ms: found.avg_latency_ms ?? null,
|
|
251
|
+
error_rate: found.error_rate ?? 0,
|
|
252
|
+
description: found.description || found.display_name || '',
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return MCP_PRESETS[cleanName] || null;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export function getMcpServerConfigPath(name, options = {}) {
|
|
260
|
+
const safeName = clean(name).toLowerCase().replace(/[^a-z0-9_-]/g, '-');
|
|
261
|
+
if (!safeName) throw new Error('mcp_server_name_required');
|
|
262
|
+
return path.join(getMcpDir(options), `${safeName}.json`);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function ensureSecureDir(dir) {
|
|
266
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
267
|
+
if (process.platform !== 'win32') {
|
|
268
|
+
try {
|
|
269
|
+
fs.chmodSync(dir, 0o700);
|
|
270
|
+
} catch {
|
|
271
|
+
// Best-effort permissions
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export function readMcpServer(name, options = {}) {
|
|
277
|
+
try {
|
|
278
|
+
const filePath = getMcpServerConfigPath(name, options);
|
|
279
|
+
if (!fs.existsSync(filePath)) return null;
|
|
280
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
281
|
+
const parsed = JSON.parse(raw);
|
|
282
|
+
if (parsed && typeof parsed === 'object') {
|
|
283
|
+
return parsed;
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
} catch {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function writeMcpServer(name, serverConfig, options = {}) {
|
|
292
|
+
const dir = getMcpDir(options);
|
|
293
|
+
ensureSecureDir(dir);
|
|
294
|
+
|
|
295
|
+
const filePath = getMcpServerConfigPath(name, options);
|
|
296
|
+
const now = new Date().toISOString();
|
|
297
|
+
const existing = readMcpServer(name, options);
|
|
298
|
+
|
|
299
|
+
const record = {
|
|
300
|
+
schema_version: MCP_AUTHORITY_SCHEMA,
|
|
301
|
+
name: clean(name).toLowerCase(),
|
|
302
|
+
url: clean(serverConfig.url),
|
|
303
|
+
protocol: clean(serverConfig.protocol) || 'sse',
|
|
304
|
+
auth: serverConfig.auth || null,
|
|
305
|
+
clients: Array.isArray(serverConfig.clients) ? [...new Set(serverConfig.clients.map(clean).filter(Boolean))] : ['cursor'],
|
|
306
|
+
metadata: serverConfig.metadata || {},
|
|
307
|
+
created_at: existing?.created_at || now,
|
|
308
|
+
updated_at: now,
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
fs.writeFileSync(filePath, JSON.stringify(record, null, 2), {
|
|
312
|
+
mode: 0o600,
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
return record;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export function listMcpServers(options = {}) {
|
|
319
|
+
const dir = getMcpDir(options);
|
|
320
|
+
if (!fs.existsSync(dir)) return [];
|
|
321
|
+
|
|
322
|
+
const files = fs.readdirSync(dir).filter((f) => f.endsWith('.json') && !f.endsWith('-cache.json'));
|
|
323
|
+
const servers = [];
|
|
324
|
+
for (const file of files) {
|
|
325
|
+
try {
|
|
326
|
+
const parsed = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8'));
|
|
327
|
+
if (parsed && parsed.name && parsed.schema_version === MCP_AUTHORITY_SCHEMA) {
|
|
328
|
+
servers.push(parsed);
|
|
329
|
+
}
|
|
330
|
+
} catch {
|
|
331
|
+
// Ignore corrupt entries
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return servers.sort((a, b) => a.name.localeCompare(b.name));
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
export function deleteMcpServer(name, options = {}) {
|
|
338
|
+
try {
|
|
339
|
+
const filePath = getMcpServerConfigPath(name, options);
|
|
340
|
+
if (fs.existsSync(filePath)) {
|
|
341
|
+
fs.unlinkSync(filePath);
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
return false;
|
|
345
|
+
} catch {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
}
|