@inneranimalmedia/agentsam-sdk 2.6.1 → 2.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTSAM.md +45 -1
- package/README.md +80 -0
- package/apps/README.md +34 -0
- package/apps/cad-creator/README.md +728 -0
- package/apps/cad-creator/shared/cad/package.json +19 -0
- package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
- package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
- package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
- package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
- package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
- package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
- package/apps/cad-creator/shared/cad/src/index.ts +4 -0
- package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
- package/apps/cad-creator/shared/cad/src/types.ts +507 -0
- package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
- package/docs/AUTH_IDENTITY_CONTRACT.md +25 -27
- package/docs/AUTORAG.md +58 -0
- package/docs/BRAND_INTELLIGENCE.md +30 -0
- package/docs/CLI_SHELL.md +4 -2
- package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
- package/docs/MERKLE.md +4 -0
- package/docs/PROJECT_CONFIG.md +3 -0
- package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
- package/docs/SDK_WORKER.md +4 -3
- package/docs/THEME_REFINERY.md +120 -0
- package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
- package/docs/architecture/STORAGE.md +87 -0
- package/docs/cad-project-tools.md +69 -0
- package/docs/cms-scaffolding-pattern-reference.md +73 -0
- package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
- package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
- package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
- package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
- package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
- package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
- package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
- package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
- package/docs/plugins.md +43 -0
- package/docs/tools/README.md +57 -0
- package/docs/tools/agent-and-orchestration.md +49 -0
- package/docs/tools/browser-and-research.md +46 -0
- package/docs/tools/cloudflare-platform.md +32 -0
- package/docs/tools/cms.md +25 -0
- package/docs/tools/communications.md +41 -0
- package/docs/tools/database-and-storage.md +62 -0
- package/docs/tools/design-and-media.md +64 -0
- package/docs/tools/filesystem-and-code.md +55 -0
- package/docs/tools/github.md +56 -0
- package/docs/tools/integrations-and-misc.md +16 -0
- package/docs/tools/memory.md +21 -0
- package/docs/tools/terminal-and-execution.md +29 -0
- package/docs/tools/tickets-and-platform.md +30 -0
- package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
- package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
- package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
- package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
- package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
- package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
- package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
- package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
- package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
- package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
- package/migrations/runtime/0001_cli_runtime.sql +67 -0
- package/migrations/runtime/0002_project_sessions.sql +15 -0
- package/migrations/runtime/0003_provider_continuations.sql +8 -0
- package/package.json +92 -12
- package/packages/agentsam-brand/README.md +21 -0
- package/packages/agentsam-brand/package.json +22 -0
- package/packages/agentsam-brand/src/contract.js +59 -0
- package/packages/agentsam-brand/src/extract.js +126 -0
- package/packages/agentsam-brand/src/goap-actions.js +73 -0
- package/packages/agentsam-brand/src/index.js +48 -0
- package/packages/agentsam-brand/src/plan.js +115 -0
- package/packages/agentsam-brand/src/resolve.js +139 -0
- package/packages/agentsam-brand/src/scan.js +250 -0
- package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
- package/packages/agentsam-contracts/README.md +23 -0
- package/packages/agentsam-contracts/package.json +32 -0
- package/packages/agentsam-contracts/src/adapter.ts +25 -0
- package/packages/agentsam-contracts/src/agent.ts +35 -0
- package/packages/agentsam-contracts/src/artifacts.ts +33 -0
- package/packages/agentsam-contracts/src/authority.ts +29 -0
- package/packages/agentsam-contracts/src/context.ts +16 -0
- package/packages/agentsam-contracts/src/errors.ts +46 -0
- package/packages/agentsam-contracts/src/events.ts +47 -0
- package/packages/agentsam-contracts/src/execution.ts +50 -0
- package/packages/agentsam-contracts/src/hooks.ts +40 -0
- package/packages/agentsam-contracts/src/identity.ts +16 -0
- package/packages/agentsam-contracts/src/index.ts +14 -0
- package/packages/agentsam-contracts/src/models.ts +9 -0
- package/packages/agentsam-contracts/src/providers.ts +33 -0
- package/packages/agentsam-contracts/src/repository.ts +64 -0
- package/packages/agentsam-contracts/src/tools.ts +98 -0
- package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
- package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
- package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
- package/packages/agentsam-contracts/tsconfig.json +12 -0
- package/packages/agentsam-errors/package.json +17 -0
- package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
- package/packages/agentsam-errors/src/adapters/cad.js +109 -0
- package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
- package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
- package/packages/agentsam-errors/src/adapters/device.js +38 -0
- package/packages/agentsam-errors/src/adapters/docker.js +28 -0
- package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
- package/packages/agentsam-errors/src/adapters/github.js +22 -0
- package/packages/agentsam-errors/src/adapters/google.js +17 -0
- package/packages/agentsam-errors/src/adapters/index.js +55 -0
- package/packages/agentsam-errors/src/adapters/internal.js +40 -0
- package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
- package/packages/agentsam-errors/src/adapters/openai.js +17 -0
- package/packages/agentsam-errors/src/adapters/process.js +35 -0
- package/packages/agentsam-errors/src/adapters/provider.js +114 -0
- package/packages/agentsam-errors/src/envelope.js +186 -0
- package/packages/agentsam-errors/src/error.js +24 -0
- package/packages/agentsam-errors/src/fingerprint.js +35 -0
- package/packages/agentsam-errors/src/index.js +10 -0
- package/packages/agentsam-errors/src/normalize.js +30 -0
- package/packages/agentsam-errors/src/redaction.js +52 -0
- package/packages/agentsam-errors/src/render.js +16 -0
- package/packages/agentsam-errors/src/retry.js +10 -0
- package/packages/agentsam-errors/src/transport.js +52 -0
- package/packages/agentsam-errors/src/vocabulary.js +320 -0
- package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
- package/packages/agentsam-errors/test/providers.test.mjs +99 -0
- package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
- package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
- package/packages/agentsam-errors/test/transport.test.mjs +46 -0
- package/packages/agentsam-knowledge/package.json +15 -0
- package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
- package/packages/agentsam-knowledge/src/backends/index.js +26 -0
- package/packages/agentsam-knowledge/src/index.js +3 -0
- package/packages/agentsam-knowledge/src/providers/index.js +95 -0
- package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
- package/packages/agentsam-nav/README.md +40 -0
- package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
- package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
- package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
- package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
- package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
- package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
- package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
- package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
- package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
- package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
- package/packages/agentsam-nav/dist/browser.d.ts +11 -0
- package/packages/agentsam-nav/dist/browser.global.js +132 -0
- package/packages/agentsam-nav/dist/browser.js +613 -0
- package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
- package/packages/agentsam-nav/dist/index.d.ts +11 -0
- package/packages/agentsam-nav/dist/index.js +614 -0
- package/packages/agentsam-nav/dist/legacy.css +83 -0
- package/packages/agentsam-nav/dist/shell.css +113 -0
- package/packages/agentsam-nav/dist/theme.css +113 -0
- package/packages/agentsam-nav/dist/utils.d.ts +1 -0
- package/packages/agentsam-nav/package.json +43 -0
- package/packages/agentsam-queue-control/README.md +107 -0
- package/packages/agentsam-queue-control/package.json +31 -0
- package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
- package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
- package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
- package/packages/agentsam-queue-control/src/contracts.js +130 -0
- package/packages/agentsam-queue-control/src/control-plane.js +141 -0
- package/packages/agentsam-queue-control/src/dispatch.js +43 -0
- package/packages/agentsam-queue-control/src/index.js +7 -0
- package/packages/agentsam-queue-control/src/policy.js +88 -0
- package/packages/agentsam-queue-control/src/topology.js +66 -0
- package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
- package/packages/agentsam-repository/src/goap.js +718 -0
- package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
- package/packages/agentsam-repository/src/index.js +5 -0
- package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
- package/packages/agentsam-repository/src/tickets.js +184 -0
- package/packages/agentsam-repository/src/work-tracking.js +199 -0
- package/packages/agentsam-repository/src/workspace-state.js +176 -0
- package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
- package/packages/connectors/cloudflare/src/index.js +297 -15
- package/packages/connectors/cloudflare/src/owner.js +43 -40
- package/packages/connectors/cloudflare/src/routes.js +167 -26
- package/packages/connectors/cloudflare/tests/connector.test.mjs +112 -2
- package/packages/heuristic-theme/README.md +11 -0
- package/packages/heuristic-theme/package.json +25 -0
- package/packages/heuristic-theme/src/index.js +2 -0
- package/packages/heuristic-theme/src/registry.js +36 -0
- package/packages/heuristic-theme/src/theme.js +41 -0
- package/packages/heuristic-theme/test/theme.test.mjs +26 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +74 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
- package/packages/identity/package.json +4 -3
- package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
- package/packages/identity/src/adapters/cloudflare-d1/index.js +39 -1
- package/packages/identity/src/contracts/auth-config.js +23 -40
- package/packages/identity/src/contracts/provider.js +3 -2
- package/packages/identity/src/frontend/auth-portal/pages/login.html +7 -0
- package/packages/identity/src/index.js +2 -0
- package/packages/identity/src/oauth/credentials.js +13 -0
- package/packages/identity/src/oauth/iam-platform.js +5 -5
- package/packages/identity/src/providers/cloudflare/index.js +19 -0
- package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
- package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
- package/packages/identity/src/providers/cloudflare/profile.js +28 -0
- package/packages/identity/src/providers/index.js +18 -2
- package/packages/identity/src/server/identity-service.js +13 -3
- package/packages/identity/src/server/worker-router.js +63 -8
- package/packages/identity/tests/auth-config.test.mjs +14 -23
- package/packages/identity/tests/identity-service.test.mjs +15 -0
- package/packages/providers/completeful/README.md +38 -0
- package/packages/providers/completeful/package.json +29 -0
- package/packages/providers/completeful/src/client.js +162 -0
- package/packages/providers/completeful/src/events.js +49 -0
- package/packages/providers/completeful/src/index.js +22 -0
- package/packages/providers/completeful/src/tools.js +579 -0
- package/packages/providers/completeful/src/webhooks.js +55 -0
- package/packages/providers/completeful/test/provider.test.mjs +196 -0
- package/packages/theme-church-site/README.md +10 -0
- package/packages/theme-church-site/package.json +30 -0
- package/packages/theme-church-site/src/harvest.json +14 -0
- package/packages/theme-church-site/src/index.js +84 -0
- package/packages/theme-church-site/test/theme.test.mjs +19 -0
- package/packages/theme-companions-site/README.md +10 -0
- package/packages/theme-companions-site/package.json +30 -0
- package/packages/theme-companions-site/src/harvest.json +12 -0
- package/packages/theme-companions-site/src/index.js +82 -0
- package/packages/theme-companions-site/test/theme.test.mjs +19 -0
- package/packages/theme-floors-site/README.md +10 -0
- package/packages/theme-floors-site/package.json +30 -0
- package/packages/theme-floors-site/src/harvest.json +14 -0
- package/packages/theme-floors-site/src/index.js +82 -0
- package/packages/theme-floors-site/test/theme.test.mjs +19 -0
- package/packages/theme-fuelnfree-site/README.md +10 -0
- package/packages/theme-fuelnfree-site/package.json +30 -0
- package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
- package/packages/theme-fuelnfree-site/src/index.js +81 -0
- package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
- package/packages/theme-handyman-site/README.md +10 -0
- package/packages/theme-handyman-site/package.json +30 -0
- package/packages/theme-handyman-site/src/harvest.json +10 -0
- package/packages/theme-handyman-site/src/index.js +83 -0
- package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
- package/packages/theme-insurance-site/README.md +10 -0
- package/packages/theme-insurance-site/package.json +30 -0
- package/packages/theme-insurance-site/src/harvest.json +10 -0
- package/packages/theme-insurance-site/src/index.js +83 -0
- package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
- package/packages/theme-shinshu-site/README.md +10 -0
- package/packages/theme-shinshu-site/package.json +30 -0
- package/packages/theme-shinshu-site/src/harvest.json +12 -0
- package/packages/theme-shinshu-site/src/index.js +83 -0
- package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
- package/packages/work-graph/README.md +49 -0
- package/packages/work-graph/package.json +19 -0
- package/packages/work-graph/prototype/README.md +32 -0
- package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
- package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
- package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
- package/packages/work-graph/prototype-gnantt.html +655 -0
- package/packages/work-graph/src/adapters/business/projects.js +23 -0
- package/packages/work-graph/src/adapters/engineering/git.js +22 -0
- package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
- package/packages/work-graph/src/index.js +76 -0
- package/packages/work-graph/src/renderers/gantt-model.js +11 -0
- package/packages/work-graph/src/renderers/timeline.js +16 -0
- package/packages/work-graph/test/work-graph.test.mjs +37 -0
- package/protocol/README.md +12 -0
- package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
- package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
- package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
- package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
- package/protocol/capabilities/manifest.json +163 -1
- package/protocol/capabilities/repository-audit-input.schema.json +39 -6
- package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
- package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
- package/protocol/commerce/catalog.v1.json +50 -0
- package/protocol/errors/error-catalog.json +164 -0
- package/protocol/errors/error-envelope.schema.json +544 -0
- package/protocol/features/README.md +57 -0
- package/protocol/features/agentsam.feature.v1.schema.json +290 -0
- package/protocol/features/catalog.json +65 -0
- package/protocol/features/examples/provider-resend.feature.json +17 -0
- package/protocol/go/agentsam-go-runtime.v1.json +17 -0
- package/protocol/knowledge/LIFECYCLE.md +140 -0
- package/protocol/knowledge/README.md +4 -0
- package/protocol/presets/catalog.json +128 -19
- package/protocol/rpc/v1/errors.proto +24 -0
- package/protocol/theme-refinery/d1-reconciliation.md +48 -0
- package/protocol/theme-refinery/product-metadata.schema.json +27 -0
- package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
- package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
- package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
- package/services/cad/server.py +249 -2
- package/src/agent/capability-adapter.js +15 -5
- package/src/agent/index.js +2 -1
- package/src/agent/model-turn.js +51 -0
- package/src/agent/responses-runner.js +304 -38
- package/src/capabilities/index.js +1 -0
- package/src/capabilities/terminal-exec.js +78 -0
- package/src/cli.js +129 -31
- package/src/cloudflare/index.js +6 -0
- package/src/cloudflare/runtime-status.js +393 -0
- package/src/cloudflare/wrangler.js +17 -1
- package/src/commands/account-auth.js +1 -1
- package/src/commands/app.js +106 -0
- package/src/commands/autorag.js +77 -0
- package/src/commands/brand.js +293 -0
- package/src/commands/cad.js +1 -0
- package/src/commands/connections.js +126 -29
- package/src/commands/context-economics.js +8 -0
- package/src/commands/db.js +7 -0
- package/src/commands/deploy.js +2 -2
- package/src/commands/env.js +5 -4
- package/src/commands/eval.js +209 -14
- package/src/commands/go.js +365 -0
- package/src/commands/goap.js +176 -0
- package/src/commands/identity-init.js +27 -3
- package/src/commands/identity-protocol.js +195 -0
- package/src/commands/knowledge.js +64 -5
- package/src/commands/mcp.js +341 -0
- package/src/commands/merkle-persist.js +3 -1
- package/src/commands/merkle.js +18 -3
- package/src/commands/models.js +109 -23
- package/src/commands/plugins.js +175 -0
- package/src/commands/preferences.js +28 -8
- package/src/commands/product.js +53 -10
- package/src/commands/providers.js +389 -0
- package/src/commands/resume.js +9 -5
- package/src/commands/runtime-status.js +154 -0
- package/src/commands/shell.js +469 -54
- package/src/commands/status.js +82 -7
- package/src/commands/tunnel.js +228 -195
- package/src/commands/whoami.js +115 -22
- package/src/context/budget.js +6 -0
- package/src/context/index.js +2 -1
- package/src/context/project-card.js +75 -0
- package/src/errors/contract.js +34 -211
- package/src/errors/diagnostic.js +95 -50
- package/src/errors/index.js +6 -13
- package/src/eval/index.js +6 -0
- package/src/eval/live.js +439 -0
- package/src/features/resolve.js +242 -0
- package/src/go/build.js +108 -0
- package/src/go/cloudflare.js +207 -0
- package/src/go/contract.js +139 -0
- package/src/go/discover.js +96 -0
- package/src/go/index.js +13 -0
- package/src/go/receipts.js +77 -0
- package/src/go/registry.js +223 -0
- package/src/go/verify.js +31 -0
- package/src/index.js +100 -1
- package/src/knowledge/config.js +13 -5
- package/src/knowledge/engine.js +23 -8
- package/src/knowledge/index.js +1 -0
- package/src/knowledge/lane-registry.js +46 -0
- package/src/knowledge/providers/gemini.js +48 -8
- package/src/knowledge/service/client.js +13 -1
- package/src/knowledge/service/grpc-codec.js +156 -53
- package/src/knowledge/service/job-engine.js +133 -11
- package/src/knowledge/service/job-worker.js +34 -5
- package/src/knowledge/service/server.js +10 -1
- package/src/knowledge/store-discovery.js +77 -0
- package/src/lib/account-session.js +100 -25
- package/src/lib/agent-instructions.js +3 -0
- package/src/lib/auth.js +318 -51
- package/src/lib/cad/blender.js +42 -3
- package/src/lib/cad/d1-project-store.js +43 -0
- package/src/lib/cad/discovery.js +616 -0
- package/src/lib/cad/docker-executor.js +352 -0
- package/src/lib/cad/freecad.js +253 -0
- package/src/lib/cad/index.js +40 -0
- package/src/lib/cad/openscad.js +198 -0
- package/src/lib/cad/project-cli.d.ts +2 -0
- package/src/lib/cad/project-cli.js +21 -0
- package/src/lib/cad/project-contract.d.ts +3 -0
- package/src/lib/cad/project-contract.js +1 -0
- package/src/lib/cad/project-recipe.js +30 -0
- package/src/lib/cad/project-runtime.d.ts +2 -0
- package/src/lib/cad/project-runtime.js +53 -0
- package/src/lib/cad/project-store.js +25 -0
- package/src/lib/cad/project-workflows.js +31 -0
- package/src/lib/cad-docker.js +21 -2
- package/src/lib/cli-preferences.js +17 -2
- package/src/lib/core-client.js +97 -33
- package/src/lib/deploy/local-studio.js +6 -5
- package/src/lib/detect-context.js +14 -16
- package/src/lib/dockerize.js +3 -0
- package/src/lib/execution-approvals.js +1 -0
- package/src/lib/identity-scaffold.js +4 -1
- package/src/lib/knowledge-docker.js +9 -1
- package/src/lib/local-sessions.js +124 -34
- package/src/lib/local-status.js +35 -14
- package/src/lib/project-config.js +9 -0
- package/src/lib/provider-credentials.js +233 -55
- package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
- package/src/lib/scaffold/wizards/cms.js +2 -8
- package/src/lib/scaffold/wizards/worker-api.js +2 -8
- package/src/lib/slash-commands.js +10 -2
- package/src/local/migrations.js +109 -1
- package/src/local/runtime-store.js +31 -5
- package/src/local/sqlite.js +36 -1
- package/src/mcp/authority.js +348 -0
- package/src/mcp/client-adapters.js +431 -0
- package/src/mcp/client.js +172 -0
- package/src/mcp/index.js +47 -0
- package/src/mcp/telemetry.js +103 -0
- package/src/models/catalog.js +329 -51
- package/src/models/discovery.js +59 -4
- package/src/models/index.js +2 -0
- package/src/models/inventory-core.js +182 -0
- package/src/models/policy.js +20 -0
- package/src/plugins/cloudflare.js +103 -0
- package/src/plugins/completeful.js +69 -0
- package/src/plugins/contracts.js +86 -0
- package/src/plugins/index.js +11 -0
- package/src/plugins/registry.js +207 -0
- package/src/plugins/resource-scope.js +45 -0
- package/src/plugins/runtime.js +118 -0
- package/src/plugins/vectorize.js +31 -0
- package/src/progression/engine.js +171 -0
- package/src/progression/index.js +1 -0
- package/src/providers/cloudflare-chat.js +1 -1
- package/src/providers/gemini-generate-content.js +2 -1
- package/src/providers/openai-responses.js +45 -16
- package/src/providers/tool-schema.js +85 -0
- package/src/repository/index.js +29 -0
- package/src/rpc/generated/errors_pb.js +961 -1
- package/src/security/local-vault.js +415 -0
- package/src/security/process.js +20 -4
- package/src/status/actions.js +192 -0
- package/src/tools/hydrate.js +5 -1
- package/src/tools/index.js +7 -0
- package/src/tools/redact.js +64 -0
- package/src/tools/registry.js +83 -0
- package/src/tools/runtime.js +257 -0
- package/src/tools/search.js +21 -8
- package/src/ui/ansi.js +117 -3
- package/src/ui/cli/activity.js +76 -7
- package/src/ui/cli/footer.js +110 -9
- package/src/ui/cli/help.js +14 -5
- package/src/ui/wireframes.js +166 -0
- package/test/account-session.test.mjs +76 -11
- package/test/apps-scaffold-contract.test.mjs +58 -0
- package/test/capabilities.test.mjs +1 -1
- package/test/cli/eval-live.test.mjs +219 -0
- package/test/cli/go.test.mjs +71 -0
- package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
- package/test/cli/mcp-client.test.mjs +245 -0
- package/test/cli/runtime-ui.test.mjs +69 -2
- package/test/cli/status-actions.test.mjs +88 -0
- package/test/cli/wireframes-go-registry.test.mjs +54 -0
- package/test/cloudflare-connector.test.mjs +3 -6
- package/test/cloudflare-runtime.test.mjs +8 -1
- package/test/context.test.mjs +15 -0
- package/test/error-diagnostics.test.mjs +9 -0
- package/test/fixtures/cad/courtyard-house.json +208 -0
- package/test/go/cloudflare-probe.test.mjs +53 -0
- package/test/integration/app-command.test.mjs +55 -0
- package/test/integration/cad-discovery.test.mjs +158 -0
- package/test/integration/cad-docker-executor.test.mjs +249 -0
- package/test/integration/cad-execution.test.mjs +184 -0
- package/test/integration/cad-project-app.test.mjs +31 -0
- package/test/integration/cad-project-d1.test.mjs +25 -0
- package/test/integration/cad-project-native.test.mjs +24 -0
- package/test/integration/cad-project-workflow.test.mjs +9 -0
- package/test/integration/cad-project.test.mjs +82 -0
- package/test/integration/cli-help.test.mjs +4 -0
- package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
- package/test/integration/core-client.integration.test.mjs +55 -0
- package/test/integration/error-runtime-rpc.test.mjs +71 -0
- package/test/integration/features-resolve.test.mjs +128 -0
- package/test/integration/install-script.test.mjs +107 -0
- package/test/integration/inventory-core.test.mjs +53 -0
- package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
- package/test/integration/provider-env-cli.test.mjs +1 -1
- package/test/integration/runtime-migrations.test.mjs +6 -1
- package/test/integration/runtime-status.integration.test.mjs +211 -0
- package/test/integration/scaffold-cloudflare.test.mjs +46 -0
- package/test/integration/storage-architecture.test.mjs +154 -0
- package/test/integration/store-discovery.test.mjs +44 -0
- package/test/integration/terminal-exec.integration.test.mjs +86 -0
- package/test/integration/tool-runtime.test.mjs +124 -0
- package/test/integration/tool-schema.test.mjs +59 -0
- package/test/knowledge-service.test.mjs +4 -0
- package/test/local-sessions.test.mjs +11 -2
- package/test/local-studio-deploy.test.mjs +1 -1
- package/test/model-catalog.test.mjs +28 -1
- package/test/models.test.mjs +159 -5
- package/test/openai-responses.test.mjs +60 -0
- package/test/provider-credentials.test.mjs +15 -5
- package/test/responses-runner.test.mjs +321 -6
- package/test/sdk-worker-contract.test.mjs +5 -1
- package/test/shell.test.mjs +149 -4
- package/test/smoke.mjs +4 -3
- package/test/tools-search.test.mjs +33 -0
- package/test/unit/website-assets-bindings.test.mjs +60 -0
- package/test/whoami-resume.test.mjs +87 -7
- package/examples/gorilla-shell/README.md +0 -15
- package/src/lib/gorilla-template.js +0 -54
- package/src/lib/prompt-byok.js +0 -57
- package/src/lib/save-sdk-token.js +0 -19
- package/templates/gorilla-shell/App.tsx +0 -639
- package/templates/gorilla-shell/README.md +0 -34
- package/templates/gorilla-shell/index.html +0 -15
- package/templates/gorilla-shell/main.jsx +0 -9
- package/templates/gorilla-shell/package.json +0 -19
- package/templates/gorilla-shell/vite.config.js +0 -21
|
@@ -1,13 +1,23 @@
|
|
|
1
|
+
import { compileToolSchema, restoreOptionalArguments } from '../providers/tool-schema.js';
|
|
1
2
|
import { createHash } from 'node:crypto';
|
|
2
3
|
import path from 'node:path';
|
|
3
|
-
import { assessContextUsage, compileAgentInstructions, createContextBudget, estimateContextTokens, truncateResultText } from '../context/index.js';
|
|
4
|
-
import { getModelRecord, calculateModelCost } from '../models/index.js';
|
|
4
|
+
import { assessContextUsage, compileAgentInstructions, createContextBudget, estimateContextTokens, truncateResultText, resolveProjectContext, buildProjectCard } from '../context/index.js';
|
|
5
|
+
import { getModelRecord, calculateModelCost, loadModelPolicy } from '../models/index.js';
|
|
5
6
|
import { searchToolCards, hydrateToolSchemas } from '../tools/index.js';
|
|
6
7
|
import { createAgentEvent } from '../telemetry/index.js';
|
|
7
8
|
import { diagnosticFromError } from '../errors/index.js';
|
|
9
|
+
import { runAgentSamModelTurn } from './model-turn.js';
|
|
8
10
|
|
|
9
11
|
const RUNTIME_OWNED_KEYS = new Set(['account_id', 'user_id', 'tenant_id', 'workspace_id', 'connection_id', 'runtime_lease_id', 'execution_id']);
|
|
10
12
|
|
|
13
|
+
// A single integer ceiling ("die after 8 rounds") is not a meaningful safety
|
|
14
|
+
// invariant for genuine engineering work -- it stops runs mid-task for no
|
|
15
|
+
// reason tied to risk, cost, or progress. Replace it with named modes so
|
|
16
|
+
// callers pick a budget that matches the work, while `quick` preserves the
|
|
17
|
+
// exact previous default (8) for any caller that doesn't opt in.
|
|
18
|
+
const RUN_MODE_BUDGETS = Object.freeze({ quick: 8, interactive: 32, agent: 128, long: 512 });
|
|
19
|
+
const DEFAULT_NO_PROGRESS_LIMIT = 4;
|
|
20
|
+
|
|
11
21
|
function clean(value) { return value == null ? '' : String(value).trim(); }
|
|
12
22
|
function hash(value) { return `sha256:${createHash('sha256').update(String(value)).digest('hex')}`; }
|
|
13
23
|
function event(emit, type, payload, runId) { if (typeof emit === 'function') emit(createAgentEvent(type, payload, { runId })); }
|
|
@@ -18,14 +28,31 @@ export function capabilityFunctionName(id) {
|
|
|
18
28
|
return `as_${source.slice(0, 45)}_${createHash('sha256').update(source).digest('hex').slice(0, 10)}`;
|
|
19
29
|
}
|
|
20
30
|
|
|
31
|
+
// A turn's tool surface is a relevance-scored, maxTools-capped subset of the
|
|
32
|
+
// full capability catalog (see buildAgentToolSurface). Provider conversation
|
|
33
|
+
// state (previousResponseId) can carry a tool name from an earlier turn into
|
|
34
|
+
// a later turn whose narrower surface no longer hydrated that capability, so
|
|
35
|
+
// the model can legitimately call a real, executable capability whose alias
|
|
36
|
+
// simply isn't in *this round's* toolSurface.aliases map. Before treating
|
|
37
|
+
// that as an unrecognized/hallucinated call, check it against the adapter's
|
|
38
|
+
// full executable catalog: if the alias resolves to a real, currently
|
|
39
|
+
// invocable capability, honor it rather than failing a legitimate call.
|
|
40
|
+
export function resolveCapabilityFallback(capabilityAdapter, aliasName) {
|
|
41
|
+
if (!capabilityAdapter?.toolDescriptors) return null;
|
|
42
|
+
const fullCatalog = capabilityAdapter.toolDescriptors({ includeUnavailable: false });
|
|
43
|
+
const descriptor = fullCatalog.find((row) => capabilityFunctionName(row.name) === aliasName);
|
|
44
|
+
if (!descriptor) return null;
|
|
45
|
+
return { capabilityId: descriptor.name, descriptor };
|
|
46
|
+
}
|
|
47
|
+
|
|
21
48
|
function userMessage(text) {
|
|
22
49
|
return { role: 'user', content: [{ type: 'input_text', text: String(text) }] };
|
|
23
50
|
}
|
|
24
51
|
|
|
25
|
-
function modelBudget(record) {
|
|
52
|
+
function modelBudget(record, policyOverride = null) {
|
|
26
53
|
const windowTokens = Number(record?.context_window);
|
|
27
54
|
if (!Number.isFinite(windowTokens) || windowTokens <= 0) return null;
|
|
28
|
-
const policy = record.context_policy || {};
|
|
55
|
+
const policy = { ...(record.context_policy || {}), ...(policyOverride || {}) };
|
|
29
56
|
return createContextBudget({
|
|
30
57
|
windowTokens,
|
|
31
58
|
targetInputTokens: policy.target_input_tokens,
|
|
@@ -33,10 +60,71 @@ function modelBudget(record) {
|
|
|
33
60
|
interveneAtTokens: policy.intervene_at_tokens,
|
|
34
61
|
maxNormalInputTokens: policy.max_normal_input_tokens,
|
|
35
62
|
pricingThresholdTokens: policy.pricing_threshold_tokens,
|
|
63
|
+
maxCumulativeInputTokens: policy.max_cumulative_input_tokens,
|
|
36
64
|
safetyMarginTokens: policy.safety_margin_tokens,
|
|
37
65
|
});
|
|
38
66
|
}
|
|
39
67
|
|
|
68
|
+
const UNKNOWN_WINDOW_CONTEXT_LIMITS = Object.freeze({
|
|
69
|
+
maxSystemChars: 24_000,
|
|
70
|
+
maxEvidenceChars: 48_000,
|
|
71
|
+
maxItemChars: 16_000,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
function resolveUnknownWindowContext(cwd, card, contextItems = []) {
|
|
75
|
+
const rules = compileAgentInstructions(cwd, { maxChars: UNKNOWN_WINDOW_CONTEXT_LIMITS.maxSystemChars });
|
|
76
|
+
let remainingEvidenceChars = UNKNOWN_WINDOW_CONTEXT_LIMITS.maxEvidenceChars;
|
|
77
|
+
const included = [{
|
|
78
|
+
kind: 'repo',
|
|
79
|
+
ref: 'project://card',
|
|
80
|
+
priority: 100,
|
|
81
|
+
content: card.content,
|
|
82
|
+
chars: card.content.length,
|
|
83
|
+
}];
|
|
84
|
+
const deferred = [];
|
|
85
|
+
|
|
86
|
+
for (const item of contextItems) {
|
|
87
|
+
const ref = clean(item?.ref) || 'context://anonymous';
|
|
88
|
+
if (remainingEvidenceChars <= 0) {
|
|
89
|
+
deferred.push(ref);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const source = String(item?.content ?? '');
|
|
93
|
+
if (!source) continue;
|
|
94
|
+
const maxChars = Math.max(1, Math.min(UNKNOWN_WINDOW_CONTEXT_LIMITS.maxItemChars, remainingEvidenceChars));
|
|
95
|
+
const bounded = truncateResultText(source, maxChars);
|
|
96
|
+
included.push(Object.freeze({
|
|
97
|
+
...item,
|
|
98
|
+
ref,
|
|
99
|
+
content: bounded.text,
|
|
100
|
+
chars: bounded.chars,
|
|
101
|
+
...(bounded.truncated ? { truncated: true, source_chars: bounded.source_chars } : {}),
|
|
102
|
+
}));
|
|
103
|
+
remainingEvidenceChars -= bounded.chars;
|
|
104
|
+
if (bounded.truncated) deferred.push(ref + '#remainder');
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const evidenceChars = UNKNOWN_WINDOW_CONTEXT_LIMITS.maxEvidenceChars - remainingEvidenceChars;
|
|
108
|
+
return Object.freeze({
|
|
109
|
+
objective_window_known: false,
|
|
110
|
+
rules,
|
|
111
|
+
items: Object.freeze(included),
|
|
112
|
+
receipt: Object.freeze({
|
|
113
|
+
estimate_kind: 'local',
|
|
114
|
+
window_tokens: null,
|
|
115
|
+
utilization_ratio: null,
|
|
116
|
+
pressure: 'unknown',
|
|
117
|
+
system_chars: rules.chars,
|
|
118
|
+
evidence_chars: evidenceChars,
|
|
119
|
+
sources_considered: contextItems.length + 1,
|
|
120
|
+
sources_included: included.length,
|
|
121
|
+
sources_deferred: deferred.length,
|
|
122
|
+
deferred_refs: Object.freeze(deferred),
|
|
123
|
+
fallback_policy: 'bounded_unknown_model_window',
|
|
124
|
+
}),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
40
128
|
export function buildAgentToolSurface(capabilityAdapter, objective, options = {}) {
|
|
41
129
|
if (!capabilityAdapter?.toolDescriptors) throw new TypeError('capabilityAdapter.toolDescriptors is required');
|
|
42
130
|
const catalog = capabilityAdapter.toolDescriptors({ includeUnavailable: false });
|
|
@@ -51,8 +139,10 @@ export function buildAgentToolSurface(capabilityAdapter, objective, options = {}
|
|
|
51
139
|
type: 'function',
|
|
52
140
|
name: alias,
|
|
53
141
|
description: descriptor.description,
|
|
54
|
-
parameters:
|
|
55
|
-
|
|
142
|
+
parameters: ['openai', 'grok', 'gemini'].includes(options.schemaProvider)
|
|
143
|
+
? compileToolSchema({ provider: options.schemaProvider, canonicalSchema: descriptor.input_schema, strict: descriptor.strict !== false, name: alias }).providerSchema
|
|
144
|
+
: descriptor.input_schema || { type: 'object', properties: {}, required: [], additionalProperties: false },
|
|
145
|
+
strict: descriptor.strict !== false,
|
|
56
146
|
});
|
|
57
147
|
});
|
|
58
148
|
return Object.freeze({
|
|
@@ -64,7 +154,7 @@ export function buildAgentToolSurface(capabilityAdapter, objective, options = {}
|
|
|
64
154
|
cards_returned: searched.receipt.returned_items,
|
|
65
155
|
card_chars: searched.receipt.chars,
|
|
66
156
|
hydrated_tools: hydrated.receipt.hydrated_tools,
|
|
67
|
-
hydrated_schema_chars:
|
|
157
|
+
hydrated_schema_chars: tools.reduce((sum, tool) => sum + JSON.stringify(tool.parameters).length, 0),
|
|
68
158
|
deferred_tools: Object.freeze(hydrated.receipt.deferred_tools),
|
|
69
159
|
}),
|
|
70
160
|
});
|
|
@@ -127,21 +217,80 @@ function assertEconomicPreflight(projectedTokens, budget, allowOverride) {
|
|
|
127
217
|
if (projectedTokens >= budget.compactAtTokens) throw new Error(`context_preflight_compaction_required:${projectedTokens}>=${budget.compactAtTokens}`);
|
|
128
218
|
}
|
|
129
219
|
|
|
130
|
-
|
|
220
|
+
function cumulativeInputTokens(usage) {
|
|
221
|
+
return Math.max(0, Math.floor(Number(usage?.cumulative?.input_tokens ?? usage?.input_tokens ?? 0)));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function toolOutputInput(outputs) {
|
|
225
|
+
return outputs.map((row) => ({
|
|
226
|
+
type: 'function_call_output',
|
|
227
|
+
call_id: row.call_id,
|
|
228
|
+
output: typeof row.output === 'string' ? row.output : JSON.stringify(row.output ?? null),
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export async function runAgentSamTurn(options = {}) {
|
|
131
233
|
const provider = options.provider;
|
|
132
234
|
if (!provider?.create || !provider?.continueWithToolOutputs) throw new TypeError('Responses provider adapter is required');
|
|
133
235
|
if (!options.capabilityAdapter) throw new TypeError('capabilityAdapter is required');
|
|
236
|
+
// Keep provider wire-format handling behind the inference-only boundary.
|
|
237
|
+
// This runner owns context, authorization, and the tool loop; the model
|
|
238
|
+
// adapter only returns a normalized turn (the raw provider response is
|
|
239
|
+
// retained below for continuation bookkeeping).
|
|
240
|
+
const modelTurn = async (request) => {
|
|
241
|
+
const turn = await runAgentSamModelTurn(request);
|
|
242
|
+
return turn.raw;
|
|
243
|
+
};
|
|
134
244
|
const cwd = path.resolve(options.cwd || process.cwd());
|
|
135
245
|
const objective = clean(options.prompt);
|
|
136
246
|
if (!objective) throw new TypeError('prompt is required');
|
|
137
|
-
const
|
|
138
|
-
if (!
|
|
247
|
+
const baseRecord = options.modelRecord || getModelRecord(options.model);
|
|
248
|
+
if (!baseRecord) throw new RangeError(`unknown model: ${options.model}`);
|
|
139
249
|
const reasoningEffort = clean(options.reasoningEffort || 'auto');
|
|
140
250
|
const serviceTier = clean(options.serviceTier || 'default');
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const
|
|
251
|
+
const dynamicPolicy = options.modelPolicy || (options.policyDb
|
|
252
|
+
? await loadModelPolicy(options.policyDb, { provider: baseRecord.provider, modelKey: baseRecord.model_key })
|
|
253
|
+
: null);
|
|
254
|
+
const record = dynamicPolicy
|
|
255
|
+
? Object.freeze({ ...baseRecord, context_policy: Object.freeze({ ...(baseRecord.context_policy || {}), ...dynamicPolicy }) })
|
|
256
|
+
: baseRecord;
|
|
257
|
+
const budget = modelBudget(record, dynamicPolicy);
|
|
258
|
+
let instructions;
|
|
259
|
+
let resolvedContext = null;
|
|
260
|
+
if (options.instructions == null) {
|
|
261
|
+
const card = buildProjectCard(cwd, {
|
|
262
|
+
activeTaskId: options.activeTaskId || options.taskId,
|
|
263
|
+
lockedBy: options.lockedBy,
|
|
264
|
+
checkpointSha: options.checkpointSha,
|
|
265
|
+
beliefs: options.beliefs || options.workspaceState,
|
|
266
|
+
});
|
|
267
|
+
resolvedContext = budget
|
|
268
|
+
? resolveProjectContext({
|
|
269
|
+
cwd,
|
|
270
|
+
objective,
|
|
271
|
+
budget,
|
|
272
|
+
items: [
|
|
273
|
+
{
|
|
274
|
+
kind: 'repo',
|
|
275
|
+
ref: 'project://card',
|
|
276
|
+
priority: 100,
|
|
277
|
+
content: card.content,
|
|
278
|
+
},
|
|
279
|
+
...(options.contextItems || []),
|
|
280
|
+
],
|
|
281
|
+
})
|
|
282
|
+
: resolveUnknownWindowContext(cwd, card, options.contextItems || []);
|
|
283
|
+
const cardContent = resolvedContext.items.find((i) => i.ref === 'project://card')?.content || card.content;
|
|
284
|
+
const extraContent = resolvedContext.items
|
|
285
|
+
.filter((i) => i.ref !== 'project://card')
|
|
286
|
+
.map((i) => i.content)
|
|
287
|
+
.join('\n\n');
|
|
288
|
+
const ruleContent = resolvedContext.rules?.content || '';
|
|
289
|
+
instructions = [cardContent, extraContent, ruleContent].filter(Boolean).join('\n\n');
|
|
290
|
+
} else {
|
|
291
|
+
instructions = String(options.instructions);
|
|
292
|
+
}
|
|
293
|
+
const toolSurface = buildAgentToolSurface(options.capabilityAdapter, objective, { ...options, schemaProvider: record.provider });
|
|
145
294
|
const emit = options.emit;
|
|
146
295
|
const runId = options.runId;
|
|
147
296
|
event(emit, 'tool.search', toolSurface.receipt, runId);
|
|
@@ -152,6 +301,12 @@ export async function runResponsesAgent(options = {}) {
|
|
|
152
301
|
: previousResponseId ? { previous_response_id: previousResponseId } : null;
|
|
153
302
|
let priorActiveTokens = options.previousUsageSnapshot?.current_context?.input_tokens;
|
|
154
303
|
let input = objective;
|
|
304
|
+
const pendingCompactedInput = providerState?.compacted_input;
|
|
305
|
+
if (!previousResponseId && Array.isArray(providerState?.compacted_input)) {
|
|
306
|
+
input = [...providerState.compacted_input, userMessage(objective)];
|
|
307
|
+
providerState = { ...providerState, compacted_input: undefined, compaction_input: undefined, has_compacted_input: undefined };
|
|
308
|
+
priorActiveTokens = null;
|
|
309
|
+
}
|
|
155
310
|
let compacted = null;
|
|
156
311
|
let projected = projectedInputTokens({ instructions, input, toolSurface, priorActiveTokens, budget });
|
|
157
312
|
|
|
@@ -161,15 +316,19 @@ export async function runResponsesAgent(options = {}) {
|
|
|
161
316
|
modelRecord: record,
|
|
162
317
|
previousResponseId,
|
|
163
318
|
providerState,
|
|
319
|
+
input: !previousResponseId && pendingCompactedInput ? pendingCompactedInput : undefined,
|
|
164
320
|
instructions,
|
|
165
321
|
promptCacheKey: options.promptCacheKey,
|
|
166
322
|
tokensBefore: Number.isFinite(priorActiveTokens) ? priorActiveTokens : projected,
|
|
167
323
|
emit,
|
|
168
324
|
runId,
|
|
169
325
|
});
|
|
170
|
-
if (Array.isArray(compacted.output)
|
|
171
|
-
|
|
172
|
-
|
|
326
|
+
if (!Array.isArray(compacted.output) || !compacted.output.length) throw new Error('provider_compaction_output_missing');
|
|
327
|
+
input = [...compacted.output, userMessage(objective)];
|
|
328
|
+
// The returned output is the canonical input; do not prepend it again in the adapter.
|
|
329
|
+
providerState = null;
|
|
330
|
+
previousResponseId = null;
|
|
331
|
+
if (typeof options.onCompaction === 'function') await options.onCompaction(compacted);
|
|
173
332
|
priorActiveTokens = null;
|
|
174
333
|
projected = projectedInputTokens({ instructions, input, toolSurface, priorActiveTokens, budget });
|
|
175
334
|
}
|
|
@@ -212,22 +371,42 @@ export async function runResponsesAgent(options = {}) {
|
|
|
212
371
|
pressure: pressure?.stage ?? 'unknown',
|
|
213
372
|
projected_max_call_cost_usd: projectedCost?.total_usd ?? null,
|
|
214
373
|
tool_surface: toolSurface.receipt,
|
|
374
|
+
resolver_receipt: resolvedContext?.receipt || null,
|
|
215
375
|
}, runId);
|
|
216
376
|
|
|
217
377
|
let cumulativeUsage = options.cumulativeUsage || null;
|
|
378
|
+
let observedCumulativeInput = Number(cumulativeUsage?.input_tokens || 0);
|
|
379
|
+
const observeCumulativeInput = (snapshot) => {
|
|
380
|
+
const reported = Number(snapshot?.cumulative?.input_tokens);
|
|
381
|
+
if (Number.isFinite(reported) && reported >= 0) observedCumulativeInput = Math.max(observedCumulativeInput, reported);
|
|
382
|
+
else {
|
|
383
|
+
const perCall = Number(snapshot?.input_tokens || 0);
|
|
384
|
+
if (Number.isFinite(perCall) && perCall > 0) observedCumulativeInput += perCall;
|
|
385
|
+
}
|
|
386
|
+
return observedCumulativeInput;
|
|
387
|
+
};
|
|
388
|
+
if (compacted?.usage_delta || compacted?.usage) {
|
|
389
|
+
const delta = compacted.usage_delta || compacted.usage;
|
|
390
|
+
cumulativeUsage = Object.fromEntries(['input_tokens', 'output_tokens', 'cached_input_tokens', 'cache_write_tokens', 'reasoning_tokens'].map(key => [key, Number(cumulativeUsage?.[key] || 0) + Number(delta[key] || 0)]));
|
|
391
|
+
}
|
|
218
392
|
let totalCostUsd = 0;
|
|
219
393
|
const costBreakdownUsd = { input: 0, cached_input: 0, cache_write: 0, output: 0 };
|
|
394
|
+
const continuationCompactions = [];
|
|
395
|
+
let continuationGuardTriggered = false;
|
|
220
396
|
const accumulateCost = (cost) => {
|
|
221
397
|
totalCostUsd += Number(cost?.total_usd || 0);
|
|
222
398
|
for (const key of Object.keys(costBreakdownUsd)) costBreakdownUsd[key] += Number(cost?.components_usd?.[key] || 0);
|
|
223
399
|
};
|
|
224
|
-
|
|
400
|
+
accumulateCost(compacted?.cost);
|
|
401
|
+
let response = await modelTurn({
|
|
402
|
+
provider,
|
|
225
403
|
model: record.provider_model_id,
|
|
226
404
|
modelRecord: record,
|
|
227
405
|
input,
|
|
228
406
|
instructions,
|
|
229
407
|
reasoningEffort,
|
|
230
408
|
serviceTier,
|
|
409
|
+
autoCompact: options.autoCompact,
|
|
231
410
|
tools: toolSurface.tools,
|
|
232
411
|
previousResponseId: previousResponseId || undefined,
|
|
233
412
|
providerState,
|
|
@@ -238,23 +417,40 @@ export async function runResponsesAgent(options = {}) {
|
|
|
238
417
|
runId,
|
|
239
418
|
});
|
|
240
419
|
accumulateCost(response.cost);
|
|
420
|
+
observeCumulativeInput(response.usage_snapshot);
|
|
241
421
|
providerState = response.provider_state || (response.response_id ? { previous_response_id: response.response_id } : providerState);
|
|
242
422
|
cumulativeUsage = response.usage_snapshot?.cumulative || cumulativeUsage;
|
|
243
423
|
|
|
244
424
|
const toolReceipts = [];
|
|
245
|
-
const maxToolRounds = Number.isInteger(options.maxToolRounds) && options.maxToolRounds > 0
|
|
425
|
+
const maxToolRounds = Number.isInteger(options.maxToolRounds) && options.maxToolRounds > 0
|
|
426
|
+
? options.maxToolRounds
|
|
427
|
+
: (RUN_MODE_BUDGETS[options.runMode] ?? RUN_MODE_BUDGETS.quick);
|
|
428
|
+
const maxNoProgressRounds = Number.isInteger(options.maxNoProgressRounds) && options.maxNoProgressRounds > 0
|
|
429
|
+
? options.maxNoProgressRounds
|
|
430
|
+
: DEFAULT_NO_PROGRESS_LIMIT;
|
|
431
|
+
const runStartedAt = Date.now();
|
|
432
|
+
let toolCallCount = 0;
|
|
433
|
+
let lastRoundSignature = null;
|
|
434
|
+
let repeatedRoundCount = 0;
|
|
246
435
|
let rounds = 0;
|
|
247
436
|
while (response.tool_calls?.length) {
|
|
248
437
|
rounds += 1;
|
|
249
438
|
if (rounds > maxToolRounds) throw new Error(`tool_round_limit_exceeded:${maxToolRounds}`);
|
|
439
|
+
toolCallCount += response.tool_calls.length;
|
|
440
|
+
const roundSignatureParts = [];
|
|
250
441
|
const outputs = [];
|
|
251
442
|
const activeTokens = response.usage_snapshot?.current_context?.input_tokens;
|
|
252
443
|
const maxToolChars = toolResultCharBudget(activeTokens, budget);
|
|
253
444
|
for (const call of response.tool_calls) {
|
|
254
|
-
|
|
445
|
+
let capabilityId = toolSurface.aliases.get(call.name);
|
|
446
|
+
let descriptor = capabilityId ? toolSurface.descriptors.find((row) => row.name === capabilityId) : null;
|
|
447
|
+
if (!capabilityId) {
|
|
448
|
+
const fallback = resolveCapabilityFallback(options.capabilityAdapter, call.name);
|
|
449
|
+
if (fallback) { capabilityId = fallback.capabilityId; descriptor = fallback.descriptor; }
|
|
450
|
+
}
|
|
255
451
|
if (!capabilityId) throw new Error(`unrecognized_tool_call:${call.name}`);
|
|
256
|
-
const
|
|
257
|
-
|
|
452
|
+
const args = sanitizeToolInput(restoreOptionalArguments(parseArguments(call.arguments), descriptor?.input_schema), descriptor, cwd);
|
|
453
|
+
roundSignatureParts.push(`${capabilityId}:${JSON.stringify(args)}`);
|
|
258
454
|
if (typeof options.beforeTool === 'function') {
|
|
259
455
|
const approved = await options.beforeTool({
|
|
260
456
|
call_id: call.call_id,
|
|
@@ -294,24 +490,81 @@ export async function runResponsesAgent(options = {}) {
|
|
|
294
490
|
outputs.push({ call_id: call.call_id, output: JSON.stringify({ ok: false, error: diagnostic }) });
|
|
295
491
|
}
|
|
296
492
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
493
|
+
const roundSignature = roundSignatureParts.slice().sort().join('|');
|
|
494
|
+
repeatedRoundCount = (roundSignature && roundSignature === lastRoundSignature) ? repeatedRoundCount + 1 : 0;
|
|
495
|
+
lastRoundSignature = roundSignature;
|
|
496
|
+
if (repeatedRoundCount >= maxNoProgressRounds) {
|
|
497
|
+
throw new Error(`no_progress_detected:${repeatedRoundCount + 1}`);
|
|
498
|
+
}
|
|
499
|
+
const nextCumulativeInput = Math.max(cumulativeInputTokens(response.usage_snapshot), observedCumulativeInput);
|
|
500
|
+
const cumulativeLimit = budget?.maxCumulativeInputTokens ?? null;
|
|
501
|
+
const guardrailCrossed = cumulativeLimit != null && nextCumulativeInput > cumulativeLimit;
|
|
502
|
+
if (guardrailCrossed && !options.allowEconomicOverride && continuationGuardTriggered) {
|
|
503
|
+
throw new Error(`cumulative_input_guardrail_exceeded:${nextCumulativeInput}>${cumulativeLimit}`);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
if (guardrailCrossed && !options.allowEconomicOverride && !continuationGuardTriggered) {
|
|
507
|
+
if (typeof provider.compact !== 'function') {
|
|
508
|
+
throw new Error(`cumulative_input_compaction_unavailable:${nextCumulativeInput}>${cumulativeLimit}`);
|
|
509
|
+
}
|
|
510
|
+
const midTurnCompaction = await provider.compact({
|
|
511
|
+
model: record.provider_model_id,
|
|
512
|
+
modelRecord: record,
|
|
513
|
+
previousResponseId: response.response_id,
|
|
514
|
+
providerState: response.provider_state || providerState,
|
|
515
|
+
instructions,
|
|
516
|
+
promptCacheKey: options.promptCacheKey,
|
|
517
|
+
tokensBefore: response.usage_snapshot?.current_context?.input_tokens || nextCumulativeInput,
|
|
518
|
+
emit,
|
|
519
|
+
runId,
|
|
520
|
+
});
|
|
521
|
+
if (!Array.isArray(midTurnCompaction.output) || !midTurnCompaction.output.length) throw new Error('provider_compaction_output_missing');
|
|
522
|
+
continuationCompactions.push(midTurnCompaction);
|
|
523
|
+
accumulateCost(midTurnCompaction.cost);
|
|
524
|
+
const delta = midTurnCompaction.usage_delta || midTurnCompaction.usage;
|
|
525
|
+
if (delta) {
|
|
526
|
+
cumulativeUsage = Object.fromEntries(['input_tokens', 'output_tokens', 'cached_input_tokens', 'cache_write_tokens', 'reasoning_tokens'].map(key => [key, Number(cumulativeUsage?.[key] || 0) + Number(delta[key] || 0)]));
|
|
527
|
+
}
|
|
528
|
+
continuationGuardTriggered = true;
|
|
529
|
+
response = await modelTurn({
|
|
530
|
+
provider,
|
|
531
|
+
model: record.provider_model_id,
|
|
532
|
+
modelRecord: record,
|
|
533
|
+
input: [...midTurnCompaction.output, ...toolOutputInput(outputs)],
|
|
534
|
+
instructions,
|
|
535
|
+
reasoningEffort,
|
|
536
|
+
serviceTier,
|
|
537
|
+
autoCompact: options.autoCompact,
|
|
538
|
+
tools: toolSurface.tools,
|
|
539
|
+
maxOutputTokens,
|
|
540
|
+
promptCacheKey: options.promptCacheKey,
|
|
541
|
+
cumulativeUsage,
|
|
542
|
+
emit,
|
|
543
|
+
runId,
|
|
544
|
+
});
|
|
545
|
+
} else {
|
|
546
|
+
response = await modelTurn({
|
|
547
|
+
provider,
|
|
548
|
+
model: record.provider_model_id,
|
|
549
|
+
previousResponseId: response.response_id,
|
|
550
|
+
providerState: response.provider_state || providerState,
|
|
551
|
+
modelRecord: record,
|
|
552
|
+
toolOutputs: outputs,
|
|
553
|
+
instructions,
|
|
554
|
+
reasoningEffort,
|
|
555
|
+
serviceTier,
|
|
556
|
+
autoCompact: options.autoCompact,
|
|
557
|
+
tools: toolSurface.tools,
|
|
558
|
+
maxOutputTokens,
|
|
559
|
+
promptCacheKey: options.promptCacheKey,
|
|
560
|
+
cumulativeUsage,
|
|
561
|
+
emit,
|
|
562
|
+
runId,
|
|
563
|
+
});
|
|
564
|
+
}
|
|
313
565
|
accumulateCost(response.cost);
|
|
314
566
|
providerState = response.provider_state || (response.response_id ? { previous_response_id: response.response_id } : providerState);
|
|
567
|
+
observeCumulativeInput(response.usage_snapshot);
|
|
315
568
|
cumulativeUsage = response.usage_snapshot?.cumulative || cumulativeUsage;
|
|
316
569
|
}
|
|
317
570
|
|
|
@@ -341,6 +594,16 @@ export async function runResponsesAgent(options = {}) {
|
|
|
341
594
|
cost_breakdown_usd: Object.freeze({ ...costBreakdownUsd }),
|
|
342
595
|
tool_surface: toolSurface.receipt,
|
|
343
596
|
tool_receipts: Object.freeze(toolReceipts),
|
|
597
|
+
run_budget: Object.freeze({
|
|
598
|
+
run_mode: options.runMode || 'quick',
|
|
599
|
+
max_tool_rounds: maxToolRounds,
|
|
600
|
+
tool_rounds: rounds,
|
|
601
|
+
tool_calls: toolCallCount,
|
|
602
|
+
elapsed_ms: Date.now() - runStartedAt,
|
|
603
|
+
max_no_progress_rounds: maxNoProgressRounds,
|
|
604
|
+
}),
|
|
605
|
+
compaction: compacted ? { compaction_id: compacted.compaction_id, provider: record.provider, model: record.provider_model_id, created_at: new Date().toISOString(), usage: compacted.usage_delta || compacted.usage || {}, cost_usd: compacted.cost?.total_usd || 0 } : null,
|
|
606
|
+
continuation_compactions: Object.freeze(continuationCompactions.map((row) => ({ compaction_id: row.compaction_id, provider: record.provider, model: record.provider_model_id, usage: row.usage_delta || row.usage || {}, cost_usd: row.cost?.total_usd || 0 }))),
|
|
344
607
|
compacted_before_turn: Boolean(compacted),
|
|
345
608
|
provider_state: providerState,
|
|
346
609
|
continuation: Object.freeze({
|
|
@@ -351,3 +614,6 @@ export async function runResponsesAgent(options = {}) {
|
|
|
351
614
|
}),
|
|
352
615
|
});
|
|
353
616
|
}
|
|
617
|
+
|
|
618
|
+
/** @deprecated Use runAgentSamTurn(). */
|
|
619
|
+
export const runResponsesAgent = runAgentSamTurn;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { runProcess } from '../security/process.js';
|
|
4
|
+
import { redactDiagnosticValue } from '../errors/index.js';
|
|
5
|
+
|
|
6
|
+
const COMMAND_RE = /^[A-Za-z0-9][A-Za-z0-9._+-]*$/;
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
8
|
+
const MAX_TIMEOUT_MS = 900_000;
|
|
9
|
+
const DEFAULT_OUTPUT_BYTES = 512 * 1024;
|
|
10
|
+
const MAX_OUTPUT_BYTES = 2 * 1024 * 1024;
|
|
11
|
+
|
|
12
|
+
function clean(value) { return value == null ? '' : String(value).trim(); }
|
|
13
|
+
|
|
14
|
+
// spawn() never invokes a shell for non-Windows commands (see security/process.js),
|
|
15
|
+
// so a leading `~` in a cwd override or an argv entry (e.g. `git -C ~/repo`) is never
|
|
16
|
+
// expanded by the OS. Expand it ourselves, matching standard shell semantics: only a
|
|
17
|
+
// leading `~` or `~/...` is special, never `~` mid-string.
|
|
18
|
+
function expandHome(value) {
|
|
19
|
+
const str = clean(value);
|
|
20
|
+
if (str !== '~' && !str.startsWith('~/')) return str;
|
|
21
|
+
const home = os.homedir();
|
|
22
|
+
if (!home) return str;
|
|
23
|
+
return str === '~' ? home : path.join(home, str.slice(2));
|
|
24
|
+
}
|
|
25
|
+
function boundedInteger(value, fallback, max) {
|
|
26
|
+
const number = Number(value);
|
|
27
|
+
if (!Number.isInteger(number) || number < 1) return fallback;
|
|
28
|
+
return Math.min(number, max);
|
|
29
|
+
}
|
|
30
|
+
function projectDirectory(root, relativeCwd = '') {
|
|
31
|
+
const projectRoot = path.resolve(root || process.cwd());
|
|
32
|
+
const directory = path.resolve(projectRoot, clean(relativeCwd) || '.');
|
|
33
|
+
if (directory !== projectRoot && !directory.startsWith(`${projectRoot}${path.sep}`)) {
|
|
34
|
+
throw new Error('terminal_relative_cwd_outside_project');
|
|
35
|
+
}
|
|
36
|
+
return { projectRoot, directory };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function subprocessEnvironment(env = process.env) {
|
|
40
|
+
const blocked = /(?:^|_)(?:TOKEN|SECRET|PASSWORD|PASSCODE|API_KEY|PRIVATE_KEY|AUTHORIZATION|COOKIE|CREDENTIAL)(?:_|$)/i;
|
|
41
|
+
return Object.fromEntries(Object.entries(env || {}).filter(([key]) => !blocked.test(key)));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Run one argv-safe process for the interactive agent.
|
|
46
|
+
*
|
|
47
|
+
* The runtime owns the project root. The model may select only a relative
|
|
48
|
+
* working directory inside that root, and never receives credential-bearing
|
|
49
|
+
* environment variables through this capability.
|
|
50
|
+
*/
|
|
51
|
+
export async function terminalExec(input = {}, options = {}) {
|
|
52
|
+
const command = clean(input.command);
|
|
53
|
+
if (!COMMAND_RE.test(command)) throw new Error('terminal_command_must_be_pathless_executable');
|
|
54
|
+
const args = Array.isArray(input.args) ? input.args.map((value) => expandHome(value)) : [];
|
|
55
|
+
if (args.length > 128) throw new Error('terminal_argument_limit_exceeded');
|
|
56
|
+
const { projectRoot, directory } = projectDirectory(expandHome(input.cwd) || options.cwd, input.relative_cwd);
|
|
57
|
+
const timeoutMs = boundedInteger(input.timeout_ms, DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS);
|
|
58
|
+
const maxBytes = boundedInteger(input.max_output_bytes, DEFAULT_OUTPUT_BYTES, MAX_OUTPUT_BYTES);
|
|
59
|
+
const runner = options.run || runProcess;
|
|
60
|
+
const result = await runner(command, args, {
|
|
61
|
+
cwd: directory,
|
|
62
|
+
timeoutMs,
|
|
63
|
+
maxBytes,
|
|
64
|
+
signal: options.signal,
|
|
65
|
+
env: subprocessEnvironment(options.env || process.env),
|
|
66
|
+
});
|
|
67
|
+
return Object.freeze({
|
|
68
|
+
ok: result.code === 0,
|
|
69
|
+
command,
|
|
70
|
+
args,
|
|
71
|
+
project_root: projectRoot,
|
|
72
|
+
cwd: directory,
|
|
73
|
+
exit_code: result.code,
|
|
74
|
+
signal: result.signal || null,
|
|
75
|
+
stdout: redactDiagnosticValue(String(result.stdout || ''), { maxChars: maxBytes }),
|
|
76
|
+
stderr: redactDiagnosticValue(String(result.stderr || ''), { maxChars: maxBytes }),
|
|
77
|
+
});
|
|
78
|
+
}
|