@gajae-code/coding-agent 0.11.11 → 0.12.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 +131 -4
- package/dist/types/async/job-manager.d.ts +17 -3
- package/dist/types/cli/read-cli.d.ts +1 -0
- package/dist/types/commands/deep-interview.d.ts +9 -0
- package/dist/types/commands/harness.d.ts +22 -0
- package/dist/types/commands/read.d.ts +6 -0
- package/dist/types/config/model-registry.d.ts +4 -0
- package/dist/types/config/provider-auth-health.d.ts +14 -0
- package/dist/types/config/provider-ranking.d.ts +59 -0
- package/dist/types/config/settings-schema.d.ts +83 -1
- package/dist/types/config/settings.d.ts +2 -0
- package/dist/types/exa/mcp-client.d.ts +10 -1
- package/dist/types/exec/bash-executor.d.ts +45 -12
- package/dist/types/extensibility/extensions/types.d.ts +38 -4
- package/dist/types/extensibility/gjc-plugins/index.d.ts +12 -2
- package/dist/types/extensibility/gjc-plugins/installer.d.ts +63 -7
- package/dist/types/extensibility/gjc-plugins/lifecycle-reconciliation.d.ts +55 -0
- package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +64 -0
- package/dist/types/extensibility/gjc-plugins/runtime-quarantine.d.ts +67 -0
- package/dist/types/extensibility/gjc-plugins/session-validation.d.ts +3 -1
- package/dist/types/extensibility/gjc-plugins/types.d.ts +124 -0
- package/dist/types/extensibility/shared-events.d.ts +6 -0
- package/dist/types/gjc-runtime/deep-interview-ambiguity.d.ts +5 -12
- package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +17 -32
- package/dist/types/gjc-runtime/deep-interview-stage.d.ts +37 -0
- package/dist/types/gjc-runtime/deep-interview-state.d.ts +4 -135
- package/dist/types/gjc-runtime/gc-runtime.d.ts +1 -1
- package/dist/types/gjc-runtime/launch-tmux.d.ts +1 -0
- package/dist/types/gjc-runtime/memory-guard-owner-claims.d.ts +47 -0
- package/dist/types/gjc-runtime/ralplan-runtime.d.ts +70 -1
- package/dist/types/gjc-runtime/state-writer.d.ts +5 -46
- package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
- package/dist/types/gjc-runtime/team-runtime.d.ts +27 -1
- package/dist/types/gjc-runtime/team-store.d.ts +12 -0
- package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
- package/dist/types/gjc-runtime/team-worker-memory-guard.d.ts +92 -0
- package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +17 -0
- package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +8 -0
- package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
- package/dist/types/gjc-runtime/workflow-manifest.d.ts +3 -5
- package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
- package/dist/types/main.d.ts +1 -1
- package/dist/types/memories/index.d.ts +2 -0
- package/dist/types/modes/acp/acp-agent.d.ts +10 -19
- package/dist/types/modes/components/assistant-message.d.ts +3 -1
- package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
- package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
- package/dist/types/modes/components/read-tool-group.d.ts +4 -4
- package/dist/types/modes/components/session-observer-overlay.d.ts +22 -0
- package/dist/types/modes/components/settings-selector.d.ts +11 -0
- package/dist/types/modes/components/status-line/gh.d.ts +5 -0
- package/dist/types/modes/components/tool-execution.d.ts +8 -0
- package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
- package/dist/types/modes/controllers/event-controller.d.ts +3 -0
- package/dist/types/modes/interactive-mode.d.ts +2 -0
- package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
- package/dist/types/modes/types.d.ts +2 -0
- package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
- package/dist/types/reminders/star-reminder.d.ts +3 -13
- package/dist/types/runtime-mcp/manager.d.ts +1 -0
- package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
- package/dist/types/sdk/acp/adapter.d.ts +3 -1
- package/dist/types/sdk/broker/lifecycle.d.ts +5 -0
- package/dist/types/sdk/broker/transport.d.ts +2 -0
- package/dist/types/sdk/bus/attachment-registry.d.ts +1 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +4 -1
- package/dist/types/sdk/bus/config.d.ts +6 -2
- package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
- package/dist/types/sdk/bus/index.d.ts +44 -1
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +44 -0
- package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +2 -1
- package/dist/types/sdk/bus/reconciliation-store.d.ts +69 -0
- package/dist/types/sdk/bus/rich-draft.d.ts +1 -0
- package/dist/types/sdk/bus/rich-render.d.ts +2 -0
- package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +165 -0
- package/dist/types/sdk/bus/telegram-cli.d.ts +12 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -4
- package/dist/types/sdk/bus/telegram-daemon.d.ts +25 -1
- package/dist/types/sdk/bus/telegram-reference.d.ts +11 -1
- package/dist/types/sdk/bus/threaded-render.d.ts +3 -2
- package/dist/types/sdk/bus/topic-registry.d.ts +11 -1
- package/dist/types/sdk/host/control/operations.d.ts +1 -1
- package/dist/types/sdk/host/host.d.ts +2 -0
- package/dist/types/sdk/host/query/handlers.d.ts +5 -0
- package/dist/types/sdk/host/query/revision-store.d.ts +2 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
- package/dist/types/sdk/prompt-status.d.ts +23 -3
- package/dist/types/sdk/session.d.ts +6 -0
- package/dist/types/session/agent-session.d.ts +82 -12
- package/dist/types/session/artifacts.d.ts +8 -0
- package/dist/types/session/blob-store.d.ts +57 -4
- package/dist/types/session/internal/managed-session-storage.d.ts +8 -1
- package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
- package/dist/types/session/session-manager.d.ts +48 -19
- package/dist/types/session/session-storage.d.ts +4 -0
- package/dist/types/session/streaming-output.d.ts +96 -12
- package/dist/types/setup/credential-import.d.ts +12 -0
- package/dist/types/skill-state/active-state.d.ts +12 -4
- package/dist/types/skill-state/workflow-hud.d.ts +9 -0
- package/dist/types/task/executor.d.ts +3 -2
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/task/provider-retry-status.d.ts +8 -0
- package/dist/types/task/receipt.d.ts +7 -1
- package/dist/types/task/types.d.ts +23 -0
- package/dist/types/tools/ask-answer-registry.d.ts +2 -2
- package/dist/types/tools/bash-interactive.d.ts +4 -1
- package/dist/types/tools/bash.d.ts +3 -1
- package/dist/types/tools/browser/launch.d.ts +7 -0
- package/dist/types/tools/fetch.d.ts +17 -1
- package/dist/types/tools/image-gen.d.ts +4 -0
- package/dist/types/tools/index.d.ts +4 -0
- package/dist/types/tools/output-meta.d.ts +44 -3
- package/dist/types/tools/path-utils.d.ts +1 -0
- package/dist/types/tools/read-internals.d.ts +12 -0
- package/dist/types/tools/read.d.ts +45 -7
- package/dist/types/tools/resource-gc.d.ts +4 -0
- package/dist/types/tools/review.d.ts +5 -7
- package/dist/types/tools/subagent.d.ts +2 -0
- package/dist/types/tools/tool-result.d.ts +7 -1
- package/dist/types/utils/gh.d.ts +13 -0
- package/dist/types/utils/image-resize.d.ts +1 -0
- package/dist/types/web/search/providers/kimi.d.ts +2 -0
- package/dist/types/web/search/providers/searxng.d.ts +7 -0
- package/dist/types/web/search/providers/xai.d.ts +2 -0
- package/package.json +11 -13
- package/scripts/acp-conformance-agent.ts +218 -0
- package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
- package/scripts/capture-gjc-bundle-settings.ts +306 -0
- package/scripts/capture-sticky-viewport-showcase.ts +292 -0
- package/scripts/generate-sdk-operation-inventory.ts +5 -0
- package/scripts/resident-memory-bench.ts +1341 -0
- package/scripts/run-acp-conformance.ts +285 -0
- package/scripts/verify-gjc-sdk-canonicalization.ts +122 -18
- package/scripts/verify-sticky-viewport-showcase.ts +611 -0
- package/src/async/job-manager.ts +78 -20
- package/src/capability/index.ts +8 -0
- package/src/cli/fast-help.ts +1 -1
- package/src/cli/plugin-cli.ts +176 -18
- package/src/cli/read-cli.ts +2 -1
- package/src/cli.ts +1 -0
- package/src/commands/deep-interview.ts +29 -9
- package/src/commands/harness.ts +35 -12
- package/src/commands/read.ts +11 -2
- package/src/commands/team.ts +20 -2
- package/src/config/file-lock.ts +11 -2
- package/src/config/model-registry.ts +21 -2
- package/src/config/provider-auth-health.ts +42 -0
- package/src/config/provider-ranking.ts +119 -0
- package/src/config/settings-schema.ts +74 -1
- package/src/config/settings.ts +246 -108
- package/src/coordinator-mcp/question-gate-codec.ts +1 -1
- package/src/coordinator-mcp/server.ts +5 -12
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +230 -82
- package/src/defaults/gjc/skills/ralplan/SKILL.md +77 -41
- package/src/defaults/gjc/skills/team/SKILL.md +3 -1
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +62 -39
- package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
- package/src/defaults/gjc-defaults.ts +4 -4
- package/src/eval/py/executor.ts +7 -2
- package/src/exa/mcp-client.ts +12 -3
- package/src/exec/bash-executor.ts +144 -27
- package/src/extensibility/extensions/runner.ts +15 -0
- package/src/extensibility/extensions/types.ts +46 -5
- package/src/extensibility/gjc-plugins/constrained-hooks.ts +8 -2
- package/src/extensibility/gjc-plugins/index.ts +19 -2
- package/src/extensibility/gjc-plugins/installer.ts +189 -50
- package/src/extensibility/gjc-plugins/lifecycle-reconciliation.ts +199 -0
- package/src/extensibility/gjc-plugins/lifecycle.ts +626 -0
- package/src/extensibility/gjc-plugins/observability.ts +3 -3
- package/src/extensibility/gjc-plugins/prompt-appendix.ts +5 -1
- package/src/extensibility/gjc-plugins/runtime-adapters.ts +12 -2
- package/src/extensibility/gjc-plugins/runtime-quarantine.ts +121 -0
- package/src/extensibility/gjc-plugins/schema.ts +84 -12
- package/src/extensibility/gjc-plugins/session-validation.ts +9 -3
- package/src/extensibility/gjc-plugins/types.ts +141 -0
- package/src/extensibility/gjc-plugins/validation.ts +9 -0
- package/src/extensibility/shared-events.ts +5 -0
- package/src/gjc-runtime/deep-interview-ambiguity.ts +47 -82
- package/src/gjc-runtime/deep-interview-recorder.ts +227 -310
- package/src/gjc-runtime/deep-interview-runtime.ts +109 -270
- package/src/gjc-runtime/deep-interview-stage.ts +1016 -0
- package/src/gjc-runtime/deep-interview-state.ts +12 -943
- package/src/gjc-runtime/gc-render.ts +1 -0
- package/src/gjc-runtime/gc-runtime.ts +11 -1
- package/src/gjc-runtime/launch-tmux.ts +25 -6
- package/src/gjc-runtime/managed-owner-admission.ts +1 -1
- package/src/gjc-runtime/memory-guard-owner-claims.ts +389 -0
- package/src/gjc-runtime/ralplan-runtime.ts +1149 -98
- package/src/gjc-runtime/state-runtime.ts +2 -1
- package/src/gjc-runtime/state-writer.ts +70 -222
- package/src/gjc-runtime/team-launch.ts +42 -5
- package/src/gjc-runtime/team-runtime.ts +1085 -40
- package/src/gjc-runtime/team-store.ts +32 -0
- package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
- package/src/gjc-runtime/team-worker-memory-guard.ts +363 -0
- package/src/gjc-runtime/team-workers.ts +1 -0
- package/src/gjc-runtime/tmux-owner-isolation.ts +28 -0
- package/src/gjc-runtime/tmux-sessions.ts +58 -13
- package/src/gjc-runtime/ultragoal-receipt-freshness.ts +20 -0
- package/src/gjc-runtime/ultragoal-runtime.ts +414 -618
- package/src/gjc-runtime/workflow-manifest.generated.json +105 -449
- package/src/gjc-runtime/workflow-manifest.ts +38 -247
- package/src/hooks/native-skill-hook.ts +17 -4
- package/src/hooks/skill-state.ts +1 -23
- package/src/internal-urls/docs-index.generated.ts +21 -22
- package/src/internal-urls/local-root-gc.ts +127 -0
- package/src/main.ts +9 -5
- package/src/memories/index.ts +10 -0
- package/src/modes/DESIGN.md +98 -0
- package/src/modes/acp/acp-agent.ts +339 -191
- package/src/modes/acp/acp-event-mapper.ts +14 -7
- package/src/modes/acp/acp-mode.ts +39 -3
- package/src/modes/components/assistant-message.ts +123 -22
- package/src/modes/components/gjc-bundle-settings.ts +508 -0
- package/src/modes/components/irc-sidebar.ts +176 -62
- package/src/modes/components/model-selector.ts +61 -4
- package/src/modes/components/notifications-settings-editor.ts +12 -1
- package/src/modes/components/oauth-selector.ts +96 -28
- package/src/modes/components/read-tool-group.ts +82 -14
- package/src/modes/components/session-observer-overlay.ts +457 -83
- package/src/modes/components/settings-selector.ts +116 -23
- package/src/modes/components/status-line/gh.ts +16 -0
- package/src/modes/components/tool-execution.ts +138 -27
- package/src/modes/components/tool-status-header.ts +3 -14
- package/src/modes/components/transcript-viewer-overlay.ts +99 -24
- package/src/modes/controllers/command-controller.ts +4 -0
- package/src/modes/controllers/event-controller.ts +109 -27
- package/src/modes/controllers/extension-ui-controller.ts +26 -2
- package/src/modes/controllers/input-controller.ts +18 -3
- package/src/modes/controllers/selector-controller.ts +127 -36
- package/src/modes/interactive-mode.ts +62 -3
- package/src/modes/irc-observation-ledger.ts +71 -15
- package/src/modes/runtime-init.ts +22 -2
- package/src/modes/types.ts +2 -0
- package/src/modes/utils/ui-helpers.ts +94 -1
- package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
- package/src/prompts/agents/architect.md +9 -1
- package/src/prompts/agents/critic.md +9 -0
- package/src/prompts/system/eager-todo.md +8 -4
- package/src/prompts/system/system-prompt.md +11 -5
- package/src/prompts/tools/bash.md +5 -5
- package/src/prompts/tools/read.md +4 -2
- package/src/prompts/tools/search-tool-bm25.md +5 -0
- package/src/prompts/tools/task.md +1 -1
- package/src/reminders/star-reminder.ts +4 -42
- package/src/runtime-mcp/manager.ts +19 -4
- package/src/runtime-mcp/smithery-auth.ts +17 -2
- package/src/runtime-mcp/smithery-connect.ts +11 -1
- package/src/sdk/acp/adapter.ts +22 -6
- package/src/sdk/broker/lifecycle.ts +25 -6
- package/src/sdk/broker/transport.ts +35 -3
- package/src/sdk/bus/attachment-registry.ts +5 -1
- package/src/sdk/bus/chat-daemon-cli.ts +4 -39
- package/src/sdk/bus/chat-daemon-control.ts +6 -3
- package/src/sdk/bus/config.ts +18 -2
- package/src/sdk/bus/control-drain-lease.ts +104 -0
- package/src/sdk/bus/index.ts +984 -146
- package/src/sdk/bus/kind-aware-reconciliation.ts +317 -0
- package/src/sdk/bus/lifecycle-commands.ts +4 -1
- package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
- package/src/sdk/bus/prompt-reconciliation.ts +2 -1
- package/src/sdk/bus/reconciliation-store.ts +303 -0
- package/src/sdk/bus/rich-draft.ts +1 -1
- package/src/sdk/bus/rich-render.ts +2 -2
- package/src/sdk/bus/telegram-adoption-intent.ts +574 -0
- package/src/sdk/bus/telegram-cli.ts +33 -8
- package/src/sdk/bus/telegram-daemon-cli.ts +1 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +11 -4
- package/src/sdk/bus/telegram-daemon.ts +916 -23
- package/src/sdk/bus/telegram-reference.ts +40 -3
- package/src/sdk/bus/threaded-render.ts +48 -3
- package/src/sdk/bus/topic-registry.ts +20 -0
- package/src/sdk/host/control/dispatch.ts +5 -1
- package/src/sdk/host/control/operations.ts +1 -1
- package/src/sdk/host/host.ts +23 -1
- package/src/sdk/host/query/handlers.ts +55 -0
- package/src/sdk/host/query/revision-store.ts +36 -2
- package/src/sdk/host/reverse-leases.ts +44 -7
- package/src/sdk/mcp/server.ts +46 -18
- package/src/sdk/prompt-status.ts +16 -3
- package/src/sdk/protocol/operation-inventory.generated.json +51 -0
- package/src/sdk/protocol/operation-registry.ts +7 -2
- package/src/sdk/session.ts +101 -10
- package/src/session/agent-session.ts +1286 -220
- package/src/session/artifacts.ts +22 -0
- package/src/session/auth-broker-config.ts +10 -3
- package/src/session/blob-store.ts +915 -24
- package/src/session/internal/managed-session-scope.ts +44 -6
- package/src/session/internal/managed-session-storage.ts +48 -6
- package/src/session/memory-guard-checkpoint-participant.ts +131 -0
- package/src/session/session-manager.ts +2364 -438
- package/src/session/session-storage.ts +9 -1
- package/src/session/streaming-output.ts +500 -111
- package/src/setup/credential-import.ts +75 -13
- package/src/setup/provider-onboarding.ts +19 -4
- package/src/skill-state/active-state.ts +32 -10
- package/src/skill-state/workflow-hud.ts +42 -2
- package/src/skill-state/workflow-mutation-guard.ts +560 -8
- package/src/task/executor.ts +122 -39
- package/src/task/index.ts +23 -14
- package/src/task/provider-retry-status.ts +16 -0
- package/src/task/receipt.ts +23 -7
- package/src/task/render.ts +6 -2
- package/src/task/types.ts +108 -0
- package/src/tools/ask-answer-registry.ts +12 -6
- package/src/tools/ask.ts +169 -118
- package/src/tools/ast-edit.ts +1 -0
- package/src/tools/ast-grep.ts +1 -0
- package/src/tools/bash-interactive.ts +8 -3
- package/src/tools/bash.ts +503 -60
- package/src/tools/browser/launch.ts +41 -6
- package/src/tools/fetch.ts +114 -23
- package/src/tools/find.ts +1 -0
- package/src/tools/image-gen.ts +29 -5
- package/src/tools/index.ts +4 -0
- package/src/tools/output-meta.ts +281 -20
- package/src/tools/path-utils.ts +8 -3
- package/src/tools/read-internals.ts +44 -0
- package/src/tools/read.ts +1560 -310
- package/src/tools/resource-gc.ts +182 -18
- package/src/tools/review.ts +5 -7
- package/src/tools/search.ts +1 -0
- package/src/tools/subagent-render.ts +6 -2
- package/src/tools/subagent.ts +6 -0
- package/src/tools/telegram-send.ts +6 -3
- package/src/tools/tool-result.ts +14 -1
- package/src/utils/gh.ts +39 -0
- package/src/utils/image-resize.ts +3 -0
- package/src/web/search/providers/anthropic.ts +4 -4
- package/src/web/search/providers/codex.ts +1 -1
- package/src/web/search/providers/kimi.ts +15 -5
- package/src/web/search/providers/searxng.ts +47 -4
- package/src/web/search/providers/xai.ts +7 -2
- package/dist/types/gjc-runtime/deep-interview-draft.d.ts +0 -8
- package/dist/types/gjc-runtime/deep-interview-payload.d.ts +0 -41
- package/dist/types/gjc-runtime/deep-interview-repair.d.ts +0 -17
- package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +0 -23
- package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
- package/src/gjc-runtime/deep-interview-draft.ts +0 -843
- package/src/gjc-runtime/deep-interview-payload.ts +0 -262
- package/src/gjc-runtime/deep-interview-repair.ts +0 -1674
- package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
|
@@ -407,6 +407,7 @@ export function createGjcTmuxSession(
|
|
|
407
407
|
pid: 1,
|
|
408
408
|
startTime: "not-applicable",
|
|
409
409
|
cgroup: { classification: "not_applicable" },
|
|
410
|
+
pidProven: false,
|
|
410
411
|
};
|
|
411
412
|
}
|
|
412
413
|
const result = Bun.spawnSync([tmuxCommand, "display-message", "-p", "#{pid}"], {
|
|
@@ -534,6 +535,7 @@ export function createGjcTmuxSession(
|
|
|
534
535
|
env,
|
|
535
536
|
server.pid,
|
|
536
537
|
server.startTime,
|
|
538
|
+
server.pidProven,
|
|
537
539
|
);
|
|
538
540
|
},
|
|
539
541
|
});
|
|
@@ -551,7 +553,7 @@ export function createGjcTmuxSession(
|
|
|
551
553
|
tagCreatedTmuxSession(
|
|
552
554
|
nativeSessionId,
|
|
553
555
|
sessionName,
|
|
554
|
-
outcome.server_pid,
|
|
556
|
+
{ pid: outcome.server_pid, pidProven: server.pidProven },
|
|
555
557
|
env,
|
|
556
558
|
{
|
|
557
559
|
sessionId,
|
|
@@ -571,6 +573,7 @@ export function createGjcTmuxSession(
|
|
|
571
573
|
env,
|
|
572
574
|
outcome.server_pid,
|
|
573
575
|
outcome.server_start_time,
|
|
576
|
+
server.pidProven,
|
|
574
577
|
);
|
|
575
578
|
} catch (cleanupError) {
|
|
576
579
|
throw new AggregateError([tagError, cleanupError], "gjc_tmux_profile_tag_failed_cleanup_failed");
|
|
@@ -597,6 +600,7 @@ export function createGjcTmuxSession(
|
|
|
597
600
|
env,
|
|
598
601
|
outcome.server_pid,
|
|
599
602
|
outcome.server_start_time,
|
|
603
|
+
finalServer.pidProven,
|
|
600
604
|
);
|
|
601
605
|
} catch (cleanupError) {
|
|
602
606
|
throw new AggregateError(
|
|
@@ -619,6 +623,7 @@ export function createGjcTmuxSession(
|
|
|
619
623
|
env,
|
|
620
624
|
outcome.server_pid,
|
|
621
625
|
outcome.server_start_time,
|
|
626
|
+
server.pidProven,
|
|
622
627
|
);
|
|
623
628
|
} catch (cleanupError) {
|
|
624
629
|
throw new AggregateError(
|
|
@@ -645,8 +650,18 @@ function tmuxCommandArgument(value: string): string {
|
|
|
645
650
|
return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("$", "\\$").replaceAll("`", "\\`")}"`;
|
|
646
651
|
}
|
|
647
652
|
|
|
653
|
+
/**
|
|
654
|
+
* Build the guard predicate for an exact tmux session mutation.
|
|
655
|
+
*
|
|
656
|
+
* The `#{pid}` clause is emitted only when the server proof actually proved a
|
|
657
|
+
* PID. Non-Linux probes report a placeholder PID (see {@link TmuxServerProof}),
|
|
658
|
+
* and pinning `#{pid}` to a placeholder produces a predicate no live tmux
|
|
659
|
+
* server can satisfy, which refuses every mutation on those platforms. The
|
|
660
|
+
* remaining clauses still pin the exact session id, session name and owner
|
|
661
|
+
* generation.
|
|
662
|
+
*/
|
|
648
663
|
function guardedTmuxSessionPredicate(
|
|
649
|
-
|
|
664
|
+
expectedServer: { pid: number; pidProven?: boolean },
|
|
650
665
|
nativeSessionId: string,
|
|
651
666
|
sessionName: string,
|
|
652
667
|
expectedOwnerGeneration?: string,
|
|
@@ -654,13 +669,14 @@ function guardedTmuxSessionPredicate(
|
|
|
654
669
|
const ownerGenerationPredicate = expectedOwnerGeneration
|
|
655
670
|
? `#{==:#{${GJC_TMUX_OWNER_GENERATION_OPTION}},${expectedOwnerGeneration}}`
|
|
656
671
|
: "1";
|
|
657
|
-
|
|
672
|
+
const serverPidPredicate = expectedServer.pidProven === false ? "1" : `#{==:#{pid},${expectedServer.pid}}`;
|
|
673
|
+
return `#{&&:${serverPidPredicate},#{&&:#{==:#{session_id},${nativeSessionId}},#{&&:#{==:#{session_name},${sessionName}},${ownerGenerationPredicate}}}}`;
|
|
658
674
|
}
|
|
659
675
|
|
|
660
676
|
function runGuardedTmuxSessionCommand(
|
|
661
677
|
nativeSessionId: string,
|
|
662
678
|
sessionName: string,
|
|
663
|
-
|
|
679
|
+
expectedServer: { pid: number; pidProven?: boolean },
|
|
664
680
|
env: NodeJS.ProcessEnv,
|
|
665
681
|
thenCommand: string,
|
|
666
682
|
expectedOwnerGeneration?: string,
|
|
@@ -671,7 +687,7 @@ function runGuardedTmuxSessionCommand(
|
|
|
671
687
|
"-t",
|
|
672
688
|
normalizeExactTmuxTarget(nativeSessionId, env, "session"),
|
|
673
689
|
"-F",
|
|
674
|
-
guardedTmuxSessionPredicate(
|
|
690
|
+
guardedTmuxSessionPredicate(expectedServer, nativeSessionId, sessionName, expectedOwnerGeneration),
|
|
675
691
|
`${thenCommand} ; display-message -p __gjc_tmux_guarded_mutation_ok__`,
|
|
676
692
|
"display-message -p __gjc_tmux_guarded_mutation_refused__",
|
|
677
693
|
],
|
|
@@ -683,7 +699,7 @@ function runGuardedTmuxSessionCommand(
|
|
|
683
699
|
function tagCreatedTmuxSession(
|
|
684
700
|
nativeSessionId: string,
|
|
685
701
|
sessionName: string,
|
|
686
|
-
|
|
702
|
+
expectedServer: { pid: number; pidProven?: boolean },
|
|
687
703
|
env: NodeJS.ProcessEnv,
|
|
688
704
|
metadata: {
|
|
689
705
|
branch?: string | null;
|
|
@@ -701,7 +717,7 @@ function tagCreatedTmuxSession(
|
|
|
701
717
|
const commands = buildGjcTmuxProfileCommands(target, env, metadata, { tmuxCommand })
|
|
702
718
|
.map(command => command.args.map(tmuxCommandArgument).join(" "))
|
|
703
719
|
.join(" ; ");
|
|
704
|
-
runGuardedTmuxSessionCommand(nativeSessionId, sessionName,
|
|
720
|
+
runGuardedTmuxSessionCommand(nativeSessionId, sessionName, expectedServer, env, commands);
|
|
705
721
|
}
|
|
706
722
|
|
|
707
723
|
function cleanupExactCreatedTmuxSession(
|
|
@@ -711,6 +727,7 @@ function cleanupExactCreatedTmuxSession(
|
|
|
711
727
|
env: NodeJS.ProcessEnv,
|
|
712
728
|
expectedPid: number,
|
|
713
729
|
expectedStartTime: string,
|
|
730
|
+
expectedPidProven?: boolean,
|
|
714
731
|
): void {
|
|
715
732
|
const server = requireSafeTmuxServerForMutation(tmuxCommand, env);
|
|
716
733
|
if (server.pid !== expectedPid || server.startTime !== expectedStartTime)
|
|
@@ -718,7 +735,7 @@ function cleanupExactCreatedTmuxSession(
|
|
|
718
735
|
runGuardedTmuxSessionCommand(
|
|
719
736
|
nativeSessionId,
|
|
720
737
|
sessionName,
|
|
721
|
-
expectedPid,
|
|
738
|
+
{ pid: expectedPid, pidProven: expectedPidProven ?? server.pidProven },
|
|
722
739
|
env,
|
|
723
740
|
`kill-session -t ${tmuxCommandArgument(normalizeExactTmuxTarget(nativeSessionId, env, "session"))}`,
|
|
724
741
|
);
|
|
@@ -727,7 +744,7 @@ function cleanupExactCreatedTmuxSession(
|
|
|
727
744
|
function requireSafeTmuxServerForMutation(
|
|
728
745
|
tmuxCommand: string,
|
|
729
746
|
env: NodeJS.ProcessEnv,
|
|
730
|
-
): { pid: number; startTime: string } {
|
|
747
|
+
): { pid: number; startTime: string; pidProven?: boolean } {
|
|
731
748
|
if (mutationServerProofTestDependency) {
|
|
732
749
|
const proof = mutationServerProofTestDependency(tmuxCommand, env);
|
|
733
750
|
if (
|
|
@@ -739,7 +756,7 @@ function requireSafeTmuxServerForMutation(
|
|
|
739
756
|
return proof as { pid: number; startTime: string };
|
|
740
757
|
return { pid: 1, startTime: "test" };
|
|
741
758
|
}
|
|
742
|
-
if (process.platform !== "linux") return { pid: 1, startTime: "not-applicable" };
|
|
759
|
+
if (process.platform !== "linux") return { pid: 1, startTime: "not-applicable", pidProven: false };
|
|
743
760
|
const result = Bun.spawnSync([tmuxCommand, "display-message", "-p", "#{pid}"], {
|
|
744
761
|
stdout: "pipe",
|
|
745
762
|
stderr: "pipe",
|
|
@@ -953,7 +970,7 @@ export function removeGjcTmuxSession(
|
|
|
953
970
|
runGuardedTmuxSessionCommand(
|
|
954
971
|
nativeSessionId,
|
|
955
972
|
session.name,
|
|
956
|
-
finalServer
|
|
973
|
+
finalServer,
|
|
957
974
|
env,
|
|
958
975
|
`kill-session -t '${nativeSessionId}'`,
|
|
959
976
|
expectedIdentity?.ownerGeneration,
|
|
@@ -962,6 +979,13 @@ export function removeGjcTmuxSession(
|
|
|
962
979
|
}
|
|
963
980
|
|
|
964
981
|
async function readProcessStartTime(pid: number): Promise<string | null> {
|
|
982
|
+
// `/proc/<pid>/stat` only exists on Linux. Everywhere else the natives
|
|
983
|
+
// process reference carries the same kernel-derived start identity (macOS
|
|
984
|
+
// reports `darwin:<start_tvsec>:<start_tvusec>` from the BSD proc info), and
|
|
985
|
+
// callers only ever compare these values for equality against another value
|
|
986
|
+
// produced here. Returning null off Linux made every owner-identity proof
|
|
987
|
+
// unverifiable, so no session could be closed there.
|
|
988
|
+
if (process.platform !== "linux") return Process.fromPid(pid)?.incarnation ?? null;
|
|
965
989
|
return readLinuxProcStartTime(pid);
|
|
966
990
|
}
|
|
967
991
|
|
|
@@ -973,6 +997,27 @@ function exactManagedOwnerSupervisor(supervisorPid: number, supervisorStartTime:
|
|
|
973
997
|
return supervisor;
|
|
974
998
|
}
|
|
975
999
|
|
|
1000
|
+
/**
|
|
1001
|
+
* Deliver SIGTERM to exactly one already-proved owner PID.
|
|
1002
|
+
*
|
|
1003
|
+
* `Process.signalRoot` routes through the owned pidfd on Linux and the owned
|
|
1004
|
+
* process handle on Windows, so PID reuse cannot redirect the signal. macOS has
|
|
1005
|
+
* no equivalent kernel authority and the native binding deliberately fails
|
|
1006
|
+
* closed there, which would leave every macOS force-close unable to signal its
|
|
1007
|
+
* owner at all. On that platform the caller has already re-proved the PID's
|
|
1008
|
+
* start-time incarnation immediately before this call — the same evidence the
|
|
1009
|
+
* native macOS signal path re-validates — so deliver to that exact PID.
|
|
1010
|
+
*/
|
|
1011
|
+
function signalManagedOwnerTerm(supervisor: Process, pid: number): boolean {
|
|
1012
|
+
if (process.platform !== "darwin") return supervisor.signalRoot(15);
|
|
1013
|
+
try {
|
|
1014
|
+
process.kill(pid, "SIGTERM");
|
|
1015
|
+
return true;
|
|
1016
|
+
} catch {
|
|
1017
|
+
return false;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
|
|
976
1021
|
async function readCurrentGeneration(stateDir: string, sessionId: string): Promise<string | null> {
|
|
977
1022
|
try {
|
|
978
1023
|
const value: unknown = JSON.parse(
|
|
@@ -1185,7 +1230,7 @@ export async function forceCloseGjcTmuxSession(
|
|
|
1185
1230
|
deps.signalTerm(pid);
|
|
1186
1231
|
} else {
|
|
1187
1232
|
const supervisor = exactManagedOwnerSupervisor(pid, identity.startTime);
|
|
1188
|
-
if (!supervisor
|
|
1233
|
+
if (!signalManagedOwnerTerm(supervisor, pid)) throw new Error("managed_owner_supervisor_signal_failed");
|
|
1189
1234
|
operatorVerdict = supervisor
|
|
1190
1235
|
.waitForExit({ timeoutMs: FORCE_CLOSE_VERDICT_TIMEOUT_MS - 500 })
|
|
1191
1236
|
.then(async exited => {
|
|
@@ -1227,7 +1272,7 @@ export async function forceCloseGjcTmuxSession(
|
|
|
1227
1272
|
runGuardedTmuxSessionCommand(
|
|
1228
1273
|
nativeSessionId,
|
|
1229
1274
|
session.name,
|
|
1230
|
-
initialServer
|
|
1275
|
+
initialServer,
|
|
1231
1276
|
env,
|
|
1232
1277
|
`kill-session -t '${nativeSessionId}'`,
|
|
1233
1278
|
identity.generation,
|
|
@@ -290,6 +290,26 @@ export function findLedgerReceiptEvent(
|
|
|
290
290
|
}) ?? null
|
|
291
291
|
);
|
|
292
292
|
}
|
|
293
|
+
/**
|
|
294
|
+
* A final-aggregate receipt whose recorded ledger checkpoint quality gate is
|
|
295
|
+
* missing a clean `criticReview` OKAY can never satisfy the completion guard,
|
|
296
|
+
* yet is not "stale" under {@link validateReceiptFreshBase}. Detect it so an
|
|
297
|
+
* identical-evidence complete replay can re-verify and re-mint with a
|
|
298
|
+
* corrected gate instead of no-opping into a permanently blocked run.
|
|
299
|
+
*/
|
|
300
|
+
export function finalAggregateReceiptMissingCriticOkay(
|
|
301
|
+
ledger: readonly UltragoalLedgerEvent[],
|
|
302
|
+
receipt: UltragoalCompletionVerification,
|
|
303
|
+
): boolean {
|
|
304
|
+
if (receipt.receiptKind !== "final-aggregate") return false;
|
|
305
|
+
const event = findLedgerReceiptEvent(ledger, receipt);
|
|
306
|
+
if (!event) return false;
|
|
307
|
+
const gate = event.qualityGateJson;
|
|
308
|
+
if (typeof gate !== "object" || gate === null || Array.isArray(gate)) return true;
|
|
309
|
+
const criticReview = (gate as Record<string, unknown>).criticReview;
|
|
310
|
+
if (typeof criticReview !== "object" || criticReview === null || Array.isArray(criticReview)) return true;
|
|
311
|
+
return (criticReview as Record<string, unknown>).verdict !== "OKAY";
|
|
312
|
+
}
|
|
293
313
|
|
|
294
314
|
export function validateReceiptFreshBase(input: {
|
|
295
315
|
plan: UltragoalPlan;
|