@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
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AgentSamErrorEnvelope } from './errors';
|
|
2
|
+
|
|
3
|
+
export type AgentExecutionStatus =
|
|
4
|
+
| 'queued'
|
|
5
|
+
| 'running'
|
|
6
|
+
| 'retrying'
|
|
7
|
+
| 'awaiting_input'
|
|
8
|
+
| 'completed'
|
|
9
|
+
| 'failed'
|
|
10
|
+
| 'cancelled'
|
|
11
|
+
| 'timed_out';
|
|
12
|
+
|
|
13
|
+
export interface AgentToolInvocation<TInput = unknown> {
|
|
14
|
+
id: string;
|
|
15
|
+
toolKey: string;
|
|
16
|
+
input: TInput;
|
|
17
|
+
requestedAt: number;
|
|
18
|
+
accountId?: string;
|
|
19
|
+
correlationId?: string;
|
|
20
|
+
causationId?: string;
|
|
21
|
+
idempotencyKey?: string;
|
|
22
|
+
metadata?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface AgentToolExecutionResult<TOutput = unknown> {
|
|
26
|
+
output?: TOutput;
|
|
27
|
+
providerRequestId?: string;
|
|
28
|
+
usage?: Record<string, unknown>;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface AgentToolExecutionReceipt<TOutput = unknown> {
|
|
33
|
+
invocationId: string;
|
|
34
|
+
toolKey: string;
|
|
35
|
+
status: AgentExecutionStatus;
|
|
36
|
+
ok: boolean;
|
|
37
|
+
attempt: number;
|
|
38
|
+
queuedAt?: number;
|
|
39
|
+
startedAt?: number;
|
|
40
|
+
completedAt?: number;
|
|
41
|
+
durationMs?: number;
|
|
42
|
+
provider?: string;
|
|
43
|
+
input?: unknown;
|
|
44
|
+
output?: TOutput;
|
|
45
|
+
error?: AgentSamErrorEnvelope;
|
|
46
|
+
emittedEventIds?: string[];
|
|
47
|
+
providerRequestId?: string;
|
|
48
|
+
usage?: Record<string, unknown>;
|
|
49
|
+
metadata?: Record<string, unknown>;
|
|
50
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export type AgentHookActionType = 'tool' | 'workflow' | 'event';
|
|
2
|
+
|
|
3
|
+
export interface AgentHookAction {
|
|
4
|
+
actionId?: string;
|
|
5
|
+
type: AgentHookActionType;
|
|
6
|
+
target: string;
|
|
7
|
+
input?: unknown;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface AgentHookDefinition {
|
|
12
|
+
hookKey: string;
|
|
13
|
+
displayName?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
eventKeys: string[];
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
filter?: Record<string, unknown>;
|
|
18
|
+
actions: AgentHookAction[];
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type AgentHookExecutionStatus =
|
|
23
|
+
| 'queued'
|
|
24
|
+
| 'running'
|
|
25
|
+
| 'completed'
|
|
26
|
+
| 'failed'
|
|
27
|
+
| 'cancelled';
|
|
28
|
+
|
|
29
|
+
export interface AgentHookExecutionReceipt {
|
|
30
|
+
executionId: string;
|
|
31
|
+
hookKey: string;
|
|
32
|
+
eventId: string;
|
|
33
|
+
status: AgentHookExecutionStatus;
|
|
34
|
+
startedAt?: number;
|
|
35
|
+
completedAt?: number;
|
|
36
|
+
durationMs?: number;
|
|
37
|
+
actionExecutionIds?: string[];
|
|
38
|
+
error?: unknown;
|
|
39
|
+
metadata?: Record<string, unknown>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity is established outside the workbench. These contracts only carry the
|
|
3
|
+
* authenticated principal into product authorization and runtime adapters.
|
|
4
|
+
*/
|
|
5
|
+
export interface AgentPrincipal {
|
|
6
|
+
accountId: string;
|
|
7
|
+
authUserId: string;
|
|
8
|
+
displayName?: string;
|
|
9
|
+
email?: string;
|
|
10
|
+
claims?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface AgentIdentityProvider {
|
|
14
|
+
getPrincipal(): AgentPrincipal | null | Promise<AgentPrincipal | null>;
|
|
15
|
+
subscribe?(onChange: (principal: AgentPrincipal | null) => void): () => void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from './agent';
|
|
2
|
+
export * from './events';
|
|
3
|
+
export * from './tools';
|
|
4
|
+
export * from './authority';
|
|
5
|
+
export * from './execution';
|
|
6
|
+
export * from './providers';
|
|
7
|
+
export * from './hooks';
|
|
8
|
+
export * from './artifacts';
|
|
9
|
+
export * from './context';
|
|
10
|
+
export * from './adapter';
|
|
11
|
+
export * from './models';
|
|
12
|
+
export * from './identity';
|
|
13
|
+
export * from './repository';
|
|
14
|
+
export * from './errors';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AgentAuthorityRequirement, AgentResolvedAuthorityReference } from './authority';
|
|
2
|
+
import type { AgentToolExecutionResult, AgentToolInvocation } from './execution';
|
|
3
|
+
import type { AgentToolDefinition } from './tools';
|
|
4
|
+
|
|
5
|
+
export interface AgentProviderDefinition {
|
|
6
|
+
providerKey: string;
|
|
7
|
+
displayName: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
capabilityKeys?: string[];
|
|
10
|
+
toolKeys?: string[];
|
|
11
|
+
authority?: AgentAuthorityRequirement[];
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface AgentProviderExecutionContext {
|
|
16
|
+
authority?: AgentResolvedAuthorityReference[];
|
|
17
|
+
accountId?: string;
|
|
18
|
+
deadlineAt?: number;
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Provider adapters implement provider-specific mechanics only.
|
|
24
|
+
* Generic retries, receipts, hooks, queueing and event dispatch remain execution-plane concerns.
|
|
25
|
+
*/
|
|
26
|
+
export interface AgentProviderAdapter<TContext extends AgentProviderExecutionContext = AgentProviderExecutionContext> {
|
|
27
|
+
readonly providerKey: string;
|
|
28
|
+
listTools?(): AgentToolDefinition[] | Promise<AgentToolDefinition[]>;
|
|
29
|
+
invoke<TInput = unknown, TOutput = unknown>(
|
|
30
|
+
invocation: AgentToolInvocation<TInput>,
|
|
31
|
+
context: TContext,
|
|
32
|
+
): Promise<AgentToolExecutionResult<TOutput>>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const REPOSITORY_STATUSES = ['active', 'archived', 'disabled'] as const;
|
|
2
|
+
export type RepositoryStatus = (typeof REPOSITORY_STATUSES)[number];
|
|
3
|
+
|
|
4
|
+
export const REPOSITORY_CONTRACT_TYPES = ['api', 'schema', 'runtime', 'cli', 'event', 'receipt', 'package'] as const;
|
|
5
|
+
export type RepositoryContractType = (typeof REPOSITORY_CONTRACT_TYPES)[number];
|
|
6
|
+
|
|
7
|
+
export const REPOSITORY_CONTRACT_STATUSES = ['active', 'deprecated', 'retired'] as const;
|
|
8
|
+
export type RepositoryContractStatus = (typeof REPOSITORY_CONTRACT_STATUSES)[number];
|
|
9
|
+
|
|
10
|
+
export const REPOSITORY_DEPENDENCY_TYPES = ['runtime', 'build', 'contract', 'package', 'deploy', 'tool', 'data'] as const;
|
|
11
|
+
export type RepositoryDependencyType = (typeof REPOSITORY_DEPENDENCY_TYPES)[number];
|
|
12
|
+
|
|
13
|
+
export const REPOSITORY_DEPENDENCY_CRITICALITIES = ['informational', 'compatible', 'strict', 'critical'] as const;
|
|
14
|
+
export type RepositoryDependencyCriticality = (typeof REPOSITORY_DEPENDENCY_CRITICALITIES)[number];
|
|
15
|
+
|
|
16
|
+
export const REPOSITORY_FAILURE_POLICIES = ['warn', 'block_certification', 'block_deploy', 'degrade'] as const;
|
|
17
|
+
export type RepositoryFailurePolicy = (typeof REPOSITORY_FAILURE_POLICIES)[number];
|
|
18
|
+
|
|
19
|
+
/** Portable repository identity. Account ownership belongs to the host registry, not this object. */
|
|
20
|
+
export interface RepositoryIdentity {
|
|
21
|
+
schema_version: 1;
|
|
22
|
+
repository_id: string;
|
|
23
|
+
full_name: string;
|
|
24
|
+
role: string;
|
|
25
|
+
default_branch: string;
|
|
26
|
+
canonical_url: string | null;
|
|
27
|
+
status: RepositoryStatus;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Account-bound declaration of one contract provided by a repository. */
|
|
31
|
+
export interface RepositoryContract {
|
|
32
|
+
schema_version: 1;
|
|
33
|
+
id: string;
|
|
34
|
+
account_id: string;
|
|
35
|
+
repository_id: string;
|
|
36
|
+
contract_key: string;
|
|
37
|
+
contract_version: string;
|
|
38
|
+
contract_type: RepositoryContractType;
|
|
39
|
+
name: string;
|
|
40
|
+
description: string | null;
|
|
41
|
+
manifest_path: string | null;
|
|
42
|
+
contract_hash: string;
|
|
43
|
+
status: RepositoryContractStatus;
|
|
44
|
+
created_at: number | null;
|
|
45
|
+
updated_at: number | null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Account-bound cross-repository dependency edge. */
|
|
49
|
+
export interface RepositoryDependency {
|
|
50
|
+
schema_version: 1;
|
|
51
|
+
id: string;
|
|
52
|
+
account_id: string;
|
|
53
|
+
source_repository_id: string;
|
|
54
|
+
target_repository_id: string;
|
|
55
|
+
dependency_type: RepositoryDependencyType;
|
|
56
|
+
contract_id: string | null;
|
|
57
|
+
criticality: RepositoryDependencyCriticality;
|
|
58
|
+
required_version: string | null;
|
|
59
|
+
required_contract_hash: string | null;
|
|
60
|
+
failure_policy: RepositoryFailurePolicy;
|
|
61
|
+
description: string | null;
|
|
62
|
+
created_at: number | null;
|
|
63
|
+
updated_at: number | null;
|
|
64
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { AgentAuthorityRequirement } from './authority';
|
|
2
|
+
|
|
3
|
+
export interface AgentCapability {
|
|
4
|
+
id: string;
|
|
5
|
+
label?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
enabled?: boolean;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type AgentJsonSchema = Record<string, unknown>;
|
|
12
|
+
|
|
13
|
+
export type AgentToolSideEffectLevel =
|
|
14
|
+
| 'none'
|
|
15
|
+
| 'local_write'
|
|
16
|
+
| 'external_write'
|
|
17
|
+
| 'billable_external_write'
|
|
18
|
+
| 'destructive_possible';
|
|
19
|
+
|
|
20
|
+
export type AgentToolRiskLevel = 'low' | 'moderate' | 'high' | 'critical';
|
|
21
|
+
|
|
22
|
+
export type AgentToolReceiptMode = 'full' | 'redacted' | 'metadata_only';
|
|
23
|
+
|
|
24
|
+
export type AgentToolIdempotencyMode =
|
|
25
|
+
| 'not_applicable'
|
|
26
|
+
| 'intrinsic'
|
|
27
|
+
| 'supported'
|
|
28
|
+
| 'required';
|
|
29
|
+
|
|
30
|
+
export type AgentToolHandlerType =
|
|
31
|
+
| 'local'
|
|
32
|
+
| 'http'
|
|
33
|
+
| 'worker_rpc'
|
|
34
|
+
| 'execos'
|
|
35
|
+
| 'mcp'
|
|
36
|
+
| 'custom';
|
|
37
|
+
|
|
38
|
+
export interface AgentToolHandlerReference {
|
|
39
|
+
type: AgentToolHandlerType;
|
|
40
|
+
ref: string;
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface AgentToolRetryPolicy {
|
|
45
|
+
maxAttempts: number;
|
|
46
|
+
backoff?: 'none' | 'fixed' | 'exponential';
|
|
47
|
+
baseDelayMs?: number;
|
|
48
|
+
maxDelayMs?: number;
|
|
49
|
+
retryableReasons?: string[];
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface AgentToolDefinition {
|
|
53
|
+
toolKey: string;
|
|
54
|
+
displayName: string;
|
|
55
|
+
description?: string;
|
|
56
|
+
provider?: string;
|
|
57
|
+
pluginId?: string;
|
|
58
|
+
capabilityKey: string;
|
|
59
|
+
handler?: AgentToolHandlerReference;
|
|
60
|
+
inputSchema: AgentJsonSchema;
|
|
61
|
+
outputSchema: AgentJsonSchema;
|
|
62
|
+
authority?: AgentAuthorityRequirement[];
|
|
63
|
+
riskLevel: AgentToolRiskLevel;
|
|
64
|
+
sideEffectLevel: AgentToolSideEffectLevel;
|
|
65
|
+
idempotencyMode: AgentToolIdempotencyMode;
|
|
66
|
+
timeoutMs?: number;
|
|
67
|
+
retryPolicy?: AgentToolRetryPolicy;
|
|
68
|
+
receiptMode?: AgentToolReceiptMode;
|
|
69
|
+
sensitiveInputPaths?: string[];
|
|
70
|
+
sensitiveOutputPaths?: string[];
|
|
71
|
+
emitsEvents?: string[];
|
|
72
|
+
active?: boolean;
|
|
73
|
+
metadata?: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export type AgentToolCallStatus =
|
|
77
|
+
| 'queued'
|
|
78
|
+
| 'running'
|
|
79
|
+
| 'retrying'
|
|
80
|
+
| 'awaiting_input'
|
|
81
|
+
| 'completed'
|
|
82
|
+
| 'failed'
|
|
83
|
+
| 'cancelled'
|
|
84
|
+
| 'timed_out';
|
|
85
|
+
|
|
86
|
+
export interface AgentToolCall {
|
|
87
|
+
id: string;
|
|
88
|
+
runId?: string;
|
|
89
|
+
name: string;
|
|
90
|
+
toolKey?: string;
|
|
91
|
+
status: AgentToolCallStatus;
|
|
92
|
+
startedAt?: number;
|
|
93
|
+
completedAt?: number;
|
|
94
|
+
input?: unknown;
|
|
95
|
+
output?: unknown;
|
|
96
|
+
error?: string;
|
|
97
|
+
metadata?: Record<string, unknown>;
|
|
98
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
|
|
5
|
+
test('contracts package stays framework neutral', async () => {
|
|
6
|
+
const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
|
|
7
|
+
assert.equal(pkg.dependencies, undefined);
|
|
8
|
+
assert.equal(pkg.peerDependencies, undefined);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
test('execution-plane contracts are exported as first-class package surfaces', async () => {
|
|
12
|
+
const pkg = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
|
|
13
|
+
for (const key of ['./tools', './authority', './execution', './providers', './events', './hooks']) {
|
|
14
|
+
assert.equal(typeof pkg.exports[key], 'string', `missing contract export: ${key}`);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
|
|
5
|
+
const catalog = JSON.parse(fs.readFileSync(new URL('../../../protocol/errors/error-catalog.json', import.meta.url), 'utf8'));
|
|
6
|
+
|
|
7
|
+
test('error catalog vocabulary is unique and every reason references valid policy values', () => {
|
|
8
|
+
const unique = values => assert.equal(new Set(values).size, values.length);
|
|
9
|
+
unique(catalog.codes.map(row => row.name));
|
|
10
|
+
unique(catalog.reasons.map(row => row.name));
|
|
11
|
+
unique(catalog.severities);
|
|
12
|
+
unique(catalog.source_kinds);
|
|
13
|
+
unique(catalog.resolution_owners);
|
|
14
|
+
unique(catalog.remediation_actions);
|
|
15
|
+
const codes = new Set(catalog.codes.map(row => row.name));
|
|
16
|
+
const severities = new Set(catalog.severities);
|
|
17
|
+
const owners = new Set(catalog.resolution_owners);
|
|
18
|
+
const actions = new Set(catalog.remediation_actions);
|
|
19
|
+
for (const reason of catalog.reasons) {
|
|
20
|
+
assert.ok(codes.has(reason.code), `unknown code for ${reason.name}`);
|
|
21
|
+
assert.ok(severities.has(reason.severity), `unknown severity for ${reason.name}`);
|
|
22
|
+
assert.ok(owners.has(reason.resolution_owner), `unknown resolution owner for ${reason.name}`);
|
|
23
|
+
assert.ok(actions.has(reason.remediation_action), `unknown remediation action for ${reason.name}`);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
|
|
5
|
+
test('repository graph vocabulary is owned and exported by the contracts package', async () => {
|
|
6
|
+
const pkg = JSON.parse(await fs.readFile(new URL('../package.json', import.meta.url), 'utf8'));
|
|
7
|
+
const source = await fs.readFile(new URL('../src/repository.ts', import.meta.url), 'utf8');
|
|
8
|
+
|
|
9
|
+
assert.equal(pkg.exports['./repository'], './src/repository.ts');
|
|
10
|
+
for (const value of [
|
|
11
|
+
'informational', 'compatible', 'strict', 'critical',
|
|
12
|
+
'warn', 'block_certification', 'block_deploy', 'degrade',
|
|
13
|
+
]) assert.match(source, new RegExp(`['\"]${value}['\"]`));
|
|
14
|
+
|
|
15
|
+
assert.match(source, /account_id: string/);
|
|
16
|
+
assert.match(source, /repository_id: string/);
|
|
17
|
+
assert.doesNotMatch(source, /tenant_id|workspace_id|owner_user_id/);
|
|
18
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@inneranimalmedia/agentsam-errors",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Canonical AgentSam runtime error normalization, classification, transport, remediation and rendering.",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./src/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./src/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"test": "node --test test/*.test.mjs"
|
|
13
|
+
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=22 <25"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { classifyProviderFailure } from './provider.js';
|
|
2
|
+
import { ERROR_REASON } from '../vocabulary.js';
|
|
3
|
+
|
|
4
|
+
export function classifyAnthropicFailure(evidence = {}, context = {}) {
|
|
5
|
+
const type = String(evidence.type || evidence.code || '').toLowerCase();
|
|
6
|
+
const message = String(evidence.message || '');
|
|
7
|
+
let reason = context.reason;
|
|
8
|
+
if (!reason && type === 'overloaded_error') reason = ERROR_REASON.PROVIDER_OVERLOADED;
|
|
9
|
+
else if (!reason && type === 'rate_limit_error') reason = ERROR_REASON.PROVIDER_RATE_LIMITED;
|
|
10
|
+
else if (!reason && type === 'authentication_error') reason = ERROR_REASON.PROVIDER_CREDENTIAL_INVALID;
|
|
11
|
+
else if (!reason && type === 'permission_error') reason = ERROR_REASON.PROVIDER_SCOPE_INSUFFICIENT;
|
|
12
|
+
else if (!reason && /request too large|context|token limit/i.test(message)) reason = ERROR_REASON.CONTEXT_WINDOW_EXCEEDED;
|
|
13
|
+
else if (!reason && type === 'invalid_request_error') reason = ERROR_REASON.PROVIDER_REQUEST_INVALID;
|
|
14
|
+
return classifyProviderFailure('anthropic', evidence, { ...context, reason });
|
|
15
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createErrorEnvelope } from '../envelope.js';
|
|
2
|
+
import { classifyProviderFailure } from './provider.js';
|
|
3
|
+
import { ERROR_REASON } from '../vocabulary.js';
|
|
4
|
+
|
|
5
|
+
function text(evidence) {
|
|
6
|
+
return `${evidence.code || ''} ${evidence.exception_type || evidence.type || ''} ${evidence.message || ''} ${evidence.stderr || ''}`.toLowerCase();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function commonCadReason(tool, evidence = {}, context = {}) {
|
|
10
|
+
if (context.reason) return context.reason;
|
|
11
|
+
if (evidence.available === false || evidence.installed === false) return ERROR_REASON.CAD_TOOL_NOT_INSTALLED;
|
|
12
|
+
if (evidence.executable === false) return ERROR_REASON.CAD_TOOL_NOT_EXECUTABLE;
|
|
13
|
+
if (evidence.version_compatible === false) return ERROR_REASON.CAD_TOOL_VERSION_INCOMPATIBLE;
|
|
14
|
+
if (evidence.component_missing) return ERROR_REASON.CAD_COMPONENT_MISSING;
|
|
15
|
+
if (evidence.dependency_missing) return ERROR_REASON.CAD_DEPENDENCY_MISSING;
|
|
16
|
+
if (evidence.dependency_version_compatible === false) return ERROR_REASON.CAD_DEPENDENCY_VERSION_INCOMPATIBLE;
|
|
17
|
+
if (evidence.output_missing) return ERROR_REASON.CAD_OUTPUT_MISSING;
|
|
18
|
+
if (evidence.output_invalid) return ERROR_REASON.CAD_OUTPUT_INVALID;
|
|
19
|
+
if (evidence.warning_escalated) return ERROR_REASON.CAD_WARNING_ESCALATED;
|
|
20
|
+
if (evidence.timeout) return ERROR_REASON.EXECUTION_TIMEOUT;
|
|
21
|
+
const value = text(evidence);
|
|
22
|
+
if (/memoryerror|out of memory|memory exception|bad_alloc/.test(value)) return ERROR_REASON.CAD_MEMORY_EXHAUSTED;
|
|
23
|
+
if (/unsupported.*format|format.*unsupported/.test(value)) return context.stage === 'export' ? ERROR_REASON.CAD_EXPORT_FORMAT_UNSUPPORTED : ERROR_REASON.CAD_INPUT_FORMAT_UNSUPPORTED;
|
|
24
|
+
if (/gpu.*(?:unavailable|not found|unsupported)|no compatible gpu/.test(value)) return ERROR_REASON.CAD_GPU_UNAVAILABLE;
|
|
25
|
+
if (/render engine.*(?:unavailable|not found|unsupported)|unknown render engine/.test(value)) return ERROR_REASON.CAD_RENDER_ENGINE_UNAVAILABLE;
|
|
26
|
+
if (context.stage === 'render') return ERROR_REASON.CAD_RENDER_FAILED;
|
|
27
|
+
if (context.stage === 'export') return ERROR_REASON.CAD_EXPORT_FAILED;
|
|
28
|
+
if (context.stage === 'import') return ERROR_REASON.CAD_IMPORT_FAILED;
|
|
29
|
+
if (Number.isInteger(evidence.exit_code) && evidence.exit_code !== 0) return ERROR_REASON.CAD_PROCESS_CRASHED;
|
|
30
|
+
return ERROR_REASON.EXECUTION_FAILED;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function cadEnvelope(tool, evidence = {}, context = {}, reason = commonCadReason(tool, evidence, context)) {
|
|
34
|
+
return createErrorEnvelope({
|
|
35
|
+
reason,
|
|
36
|
+
message: context.message || evidence.message || `${tool} operation failed`,
|
|
37
|
+
source: context.source || { kind: 'dependency', name: tool, service: context.service || null },
|
|
38
|
+
resolution_owner: context.resolution_owner,
|
|
39
|
+
severity: context.severity,
|
|
40
|
+
remediation: context.remediation,
|
|
41
|
+
domain: 'cad',
|
|
42
|
+
tool,
|
|
43
|
+
stage: context.stage || 'execute',
|
|
44
|
+
retryable: context.retryable,
|
|
45
|
+
retry_after_ms: evidence.retry_after_ms,
|
|
46
|
+
resource: context.resource || null,
|
|
47
|
+
environment: context.environment || {
|
|
48
|
+
detected_version: evidence.detected_version || evidence.version || null,
|
|
49
|
+
required_version: evidence.required_version || null,
|
|
50
|
+
component: evidence.component || null,
|
|
51
|
+
runtime: evidence.runtime || null,
|
|
52
|
+
platform: evidence.platform || null,
|
|
53
|
+
},
|
|
54
|
+
native: {
|
|
55
|
+
code: evidence.code,
|
|
56
|
+
exception_type: evidence.exception_type || evidence.type,
|
|
57
|
+
exit_code: evidence.exit_code,
|
|
58
|
+
signal: evidence.signal,
|
|
59
|
+
stderr: evidence.stderr,
|
|
60
|
+
stdout: evidence.stdout,
|
|
61
|
+
stack: evidence.stack,
|
|
62
|
+
},
|
|
63
|
+
details: evidence.details || null,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function classifyFreeCadFailure(evidence = {}, context = {}) {
|
|
68
|
+
const value = text(evidence);
|
|
69
|
+
let reason = context.reason;
|
|
70
|
+
if (!reason && /part::booleanexception/.test(value)) reason = ERROR_REASON.CAD_BOOLEAN_FAILED;
|
|
71
|
+
else if (!reason && /part::nullshapeexception/.test(value)) reason = ERROR_REASON.CAD_NULL_SHAPE;
|
|
72
|
+
else if (!reason && /base::cadkernelerror/.test(value)) reason = ERROR_REASON.CAD_KERNEL_FAILED;
|
|
73
|
+
else if (!reason && /base::memoryexception/.test(value)) reason = ERROR_REASON.CAD_MEMORY_EXHAUSTED;
|
|
74
|
+
else if (!reason && /parsererror|badformaterror/.test(value)) reason = ERROR_REASON.CAD_SOURCE_PARSE_FAILED;
|
|
75
|
+
else if (!reason && /abortexception/.test(value)) reason = ERROR_REASON.CANCELLED;
|
|
76
|
+
else if (!reason && context.stage === 'recompute') reason = ERROR_REASON.CAD_MODEL_RECOMPUTE_FAILED;
|
|
77
|
+
return cadEnvelope('freecad', evidence, context, reason || commonCadReason('freecad', evidence, context));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function classifyOpenScadFailure(evidence = {}, context = {}) {
|
|
81
|
+
const value = text(evidence);
|
|
82
|
+
let reason = context.reason;
|
|
83
|
+
if (!reason && /parser error|syntax error|parse error/.test(value)) reason = ERROR_REASON.CAD_SOURCE_PARSE_FAILED;
|
|
84
|
+
else if (!reason && /no top level geometry to render|empty top level object/.test(value)) reason = ERROR_REASON.CAD_GEOMETRY_INVALID;
|
|
85
|
+
else if (!reason && /warning.*treated as error|hardwarnings/.test(value)) reason = ERROR_REASON.CAD_WARNING_ESCALATED;
|
|
86
|
+
return cadEnvelope('openscad', evidence, context, reason || commonCadReason('openscad', evidence, context));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function classifyBlenderFailure(evidence = {}, context = {}) {
|
|
90
|
+
const value = text(evidence);
|
|
91
|
+
let reason = context.reason;
|
|
92
|
+
if (!reason && /python.*(?:exception|traceback)|valueerror|typeerror|runtimeerror/.test(value) && context.stage === 'script') reason = ERROR_REASON.CAD_SCRIPT_FAILED;
|
|
93
|
+
else if (!reason && /boolean/.test(value) && /fail|error/.test(value)) reason = ERROR_REASON.CAD_BOOLEAN_FAILED;
|
|
94
|
+
return cadEnvelope('blender', evidence, context, reason || commonCadReason('blender', evidence, context));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function classifyMeshyFailure(evidence = {}, context = {}) {
|
|
98
|
+
return classifyProviderFailure('meshy', evidence, { ...context, domain: 'cad', tool: 'meshy' });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function classifyCadFailure(tool, evidence = {}, context = {}) {
|
|
102
|
+
switch (String(tool || '').toLowerCase()) {
|
|
103
|
+
case 'freecad': return classifyFreeCadFailure(evidence, context);
|
|
104
|
+
case 'openscad': return classifyOpenScadFailure(evidence, context);
|
|
105
|
+
case 'blender': return classifyBlenderFailure(evidence, context);
|
|
106
|
+
case 'meshy': return classifyMeshyFailure(evidence, context);
|
|
107
|
+
default: return cadEnvelope(String(tool || 'cad').toLowerCase(), evidence, context);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { classifyProviderFailure } from './provider.js';
|
|
2
|
+
import { ERROR_REASON } from '../vocabulary.js';
|
|
3
|
+
|
|
4
|
+
export function classifyCloudflareFailure(evidence = {}, context = {}) {
|
|
5
|
+
const status = Number(evidence.status || evidence.http_status || evidence.httpStatus || 0);
|
|
6
|
+
const cf = Number(evidence.cloudflare_code || evidence.cloudflareCode || evidence.provider_code || evidence.code || 0) || null;
|
|
7
|
+
const text = `${evidence.message || ''} ${evidence.error || ''}`.toLowerCase();
|
|
8
|
+
let reason = context.reason;
|
|
9
|
+
if (!reason && cf === 1033) reason = ERROR_REASON.TUNNEL_CONNECTOR_UNAVAILABLE;
|
|
10
|
+
else if (!reason && cf === 1102) reason = ERROR_REASON.CLOUDFLARE_WORKERS_CPU_EXHAUSTED;
|
|
11
|
+
else if (!reason && (status === 521)) reason = ERROR_REASON.TRANSPORT_REFUSED;
|
|
12
|
+
else if (!reason && (status === 522 || status === 523 || status === 530)) reason = ERROR_REASON.TRANSPORT_UNREACHABLE;
|
|
13
|
+
else if (!reason && status === 524) reason = ERROR_REASON.TRANSPORT_TIMEOUT;
|
|
14
|
+
else if (!reason && status === 525) reason = ERROR_REASON.TLS_HANDSHAKE_FAILED;
|
|
15
|
+
else if (!reason && status === 526) reason = ERROR_REASON.TLS_CERTIFICATE_INVALID;
|
|
16
|
+
else if (!reason && /service binding/.test(text)) reason = ERROR_REASON.CLOUDFLARE_SERVICE_BINDING_UNAVAILABLE;
|
|
17
|
+
else if (!reason && /durable object/.test(text)) reason = ERROR_REASON.CLOUDFLARE_DURABLE_OBJECT_UNAVAILABLE;
|
|
18
|
+
else if (!reason && /\bd1\b/.test(text)) reason = ERROR_REASON.CLOUDFLARE_D1_UNAVAILABLE;
|
|
19
|
+
else if (!reason && /\br2\b/.test(text)) reason = ERROR_REASON.CLOUDFLARE_R2_UNAVAILABLE;
|
|
20
|
+
return classifyProviderFailure('cloudflare', { ...evidence, status, code: cf ?? evidence.code }, { ...context, reason, domain: context.domain || 'transport' });
|
|
21
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createErrorEnvelope } from '../envelope.js';
|
|
2
|
+
import { ERROR_REASON } from '../vocabulary.js';
|
|
3
|
+
|
|
4
|
+
const STATE_REASON = Object.freeze({
|
|
5
|
+
not_enrolled: ERROR_REASON.DEVICE_NOT_ENROLLED,
|
|
6
|
+
credential_missing: ERROR_REASON.DEVICE_CREDENTIAL_MISSING,
|
|
7
|
+
credential_invalid: ERROR_REASON.DEVICE_CREDENTIAL_INVALID,
|
|
8
|
+
credential_expired: ERROR_REASON.DEVICE_CREDENTIAL_EXPIRED,
|
|
9
|
+
registration_missing: ERROR_REASON.DEVICE_REGISTRATION_MISSING,
|
|
10
|
+
registration_stale: ERROR_REASON.DEVICE_REGISTRATION_STALE,
|
|
11
|
+
connection_revoked: ERROR_REASON.CONNECTION_REVOKED,
|
|
12
|
+
connection_disabled: ERROR_REASON.CONNECTION_DISABLED,
|
|
13
|
+
identity_resolution_failed: ERROR_REASON.IDENTITY_RESOLUTION_FAILED,
|
|
14
|
+
identity_mismatch: ERROR_REASON.IDENTITY_MISMATCH,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export function classifyDeviceFailure(evidence = {}, context = {}) {
|
|
18
|
+
const state = String(evidence.state || evidence.code || '').toLowerCase();
|
|
19
|
+
const reason = context.reason || STATE_REASON[state] || ERROR_REASON.UNKNOWN;
|
|
20
|
+
const internal = [ERROR_REASON.IDENTITY_RESOLUTION_FAILED, ERROR_REASON.IDENTITY_MISMATCH].includes(reason);
|
|
21
|
+
return createErrorEnvelope({
|
|
22
|
+
reason,
|
|
23
|
+
message: context.message || evidence.message || (internal ? 'AgentSam could not resolve the registered device identity.' : 'This device connection needs attention.'),
|
|
24
|
+
source: context.source || (internal ? { kind: 'agentsam', name: 'inneranimalmedia', service: 'terminal_control_plane' } : { kind: 'runtime', name: 'execos', service: 'device' }),
|
|
25
|
+
resolution_owner: internal ? 'agentsam' : context.resolution_owner,
|
|
26
|
+
severity: internal ? 'blocking_internal' : context.severity,
|
|
27
|
+
remediation: internal ? { action: 'inspect_platform', message: 'AgentSam must inspect the terminal control plane.' } : context.remediation,
|
|
28
|
+
domain: 'device',
|
|
29
|
+
tool: context.tool || 'execos',
|
|
30
|
+
stage: context.stage || 'authentication',
|
|
31
|
+
resource: context.resource || { type: 'terminal_device', id: evidence.instance_id || null },
|
|
32
|
+
provider_code: evidence.provider_code || null,
|
|
33
|
+
request_id: evidence.request_id || null,
|
|
34
|
+
trace_id: evidence.trace_id || null,
|
|
35
|
+
native: { code: evidence.code || state || null, exception_type: evidence.exception_type || null, stack: evidence.stack || null },
|
|
36
|
+
details: evidence.details || null,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createErrorEnvelope } from '../envelope.js';
|
|
2
|
+
import { ERROR_REASON } from '../vocabulary.js';
|
|
3
|
+
|
|
4
|
+
export function classifyDockerFailure(evidence = {}, context = {}) {
|
|
5
|
+
const text = `${evidence.code || ''} ${evidence.message || ''} ${evidence.stderr || ''}`.toLowerCase();
|
|
6
|
+
let reason = context.reason;
|
|
7
|
+
if (!reason && /cannot connect to the docker daemon|is the docker daemon running|docker daemon is not running/.test(text)) reason = ERROR_REASON.DOCKER_DAEMON_UNAVAILABLE;
|
|
8
|
+
else if (!reason && /toomanyrequests|pull rate limit/.test(text)) reason = ERROR_REASON.DOCKER_PULL_RATE_LIMITED;
|
|
9
|
+
else if (!reason && /unauthorized|authentication required|pull access denied|denied: requested access/.test(text)) reason = ERROR_REASON.DOCKER_REGISTRY_AUTH_FAILED;
|
|
10
|
+
else if (!reason && /no such image|manifest unknown|image.*not found/.test(text)) reason = ERROR_REASON.DOCKER_IMAGE_NOT_FOUND;
|
|
11
|
+
else if (!reason && (context.stage === 'build' || /build failed|failed to solve/.test(text))) reason = ERROR_REASON.DOCKER_BUILD_FAILED;
|
|
12
|
+
else if (!reason && (context.stage === 'run' || context.stage === 'container')) reason = ERROR_REASON.DOCKER_CONTAINER_FAILED;
|
|
13
|
+
else reason ||= ERROR_REASON.EXECUTION_FAILED;
|
|
14
|
+
return createErrorEnvelope({
|
|
15
|
+
reason,
|
|
16
|
+
message: context.message || evidence.message || evidence.stderr || 'Docker operation failed',
|
|
17
|
+
source: { kind: 'runtime', name: 'docker', service: context.service || null },
|
|
18
|
+
domain: context.domain || 'runtime',
|
|
19
|
+
tool: 'docker',
|
|
20
|
+
stage: context.stage || 'execute',
|
|
21
|
+
retry_after_ms: evidence.retry_after_ms,
|
|
22
|
+
provider: context.provider || (reason === ERROR_REASON.DOCKER_PULL_RATE_LIMITED ? 'docker_registry' : null),
|
|
23
|
+
native: { code: evidence.code, exit_code: evidence.exit_code, signal: evidence.signal, stderr: evidence.stderr, stdout: evidence.stdout, stack: evidence.stack },
|
|
24
|
+
environment: context.environment || null,
|
|
25
|
+
resource: context.resource || null,
|
|
26
|
+
details: evidence.details || null,
|
|
27
|
+
});
|
|
28
|
+
}
|