@gajae-code/coding-agent 0.10.2 → 0.11.1
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/CHANGELOG.md +58 -2
- package/dist/types/append-only-mode.d.ts +1 -1
- package/dist/types/async/job-manager.d.ts +46 -7
- package/dist/types/cli/args.d.ts +4 -5
- package/dist/types/cli/daemon-cli.d.ts +12 -1
- package/dist/types/cli/notify-cli.d.ts +21 -1
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/commands/daemon.d.ts +39 -0
- package/dist/types/commands/launch.d.ts +3 -0
- package/dist/types/commands/notify.d.ts +28 -1
- package/dist/types/commands/sdk.d.ts +33 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
- package/dist/types/config/model-profile-activation.d.ts +35 -15
- package/dist/types/config/model-profiles.d.ts +11 -5
- package/dist/types/config/model-registry.d.ts +3 -3
- package/dist/types/config/model-resolver.d.ts +39 -6
- package/dist/types/config/model-selector-value.d.ts +17 -0
- package/dist/types/config/models-config-schema.d.ts +10 -6
- package/dist/types/config/settings-schema.d.ts +133 -6
- package/dist/types/config/settings.d.ts +63 -35
- package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
- package/dist/types/coordinator-mcp/server.d.ts +6 -49
- package/dist/types/daemon/builtin.d.ts +6 -5
- package/dist/types/daemon/control-types.d.ts +1 -1
- package/dist/types/discovery/mcp-json.d.ts +12 -1
- package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
- package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
- package/dist/types/extensibility/extensions/loader.d.ts +10 -1
- package/dist/types/extensibility/extensions/runner.d.ts +3 -3
- package/dist/types/extensibility/extensions/types.d.ts +141 -16
- package/dist/types/extensibility/hooks/types.d.ts +1 -1
- package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
- package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
- package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
- package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
- package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +11 -0
- package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
- package/dist/types/harness-control-plane/operate.d.ts +5 -5
- package/dist/types/harness-control-plane/owner.d.ts +18 -4
- package/dist/types/harness-control-plane/receipts.d.ts +0 -1
- package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
- package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
- package/dist/types/harness-control-plane/types.d.ts +3 -4
- package/dist/types/lsp/index.d.ts +1 -1
- package/dist/types/main.d.ts +32 -38
- package/dist/types/modes/acp/acp-agent.d.ts +224 -53
- package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
- package/dist/types/modes/acp/acp-mode.d.ts +6 -15
- package/dist/types/modes/acp/permission-mode.d.ts +4 -0
- package/dist/types/modes/acp/startup-options.d.ts +6 -0
- package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
- package/dist/types/modes/components/model-selector.d.ts +1 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
- package/dist/types/modes/components/settings-selector.d.ts +6 -4
- package/dist/types/modes/components/welcome.d.ts +1 -1
- package/dist/types/modes/controllers/command-controller.d.ts +2 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
- package/dist/types/modes/index.d.ts +0 -4
- package/dist/types/modes/interactive-mode.d.ts +5 -2
- package/dist/types/modes/runtime-init.d.ts +2 -2
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +170 -30
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
- package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
- package/dist/types/modes/types.d.ts +7 -2
- package/dist/types/runtime-mcp/client.d.ts +2 -0
- package/dist/types/runtime-mcp/config.d.ts +5 -1
- package/dist/types/runtime-mcp/manager.d.ts +8 -1
- package/dist/types/runtime-mcp/types.d.ts +4 -0
- package/dist/types/sdk/acp/adapter.d.ts +67 -0
- package/dist/types/sdk/acp/index.d.ts +2 -0
- package/dist/types/sdk/broker/broker.d.ts +53 -0
- package/dist/types/sdk/broker/discovery.d.ts +30 -0
- package/dist/types/sdk/broker/ensure.d.ts +42 -0
- package/dist/types/sdk/broker/identity.d.ts +3 -0
- package/dist/types/sdk/broker/index.d.ts +8 -0
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
- package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
- package/dist/types/sdk/broker/runtime.d.ts +33 -0
- package/dist/types/sdk/broker/session-index.d.ts +57 -0
- package/dist/types/sdk/broker/state-version.d.ts +8 -0
- package/dist/types/sdk/broker/transport.d.ts +9 -0
- package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
- package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
- package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
- package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
- package/dist/types/sdk/bus/config.d.ts +274 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +50 -0
- package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
- package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
- package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
- package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
- package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
- package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
- package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
- package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
- package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
- package/dist/types/sdk/bus/session-control.d.ts +83 -0
- package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
- package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
- package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
- package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +78 -17
- package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
- package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
- package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
- package/dist/types/sdk/cli/index.d.ts +1 -0
- package/dist/types/sdk/cli/session-cli.d.ts +19 -0
- package/dist/types/sdk/client/client.d.ts +1 -0
- package/dist/types/sdk/client/discovery.d.ts +27 -0
- package/dist/types/sdk/client/index.d.ts +2 -0
- package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
- package/dist/types/sdk/host/control/index.d.ts +2 -0
- package/dist/types/sdk/host/control/operations.d.ts +65 -0
- package/dist/types/sdk/host/events.d.ts +35 -0
- package/dist/types/sdk/host/host.d.ts +35 -0
- package/dist/types/sdk/host/index.d.ts +4 -0
- package/dist/types/sdk/host/query/cursor.d.ts +62 -0
- package/dist/types/sdk/host/query/handlers.d.ts +70 -0
- package/dist/types/sdk/host/query/index.d.ts +3 -0
- package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
- package/dist/types/sdk/host/types.d.ts +32 -0
- package/dist/types/sdk/index.d.ts +6 -0
- package/dist/types/sdk/lifecycle-session.d.ts +14 -0
- package/dist/types/sdk/mcp/index.d.ts +1 -0
- package/dist/types/sdk/mcp/server.d.ts +37 -0
- package/dist/types/sdk/models.d.ts +44 -0
- package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
- package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
- package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
- package/dist/types/sdk/startup-capability.d.ts +50 -0
- package/dist/types/session/agent-session.d.ts +114 -21
- package/dist/types/session/default-model-selection.d.ts +25 -0
- package/dist/types/session/fallback-chain-controller.d.ts +52 -0
- package/dist/types/session/session-manager.d.ts +58 -1
- package/dist/types/setup/credential-auto-import.d.ts +36 -6
- package/dist/types/tools/ask-answer-registry.d.ts +1 -1
- package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
- package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
- package/dist/types/tools/browser/launch.d.ts +22 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
- package/dist/types/tools/browser/profile-posture.d.ts +37 -0
- package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
- package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
- package/dist/types/tools/browser/registry.d.ts +19 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
- package/dist/types/tools/index.d.ts +8 -8
- package/dist/types/tools/subagent-render.d.ts +1 -0
- package/dist/types/tools/subagent.d.ts +6 -1
- package/package.json +34 -13
- package/scripts/build-sdk-package-smoke.ts +99 -0
- package/scripts/capture-notifications-settings-showcase.ts +435 -0
- package/scripts/compile-args.ts +4 -2
- package/scripts/g005-daemon-smoke.ts +4 -5
- package/scripts/g011-daemon-path-smoke.ts +5 -5
- package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
- package/scripts/generate-sdk-operation-inventory.ts +867 -0
- package/scripts/generate-telegram-baseline-manifest.ts +128 -0
- package/scripts/manifest-schema.ts +124 -0
- package/scripts/run-test-manifest.ts +153 -0
- package/scripts/run-threat-model-check.ts +157 -0
- package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
- package/scripts/verify-gjc-sdk-rename.ts +90 -0
- package/src/append-only-mode.ts +1 -1
- package/src/async/job-manager.ts +406 -63
- package/src/cli/args.ts +43 -12
- package/src/cli/auth-gateway-cli.ts +2 -2
- package/src/cli/config-cli.ts +2 -1
- package/src/cli/daemon-cli.ts +63 -14
- package/src/cli/list-models.ts +1 -1
- package/src/cli/notify-cli.ts +288 -286
- package/src/cli.ts +21 -2
- package/src/commands/daemon.ts +50 -6
- package/src/commands/harness.ts +93 -36
- package/src/commands/launch.ts +5 -2
- package/src/commands/mcp-serve.ts +19 -12
- package/src/commands/notify.ts +36 -3
- package/src/commands/sdk.ts +426 -0
- package/src/commit/agentic/agent.ts +1 -0
- package/src/config/atomic-yaml-patch.ts +423 -0
- package/src/config/model-profile-activation.ts +240 -89
- package/src/config/model-profiles.ts +18 -15
- package/src/config/model-registry.ts +51 -26
- package/src/config/model-resolver.ts +138 -51
- package/src/config/model-selector-value.ts +50 -0
- package/src/config/models-config-schema.ts +14 -21
- package/src/config/settings-schema.ts +128 -10
- package/src/config/settings.ts +1120 -158
- package/src/coordinator-mcp/model-preset.ts +74 -20
- package/src/coordinator-mcp/server.ts +1597 -3052
- package/src/daemon/builtin.ts +8 -5
- package/src/daemon/control-types.ts +1 -1
- package/src/defaults/gjc/skills/team/SKILL.md +4 -4
- package/src/discovery/mcp-json.ts +327 -20
- package/src/extensibility/custom-tools/types.ts +1 -1
- package/src/extensibility/extensions/compact-handler.ts +3 -3
- package/src/extensibility/extensions/get-commands-handler.ts +2 -2
- package/src/extensibility/extensions/loader.ts +69 -5
- package/src/extensibility/extensions/runner.ts +112 -4
- package/src/extensibility/extensions/types.ts +176 -17
- package/src/extensibility/hooks/types.ts +1 -1
- package/src/gjc-runtime/launch-tmux.ts +170 -86
- package/src/gjc-runtime/psmux-detect.ts +82 -4
- package/src/gjc-runtime/session-state-sidecar.ts +41 -31
- package/src/gjc-runtime/team-runtime.ts +54 -35
- package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
- package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
- package/src/gjc-runtime/tmux-sessions.ts +19 -13
- package/src/gjc-runtime/ultragoal-guard.ts +108 -14
- package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
- package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
- package/src/gjc-runtime/windows-powershell-command.ts +58 -0
- package/src/harness-control-plane/operate.ts +9 -9
- package/src/harness-control-plane/owner.ts +283 -39
- package/src/harness-control-plane/receipts.ts +0 -1
- package/src/harness-control-plane/sdk-transport.ts +395 -0
- package/src/harness-control-plane/session-transport.ts +94 -0
- package/src/harness-control-plane/types.ts +1 -1
- package/src/internal-urls/docs-index.generated.ts +34 -35
- package/src/lsp/client.ts +42 -6
- package/src/lsp/index.ts +2 -2
- package/src/main.ts +299 -204
- package/src/modes/DESIGN.md +258 -0
- package/src/modes/acp/acp-agent.ts +1228 -2612
- package/src/modes/acp/acp-client-bridge.ts +2 -20
- package/src/modes/acp/acp-event-mapper.ts +18 -2
- package/src/modes/acp/acp-mode.ts +8 -36
- package/src/modes/acp/permission-mode.ts +25 -0
- package/src/modes/acp/startup-options.ts +6 -0
- package/src/modes/components/agent-dashboard.ts +37 -17
- package/src/modes/components/model-selector.ts +93 -35
- package/src/modes/components/notifications-settings-editor.ts +1379 -0
- package/src/modes/components/settings-selector.ts +60 -11
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +10 -17
- package/src/modes/controllers/event-controller.ts +11 -16
- package/src/modes/controllers/extension-ui-controller.ts +396 -28
- package/src/modes/controllers/selector-controller.ts +674 -36
- package/src/modes/index.ts +0 -22
- package/src/modes/interactive-mode.ts +87 -36
- package/src/modes/runtime-init.ts +298 -6
- package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
- package/src/modes/shared/agent-wire/event-contract.ts +7 -8
- package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
- package/src/modes/shared/agent-wire/event-observation.ts +16 -7
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1258 -87
- package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
- package/src/modes/types.ts +7 -2
- package/src/runtime-mcp/client.ts +94 -19
- package/src/runtime-mcp/config.ts +27 -15
- package/src/runtime-mcp/manager.ts +343 -105
- package/src/runtime-mcp/oauth-flow.ts +42 -12
- package/src/runtime-mcp/transports/http.ts +49 -19
- package/src/runtime-mcp/transports/stdio.ts +47 -28
- package/src/runtime-mcp/types.ts +10 -0
- package/src/sdk/acp/adapter.ts +418 -0
- package/src/sdk/acp/index.ts +2 -0
- package/src/sdk/broker/broker.ts +642 -0
- package/src/sdk/broker/discovery.ts +113 -0
- package/src/sdk/broker/ensure.ts +307 -0
- package/src/sdk/broker/identity.ts +42 -0
- package/src/sdk/broker/index.ts +8 -0
- package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
- package/src/sdk/broker/internal-source.bunfig.toml +1 -0
- package/src/sdk/broker/lifecycle-ledger.ts +286 -0
- package/src/sdk/broker/lifecycle.ts +2157 -0
- package/src/sdk/broker/process-incarnation.ts +159 -0
- package/src/sdk/broker/runtime.ts +164 -0
- package/src/sdk/broker/session-index.ts +318 -0
- package/src/sdk/broker/state-version.ts +23 -0
- package/src/sdk/broker/transport.ts +125 -0
- package/src/sdk/bus/chat-command-policy.ts +107 -0
- package/src/sdk/bus/chat-daemon-cli.ts +214 -0
- package/src/sdk/bus/chat-daemon-control.ts +713 -0
- package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
- package/src/sdk/bus/chat-effect-journal.ts +355 -0
- package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
- package/src/sdk/bus/config.ts +433 -0
- package/src/sdk/bus/conversation-store.ts +391 -0
- package/src/sdk/bus/discord-conversation.ts +85 -0
- package/src/sdk/bus/discord-daemon.ts +2292 -0
- package/src/sdk/bus/discord-live-provider.ts +521 -0
- package/src/sdk/bus/discord-provider.ts +56 -0
- package/src/{notifications → sdk/bus}/html-format.ts +2 -2
- package/src/sdk/bus/index.ts +3979 -0
- package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
- package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
- package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
- package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
- package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
- package/src/sdk/bus/natives-augment.d.ts +38 -0
- package/src/sdk/bus/notification-orchestration.ts +535 -0
- package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
- package/src/sdk/bus/session-control.ts +333 -0
- package/src/sdk/bus/slack-conversation.ts +74 -0
- package/src/sdk/bus/slack-daemon.ts +2144 -0
- package/src/sdk/bus/slack-live-provider.ts +380 -0
- package/src/sdk/bus/slack-provider.ts +76 -0
- package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
- package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
- package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
- package/src/{notifications → sdk/bus}/telegram-daemon.ts +603 -63
- package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
- package/src/sdk/bus/telegram-setup.ts +663 -0
- package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
- package/src/sdk/cli/index.ts +1 -0
- package/src/sdk/cli/session-cli.ts +275 -0
- package/src/sdk/client/client.ts +1 -0
- package/src/sdk/client/discovery.ts +108 -0
- package/src/sdk/client/index.ts +2 -0
- package/src/sdk/host/control/dispatch.ts +367 -0
- package/src/sdk/host/control/index.ts +10 -0
- package/src/sdk/host/control/operations.ts +63 -0
- package/src/sdk/host/events.ts +91 -0
- package/src/sdk/host/host.ts +296 -0
- package/src/sdk/host/index.ts +4 -0
- package/src/sdk/host/query/cursor.ts +189 -0
- package/src/sdk/host/query/handlers.ts +533 -0
- package/src/sdk/host/query/index.ts +3 -0
- package/src/sdk/host/query/revision-store.ts +1126 -0
- package/src/sdk/host/reverse-leases.ts +325 -0
- package/src/sdk/host/types.ts +29 -0
- package/src/sdk/index.ts +13 -0
- package/src/sdk/lifecycle-session.ts +39 -0
- package/src/sdk/mcp/index.ts +1 -0
- package/src/sdk/mcp/server.ts +332 -0
- package/src/sdk/models.ts +168 -0
- package/src/sdk/protocol/adapter-validation.ts +48 -0
- package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
- package/src/sdk/protocol/operation-registry.ts +312 -0
- package/src/{sdk.ts → sdk/session.ts} +339 -212
- package/src/sdk/startup-capability.ts +189 -0
- package/src/session/agent-session.ts +2650 -944
- package/src/session/default-model-selection.ts +93 -0
- package/src/session/fallback-chain-controller.ts +136 -0
- package/src/session/session-manager.ts +438 -11
- package/src/session/session-storage.ts +8 -1
- package/src/setup/credential-auto-import.ts +290 -35
- package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
- package/src/slash-commands/builtin-registry.ts +2 -1
- package/src/task/executor.ts +62 -13
- package/src/task/index.ts +26 -16
- package/src/tools/ask-answer-registry.ts +1 -1
- package/src/tools/ask.ts +13 -8
- package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
- package/src/tools/browser/benchmark/detector-report.ts +157 -0
- package/src/tools/browser/benchmark/run-suite.ts +39 -0
- package/src/tools/browser/launch.ts +124 -19
- package/src/tools/browser/profile-discovery.ts +63 -0
- package/src/tools/browser/profile-posture.ts +59 -0
- package/src/tools/browser/profile-reuse.ts +102 -0
- package/src/tools/browser/profile-warmup.ts +109 -0
- package/src/tools/browser/registry.ts +87 -11
- package/src/tools/browser/tab-protocol.ts +1 -0
- package/src/tools/browser/tab-supervisor.ts +1 -0
- package/src/tools/browser/tab-worker.ts +1 -1
- package/src/tools/browser.ts +6 -0
- package/src/tools/index.ts +8 -8
- package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
- package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
- package/src/tools/subagent-render.ts +19 -8
- package/src/tools/subagent.ts +84 -32
- package/src/tools/telegram-send.ts +2 -2
- package/vendor/insane-search/MANIFEST.json +2 -1
- package/vendor/insane-search/engine/bias_check.py +4 -1
- package/vendor/insane-search/engine/phase0.py +26 -1
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
- package/dist/types/modes/bridge/auth.d.ts +0 -12
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
- package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
- package/dist/types/modes/bridge/event-stream.d.ts +0 -8
- package/dist/types/modes/rpc/host-tools.d.ts +0 -1
- package/dist/types/modes/rpc/host-uris.d.ts +0 -1
- package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
- package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
- package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
- package/dist/types/notifications/config.d.ts +0 -132
- package/src/harness-control-plane/rpc-adapter.ts +0 -290
- package/src/modes/bridge/auth.ts +0 -41
- package/src/modes/bridge/bridge-client-bridge.ts +0 -47
- package/src/modes/bridge/bridge-mode.ts +0 -675
- package/src/modes/bridge/bridge-ui-context.ts +0 -200
- package/src/modes/bridge/event-stream.ts +0 -70
- package/src/modes/rpc/host-tools.ts +0 -1
- package/src/modes/rpc/host-uris.ts +0 -1
- package/src/modes/rpc/rpc-client.ts +0 -1166
- package/src/modes/rpc/rpc-mode.ts +0 -1029
- package/src/modes/rpc/rpc-socket-security.ts +0 -115
- package/src/modes/rpc/rpc-types.ts +0 -637
- package/src/modes/shared/agent-wire/command-contract.ts +0 -18
- package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
- package/src/modes/shared/agent-wire/command-validation.ts +0 -181
- package/src/modes/shared/agent-wire/handshake.ts +0 -157
- package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
- package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
- package/src/modes/shared/agent-wire/protocol.ts +0 -46
- package/src/modes/shared/agent-wire/responses.ts +0 -17
- package/src/modes/shared/agent-wire/scopes.ts +0 -94
- package/src/modes/shared/agent-wire/session-registry.ts +0 -109
- package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
- package/src/modes/shared/agent-wire/ui-result.ts +0 -48
- package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
- package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
- package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
- package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
- package/src/notifications/config.ts +0 -219
- package/src/notifications/index.ts +0 -1835
- package/src/notifications/telegram-daemon-cli.ts +0 -243
- package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
- /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
- /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
- /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
- /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
- /package/src/{notifications → sdk/bus}/engine.ts +0 -0
- /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
- /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
- /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
- /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
- /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
|
@@ -2,7 +2,7 @@ import { createHash, randomUUID } from "node:crypto";
|
|
|
2
2
|
import * as fs from "node:fs/promises";
|
|
3
3
|
import * as path from "node:path";
|
|
4
4
|
import { getWorktreesDir } from "@gajae-code/utils/dirs";
|
|
5
|
-
import { SPAWN_PROVENANCE_ENV } from "../
|
|
5
|
+
import { SPAWN_PROVENANCE_ENV } from "../sdk/bus/config";
|
|
6
6
|
import type { WorkflowHudSummary } from "../skill-state/active-state";
|
|
7
7
|
import { buildTeamHudSummary as buildWorkflowTeamHudSummary } from "../skill-state/workflow-hud";
|
|
8
8
|
import { WORKFLOW_STATE_VERSION } from "../skill-state/workflow-state-contract";
|
|
@@ -208,7 +208,7 @@ export type GjcTeamNotificationDeliveryState =
|
|
|
208
208
|
| "acknowledged";
|
|
209
209
|
|
|
210
210
|
export type GjcTeamPaneAttemptResult = "sent" | "queued" | "deferred" | "failed";
|
|
211
|
-
export type GjcTeamMailboxDeliveryTransportKind = "
|
|
211
|
+
export type GjcTeamMailboxDeliveryTransportKind = "sdk" | "pane";
|
|
212
212
|
|
|
213
213
|
export interface GjcTeamNotification {
|
|
214
214
|
id: string;
|
|
@@ -235,7 +235,7 @@ export interface GjcTeamMailboxDeliveryInput {
|
|
|
235
235
|
env: NodeJS.ProcessEnv;
|
|
236
236
|
}
|
|
237
237
|
export type GjcTeamMailboxDeliveryResult =
|
|
238
|
-
| { transport: "
|
|
238
|
+
| { transport: "sdk"; state: GjcTeamNotificationDeliveryState; reason?: string }
|
|
239
239
|
| { transport: "pane"; state: GjcTeamPaneAttemptResult; reason?: string };
|
|
240
240
|
export interface GjcTeamMailboxDeliveryTransport {
|
|
241
241
|
deliverMailboxMessage(input: GjcTeamMailboxDeliveryInput): Promise<GjcTeamMailboxDeliveryResult | null>;
|
|
@@ -1995,25 +1995,32 @@ function readCurrentTmuxLeaderContext(tmuxCommand: string, env: NodeJS.ProcessEn
|
|
|
1995
1995
|
}
|
|
1996
1996
|
return { sessionName, windowIndex, leaderPaneId, target: `${sessionName}:${windowIndex}` };
|
|
1997
1997
|
}
|
|
1998
|
-
type CommandPathResolver = (command: string) => string | null;
|
|
1999
|
-
|
|
2000
1998
|
function isBunVirtualPath(candidate: string | undefined): boolean {
|
|
2001
|
-
const normalized = candidate?.trim().replace(/\\/g, "/");
|
|
2002
|
-
return
|
|
1999
|
+
const normalized = candidate?.trim().replace(/\\/g, "/").toLowerCase();
|
|
2000
|
+
return (
|
|
2001
|
+
normalized === "/$bunfs" ||
|
|
2002
|
+
normalized?.startsWith("/$bunfs/") === true ||
|
|
2003
|
+
normalized === "b:/~bun" ||
|
|
2004
|
+
normalized?.startsWith("b:/~bun/") === true
|
|
2005
|
+
);
|
|
2003
2006
|
}
|
|
2004
2007
|
|
|
2005
|
-
function
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
): string {
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2008
|
+
function isAbsoluteRealPath(candidate: string | undefined, pathModule: typeof path): candidate is string {
|
|
2009
|
+
const normalized = candidate?.trim();
|
|
2010
|
+
return Boolean(normalized && !isBunVirtualPath(normalized) && pathModule.isAbsolute(normalized));
|
|
2011
|
+
}
|
|
2012
|
+
function isGjcExecutablePath(candidate: string | undefined, pathModule: typeof path): candidate is string {
|
|
2013
|
+
return isAbsoluteRealPath(candidate, pathModule) && /^gjc(?:[._-]|$)/i.test(pathModule.basename(candidate.trim()));
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
function formatWorkerExecutable(platform: NodeJS.Platform, executable: string): string {
|
|
2017
|
+
return (platform === "win32" ? powershellQuote : shellQuote)(executable);
|
|
2018
|
+
}
|
|
2019
|
+
|
|
2020
|
+
function unresolvedWorkerAuthorityError(): Error {
|
|
2021
|
+
return new Error(
|
|
2022
|
+
"Unable to determine the GJC worker executable from this invocation. Set GJC_TEAM_WORKER_COMMAND to the exact GJC command, or launch GJC from a real executable path instead of a Bun virtual path.",
|
|
2023
|
+
);
|
|
2017
2024
|
}
|
|
2018
2025
|
|
|
2019
2026
|
export function resolveGjcWorkerCommand(
|
|
@@ -2022,24 +2029,36 @@ export function resolveGjcWorkerCommand(
|
|
|
2022
2029
|
platform: NodeJS.Platform = process.platform,
|
|
2023
2030
|
argv: string[] = process.argv,
|
|
2024
2031
|
execPath = process.execPath,
|
|
2025
|
-
which: CommandPathResolver = Bun.which,
|
|
2026
2032
|
): string {
|
|
2027
2033
|
const explicit = env.GJC_TEAM_WORKER_COMMAND?.trim();
|
|
2028
|
-
if (explicit)
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
const
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2034
|
+
if (explicit) {
|
|
2035
|
+
if (isBunVirtualPath(explicit)) throw unresolvedWorkerAuthorityError();
|
|
2036
|
+
return explicit;
|
|
2037
|
+
}
|
|
2038
|
+
|
|
2039
|
+
const pathModule = platform === "win32" ? path.win32 : path.posix;
|
|
2040
|
+
const runtime = argv[0]?.trim();
|
|
2041
|
+
const entrypoint = argv[1]?.trim();
|
|
2042
|
+
const sourceEntrypoint = entrypoint && !isBunVirtualPath(entrypoint) && /\.(?:[cm]?[jt]s)$/i.test(entrypoint);
|
|
2043
|
+
|
|
2044
|
+
if (sourceEntrypoint) {
|
|
2045
|
+
const sourceRuntime = isAbsoluteRealPath(runtime, pathModule)
|
|
2046
|
+
? runtime
|
|
2047
|
+
: isAbsoluteRealPath(execPath, pathModule)
|
|
2048
|
+
? execPath.trim()
|
|
2049
|
+
: undefined;
|
|
2050
|
+
if (!sourceRuntime) throw unresolvedWorkerAuthorityError();
|
|
2051
|
+
const absoluteEntrypoint = pathModule.isAbsolute(entrypoint) ? entrypoint : pathModule.resolve(cwd, entrypoint);
|
|
2052
|
+
if (!isAbsoluteRealPath(absoluteEntrypoint, pathModule)) throw unresolvedWorkerAuthorityError();
|
|
2053
|
+
return `${formatWorkerExecutable(platform, sourceRuntime)} ${formatWorkerExecutable(platform, absoluteEntrypoint)}`;
|
|
2039
2054
|
}
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2055
|
+
|
|
2056
|
+
const executable =
|
|
2057
|
+
(isGjcExecutablePath(entrypoint, pathModule) ? entrypoint : undefined) ??
|
|
2058
|
+
(isGjcExecutablePath(execPath, pathModule) ? execPath.trim() : undefined) ??
|
|
2059
|
+
(isGjcExecutablePath(runtime, pathModule) ? runtime : undefined);
|
|
2060
|
+
if (!executable) throw unresolvedWorkerAuthorityError();
|
|
2061
|
+
return formatWorkerExecutable(platform, executable);
|
|
2043
2062
|
}
|
|
2044
2063
|
/** @internal Exported for unit tests. */
|
|
2045
2064
|
export function buildWorkerCommand(
|
|
@@ -4010,7 +4029,7 @@ async function attemptConfiguredMailboxTransport(
|
|
|
4010
4029
|
env,
|
|
4011
4030
|
});
|
|
4012
4031
|
if (!result) return null;
|
|
4013
|
-
if (result.transport === "
|
|
4032
|
+
if (result.transport === "sdk" && result.state === "failed") return null;
|
|
4014
4033
|
return writeNotificationRecord(dir, {
|
|
4015
4034
|
...notification,
|
|
4016
4035
|
delivery_state: result.state,
|
|
@@ -53,27 +53,63 @@ function isKnownNoServerDiagnostic(stderr: string): boolean {
|
|
|
53
53
|
);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
interface TmuxListSessionsResult {
|
|
57
|
+
exitCode: number | null;
|
|
58
|
+
stdout: string;
|
|
59
|
+
stderr: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface TmuxServerProofOptions {
|
|
63
|
+
platform?: NodeJS.Platform;
|
|
64
|
+
runListSessions?: (argv: string[]) => TmuxListSessionsResult;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function runTmuxListSessions(controlArgv: string[]): TmuxListSessionsResult {
|
|
60
68
|
const subprocess = Bun.spawnSync([...controlArgv, "list-sessions", "-F", "#{pid}\t#{session_name}"], {
|
|
61
69
|
stdout: "pipe",
|
|
62
70
|
stderr: "pipe",
|
|
63
71
|
});
|
|
64
|
-
|
|
72
|
+
return {
|
|
73
|
+
exitCode: subprocess.exitCode,
|
|
74
|
+
stdout: Buffer.from(subprocess.stdout).toString(),
|
|
75
|
+
stderr: Buffer.from(subprocess.stderr).toString(),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function parseTmuxSessionRows(stdout: string): { pid: number; sessionNames: string[] } | null {
|
|
80
|
+
const lines = stdout.split("\n");
|
|
81
|
+
if (lines[lines.length - 1] === "") lines.pop();
|
|
82
|
+
let pid: number | undefined;
|
|
83
|
+
const sessionNames: string[] = [];
|
|
84
|
+
for (const rawLine of lines) {
|
|
85
|
+
const line = rawLine.endsWith("\r") ? rawLine.slice(0, -1) : rawLine;
|
|
86
|
+
const columns = line.split("\t");
|
|
87
|
+
if (columns.length !== 2 || !/^[1-9]\d*$/.test(columns[0]) || !columns[1].trim()) return null;
|
|
88
|
+
const rowPid = Number(columns[0]);
|
|
89
|
+
if (!Number.isSafeInteger(rowPid) || (pid !== undefined && pid !== rowPid)) return null;
|
|
90
|
+
pid = rowPid;
|
|
91
|
+
sessionNames.push(columns[1]);
|
|
92
|
+
}
|
|
93
|
+
return pid === undefined ? null : { pid, sessionNames };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Probes a tmux server using an injectable list-sessions runner for platform-bounded callers. */
|
|
97
|
+
export async function tmuxServerProof(
|
|
98
|
+
socketKey: string,
|
|
99
|
+
tmuxControlArgv?: string[],
|
|
100
|
+
options: TmuxServerProofOptions = {},
|
|
101
|
+
): Promise<TmuxServerProof> {
|
|
102
|
+
void socketKey;
|
|
103
|
+
if (!tmuxControlArgv?.length) return { state: "unverifiable" };
|
|
104
|
+
const platform = options.platform ?? process.platform;
|
|
105
|
+
const subprocess = options.runListSessions?.(tmuxControlArgv) ?? runTmuxListSessions(tmuxControlArgv);
|
|
65
106
|
if (subprocess.exitCode !== 0)
|
|
66
|
-
return isKnownNoServerDiagnostic(stderr) ? { state: "absent" } : { state: "unverifiable" };
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const [pidText] = lines[0]?.split("\t") ?? [];
|
|
73
|
-
const pid = Number(pidText);
|
|
74
|
-
const sessionNames = lines.map(line => line.split("\t")[1]).filter((name): name is string => Boolean(name));
|
|
75
|
-
if (!Number.isSafeInteger(pid) || pid <= 0) return { state: "unverifiable" };
|
|
76
|
-
if (process.platform !== "linux") {
|
|
107
|
+
return isKnownNoServerDiagnostic(subprocess.stderr) ? { state: "absent" } : { state: "unverifiable" };
|
|
108
|
+
if (!subprocess.stdout.trim()) return { state: "absent" };
|
|
109
|
+
const rows = parseTmuxSessionRows(subprocess.stdout);
|
|
110
|
+
if (!rows) return { state: "unverifiable" };
|
|
111
|
+
const { pid, sessionNames } = rows;
|
|
112
|
+
if (platform !== "linux") {
|
|
77
113
|
return {
|
|
78
114
|
state: "safe",
|
|
79
115
|
pid,
|
|
@@ -82,7 +118,7 @@ async function tmuxServerProof(socketKey: string, tmuxControlArgv?: string[]): P
|
|
|
82
118
|
sessionNames,
|
|
83
119
|
};
|
|
84
120
|
}
|
|
85
|
-
const cgroup = classifyCgroup({ platform
|
|
121
|
+
const cgroup = classifyCgroup({ platform, cgroupText: await readCgroup(String(pid)) });
|
|
86
122
|
const startTime = await readProcessStartTime(pid);
|
|
87
123
|
if (!startTime) return { state: "unverifiable", pid, cgroup, sessionNames };
|
|
88
124
|
return {
|
|
@@ -1524,7 +1524,7 @@ export function isValidOwnerIntent(intent: unknown, request?: ObserveTerminalReq
|
|
|
1524
1524
|
intent.generation === request.owner_generation &&
|
|
1525
1525
|
intent.session_id === request.session_id &&
|
|
1526
1526
|
intent.server_key === request.socket_key &&
|
|
1527
|
-
intent.dispatch_id === request.operator_dispatch_id &&
|
|
1527
|
+
(request.operator_dispatch_id === undefined || intent.dispatch_id === request.operator_dispatch_id) &&
|
|
1528
1528
|
request.signal === "SIGTERM"
|
|
1529
1529
|
);
|
|
1530
1530
|
}
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
type TmuxOwnerIsolationExecutionResult,
|
|
50
50
|
type TmuxServerProof,
|
|
51
51
|
} from "./tmux-owner-isolation";
|
|
52
|
+
import { buildWindowsPowerShellInnerCommand } from "./windows-powershell-command";
|
|
52
53
|
|
|
53
54
|
export interface GjcTmuxSessionStatus {
|
|
54
55
|
name: string;
|
|
@@ -128,6 +129,10 @@ export interface ForceCloseOwnerDependencies {
|
|
|
128
129
|
const FORCE_CLOSE_VERDICT_TIMEOUT_MS = 5_000;
|
|
129
130
|
const FORCE_CLOSE_VERDICT_POLL_MS = 50;
|
|
130
131
|
|
|
132
|
+
export interface CreateGjcTmuxSessionOptions {
|
|
133
|
+
platform?: NodeJS.Platform;
|
|
134
|
+
}
|
|
135
|
+
|
|
131
136
|
export type CreateOwnerIsolationTestDependencies = {
|
|
132
137
|
probe?: Partial<OwnerIsolationProbeSync>;
|
|
133
138
|
execute?: (plan: PlanResponse, deps: TmuxOwnerIsolationExecutionDependencies) => TmuxOwnerIsolationExecutionResult;
|
|
@@ -354,15 +359,19 @@ export function statusGjcTmuxSession(sessionName: string, env: NodeJS.ProcessEnv
|
|
|
354
359
|
throw new Error(`gjc_tmux_session_not_found:${sessionName}`);
|
|
355
360
|
}
|
|
356
361
|
|
|
357
|
-
export function createGjcTmuxSession(
|
|
358
|
-
|
|
362
|
+
export function createGjcTmuxSession(
|
|
363
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
364
|
+
options: CreateGjcTmuxSessionOptions = {},
|
|
365
|
+
): GjcTmuxSessionStatus {
|
|
366
|
+
const platform = options.platform ?? process.platform;
|
|
367
|
+
const tmuxCommand = resolveGjcTmuxCommand(env, platform);
|
|
359
368
|
const sessionName = buildGjcTmuxSessionName(env);
|
|
360
369
|
const cwd = process.cwd();
|
|
361
370
|
const sessionId = env[GJC_COORDINATOR_SESSION_ID_ENV]?.trim() || sessionName;
|
|
362
371
|
const stateFile =
|
|
363
372
|
env[GJC_COORDINATOR_SESSION_STATE_FILE_ENV]?.trim() ||
|
|
364
373
|
tmuxRuntimeSessionPath(cwd, env.GJC_SESSION_ID?.trim() || sessionId, buildGjcTmuxSessionSlug(sessionName));
|
|
365
|
-
const stateDir = path.dirname(stateFile);
|
|
374
|
+
const stateDir = (platform === "win32" ? path.win32 : path).dirname(stateFile);
|
|
366
375
|
const generation = crypto.randomUUID();
|
|
367
376
|
const childEnvironment: Record<string, string> = {
|
|
368
377
|
GJC_TMUX_LAUNCHED: "1",
|
|
@@ -373,12 +382,9 @@ export function createGjcTmuxSession(env: NodeJS.ProcessEnv = process.env): GjcT
|
|
|
373
382
|
[GJC_COORDINATOR_SESSION_STATE_FILE_ENV]: stateFile,
|
|
374
383
|
};
|
|
375
384
|
const shellQuote = (value: string): string => `'${value.replace(/'/g, `'\\''`)}'`;
|
|
376
|
-
const powershellQuote = (value: string): string => `'${value.replace(/'/g, "''")}'`;
|
|
377
385
|
const command =
|
|
378
|
-
|
|
379
|
-
?
|
|
380
|
-
.map(([name, value]) => `$env:${name} = ${powershellQuote(value)}`)
|
|
381
|
-
.join("; ")}; gjc`
|
|
386
|
+
platform === "win32"
|
|
387
|
+
? buildWindowsPowerShellInnerCommand({ command: ["gjc"], environment: childEnvironment })
|
|
382
388
|
: `exec env ${Object.entries(childEnvironment)
|
|
383
389
|
.map(([name, value]) => `${name}=${shellQuote(value)}`)
|
|
384
390
|
.join(" ")} gjc`;
|
|
@@ -388,11 +394,11 @@ export function createGjcTmuxSession(env: NodeJS.ProcessEnv = process.env): GjcT
|
|
|
388
394
|
"-d",
|
|
389
395
|
"-s",
|
|
390
396
|
sessionName,
|
|
391
|
-
...(
|
|
397
|
+
...(platform === "win32" ? [] : ["-P", "-F", "#{session_id}"]),
|
|
392
398
|
command,
|
|
393
399
|
];
|
|
394
400
|
function probeTmuxServer(tmuxCommand: string, env: NodeJS.ProcessEnv): TmuxServerProof {
|
|
395
|
-
if (
|
|
401
|
+
if (platform !== "linux") {
|
|
396
402
|
return {
|
|
397
403
|
state: "safe",
|
|
398
404
|
pid: 1,
|
|
@@ -421,7 +427,7 @@ export function createGjcTmuxSession(env: NodeJS.ProcessEnv = process.env): GjcT
|
|
|
421
427
|
.split(/\s+/)[19];
|
|
422
428
|
if (!startTime) return { state: "unverifiable" };
|
|
423
429
|
const cgroup = classifyCgroup({
|
|
424
|
-
platform
|
|
430
|
+
platform,
|
|
425
431
|
cgroupText: fsSync.readFileSync(`/proc/${pid}/cgroup`, "utf8"),
|
|
426
432
|
});
|
|
427
433
|
return {
|
|
@@ -484,7 +490,7 @@ export function createGjcTmuxSession(env: NodeJS.ProcessEnv = process.env): GjcT
|
|
|
484
490
|
}
|
|
485
491
|
}),
|
|
486
492
|
};
|
|
487
|
-
if (resolveGjcTmuxBinary({ env }).isPsmux)
|
|
493
|
+
if (resolveGjcTmuxBinary({ env, platform }).isPsmux)
|
|
488
494
|
throw new Error("gjc_tmux_owner_isolation_native_session_identity_unavailable");
|
|
489
495
|
|
|
490
496
|
const baseline = captureOwnerGenerationBaselineSync(stateDir, sessionId);
|
|
@@ -492,7 +498,7 @@ export function createGjcTmuxSession(env: NodeJS.ProcessEnv = process.env): GjcT
|
|
|
492
498
|
{
|
|
493
499
|
schema_version: 1,
|
|
494
500
|
op: "plan",
|
|
495
|
-
platform
|
|
501
|
+
platform,
|
|
496
502
|
session_id: sessionId,
|
|
497
503
|
owner_generation: generation,
|
|
498
504
|
baseline,
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import * as fs from "node:fs/promises";
|
|
2
2
|
import { DEFAULT_ULTRAGOAL_OBJECTIVE } from "./goal-mode-request";
|
|
3
3
|
import { resolveGjcSessionForRead, SessionResolutionError } from "./session-resolution";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
validateDeferredMemberReceiptFresh,
|
|
6
|
+
validateReceiptFreshBase,
|
|
7
|
+
validateSupersededFinalAggregateReceipt,
|
|
8
|
+
} from "./ultragoal-receipt-freshness";
|
|
5
9
|
import {
|
|
6
10
|
getUltragoalPaths,
|
|
7
11
|
getUltragoalRunCompletionState,
|
|
@@ -156,8 +160,33 @@ function requiredGoals(plan: UltragoalPlan): UltragoalGoal[] {
|
|
|
156
160
|
return plan.goals.filter(goal => goal.status !== "superseded");
|
|
157
161
|
}
|
|
158
162
|
|
|
163
|
+
/**
|
|
164
|
+
* Select the goal whose final-aggregate receipt should represent the run.
|
|
165
|
+
* Prefer a receipt that still validates fresh; several goals can hold
|
|
166
|
+
* final-aggregate receipts once plan growth (e.g. `steer add_subgoal`) stales
|
|
167
|
+
* an earlier one and a later checkpoint re-mints. Fall back to the newest
|
|
168
|
+
* holder (array-last) purely for diagnostics when none validates.
|
|
169
|
+
*/
|
|
170
|
+
function findFinalAggregateReceiptGoal(
|
|
171
|
+
plan: UltragoalPlan,
|
|
172
|
+
ledger: readonly UltragoalLedgerEvent[],
|
|
173
|
+
): UltragoalGoal | null {
|
|
174
|
+
const candidates = [...requiredGoals(plan)]
|
|
175
|
+
.reverse()
|
|
176
|
+
.filter(goal => goal.completionVerification?.receiptKind === "final-aggregate");
|
|
177
|
+
if (candidates.length === 0) return null;
|
|
178
|
+
return (
|
|
179
|
+
candidates.find(
|
|
180
|
+
goal =>
|
|
181
|
+
validateCompletionReceipt({ plan, ledger, goal, receiptKind: "final-aggregate" }).state ===
|
|
182
|
+
"active_verified_complete",
|
|
183
|
+
) ?? candidates[0]!
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
159
187
|
function findReceiptGoal(
|
|
160
188
|
plan: UltragoalPlan,
|
|
189
|
+
ledger: readonly UltragoalLedgerEvent[],
|
|
161
190
|
currentObjective: string,
|
|
162
191
|
): { goal: UltragoalGoal; receiptKind: UltragoalReceiptKind } | null {
|
|
163
192
|
if (
|
|
@@ -165,15 +194,46 @@ function findReceiptGoal(
|
|
|
165
194
|
currentObjective === DEFAULT_ULTRAGOAL_OBJECTIVE ||
|
|
166
195
|
plan.gjcObjectiveAliases?.some(alias => alias === currentObjective)
|
|
167
196
|
) {
|
|
168
|
-
const finalGoal =
|
|
169
|
-
.reverse()
|
|
170
|
-
.find(goal => goal.completionVerification?.receiptKind === "final-aggregate");
|
|
197
|
+
const finalGoal = findFinalAggregateReceiptGoal(plan, ledger);
|
|
171
198
|
return finalGoal ? { goal: finalGoal, receiptKind: "final-aggregate" } : null;
|
|
172
199
|
}
|
|
173
200
|
const storyGoal = plan.goals.find(goal => goal.objective === currentObjective);
|
|
174
201
|
return storyGoal ? { goal: storyGoal, receiptKind: "per-goal" } : null;
|
|
175
202
|
}
|
|
176
203
|
|
|
204
|
+
/**
|
|
205
|
+
* A review-blocker replacement can stand in for a superseded validation-batch
|
|
206
|
+
* final only while validating the run's final aggregate receipt. Ordinary
|
|
207
|
+
* per-goal validation continues to require the original batch-close receipt.
|
|
208
|
+
*/
|
|
209
|
+
function hasFreshReviewedBatchFinalReplacement(input: {
|
|
210
|
+
plan: UltragoalPlan;
|
|
211
|
+
ledger: readonly UltragoalLedgerEvent[];
|
|
212
|
+
deferredGoal: UltragoalGoal;
|
|
213
|
+
}): boolean {
|
|
214
|
+
const finalGoalId = input.deferredGoal.completionVerification?.validationBatch?.finalGoalId;
|
|
215
|
+
const finalGoal = finalGoalId ? input.plan.goals.find(goal => goal.id === finalGoalId) : undefined;
|
|
216
|
+
if (finalGoal?.status !== "superseded") return false;
|
|
217
|
+
const replacements = input.plan.goals.filter(
|
|
218
|
+
goal =>
|
|
219
|
+
goal.status === "complete" &&
|
|
220
|
+
goal.steering?.kind === "review_blocker" &&
|
|
221
|
+
goal.steering.blockedGoalId === finalGoal.id,
|
|
222
|
+
);
|
|
223
|
+
if (replacements.length !== 1) return false;
|
|
224
|
+
const replacement = replacements[0]!;
|
|
225
|
+
const receipt = replacement.completionVerification;
|
|
226
|
+
if (receipt?.receiptKind !== "per-goal") return false;
|
|
227
|
+
return (
|
|
228
|
+
validateCompletionReceipt({
|
|
229
|
+
plan: input.plan,
|
|
230
|
+
ledger: input.ledger,
|
|
231
|
+
goal: replacement,
|
|
232
|
+
receiptKind: "per-goal",
|
|
233
|
+
}).state === "active_verified_complete"
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
|
|
177
237
|
export function validateCompletionReceipt(input: {
|
|
178
238
|
plan: UltragoalPlan;
|
|
179
239
|
ledger: readonly UltragoalLedgerEvent[];
|
|
@@ -267,12 +327,48 @@ export function validateCompletionReceipt(input: {
|
|
|
267
327
|
goalId: input.goal.id,
|
|
268
328
|
};
|
|
269
329
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
330
|
+
if (
|
|
331
|
+
priorGoal.completionVerification.validationBatch?.role !== "deferred-member" &&
|
|
332
|
+
priorGoal.completionVerification.receiptKind === "final-aggregate"
|
|
333
|
+
) {
|
|
334
|
+
// A prior goal may hold the run's previous final-aggregate receipt
|
|
335
|
+
// when plan growth staled it and a later checkpoint re-minted the
|
|
336
|
+
// aggregate receipt. Accept it as historical evidence for its own
|
|
337
|
+
// goal instead of demanding an impossible per-goal receipt.
|
|
338
|
+
const supersededDiagnostic = validateSupersededFinalAggregateReceipt({
|
|
339
|
+
ledger: input.ledger,
|
|
340
|
+
goal: priorGoal,
|
|
341
|
+
receipt: priorGoal.completionVerification,
|
|
342
|
+
});
|
|
343
|
+
if (supersededDiagnostic) {
|
|
344
|
+
return {
|
|
345
|
+
state: supersededDiagnostic.state,
|
|
346
|
+
message: `Ultragoal final receipt requires valid historical evidence for ${priorGoal.id}: ${supersededDiagnostic.message}`,
|
|
347
|
+
goalId: input.goal.id,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
const priorDiagnostic =
|
|
353
|
+
priorGoal.completionVerification.validationBatch?.role === "deferred-member"
|
|
354
|
+
? validateDeferredMemberReceiptFresh({
|
|
355
|
+
plan: input.plan,
|
|
356
|
+
ledger: input.ledger,
|
|
357
|
+
goal: priorGoal,
|
|
358
|
+
receipt: priorGoal.completionVerification,
|
|
359
|
+
receiptKind: "per-goal",
|
|
360
|
+
requireClose: !hasFreshReviewedBatchFinalReplacement({
|
|
361
|
+
plan: input.plan,
|
|
362
|
+
ledger: input.ledger,
|
|
363
|
+
deferredGoal: priorGoal,
|
|
364
|
+
}),
|
|
365
|
+
})
|
|
366
|
+
: validateCompletionReceipt({
|
|
367
|
+
plan: input.plan,
|
|
368
|
+
ledger: input.ledger,
|
|
369
|
+
goal: priorGoal,
|
|
370
|
+
receiptKind: "per-goal",
|
|
371
|
+
});
|
|
276
372
|
if (priorDiagnostic.state !== "active_verified_complete") {
|
|
277
373
|
return {
|
|
278
374
|
state: priorDiagnostic.state,
|
|
@@ -334,7 +430,7 @@ export async function readUltragoalVerificationState(input: {
|
|
|
334
430
|
message: "Ultragoal has blocked or failed goals; record blockers or rerun verification.",
|
|
335
431
|
};
|
|
336
432
|
}
|
|
337
|
-
const receiptTarget = findReceiptGoal(plan, currentObjective);
|
|
433
|
+
const receiptTarget = findReceiptGoal(plan, ledger, currentObjective);
|
|
338
434
|
if (!receiptTarget) {
|
|
339
435
|
// When earlier required goals are already complete but later ones remain, name the
|
|
340
436
|
// specific blocking goals (a final-aggregate receipt cannot exist yet anyway). Only
|
|
@@ -576,9 +672,7 @@ export async function isUltragoalAskBlocked(
|
|
|
576
672
|
});
|
|
577
673
|
}
|
|
578
674
|
|
|
579
|
-
const finalReceiptGoal =
|
|
580
|
-
.reverse()
|
|
581
|
-
.find(goal => goal.completionVerification?.receiptKind === "final-aggregate");
|
|
675
|
+
const finalReceiptGoal = findFinalAggregateReceiptGoal(plan, ledger);
|
|
582
676
|
if (!finalReceiptGoal) {
|
|
583
677
|
return activeAskDiagnostic({
|
|
584
678
|
reason: "Ultragoal aggregate completion is missing a final aggregate receipt.",
|
|
@@ -244,6 +244,93 @@ export function validateReceiptFreshBase(input: {
|
|
|
244
244
|
return null;
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
+
/**
|
|
248
|
+
* Validate a receipt whose plan-generation freshness was legitimately staled
|
|
249
|
+
* by later plan growth as a historical attestation for its own goal:
|
|
250
|
+
* internally consistent, anchored to a ledger checkpoint event that carries a
|
|
251
|
+
* byte-identical receipt, quality gate untampered, and the goal row untouched
|
|
252
|
+
* since verification. Plan-generation freshness against the CURRENT plan is
|
|
253
|
+
* intentionally not required; that is exactly what later plan growth
|
|
254
|
+
* invalidates by design. Returns null when the receipt stands as valid
|
|
255
|
+
* historical evidence.
|
|
256
|
+
*/
|
|
257
|
+
function validateLedgerAnchoredHistoricalReceipt(input: {
|
|
258
|
+
ledger: readonly UltragoalLedgerEvent[];
|
|
259
|
+
goal: UltragoalGoal;
|
|
260
|
+
receipt: UltragoalCompletionVerification;
|
|
261
|
+
label: string;
|
|
262
|
+
}): UltragoalReceiptFreshnessDiagnostic | null {
|
|
263
|
+
if (
|
|
264
|
+
input.receipt.schemaVersion !== 1 ||
|
|
265
|
+
input.receipt.goalId !== input.goal.id ||
|
|
266
|
+
!input.receipt.planGeneration ||
|
|
267
|
+
!input.receipt.checkpointLedgerEventId ||
|
|
268
|
+
hashStructuredValue(input.receipt.basis) !== input.receipt.planGeneration
|
|
269
|
+
) {
|
|
270
|
+
return {
|
|
271
|
+
state: "active_stale_receipt",
|
|
272
|
+
message: `Ultragoal ${input.goal.id} ${input.label} is malformed.`,
|
|
273
|
+
goalId: input.goal.id,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const event = findLedgerReceiptEvent(input.ledger, input.receipt);
|
|
277
|
+
if (!event)
|
|
278
|
+
return {
|
|
279
|
+
state: "active_stale_receipt",
|
|
280
|
+
message: `Ultragoal ${input.goal.id} ${input.label} ledger event is missing.`,
|
|
281
|
+
goalId: input.goal.id,
|
|
282
|
+
};
|
|
283
|
+
// Bind the goals.json receipt to the FULL receipt recorded on the ledger
|
|
284
|
+
// event. Field-selective matching would accept a coordinated edit of the
|
|
285
|
+
// goals-row basis/generation paired with only the event generation.
|
|
286
|
+
const eventReceipt = event.completionVerification as UltragoalCompletionVerification | undefined;
|
|
287
|
+
if (!eventReceipt || hashStructuredValue(eventReceipt) !== hashStructuredValue(input.receipt))
|
|
288
|
+
return {
|
|
289
|
+
state: "active_stale_receipt",
|
|
290
|
+
message: `Ultragoal ${input.goal.id} ${input.label} does not match its ledger event receipt.`,
|
|
291
|
+
goalId: input.goal.id,
|
|
292
|
+
};
|
|
293
|
+
if (hashStructuredValue(event.qualityGateJson) !== input.receipt.qualityGateHash)
|
|
294
|
+
return {
|
|
295
|
+
state: "active_dirty_quality_gate",
|
|
296
|
+
message: `Ultragoal ${input.goal.id} ${input.label} quality-gate hash does not match ledger.`,
|
|
297
|
+
goalId: input.goal.id,
|
|
298
|
+
};
|
|
299
|
+
if (input.goal.updatedAt !== input.receipt.verifiedAt)
|
|
300
|
+
return {
|
|
301
|
+
state: "active_stale_receipt",
|
|
302
|
+
message: `Ultragoal ${input.goal.id} changed after its ${input.label} was verified.`,
|
|
303
|
+
goalId: input.goal.id,
|
|
304
|
+
};
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Validate a final-aggregate receipt that was legitimately superseded — its
|
|
310
|
+
* aggregate claim staled by later plan growth (e.g. `steer add_subgoal`
|
|
311
|
+
* appending goals after a terminal run) — as historical evidence for its own
|
|
312
|
+
* goal. Returns null when the receipt stands.
|
|
313
|
+
*/
|
|
314
|
+
export function validateSupersededFinalAggregateReceipt(input: {
|
|
315
|
+
ledger: readonly UltragoalLedgerEvent[];
|
|
316
|
+
goal: UltragoalGoal;
|
|
317
|
+
receipt: UltragoalCompletionVerification;
|
|
318
|
+
}): UltragoalReceiptFreshnessDiagnostic | null {
|
|
319
|
+
if (input.receipt.receiptKind !== "final-aggregate") {
|
|
320
|
+
return {
|
|
321
|
+
state: "active_stale_receipt",
|
|
322
|
+
message: `Ultragoal ${input.goal.id} superseded final-aggregate receipt is malformed.`,
|
|
323
|
+
goalId: input.goal.id,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
return validateLedgerAnchoredHistoricalReceipt({
|
|
327
|
+
ledger: input.ledger,
|
|
328
|
+
goal: input.goal,
|
|
329
|
+
receipt: input.receipt,
|
|
330
|
+
label: "superseded final-aggregate receipt",
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
|
|
247
334
|
export function findFreshBatchCloseReceipt(input: {
|
|
248
335
|
plan: UltragoalPlan;
|
|
249
336
|
ledger: readonly UltragoalLedgerEvent[];
|
|
@@ -267,7 +354,21 @@ export function findFreshBatchCloseReceipt(input: {
|
|
|
267
354
|
receipt: finalReceipt,
|
|
268
355
|
receiptKind: finalReceipt.receiptKind,
|
|
269
356
|
});
|
|
270
|
-
|
|
357
|
+
if (!diagnostic) return finalReceipt;
|
|
358
|
+
// A batch close staled only by later plan growth (e.g. `steer add_subgoal`
|
|
359
|
+
// after the batch completed) still proves the batch was validly closed:
|
|
360
|
+
// the member receipts are freshness-checked separately, the close is
|
|
361
|
+
// anchored to its ledger event, and the final goal's row is untouched.
|
|
362
|
+
// Without this, completing a goal appended after a closed batch can never
|
|
363
|
+
// validate, because the old close can never be fresh against the grown
|
|
364
|
+
// plan and identical-evidence replays of fresh receipts are no-ops.
|
|
365
|
+
const historicalDiagnostic = validateLedgerAnchoredHistoricalReceipt({
|
|
366
|
+
ledger: input.ledger,
|
|
367
|
+
goal: finalGoal,
|
|
368
|
+
receipt: finalReceipt,
|
|
369
|
+
label: "superseded batch-close receipt",
|
|
370
|
+
});
|
|
371
|
+
return historicalDiagnostic ? null : finalReceipt;
|
|
271
372
|
}
|
|
272
373
|
|
|
273
374
|
export function validateDeferredMemberReceiptFresh(input: {
|