@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
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { randomUUID } from 'crypto';
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import { existsSync, readFileSync, readdirSync } from 'fs';
|
|
2
4
|
import { writeChatgptBridgeExtension, CHATGPT_BRIDGE_DEFAULT_PORT } from './bridge-extension';
|
|
3
|
-
import { DEFAULT_CHATGPT_URL, ensureBridgeToken,
|
|
5
|
+
import { DEFAULT_CHATGPT_URL, ensureBridgeToken, readBrowserBinding } from './binding';
|
|
4
6
|
import { openNativeBrowserPage } from './native-provider';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { discoverWslWindowsHostEnvironment, hostPathToWindowsPath, windowsPathToHostPath, type WindowsHostEnvironment } from '../../runtime/platform/windows-host-discovery';
|
|
9
|
+
import { serveFetchHttp, type FetchHttpServer } from '../../runtime/platform/fetch-http-server';
|
|
5
10
|
import type { BrowserConsultInput, BrowserSessionStatus, PromptBundle } from './types';
|
|
6
11
|
|
|
7
12
|
export interface BridgeProviderResult {
|
|
@@ -29,6 +34,14 @@ interface ExtensionTask {
|
|
|
29
34
|
prompt: string;
|
|
30
35
|
timeoutMs: number;
|
|
31
36
|
targetUrl?: string;
|
|
37
|
+
dispatchOnly?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface ExtensionDispatchReceipt {
|
|
41
|
+
taskId: string;
|
|
42
|
+
conversationUrl?: string;
|
|
43
|
+
outboundFingerprint: string;
|
|
44
|
+
confirmedAt?: string;
|
|
32
45
|
}
|
|
33
46
|
|
|
34
47
|
interface ExtensionResult {
|
|
@@ -68,7 +81,7 @@ async function readJson(request: Request): Promise<any> {
|
|
|
68
81
|
}
|
|
69
82
|
|
|
70
83
|
async function sleep(ms: number): Promise<void> {
|
|
71
|
-
await
|
|
84
|
+
await new Promise<void>((resolveSleep) => setTimeout(resolveSleep, ms));
|
|
72
85
|
}
|
|
73
86
|
|
|
74
87
|
function validStatus(value: unknown): BrowserSessionStatus {
|
|
@@ -116,6 +129,308 @@ function bridgePort(): number {
|
|
|
116
129
|
return Number.isInteger(parsed) && parsed > 0 && parsed <= 65535 ? parsed : CHATGPT_BRIDGE_DEFAULT_PORT;
|
|
117
130
|
}
|
|
118
131
|
|
|
132
|
+
export interface WslWindowsBridgeBrowserCandidate {
|
|
133
|
+
executable: string;
|
|
134
|
+
/** Absolute host-visible profile root. Preferred for discovered providers. */
|
|
135
|
+
profileRoot?: string;
|
|
136
|
+
/** Compatibility fallback relative to the discovered Windows user profile. */
|
|
137
|
+
profileRelativeRoot?: string;
|
|
138
|
+
controlled?: boolean;
|
|
139
|
+
supportsUnpackedExtensionLaunch?: boolean;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const WSL_WINDOWS_CONTROLLED_PROFILE_ROOT = 'Forge/ChatGPT Bridge/User Data';
|
|
143
|
+
|
|
144
|
+
interface WslWindowsBrowserProductFallback {
|
|
145
|
+
productId: string;
|
|
146
|
+
executableRelativePath: string;
|
|
147
|
+
profileRelativeToLocalAppData?: string;
|
|
148
|
+
supportsUnpackedExtensionLaunch?: boolean;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Bounded adapter fallbacks only. Host discovery and explicit provider registration take precedence. */
|
|
152
|
+
const WSL_WINDOWS_BROWSER_PRODUCT_FALLBACKS: readonly WslWindowsBrowserProductFallback[] = [
|
|
153
|
+
{ productId: 'centbrowser', executableRelativePath: 'CentBrowser/Application/chrome.exe', profileRelativeToLocalAppData: 'CentBrowser/User Data', supportsUnpackedExtensionLaunch: true },
|
|
154
|
+
{ productId: 'google-chrome', executableRelativePath: 'Google/Chrome/Application/chrome.exe', profileRelativeToLocalAppData: 'Google/Chrome/User Data' },
|
|
155
|
+
] as const;
|
|
156
|
+
|
|
157
|
+
export interface WslWindowsBridgeBrowserBinding {
|
|
158
|
+
executable: string;
|
|
159
|
+
profileDirectory: string;
|
|
160
|
+
extensionDir: string;
|
|
161
|
+
userDataDir?: string;
|
|
162
|
+
loadExtensionOnLaunch?: boolean;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
interface WslWindowsBridgeLaunchOptions {
|
|
166
|
+
platform?: NodeJS.Platform;
|
|
167
|
+
wslDistroName?: string;
|
|
168
|
+
osRelease?: string;
|
|
169
|
+
chromeExecutables?: readonly string[];
|
|
170
|
+
browserBinding?: WslWindowsBridgeBrowserBinding;
|
|
171
|
+
fileExists?: typeof existsSync;
|
|
172
|
+
launch?: typeof spawn;
|
|
173
|
+
hostEnvironment?: WindowsHostEnvironment;
|
|
174
|
+
hostDiscovery?: () => WindowsHostEnvironment | undefined;
|
|
175
|
+
toWindowsPath?: (value: string) => string | undefined;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function bridgeProfileDirectories(profileRoot: string): string[] {
|
|
179
|
+
if (!existsSync(profileRoot)) return [];
|
|
180
|
+
try {
|
|
181
|
+
return readdirSync(profileRoot, { withFileTypes: true })
|
|
182
|
+
.filter((entry) => entry.isDirectory() && (entry.name === 'Default' || /^Profile \d+$/.test(entry.name)))
|
|
183
|
+
.map((entry) => entry.name)
|
|
184
|
+
.sort((left, right) => left === 'Default' ? -1 : right === 'Default' ? 1 : left.localeCompare(right))
|
|
185
|
+
.slice(0, 20);
|
|
186
|
+
} catch {
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function hostBrowserCandidates(host: WindowsHostEnvironment): WslWindowsBridgeBrowserCandidate[] {
|
|
192
|
+
const candidates: WslWindowsBridgeBrowserCandidate[] = [];
|
|
193
|
+
for (const fallback of WSL_WINDOWS_BROWSER_PRODUCT_FALLBACKS) {
|
|
194
|
+
for (const programFiles of host.programFiles) {
|
|
195
|
+
const executable = join(programFiles, fallback.executableRelativePath);
|
|
196
|
+
candidates.push({
|
|
197
|
+
executable,
|
|
198
|
+
...(host.localAppData && fallback.profileRelativeToLocalAppData ? { profileRoot: join(host.localAppData, fallback.profileRelativeToLocalAppData) } : {}),
|
|
199
|
+
...(fallback.supportsUnpackedExtensionLaunch ? { supportsUnpackedExtensionLaunch: true } : {}),
|
|
200
|
+
});
|
|
201
|
+
if (host.localAppData && fallback.supportsUnpackedExtensionLaunch) {
|
|
202
|
+
candidates.push({
|
|
203
|
+
executable,
|
|
204
|
+
profileRoot: join(host.localAppData, WSL_WINDOWS_CONTROLLED_PROFILE_ROOT),
|
|
205
|
+
controlled: true,
|
|
206
|
+
supportsUnpackedExtensionLaunch: true,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return candidates;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function resolvedWslHost(options: { hostEnvironment?: WindowsHostEnvironment; hostDiscovery?: () => WindowsHostEnvironment | undefined } = {}): WindowsHostEnvironment | undefined {
|
|
215
|
+
return options.hostEnvironment ?? options.hostDiscovery?.() ?? discoverWslWindowsHostEnvironment();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function installedBridgeExtensionPath(setting: any, bridgeUrl: string, token: string, host?: WindowsHostEnvironment): string | undefined {
|
|
219
|
+
if (setting?.state === 0 || setting?.disable_reasons !== undefined) return undefined;
|
|
220
|
+
const rawPath = setting?.path ?? setting?.path_safe ?? setting?.location_path;
|
|
221
|
+
if (typeof rawPath !== 'string') return undefined;
|
|
222
|
+
const extensionDir = rawPath.startsWith('/') ? rawPath : host ? windowsPathToHostPath(rawPath, host.driveMounts) : undefined;
|
|
223
|
+
if (!extensionDir) return undefined;
|
|
224
|
+
const contentScript = join(extensionDir, 'content-script.js');
|
|
225
|
+
if (!existsSync(contentScript)) return undefined;
|
|
226
|
+
try {
|
|
227
|
+
const source = readFileSync(contentScript, 'utf8');
|
|
228
|
+
return source.includes(bridgeUrl) && source.includes(token) ? extensionDir : undefined;
|
|
229
|
+
} catch {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function findInstalledWslWindowsBridgeBrowser(
|
|
235
|
+
bridgeUrl: string,
|
|
236
|
+
token: string,
|
|
237
|
+
options: { userName?: string; userRoot?: string; candidates?: readonly WslWindowsBridgeBrowserCandidate[]; hostEnvironment?: WindowsHostEnvironment; hostDiscovery?: () => WindowsHostEnvironment | undefined } = {},
|
|
238
|
+
): WslWindowsBridgeBrowserBinding | undefined {
|
|
239
|
+
const host = resolvedWslHost(options);
|
|
240
|
+
const userRoot = options.userRoot ?? host?.userProfile;
|
|
241
|
+
const candidates = options.candidates ?? (host ? hostBrowserCandidates(host) : []);
|
|
242
|
+
for (const candidate of candidates) {
|
|
243
|
+
if (!existsSync(candidate.executable)) continue;
|
|
244
|
+
const profileRoot = candidate.profileRoot ?? (userRoot && candidate.profileRelativeRoot ? join(userRoot, candidate.profileRelativeRoot) : undefined);
|
|
245
|
+
if (!profileRoot) continue;
|
|
246
|
+
for (const profileDirectory of bridgeProfileDirectories(profileRoot)) {
|
|
247
|
+
for (const fileName of ['Preferences', 'Secure Preferences']) {
|
|
248
|
+
const statePath = join(profileRoot, profileDirectory, fileName);
|
|
249
|
+
if (!existsSync(statePath)) continue;
|
|
250
|
+
try {
|
|
251
|
+
const state = JSON.parse(readFileSync(statePath, 'utf8')) as any;
|
|
252
|
+
const settings = state?.extensions?.settings ?? {};
|
|
253
|
+
for (const setting of Object.values(settings)) {
|
|
254
|
+
const extensionDir = installedBridgeExtensionPath(setting, bridgeUrl, token, host);
|
|
255
|
+
if (extensionDir) return {
|
|
256
|
+
executable: candidate.executable,
|
|
257
|
+
profileDirectory,
|
|
258
|
+
extensionDir,
|
|
259
|
+
...(candidate.controlled ? { userDataDir: profileRoot, loadExtensionOnLaunch: true } : {}),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
} catch {
|
|
263
|
+
// Keep scanning other bounded profiles/state files.
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function isWslWindowsRuntime(
|
|
272
|
+
platform: NodeJS.Platform = process.platform,
|
|
273
|
+
wslDistroName?: string,
|
|
274
|
+
osRelease?: string,
|
|
275
|
+
): boolean {
|
|
276
|
+
if (platform !== 'linux') return false;
|
|
277
|
+
const observedDistroName = wslDistroName ?? (osRelease === undefined ? process.env.WSL_DISTRO_NAME : undefined);
|
|
278
|
+
if (observedDistroName?.trim()) return true;
|
|
279
|
+
let observedRelease = osRelease;
|
|
280
|
+
if (observedRelease === undefined) {
|
|
281
|
+
try { observedRelease = readFileSync('/proc/sys/kernel/osrelease', 'utf8'); } catch { observedRelease = ''; }
|
|
282
|
+
}
|
|
283
|
+
return /microsoft|wsl/i.test(observedRelease);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export interface WslWindowsBridgeBrowserReadiness {
|
|
287
|
+
required: boolean;
|
|
288
|
+
ready: boolean;
|
|
289
|
+
automatic: boolean;
|
|
290
|
+
summary: string;
|
|
291
|
+
binding?: WslWindowsBridgeBrowserBinding;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export function chatgptBridgeUrl(): string {
|
|
295
|
+
return `http://127.0.0.1:${bridgePort()}`;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
export function observeWslWindowsBridgeBrowser(
|
|
300
|
+
repoRoot: string,
|
|
301
|
+
options: { userName?: string; userRoot?: string; candidates?: readonly WslWindowsBridgeBrowserCandidate[]; fileExists?: typeof existsSync; platform?: NodeJS.Platform; wslDistroName?: string; osRelease?: string; hostEnvironment?: WindowsHostEnvironment; hostDiscovery?: () => WindowsHostEnvironment | undefined } = {},
|
|
302
|
+
): WslWindowsBridgeBrowserReadiness {
|
|
303
|
+
if (!isWslWindowsRuntime(options.platform, options.wslDistroName, options.osRelease)) return { required: false, ready: true, automatic: false, summary: 'Windows bridge browser is not required outside WSL2.' };
|
|
304
|
+
const host = resolvedWslHost(options);
|
|
305
|
+
const current = readBrowserBinding(repoRoot).binding;
|
|
306
|
+
const bridgeUrl = chatgptBridgeUrl();
|
|
307
|
+
if (current?.bridgeToken) {
|
|
308
|
+
const binding = findInstalledWslWindowsBridgeBrowser(bridgeUrl, current.bridgeToken, { ...options, ...(host ? { hostEnvironment: host } : {}) });
|
|
309
|
+
if (binding) return { required: true, ready: true, automatic: binding.loadExtensionOnLaunch === true, binding, summary: 'A Windows Chromium profile with the current Forge ChatGPT bridge is available.' };
|
|
310
|
+
}
|
|
311
|
+
const fileExists = options.fileExists ?? existsSync;
|
|
312
|
+
const candidates = options.candidates ?? (host ? hostBrowserCandidates(host) : []);
|
|
313
|
+
const automatic = candidates.some((candidate) => candidate.supportsUnpackedExtensionLaunch === true && fileExists(candidate.executable));
|
|
314
|
+
return {
|
|
315
|
+
required: true,
|
|
316
|
+
ready: false,
|
|
317
|
+
automatic,
|
|
318
|
+
summary: automatic
|
|
319
|
+
? 'Forge can provision a dedicated Windows Chromium profile with the ChatGPT bridge extension without modifying the user browser profile.'
|
|
320
|
+
: host
|
|
321
|
+
? 'No supported automatic Windows Chromium bridge transport was discovered. Register an extension-capable Chromium provider or load the Forge bridge extension in a dedicated browser profile.'
|
|
322
|
+
: 'Windows host discovery is unavailable from WSL. Configure an explicit Windows host/browser binding before using the ChatGPT bridge.',
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export async function bootstrapWslWindowsBridgeBrowser(
|
|
327
|
+
repoRoot: string,
|
|
328
|
+
options: {
|
|
329
|
+
userName?: string;
|
|
330
|
+
userRoot?: string;
|
|
331
|
+
controlledRoot?: string;
|
|
332
|
+
candidates?: readonly WslWindowsBridgeBrowserCandidate[];
|
|
333
|
+
fileExists?: typeof existsSync;
|
|
334
|
+
launch?: typeof spawn;
|
|
335
|
+
platform?: NodeJS.Platform;
|
|
336
|
+
wslDistroName?: string;
|
|
337
|
+
osRelease?: string;
|
|
338
|
+
toWindowsPath?: (value: string) => string | undefined;
|
|
339
|
+
bridgeToken?: () => string;
|
|
340
|
+
writeExtension?: typeof writeChatgptBridgeExtension;
|
|
341
|
+
hostEnvironment?: WindowsHostEnvironment;
|
|
342
|
+
hostDiscovery?: () => WindowsHostEnvironment | undefined;
|
|
343
|
+
} = {},
|
|
344
|
+
): Promise<WslWindowsBridgeBrowserBinding> {
|
|
345
|
+
if (!isWslWindowsRuntime(options.platform, options.wslDistroName, options.osRelease)) throw new Error('CHATGPT_BRIDGE_BOOTSTRAP_WSL_REQUIRED');
|
|
346
|
+
const fileExists = options.fileExists ?? existsSync;
|
|
347
|
+
const host = resolvedWslHost(options);
|
|
348
|
+
const candidates = options.candidates ?? (host ? hostBrowserCandidates(host) : []);
|
|
349
|
+
const executable = Array.from(new Set(candidates
|
|
350
|
+
.filter((candidate) => candidate.supportsUnpackedExtensionLaunch === true)
|
|
351
|
+
.map((candidate) => candidate.executable)))
|
|
352
|
+
.find((candidate) => fileExists(candidate));
|
|
353
|
+
if (!executable) throw new Error('CHATGPT_BRIDGE_USER_ACTION_REQUIRED: no supported controlled Windows Chromium runtime is installed');
|
|
354
|
+
const userRoot = options.userRoot ?? host?.userProfile;
|
|
355
|
+
const localAppData = host?.localAppData;
|
|
356
|
+
if (!userRoot && !localAppData) throw new Error('CHATGPT_BRIDGE_WINDOWS_HOST_DISCOVERY_REQUIRED');
|
|
357
|
+
const controlledRoot = options.controlledRoot ?? join(localAppData ?? userRoot!, WSL_WINDOWS_CONTROLLED_PROFILE_ROOT.replace('/User Data', ''));
|
|
358
|
+
const userDataDir = join(controlledRoot, 'User Data');
|
|
359
|
+
const bridgeUrl = chatgptBridgeUrl();
|
|
360
|
+
const token = (options.bridgeToken ?? (() => ensureBridgeToken(repoRoot)))();
|
|
361
|
+
const extension = (options.writeExtension ?? writeChatgptBridgeExtension)(controlledRoot, bridgeUrl, token);
|
|
362
|
+
const toWindowsPath = options.toWindowsPath ?? ((value: string) => host ? hostPathToWindowsPath(value, host.driveMounts) : undefined);
|
|
363
|
+
const windowsUserDataDir = toWindowsPath(userDataDir);
|
|
364
|
+
const windowsExtensionDir = toWindowsPath(extension.extensionDir);
|
|
365
|
+
if (!windowsUserDataDir || !windowsExtensionDir) throw new Error('CHATGPT_BRIDGE_WINDOWS_PATH_TRANSLATION_FAILED');
|
|
366
|
+
const binding: WslWindowsBridgeBrowserBinding = {
|
|
367
|
+
executable, profileDirectory: 'Default', extensionDir: extension.extensionDir, userDataDir, loadExtensionOnLaunch: true,
|
|
368
|
+
};
|
|
369
|
+
const launch = options.launch ?? spawn;
|
|
370
|
+
await new Promise<void>((resolve, reject) => {
|
|
371
|
+
const launched = launch(executable, [
|
|
372
|
+
`--user-data-dir=${windowsUserDataDir}`,
|
|
373
|
+
`--load-extension=${windowsExtensionDir}`,
|
|
374
|
+
'--new-window',
|
|
375
|
+
DEFAULT_CHATGPT_URL,
|
|
376
|
+
], { windowsHide: true, stdio: 'ignore', detached: true });
|
|
377
|
+
let settled = false;
|
|
378
|
+
const finish = (error?: Error) => { if (settled) return; settled = true; error ? reject(error) : resolve(); };
|
|
379
|
+
launched.once('error', (error) => finish(error));
|
|
380
|
+
launched.once('spawn', () => { launched.unref(); finish(); });
|
|
381
|
+
});
|
|
382
|
+
return binding;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export async function openWslWindowsBridgeTarget(
|
|
386
|
+
targetUrl: string,
|
|
387
|
+
options: WslWindowsBridgeLaunchOptions = {},
|
|
388
|
+
): Promise<void> {
|
|
389
|
+
if (!isWslWindowsRuntime(options.platform, options.wslDistroName, options.osRelease)) return;
|
|
390
|
+
const parsed = new URL(targetUrl);
|
|
391
|
+
if (parsed.protocol !== 'https:' || !['chatgpt.com', 'www.chatgpt.com', 'chat.openai.com'].includes(parsed.hostname)) {
|
|
392
|
+
throw new Error(`CHATGPT_BRIDGE_TARGET_INVALID: ${targetUrl}`);
|
|
393
|
+
}
|
|
394
|
+
const fileExists = options.fileExists ?? existsSync;
|
|
395
|
+
const legacyChrome = options.chromeExecutables?.find((candidate) => fileExists(candidate));
|
|
396
|
+
const browser = options.browserBinding;
|
|
397
|
+
const executable = browser?.executable ?? legacyChrome;
|
|
398
|
+
if (!executable) {
|
|
399
|
+
throw new Error('CHATGPT_BRIDGE_USER_ACTION_REQUIRED: no enabled Windows Chromium profile with the current Forge bridge extension is available');
|
|
400
|
+
}
|
|
401
|
+
const host = resolvedWslHost(options);
|
|
402
|
+
const toWindowsPath = options.toWindowsPath ?? ((value: string) => host ? hostPathToWindowsPath(value, host.driveMounts) : undefined);
|
|
403
|
+
const args = browser
|
|
404
|
+
? [
|
|
405
|
+
...(browser.userDataDir ? [`--user-data-dir=${toWindowsPath(browser.userDataDir) ?? browser.userDataDir}`] : []),
|
|
406
|
+
...(browser.loadExtensionOnLaunch ? [`--load-extension=${toWindowsPath(browser.extensionDir) ?? browser.extensionDir}`] : []),
|
|
407
|
+
`--profile-directory=${browser.profileDirectory}`,
|
|
408
|
+
'--new-tab',
|
|
409
|
+
parsed.toString(),
|
|
410
|
+
]
|
|
411
|
+
: ['--new-tab', parsed.toString()];
|
|
412
|
+
const launch = options.launch ?? spawn;
|
|
413
|
+
await new Promise<void>((resolve, reject) => {
|
|
414
|
+
const launched = launch(executable, args, {
|
|
415
|
+
windowsHide: true,
|
|
416
|
+
stdio: 'ignore',
|
|
417
|
+
detached: true,
|
|
418
|
+
});
|
|
419
|
+
let settled = false;
|
|
420
|
+
const finish = (error?: Error) => {
|
|
421
|
+
if (settled) return;
|
|
422
|
+
settled = true;
|
|
423
|
+
if (error) reject(error);
|
|
424
|
+
else resolve();
|
|
425
|
+
};
|
|
426
|
+
launched.once('error', (error) => finish(error));
|
|
427
|
+
launched.once('spawn', () => {
|
|
428
|
+
launched.unref();
|
|
429
|
+
finish();
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
|
|
119
434
|
export async function runBridgeProvider(input: BrowserConsultInput, bundle: PromptBundle): Promise<BridgeProviderResult> {
|
|
120
435
|
if (input.model || input.thinking) {
|
|
121
436
|
return {
|
|
@@ -132,9 +447,9 @@ export async function runBridgeProvider(input: BrowserConsultInput, bundle: Prom
|
|
|
132
447
|
const timeoutMs = input.timeoutMs ?? 180_000;
|
|
133
448
|
const host = '127.0.0.1';
|
|
134
449
|
const port = bridgePort();
|
|
135
|
-
const bridgeUrl =
|
|
136
|
-
// Stable
|
|
137
|
-
const token = ensureBridgeToken(input.repoRoot)
|
|
450
|
+
const bridgeUrl = chatgptBridgeUrl();
|
|
451
|
+
// Stable controller/repository binding token; bridge-only bindings are created lazily.
|
|
452
|
+
const token = ensureBridgeToken(input.repoRoot);
|
|
138
453
|
const extension = writeChatgptBridgeExtension(input.repoRoot, bridgeUrl, token);
|
|
139
454
|
const task: ExtensionTask = {
|
|
140
455
|
id: randomUUID(),
|
|
@@ -142,20 +457,22 @@ export async function runBridgeProvider(input: BrowserConsultInput, bundle: Prom
|
|
|
142
457
|
prompt: bundle.rendered,
|
|
143
458
|
timeoutMs,
|
|
144
459
|
targetUrl: input.chatgptUrl,
|
|
460
|
+
dispatchOnly: input.dispatchOnly === true,
|
|
145
461
|
};
|
|
146
462
|
const state: {
|
|
147
463
|
heartbeat?: ExtensionHeartbeat;
|
|
148
464
|
claimed: boolean;
|
|
149
465
|
started: boolean;
|
|
466
|
+
dispatched?: ExtensionDispatchReceipt;
|
|
150
467
|
result?: ExtensionResult;
|
|
151
468
|
} = {
|
|
152
469
|
claimed: false,
|
|
153
470
|
started: false,
|
|
154
471
|
};
|
|
155
472
|
|
|
156
|
-
let server:
|
|
473
|
+
let server: FetchHttpServer | undefined;
|
|
157
474
|
try {
|
|
158
|
-
server =
|
|
475
|
+
server = await serveFetchHttp({
|
|
159
476
|
hostname: host,
|
|
160
477
|
port,
|
|
161
478
|
async fetch(request) {
|
|
@@ -178,6 +495,20 @@ export async function runBridgeProvider(input: BrowserConsultInput, bundle: Prom
|
|
|
178
495
|
ts: typeof body.ts === 'string' ? body.ts : undefined,
|
|
179
496
|
receivedAt: Date.now(),
|
|
180
497
|
};
|
|
498
|
+
if (
|
|
499
|
+
body.lastDispatch
|
|
500
|
+
&& typeof body.lastDispatch === 'object'
|
|
501
|
+
&& body.lastDispatch.taskId === task.id
|
|
502
|
+
&& typeof body.lastDispatch.outboundFingerprint === 'string'
|
|
503
|
+
&& body.lastDispatch.outboundFingerprint.trim()
|
|
504
|
+
) {
|
|
505
|
+
state.dispatched = {
|
|
506
|
+
taskId: task.id,
|
|
507
|
+
conversationUrl: typeof body.lastDispatch.conversationUrl === 'string' ? body.lastDispatch.conversationUrl : undefined,
|
|
508
|
+
outboundFingerprint: body.lastDispatch.outboundFingerprint.trim(),
|
|
509
|
+
confirmedAt: typeof body.lastDispatch.confirmedAt === 'string' ? body.lastDispatch.confirmedAt : undefined,
|
|
510
|
+
};
|
|
511
|
+
}
|
|
181
512
|
return jsonResponse({ ok: true });
|
|
182
513
|
}
|
|
183
514
|
if (request.method === 'GET' && url.pathname === '/api/extension/task') {
|
|
@@ -192,6 +523,18 @@ export async function runBridgeProvider(input: BrowserConsultInput, bundle: Prom
|
|
|
192
523
|
if (body.taskId === task.id) state.started = true;
|
|
193
524
|
return jsonResponse({ ok: true });
|
|
194
525
|
}
|
|
526
|
+
if (request.method === 'POST' && url.pathname === '/api/extension/dispatched') {
|
|
527
|
+
const body = await readJson(request);
|
|
528
|
+
if (body.taskId === task.id && typeof body.outboundFingerprint === 'string' && body.outboundFingerprint.trim()) {
|
|
529
|
+
state.dispatched = {
|
|
530
|
+
taskId: task.id,
|
|
531
|
+
conversationUrl: typeof body.conversationUrl === 'string' ? body.conversationUrl : undefined,
|
|
532
|
+
outboundFingerprint: body.outboundFingerprint.trim(),
|
|
533
|
+
confirmedAt: typeof body.confirmedAt === 'string' ? body.confirmedAt : undefined,
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
return jsonResponse({ ok: true });
|
|
537
|
+
}
|
|
195
538
|
if (request.method === 'POST' && url.pathname === '/api/extension/result') {
|
|
196
539
|
const body = await readJson(request);
|
|
197
540
|
if (body.taskId === task.id) {
|
|
@@ -246,10 +589,22 @@ export async function runBridgeProvider(input: BrowserConsultInput, bundle: Prom
|
|
|
246
589
|
try {
|
|
247
590
|
if (input.profileDir) {
|
|
248
591
|
openNativeBrowserPage(input.browserChannel ?? 'chrome', input.profileDir, input.chatgptUrl ?? DEFAULT_CHATGPT_URL, input.profileDirectory);
|
|
592
|
+
} else {
|
|
593
|
+
const browserBinding = isWslWindowsRuntime()
|
|
594
|
+
? findInstalledWslWindowsBridgeBrowser(bridgeUrl, token)
|
|
595
|
+
: undefined;
|
|
596
|
+
await openWslWindowsBridgeTarget(input.chatgptUrl ?? DEFAULT_CHATGPT_URL, { browserBinding });
|
|
249
597
|
}
|
|
250
598
|
|
|
251
599
|
const deadline = Date.now() + timeoutMs;
|
|
252
600
|
while (Date.now() < deadline) {
|
|
601
|
+
if (input.dispatchOnly === true && state.dispatched) {
|
|
602
|
+
return {
|
|
603
|
+
status: 'completed',
|
|
604
|
+
output: 'ChatGPT bridge semantic outbound dispatch confirmed.',
|
|
605
|
+
conversationUrl: state.dispatched.conversationUrl ?? state.heartbeat?.url,
|
|
606
|
+
};
|
|
607
|
+
}
|
|
253
608
|
if (state.result) {
|
|
254
609
|
return {
|
|
255
610
|
status: state.result.status,
|
|
@@ -286,12 +641,22 @@ export async function runBridgeProvider(input: BrowserConsultInput, bundle: Prom
|
|
|
286
641
|
`Composer visible: ${state.heartbeat?.composerVisible === true ? 'yes' : 'no'}`,
|
|
287
642
|
].join('\n'),
|
|
288
643
|
error: {
|
|
289
|
-
code:
|
|
290
|
-
|
|
291
|
-
|
|
644
|
+
code: input.dispatchOnly === true && state.started
|
|
645
|
+
? 'CHATGPT_BRIDGE_MUTATION_OUTCOME_UNKNOWN'
|
|
646
|
+
: state.started
|
|
647
|
+
? 'CHATGPT_BRIDGE_RESULT_TIMEOUT'
|
|
648
|
+
: 'CHATGPT_BRIDGE_TASK_NOT_CLAIMED',
|
|
649
|
+
message: input.dispatchOnly === true && state.started
|
|
650
|
+
? 'ChatGPT bridge started the dispatch task but did not prove the submission postcondition before timeout'
|
|
651
|
+
: state.started
|
|
652
|
+
? 'ChatGPT bridge task did not finish before timeout'
|
|
653
|
+
: 'ChatGPT bridge extension did not claim the task before timeout',
|
|
654
|
+
recovery: input.dispatchOnly === true && state.started
|
|
655
|
+
? 'Do not replay blindly; inspect the target ChatGPT conversation before retrying.'
|
|
656
|
+
: 'Keep the ChatGPT tab active with the composer visible, then retry with a longer --timeout-ms.',
|
|
292
657
|
},
|
|
293
658
|
};
|
|
294
659
|
} finally {
|
|
295
|
-
server
|
|
660
|
+
server?.stop(true);
|
|
296
661
|
}
|
|
297
662
|
}
|
|
@@ -192,12 +192,8 @@ export function runBrowserSetup(repoRoot: string, opts: BrowserSetupOptions = {}
|
|
|
192
192
|
'.ai/harness/chatgpt/sessions/',
|
|
193
193
|
];
|
|
194
194
|
let updated = false;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
// Bun.file().text() is async; keep setup sync by deferring .gitignore
|
|
198
|
-
// mutation to the CLI command implementation if needed in a later phase.
|
|
199
|
-
void current;
|
|
200
|
-
}
|
|
195
|
+
// Setup intentionally reports recommended ignore entries without mutating the repository.
|
|
196
|
+
void gitignorePath;
|
|
201
197
|
const lines = [
|
|
202
198
|
`[forge chatgpt] Session root: ${sessionRoot}`,
|
|
203
199
|
'[forge chatgpt] Local browser config remains uncommitted.',
|
|
@@ -217,7 +213,7 @@ export function runBrowserSetup(repoRoot: string, opts: BrowserSetupOptions = {}
|
|
|
217
213
|
if (binding.profileDirectory) lines.push(`[forge chatgpt] Chrome profile: ${binding.profileDirectory}`);
|
|
218
214
|
if (binding.selectedProfilePath) lines.push(`[forge chatgpt] Selected profile path: ${binding.selectedProfilePath}`);
|
|
219
215
|
lines.push(`[forge chatgpt] Browser channel: ${binding.browserChannel}`);
|
|
220
|
-
if (nativeDebuggingBlockedByDefaultProfile(binding.profileDir, binding.browserChannel)) {
|
|
216
|
+
if (binding.profileDir && nativeDebuggingBlockedByDefaultProfile(binding.profileDir, binding.browserChannel)) {
|
|
221
217
|
lines.push('[forge chatgpt] Warning: this is the default Chrome data directory. Chrome 136+ blocks native CDP validation for this profile; use a separate automation profile or a session import/bridge path.');
|
|
222
218
|
} else {
|
|
223
219
|
lines.push('[forge chatgpt] Next: run forge chatgpt browser-bind --open, click Bind ChatGPT, then run browser-doctor --provider native --validate-session.');
|
|
@@ -227,14 +223,17 @@ export function runBrowserSetup(repoRoot: string, opts: BrowserSetupOptions = {}
|
|
|
227
223
|
|
|
228
224
|
const existing = readBrowserBinding(repoRoot);
|
|
229
225
|
if (existing.binding) {
|
|
230
|
-
lines.push(`[forge chatgpt] Existing ChatGPT profile binding: ${existing.binding.profileDir}`);
|
|
226
|
+
if (existing.binding.profileDir) lines.push(`[forge chatgpt] Existing ChatGPT profile binding: ${existing.binding.profileDir}`);
|
|
227
|
+
else lines.push('[forge chatgpt] Existing ChatGPT bridge-only binding configured.');
|
|
231
228
|
if (existing.binding.profileDirectory) lines.push(`[forge chatgpt] Chrome profile: ${existing.binding.profileDirectory}`);
|
|
232
229
|
if (existing.binding.selectedProfilePath) lines.push(`[forge chatgpt] Selected profile path: ${existing.binding.selectedProfilePath}`);
|
|
233
230
|
lines.push(`[forge chatgpt] Browser channel: ${existing.binding.browserChannel}`);
|
|
234
|
-
if (nativeDebuggingBlockedByDefaultProfile(existing.binding.profileDir, existing.binding.browserChannel)) {
|
|
231
|
+
if (existing.binding.profileDir && nativeDebuggingBlockedByDefaultProfile(existing.binding.profileDir, existing.binding.browserChannel)) {
|
|
235
232
|
lines.push('[forge chatgpt] Warning: this is the default Chrome data directory. Chrome 136+ blocks native CDP validation for this profile; use a separate automation profile or a session import/bridge path.');
|
|
236
|
-
} else {
|
|
233
|
+
} else if (existing.binding.profileDir) {
|
|
237
234
|
lines.push('[forge chatgpt] Next: run forge chatgpt browser-bind --open, click Bind ChatGPT, then run browser-doctor --provider native --validate-session.');
|
|
235
|
+
} else {
|
|
236
|
+
lines.push('[forge chatgpt] Bridge binding is ready; load the generated Forge ChatGPT Bridge extension in the browser host.');
|
|
238
237
|
}
|
|
239
238
|
} else {
|
|
240
239
|
lines.push('[forge chatgpt] No ChatGPT profile binding configured.');
|
|
@@ -323,7 +322,7 @@ export async function browserDoctor(
|
|
|
323
322
|
updateBrowserBindingStatus(repoRoot, validation.status);
|
|
324
323
|
}
|
|
325
324
|
const nativeReady = nativePresent && Boolean(profileDir) && !defaultProfileBlocked && (opts.validateSession !== true || validation?.status === 'ready');
|
|
326
|
-
const bridgeReady = Boolean(profileDir);
|
|
325
|
+
const bridgeReady = Boolean(binding?.bridgeToken || profileDir);
|
|
327
326
|
// Oracle is the main path: ready iff a resolved binary probes with the
|
|
328
327
|
// browser-mode capabilities we depend on. native is deprecated; bridge is
|
|
329
328
|
// experimental. We no longer overload a single `partial` for all three.
|