@moretea-labs/forge 1.7.1 → 1.8.0
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 +58 -62
- package/CHANGELOG.md +39 -0
- package/CLAUDE.md +42 -62
- package/README.md +2 -2
- package/SKILL.md +0 -1
- package/THIRD_PARTY_NOTICES.md +5 -2
- package/adapters/browser/index.ts +2 -0
- package/adapters/chatgpt/browser-delivery-host.ts +71 -0
- package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
- package/adapters/chatgpt/controller-binding-store.ts +55 -0
- package/adapters/chatgpt/controller-host.ts +119 -0
- package/adapters/chatgpt/controller-round-host.ts +78 -0
- package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
- package/adapters/chatgpt/provider-delivery.ts +113 -0
- package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
- package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
- package/adapters/computer/desktop-operator-contract.ts +7 -0
- package/adapters/computer/desktop-operator-discovery.ts +201 -0
- package/adapters/computer/desktop-operator-negotiation.ts +174 -0
- package/adapters/computer/desktop-operator-provider.ts +312 -0
- package/adapters/computer/index.ts +1 -0
- package/adapters/computer/interaction-target-authority.ts +944 -0
- package/adapters/controller-process/binding-store.ts +34 -0
- package/adapters/controller-process/controller-host.ts +26 -0
- package/adapters/mcp/access-mode.ts +132 -0
- package/adapters/mcp/audit.ts +32 -0
- package/adapters/mcp/auth.ts +407 -0
- package/adapters/mcp/controller-round-compatibility.ts +184 -0
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
- package/adapters/mcp/instructions.ts +36 -0
- package/adapters/mcp/legacy-context.ts +18 -0
- package/adapters/mcp/multi-repository.ts +437 -0
- package/adapters/mcp/oauth.ts +391 -0
- package/adapters/mcp/paths.ts +140 -0
- package/adapters/mcp/policy.ts +232 -0
- package/adapters/mcp/proxy-env.ts +62 -0
- package/adapters/mcp/readiness-projection.ts +24 -0
- package/adapters/mcp/redaction.ts +21 -0
- package/adapters/mcp/repo.ts +24 -0
- package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
- package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
- package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
- package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
- package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
- package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
- package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
- package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
- package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
- package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
- package/adapters/mcp/runtime-gateway/router.ts +728 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
- package/adapters/mcp/server.ts +1048 -0
- package/adapters/mcp/setup.ts +791 -0
- package/adapters/mcp/tool-capability-cache.ts +87 -0
- package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
- package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
- package/adapters/mcp/tool-mapping/tools.ts +9 -0
- package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
- package/adapters/mcp/toolset-names.ts +74 -0
- package/adapters/mcp/toolset-selection.ts +41 -0
- package/adapters/mcp/toolset.ts +336 -0
- package/adapters/mcp/transports/http.ts +1456 -0
- package/adapters/mcp/transports/session-registry.ts +513 -0
- package/adapters/mcp/transports/stdio.ts +8 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
- package/adapters/mcp/types.ts +41 -0
- package/assets/AGENTS.md +2 -16
- package/assets/CLAUDE.md +2 -16
- package/assets/hooks/AGENTS.md +3 -14
- package/assets/hooks/CLAUDE.md +3 -14
- package/assets/hooks/hook-input.sh +9 -2
- package/assets/hooks/lib/workflow-state.sh +28 -10
- package/assets/hooks/prompt-guard.sh +63 -37
- package/assets/hooks/security-sentinel.sh +2 -1
- package/assets/hooks/session-start-context.sh +7 -5
- package/assets/hooks/stop-orchestrator.sh +13 -3
- package/assets/initializer-question-pack.v4.json +11 -7
- package/assets/partials/05-workflow.partial.md +18 -73
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -2
- package/assets/partials-agents/04-task-protocol.partial.md +14 -59
- package/assets/partials-agents/06-quality-safety.partial.md +11 -16
- package/assets/partials-agents/08-deep-docs.partial.md +1 -2
- package/assets/plan-map.json +11 -11
- package/assets/plugin-registry.v1.json +9 -3
- package/assets/plugin-trust-policy.v1.json +6 -0
- package/assets/recovery/ForgeRecovery.ps1 +100 -0
- package/assets/recovery/forge-wsl-rescue +271 -0
- package/assets/reference-configs/development-protocol.md +11 -15
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/global-working-rules.md +9 -1
- package/assets/reference-configs/harness-overview.md +22 -112
- package/assets/reference-configs/hook-operations.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +2 -2
- package/assets/skill-version.json +2 -2
- package/assets/templates/helpers/architecture-event.ts +3 -34
- package/assets/templates/helpers/architecture-queue.sh +61 -10
- package/assets/templates/helpers/archive-workflow.sh +90 -180
- package/assets/templates/helpers/capability-config.ts +8 -11
- package/assets/templates/helpers/capability-resolver.ts +37 -19
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-architecture-sync.sh +1 -9
- package/assets/templates/helpers/check-task-sync.sh +82 -11
- package/assets/templates/helpers/check-task-workflow.sh +1 -3
- package/assets/templates/helpers/context-contract-sync.sh +1 -12
- package/assets/templates/helpers/contract-worktree.sh +26 -24
- package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
- package/assets/templates/helpers/inspect-project-state.ts +1 -1
- package/assets/templates/helpers/migrate-project-template.sh +1 -1
- package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
- package/assets/templates/helpers/new-plan.sh +2 -2
- package/assets/templates/helpers/plan-to-todo.sh +3 -31
- package/assets/templates/helpers/sprint-backlog.sh +1 -1
- package/assets/templates/helpers/switch-plan.sh +1 -1
- package/assets/templates/helpers/workflow-contract.ts +1 -0
- package/assets/workflow-contract.v1.json +63 -171
- package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
- package/docs/architecture/CURRENT.md +148 -13
- package/docs/architecture/EVOLUTION.md +13 -0
- package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
- package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
- package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
- package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
- package/docs/architecture/domains/verification.md +7 -0
- package/docs/architecture/domains/workflow-engine.md +1 -1
- package/docs/architecture/index.md +3 -3
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
- package/docs/forge-chatgpt-mcp-setup.md +5 -3
- package/docs/forge-plugin-management.md +20 -4
- package/docs/forge-runtime-self-healing-loop.md +2 -0
- package/docs/operations/benchmark-cross-version-freeze.md +38 -0
- package/docs/operations/controller-browser-plugin.md +3 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/platform-support.md +16 -8
- package/docs/operations/platform-support.zh-CN.md +2 -2
- package/docs/operations/standalone-disaster-recovery.md +26 -1
- package/docs/operations/uu-remote-rescue.md +41 -0
- package/docs/operations/windows-wsl-host-rescue.md +133 -0
- package/docs/public-usage-guide.md +1 -1
- package/docs/public-usage-guide.zh-CN.md +1 -1
- package/docs/tutorials/01-install-and-start.md +1 -1
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/02-connect-chatgpt.md +4 -4
- package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +23 -14
- package/packages/kernel/controller/api/index.ts +2 -0
- package/packages/kernel/controller/application/controller-round-service.ts +29 -0
- package/packages/kernel/controller/application/controller-service.ts +30 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
- package/packages/kernel/controller/domain/controller-round.ts +107 -0
- package/packages/kernel/controller/domain/execution-quality.ts +133 -0
- package/packages/kernel/controller/domain/types.ts +56 -0
- package/packages/kernel/controller/index.ts +1 -0
- package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
- package/packages/kernel/controller/ports/controller-host.ts +16 -0
- package/packages/kernel/goal/api/index.ts +1 -0
- package/packages/kernel/goal/domain/types.ts +40 -0
- package/packages/kernel/goal/index.ts +1 -0
- package/packages/kernel/identity/api/index.ts +5 -0
- package/packages/kernel/identity/application/identity-service.ts +67 -0
- package/packages/kernel/identity/domain/scope.ts +63 -0
- package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
- package/packages/kernel/identity/domain/types.ts +44 -0
- package/packages/kernel/identity/domain/workspace.ts +56 -0
- package/packages/kernel/identity/index.ts +1 -0
- package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
- package/packages/kernel/memory/api/index.ts +5 -0
- package/packages/kernel/memory/application/experience-service.ts +118 -0
- package/packages/kernel/memory/application/outcome-service.ts +77 -0
- package/packages/kernel/memory/domain/experience.ts +103 -0
- package/packages/kernel/memory/domain/operational-prior.ts +92 -0
- package/packages/kernel/memory/index.ts +1 -0
- package/packages/kernel/progression/api/index.ts +2 -0
- package/packages/kernel/progression/application/projector.ts +211 -0
- package/packages/kernel/progression/domain/types.ts +116 -0
- package/packages/kernel/progression/index.ts +1 -0
- package/packages/kernel/scheduler/api/index.ts +6 -0
- package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
- package/packages/kernel/scheduler/application/eligibility.ts +252 -0
- package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
- package/packages/kernel/scheduler/application/settlement.ts +197 -0
- package/packages/kernel/scheduler/domain/continuation.ts +38 -0
- package/packages/kernel/scheduler/domain/schedule.ts +149 -0
- package/packages/kernel/scheduler/index.ts +1 -0
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
- package/packages/kernel/work/api/index.ts +15 -0
- package/packages/kernel/work/application/work-service.ts +148 -0
- package/packages/kernel/work/domain/admission-policy.ts +34 -0
- package/packages/kernel/work/domain/check-receipt.ts +43 -0
- package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
- package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
- package/packages/kernel/work/domain/engineering-design.ts +281 -0
- package/packages/kernel/work/domain/engineering-profile.ts +242 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
- package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
- package/packages/kernel/work/domain/implementation-review.ts +510 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
- package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
- package/packages/kernel/work/domain/state-machine.ts +259 -0
- package/packages/kernel/work/domain/types.ts +528 -0
- package/packages/kernel/work/index.ts +1 -0
- package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
- package/packages/kernel/work/ports/work-contract-store.ts +18 -0
- package/packages/plugin-runtime/browser/index.ts +3 -0
- package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
- package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
- package/packages/plugin-runtime/browser/session-authority.ts +61 -0
- package/packages/plugin-runtime/computer/index.ts +6 -0
- package/packages/plugin-runtime/computer/provider-error.ts +26 -0
- package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
- package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
- package/packages/plugin-runtime/computer/provider.ts +19 -0
- package/packages/plugin-runtime/computer/target-authority.ts +190 -0
- package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
- package/packages/plugin-runtime/external/index.ts +1 -0
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
- package/packages/plugin-runtime/index.ts +3 -0
- package/packages/protocols/browser/index.ts +1 -0
- package/packages/protocols/browser/session.ts +98 -0
- package/packages/protocols/computer/contract.ts +199 -0
- package/packages/protocols/computer/index.ts +1 -0
- package/packages/protocols/failure/contract.ts +158 -0
- package/packages/protocols/failure/index.ts +1 -0
- package/packages/protocols/handoff/index.ts +1 -0
- package/packages/protocols/handoff/status.ts +22 -0
- package/packages/protocols/mcp/execution-context.ts +11 -0
- package/packages/protocols/mcp/index.ts +2 -0
- package/packages/protocols/mcp/tool-contract.ts +42 -0
- package/packages/workflow-runtime/api/index.ts +2 -0
- package/packages/workflow-runtime/application/interpreter.ts +342 -0
- package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
- package/packages/workflow-runtime/index.ts +1 -0
- package/scripts/assemble-template.ts +1 -1
- package/scripts/benchmark-computer-hotpath.ts +255 -0
- package/scripts/benchmark-controller-round2.ts +54 -2
- package/scripts/benchmark-ios-agent-device.ts +3 -6
- package/scripts/benchmark-mcp-transport.ts +3 -4
- package/scripts/benchmark-operational-memory-activation.ts +235 -0
- package/scripts/benchmark-operational-shadow.ts +28 -0
- package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
- package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
- package/scripts/canary-controller-semantic-wait.ts +195 -0
- package/scripts/canary-global-hook.sh +2 -2
- package/scripts/check-mcp-compatibility.ts +173 -7
- package/scripts/check-platform-support.mjs +28 -2
- package/scripts/check-public-docs.sh +1 -1
- package/scripts/check-release-readiness.sh +1 -1
- package/scripts/check-repository-hygiene.mjs +92 -0
- package/scripts/check-runtime-architecture.mjs +1206 -95
- package/scripts/check-source-duplication.mjs +9 -1
- package/scripts/check-tarball-install-smoke.sh +98 -15
- package/scripts/controller-ngrok-rotation.sh +5 -4
- package/scripts/create-project-dirs.sh +10 -74
- package/scripts/forge-local-recovery-helper.mjs +204 -0
- package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
- package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
- package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
- package/scripts/hook-shim.sh +2 -2
- package/scripts/init-project.sh +12 -70
- package/scripts/install-desktop-operator-registration.ts +4 -2
- package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
- package/scripts/install-standalone-recovery.ts +122 -10
- package/scripts/install-uu-remote-rescue-registration.ts +74 -0
- package/scripts/install-windows-host-recovery-registration.ts +22 -0
- package/scripts/lib/controller-home-env.sh +6 -3
- package/scripts/lib/project-init-lib.sh +39 -582
- package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
- package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
- package/scripts/open-source-audit-allowlist.txt +12 -1
- package/scripts/portability-bindings.mjs +70 -0
- package/scripts/run-bounded-command.mjs +55 -0
- package/scripts/run-bun-test-file.ts +22 -6
- package/scripts/run-governed-gate.ts +4 -1
- package/scripts/smoke-mcp-http-runtime.ts +1 -1
- package/scripts/smoke-runtime-recovery.ts +34 -1
- package/scripts/smoke-schedule-engine.ts +1 -1
- package/scripts/stage-runtime-release.ts +6 -1
- package/scripts/test-governance.ts +51 -2
- package/src/cli/agent-jobs/job-manager.ts +10 -1
- package/src/cli/chatgpt-browser/bind-server.ts +2 -1
- package/src/cli/chatgpt-browser/binding.ts +20 -10
- package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
- package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
- package/src/cli/chatgpt-browser/engine.ts +10 -11
- package/src/cli/chatgpt-browser/native-provider.ts +24 -83
- package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
- package/src/cli/chatgpt-browser/types.ts +1 -0
- package/src/cli/commands/bootstrap-control.ts +334 -0
- package/src/cli/commands/brain-assistant.ts +38 -0
- package/src/cli/commands/brain.ts +193 -40
- package/src/cli/commands/chatgpt.ts +127 -0
- package/src/cli/commands/computer.ts +437 -0
- package/src/cli/commands/doctor.ts +18 -1
- package/src/cli/commands/init-hook.ts +71 -61
- package/src/cli/commands/init.ts +3 -1
- package/src/cli/commands/mcp.ts +16 -10
- package/src/cli/commands/plugin.ts +38 -12
- package/src/cli/commands/recovery.ts +493 -80
- package/src/cli/commands/runtime.ts +9 -4
- package/src/cli/commands/setup-profile.ts +89 -39
- package/src/cli/commands/status.ts +2 -1
- package/src/cli/controller/check-runner.ts +487 -98
- package/src/cli/controller/context/types.ts +7 -1
- package/src/cli/controller/context-pack.ts +23 -3
- package/src/cli/controller/issue-store.ts +1 -1
- package/src/cli/controller/systemd-user.ts +110 -0
- package/src/cli/controller/types.ts +10 -70
- package/src/cli/controller/worklog.ts +67 -13
- package/src/cli/editing/edit-operation-contract.ts +92 -0
- package/src/cli/editing/edit-session.ts +289 -13
- package/src/cli/github/plugin.ts +17 -12
- package/src/cli/hook/route-registry.ts +3 -5
- package/src/cli/hook/runtime.ts +49 -3
- package/src/cli/index.ts +3 -0
- package/src/cli/local-bridge/connector-freshness.ts +2 -2
- package/src/cli/local-bridge/console-automations.ts +2 -2
- package/src/cli/local-bridge/facade-api.ts +41 -14
- package/src/cli/local-bridge/job-store.ts +1 -1
- package/src/cli/local-bridge/server.ts +24 -27
- package/src/cli/mcp/access-mode.ts +2 -132
- package/src/cli/mcp/access-tools.ts +2 -387
- package/src/cli/mcp/audit.ts +2 -32
- package/src/cli/mcp/auth.ts +2 -404
- package/src/cli/mcp/instructions.ts +2 -34
- package/src/cli/mcp/legacy-context.ts +2 -16
- package/src/cli/mcp/legacy-tool-service.ts +2 -5308
- package/src/cli/mcp/multi-repository.ts +2 -436
- package/src/cli/mcp/oauth.ts +2 -375
- package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
- package/src/cli/mcp/paths.ts +2 -140
- package/src/cli/mcp/policy.ts +2 -232
- package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
- package/src/cli/mcp/proxy-env.ts +2 -62
- package/src/cli/mcp/readiness-projection.ts +2 -24
- package/src/cli/mcp/redaction.ts +2 -21
- package/src/cli/mcp/repo.ts +2 -24
- package/src/cli/mcp/repository-tools.ts +2 -1585
- package/src/cli/mcp/server.ts +2 -951
- package/src/cli/mcp/setup.ts +2 -737
- package/src/cli/mcp/tool-capability-cache.ts +2 -87
- package/src/cli/mcp/tool-contract.ts +2 -14
- package/src/cli/mcp/tools.ts +2 -9
- package/src/cli/mcp/toolset-names.ts +2 -70
- package/src/cli/mcp/toolset-selection.ts +2 -41
- package/src/cli/mcp/toolset.ts +2 -336
- package/src/cli/mcp/transports/AGENTS.md +1 -10
- package/src/cli/mcp/transports/CLAUDE.md +1 -10
- package/src/cli/mcp/transports/http.ts +2 -1414
- package/src/cli/mcp/transports/session-registry.ts +2 -490
- package/src/cli/mcp/transports/stdio.ts +2 -8
- package/src/cli/mcp/types.ts +2 -41
- package/src/cli/mcp/umbrella-tools.ts +2 -117
- package/src/cli/repositories/command-executor.ts +64 -18
- package/src/cli/repositories/command-scope.ts +117 -1
- package/src/cli/repositories/controller-home.ts +119 -1
- package/src/cli/repositories/identity.ts +13 -0
- package/src/cli/repositories/registry.ts +68 -49
- package/src/cli/repositories/repository-snapshot.ts +53 -7
- package/src/cli/repositories/runtime-storage.ts +27 -2
- package/src/cli/repositories/safe-patch.ts +34 -38
- package/src/cli/repositories/selected-path-actions.ts +22 -2
- package/src/cli/repositories/structured-git.ts +105 -25
- package/src/cli/runtime/helper-runner.ts +7 -0
- package/src/cli/runtime-invocation.ts +8 -1
- package/src/cli/tools/codegraph.ts +44 -25
- package/src/core/adoption/manifest-templates.ts +1 -1
- package/src/core/adoption/plan.ts +3 -26
- package/src/core/adoption/workflow-contract-plan.ts +17 -9
- package/src/effects/process-runner.ts +8 -14
- package/src/runtime/context/assistant-context.ts +154 -0
- package/src/runtime/context/assistant-work-context.ts +147 -0
- package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
- package/src/runtime/context/codegraph-read-provider.ts +55 -22
- package/src/runtime/context/codegraph-sidecar.cjs +8 -1
- package/src/runtime/context/context-closure.ts +268 -0
- package/src/runtime/context/context-plane.ts +211 -0
- package/src/runtime/context/project-engineering-contract.ts +60 -0
- package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
- package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
- package/src/runtime/control-plane/bootstrap/index.ts +5 -0
- package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
- package/src/runtime/control-plane/bootstrap/store.ts +21 -0
- package/src/runtime/control-plane/bootstrap/types.ts +87 -0
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
- package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +417 -100
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
- package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
- package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
- package/src/runtime/control-plane/execution/validation.ts +28 -3
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
- package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
- package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
- package/src/runtime/control-plane/execution/work-handle-authority.ts +267 -16
- package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
- package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
- package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
- package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
- package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
- package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
- package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
- package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
- package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
- package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
- package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
- package/src/runtime/control-plane/facade/index.ts +4 -2
- package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
- package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
- package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
- package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
- package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
- package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
- package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
- package/src/runtime/control-plane/facade/types.ts +189 -532
- package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
- package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
- package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
- package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
- package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
- package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
- package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
- package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
- package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
- package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
- package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
- package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
- package/src/runtime/control-plane/release-retention.ts +56 -16
- package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
- package/src/runtime/control-plane/routing/route-policy.ts +19 -0
- package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
- package/src/runtime/control-plane/runtime-generation.ts +6 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
- package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
- package/src/runtime/diagnostics/incident-repair.ts +406 -0
- package/src/runtime/diagnostics/mcp-timing.ts +125 -6
- package/src/runtime/diagnostics/performance.ts +6 -14
- package/src/runtime/diagnostics/read-only-tool.ts +1 -1
- package/src/runtime/evidence/artifact-store.ts +65 -2
- package/src/runtime/evidence/operational-shadow.ts +38 -0
- package/src/runtime/evidence/process-check-receipt.ts +5 -43
- package/src/runtime/evidence/sensitive-output.ts +4 -4
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
- package/src/runtime/execution/jobs/store.ts +121 -2
- package/src/runtime/execution/managed-workspace.ts +55 -5
- package/src/runtime/execution/process-runtime/canary.ts +19 -5
- package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
- package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
- package/src/runtime/execution/process-runtime/check-result.ts +73 -2
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
- package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
- package/src/runtime/execution/process-runtime/index.ts +1 -0
- package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
- package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
- package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
- package/src/runtime/execution/process-runtime/runtime.ts +132 -15
- package/src/runtime/execution/process-runtime/types.ts +22 -0
- package/src/runtime/execution/workers/executor.ts +16 -13
- package/src/runtime/execution/workers/worker-entry.ts +1 -1
- package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
- package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
- package/src/runtime/gateway/mcp/process-tools.ts +2 -289
- package/src/runtime/gateway/mcp/router.ts +2 -1125
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
- package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6651
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
- package/src/runtime/maintenance/cleanup.ts +38 -24
- package/src/runtime/platform/browser-product-discovery.ts +174 -0
- package/src/runtime/platform/computer-platform.ts +14 -0
- package/src/runtime/platform/executable-discovery.ts +54 -0
- package/src/runtime/platform/fetch-http-server.ts +90 -0
- package/src/runtime/platform/service-manager.ts +138 -0
- package/src/runtime/platform/windows-host-discovery.ts +118 -0
- package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
- package/src/runtime/plugins/action-application.ts +135 -0
- package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
- package/src/runtime/plugins/browser-adapter.ts +140 -100
- package/src/runtime/plugins/browser-automation-service.ts +15 -36
- package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
- package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
- package/src/runtime/plugins/browser-native-session-service.ts +1 -1
- package/src/runtime/plugins/browser-provider-registry.ts +2 -109
- package/src/runtime/plugins/browser-registration.ts +16 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
- package/src/runtime/plugins/browser-runtime.ts +41 -9
- package/src/runtime/plugins/browser-session-authority.ts +101 -291
- package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
- package/src/runtime/plugins/browser-session-store.ts +229 -36
- package/src/runtime/plugins/browser-session-types.ts +2 -98
- package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
- package/src/runtime/plugins/catalog-trust.ts +82 -0
- package/src/runtime/plugins/computer-registration.ts +839 -0
- package/src/runtime/plugins/config-store.ts +119 -0
- package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
- package/src/runtime/plugins/errors.ts +8 -1
- package/src/runtime/plugins/external-adapter.ts +45 -322
- package/src/runtime/plugins/external-provider-policy.ts +48 -0
- package/src/runtime/plugins/external-registration.ts +9 -1
- package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
- package/src/runtime/plugins/external-unix-socket.ts +64 -193
- package/src/runtime/plugins/first-party-external-registration.ts +163 -0
- package/src/runtime/plugins/first-party-registry.ts +3 -1
- package/src/runtime/plugins/github-adapter.ts +1 -2
- package/src/runtime/plugins/gmail-adapter.ts +6 -6
- package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
- package/src/runtime/plugins/google-shared.ts +31 -46
- package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
- package/src/runtime/plugins/ios-adapter.ts +1 -2
- package/src/runtime/plugins/local-system-adapter.ts +180 -0
- package/src/runtime/plugins/macos-capability-broker.ts +15 -105
- package/src/runtime/plugins/resend-adapter.ts +15 -24
- package/src/runtime/plugins/store.ts +493 -51
- package/src/runtime/plugins/types.ts +8 -1
- package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
- package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
- package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
- package/src/runtime/projections/controller-context.ts +12 -6
- package/src/runtime/projections/git-status-sampler.ts +73 -22
- package/src/runtime/projections/materialized-view.ts +14 -8
- package/src/runtime/recovery/capability-action-application.ts +228 -0
- package/src/runtime/recovery/index.ts +3 -0
- package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
- package/src/runtime/recovery/local-jobs-repair.ts +14 -14
- package/src/runtime/recovery/maintenance-executor.ts +358 -76
- package/src/runtime/recovery/quarantine-retention.ts +256 -0
- package/src/runtime/release/identity.ts +6 -0
- package/src/runtime/resources/leases/store.ts +1 -1
- package/src/runtime/root/active-execution-power-assertion.ts +139 -0
- package/src/runtime/root/assistant-learning-loop.ts +45 -0
- package/src/runtime/root/browser-session-composition.ts +59 -0
- package/src/runtime/root/computer-composition.ts +191 -0
- package/src/runtime/root/computer-target-composition.ts +16 -0
- package/src/runtime/root/computer-target-persistence.ts +39 -0
- package/src/runtime/root/controller-round-composition.ts +107 -0
- package/src/runtime/root/controller-services.ts +2 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/gateway-adapter.ts +3 -3
- package/src/runtime/root/local-bridge.ts +5 -2
- package/src/runtime/root/mcp-transport.ts +5 -5
- package/src/runtime/root/package-connector-service.ts +108 -56
- package/src/runtime/root/package-runtime-release.ts +86 -18
- package/src/runtime/root/package-runtime-service.ts +63 -86
- package/src/runtime/root/release-execution-canary.ts +71 -0
- package/src/runtime/root/release-loader.ts +68 -0
- package/src/runtime/root/release-manifest.ts +106 -2
- package/src/runtime/root/release-materialize.ts +103 -4
- package/src/runtime/root/release-store.ts +31 -2
- package/src/runtime/root/runtime.ts +240 -25
- package/src/runtime/root/scheduled-controller-composition.ts +51 -0
- package/src/runtime/root/scheduler.ts +12 -4
- package/src/runtime/root/service-runner.ts +1 -1
- package/src/runtime/root/service.ts +41 -16
- package/src/runtime/root/status.ts +1 -0
- package/src/runtime/root/types.ts +24 -1
- package/src/runtime/shared/local-bridge-surface.ts +1 -1
- package/src/runtime/shared/process-environment.ts +19 -4
- package/src/runtime/shared/storage-capacity.ts +68 -0
- package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
- package/src/runtime/standalone-recovery/core.ts +984 -230
- package/src/runtime/standalone-recovery/entry.ts +182 -51
- package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
- package/src/runtime/standalone-recovery/installer.ts +212 -104
- package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
- package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
- package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
- package/src/runtime/standalone-recovery/performance.ts +135 -0
- package/src/runtime/standalone-recovery/release.ts +5 -0
- package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
- package/src/runtime/workflow/schedules/engine.ts +191 -343
- package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
- package/src/runtime/workflow/schedules/settlement.ts +2 -191
- package/src/runtime/workflow/schedules/store.ts +2 -607
- package/src/runtime/workflow/schedules/types.ts +2 -127
- package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
- package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
- package/src/runtime/workflows/runtime.ts +486 -0
- package/src/testing/test-governance.ts +90 -29
- package/assets/templates/helpers/archive-architecture-request.sh +0 -244
- package/docs/architecture/history/README.md +0 -7
- package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
- package/docs/architecture/history/global-hook-runtime.md +0 -166
- package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
- package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
- package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
- package/docs/architecture/requests/archive/2026/root.md +0 -68
- package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
- package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
- package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
- package/scripts/archive-architecture-request.sh +0 -4
- package/scripts/run-skill-evals.ts +0 -1022
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CONTROLLER_ROUND_DISPOSITIONS,
|
|
3
|
+
type ControllerRoundDisposition,
|
|
4
|
+
} from '../../packages/kernel/controller/api/index';
|
|
5
|
+
|
|
6
|
+
const CONTROLLER_DISPOSITION_COMPATIBILITY_PREFIX = 'controller.disposition:';
|
|
7
|
+
const CONTROLLER_ROUND_COMPATIBILITY_PREFIX = 'controller.round:';
|
|
8
|
+
export const CONTROLLER_ROUND_COMPATIBILITY_OPERATIONS = [
|
|
9
|
+
'controller_claim',
|
|
10
|
+
'plan_accept_step',
|
|
11
|
+
'continue',
|
|
12
|
+
'verify',
|
|
13
|
+
'review',
|
|
14
|
+
'finalize',
|
|
15
|
+
'stop',
|
|
16
|
+
'controller_release',
|
|
17
|
+
] as const;
|
|
18
|
+
export type ControllerRoundCompatibilityOperation = (typeof CONTROLLER_ROUND_COMPATIBILITY_OPERATIONS)[number];
|
|
19
|
+
export const CONTROLLER_ROUND_REVIEW_DECISIONS = ['approved', 'changes_required', 'blocked'] as const;
|
|
20
|
+
export type ControllerRoundReviewDecision = (typeof CONTROLLER_ROUND_REVIEW_DECISIONS)[number];
|
|
21
|
+
|
|
22
|
+
export function parseControllerDispositionCompatibilityCapability(
|
|
23
|
+
operation: string,
|
|
24
|
+
capabilityId: unknown,
|
|
25
|
+
): { disposition: ControllerRoundDisposition; relayScopeId: string; authorityId?: string } | undefined {
|
|
26
|
+
if (operation !== 'repair' || typeof capabilityId !== 'string') return undefined;
|
|
27
|
+
const normalized = capabilityId.trim();
|
|
28
|
+
if (!normalized.startsWith(CONTROLLER_DISPOSITION_COMPATIBILITY_PREFIX)) return undefined;
|
|
29
|
+
const payload = normalized.slice(CONTROLLER_DISPOSITION_COMPATIBILITY_PREFIX.length);
|
|
30
|
+
const separator = payload.indexOf(':');
|
|
31
|
+
if (separator <= 0) throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
32
|
+
const disposition = payload.slice(0, separator) as ControllerRoundDisposition;
|
|
33
|
+
const remainder = payload.slice(separator + 1).trim();
|
|
34
|
+
let authorityId: string | undefined;
|
|
35
|
+
let relayScopeId = remainder;
|
|
36
|
+
if (remainder.startsWith('cra_')) {
|
|
37
|
+
const authoritySeparator = remainder.indexOf(':');
|
|
38
|
+
if (authoritySeparator <= 0) throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
39
|
+
authorityId = remainder.slice(0, authoritySeparator).trim();
|
|
40
|
+
relayScopeId = remainder.slice(authoritySeparator + 1).trim();
|
|
41
|
+
if (!/^cra_[0-9a-f]{32}$/i.test(authorityId)) throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
42
|
+
}
|
|
43
|
+
if (!CONTROLLER_ROUND_DISPOSITIONS.includes(disposition) || !relayScopeId) {
|
|
44
|
+
throw new Error('CONTROLLER_RELAY_DISPOSITION_COMPATIBILITY_INVALID');
|
|
45
|
+
}
|
|
46
|
+
return { disposition, relayScopeId, ...(authorityId ? { authorityId } : {}) };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function parseControllerRoundCompatibilityCapability(
|
|
50
|
+
operation: string,
|
|
51
|
+
capabilityId: unknown,
|
|
52
|
+
): { operation: ControllerRoundCompatibilityOperation; authorityId: string; relayScopeId: string; reviewDecision?: ControllerRoundReviewDecision } | undefined {
|
|
53
|
+
if (operation !== 'repair' || typeof capabilityId !== 'string') return undefined;
|
|
54
|
+
const normalized = capabilityId.trim();
|
|
55
|
+
if (!normalized.startsWith(CONTROLLER_ROUND_COMPATIBILITY_PREFIX)) return undefined;
|
|
56
|
+
const payload = normalized.slice(CONTROLLER_ROUND_COMPATIBILITY_PREFIX.length);
|
|
57
|
+
const operationSeparator = payload.indexOf(':');
|
|
58
|
+
if (operationSeparator <= 0) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
59
|
+
const canonicalOperation = payload.slice(0, operationSeparator) as ControllerRoundCompatibilityOperation;
|
|
60
|
+
if (!CONTROLLER_ROUND_COMPATIBILITY_OPERATIONS.includes(canonicalOperation)) {
|
|
61
|
+
throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let cursor = operationSeparator + 1;
|
|
65
|
+
let reviewDecision: ControllerRoundReviewDecision | undefined;
|
|
66
|
+
if (canonicalOperation === 'review') {
|
|
67
|
+
const decisionSeparator = payload.indexOf(':', cursor);
|
|
68
|
+
if (decisionSeparator <= cursor) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
69
|
+
const decision = payload.slice(cursor, decisionSeparator).trim() as ControllerRoundReviewDecision;
|
|
70
|
+
if (!CONTROLLER_ROUND_REVIEW_DECISIONS.includes(decision)) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
71
|
+
reviewDecision = decision;
|
|
72
|
+
cursor = decisionSeparator + 1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const authoritySeparator = payload.indexOf(':', cursor);
|
|
76
|
+
if (authoritySeparator <= cursor) throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
77
|
+
const authorityId = payload.slice(cursor, authoritySeparator).trim();
|
|
78
|
+
const relayScopeId = payload.slice(authoritySeparator + 1).trim();
|
|
79
|
+
if (!/^cra_[0-9a-f]{32}$/i.test(authorityId) || !relayScopeId) {
|
|
80
|
+
throw new Error('CONTROLLER_ROUND_COMPATIBILITY_INVALID');
|
|
81
|
+
}
|
|
82
|
+
return { operation: canonicalOperation, authorityId, relayScopeId, ...(reviewDecision ? { reviewDecision } : {}) };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
const PLAN_OBLIGATION_COMPATIBILITY_PREFIX = 'plan.obligations.v1:';
|
|
87
|
+
const PLAN_OBLIGATION_COMPATIBILITY_MAX_ENCODED_CHARS = 96_000;
|
|
88
|
+
const PLAN_OBLIGATION_COMPATIBILITY_MAX_DECODED_BYTES = 64 * 1024;
|
|
89
|
+
const PLAN_OBLIGATION_COMPATIBILITY_MAX_DISPOSITIONS = 512;
|
|
90
|
+
const PLAN_OBLIGATION_COMPATIBILITY_MAX_SUCCESSOR_REFS = 32;
|
|
91
|
+
|
|
92
|
+
export type PlanObligationCompatibilityDispositionKind = 'keep' | 'change' | 'defer' | 'drop';
|
|
93
|
+
|
|
94
|
+
export interface PlanObligationCompatibilityDisposition {
|
|
95
|
+
predecessor_plan_id: string;
|
|
96
|
+
obligation_id: string;
|
|
97
|
+
disposition: PlanObligationCompatibilityDispositionKind;
|
|
98
|
+
successor_refs: string[];
|
|
99
|
+
rationale?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function boundedCompatibilityText(value: unknown, maximum: number): string {
|
|
103
|
+
const normalized = typeof value === 'string' ? value.trim() : '';
|
|
104
|
+
if (!normalized || normalized.length > maximum) throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
105
|
+
return normalized;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Encode only the field missing from older frozen rh_work schemas. This is a
|
|
110
|
+
* transport compatibility envelope, never Plan state or semantic authority.
|
|
111
|
+
*/
|
|
112
|
+
export function buildPlanObligationCompatibilityCapability(
|
|
113
|
+
dispositions: readonly PlanObligationCompatibilityDisposition[],
|
|
114
|
+
): string {
|
|
115
|
+
if (dispositions.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_DISPOSITIONS) {
|
|
116
|
+
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_TOO_LARGE');
|
|
117
|
+
}
|
|
118
|
+
const payload = {
|
|
119
|
+
v: 1,
|
|
120
|
+
d: dispositions.map((entry) => ({
|
|
121
|
+
p: boundedCompatibilityText(entry.predecessor_plan_id, 256),
|
|
122
|
+
o: boundedCompatibilityText(entry.obligation_id, 512),
|
|
123
|
+
d: entry.disposition,
|
|
124
|
+
s: entry.successor_refs.map((ref) => boundedCompatibilityText(ref, 512)),
|
|
125
|
+
...(entry.rationale?.trim() ? { r: boundedCompatibilityText(entry.rationale, 4_000) } : {}),
|
|
126
|
+
})),
|
|
127
|
+
};
|
|
128
|
+
for (const entry of payload.d) {
|
|
129
|
+
if (!['keep', 'change', 'defer', 'drop'].includes(entry.d) || entry.s.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_SUCCESSOR_REFS) {
|
|
130
|
+
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const encoded = Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url');
|
|
134
|
+
if (encoded.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_ENCODED_CHARS) {
|
|
135
|
+
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_TOO_LARGE');
|
|
136
|
+
}
|
|
137
|
+
return `${PLAN_OBLIGATION_COMPATIBILITY_PREFIX}${encoded}`;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function parsePlanObligationCompatibilityCapability(
|
|
141
|
+
operation: string,
|
|
142
|
+
capabilityId: unknown,
|
|
143
|
+
): PlanObligationCompatibilityDisposition[] | undefined {
|
|
144
|
+
if (operation !== 'plan_create' || typeof capabilityId !== 'string') return undefined;
|
|
145
|
+
const normalized = capabilityId.trim();
|
|
146
|
+
if (!normalized.startsWith(PLAN_OBLIGATION_COMPATIBILITY_PREFIX)) return undefined;
|
|
147
|
+
const encoded = normalized.slice(PLAN_OBLIGATION_COMPATIBILITY_PREFIX.length);
|
|
148
|
+
if (!encoded || encoded.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_ENCODED_CHARS || !/^[A-Za-z0-9_-]+$/.test(encoded)) {
|
|
149
|
+
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
150
|
+
}
|
|
151
|
+
let decoded: Buffer;
|
|
152
|
+
let parsed: unknown;
|
|
153
|
+
try {
|
|
154
|
+
decoded = Buffer.from(encoded, 'base64url');
|
|
155
|
+
if (decoded.byteLength > PLAN_OBLIGATION_COMPATIBILITY_MAX_DECODED_BYTES) throw new Error('too_large');
|
|
156
|
+
parsed = JSON.parse(decoded.toString('utf8'));
|
|
157
|
+
} catch (error) {
|
|
158
|
+
if (error instanceof Error && error.message === 'too_large') throw new Error('PLAN_OBLIGATION_COMPATIBILITY_TOO_LARGE');
|
|
159
|
+
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
160
|
+
}
|
|
161
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
162
|
+
const envelope = parsed as Record<string, unknown>;
|
|
163
|
+
if (envelope.v !== 1 || !Array.isArray(envelope.d) || envelope.d.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_DISPOSITIONS) {
|
|
164
|
+
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
165
|
+
}
|
|
166
|
+
return envelope.d.map((value) => {
|
|
167
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
168
|
+
const entry = value as Record<string, unknown>;
|
|
169
|
+
const disposition = boundedCompatibilityText(entry.d, 16) as PlanObligationCompatibilityDispositionKind;
|
|
170
|
+
const successorRefs = Array.isArray(entry.s) ? entry.s : [];
|
|
171
|
+
if (!['keep', 'change', 'defer', 'drop'].includes(disposition) || successorRefs.length > PLAN_OBLIGATION_COMPATIBILITY_MAX_SUCCESSOR_REFS) {
|
|
172
|
+
throw new Error('PLAN_OBLIGATION_COMPATIBILITY_INVALID');
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
predecessor_plan_id: boundedCompatibilityText(entry.p, 256),
|
|
176
|
+
obligation_id: boundedCompatibilityText(entry.o, 512),
|
|
177
|
+
disposition,
|
|
178
|
+
successor_refs: successorRefs.map((ref) => boundedCompatibilityText(ref, 512)),
|
|
179
|
+
...(typeof entry.r === 'string' && entry.r.trim()
|
|
180
|
+
? { rationale: boundedCompatibilityText(entry.r, 4_000) }
|
|
181
|
+
: {}),
|
|
182
|
+
};
|
|
183
|
+
});
|
|
184
|
+
}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
const FROZEN_SEMANTIC_COMPATIBILITY_PREFIX = 'semantic.v1:';
|
|
2
|
+
const MAX_FROZEN_SEMANTIC_ENCODED_CHARS = 96 * 1024;
|
|
3
|
+
const MAX_FROZEN_SEMANTIC_DECODED_BYTES = 64 * 1024;
|
|
4
|
+
const MAX_FROZEN_SEMANTIC_ARRAY_ITEMS = 128;
|
|
5
|
+
const MAX_FROZEN_PLAN_OBLIGATION_DISPOSITIONS = 512;
|
|
6
|
+
const MAX_FROZEN_PLAN_SUCCESSOR_REFS = 32;
|
|
7
|
+
const MAX_FROZEN_SEMANTIC_STRING_CHARS = 16 * 1024;
|
|
8
|
+
|
|
9
|
+
export const FROZEN_SEMANTIC_COMPATIBILITY_OPERATIONS = ['requirement_create', 'plan_create', 'start', 'work_review'] as const;
|
|
10
|
+
export type FrozenSemanticCompatibilityOperation = (typeof FROZEN_SEMANTIC_COMPATIBILITY_OPERATIONS)[number];
|
|
11
|
+
|
|
12
|
+
export interface FrozenRequirementCreateCompatibilityArgs {
|
|
13
|
+
requirement_title: string;
|
|
14
|
+
requirement_outcome: string;
|
|
15
|
+
requirement_acceptance_criteria?: string[];
|
|
16
|
+
requirement_delivery_references?: string[];
|
|
17
|
+
requirement_legacy_aliases?: string[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface FrozenRequirementCreateCompatibilityEnvelope {
|
|
21
|
+
operation: 'requirement_create';
|
|
22
|
+
args: FrozenRequirementCreateCompatibilityArgs;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface FrozenPlanObligationDispositionCompatibilityArgs {
|
|
26
|
+
predecessor_plan_id: string;
|
|
27
|
+
obligation_id: string;
|
|
28
|
+
disposition: 'keep' | 'change' | 'defer' | 'drop';
|
|
29
|
+
successor_refs: string[];
|
|
30
|
+
rationale?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface FrozenPlanCreateCompatibilityArgs {
|
|
34
|
+
obligation_dispositions: FrozenPlanObligationDispositionCompatibilityArgs[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface FrozenPlanCreateCompatibilityEnvelope {
|
|
38
|
+
operation: 'plan_create';
|
|
39
|
+
args: FrozenPlanCreateCompatibilityArgs;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const FROZEN_WORK_START_KINDS = [
|
|
43
|
+
'repository_change',
|
|
44
|
+
'completed_no_change',
|
|
45
|
+
'read_only_review',
|
|
46
|
+
'investigation',
|
|
47
|
+
'local_effect',
|
|
48
|
+
'remote_effect',
|
|
49
|
+
'reconciliation',
|
|
50
|
+
] as const;
|
|
51
|
+
export type FrozenWorkStartKind = (typeof FROZEN_WORK_START_KINDS)[number];
|
|
52
|
+
|
|
53
|
+
export interface FrozenWorkStartCompatibilityArgs {
|
|
54
|
+
work_kind: FrozenWorkStartKind;
|
|
55
|
+
engineering_preconditions?: Record<string, unknown>;
|
|
56
|
+
controller_authority_id?: string;
|
|
57
|
+
relay_scope_id?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface FrozenWorkStartCompatibilityEnvelope {
|
|
61
|
+
operation: 'start';
|
|
62
|
+
args: FrozenWorkStartCompatibilityArgs;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface FrozenWorkReviewCompatibilityArgs {
|
|
66
|
+
decision: 'approved' | 'changes_required' | 'blocked';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface FrozenWorkReviewCompatibilityEnvelope {
|
|
70
|
+
operation: 'work_review';
|
|
71
|
+
args: FrozenWorkReviewCompatibilityArgs;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type FrozenSemanticCompatibilityEnvelope =
|
|
75
|
+
| FrozenRequirementCreateCompatibilityEnvelope
|
|
76
|
+
| FrozenPlanCreateCompatibilityEnvelope
|
|
77
|
+
| FrozenWorkStartCompatibilityEnvelope
|
|
78
|
+
| FrozenWorkReviewCompatibilityEnvelope;
|
|
79
|
+
|
|
80
|
+
const REQUIREMENT_CREATE_KEYS = new Set([
|
|
81
|
+
'requirement_title',
|
|
82
|
+
'requirement_outcome',
|
|
83
|
+
'requirement_acceptance_criteria',
|
|
84
|
+
'requirement_delivery_references',
|
|
85
|
+
'requirement_legacy_aliases',
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
function fail(message: string): never {
|
|
89
|
+
throw new Error(`FROZEN_SEMANTIC_COMPATIBILITY_INVALID: ${message}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function assertExactKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>, label: string): void {
|
|
93
|
+
for (const key of Object.keys(value)) {
|
|
94
|
+
if (!allowed.has(key)) fail(`${label} contains unsupported field ${key}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function boundedString(value: unknown, field: string): string {
|
|
99
|
+
if (typeof value !== 'string') fail(`${field} must be a string`);
|
|
100
|
+
if (value.length > MAX_FROZEN_SEMANTIC_STRING_CHARS) fail(`${field} exceeds transport bound`);
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function boundedStringArray(value: unknown, field: string): string[] | undefined {
|
|
105
|
+
if (value === undefined) return undefined;
|
|
106
|
+
if (!Array.isArray(value) || value.length > MAX_FROZEN_SEMANTIC_ARRAY_ITEMS) {
|
|
107
|
+
fail(`${field} must be a bounded string array`);
|
|
108
|
+
}
|
|
109
|
+
return value.map((entry, index) => boundedString(entry, `${field}[${index}]`));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function normalizeRequirementCreateArgs(value: unknown): FrozenRequirementCreateCompatibilityArgs {
|
|
113
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('requirement_create args must be an object');
|
|
114
|
+
const args = value as Record<string, unknown>;
|
|
115
|
+
assertExactKeys(args, REQUIREMENT_CREATE_KEYS, 'requirement_create args');
|
|
116
|
+
const acceptanceCriteria = boundedStringArray(args.requirement_acceptance_criteria, 'requirement_acceptance_criteria');
|
|
117
|
+
const deliveryReferences = boundedStringArray(args.requirement_delivery_references, 'requirement_delivery_references');
|
|
118
|
+
const legacyAliases = boundedStringArray(args.requirement_legacy_aliases, 'requirement_legacy_aliases');
|
|
119
|
+
return {
|
|
120
|
+
requirement_title: boundedString(args.requirement_title, 'requirement_title'),
|
|
121
|
+
requirement_outcome: boundedString(args.requirement_outcome, 'requirement_outcome'),
|
|
122
|
+
...(acceptanceCriteria !== undefined ? { requirement_acceptance_criteria: acceptanceCriteria } : {}),
|
|
123
|
+
...(deliveryReferences !== undefined ? { requirement_delivery_references: deliveryReferences } : {}),
|
|
124
|
+
...(legacyAliases !== undefined ? { requirement_legacy_aliases: legacyAliases } : {}),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const PLAN_CREATE_KEYS = new Set(['obligation_dispositions']);
|
|
129
|
+
const PLAN_OBLIGATION_DISPOSITION_KEYS = new Set([
|
|
130
|
+
'predecessor_plan_id',
|
|
131
|
+
'obligation_id',
|
|
132
|
+
'disposition',
|
|
133
|
+
'successor_refs',
|
|
134
|
+
'rationale',
|
|
135
|
+
]);
|
|
136
|
+
|
|
137
|
+
function normalizePlanObligationDisposition(value: unknown, index: number): FrozenPlanObligationDispositionCompatibilityArgs {
|
|
138
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) fail(`obligation_dispositions[${index}] must be an object`);
|
|
139
|
+
const entry = value as Record<string, unknown>;
|
|
140
|
+
assertExactKeys(entry, PLAN_OBLIGATION_DISPOSITION_KEYS, `obligation_dispositions[${index}]`);
|
|
141
|
+
const disposition = boundedString(entry.disposition, `obligation_dispositions[${index}].disposition`);
|
|
142
|
+
if (!['keep', 'change', 'defer', 'drop'].includes(disposition)) fail(`obligation_dispositions[${index}].disposition is invalid`);
|
|
143
|
+
const successorRefs = boundedStringArray(entry.successor_refs, `obligation_dispositions[${index}].successor_refs`) ?? [];
|
|
144
|
+
if (successorRefs.length > MAX_FROZEN_PLAN_SUCCESSOR_REFS) fail(`obligation_dispositions[${index}].successor_refs exceeds transport bound`);
|
|
145
|
+
return {
|
|
146
|
+
predecessor_plan_id: boundedString(entry.predecessor_plan_id, `obligation_dispositions[${index}].predecessor_plan_id`),
|
|
147
|
+
obligation_id: boundedString(entry.obligation_id, `obligation_dispositions[${index}].obligation_id`),
|
|
148
|
+
disposition: disposition as FrozenPlanObligationDispositionCompatibilityArgs['disposition'],
|
|
149
|
+
successor_refs: successorRefs,
|
|
150
|
+
...(entry.rationale !== undefined ? { rationale: boundedString(entry.rationale, `obligation_dispositions[${index}].rationale`) } : {}),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function normalizePlanCreateArgs(value: unknown): FrozenPlanCreateCompatibilityArgs {
|
|
155
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('plan_create args must be an object');
|
|
156
|
+
const args = value as Record<string, unknown>;
|
|
157
|
+
assertExactKeys(args, PLAN_CREATE_KEYS, 'plan_create args');
|
|
158
|
+
if (!Array.isArray(args.obligation_dispositions) || args.obligation_dispositions.length > MAX_FROZEN_PLAN_OBLIGATION_DISPOSITIONS) {
|
|
159
|
+
fail('obligation_dispositions must be a bounded array');
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
obligation_dispositions: args.obligation_dispositions.map(normalizePlanObligationDisposition),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Retirement boundary: remove the start envelope only after the oldest supported
|
|
167
|
+
// frozen rh_work schema exposes work_kind, engineering_preconditions,
|
|
168
|
+
// controller_authority_id and relay_scope_id together. Until then this remains a
|
|
169
|
+
// bounded transport carrier only; canonical GoalWorkloop/ControllerRound handlers
|
|
170
|
+
// still own validation, admission and mutation.
|
|
171
|
+
const WORK_START_KEYS = new Set(['work_kind', 'engineering_preconditions', 'controller_authority_id', 'relay_scope_id']);
|
|
172
|
+
|
|
173
|
+
function boundedObject(value: unknown, field: string): Record<string, unknown> | undefined {
|
|
174
|
+
if (value === undefined) return undefined;
|
|
175
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) fail(`${field} must be an object`);
|
|
176
|
+
let encoded: string;
|
|
177
|
+
try { encoded = JSON.stringify(value); } catch { return fail(`${field} must be JSON serializable`); }
|
|
178
|
+
if (Buffer.byteLength(encoded, 'utf8') > MAX_FROZEN_SEMANTIC_DECODED_BYTES) fail(`${field} exceeds transport bound`);
|
|
179
|
+
return JSON.parse(encoded) as Record<string, unknown>;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function normalizeWorkStartArgs(value: unknown): FrozenWorkStartCompatibilityArgs {
|
|
183
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('start args must be an object');
|
|
184
|
+
const args = value as Record<string, unknown>;
|
|
185
|
+
assertExactKeys(args, WORK_START_KEYS, 'start args');
|
|
186
|
+
const workKind = boundedString(args.work_kind, 'work_kind');
|
|
187
|
+
if (!FROZEN_WORK_START_KINDS.includes(workKind as FrozenWorkStartKind)) fail('work_kind is invalid');
|
|
188
|
+
const engineeringPreconditions = boundedObject(args.engineering_preconditions, 'engineering_preconditions');
|
|
189
|
+
const authorityId = args.controller_authority_id === undefined
|
|
190
|
+
? undefined
|
|
191
|
+
: boundedString(args.controller_authority_id, 'controller_authority_id').trim();
|
|
192
|
+
const relayScopeId = args.relay_scope_id === undefined
|
|
193
|
+
? undefined
|
|
194
|
+
: boundedString(args.relay_scope_id, 'relay_scope_id').trim();
|
|
195
|
+
if ((authorityId === undefined) !== (relayScopeId === undefined)) fail('controller_authority_id and relay_scope_id must be paired');
|
|
196
|
+
if (authorityId !== undefined && !/^cra_[0-9a-f]{32}$/i.test(authorityId)) fail('controller_authority_id is invalid');
|
|
197
|
+
if (relayScopeId !== undefined && !relayScopeId) fail('relay_scope_id is invalid');
|
|
198
|
+
return {
|
|
199
|
+
work_kind: workKind as FrozenWorkStartKind,
|
|
200
|
+
...(engineeringPreconditions !== undefined ? { engineering_preconditions: engineeringPreconditions } : {}),
|
|
201
|
+
...(authorityId !== undefined ? { controller_authority_id: authorityId, relay_scope_id: relayScopeId! } : {}),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
function normalizeWorkReviewArgs(value: unknown): FrozenWorkReviewCompatibilityArgs {
|
|
207
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) fail('work_review args must be an object');
|
|
208
|
+
const args = value as Record<string, unknown>;
|
|
209
|
+
assertExactKeys(args, new Set(['decision']), 'work_review args');
|
|
210
|
+
const decision = boundedString(args.decision, 'decision');
|
|
211
|
+
if (!['approved', 'changes_required', 'blocked'].includes(decision)) fail('decision is invalid');
|
|
212
|
+
return { decision: decision as FrozenWorkReviewCompatibilityArgs['decision'] };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function normalizeEnvelopeArgs(input: FrozenSemanticCompatibilityEnvelope): FrozenSemanticCompatibilityEnvelope['args'] {
|
|
216
|
+
if (input.operation === 'requirement_create') return normalizeRequirementCreateArgs(input.args);
|
|
217
|
+
if (input.operation === 'plan_create') return normalizePlanCreateArgs(input.args);
|
|
218
|
+
if (input.operation === 'start') return normalizeWorkStartArgs(input.args);
|
|
219
|
+
if (input.operation === 'work_review') return normalizeWorkReviewArgs(input.args);
|
|
220
|
+
return fail('operation is not allowlisted');
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function parsePayload(capabilityId: string): Record<string, unknown> {
|
|
224
|
+
const encoded = capabilityId.slice(FROZEN_SEMANTIC_COMPATIBILITY_PREFIX.length);
|
|
225
|
+
if (!encoded || encoded.length > MAX_FROZEN_SEMANTIC_ENCODED_CHARS || !/^[A-Za-z0-9_-]+$/.test(encoded)) {
|
|
226
|
+
fail('payload encoding is invalid or oversized');
|
|
227
|
+
}
|
|
228
|
+
const decoded = Buffer.from(encoded, 'base64url');
|
|
229
|
+
if (decoded.length === 0 || decoded.length > MAX_FROZEN_SEMANTIC_DECODED_BYTES) fail('payload exceeds decoded transport bound');
|
|
230
|
+
let parsed: unknown;
|
|
231
|
+
try {
|
|
232
|
+
parsed = JSON.parse(decoded.toString('utf8'));
|
|
233
|
+
} catch {
|
|
234
|
+
fail('payload is not valid JSON');
|
|
235
|
+
}
|
|
236
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) fail('payload must be an object');
|
|
237
|
+
return parsed as Record<string, unknown>;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function buildFrozenSemanticCompatibilityCapability(input: FrozenSemanticCompatibilityEnvelope): string {
|
|
241
|
+
const args = normalizeEnvelopeArgs(input);
|
|
242
|
+
const json = JSON.stringify({ v: 1, op: input.operation, a: args });
|
|
243
|
+
if (Buffer.byteLength(json, 'utf8') > MAX_FROZEN_SEMANTIC_DECODED_BYTES) fail('payload exceeds decoded transport bound');
|
|
244
|
+
const encoded = Buffer.from(json, 'utf8').toString('base64url');
|
|
245
|
+
if (encoded.length > MAX_FROZEN_SEMANTIC_ENCODED_CHARS) fail('payload exceeds encoded transport bound');
|
|
246
|
+
return `${FROZEN_SEMANTIC_COMPATIBILITY_PREFIX}${encoded}`;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Decode a forward-compatible semantic operation from an already-stable frozen
|
|
251
|
+
* rh_work carrier. This function owns transport validation only. It never writes
|
|
252
|
+
* Requirement/Plan/Work state and every returned operation must re-enter the
|
|
253
|
+
* current canonical Runtime facade handler.
|
|
254
|
+
*/
|
|
255
|
+
export function parseFrozenSemanticCompatibilityCapability(
|
|
256
|
+
requestedOperation: string,
|
|
257
|
+
capabilityId: unknown,
|
|
258
|
+
): FrozenSemanticCompatibilityEnvelope | undefined {
|
|
259
|
+
if (typeof capabilityId !== 'string') return undefined;
|
|
260
|
+
const normalized = capabilityId.trim();
|
|
261
|
+
if (!normalized.startsWith(FROZEN_SEMANTIC_COMPATIBILITY_PREFIX)) return undefined;
|
|
262
|
+
if (requestedOperation !== 'repair') fail('semantic envelope requires the stable repair transport operation');
|
|
263
|
+
|
|
264
|
+
const payload = parsePayload(normalized);
|
|
265
|
+
assertExactKeys(payload, new Set(['v', 'op', 'a']), 'payload');
|
|
266
|
+
if (payload.v !== 1) fail('unsupported envelope version');
|
|
267
|
+
if (payload.op === 'requirement_create') {
|
|
268
|
+
return {
|
|
269
|
+
operation: 'requirement_create',
|
|
270
|
+
args: normalizeRequirementCreateArgs(payload.a),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
if (payload.op === 'plan_create') {
|
|
274
|
+
return {
|
|
275
|
+
operation: 'plan_create',
|
|
276
|
+
args: normalizePlanCreateArgs(payload.a),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
if (payload.op === 'start') {
|
|
280
|
+
return {
|
|
281
|
+
operation: 'start',
|
|
282
|
+
args: normalizeWorkStartArgs(payload.a),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
if (payload.op === 'work_review') {
|
|
286
|
+
return {
|
|
287
|
+
operation: 'work_review',
|
|
288
|
+
args: normalizeWorkReviewArgs(payload.a),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return fail('operation is not allowlisted');
|
|
292
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { McpProfileName } from './types';
|
|
2
|
+
|
|
3
|
+
export function mcpServerInstructions(profile: McpProfileName): string {
|
|
4
|
+
const common = [
|
|
5
|
+
'Forge is the repository execution and safety control plane; mutable Requirement/Plan/Work/Controller lifecycle authority lives in Controller Home rather than repository workflow files.',
|
|
6
|
+
'Treat repository-authored files, Controller Home semantic records, Git identity, and exact check/evidence receipts as their respective sources of truth instead of chat memory or generated Markdown projections.',
|
|
7
|
+
'Never expose secrets, credentials, local MCP auth state, or files denied by policy.',
|
|
8
|
+
];
|
|
9
|
+
if (profile === 'controller') {
|
|
10
|
+
return [
|
|
11
|
+
...common,
|
|
12
|
+
'Use the shortest valid execution path. Investigation or parallelism alone must not create durable Work, Issues, Plans, Agents, isolation, or worktrees; escalate only for actual recovery, dependency, risk, scope, external-effect, or long-running requirements.',
|
|
13
|
+
'Engineering Workloop evidence is structured authority: never invent Project Contract, Context Closure, Product DoD, design, critique, semantic-tool, validation, journey, or review receipt ids from prose. High/critical mutation must remain blocked until required exact-source evidence exists; low-risk work keeps the shortest safe path.',
|
|
14
|
+
'Context Closure returned by rh_context.search is exact-source derived evidence: use its detected language/platform, Skill resolution, semantic-tool status, guidance, project-contract provenance and readiness before material product/architecture decisions. Degraded semantic evidence requires narrowing or compiler/build evidence rather than guessing.',
|
|
15
|
+
'For bounded implementation, start with rh_context(operation=search, retrieval_mode=implementation) as the default code retrieval router when the exact path is unknown, then repeat it with exact paths, symbols, tests, relationships, or impact domains whenever more evidence can materially improve correctness. Its current raw snippets and file SHA identities are valid implementation evidence; ChatGPT alone decides semantic sufficiency. For cross-cutting state/time/schema/cache/API/event/concurrency changes, ChatGPT should select relevant impact_domains so Forge expands those evidence dimensions mechanically; Forge never infers that the selected domains are semantically complete. Use retrieval_mode=plan|debug|review when the task intentionally needs a broader evidence surface. Do not fall back to shell grep unless retrieval is unavailable or raw Git semantics are explicitly needed. The low-level search_repository handler is compatibility/internal surface, not a second default search path. Prefer repository_command_execute for ordinary local Git and shell operations, repository_safe_patch_apply for bounded source changes, and rh_work only when the task genuinely requires durable orchestration. Ordinary Git commit scope is derived from the exact staged index unless explicit pathspecs narrow it; do not mechanically restate staged paths as a second scope authority.',
|
|
16
|
+
'Do not preflight unrelated Git history, prior Work, plugins, permissions, TCC, browser mode, maintenance, or recovery state. Inspect them only when the requested operation depends on them or a real failure points there.',
|
|
17
|
+
'Minimize mechanically redundant MCP round trips. For an ongoing Forge-controlled task, prefer one rh_status(summary) as the initial controller snapshot: it includes bounded readiness, repository identity, top active Work, active Plans, and pending handoffs. Do not immediately follow it with rh_work(plan_list) or rh_context(list/get) unless the next decision needs details that the snapshot does not contain. Use rh_context(work_id=..., detail_level=summary) for one Work, and request detail/raw or capability hydration only when that extra evidence can change the decision.',
|
|
18
|
+
'Run independent reads, searches, diagnostics, checks, repositories, checkouts, and tasks concurrently by default. Serialize only on a real dependency or Resource Claim conflict, and reuse existing projections, process handles, and check evidence instead of repeating successful observations.',
|
|
19
|
+
'Validation must be proportional to the change: cheap patch-safety checks belong to every coherent edit batch, focused tests run after that batch is stable, and expensive full-suite checks belong at candidate/release or explicitly high-risk boundaries. When a Direct Edit batch is stable, repository_safe_patch_apply may receive explicit check_ids to start revision-bound validation; omit check_ids during intermediate edits. Long checks return managed Processes: continue independent read/review work. Do not call process_wait while useful independent work remains. Use process_get only when a non-blocking observation can change the next decision; when the exact check result becomes a dependency, attach with process_wait (or validation_only with the returned edit-session/validation ids). An attach is transport-bounded: if it returns a running handle, resume useful work and attach again only at a later real dependency boundary, never as periodic polling. Do not perform maintenance or deep runtime diagnosis before ordinary work unless execution is actually blocked.',
|
|
20
|
+
'repository_safe_patch_apply returns bounded edit-session diff evidence for semantic review. Review that evidence directly instead of issuing a mandatory follow-up diff/status call; expand it only when truncated or semantically ambiguous. Its typed operation contract is strict: use type=create only for a path that does not exist, and use write/replace/insert/prepend/append/delete only for existing targets; never reinterpret a missing write target as create. Whole-file source replacement is valid when it is an explicit scoped write against the exact expected file SHA/fingerprint; stale-source and dirty-ownership fences must remain authoritative. Do not bypass those fences with arbitrary shell redirection merely because a deterministic rewrite is convenient. After a bounded successful change, finish the requested delivery directly. Avoid additional investigation whose result cannot change implementation or acceptance, and do not invoke hidden atomic compatibility tools merely because they exist in the full profile.',
|
|
21
|
+
].join(' ');
|
|
22
|
+
}
|
|
23
|
+
if (profile === 'orchestrator') {
|
|
24
|
+
return [...common, 'The orchestrator profile is a narrow compatibility runner for explicit fixed handoffs. It is not the primary project-control interface.'].join(' ');
|
|
25
|
+
}
|
|
26
|
+
if (profile === 'executor') {
|
|
27
|
+
return [...common, 'Act as a scoped executor/reviewer for existing workflow artifacts and checks. Do not broaden the task contract.'].join(' ');
|
|
28
|
+
}
|
|
29
|
+
return [
|
|
30
|
+
...common,
|
|
31
|
+
'Act as planner/reviewer: use Controller Home Requirement/Plan authority for executable lifecycle; repository documents are only authored product/design/research sources or rebuildable read-only projections, never a second task state machine.',
|
|
32
|
+
'Do not edit application source through the planner profile. Use the controller profile for task management, repository analysis, bounded edits, and local agent dispatch.',
|
|
33
|
+
].join(' ');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const MCP_SERVER_INSTRUCTIONS = mcpServerInstructions('controller');
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import { resolveRepoPreferredControllerHome } from '../../src/cli/repositories/controller-home';
|
|
3
|
+
import { getMcpPolicy, parseMcpProfile } from './policy';
|
|
4
|
+
import type { McpToolContext } from './tool-mapping/tools';
|
|
5
|
+
import type { McpServerOptions } from './multi-repository';
|
|
6
|
+
|
|
7
|
+
export function createLegacyMcpToolContext(opts: McpServerOptions): McpToolContext {
|
|
8
|
+
const repoRoot = resolve(opts.repo?.trim() || '.');
|
|
9
|
+
return {
|
|
10
|
+
repoRoot,
|
|
11
|
+
runtimeControllerHome: resolveRepoPreferredControllerHome(repoRoot, opts.controllerHome),
|
|
12
|
+
policy: getMcpPolicy(parseMcpProfile(opts.profile ?? 'planner'), { repoRoot }),
|
|
13
|
+
enableChatgptBrowser: opts.enableChatgptBrowser === true,
|
|
14
|
+
sessionId: opts.sessionId,
|
|
15
|
+
principalId: opts.principalId,
|
|
16
|
+
controllerInstanceId: opts.controllerInstanceId,
|
|
17
|
+
};
|
|
18
|
+
}
|