@moretea-labs/forge 1.7.2 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +58 -62
- package/CHANGELOG.md +26 -0
- package/CLAUDE.md +42 -62
- package/README.md +2 -2
- package/SKILL.md +0 -1
- package/THIRD_PARTY_NOTICES.md +5 -2
- package/adapters/browser/index.ts +2 -0
- package/adapters/chatgpt/browser-delivery-host.ts +71 -0
- package/adapters/chatgpt/browser-delivery-runtime.ts +783 -0
- package/adapters/chatgpt/controller-binding-store.ts +55 -0
- package/adapters/chatgpt/controller-host.ts +119 -0
- package/adapters/chatgpt/controller-round-host.ts +78 -0
- package/adapters/chatgpt/controller-round-settlement-store.ts +45 -0
- package/adapters/chatgpt/provider-delivery.ts +113 -0
- package/adapters/chatgpt/work-conversation-binding-store.ts +192 -0
- package/adapters/chatgpt/wsl-bridge-delivery-host.ts +63 -0
- package/adapters/computer/desktop-operator-contract.ts +7 -0
- package/adapters/computer/desktop-operator-discovery.ts +201 -0
- package/adapters/computer/desktop-operator-negotiation.ts +174 -0
- package/adapters/computer/desktop-operator-provider.ts +312 -0
- package/adapters/computer/index.ts +1 -0
- package/adapters/computer/interaction-target-authority.ts +944 -0
- package/adapters/controller-process/binding-store.ts +34 -0
- package/adapters/controller-process/controller-host.ts +26 -0
- package/adapters/mcp/access-mode.ts +132 -0
- package/adapters/mcp/audit.ts +32 -0
- package/adapters/mcp/auth.ts +407 -0
- package/adapters/mcp/controller-round-compatibility.ts +184 -0
- package/adapters/mcp/frozen-client-semantic-compatibility.ts +292 -0
- package/adapters/mcp/instructions.ts +36 -0
- package/adapters/mcp/legacy-context.ts +18 -0
- package/adapters/mcp/multi-repository.ts +437 -0
- package/adapters/mcp/oauth.ts +391 -0
- package/adapters/mcp/paths.ts +140 -0
- package/adapters/mcp/policy.ts +232 -0
- package/adapters/mcp/proxy-env.ts +62 -0
- package/adapters/mcp/readiness-projection.ts +24 -0
- package/adapters/mcp/redaction.ts +21 -0
- package/adapters/mcp/repo.ts +24 -0
- package/adapters/mcp/runtime-gateway/artifact-adapter.ts +52 -0
- package/adapters/mcp/runtime-gateway/context-adapter.ts +829 -0
- package/adapters/mcp/runtime-gateway/controller-authority-adapter.ts +191 -0
- package/adapters/mcp/runtime-gateway/engineering-preconditions.ts +147 -0
- package/adapters/mcp/runtime-gateway/execution-control-adapter.ts +28 -0
- package/adapters/mcp/runtime-gateway/execution-tools.ts +207 -0
- package/adapters/mcp/runtime-gateway/filesystem-adapter.ts +38 -0
- package/adapters/mcp/runtime-gateway/gateway-execution-adapter.ts +411 -0
- package/adapters/mcp/runtime-gateway/legacy-ios-tool-adapter.ts +105 -0
- package/adapters/mcp/runtime-gateway/maintenance-adapter.ts +44 -0
- package/adapters/mcp/runtime-gateway/model-adapter.ts +63 -0
- package/adapters/mcp/runtime-gateway/persisted-check-process.ts +3 -0
- package/adapters/mcp/runtime-gateway/plugin-adapter.ts +308 -0
- package/adapters/mcp/runtime-gateway/process-tools.ts +289 -0
- package/adapters/mcp/runtime-gateway/protected-computer-adapter.ts +76 -0
- package/adapters/mcp/runtime-gateway/recovery-adapter.ts +268 -0
- package/adapters/mcp/runtime-gateway/recovery-client-adapter.ts +70 -0
- package/adapters/mcp/runtime-gateway/recovery-tool-contract.ts +99 -0
- package/adapters/mcp/runtime-gateway/repository-compat-adapter.ts +110 -0
- package/adapters/mcp/runtime-gateway/result-adapter.ts +108 -0
- package/adapters/mcp/runtime-gateway/router.ts +728 -0
- package/adapters/mcp/runtime-gateway/runtime-observation-adapter.ts +1251 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-definitions.ts +634 -0
- package/adapters/mcp/runtime-gateway/runtime-tool-shared.ts +27 -0
- package/adapters/mcp/runtime-gateway/runtime-tools.ts +68 -0
- package/adapters/mcp/runtime-gateway/scheduler-adapter.ts +186 -0
- package/adapters/mcp/runtime-gateway/shared-adapter.ts +25 -0
- package/adapters/mcp/runtime-gateway/status-inbox-adapter.ts +870 -0
- package/adapters/mcp/runtime-gateway/work-adapter.ts +3186 -0
- package/adapters/mcp/runtime-gateway/work-compat-adapter.ts +502 -0
- package/adapters/mcp/runtime-gateway/work-validation-reconciler.ts +1 -0
- package/adapters/mcp/server.ts +1048 -0
- package/adapters/mcp/setup.ts +791 -0
- package/adapters/mcp/tool-capability-cache.ts +87 -0
- package/adapters/mcp/tool-mapping/access-tools.ts +387 -0
- package/adapters/mcp/tool-mapping/legacy-tool-service.ts +5265 -0
- package/adapters/mcp/tool-mapping/post-finalize-work-attribution.ts +150 -0
- package/adapters/mcp/tool-mapping/repository-tools.ts +1691 -0
- package/adapters/mcp/tool-mapping/tools.ts +9 -0
- package/adapters/mcp/tool-mapping/umbrella-tools.ts +117 -0
- package/adapters/mcp/toolset-names.ts +74 -0
- package/adapters/mcp/toolset-selection.ts +41 -0
- package/adapters/mcp/toolset.ts +336 -0
- package/adapters/mcp/transports/http.ts +1456 -0
- package/adapters/mcp/transports/session-registry.ts +513 -0
- package/adapters/mcp/transports/stdio.ts +8 -0
- package/adapters/mcp/tunnels/openai-secure-tunnel.ts +139 -0
- package/adapters/mcp/types.ts +41 -0
- package/assets/AGENTS.md +2 -16
- package/assets/CLAUDE.md +2 -16
- package/assets/hooks/AGENTS.md +3 -14
- package/assets/hooks/CLAUDE.md +3 -14
- package/assets/hooks/hook-input.sh +9 -2
- package/assets/hooks/lib/workflow-state.sh +28 -10
- package/assets/hooks/prompt-guard.sh +63 -37
- package/assets/hooks/security-sentinel.sh +2 -1
- package/assets/hooks/session-start-context.sh +7 -5
- package/assets/hooks/stop-orchestrator.sh +13 -3
- package/assets/initializer-question-pack.v4.json +11 -7
- package/assets/partials/05-workflow.partial.md +18 -73
- package/assets/partials/07-footer.partial.md +1 -1
- package/assets/partials-agents/02-operating-mode.partial.md +1 -2
- package/assets/partials-agents/04-task-protocol.partial.md +14 -59
- package/assets/partials-agents/06-quality-safety.partial.md +11 -16
- package/assets/partials-agents/08-deep-docs.partial.md +1 -2
- package/assets/plan-map.json +11 -11
- package/assets/plugin-registry.v1.json +9 -3
- package/assets/plugin-trust-policy.v1.json +6 -0
- package/assets/recovery/ForgeRecovery.ps1 +100 -0
- package/assets/recovery/forge-wsl-rescue +271 -0
- package/assets/reference-configs/development-protocol.md +11 -15
- package/assets/reference-configs/document-generation.md +1 -1
- package/assets/reference-configs/global-working-rules.md +9 -1
- package/assets/reference-configs/harness-overview.md +22 -112
- package/assets/reference-configs/hook-operations.md +1 -1
- package/assets/reference-configs/sprint-contracts.md +2 -2
- package/assets/skill-version.json +2 -2
- package/assets/templates/helpers/architecture-event.ts +3 -34
- package/assets/templates/helpers/architecture-queue.sh +61 -10
- package/assets/templates/helpers/archive-workflow.sh +90 -180
- package/assets/templates/helpers/capability-config.ts +8 -11
- package/assets/templates/helpers/capability-resolver.ts +37 -19
- package/assets/templates/helpers/capture-plan.sh +2 -2
- package/assets/templates/helpers/check-architecture-sync.sh +1 -9
- package/assets/templates/helpers/check-task-sync.sh +82 -11
- package/assets/templates/helpers/check-task-workflow.sh +1 -3
- package/assets/templates/helpers/context-contract-sync.sh +1 -12
- package/assets/templates/helpers/contract-worktree.sh +26 -24
- package/assets/templates/helpers/ensure-task-workflow.sh +6 -8
- package/assets/templates/helpers/inspect-project-state.ts +1 -1
- package/assets/templates/helpers/migrate-project-template.sh +1 -1
- package/assets/templates/helpers/migrate-workflow-docs.ts +53 -239
- package/assets/templates/helpers/new-plan.sh +2 -2
- package/assets/templates/helpers/plan-to-todo.sh +3 -31
- package/assets/templates/helpers/sprint-backlog.sh +1 -1
- package/assets/templates/helpers/switch-plan.sh +1 -1
- package/assets/templates/helpers/workflow-contract.ts +1 -0
- package/assets/workflow-contract.v1.json +63 -171
- package/assets/workflows/xiaohongshu/xiaohongshu.collect-metrics.v1.draft.json +118 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-image-note.v1.draft.json +316 -0
- package/assets/workflows/xiaohongshu/xiaohongshu.publish-long-text.v1.draft.json +324 -0
- package/docs/architecture/CURRENT.md +148 -13
- package/docs/architecture/EVOLUTION.md +13 -0
- package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +2 -1
- package/docs/architecture/decisions/20260831-independent-windows-wsl-host-rescue.md +59 -0
- package/docs/architecture/decisions/20260904-ios-device-migration-baseline.md +120 -0
- package/docs/architecture/decisions/20260904-repository-runtime-data-boundary.md +42 -0
- package/docs/architecture/decisions/20260907-assistant-learning-loop.md +35 -0
- package/docs/architecture/decisions/20260907-controller-round-transition-policy.md +296 -0
- package/docs/architecture/decisions/20260907-maintenance-diagnosis-bounded-read.md +39 -0
- package/docs/architecture/domains/verification.md +7 -0
- package/docs/architecture/domains/workflow-engine.md +1 -1
- package/docs/architecture/index.md +3 -3
- package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +19 -8
- package/docs/architecture/requests/2026-09-04-computer-plugin-workflow-taxonomy.md +124 -0
- package/docs/forge-chatgpt-mcp-setup.md +5 -3
- package/docs/forge-plugin-management.md +20 -4
- package/docs/forge-runtime-self-healing-loop.md +2 -0
- package/docs/operations/benchmark-cross-version-freeze.md +38 -0
- package/docs/operations/controller-browser-plugin.md +3 -1
- package/docs/operations/homebrew.md +2 -2
- package/docs/operations/platform-support.md +16 -8
- package/docs/operations/platform-support.zh-CN.md +2 -2
- package/docs/operations/standalone-disaster-recovery.md +26 -1
- package/docs/operations/uu-remote-rescue.md +41 -0
- package/docs/operations/windows-wsl-host-rescue.md +133 -0
- package/docs/public-usage-guide.md +1 -1
- package/docs/public-usage-guide.zh-CN.md +1 -1
- package/docs/tutorials/01-install-and-start.md +1 -1
- package/docs/tutorials/01-install-and-start.zh-CN.md +1 -1
- package/docs/tutorials/02-connect-chatgpt.md +4 -4
- package/docs/tutorials/02-connect-chatgpt.zh-CN.md +4 -4
- package/docs/wiki/Implementation.md +1 -1
- package/package.json +23 -14
- package/packages/kernel/controller/api/index.ts +2 -0
- package/packages/kernel/controller/application/controller-round-service.ts +29 -0
- package/packages/kernel/controller/application/controller-service.ts +30 -0
- package/packages/kernel/controller/domain/controller-round-transition-policy.ts +308 -0
- package/packages/kernel/controller/domain/controller-round.ts +107 -0
- package/packages/kernel/controller/domain/execution-quality.ts +133 -0
- package/packages/kernel/controller/domain/types.ts +56 -0
- package/packages/kernel/controller/index.ts +1 -0
- package/packages/kernel/controller/infrastructure/controller-binding-store.ts +84 -0
- package/packages/kernel/controller/infrastructure/controller-round-store.ts +1384 -0
- package/packages/kernel/controller/infrastructure/controller-session-store.ts +578 -0
- package/packages/kernel/controller/ports/controller-host.ts +16 -0
- package/packages/kernel/goal/api/index.ts +1 -0
- package/packages/kernel/goal/domain/types.ts +40 -0
- package/packages/kernel/goal/index.ts +1 -0
- package/packages/kernel/identity/api/index.ts +5 -0
- package/packages/kernel/identity/application/identity-service.ts +67 -0
- package/packages/kernel/identity/domain/scope.ts +63 -0
- package/packages/kernel/identity/domain/semantic-sync.ts +81 -0
- package/packages/kernel/identity/domain/types.ts +44 -0
- package/packages/kernel/identity/domain/workspace.ts +56 -0
- package/packages/kernel/identity/index.ts +1 -0
- package/packages/kernel/identity/infrastructure/identity-store.ts +75 -0
- package/packages/kernel/memory/api/index.ts +5 -0
- package/packages/kernel/memory/application/experience-service.ts +118 -0
- package/packages/kernel/memory/application/outcome-service.ts +77 -0
- package/packages/kernel/memory/domain/experience.ts +103 -0
- package/packages/kernel/memory/domain/operational-prior.ts +92 -0
- package/packages/kernel/memory/index.ts +1 -0
- package/packages/kernel/progression/api/index.ts +2 -0
- package/packages/kernel/progression/application/projector.ts +211 -0
- package/packages/kernel/progression/domain/types.ts +116 -0
- package/packages/kernel/progression/index.ts +1 -0
- package/packages/kernel/scheduler/api/index.ts +6 -0
- package/packages/kernel/scheduler/application/continuation-service.ts +212 -0
- package/packages/kernel/scheduler/application/eligibility.ts +252 -0
- package/packages/kernel/scheduler/application/schedule-service.ts +24 -0
- package/packages/kernel/scheduler/application/settlement.ts +197 -0
- package/packages/kernel/scheduler/domain/continuation.ts +38 -0
- package/packages/kernel/scheduler/domain/schedule.ts +149 -0
- package/packages/kernel/scheduler/index.ts +1 -0
- package/packages/kernel/scheduler/infrastructure/continuation-dispatch-store.ts +38 -0
- package/packages/kernel/scheduler/infrastructure/schedule-store.ts +785 -0
- package/packages/kernel/work/api/index.ts +15 -0
- package/packages/kernel/work/application/work-service.ts +148 -0
- package/packages/kernel/work/domain/admission-policy.ts +34 -0
- package/packages/kernel/work/domain/check-receipt.ts +43 -0
- package/packages/kernel/work/domain/context-closure-receipt.ts +32 -0
- package/packages/kernel/work/domain/engineering-contracts.ts +157 -0
- package/packages/kernel/work/domain/engineering-design.ts +281 -0
- package/packages/kernel/work/domain/engineering-profile.ts +242 -0
- package/packages/kernel/work/domain/execution-concurrency.ts +254 -0
- package/packages/kernel/work/domain/execution-snapshot.ts +33 -0
- package/packages/kernel/work/domain/implementation-review.ts +510 -0
- package/packages/kernel/work/domain/project-engineering-contract.ts +202 -0
- package/packages/kernel/work/domain/repository-completion-receipt.ts +73 -0
- package/packages/kernel/work/domain/state-machine.ts +259 -0
- package/packages/kernel/work/domain/types.ts +528 -0
- package/packages/kernel/work/index.ts +1 -0
- package/packages/kernel/work/infrastructure/work-contract-store.ts +1876 -0
- package/packages/kernel/work/ports/work-contract-store.ts +18 -0
- package/packages/plugin-runtime/browser/index.ts +3 -0
- package/packages/plugin-runtime/browser/provider-registry.ts +110 -0
- package/packages/plugin-runtime/browser/runtime-contract.ts +150 -0
- package/packages/plugin-runtime/browser/session-authority.ts +61 -0
- package/packages/plugin-runtime/computer/index.ts +6 -0
- package/packages/plugin-runtime/computer/provider-error.ts +26 -0
- package/packages/plugin-runtime/computer/provider-registration.ts +52 -0
- package/packages/plugin-runtime/computer/provider-registry.ts +63 -0
- package/packages/plugin-runtime/computer/provider.ts +19 -0
- package/packages/plugin-runtime/computer/target-authority.ts +190 -0
- package/packages/plugin-runtime/computer/target-persistence.ts +54 -0
- package/packages/plugin-runtime/external/index.ts +1 -0
- package/packages/plugin-runtime/external/unix-jsonl-transport.ts +457 -0
- package/packages/plugin-runtime/index.ts +3 -0
- package/packages/protocols/browser/index.ts +1 -0
- package/packages/protocols/browser/session.ts +98 -0
- package/packages/protocols/computer/contract.ts +199 -0
- package/packages/protocols/computer/index.ts +1 -0
- package/packages/protocols/failure/contract.ts +158 -0
- package/packages/protocols/failure/index.ts +1 -0
- package/packages/protocols/handoff/index.ts +1 -0
- package/packages/protocols/handoff/status.ts +22 -0
- package/packages/protocols/mcp/execution-context.ts +11 -0
- package/packages/protocols/mcp/index.ts +2 -0
- package/packages/protocols/mcp/tool-contract.ts +42 -0
- package/packages/workflow-runtime/api/index.ts +2 -0
- package/packages/workflow-runtime/application/interpreter.ts +342 -0
- package/packages/workflow-runtime/domain/workflow-asset.ts +223 -0
- package/packages/workflow-runtime/index.ts +1 -0
- package/scripts/assemble-template.ts +1 -1
- package/scripts/benchmark-computer-hotpath.ts +255 -0
- package/scripts/benchmark-controller-round2.ts +54 -2
- package/scripts/benchmark-ios-agent-device.ts +3 -6
- package/scripts/benchmark-mcp-transport.ts +3 -4
- package/scripts/benchmark-operational-memory-activation.ts +235 -0
- package/scripts/benchmark-operational-shadow.ts +28 -0
- package/scripts/bootstrap-runtime-maintenance-recovery.sh +4 -1
- package/scripts/canary-chatgpt-provider-delivery.ts +97 -0
- package/scripts/canary-controller-semantic-wait.ts +195 -0
- package/scripts/canary-global-hook.sh +2 -2
- package/scripts/check-mcp-compatibility.ts +173 -7
- package/scripts/check-platform-support.mjs +28 -2
- package/scripts/check-public-docs.sh +1 -1
- package/scripts/check-release-readiness.sh +1 -1
- package/scripts/check-repository-hygiene.mjs +92 -0
- package/scripts/check-runtime-architecture.mjs +1206 -95
- package/scripts/check-source-duplication.mjs +9 -1
- package/scripts/check-tarball-install-smoke.sh +98 -15
- package/scripts/controller-ngrok-rotation.sh +5 -4
- package/scripts/create-project-dirs.sh +10 -74
- package/scripts/forge-local-recovery-helper.mjs +204 -0
- package/scripts/forge-uu-remote-rescue-helper.d.mts +31 -0
- package/scripts/forge-uu-remote-rescue-helper.mjs +409 -0
- package/scripts/forge-windows-host-recovery-helper.mjs +136 -0
- package/scripts/hook-shim.sh +2 -2
- package/scripts/init-project.sh +12 -70
- package/scripts/install-desktop-operator-registration.ts +4 -2
- package/scripts/install-independent-windows-wsl-recovery.ts +125 -0
- package/scripts/install-standalone-recovery.ts +122 -10
- package/scripts/install-uu-remote-rescue-registration.ts +74 -0
- package/scripts/install-windows-host-recovery-registration.ts +22 -0
- package/scripts/lib/controller-home-env.sh +6 -3
- package/scripts/lib/project-init-lib.sh +39 -582
- package/scripts/migrate-chatgpt-automation-schedules.ts +2 -2
- package/scripts/migrate-windows-wsl-controller-home.ts +306 -0
- package/scripts/open-source-audit-allowlist.txt +12 -1
- package/scripts/portability-bindings.mjs +70 -0
- package/scripts/run-bounded-command.mjs +55 -0
- package/scripts/run-bun-test-file.ts +22 -6
- package/scripts/run-governed-gate.ts +4 -1
- package/scripts/smoke-mcp-http-runtime.ts +1 -1
- package/scripts/smoke-runtime-recovery.ts +34 -1
- package/scripts/smoke-schedule-engine.ts +1 -1
- package/scripts/stage-runtime-release.ts +6 -1
- package/scripts/test-governance.ts +51 -2
- package/src/cli/agent-jobs/job-manager.ts +10 -1
- package/src/cli/chatgpt-browser/bind-server.ts +2 -1
- package/src/cli/chatgpt-browser/binding.ts +20 -10
- package/src/cli/chatgpt-browser/bridge-extension.ts +75 -0
- package/src/cli/chatgpt-browser/bridge-provider.ts +376 -11
- package/src/cli/chatgpt-browser/engine.ts +10 -11
- package/src/cli/chatgpt-browser/native-provider.ts +24 -83
- package/src/cli/chatgpt-browser/oracle-provider.ts +5 -3
- package/src/cli/chatgpt-browser/types.ts +1 -0
- package/src/cli/commands/bootstrap-control.ts +334 -0
- package/src/cli/commands/brain-assistant.ts +38 -0
- package/src/cli/commands/brain.ts +193 -40
- package/src/cli/commands/chatgpt.ts +127 -0
- package/src/cli/commands/computer.ts +437 -0
- package/src/cli/commands/doctor.ts +18 -1
- package/src/cli/commands/init-hook.ts +71 -61
- package/src/cli/commands/init.ts +3 -1
- package/src/cli/commands/mcp.ts +16 -10
- package/src/cli/commands/plugin.ts +38 -12
- package/src/cli/commands/recovery.ts +493 -80
- package/src/cli/commands/runtime.ts +9 -4
- package/src/cli/commands/setup-profile.ts +89 -39
- package/src/cli/commands/status.ts +2 -1
- package/src/cli/controller/check-runner.ts +487 -98
- package/src/cli/controller/context/types.ts +7 -1
- package/src/cli/controller/context-pack.ts +23 -3
- package/src/cli/controller/issue-store.ts +1 -1
- package/src/cli/controller/systemd-user.ts +110 -0
- package/src/cli/controller/types.ts +10 -70
- package/src/cli/controller/worklog.ts +67 -13
- package/src/cli/editing/edit-operation-contract.ts +92 -0
- package/src/cli/editing/edit-session.ts +289 -13
- package/src/cli/github/plugin.ts +17 -12
- package/src/cli/hook/route-registry.ts +3 -5
- package/src/cli/hook/runtime.ts +49 -3
- package/src/cli/index.ts +3 -0
- package/src/cli/local-bridge/connector-freshness.ts +2 -2
- package/src/cli/local-bridge/console-automations.ts +2 -2
- package/src/cli/local-bridge/facade-api.ts +41 -14
- package/src/cli/local-bridge/job-store.ts +1 -1
- package/src/cli/local-bridge/server.ts +24 -27
- package/src/cli/mcp/access-mode.ts +2 -132
- package/src/cli/mcp/access-tools.ts +2 -387
- package/src/cli/mcp/audit.ts +2 -32
- package/src/cli/mcp/auth.ts +2 -404
- package/src/cli/mcp/instructions.ts +2 -34
- package/src/cli/mcp/legacy-context.ts +2 -16
- package/src/cli/mcp/legacy-tool-service.ts +2 -5308
- package/src/cli/mcp/multi-repository.ts +2 -436
- package/src/cli/mcp/oauth.ts +2 -375
- package/src/cli/mcp/openai-secure-tunnel.ts +2 -0
- package/src/cli/mcp/paths.ts +2 -140
- package/src/cli/mcp/policy.ts +2 -232
- package/src/cli/mcp/post-finalize-work-attribution.ts +2 -150
- package/src/cli/mcp/proxy-env.ts +2 -62
- package/src/cli/mcp/readiness-projection.ts +2 -24
- package/src/cli/mcp/redaction.ts +2 -21
- package/src/cli/mcp/repo.ts +2 -24
- package/src/cli/mcp/repository-tools.ts +2 -1613
- package/src/cli/mcp/server.ts +2 -951
- package/src/cli/mcp/setup.ts +2 -737
- package/src/cli/mcp/tool-capability-cache.ts +2 -87
- package/src/cli/mcp/tool-contract.ts +2 -14
- package/src/cli/mcp/tools.ts +2 -9
- package/src/cli/mcp/toolset-names.ts +2 -70
- package/src/cli/mcp/toolset-selection.ts +2 -41
- package/src/cli/mcp/toolset.ts +2 -336
- package/src/cli/mcp/transports/AGENTS.md +1 -10
- package/src/cli/mcp/transports/CLAUDE.md +1 -10
- package/src/cli/mcp/transports/http.ts +2 -1414
- package/src/cli/mcp/transports/session-registry.ts +2 -490
- package/src/cli/mcp/transports/stdio.ts +2 -8
- package/src/cli/mcp/types.ts +2 -41
- package/src/cli/mcp/umbrella-tools.ts +2 -117
- package/src/cli/repositories/command-executor.ts +64 -18
- package/src/cli/repositories/command-scope.ts +117 -1
- package/src/cli/repositories/controller-home.ts +119 -1
- package/src/cli/repositories/identity.ts +13 -0
- package/src/cli/repositories/registry.ts +68 -49
- package/src/cli/repositories/repository-snapshot.ts +53 -7
- package/src/cli/repositories/runtime-storage.ts +27 -2
- package/src/cli/repositories/safe-patch.ts +34 -38
- package/src/cli/repositories/selected-path-actions.ts +22 -2
- package/src/cli/repositories/structured-git.ts +105 -25
- package/src/cli/runtime/helper-runner.ts +7 -0
- package/src/cli/runtime-invocation.ts +8 -1
- package/src/cli/tools/codegraph.ts +44 -25
- package/src/core/adoption/manifest-templates.ts +1 -1
- package/src/core/adoption/plan.ts +3 -26
- package/src/core/adoption/workflow-contract-plan.ts +17 -9
- package/src/effects/process-runner.ts +8 -14
- package/src/runtime/context/assistant-context.ts +154 -0
- package/src/runtime/context/assistant-work-context.ts +147 -0
- package/src/runtime/context/codegraph-cache-boundary.ts +255 -0
- package/src/runtime/context/codegraph-read-provider.ts +55 -22
- package/src/runtime/context/codegraph-sidecar.cjs +8 -1
- package/src/runtime/context/context-closure.ts +268 -0
- package/src/runtime/context/context-plane.ts +211 -0
- package/src/runtime/context/project-engineering-contract.ts +60 -0
- package/src/runtime/control-plane/bootstrap/capability-provider.ts +74 -0
- package/src/runtime/control-plane/bootstrap/control-api.ts +57 -0
- package/src/runtime/control-plane/bootstrap/index.ts +5 -0
- package/src/runtime/control-plane/bootstrap/state-machine.ts +141 -0
- package/src/runtime/control-plane/bootstrap/store.ts +21 -0
- package/src/runtime/control-plane/bootstrap/types.ts +87 -0
- package/src/runtime/control-plane/cleanup-artifact-retention.ts +328 -0
- package/src/runtime/control-plane/codegraph-cache-retention.ts +164 -0
- package/src/runtime/control-plane/concurrency/work-execution-concurrency.ts +320 -0
- package/src/runtime/control-plane/execution/content-equivalent-commit-authority.ts +169 -0
- package/src/runtime/control-plane/execution/controller-authority-recovery.ts +350 -0
- package/src/runtime/control-plane/execution/direct-canonical-work-reconciliation.ts +85 -0
- package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +369 -99
- package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +103 -15
- package/src/runtime/control-plane/execution/implementation-review-content.ts +95 -0
- package/src/runtime/control-plane/execution/repository-work-attribution.ts +2 -2
- package/src/runtime/control-plane/execution/retained-work-resume.ts +336 -6
- package/src/runtime/control-plane/execution/validation.ts +28 -3
- package/src/runtime/control-plane/execution/work-authority-reconciler.ts +116 -0
- package/src/runtime/control-plane/execution/work-completion-authority.ts +44 -2
- package/src/runtime/control-plane/execution/work-evidence-policy.ts +34 -3
- package/src/runtime/control-plane/execution/work-execution-support.ts +42 -22
- package/src/runtime/control-plane/execution/work-finalization-service.ts +1103 -166
- package/src/runtime/control-plane/execution/work-handle-authority.ts +219 -22
- package/src/runtime/control-plane/execution/work-handle-store.ts +77 -0
- package/src/runtime/control-plane/execution/work-head-settlement.ts +75 -0
- package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +145 -23
- package/src/runtime/control-plane/execution/work-operation-service.ts +49 -13
- package/src/runtime/control-plane/execution/work-preparation-service.ts +31 -15
- package/src/runtime/control-plane/execution/work-remote-delivery.ts +1 -1
- package/src/runtime/control-plane/execution/work-task-receipt.ts +20 -1
- package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +407 -76
- package/src/runtime/control-plane/execution/work-validation-reconciler.ts +88 -18
- package/src/runtime/control-plane/execution/work-verification-context.ts +1 -1
- package/src/runtime/control-plane/execution/work-verification-service.ts +258 -4
- package/src/runtime/control-plane/execution/work-verification-snapshot.ts +200 -15
- package/src/runtime/control-plane/facade/capability-registry.ts +21 -10
- package/src/runtime/control-plane/facade/controller-round-relay.ts +3 -1118
- package/src/runtime/control-plane/facade/controller-session-store.ts +2 -488
- package/src/runtime/control-plane/facade/goal-workloop-access.ts +6 -3
- package/src/runtime/control-plane/facade/goal-workloop.ts +972 -137
- package/src/runtime/control-plane/facade/handoff-inbox-application.ts +158 -0
- package/src/runtime/control-plane/facade/handoff-inbox-store.ts +10 -0
- package/src/runtime/control-plane/facade/index.ts +4 -2
- package/src/runtime/control-plane/facade/operation-digest.ts +22 -58
- package/src/runtime/control-plane/facade/plan-contract-store.ts +1004 -38
- package/src/runtime/control-plane/facade/repository-work-admission.ts +19 -1
- package/src/runtime/control-plane/facade/requirement-authority.ts +218 -0
- package/src/runtime/control-plane/facade/requirement-board.ts +6 -1
- package/src/runtime/control-plane/facade/rh-work-operation-contract.ts +48 -0
- package/src/runtime/control-plane/facade/semantic-admission.ts +8 -16
- package/src/runtime/control-plane/facade/suggested-actions.ts +4 -1
- package/src/runtime/control-plane/facade/types.ts +189 -532
- package/src/runtime/control-plane/facade/work-admission-policy.ts +84 -35
- package/src/runtime/control-plane/facade/work-contract-store.ts +2 -1043
- package/src/runtime/control-plane/facade/work-implementation-review.ts +2 -0
- package/src/runtime/control-plane/facade/work-state-machine.ts +2 -250
- package/src/runtime/control-plane/generated-cache-retention.ts +239 -18
- package/src/runtime/control-plane/global-scheduler/durable-admission.ts +12 -1
- package/src/runtime/control-plane/global-scheduler/maintenance.ts +76 -13
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-entry.ts +55 -0
- package/src/runtime/control-plane/global-scheduler/periodic-cleanup-process.ts +98 -0
- package/src/runtime/control-plane/global-scheduler/reconciliation.ts +1 -1
- package/src/runtime/control-plane/global-scheduler/scheduler-worker-entry.ts +10 -0
- package/src/runtime/control-plane/global-scheduler/scheduler.ts +173 -81
- package/src/runtime/control-plane/global-scheduler/worker-launch.ts +18 -6
- package/src/runtime/control-plane/launcher/chatgpt-round-continuation.ts +397 -0
- package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +2 -177
- package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +301 -560
- package/src/runtime/control-plane/launcher/provider-mcp-bootstrap.ts +20 -4
- package/src/runtime/control-plane/launcher/thin-launcher.ts +50 -4
- package/src/runtime/control-plane/lifecycle-retention-metrics.ts +60 -0
- package/src/runtime/control-plane/persistence/experience-store.ts +169 -0
- package/src/runtime/control-plane/persistence/operational-prior-store.ts +348 -0
- package/src/runtime/control-plane/persistence/requirement-store.ts +30 -22
- package/src/runtime/control-plane/persistence/sqlite-store.ts +545 -76
- package/src/runtime/control-plane/persistence/workflow-content-store.ts +98 -0
- package/src/runtime/control-plane/persistence/workflow-registry-store.ts +186 -0
- package/src/runtime/control-plane/persistence/workflow-run-store.ts +123 -0
- package/src/runtime/control-plane/release-retention.ts +56 -16
- package/src/runtime/control-plane/repository-namespace-retention.ts +208 -0
- package/src/runtime/control-plane/routing/route-policy.ts +19 -0
- package/src/runtime/control-plane/runtime-cleanup.ts +574 -37
- package/src/runtime/control-plane/runtime-generation.ts +6 -0
- package/src/runtime/control-plane/workspace/semantic-sync-service.ts +465 -0
- package/src/runtime/control-plane/workspace/workspace-store.ts +80 -0
- package/src/runtime/diagnostics/incident-repair.ts +406 -0
- package/src/runtime/diagnostics/mcp-timing.ts +125 -6
- package/src/runtime/diagnostics/performance.ts +6 -14
- package/src/runtime/diagnostics/read-only-tool.ts +1 -1
- package/src/runtime/evidence/artifact-store.ts +65 -2
- package/src/runtime/evidence/operational-shadow.ts +38 -0
- package/src/runtime/evidence/process-check-receipt.ts +5 -43
- package/src/runtime/evidence/sensitive-output.ts +4 -4
- package/src/runtime/execution/jobs/receipt-recovery.ts +1 -1
- package/src/runtime/execution/jobs/store.ts +121 -2
- package/src/runtime/execution/managed-workspace.ts +55 -5
- package/src/runtime/execution/process-runtime/canary.ts +19 -5
- package/src/runtime/execution/process-runtime/check-classification.ts +48 -0
- package/src/runtime/execution/process-runtime/check-facade.ts +23 -9
- package/src/runtime/execution/process-runtime/check-receipt.ts +1 -1
- package/src/runtime/execution/process-runtime/check-result-retention.ts +132 -0
- package/src/runtime/execution/process-runtime/check-result.ts +73 -2
- package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +42 -3
- package/src/runtime/execution/process-runtime/check-storage.ts +187 -0
- package/src/runtime/execution/process-runtime/command-facade.ts +38 -87
- package/src/runtime/execution/process-runtime/index.ts +1 -0
- package/src/runtime/execution/process-runtime/interactive-admission.ts +2 -1
- package/src/runtime/execution/process-runtime/lightweight-managed.ts +32 -1
- package/src/runtime/execution/process-runtime/persisted-check.ts +128 -21
- package/src/runtime/execution/process-runtime/resource-claims.ts +60 -3
- package/src/runtime/execution/process-runtime/runtime.ts +132 -15
- package/src/runtime/execution/process-runtime/types.ts +22 -0
- package/src/runtime/execution/workers/executor.ts +16 -13
- package/src/runtime/execution/workers/worker-entry.ts +1 -1
- package/src/runtime/gateway/mcp/execution-tools.ts +2 -207
- package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +2 -61
- package/src/runtime/gateway/mcp/persisted-check-process.ts +2 -3
- package/src/runtime/gateway/mcp/process-tools.ts +2 -289
- package/src/runtime/gateway/mcp/router.ts +2 -1125
- package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +2 -565
- package/src/runtime/gateway/mcp/runtime-tools.ts +2 -6655
- package/src/runtime/gateway/mcp/work-validation-reconciler.ts +2 -1
- package/src/runtime/maintenance/cleanup.ts +38 -24
- package/src/runtime/platform/browser-product-discovery.ts +174 -0
- package/src/runtime/platform/computer-platform.ts +14 -0
- package/src/runtime/platform/executable-discovery.ts +54 -0
- package/src/runtime/platform/fetch-http-server.ts +90 -0
- package/src/runtime/platform/service-manager.ts +138 -0
- package/src/runtime/platform/windows-host-discovery.ts +118 -0
- package/src/runtime/platform/windows-recovery-deployment.ts +67 -0
- package/src/runtime/plugins/action-application.ts +135 -0
- package/src/runtime/plugins/app-store-connect-adapter.ts +9 -21
- package/src/runtime/plugins/browser-adapter.ts +140 -100
- package/src/runtime/plugins/browser-automation-service.ts +15 -36
- package/src/runtime/plugins/browser-macos-bridge.ts +69 -21
- package/src/runtime/plugins/browser-manifest-surface.ts +30 -6
- package/src/runtime/plugins/browser-native-session-service.ts +1 -1
- package/src/runtime/plugins/browser-provider-registry.ts +2 -109
- package/src/runtime/plugins/browser-registration.ts +16 -0
- package/src/runtime/plugins/browser-runtime-contract.ts +2 -154
- package/src/runtime/plugins/browser-runtime.ts +41 -9
- package/src/runtime/plugins/browser-session-authority.ts +101 -291
- package/src/runtime/plugins/browser-session-legacy-migration.ts +203 -0
- package/src/runtime/plugins/browser-session-store.ts +229 -36
- package/src/runtime/plugins/browser-session-types.ts +2 -98
- package/src/runtime/plugins/capability-authorization-grants.ts +17 -0
- package/src/runtime/plugins/catalog-trust.ts +82 -0
- package/src/runtime/plugins/computer-registration.ts +839 -0
- package/src/runtime/plugins/config-store.ts +119 -0
- package/src/runtime/plugins/desktop-operator-external-policy.ts +932 -0
- package/src/runtime/plugins/desktop-operator-registration.ts +111 -8
- package/src/runtime/plugins/errors.ts +8 -1
- package/src/runtime/plugins/external-adapter.ts +45 -322
- package/src/runtime/plugins/external-provider-policy.ts +48 -0
- package/src/runtime/plugins/external-registration.ts +9 -1
- package/src/runtime/plugins/external-unix-socket-probe.cjs +9 -3
- package/src/runtime/plugins/external-unix-socket.ts +64 -193
- package/src/runtime/plugins/first-party-external-registration.ts +163 -0
- package/src/runtime/plugins/first-party-registry.ts +3 -1
- package/src/runtime/plugins/github-adapter.ts +1 -2
- package/src/runtime/plugins/gmail-adapter.ts +6 -6
- package/src/runtime/plugins/google-calendar-adapter.ts +6 -6
- package/src/runtime/plugins/google-shared.ts +31 -46
- package/src/runtime/plugins/google-tasks-adapter.ts +6 -6
- package/src/runtime/plugins/ios-adapter.ts +1 -2
- package/src/runtime/plugins/local-system-adapter.ts +180 -0
- package/src/runtime/plugins/macos-capability-broker.ts +15 -105
- package/src/runtime/plugins/resend-adapter.ts +15 -24
- package/src/runtime/plugins/store.ts +493 -51
- package/src/runtime/plugins/types.ts +8 -1
- package/src/runtime/plugins/uu-remote-rescue-registration.ts +155 -0
- package/src/runtime/plugins/windows-host-recovery-install.ts +68 -0
- package/src/runtime/plugins/windows-host-recovery-registration.ts +85 -0
- package/src/runtime/plugins/xiaohongshu-publish.ts +86 -430
- package/src/runtime/projections/controller-context.ts +12 -6
- package/src/runtime/projections/git-status-sampler.ts +73 -22
- package/src/runtime/projections/materialized-view.ts +14 -8
- package/src/runtime/recovery/capability-action-application.ts +228 -0
- package/src/runtime/recovery/index.ts +3 -0
- package/src/runtime/recovery/lifecycle-inventory.ts +338 -0
- package/src/runtime/recovery/local-jobs-repair.ts +14 -14
- package/src/runtime/recovery/maintenance-executor.ts +358 -76
- package/src/runtime/recovery/quarantine-retention.ts +256 -0
- package/src/runtime/release/identity.ts +6 -0
- package/src/runtime/resources/leases/store.ts +1 -1
- package/src/runtime/root/active-execution-power-assertion.ts +139 -0
- package/src/runtime/root/assistant-learning-loop.ts +45 -0
- package/src/runtime/root/browser-session-composition.ts +59 -0
- package/src/runtime/root/computer-composition.ts +191 -0
- package/src/runtime/root/computer-target-composition.ts +16 -0
- package/src/runtime/root/computer-target-persistence.ts +39 -0
- package/src/runtime/root/controller-round-composition.ts +107 -0
- package/src/runtime/root/controller-services.ts +2 -0
- package/src/runtime/root/entry.ts +4 -3
- package/src/runtime/root/gateway-adapter.ts +3 -3
- package/src/runtime/root/local-bridge.ts +5 -2
- package/src/runtime/root/mcp-transport.ts +5 -5
- package/src/runtime/root/package-connector-service.ts +108 -56
- package/src/runtime/root/package-runtime-release.ts +85 -18
- package/src/runtime/root/package-runtime-service.ts +60 -97
- package/src/runtime/root/release-execution-canary.ts +71 -0
- package/src/runtime/root/release-loader.ts +68 -0
- package/src/runtime/root/release-manifest.ts +106 -2
- package/src/runtime/root/release-materialize.ts +103 -4
- package/src/runtime/root/release-store.ts +31 -2
- package/src/runtime/root/runtime.ts +240 -25
- package/src/runtime/root/scheduled-controller-composition.ts +51 -0
- package/src/runtime/root/scheduler.ts +12 -4
- package/src/runtime/root/service-runner.ts +1 -1
- package/src/runtime/root/service.ts +41 -16
- package/src/runtime/root/status.ts +1 -0
- package/src/runtime/root/types.ts +24 -1
- package/src/runtime/shared/local-bridge-surface.ts +1 -1
- package/src/runtime/shared/process-environment.ts +19 -4
- package/src/runtime/shared/storage-capacity.ts +68 -0
- package/src/runtime/standalone-recovery/controller-home-migration.ts +1116 -0
- package/src/runtime/standalone-recovery/core.ts +984 -230
- package/src/runtime/standalone-recovery/entry.ts +182 -51
- package/src/runtime/standalone-recovery/independent-host-rescue.ts +172 -0
- package/src/runtime/standalone-recovery/installer.ts +212 -104
- package/src/runtime/standalone-recovery/mcp-server.ts +243 -0
- package/src/runtime/standalone-recovery/mutation-identity-contract.ts +21 -0
- package/src/runtime/standalone-recovery/operation-lock.ts +160 -0
- package/src/runtime/standalone-recovery/performance.ts +135 -0
- package/src/runtime/standalone-recovery/release.ts +5 -0
- package/src/runtime/watchdog/workflow-watchdog.ts +1 -1
- package/src/runtime/workflow/schedules/chatgpt-automation-migration.ts +1 -1
- package/src/runtime/workflow/schedules/engine.ts +191 -343
- package/src/runtime/workflow/schedules/pending-activation.ts +1 -1
- package/src/runtime/workflow/schedules/settlement.ts +2 -191
- package/src/runtime/workflow/schedules/store.ts +2 -607
- package/src/runtime/workflow/schedules/types.ts +2 -127
- package/src/runtime/workflow/schedules/work-continuation.ts +180 -15
- package/src/runtime/workflows/first-party/xiaohongshu.ts +122 -0
- package/src/runtime/workflows/runtime.ts +486 -0
- package/src/testing/test-governance.ts +90 -29
- package/assets/templates/helpers/archive-architecture-request.sh +0 -244
- package/docs/architecture/history/README.md +0 -7
- package/docs/architecture/history/chatgpt-handoff-facade.md +0 -397
- package/docs/architecture/history/global-hook-runtime.md +0 -166
- package/docs/architecture/history/ios-semantic-automation-provider-v2.md +0 -170
- package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +0 -59
- package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +0 -63
- package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +0 -60
- package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +0 -68
- package/docs/architecture/requests/archive/2026/root.md +0 -68
- package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +0 -76
- package/docs/architecture/requests/archive/2026/verification-evals-checks.md +0 -68
- package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +0 -69
- package/scripts/archive-architecture-request.sh +0 -4
- package/scripts/run-skill-evals.ts +0 -1022
|
@@ -7,157 +7,55 @@ import type {
|
|
|
7
7
|
AssistantPluginPermissionScope,
|
|
8
8
|
} from './types';
|
|
9
9
|
import { AssistantPluginError } from './errors';
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
materializedXiaohongshuWorkflow,
|
|
12
|
+
translateXiaohongshuPublishToWorkflow,
|
|
13
|
+
type XiaohongshuWorkflowInvocation,
|
|
14
|
+
} from '../workflows/first-party/xiaohongshu';
|
|
11
15
|
|
|
12
16
|
const PLUGIN_ID = 'xiaohongshu';
|
|
13
|
-
const
|
|
14
|
-
const CREATOR_BASE_URL = 'https://creator.xiaohongshu.com/publish/publish?source=official';
|
|
15
|
-
const CREATOR_ARTICLE_URL = `${CREATOR_BASE_URL}&target=article`;
|
|
16
|
-
const CREATOR_NOTE_MANAGER_URL = 'https://creator.xiaohongshu.com/new/note-manager';
|
|
17
|
-
const IMAGE_TAB_TEXT = '上传图文';
|
|
18
|
-
const ARTICLE_NEW_TEXT = '新的创作';
|
|
19
|
-
const ARTICLE_LAYOUT_TEXT = '一键排版';
|
|
20
|
-
const ARTICLE_NEXT_TEXT = '下一步';
|
|
21
|
-
const IMAGE_FILE_SELECTOR = 'input[type=file]';
|
|
22
|
-
const IMAGE_TITLE_SELECTOR = 'input[placeholder*="标题"]';
|
|
23
|
-
const IMAGE_BODY_SELECTOR = '[contenteditable="true"][role="textbox"]';
|
|
24
|
-
const ARTICLE_TITLE_SELECTOR = 'textarea:nth-of-type(1)';
|
|
25
|
-
const ARTICLE_BODY_SELECTOR = '[contenteditable="true"]';
|
|
26
|
-
const PUBLISH_SELECTOR = 'xhs-publish-btn';
|
|
27
|
-
const PUBLISH_EVENT = 'publish';
|
|
17
|
+
const PROVIDER = 'xiaohongshu-workflow-compatibility';
|
|
28
18
|
|
|
29
|
-
|
|
30
|
-
const LOGIN_TEXT_MARKERS = ['手机号登录', '扫码登录', '验证码登录'];
|
|
19
|
+
function now(): string { return new Date().toISOString(); }
|
|
31
20
|
|
|
32
|
-
|
|
33
|
-
type NormalizedPublishMode = 'image_note' | 'long_text';
|
|
34
|
-
type RecipeStep = {
|
|
35
|
-
id: string;
|
|
36
|
-
actionId: string;
|
|
37
|
-
args: Record<string, unknown>;
|
|
38
|
-
expectation?: string;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
interface XiaohongshuHooks {
|
|
42
|
-
executeBrowserAction?: typeof executeBrowserPluginAction;
|
|
43
|
-
now?: () => string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
let hooks: XiaohongshuHooks = {};
|
|
47
|
-
|
|
48
|
-
export function setXiaohongshuPluginHooksForTest(next: XiaohongshuHooks): void {
|
|
49
|
-
hooks = next;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function resetXiaohongshuPluginHooksForTest(): void {
|
|
53
|
-
hooks = {};
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function now(): string {
|
|
57
|
-
return hooks.now?.() ?? new Date().toISOString();
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function browserExecutor(): typeof executeBrowserPluginAction {
|
|
61
|
-
return hooks.executeBrowserAction ?? executeBrowserPluginAction;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function stringValue(value: unknown): string | undefined {
|
|
65
|
-
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function requiredString(value: unknown, name: string): string {
|
|
69
|
-
const normalized = stringValue(value);
|
|
70
|
-
if (!normalized) throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', `${name} is required.`, { retryable: false });
|
|
71
|
-
return normalized;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function stringList(value: unknown): string[] {
|
|
75
|
-
if (value === undefined) return [];
|
|
76
|
-
if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string' || !entry.trim())) {
|
|
77
|
-
throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', 'image_paths must be a string array.', { retryable: false });
|
|
78
|
-
}
|
|
79
|
-
return value.map((entry) => String(entry).trim());
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function publishMode(value: unknown): PublishMode {
|
|
83
|
-
if (value === 'image_note' || value === 'generated_image_note' || value === 'long_text') return value;
|
|
84
|
-
throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', 'mode must be image_note, generated_image_note, or long_text.', { retryable: false });
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function normalizedMode(mode: PublishMode): NormalizedPublishMode {
|
|
88
|
-
return mode === 'generated_image_note' ? 'image_note' : mode;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function validProfileUrl(value: string): boolean {
|
|
21
|
+
function invocation(args: Record<string, unknown>): XiaohongshuWorkflowInvocation {
|
|
92
22
|
try {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export function isXiaohongshuAuthRequired(url: string, text: string): boolean {
|
|
101
|
-
const normalizedUrl = url.toLowerCase();
|
|
102
|
-
return LOGIN_URL_MARKERS.some((marker) => normalizedUrl.includes(marker.toLowerCase()))
|
|
103
|
-
|| LOGIN_TEXT_MARKERS.some((marker) => text.includes(marker));
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export function classifyXiaohongshuPublishState(input: {
|
|
107
|
-
phase: 'preflight' | 'creator_receipt' | 'profile_verify';
|
|
108
|
-
url: string;
|
|
109
|
-
text: string;
|
|
110
|
-
expectedTitle?: string;
|
|
111
|
-
}): 'AUTH_REQUIRED' | 'READY' | 'PUBLISHED_RECEIPT' | 'PROFILE_VERIFIED' | 'VERIFY_PENDING' | 'PAGE_SCHEMA_CHANGED' {
|
|
112
|
-
if (isXiaohongshuAuthRequired(input.url, input.text)) return 'AUTH_REQUIRED';
|
|
113
|
-
if (input.phase === 'creator_receipt') {
|
|
114
|
-
const normalizedUrl = input.url.toLowerCase();
|
|
115
|
-
return normalizedUrl.includes('published=true')
|
|
116
|
-
|| normalizedUrl.includes('/publish/success')
|
|
117
|
-
|| normalizedUrl.includes('/publish/editsuccess')
|
|
118
|
-
? 'PUBLISHED_RECEIPT'
|
|
119
|
-
: 'VERIFY_PENDING';
|
|
120
|
-
}
|
|
121
|
-
if (input.phase === 'profile_verify') {
|
|
122
|
-
return input.expectedTitle && input.text.includes(input.expectedTitle) ? 'PROFILE_VERIFIED' : 'VERIFY_PENDING';
|
|
123
|
-
}
|
|
124
|
-
return input.text.includes('创作服务平台') || input.text.includes('发布笔记') ? 'READY' : 'PAGE_SCHEMA_CHANGED';
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function parseRecipeArgs(args: Record<string, unknown>) {
|
|
128
|
-
const mode = publishMode(args.mode);
|
|
129
|
-
const sessionId = requiredString(args.session_id, 'session_id');
|
|
130
|
-
const profileUrl = requiredString(args.profile_url, 'profile_url');
|
|
131
|
-
if (!validProfileUrl(profileUrl)) {
|
|
132
|
-
throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', 'profile_url must be an https://www.xiaohongshu.com/user/profile/... URL.', { retryable: false });
|
|
133
|
-
}
|
|
134
|
-
const title = requiredString(args.title, 'title');
|
|
135
|
-
const body = requiredString(args.body, 'body');
|
|
136
|
-
const imagePaths = stringList(args.image_paths);
|
|
137
|
-
const summary = stringValue(args.summary);
|
|
138
|
-
const templateText = stringValue(args.template_text);
|
|
139
|
-
if (normalizedMode(mode) === 'image_note' && mode !== 'generated_image_note' && (imagePaths.length < 1 || imagePaths.length > 18)) {
|
|
140
|
-
throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', 'image_note requires 1-18 image_paths.', { retryable: false });
|
|
141
|
-
}
|
|
142
|
-
if (mode === 'generated_image_note' && imagePaths.length > 18) {
|
|
143
|
-
throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', 'generated_image_note accepts at most 18 generated image_paths.', { retryable: false });
|
|
23
|
+
return translateXiaohongshuPublishToWorkflow(args);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
throw new AssistantPluginError(
|
|
26
|
+
'PLUGIN_ACTION_ARGUMENT_INVALID',
|
|
27
|
+
error instanceof Error ? error.message : String(error),
|
|
28
|
+
{ retryable: false },
|
|
29
|
+
);
|
|
144
30
|
}
|
|
145
|
-
return { mode, normalizedMode: normalizedMode(mode), sessionId, profileUrl, title, body, imagePaths, summary, templateText };
|
|
146
31
|
}
|
|
147
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Compatibility projection only. Platform URLs, selectors, login markers,
|
|
35
|
+
* sequencing, verification and effect reconciliation live in the authored
|
|
36
|
+
* Workflow asset. This adapter never dispatches Browser actions.
|
|
37
|
+
*/
|
|
148
38
|
export function buildXiaohongshuPublishRecipe(args: Record<string, unknown>): Record<string, unknown> {
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
39
|
+
const translated = invocation(args);
|
|
40
|
+
const asset = materializedXiaohongshuWorkflow(translated.workflowId);
|
|
41
|
+
return {
|
|
42
|
+
schemaVersion: 1,
|
|
43
|
+
provider: PROVIDER,
|
|
44
|
+
workflowId: asset.workflowId,
|
|
45
|
+
workflowVersion: asset.version,
|
|
46
|
+
workflowContentDigest: asset.contentDigest,
|
|
47
|
+
registryScope: translated.registryScope,
|
|
48
|
+
normalizedMode: translated.normalizedMode,
|
|
49
|
+
generationRequired: translated.generationRequired,
|
|
50
|
+
inputs: translated.inputs,
|
|
51
|
+
execution: {
|
|
52
|
+
tool: 'rh_work',
|
|
53
|
+
operation: 'workflow_execute',
|
|
54
|
+
requiredRuntimeFields: ['work_id', 'workflow_run_id', 'controller_authority_id', 'relay_scope_id'],
|
|
55
|
+
workflow_id: asset.workflowId,
|
|
56
|
+
workflow_inputs: translated.inputs,
|
|
57
|
+
},
|
|
58
|
+
...(translated.generationRequired ? {
|
|
161
59
|
generationHandoff: {
|
|
162
60
|
status: 'required',
|
|
163
61
|
requiredInput: 'image_paths',
|
|
@@ -165,346 +63,104 @@ export function buildXiaohongshuPublishRecipe(args: Record<string, unknown>): Re
|
|
|
165
63
|
maxImages: 18,
|
|
166
64
|
resumeAction: 'publish_note',
|
|
167
65
|
resumeMode: 'generated_image_note',
|
|
168
|
-
next: 'Generate one or more image files, then call publish_note again with image_paths. The publishing path will normalize to image_note.',
|
|
169
66
|
},
|
|
170
|
-
|
|
171
|
-
verification: [],
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const creatorUrl = parsed.normalizedMode === 'long_text' ? CREATOR_ARTICLE_URL : CREATOR_BASE_URL;
|
|
176
|
-
const steps: RecipeStep[] = [
|
|
177
|
-
{
|
|
178
|
-
id: 'preflight.navigate_creator',
|
|
179
|
-
actionId: 'navigate',
|
|
180
|
-
args: { session_id: parsed.sessionId, url: creatorUrl, wait_until: 'domcontentloaded', timeout_ms: 60_000 },
|
|
181
|
-
expectation: 'Creator page remains in the persisted browser profile; raw cookies/tokens are not copied into recipe state.',
|
|
182
|
-
},
|
|
183
|
-
parsed.normalizedMode === 'image_note'
|
|
184
|
-
? {
|
|
185
|
-
id: 'image.select_mode',
|
|
186
|
-
actionId: 'click_text',
|
|
187
|
-
args: { session_id: parsed.sessionId, text: IMAGE_TAB_TEXT, post_action_wait_ms: 750 },
|
|
188
|
-
expectation: 'Creator may default to 上传视频; switch semantically to the exact visible 上传图文 tab before waiting for the image input.',
|
|
189
|
-
}
|
|
190
|
-
: {
|
|
191
|
-
id: 'preflight.read_auth_state',
|
|
192
|
-
actionId: 'get_text',
|
|
193
|
-
args: { session_id: parsed.sessionId, max_chars: 8_000 },
|
|
194
|
-
expectation: 'Classify with phase=preflight; stop as AUTH_REQUIRED before editing if login markers appear.',
|
|
195
|
-
},
|
|
196
|
-
];
|
|
197
|
-
|
|
198
|
-
if (parsed.normalizedMode === 'image_note') {
|
|
199
|
-
steps.push(
|
|
200
|
-
{ id: 'image.wait_file_input', actionId: 'wait_for_selector', args: { session_id: parsed.sessionId, selector: IMAGE_FILE_SELECTOR, state: 'attached', timeout_ms: 30_000 }, expectation: 'Wait for the image-upload input only after the semantic 上传图文 mode switch.' },
|
|
201
|
-
{ id: 'image.attach_files', actionId: 'attach_local_file', args: { session_id: parsed.sessionId, selector: IMAGE_FILE_SELECTOR, file_paths: parsed.imagePaths, post_action_wait_ms: 1_200 }, expectation: 'One input event/change event after all files are selected.' },
|
|
202
|
-
{ id: 'image.wait_editor', actionId: 'wait_for_selector', args: { session_id: parsed.sessionId, selector: IMAGE_TITLE_SELECTOR, state: 'visible', timeout_ms: 30_000 } },
|
|
203
|
-
{ id: 'image.fill_title', actionId: 'fill', args: { session_id: parsed.sessionId, selector: IMAGE_TITLE_SELECTOR, text: parsed.title } },
|
|
204
|
-
{ id: 'image.fill_body', actionId: 'fill', args: { session_id: parsed.sessionId, selector: IMAGE_BODY_SELECTOR, text: parsed.body } },
|
|
205
|
-
);
|
|
206
|
-
} else {
|
|
207
|
-
steps.push(
|
|
208
|
-
{ id: 'article.new', actionId: 'click_text', args: { session_id: parsed.sessionId, text: ARTICLE_NEW_TEXT, post_action_wait_ms: 900 }, expectation: 'Exact visible 新的创作 button.' },
|
|
209
|
-
{ id: 'article.wait_editor', actionId: 'wait_for_selector', args: { session_id: parsed.sessionId, selector: ARTICLE_TITLE_SELECTOR, state: 'visible', timeout_ms: 30_000 } },
|
|
210
|
-
{ id: 'article.fill_title', actionId: 'fill', args: { session_id: parsed.sessionId, selector: ARTICLE_TITLE_SELECTOR, text: parsed.title } },
|
|
211
|
-
{ id: 'article.fill_body', actionId: 'fill', args: { session_id: parsed.sessionId, selector: ARTICLE_BODY_SELECTOR, text: parsed.body } },
|
|
212
|
-
{ id: 'article.layout', actionId: 'click_text', args: { session_id: parsed.sessionId, text: ARTICLE_LAYOUT_TEXT, post_action_wait_ms: 1_500 } },
|
|
213
|
-
);
|
|
214
|
-
if (parsed.templateText) {
|
|
215
|
-
steps.push({ id: 'article.select_template', actionId: 'click_text', args: { session_id: parsed.sessionId, text: parsed.templateText, post_action_wait_ms: 500 } });
|
|
216
|
-
}
|
|
217
|
-
steps.push(
|
|
218
|
-
{ id: 'article.next', actionId: 'click_text', args: { session_id: parsed.sessionId, text: ARTICLE_NEXT_TEXT, post_action_wait_ms: 1_200 } },
|
|
219
|
-
{ id: 'article.wait_publish', actionId: 'wait_for_selector', args: { session_id: parsed.sessionId, selector: PUBLISH_SELECTOR, state: 'visible', timeout_ms: 30_000 } },
|
|
220
|
-
);
|
|
221
|
-
if (parsed.summary) {
|
|
222
|
-
steps.push({ id: 'article.fill_summary', actionId: 'fill', args: { session_id: parsed.sessionId, selector: ARTICLE_BODY_SELECTOR, text: parsed.summary } });
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
steps.push(
|
|
227
|
-
{ id: 'publish.semantic_submit', actionId: 'dispatch_event', args: { session_id: parsed.sessionId, selector: PUBLISH_SELECTOR, event: PUBLISH_EVENT, post_action_wait_ms: 1_500 }, expectation: 'Current XHS closed-shadow publish control emits publish; recipe version must be updated if this semantic event changes.' },
|
|
228
|
-
{ id: 'verify.creator_receipt', actionId: 'get_text', args: { session_id: parsed.sessionId, max_chars: 4_000 }, expectation: 'Creator URL must expose a recognized publish success receipt before title verification.' },
|
|
229
|
-
{ id: 'verify.creator_note_manager', actionId: 'navigate', args: { session_id: parsed.sessionId, url: CREATOR_NOTE_MANAGER_URL, wait_until: 'domcontentloaded', timeout_ms: 60_000 } },
|
|
230
|
-
{ id: 'verify.creator_title', actionId: 'get_text', args: { session_id: parsed.sessionId, max_chars: 12_000 }, expectation: `Creator note manager text must contain exact title even when the note is still under review: ${parsed.title}` },
|
|
231
|
-
);
|
|
232
|
-
|
|
233
|
-
return {
|
|
234
|
-
schemaVersion: 1,
|
|
235
|
-
recipeVersion: RECIPE_VERSION,
|
|
236
|
-
provider: 'xiaohongshu-web',
|
|
237
|
-
requestedMode: parsed.mode,
|
|
238
|
-
normalizedMode: parsed.normalizedMode,
|
|
239
|
-
generationRequired: false,
|
|
240
|
-
sessionId: parsed.sessionId,
|
|
241
|
-
profileUrl: parsed.profileUrl,
|
|
242
|
-
authPolicy: {
|
|
243
|
-
loginUrlMarkers: LOGIN_URL_MARKERS,
|
|
244
|
-
loginTextMarkers: LOGIN_TEXT_MARKERS,
|
|
245
|
-
credentialPersistence: 'browser_profile_only',
|
|
246
|
-
onAuthRequired: 'stop_before_edit_and_resume_after_user_login',
|
|
247
|
-
},
|
|
248
|
-
selectors: {
|
|
249
|
-
imageFile: IMAGE_FILE_SELECTOR,
|
|
250
|
-
imageTitle: IMAGE_TITLE_SELECTOR,
|
|
251
|
-
imageBody: IMAGE_BODY_SELECTOR,
|
|
252
|
-
articleTitle: ARTICLE_TITLE_SELECTOR,
|
|
253
|
-
articleBody: ARTICLE_BODY_SELECTOR,
|
|
254
|
-
publish: PUBLISH_SELECTOR,
|
|
255
|
-
publishEvent: PUBLISH_EVENT,
|
|
256
|
-
},
|
|
257
|
-
steps,
|
|
258
|
-
verification: ['creator_publish_success_receipt', 'creator_note_manager_contains_exact_title'],
|
|
67
|
+
} : {}),
|
|
259
68
|
};
|
|
260
69
|
}
|
|
261
70
|
|
|
262
|
-
function resultText(result: Record<string, unknown>): string {
|
|
263
|
-
return typeof result.text === 'string' ? result.text : '';
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
function resultUrl(result: Record<string, unknown>): string {
|
|
267
|
-
if (typeof result.url === 'string') return result.url;
|
|
268
|
-
const session = result.session;
|
|
269
|
-
if (session && typeof session === 'object' && typeof (session as Record<string, unknown>).url === 'string') return String((session as Record<string, unknown>).url);
|
|
270
|
-
const navigation = result.navigation;
|
|
271
|
-
if (navigation && typeof navigation === 'object' && typeof (navigation as Record<string, unknown>).url === 'string') return String((navigation as Record<string, unknown>).url);
|
|
272
|
-
return '';
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function schemaDriftMessage(message: string): boolean {
|
|
276
|
-
return /not found|does not allow multiple|Timeout waiting for selector|visible exact text not found|file input/i.test(message);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
71
|
export async function executeXiaohongshuPluginAction(input: AssistantPluginActionExecutionInput): Promise<Record<string, unknown>> {
|
|
280
|
-
if (input.actionId
|
|
281
|
-
if (input.actionId === 'classify_publish_state') {
|
|
282
|
-
const phase = input.args.phase;
|
|
283
|
-
if (phase !== 'preflight' && phase !== 'creator_receipt' && phase !== 'profile_verify') {
|
|
284
|
-
throw new AssistantPluginError('PLUGIN_ACTION_ARGUMENT_INVALID', 'phase must be preflight, creator_receipt, or profile_verify.', { retryable: false });
|
|
285
|
-
}
|
|
286
|
-
const url = requiredString(input.args.url, 'url');
|
|
287
|
-
const text = typeof input.args.text === 'string' ? input.args.text : '';
|
|
288
|
-
const expectedTitle = stringValue(input.args.expected_title);
|
|
289
|
-
return { state: classifyXiaohongshuPublishState({ phase, url, text, expectedTitle }), recipeVersion: RECIPE_VERSION };
|
|
290
|
-
}
|
|
291
|
-
if (input.actionId !== 'publish_note') {
|
|
72
|
+
if (input.actionId !== 'get_publish_recipe' && input.actionId !== 'publish_note') {
|
|
292
73
|
throw new AssistantPluginError('PLUGIN_ACTION_NOT_SUPPORTED', `xiaohongshu/${input.actionId} is not supported.`, { retryable: false });
|
|
293
74
|
}
|
|
294
|
-
|
|
295
|
-
const parsed = parseRecipeArgs(input.args);
|
|
296
|
-
if (parsed.mode === 'generated_image_note' && parsed.imagePaths.length === 0) {
|
|
297
|
-
return {
|
|
298
|
-
status: 'generation_required',
|
|
299
|
-
recipeVersion: RECIPE_VERSION,
|
|
300
|
-
resumeMode: 'generated_image_note',
|
|
301
|
-
next: 'Generate one or more image files, then call publish_note again with image_paths. The publishing path will normalize to image_note.',
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
|
|
305
75
|
const recipe = buildXiaohongshuPublishRecipe(input.args);
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
const runStep = async (step: RecipeStep, index: number): Promise<Record<string, unknown>> => {
|
|
314
|
-
currentStep = step.id;
|
|
315
|
-
const result = await execute({
|
|
316
|
-
...input,
|
|
317
|
-
pluginId: 'browser',
|
|
318
|
-
actionId: step.actionId,
|
|
319
|
-
requestId: `${input.requestId}:xhs:${RECIPE_VERSION}:${index}:${step.actionId}`,
|
|
320
|
-
args: step.args,
|
|
321
|
-
});
|
|
322
|
-
receipts.push({ stepId: step.id, actionId: step.actionId, ...(resultUrl(result) ? { url: resultUrl(result) } : {}) });
|
|
323
|
-
return result;
|
|
76
|
+
if (input.actionId === 'get_publish_recipe') return recipe;
|
|
77
|
+
return {
|
|
78
|
+
...recipe,
|
|
79
|
+
status: recipe.generationRequired === true ? 'generation_required' : 'workflow_required',
|
|
80
|
+
next: recipe.generationRequired === true
|
|
81
|
+
? 'Generate one or more image files and request the same compatibility translation with image_paths.'
|
|
82
|
+
: 'Execute the returned Workflow through rh_work workflow_execute under the exact claimed Work/controller authority.',
|
|
324
83
|
};
|
|
325
|
-
|
|
326
|
-
try {
|
|
327
|
-
const preflightNavigate = await runStep(steps[0], 0);
|
|
328
|
-
const navigateUrl = resultUrl(preflightNavigate);
|
|
329
|
-
if (isXiaohongshuAuthRequired(navigateUrl, '')) {
|
|
330
|
-
return {
|
|
331
|
-
status: 'auth_required',
|
|
332
|
-
recipeVersion: RECIPE_VERSION,
|
|
333
|
-
checkpoint: 'preflight.navigate_creator',
|
|
334
|
-
sessionId: parsed.sessionId,
|
|
335
|
-
next: 'Complete only the necessary Xiaohongshu login/verification in the existing browser profile, then rerun publish_note with the same inputs.',
|
|
336
|
-
receipts,
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
const preflight = await runStep(steps[1], 1);
|
|
341
|
-
const preflightUrl = resultUrl(preflight) || navigateUrl;
|
|
342
|
-
const preflightState = parsed.normalizedMode === 'image_note'
|
|
343
|
-
? 'READY'
|
|
344
|
-
: classifyXiaohongshuPublishState({ phase: 'preflight', url: preflightUrl, text: resultText(preflight) });
|
|
345
|
-
if (preflightState === 'AUTH_REQUIRED') {
|
|
346
|
-
return {
|
|
347
|
-
status: 'auth_required',
|
|
348
|
-
recipeVersion: RECIPE_VERSION,
|
|
349
|
-
checkpoint: steps[1].id,
|
|
350
|
-
sessionId: parsed.sessionId,
|
|
351
|
-
next: 'Complete only the necessary Xiaohongshu login/verification in the existing browser profile, then rerun publish_note with the same inputs.',
|
|
352
|
-
receipts,
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
if (preflightState !== 'READY') {
|
|
356
|
-
return { status: 'page_schema_changed', recipeVersion: RECIPE_VERSION, checkpoint: currentStep, receipts };
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
for (let index = 2; index < steps.length; index += 1) {
|
|
360
|
-
const step = steps[index];
|
|
361
|
-
const result = await runStep(step, index);
|
|
362
|
-
if (step.id === 'verify.creator_receipt') {
|
|
363
|
-
creatorReceipt = result;
|
|
364
|
-
const state = classifyXiaohongshuPublishState({ phase: 'creator_receipt', url: resultUrl(result), text: resultText(result) });
|
|
365
|
-
if (state === 'AUTH_REQUIRED') {
|
|
366
|
-
return { status: 'auth_required', recipeVersion: RECIPE_VERSION, checkpoint: step.id, receipts, next: 'Restore Xiaohongshu login in the existing browser profile, then verify the draft/publication state before retrying.' };
|
|
367
|
-
}
|
|
368
|
-
if (state !== 'PUBLISHED_RECEIPT') {
|
|
369
|
-
return { status: 'publish_unverified', recipeVersion: RECIPE_VERSION, checkpoint: step.id, creatorUrl: resultUrl(result), receipts };
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
if (step.id === 'verify.creator_title') profileReceipt = result;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
const profileState = profileReceipt
|
|
376
|
-
? classifyXiaohongshuPublishState({ phase: 'profile_verify', url: resultUrl(profileReceipt), text: resultText(profileReceipt), expectedTitle: parsed.title })
|
|
377
|
-
: 'VERIFY_PENDING';
|
|
378
|
-
if (profileState !== 'PROFILE_VERIFIED') {
|
|
379
|
-
return {
|
|
380
|
-
status: 'verification_pending',
|
|
381
|
-
recipeVersion: RECIPE_VERSION,
|
|
382
|
-
creatorReceipt: creatorReceipt ? { url: resultUrl(creatorReceipt) } : undefined,
|
|
383
|
-
verificationUrl: CREATOR_NOTE_MANAGER_URL,
|
|
384
|
-
expectedTitle: parsed.title,
|
|
385
|
-
receipts,
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
return {
|
|
389
|
-
status: 'published',
|
|
390
|
-
recipeVersion: RECIPE_VERSION,
|
|
391
|
-
mode: parsed.mode,
|
|
392
|
-
normalizedMode: parsed.normalizedMode,
|
|
393
|
-
title: parsed.title,
|
|
394
|
-
creatorReceipt: { url: resultUrl(creatorReceipt ?? {}) },
|
|
395
|
-
creatorVerification: { url: resultUrl(profileReceipt ?? {}), titleFound: true },
|
|
396
|
-
receipts,
|
|
397
|
-
publishedAt: now(),
|
|
398
|
-
};
|
|
399
|
-
} catch (error) {
|
|
400
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
401
|
-
if (schemaDriftMessage(message)) {
|
|
402
|
-
return {
|
|
403
|
-
status: 'page_schema_changed',
|
|
404
|
-
recipeVersion: RECIPE_VERSION,
|
|
405
|
-
checkpoint: currentStep,
|
|
406
|
-
message,
|
|
407
|
-
receipts,
|
|
408
|
-
next: 'Re-discover only the failed semantic anchor, update the Xiaohongshu recipe version, then resume with the same content inputs.',
|
|
409
|
-
};
|
|
410
|
-
}
|
|
411
|
-
throw error;
|
|
412
|
-
}
|
|
413
84
|
}
|
|
414
85
|
|
|
415
86
|
function health(): AssistantPluginHealth {
|
|
416
87
|
return {
|
|
417
|
-
state: 'ready',
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
probed: true,
|
|
421
|
-
errors: [],
|
|
422
|
-
warnings: ['Xiaohongshu authentication is owned by the Browser profile; login validity is checked at publish preflight and no raw token/cookie is stored by this recipe.'],
|
|
423
|
-
details: { recipeVersion: RECIPE_VERSION, browserSessionRequired: true },
|
|
88
|
+
state: 'ready', checkedAt: now(), ready: true, probed: true, errors: [],
|
|
89
|
+
warnings: ['This compatibility adapter is read-only. Xiaohongshu external effects are owned exclusively by the versioned Workflow Runtime and generic Browser capabilities.'],
|
|
90
|
+
details: { workflowRuntimeRequired: true, browserSessionRequired: true },
|
|
424
91
|
};
|
|
425
92
|
}
|
|
426
93
|
|
|
427
94
|
function permissions(): AssistantPluginPermissionScope[] {
|
|
428
|
-
return [
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
95
|
+
return [{
|
|
96
|
+
scope: 'xiaohongshu.recipe', mode: 'read',
|
|
97
|
+
description: 'Translate legacy Xiaohongshu publish inputs into the canonical first-party Workflow invocation.',
|
|
98
|
+
granted: true, required: true,
|
|
99
|
+
}];
|
|
432
100
|
}
|
|
433
101
|
|
|
434
102
|
function capabilities(): AssistantPluginCapability[] {
|
|
435
103
|
return [{
|
|
436
|
-
capabilityId: 'xiaohongshu-
|
|
437
|
-
title: 'Xiaohongshu
|
|
438
|
-
description: '
|
|
439
|
-
scopes: ['xiaohongshu.recipe'
|
|
440
|
-
actions: ['get_publish_recipe', '
|
|
104
|
+
capabilityId: 'xiaohongshu-workflow-compatibility',
|
|
105
|
+
title: 'Xiaohongshu Workflow Compatibility',
|
|
106
|
+
description: 'Read-only translation into versioned first-party Workflow assets. It does not own publishing effects.',
|
|
107
|
+
scopes: ['xiaohongshu.recipe'],
|
|
108
|
+
actions: ['get_publish_recipe', 'publish_note'],
|
|
441
109
|
}];
|
|
442
110
|
}
|
|
443
111
|
|
|
444
|
-
function
|
|
445
|
-
|
|
112
|
+
function recipeSchema(): Record<string, unknown> {
|
|
113
|
+
return {
|
|
446
114
|
type: 'object',
|
|
447
115
|
properties: {
|
|
448
116
|
mode: { type: 'string', enum: ['image_note', 'generated_image_note', 'long_text'] },
|
|
449
117
|
session_id: { type: 'string' },
|
|
118
|
+
account: { type: 'string' },
|
|
450
119
|
profile_url: { type: 'string' },
|
|
451
120
|
title: { type: 'string' },
|
|
452
121
|
body: { type: 'string' },
|
|
453
|
-
image_paths: { type: 'array',
|
|
122
|
+
image_paths: { type: 'array', maxItems: 18, items: { type: 'string' } },
|
|
454
123
|
summary: { type: 'string' },
|
|
455
124
|
template_text: { type: 'string' },
|
|
456
125
|
},
|
|
457
126
|
required: ['mode', 'session_id', 'profile_url', 'title', 'body'],
|
|
458
127
|
additionalProperties: false,
|
|
459
128
|
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function actions(): AssistantPluginActionDescriptor[] {
|
|
132
|
+
const schema = recipeSchema();
|
|
460
133
|
return [
|
|
461
134
|
{
|
|
462
|
-
actionId: 'get_publish_recipe', title: 'Resolve publish
|
|
135
|
+
actionId: 'get_publish_recipe', title: 'Resolve publish Workflow',
|
|
136
|
+
description: 'Translate inputs to the immutable first-party Xiaohongshu Workflow identity and typed inputs without executing Browser effects.',
|
|
463
137
|
readOnly: true, risk: 'readonly', confirmation: 'none', defaultTimeoutMs: 15_000, cancellable: true, idempotent: true,
|
|
464
|
-
scopes: ['xiaohongshu.recipe'], resourceClaims: [], argumentsSchema:
|
|
138
|
+
scopes: ['xiaohongshu.recipe'], resourceClaims: [], argumentsSchema: schema,
|
|
465
139
|
},
|
|
466
140
|
{
|
|
467
|
-
actionId: '
|
|
141
|
+
actionId: 'publish_note', title: 'Translate legacy publish request',
|
|
142
|
+
description: 'Compatibility-only alias that returns the canonical rh_work workflow_execute invocation. It never publishes directly.',
|
|
468
143
|
readOnly: true, risk: 'readonly', confirmation: 'none', defaultTimeoutMs: 15_000, cancellable: true, idempotent: true,
|
|
469
|
-
scopes: ['xiaohongshu.recipe'], resourceClaims: [],
|
|
470
|
-
argumentsSchema: {
|
|
471
|
-
type: 'object',
|
|
472
|
-
properties: {
|
|
473
|
-
phase: { type: 'string', enum: ['preflight', 'creator_receipt', 'profile_verify'] },
|
|
474
|
-
url: { type: 'string' }, text: { type: 'string' }, expected_title: { type: 'string' },
|
|
475
|
-
},
|
|
476
|
-
required: ['phase', 'url', 'text'], additionalProperties: false,
|
|
477
|
-
},
|
|
478
|
-
},
|
|
479
|
-
{
|
|
480
|
-
actionId: 'publish_note', title: 'Publish Xiaohongshu note', description: 'Execute the versioned Xiaohongshu publish recipe through the existing persisted Browser session. Stops on login expiry or page-schema drift and only reports published after a Creator success receipt plus exact-title verification in Creator note manager.',
|
|
481
|
-
readOnly: false, risk: 'remote_write', confirmation: 'authorization', defaultTimeoutMs: 180_000, cancellable: true, idempotent: false,
|
|
482
|
-
scopes: ['xiaohongshu.publish'], resourceClaims: [{ resource: 'remote', mode: 'exclusive' }, { resource: 'repo-state', mode: 'write' }], argumentsSchema: recipeSchema,
|
|
144
|
+
scopes: ['xiaohongshu.recipe'], resourceClaims: [], argumentsSchema: schema,
|
|
483
145
|
},
|
|
484
146
|
];
|
|
485
147
|
}
|
|
486
148
|
|
|
487
149
|
export function buildXiaohongshuPluginManifest(previousRevision = 0, previousUpdatedAt?: string): AssistantPluginManifest {
|
|
488
150
|
return {
|
|
489
|
-
schemaVersion: 1,
|
|
490
|
-
|
|
491
|
-
revision: Math.max(1, previousRevision || 1),
|
|
492
|
-
pluginId: PLUGIN_ID,
|
|
493
|
-
provider: 'xiaohongshu-web-recipe',
|
|
494
|
-
displayName: 'Xiaohongshu Publishing',
|
|
495
|
-
pluginVersion: '1.0.0',
|
|
151
|
+
schemaVersion: 1, manifestVersion: 1, revision: Math.max(1, previousRevision || 1),
|
|
152
|
+
pluginId: PLUGIN_ID, provider: PROVIDER, displayName: 'Xiaohongshu Workflow Compatibility', pluginVersion: '2.0.0',
|
|
496
153
|
authority: {
|
|
497
|
-
strategy: 'derived',
|
|
498
|
-
|
|
499
|
-
|
|
154
|
+
strategy: 'derived', duplicateStateAllowed: false,
|
|
155
|
+
sourceOfTruth: [
|
|
156
|
+
'source:assets/workflows/xiaohongshu/*.draft.json',
|
|
157
|
+
'source:src/runtime/workflows/first-party/xiaohongshu.ts',
|
|
158
|
+
'browser-profile:authentication-and-session',
|
|
159
|
+
],
|
|
500
160
|
},
|
|
501
161
|
enabled: true,
|
|
502
|
-
lifecycle: { state: 'enabled', reason: '
|
|
503
|
-
health: health(),
|
|
504
|
-
permissions: permissions(),
|
|
505
|
-
capabilities: capabilities(),
|
|
506
|
-
actions: actions(),
|
|
507
|
-
updatedAt: previousUpdatedAt ?? now(),
|
|
162
|
+
lifecycle: { state: 'enabled', reason: 'Compatibility translation is available; all publishing effects are Workflow-owned.' },
|
|
163
|
+
health: health(), permissions: permissions(), capabilities: capabilities(), actions: actions(), updatedAt: previousUpdatedAt ?? now(),
|
|
508
164
|
};
|
|
509
165
|
}
|
|
510
166
|
|
|
@@ -136,6 +136,12 @@ const performanceSnapshot: ControllerContextPerformanceSnapshot = {
|
|
|
136
136
|
};
|
|
137
137
|
|
|
138
138
|
function contextInvalidationPath(repoRoot: string): string {
|
|
139
|
+
// `.ai/harness/controller` is a Runtime Storage compatibility link backed by
|
|
140
|
+
// Controller Home. Keep the legacy path readable below only for migration.
|
|
141
|
+
return join(repoRoot, '.ai', 'harness', 'controller', 'context-invalidation.json');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function legacyContextInvalidationPath(repoRoot: string): string {
|
|
139
145
|
return join(repoRoot, '.ai', 'harness', 'controller-context-invalidation.json');
|
|
140
146
|
}
|
|
141
147
|
|
|
@@ -161,13 +167,13 @@ export function markControllerContextProjectionDirty(
|
|
|
161
167
|
export function readControllerContextProjectionInvalidation(
|
|
162
168
|
repoRoot: string,
|
|
163
169
|
): ControllerContextProjectionInvalidation | undefined {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
return undefined;
|
|
170
|
+
for (const path of [contextInvalidationPath(repoRoot), legacyContextInvalidationPath(repoRoot)]) {
|
|
171
|
+
try {
|
|
172
|
+
const marker = readJsonFile<ControllerContextProjectionInvalidation>(path);
|
|
173
|
+
if (marker.schemaVersion === 1 && marker.markedAt && marker.nonce) return marker;
|
|
174
|
+
} catch { /* try the migration fallback */ }
|
|
170
175
|
}
|
|
176
|
+
return undefined;
|
|
171
177
|
}
|
|
172
178
|
|
|
173
179
|
export function recordControllerContextRead(input: {
|