@inneranimalmedia/agentsam-sdk 2.6.2 → 2.6.4
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 +51 -1
- package/README.md +95 -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/bin/agentsam +16 -1
- 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/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
- package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
- package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
- package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
- package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
- package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +28 -0
- package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
- package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
- package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
- package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
- package/docs/architecture/SAM_KERNEL.md +181 -0
- package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
- package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
- package/docs/architecture/STORAGE.md +87 -0
- package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
- package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
- package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -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/d1/0010_portable_tickets_memory.sql +140 -0
- package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
- package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
- package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
- package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
- package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
- package/migrations/d1/0013_identity_oauth_states.sql +15 -0
- package/migrations/d1/0014_auth_event_log.sql +20 -0
- package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
- package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -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/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
- package/package.json +107 -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 +62 -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 +239 -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 +11 -0
- package/packages/agentsam-errors/src/normalize.js +30 -0
- package/packages/agentsam-errors/src/recovery.js +301 -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 +107 -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 +176 -26
- package/packages/connectors/cloudflare/tests/connector.test.mjs +137 -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 +83 -0
- package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
- package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
- package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +31 -0
- package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
- package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
- package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -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 +156 -18
- package/packages/identity/src/adapters/sqlite/index.js +319 -0
- package/packages/identity/src/app/verify-app.js +95 -0
- package/packages/identity/src/contracts/identity-store.js +115 -0
- package/packages/identity/src/contracts/provider.js +3 -2
- package/packages/identity/src/contracts/route-ids.js +30 -0
- package/packages/identity/src/contracts/route-projection.js +218 -0
- package/packages/identity/src/contracts/routes.js +11 -0
- package/packages/identity/src/core/browser-paths.js +4 -5
- package/packages/identity/src/core/constants.js +13 -8
- package/packages/identity/src/core/session-policy.js +32 -0
- package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -9
- package/packages/identity/src/frontend/auth-portal/pages/reset.html +3 -3
- package/packages/identity/src/frontend/auth-portal/pages/signup.html +3 -3
- package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
- package/packages/identity/src/index.js +27 -0
- package/packages/identity/src/oauth/README.md +10 -4
- package/packages/identity/src/oauth/credentials.js +31 -11
- package/packages/identity/src/oauth/finalize-inbound.js +1 -1
- package/packages/identity/src/oauth/iam-platform.js +13 -12
- package/packages/identity/src/oauth/redirect-paths.js +27 -36
- 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 +35 -8
- package/packages/identity/src/server/mount-policy.js +30 -0
- package/packages/identity/src/server/post-auth.js +79 -0
- package/packages/identity/src/server/worker-router.js +153 -66
- package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
- package/packages/identity/tests/iam-provider.test.mjs +1 -1
- package/packages/identity/tests/identity-service.test.mjs +47 -1
- package/packages/identity/tests/oauth-credentials.test.mjs +3 -1
- package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
- package/packages/identity/tests/session-routes-policy.test.mjs +21 -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 +31 -0
- package/packages/theme-church-site/src/harvest.json +14 -0
- package/packages/theme-church-site/src/index.js +85 -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 +31 -0
- package/packages/theme-companions-site/src/harvest.json +12 -0
- package/packages/theme-companions-site/src/index.js +83 -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 +31 -0
- package/packages/theme-floors-site/src/harvest.json +14 -0
- package/packages/theme-floors-site/src/index.js +83 -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 +31 -0
- package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
- package/packages/theme-fuelnfree-site/src/index.js +82 -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 +31 -0
- package/packages/theme-handyman-site/src/harvest.json +10 -0
- package/packages/theme-handyman-site/src/index.js +84 -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 +31 -0
- package/packages/theme-insurance-site/src/harvest.json +10 -0
- package/packages/theme-insurance-site/src/index.js +84 -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 +31 -0
- package/packages/theme-shinshu-site/src/harvest.json +12 -0
- package/packages/theme-shinshu-site/src/index.js +84 -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/apps/agentsam.app.v1.schema.json +51 -0
- package/protocol/brand/brandpack.v1.schema.json +43 -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/credentials/issue.v1.schema.json +38 -0
- package/protocol/database/connection.v1.schema.json +41 -0
- package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
- package/protocol/errors/error-catalog.json +164 -0
- package/protocol/errors/error-envelope.schema.json +678 -0
- package/protocol/errors/recovery.v1.schema.json +50 -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/runtime/workspace-fs.v1.schema.json +71 -0
- package/protocol/sam/activity.v1.schema.json +48 -0
- package/protocol/sam/answer.v1.schema.json +35 -0
- package/protocol/sam/calibration.v1.schema.json +21 -0
- package/protocol/sam/decision-receipt.v1.schema.json +29 -0
- package/protocol/sam/evaluation.v1.schema.json +19 -0
- package/protocol/sam/operation.schema.json +66 -0
- package/protocol/sam/outcome.v1.schema.json +36 -0
- package/protocol/sam/question.v1.schema.json +26 -0
- package/protocol/sam/registry.seed.json +153 -0
- package/protocol/sam/result.schema.json +53 -0
- package/protocol/sam/state.v1.schema.json +23 -0
- package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
- package/protocol/skills/agentsam.skill.v1.schema.json +57 -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/protocol/ui/icon-registry.mjs +226 -0
- package/protocol/ui/icon.v1.schema.json +51 -0
- package/services/cad/server.py +249 -2
- package/skills/README.md +22 -9
- package/skills/agentsam-codebaseindex/SKILL.md +225 -0
- package/skills/catalog.json +14 -0
- 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/command-catalog.js +130 -0
- package/src/cli/dispatch.js +48 -0
- package/src/cli.js +160 -10
- 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/api-key.js +244 -0
- package/src/commands/app.js +138 -0
- package/src/commands/autorag.js +77 -0
- package/src/commands/brand.js +291 -0
- package/src/commands/cad.js +1 -0
- package/src/commands/codebaseindex.js +688 -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 +155 -27
- package/src/commands/eval.js +209 -14
- package/src/commands/go.js +678 -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/interaction-clack.js +115 -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 +110 -24
- 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 +173 -44
- package/src/commands/resume.js +9 -5
- package/src/commands/runtime-status.js +154 -0
- package/src/commands/shell.js +508 -56
- package/src/commands/skill.js +248 -0
- package/src/commands/skills.js +1 -1
- package/src/commands/start-local.js +4 -0
- package/src/commands/status.js +82 -7
- package/src/commands/tunnel.js +228 -195
- package/src/commands/whoami.js +156 -12
- 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 +298 -0
- package/src/go/cloudflare.js +608 -0
- package/src/go/container.js +120 -0
- package/src/go/contract.js +144 -0
- package/src/go/discover.js +212 -0
- package/src/go/index.js +25 -0
- package/src/go/native-probe-runner.mjs +119 -0
- package/src/go/official-registry.js +280 -0
- package/src/go/official-release.js +10 -0
- package/src/go/receipts.js +144 -0
- package/src/go/verify.js +38 -0
- package/src/index.js +127 -1
- package/src/indexing/ingest/discover-models.js +298 -0
- package/src/indexing/ingest/inventory.js +243 -0
- package/src/indexing/ingest/job-graph.js +181 -0
- package/src/indexing/ingest/materials.js +210 -0
- 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 +136 -32
- 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/local-fs/capability.js +121 -0
- package/src/local-fs/freshness.js +75 -0
- package/src/local-fs/index.js +385 -0
- package/src/local-fs/paths.js +100 -0
- package/src/local-pty/server.js +295 -19
- 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/ai-access-onboarding.js +112 -0
- package/src/models/catalog.js +329 -51
- package/src/models/discovery.js +34 -6
- package/src/models/index.js +2 -0
- package/src/models/inventory-core.js +190 -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/sam/activity/index.js +183 -0
- package/src/sam/client.js +252 -0
- package/src/sam/decision/calibration.js +109 -0
- package/src/sam/decision/confidence.js +126 -0
- package/src/sam/decision/evaluate.js +157 -0
- package/src/sam/decision/evaluators/deterministic.js +341 -0
- package/src/sam/decision/evaluators/heuristic.js +61 -0
- package/src/sam/decision/evaluators/select.js +50 -0
- package/src/sam/decision/evaluators/semantic.js +149 -0
- package/src/sam/decision/hierarchical.js +61 -0
- package/src/sam/decision/index.js +53 -0
- package/src/sam/decision/policy.js +86 -0
- package/src/sam/decision/questions.js +120 -0
- package/src/sam/decision/receipt.js +148 -0
- package/src/sam/decision/state.js +117 -0
- package/src/sam/decision/types.js +22 -0
- package/src/sam/decision/validate.js +200 -0
- package/src/sam/define.js +51 -0
- package/src/sam/index.js +65 -0
- package/src/sam/operations/brand-scan.js +62 -0
- package/src/sam/operations/cad-blender-inspect.js +36 -0
- package/src/sam/operations/codebaseindex-ingest.js +49 -0
- package/src/sam/operations/decision-evaluate.js +59 -0
- package/src/sam/operations/planning-astar.js +77 -0
- package/src/sam/operations/planning-goap.js +60 -0
- package/src/sam/operations/repository-inspect.js +72 -0
- package/src/sam/operations/security-scan.js +33 -0
- package/src/sam/operations/terminal-exec.js +29 -0
- package/src/sam/planning/astar.js +311 -0
- package/src/sam/planning/goap.js +177 -0
- package/src/sam/planning/index.js +21 -0
- package/src/sam/planning/state.js +84 -0
- package/src/sam/registry.js +48 -0
- package/src/sam/result.js +77 -0
- package/src/sam/seed.js +44 -0
- package/src/sam/types.js +91 -0
- package/src/security/local-vault.js +415 -0
- package/src/security/process.js +20 -4
- package/src/skills/catalog.js +64 -0
- package/src/skills/content-resolver.js +124 -0
- package/src/skills/hosted-store.js +37 -0
- package/src/skills/index.js +29 -64
- package/src/skills/interaction.js +102 -0
- package/src/skills/local-store.js +228 -0
- package/src/skills/manifest.js +104 -0
- package/src/skills/metrics.js +31 -0
- package/src/skills/registry.js +184 -0
- package/src/skills/runtime.js +287 -0
- package/src/skills/slash.js +44 -0
- 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 +96 -96
- 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/api-key-env-whoami.test.mjs +129 -0
- package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
- package/test/cli/eval-live.test.mjs +219 -0
- package/test/cli/go.test.mjs +128 -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/skill-npm-and-env.test.mjs +52 -0
- package/test/cli/status-actions.test.mjs +88 -0
- package/test/cli/wireframes-go-registry.test.mjs +139 -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/build-source-identity.test.mjs +31 -0
- package/test/go/cloudflare-probe.test.mjs +317 -0
- package/test/go/distribution.test.mjs +28 -0
- package/test/integration/ai-access-onboarding.test.mjs +47 -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 +5 -1
- package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
- package/test/integration/codebaseindex-ingest.test.mjs +166 -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/icon-registry.test.mjs +67 -0
- package/test/integration/ingest-discover-models.test.mjs +30 -0
- package/test/integration/install-script.test.mjs +110 -0
- package/test/integration/inventory-core.test.mjs +53 -0
- package/test/integration/local-fs.test.mjs +113 -0
- package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
- package/test/integration/provider-env-cli.test.mjs +3 -2
- package/test/integration/runtime-migrations.test.mjs +6 -1
- package/test/integration/runtime-status.integration.test.mjs +211 -0
- package/test/integration/sam-activity-recovery.test.mjs +147 -0
- package/test/integration/sam-decision.test.mjs +584 -0
- package/test/integration/sam-kernel.test.mjs +99 -0
- package/test/integration/sam-planning-astar.test.mjs +279 -0
- package/test/integration/scaffold-cloudflare.test.mjs +46 -0
- package/test/integration/skill-runtime.test.mjs +240 -0
- package/test/integration/storage-architecture.test.mjs +154 -0
- package/test/integration/store-discovery.test.mjs +44 -0
- package/test/integration/studio-fs-pty-e2e.test.mjs +294 -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 +172 -11
- 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 +151 -6
- 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,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cloudflare account resolution for scaffold wizards.
|
|
3
|
+
* Reuses the same detection the CLI's `agentsam env init cloudflare` flow
|
|
4
|
+
* already relies on — never ask the user to hand-paste an account ID that
|
|
5
|
+
* `wrangler whoami` (or an existing env override) can already answer.
|
|
6
|
+
*/
|
|
7
|
+
import { detectCloudflareAccounts } from '../../commands/env.js';
|
|
8
|
+
|
|
9
|
+
export async function resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc, detectAccounts = detectCloudflareAccounts }) {
|
|
10
|
+
const detected = detectAccounts();
|
|
11
|
+
|
|
12
|
+
if (detected.accounts.length === 1) {
|
|
13
|
+
const acct = detected.accounts[0];
|
|
14
|
+
note(`Detected Cloudflare account: ${pc.cyan(acct.name || acct.id)}`, 'Cloudflare account');
|
|
15
|
+
return acct.id;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (detected.accounts.length > 1) {
|
|
19
|
+
const choice = await select({
|
|
20
|
+
message: 'Which Cloudflare account?',
|
|
21
|
+
options: detected.accounts.map((a) => ({ value: a.id, label: a.name || a.id, hint: a.id })),
|
|
22
|
+
});
|
|
23
|
+
if (isCancel(choice)) { cancel('Cancelled.'); process.exit(0); }
|
|
24
|
+
return choice;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
note('Could not auto-detect a Cloudflare account (run `agentsam cloudflare` to check login status).', 'Cloudflare account');
|
|
28
|
+
const cfAccountId = await text({
|
|
29
|
+
message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
|
|
30
|
+
placeholder: 'abc123...',
|
|
31
|
+
validate(val) {
|
|
32
|
+
if (!val || val.trim().length === 0) return 'Required.';
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
|
|
36
|
+
return cfAccountId.trim();
|
|
37
|
+
}
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
import pc from 'picocolors';
|
|
23
23
|
import { writeFileTree } from '../writer.js';
|
|
24
24
|
import { cmsTemplates } from '../templates/cms/index.js';
|
|
25
|
+
import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
|
|
25
26
|
|
|
26
27
|
export async function runCmsWizard() {
|
|
27
28
|
note('A Cloudflare Worker + D1 + R2 CMS site with reusable page templates.', 'CMS Site');
|
|
@@ -111,14 +112,7 @@ export async function runCmsWizard() {
|
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
// ── Step 7: Cloudflare account details ────────────────────────────────────
|
|
114
|
-
const cfAccountId = await
|
|
115
|
-
message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
|
|
116
|
-
placeholder: 'abc123...',
|
|
117
|
-
validate(val) {
|
|
118
|
-
if (!val || val.trim().length === 0) return 'Required for wrangler.toml.';
|
|
119
|
-
},
|
|
120
|
-
});
|
|
121
|
-
if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
|
|
115
|
+
const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
|
|
122
116
|
|
|
123
117
|
// ── Step 8: Confirm before writing ───────────────────────────────────────
|
|
124
118
|
const summary = [
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
import pc from 'picocolors';
|
|
17
17
|
import { writeFileTree } from '../writer.js';
|
|
18
18
|
import { workerApiTemplates } from '../templates/worker-api/index.js';
|
|
19
|
+
import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
|
|
19
20
|
|
|
20
21
|
export async function runWorkerApiWizard() {
|
|
21
22
|
note('A typed Cloudflare Worker with route handlers, D1 binding, and CORS ready.', 'Worker API');
|
|
@@ -52,14 +53,7 @@ export async function runWorkerApiWizard() {
|
|
|
52
53
|
});
|
|
53
54
|
if (isCancel(dbKind)) { cancel('Cancelled.'); process.exit(0); }
|
|
54
55
|
|
|
55
|
-
const cfAccountId = await
|
|
56
|
-
message: 'Cloudflare account ID?',
|
|
57
|
-
placeholder: 'abc123...',
|
|
58
|
-
validate(val) {
|
|
59
|
-
if (!val || val.trim().length === 0) return 'Required.';
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
|
|
56
|
+
const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
|
|
63
57
|
|
|
64
58
|
const confirmed = await confirm({ message: `Write files to ./${projectName.trim()}/?` });
|
|
65
59
|
if (isCancel(confirmed) || !confirmed) { cancel('Cancelled.'); process.exit(0); }
|
|
@@ -8,8 +8,9 @@ export const SLASH_COMMANDS = [
|
|
|
8
8
|
{ cmd: '/fast', description: 'Use provider Fast processing when the selected model supports it', lane: 'model' },
|
|
9
9
|
{ cmd: '/flex', description: 'Use provider Flex processing when the selected model supports it', lane: 'model' },
|
|
10
10
|
{ cmd: '/standard', description: 'Return to Standard provider processing', lane: 'model' },
|
|
11
|
+
{ cmd: '/compact', description: 'Compact active provider context; status shows support, threshold, and receipt', lane: 'context' },
|
|
11
12
|
{ cmd: '/context', description: 'Show model context economics; add repo for Git bridge context', lane: 'context' },
|
|
12
|
-
{ cmd: '/status', description: '
|
|
13
|
+
{ cmd: '/status', description: 'Honest project awareness: account, models, terminal, live deploy', lane: 'local' },
|
|
13
14
|
{ cmd: '/models', description: 'Probe providers and provider-verified known models', lane: 'model' },
|
|
14
15
|
{ cmd: '/providers', description: 'Configure and verify machine provider credentials', lane: 'model' },
|
|
15
16
|
{ cmd: '/login', description: 'Sign in to Inner Animal Media and save the machine-local Agent Sam session', lane: 'identity' },
|
|
@@ -18,16 +19,23 @@ export const SLASH_COMMANDS = [
|
|
|
18
19
|
{ cmd: '/session', description: 'Show current session usage, cost, and resume receipt', lane: 'observability' },
|
|
19
20
|
{ cmd: '/usage', description: 'Show token usage, spend breakdown, and resume command', lane: 'observability' },
|
|
20
21
|
{ cmd: '/cf', description: 'Cloudflare native reads, Wrangler status, and CPU profile analysis', lane: 'cloudflare' },
|
|
22
|
+
{ cmd: '/connections', description: 'Inspect live account, terminal, Worker, and Cloudflare connection evidence', lane: 'cloudflare' },
|
|
23
|
+
{ cmd: '/tunnel', description: 'Choose and run a real Cloudflare Tunnel through Wrangler', lane: 'cloudflare' },
|
|
21
24
|
{ cmd: '/settings', description: 'Choose project, runtime, terminal, and model policy' },
|
|
22
25
|
{ cmd: '/pwd', description: 'Print working directory', lane: 'terminal' },
|
|
23
26
|
{ cmd: '/cd', description: 'Change working directory', lane: 'terminal' },
|
|
24
27
|
{ cmd: '/git', description: 'Run an explicit Git subcommand', lane: 'git' },
|
|
25
28
|
{ cmd: '/diff', description: 'Show the current Git diff', lane: 'git' },
|
|
26
|
-
{ cmd: '/db', description: '
|
|
29
|
+
{ cmd: '/db', description: 'SQLite status; sources discovers stores; select knowledge sqlite|postgres [ENV]', lane: 'data' },
|
|
27
30
|
{ cmd: '/agent', description: 'Send a goal to the configured local Agent Sam runtime', lane: 'agent' },
|
|
31
|
+
{ cmd: '/goap', description: 'Inspect and manage GOAP blackboard: /goap [status|goal|why|plan|list|new|switch|close]', lane: 'agent' },
|
|
32
|
+
{ cmd: '/brand', description: 'Brand intelligence: /brand [scan|resolve|plan|inspect]', lane: 'product' },
|
|
33
|
+
{ cmd: '/plan', description: 'Composable plans: /plan brand', lane: 'product' },
|
|
34
|
+
{ cmd: '/next', description: 'Suggested next actions from session progression', lane: 'product' },
|
|
28
35
|
{ cmd: '/logs', description: 'Show local Agent Sam execution events', lane: 'observability' },
|
|
29
36
|
{ cmd: '/deploy', description: 'Add a cloud adapter and deploy intentionally', lane: 'deploy' },
|
|
30
37
|
{ cmd: '/clear', description: 'Clear the terminal display', lane: 'terminal' },
|
|
38
|
+
{ cmd: '/skills', description: 'List resolvable slash skill vocabulary', lane: 'agent' },
|
|
31
39
|
{ cmd: '/help', description: 'Show the factual implemented command catalog' },
|
|
32
40
|
{ cmd: '/exit', description: 'Exit Agent Sam shell and return to the host terminal' },
|
|
33
41
|
];
|
package/src/local/migrations.js
CHANGED
|
@@ -37,6 +37,52 @@ function checksumSource(source) {
|
|
|
37
37
|
return 'fnv1a32:' + (hash >>> 0).toString(16).padStart(8, '0');
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
// A naive source.split(';') breaks on ANY semicolon -- including one
|
|
41
|
+
// inside a wrapped comment line's prose ("...available; standalone...")
|
|
42
|
+
// and every semicolon inside a CREATE TRIGGER's BEGIN...END body. Both
|
|
43
|
+
// happen in real migration files (this one has both). Comment-strip first,
|
|
44
|
+
// then split statement-aware: only treat ';' as a terminator outside a
|
|
45
|
+
// BEGIN/END block, so a trigger body survives as one statement instead of
|
|
46
|
+
// fragmenting into pieces that don't individually look like anything.
|
|
47
|
+
function stripSqlComments(source) {
|
|
48
|
+
return source
|
|
49
|
+
.split('\n')
|
|
50
|
+
.map((line) => (line.trim().startsWith('--') ? '' : line))
|
|
51
|
+
.join('\n');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function splitSqlStatements(source) {
|
|
55
|
+
const clean = stripSqlComments(source);
|
|
56
|
+
// CASE ... END is also closed by the bare keyword END (no BEGIN of its
|
|
57
|
+
// own) -- a trigger body containing a CASE expression has one more END
|
|
58
|
+
// than BEGIN. Track BEGIN and CASE as the same depth-increasing class so
|
|
59
|
+
// a CASE's END doesn't prematurely close the enclosing trigger's depth.
|
|
60
|
+
const tokens = clean.split(/(\bBEGIN\b|\bCASE\b|\bEND\b|;)/i);
|
|
61
|
+
const statements = [];
|
|
62
|
+
let current = '';
|
|
63
|
+
let depth = 0;
|
|
64
|
+
for (const token of tokens) {
|
|
65
|
+
if (/^(BEGIN|CASE)$/i.test(token)) { depth += 1; current += token; continue; }
|
|
66
|
+
if (/^END$/i.test(token)) { depth = Math.max(0, depth - 1); current += token; continue; }
|
|
67
|
+
if (token === ';' && depth === 0) {
|
|
68
|
+
const trimmed = current.trim();
|
|
69
|
+
if (trimmed) statements.push(trimmed);
|
|
70
|
+
current = '';
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
current += token;
|
|
74
|
+
}
|
|
75
|
+
const trimmed = current.trim();
|
|
76
|
+
if (trimmed) statements.push(trimmed);
|
|
77
|
+
return statements;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function isIdempotentSafe(source) {
|
|
81
|
+
const statements = splitSqlStatements(source);
|
|
82
|
+
const IDEMPOTENT_RE = /^(CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS|CREATE\s+(UNIQUE\s+)?INDEX\s+IF\s+NOT\s+EXISTS|CREATE\s+TRIGGER\s+IF\s+NOT\s+EXISTS|PRAGMA)/i;
|
|
83
|
+
return statements.length > 0 && statements.every((stmt) => IDEMPOTENT_RE.test(stmt.trim()));
|
|
84
|
+
}
|
|
85
|
+
|
|
40
86
|
export async function listAppliedMigrations(db) {
|
|
41
87
|
ensureLedger(db);
|
|
42
88
|
const result = await db.prepare(
|
|
@@ -60,7 +106,23 @@ export async function applyRuntimeMigrations(db, options = {}) {
|
|
|
60
106
|
|
|
61
107
|
if (previous) {
|
|
62
108
|
if (previous.checksum && previous.checksum !== checksum) {
|
|
63
|
-
throw new Error('migration_checksum_mismatch:' + id);
|
|
109
|
+
if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
|
|
110
|
+
// File grew via additive, idempotent statements only (e.g. a new
|
|
111
|
+
// CREATE TABLE IF NOT EXISTS appended for a later feature). Safe to
|
|
112
|
+
// re-run and accept the new checksum rather than hard-lock the CLI.
|
|
113
|
+
db.exec('BEGIN IMMEDIATE');
|
|
114
|
+
try {
|
|
115
|
+
db.exec(source);
|
|
116
|
+
await db.prepare(
|
|
117
|
+
'UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?'
|
|
118
|
+
).bind(checksum, id).run();
|
|
119
|
+
db.exec('COMMIT');
|
|
120
|
+
results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
|
|
121
|
+
continue;
|
|
122
|
+
} catch (error) {
|
|
123
|
+
try { db.exec('ROLLBACK'); } catch {}
|
|
124
|
+
throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
|
|
125
|
+
}
|
|
64
126
|
}
|
|
65
127
|
results.push({ id, filename, status: 'already_applied', checksum });
|
|
66
128
|
continue;
|
|
@@ -88,6 +150,52 @@ export async function applyRuntimeMigrations(db, options = {}) {
|
|
|
88
150
|
});
|
|
89
151
|
}
|
|
90
152
|
|
|
153
|
+
// Synchronous entry point for the interactive shell. Both runners consume the
|
|
154
|
+
// same versioned SQL and checksums; schema ownership stays in migrations/runtime.
|
|
155
|
+
export function applyRuntimeMigrationsSync(db, options = {}) {
|
|
156
|
+
const dir = path.resolve(options.migrationsDir || DEFAULT_MIGRATIONS_DIR);
|
|
157
|
+
ensureLedger(db);
|
|
158
|
+
const applied = new Map(db.prepare(
|
|
159
|
+
'SELECT id, applied_at_unix, checksum FROM agentsam_schema_migrations ORDER BY id'
|
|
160
|
+
).all().map((row) => [String(row.id), row]));
|
|
161
|
+
const results = [];
|
|
162
|
+
for (const filename of migrationFiles(dir)) {
|
|
163
|
+
const id = filename.replace(/\.sql$/i, '');
|
|
164
|
+
const source = fs.readFileSync(path.join(dir, filename), 'utf8');
|
|
165
|
+
const checksum = checksumSource(source);
|
|
166
|
+
const previous = applied.get(id);
|
|
167
|
+
if (previous) {
|
|
168
|
+
if (previous.checksum && previous.checksum !== checksum) {
|
|
169
|
+
if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
|
|
170
|
+
db.exec('BEGIN IMMEDIATE');
|
|
171
|
+
try {
|
|
172
|
+
db.exec(source);
|
|
173
|
+
db.prepare('UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?').run(checksum, id);
|
|
174
|
+
db.exec('COMMIT');
|
|
175
|
+
results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
|
|
176
|
+
continue;
|
|
177
|
+
} catch (error) {
|
|
178
|
+
try { db.exec('ROLLBACK'); } catch {}
|
|
179
|
+
throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
results.push({ id, filename, status: 'already_applied', checksum });
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
db.exec('BEGIN IMMEDIATE');
|
|
186
|
+
try {
|
|
187
|
+
db.exec(source);
|
|
188
|
+
db.prepare('INSERT INTO agentsam_schema_migrations (id, checksum) VALUES (?, ?)').run(id, checksum);
|
|
189
|
+
db.exec('COMMIT');
|
|
190
|
+
results.push({ id, filename, status: 'applied', checksum });
|
|
191
|
+
} catch (error) {
|
|
192
|
+
try { db.exec('ROLLBACK'); } catch {}
|
|
193
|
+
throw new Error('migration_failed:' + id + ':' + (error?.message || error));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return Object.freeze({ migrationsDir: dir, total: results.length, applied: results.filter((row) => row.status === 'applied').length, results: Object.freeze(results) });
|
|
197
|
+
}
|
|
198
|
+
|
|
91
199
|
export function runtimeMigrationsDirectory() {
|
|
92
200
|
return DEFAULT_MIGRATIONS_DIR;
|
|
93
201
|
}
|
|
@@ -2,12 +2,28 @@ import path from 'node:path';
|
|
|
2
2
|
import { createHash, randomUUID } from 'node:crypto';
|
|
3
3
|
import { createLocalSqliteDatabase } from './sqlite.js';
|
|
4
4
|
import { applyRuntimeMigrations } from './migrations.js';
|
|
5
|
+
import { findCliProjectRoot } from '../lib/cli-preferences.js';
|
|
6
|
+
import { getLocalDatabasePath, tryReadProjectConfig } from '../lib/project-config.js';
|
|
5
7
|
|
|
6
8
|
function clean(value) { return value == null ? '' : String(value).trim(); }
|
|
7
9
|
function hash(value) { return createHash('sha256').update(String(value || '')).digest('hex'); }
|
|
8
10
|
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
+
export const SQLITE_RUNTIME_CAPABILITIES = Object.freeze({
|
|
12
|
+
transactions: true,
|
|
13
|
+
relational_queries: true,
|
|
14
|
+
ttl_cleanup: 'application_managed',
|
|
15
|
+
remote_shared_state: false,
|
|
16
|
+
local_only: true,
|
|
17
|
+
concurrent_writers: 'sqlite_serialized',
|
|
18
|
+
migrations: true,
|
|
19
|
+
vector_search: false,
|
|
20
|
+
blob_storage: false,
|
|
21
|
+
distributed_actor_semantics: false,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export function runtimeDatabasePath(startDir = process.cwd()) {
|
|
25
|
+
const root = findCliProjectRoot(startDir);
|
|
26
|
+
return path.resolve(root, getLocalDatabasePath(tryReadProjectConfig(root)));
|
|
11
27
|
}
|
|
12
28
|
|
|
13
29
|
async function withStore(cwd, fn) {
|
|
@@ -26,7 +42,7 @@ export function createRuntimeRunId() {
|
|
|
26
42
|
|
|
27
43
|
export async function startRuntimeRun(value = {}) {
|
|
28
44
|
const id = clean(value.id) || createRuntimeRunId();
|
|
29
|
-
await withStore(value.cwd, async (db) => {
|
|
45
|
+
await withStore(value.projectRoot || value.cwd, async (db) => {
|
|
30
46
|
await db.prepare(`
|
|
31
47
|
INSERT INTO agentsam_agent_run (
|
|
32
48
|
id, account_id, source_client, surface, mode, model_key,
|
|
@@ -46,7 +62,7 @@ export async function startRuntimeRun(value = {}) {
|
|
|
46
62
|
|
|
47
63
|
export async function finishRuntimeRun(value = {}) {
|
|
48
64
|
if (!clean(value.id)) return;
|
|
49
|
-
await withStore(value.cwd, async (db) => {
|
|
65
|
+
await withStore(value.projectRoot || value.cwd, async (db) => {
|
|
50
66
|
const usage = value.usage || {};
|
|
51
67
|
await db.prepare(`
|
|
52
68
|
UPDATE agentsam_agent_run
|
|
@@ -87,7 +103,7 @@ export async function recordRuntimeCompaction(value = {}) {
|
|
|
87
103
|
const after = Math.max(0, Math.round(Number(value.tokens_after || 0)));
|
|
88
104
|
const sourceHash = hash(summary || JSON.stringify(value.metadata || {}));
|
|
89
105
|
|
|
90
|
-
await withStore(value.cwd, async (db) => {
|
|
106
|
+
await withStore(value.projectRoot || value.cwd, async (db) => {
|
|
91
107
|
await db.prepare(`
|
|
92
108
|
INSERT INTO agentsam_compaction_events (
|
|
93
109
|
id, account_id, agent_run_id, compaction_type, compaction_scope,
|
|
@@ -139,3 +155,13 @@ export async function recordRuntimeCompaction(value = {}) {
|
|
|
139
155
|
});
|
|
140
156
|
return id;
|
|
141
157
|
}
|
|
158
|
+
|
|
159
|
+
export async function pruneExpiredRuntimeState(value = {}) {
|
|
160
|
+
const nowUnix = Number.isFinite(Number(value.nowUnix)) ? Math.floor(Number(value.nowUnix)) : Math.floor(Date.now() / 1000);
|
|
161
|
+
return withStore(value.projectRoot || value.cwd, async (db) => {
|
|
162
|
+
const digests = await db.prepare('DELETE FROM agentsam_context_digest WHERE expires_at_unix IS NOT NULL AND expires_at_unix <= ?').bind(nowUnix).run();
|
|
163
|
+
const compactions = await db.prepare('DELETE FROM agentsam_compaction_events WHERE expires_at_epoch IS NOT NULL AND expires_at_epoch <= ?').bind(nowUnix).run();
|
|
164
|
+
const approvals = await db.prepare("UPDATE agentsam_approval_queue SET status = 'expired' WHERE status = 'pending' AND expires_at IS NOT NULL AND expires_at <= ?").bind(nowUnix).run();
|
|
165
|
+
return { digests: Number(digests.changes || 0), compactions: Number(compactions.changes || 0), approvals_expired: Number(approvals.changes || 0) };
|
|
166
|
+
});
|
|
167
|
+
}
|
package/src/local/sqlite.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
3
4
|
import { applyRuntimeMigrations } from './migrations.js';
|
|
4
5
|
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
|
|
5
8
|
async function loadSqlite() {
|
|
6
9
|
try {
|
|
7
10
|
return await import('node:sqlite');
|
|
@@ -18,11 +21,43 @@ function resolveFile(filePath) {
|
|
|
18
21
|
return path.resolve(String(filePath || '.agentsam/data/agentsam.sqlite'));
|
|
19
22
|
}
|
|
20
23
|
|
|
24
|
+
function prepareDatabaseFile(resolved) {
|
|
25
|
+
const dir = path.dirname(resolved);
|
|
26
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
27
|
+
if (process.platform !== 'win32') {
|
|
28
|
+
try { fs.chmodSync(dir, 0o700); } catch { /* platform policy may own directory mode */ }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function restrictDatabaseFile(resolved) {
|
|
33
|
+
if (process.platform !== 'win32') {
|
|
34
|
+
try { fs.chmodSync(resolved, 0o600); } catch { /* platform policy may own file mode */ }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// The shell's session API is synchronous. It uses the same database file and
|
|
39
|
+
// migration directory as the async runtime store, with no second state store.
|
|
40
|
+
export function createLocalSqliteDatabaseSync(filePath = '.agentsam/data/agentsam.sqlite') {
|
|
41
|
+
let DatabaseSync;
|
|
42
|
+
try { ({ DatabaseSync } = require('node:sqlite')); }
|
|
43
|
+
catch (error) {
|
|
44
|
+
const wrapped = new Error('Local SQLite requires Node 22.5+ (node:sqlite). Upgrade Node, then retry.');
|
|
45
|
+
wrapped.cause = error;
|
|
46
|
+
throw wrapped;
|
|
47
|
+
}
|
|
48
|
+
const resolved = resolveFile(filePath);
|
|
49
|
+
prepareDatabaseFile(resolved);
|
|
50
|
+
const db = new DatabaseSync(resolved);
|
|
51
|
+
restrictDatabaseFile(resolved);
|
|
52
|
+
return db;
|
|
53
|
+
}
|
|
54
|
+
|
|
21
55
|
export async function createLocalSqliteDatabase(filePath = '.agentsam/data/agentsam.sqlite') {
|
|
22
56
|
const { DatabaseSync } = await loadSqlite();
|
|
23
57
|
const resolved = resolveFile(filePath);
|
|
24
|
-
|
|
58
|
+
prepareDatabaseFile(resolved);
|
|
25
59
|
const database = new DatabaseSync(resolved);
|
|
60
|
+
restrictDatabaseFile(resolved);
|
|
26
61
|
|
|
27
62
|
return {
|
|
28
63
|
filePath: resolved,
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local runtime workspace capability — short-lived FS/PTY authority for one root.
|
|
3
|
+
*
|
|
4
|
+
* Compatible with later:
|
|
5
|
+
* account → terminal connection → enrolled instance → approved workspace root
|
|
6
|
+
*
|
|
7
|
+
* Local today:
|
|
8
|
+
* start-local binds one root + mints one capability.
|
|
9
|
+
* Browser cannot invent an absolute root to gain authority.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import crypto from 'node:crypto';
|
|
13
|
+
import fs from 'node:fs';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
|
|
16
|
+
export const WORKSPACE_CAPABILITY_HEADER = 'x-agentsam-workspace-capability';
|
|
17
|
+
export const LOCAL_RUNTIME_FILE = 'local-runtime.json';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param {{ root: string, port: number, host?: string }} opts
|
|
21
|
+
*/
|
|
22
|
+
export function mintWorkspaceCapability(opts) {
|
|
23
|
+
const root = path.resolve(opts.root);
|
|
24
|
+
const workspace_id = `ws_${crypto.randomBytes(10).toString('hex')}`;
|
|
25
|
+
const capability = `awc_${crypto.randomBytes(24).toString('hex')}`;
|
|
26
|
+
const expires_at = new Date(Date.now() + 12 * 60 * 60 * 1000).toISOString();
|
|
27
|
+
return Object.freeze({
|
|
28
|
+
schema: 'agentsam.local-workspace-capability.v1',
|
|
29
|
+
workspace_id,
|
|
30
|
+
capability,
|
|
31
|
+
root,
|
|
32
|
+
host: opts.host || '127.0.0.1',
|
|
33
|
+
port: opts.port,
|
|
34
|
+
runtimeBaseUrl: `http://${opts.host || '127.0.0.1'}:${opts.port}`,
|
|
35
|
+
fsBaseUrl: `http://${opts.host || '127.0.0.1'}:${opts.port}/v1/fs`,
|
|
36
|
+
expires_at,
|
|
37
|
+
purpose: 'local.filesystem+pty',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Persist capability beside the authorized root (machine-local; not file content authority).
|
|
43
|
+
* @param {object} record
|
|
44
|
+
*/
|
|
45
|
+
export function writeLocalRuntimeRecord(record) {
|
|
46
|
+
const dir = path.join(record.root, '.agentsam');
|
|
47
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
48
|
+
const file = path.join(dir, LOCAL_RUNTIME_FILE);
|
|
49
|
+
fs.writeFileSync(file, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
|
|
50
|
+
return file;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @param {string} root
|
|
55
|
+
*/
|
|
56
|
+
export function readLocalRuntimeRecord(root) {
|
|
57
|
+
const file = path.join(path.resolve(root), '.agentsam', LOCAL_RUNTIME_FILE);
|
|
58
|
+
if (!fs.existsSync(file)) return null;
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
61
|
+
} catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @param {import('http').IncomingMessage} req
|
|
68
|
+
* @param {string} expected
|
|
69
|
+
*/
|
|
70
|
+
export function extractCapability(req, expected) {
|
|
71
|
+
const header = req.headers[WORKSPACE_CAPABILITY_HEADER]
|
|
72
|
+
|| req.headers.authorization
|
|
73
|
+
|| '';
|
|
74
|
+
let token = '';
|
|
75
|
+
if (typeof header === 'string') {
|
|
76
|
+
if (header.toLowerCase().startsWith('bearer ')) token = header.slice(7).trim();
|
|
77
|
+
else token = header.trim();
|
|
78
|
+
}
|
|
79
|
+
if (!token && req.url) {
|
|
80
|
+
try {
|
|
81
|
+
const u = new URL(req.url, 'http://127.0.0.1');
|
|
82
|
+
token = u.searchParams.get('capability') || '';
|
|
83
|
+
} catch {
|
|
84
|
+
/* ignore */
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
ok: Boolean(expected && token && token === expected),
|
|
89
|
+
token,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Loopback + Studio origin allowlist. Never `*`.
|
|
95
|
+
* @param {string|undefined} origin
|
|
96
|
+
* @param {string[]} [extra]
|
|
97
|
+
*/
|
|
98
|
+
export function isAllowedStudioOrigin(origin, extra = []) {
|
|
99
|
+
if (!origin || origin === 'null') return true; // non-browser / same-origin tooling
|
|
100
|
+
const allow = [
|
|
101
|
+
'http://127.0.0.1:8080',
|
|
102
|
+
'http://localhost:8080',
|
|
103
|
+
'http://127.0.0.1:5173',
|
|
104
|
+
'http://localhost:5173',
|
|
105
|
+
'http://127.0.0.1:3000',
|
|
106
|
+
'http://localhost:3000',
|
|
107
|
+
...extra,
|
|
108
|
+
];
|
|
109
|
+
return allow.includes(origin);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @param {import('http').IncomingMessage} req
|
|
114
|
+
*/
|
|
115
|
+
export function isLoopbackRemote(req) {
|
|
116
|
+
const raw = req.socket?.remoteAddress || '';
|
|
117
|
+
return raw === '127.0.0.1'
|
|
118
|
+
|| raw === '::1'
|
|
119
|
+
|| raw === '::ffff:127.0.0.1'
|
|
120
|
+
|| raw.endsWith('127.0.0.1');
|
|
121
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal repository/index freshness bridge.
|
|
3
|
+
* Filesystem writes mark generation stale — do not re-index on every keystroke.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/** @type {Map<string, { generation: number, stale_paths: Set<string>, updated_at: string }>} */
|
|
7
|
+
const roots = new Map();
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @param {string} root
|
|
11
|
+
* @param {{ paths?: string[], reason?: string }} [opts]
|
|
12
|
+
*/
|
|
13
|
+
export function markRepositoryStale(root, opts = {}) {
|
|
14
|
+
const key = String(root);
|
|
15
|
+
const prev = roots.get(key) || {
|
|
16
|
+
generation: 0,
|
|
17
|
+
stale_paths: new Set(),
|
|
18
|
+
updated_at: null,
|
|
19
|
+
};
|
|
20
|
+
const nextGen = prev.generation + 1;
|
|
21
|
+
const stale_paths = new Set(prev.stale_paths);
|
|
22
|
+
for (const p of opts.paths || []) stale_paths.add(String(p));
|
|
23
|
+
const record = {
|
|
24
|
+
generation: nextGen,
|
|
25
|
+
stale_paths,
|
|
26
|
+
updated_at: new Date().toISOString(),
|
|
27
|
+
reason: opts.reason || 'filesystem_write',
|
|
28
|
+
};
|
|
29
|
+
roots.set(key, record);
|
|
30
|
+
return {
|
|
31
|
+
ok: true,
|
|
32
|
+
schema: 'agentsam.repository-freshness.v1',
|
|
33
|
+
root: key,
|
|
34
|
+
generation: record.generation,
|
|
35
|
+
stale_paths: [...stale_paths].slice(0, 200),
|
|
36
|
+
updated_at: record.updated_at,
|
|
37
|
+
reason: record.reason,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @param {string} root
|
|
43
|
+
*/
|
|
44
|
+
export function getRepositoryFreshness(root) {
|
|
45
|
+
const key = String(root);
|
|
46
|
+
const record = roots.get(key);
|
|
47
|
+
if (!record) {
|
|
48
|
+
return {
|
|
49
|
+
ok: true,
|
|
50
|
+
schema: 'agentsam.repository-freshness.v1',
|
|
51
|
+
root: key,
|
|
52
|
+
generation: 0,
|
|
53
|
+
stale: false,
|
|
54
|
+
stale_paths: [],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
ok: true,
|
|
59
|
+
schema: 'agentsam.repository-freshness.v1',
|
|
60
|
+
root: key,
|
|
61
|
+
generation: record.generation,
|
|
62
|
+
stale: record.stale_paths.size > 0 || record.generation > 0,
|
|
63
|
+
stale_paths: [...record.stale_paths].slice(0, 200),
|
|
64
|
+
updated_at: record.updated_at,
|
|
65
|
+
reason: record.reason,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @param {string} root
|
|
71
|
+
*/
|
|
72
|
+
export function clearRepositoryFreshness(root) {
|
|
73
|
+
roots.delete(String(root));
|
|
74
|
+
return { ok: true };
|
|
75
|
+
}
|