@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
|
@@ -5,19 +5,13 @@ import {
|
|
|
5
5
|
searchRepositoryManyAsync,
|
|
6
6
|
searchRepositoryManyCacheIdentity,
|
|
7
7
|
} from "../repository/inspector";
|
|
8
|
-
import { globMatches } from "
|
|
8
|
+
import { globMatches } from "../../../adapters/mcp/paths";
|
|
9
9
|
import { posix } from "path";
|
|
10
|
-
import type { McpPolicy } from "
|
|
10
|
+
import type { McpPolicy } from "../../../adapters/mcp/types";
|
|
11
11
|
import { materializeSource } from "./context/source-materializer";
|
|
12
12
|
import { projectBoard } from "./issue-store";
|
|
13
13
|
import { buildControllerTaskLedgerProjection } from "./task-ledger";
|
|
14
14
|
import { legacyIssueAuthorityRetired } from "./legacy-issue-cutover";
|
|
15
|
-
import {
|
|
16
|
-
queryCodeGraphReadProvider,
|
|
17
|
-
queryCodeGraphReadProviderAsync,
|
|
18
|
-
type CodeGraphNodeSummary,
|
|
19
|
-
type CodeGraphReadProviderResponse,
|
|
20
|
-
} from "../../runtime/context/codegraph-read-provider";
|
|
21
15
|
import {
|
|
22
16
|
CONTEXT_PACK_SCHEMA_VERSION,
|
|
23
17
|
CONTROLLER_CONTEXT_IMPACT_DOMAINS,
|
|
@@ -38,7 +32,7 @@ import {
|
|
|
38
32
|
clamp,
|
|
39
33
|
cleanList,
|
|
40
34
|
gitStatusChangedPaths,
|
|
41
|
-
|
|
35
|
+
explicitCodeQueries,
|
|
42
36
|
pathNoisePenalty,
|
|
43
37
|
structuralIntentQuery,
|
|
44
38
|
textTokens,
|
|
@@ -46,6 +40,11 @@ import {
|
|
|
46
40
|
import { issueTaskFocus, ledgerTask } from './context/focus';
|
|
47
41
|
import { addReason, coveredByGlob, expandKnownPath, looksLikeGlob, readableFile } from './context/known-paths';
|
|
48
42
|
import { structuralResult } from './context/structural';
|
|
43
|
+
import {
|
|
44
|
+
unavailableStructuralProvider,
|
|
45
|
+
unavailableStructuralProviderAsync,
|
|
46
|
+
type StructuralReadProviderResponse,
|
|
47
|
+
} from './context/structural-provider';
|
|
49
48
|
import { buildRepositoryInstructionContext } from './context/instruction-context';
|
|
50
49
|
import { resolveRepositoryGovernance } from './context/rule-resolution';
|
|
51
50
|
import { controllerCheckSelection, listControllerChecks } from './check-runner';
|
|
@@ -100,7 +99,7 @@ function resolveSourceReference(repoRoot: string, policy: McpPolicy, sourcePath:
|
|
|
100
99
|
function contextPathPriority(path: string, reasons: string[]): number {
|
|
101
100
|
const testBonus = /(^|\/)(__tests__|tests?|spec)(\/|$)|\.(test|spec)\.[^.]+$/i.test(path) ? 6 : 0;
|
|
102
101
|
const sourceBonus = reasons.some((reason) => reason.startsWith('source-reference:')) ? 5 : 0;
|
|
103
|
-
const structuralBonus = reasons.some((reason) => reason.startsWith('
|
|
102
|
+
const structuralBonus = reasons.some((reason) => reason.startsWith('structural:')) ? 3 : 0;
|
|
104
103
|
return testBonus + sourceBonus + structuralBonus;
|
|
105
104
|
}
|
|
106
105
|
|
|
@@ -148,7 +147,8 @@ export function buildControllerContextPack(
|
|
|
148
147
|
focus.task?.objective,
|
|
149
148
|
].filter((entry): entry is string => typeof entry === "string" && entry.trim().length > 0);
|
|
150
149
|
const goal = goalParts.join("\n").trim();
|
|
151
|
-
const
|
|
150
|
+
const requiredSearchQueries = explicitCodeQueries(options.searchTerms);
|
|
151
|
+
const terms = cleanList([...requiredSearchQueries, ...(options.searchTerms ?? []), ...(options.searchTerms ?? []).flatMap(textTokens), ...textTokens(goal)]).slice(0, 14);
|
|
152
152
|
const impactDomains = cleanList(options.impactDomains)
|
|
153
153
|
.filter((domain): domain is ControllerContextImpactDomain => CONTROLLER_CONTEXT_IMPACT_DOMAINS.includes(domain as ControllerContextImpactDomain))
|
|
154
154
|
.slice(0, 6);
|
|
@@ -168,9 +168,6 @@ export function buildControllerContextPack(
|
|
|
168
168
|
]).slice(0, 32);
|
|
169
169
|
// Preserve the guarantee for explicit code symbols while broad natural-
|
|
170
170
|
// language terms remain eligible for early discovery completion.
|
|
171
|
-
const requiredSearchQueries = cleanList(options.searchTerms)
|
|
172
|
-
.filter(isCodeShapedTerm)
|
|
173
|
-
.slice(0, 2);
|
|
174
171
|
const impactCandidatePaths = new Map<ControllerContextImpactDomain, Set<string>>(impactDomains.map((domain) => [domain, new Set<string>()]));
|
|
175
172
|
const candidates = new Map<string, { reasons: Set<string>; lines: Set<number> }>();
|
|
176
173
|
const deniedPaths: Array<{ path: string; reason: string }> = [];
|
|
@@ -192,7 +189,7 @@ export function buildControllerContextPack(
|
|
|
192
189
|
const baselineRevisionMatches = indexSource === "current_checkout" || gitSnapshot(structuralIndexRoot).head === git.head;
|
|
193
190
|
const graphImpactFiles = new Set<string>();
|
|
194
191
|
let structuralContext: ControllerContextPackProjection["structuralContext"] = {
|
|
195
|
-
provider: "
|
|
192
|
+
provider: "none",
|
|
196
193
|
requestedMode: structuralMode,
|
|
197
194
|
status: "disabled",
|
|
198
195
|
requiredSatisfied: structuralMode !== "required",
|
|
@@ -204,17 +201,17 @@ export function buildControllerContextPack(
|
|
|
204
201
|
truncated: false,
|
|
205
202
|
};
|
|
206
203
|
const repositorySessionCache = getRepositoryReadSessionCache(repoRoot, options.session);
|
|
207
|
-
const
|
|
208
|
-
const queryStructural = (queryRoot: string, request: Parameters<typeof
|
|
204
|
+
const structuralProvider = dependencies.queryStructural ?? unavailableStructuralProvider;
|
|
205
|
+
const queryStructural = (queryRoot: string, request: Parameters<typeof unavailableStructuralProvider>[1]): StructuralReadProviderResponse => {
|
|
209
206
|
const key = JSON.stringify({ queryRoot, request });
|
|
210
207
|
const cached = repositorySessionCache?.getStructural(key);
|
|
211
208
|
if (cached && typeof cached === "object") {
|
|
212
209
|
structuralCacheHits += 1;
|
|
213
|
-
return cached as
|
|
210
|
+
return cached as StructuralReadProviderResponse;
|
|
214
211
|
}
|
|
215
212
|
structuralCacheMisses += 1;
|
|
216
|
-
const response =
|
|
217
|
-
if (response.error?.code !==
|
|
213
|
+
const response = structuralProvider(queryRoot, request);
|
|
214
|
+
if (response.error?.code !== STRUCTURAL_PREFETCH_DEFERRED_CODE) {
|
|
218
215
|
repositorySessionCache?.putStructural(key, response);
|
|
219
216
|
}
|
|
220
217
|
return response;
|
|
@@ -262,7 +259,7 @@ export function buildControllerContextPack(
|
|
|
262
259
|
? "stale"
|
|
263
260
|
: structural.status;
|
|
264
261
|
structuralContext = {
|
|
265
|
-
provider: "
|
|
262
|
+
provider: "none",
|
|
266
263
|
requestedMode: structuralMode,
|
|
267
264
|
status: structuralStatus,
|
|
268
265
|
requiredSatisfied: structuralMode !== "required" || structuralEvidenceCurrent,
|
|
@@ -304,12 +301,12 @@ export function buildControllerContextPack(
|
|
|
304
301
|
// must never steer which raw source GPT sees first.
|
|
305
302
|
if (structuralEvidenceCurrent) {
|
|
306
303
|
for (const node of graph.nodes.slice(0, maxFiles * 6)) {
|
|
307
|
-
addStructuralPath(node.filePath, `
|
|
304
|
+
addStructuralPath(node.filePath, `structural:context:${node.kind}:${node.name}`, node.startLine);
|
|
308
305
|
}
|
|
309
306
|
for (const node of graph.entryPoints) {
|
|
310
|
-
addStructuralPath(node.filePath, `
|
|
307
|
+
addStructuralPath(node.filePath, `structural:entry:${node.name}`, node.startLine);
|
|
311
308
|
}
|
|
312
|
-
for (const path of graph.relatedFiles.slice(0, maxFiles * 6)) addStructuralPath(path, "
|
|
309
|
+
for (const path of graph.relatedFiles.slice(0, maxFiles * 6)) addStructuralPath(path, "structural:related");
|
|
313
310
|
// Context search identifies the structural entry points. For a bounded
|
|
314
311
|
// number of those files, enrich the same Context Plane call with direct
|
|
315
312
|
// file dependencies/dependents. This is impact evidence, not a second
|
|
@@ -326,18 +323,18 @@ export function buildControllerContextPack(
|
|
|
326
323
|
: [];
|
|
327
324
|
for (const path of dependencies.slice(0, 40)) {
|
|
328
325
|
graphImpactFiles.add(path);
|
|
329
|
-
addStructuralPath(path, `
|
|
326
|
+
addStructuralPath(path, `structural:dependency:${filePath}`);
|
|
330
327
|
}
|
|
331
328
|
for (const path of dependents.slice(0, 40)) {
|
|
332
329
|
graphImpactFiles.add(path);
|
|
333
|
-
addStructuralPath(path, `
|
|
330
|
+
addStructuralPath(path, `structural:dependent:${filePath}`);
|
|
334
331
|
}
|
|
335
332
|
}
|
|
336
333
|
}
|
|
337
|
-
for (const path of metadata?.changedFiles.removed ?? []) omitted.push({ path, reason: "
|
|
334
|
+
for (const path of metadata?.changedFiles.removed ?? []) omitted.push({ path, reason: "structural provider reports file removed since index" });
|
|
338
335
|
// A repository-baseline graph deliberately runs against another checkout.
|
|
339
336
|
// Current worktree changes are still authoritative raw-source evidence,
|
|
340
|
-
// but they come from Git rather than stale
|
|
337
|
+
// but they come from Git rather than stale structural metadata.
|
|
341
338
|
if (indexSource === "repository_baseline") {
|
|
342
339
|
for (const path of gitStatusChangedPaths(git.status)) addStructuralPath(path, "worktree:changed-file", 1);
|
|
343
340
|
}
|
|
@@ -349,16 +346,17 @@ export function buildControllerContextPack(
|
|
|
349
346
|
let exactKnownFileScope = explicitKnownPaths.length > 0;
|
|
350
347
|
for (const path of explicitKnownPaths) {
|
|
351
348
|
const expanded = expandKnownPath(repoRoot, policy, path, Math.max(maxFiles * 4, 40));
|
|
352
|
-
|
|
349
|
+
const allowedFiles = expanded.files.filter((file) => !excludeGlobs.some((glob) => globMatches(glob, file)));
|
|
350
|
+
for (const file of allowedFiles) {
|
|
353
351
|
addReason(candidates, file, expanded.directory ? `explicit-known-directory:${expanded.directory}` : "explicit-known-path");
|
|
354
352
|
}
|
|
355
|
-
if (!expanded.directory &&
|
|
356
|
-
exactKnownFiles.push(
|
|
353
|
+
if (!expanded.directory && allowedFiles.length === 1 && expanded.denied.length === 0 && !expanded.truncated) {
|
|
354
|
+
exactKnownFiles.push(allowedFiles[0]!);
|
|
357
355
|
} else {
|
|
358
356
|
exactKnownFileScope = false;
|
|
359
357
|
}
|
|
360
358
|
deniedPaths.push(...expanded.denied);
|
|
361
|
-
scannedFiles +=
|
|
359
|
+
scannedFiles += allowedFiles.length;
|
|
362
360
|
searchTruncated = searchTruncated || expanded.truncated;
|
|
363
361
|
}
|
|
364
362
|
// Exact caller-selected files own a reserved file slot. The inferred-file
|
|
@@ -381,7 +379,7 @@ export function buildControllerContextPack(
|
|
|
381
379
|
// though inventory itself was cached.
|
|
382
380
|
const lexicalStartedAt = performance.now();
|
|
383
381
|
const requiredStructuralFallbackNeedsLexical = structuralMode === "required" && !structuralContext.requiredSatisfied;
|
|
384
|
-
if (searchQueries.length > 0 && (requiredStructuralFallbackNeedsLexical || candidates.size < maxFiles * 3)) {
|
|
382
|
+
if (searchQueries.length > 0 && (requiredSearchQueries.length > 0 || requiredStructuralFallbackNeedsLexical || candidates.size < maxFiles * 3)) {
|
|
385
383
|
const search = searchRepositoryMany(repoRoot, policy, {
|
|
386
384
|
queries: searchQueries,
|
|
387
385
|
files: scopedExactKnownFileSearch ? exactKnownFiles : undefined,
|
|
@@ -407,6 +405,14 @@ export function buildControllerContextPack(
|
|
|
407
405
|
searchTruncated = searchTruncated || search.truncated;
|
|
408
406
|
for (const hit of search.results) {
|
|
409
407
|
if (!coveredByGlob(hit.path, searchIncludeGlobs) || excludeGlobs.some((glob) => globMatches(glob, hit.path))) continue;
|
|
408
|
+
if (candidates.size >= maxFiles * 3 && !candidates.has(hit.path) && !requiredSearchQueries.includes(hit.query)) continue;
|
|
409
|
+
if (requiredSearchQueries.includes(hit.query)) {
|
|
410
|
+
const source = hit.text.trimStart();
|
|
411
|
+
const declared = /^(?:(?:export|declare|default|async)\s+)*(?:function|class|interface|type|const|let|enum)\s+([\w$]+)/.exec(source)?.[1];
|
|
412
|
+
if (declared?.toLowerCase() === hit.query.toLowerCase()) {
|
|
413
|
+
addReason(candidates, hit.path, `${source.startsWith('export ') ? 'exported' : 'local'}-definition:${hit.query}`, hit.line);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
410
416
|
if (terms.includes(hit.query)) {
|
|
411
417
|
addReason(candidates, hit.path, `search:${hit.query}`, hit.line);
|
|
412
418
|
} else {
|
|
@@ -417,12 +423,14 @@ export function buildControllerContextPack(
|
|
|
417
423
|
addReason(candidates, hit.path, `impact:${domain}:${hit.query}`, hit.line);
|
|
418
424
|
}
|
|
419
425
|
}
|
|
420
|
-
if (candidates.size >= maxFiles * 3) break;
|
|
421
426
|
}
|
|
422
427
|
}
|
|
423
428
|
|
|
424
429
|
timingsMs.lexical = Math.round((performance.now() - lexicalStartedAt) * 100) / 100;
|
|
425
430
|
const primarySearchReason = terms.length > 0 ? `search:${terms[0]}` : undefined;
|
|
431
|
+
const definitionPriority = (reasons: readonly string[]): number =>
|
|
432
|
+
reasons.some((reason) => reason.startsWith('exported-definition:')) ? 2
|
|
433
|
+
: reasons.some((reason) => reason.startsWith('local-definition:')) ? 1 : 0;
|
|
426
434
|
const rankedCandidates = Array.from(candidates.entries())
|
|
427
435
|
.map(([path, entry]) => ({ path, reasons: Array.from(entry.reasons), lines: Array.from(entry.lines) }))
|
|
428
436
|
.sort((left, right) => {
|
|
@@ -433,6 +441,8 @@ export function buildControllerContextPack(
|
|
|
433
441
|
? 2
|
|
434
442
|
: right.reasons.some((reason) => reason.startsWith("explicit-known-directory:")) ? 1 : 0;
|
|
435
443
|
if (leftExplicit !== rightExplicit) return rightExplicit - leftExplicit;
|
|
444
|
+
const definitionDelta = definitionPriority(right.reasons) - definitionPriority(left.reasons);
|
|
445
|
+
if (definitionDelta !== 0) return definitionDelta;
|
|
436
446
|
const leftPrimary = primarySearchReason && left.reasons.includes(primarySearchReason) ? 1 : 0;
|
|
437
447
|
const rightPrimary = primarySearchReason && right.reasons.includes(primarySearchReason) ? 1 : 0;
|
|
438
448
|
if (leftPrimary !== rightPrimary) return rightPrimary - leftPrimary;
|
|
@@ -451,15 +461,21 @@ export function buildControllerContextPack(
|
|
|
451
461
|
// implementation mode a permanent evidence-closure blind spot.
|
|
452
462
|
const multiWaveEligible = retrievalMode !== "implementation"
|
|
453
463
|
|| structuralMode !== "off"
|
|
454
|
-
|| impactDomains.length > 0
|
|
455
|
-
|| explicitKnownPaths.length > 1;
|
|
464
|
+
|| impactDomains.length > 0;
|
|
456
465
|
timingsMs.expansionBudgetMax = multiWaveEligible ? Math.min(6, Math.max(2, Math.ceil(maxFiles / 2))) : 0;
|
|
457
|
-
|
|
466
|
+
// Reserve one best file per explicit symbol before broad hits can consume
|
|
467
|
+
// the result window. Caller-selected exact paths retain first priority.
|
|
468
|
+
const prioritizedCandidates = Array.from(new Map([
|
|
469
|
+
...rankedCandidates.filter(isExactKnownCandidate),
|
|
470
|
+
...requiredSearchQueries.flatMap((query) => rankedCandidates.filter((entry) => entry.reasons.includes(`search:${query}`)).slice(0, 1)),
|
|
471
|
+
...rankedCandidates,
|
|
472
|
+
].map((entry) => [entry.path, entry] as const)).values());
|
|
473
|
+
const rankedExactKnownCount = prioritizedCandidates.filter(isExactKnownCandidate).length;
|
|
458
474
|
const initialCandidateLimit = multiWaveEligible
|
|
459
475
|
? Math.min(maxFiles, Math.max(rankedExactKnownCount, Math.max(1, maxFiles - timingsMs.expansionBudgetMax)))
|
|
460
476
|
: maxFiles;
|
|
461
|
-
const selected =
|
|
462
|
-
const deferredSelected =
|
|
477
|
+
const selected = prioritizedCandidates.slice(0, initialCandidateLimit);
|
|
478
|
+
const deferredSelected = prioritizedCandidates.slice(initialCandidateLimit, maxFiles);
|
|
463
479
|
const selectedExactKnownCount = selected.filter(isExactKnownCandidate).length;
|
|
464
480
|
// Reserve at least one materialization for every selected exact known file.
|
|
465
481
|
// This may raise a caller's inferred snippet budget, but never beyond the
|
|
@@ -478,7 +494,7 @@ export function buildControllerContextPack(
|
|
|
478
494
|
status: selectedFiles.length > 0 ? "selected" as const : matchedFiles.length > 0 ? "matched_not_selected" as const : "no_evidence" as const,
|
|
479
495
|
};
|
|
480
496
|
});
|
|
481
|
-
for (const entry of
|
|
497
|
+
for (const entry of prioritizedCandidates.slice(maxFiles)) omitted.push({ path: entry.path, reason: "max_files" });
|
|
482
498
|
|
|
483
499
|
let remainingSnippets = maxSnippets;
|
|
484
500
|
const files: ControllerContextPackFile[] = [];
|
|
@@ -499,9 +515,12 @@ export function buildControllerContextPack(
|
|
|
499
515
|
const waveOnePerFileCap = multiWaveEligible
|
|
500
516
|
? Math.max(1, Math.ceil(maxSnippets / Math.max(1, initialCandidateLimit + timingsMs.expansionBudgetMax)))
|
|
501
517
|
: remainingSnippets;
|
|
518
|
+
// A caller-increased max_snippets budget must not let the first broad
|
|
519
|
+
// candidate consume every snippet and erase other selected source files.
|
|
520
|
+
const inferredFairShare = Math.max(1, Math.ceil(remainingSnippets / (selected.length - selectedIndex)));
|
|
502
521
|
const fileSnippetBudget = exactKnown
|
|
503
522
|
? Math.max(1, remainingSnippets - exactKnownAfter)
|
|
504
|
-
: Math.min(remainingSnippets, waveOnePerFileCap);
|
|
523
|
+
: Math.min(remainingSnippets, waveOnePerFileCap, inferredFairShare);
|
|
505
524
|
let snippets: ControllerContextPackSnippet[] = [];
|
|
506
525
|
try {
|
|
507
526
|
snippets = materializeSource({
|
|
@@ -510,8 +529,11 @@ export function buildControllerContextPack(
|
|
|
510
529
|
path: entry.path,
|
|
511
530
|
hitLines: entry.lines.length > 0 ? entry.lines : [1],
|
|
512
531
|
reasons: entry.reasons,
|
|
513
|
-
|
|
514
|
-
|
|
532
|
+
// Discovery should cover multiple entry points rather than dump one huge file.
|
|
533
|
+
// Explicit known files retain their full evidence budget; only inferred
|
|
534
|
+
// candidates receive the cheap two-snippet discovery default.
|
|
535
|
+
maxSnippets: Math.min(options.maxSnippets === undefined && !exactKnown ? 2 : fileSnippetBudget, remainingSnippets),
|
|
536
|
+
maxCharsPerSnippet: exactKnown && options.maxCharsPerSnippet === undefined ? 8000 : maxCharsPerSnippet,
|
|
515
537
|
session: options.session,
|
|
516
538
|
});
|
|
517
539
|
for (const snippet of snippets) {
|
|
@@ -535,7 +557,7 @@ export function buildControllerContextPack(
|
|
|
535
557
|
|
|
536
558
|
// Evidence-closure eligible requests perform bounded internal waves after
|
|
537
559
|
// Wave 1 raw source materialization. Each later wave derives concrete paths
|
|
538
|
-
// from the source that was just read plus current
|
|
560
|
+
// from the source that was just read plus current structural adjacency, then
|
|
539
561
|
// materializes those paths in the same context request.
|
|
540
562
|
const materializedPathSet = new Set(files.map((file) => file.path));
|
|
541
563
|
let frontier = files.slice();
|
|
@@ -573,11 +595,11 @@ export function buildControllerContextPack(
|
|
|
573
595
|
: [];
|
|
574
596
|
for (const path of dependencies.slice(0, 40)) {
|
|
575
597
|
graphImpactFiles.add(path);
|
|
576
|
-
addExpansionCandidate(path, `
|
|
598
|
+
addExpansionCandidate(path, `structural:dependency:${file.path}`);
|
|
577
599
|
}
|
|
578
600
|
for (const path of dependents.slice(0, 40)) {
|
|
579
601
|
graphImpactFiles.add(path);
|
|
580
|
-
addExpansionCandidate(path, `
|
|
602
|
+
addExpansionCandidate(path, `structural:dependent:${file.path}`);
|
|
581
603
|
}
|
|
582
604
|
}
|
|
583
605
|
|
|
@@ -753,7 +775,7 @@ export function buildControllerContextPack(
|
|
|
753
775
|
architectureContracts,
|
|
754
776
|
coverageGaps: Array.from(new Set(coverageGaps)).slice(0, 40),
|
|
755
777
|
relationSources: [
|
|
756
|
-
...(structuralMode !== "off" ? ["
|
|
778
|
+
...(structuralMode !== "off" ? ["structural" as const] : []),
|
|
757
779
|
...(files.length > 0 ? ["lexical" as const] : []),
|
|
758
780
|
...(taskChecks.length > 0 ? ["forge_checks" as const] : []),
|
|
759
781
|
],
|
|
@@ -812,16 +834,19 @@ export function buildControllerContextPack(
|
|
|
812
834
|
.map((file) => file.path);
|
|
813
835
|
const materializedExactKnownSet = new Set(materializedExactKnownPaths);
|
|
814
836
|
const omittedCandidateCount = rankedCandidates.filter((entry) => !inspectedSet.has(entry.path)).length;
|
|
815
|
-
const
|
|
837
|
+
const exactKnownFilesLosslesslyMaterialized = scopedExactKnownFileSearch
|
|
816
838
|
&& exactKnownFiles.length > 0
|
|
817
839
|
&& exactKnownFiles.every((path) => files.some((file) => file.path === path
|
|
818
|
-
&& file.snippets.
|
|
840
|
+
&& file.snippets.length > 0
|
|
841
|
+
&& file.snippets.every((snippet) => !snippet.truncated)));
|
|
819
842
|
// `search.truncated` records that lexical hit collection reached a result cap.
|
|
820
843
|
// That is not automatically an evidence gap. For an exact-known implementation
|
|
821
|
-
// scope,
|
|
822
|
-
//
|
|
844
|
+
// scope, bounded symbol/window materialization is still authoritative raw-source
|
|
845
|
+
// evidence as long as every requested file was materialized without snippet loss
|
|
846
|
+
// and no candidate was omitted or denied. Actual raw snippet truncation remains a
|
|
847
|
+
// separate readiness failure through `rawSnippetTruncated`.
|
|
823
848
|
const evidenceSearchTruncated = searchTruncated
|
|
824
|
-
&& !(
|
|
849
|
+
&& !(exactKnownFilesLosslesslyMaterialized
|
|
825
850
|
&& omittedCandidateCount === 0
|
|
826
851
|
&& policyDeniedFiles === 0
|
|
827
852
|
&& deniedPaths.length === 0
|
|
@@ -983,7 +1008,7 @@ export function buildControllerContextPack(
|
|
|
983
1008
|
retrievalMode === "implementation"
|
|
984
1009
|
? "The pack contains policy-approved current raw source with file SHA identities, but returned snippets are bounded evidence rather than proof of semantic completeness. After reading this evidence, derive new exact paths, symbols, tests, or relationships from the source itself. A guessed lexical term with no result is not by itself a reason to keep scanning or repeat the same broad query."
|
|
985
1010
|
: `Investigation mode performed ${timingsMs.waveCount} bounded evidence wave(s) inside this request; expansion budget ${timingsMs.expansionBudgetUsed}/${timingsMs.expansionBudgetMax}.`,
|
|
986
|
-
"Search/
|
|
1011
|
+
"Search/structural ranking is discovery evidence, not a business-semantics authority. readiness and impactContext make the bounded evidence surface and unresolved gaps explicit; ChatGPT still decides semantic sufficiency.",
|
|
987
1012
|
instructionContext.contracts.length > 0
|
|
988
1013
|
? `Applicable repository guidance was resolved hierarchically for selected source paths: ${instructionContext.contracts.map((entry) => entry.path).join(", ")}. These AGENTS.md/CLAUDE.md files are guidance-only evidence and do not define semantic scope.`
|
|
989
1014
|
: "No applicable AGENTS.md/CLAUDE.md guidance file was found for the selected source paths.",
|
|
@@ -991,15 +1016,15 @@ export function buildControllerContextPack(
|
|
|
991
1016
|
governanceContext.status === 'none'
|
|
992
1017
|
? "No repository governance rule registry is present; existing guidance and explicit Task checks behave as before."
|
|
993
1018
|
: `Repository governance resolved ${governanceContext.activeRules.length} active rule(s), ${governanceContext.suppressedRules.length} suppressed rule(s), and ${governanceContext.recommendedCheckIds.length} recommended check(s) through bounded local matching. Recommendations are evidence only and never execute checks or create Work by themselves.`,
|
|
994
|
-
"
|
|
995
|
-
structuralContext.status === "stale" ? "
|
|
1019
|
+
"Structural evidence is discovery evidence. Raw source access still passes through Forge repository policy and current-file reads.",
|
|
1020
|
+
structuralContext.status === "stale" ? "Structural provider reports stale evidence. Treat relationships as hints and prefer the returned current raw source for changed files." : structuralContext.status === "unavailable" || structuralContext.status === "degraded" ? "Structural context was unavailable or degraded; bounded text search remains the fallback." : structuralContext.status === "ready" ? "Structural context was queried read-only." : "Structural context was not requested.",
|
|
996
1021
|
"Run focused validation after a coherent edit batch; expensive full-suite checks belong at candidate/release boundaries unless debugging specifically needs them earlier.",
|
|
997
1022
|
taskChecks.length > 0 ? `Task checks advertised by the board: ${taskChecks.join(", ")}.` : "No task-specific checks were found in the compact ledger.",
|
|
998
1023
|
],
|
|
999
1024
|
},
|
|
1000
1025
|
next: [
|
|
1001
1026
|
...(structuralMode === "required" && !structuralContext.requiredSatisfied
|
|
1002
|
-
? ["Structural context was required but is not current/ready.
|
|
1027
|
+
? ["Structural context was required but is not current/ready. Continue only with the degraded-plan warning visible or use current raw source / semantic navigation instead."]
|
|
1003
1028
|
: []),
|
|
1004
1029
|
files.length > 0
|
|
1005
1030
|
? retrievalMode === "implementation"
|
|
@@ -1014,26 +1039,26 @@ export function buildControllerContextPack(
|
|
|
1014
1039
|
|
|
1015
1040
|
/**
|
|
1016
1041
|
* Broad first-call fan-in for the canonical rh_context path. Lexical retrieval
|
|
1017
|
-
* remains required evidence. Auto
|
|
1042
|
+
* remains required evidence. Auto structural retrieval is opportunistic enrichment: it may
|
|
1018
1043
|
* finish inside the first-call latency budget, otherwise the request returns
|
|
1019
1044
|
* bounded lexical/raw evidence while the same source-bound structural request
|
|
1020
1045
|
* continues warming the session cache. Required structural mode still waits.
|
|
1021
1046
|
*/
|
|
1022
1047
|
export const AUTO_STRUCTURAL_PREFETCH_BUDGET_MS = 100;
|
|
1023
1048
|
export const AUTO_STRUCTURAL_PREFETCH_TIMEOUT_MS = 1_000;
|
|
1024
|
-
const
|
|
1025
|
-
const structuralPrefetchInflight = new Map<string, Promise<
|
|
1049
|
+
const STRUCTURAL_PREFETCH_DEFERRED_CODE = 'STRUCTURAL_PREFETCH_DEFERRED';
|
|
1050
|
+
const structuralPrefetchInflight = new Map<string, Promise<StructuralReadProviderResponse>>();
|
|
1026
1051
|
|
|
1027
|
-
function
|
|
1052
|
+
function structuralPrefetchDeferredResponse(elapsedMs: number): StructuralReadProviderResponse {
|
|
1028
1053
|
return {
|
|
1029
1054
|
schemaVersion: 1,
|
|
1030
|
-
provider: '
|
|
1055
|
+
provider: 'none',
|
|
1031
1056
|
operation: 'context',
|
|
1032
1057
|
ok: false,
|
|
1033
1058
|
status: 'degraded',
|
|
1034
1059
|
error: {
|
|
1035
|
-
code:
|
|
1036
|
-
message: `Optional
|
|
1060
|
+
code: STRUCTURAL_PREFETCH_DEFERRED_CODE,
|
|
1061
|
+
message: `Optional structural enrichment exceeded the ${AUTO_STRUCTURAL_PREFETCH_BUDGET_MS}ms first-call budget and continues warming the source-bound session cache.`,
|
|
1037
1062
|
},
|
|
1038
1063
|
timingsMs: { total: Math.round(elapsedMs * 100) / 100 },
|
|
1039
1064
|
};
|
|
@@ -1059,10 +1084,10 @@ function cacheDeferredStructuralResult(
|
|
|
1059
1084
|
sessionCache: ReturnType<typeof getRepositoryReadSessionCache>,
|
|
1060
1085
|
structuralCacheKey: string,
|
|
1061
1086
|
sourceIdentity: string | undefined,
|
|
1062
|
-
response:
|
|
1087
|
+
response: StructuralReadProviderResponse,
|
|
1063
1088
|
): void {
|
|
1064
1089
|
if (!sessionCache || !sourceIdentity) return;
|
|
1065
|
-
if (response.error?.code === '
|
|
1090
|
+
if (response.error?.code === 'STRUCTURAL_TIMEOUT' || response.error?.code === STRUCTURAL_PREFETCH_DEFERRED_CODE) return;
|
|
1066
1091
|
if (JSON.stringify(sessionCache.currentIdentity()) !== sourceIdentity) return;
|
|
1067
1092
|
sessionCache.putStructural(structuralCacheKey, response);
|
|
1068
1093
|
}
|
|
@@ -1074,7 +1099,7 @@ export async function buildControllerContextPackAsync(
|
|
|
1074
1099
|
dependencies: ControllerContextPackDependencies = {},
|
|
1075
1100
|
): Promise<ControllerContextPackProjection> {
|
|
1076
1101
|
const structuralMode = options.structuralContext ?? 'off';
|
|
1077
|
-
if ((dependencies.
|
|
1102
|
+
if ((dependencies.queryStructural && !dependencies.queryStructuralAsync) || !options.session || options.issueId || options.taskId) {
|
|
1078
1103
|
return buildControllerContextPack(repoRoot, policy, options, dependencies);
|
|
1079
1104
|
}
|
|
1080
1105
|
const prefetchStartedAt = performance.now();
|
|
@@ -1085,7 +1110,8 @@ export async function buildControllerContextPackAsync(
|
|
|
1085
1110
|
const explicitKnownPaths = knownPaths.filter((path) => !looksLikeGlob(path));
|
|
1086
1111
|
const includeGlobs = cleanList([...(options.includeGlobs ?? []), ...knownGlobs]);
|
|
1087
1112
|
const excludeGlobs = cleanList([...DEFAULT_SEARCH_EXCLUDE_GLOBS, ...(options.excludeGlobs ?? [])]);
|
|
1088
|
-
const
|
|
1113
|
+
const requiredSearchQueries = explicitCodeQueries(options.searchTerms);
|
|
1114
|
+
const terms = cleanList([...requiredSearchQueries, ...(options.searchTerms ?? []), ...(options.searchTerms ?? []).flatMap(textTokens), ...textTokens(options.description ?? '')]).slice(0, 14);
|
|
1089
1115
|
const impactDomains = cleanList(options.impactDomains)
|
|
1090
1116
|
.filter((domain): domain is ControllerContextImpactDomain => CONTROLLER_CONTEXT_IMPACT_DOMAINS.includes(domain as ControllerContextImpactDomain))
|
|
1091
1117
|
.slice(0, 6);
|
|
@@ -1093,8 +1119,9 @@ export async function buildControllerContextPackAsync(
|
|
|
1093
1119
|
let exactKnownFileScope = explicitKnownPaths.length > 0;
|
|
1094
1120
|
for (const path of explicitKnownPaths) {
|
|
1095
1121
|
const expanded = expandKnownPath(repoRoot, policy, path, Math.max(requestedMaxFiles * 4, 40));
|
|
1096
|
-
|
|
1097
|
-
|
|
1122
|
+
const allowedFiles = expanded.files.filter((file) => !excludeGlobs.some((glob) => globMatches(glob, file)));
|
|
1123
|
+
if (!expanded.directory && allowedFiles.length === 1 && expanded.denied.length === 0 && !expanded.truncated) {
|
|
1124
|
+
exactKnownFiles.push(allowedFiles[0]!);
|
|
1098
1125
|
} else {
|
|
1099
1126
|
exactKnownFileScope = false;
|
|
1100
1127
|
}
|
|
@@ -1110,9 +1137,6 @@ export async function buildControllerContextPackAsync(
|
|
|
1110
1137
|
...impactDomains.flatMap((domain) => IMPACT_DOMAIN_TERMS[domain]),
|
|
1111
1138
|
...terms.slice(1),
|
|
1112
1139
|
]).slice(0, 32);
|
|
1113
|
-
const requiredSearchQueries = cleanList(options.searchTerms)
|
|
1114
|
-
.filter(isCodeShapedTerm)
|
|
1115
|
-
.slice(0, 2);
|
|
1116
1140
|
const structuralQuery = structuralMode === 'off'
|
|
1117
1141
|
? ''
|
|
1118
1142
|
: structuralIntentQuery(options.description ?? '', terms, impactDomains);
|
|
@@ -1129,7 +1153,7 @@ export async function buildControllerContextPackAsync(
|
|
|
1129
1153
|
const sessionCache = getRepositoryReadSessionCache(repoRoot, options.session);
|
|
1130
1154
|
const structuralSourceIdentity = sessionCache ? JSON.stringify(sessionCache.currentIdentity()) : undefined;
|
|
1131
1155
|
const cachedStructural = structuralQuery
|
|
1132
|
-
? sessionCache?.peekStructural(structuralCacheKey) as
|
|
1156
|
+
? sessionCache?.peekStructural(structuralCacheKey) as StructuralReadProviderResponse | undefined
|
|
1133
1157
|
: undefined;
|
|
1134
1158
|
const lexicalOptions = searchQueries.length > 0
|
|
1135
1159
|
? (() => {
|
|
@@ -1166,18 +1190,18 @@ export async function buildControllerContextPackAsync(
|
|
|
1166
1190
|
return pack;
|
|
1167
1191
|
}
|
|
1168
1192
|
|
|
1169
|
-
const noStructuralResponse:
|
|
1193
|
+
const noStructuralResponse: StructuralReadProviderResponse = {
|
|
1170
1194
|
schemaVersion: 1,
|
|
1171
|
-
provider: '
|
|
1195
|
+
provider: 'none',
|
|
1172
1196
|
operation: 'context',
|
|
1173
1197
|
ok: false,
|
|
1174
1198
|
status: 'degraded',
|
|
1175
|
-
error: { code: '
|
|
1199
|
+
error: { code: 'STRUCTURAL_QUERY_REQUIRED', message: 'No context query was provided.' },
|
|
1176
1200
|
timingsMs: { total: 0 },
|
|
1177
1201
|
};
|
|
1178
1202
|
let structuralSettled = Boolean(cachedStructural) || !structuralQuery;
|
|
1179
|
-
let structuralSettledValue:
|
|
1180
|
-
const
|
|
1203
|
+
let structuralSettledValue: StructuralReadProviderResponse | undefined = cachedStructural || (!structuralQuery ? noStructuralResponse : undefined);
|
|
1204
|
+
const queryStructuralAsync = dependencies.queryStructuralAsync ?? unavailableStructuralProviderAsync;
|
|
1181
1205
|
const structuralInflightKey = structuralQuery && structuralSourceIdentity
|
|
1182
1206
|
? JSON.stringify({ structuralCacheKey, sourceIdentity: structuralSourceIdentity, structuralMode })
|
|
1183
1207
|
: undefined;
|
|
@@ -1186,10 +1210,9 @@ export async function buildControllerContextPackAsync(
|
|
|
1186
1210
|
const launchedStructuralPromise = cachedStructural
|
|
1187
1211
|
? Promise.resolve(cachedStructural)
|
|
1188
1212
|
: structuralQuery
|
|
1189
|
-
? existingStructuralInflight ??
|
|
1213
|
+
? existingStructuralInflight ?? queryStructuralAsync(
|
|
1190
1214
|
structuralIndexRoot,
|
|
1191
1215
|
structuralRequest,
|
|
1192
|
-
structuralMode === 'auto' ? { timeoutMs: AUTO_STRUCTURAL_PREFETCH_TIMEOUT_MS } : {},
|
|
1193
1216
|
)
|
|
1194
1217
|
: Promise.resolve(noStructuralResponse);
|
|
1195
1218
|
if (structuralInflightKey && structuralQuery && !cachedStructural && !existingStructuralInflight) {
|
|
@@ -1240,16 +1263,16 @@ export async function buildControllerContextPackAsync(
|
|
|
1240
1263
|
prefetched = outcome.value;
|
|
1241
1264
|
} else {
|
|
1242
1265
|
structuralPrefetchDeferred = true;
|
|
1243
|
-
prefetched =
|
|
1266
|
+
prefetched = structuralPrefetchDeferredResponse(performance.now() - prefetchStartedAt);
|
|
1244
1267
|
}
|
|
1245
1268
|
}
|
|
1246
1269
|
}
|
|
1247
1270
|
|
|
1248
|
-
const
|
|
1271
|
+
const fallbackQueryStructural = dependencies.queryStructural ?? unavailableStructuralProvider;
|
|
1249
1272
|
const pack = buildControllerContextPack(repoRoot, policy, options, {
|
|
1250
|
-
|
|
1273
|
+
queryStructural: (queryRoot, request) => request.operation === 'context' && queryRoot === structuralIndexRoot
|
|
1251
1274
|
? prefetched
|
|
1252
|
-
:
|
|
1275
|
+
: fallbackQueryStructural(queryRoot, request),
|
|
1253
1276
|
});
|
|
1254
1277
|
pack.timingsMs.parallelFirstPass = true;
|
|
1255
1278
|
pack.timingsMs.parallelPrefetch = Math.round((performance.now() - prefetchStartedAt) * 100) / 100;
|
|
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from 'fs';
|
|
|
3
3
|
import { join } from 'path';
|
|
4
4
|
import type { AgentJobMeta } from '../agent-jobs/types';
|
|
5
5
|
import { runControllerCheck } from './check-runner';
|
|
6
|
-
import { cleanupEvidenceResourceBlockers, completionEvidenceComplete
|
|
6
|
+
import { cleanupEvidenceResourceBlockers, completionEvidenceComplete } from './execution-policy';
|
|
7
7
|
import { acceptVerifiedTask, getIssue, recordTaskVerification, updateTask } from './issue-store';
|
|
8
8
|
import type { CompletionReceipt, CompletionReceiptSource, TaskCommandEvidence, TaskVerification } from './types';
|
|
9
9
|
import { legacyIssueAuthorityRetired } from './legacy-issue-cutover';
|
|
@@ -92,9 +92,7 @@ export function continueTaskAfterSuccessfulRun(
|
|
|
92
92
|
if (['done', 'cancelled', 'superseded'].includes(task.status)) {
|
|
93
93
|
return { continued: false, status: task.status, reason: 'Task is already terminal.' };
|
|
94
94
|
}
|
|
95
|
-
const
|
|
96
|
-
const checkResults = policy.autoRunDeclaredChecks
|
|
97
|
-
? task.checks.map((checkId) => {
|
|
95
|
+
const checkResults = task.checks.map((checkId) => {
|
|
98
96
|
try {
|
|
99
97
|
const result = runControllerCheck(repoRoot, checkId);
|
|
100
98
|
return {
|
|
@@ -105,8 +103,7 @@ export function continueTaskAfterSuccessfulRun(
|
|
|
105
103
|
} catch (error) {
|
|
106
104
|
return { checkId, ok: false, summary: error instanceof Error ? error.message : String(error) };
|
|
107
105
|
}
|
|
108
|
-
})
|
|
109
|
-
: [];
|
|
106
|
+
});
|
|
110
107
|
|
|
111
108
|
const commandEvidence: TaskCommandEvidence[] = [{
|
|
112
109
|
command: ['forge', 'agent-run', run.runId],
|
|
@@ -148,7 +145,7 @@ export function continueTaskAfterSuccessfulRun(
|
|
|
148
145
|
});
|
|
149
146
|
return { continued: true, status, checkCount: checkResults.length };
|
|
150
147
|
}
|
|
151
|
-
if (status === 'verified' &&
|
|
148
|
+
if (status === 'verified' && task.acceptanceCriteria.length === 0) {
|
|
152
149
|
const closureComplete = run.closureState === 'completed' && completionEvidenceComplete(verification, {
|
|
153
150
|
issueId: run.issueId,
|
|
154
151
|
taskId: run.taskId,
|