@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,670 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { execFileSync } from 'node:child_process';
|
|
5
|
+
import { tryResolveGitContext } from './git-context.js';
|
|
6
|
+
import {
|
|
7
|
+
createTicketId,
|
|
8
|
+
createAgentRunId,
|
|
9
|
+
generateTicketCreateSql,
|
|
10
|
+
generateTicketCloseSql,
|
|
11
|
+
} from './tickets.js';
|
|
12
|
+
|
|
13
|
+
function clean(value) {
|
|
14
|
+
return value == null ? '' : String(value).trim();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function sqlEsc(value) {
|
|
18
|
+
return String(value ?? '').replaceAll("'", "''");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function formatDate(epoch) {
|
|
22
|
+
if (!epoch) return 'none';
|
|
23
|
+
const num = Number(epoch);
|
|
24
|
+
return Number.isFinite(num) ? new Date(num * 1000).toISOString().replace('T', ' ').slice(0, 19) : String(epoch);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function executeD1JsonQuery({
|
|
28
|
+
cwd = process.cwd(),
|
|
29
|
+
sql,
|
|
30
|
+
query = null,
|
|
31
|
+
wranglerConfig = 'apps/local-studio/backend/wrangler.jsonc',
|
|
32
|
+
databaseName = 'inneranimalmedia-business',
|
|
33
|
+
}) {
|
|
34
|
+
if (typeof query === 'function') return query(sql);
|
|
35
|
+
const configPath = path.resolve(cwd, wranglerConfig);
|
|
36
|
+
const args = ['d1', 'execute', databaseName, '--remote', '--json'];
|
|
37
|
+
if (fs.existsSync(configPath)) args.push('--config', configPath);
|
|
38
|
+
args.push('--command', sql);
|
|
39
|
+
|
|
40
|
+
const out = execFileSync('npx', ['wrangler', ...args], {
|
|
41
|
+
cwd,
|
|
42
|
+
encoding: 'utf8',
|
|
43
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const startIdx = out.indexOf('[');
|
|
47
|
+
const endIdx = out.lastIndexOf(']');
|
|
48
|
+
if (startIdx === -1 || endIdx === -1) {
|
|
49
|
+
throw new Error(`Invalid JSON output from D1: ${out.slice(0, 200)}`);
|
|
50
|
+
}
|
|
51
|
+
return JSON.parse(out.slice(startIdx, endIdx + 1));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function executeD1WriteSql({
|
|
55
|
+
cwd = process.cwd(),
|
|
56
|
+
sql,
|
|
57
|
+
write = null,
|
|
58
|
+
wranglerConfig = 'apps/local-studio/backend/wrangler.jsonc',
|
|
59
|
+
databaseName = 'inneranimalmedia-business',
|
|
60
|
+
}) {
|
|
61
|
+
if (typeof write === 'function') return write(sql);
|
|
62
|
+
const configPath = path.resolve(cwd, wranglerConfig);
|
|
63
|
+
const tmpFile = path.join(os.tmpdir(), `agentsam-d1-${Date.now()}-${Math.random().toString(36).slice(2, 7)}.sql`);
|
|
64
|
+
fs.writeFileSync(tmpFile, `${sql}\n`, 'utf8');
|
|
65
|
+
|
|
66
|
+
try {
|
|
67
|
+
const args = ['d1', 'execute', databaseName, '--remote', '--yes'];
|
|
68
|
+
if (fs.existsSync(configPath)) args.push('--config', configPath);
|
|
69
|
+
args.push(`--file=${tmpFile}`);
|
|
70
|
+
|
|
71
|
+
return execFileSync('npx', ['wrangler', ...args], {
|
|
72
|
+
cwd,
|
|
73
|
+
encoding: 'utf8',
|
|
74
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
75
|
+
});
|
|
76
|
+
} finally {
|
|
77
|
+
try { fs.unlinkSync(tmpFile); } catch {}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Read the complete GOAP state straight off tables:
|
|
83
|
+
* - agentsam_workspace_state (beliefs, lock, checkpoint)
|
|
84
|
+
* - agentsam_tickets (active goal/task, linked commit, agent run pointer)
|
|
85
|
+
* - agentsam_agent_run (live run status, calls, tokens)
|
|
86
|
+
* - agentsam_work_git_commits (recent commit history)
|
|
87
|
+
* - agentsam_work_tracking_checkpoint (ingest cursor)
|
|
88
|
+
*/
|
|
89
|
+
export async function readGoapState({
|
|
90
|
+
cwd = process.cwd(),
|
|
91
|
+
repositoryId = null,
|
|
92
|
+
accountId = null,
|
|
93
|
+
wranglerConfig = 'apps/local-studio/backend/wrangler.jsonc',
|
|
94
|
+
databaseName = 'inneranimalmedia-business',
|
|
95
|
+
query = null,
|
|
96
|
+
} = {}) {
|
|
97
|
+
const git = tryResolveGitContext({ cwd });
|
|
98
|
+
const repoId = repositoryId || (git?.repoFullName ? `github:${git.repoFullName.toLowerCase()}` : null);
|
|
99
|
+
if (!repoId) return { ok: false, error: 'repository_identity_unresolved', git };
|
|
100
|
+
const accId = clean(accountId);
|
|
101
|
+
if (!accId) return { ok: false, repositoryId: repoId, error: 'account_id_required', git };
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const sql = `
|
|
105
|
+
SELECT * FROM agentsam_workspace_state WHERE repository_id = '${sqlEsc(repoId)}' LIMIT 1;
|
|
106
|
+
SELECT * FROM agentsam_tickets WHERE id = (SELECT current_task_id FROM agentsam_workspace_state WHERE repository_id = '${sqlEsc(repoId)}') AND account_id = '${sqlEsc(accId)}' AND repository_id = '${sqlEsc(repoId)}' LIMIT 1;
|
|
107
|
+
SELECT * FROM agentsam_agent_run WHERE id = (SELECT agent_run_id FROM agentsam_tickets WHERE id = (SELECT current_task_id FROM agentsam_workspace_state WHERE repository_id = '${sqlEsc(repoId)}') AND account_id = '${sqlEsc(accId)}' AND repository_id = '${sqlEsc(repoId)}' LIMIT 1) LIMIT 1;
|
|
108
|
+
SELECT sha, message, committed_at FROM agentsam_work_git_commits WHERE repository_id = '${sqlEsc(repoId)}' ORDER BY committed_at DESC LIMIT 3;
|
|
109
|
+
SELECT * FROM agentsam_work_tracking_checkpoint WHERE repository_id = '${sqlEsc(repoId)}' AND tracker_key = 'git_commit_ingest' LIMIT 1;
|
|
110
|
+
SELECT id, title, status, sort_order FROM agentsam_todo
|
|
111
|
+
WHERE plan_id IN (SELECT id FROM agentsam_plans WHERE agent_run_id = (SELECT agent_run_id FROM agentsam_tickets WHERE id = (SELECT current_task_id FROM agentsam_workspace_state WHERE repository_id = '${sqlEsc(repoId)}') LIMIT 1))
|
|
112
|
+
ORDER BY sort_order, created_at_unix;
|
|
113
|
+
`;
|
|
114
|
+
const data = await executeD1JsonQuery({ cwd, sql, query, wranglerConfig, databaseName });
|
|
115
|
+
const workspaceState = data?.[0]?.results?.[0] || null;
|
|
116
|
+
const activeTicket = data?.[1]?.results?.[0] || null;
|
|
117
|
+
const agentRun = data?.[2]?.results?.[0] || null;
|
|
118
|
+
const recentCommits = data?.[3]?.results || [];
|
|
119
|
+
const checkpoint = data?.[4]?.results?.[0] || null;
|
|
120
|
+
const steps = (data?.[5]?.results || []).map((row) => ({
|
|
121
|
+
id: row.id,
|
|
122
|
+
title: row.title,
|
|
123
|
+
status: row.status,
|
|
124
|
+
sort_order: row.sort_order,
|
|
125
|
+
}));
|
|
126
|
+
|
|
127
|
+
let cursor = {};
|
|
128
|
+
if (checkpoint?.cursor_json) {
|
|
129
|
+
try { cursor = JSON.parse(checkpoint.cursor_json); } catch {}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
ok: true,
|
|
134
|
+
repositoryId: repoId,
|
|
135
|
+
git,
|
|
136
|
+
workspaceState,
|
|
137
|
+
activeTicket,
|
|
138
|
+
agentRun,
|
|
139
|
+
recentCommits,
|
|
140
|
+
checkpoint,
|
|
141
|
+
cursor,
|
|
142
|
+
steps,
|
|
143
|
+
};
|
|
144
|
+
} catch (err) {
|
|
145
|
+
return {
|
|
146
|
+
ok: false,
|
|
147
|
+
repositoryId: repoId,
|
|
148
|
+
git,
|
|
149
|
+
error: err?.stderr || err?.message || String(err),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* List all GOAP tickets/goals for the current repository and workspace.
|
|
156
|
+
*/
|
|
157
|
+
export async function listGoapTickets({
|
|
158
|
+
cwd = process.cwd(),
|
|
159
|
+
repositoryId = null,
|
|
160
|
+
accountId = null,
|
|
161
|
+
limit = 20,
|
|
162
|
+
wranglerConfig = 'apps/local-studio/backend/wrangler.jsonc',
|
|
163
|
+
databaseName = 'inneranimalmedia-business',
|
|
164
|
+
query = null,
|
|
165
|
+
} = {}) {
|
|
166
|
+
const git = tryResolveGitContext({ cwd });
|
|
167
|
+
const repoId = repositoryId || (git?.repoFullName ? `github:${git.repoFullName.toLowerCase()}` : null);
|
|
168
|
+
if (!repoId) return { ok: false, error: 'repository_identity_unresolved', git, tickets: [] };
|
|
169
|
+
|
|
170
|
+
try {
|
|
171
|
+
const accId = clean(accountId);
|
|
172
|
+
if (!accId) return { ok: false, repositoryId: repoId, error: 'account_id_required', tickets: [] };
|
|
173
|
+
const sql = `
|
|
174
|
+
SELECT current_task_id FROM agentsam_workspace_state WHERE repository_id = '${sqlEsc(repoId)}' LIMIT 1;
|
|
175
|
+
SELECT id, title, status, priority, subsystem, surface, agent_run_id, linked_commit,
|
|
176
|
+
account_id, repository_id, owner_ref, created_at, updated_at
|
|
177
|
+
FROM agentsam_tickets
|
|
178
|
+
WHERE account_id = '${sqlEsc(accId)}' AND repository_id = '${sqlEsc(repoId)}'
|
|
179
|
+
ORDER BY
|
|
180
|
+
(id = (SELECT current_task_id FROM agentsam_workspace_state WHERE repository_id = '${sqlEsc(repoId)}' LIMIT 1)) DESC,
|
|
181
|
+
CASE status
|
|
182
|
+
WHEN 'active' THEN 1
|
|
183
|
+
WHEN 'backlog' THEN 2
|
|
184
|
+
WHEN 'blocked' THEN 3
|
|
185
|
+
ELSE 4
|
|
186
|
+
END,
|
|
187
|
+
updated_at DESC
|
|
188
|
+
LIMIT ${Math.max(1, Math.min(Number(limit) || 20, 100))};
|
|
189
|
+
`;
|
|
190
|
+
const data = await executeD1JsonQuery({ cwd, sql, query, wranglerConfig, databaseName });
|
|
191
|
+
const currentTaskId = data?.[0]?.results?.[0]?.current_task_id || null;
|
|
192
|
+
const tickets = data?.[1]?.results || [];
|
|
193
|
+
|
|
194
|
+
return {
|
|
195
|
+
ok: true,
|
|
196
|
+
repositoryId: repoId,
|
|
197
|
+
currentTaskId,
|
|
198
|
+
tickets,
|
|
199
|
+
};
|
|
200
|
+
} catch (err) {
|
|
201
|
+
return {
|
|
202
|
+
ok: false,
|
|
203
|
+
repositoryId: repoId,
|
|
204
|
+
error: err?.stderr || err?.message || String(err),
|
|
205
|
+
tickets: [],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Create and activate a new GOAP goal/ticket.
|
|
212
|
+
*/
|
|
213
|
+
export async function createGoapGoal({
|
|
214
|
+
cwd = process.cwd(),
|
|
215
|
+
title,
|
|
216
|
+
accountId = null,
|
|
217
|
+
priority = 'P2',
|
|
218
|
+
subsystem = 'agent-runtime',
|
|
219
|
+
description = null,
|
|
220
|
+
surface = 'platform',
|
|
221
|
+
status = 'active',
|
|
222
|
+
setActive = true,
|
|
223
|
+
wranglerConfig = 'apps/local-studio/backend/wrangler.jsonc',
|
|
224
|
+
databaseName = 'inneranimalmedia-business',
|
|
225
|
+
write = null,
|
|
226
|
+
} = {}) {
|
|
227
|
+
const cleanTitle = clean(title);
|
|
228
|
+
if (!cleanTitle) throw new Error('title_required');
|
|
229
|
+
|
|
230
|
+
const git = tryResolveGitContext({ cwd });
|
|
231
|
+
const repoId = git?.repoFullName ? `github:${git.repoFullName.toLowerCase()}` : 'github:local/workspace';
|
|
232
|
+
|
|
233
|
+
let accId = clean(accountId);
|
|
234
|
+
if (!accId) throw new Error('account_id_required');
|
|
235
|
+
|
|
236
|
+
const ticketId = createTicketId();
|
|
237
|
+
const agentRunId = createAgentRunId();
|
|
238
|
+
const now = Math.floor(Date.now() / 1000);
|
|
239
|
+
|
|
240
|
+
const { sql: ticketSql } = generateTicketCreateSql({
|
|
241
|
+
accountId: accId,
|
|
242
|
+
ticketId,
|
|
243
|
+
title: cleanTitle,
|
|
244
|
+
description,
|
|
245
|
+
status,
|
|
246
|
+
priority,
|
|
247
|
+
subsystem,
|
|
248
|
+
surface,
|
|
249
|
+
accountIdForTicket: accId,
|
|
250
|
+
repositoryId: repoId,
|
|
251
|
+
ownerRef: repoId,
|
|
252
|
+
source: 'agentsam_sdk',
|
|
253
|
+
agentRunId,
|
|
254
|
+
now,
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
const statements = [ticketSql];
|
|
258
|
+
|
|
259
|
+
if (setActive) {
|
|
260
|
+
const wsId = `ws_${repoId.replace(/[^a-zA-Z0-9_]/g, '_')}`;
|
|
261
|
+
statements.push(`
|
|
262
|
+
INSERT INTO agentsam_workspace_state (
|
|
263
|
+
id, repository_id, workspace_id, current_task_id, locked_by, checkpoint_sha,
|
|
264
|
+
last_agent_action, state_json, created_at, updated_at
|
|
265
|
+
) VALUES (
|
|
266
|
+
'wss_' || lower(hex(randomblob(8))),
|
|
267
|
+
'${sqlEsc(repoId)}',
|
|
268
|
+
'${sqlEsc(wsId)}',
|
|
269
|
+
'${sqlEsc(ticketId)}',
|
|
270
|
+
'agentsam_cli',
|
|
271
|
+
${git?.headSha ? `'${sqlEsc(git.headSha.slice(0, 10))}'` : 'NULL'},
|
|
272
|
+
'created_and_activated_goal',
|
|
273
|
+
'{}',
|
|
274
|
+
${now},
|
|
275
|
+
${now}
|
|
276
|
+
)
|
|
277
|
+
ON CONFLICT(repository_id) DO UPDATE SET
|
|
278
|
+
current_task_id = '${sqlEsc(ticketId)}',
|
|
279
|
+
last_agent_action = 'activated_goal',
|
|
280
|
+
updated_at = ${now};
|
|
281
|
+
`);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
const fullSql = statements.join('\n\n');
|
|
285
|
+
await executeD1WriteSql({ cwd, sql: fullSql, write, wranglerConfig, databaseName });
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
ok: true,
|
|
289
|
+
ticketId,
|
|
290
|
+
agentRunId,
|
|
291
|
+
title: cleanTitle,
|
|
292
|
+
status,
|
|
293
|
+
priority,
|
|
294
|
+
subsystem,
|
|
295
|
+
active: setActive,
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Switch active GOAP focus to an existing ticket.
|
|
301
|
+
*/
|
|
302
|
+
export async function switchGoapGoal({
|
|
303
|
+
cwd = process.cwd(),
|
|
304
|
+
ticketId,
|
|
305
|
+
accountId = null,
|
|
306
|
+
wranglerConfig = 'apps/local-studio/backend/wrangler.jsonc',
|
|
307
|
+
databaseName = 'inneranimalmedia-business',
|
|
308
|
+
query = null,
|
|
309
|
+
write = null,
|
|
310
|
+
} = {}) {
|
|
311
|
+
const tid = clean(ticketId);
|
|
312
|
+
if (!tid) throw new Error('ticket_id_required');
|
|
313
|
+
|
|
314
|
+
const git = tryResolveGitContext({ cwd });
|
|
315
|
+
const repoId = git?.repoFullName ? `github:${git.repoFullName.toLowerCase()}` : 'github:local/workspace';
|
|
316
|
+
const now = Math.floor(Date.now() / 1000);
|
|
317
|
+
const wsId = `ws_${repoId.replace(/[^a-zA-Z0-9_]/g, '_')}`;
|
|
318
|
+
const lookup = await executeD1JsonQuery({
|
|
319
|
+
cwd,
|
|
320
|
+
query,
|
|
321
|
+
wranglerConfig,
|
|
322
|
+
databaseName,
|
|
323
|
+
sql: `SELECT id, account_id, repository_id FROM agentsam_tickets WHERE id = '${sqlEsc(tid)}' LIMIT 1;`,
|
|
324
|
+
});
|
|
325
|
+
const ticket = lookup?.[0]?.results?.[0];
|
|
326
|
+
const accId = clean(accountId);
|
|
327
|
+
if (!ticket) throw new Error('ticket_not_found');
|
|
328
|
+
if (ticket.repository_id && ticket.repository_id !== repoId) throw new Error('ticket_repository_mismatch');
|
|
329
|
+
if (!accId || ticket.account_id !== accId) throw new Error('ticket_account_mismatch');
|
|
330
|
+
const runId = createAgentRunId();
|
|
331
|
+
|
|
332
|
+
const sql = `
|
|
333
|
+
INSERT INTO agentsam_agent_run (
|
|
334
|
+
id, account_id, mode, status, started_at_unix, created_at_unix, updated_at_unix
|
|
335
|
+
) VALUES ('${sqlEsc(runId)}', '${sqlEsc(accId)}', 'agent', 'running', ${now}, ${now}, ${now});
|
|
336
|
+
|
|
337
|
+
UPDATE agentsam_tickets SET
|
|
338
|
+
status = 'active',
|
|
339
|
+
agent_run_id = '${sqlEsc(runId)}',
|
|
340
|
+
updated_at = ${now}
|
|
341
|
+
WHERE id = '${sqlEsc(tid)}';
|
|
342
|
+
|
|
343
|
+
INSERT INTO agentsam_workspace_state (
|
|
344
|
+
id, repository_id, workspace_id, current_task_id, locked_by, checkpoint_sha,
|
|
345
|
+
last_agent_action, state_json, created_at, updated_at
|
|
346
|
+
) VALUES (
|
|
347
|
+
'wss_' || lower(hex(randomblob(8))),
|
|
348
|
+
'${sqlEsc(repoId)}',
|
|
349
|
+
'${sqlEsc(wsId)}',
|
|
350
|
+
'${sqlEsc(tid)}',
|
|
351
|
+
'agentsam_cli',
|
|
352
|
+
${git?.headSha ? `'${sqlEsc(git.headSha.slice(0, 10))}'` : 'NULL'},
|
|
353
|
+
'switched_active_goal',
|
|
354
|
+
'{}',
|
|
355
|
+
${now},
|
|
356
|
+
${now}
|
|
357
|
+
)
|
|
358
|
+
ON CONFLICT(repository_id) DO UPDATE SET
|
|
359
|
+
current_task_id = '${sqlEsc(tid)}',
|
|
360
|
+
last_agent_action = 'switched_active_goal',
|
|
361
|
+
updated_at = ${now};
|
|
362
|
+
`;
|
|
363
|
+
|
|
364
|
+
await executeD1WriteSql({ cwd, sql, write, wranglerConfig, databaseName });
|
|
365
|
+
|
|
366
|
+
return {
|
|
367
|
+
ok: true,
|
|
368
|
+
ticketId: tid,
|
|
369
|
+
repositoryId: repoId,
|
|
370
|
+
agentRunId: runId,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Close/ship the active GOAP goal or a specified ticket.
|
|
376
|
+
*/
|
|
377
|
+
export async function closeGoapGoal({
|
|
378
|
+
cwd = process.cwd(),
|
|
379
|
+
ticketId = null,
|
|
380
|
+
status = 'shipped',
|
|
381
|
+
statusReason = null,
|
|
382
|
+
linkedCommit = null,
|
|
383
|
+
clearActive = true,
|
|
384
|
+
accountId = null,
|
|
385
|
+
wranglerConfig = 'apps/local-studio/backend/wrangler.jsonc',
|
|
386
|
+
databaseName = 'inneranimalmedia-business',
|
|
387
|
+
query = null,
|
|
388
|
+
write = null,
|
|
389
|
+
} = {}) {
|
|
390
|
+
const git = tryResolveGitContext({ cwd });
|
|
391
|
+
const repoId = git?.repoFullName ? `github:${git.repoFullName.toLowerCase()}` : 'github:local/workspace';
|
|
392
|
+
const now = Math.floor(Date.now() / 1000);
|
|
393
|
+
|
|
394
|
+
let tid = clean(ticketId);
|
|
395
|
+
if (!tid) {
|
|
396
|
+
const existing = await readGoapState({ cwd, accountId, wranglerConfig, databaseName, query });
|
|
397
|
+
tid = existing?.workspaceState?.current_task_id || existing?.activeTicket?.id;
|
|
398
|
+
}
|
|
399
|
+
if (!tid) throw new Error('no_active_ticket_to_close');
|
|
400
|
+
const lookup = await executeD1JsonQuery({
|
|
401
|
+
cwd,
|
|
402
|
+
query,
|
|
403
|
+
wranglerConfig,
|
|
404
|
+
databaseName,
|
|
405
|
+
sql: `SELECT id, account_id, repository_id FROM agentsam_tickets WHERE id = '${sqlEsc(tid)}' LIMIT 1;`,
|
|
406
|
+
});
|
|
407
|
+
const ticket = lookup?.[0]?.results?.[0];
|
|
408
|
+
const accId = clean(accountId);
|
|
409
|
+
if (!ticket) throw new Error('ticket_not_found');
|
|
410
|
+
if (ticket.repository_id && ticket.repository_id !== repoId) throw new Error('ticket_repository_mismatch');
|
|
411
|
+
if (!accId || ticket.account_id !== accId) throw new Error('ticket_account_mismatch');
|
|
412
|
+
|
|
413
|
+
const commitSha = clean(linkedCommit) || clean(git?.headSha) || null;
|
|
414
|
+
const { sql: closeSql } = generateTicketCloseSql({
|
|
415
|
+
ticketId: tid,
|
|
416
|
+
status,
|
|
417
|
+
statusReason: statusReason || `closed_via_goap_${status}`,
|
|
418
|
+
linkedCommit: commitSha,
|
|
419
|
+
now,
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
const statements = [closeSql];
|
|
423
|
+
|
|
424
|
+
if (clearActive) {
|
|
425
|
+
statements.push(`
|
|
426
|
+
UPDATE agentsam_workspace_state SET
|
|
427
|
+
current_task_id = NULL,
|
|
428
|
+
last_agent_action = 'closed_task_${sqlEsc(tid)}_${sqlEsc(status)}',
|
|
429
|
+
updated_at = ${now}
|
|
430
|
+
WHERE repository_id = '${sqlEsc(repoId)}';
|
|
431
|
+
`);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const fullSql = statements.join('\n\n');
|
|
435
|
+
await executeD1WriteSql({ cwd, sql: fullSql, write, wranglerConfig, databaseName });
|
|
436
|
+
|
|
437
|
+
return {
|
|
438
|
+
ok: true,
|
|
439
|
+
ticketId: tid,
|
|
440
|
+
status,
|
|
441
|
+
linkedCommit: commitSha,
|
|
442
|
+
clearedActive: clearActive,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Render GOAP status view.
|
|
448
|
+
*/
|
|
449
|
+
export function renderGoapStatus(state = {}) {
|
|
450
|
+
const ws = state.workspaceState || {};
|
|
451
|
+
const ticket = state.activeTicket || {};
|
|
452
|
+
const run = state.agentRun || {};
|
|
453
|
+
const cp = state.cursor || {};
|
|
454
|
+
const git = state.git || {};
|
|
455
|
+
const headSha = git?.revisionSha || git?.headSha || 'unknown';
|
|
456
|
+
|
|
457
|
+
return [
|
|
458
|
+
'================================================================================',
|
|
459
|
+
' GOAP BLACKBOARD STATUS ',
|
|
460
|
+
'================================================================================',
|
|
461
|
+
`Repository: ${state.repositoryId || git?.repoFullName || 'unknown'}`,
|
|
462
|
+
`Branch / HEAD: ${git?.branch || 'main'} @ ${headSha !== 'unknown' ? headSha.slice(0, 10) : 'unknown'} (${git?.dirty ? 'DIRTY' : 'CLEAN'})`,
|
|
463
|
+
`Locked By: ${ws.locked_by || 'unlocked'}`,
|
|
464
|
+
`Active Task: ${ws.current_task_id || ticket.id || 'none'}`,
|
|
465
|
+
`Task Title: ${ticket.title || 'no active ticket'}`,
|
|
466
|
+
`Task Status: ${ticket.status || 'none'} [Priority: ${ticket.priority || 'P2'}] [Subsystem: ${ticket.subsystem || 'general'}]`,
|
|
467
|
+
`Agent Run: ${ticket.agent_run_id || run.id || 'none'} [Status: ${run.status || 'none'}] [Mode: ${run.mode || 'agent'}]`,
|
|
468
|
+
`Linked Commit: ${ticket.linked_commit ? ticket.linked_commit.slice(0, 10) : 'none'}`,
|
|
469
|
+
`Checkpoint: ${ws.checkpoint_sha ? ws.checkpoint_sha.slice(0, 10) : 'none'} (Tracker cursor: ${cp.last_sha ? cp.last_sha.slice(0, 10) : 'none'})`,
|
|
470
|
+
`Last Action: ${ws.last_agent_action || 'none'}`,
|
|
471
|
+
`Updated: ${formatDate(ws.updated_at || ticket.updated_at)}`,
|
|
472
|
+
'--------------------------------------------------------------------------------',
|
|
473
|
+
`Recent Ingested Commits (${state.recentCommits?.length || 0}):`,
|
|
474
|
+
...(state.recentCommits && state.recentCommits.length
|
|
475
|
+
? state.recentCommits.map((c) => ` * ${c.sha.slice(0, 8)} ${c.message?.slice(0, 65)} (${formatDate(c.committed_at)})`)
|
|
476
|
+
: [' (no commits ingested yet)']),
|
|
477
|
+
'================================================================================',
|
|
478
|
+
].join('\n');
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Render GOAP list view.
|
|
483
|
+
*/
|
|
484
|
+
export function renderGoapList(state = {}) {
|
|
485
|
+
const tickets = Array.isArray(state) ? state : (state.tickets || []);
|
|
486
|
+
const currentTaskId = state.currentTaskId || state.activeTaskId || null;
|
|
487
|
+
|
|
488
|
+
const header = [
|
|
489
|
+
'================================================================================',
|
|
490
|
+
' GOAP TICKETS & GOALS ',
|
|
491
|
+
'================================================================================',
|
|
492
|
+
];
|
|
493
|
+
|
|
494
|
+
if (!tickets.length) {
|
|
495
|
+
return [
|
|
496
|
+
...header,
|
|
497
|
+
' (no tickets found in agentsam_tickets)',
|
|
498
|
+
'',
|
|
499
|
+
' To create a new goal, run:',
|
|
500
|
+
' agentsam goap new "Your goal title" [--priority P1] [--subsystem sys]',
|
|
501
|
+
'================================================================================',
|
|
502
|
+
].join('\n');
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const rows = [
|
|
506
|
+
' ACT STATUS PRI TICKET ID TITLE',
|
|
507
|
+
' --- -------- ---- -------------------------- -----------------------------',
|
|
508
|
+
];
|
|
509
|
+
|
|
510
|
+
for (const t of tickets) {
|
|
511
|
+
const isActive = Boolean(currentTaskId && t.id === currentTaskId);
|
|
512
|
+
const actMark = isActive ? ' * ' : ' ';
|
|
513
|
+
const status = (t.status || 'open').padEnd(8).slice(0, 8);
|
|
514
|
+
const pri = (t.priority || 'P2').padEnd(4).slice(0, 4);
|
|
515
|
+
const id = (t.id || '').padEnd(26).slice(0, 26);
|
|
516
|
+
const title = (t.title || 'untitled').slice(0, 42);
|
|
517
|
+
rows.push(` ${actMark} ${status} ${pri} ${id} ${title}`);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return [
|
|
521
|
+
...header,
|
|
522
|
+
...rows,
|
|
523
|
+
'--------------------------------------------------------------------------------',
|
|
524
|
+
' * = active blackboard goal',
|
|
525
|
+
' Commands:',
|
|
526
|
+
' agentsam goap new "<title>" Create and activate a new goal',
|
|
527
|
+
' agentsam goap switch <ticket_id> Switch active goal focus',
|
|
528
|
+
' agentsam goap close [ticket_id] Close/ship active goal',
|
|
529
|
+
'================================================================================',
|
|
530
|
+
].join('\n');
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Render GOAP goal view.
|
|
535
|
+
*/
|
|
536
|
+
export function renderGoapGoal(state = {}) {
|
|
537
|
+
const ws = state.workspaceState || {};
|
|
538
|
+
const ticket = state.activeTicket || {};
|
|
539
|
+
const run = state.agentRun || {};
|
|
540
|
+
|
|
541
|
+
return [
|
|
542
|
+
'================================================================================',
|
|
543
|
+
' GOAP ACTIVE GOAL ',
|
|
544
|
+
'================================================================================',
|
|
545
|
+
`Goal ID: ${ticket.id || ws.current_task_id || 'none'}`,
|
|
546
|
+
`Title: ${ticket.title || 'no goal active'}`,
|
|
547
|
+
`Priority: ${ticket.priority || 'P2'}`,
|
|
548
|
+
`Subsystem: ${ticket.subsystem || 'general'}`,
|
|
549
|
+
`Surface: ${ticket.surface || 'platform'}`,
|
|
550
|
+
`Status: ${ticket.status || 'none'}`,
|
|
551
|
+
`Reason: ${ticket.status_reason || 'primary sprint goal'}`,
|
|
552
|
+
'--------------------------------------------------------------------------------',
|
|
553
|
+
'EXECUTION RUN ENVELOPE:',
|
|
554
|
+
`Agent Run ID: ${ticket.agent_run_id || run.id || 'unassigned'}`,
|
|
555
|
+
`Run Status: ${run.status || 'unknown'}`,
|
|
556
|
+
`Run Mode: ${run.mode || 'agent'}`,
|
|
557
|
+
`Started At: ${formatDate(run.started_at_unix)}`,
|
|
558
|
+
`Calls / Tools: ${run.model_call_count || 0} model / ${run.tool_call_count || 0} tool calls`,
|
|
559
|
+
'--------------------------------------------------------------------------------',
|
|
560
|
+
'GOAL SUCCESS CRITERIA:',
|
|
561
|
+
' 1. Verify code changes pass local tests and typecheck.',
|
|
562
|
+
' 2. Commit changes with a why-focused message.',
|
|
563
|
+
' 3. Sync commit to agentsam_work_git_commits & advance checkpoint.',
|
|
564
|
+
` 4. Populate agentsam_tickets.linked_commit for ${ticket.id || 'active task'}.`,
|
|
565
|
+
' 5. Transition ticket to shipped and complete agent_run.',
|
|
566
|
+
'================================================================================',
|
|
567
|
+
].join('\n');
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Render GOAP why view.
|
|
572
|
+
*/
|
|
573
|
+
export function renderGoapWhy(state = {}) {
|
|
574
|
+
const ws = state.workspaceState || {};
|
|
575
|
+
const ticket = state.activeTicket || {};
|
|
576
|
+
const git = state.git || {};
|
|
577
|
+
const headSha = git?.revisionSha || git?.headSha || 'unknown';
|
|
578
|
+
|
|
579
|
+
return [
|
|
580
|
+
'================================================================================',
|
|
581
|
+
' GOAP BELIEF GROUNDING (WHY) ',
|
|
582
|
+
'================================================================================',
|
|
583
|
+
`Question: Why is task [${ticket.id || ws.current_task_id || 'none'}] active right now?`,
|
|
584
|
+
'',
|
|
585
|
+
'BELIEF FOUNDATIONS:',
|
|
586
|
+
` 1. Repository Identity: ${state.repositoryId || git?.repoFullName || 'unknown'}`,
|
|
587
|
+
` - Workspace lock is held by '${ws.locked_by || 'agentsam_cli'}'.`,
|
|
588
|
+
` - Current HEAD is ${headSha !== 'unknown' ? headSha.slice(0, 10) : 'unknown'} (${git?.dirty ? 'working tree dirty' : 'clean'}).`,
|
|
589
|
+
'',
|
|
590
|
+
` 2. Ticket Priority & Assignment:`,
|
|
591
|
+
` - Ticket [${ticket.id || ws.current_task_id || 'none'}] is marked '${ticket.status || 'active'}' with priority '${ticket.priority || 'P2'}'.`,
|
|
592
|
+
` - Subsystem: '${ticket.subsystem || 'agent-runtime'}'.`,
|
|
593
|
+
` - Title: ${ticket.title || 'no active ticket'}`,
|
|
594
|
+
'',
|
|
595
|
+
` 3. Operational Provenance:`,
|
|
596
|
+
` - Linked Agent Run: ${ticket.agent_run_id || 'none'}`,
|
|
597
|
+
` - Checkpoint Commit: ${ws.checkpoint_sha ? ws.checkpoint_sha.slice(0, 10) : 'none'}`,
|
|
598
|
+
` - Linked Commit: ${ticket.linked_commit ? ticket.linked_commit.slice(0, 10) : 'pending commit'}`,
|
|
599
|
+
` - Last Agent Action: ${ws.last_agent_action || 'none'}`,
|
|
600
|
+
'',
|
|
601
|
+
'CONCLUSION:',
|
|
602
|
+
ticket.id
|
|
603
|
+
? ` The agent selected this action because ticket [${ticket.id}] has active operator\n focus, satisfies all prerequisite blockers, and is linked to the live workspace belief state.`
|
|
604
|
+
: ' No ticket is currently active. Run `agentsam goap list` or `agentsam goap new` to establish focus.',
|
|
605
|
+
'================================================================================',
|
|
606
|
+
].join('\n');
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* Render GOAP plan view.
|
|
611
|
+
*/
|
|
612
|
+
export function renderGoapPlan(state = {}) {
|
|
613
|
+
const ws = state.workspaceState || {};
|
|
614
|
+
const ticket = state.activeTicket || {};
|
|
615
|
+
const run = state.agentRun || {};
|
|
616
|
+
const git = state.git || {};
|
|
617
|
+
|
|
618
|
+
let steps = [];
|
|
619
|
+
if (Array.isArray(state.steps) && state.steps.length > 0) {
|
|
620
|
+
steps = state.steps.map((step) => ({
|
|
621
|
+
text: step.title || step.text || String(step),
|
|
622
|
+
status: step.status || 'open',
|
|
623
|
+
}));
|
|
624
|
+
} else if (ticket.plan_steps && Array.isArray(ticket.plan_steps)) {
|
|
625
|
+
steps = ticket.plan_steps;
|
|
626
|
+
} else if (ticket.description) {
|
|
627
|
+
const lines = ticket.description.split('\n')
|
|
628
|
+
.map((l) => l.trim())
|
|
629
|
+
.filter((l) => /^(\d+\.|\*|\-|\-\s*\[[ x]\])/i.test(l));
|
|
630
|
+
if (lines.length > 0) {
|
|
631
|
+
steps = lines.map((l) => l.replace(/^(\d+\.|\*|\-\s*\[[ x]\]|\-)\s*/, '').trim());
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
if (!steps.length) {
|
|
636
|
+
if (ticket.title) {
|
|
637
|
+
steps = [
|
|
638
|
+
`Step 1: Understand context and isolate scope for "${ticket.title}"`,
|
|
639
|
+
`Step 2: Implement focused changes with test-driven verification`,
|
|
640
|
+
`Step 3: Run repository test suite and verify build integrity`,
|
|
641
|
+
`Step 4: Commit changes with why-focused message linked to ${ticket.id || 'ticket'}`,
|
|
642
|
+
`Step 5: Transition ticket ${ticket.id || ''} to shipped and finalize agent run`,
|
|
643
|
+
];
|
|
644
|
+
} else {
|
|
645
|
+
steps = [
|
|
646
|
+
'No active goal selected. Use `agentsam goap new "<title>"` or `agentsam goap switch <ticket_id>` to select a goal.',
|
|
647
|
+
];
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
return [
|
|
652
|
+
'================================================================================',
|
|
653
|
+
' GOAP OPERATIONAL ACTION PLAN ',
|
|
654
|
+
'================================================================================',
|
|
655
|
+
`Objective: ${ticket.title || 'No active goal selected'}`,
|
|
656
|
+
`Active Ticket: ${ticket.id || ws.current_task_id || 'none'} [Priority: ${ticket.priority || 'P2'}]`,
|
|
657
|
+
`Active Run: ${ticket.agent_run_id || run.id || 'none'}`,
|
|
658
|
+
`Repository: ${state.repositoryId || git?.repoFullName || 'unknown'}`,
|
|
659
|
+
'',
|
|
660
|
+
'PLANNED ACTION SEQUENCE:',
|
|
661
|
+
...steps.map((step, idx) => {
|
|
662
|
+
const text = typeof step === 'string' ? step : step.text;
|
|
663
|
+
const status = typeof step === 'string' ? 'open' : step.status;
|
|
664
|
+
const prefix = text.startsWith('Step ') || /^\d+\./.test(text) ? '' : `Step ${idx + 1}: `;
|
|
665
|
+
const marker = status === 'complete' ? 'x' : status === 'blocked' ? '!' : ' ';
|
|
666
|
+
return ` [${marker}] ${prefix}${text}`;
|
|
667
|
+
}),
|
|
668
|
+
'================================================================================',
|
|
669
|
+
].join('\n');
|
|
670
|
+
}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
export { resolveGitContext, tryResolveGitContext, normalizeGitRemote } from './git-context.js';
|
|
2
2
|
export * from './contracts.js';
|
|
3
3
|
export * from './merkle/index.js';
|
|
4
|
+
export * from './work-tracking.js';
|
|
5
|
+
export * from './tickets.js';
|
|
6
|
+
export * from './workspace-state.js';
|
|
7
|
+
export * from './goap.js';
|
|
8
|
+
|
|
@@ -225,7 +225,7 @@ export function buildMerklePersistencePlan({
|
|
|
225
225
|
|
|
226
226
|
export function merklePersistenceUpsertSql(row) {
|
|
227
227
|
return `INSERT INTO ${MERKLE_SNAPSHOT_TABLE} (
|
|
228
|
-
snapshot_id, account_id, repository_id,
|
|
228
|
+
snapshot_id, account_id, repository_id, source,
|
|
229
229
|
manifest_format, manifest_version, hash_algorithm, root_hash, policy_hash,
|
|
230
230
|
resolved_commit_sha, resolved_tree_sha, git_branch, working_tree_dirty,
|
|
231
231
|
connection_id, runtime_lease_id, storage_backend, storage_bucket, storage_key,
|
|
@@ -233,7 +233,7 @@ export function merklePersistenceUpsertSql(row) {
|
|
|
233
233
|
capture_kind, deployment_id, worker_version_id, reference_label,
|
|
234
234
|
created_at, persisted_at, metadata_root, classifier_format, classifier_version, classifier_source
|
|
235
235
|
) VALUES (
|
|
236
|
-
${sqlText(row.snapshot_id)}, ${sqlText(row.account_id)}, ${sqlText(row.repository_id)}, ${sqlText(row.
|
|
236
|
+
${sqlText(row.snapshot_id)}, ${sqlText(row.account_id)}, ${sqlText(row.repository_id)}, ${sqlText(row.source)},
|
|
237
237
|
${sqlText(row.manifest_format)}, ${sqlInt(row.manifest_version)}, ${sqlText(row.hash_algorithm)}, ${sqlText(row.root_hash)}, ${sqlText(row.policy_hash)},
|
|
238
238
|
${sqlText(row.resolved_commit_sha)}, ${sqlText(row.resolved_tree_sha)}, ${sqlText(row.git_branch)}, ${sqlInt(row.working_tree_dirty)},
|
|
239
239
|
${sqlText(row.connection_id)}, ${sqlText(row.runtime_lease_id)}, ${sqlText(row.storage_backend)}, ${sqlText(row.storage_bucket)}, ${sqlText(row.storage_key)},
|