@moretea-labs/forge 1.6.0 → 1.7.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 +2 -0
- package/CHANGELOG.md +26 -0
- package/CLAUDE.md +2 -0
- package/README.md +2 -2
- package/README.zh-CN.md +1 -1
- package/SKILL.md +2 -2
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/agents/openai.yaml +1 -1
- package/assets/hooks/hook-input.sh +11 -8
- package/assets/hooks/lib/session-state.sh +10 -7
- package/assets/hooks/lib/workflow-state.sh +13 -177
- package/assets/hooks/post-tool-observer.sh +8 -2
- package/assets/hooks/prompt-guard.sh +5 -81
- package/assets/hooks/session-start-context.sh +56 -1
- package/assets/partials/05-workflow.partial.md +1 -1
- package/assets/partials-agents/03-orchestration.partial.md +1 -1
- package/assets/plugin-registry.v1.json +1 -1
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/harness-overview.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +3 -3
- package/assets/skill-version.json +2 -2
- package/assets/templates/contract.template.md +2 -7
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-task-workflow.sh +4 -4
- package/assets/templates/helpers/contract-worktree.sh +1 -21
- package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
- package/assets/templates/helpers/migrate-project-template.sh +22 -45
- package/assets/templates/helpers/new-plan.sh +1 -1
- package/assets/templates/helpers/plan-to-todo.sh +12 -37
- package/assets/templates/helpers/ship-worktrees.sh +2 -29
- package/assets/templates/helpers/verify-contract.sh +1 -111
- package/assets/templates/helpers/verify-sprint.sh +3 -180
- package/assets/templates/plan.template.md +1 -1
- package/assets/templates/review.template.md +9 -34
- package/assets/workflow-contract.v1.json +10 -19
- package/docs/README.md +10 -10
- package/docs/architecture/CURRENT.md +170 -0
- package/docs/architecture/EVOLUTION.md +42 -0
- package/docs/architecture/current/README.md +4 -156
- package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
- package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
- package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
- package/docs/architecture/history/README.md +7 -0
- package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
- package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
- package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
- package/docs/architecture/history.md +3 -34
- package/docs/architecture/index.md +15 -98
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
- package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
- package/docs/architecture/versions/1.6.md +38 -0
- package/docs/architecture/versions/1.7.md +41 -0
- package/docs/forge-chatgpt-browser-engine.md +2 -2
- package/docs/forge-chatgpt-mcp-setup.md +4 -28
- package/docs/forge-chatgpt-supervised-automation.md +3 -3
- package/docs/forge-github-issue-launcher.md +1 -1
- package/docs/forge-runtime-self-healing-loop.md +1 -1
- package/docs/operations/controller-browser-plugin.md +26 -6
- package/docs/operations/controller-performance-and-502.md +124 -0
- package/docs/operations/controller-reliability-runbook.md +1 -1
- package/docs/operations/features.md +2 -2
- package/docs/operations/github-repository.md +1 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/mcp-tool-exposure.md +5 -3
- package/docs/wiki/Architecture.md +6 -6
- package/docs/wiki/Implementation.md +2 -2
- package/docs/wiki/Integrations.md +2 -2
- package/docs/wiki/Work-Lifecycle.md +1 -1
- package/package.json +29 -10
- package/scripts/activate-source-baseline.ts +17 -13
- package/scripts/benchmark-background-check-overlap.ts +228 -0
- package/scripts/benchmark-mcp-host.sh +117 -0
- package/scripts/benchmark-mcp-transport.ts +170 -0
- package/scripts/benchmark-quality-harness.ts +146 -0
- package/scripts/benchmark-route-session-concurrency.ts +207 -6
- package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
- package/scripts/benchmark-typescript-navigation.ts +186 -0
- package/scripts/benchmark-work-efficiency.ts +334 -0
- package/scripts/capture-plan.sh +3 -3
- package/scripts/check-agent-tooling.sh +8 -35
- package/scripts/check-architecture-sync.sh +17 -86
- package/scripts/check-mcp-compatibility.ts +14 -0
- package/scripts/check-runtime-architecture.mjs +107 -64
- package/scripts/check-stable-baseline.ts +92 -0
- package/scripts/check-task-workflow.sh +4 -4
- package/scripts/contract-worktree.sh +1 -21
- package/scripts/ensure-task-workflow.sh +22 -55
- package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
- package/scripts/install-standalone-recovery.ts +24 -0
- package/scripts/lib/project-init-lib.sh +15 -44
- package/scripts/migrate-project-template.sh +23 -1179
- package/scripts/new-plan.sh +1 -1
- package/scripts/plan-to-todo.sh +11 -36
- package/scripts/run-governed-gate.ts +2 -1
- package/scripts/ship-worktrees.sh +2 -29
- package/scripts/smoke-ios-physical-device.ts +4 -2
- package/scripts/smoke-runtime-recovery.ts +1 -35
- package/scripts/smoke-schedule-engine.ts +1 -20
- package/scripts/verify-contract.sh +1 -111
- package/scripts/verify-forge-runtime.sh +0 -1
- package/scripts/verify-sprint.sh +3 -180
- package/scripts/workflow-contract.ts +1 -5
- package/src/cli/commands/init-hook.ts +3 -3
- package/src/cli/commands/mcp.ts +9 -5
- package/src/cli/commands/plugin.ts +1 -1
- package/src/cli/commands/recovery.ts +25 -3
- package/src/cli/commands/runtime.ts +55 -3
- package/src/cli/commands/security.ts +12 -1
- package/src/cli/commands/setup-profile.ts +31 -21
- package/src/cli/controller/check-runner.ts +106 -3
- package/src/cli/controller/composite-result.ts +1 -1
- package/src/cli/controller/context/focus.ts +51 -0
- package/src/cli/controller/context/instruction-context.ts +114 -0
- package/src/cli/controller/context/known-paths.ts +76 -0
- package/src/cli/controller/context/query-planning.ts +110 -0
- package/src/cli/controller/context/rule-resolution.ts +532 -0
- package/src/cli/controller/context/source-materializer.ts +278 -0
- package/src/cli/controller/context/structural.ts +16 -0
- package/src/cli/controller/context/types.ts +286 -0
- package/src/cli/controller/context-pack.ts +785 -469
- package/src/cli/controller/launch-agents.ts +77 -2
- package/src/cli/controller/operational-plan.ts +2 -2
- package/src/cli/controller/work-mode.ts +6 -4
- package/src/cli/editing/edit-session.ts +60 -7
- package/src/cli/github/github.ts +133 -0
- package/src/cli/installer/managed-entries.ts +15 -1
- package/src/cli/local-bridge/console-automations.ts +54 -78
- package/src/cli/local-bridge/console-view-models.ts +1 -35
- package/src/cli/local-bridge/facade-api.ts +0 -217
- package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
- package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
- package/src/cli/local-bridge/frontend/src/styles.css +1 -1
- package/src/cli/local-bridge/frontend/src/types.ts +5 -8
- package/src/cli/local-bridge/job-store.ts +1 -490
- package/src/cli/local-bridge/server.ts +0 -513
- package/src/cli/local-bridge/ui-dist/app.css +1 -1
- package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
- package/src/cli/mcp/auth.ts +5 -5
- package/src/cli/mcp/instructions.ts +3 -2
- package/src/cli/mcp/legacy-tool-service.ts +0 -189
- package/src/cli/mcp/multi-repository.ts +16 -5
- package/src/cli/mcp/oauth.ts +175 -26
- package/src/cli/mcp/repository-tools.ts +247 -107
- package/src/cli/mcp/server.ts +537 -111
- package/src/cli/mcp/tool-capability-cache.ts +1 -1
- package/src/cli/mcp/toolset-selection.ts +1 -1
- package/src/cli/mcp/toolset.ts +42 -5
- package/src/cli/mcp/transports/http.ts +101 -14
- package/src/cli/mcp/transports/session-registry.ts +43 -5
- package/src/cli/mcp/types.ts +3 -3
- package/src/cli/repositories/command-classifier.ts +101 -19
- package/src/cli/repositories/command-executor.ts +55 -521
- package/src/cli/repositories/command-process.ts +108 -0
- package/src/cli/repositories/command-scope.ts +99 -41
- package/src/cli/repositories/controller-home.ts +7 -8
- package/src/cli/repositories/git-command-executor.ts +2 -0
- package/src/cli/repositories/locks.ts +53 -16
- package/src/cli/repositories/repository-snapshot.ts +121 -0
- package/src/cli/repositories/selected-path-actions.ts +17 -9
- package/src/cli/repositories/structured-git.ts +61 -3
- package/src/cli/repository/inspector.ts +553 -63
- package/src/cli/repository/session-cache.ts +58 -17
- package/src/cli/v81-entry.ts +1 -4
- package/src/effects/fs-transaction.ts +85 -17
- package/src/runtime/context/codegraph-read-provider.ts +233 -2
- package/src/runtime/context/codegraph-sidecar.cjs +74 -40
- package/src/runtime/context/generic-lsp-provider.ts +355 -0
- package/src/runtime/context/lsp-client.ts +283 -0
- package/src/runtime/context/semantic-navigation.ts +275 -0
- package/src/runtime/context/swift-navigation.ts +565 -0
- package/src/runtime/context/typescript-navigation.ts +226 -0
- package/src/runtime/control-plane/dispatch-priority.ts +28 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +47 -8
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
- package/src/runtime/control-plane/execution/session-store.ts +18 -0
- package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
- package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
- package/src/runtime/control-plane/execution/work-task-receipt.ts +54 -11
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +143 -8
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +85 -8
- package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
- package/src/runtime/control-plane/facade/controller-round-relay.ts +991 -0
- package/src/runtime/control-plane/facade/controller-session-store.ts +132 -1
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +2 -0
- package/src/runtime/control-plane/facade/goal-workloop.ts +686 -129
- package/src/runtime/control-plane/facade/index.ts +1 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +185 -20
- package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
- package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
- package/src/runtime/control-plane/facade/types.ts +22 -5
- package/src/runtime/control-plane/facade/work-contract-store.ts +175 -73
- package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
- package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
- package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +145 -0
- package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +273 -542
- package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
- package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
- package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
- package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
- package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
- package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
- package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +50 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +355 -116
- package/src/runtime/control-plane/launcher/launch-reservation-store.ts +40 -0
- package/src/runtime/control-plane/launcher/thin-launcher.ts +194 -10
- package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
- package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
- package/src/runtime/control-plane/release-retention.ts +62 -2
- package/src/runtime/control-plane/routing/route-policy.ts +7 -16
- package/src/runtime/control-plane/runtime-status-client.ts +0 -2
- package/src/runtime/diagnostics/mcp-timing.ts +13 -0
- package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
- package/src/runtime/diagnostics/performance.ts +24 -1
- package/src/runtime/evidence/event-ledger.ts +1 -1
- package/src/runtime/execution/jobs/store.ts +58 -4
- package/src/runtime/execution/jobs/types.ts +1 -1
- package/src/runtime/execution/managed-workspace.ts +203 -1
- package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
- package/src/runtime/execution/process-runtime/check-result.ts +53 -0
- package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +345 -40
- package/src/runtime/execution/process-runtime/gc.ts +38 -6
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
- package/src/runtime/execution/process-runtime/persisted-check.ts +47 -4
- package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
- package/src/runtime/execution/process-runtime/runtime.ts +43 -3
- package/src/runtime/execution/process-runtime/store.ts +1 -0
- package/src/runtime/execution/process-runtime/types.ts +2 -0
- package/src/runtime/execution/thin-harness/async-process.ts +12 -2
- package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
- package/src/runtime/execution/workers/executor.ts +0 -48
- package/src/runtime/gateway/mcp/execution-tools.ts +1192 -114
- package/src/runtime/gateway/mcp/process-tools.ts +83 -37
- package/src/runtime/gateway/mcp/router.ts +184 -82
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +2224 -1589
- package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
- package/src/runtime/plugins/browser-adapter.ts +2901 -241
- package/src/runtime/plugins/browser-automation-service.ts +10 -0
- package/src/runtime/plugins/browser-handoff.ts +92 -2
- package/src/runtime/plugins/browser-macos-bridge.ts +582 -49
- package/src/runtime/plugins/browser-node-bridge.ts +6 -34
- package/src/runtime/plugins/browser-provider-registry.ts +109 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +152 -0
- package/src/runtime/plugins/browser-runtime.ts +183 -0
- package/src/runtime/plugins/browser-session-authority.ts +332 -0
- package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +8 -2
- package/src/runtime/plugins/external-adapter.ts +324 -3
- package/src/runtime/plugins/external-unix-socket.ts +7 -1
- package/src/runtime/plugins/first-party-registry.ts +2 -0
- package/src/runtime/plugins/github-adapter.ts +125 -0
- package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
- package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
- package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
- package/src/runtime/plugins/ios-adapter.ts +106 -16
- package/src/runtime/plugins/ios-agent-device.ts +234 -64
- package/src/runtime/plugins/ios-physical-device.ts +1143 -392
- package/src/runtime/plugins/lightweight-action.ts +153 -0
- package/src/runtime/plugins/local-system-adapter.ts +123 -6
- package/src/runtime/plugins/macos-capability-broker.ts +55 -9
- package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
- package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
- package/src/runtime/plugins/resend-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +269 -29
- package/src/runtime/plugins/types.ts +35 -2
- package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
- package/src/runtime/projections/git-status-sampler.ts +16 -16
- package/src/runtime/projections/materialized-view.ts +28 -10
- package/src/runtime/recovery/maintenance-executor.ts +393 -28
- package/src/runtime/root/mcp-transport.ts +180 -10
- package/src/runtime/root/package-connector-service.ts +186 -8
- package/src/runtime/root/package-runtime-release.ts +143 -17
- package/src/runtime/root/package-runtime-service.ts +430 -22
- package/src/runtime/root/release-manifest.ts +7 -2
- package/src/runtime/root/release-materialize.ts +19 -0
- package/src/runtime/root/release-store.ts +48 -11
- package/src/runtime/root/runtime.ts +23 -5
- package/src/runtime/root/service.ts +100 -29
- package/src/runtime/root/types.ts +2 -0
- package/src/runtime/safe-tooling/ios-development.ts +321 -63
- package/src/runtime/shared/trusted-executable.ts +62 -0
- package/src/runtime/shared/trusted-node-executable.ts +48 -0
- package/src/runtime/standalone-recovery/core.ts +700 -92
- package/src/runtime/standalone-recovery/entry.ts +99 -23
- package/src/runtime/standalone-recovery/installer.ts +19 -3
- package/src/runtime/standalone-recovery/service-labels.ts +2 -0
- package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
- package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
- package/src/runtime/workflow/schedules/engine.ts +287 -151
- package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
- package/src/runtime/workflow/schedules/settlement.ts +48 -4
- package/src/runtime/workflow/schedules/store.ts +131 -10
- package/src/runtime/workflow/schedules/types.ts +2 -4
- package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
- package/src/testing/test-governance.ts +8 -40
- package/assets/reference-configs/heartbeat-triage.md +0 -57
- package/assets/templates/helpers/harness-trace-grade.sh +0 -150
- package/assets/templates/helpers/heartbeat-triage.sh +0 -361
- package/assets/templates/helpers/maintenance-triage.sh +0 -167
- package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
- package/docs/architecture/current/architecture-invariants.md +0 -331
- package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
- package/docs/architecture/current/codegraph-context-provider.md +0 -238
- package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
- package/docs/architecture/current/controller-repository-decoupling.md +0 -148
- package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
- package/docs/architecture/current/entity-model.md +0 -612
- package/docs/architecture/current/external-plugin-governance.md +0 -396
- package/docs/architecture/current/failure-recovery.md +0 -447
- package/docs/architecture/current/governance.md +0 -213
- package/docs/architecture/current/human-interaction-plane.md +0 -87
- package/docs/architecture/current/implementation-status.md +0 -128
- package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
- package/docs/architecture/current/legacy-governance.md +0 -58
- package/docs/architecture/current/local-workspace-target-grants.md +0 -70
- package/docs/architecture/current/migration-roadmap.md +0 -105
- package/docs/architecture/current/multi-repository-execution.md +0 -371
- package/docs/architecture/current/operations-runbook.md +0 -45
- package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
- package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
- package/docs/architecture/current/repository-access-modes.md +0 -102
- package/docs/architecture/current/route-policy.md +0 -15
- package/docs/architecture/current/route-session-concurrency.md +0 -85
- package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
- package/docs/architecture/current/runtime-directory-map.md +0 -49
- package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
- package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
- package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
- package/docs/architecture/current/system-overview.md +0 -169
- package/docs/architecture/current/target-requirements-traceability.md +0 -202
- package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
- package/docs/architecture/current/thin-harness-v1.md +0 -321
- package/docs/architecture/current/verification-and-release-gates.md +0 -391
- package/docs/forge-autonomous-goal-loop.md +0 -9
- package/docs/forge-provider-configuration.md +0 -7
- package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
- package/docs/operations/gmail-assistant-routines.md +0 -186
- package/docs/operations/personal-assistant-operator-guide.md +0 -61
- package/docs/operations/provider-configuration.md +0 -31
- package/scripts/harness-trace-grade.sh +0 -150
- package/scripts/heartbeat-triage.sh +0 -361
- package/scripts/maintenance-triage.sh +0 -167
- package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
- package/src/cli/repositories/goal-registry.ts +0 -239
- package/src/runtime/assistant/action-proposals.ts +0 -279
- package/src/runtime/assistant/intent.ts +0 -395
- package/src/runtime/assistant/model-provider.ts +0 -460
- package/src/runtime/assistant/openapi.ts +0 -223
- package/src/runtime/assistant/policy.ts +0 -89
- package/src/runtime/assistant/readiness.ts +0 -258
- package/src/runtime/assistant/routine-runtime.ts +0 -477
- package/src/runtime/assistant/schedule-binding.ts +0 -171
- package/src/runtime/assistant/standing-grants.ts +0 -375
- package/src/runtime/assistant/store.ts +0 -243
- package/src/runtime/assistant/types.ts +0 -135
- package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
- package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
- package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
- package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
- package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
- package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
- package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
- package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
- package/src/runtime/control-plane/goal-loop/index.ts +0 -13
- package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
- package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
- package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
- package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
- package/src/runtime/control-plane/goal-loop/types.ts +0 -378
- package/src/runtime/control-plane/startup-recovery.ts +0 -198
- package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
- package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
- package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
- package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
- package/src/runtime/workflow/findings/store.ts +0 -204
- package/src/runtime/workflow/findings/types.ts +0 -58
- package/src/runtime/workflow/portfolio/engine.ts +0 -20
- package/src/runtime/workflow/portfolio/store.ts +0 -185
- package/src/runtime/workflow/portfolio/types.ts +0 -29
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import type { RepositoryRecord } from '../repositories/types';
|
|
2
|
-
import { listAssistantRoutines } from '../../runtime/assistant/store';
|
|
3
|
-
import { runAssistantRoutineNow } from '../../runtime/assistant/intent';
|
|
4
|
-
import { getAssistantRoutineScheduleBinding, updateAssistantRoutineLifecycle } from '../../runtime/assistant/schedule-binding';
|
|
5
2
|
import { getWorkContract } from '../../runtime/control-plane/facade';
|
|
6
3
|
import { evaluateSchedule } from '../../runtime/workflow/schedules/engine';
|
|
7
4
|
import { getSchedule, listOccurrences, listSchedules, saveSchedule } from '../../runtime/workflow/schedules/store';
|
|
8
5
|
import type { RepositorySchedule, ScheduleOccurrence } from '../../runtime/workflow/schedules/types';
|
|
9
6
|
|
|
10
|
-
export type ConsoleAutomationMode = 'browser_watch' | 'browser_keepalive' | 'continuation' | '
|
|
7
|
+
export type ConsoleAutomationMode = 'browser_watch' | 'browser_keepalive' | 'continuation' | 'schedule';
|
|
11
8
|
|
|
12
9
|
export interface ConsoleAutomationHistoryView {
|
|
13
10
|
id: string;
|
|
@@ -20,12 +17,12 @@ export interface ConsoleAutomationHistoryView {
|
|
|
20
17
|
|
|
21
18
|
export interface ConsoleAutomationView {
|
|
22
19
|
id: string;
|
|
23
|
-
source: 'schedule'
|
|
20
|
+
source: 'schedule';
|
|
24
21
|
repoId: string;
|
|
25
22
|
repositoryName: string;
|
|
26
23
|
name: string;
|
|
27
24
|
summary?: string;
|
|
28
|
-
status: 'enabled' | 'paused' | 'attention' | 'disabled';
|
|
25
|
+
status: 'enabled' | 'paused' | 'attention' | 'completed' | 'disabled';
|
|
29
26
|
schedule: string;
|
|
30
27
|
timezone?: string;
|
|
31
28
|
delivery?: string;
|
|
@@ -46,24 +43,34 @@ export interface ConsoleAutomationView {
|
|
|
46
43
|
lastResult?: string;
|
|
47
44
|
nextRunHint?: string;
|
|
48
45
|
pausedReason?: string;
|
|
46
|
+
attentionMessage?: string;
|
|
49
47
|
history: ConsoleAutomationHistoryView[];
|
|
50
48
|
actions: Array<'run' | 'pause' | 'resume'>;
|
|
51
49
|
}
|
|
52
50
|
|
|
53
|
-
function
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
51
|
+
function cronLabel(expression?: string): string | undefined {
|
|
52
|
+
const value = expression?.trim() ?? '';
|
|
53
|
+
const daily = /^(\d{1,2})\s+(\d{1,2})\s+\*\s+\*\s+\*$/.exec(value);
|
|
54
|
+
if (daily) {
|
|
55
|
+
const minute = Number(daily[1]);
|
|
56
|
+
const hour = Number(daily[2]);
|
|
57
|
+
if (minute <= 59 && hour <= 23) return `每天 ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}`;
|
|
58
|
+
}
|
|
59
|
+
const hourly = /^(\d{1,2})\s+\*\s+\*\s+\*\s+\*$/.exec(value);
|
|
60
|
+
if (hourly) {
|
|
61
|
+
const minute = Number(hourly[1]);
|
|
62
|
+
if (minute <= 59) return minute === 0 ? '每小时整点' : `每小时 ${String(minute).padStart(2, '0')} 分`;
|
|
63
|
+
}
|
|
64
|
+
const everyMinutes = /^\*\/(\d{1,2})\s+\*\s+\*\s+\*\s+\*$/.exec(value);
|
|
65
|
+
if (everyMinutes && Number(everyMinutes[1]) > 0) return `每 ${Number(everyMinutes[1])} 分钟`;
|
|
66
|
+
return undefined;
|
|
60
67
|
}
|
|
61
68
|
|
|
62
69
|
function triggerLabel(schedule: RepositorySchedule): string {
|
|
63
70
|
const trigger = schedule.trigger;
|
|
64
71
|
switch (trigger.type) {
|
|
65
72
|
case 'interval': return `每 ${trigger.everyMinutes ?? '?'} 分钟`;
|
|
66
|
-
case 'cron': return
|
|
73
|
+
case 'cron': return cronLabel(trigger.cronExpression) ?? '自定义时间计划';
|
|
67
74
|
case 'calendar': return trigger.calendarAt ? `单次 · ${trigger.calendarAt}` : '指定时间';
|
|
68
75
|
case 'condition': return `条件满足时 · ${trigger.condition?.kind ?? 'condition'}`;
|
|
69
76
|
case 'repository-event': return `仓库事件 · ${trigger.eventName ?? 'repository event'}`;
|
|
@@ -83,16 +90,11 @@ function nextScheduleHint(schedule: RepositorySchedule): string | undefined {
|
|
|
83
90
|
return next > Date.now() ? new Date(next).toISOString() : '下一次调度周期';
|
|
84
91
|
}
|
|
85
92
|
}
|
|
86
|
-
if (schedule.trigger.type === 'cron') return
|
|
87
|
-
if (schedule.trigger.type === 'condition') return '
|
|
93
|
+
if (schedule.trigger.type === 'cron') return cronLabel(schedule.trigger.cronExpression) ?? '按自定义时间计划';
|
|
94
|
+
if (schedule.trigger.type === 'condition') return '等待条件满足';
|
|
88
95
|
return undefined;
|
|
89
96
|
}
|
|
90
97
|
|
|
91
|
-
function safeBoundSchedule(controllerHome: string, repoId: string, scheduleId?: string): RepositorySchedule | undefined {
|
|
92
|
-
if (!scheduleId) return undefined;
|
|
93
|
-
try { return getSchedule(controllerHome, repoId, scheduleId); } catch { return undefined; }
|
|
94
|
-
}
|
|
95
|
-
|
|
96
98
|
function occurrenceResult(occurrence?: ScheduleOccurrence): string | undefined {
|
|
97
99
|
if (!occurrence) return undefined;
|
|
98
100
|
if (occurrence.decision === 'nothing_to_do') return '无变化';
|
|
@@ -137,7 +139,6 @@ function occurrenceHistory(occurrences: ScheduleOccurrence[]): ConsoleAutomation
|
|
|
137
139
|
|
|
138
140
|
function scheduleMode(schedule: RepositorySchedule): ConsoleAutomationMode {
|
|
139
141
|
if (schedule.action.operation === 'external_controller_wake') return 'continuation';
|
|
140
|
-
if (schedule.action.operation === 'chatgpt_browser_prompt') return 'chatgpt_prompt';
|
|
141
142
|
if (schedule.action.operation === 'browser_probe') return schedule.action.arguments?.keepalive_only === true ? 'browser_keepalive' : 'browser_watch';
|
|
142
143
|
return 'schedule';
|
|
143
144
|
}
|
|
@@ -146,8 +147,6 @@ function modeLabel(mode: ConsoleAutomationMode): string {
|
|
|
146
147
|
if (mode === 'browser_watch') return '网页变更监听';
|
|
147
148
|
if (mode === 'browser_keepalive') return '登录保活';
|
|
148
149
|
if (mode === 'continuation') return '自动继续 Work';
|
|
149
|
-
if (mode === 'chatgpt_prompt') return 'ChatGPT 自动任务';
|
|
150
|
-
if (mode === 'routine') return '助手例行任务';
|
|
151
150
|
return '自动任务';
|
|
152
151
|
}
|
|
153
152
|
|
|
@@ -155,7 +154,6 @@ function scheduleSummary(mode: ConsoleAutomationMode): string {
|
|
|
155
154
|
if (mode === 'browser_watch') return '静默观察目标页面;只有内容发生变化时才恢复 ChatGPT。';
|
|
156
155
|
if (mode === 'browser_keepalive') return '静默刷新登录态;正常时不打扰,认证失效时再恢复 ChatGPT。';
|
|
157
156
|
if (mode === 'continuation') return '按计划恢复绑定的 Work,让外部 Controller 继续未完成目标。';
|
|
158
|
-
if (mode === 'chatgpt_prompt') return '由 Forge 定时唤醒 ChatGPT 执行保存的任务提示,不占用 ChatGPT Schedule 名额。';
|
|
159
157
|
return '由 Forge Schedule Engine 管理的持久自动任务。';
|
|
160
158
|
}
|
|
161
159
|
|
|
@@ -164,12 +162,11 @@ function scheduleDelivery(schedule: RepositorySchedule, mode: ConsoleAutomationM
|
|
|
164
162
|
if (mode === 'browser_watch') return `变化时唤醒 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
|
|
165
163
|
if (mode === 'browser_keepalive') return `登录失效时唤醒 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
|
|
166
164
|
if (mode === 'continuation') return `恢复 ${controller === 'chatgpt' ? 'ChatGPT' : controller}`;
|
|
167
|
-
if (mode === 'chatgpt_prompt') return '发送到 ChatGPT';
|
|
168
165
|
return undefined;
|
|
169
166
|
}
|
|
170
167
|
|
|
171
168
|
function chatgptExecutionProfile(schedule: RepositorySchedule, mode: ConsoleAutomationMode): { agentModel?: string; reasoningLevel?: string; tabPolicy?: string } {
|
|
172
|
-
if (mode !== 'continuation'
|
|
169
|
+
if (mode !== 'continuation') return {};
|
|
173
170
|
const args = schedule.action.arguments ?? {};
|
|
174
171
|
const controller = typeof args.controller_type === 'string' ? args.controller_type : 'chatgpt';
|
|
175
172
|
if (mode === 'continuation' && controller !== 'chatgpt') return {};
|
|
@@ -207,17 +204,34 @@ function scheduleNeedsAttention(schedule: RepositorySchedule): boolean {
|
|
|
207
204
|
return Boolean(schedule.pausedReason && /(?:fail|error|auth|login|block|attention|maximum)/i.test(schedule.pausedReason));
|
|
208
205
|
}
|
|
209
206
|
|
|
210
|
-
function scheduleStatus(schedule: RepositorySchedule): ConsoleAutomationView['status'] {
|
|
207
|
+
function scheduleStatus(schedule: RepositorySchedule, workStatus?: string): ConsoleAutomationView['status'] {
|
|
208
|
+
if (workStatus === 'completed' || /is terminal \(completed\)/i.test(schedule.pausedReason ?? '')) return 'completed';
|
|
209
|
+
if (workStatus === 'failed') return 'attention';
|
|
211
210
|
if (schedule.enabled) return scheduleNeedsAttention(schedule) ? 'attention' : 'enabled';
|
|
212
211
|
return scheduleNeedsAttention(schedule) ? 'attention' : 'paused';
|
|
213
212
|
}
|
|
214
213
|
|
|
215
|
-
function workBinding(controllerHome: string, repoId: string, schedule: RepositorySchedule): { id?: string; objective?: string } {
|
|
214
|
+
function workBinding(controllerHome: string, repoId: string, schedule: RepositorySchedule): { id?: string; objective?: string; status?: string } {
|
|
216
215
|
const value = schedule.action.arguments?.work_id;
|
|
217
216
|
const workId = typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
218
217
|
if (!workId) return {};
|
|
219
218
|
const work = getWorkContract({ controllerHome, repoId }, workId);
|
|
220
|
-
return { id: workId, objective: work?.objective };
|
|
219
|
+
return { id: workId, objective: work?.objective, status: work?.status };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function displayPauseReason(schedule: RepositorySchedule, workStatus?: string): string | undefined {
|
|
223
|
+
if (workStatus === 'completed' || /is terminal \(completed\)/i.test(schedule.pausedReason ?? '')) return '关联工作已经完成,这个自动任务不会再触发。';
|
|
224
|
+
if (schedule.lastObservationStatus === 'auth_required') return '目标登录状态已失效,完成重新登录后即可恢复。';
|
|
225
|
+
if (schedule.consecutiveFailures >= schedule.policy.maxFailures || /maximum consecutive failures/i.test(schedule.pausedReason ?? '')) return '连续执行失败达到上限,已自动暂停。修复问题后可以恢复任务。';
|
|
226
|
+
if (/canary completed/i.test(schedule.pausedReason ?? '')) return '验收任务已经完成。';
|
|
227
|
+
return schedule.pausedReason;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function attentionMessage(schedule: RepositorySchedule, workStatus?: string): string | undefined {
|
|
231
|
+
if (schedule.lastObservationStatus === 'auth_required') return '需要重新登录后才能继续自动执行。';
|
|
232
|
+
if (workStatus === 'failed') return '关联工作执行失败,需要检查失败原因后再恢复。';
|
|
233
|
+
if (schedule.consecutiveFailures >= schedule.policy.maxFailures) return '连续执行失败达到上限,任务已自动暂停。';
|
|
234
|
+
return undefined;
|
|
221
235
|
}
|
|
222
236
|
|
|
223
237
|
function policySummary(schedule: RepositorySchedule): string {
|
|
@@ -227,12 +241,9 @@ function policySummary(schedule: RepositorySchedule): string {
|
|
|
227
241
|
export function listConsoleAutomations(controllerHome: string, repositories: RepositoryRecord[]): ConsoleAutomationView[] {
|
|
228
242
|
const items: ConsoleAutomationView[] = [];
|
|
229
243
|
for (const repository of repositories.filter((entry) => entry.enabled && !entry.removedAt)) {
|
|
230
|
-
const routines = listAssistantRoutines(repository.canonicalRoot).routines;
|
|
231
|
-
const bindings = new Map(routines.map((routine) => [routine.routineId, getAssistantRoutineScheduleBinding(repository.canonicalRoot, routine.routineId)]));
|
|
232
|
-
const boundScheduleIds = new Set([...bindings.values()].flatMap((binding) => binding ? [binding.scheduleId] : []));
|
|
233
|
-
|
|
234
244
|
for (const schedule of listSchedules(controllerHome, repository.repoId)) {
|
|
235
|
-
if (
|
|
245
|
+
if (schedule.action.operation === 'chatgpt_browser_prompt') continue;
|
|
246
|
+
if (schedule.action.operation === 'assistant_routine_execute') continue;
|
|
236
247
|
const occurrences = listOccurrences(controllerHome, repository.repoId, schedule.scheduleId, 8);
|
|
237
248
|
const last = occurrences[0];
|
|
238
249
|
const mode = scheduleMode(schedule);
|
|
@@ -245,7 +256,7 @@ export function listConsoleAutomations(controllerHome: string, repositories: Rep
|
|
|
245
256
|
repositoryName: repository.displayName,
|
|
246
257
|
name: schedule.name,
|
|
247
258
|
summary: scheduleSummary(mode),
|
|
248
|
-
status: scheduleStatus(schedule),
|
|
259
|
+
status: scheduleStatus(schedule, work.status),
|
|
249
260
|
schedule: triggerLabel(schedule),
|
|
250
261
|
timezone: schedule.trigger.timezone,
|
|
251
262
|
delivery: scheduleDelivery(schedule, mode),
|
|
@@ -263,45 +274,13 @@ export function listConsoleAutomations(controllerHome: string, repositories: Rep
|
|
|
263
274
|
lastRunAt: last?.updatedAt ?? schedule.lastTriggeredAt,
|
|
264
275
|
lastResult: observationResult(schedule, last),
|
|
265
276
|
nextRunHint: nextScheduleHint(schedule),
|
|
266
|
-
pausedReason: schedule.
|
|
277
|
+
pausedReason: displayPauseReason(schedule, work.status),
|
|
278
|
+
attentionMessage: attentionMessage(schedule, work.status),
|
|
267
279
|
history: occurrenceHistory(occurrences),
|
|
268
|
-
actions: schedule.enabled ? ['run', 'pause'] : ['resume'],
|
|
280
|
+
actions: scheduleStatus(schedule, work.status) === 'completed' ? [] : schedule.enabled ? ['run', 'pause'] : ['resume'],
|
|
269
281
|
});
|
|
270
282
|
}
|
|
271
283
|
|
|
272
|
-
for (const routine of routines) {
|
|
273
|
-
const binding = bindings.get(routine.routineId);
|
|
274
|
-
const boundSchedule = safeBoundSchedule(controllerHome, repository.repoId, binding?.scheduleId);
|
|
275
|
-
const occurrences = boundSchedule ? listOccurrences(controllerHome, repository.repoId, boundSchedule.scheduleId, 8) : [];
|
|
276
|
-
const last = occurrences[0];
|
|
277
|
-
const scheduleAttention = routine.status === 'enabled' && boundSchedule && scheduleNeedsAttention(boundSchedule);
|
|
278
|
-
const status: ConsoleAutomationView['status'] = scheduleAttention ? 'attention' : routine.status === 'enabled' ? 'enabled' : routine.status === 'paused' ? 'paused' : 'disabled';
|
|
279
|
-
items.push({
|
|
280
|
-
id: routine.routineId,
|
|
281
|
-
source: 'routine',
|
|
282
|
-
repoId: repository.repoId,
|
|
283
|
-
repositoryName: repository.displayName,
|
|
284
|
-
name: routine.name,
|
|
285
|
-
summary: routine.naturalLanguageGoal,
|
|
286
|
-
status,
|
|
287
|
-
schedule: routine.scheduleText,
|
|
288
|
-
timezone: routine.timezone,
|
|
289
|
-
delivery: routine.output === 'assistant_inbox' ? 'ChatGPT 助手收件箱' : routine.output === 'gmail_draft' ? 'Gmail 草稿' : '不外发',
|
|
290
|
-
mode: 'routine',
|
|
291
|
-
modeLabel: modeLabel('routine'),
|
|
292
|
-
live: boundSchedule ? !boundSchedule.policy.shadowMode : undefined,
|
|
293
|
-
observationStatus: boundSchedule?.lastObservationStatus,
|
|
294
|
-
observationAt: boundSchedule?.lastObservationAt,
|
|
295
|
-
failureCount: boundSchedule?.consecutiveFailures,
|
|
296
|
-
policySummary: boundSchedule ? policySummary(boundSchedule) : undefined,
|
|
297
|
-
lastRunAt: last?.updatedAt ?? routine.lastRunAt,
|
|
298
|
-
lastResult: boundSchedule ? observationResult(boundSchedule, last) : occurrenceResult(last) ?? (routine.lastRunAt ? '已触发' : undefined),
|
|
299
|
-
nextRunHint: boundSchedule ? nextScheduleHint(boundSchedule) : routine.nextRunHint,
|
|
300
|
-
pausedReason: boundSchedule?.pausedReason,
|
|
301
|
-
history: occurrenceHistory(occurrences),
|
|
302
|
-
actions: scheduleAttention ? ['resume'] : routine.status === 'enabled' ? ['run', 'pause'] : routine.status === 'paused' ? ['resume'] : [],
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
284
|
}
|
|
306
285
|
return items.sort((a, b) => a.name.localeCompare(b.name));
|
|
307
286
|
}
|
|
@@ -311,6 +290,7 @@ export function summarizeConsoleAutomations(items: ConsoleAutomationView[]) {
|
|
|
311
290
|
total: items.length,
|
|
312
291
|
enabled: items.filter((item) => item.status === 'enabled').length,
|
|
313
292
|
paused: items.filter((item) => item.status === 'paused' || item.status === 'disabled').length,
|
|
293
|
+
completed: items.filter((item) => item.status === 'completed').length,
|
|
314
294
|
needsAttention: items.filter((item) => item.status === 'attention').length,
|
|
315
295
|
};
|
|
316
296
|
}
|
|
@@ -325,16 +305,12 @@ export async function applyConsoleAutomationAction(
|
|
|
325
305
|
): Promise<unknown> {
|
|
326
306
|
const repository = repositories.find((entry) => entry.repoId === repoId && entry.enabled && !entry.removedAt);
|
|
327
307
|
if (!repository) throw new Error(`REPOSITORY_NOT_FOUND: ${repoId}`);
|
|
328
|
-
if (source === 'routine') {
|
|
329
|
-
if (action === 'run') return runAssistantRoutineNow(controllerHome, repository, id);
|
|
330
|
-
if (action === 'pause') return updateAssistantRoutineLifecycle(controllerHome, repository, id, 'paused');
|
|
331
|
-
if (action === 'resume') return updateAssistantRoutineLifecycle(controllerHome, repository, id, 'enabled');
|
|
332
|
-
throw new Error(`AUTOMATION_ACTION_UNSUPPORTED: routine/${action}`);
|
|
333
|
-
}
|
|
334
308
|
if (source === 'schedule') {
|
|
335
309
|
const schedule = getSchedule(controllerHome, repoId, id);
|
|
310
|
+
if (schedule.action.operation === 'chatgpt_browser_prompt') throw new Error('RETIRED_WORK_FREE_PROMPT_SCHEDULE');
|
|
311
|
+
if (schedule.action.operation === 'assistant_routine_execute') throw new Error('RETIRED_PERSONAL_ASSISTANT_SCHEDULE');
|
|
336
312
|
if (action === 'pause') return saveSchedule(controllerHome, { ...schedule, enabled: false, pausedReason: undefined });
|
|
337
|
-
if (action === 'resume') return saveSchedule(controllerHome, { ...schedule, enabled: true, pausedReason: undefined, consecutiveFailures: 0 });
|
|
313
|
+
if (action === 'resume') return saveSchedule(controllerHome, { ...schedule, enabled: true, pausedReason: undefined, consecutiveFailures: 0, consecutiveNoops: 0, nextEligibleAt: undefined });
|
|
338
314
|
if (action === 'run') return evaluateSchedule(controllerHome, schedule, true, { source: 'manual' });
|
|
339
315
|
throw new Error(`AUTOMATION_ACTION_UNSUPPORTED: schedule/${action}`);
|
|
340
316
|
}
|
|
@@ -251,7 +251,7 @@ export interface AccessStateViewModel {
|
|
|
251
251
|
configuredAccessModeLabel: string;
|
|
252
252
|
effectiveAccessMode: 'request' | 'full_access';
|
|
253
253
|
effectiveAccessModeLabel: string;
|
|
254
|
-
effectiveToolset: 'core' | 'advanced' | 'full';
|
|
254
|
+
effectiveToolset: 'facade' | 'core' | 'advanced' | 'full';
|
|
255
255
|
exposureRevision: number;
|
|
256
256
|
lastAppliedAt?: string;
|
|
257
257
|
source: string;
|
|
@@ -264,38 +264,6 @@ export interface AccessStateViewModel {
|
|
|
264
264
|
toolGroups: string[];
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
-
/** Compact autonomous goal-loop status for console / local-bridge (no raw internal dumps). */
|
|
268
|
-
export interface GoalLoopStatusViewModel {
|
|
269
|
-
activeCount: number;
|
|
270
|
-
goals: Array<{
|
|
271
|
-
title: string;
|
|
272
|
-
stage: string;
|
|
273
|
-
currentStep: string;
|
|
274
|
-
providerSelected?: string;
|
|
275
|
-
waitingReason?: string;
|
|
276
|
-
nextSafeAction?: string;
|
|
277
|
-
handoffPacketAvailable: boolean;
|
|
278
|
-
approvalRequired: boolean;
|
|
279
|
-
whyThisProvider?: string;
|
|
280
|
-
whatHappensNext?: string;
|
|
281
|
-
whatIsBlocked?: string;
|
|
282
|
-
}>;
|
|
283
|
-
invokableProviders: string[];
|
|
284
|
-
handoffOnlyProviders: string[];
|
|
285
|
-
providerHealth: Array<{
|
|
286
|
-
providerId: string;
|
|
287
|
-
status: string;
|
|
288
|
-
directDispatchAllowed: boolean;
|
|
289
|
-
handoffOnly: boolean;
|
|
290
|
-
summary: string;
|
|
291
|
-
}>;
|
|
292
|
-
/** Plain-language automation overview snippet. */
|
|
293
|
-
automationSummary?: string;
|
|
294
|
-
liveModelProvidersEffective?: boolean;
|
|
295
|
-
settingsPathHint?: string;
|
|
296
|
-
nextTickHint?: string;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
267
|
export interface CommandCenterViewModel {
|
|
300
268
|
schemaVersion: 1;
|
|
301
269
|
generatedAt: string;
|
|
@@ -309,8 +277,6 @@ export interface CommandCenterViewModel {
|
|
|
309
277
|
currentWork?: WorkSummaryViewModel;
|
|
310
278
|
recentWork: WorkSummaryViewModel[];
|
|
311
279
|
handoffs: HandoffCardViewModel[];
|
|
312
|
-
/** Autonomous goal loop surface (daemon-owned, above Issue/Task). */
|
|
313
|
-
goalLoop?: GoalLoopStatusViewModel;
|
|
314
280
|
/** Assistant/plugin capabilities available to the controller (not the primary workflow). */
|
|
315
281
|
pluginSummary: PluginSummaryViewModel;
|
|
316
282
|
plugins: PluginCardViewModel[];
|
|
@@ -80,7 +80,6 @@ import type {
|
|
|
80
80
|
CommandCenterViewModel,
|
|
81
81
|
ConnectorFreshnessViewModel,
|
|
82
82
|
ConsoleErrorViewModel,
|
|
83
|
-
GoalLoopStatusViewModel,
|
|
84
83
|
HandoffCardViewModel,
|
|
85
84
|
ModePreviewViewModel,
|
|
86
85
|
PlainStatusTone,
|
|
@@ -94,34 +93,6 @@ import type {
|
|
|
94
93
|
VerificationViewModel,
|
|
95
94
|
WorkSummaryViewModel,
|
|
96
95
|
} from './console-view-models';
|
|
97
|
-
import {
|
|
98
|
-
buildAutomationSettingsView,
|
|
99
|
-
executorRoutePreviewWithConfig,
|
|
100
|
-
executorRoutingConfigGet,
|
|
101
|
-
executorRoutingConfigReset,
|
|
102
|
-
executorRoutingConfigUpdate,
|
|
103
|
-
goalLoopPolicyGet,
|
|
104
|
-
goalLoopPolicyUpdate,
|
|
105
|
-
goalStatus as goalLoopStatusSnapshot,
|
|
106
|
-
localToolDisable,
|
|
107
|
-
localToolEnable,
|
|
108
|
-
localToolHealthCheck,
|
|
109
|
-
localToolList,
|
|
110
|
-
localToolConfigGet,
|
|
111
|
-
localToolConfigUpdate,
|
|
112
|
-
providerApiSettingsGet,
|
|
113
|
-
providerApiSettingsUpdate,
|
|
114
|
-
providerConfigGet,
|
|
115
|
-
providerConfigUpdate,
|
|
116
|
-
providerCredentialsStatus,
|
|
117
|
-
providerDisable,
|
|
118
|
-
providerEnable,
|
|
119
|
-
providerHealthCheck,
|
|
120
|
-
providerPriorityUpdate,
|
|
121
|
-
providerResetDefaults,
|
|
122
|
-
type ConfigFacadeContext,
|
|
123
|
-
type GoalLoopContext,
|
|
124
|
-
} from '../../runtime/control-plane/goal-loop';
|
|
125
96
|
import { listActiveOccurrences, listSchedules } from '../../runtime/workflow/schedules/store';
|
|
126
97
|
|
|
127
98
|
export type ConsoleFacadeContext = {
|
|
@@ -995,7 +966,6 @@ export async function buildCommandCenter(
|
|
|
995
966
|
const handoffs = listHandoffItems({ ...store(ctx), status: 'pending', limit: 20 }).map(mapHandoffCard);
|
|
996
967
|
const plugins = listConsolePlugins(ctx);
|
|
997
968
|
const pluginSummary = buildPluginSummary(plugins);
|
|
998
|
-
const goalLoop = buildGoalLoopStatusView(ctx);
|
|
999
969
|
const access = controllerAccessStateView(ctx);
|
|
1000
970
|
const banner = readiness.connectorFreshness?.severity === 'warning' || readiness.connectorFreshness?.severity === 'error'
|
|
1001
971
|
? readiness.connectorFreshness.summary
|
|
@@ -1014,7 +984,6 @@ export async function buildCommandCenter(
|
|
|
1014
984
|
currentWork: activeWork[0],
|
|
1015
985
|
recentWork: allRecent,
|
|
1016
986
|
handoffs,
|
|
1017
|
-
goalLoop,
|
|
1018
987
|
pluginSummary,
|
|
1019
988
|
plugins,
|
|
1020
989
|
modePreviewDefault: plainMode('direct_control'),
|
|
@@ -1031,192 +1000,6 @@ export async function buildCommandCenter(
|
|
|
1031
1000
|
};
|
|
1032
1001
|
}
|
|
1033
1002
|
|
|
1034
|
-
function configCtx(ctx: ConsoleFacadeContext): ConfigFacadeContext {
|
|
1035
|
-
return { controllerHome: ctx.controllerHome };
|
|
1036
|
-
}
|
|
1037
|
-
|
|
1038
|
-
export function buildGoalLoopStatusView(ctx: ConsoleFacadeContext): GoalLoopStatusViewModel {
|
|
1039
|
-
const goalCtx: GoalLoopContext = {
|
|
1040
|
-
goalStore: store(ctx),
|
|
1041
|
-
packetStore: store(ctx),
|
|
1042
|
-
repoId: ctx.repository.repoId,
|
|
1043
|
-
configLocation: { controllerHome: ctx.controllerHome },
|
|
1044
|
-
providerEnv: { configLocation: { controllerHome: ctx.controllerHome } },
|
|
1045
|
-
};
|
|
1046
|
-
const snapshot = goalLoopStatusSnapshot(goalCtx) as {
|
|
1047
|
-
activeGoals?: Array<Record<string, unknown>>;
|
|
1048
|
-
activeCount?: number;
|
|
1049
|
-
invokableProviders?: string[];
|
|
1050
|
-
handoffOnlyProviders?: string[];
|
|
1051
|
-
providers?: Array<Record<string, unknown>>;
|
|
1052
|
-
};
|
|
1053
|
-
let automationSummary: string | undefined;
|
|
1054
|
-
let liveEffective: boolean | undefined;
|
|
1055
|
-
try {
|
|
1056
|
-
const settings = buildAutomationSettingsView(configCtx(ctx));
|
|
1057
|
-
automationSummary = settings.overview.plainLanguageSummary;
|
|
1058
|
-
liveEffective = settings.overview.liveModelProvidersEffective;
|
|
1059
|
-
} catch {
|
|
1060
|
-
automationSummary = undefined;
|
|
1061
|
-
}
|
|
1062
|
-
|
|
1063
|
-
const goals = (snapshot.activeGoals ?? []).map((goal) => {
|
|
1064
|
-
const stage = String(goal.stage ?? '');
|
|
1065
|
-
const providerSelected = typeof goal.providerSelected === 'string' ? goal.providerSelected : undefined;
|
|
1066
|
-
const waitingReason = typeof goal.waitingReason === 'string' ? goal.waitingReason : undefined;
|
|
1067
|
-
const nextSafeAction = typeof goal.nextSafeAction === 'string' ? goal.nextSafeAction : undefined;
|
|
1068
|
-
const handoffPacketAvailable = goal.handoffPacketAvailable === true;
|
|
1069
|
-
return {
|
|
1070
|
-
title: String(goal.title ?? ''),
|
|
1071
|
-
stage,
|
|
1072
|
-
currentStep: String(goal.currentStep ?? ''),
|
|
1073
|
-
providerSelected,
|
|
1074
|
-
waitingReason,
|
|
1075
|
-
nextSafeAction,
|
|
1076
|
-
handoffPacketAvailable,
|
|
1077
|
-
approvalRequired: Boolean(waitingReason) || stage === 'waiting_for_user',
|
|
1078
|
-
whyThisProvider: providerSelected
|
|
1079
|
-
? `Last selected provider: ${providerSelected}`
|
|
1080
|
-
: 'No provider selected yet',
|
|
1081
|
-
whatHappensNext: nextSafeAction
|
|
1082
|
-
?? (handoffPacketAvailable
|
|
1083
|
-
? 'Open handoff packet or configure a direct provider'
|
|
1084
|
-
: 'Wait for next daemon tick or open Automation Settings'),
|
|
1085
|
-
whatIsBlocked: waitingReason
|
|
1086
|
-
?? (stage === 'handoff_ready'
|
|
1087
|
-
? 'Waiting for handoff supervisor (ChatGPT is not auto-invokable)'
|
|
1088
|
-
: undefined),
|
|
1089
|
-
};
|
|
1090
|
-
});
|
|
1091
|
-
return {
|
|
1092
|
-
activeCount: snapshot.activeCount ?? goals.length,
|
|
1093
|
-
goals,
|
|
1094
|
-
invokableProviders: snapshot.invokableProviders ?? [],
|
|
1095
|
-
handoffOnlyProviders: snapshot.handoffOnlyProviders ?? [],
|
|
1096
|
-
providerHealth: (snapshot.providers ?? []).map((provider) => ({
|
|
1097
|
-
providerId: String(provider.providerId ?? ''),
|
|
1098
|
-
status: String(provider.status ?? ''),
|
|
1099
|
-
directDispatchAllowed: provider.directDispatchAllowed === true,
|
|
1100
|
-
handoffOnly: provider.handoffOnly === true,
|
|
1101
|
-
summary: String(provider.summary ?? ''),
|
|
1102
|
-
})),
|
|
1103
|
-
automationSummary,
|
|
1104
|
-
liveModelProvidersEffective: liveEffective,
|
|
1105
|
-
settingsPathHint: 'Model & Tool Providers',
|
|
1106
|
-
nextTickHint: 'Daemon ticks active goals about every 5 seconds when the controller is running.',
|
|
1107
|
-
};
|
|
1108
|
-
}
|
|
1109
|
-
|
|
1110
|
-
export function getAutomationSettings(ctx: ConsoleFacadeContext) {
|
|
1111
|
-
return buildAutomationSettingsView(configCtx(ctx));
|
|
1112
|
-
}
|
|
1113
|
-
|
|
1114
|
-
export function consoleProviderConfigGet(ctx: ConsoleFacadeContext) {
|
|
1115
|
-
return providerConfigGet(configCtx(ctx));
|
|
1116
|
-
}
|
|
1117
|
-
|
|
1118
|
-
export function consoleProviderConfigUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
|
|
1119
|
-
return providerConfigUpdate(configCtx(ctx), body as unknown as Parameters<typeof providerConfigUpdate>[1]);
|
|
1120
|
-
}
|
|
1121
|
-
|
|
1122
|
-
export function consoleProviderEnable(ctx: ConsoleFacadeContext, providerId: string) {
|
|
1123
|
-
return providerEnable(configCtx(ctx), providerId);
|
|
1124
|
-
}
|
|
1125
|
-
|
|
1126
|
-
export function consoleProviderDisable(ctx: ConsoleFacadeContext, providerId: string) {
|
|
1127
|
-
return providerDisable(configCtx(ctx), providerId);
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
export function consoleProviderPriority(ctx: ConsoleFacadeContext, providerId: string, direction: 'up' | 'down' | number) {
|
|
1131
|
-
return providerPriorityUpdate(configCtx(ctx), providerId, direction);
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
export function consoleProviderHealth(ctx: ConsoleFacadeContext, providerId?: string) {
|
|
1135
|
-
return providerHealthCheck(configCtx(ctx), providerId);
|
|
1136
|
-
}
|
|
1137
|
-
|
|
1138
|
-
export function consoleProviderCredentials(ctx: ConsoleFacadeContext) {
|
|
1139
|
-
return providerCredentialsStatus(configCtx(ctx));
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
export function consoleProviderReset(ctx: ConsoleFacadeContext) {
|
|
1143
|
-
return providerResetDefaults(configCtx(ctx));
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
export function consoleProviderApiSettingsGet(ctx: ConsoleFacadeContext, providerId: string) {
|
|
1147
|
-
return providerApiSettingsGet(configCtx(ctx), providerId);
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
export function consoleProviderApiSettingsUpdate(
|
|
1151
|
-
ctx: ConsoleFacadeContext,
|
|
1152
|
-
providerId: string,
|
|
1153
|
-
body: Record<string, unknown>,
|
|
1154
|
-
) {
|
|
1155
|
-
return providerApiSettingsUpdate(configCtx(ctx), providerId, {
|
|
1156
|
-
baseUrl: typeof body.baseUrl === 'string' ? body.baseUrl : typeof body.base_url === 'string' ? body.base_url : undefined,
|
|
1157
|
-
model: typeof body.model === 'string' ? body.model : undefined,
|
|
1158
|
-
apiKey: typeof body.apiKey === 'string'
|
|
1159
|
-
? body.apiKey
|
|
1160
|
-
: typeof body.api_key === 'string'
|
|
1161
|
-
? body.api_key
|
|
1162
|
-
: undefined,
|
|
1163
|
-
clearApiKey: body.clearApiKey === true || body.clear_api_key === true,
|
|
1164
|
-
});
|
|
1165
|
-
}
|
|
1166
|
-
|
|
1167
|
-
export function consoleLocalToolList(ctx: ConsoleFacadeContext) {
|
|
1168
|
-
return localToolList(configCtx(ctx));
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
export function consoleLocalToolEnable(ctx: ConsoleFacadeContext, toolId: string) {
|
|
1172
|
-
return localToolEnable(configCtx(ctx), toolId);
|
|
1173
|
-
}
|
|
1174
|
-
|
|
1175
|
-
export function consoleLocalToolDisable(ctx: ConsoleFacadeContext, toolId: string) {
|
|
1176
|
-
return localToolDisable(configCtx(ctx), toolId);
|
|
1177
|
-
}
|
|
1178
|
-
|
|
1179
|
-
export function consoleLocalToolHealth(ctx: ConsoleFacadeContext, toolId?: string) {
|
|
1180
|
-
return localToolHealthCheck(configCtx(ctx), toolId);
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
export function consoleLocalToolConfigGet(ctx: ConsoleFacadeContext) {
|
|
1184
|
-
return localToolConfigGet(configCtx(ctx));
|
|
1185
|
-
}
|
|
1186
|
-
|
|
1187
|
-
export function consoleLocalToolConfigUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
|
|
1188
|
-
return localToolConfigUpdate(configCtx(ctx), body as unknown as Parameters<typeof localToolConfigUpdate>[1]);
|
|
1189
|
-
}
|
|
1190
|
-
|
|
1191
|
-
export function consoleRoutingGet(ctx: ConsoleFacadeContext) {
|
|
1192
|
-
return executorRoutingConfigGet(configCtx(ctx));
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
export function consoleRoutingUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
|
|
1196
|
-
return executorRoutingConfigUpdate(configCtx(ctx), body as unknown as Parameters<typeof executorRoutingConfigUpdate>[1]);
|
|
1197
|
-
}
|
|
1198
|
-
|
|
1199
|
-
export function consoleRoutingReset(ctx: ConsoleFacadeContext) {
|
|
1200
|
-
return executorRoutingConfigReset(configCtx(ctx));
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
export function consoleRoutePreview(ctx: ConsoleFacadeContext, body: Record<string, unknown> = {}) {
|
|
1204
|
-
return executorRoutePreviewWithConfig(configCtx(ctx), {
|
|
1205
|
-
taskIntent: typeof body.taskIntent === 'string' ? body.taskIntent as never : typeof body.task_intent === 'string' ? body.task_intent as never : undefined,
|
|
1206
|
-
risk: typeof body.risk === 'string' ? body.risk as never : undefined,
|
|
1207
|
-
objective: typeof body.objective === 'string' ? body.objective : undefined,
|
|
1208
|
-
externalWrite: body.externalWrite === true || body.external_write === true,
|
|
1209
|
-
});
|
|
1210
|
-
}
|
|
1211
|
-
|
|
1212
|
-
export function consoleGoalLoopPolicyGet(ctx: ConsoleFacadeContext) {
|
|
1213
|
-
return goalLoopPolicyGet(configCtx(ctx));
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
export function consoleGoalLoopPolicyUpdate(ctx: ConsoleFacadeContext, body: Record<string, unknown>) {
|
|
1217
|
-
return goalLoopPolicyUpdate(configCtx(ctx), body as unknown as Parameters<typeof goalLoopPolicyUpdate>[1]);
|
|
1218
|
-
}
|
|
1219
|
-
|
|
1220
1003
|
export function getConsoleAccessPolicy(ctx: ConsoleFacadeContext) {
|
|
1221
1004
|
const policy = readRepositoryAccessPolicy(ctx.controllerHome, ctx.repository.repoId);
|
|
1222
1005
|
return {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import{useCallback,useEffect,useState}from'react';import'./design/tokens.css';import'./styles.css';import type{AutomationView,ConsoleData,
|
|
2
|
-
async function loadData():Promise<ConsoleData>{const[commandCenter,work,workPortfolio,automations,
|
|
1
|
+
import{useCallback,useEffect,useState}from'react';import'./design/tokens.css';import'./styles.css';import type{AutomationView,ConsoleData,RouteId}from'./types';import{api}from'./lib/api';import{routeFromHash}from'./lib/routes';import{AppShell}from'./shell/AppShell';import{OverviewView}from'./features/overview/OverviewView';import{AutomationsView}from'./features/automations/AutomationsView';import{WorkView}from'./features/work/WorkView';import{CapabilitiesView}from'./features/capabilities/CapabilitiesView';import{RepositoriesView}from'./features/repositories/RepositoriesView';import{SystemView}from'./features/system/SystemView';
|
|
2
|
+
async function loadData():Promise<ConsoleData>{const[commandCenter,work,workPortfolio,automations,connector]=await Promise.all([api.commandCenter(),api.work(),api.workPortfolio(),api.automations(),api.connector().catch(()=>undefined)]);return{commandCenter,work,workPortfolio,automations,connector,generatedAt:new Date().toISOString()}}
|
|
3
3
|
export default function App(){const[route,setRoute]=useState<RouteId>(routeFromHash());const[data,setData]=useState<ConsoleData>();const[busy,setBusy]=useState(false);const[error,setError]=useState('');
|
|
4
4
|
const refresh=useCallback(async()=>{setBusy(true);setError('');try{setData(await loadData())}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}},[]);
|
|
5
5
|
useEffect(()=>{void refresh();const onHash=()=>setRoute(routeFromHash());addEventListener('hashchange',onHash);return()=>removeEventListener('hashchange',onHash)},[refresh]);
|
|
6
6
|
const mutate=useCallback(async(fn:()=>Promise<unknown>)=>{setBusy(true);try{await fn();setData(await loadData())}catch(e){setError(e instanceof Error?e.message:String(e))}finally{setBusy(false)}},[]);
|
|
7
7
|
if(!data)return <div className="boot-state"><span className="brand-mark">F</span><strong>{error?'Forge console unavailable':'Loading Forge…'}</strong>{error&&<><p>{error}</p><button className="button" onClick={()=>void refresh()}>Retry</button></>}</div>;
|
|
8
8
|
const common={data,busy,onRefresh:()=>void refresh()};let view;
|
|
9
|
-
switch(route){case'automations':view=<AutomationsView {...common} onAction={(a:AutomationView,action:'run'|'pause'|'resume')=>mutate(()=>api.automationAction(a.source,a.repoId,a.id,action))}/>;break;case'work':view=<WorkView {...common}/>;break;case'capabilities':view=<CapabilitiesView {...common}/>;break;case'repositories':view=<RepositoriesView {...common} onRegister={(p,n)=>mutate(()=>api.registerRepository(p,n))} onRemove={id=>mutate(()=>api.removeRepository(id))}/>;break;case'
|
|
9
|
+
switch(route){case'automations':view=<AutomationsView {...common} onAction={(a:AutomationView,action:'run'|'pause'|'resume')=>mutate(()=>api.automationAction(a.source,a.repoId,a.id,action))}/>;break;case'work':view=<WorkView {...common}/>;break;case'capabilities':view=<CapabilitiesView {...common}/>;break;case'repositories':view=<RepositoriesView {...common} onRegister={(p,n)=>mutate(()=>api.registerRepository(p,n))} onRemove={id=>mutate(()=>api.removeRepository(id))}/>;break;case'system':view=<SystemView {...common}/>;break;default:view=<OverviewView {...common}/>}
|
|
10
10
|
return <AppShell route={route}>{error&&<div className="global-error"><strong>Last action failed</strong><span>{error}</span><button onClick={()=>setError('')}>×</button></div>}{view}</AppShell>}
|