@moretea-labs/forge 1.8.0 → 1.8.2
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/AGENTS.md +73 -7
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +17 -2
- package/CONTRIBUTING.md +3 -2
- package/README.en.md +24 -3
- package/README.md +10 -6
- package/README.zh-CN.md +5 -3
- package/THIRD_PARTY_NOTICES.md +1 -2
- package/adapters/chatgpt/browser-delivery-host.ts +7 -1
- package/adapters/chatgpt/browser-delivery-runtime.ts +531 -56
- package/adapters/chatgpt/controller-binding-store.ts +101 -22
- package/adapters/chatgpt/controller-round-host.ts +15 -25
- package/adapters/chatgpt/controller-round-settlement-store.ts +58 -4
- package/adapters/chatgpt/provider-delivery.ts +229 -2
- package/adapters/chatgpt/work-conversation-binding-store.ts +99 -54
- package/adapters/computer/chatgpt-extension-target.ts +708 -0
- package/adapters/computer/chrome-extension/background.js +541 -0
- package/adapters/computer/chrome-extension/content.js +402 -0
- package/adapters/computer/chrome-extension/core.js +24 -0
- package/adapters/computer/chrome-extension/manifest.json +32 -0
- package/adapters/computer/desktop-operator-discovery.ts +11 -31
- package/adapters/computer/desktop-operator-provider.ts +18 -6
- package/adapters/computer/interaction-target-authority.ts +178 -24
- package/adapters/mcp/access-mode.ts +18 -39
- package/adapters/mcp/auth.ts +2 -7
- package/adapters/mcp/instructions.ts +6 -5
- package/adapters/mcp/multi-repository.ts +10 -47
- package/adapters/mcp/oauth.ts +73 -0
- package/adapters/mcp/paths.ts +4 -1
- package/adapters/mcp/runtime-gateway/bounded-result-runtime.ts +62 -0
- package/adapters/mcp/runtime-gateway/cognition-settlement.ts +201 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +490 -113
- package/adapters/mcp/runtime-gateway/context-pack-sidecar.ts +83 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +20 -5
- package/adapters/mcp/runtime-gateway/core-capability-adapter.ts +258 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +10 -27
- package/adapters/mcp/runtime-gateway/engineering-tool-contract.ts +15 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +14 -54
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +2 -1
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +132 -47
- package/adapters/mcp/runtime-gateway/process-tools.ts +173 -23
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +16 -4
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +69 -52
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +4 -35
- package/adapters/mcp/runtime-gateway/result-adapter.ts +10 -4
- package/adapters/mcp/runtime-gateway/router.ts +19 -507
- package/adapters/mcp/runtime-gateway/routing-policy.ts +506 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +15 -66
- package/adapters/mcp/runtime-gateway/runtime-readiness-observation.ts +218 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +123 -178
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +11 -5
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +37 -1
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +20 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +416 -270
- package/adapters/mcp/runtime-gateway/typescript-navigation-sidecar.ts +140 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +262 -3123
- package/adapters/mcp/runtime-gateway/work-controller-operations.ts +257 -0
- package/adapters/mcp/runtime-gateway/work-detail-projection.ts +60 -0
- package/adapters/mcp/runtime-gateway/work-input-wire-migration.ts +229 -0
- package/adapters/mcp/runtime-gateway/work-learning-operations.ts +145 -0
- package/adapters/mcp/runtime-gateway/work-list-projection.ts +38 -0
- package/adapters/mcp/runtime-gateway/work-plan-operations.ts +382 -0
- package/adapters/mcp/runtime-gateway/work-repair-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/work-requirement-operations.ts +148 -0
- package/adapters/mcp/runtime-gateway/work-semantic-operations.ts +320 -0
- package/adapters/mcp/runtime-gateway/work-workflow-operations.ts +113 -0
- package/adapters/mcp/runtime-gateway/workflow-supervisor-adapter.ts +180 -0
- package/adapters/mcp/server.ts +91 -26
- package/adapters/mcp/setup.ts +5 -13
- package/adapters/mcp/tool-mapping/access-tools.ts +0 -6
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +703 -3092
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +5 -10
- package/adapters/mcp/tool-mapping/repository-tools.ts +170 -213
- package/adapters/mcp/toolset-names.ts +11 -37
- package/adapters/mcp/toolset.ts +19 -92
- package/{src/cli → adapters}/mcp/transports/AGENTS.md +5 -5
- package/{src/cli → adapters}/mcp/transports/CLAUDE.md +5 -5
- package/adapters/mcp/transports/http-observation.ts +377 -0
- package/adapters/mcp/transports/http-post-lifecycle.ts +19 -0
- package/adapters/mcp/transports/http.ts +200 -683
- package/adapters/mcp/transports/oauth-http.ts +322 -0
- package/adapters/mcp/transports/session-registry.ts +6 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +89 -5
- package/adapters/mcp/types.ts +0 -6
- package/assets/hooks/lib/session-state.sh +0 -38
- package/assets/hooks/post-bash.sh +1 -1
- package/assets/hooks/post-tool-observer.sh +0 -5
- package/assets/hooks/prompt-guard.sh +0 -55
- package/assets/partials/04-project-structure.partial.md +1 -1
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -1
- package/assets/partials-agents/08-deep-docs.partial.md +1 -1
- package/assets/plugin-registry.v1.json +6 -4
- package/assets/reference-configs/agentic-development-flow.md +26 -1
- package/assets/reference-configs/external-tooling.md +0 -76
- package/assets/reference-configs/global-working-rules.md +19 -0
- package/assets/reference-configs/release-deploy.md +1 -1
- package/assets/templates/helpers/architecture-queue.sh +1 -1
- package/assets/templates/helpers/check-agent-tooling.sh +1 -327
- package/assets/templates/helpers/check-task-workflow.sh +1 -1
- package/assets/templates/helpers/ensure-task-workflow.sh +0 -14
- package/assets/templates/helpers/migrate-project-template.sh +2 -2
- package/assets/workflow-contract.v1.json +0 -2
- package/docs/README.md +5 -2
- package/docs/architecture/CURRENT.md +205 -51
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +14 -5
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +6 -3
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +2 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +19 -4
- package/docs/architecture/decisions/20260916-workflow-supervisor-authority.md +249 -0
- package/docs/architecture/decisions/20260917-cognitive-memory-foundation.md +82 -0
- package/docs/architecture/decisions/20260918-stable-candidate-release-lifecycle.md +234 -0
- package/docs/architecture/decisions/20260919-autonomous-work-liveness.md +62 -0
- package/docs/architecture/decisions/20260924-thin-semantic-working-context.md +74 -0
- package/docs/architecture/decisions/20261001-supervisor-turn-authority.md +342 -0
- package/docs/architecture/decisions/20261005-forge-v3-desktop-client-boundary.md +77 -0
- package/docs/architecture/decisions/20261009-exact-code-context-discovery.md +19 -0
- package/docs/architecture/decisions/20261009-generated-xcode-cache-retention.md +37 -0
- package/docs/architecture/decisions/20261011-autonomous-continuation-convergence.md +597 -0
- package/docs/architecture/decisions/20261017-edit-session-finalization-reconciliation.md +17 -0
- package/docs/architecture/decisions/20261019-retire-host-skills.md +16 -0
- package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +1 -1
- package/docs/architecture/domains/public-surface.md +3 -5
- package/docs/architecture/domains/verification.md +6 -5
- package/docs/architecture/domains/workflow-engine.md +6 -0
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +3 -3
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +4 -4
- package/docs/architecture/reviews/20261015-code-search-runtime-acceptance.md +75 -0
- package/docs/forge-plugin-management.md +16 -4
- package/docs/operations/controller-browser-plugin.md +23 -0
- package/docs/operations/controller-performance-and-502.md +17 -0
- package/docs/operations/controller-reliability-runbook.md +2 -2
- package/docs/operations/features.md +6 -7
- package/docs/operations/features.zh-CN.md +1 -1
- package/docs/operations/github-repository.md +4 -4
- package/docs/operations/github-semantic-release-projection.md +20 -0
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +13 -52
- package/docs/operations/releasing.md +2 -0
- package/docs/operations/runtime-performance-diagnostics.md +8 -0
- package/docs/operations/standalone-disaster-recovery.md +15 -7
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/03-first-repository-task.md +2 -0
- package/docs/wiki/Computer-and-Plugins.md +78 -0
- package/docs/wiki/Computer-and-Plugins.zh-CN.md +88 -0
- package/docs/wiki/Home.md +16 -2
- package/docs/wiki/Implementation.md +25 -13
- package/docs/wiki/Installation.md +28 -32
- package/docs/wiki/Integrations.md +4 -0
- package/docs/wiki/Quick-Start.md +35 -22
- package/docs/wiki/Releases-and-Upgrades.md +15 -25
- package/docs/wiki/_Sidebar.md +5 -1
- package/package.json +25 -25
- package/packages/kernel/cognition/api/index.ts +6 -0
- package/packages/kernel/cognition/application/activation-service.ts +451 -0
- package/packages/kernel/cognition/application/consolidation-service.ts +185 -0
- package/packages/kernel/cognition/application/legacy-experience-adapter.ts +38 -0
- package/packages/kernel/cognition/application/memory-service.ts +64 -0
- package/packages/kernel/cognition/domain/learning.ts +106 -0
- package/packages/kernel/cognition/domain/memory.ts +254 -0
- package/packages/kernel/controller/api/index.ts +1 -0
- package/packages/kernel/controller/application/continuation-service.ts +281 -0
- package/packages/kernel/controller/application/controller-round-service.ts +12 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +242 -21
- package/packages/kernel/controller/domain/controller-round.ts +4 -1
- package/packages/kernel/controller/domain/execution-quality.ts +3 -1
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +689 -103
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +348 -97
- package/packages/kernel/controller/ports/controller-host.ts +2 -0
- package/packages/kernel/identity/api/index.ts +10 -0
- package/packages/kernel/identity/domain/activity-projection.ts +43 -0
- package/packages/kernel/identity/domain/capability-broker.ts +60 -0
- package/packages/kernel/identity/domain/grant.ts +72 -0
- package/packages/kernel/identity/domain/owned-resource.ts +116 -0
- package/packages/kernel/identity/domain/user-request.ts +93 -0
- package/packages/kernel/identity/infrastructure/activity-projection-store.ts +87 -0
- package/packages/kernel/identity/infrastructure/capability-broker.ts +81 -0
- package/packages/kernel/identity/infrastructure/grant-store.ts +284 -0
- package/packages/kernel/identity/infrastructure/owned-resource-store.ts +259 -0
- package/packages/kernel/identity/infrastructure/user-request-store.ts +182 -0
- package/packages/kernel/scheduler/api/index.ts +0 -2
- package/packages/kernel/scheduler/application/eligibility.ts +4 -1
- package/packages/kernel/scheduler/application/schedule-service.ts +3 -0
- package/packages/kernel/scheduler/application/settlement.ts +0 -15
- package/packages/kernel/scheduler/domain/schedule.ts +87 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +166 -143
- package/packages/kernel/work/api/index.ts +3 -2
- package/packages/kernel/work/application/work-service.ts +18 -42
- package/packages/kernel/work/domain/current-task-lineage.ts +104 -0
- package/packages/kernel/work/domain/engineering-design.ts +10 -5
- package/packages/kernel/work/domain/engineering-profile.ts +8 -12
- package/packages/kernel/work/domain/evaluation-promotion-receipt.ts +186 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +19 -26
- package/packages/kernel/work/domain/execution-snapshot.ts +0 -31
- package/packages/kernel/work/domain/implementation-review.ts +14 -331
- package/packages/kernel/work/domain/objective-graph.ts +119 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +23 -1
- package/packages/kernel/work/domain/repository-completion-receipt.ts +1 -1
- package/packages/kernel/work/domain/state-machine.ts +34 -65
- package/packages/kernel/work/domain/types.ts +57 -51
- package/packages/kernel/work/infrastructure/work-contract-store.ts +847 -729
- package/packages/kernel/work/ports/work-contract-store.ts +5 -2
- package/packages/plugin-runtime/browser/provider-registry.ts +12 -36
- package/packages/plugin-runtime/browser/session-authority.ts +2 -1
- package/packages/plugin-runtime/computer/chatgpt-identity.ts +24 -0
- package/packages/plugin-runtime/computer/conversation-target.ts +153 -0
- package/packages/plugin-runtime/computer/index.ts +2 -0
- package/packages/plugin-runtime/computer/target-authority.ts +26 -1
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +142 -18
- package/packages/protocols/computer/contract.ts +27 -1
- package/scripts/activate-source-baseline.ts +7 -9
- package/scripts/assemble-template.ts +11 -72
- package/scripts/canary-controller-semantic-wait.ts +12 -24
- package/scripts/check-mcp-compatibility.ts +94 -201
- package/scripts/check-package-identity.mjs +0 -5
- package/scripts/check-runtime-architecture.mjs +921 -239
- package/scripts/forge-local-recovery-helper.mjs +93 -15
- package/scripts/init-project.sh +0 -46
- package/scripts/install-ios-hid-toolchain.sh +60 -0
- package/scripts/install-standalone-recovery.ts +1 -1
- package/scripts/lib/project-init-lib.sh +6 -3
- package/scripts/migrate-windows-wsl-controller-home.ts +2 -0
- package/scripts/open-source-audit-allowlist.txt +1 -3
- package/scripts/run-bounded-command.mjs +5 -0
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/run-mobile-monitor-bridge.ts +0 -1
- package/scripts/smoke-control-plane-failure-domain.ts +94 -0
- package/scripts/smoke-ios-physical-device.ts +38 -10
- package/scripts/smoke-mcp-http-runtime.ts +12 -8
- package/scripts/smoke-mcp-tool-surface.ts +27 -41
- package/scripts/smoke-runtime-recovery.ts +12 -43
- package/scripts/smoke-schedule-engine.ts +23 -15
- package/scripts/smoke-unattended-transport-recovery.ts +223 -0
- package/scripts/smoke-user-request-continuation-restart.ts +232 -0
- package/scripts/smoke-workflow-supervisor-chrome-adapter.ts +95 -0
- package/scripts/smoke-workflow-supervisor-process-restart.ts +276 -0
- package/scripts/smoke-workflow-supervisor-restart-recovery.ts +150 -0
- package/scripts/smoke-workflow-supervisor.ts +103 -0
- package/scripts/sync-generated-authority.mjs +0 -1
- package/scripts/verify-forge-runtime.sh +2 -1
- package/src/cli/agent-jobs/executor-health.ts +12 -35
- package/src/cli/agent-jobs/integration.ts +20 -51
- package/src/cli/agent-jobs/job-manager.ts +7 -3
- package/src/cli/chatgpt-browser/file-policy.ts +2 -2
- package/src/cli/commands/brain-assistant.ts +27 -13
- package/src/cli/commands/brain.ts +13 -15
- package/src/cli/commands/chatgpt.ts +1 -163
- package/src/cli/commands/doctor.ts +1 -143
- package/src/cli/commands/global-runtime.ts +3 -196
- package/src/cli/commands/init-hook.ts +6 -23
- package/src/cli/commands/init.ts +3 -252
- package/src/cli/commands/mcp.ts +0 -5
- package/src/cli/commands/prompt-guard-decision.ts +0 -2
- package/src/cli/commands/recovery.ts +137 -135
- package/src/cli/commands/repository.ts +17 -1
- package/src/cli/commands/runtime.ts +3 -3
- package/src/cli/commands/setup-execution.ts +41 -0
- package/src/cli/commands/setup-profile.ts +8 -0
- package/src/cli/controller/check-runner.ts +13 -2
- package/src/cli/controller/completion-backlog.ts +3 -3
- package/src/cli/controller/completion-orchestrator.ts +5 -44
- package/src/cli/controller/completion-target.ts +3 -72
- package/src/cli/controller/composite-operations.ts +1 -1
- package/src/cli/controller/context/instruction-context.ts +1 -1
- package/src/cli/controller/context/known-paths.ts +2 -2
- package/src/cli/controller/context/query-planning.ts +11 -4
- package/src/cli/controller/context/rule-resolution.ts +2 -2
- package/src/cli/controller/context/source-materializer.ts +83 -102
- package/src/cli/controller/context/structural-provider.ts +84 -0
- package/src/cli/controller/context/structural.ts +6 -6
- package/src/cli/controller/context/types.ts +8 -9
- package/src/cli/controller/context-pack.ts +107 -84
- package/src/cli/controller/execution-completion.ts +4 -7
- package/src/cli/controller/execution-policy.ts +36 -153
- package/src/cli/controller/governance.ts +2 -3
- package/src/cli/controller/issue-store.ts +4 -99
- package/src/cli/controller/launch-agents.ts +59 -18
- package/src/cli/controller/operational-plan.ts +25 -52
- package/src/cli/controller/runtime-config.ts +5 -1
- package/src/cli/controller/stuck-state-migration.ts +2 -3
- package/src/cli/controller/systemd-user.ts +42 -10
- package/src/cli/editing/edit-session.ts +18 -12
- package/src/cli/github/github.ts +4 -4
- package/src/cli/github/semantic-projection.ts +174 -0
- package/src/cli/hook/prompt-intents.ts +0 -9
- package/src/cli/index.ts +1 -43
- package/src/cli/local-bridge/connector-freshness.ts +1 -12
- package/src/cli/local-bridge/console-automations.ts +19 -14
- package/src/cli/local-bridge/console-view-models.ts +4 -13
- package/src/cli/local-bridge/facade-api.ts +64 -193
- package/src/cli/local-bridge/server.ts +24 -147
- package/src/cli/local-bridge/types.ts +0 -1
- package/src/cli/mcp/oauth-client-retirement.ts +74 -0
- package/src/cli/repositories/command-classifier.ts +0 -9
- package/src/cli/repositories/command-executor.ts +29 -23
- package/src/cli/repositories/command-scope.ts +37 -18
- package/src/cli/repositories/controller-home.ts +48 -0
- package/src/cli/repositories/ephemeral-workspace.ts +20 -30
- package/src/cli/repositories/git-command-executor.ts +2 -2
- package/src/cli/repositories/locks.ts +20 -0
- package/src/cli/repositories/registry.ts +79 -12
- package/src/cli/repositories/safe-patch.ts +2 -12
- package/src/cli/repositories/structured-git.ts +101 -5
- package/src/cli/repository/inspector.ts +185 -343
- package/src/cli/repository/session-cache.ts +92 -6
- package/src/effects/process-runner.ts +17 -1
- package/src/runtime/context/assistant-context.ts +20 -7
- package/src/runtime/context/assistant-work-context.ts +89 -27
- package/src/runtime/context/automatic-learning.ts +565 -0
- package/src/runtime/context/cognitive-attention.ts +173 -0
- package/src/runtime/context/cognitive-skill-canary.ts +158 -0
- package/src/runtime/context/context-closure.ts +46 -9
- package/src/runtime/context/context-pack-process.ts +103 -0
- package/src/runtime/context/context-plane.ts +1 -9
- package/src/runtime/context/direct-controller-learning.ts +298 -0
- package/src/runtime/context/generic-lsp-provider.ts +1 -1
- package/src/runtime/context/semantic-navigation-contract.ts +16 -0
- package/src/runtime/context/semantic-navigation.ts +7 -35
- package/src/runtime/context/typescript-navigation-process.ts +145 -0
- package/src/runtime/context/typescript-navigation.ts +89 -3
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +215 -12
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +9 -47
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +34 -4
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +29 -20
- package/src/runtime/control-plane/execution/execution-identity.ts +23 -3
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +7 -30
- package/src/runtime/control-plane/execution/retained-work-resume.ts +206 -199
- package/src/runtime/control-plane/execution/session-store.ts +31 -1
- package/src/runtime/control-plane/execution/validation.ts +6 -8
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +13 -42
- package/src/runtime/control-plane/execution/work-check-evidence.ts +137 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +30 -85
- package/src/runtime/control-plane/execution/work-delivery-service.ts +616 -0
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +12 -50
- package/src/runtime/control-plane/execution/work-execution-support.ts +50 -149
- package/src/runtime/control-plane/execution/work-handle-authority.ts +197 -110
- package/src/runtime/control-plane/execution/work-handle-store.ts +72 -44
- package/src/runtime/control-plane/execution/work-head-settlement.ts +53 -20
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +52 -29
- package/src/runtime/control-plane/execution/work-operation-service.ts +60 -34
- package/src/runtime/control-plane/execution/work-preparation-service.ts +231 -267
- package/src/runtime/control-plane/execution/work-process-evidence.ts +2 -2
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +2 -3
- package/src/runtime/control-plane/execution/work-revision-diff.ts +39 -0
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +201 -199
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +33 -85
- package/src/runtime/control-plane/execution/work-verification-service.ts +406 -50
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +6 -2
- package/src/runtime/control-plane/facade/capability-registry.ts +364 -37
- package/src/runtime/control-plane/facade/check-normalization.ts +3 -9
- package/src/runtime/control-plane/facade/codex-delegation.ts +10 -11
- package/src/runtime/control-plane/facade/controller-connection.ts +135 -0
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +1 -20
- package/src/runtime/control-plane/facade/goal-workloop.ts +281 -1753
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +12 -25
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +256 -52
- package/src/runtime/control-plane/facade/index.ts +0 -1
- package/src/runtime/control-plane/facade/operation-digest.ts +12 -15
- package/src/runtime/control-plane/facade/plan-contract-store.ts +451 -991
- package/src/runtime/control-plane/facade/policy-gate.ts +0 -23
- package/src/runtime/control-plane/facade/repository-work-admission.ts +12 -22
- package/src/runtime/control-plane/facade/requirement-authority.ts +102 -199
- package/src/runtime/control-plane/facade/requirement-board.ts +3 -3
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +51 -14
- package/src/runtime/control-plane/facade/self-healing-loop.ts +18 -53
- package/src/runtime/control-plane/facade/suggested-actions.ts +15 -18
- package/src/runtime/control-plane/facade/types.ts +49 -108
- package/src/runtime/control-plane/facade/work-continuation.ts +9 -9
- package/src/runtime/control-plane/generated-cache-retention.ts +206 -59
- package/src/runtime/control-plane/global-scheduler/autonomous-continuation.ts +248 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +256 -117
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -12
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +66 -40
- package/src/runtime/control-plane/global-scheduler/wake-signal.ts +42 -2
- package/src/runtime/control-plane/governance/access-policy.ts +19 -2
- package/src/runtime/control-plane/governance/authorization.ts +20 -3
- package/src/runtime/control-plane/governance/external-effects.ts +1 -1
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +63 -300
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +29 -300
- package/src/runtime/control-plane/launcher/local-conversation-controller.ts +238 -0
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +5 -2
- package/src/runtime/control-plane/launcher/thin-launcher.ts +96 -240
- package/src/runtime/control-plane/persistence/cognition-store.ts +820 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +162 -29
- package/src/runtime/control-plane/persistence/requirement-store.ts +216 -74
- package/src/runtime/control-plane/persistence/sqlite-store.ts +113 -6
- package/src/runtime/control-plane/release-retention.ts +135 -47
- package/src/runtime/control-plane/repository-namespace-retention.ts +2 -2
- package/src/runtime/control-plane/runtime-cleanup.ts +295 -107
- package/src/runtime/control-plane/workspace/project-onboarding.ts +80 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +19 -5
- package/src/runtime/control-plane/workspace/workspace-store.ts +169 -0
- package/src/runtime/diagnostics/incident-repair.ts +313 -146
- package/src/runtime/diagnostics/mcp-timing.ts +114 -0
- package/src/runtime/evidence/artifact-store.ts +158 -40
- package/src/runtime/evidence/evidence-store.ts +112 -8
- package/src/runtime/evidence/output-handle-index.ts +225 -0
- package/src/runtime/evidence/result-store.ts +158 -44
- package/src/runtime/evidence/sensitive-output.ts +22 -2
- package/src/runtime/execution/jobs/child-reference.ts +11 -0
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -11
- package/src/runtime/execution/jobs/store.ts +3 -4
- package/src/runtime/execution/managed-workspace.ts +57 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +2 -2
- package/src/runtime/execution/process-runtime/check-result.ts +105 -1
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +18 -8
- package/src/runtime/execution/process-runtime/command-facade.ts +82 -30
- package/src/runtime/execution/process-runtime/gc.ts +15 -2
- package/src/runtime/execution/process-runtime/handle-index.ts +176 -0
- package/src/runtime/execution/process-runtime/host-command-lane.ts +139 -0
- package/src/runtime/execution/process-runtime/index.ts +3 -0
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +251 -72
- package/src/runtime/execution/process-runtime/persisted-check.ts +3 -3
- package/src/runtime/execution/process-runtime/process-runner-entry.ts +47 -5
- package/src/runtime/execution/process-runtime/process-scope.ts +160 -0
- package/src/runtime/execution/process-runtime/resource-claims.ts +65 -61
- package/src/runtime/execution/process-runtime/runtime.ts +55 -18
- package/src/runtime/execution/process-runtime/store.ts +30 -2
- package/src/runtime/execution/process-runtime/types.ts +6 -1
- package/src/runtime/execution/thin-harness/execution-router.ts +16 -16
- package/src/runtime/execution/thin-harness/fast-executor.ts +2 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +2 -2
- package/src/runtime/execution/workers/executor.ts +3 -8
- package/src/runtime/maintenance/cleanup.ts +41 -5
- package/src/runtime/platform/service-inventory.ts +130 -0
- package/src/runtime/platform/service-manager.ts +8 -0
- package/src/runtime/plugins/action-application.ts +97 -29
- package/src/runtime/plugins/app-store-connect-adapter.ts +290 -18
- package/src/runtime/plugins/browser-adapter.ts +1124 -333
- package/src/runtime/plugins/browser-automation-service.ts +23 -3
- package/src/runtime/plugins/browser-macos-bridge.ts +431 -137
- package/src/runtime/plugins/browser-manifest-surface.ts +47 -12
- package/src/runtime/plugins/browser-native-session-service.ts +63 -13
- package/src/runtime/plugins/browser-registration.ts +18 -0
- package/src/runtime/plugins/browser-runtime.ts +40 -36
- package/src/runtime/plugins/browser-session-authority.ts +2 -2
- package/src/runtime/plugins/browser-session-store.ts +46 -76
- package/src/runtime/plugins/capability-authorization-grants.ts +258 -62
- package/src/runtime/plugins/computer-chatgpt-browser-adapter-installer.ts +228 -0
- package/src/runtime/plugins/computer-registration.ts +298 -20
- package/src/runtime/plugins/desktop-operator-external-policy.ts +36 -4
- package/src/runtime/plugins/desktop-operator-registration.ts +12 -4
- package/src/runtime/plugins/external-adapter.ts +42 -6
- package/src/runtime/plugins/external-registration.ts +21 -1
- package/src/runtime/plugins/github-adapter.ts +30 -3
- package/src/runtime/plugins/gmail-adapter.ts +189 -3
- package/src/runtime/plugins/google-calendar-adapter.ts +2 -2
- package/src/runtime/plugins/google-shared.ts +24 -12
- package/src/runtime/plugins/google-tasks-adapter.ts +2 -2
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +70 -30
- package/src/runtime/plugins/ios-adapter.ts +46 -41
- package/src/runtime/plugins/ios-agent-device.ts +54 -4
- package/src/runtime/plugins/ios-device-ownership.ts +103 -0
- package/src/runtime/plugins/ios-physical-device.ts +497 -79
- package/src/runtime/plugins/lightweight-action.ts +208 -2
- package/src/runtime/plugins/local-system-adapter.ts +12 -100
- package/src/runtime/plugins/managed-process-adapter.ts +12 -5
- package/src/runtime/plugins/plugin-action-sidecar.ts +17 -13
- package/src/runtime/plugins/plugin-management-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +682 -435
- package/src/runtime/plugins/types.ts +24 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +16 -0
- package/src/runtime/projections/git-status-sampler.ts +2 -19
- package/src/runtime/projections/invalidation.ts +7 -3
- package/src/runtime/projections/materialized-view.ts +80 -36
- package/src/runtime/recovery/actions.ts +4 -4
- package/src/runtime/recovery/capability-action-application.ts +46 -45
- package/src/runtime/recovery/lifecycle-inventory.ts +30 -40
- package/src/runtime/recovery/maintenance-executor.ts +374 -123
- package/src/runtime/recovery/probe.ts +2 -2
- package/src/runtime/recovery/store.ts +29 -11
- package/src/runtime/release/release-coordinator.ts +312 -0
- package/src/runtime/release/release-session.ts +716 -0
- package/src/runtime/release/release-state-migration.ts +25 -0
- package/src/runtime/resources/leases/store.ts +56 -25
- package/src/runtime/root/computer-composition.ts +191 -6
- package/src/runtime/root/controller-progression-composition.ts +254 -0
- package/src/runtime/root/controller-round-composition.ts +20 -1
- package/src/runtime/root/deployment-topology.ts +106 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/known-good-recovery.ts +184 -0
- package/src/runtime/root/local-bridge.ts +0 -1
- package/src/runtime/root/mcp-transport.ts +111 -18
- package/src/runtime/root/ownership.ts +261 -9
- package/src/runtime/root/package-connector-service.ts +227 -29
- package/src/runtime/root/package-runtime-release.ts +117 -30
- package/src/runtime/root/package-runtime-service.ts +24 -24
- package/src/runtime/root/release-execution-canary.ts +57 -12
- package/src/runtime/root/release-loader.ts +90 -8
- package/src/runtime/root/release-manifest.ts +80 -40
- package/src/runtime/root/release-materialize.ts +372 -106
- package/src/runtime/root/release-store.ts +395 -36
- package/src/runtime/root/runtime-lane.ts +191 -0
- package/src/runtime/root/runtime.ts +160 -29
- package/src/runtime/root/scheduled-controller-composition.ts +29 -3
- package/src/runtime/root/service-runner.ts +2 -2
- package/src/runtime/root/service.ts +126 -44
- package/src/runtime/root/status.ts +48 -0
- package/src/runtime/root/types.ts +32 -9
- package/src/runtime/root/workflow-supervisor-composition.ts +681 -0
- package/src/runtime/root/workflow-supervisor-runtime.ts +564 -0
- package/src/runtime/root/write-fence.ts +50 -2
- package/src/runtime/safe-tooling/google-credential-store.ts +67 -22
- package/src/runtime/safe-tooling/google-oauth-broker.ts +25 -7
- package/src/runtime/safe-tooling/ios-development.ts +22 -8
- package/src/runtime/safe-tooling/job-summary.ts +1 -1
- package/src/runtime/safe-tooling/workspace-auth.ts +5 -2
- package/src/runtime/shared/atomic-text-file.ts +21 -0
- package/src/runtime/shared/bounded-child-supervisor.ts +9 -1
- package/src/runtime/shared/json-files.ts +8 -3
- package/src/runtime/shared/process-environment.ts +20 -9
- package/src/runtime/shared/response-budget.ts +1 -3
- package/src/runtime/standalone-recovery/controller-home-migration.ts +16 -24
- package/src/runtime/standalone-recovery/core.ts +3792 -417
- package/src/runtime/standalone-recovery/entry.ts +507 -45
- package/src/runtime/standalone-recovery/installer.ts +262 -148
- package/src/runtime/standalone-recovery/mcp-server.ts +29 -193
- package/src/runtime/standalone-recovery/operation-lock.ts +12 -2
- package/src/runtime/standalone-recovery/performance.ts +54 -16
- package/src/runtime/standalone-recovery/release.ts +53 -5
- package/src/runtime/standalone-recovery/service-labels.ts +5 -2
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +5 -2
- package/src/runtime/workflow/schedules/browser-probe.ts +17 -6
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +11 -3
- package/src/runtime/workflow/schedules/engine.ts +166 -178
- package/src/runtime/workflow/schedules/pending-activation.ts +11 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +95 -11
- package/src/runtime/workflows/runtime.ts +15 -19
- package/src/testing/test-governance.ts +5 -1
- package/supervisor/chatgpt-conversation.ts +23 -0
- package/supervisor/client.ts +218 -0
- package/supervisor/control-plane.ts +963 -0
- package/supervisor/entry.ts +15 -0
- package/supervisor/forge-validators.ts +147 -0
- package/supervisor/index.ts +5 -0
- package/supervisor/native-browser-adapter.ts +1151 -0
- package/supervisor/native-messaging/host.ts +58 -0
- package/supervisor/native-messaging/manifest.ts +26 -0
- package/supervisor/native-messaging/protocol.ts +27 -0
- package/supervisor/paths.ts +18 -0
- package/supervisor/protocol.ts +250 -0
- package/supervisor/server.ts +412 -0
- package/supervisor/store.ts +1870 -0
- package/supervisor/tsconfig.json +8 -0
- package/supervisor/types.ts +261 -0
- package/SKILL.md +0 -427
- package/adapters/chatgpt/controller-host.ts +0 -119
- package/adapters/mcp/controller-round-compatibility.ts +0 -184
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +0 -292
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +0 -502
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +0 -1
- package/adapters/mcp/toolset-selection.ts +0 -41
- package/agents/openai.yaml +0 -4
- package/assets/skill-hooks.json +0 -41
- package/assets/skill-version.json +0 -189
- package/assets/skills/claude-review/SKILL.md +0 -231
- package/assets/skills/codex-review/SKILL.md +0 -103
- package/assets/templates/helpers/check-skill-version.ts +0 -193
- package/packages/kernel/progression/api/index.ts +0 -2
- package/packages/kernel/progression/application/projector.ts +0 -211
- package/packages/kernel/progression/domain/types.ts +0 -116
- package/packages/kernel/progression/index.ts +0 -1
- package/packages/kernel/scheduler/application/continuation-service.ts +0 -212
- package/packages/kernel/scheduler/domain/continuation.ts +0 -38
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +0 -38
- package/packages/kernel/work/domain/admission-policy.ts +0 -34
- package/scripts/benchmark-background-check-overlap.ts +0 -228
- package/scripts/benchmark-computer-hotpath.ts +0 -255
- package/scripts/benchmark-controller-hotpath.ts +0 -212
- package/scripts/benchmark-controller-round2.ts +0 -191
- package/scripts/benchmark-ios-agent-device.ts +0 -511
- package/scripts/benchmark-mcp-host.sh +0 -117
- package/scripts/benchmark-mcp-transport.ts +0 -169
- package/scripts/benchmark-operational-memory-activation.ts +0 -235
- package/scripts/benchmark-operational-shadow.ts +0 -28
- package/scripts/benchmark-quality-harness.ts +0 -146
- package/scripts/benchmark-route-session-concurrency.ts +0 -915
- package/scripts/benchmark-thin-harness-gateway-ab.ts +0 -632
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +0 -498
- package/scripts/benchmark-thin-harness.ts +0 -251
- package/scripts/benchmark-typescript-navigation.ts +0 -186
- package/scripts/benchmark-work-efficiency.ts +0 -334
- package/scripts/build-controller-ui.ts +0 -28
- package/scripts/check-npm-release.sh +0 -32
- package/scripts/check-public-release-surface.sh +0 -19
- package/scripts/check-release-published.sh +0 -57
- package/scripts/check-release-readiness.sh +0 -37
- package/scripts/check-release-version.mjs +0 -74
- package/scripts/check-skill-version.ts +0 -5
- package/scripts/check-tarball-install-smoke.sh +0 -150
- package/scripts/ensure-codegraph.sh +0 -16
- package/scripts/package-source-archive.sh +0 -147
- package/scripts/public-release-files.txt +0 -39
- package/scripts/public-release.ts +0 -174
- package/scripts/publish-release-tarball.sh +0 -27
- package/scripts/route-nl-vs-ts-eval.ts +0 -679
- package/scripts/run-skill-hook.ts +0 -244
- package/scripts/stage-runtime-release.ts +0 -44
- package/scripts/sync-codex-installed-copies.sh +0 -182
- package/src/cli/commands/tools.ts +0 -167
- package/src/cli/controller/progress.ts +0 -656
- package/src/cli/controller/work-mode.ts +0 -181
- package/src/cli/local-bridge/console-assets.ts +0 -17
- package/src/cli/local-bridge/dashboard.ts +0 -17
- package/src/cli/local-bridge/frontend/src/App.tsx +0 -10
- package/src/cli/local-bridge/frontend/src/components/Button.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/DetailPane.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/components/SearchField.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/SectionHeader.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/Segmented.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/components/StatusText.tsx +0 -3
- package/src/cli/local-bridge/frontend/src/design/icons.tsx +0 -11
- package/src/cli/local-bridge/frontend/src/design/tokens.css +0 -8
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +0 -153
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +0 -37
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +0 -183
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/system/SystemView.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +0 -30
- package/src/cli/local-bridge/frontend/src/lib/format.ts +0 -4
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +0 -7
- package/src/cli/local-bridge/frontend/src/main.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/AppShell.tsx +0 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +0 -2
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +0 -4
- package/src/cli/local-bridge/frontend/src/styles.css +0 -28
- package/src/cli/local-bridge/frontend/src/types.ts +0 -15
- package/src/cli/local-bridge/frontend/src/vite-env.d.ts +0 -1
- package/src/cli/local-bridge/frontend/vite.config.ts +0 -27
- package/src/cli/local-bridge/ui-dist/app.css +0 -1
- package/src/cli/local-bridge/ui-dist/app.js +0 -11228
- package/src/cli/mcp/access-mode.ts +0 -2
- package/src/cli/mcp/access-tools.ts +0 -2
- package/src/cli/mcp/audit.ts +0 -2
- package/src/cli/mcp/auth.ts +0 -2
- package/src/cli/mcp/instructions.ts +0 -2
- package/src/cli/mcp/legacy-context.ts +0 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -2
- package/src/cli/mcp/multi-repository.ts +0 -2
- package/src/cli/mcp/oauth.ts +0 -2
- package/src/cli/mcp/openai-secure-tunnel.ts +0 -2
- package/src/cli/mcp/paths.ts +0 -2
- package/src/cli/mcp/policy.ts +0 -2
- package/src/cli/mcp/post-finalize-work-attribution.ts +0 -2
- package/src/cli/mcp/proxy-env.ts +0 -2
- package/src/cli/mcp/readiness-projection.ts +0 -2
- package/src/cli/mcp/redaction.ts +0 -2
- package/src/cli/mcp/repo.ts +0 -2
- package/src/cli/mcp/repository-tools.ts +0 -2
- package/src/cli/mcp/server.ts +0 -2
- package/src/cli/mcp/setup.ts +0 -2
- package/src/cli/mcp/tool-capability-cache.ts +0 -2
- package/src/cli/mcp/tool-contract.ts +0 -2
- package/src/cli/mcp/tools.ts +0 -2
- package/src/cli/mcp/toolset-names.ts +0 -2
- package/src/cli/mcp/toolset-selection.ts +0 -2
- package/src/cli/mcp/toolset.ts +0 -2
- package/src/cli/mcp/transports/http.ts +0 -2
- package/src/cli/mcp/transports/session-registry.ts +0 -2
- package/src/cli/mcp/transports/stdio.ts +0 -2
- package/src/cli/mcp/types.ts +0 -2
- package/src/cli/mcp/umbrella-tools.ts +0 -2
- package/src/cli/tools/codegraph.ts +0 -695
- package/src/core/adoption/helper-wrapper-plan.ts +0 -159
- package/src/runtime/context/codegraph-cache-boundary.ts +0 -255
- package/src/runtime/context/codegraph-read-provider.ts +0 -611
- package/src/runtime/context/codegraph-sidecar.cjs +0 -248
- package/src/runtime/control-plane/codegraph-cache-retention.ts +0 -164
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +0 -169
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +0 -85
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +0 -655
- package/src/runtime/control-plane/execution/work-finalization-service.ts +0 -2850
- package/src/runtime/control-plane/execution/work-path-scope.ts +0 -37
- package/src/runtime/control-plane/execution/work-task-receipt.ts +0 -468
- package/src/runtime/control-plane/facade/controller-round-relay.ts +0 -3
- package/src/runtime/control-plane/facade/work-admission-policy.ts +0 -142
- package/src/runtime/control-plane/facade/work-implementation-review.ts +0 -2
- package/src/runtime/control-plane/facade/work-state-machine.ts +0 -2
- package/src/runtime/control-plane/facade/work-task-projection.ts +0 -66
- package/src/runtime/control-plane/routing/index.ts +0 -1
- package/src/runtime/control-plane/routing/route-policy.ts +0 -401
- package/src/runtime/control-plane/routing/workspace-admission.ts +0 -70
- package/src/runtime/gateway/mcp/execution-tools.ts +0 -2
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +0 -2
- package/src/runtime/gateway/mcp/persisted-check-process.ts +0 -2
- package/src/runtime/gateway/mcp/process-tools.ts +0 -2
- package/src/runtime/gateway/mcp/router.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +0 -2
- package/src/runtime/gateway/mcp/runtime-tools.ts +0 -2
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +0 -2
- package/src/runtime/plugins/browser-provider-registry.ts +0 -2
|
@@ -33,11 +33,34 @@ function nearestExistingPath(candidate: string): string | undefined {
|
|
|
33
33
|
return current;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Minimal command execution target. Repository identity stays optional: an
|
|
38
|
+
* arbitrary workspace target carries only its scope key and root, so command
|
|
39
|
+
* policy/audit/cwd checks need no fabricated repository record.
|
|
40
|
+
*/
|
|
41
|
+
export interface RepositoryCommandScopeTarget {
|
|
42
|
+
canonicalRoot: string;
|
|
43
|
+
/** Registered repository id (`RepositoryRecord.repoId`); absent for an arbitrary workspace target. */
|
|
44
|
+
repoId?: string;
|
|
45
|
+
/** Workspace scope key; present only when the target is not a repository. */
|
|
46
|
+
workspaceScopeKey?: string;
|
|
47
|
+
activeCheckoutId?: string;
|
|
48
|
+
defaultBranch?: string;
|
|
49
|
+
enabled?: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Canonical scope key for command policy/audit/approval storage. */
|
|
53
|
+
export function commandExecutionScopeKey(target: RepositoryCommandScopeTarget): string {
|
|
54
|
+
const key = target.repoId?.trim() || target.workspaceScopeKey?.trim();
|
|
55
|
+
if (!key) throw new Error('COMMAND_TARGET_SCOPE_REQUIRED: command target requires a repository id or workspace scope key');
|
|
56
|
+
return key;
|
|
57
|
+
}
|
|
58
|
+
|
|
36
59
|
export function resolveRepositoryCommandCwd(
|
|
37
|
-
repository:
|
|
60
|
+
repository: RepositoryCommandScopeTarget,
|
|
38
61
|
requestedCwd: string | undefined,
|
|
39
62
|
): { root: string; cwd: string; relativeCwd: string } {
|
|
40
|
-
if (
|
|
63
|
+
if (repository.enabled === false) throw new Error(`REPOSITORY_DISABLED: ${commandExecutionScopeKey(repository)}`);
|
|
41
64
|
const root = realpathSync(repository.canonicalRoot);
|
|
42
65
|
const raw = requestedCwd?.trim() || '.';
|
|
43
66
|
if (raw.includes('\0')) throw new Error('COMMAND_SCOPE_DENIED: cwd contains a null byte');
|
|
@@ -161,13 +184,13 @@ function assertNoUnmanagedControllerWorktreeLifecycle(command: CanonicalReposito
|
|
|
161
184
|
};
|
|
162
185
|
if (command.kind === 'argv') {
|
|
163
186
|
if (isGitWorktreeAdd([command.executable!, ...(command.args ?? [])])) {
|
|
164
|
-
throw new Error('MANAGED_WORKSPACE_REQUIRED:
|
|
187
|
+
throw new Error('MANAGED_WORKSPACE_REQUIRED: execute_command must not create an unmanaged temporary git worktree; use rh_work so Forge persists checkout/worktree ownership and terminal cleanup authority');
|
|
165
188
|
}
|
|
166
189
|
return;
|
|
167
190
|
}
|
|
168
191
|
for (const segment of shellSegments(command.shellCommand ?? '')) {
|
|
169
192
|
if (isGitWorktreeAdd(shellWords(segment))) {
|
|
170
|
-
throw new Error('MANAGED_WORKSPACE_REQUIRED:
|
|
193
|
+
throw new Error('MANAGED_WORKSPACE_REQUIRED: execute_command must not create an unmanaged temporary git worktree; use rh_work so Forge persists checkout/worktree ownership and terminal cleanup authority');
|
|
171
194
|
}
|
|
172
195
|
}
|
|
173
196
|
}
|
|
@@ -258,7 +281,7 @@ interface RepositoryCommandPathPolicyOptions {
|
|
|
258
281
|
}
|
|
259
282
|
|
|
260
283
|
interface SourceControllerRoundCompatibilityScope {
|
|
261
|
-
operation: 'round-
|
|
284
|
+
operation: 'round-close';
|
|
262
285
|
controllerHome: string;
|
|
263
286
|
workId: string;
|
|
264
287
|
controllerAuthorityId: string;
|
|
@@ -274,11 +297,9 @@ function sourceControllerRoundCompatibilityScope(
|
|
|
274
297
|
const args = command.args ?? [];
|
|
275
298
|
if (executable !== 'bun' || args[0] !== 'src/cli/index.ts' || args[1] !== 'chatgpt') return undefined;
|
|
276
299
|
const operation = args[2];
|
|
277
|
-
if (operation !== 'round-
|
|
300
|
+
if (operation !== 'round-close') return undefined;
|
|
278
301
|
|
|
279
|
-
const allowedFlags =
|
|
280
|
-
? new Set(['--controller-home', '--repo-id', '--work-id', '--controller-authority-id', '--relay-scope-id', '--reason', '--timeout-ms'])
|
|
281
|
-
: new Set(['--controller-home', '--repo-id', '--work-id', '--controller-authority-id', '--relay-scope-id', '--disposition', '--handoff-id', '--reason']);
|
|
302
|
+
const allowedFlags = new Set(['--controller-home', '--repo-id', '--work-id', '--controller-authority-id', '--relay-scope-id', '--disposition', '--handoff-id', '--reason']);
|
|
282
303
|
const values = new Map<string, string>();
|
|
283
304
|
for (let index = 3; index < args.length; index += 2) {
|
|
284
305
|
const flag = args[index];
|
|
@@ -300,14 +321,12 @@ function sourceControllerRoundCompatibilityScope(
|
|
|
300
321
|
if (requestedControllerHome !== configuredControllerHome) {
|
|
301
322
|
throw new Error(`SOURCE_CONTROLLER_ROUND_COMMAND_CONTROLLER_HOME_MISMATCH:${requestedControllerHome}`);
|
|
302
323
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
throw new Error('SOURCE_CONTROLLER_ROUND_COMMAND_HANDOFF_REQUIRED');
|
|
310
|
-
}
|
|
324
|
+
const disposition = values.get('--disposition');
|
|
325
|
+
if (!disposition || !['wait', 'wait_for_user', 'goal_complete'].includes(disposition)) {
|
|
326
|
+
throw new Error(`SOURCE_CONTROLLER_ROUND_COMMAND_DISPOSITION_INVALID:${disposition ?? 'missing'}`);
|
|
327
|
+
}
|
|
328
|
+
if (disposition === 'wait_for_user' && !values.get('--handoff-id')?.trim()) {
|
|
329
|
+
throw new Error('SOURCE_CONTROLLER_ROUND_COMMAND_HANDOFF_REQUIRED');
|
|
311
330
|
}
|
|
312
331
|
return {
|
|
313
332
|
operation,
|
|
@@ -328,7 +347,7 @@ function grantCoversPath(grant: ExternalFilesystemGrant, canonicalPath: string,
|
|
|
328
347
|
}
|
|
329
348
|
|
|
330
349
|
function operationForToken(words: string[], index: number, external: string, cwd: string, root: string): RepositoryCommandExternalPathOperation | 'external_write' | 'unsupported' {
|
|
331
|
-
const program = words[0]?.toLowerCase();
|
|
350
|
+
const program = words[0]?.split(/[\\/]/).at(-1)?.toLowerCase();
|
|
332
351
|
if (!program) return 'unsupported';
|
|
333
352
|
if (program === 'cp' || program === 'install') {
|
|
334
353
|
const operands = words.slice(1).filter((word) => word && !word.startsWith('-'));
|
|
@@ -253,7 +253,10 @@ export function ensureRepoPreferredControllerHome(repoRoot?: string, explicit?:
|
|
|
253
253
|
return ensureControllerHome(resolveRepoPreferredControllerHome(repoRoot, explicit));
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
+
/** Legacy adapter-only sentinel. Never use this as a canonical storage or resource scope. */
|
|
256
257
|
export const CONTROLLER_SCOPE_REPO_ID = '__controller__';
|
|
258
|
+
/** Canonical mechanical scope for state owned by the serving ForgeInstance itself. */
|
|
259
|
+
export const FORGE_INSTANCE_SCOPE_KEY = 'forge-instance';
|
|
257
260
|
|
|
258
261
|
/** Human-editable user Workflow Asset content. Machine workflow state stays in control-plane persistence. */
|
|
259
262
|
export function controllerWorkflowContentRoot(controllerHome: string): string {
|
|
@@ -283,6 +286,51 @@ export function repositoryControllerRoot(controllerHome: string, repoId: string)
|
|
|
283
286
|
: join(resolveControllerHome(durableHome), 'repositories', repoId);
|
|
284
287
|
}
|
|
285
288
|
|
|
289
|
+
/** Reserved prefix for arbitrary workspace scopes; registered repository ids are `repo_*`. */
|
|
290
|
+
export const WORKSPACE_SCOPE_PREFIX = 'workspace_';
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Reserved scope key for portable semantic facts (Requirement/Plan/Work) that
|
|
294
|
+
* belong to the ForgeInstance rather than to one repository. Repository and
|
|
295
|
+
* project placement stays optional provenance on those records.
|
|
296
|
+
*/
|
|
297
|
+
export const SEMANTIC_SCOPE_KEY = 'semantic';
|
|
298
|
+
|
|
299
|
+
export function isWorkspaceScopeKey(scopeKey: string): boolean {
|
|
300
|
+
return scopeKey.trim().startsWith(WORKSPACE_SCOPE_PREFIX);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export function isSemanticScopeKey(scopeKey: string): boolean {
|
|
304
|
+
return scopeKey.trim() === SEMANTIC_SCOPE_KEY;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Controller-Home root for an arbitrary workspace scope. A workspace has no
|
|
309
|
+
* repository semantics, so its operation facts own a sibling partition instead
|
|
310
|
+
* of a repository partition.
|
|
311
|
+
*/
|
|
312
|
+
export function workspaceScopeRoot(controllerHome: string, scopeKey: string): string {
|
|
313
|
+
const key = scopeKey.trim();
|
|
314
|
+
if (!isWorkspaceScopeKey(key)) throw new Error(`WORKSPACE_SCOPE_KEY_REQUIRED: ${scopeKey}`);
|
|
315
|
+
return join(resolveControllerHome(durableControllerHome(controllerHome)), 'workspaces', key);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Controller-Home root for one operation scope key. Repository scopes (including
|
|
320
|
+
* the controller-system sentinel) keep their established root; workspace scopes
|
|
321
|
+
* own the workspace partition.
|
|
322
|
+
*/
|
|
323
|
+
export function scopedOperationRoot(controllerHome: string, scopeKey: string): string {
|
|
324
|
+
const key = scopeKey.trim();
|
|
325
|
+
return key === FORGE_INSTANCE_SCOPE_KEY
|
|
326
|
+
? controllerSystemRoot(controllerHome)
|
|
327
|
+
: isWorkspaceScopeKey(key)
|
|
328
|
+
? workspaceScopeRoot(controllerHome, key)
|
|
329
|
+
: isSemanticScopeKey(key)
|
|
330
|
+
? join(resolveControllerHome(durableControllerHome(controllerHome)), SEMANTIC_SCOPE_KEY)
|
|
331
|
+
: repositoryControllerRoot(controllerHome, key);
|
|
332
|
+
}
|
|
333
|
+
|
|
286
334
|
export function ensureRepositoryControllerLayout(controllerHome: string, repoId: string): string {
|
|
287
335
|
const root = repositoryControllerRoot(controllerHome, repoId);
|
|
288
336
|
for (const child of [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from 'crypto';
|
|
2
2
|
import { existsSync, realpathSync, statSync } from 'fs';
|
|
3
|
-
import { isAbsolute
|
|
4
|
-
import type {
|
|
3
|
+
import { isAbsolute } from 'path';
|
|
4
|
+
import type { RepositoryCommandScopeTarget } from './command-scope';
|
|
5
5
|
|
|
6
6
|
export interface EphemeralWorkspaceCoordinates {
|
|
7
7
|
workspaceId: string;
|
|
@@ -10,7 +10,11 @@ export interface EphemeralWorkspaceCoordinates {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export interface EphemeralWorkspaceTarget extends EphemeralWorkspaceCoordinates {
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Typed command target for an arbitrary workspace: it carries the workspace
|
|
15
|
+
* scope key and root, and no repository identity at all.
|
|
16
|
+
*/
|
|
17
|
+
commandTarget: RepositoryCommandScopeTarget;
|
|
14
18
|
}
|
|
15
19
|
|
|
16
20
|
export function ephemeralWorkspaceCoordinates(rootInput: string): EphemeralWorkspaceCoordinates {
|
|
@@ -29,34 +33,20 @@ export function ephemeralWorkspaceCoordinates(rootInput: string): EphemeralWorks
|
|
|
29
33
|
};
|
|
30
34
|
}
|
|
31
35
|
|
|
32
|
-
|
|
36
|
+
/**
|
|
37
|
+
* `controllerHome` is retained for call-site compatibility; an arbitrary
|
|
38
|
+
* workspace owns no controller-scoped repository record.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveEphemeralWorkspaceTarget(rootInput: string, _controllerHome?: string): EphemeralWorkspaceTarget {
|
|
33
41
|
const coordinates = ephemeralWorkspaceCoordinates(rootInput);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
repoId: coordinates.workspaceId,
|
|
38
|
-
displayName: `Ephemeral Workspace (${coordinates.canonicalRoot.split(/[\\/]/).at(-1) || 'root'})`,
|
|
39
|
-
localRoot: coordinates.canonicalRoot,
|
|
40
|
-
canonicalRoot: coordinates.canonicalRoot,
|
|
41
|
-
activeCheckoutId: coordinates.checkoutId,
|
|
42
|
-
checkouts: [{
|
|
43
|
-
checkoutId: coordinates.checkoutId,
|
|
44
|
-
localRoot: coordinates.canonicalRoot,
|
|
42
|
+
return {
|
|
43
|
+
...coordinates,
|
|
44
|
+
commandTarget: {
|
|
45
45
|
canonicalRoot: coordinates.canonicalRoot,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
lifecycle: 'active',
|
|
52
|
-
}],
|
|
53
|
-
repositoryType: 'unknown',
|
|
54
|
-
enabled: true,
|
|
55
|
-
createdAt: now,
|
|
56
|
-
updatedAt: now,
|
|
57
|
-
lastSeenAt: now,
|
|
58
|
-
configurationPath: join(controllerHome, 'ephemeral-workspaces', `${coordinates.workspaceId}.json`),
|
|
59
|
-
stateStorageStrategy: 'controller-home',
|
|
46
|
+
workspaceScopeKey: coordinates.workspaceId,
|
|
47
|
+
// The workspace's own checkout coordinate, never a repository checkout id.
|
|
48
|
+
activeCheckoutId: coordinates.checkoutId,
|
|
49
|
+
enabled: true,
|
|
50
|
+
},
|
|
60
51
|
};
|
|
61
|
-
return { ...coordinates, repository };
|
|
62
52
|
}
|
|
@@ -3,7 +3,7 @@ import { spawnSync } from 'child_process';
|
|
|
3
3
|
import { appendFileSync, mkdirSync, realpathSync } from 'fs';
|
|
4
4
|
import { dirname, join, relative } from 'path';
|
|
5
5
|
import { capProcessOutput, redactProcessOutput } from '../../effects/process-runner';
|
|
6
|
-
import {
|
|
6
|
+
import { scopedOperationRoot } from './controller-home';
|
|
7
7
|
import { classifyRepositoryCommand, type RepositoryCommandAuthorization, type RepositoryCommandClassification } from './command-classifier';
|
|
8
8
|
import { resolveRepositoryCommandCwd } from './command-scope';
|
|
9
9
|
import type { RepositoryRecord } from './types';
|
|
@@ -209,7 +209,7 @@ function snapshotChanged(before: RepositoryGitSnapshot, after: RepositoryGitSnap
|
|
|
209
209
|
}
|
|
210
210
|
|
|
211
211
|
function auditExecution(controllerHome: string, repository: RepositoryRecord, execution: RepositoryGitExecution): void {
|
|
212
|
-
const path = join(
|
|
212
|
+
const path = join(scopedOperationRoot(controllerHome, repository.repoId), 'audit', 'git-commands.jsonl');
|
|
213
213
|
mkdirSync(dirname(path), { recursive: true });
|
|
214
214
|
appendFileSync(path, `${JSON.stringify({
|
|
215
215
|
timestamp: new Date().toISOString(),
|
|
@@ -150,6 +150,26 @@ export function readControllerLock(controllerHome: string, key: ControllerLockKe
|
|
|
150
150
|
return record;
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
export function renewControllerLock(
|
|
154
|
+
controllerHome: string,
|
|
155
|
+
key: ControllerLockKey,
|
|
156
|
+
lockId: string,
|
|
157
|
+
ttlMs: number,
|
|
158
|
+
): ControllerLockRecord {
|
|
159
|
+
const current = readControllerLock(controllerHome, key);
|
|
160
|
+
if (!current) throw new Error(`LOCK_NOT_FOUND: ${lockId}`);
|
|
161
|
+
if (current.lockId !== lockId) throw new Error(`LOCK_OWNERSHIP_MISMATCH: ${current.lockId}`);
|
|
162
|
+
const normalizedTtlMs = Math.max(5_000, Math.trunc(ttlMs));
|
|
163
|
+
const heartbeatAt = new Date().toISOString();
|
|
164
|
+
const next: ControllerLockRecord = {
|
|
165
|
+
...current,
|
|
166
|
+
heartbeatAt,
|
|
167
|
+
expiresAt: new Date(Date.now() + normalizedTtlMs).toISOString(),
|
|
168
|
+
};
|
|
169
|
+
writeFileSync(current.path, `${JSON.stringify(next, null, 2)}\n`, 'utf-8');
|
|
170
|
+
return next;
|
|
171
|
+
}
|
|
172
|
+
|
|
153
173
|
function metric(key: ControllerLockKey, waitedMs: number, outcome: 'success' | 'contention' | 'timeout'): void {
|
|
154
174
|
recordGatewayLatency({
|
|
155
175
|
repoId: key.repoId,
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
realpathSync,
|
|
7
7
|
renameSync,
|
|
8
8
|
rmSync,
|
|
9
|
+
statSync,
|
|
9
10
|
writeFileSync,
|
|
10
11
|
} from 'fs';
|
|
11
12
|
import { dirname, join, relative, resolve } from 'path';
|
|
@@ -92,7 +93,8 @@ function now(): string {
|
|
|
92
93
|
|
|
93
94
|
function comparablePath(value: string): string {
|
|
94
95
|
const resolved = resolve(value);
|
|
95
|
-
|
|
96
|
+
// macOS /tmp and /var are symlinks into /private; compare both aliases canonically.
|
|
97
|
+
return process.platform === 'darwin' && (/^\/(?:tmp|var)(?:\/|$)/.test(resolved))
|
|
96
98
|
? `/private${resolved}`
|
|
97
99
|
: resolved;
|
|
98
100
|
}
|
|
@@ -291,6 +293,51 @@ function readRegistryFile(path: string, strict: boolean): RepositoryRegistry | u
|
|
|
291
293
|
}
|
|
292
294
|
}
|
|
293
295
|
|
|
296
|
+
interface RepositoryRegistryReadSnapshot {
|
|
297
|
+
fileIdentity: string;
|
|
298
|
+
registry: RepositoryRegistry;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const repositoryRegistryReadSnapshots = new Map<string, RepositoryRegistryReadSnapshot>();
|
|
302
|
+
|
|
303
|
+
function registryFileIdentity(path: string): string | undefined {
|
|
304
|
+
try {
|
|
305
|
+
const stat = statSync(path, { bigint: true });
|
|
306
|
+
return `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeNs}:${stat.ctimeNs}`;
|
|
307
|
+
} catch {
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function cloneRepositoryRecord(record: RepositoryRecord): RepositoryRecord {
|
|
313
|
+
return {
|
|
314
|
+
...record,
|
|
315
|
+
checkouts: record.checkouts.map((checkout) => ({ ...checkout })),
|
|
316
|
+
github: record.github
|
|
317
|
+
? { ...record.github, labels: record.github.labels ? [...record.github.labels] : undefined }
|
|
318
|
+
: undefined,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function loadRepositoryRegistryReadSnapshot(controllerHome?: string): RepositoryRegistry {
|
|
323
|
+
const path = registryPath(controllerHome);
|
|
324
|
+
const beforeIdentity = registryFileIdentity(path);
|
|
325
|
+
const cached = beforeIdentity ? repositoryRegistryReadSnapshots.get(path) : undefined;
|
|
326
|
+
if (cached && cached.fileIdentity === beforeIdentity) return cached.registry;
|
|
327
|
+
|
|
328
|
+
let registry = readRegistryFile(path, true) ?? defaultRegistry();
|
|
329
|
+
let afterIdentity = registryFileIdentity(path);
|
|
330
|
+
if (beforeIdentity && afterIdentity && beforeIdentity !== afterIdentity) {
|
|
331
|
+
// A cross-process atomic replacement raced this read. Re-read once from the
|
|
332
|
+
// new physical authority instead of caching a mixed-generation snapshot.
|
|
333
|
+
registry = readRegistryFile(path, true) ?? defaultRegistry();
|
|
334
|
+
afterIdentity = registryFileIdentity(path);
|
|
335
|
+
}
|
|
336
|
+
if (afterIdentity) repositoryRegistryReadSnapshots.set(path, { fileIdentity: afterIdentity, registry });
|
|
337
|
+
else repositoryRegistryReadSnapshots.delete(path);
|
|
338
|
+
return registry;
|
|
339
|
+
}
|
|
340
|
+
|
|
294
341
|
function timestampValue(value: string | undefined): number {
|
|
295
342
|
const parsed = value ? Date.parse(value) : Number.NaN;
|
|
296
343
|
return Number.isFinite(parsed) ? parsed : 0;
|
|
@@ -555,17 +602,18 @@ export function repositorySummary(record: RepositoryRecord): RepositorySummary {
|
|
|
555
602
|
}
|
|
556
603
|
|
|
557
604
|
export function listRepositories(controllerHome?: string, options: { includeRemoved?: boolean } = {}): RepositoryRecord[] {
|
|
558
|
-
return
|
|
605
|
+
return loadRepositoryRegistryReadSnapshot(controllerHome).repositories
|
|
559
606
|
.filter((record) => options.includeRemoved === true || !record.removedAt)
|
|
560
|
-
.sort((a, b) => a.displayName.localeCompare(b.displayName) || a.repoId.localeCompare(b.repoId))
|
|
607
|
+
.sort((a, b) => a.displayName.localeCompare(b.displayName) || a.repoId.localeCompare(b.repoId))
|
|
608
|
+
.map(cloneRepositoryRecord);
|
|
561
609
|
}
|
|
562
610
|
|
|
563
611
|
export function getRepository(repoId: string, controllerHome?: string, options: { includeRemoved?: boolean } = {}): RepositoryRecord {
|
|
564
|
-
const record =
|
|
612
|
+
const record = loadRepositoryRegistryReadSnapshot(controllerHome).repositories.find((candidate) => candidate.repoId === repoId);
|
|
565
613
|
if (!record || (record.removedAt && options.includeRemoved !== true)) {
|
|
566
614
|
throw new Error(`repository not found: ${repoId}`);
|
|
567
615
|
}
|
|
568
|
-
return record;
|
|
616
|
+
return cloneRepositoryRecord(record);
|
|
569
617
|
}
|
|
570
618
|
|
|
571
619
|
export type RepositoryCheckoutSelectionErrorCode = 'CHECKOUT_NOT_FOUND' | 'CHECKOUT_NOT_ACTIVE';
|
|
@@ -635,13 +683,29 @@ export function registerRepository(input: RegisterRepositoryInput): RepositoryRe
|
|
|
635
683
|
? repositoryByGitCommonDirectory(registry.repositories, canonicalRoot)
|
|
636
684
|
: undefined;
|
|
637
685
|
const existingIdentity = existingByRoot ?? existingByCommonDirectory;
|
|
638
|
-
const
|
|
686
|
+
const explicitRepoId = input.repoIdOverride?.trim();
|
|
687
|
+
const derivedRepoId = explicitRepoId
|
|
639
688
|
|| existingIdentity?.repoId
|
|
640
689
|
|| localIdentity.repoId
|
|
641
690
|
|| (canonicalRemote ? stableRemoteRepoId(canonicalRemote) : newLocalRepoId());
|
|
642
|
-
const
|
|
691
|
+
const existingByDerivedId = registry.repositories.find((record) => record.repoId === derivedRepoId);
|
|
692
|
+
// Repository identity is rooted in one Git checkout family, not merely one
|
|
693
|
+
// remote URL. Two independent clones of the same remote have different Git
|
|
694
|
+
// common directories and must remain separate Repository records. The one
|
|
695
|
+
// intentional exception is an explicit registration replacement; legacy
|
|
696
|
+
// repo-local identity may also restore a record whose old canonical root no
|
|
697
|
+
// longer exists after a filesystem move.
|
|
698
|
+
const explicitReplacement = Boolean(explicitRepoId && existingByDerivedId);
|
|
699
|
+
const legacyMovedRoot = Boolean(
|
|
700
|
+
!explicitRepoId
|
|
701
|
+
&& localIdentity.repoId
|
|
702
|
+
&& existingByDerivedId
|
|
703
|
+
&& !existsSync(existingByDerivedId.canonicalRoot),
|
|
704
|
+
);
|
|
705
|
+
const existing = existingIdentity ?? (explicitReplacement || legacyMovedRoot ? existingByDerivedId : undefined);
|
|
706
|
+
const repoId = existing?.repoId
|
|
707
|
+
?? (existingByDerivedId && !existingIdentity ? newLocalRepoId() : derivedRepoId);
|
|
643
708
|
const checkoutId = stableCheckoutId(repoId, canonicalRoot);
|
|
644
|
-
const existing = existingIdentity ?? registry.repositories.find((record) => record.repoId === repoId);
|
|
645
709
|
const checkout: RepositoryCheckout = {
|
|
646
710
|
checkoutId,
|
|
647
711
|
localRoot: canonicalRoot,
|
|
@@ -659,8 +723,8 @@ export function registerRepository(input: RegisterRepositoryInput): RepositoryRe
|
|
|
659
723
|
// A repository-scoped command may start from a managed checkout (for example
|
|
660
724
|
// immutable release construction). Registering that path must add/update the
|
|
661
725
|
// checkout only; it must never promote the ephemeral worktree to repository
|
|
662
|
-
// canonical authority.
|
|
663
|
-
//
|
|
726
|
+
// canonical authority. Active checkout selection is separate authority held
|
|
727
|
+
// by activeCheckoutId; canonicalRoot remains the repository registration root.
|
|
664
728
|
if (existing && worktree && existing.canonicalRemote && canonicalRemote !== existing.canonicalRemote) {
|
|
665
729
|
throw new Error(`CHECKOUT_REPOSITORY_MISMATCH: ${canonicalRoot}`);
|
|
666
730
|
}
|
|
@@ -776,6 +840,9 @@ export function addRepositoryCheckout(input: AddRepositoryCheckoutInput): Reposi
|
|
|
776
840
|
if (current.canonicalRemote && canonicalRemote !== current.canonicalRemote) {
|
|
777
841
|
throw new Error(`CHECKOUT_REPOSITORY_MISMATCH: ${canonicalRoot}`);
|
|
778
842
|
}
|
|
843
|
+
if (!repositoryCheckoutRootMatches(current, canonicalRoot)) {
|
|
844
|
+
throw new Error(`CHECKOUT_REPOSITORY_MISMATCH: ${canonicalRoot}`);
|
|
845
|
+
}
|
|
779
846
|
const timestamp = now();
|
|
780
847
|
const checkoutId = stableCheckoutId(current.repoId, canonicalRoot);
|
|
781
848
|
const checkout: RepositoryCheckout = {
|
|
@@ -792,14 +859,14 @@ export function addRepositoryCheckout(input: AddRepositoryCheckoutInput): Reposi
|
|
|
792
859
|
const activate = input.activate === true;
|
|
793
860
|
const next: RepositoryRecord = {
|
|
794
861
|
...current,
|
|
795
|
-
...(activate ? {
|
|
862
|
+
...(activate ? { activeCheckoutId: checkoutId } : {}),
|
|
796
863
|
checkouts: [...current.checkouts.filter((value) => value.checkoutId !== checkoutId), checkout],
|
|
797
864
|
updatedAt: timestamp,
|
|
798
865
|
lastSeenAt: timestamp,
|
|
799
866
|
};
|
|
800
867
|
registry.repositories[index] = next;
|
|
801
868
|
saveRepositoryRegistry(registry, home);
|
|
802
|
-
return next;
|
|
869
|
+
return activate ? selectRepositoryCheckout(next, checkoutId) : next;
|
|
803
870
|
}
|
|
804
871
|
|
|
805
872
|
export function setRepositoryCheckoutLifecycle(input: SetRepositoryCheckoutLifecycleInput): RepositoryRecord {
|
|
@@ -4,6 +4,7 @@ import { join, relative, resolve } from 'path';
|
|
|
4
4
|
import {
|
|
5
5
|
adoptEditSessionSuccessorHead,
|
|
6
6
|
applyEditOperations,
|
|
7
|
+
findOccurrence,
|
|
7
8
|
beginEditSession,
|
|
8
9
|
getEditSession,
|
|
9
10
|
type EditSession,
|
|
@@ -11,7 +12,7 @@ import {
|
|
|
11
12
|
type EditSessionPatchError,
|
|
12
13
|
} from '../editing/edit-session';
|
|
13
14
|
import { normalizeEditOperation, type EditOperation } from '../editing/edit-operation-contract';
|
|
14
|
-
import { getMcpPolicy } from '
|
|
15
|
+
import { getMcpPolicy } from '../../../adapters/mcp/policy';
|
|
15
16
|
import type { RepositoryRecord } from './types';
|
|
16
17
|
import { ensureRepositoryRuntimeStorageBinding } from './runtime-storage';
|
|
17
18
|
|
|
@@ -189,17 +190,6 @@ function snippetAround(content: string, needle: string): SafePatchFailureContext
|
|
|
189
190
|
return { line: lineIndex + 1, before, focus, after };
|
|
190
191
|
}
|
|
191
192
|
|
|
192
|
-
function findOccurrence(value: string, anchor: string, occurrence: number): number {
|
|
193
|
-
let from = 0;
|
|
194
|
-
for (let current = 1; current <= occurrence; current += 1) {
|
|
195
|
-
const index = value.indexOf(anchor, from);
|
|
196
|
-
if (index < 0) return -1;
|
|
197
|
-
if (current === occurrence) return index;
|
|
198
|
-
from = index + anchor.length;
|
|
199
|
-
}
|
|
200
|
-
return -1;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
193
|
function applyTextPreview(operation: Exclude<EditOperation, { type: 'create' | 'write' | 'delete' }>, before: string): string {
|
|
204
194
|
if (operation.type === 'replace') {
|
|
205
195
|
let after = before;
|