@inneranimalmedia/agentsam-sdk 2.6.2 → 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/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/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 +3 -2
- 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/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/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 +117 -9
- 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/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/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 +118 -37
- package/src/commands/resume.js +9 -5
- package/src/commands/runtime-status.js +154 -0
- package/src/commands/shell.js +466 -55
- package/src/commands/status.js +82 -7
- package/src/commands/tunnel.js +228 -195
- package/src/commands/whoami.js +78 -6
- 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 -51
- 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 +8 -2
- package/src/lib/agent-instructions.js +3 -0
- package/src/lib/auth.js +7 -3
- 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 +37 -18
- package/src/lib/deploy/local-studio.js +6 -5
- 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 +73 -11
- 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 +9 -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 +24 -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 +11 -4
- package/src/ui/wireframes.js +166 -0
- package/test/account-session.test.mjs +28 -0
- package/test/apps-scaffold-contract.test.mjs +16 -1
- 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/shell.test.mjs +149 -4
- package/test/smoke.mjs +2 -2
- package/test/tools-search.test.mjs +33 -0
- package/test/unit/website-assets-bindings.test.mjs +60 -0
- package/test/whoami-resume.test.mjs +82 -3
- package/examples/gorilla-shell/README.md +0 -15
- package/src/lib/gorilla-template.js +0 -54
- 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/cli.js
CHANGED
|
@@ -11,6 +11,7 @@ import { printContextSummary } from './lib/detect-context.js';
|
|
|
11
11
|
import { runStartLocal } from './commands/start-local.js';
|
|
12
12
|
import { runOllama } from './commands/ollama.js';
|
|
13
13
|
import { runModels } from './commands/models.js';
|
|
14
|
+
import { runApp } from './commands/app.js';
|
|
14
15
|
import { runProviders } from './commands/providers.js';
|
|
15
16
|
import { runEnv } from './commands/env.js';
|
|
16
17
|
import { runTunnel } from './commands/tunnel.js';
|
|
@@ -23,6 +24,8 @@ import { runDb } from './commands/db.js';
|
|
|
23
24
|
import { runStatus } from './commands/status.js';
|
|
24
25
|
import { runInteractive } from './commands/interactive.js';
|
|
25
26
|
import { runShell } from './commands/shell.js';
|
|
27
|
+
import { runGoap } from './commands/goap.js';
|
|
28
|
+
import { runBrand, runPlan } from './commands/brand.js';
|
|
26
29
|
import { runDockerize } from './commands/dockerize.js';
|
|
27
30
|
import { runMini } from './commands/mini.js';
|
|
28
31
|
import { runMerkle } from './commands/merkle.js';
|
|
@@ -32,10 +35,13 @@ import { runRecon } from './commands/recon.js';
|
|
|
32
35
|
import { runCad } from './commands/cad.js';
|
|
33
36
|
import { runSkills } from './commands/skills.js';
|
|
34
37
|
import { runEval } from './commands/eval.js';
|
|
38
|
+
import { runMcp } from './commands/mcp.js';
|
|
35
39
|
import { runCloudflare } from './commands/cloudflare.js';
|
|
40
|
+
import { runGo } from './commands/go.js';
|
|
36
41
|
import { runWhoami } from './commands/whoami.js';
|
|
37
42
|
import { runResume } from './commands/resume.js';
|
|
38
43
|
import { runLogin, runLogout } from './commands/account-auth.js';
|
|
44
|
+
import { runPlugins } from './commands/plugins.js';
|
|
39
45
|
import { applyPresetSelection, runAdd, runCapabilities, runDev, runInspect } from './commands/product.js';
|
|
40
46
|
import { listPresets, resolvePreset } from './presets/index.js';
|
|
41
47
|
import fs from 'node:fs';
|
|
@@ -43,6 +49,7 @@ import { repositoryRoot } from './knowledge/config.js';
|
|
|
43
49
|
import { resolveAccountAuth } from './lib/account-session.js';
|
|
44
50
|
import { renderDiagnosticError } from './errors/index.js';
|
|
45
51
|
import { renderHelpOverview, runHelp } from './ui/cli/help.js';
|
|
52
|
+
import { hydrateSecureCredentials } from './security/local-vault.js';
|
|
46
53
|
|
|
47
54
|
const VERSION = pkg.version;
|
|
48
55
|
|
|
@@ -65,8 +72,11 @@ function printLegacyHelp() {
|
|
|
65
72
|
agentsam Enter the interactive Agent Sam experience
|
|
66
73
|
agentsam create <name> --preset <fullstack|cms|prototype|data>
|
|
67
74
|
agentsam add <auth|cms|knowledge|agent|deploy-cloudflare>
|
|
75
|
+
agentsam plugins list|install|connect|status|remove [@agentsam-mcp]
|
|
68
76
|
agentsam dev Run this project's existing npm dev script
|
|
69
77
|
agentsam inspect [--json] Bounded repository index by default; use --view full for authority envelope
|
|
78
|
+
agentsam brand [scan|…] Deterministic brand intelligence on repository.snapshot authority
|
|
79
|
+
agentsam plan brand Composable brand normalization plan (--goap optional)
|
|
70
80
|
agentsam deploy Graduate an AgentSam project intentionally
|
|
71
81
|
|
|
72
82
|
Capability discovery:
|
|
@@ -80,12 +90,13 @@ function printLegacyHelp() {
|
|
|
80
90
|
agentsam search "query" Retrieve indexed code/text; --semantic enables embeddings
|
|
81
91
|
agentsam repo snapshot Git composition/churn; --save retains observations
|
|
82
92
|
agentsam cad blender Programmatic Blender inspect/build/render/export (--help)
|
|
93
|
+
agentsam cad project Editable CAD project tools/workflows (--help)
|
|
83
94
|
agentsam mini <name> Create and preview a small local gadget (--help for options)
|
|
84
95
|
agentsam merkle File integrity, snapshots, comparisons, and interactive explorer (--help)
|
|
85
96
|
agentsam deploy-receipt Merkle deploy/checkpoint capture + promote/failure receipts (--help)
|
|
86
97
|
agentsam recon Bounded-worker task packets + finding-report validation (--help)
|
|
87
98
|
agentsam security Dependency scan, log triage, and verified repair (--help)
|
|
88
|
-
agentsam status [--json]
|
|
99
|
+
agentsam status [--json] [-i] Honest awareness: account + models + terminal + live Worker
|
|
89
100
|
agentsam db init|status Manage the project-local SQLite database
|
|
90
101
|
agentsam models Verify configured providers and selectable hosted/local models
|
|
91
102
|
agentsam providers Configure, verify, and remove machine provider credentials
|
|
@@ -96,14 +107,16 @@ function printLegacyHelp() {
|
|
|
96
107
|
agentsam resume [session] Resume a saved Agent Sam session; omit id for picker
|
|
97
108
|
agentsam eval context Offline context-strategy/economics fixtures (--help)
|
|
98
109
|
agentsam cloudflare Native Wrangler reads + Worker CPU profile analysis (--help)
|
|
110
|
+
agentsam go Go runtime discovery/build/deploy (Cloudflare worker-container)
|
|
99
111
|
agentsam start-local Local PTY on ws://127.0.0.1:3099 (no tunnel, no Cloudflare)
|
|
100
112
|
agentsam ollama Opt-in local Ollama setup/status/model management
|
|
101
113
|
agentsam shell Interactive Agent Sam slash-command shell
|
|
102
|
-
agentsam tunnel
|
|
114
|
+
agentsam tunnel Choose/list/inspect/run real Cloudflare Tunnels via Wrangler
|
|
103
115
|
agentsam deploy Graduate to Cloudflare / GCP when ready
|
|
104
116
|
agentsam dockerize Build/run app, knowledge, or CAD containers (--help)
|
|
105
117
|
agentsam identity preview Preview the reusable local auth portal (not production login)
|
|
106
|
-
agentsam identity init
|
|
118
|
+
agentsam identity init Scaffold identity app (+ optional --provider)
|
|
119
|
+
agentsam identity providers|plan|schema|resolve Protocol-driven identity surfaces
|
|
107
120
|
agentsam help
|
|
108
121
|
agentsam --version
|
|
109
122
|
agentsam --help
|
|
@@ -131,11 +144,13 @@ function printLegacyHelp() {
|
|
|
131
144
|
Run agentsam from any project to enter the account-aware interactive experience.
|
|
132
145
|
Account, model-provider, terminal, and deploy permissions are requested only when the related capability needs them.
|
|
133
146
|
|
|
134
|
-
Tunnel
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
147
|
+
Tunnel commands:
|
|
148
|
+
agentsam tunnel Guided picker over Wrangler-visible tunnels
|
|
149
|
+
agentsam tunnel list List real Cloudflare Tunnels
|
|
150
|
+
agentsam tunnel info <id> Inspect one tunnel
|
|
151
|
+
agentsam tunnel run <id> Run/start a connector on this machine
|
|
152
|
+
agentsam tunnel create <name>
|
|
153
|
+
agentsam tunnel quick-start [url]
|
|
139
154
|
|
|
140
155
|
Init options:
|
|
141
156
|
--name <name> Project directory name
|
|
@@ -300,6 +315,8 @@ async function initFromArgs(argv) {
|
|
|
300
315
|
const command = process.argv[2];
|
|
301
316
|
const rest = process.argv.slice(3);
|
|
302
317
|
|
|
318
|
+
hydrateSecureCredentials(process.env);
|
|
319
|
+
|
|
303
320
|
if (command === '--version' || command === '-v') {
|
|
304
321
|
console.log(VERSION);
|
|
305
322
|
} else if (command === 'help') {
|
|
@@ -333,6 +350,12 @@ if (command === '--version' || command === '-v') {
|
|
|
333
350
|
} else if (command === 'add') {
|
|
334
351
|
try { await runAdd(rest); }
|
|
335
352
|
catch (e) { reportCliError(e); process.exitCode = 1; }
|
|
353
|
+
} else if (command === 'plugins') {
|
|
354
|
+
try { await runPlugins(rest); }
|
|
355
|
+
catch (e) { reportCliError(e); process.exitCode = 1; }
|
|
356
|
+
} else if (command === 'install' && rest[0] === 'plugins') {
|
|
357
|
+
try { await runPlugins(['install', rest[1] || 'agentsam-mcp', ...rest.slice(2)]); }
|
|
358
|
+
catch (e) { reportCliError(e); process.exitCode = 1; }
|
|
336
359
|
} else if (command === 'dev') {
|
|
337
360
|
try { await runDev(rest); }
|
|
338
361
|
catch (e) { reportCliError(e); process.exitCode = 1; }
|
|
@@ -370,6 +393,13 @@ if (command === '--version' || command === '-v') {
|
|
|
370
393
|
reportCliError(e);
|
|
371
394
|
process.exit(1);
|
|
372
395
|
}
|
|
396
|
+
} else if (command === 'app' || command === 'apps') {
|
|
397
|
+
try {
|
|
398
|
+
await runApp(rest);
|
|
399
|
+
} catch (e) {
|
|
400
|
+
reportCliError(e);
|
|
401
|
+
process.exit(1);
|
|
402
|
+
}
|
|
373
403
|
} else if (command === 'providers') {
|
|
374
404
|
try {
|
|
375
405
|
await runProviders(rest);
|
|
@@ -391,6 +421,13 @@ if (command === '--version' || command === '-v') {
|
|
|
391
421
|
reportCliError(e);
|
|
392
422
|
process.exit(1);
|
|
393
423
|
}
|
|
424
|
+
} else if (command === 'mcp') {
|
|
425
|
+
try {
|
|
426
|
+
await runMcp(rest);
|
|
427
|
+
} catch (e) {
|
|
428
|
+
reportCliError(e);
|
|
429
|
+
process.exitCode = 1;
|
|
430
|
+
}
|
|
394
431
|
} else if (command === 'cloudflare' || command === 'cf') {
|
|
395
432
|
try {
|
|
396
433
|
await runCloudflare(rest);
|
|
@@ -398,6 +435,13 @@ if (command === '--version' || command === '-v') {
|
|
|
398
435
|
if (!e?.reported) reportCliError(e);
|
|
399
436
|
process.exitCode = 1;
|
|
400
437
|
}
|
|
438
|
+
} else if (command === 'go') {
|
|
439
|
+
try {
|
|
440
|
+
await runGo(rest);
|
|
441
|
+
} catch (e) {
|
|
442
|
+
if (!e?.reported) reportCliError(e);
|
|
443
|
+
process.exitCode = 1;
|
|
444
|
+
}
|
|
401
445
|
} else if (command === 'login') {
|
|
402
446
|
try {
|
|
403
447
|
await runLogin(rest);
|
|
@@ -433,6 +477,30 @@ if (command === '--version' || command === '-v') {
|
|
|
433
477
|
reportCliError(e);
|
|
434
478
|
process.exit(1);
|
|
435
479
|
}
|
|
480
|
+
} else if (command === 'goap') {
|
|
481
|
+
try {
|
|
482
|
+
await runGoap(rest[0], {
|
|
483
|
+
cwd: process.cwd(),
|
|
484
|
+
json: rest.includes('--json'), args: rest.slice(1),
|
|
485
|
+
});
|
|
486
|
+
} catch (e) {
|
|
487
|
+
reportCliError(e);
|
|
488
|
+
process.exitCode = 1;
|
|
489
|
+
}
|
|
490
|
+
} else if (command === 'brand') {
|
|
491
|
+
try {
|
|
492
|
+
await runBrand(rest);
|
|
493
|
+
} catch (e) {
|
|
494
|
+
reportCliError(e);
|
|
495
|
+
process.exitCode = 1;
|
|
496
|
+
}
|
|
497
|
+
} else if (command === 'plan') {
|
|
498
|
+
try {
|
|
499
|
+
await runPlan(rest);
|
|
500
|
+
} catch (e) {
|
|
501
|
+
reportCliError(e);
|
|
502
|
+
process.exitCode = 1;
|
|
503
|
+
}
|
|
436
504
|
} else if (command === 'start-local') {
|
|
437
505
|
await runStartLocal({});
|
|
438
506
|
} else if (command === 'ollama') {
|
|
@@ -499,6 +567,9 @@ if (command === '--version' || command === '-v') {
|
|
|
499
567
|
reportCliError(e);
|
|
500
568
|
process.exitCode = 1;
|
|
501
569
|
}
|
|
570
|
+
} else if (command === 'autorag') {
|
|
571
|
+
try { await (await import('./commands/autorag.js')).runAutoRag(rest); }
|
|
572
|
+
catch (e) { reportCliError(e); process.exitCode = 1; }
|
|
502
573
|
} else if (['index', 'search', 'repo'].includes(command)) {
|
|
503
574
|
try {
|
|
504
575
|
const commands = await import('./commands/knowledge.js');
|
|
@@ -514,6 +585,7 @@ if (command === '--version' || command === '-v') {
|
|
|
514
585
|
} catch (e) { reportCliError(e); process.exitCode = 1; }
|
|
515
586
|
} else if (command === 'identity') {
|
|
516
587
|
const sub = rest[0];
|
|
588
|
+
const identityProtocol = await import('./commands/identity-protocol.js');
|
|
517
589
|
if (sub === 'preview') {
|
|
518
590
|
try {
|
|
519
591
|
await runIdentityPreview(rest.slice(1));
|
|
@@ -528,8 +600,44 @@ if (command === '--version' || command === '-v') {
|
|
|
528
600
|
reportCliError(e);
|
|
529
601
|
process.exit(1);
|
|
530
602
|
}
|
|
603
|
+
} else if (sub === 'providers') {
|
|
604
|
+
try {
|
|
605
|
+
await identityProtocol.runIdentityProviders(rest.slice(1));
|
|
606
|
+
} catch (e) {
|
|
607
|
+
reportCliError(e);
|
|
608
|
+
process.exit(1);
|
|
609
|
+
}
|
|
610
|
+
} else if (sub === 'plan') {
|
|
611
|
+
try {
|
|
612
|
+
await identityProtocol.runIdentityPlan(rest.slice(1));
|
|
613
|
+
} catch (e) {
|
|
614
|
+
reportCliError(e);
|
|
615
|
+
process.exit(1);
|
|
616
|
+
}
|
|
617
|
+
} else if (sub === 'schema') {
|
|
618
|
+
try {
|
|
619
|
+
await identityProtocol.runIdentitySchema(rest.slice(1));
|
|
620
|
+
} catch (e) {
|
|
621
|
+
reportCliError(e);
|
|
622
|
+
process.exit(1);
|
|
623
|
+
}
|
|
624
|
+
} else if (sub === 'resolve') {
|
|
625
|
+
try {
|
|
626
|
+
await identityProtocol.runIdentityResolve(rest.slice(1));
|
|
627
|
+
} catch (e) {
|
|
628
|
+
reportCliError(e);
|
|
629
|
+
process.exit(1);
|
|
630
|
+
}
|
|
531
631
|
} else {
|
|
532
|
-
|
|
632
|
+
identityProtocol.printIdentityHelp();
|
|
633
|
+
process.exit(1);
|
|
634
|
+
}
|
|
635
|
+
} else if (command === 'scaffold') {
|
|
636
|
+
try {
|
|
637
|
+
const { runScaffold } = await import('./lib/scaffold/index.js');
|
|
638
|
+
await runScaffold(rest[0] ?? null);
|
|
639
|
+
} catch (e) {
|
|
640
|
+
reportCliError(e);
|
|
533
641
|
process.exit(1);
|
|
534
642
|
}
|
|
535
643
|
} else {
|
package/src/cloudflare/index.js
CHANGED
|
@@ -6,6 +6,12 @@ export {
|
|
|
6
6
|
parseWranglerErrorEvidence,
|
|
7
7
|
runWranglerNative,
|
|
8
8
|
} from './wrangler.js';
|
|
9
|
+
export {
|
|
10
|
+
readCloudflareDeploymentContract,
|
|
11
|
+
collectCloudflareDeploymentStatus,
|
|
12
|
+
parseWranglerToml,
|
|
13
|
+
resolveProjectD1Database,
|
|
14
|
+
} from './runtime-status.js';
|
|
9
15
|
export {
|
|
10
16
|
summarizeCloudflareCpuProfile,
|
|
11
17
|
summarizeCloudflareCpuProfileFile,
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { runWranglerNative } from './wrangler.js';
|
|
4
|
+
|
|
5
|
+
function clean(value) { return value == null ? '' : String(value).trim(); }
|
|
6
|
+
|
|
7
|
+
function parseJsonc(source) {
|
|
8
|
+
let output = '';
|
|
9
|
+
let string = false;
|
|
10
|
+
let escaped = false;
|
|
11
|
+
let lineComment = false;
|
|
12
|
+
let blockComment = false;
|
|
13
|
+
for (let index = 0; index < source.length; index += 1) {
|
|
14
|
+
const char = source[index];
|
|
15
|
+
const next = source[index + 1];
|
|
16
|
+
if (lineComment) {
|
|
17
|
+
if (char === '\n') { lineComment = false; output += char; }
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (blockComment) {
|
|
21
|
+
if (char === '*' && next === '/') { blockComment = false; index += 1; }
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (string) {
|
|
25
|
+
output += char;
|
|
26
|
+
if (escaped) escaped = false;
|
|
27
|
+
else if (char === '\\') escaped = true;
|
|
28
|
+
else if (char === '"') string = false;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (char === '"') { string = true; output += char; continue; }
|
|
32
|
+
if (char === '/' && next === '/') { lineComment = true; index += 1; continue; }
|
|
33
|
+
if (char === '/' && next === '*') { blockComment = true; index += 1; continue; }
|
|
34
|
+
output += char;
|
|
35
|
+
}
|
|
36
|
+
return JSON.parse(output.replace(/,\s*([}\]])/g, '$1'));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function parseWranglerToml(source = '') {
|
|
40
|
+
const result = { vars: {}, d1_databases: [], r2_buckets: [], hyperdrive: [], kv_namespaces: [], services: [] };
|
|
41
|
+
const lines = source.split(/\r?\n/);
|
|
42
|
+
let currentSection = '';
|
|
43
|
+
let currentBlock = null;
|
|
44
|
+
|
|
45
|
+
for (let line of lines) {
|
|
46
|
+
line = line.replace(/#.*$/, '').trim();
|
|
47
|
+
if (!line) continue;
|
|
48
|
+
|
|
49
|
+
const arrMatch = line.match(/^\[\[([a-zA-Z0-9_.]+)\]\]$/);
|
|
50
|
+
if (arrMatch) {
|
|
51
|
+
currentSection = arrMatch[1];
|
|
52
|
+
currentBlock = {};
|
|
53
|
+
if (currentSection === 'd1_databases') result.d1_databases.push(currentBlock);
|
|
54
|
+
else if (currentSection === 'r2_buckets') result.r2_buckets.push(currentBlock);
|
|
55
|
+
else if (currentSection === 'hyperdrive') result.hyperdrive.push(currentBlock);
|
|
56
|
+
else if (currentSection === 'kv_namespaces') result.kv_namespaces.push(currentBlock);
|
|
57
|
+
else if (currentSection === 'services') result.services.push(currentBlock);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const tableMatch = line.match(/^\[([a-zA-Z0-9_.]+)\]$/);
|
|
62
|
+
if (tableMatch) {
|
|
63
|
+
currentSection = tableMatch[1];
|
|
64
|
+
currentBlock = null;
|
|
65
|
+
if (currentSection === 'ai' && !result.ai) result.ai = {};
|
|
66
|
+
if (currentSection === 'assets' && !result.assets) result.assets = {};
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const kvMatch = line.match(/^([a-zA-Z0-9_.-]+)\s*=\s*(.*)$/);
|
|
71
|
+
if (kvMatch) {
|
|
72
|
+
const key = kvMatch[1].trim();
|
|
73
|
+
let rawVal = kvMatch[2].trim();
|
|
74
|
+
let val = rawVal;
|
|
75
|
+
if ((rawVal.startsWith('"') && rawVal.endsWith('"')) || (rawVal.startsWith("'") && rawVal.endsWith("'"))) {
|
|
76
|
+
val = rawVal.slice(1, -1);
|
|
77
|
+
} else if (rawVal === 'true') {
|
|
78
|
+
val = true;
|
|
79
|
+
} else if (rawVal === 'false') {
|
|
80
|
+
val = false;
|
|
81
|
+
} else if (/^\d+$/.test(rawVal)) {
|
|
82
|
+
val = parseInt(rawVal, 10);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (currentBlock) {
|
|
86
|
+
currentBlock[key] = val;
|
|
87
|
+
} else if (currentSection === 'vars') {
|
|
88
|
+
result.vars[key] = val;
|
|
89
|
+
} else if (currentSection === 'ai') {
|
|
90
|
+
result.ai[key] = val;
|
|
91
|
+
} else if (currentSection === 'assets') {
|
|
92
|
+
result.assets[key] = val;
|
|
93
|
+
} else if (!currentSection) {
|
|
94
|
+
result[key] = val;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function declaredBindings(config = {}) {
|
|
102
|
+
const rows = [];
|
|
103
|
+
const add = (row = {}) => {
|
|
104
|
+
const name = clean(row.name);
|
|
105
|
+
if (name) rows.push({ ...row, name });
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
for (const [name, value] of Object.entries(config.vars || {})) {
|
|
109
|
+
add({
|
|
110
|
+
name,
|
|
111
|
+
type: typeof value === 'object' && value !== null ? 'json' : 'plain_text',
|
|
112
|
+
value: typeof value === 'object' && value !== null ? JSON.stringify(value) : String(value),
|
|
113
|
+
source: 'wrangler_config',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
for (const name of config.secrets?.required || []) {
|
|
118
|
+
add({ name, type: 'secret_text', encrypted: true, source: 'wrangler_required_secret' });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
for (const row of config.d1_databases || []) add({
|
|
122
|
+
name: row?.binding,
|
|
123
|
+
type: 'd1',
|
|
124
|
+
database_name: clean(row?.database_name) || null,
|
|
125
|
+
database_id: clean(row?.database_id) || null,
|
|
126
|
+
source: 'wrangler_config',
|
|
127
|
+
});
|
|
128
|
+
for (const row of config.hyperdrive || []) add({
|
|
129
|
+
name: row?.binding,
|
|
130
|
+
type: 'hyperdrive',
|
|
131
|
+
id: clean(row?.id) || null,
|
|
132
|
+
source: 'wrangler_config',
|
|
133
|
+
});
|
|
134
|
+
for (const row of config.r2_buckets || []) add({
|
|
135
|
+
name: row?.binding,
|
|
136
|
+
type: 'r2_bucket',
|
|
137
|
+
bucket_name: clean(row?.bucket_name) || null,
|
|
138
|
+
source: 'wrangler_config',
|
|
139
|
+
});
|
|
140
|
+
for (const row of config.services || []) add({
|
|
141
|
+
name: row?.binding,
|
|
142
|
+
type: 'service',
|
|
143
|
+
service: clean(row?.service) || null,
|
|
144
|
+
environment: clean(row?.environment) || null,
|
|
145
|
+
entrypoint: clean(row?.entrypoint) || null,
|
|
146
|
+
source: 'wrangler_config',
|
|
147
|
+
});
|
|
148
|
+
for (const row of config.vpc_services || []) add({
|
|
149
|
+
name: row?.binding,
|
|
150
|
+
type: 'vpc_service',
|
|
151
|
+
service_id: clean(row?.service_id) || null,
|
|
152
|
+
source: 'wrangler_config',
|
|
153
|
+
});
|
|
154
|
+
if (config.ai?.binding) add({ name: config.ai.binding, type: 'ai', source: 'wrangler_config' });
|
|
155
|
+
if (config.assets?.binding) add({
|
|
156
|
+
name: config.assets.binding,
|
|
157
|
+
type: 'assets',
|
|
158
|
+
directory: clean(config.assets?.directory) || null,
|
|
159
|
+
source: 'wrangler_config',
|
|
160
|
+
});
|
|
161
|
+
for (const row of config.kv_namespaces || []) add({
|
|
162
|
+
name: row?.binding,
|
|
163
|
+
type: 'kv_namespace',
|
|
164
|
+
id: clean(row?.id) || null,
|
|
165
|
+
source: 'wrangler_config',
|
|
166
|
+
});
|
|
167
|
+
for (const row of config.vectorize || []) add({
|
|
168
|
+
name: row?.binding,
|
|
169
|
+
type: 'vectorize',
|
|
170
|
+
index_name: clean(row?.index_name) || null,
|
|
171
|
+
source: 'wrangler_config',
|
|
172
|
+
});
|
|
173
|
+
const queueProducers = Array.isArray(config.queues?.producers) ? config.queues.producers : [];
|
|
174
|
+
for (const row of queueProducers) add({
|
|
175
|
+
name: row?.binding,
|
|
176
|
+
type: 'queue',
|
|
177
|
+
queue_name: clean(row?.queue) || null,
|
|
178
|
+
source: 'wrangler_config',
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
return rows.sort((left, right) => left.name.localeCompare(right.name));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function safeLiveBinding(row = {}) {
|
|
185
|
+
const name = clean(row?.name);
|
|
186
|
+
const type = clean(row?.type);
|
|
187
|
+
if (!name) return null;
|
|
188
|
+
|
|
189
|
+
const output = { name, type: type || 'unknown', source: 'cloudflare_live_version' };
|
|
190
|
+
if (type === 'secret_text' || type === 'secret_key') {
|
|
191
|
+
output.encrypted = true;
|
|
192
|
+
return output;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (type === 'plain_text') {
|
|
196
|
+
const value = row?.text ?? row?.value;
|
|
197
|
+
if (value != null) output.value = String(value);
|
|
198
|
+
} else if (type === 'json') {
|
|
199
|
+
const value = row?.json ?? row?.value;
|
|
200
|
+
if (value != null) output.value = typeof value === 'string' ? value : JSON.stringify(value);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
for (const key of [
|
|
204
|
+
'id',
|
|
205
|
+
'database_id',
|
|
206
|
+
'database_name',
|
|
207
|
+
'bucket_name',
|
|
208
|
+
'service',
|
|
209
|
+
'environment',
|
|
210
|
+
'entrypoint',
|
|
211
|
+
'service_id',
|
|
212
|
+
'index_name',
|
|
213
|
+
'namespace',
|
|
214
|
+
'class_name',
|
|
215
|
+
'script_name',
|
|
216
|
+
'store_id',
|
|
217
|
+
'secret_name',
|
|
218
|
+
]) {
|
|
219
|
+
const value = row?.[key];
|
|
220
|
+
if (value != null && clean(value)) output[key] = clean(value);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return output;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function bindingCategory(row = {}) {
|
|
227
|
+
const type = clean(row?.type);
|
|
228
|
+
if (type === 'secret_text' || type === 'secret_key') return 'secret';
|
|
229
|
+
if (type === 'plain_text' || type === 'json') return 'variable';
|
|
230
|
+
return 'resource';
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export function readCloudflareDeploymentContract(root, projectConfig = {}) {
|
|
234
|
+
const deployment = projectConfig?.deployment?.cloudflare || {};
|
|
235
|
+
let workerName = clean(deployment.worker_name);
|
|
236
|
+
let relativeConfig = clean(deployment.config);
|
|
237
|
+
let configPath = relativeConfig ? path.resolve(root, relativeConfig) : null;
|
|
238
|
+
|
|
239
|
+
// Auto-discover candidate wrangler config when not explicitly specified
|
|
240
|
+
if (!workerName && !configPath) {
|
|
241
|
+
const candidates = [
|
|
242
|
+
'wrangler.jsonc',
|
|
243
|
+
'wrangler.json',
|
|
244
|
+
'wrangler.toml',
|
|
245
|
+
'backend/wrangler.jsonc',
|
|
246
|
+
'backend/wrangler.json',
|
|
247
|
+
'backend/wrangler.toml',
|
|
248
|
+
'worker/wrangler.jsonc',
|
|
249
|
+
'worker/wrangler.json',
|
|
250
|
+
'worker/wrangler.toml',
|
|
251
|
+
'apps/local-studio/backend/wrangler.jsonc',
|
|
252
|
+
];
|
|
253
|
+
for (const rel of candidates) {
|
|
254
|
+
const candidatePath = path.resolve(root, rel);
|
|
255
|
+
if (fs.existsSync(candidatePath)) {
|
|
256
|
+
try {
|
|
257
|
+
const raw = fs.readFileSync(candidatePath, 'utf8');
|
|
258
|
+
const parsed = rel.endsWith('.toml') ? parseWranglerToml(raw) : parseJsonc(raw);
|
|
259
|
+
if (clean(parsed?.name)) {
|
|
260
|
+
workerName = clean(parsed.name);
|
|
261
|
+
relativeConfig = rel;
|
|
262
|
+
configPath = candidatePath;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
} catch {
|
|
266
|
+
// ignore candidate error
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (!workerName && !configPath) return { configured: false, worker_name: null, config: null, bindings: [], routes: [], health_url: null };
|
|
273
|
+
if (!workerName || !configPath) throw new Error('cloudflare_deployment_contract_incomplete');
|
|
274
|
+
if (configPath !== path.resolve(root) && !configPath.startsWith(`${path.resolve(root)}${path.sep}`)) throw new Error('cloudflare_deployment_config_outside_project');
|
|
275
|
+
const rawSource = fs.readFileSync(configPath, 'utf8');
|
|
276
|
+
const parsed = configPath.endsWith('.toml') ? parseWranglerToml(rawSource) : parseJsonc(rawSource);
|
|
277
|
+
if (clean(parsed.name) !== workerName) throw new Error(`cloudflare_worker_name_mismatch:${workerName}:${clean(parsed.name) || 'missing'}`);
|
|
278
|
+
const routes = (parsed.routes || []).map((row) => typeof row === 'string' ? row : clean(row?.pattern)).filter(Boolean);
|
|
279
|
+
const customDomain = routes.find((value) => !value.includes('*')) || '';
|
|
280
|
+
return {
|
|
281
|
+
configured: true,
|
|
282
|
+
worker_name: workerName,
|
|
283
|
+
config: relativeConfig,
|
|
284
|
+
config_path: configPath,
|
|
285
|
+
bindings: declaredBindings(parsed),
|
|
286
|
+
routes,
|
|
287
|
+
health_url: clean(deployment.health_url) || (customDomain ? `https://${customDomain}/health` : null),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function resolveProjectD1Database(root = process.cwd()) {
|
|
292
|
+
try {
|
|
293
|
+
const contract = readCloudflareDeploymentContract(root);
|
|
294
|
+
if (contract?.bindings) {
|
|
295
|
+
const dbBinding = contract.bindings.find((b) => b.name === 'DB' && b.type === 'd1')
|
|
296
|
+
|| contract.bindings.find((b) => b.type === 'd1');
|
|
297
|
+
if (dbBinding) {
|
|
298
|
+
return clean(dbBinding.database_name) || clean(dbBinding.name) || '';
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
} catch {
|
|
302
|
+
// ignore
|
|
303
|
+
}
|
|
304
|
+
return clean(process.env.DB) || '';
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function newest(rows = [], dateAt) {
|
|
308
|
+
return [...rows].sort((left, right) => Date.parse(dateAt(right) || 0) - Date.parse(dateAt(left) || 0))[0] || null;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async function probeHealth(url, fetchImpl) {
|
|
312
|
+
if (!url) return { configured: false, ok: null, status: null, url: null, data: null, error: null };
|
|
313
|
+
try {
|
|
314
|
+
const response = await fetchImpl(url, { headers: { accept: 'application/json' }, signal: AbortSignal.timeout(8_000) });
|
|
315
|
+
const data = await response.json().catch(() => null);
|
|
316
|
+
return { configured: true, ok: response.ok && data?.ok !== false, status: response.status, url, data, error: null };
|
|
317
|
+
} catch (error) {
|
|
318
|
+
return { configured: true, ok: false, status: null, url, data: null, error: error?.message || String(error) };
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
export async function collectCloudflareDeploymentStatus(options = {}) {
|
|
323
|
+
const root = path.resolve(options.root || options.cwd || process.cwd());
|
|
324
|
+
let contract;
|
|
325
|
+
try {
|
|
326
|
+
contract = readCloudflareDeploymentContract(root, options.projectConfig || {});
|
|
327
|
+
} catch (error) {
|
|
328
|
+
return { configured: true, connected: false, contract_error: error?.message || String(error), worker_name: null, bindings: null, health: null, error: 'deployment_contract_invalid' };
|
|
329
|
+
}
|
|
330
|
+
if (!contract.configured) return { ...contract, connected: false, offline: options.offline === true, bindings: null, health: null, error: null };
|
|
331
|
+
if (options.offline === true) return { ...contract, connected: false, offline: true, bindings: null, health: null, error: null };
|
|
332
|
+
|
|
333
|
+
const runner = options.runWrangler || runWranglerNative;
|
|
334
|
+
const base = { cwd: root, config: contract.config, name: contract.worker_name };
|
|
335
|
+
try {
|
|
336
|
+
const [identity, deployments, versions, health] = await Promise.all([
|
|
337
|
+
runner('whoami', base),
|
|
338
|
+
runner('deployments.list', base),
|
|
339
|
+
runner('versions.list', base),
|
|
340
|
+
probeHealth(contract.health_url, options.fetchImpl || fetch),
|
|
341
|
+
]);
|
|
342
|
+
const deploymentRows = Array.isArray(deployments?.data) ? deployments.data : [];
|
|
343
|
+
const versionRows = Array.isArray(versions?.data) ? versions.data : [];
|
|
344
|
+
const activeDeployment = newest(deploymentRows, row => row?.created_on);
|
|
345
|
+
const activeVersionId = clean(activeDeployment?.versions?.find((row) => Number(row?.percentage) === 100)?.version_id)
|
|
346
|
+
|| clean(newest(versionRows, row => row?.metadata?.created_on)?.id);
|
|
347
|
+
const version = activeVersionId ? await runner('versions.view', { ...base, version_id: activeVersionId }) : null;
|
|
348
|
+
const rawLiveBindings = Array.isArray(version?.data?.resources?.bindings)
|
|
349
|
+
? version.data.resources.bindings
|
|
350
|
+
: Array.isArray(version?.data?.bindings)
|
|
351
|
+
? version.data.bindings
|
|
352
|
+
: [];
|
|
353
|
+
const liveBindings = rawLiveBindings.map(safeLiveBinding).filter(Boolean);
|
|
354
|
+
const liveByName = new Map(liveBindings.map((row) => [row.name, row]));
|
|
355
|
+
const missing = contract.bindings.filter((row) => !liveByName.has(row.name));
|
|
356
|
+
const typeMismatches = contract.bindings.filter((row) => liveByName.has(row.name) && liveByName.get(row.name).type !== row.type)
|
|
357
|
+
.map((row) => ({ name: row.name, declared: row.type, live: liveByName.get(row.name).type }));
|
|
358
|
+
const runtimeVariables = liveBindings.filter((row) => bindingCategory(row) === 'variable');
|
|
359
|
+
const runtimeSecrets = liveBindings.filter((row) => bindingCategory(row) === 'secret');
|
|
360
|
+
const resourceBindings = liveBindings.filter((row) => bindingCategory(row) === 'resource');
|
|
361
|
+
return {
|
|
362
|
+
...contract,
|
|
363
|
+
connected: true,
|
|
364
|
+
offline: false,
|
|
365
|
+
identity: identity?.data ? {
|
|
366
|
+
logged_in: identity.data.loggedIn === true,
|
|
367
|
+
auth_type: identity.data.authType || null,
|
|
368
|
+
accounts: (identity.data.accounts || []).map((row) => ({ id: row?.id || null, name: row?.name || null, type: row?.type || null })),
|
|
369
|
+
} : null,
|
|
370
|
+
deployment: activeDeployment,
|
|
371
|
+
version: version?.data ? {
|
|
372
|
+
id: version.data.id || activeVersionId,
|
|
373
|
+
number: version.data.number ?? null,
|
|
374
|
+
created_on: version.data.metadata?.created_on || null,
|
|
375
|
+
source: version.data.metadata?.source || null,
|
|
376
|
+
} : null,
|
|
377
|
+
bindings: {
|
|
378
|
+
declared: contract.bindings,
|
|
379
|
+
live: liveBindings,
|
|
380
|
+
runtime_variables: runtimeVariables,
|
|
381
|
+
runtime_secrets: runtimeSecrets,
|
|
382
|
+
resources: resourceBindings,
|
|
383
|
+
missing,
|
|
384
|
+
type_mismatches: typeMismatches,
|
|
385
|
+
match: missing.length === 0 && typeMismatches.length === 0,
|
|
386
|
+
},
|
|
387
|
+
health,
|
|
388
|
+
error: null,
|
|
389
|
+
};
|
|
390
|
+
} catch (error) {
|
|
391
|
+
return { ...contract, connected: false, offline: false, bindings: null, health: await probeHealth(contract.health_url, options.fetchImpl || fetch), error: error?.message || String(error) };
|
|
392
|
+
}
|
|
393
|
+
}
|