@moretea-labs/forge 1.5.1 → 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 +46 -0
- package/CLAUDE.md +2 -0
- package/DESIGN.md +7 -2
- package/README.md +4 -4
- package/README.zh-CN.md +2 -2
- 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/pre-edit-guard.sh +8 -39
- package/assets/hooks/prompt-guard.sh +7 -83
- 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 +54 -3
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/harness-overview.md +1 -1
- package/assets/reference-configs/hook-operations.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 +13 -38
- 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/sprint-backlog.sh +6 -6
- 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 +38 -22
- package/docs/operations/controller-performance-and-502.md +124 -0
- package/docs/operations/controller-reliability-runbook.md +1 -1
- package/docs/operations/features.md +3 -3
- 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/tutorials/01-install-and-start.md +1 -1
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/wiki/Architecture.md +6 -6
- package/docs/wiki/Implementation.md +2 -2
- package/docs/wiki/Installation.md +1 -1
- package/docs/wiki/Integrations.md +2 -2
- package/docs/wiki/Quick-Start.md +1 -1
- 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-public-docs.sh +14 -1
- 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-chatgpt-automation-schedules.ts +64 -0
- 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/sprint-backlog.sh +1 -1
- 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/chatgpt.ts +31 -2
- package/src/cli/commands/init-hook.ts +3 -3
- package/src/cli/commands/mcp.ts +9 -5
- package/src/cli/commands/plugin.ts +37 -10
- 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 +898 -430
- 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/hook/prompt-guard-decision.ts +17 -18
- package/src/cli/hook/prompt-intents.ts +1 -1
- package/src/cli/installer/managed-entries.ts +15 -1
- package/src/cli/local-bridge/console-automations.ts +225 -67
- package/src/cli/local-bridge/console-view-models.ts +3 -35
- package/src/cli/local-bridge/facade-api.ts +2 -217
- package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
- package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +153 -3
- package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
- package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +183 -3
- package/src/cli/local-bridge/frontend/src/features/repositories/RepositoriesView.tsx +1 -1
- package/src/cli/local-bridge/frontend/src/features/work/WorkView.tsx +4 -3
- package/src/cli/local-bridge/frontend/src/lib/api.ts +18 -11
- package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
- package/src/cli/local-bridge/frontend/src/shell/CommandBar.tsx +1 -1
- package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +4 -3
- package/src/cli/local-bridge/frontend/src/styles.css +27 -11
- package/src/cli/local-bridge/frontend/src/types.ts +8 -7
- package/src/cli/local-bridge/job-store.ts +1 -490
- package/src/cli/local-bridge/server.ts +29 -532
- package/src/cli/local-bridge/ui-dist/app.css +1 -1
- package/src/cli/local-bridge/ui-dist/app.js +5101 -4967
- 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/paths.ts +8 -2
- package/src/cli/mcp/repository-tools.ts +356 -101
- package/src/cli/mcp/server.ts +625 -54
- 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 +125 -15
- package/src/cli/mcp/transports/session-registry.ts +67 -5
- package/src/cli/mcp/types.ts +3 -3
- package/src/cli/repositories/command-classifier.ts +209 -14
- 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/safe-patch.ts +6 -4
- package/src/cli/repositories/selected-path-actions.ts +17 -9
- package/src/cli/repositories/structured-git.ts +110 -10
- package/src/cli/repository/inspector.ts +565 -62
- 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 +196 -2
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
- package/src/runtime/control-plane/execution/execution-identity.ts +65 -14
- package/src/runtime/control-plane/execution/session-store.ts +18 -0
- package/src/runtime/control-plane/execution/validation.ts +15 -2
- 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 +175 -8
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +28 -21
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +87 -9
- 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 +144 -14
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +9 -2
- package/src/runtime/control-plane/facade/goal-workloop.ts +885 -105
- package/src/runtime/control-plane/facade/index.ts +1 -0
- package/src/runtime/control-plane/facade/plan-contract-store.ts +211 -26
- package/src/runtime/control-plane/facade/requirement-board.ts +24 -8
- 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 +55 -11
- package/src/runtime/control-plane/facade/work-contract-store.ts +204 -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 +642 -51
- 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/requirement-store.ts +15 -11
- 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 +19 -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 +52 -14
- package/src/runtime/execution/process-runtime/check-result.ts +63 -2
- package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +346 -40
- package/src/runtime/execution/process-runtime/gc.ts +98 -12
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +1184 -0
- package/src/runtime/execution/process-runtime/persisted-check.ts +57 -6
- package/src/runtime/execution/process-runtime/resource-claims.ts +97 -8
- package/src/runtime/execution/process-runtime/runtime.ts +59 -4
- package/src/runtime/execution/process-runtime/store.ts +7 -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 +1219 -126
- package/src/runtime/gateway/mcp/process-tools.ts +83 -37
- package/src/runtime/gateway/mcp/router.ts +185 -83
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +546 -0
- package/src/runtime/gateway/mcp/runtime-tools.ts +2555 -1616
- package/src/runtime/model-clients/deepseek-adapter.ts +0 -32
- package/src/runtime/plugins/app-store-connect-adapter.ts +123 -19
- package/src/runtime/plugins/browser-adapter.ts +2925 -318
- package/src/runtime/plugins/browser-automation-service.ts +10 -0
- package/src/runtime/plugins/browser-handoff-host.ts +6 -31
- package/src/runtime/plugins/browser-handoff.ts +92 -5
- package/src/runtime/plugins/browser-macos-bridge.ts +586 -45
- 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 +15 -12
- package/src/runtime/plugins/external-adapter.ts +324 -3
- package/src/runtime/plugins/external-registration.ts +84 -5
- package/src/runtime/plugins/external-unix-socket.ts +7 -1
- package/src/runtime/plugins/first-party-registry.ts +4 -2
- package/src/runtime/plugins/github-adapter.ts +125 -0
- package/src/runtime/plugins/gmail-adapter.ts +28 -2
- 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 +125 -8
- 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 +181 -0
- package/src/runtime/plugins/resend-adapter.ts +1 -1
- package/src/runtime/plugins/store.ts +366 -24
- package/src/runtime/plugins/types.ts +39 -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/actions.ts +0 -10
- package/src/runtime/recovery/classifier.ts +0 -9
- package/src/runtime/recovery/maintenance-executor.ts +415 -18
- package/src/runtime/recovery/probe.ts +0 -1
- package/src/runtime/recovery/types.ts +0 -1
- 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 +162 -19
- package/src/runtime/root/release-store.ts +48 -11
- package/src/runtime/root/runtime.ts +23 -5
- package/src/runtime/root/service.ts +100 -27
- package/src/runtime/root/types.ts +2 -0
- package/src/runtime/safe-tooling/index.ts +0 -1
- package/src/runtime/safe-tooling/ios-development.ts +321 -63
- package/src/runtime/safe-tooling/types.ts +0 -30
- 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 +702 -94
- 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 +258 -0
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +40 -0
- package/src/runtime/workflow/schedules/engine.ts +509 -80
- 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 +6 -3
- package/src/runtime/workflow/schedules/work-continuation.ts +120 -34
- 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/bin/forge-desktop-helper.mjs +0 -204
- 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 -453
- package/docs/architecture/current/codegraph-context-provider.md +0 -226
- 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 -354
- package/docs/architecture/current/entity-model.md +0 -592
- 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 -144
- 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 -311
- 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 -83
- package/docs/operations/controller-desktop-plugin.md +0 -112
- 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/plugins/desktop-adapter.ts +0 -374
- package/src/runtime/safe-tooling/browser-safe.ts +0 -133
- 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,9 +0,0 @@
|
|
|
1
|
-
# Forge Goal Loop
|
|
2
|
-
|
|
3
|
-
Forge supports bounded goal progression through durable Goal, Work, Process, evidence, policy, and handoff records. The kernel does not recursively invent unlimited work, select arbitrary models, or bypass authorization. Semantic planning and provider selection belong to the external controller; deterministic repository and provider operations remain Forge-owned.
|
|
4
|
-
|
|
5
|
-
Every continuation must have a finite objective, resource scope, budget, stop condition, and reviewable evidence. Remote or destructive effects stay separately authorized. A Schedule can wake an external Controller for an existing bounded Work; ChatGPT wakeups reuse a saved Forge browser session or explicit conversation URL when available, so conversation continuity is a transport concern rather than Kernel reasoning.
|
|
6
|
-
The stable configuration path is `rh_work.schedule_*`: create one continuation policy for an already accepted Work, inspect it, pause/resume it, or trigger one bounded Occurrence. The engine re-checks Work terminality before launch and automatically disables the Schedule when the Work is complete, so users do not need to keep sending “continue” and Forge does not keep waking a model after acceptance is satisfied.
|
|
7
|
-
A scheduled wake uses a short launch reservation rather than a fake Controller lease. The external model becomes owner only after its own authenticated MCP session calls `rh_work continue`; this is the identity handoff boundary between deterministic scheduling and semantic control.
|
|
8
|
-
|
|
9
|
-
See [Dispatch and Agent Strategy](architecture/current/dispatch-and-agent-strategy.md), [Schedule Engine](architecture/current/automation-and-schedule-engine.md), and [Governance](architecture/current/governance.md).
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
# Forge Provider Configuration
|
|
2
|
-
|
|
3
|
-
Forge keeps provider selection separate from Runtime ownership. Codex, Claude, GitHub, browser, Google Workspace, Apple, iOS, Desktop, and other adapters execute bounded contracts through stable Forge policy, Process, receipt, and audit layers.
|
|
4
|
-
|
|
5
|
-
Provider credentials are supplied through supported environment or OS credential mechanisms and are never copied into repository state or chat output. Provider availability does not change the one-Runtime topology.
|
|
6
|
-
|
|
7
|
-
See [Provider configuration](operations/provider-configuration.md), [Plugin baseline](architecture/current/personal-assistant-plugin-baseline.md), and [Security Model](wiki/Security-Model.md).
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# ChatGPT-first Personal Assistant Runtime
|
|
2
|
-
|
|
3
|
-
This runtime is designed for a local-first personal assistant where ChatGPT is the primary natural-language controller and Forge is the guarded local execution layer.
|
|
4
|
-
|
|
5
|
-
## Product boundary
|
|
6
|
-
|
|
7
|
-
The Local Controller should not be the main task input surface. It stores routines, inbox items, memory, approvals, audit events, device tokens, and plugin state. ChatGPT, MCP, or a GPT Action should translate natural language into one of the high-level assistant APIs.
|
|
8
|
-
|
|
9
|
-
## High-level API surface
|
|
10
|
-
|
|
11
|
-
Expose these endpoints to ChatGPT Actions instead of exposing every low-level plugin action:
|
|
12
|
-
|
|
13
|
-
- `POST /api/assistant/intent` — submit a natural-language utterance or a ChatGPT-planned action list.
|
|
14
|
-
- `GET /api/assistant/inbox` — read assistant outputs, routine results, and approval notes.
|
|
15
|
-
- `GET /api/assistant/routines` — list saved routines.
|
|
16
|
-
- `POST /api/assistant/routines` — create a routine from a natural-language goal.
|
|
17
|
-
- `POST /api/assistant/routines/:routineId/run` — run one routine immediately.
|
|
18
|
-
- `POST /api/assistant/routines/:routineId/pause` — pause a routine.
|
|
19
|
-
- `POST /api/assistant/routines/:routineId/resume` — resume a routine.
|
|
20
|
-
- `POST /api/assistant/routines/:routineId/delete` — soft-delete a routine.
|
|
21
|
-
- `GET /api/assistant/memory` and `POST /api/assistant/memory` — read/write local preference memory.
|
|
22
|
-
- `GET /api/assistant/openapi.json` — minimal OpenAPI schema for a Custom GPT Action.
|
|
23
|
-
|
|
24
|
-
All `/api/*` routes still require the local controller token.
|
|
25
|
-
|
|
26
|
-
## Intent modes
|
|
27
|
-
|
|
28
|
-
`/api/assistant/intent` supports three modes:
|
|
29
|
-
|
|
30
|
-
- `plan_only`: return the interpreted plan without submitting execution jobs.
|
|
31
|
-
- `plan_then_execute`: plan and submit safe steps; block high-risk steps.
|
|
32
|
-
- `execute`: submit the supplied plan directly through the same policy gate.
|
|
33
|
-
|
|
34
|
-
The preferred ChatGPT flow is:
|
|
35
|
-
|
|
36
|
-
1. ChatGPT understands the user request.
|
|
37
|
-
2. ChatGPT asks for missing information or confirmation when needed.
|
|
38
|
-
3. ChatGPT calls `/api/assistant/intent` with either the natural-language utterance or an explicit `plan`.
|
|
39
|
-
4. Forge validates policy, creates durable Execution Jobs, stores an Assistant Inbox item, and returns display text.
|
|
40
|
-
|
|
41
|
-
## Routine model
|
|
42
|
-
|
|
43
|
-
A routine stores the user's natural-language goal rather than a traditional GUI rule form:
|
|
44
|
-
|
|
45
|
-
```json
|
|
46
|
-
{
|
|
47
|
-
"name": "每日邮件整理",
|
|
48
|
-
"naturalLanguageGoal": "每天早上 9 点整理过去 24 小时重要邮件,重点关注工作、API、BA、Jira、PR,用中文输出摘要。",
|
|
49
|
-
"scheduleText": "每天 09:00",
|
|
50
|
-
"dataSources": ["gmail", "calendar", "tasks"],
|
|
51
|
-
"output": "assistant_inbox",
|
|
52
|
-
"allowedActions": ["gmail.list_messages", "gmail.get_message"],
|
|
53
|
-
"forbiddenActions": ["gmail.send_message", "gmail.trash_message"]
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
The first version stores the routine and can run it on demand. Automatic time-based scheduling should attach this store to the existing schedule engine in a later iteration.
|
|
58
|
-
|
|
59
|
-
## Policy defaults
|
|
60
|
-
|
|
61
|
-
Allowed without extra approval:
|
|
62
|
-
|
|
63
|
-
- Read Gmail, Calendar, and Tasks.
|
|
64
|
-
- Create a Google Task / reminder.
|
|
65
|
-
- Create a Gmail draft.
|
|
66
|
-
- Create a personal calendar event without attendees.
|
|
67
|
-
|
|
68
|
-
Requires human approval:
|
|
69
|
-
|
|
70
|
-
- Send email.
|
|
71
|
-
- Trash email.
|
|
72
|
-
- Cancel calendar event.
|
|
73
|
-
- Reschedule calendar event.
|
|
74
|
-
- Delete task.
|
|
75
|
-
- Scheduled routine writes beyond explicitly allowed draft/reminder behavior.
|
|
76
|
-
|
|
77
|
-
## Assistant Inbox
|
|
78
|
-
|
|
79
|
-
Assistant Inbox is the user-facing result surface for routine outputs and intent execution records. ChatGPT can read it and then present the result conversationally, for example: "今天助理整理了什么?"
|
|
80
|
-
|
|
81
|
-
## Current limitation
|
|
82
|
-
|
|
83
|
-
The runtime does not embed a full NLP model. ChatGPT Actions should provide structure when precision matters. The local runtime includes conservative intent inference only for routine creation, reminders, and immediate mail-summary collection.
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
# Controller Desktop Plugin
|
|
2
|
-
|
|
3
|
-
The `desktop` plugin is a bundled first-party Forge capability for bounded
|
|
4
|
-
macOS desktop observation and application launch. It is not downloaded from a
|
|
5
|
-
marketplace and it does not require a user-configured socket, executable path, or
|
|
6
|
-
registration descriptor.
|
|
7
|
-
|
|
8
|
-
## Architecture
|
|
9
|
-
|
|
10
|
-
```text
|
|
11
|
-
ChatGPT / CLI / Local UI
|
|
12
|
-
-> list_plugins / get_plugin / plugin_action_execute
|
|
13
|
-
-> existing plugin policy, schema, receipt, and audit layers
|
|
14
|
-
-> Desktop adapter (Controller process)
|
|
15
|
-
-> one-shot managed child process
|
|
16
|
-
-> JSON-lines stdio handshake and action
|
|
17
|
-
-> bundled forge-desktop-helper.mjs
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
The Controller starts the helper on demand for one action. The child performs a
|
|
21
|
-
versioned handshake, executes one bounded request, returns one structured result,
|
|
22
|
-
and exits. Forge enforces request and response size limits, timeout,
|
|
23
|
-
cancellation, capability negotiation, bounded diagnostics, and process cleanup.
|
|
24
|
-
The helper is launched directly without a shell.
|
|
25
|
-
|
|
26
|
-
This initial implementation deliberately does not provide:
|
|
27
|
-
|
|
28
|
-
- plugin search, download, installation, or a marketplace;
|
|
29
|
-
- arbitrary commands or user-configured helper paths;
|
|
30
|
-
- sockets, background registration files, or a second plugin registry;
|
|
31
|
-
- screen capture, clicks, coordinates, keyboard input, or text entry;
|
|
32
|
-
- dynamic MCP tool loading.
|
|
33
|
-
|
|
34
|
-
The existing static MCP tools remain the public entry point, while action schemas,
|
|
35
|
-
permissions, lifecycle, health, receipts, and audit events remain authoritative in
|
|
36
|
-
the existing plugin runtime.
|
|
37
|
-
|
|
38
|
-
## Actions
|
|
39
|
-
|
|
40
|
-
| Action | Effect | Policy |
|
|
41
|
-
| --- | --- | --- |
|
|
42
|
-
| `configure` | Enable or disable the bundled Desktop plugin. | Authorization required. |
|
|
43
|
-
| `status` | Run a live helper handshake and return bounded readiness diagnostics. | Read-only. |
|
|
44
|
-
| `observe` | Read the frontmost macOS application through `NSWorkspace`; no screen pixels are captured. | Read-only. |
|
|
45
|
-
| `open_application` | Open one app by exact `app_name` or `bundle_id`. | Authorization required. |
|
|
46
|
-
|
|
47
|
-
`open_application` accepts exactly one selector. It invokes `/usr/bin/open` with an
|
|
48
|
-
argv array and never interpolates a shell command.
|
|
49
|
-
|
|
50
|
-
## Enable on this Mac
|
|
51
|
-
|
|
52
|
-
Use the controller-scoped plugin action without a repository id:
|
|
53
|
-
|
|
54
|
-
```json
|
|
55
|
-
{
|
|
56
|
-
"plugin_id": "desktop",
|
|
57
|
-
"action_id": "configure",
|
|
58
|
-
"request_id": "desktop-enable-1",
|
|
59
|
-
"confirm_authorization": true,
|
|
60
|
-
"arguments": {
|
|
61
|
-
"enabled": true
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Then call `get_plugin` for `desktop`, followed by `status` and `observe`.
|
|
67
|
-
No ChatGPT reconnect is required because Forge reuses the existing
|
|
68
|
-
`list_plugins`, `get_plugin`, and `plugin_action_execute` tool schemas. Loading a
|
|
69
|
-
new Runtime revision may require the external lifecycle owner to restart the
|
|
70
|
-
existing single Forge Runtime; it must not create a second Runtime or rollout slot.
|
|
71
|
-
|
|
72
|
-
Configuration authority is stored under:
|
|
73
|
-
|
|
74
|
-
```text
|
|
75
|
-
<controller-home>/system/desktop/config.json
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
The derived manifest and registry remain Controller projections. The helper path
|
|
79
|
-
is resolved from the active Forge installation and is not returned as
|
|
80
|
-
user-facing configuration.
|
|
81
|
-
|
|
82
|
-
## Permissions
|
|
83
|
-
|
|
84
|
-
The current version does not request Screen Recording permission because it does
|
|
85
|
-
not capture screenshots. Read-only observation uses AppKit `NSWorkspace` through
|
|
86
|
-
the system JavaScript bridge and does not intentionally trigger Accessibility
|
|
87
|
-
consent prompts. Health reports Accessibility as `not_probed` rather than claiming
|
|
88
|
-
permission that has not been verified.
|
|
89
|
-
|
|
90
|
-
Future click, keyboard, screenshot, or accessibility-tree actions must be added as
|
|
91
|
-
separate capabilities with explicit permission probes, stronger policy, redaction,
|
|
92
|
-
and fault-injection coverage. They must not be inferred from this initial plugin.
|
|
93
|
-
|
|
94
|
-
## Failure behavior
|
|
95
|
-
|
|
96
|
-
The plugin fails closed when:
|
|
97
|
-
|
|
98
|
-
- it is disabled;
|
|
99
|
-
- the platform is not macOS;
|
|
100
|
-
- the bundled helper is missing;
|
|
101
|
-
- the helper handshake or capability set is incompatible;
|
|
102
|
-
- a response is malformed or exceeds the output bound;
|
|
103
|
-
- the helper crashes, times out, or is cancelled;
|
|
104
|
-
- `open_application` receives zero or multiple selectors.
|
|
105
|
-
|
|
106
|
-
A helper failure is surfaced as a structured `PLUGIN_MANAGED_PROCESS_*` or
|
|
107
|
-
`PLUGIN_DESKTOP_*` error through the existing plugin receipt and audit path.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
## Immutable release packaging
|
|
111
|
-
|
|
112
|
-
Whole-Runtime releases include `forge-desktop-helper.mjs` as a required, hashed sibling artifact. The Desktop adapter resolves it from the validated active Runtime release identity, then uses argv/source candidates only as development compatibility fallbacks. It launches the helper with the same trusted Node resolver used by the bounded Node bridge path; it does not execute the compiled Forge binary as a JavaScript interpreter. Release validation fails closed when the helper is missing or empty, and plugin health reports helper and trusted-runtime availability without returning either local path.
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
# Durable Gmail Assistant Routines
|
|
2
|
-
|
|
3
|
-
Gmail Assistant Routines use the existing Repository Schedule Engine and durable Execution Jobs. They do not introduce a second cron service.
|
|
4
|
-
|
|
5
|
-
## Execution flow
|
|
6
|
-
|
|
7
|
-
1. Creating a confirmed Assistant Routine persists the Routine and creates one Repository Schedule.
|
|
8
|
-
2. The Schedule stores an IANA timezone, a five-field local cron expression, and a bounded catch-up window.
|
|
9
|
-
3. A due occurrence creates one `assistant_routine_execute` Runtime Job with an exclusive Routine resource claim.
|
|
10
|
-
4. The Runtime Job reads Gmail incrementally, hydrates bounded message bodies, advances the per-Routine cursor, analyzes the bounded message set, creates structured action proposals, and writes a final Assistant Inbox report.
|
|
11
|
-
5. Proposals either remain pending for explicit approval or match a previously authorized Standing Grant.
|
|
12
|
-
6. Every approved or Standing-Grant action runs as a separate durable plugin Job. Schedule execution never becomes remote-write authorization.
|
|
13
|
-
7. Sending mail and moving mail to Trash retain their existing strong-confirmation requirements and are never Standing-Grant eligible.
|
|
14
|
-
|
|
15
|
-
## Google OAuth setup
|
|
16
|
-
|
|
17
|
-
Create a Google OAuth client with this loopback redirect URI:
|
|
18
|
-
|
|
19
|
-
```text
|
|
20
|
-
http://127.0.0.1:8766/oauth/google/callback
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Expose the client configuration only through the managed secret environment:
|
|
24
|
-
|
|
25
|
-
- `FORGE_GOOGLE_CLIENT_ID`
|
|
26
|
-
- `FORGE_GOOGLE_CLIENT_SECRET`
|
|
27
|
-
|
|
28
|
-
The `FORGE_GOOGLE_WORKSPACE_CLIENT_ID` and `FORGE_GOOGLE_WORKSPACE_CLIENT_SECRET` aliases are also supported.
|
|
29
|
-
|
|
30
|
-
Call `workspace_auth_login_prepare` for `gmail` or `google-workspace`, then open the returned authorization URL. The request uses OAuth Authorization Code flow with PKCE, a random one-time state, a ten-minute expiry, and a loopback-only callback. Redirect URIs outside `127.0.0.1` or `localhost`, unexpected callback paths, and scopes outside the Gmail/Calendar/Tasks allowlist are rejected.
|
|
31
|
-
|
|
32
|
-
The callback exchanges the authorization code and stores only the refresh token in macOS Keychain. Access and refresh tokens are never returned through MCP, written to repository files, or written to normal Controller runtime state. The transient PKCE verifier is stored under Controller Home with restrictive permissions and is redacted after the callback is consumed.
|
|
33
|
-
|
|
34
|
-
The current secure persistence backend is macOS Keychain. Non-macOS hosts must provide a supported credential-store adapter or use managed environment credentials.
|
|
35
|
-
|
|
36
|
-
## Credential refresh and readiness
|
|
37
|
-
|
|
38
|
-
A configured access token is not considered provider-verified until a real Google API request succeeds. Before that first successful probe, health reports `live_token_unverified`.
|
|
39
|
-
|
|
40
|
-
After OAuth setup, Controller restarts can reload the refresh token from Keychain. When no valid cached access token exists, or Gmail returns HTTP 401/403, the provider performs one refresh-token exchange and at most one request retry. A failed refresh is classified as `PLUGIN_AUTH_FAILED`; the Routine Run becomes `auth_required` and Assistant Inbox requests reauthorization.
|
|
41
|
-
|
|
42
|
-
Managed environment credentials remain compatible:
|
|
43
|
-
|
|
44
|
-
- `FORGE_GMAIL_ACCESS_TOKEN`
|
|
45
|
-
- `FORGE_GMAIL_REFRESH_TOKEN`
|
|
46
|
-
- `FORGE_GMAIL_CLIENT_ID`
|
|
47
|
-
- `FORGE_GMAIL_CLIENT_SECRET`
|
|
48
|
-
- `FORGE_GOOGLE_WORKSPACE_ACCESS_TOKEN`
|
|
49
|
-
- `FORGE_GOOGLE_WORKSPACE_REFRESH_TOKEN`
|
|
50
|
-
- `FORGE_GOOGLE_WORKSPACE_CLIENT_ID`
|
|
51
|
-
- `FORGE_GOOGLE_WORKSPACE_CLIENT_SECRET`
|
|
52
|
-
|
|
53
|
-
## Scheduling semantics
|
|
54
|
-
|
|
55
|
-
Routine schedule text is normalized when the Routine is created. The first implementation recognizes daily and weekday expressions with an optional `HH:mm` or Chinese `点/时` form. Examples:
|
|
56
|
-
|
|
57
|
-
- `每天 09:00`
|
|
58
|
-
- `每周一 08:30`
|
|
59
|
-
- `Monday 07:00`
|
|
60
|
-
|
|
61
|
-
The normalized Schedule preserves the IANA timezone, so daylight-saving transitions remain aligned to local wall-clock time. Missed runs catch up at most once inside the configured window because the occurrence key is derived from the local scheduled minute rather than the actual wake-up minute.
|
|
62
|
-
|
|
63
|
-
## Gmail History cursor
|
|
64
|
-
|
|
65
|
-
Each Routine stores an independent cursor under `.forge/assistant/gmail-cursors.json`:
|
|
66
|
-
|
|
67
|
-
- last successful collection time
|
|
68
|
-
- bounded processed-message ID set
|
|
69
|
-
- Gmail `historyId`
|
|
70
|
-
- a bounded History or query continuation token while a backlog is still being drained
|
|
71
|
-
|
|
72
|
-
After the initial query, Gmail History is the primary incremental source. An expired History ID falls back to a five-minute-overlap Gmail query. Collection reads at most five pages, 100 IDs, and 50 full messages per run. If the page or hydration limit is reached, the history cursor does not advance; a continuation token or the original window is retained so the next run drains the remaining messages without loss.
|
|
73
|
-
|
|
74
|
-
## Optional model analysis
|
|
75
|
-
|
|
76
|
-
The model layer is optional. When it is disabled, unavailable, times out, or returns malformed output, the Routine completes with the deterministic rules engine rather than failing.
|
|
77
|
-
|
|
78
|
-
Configure an OpenAI-compatible endpoint with:
|
|
79
|
-
|
|
80
|
-
- `FORGE_ASSISTANT_MODEL_PROVIDER=openai-compatible`
|
|
81
|
-
- `FORGE_ASSISTANT_MODEL_ENDPOINT`
|
|
82
|
-
- `FORGE_ASSISTANT_MODEL`
|
|
83
|
-
- `FORGE_ASSISTANT_MODEL_API_KEY`
|
|
84
|
-
|
|
85
|
-
For the exact official hosts, provider-specific keys are also supported:
|
|
86
|
-
|
|
87
|
-
- `api.openai.com` may use `OPENAI_API_KEY`
|
|
88
|
-
- `api.deepseek.com` may use `FORGE_DEEPSEEK_API_KEY` or `DEEPSEEK_API_KEY`
|
|
89
|
-
|
|
90
|
-
A custom endpoint never receives `OPENAI_API_KEY` or a DeepSeek key. It must use the dedicated `FORGE_ASSISTANT_MODEL_API_KEY`. Endpoints must use HTTPS, except loopback HTTP used for a local model.
|
|
91
|
-
|
|
92
|
-
Optional budgets:
|
|
93
|
-
|
|
94
|
-
- `FORGE_ASSISTANT_MODEL_TIMEOUT_MS`
|
|
95
|
-
- `FORGE_ASSISTANT_MODEL_MAX_MESSAGES`
|
|
96
|
-
- `FORGE_ASSISTANT_MODEL_MAX_INPUT_CHARS`
|
|
97
|
-
- `FORGE_ASSISTANT_MODEL_MAX_OUTPUT_TOKENS`
|
|
98
|
-
|
|
99
|
-
The provider requests strict structured JSON, validates the result locally, and maps only these proposal types:
|
|
100
|
-
|
|
101
|
-
- Gmail draft creation
|
|
102
|
-
- Google Task creation
|
|
103
|
-
- Gmail archive
|
|
104
|
-
- Gmail mark read or unread
|
|
105
|
-
|
|
106
|
-
Email contents are untrusted input. Instructions in an email, quoted thread, signature, link, or attachment description cannot expand the action allowlist or request tools, credentials, files, commands, or additional permissions. Security, authentication, billing, incident, production, quota, and repository-permission messages are protected from model-generated archive actions.
|
|
107
|
-
|
|
108
|
-
The deterministic fallback also uses Gmail's `CATEGORY_PROMOTIONS` label as a high-confidence archive signal (`0.98`) for non-protected messages. Marketing/newsletter keyword matches remain a lower-confidence fallback (`0.7`). The protected-message veto wins over both signals, so a security, authentication, billing, production, incident, quota, or permission-related message is never proposed for automatic archive merely because Gmail classified it as Promotions.
|
|
109
|
-
|
|
110
|
-
Use `assistant_model_readiness` or `GET /api/assistant/model` to inspect the redacted configuration and budgets. Model credentials and raw secrets are never returned.
|
|
111
|
-
|
|
112
|
-
## Action proposals and approval
|
|
113
|
-
|
|
114
|
-
Routine analysis persists structured proposals under `.forge/assistant/action-proposals.json`. Each proposal records:
|
|
115
|
-
|
|
116
|
-
- Routine and Run identity
|
|
117
|
-
- target plugin/action and bounded arguments
|
|
118
|
-
- supporting Gmail message IDs
|
|
119
|
-
- sender/subject context and protected-message status
|
|
120
|
-
- reason, confidence, risk, expiry, and execution status
|
|
121
|
-
- the separate Execution Job created after approval
|
|
122
|
-
|
|
123
|
-
Use `assistant_action_proposals` to list or inspect proposals. Use `assistant_action_proposal_resolve` with `decision=approve` or `decision=reject`. MCP approval requires `confirm_authorization=true`; strong-confirmation actions also require the action's exact confirmation text. Local Controller exposes equivalent authenticated proposal endpoints.
|
|
124
|
-
|
|
125
|
-
Approval is idempotent. Repeating approval returns the same Execution Job rather than creating another remote write. Proposal audit records preserve whether approval came from MCP, Local UI, or a Standing Grant.
|
|
126
|
-
|
|
127
|
-
## Standing Grants
|
|
128
|
-
|
|
129
|
-
A Standing Grant is an explicit, expiring pre-authorization for one hardcoded low-risk action. It is not a general plugin permission.
|
|
130
|
-
|
|
131
|
-
Eligible actions are limited to:
|
|
132
|
-
|
|
133
|
-
- `gmail.create_draft`
|
|
134
|
-
- `gmail.archive_message`
|
|
135
|
-
- `gmail.mark_message_read`
|
|
136
|
-
- `gmail.mark_message_unread`
|
|
137
|
-
- `google_tasks.create_task`
|
|
138
|
-
|
|
139
|
-
A grant must include at least one constraint:
|
|
140
|
-
|
|
141
|
-
- Routine ID allowlist
|
|
142
|
-
- sender/domain allowlist
|
|
143
|
-
- required subject fragment
|
|
144
|
-
|
|
145
|
-
It also declares minimum proposal confidence, maximum executions per Routine Run, and expiry. Automatic draft grants additionally require a sender allowlist. Security-protected messages cannot be auto-archived.
|
|
146
|
-
|
|
147
|
-
Create a grant through `assistant_standing_grant_create` or `POST /api/assistant/standing-grants` with explicit authorization. List it through `assistant_standing_grants`; revoke it through `assistant_standing_grant_revoke` or the Local Controller revoke endpoint.
|
|
148
|
-
|
|
149
|
-
Example: automatically archive at most one high-confidence newsletter from a trusted sender per run:
|
|
150
|
-
|
|
151
|
-
```json
|
|
152
|
-
{
|
|
153
|
-
"plugin_id": "gmail",
|
|
154
|
-
"action_id": "archive_message",
|
|
155
|
-
"sender_allowlist": ["news@example.com"],
|
|
156
|
-
"subject_contains": ["newsletter"],
|
|
157
|
-
"min_confidence": 0.9,
|
|
158
|
-
"max_per_run": 1,
|
|
159
|
-
"expires_in_days": 30,
|
|
160
|
-
"confirm_authorization": true
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
Standing-Grant executions use a dedicated `standing-grant` origin and a defense-in-depth plugin allowlist. Modifying the stored grant cannot enable send, Trash, permanent deletion, calendar cancellation/rescheduling, or task deletion. Multiple matching grants cannot submit the same proposal twice, and retries preserve each grant's per-run budget.
|
|
165
|
-
|
|
166
|
-
## Safety boundary
|
|
167
|
-
|
|
168
|
-
Scheduled Routines may:
|
|
169
|
-
|
|
170
|
-
- list and read Gmail messages
|
|
171
|
-
- classify and summarize collected mail
|
|
172
|
-
- create bounded draft, task, archive, and read/unread proposals
|
|
173
|
-
- execute an eligible proposal only when a matching active Standing Grant already exists
|
|
174
|
-
- write Assistant Inbox reports
|
|
175
|
-
|
|
176
|
-
Scheduled Routines may not:
|
|
177
|
-
|
|
178
|
-
- send mail
|
|
179
|
-
- move mail to Trash
|
|
180
|
-
- permanently delete mail
|
|
181
|
-
- cancel or reschedule meetings
|
|
182
|
-
- delete tasks
|
|
183
|
-
- execute instructions embedded in mail
|
|
184
|
-
- open arbitrary attachments or links
|
|
185
|
-
|
|
186
|
-
A proposal is evidence for a later authorized action, not implicit authorization. A Standing Grant authorizes only its exact action and constraints. The Schedule origin never becomes authorization for a remote write.
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Personal assistant operator guide
|
|
2
|
-
|
|
3
|
-
This runtime is intended to be used with ChatGPT as the primary control plane. The Local Controller is the execution, policy, audit, and persistence layer.
|
|
4
|
-
|
|
5
|
-
## Recommended daily path
|
|
6
|
-
|
|
7
|
-
1. Ask ChatGPT for the goal in natural language.
|
|
8
|
-
2. ChatGPT calls the high-level assistant API or MCP tools.
|
|
9
|
-
3. The runtime plans safe plugin actions, submits durable jobs, and writes results into Assistant Inbox.
|
|
10
|
-
4. High-risk actions stay blocked until explicit human confirmation.
|
|
11
|
-
|
|
12
|
-
## Readiness check
|
|
13
|
-
|
|
14
|
-
Use `assistant_readiness` or `GET /api/assistant/readiness` before relying on the assistant.
|
|
15
|
-
|
|
16
|
-
The report separates:
|
|
17
|
-
|
|
18
|
-
- live Google capability
|
|
19
|
-
- mock-only capability
|
|
20
|
-
- disabled plugins
|
|
21
|
-
- routine, inbox, and memory state
|
|
22
|
-
- recommended next actions
|
|
23
|
-
|
|
24
|
-
Mock mode proves the execution path only. It does not read real Gmail, Calendar, or Tasks data.
|
|
25
|
-
|
|
26
|
-
## Gmail read self-test
|
|
27
|
-
|
|
28
|
-
A low-risk Gmail read test can be submitted through either:
|
|
29
|
-
|
|
30
|
-
- `plugin_action_execute` with `gmail.list_messages`
|
|
31
|
-
- `POST /api/assistant/self-test/gmail-read`
|
|
32
|
-
- `POST /api/assistant/intent` with an utterance such as `测试读取最近一周 Gmail`
|
|
33
|
-
|
|
34
|
-
When Gmail is in mock mode, the test returns deterministic mock messages. For real Gmail, configure the plugin with provider `google-workspace` and set one of the supported token environment variables documented by the plugin health message.
|
|
35
|
-
|
|
36
|
-
## Cleanup workflow
|
|
37
|
-
|
|
38
|
-
Use `runtime_cleanup_preview` or `POST /api/assistant/maintenance/cleanup-preview` first. It is non-destructive.
|
|
39
|
-
|
|
40
|
-
Use cleanup apply only after reviewing the preview:
|
|
41
|
-
|
|
42
|
-
- `runtime_cleanup_apply` with `confirm_cleanup=true`
|
|
43
|
-
- `POST /api/assistant/maintenance/cleanup-apply` with `confirmCleanup=true`
|
|
44
|
-
|
|
45
|
-
Cleanup is limited to explicit Forge candidates:
|
|
46
|
-
|
|
47
|
-
- old `Forge-*` temp directories that are not referenced by running processes
|
|
48
|
-
- terminal local jobs, when explicitly included
|
|
49
|
-
- historical attention acknowledgements, when explicitly included
|
|
50
|
-
|
|
51
|
-
Do not use cleanup apply as a substitute for reviewing active jobs, active leases, or running workers.
|
|
52
|
-
|
|
53
|
-
## What still needs real productization
|
|
54
|
-
|
|
55
|
-
The current runtime can route assistant intents and run safe data collection jobs. A full personal-assistant product still needs:
|
|
56
|
-
|
|
57
|
-
- real OAuth/token broker and refresh support
|
|
58
|
-
- wall-clock routine scheduling
|
|
59
|
-
- model-backed summarization of collected data
|
|
60
|
-
- approval summaries for risky actions
|
|
61
|
-
- cleanup apply integration in a dedicated maintenance UI
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Provider configuration and routing
|
|
2
|
-
|
|
3
|
-
Forge does not require or privilege a specific model vendor. A fresh installation builds neutral routing from provider kind, declared capabilities, health, and the configured provider priority. Providers with the same priority use the provider id only as a deterministic tie-breaker.
|
|
4
|
-
|
|
5
|
-
## Where configuration lives
|
|
6
|
-
|
|
7
|
-
The Controller GUI and the JSON files below edit the same controller-scoped configuration:
|
|
8
|
-
|
|
9
|
-
- `<controllerHome>/global/provider-config.json`: enable/disable providers, priority, model and non-secret API settings.
|
|
10
|
-
- `<controllerHome>/global/executor-routing.json`: explicit provider order for each task intent.
|
|
11
|
-
- `<controllerHome>/global/provider-secrets.json`: locally stored API credentials. This file is outside the repository and must never be committed.
|
|
12
|
-
|
|
13
|
-
Opening the GUI or reading configuration does not rewrite these files. Existing routing and priority choices remain authoritative across upgrades.
|
|
14
|
-
|
|
15
|
-
## Precedence
|
|
16
|
-
|
|
17
|
-
Provider selection applies these rules in order:
|
|
18
|
-
|
|
19
|
-
1. Per-request provider preferences and allow/deny constraints.
|
|
20
|
-
2. An explicit order or default in `executor-routing.json`, including changes made in the GUI routing editor.
|
|
21
|
-
3. Neutral generated defaults based on provider kind and `provider-config.json` priority.
|
|
22
|
-
4. Availability, enablement, authentication, live-call policy, safety gates, and required capabilities.
|
|
23
|
-
5. A ChatGPT handoff packet when no direct provider can safely run.
|
|
24
|
-
|
|
25
|
-
An explicit routing order intentionally overrides the general provider priority. The GUI shows both controls so users can decide whether task types follow a specific route or the general provider preference. Use **Use automatic routing** in the routing panel to remove explicit overrides and resume generated priority-based routing; do not delete the whole controller configuration.
|
|
26
|
-
|
|
27
|
-
## Personal preferences
|
|
28
|
-
|
|
29
|
-
Maintainers and users may place Grok, Codex, Claude, an API provider, or another registered provider first in their own Controller configuration. Those preferences belong under `controllerHome`; they are not open-source defaults and are not copied into the repository.
|
|
30
|
-
|
|
31
|
-
Remote API calls remain double-gated: the provider must be enabled/configured in the GUI and `FORGE_ENABLE_LIVE_MODEL_PROVIDERS` must explicitly allow live calls. Without both, the API provider is proposal-only.
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
usage() {
|
|
5
|
-
cat <<'USAGE_EOF'
|
|
6
|
-
Usage: scripts/harness-trace-grade.sh --run <trace.json> [--repo <repo>] [--strict]
|
|
7
|
-
USAGE_EOF
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
run_file=""
|
|
11
|
-
repo="."
|
|
12
|
-
strict=0
|
|
13
|
-
|
|
14
|
-
while [[ $# -gt 0 ]]; do
|
|
15
|
-
case "$1" in
|
|
16
|
-
--run)
|
|
17
|
-
run_file="${2:-}"
|
|
18
|
-
shift 2
|
|
19
|
-
;;
|
|
20
|
-
--repo)
|
|
21
|
-
repo="${2:-.}"
|
|
22
|
-
shift 2
|
|
23
|
-
;;
|
|
24
|
-
--strict)
|
|
25
|
-
strict=1
|
|
26
|
-
shift
|
|
27
|
-
;;
|
|
28
|
-
--help|-h)
|
|
29
|
-
usage
|
|
30
|
-
exit 0
|
|
31
|
-
;;
|
|
32
|
-
*)
|
|
33
|
-
echo "Unknown argument: $1" >&2
|
|
34
|
-
usage
|
|
35
|
-
exit 1
|
|
36
|
-
;;
|
|
37
|
-
esac
|
|
38
|
-
done
|
|
39
|
-
|
|
40
|
-
[[ -n "$run_file" ]] || { usage >&2; exit 1; }
|
|
41
|
-
[[ -f "$run_file" ]] || { echo "Trace run file not found: $run_file" >&2; exit 1; }
|
|
42
|
-
command -v jq >/dev/null 2>&1 || { echo "jq is required for harness trace grading" >&2; exit 1; }
|
|
43
|
-
|
|
44
|
-
if REPO_ROOT="$(cd "$repo" && pwd -P 2>/dev/null)"; then
|
|
45
|
-
:
|
|
46
|
-
else
|
|
47
|
-
echo "Repo path not found: $repo" >&2
|
|
48
|
-
exit 1
|
|
49
|
-
fi
|
|
50
|
-
|
|
51
|
-
results_file="$(mktemp)"
|
|
52
|
-
trap 'rm -f "$results_file"' EXIT
|
|
53
|
-
: > "$results_file"
|
|
54
|
-
|
|
55
|
-
record() {
|
|
56
|
-
local id="$1"
|
|
57
|
-
local passed="$2"
|
|
58
|
-
local message="$3"
|
|
59
|
-
jq -n \
|
|
60
|
-
--arg id "$id" \
|
|
61
|
-
--argjson passed "$passed" \
|
|
62
|
-
--arg message "$message" \
|
|
63
|
-
'{id: $id, passed: $passed, message: $message}' >> "$results_file"
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
trace_get() {
|
|
67
|
-
local query="$1"
|
|
68
|
-
jq -r "$query // empty" "$run_file"
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
schema="$(trace_get '.schema')"
|
|
72
|
-
active_plan="$(trace_get '.active_plan')"
|
|
73
|
-
task_profile="$(trace_get '.task_profile')"
|
|
74
|
-
review_card_verdict="$(trace_get '.review.card.verdict')"
|
|
75
|
-
review_card_change_type="$(trace_get '.review.card.change_type')"
|
|
76
|
-
review_card_rollback="$(trace_get '.review.card.rollback')"
|
|
77
|
-
commands_count="$(jq '.commands | if type == "array" then length else 0 end' "$run_file")"
|
|
78
|
-
outside_count="$(jq '.allowed_paths_check.outside | if type == "array" then length else 0 end' "$run_file")"
|
|
79
|
-
allowed_status="$(trace_get '.allowed_paths_check.status')"
|
|
80
|
-
|
|
81
|
-
if [[ "$schema" == "forge-run-trace.v1" ]]; then
|
|
82
|
-
record "schema.v1" true "trace schema is forge-run-trace.v1"
|
|
83
|
-
else
|
|
84
|
-
record "schema.v1" false "trace schema is ${schema:-missing}"
|
|
85
|
-
fi
|
|
86
|
-
|
|
87
|
-
if [[ -n "$active_plan" && -f "$REPO_ROOT/$active_plan" ]]; then
|
|
88
|
-
record "active_plan.resolves" true "active plan resolves: $active_plan"
|
|
89
|
-
else
|
|
90
|
-
record "active_plan.resolves" false "active plan does not resolve: ${active_plan:-missing}"
|
|
91
|
-
fi
|
|
92
|
-
|
|
93
|
-
case "$task_profile" in
|
|
94
|
-
code-change|docs-only|ledger-closeout|migration|eval-only|delegated-run)
|
|
95
|
-
record "contract_profile.valid" true "contract profile is valid: $task_profile"
|
|
96
|
-
;;
|
|
97
|
-
*)
|
|
98
|
-
record "contract_profile.valid" false "contract profile is invalid: ${task_profile:-missing}"
|
|
99
|
-
;;
|
|
100
|
-
esac
|
|
101
|
-
|
|
102
|
-
if [[ "$review_card_verdict" == "pass" ]]; then
|
|
103
|
-
record "review_card.pass" true "Human Review Card verdict is pass"
|
|
104
|
-
else
|
|
105
|
-
record "review_card.pass" false "Human Review Card verdict is ${review_card_verdict:-missing}"
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
if [[ -n "$review_card_change_type" && "$review_card_change_type" == "$task_profile" ]]; then
|
|
109
|
-
record "review_card.change_type" true "Human Review Card change type matches task profile"
|
|
110
|
-
else
|
|
111
|
-
record "review_card.change_type" false "Human Review Card change type ${review_card_change_type:-missing} does not match task profile ${task_profile:-missing}"
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
rollback_token="$(printf '%s' "$review_card_rollback" | sed -E 's/[;,].*$//; s/[[:space:]].*$//; s/^[[:space:]]+//; s/[[:space:]]+$//' | tr '[:upper:]' '[:lower:]')"
|
|
115
|
-
case "$rollback_token" in
|
|
116
|
-
""|tbd|todo|n/a|na|none|unknown|unavailable|pending|...)
|
|
117
|
-
record "review_card.rollback" false "Human Review Card rollback is missing or not concrete"
|
|
118
|
-
;;
|
|
119
|
-
*)
|
|
120
|
-
record "review_card.rollback" true "Human Review Card rollback is concrete"
|
|
121
|
-
;;
|
|
122
|
-
esac
|
|
123
|
-
|
|
124
|
-
if [[ "$commands_count" -gt 0 ]] && jq -e '.commands[]? | select((.command // "") | length > 0)' "$run_file" >/dev/null; then
|
|
125
|
-
record "commands.present" true "commands evidence is present"
|
|
126
|
-
else
|
|
127
|
-
record "commands.present" false "commands evidence is missing"
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
if [[ "$outside_count" -eq 0 && "$allowed_status" == "pass" ]]; then
|
|
131
|
-
record "allowed_paths.clean" true "no changed file is outside allowed paths"
|
|
132
|
-
else
|
|
133
|
-
record "allowed_paths.clean" false "allowed_paths status is ${allowed_status:-missing}; changed files outside allowed paths: $outside_count"
|
|
134
|
-
fi
|
|
135
|
-
|
|
136
|
-
failed="$(jq -s '[.[] | select(.passed == false)] | length' "$results_file")"
|
|
137
|
-
total="$(jq -s 'length' "$results_file")"
|
|
138
|
-
status="pass"
|
|
139
|
-
[[ "$failed" -eq 0 ]] || status="fail"
|
|
140
|
-
|
|
141
|
-
jq -s \
|
|
142
|
-
--arg status "$status" \
|
|
143
|
-
--arg run "$run_file" \
|
|
144
|
-
--argjson total "$total" \
|
|
145
|
-
--argjson failed "$failed" \
|
|
146
|
-
'{status: $status, run: $run, total: $total, failed: $failed, graders: .}' "$results_file"
|
|
147
|
-
|
|
148
|
-
if [[ "$strict" -eq 1 && "$failed" -ne 0 ]]; then
|
|
149
|
-
exit 1
|
|
150
|
-
fi
|