@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
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import * as fs from "node:fs/promises";
|
|
4
|
+
import * as os from "node:os";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
|
|
7
|
+
export const ACPX_VERSION = "0.13.0";
|
|
8
|
+
export const ACPX_GIT_HEAD = "47dc1c56b20da3c248a4a1b5c5106f52e65e6594";
|
|
9
|
+
/** `conformance/profiles/acp-core-v1.json#required_cases` at the pinned commit. */
|
|
10
|
+
export const ACP_CORE_V1_CASE_IDS = [
|
|
11
|
+
"acp.v1.initialize.handshake",
|
|
12
|
+
"acp.v1.session.new.basic",
|
|
13
|
+
"acp.v1.session.prompt.single_turn",
|
|
14
|
+
"acp.v1.session.update.termination",
|
|
15
|
+
"acp.v1.session.cancel.in_flight",
|
|
16
|
+
"acp.v1.session.cancel.idle",
|
|
17
|
+
"acp.v1.session.prompt.multi_turn",
|
|
18
|
+
"acp.v1.errors.invalid_params",
|
|
19
|
+
"acp.v1.errors.invalid_prompt_session_type",
|
|
20
|
+
"acp.v1.errors.permission_denied",
|
|
21
|
+
"acp.v1.errors.permission_denied.write",
|
|
22
|
+
"acp.v1.errors.unknown_session",
|
|
23
|
+
"acp.v1.session.prompt.echo_empty",
|
|
24
|
+
"acp.v1.session.prompt.unrecognized",
|
|
25
|
+
"acp.v1.errors.invalid_params.cwd_null",
|
|
26
|
+
"acp.v1.session.prompt.structured_blocks",
|
|
27
|
+
"acp.v1.permissions.read.approved",
|
|
28
|
+
"acp.v1.permissions.write.approved",
|
|
29
|
+
"acp.v1.session.prompt.background_completion",
|
|
30
|
+
"acp.v1.session.cancel.followup_prompt",
|
|
31
|
+
"acp.v1.session.prompt.post_success_drain",
|
|
32
|
+
] as const;
|
|
33
|
+
|
|
34
|
+
export type AcpxMetadata = { version: string; gitHead?: string };
|
|
35
|
+
export type AcpxCheckout = { root: string; head: string };
|
|
36
|
+
export type CaseResult = { id: string; passed: boolean; [key: string]: unknown };
|
|
37
|
+
export type UpstreamReport = {
|
|
38
|
+
profileId: string;
|
|
39
|
+
results: CaseResult[];
|
|
40
|
+
totals?: { cases: number; passed: number; failed: number };
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
};
|
|
43
|
+
export type ConformanceReport = {
|
|
44
|
+
command: string[];
|
|
45
|
+
cwd: string;
|
|
46
|
+
gjc: { commit: string; dirty: boolean };
|
|
47
|
+
acpx: { version: string; gitHead: string };
|
|
48
|
+
profile: string;
|
|
49
|
+
agentCommand: string;
|
|
50
|
+
matrix: CaseResult[];
|
|
51
|
+
totals: { cases: number; passed: number; failed: number };
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export interface RunAcpConformanceOptions {
|
|
55
|
+
agentCommand: string;
|
|
56
|
+
reportPath: string;
|
|
57
|
+
format?: "json";
|
|
58
|
+
cwd?: string;
|
|
59
|
+
profile?: string;
|
|
60
|
+
fetchMetadata?: () => Promise<AcpxMetadata>;
|
|
61
|
+
checkout?: () => Promise<AcpxCheckout>;
|
|
62
|
+
runRunner?: (options: { command: string[]; cwd: string; sessionCwd?: string }) => Promise<void>;
|
|
63
|
+
readReport?: (reportPath: string) => Promise<unknown>;
|
|
64
|
+
writeReport?: (reportPath: string, report: ConformanceReport) => Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function assertProvenance(metadata: AcpxMetadata, checkout: AcpxCheckout): void {
|
|
68
|
+
if (metadata.version !== ACPX_VERSION)
|
|
69
|
+
throw new Error(`Expected acpx@${ACPX_VERSION}; received ${metadata.version}.`);
|
|
70
|
+
if (metadata.gitHead !== ACPX_GIT_HEAD)
|
|
71
|
+
throw new Error(`Expected acpx gitHead ${ACPX_GIT_HEAD}; received ${metadata.gitHead ?? "missing"}.`);
|
|
72
|
+
if (checkout.head !== ACPX_GIT_HEAD)
|
|
73
|
+
throw new Error(`Expected source checkout HEAD ${ACPX_GIT_HEAD}; received ${checkout.head}.`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function validateResults(report: unknown, profile: string): CaseResult[] {
|
|
77
|
+
if (!report || typeof report !== "object") throw new Error("Conformance runner report is missing or malformed.");
|
|
78
|
+
const value = report as Partial<UpstreamReport>;
|
|
79
|
+
if (value.profileId !== profile || !Array.isArray(value.results))
|
|
80
|
+
throw new Error("Conformance runner report is missing profileId or results.");
|
|
81
|
+
const expected = new Set<string>(ACP_CORE_V1_CASE_IDS);
|
|
82
|
+
const seen = new Set<string>();
|
|
83
|
+
for (const result of value.results) {
|
|
84
|
+
if (!result || typeof result.id !== "string" || typeof result.passed !== "boolean")
|
|
85
|
+
throw new Error("Conformance runner report contains a malformed case result.");
|
|
86
|
+
if (seen.has(result.id)) throw new Error(`Conformance runner report has duplicate case ID: ${result.id}.`);
|
|
87
|
+
seen.add(result.id);
|
|
88
|
+
if (!expected.has(result.id)) throw new Error(`Conformance runner report has unexpected case ID: ${result.id}.`);
|
|
89
|
+
if (!result.passed) throw new Error(`Conformance case failed: ${result.id}.`);
|
|
90
|
+
}
|
|
91
|
+
for (const id of ACP_CORE_V1_CASE_IDS)
|
|
92
|
+
if (!seen.has(id)) throw new Error(`Conformance runner report is missing required case ID: ${id}.`);
|
|
93
|
+
return value.results;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Runs the pinned upstream conformance suite against a real ACP agent command.
|
|
98
|
+
*
|
|
99
|
+
* `--cwd` must be a real path, not one reached through a symlink (macOS `/tmp` is a
|
|
100
|
+
* link to `/private/tmp`): the upstream client enforces its session cwd root against
|
|
101
|
+
* the resolved path, so a symlinked workspace fails the client-authority cases.
|
|
102
|
+
*/
|
|
103
|
+
export async function runAcpConformance(options: RunAcpConformanceOptions): Promise<ConformanceReport> {
|
|
104
|
+
const profile = options.profile ?? "acp-core-v1";
|
|
105
|
+
const requestedCwd = options.cwd ?? process.cwd();
|
|
106
|
+
const resolvedCwd = await fs.realpath(requestedCwd).catch(() => requestedCwd);
|
|
107
|
+
if (path.resolve(requestedCwd) !== resolvedCwd)
|
|
108
|
+
throw new Error(
|
|
109
|
+
`--cwd must be a real path; ${requestedCwd} resolves to ${resolvedCwd} and the client rejects paths outside its session cwd root.`,
|
|
110
|
+
);
|
|
111
|
+
if (profile !== "acp-core-v1") throw new Error(`Unsupported conformance profile: ${profile}.`);
|
|
112
|
+
// The upstream runner spawns the agent from its own checkout, so any repo-relative
|
|
113
|
+
// path in the command must be resolved against this repository first.
|
|
114
|
+
const agentCommand = options.agentCommand
|
|
115
|
+
.split(" ")
|
|
116
|
+
.map(token => (token.endsWith(".ts") && !path.isAbsolute(token) ? path.resolve(token) : token))
|
|
117
|
+
.join(" ");
|
|
118
|
+
const metadata = await (options.fetchMetadata ?? fetchNpmMetadata)();
|
|
119
|
+
const checkout = await (options.checkout ?? checkoutAcpxSource)();
|
|
120
|
+
assertProvenance(metadata, checkout);
|
|
121
|
+
const upstreamReportPath = path.join(os.tmpdir(), `gjc-acpx-${crypto.randomUUID()}.json`);
|
|
122
|
+
const command = [
|
|
123
|
+
"bun",
|
|
124
|
+
path.join(checkout.root, "conformance", "runner", "run.ts"),
|
|
125
|
+
"--profile",
|
|
126
|
+
path.join(checkout.root, "conformance", "profiles", `${profile}.json`),
|
|
127
|
+
"--cases-dir",
|
|
128
|
+
path.join(checkout.root, "conformance", "cases"),
|
|
129
|
+
"--agent-command",
|
|
130
|
+
agentCommand,
|
|
131
|
+
"--format",
|
|
132
|
+
"json",
|
|
133
|
+
"--report",
|
|
134
|
+
upstreamReportPath,
|
|
135
|
+
"--cwd",
|
|
136
|
+
options.cwd ?? process.cwd(),
|
|
137
|
+
];
|
|
138
|
+
// A failing run still writes its report. Preserve that matrix as CI evidence before
|
|
139
|
+
// surfacing the failure, so the uploaded artifact explains what actually broke.
|
|
140
|
+
let runnerFailure: unknown;
|
|
141
|
+
try {
|
|
142
|
+
await (options.runRunner ?? runRunner)({ command, cwd: checkout.root, sessionCwd: options.cwd ?? process.cwd() });
|
|
143
|
+
} catch (error) {
|
|
144
|
+
runnerFailure = error;
|
|
145
|
+
}
|
|
146
|
+
const upstream = await (options.readReport ?? readReport)(upstreamReportPath).catch(() => undefined);
|
|
147
|
+
if (runnerFailure !== undefined) {
|
|
148
|
+
if (upstream && typeof upstream === "object") {
|
|
149
|
+
const failed = upstream as Partial<UpstreamReport>;
|
|
150
|
+
await (options.writeReport ?? writeReport)(options.reportPath, {
|
|
151
|
+
command,
|
|
152
|
+
cwd: options.cwd ?? process.cwd(),
|
|
153
|
+
gjc: gjcIdentity(),
|
|
154
|
+
acpx: { version: metadata.version, gitHead: metadata.gitHead as string },
|
|
155
|
+
profile,
|
|
156
|
+
agentCommand,
|
|
157
|
+
matrix: Array.isArray(failed.results) ? failed.results : [],
|
|
158
|
+
totals: failed.totals ?? { cases: 0, passed: 0, failed: 0 },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
throw runnerFailure;
|
|
162
|
+
}
|
|
163
|
+
const matrix = validateResults(upstream, profile);
|
|
164
|
+
const report: ConformanceReport = {
|
|
165
|
+
command,
|
|
166
|
+
cwd: options.cwd ?? process.cwd(),
|
|
167
|
+
gjc: gjcIdentity(),
|
|
168
|
+
acpx: { version: metadata.version, gitHead: metadata.gitHead! },
|
|
169
|
+
profile,
|
|
170
|
+
agentCommand,
|
|
171
|
+
matrix,
|
|
172
|
+
totals: { cases: matrix.length, passed: matrix.length, failed: 0 },
|
|
173
|
+
};
|
|
174
|
+
await (options.writeReport ?? writeReport)(options.reportPath, report);
|
|
175
|
+
return report;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function gjcIdentity(): { commit: string; dirty: boolean } {
|
|
179
|
+
try {
|
|
180
|
+
const commit = Bun.spawnSync(["git", "rev-parse", "HEAD"]).stdout.toString().trim();
|
|
181
|
+
const dirty = Bun.spawnSync(["git", "status", "--porcelain"]).stdout.toString().trim().length > 0;
|
|
182
|
+
return { commit, dirty };
|
|
183
|
+
} catch {
|
|
184
|
+
return { commit: "unknown", dirty: true };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function fetchNpmMetadata(): Promise<AcpxMetadata> {
|
|
189
|
+
const response = await fetch(`https://registry.npmjs.org/acpx/${ACPX_VERSION}`);
|
|
190
|
+
if (!response.ok)
|
|
191
|
+
throw new Error(`Unable to resolve acpx@${ACPX_VERSION}: ${response.status} ${response.statusText}.`);
|
|
192
|
+
return (await response.json()) as AcpxMetadata;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async function commandOutput(command: string[], cwd?: string, env?: Record<string, string>): Promise<string> {
|
|
196
|
+
const child = Bun.spawn(command, {
|
|
197
|
+
cwd,
|
|
198
|
+
stdout: "pipe",
|
|
199
|
+
stderr: "pipe",
|
|
200
|
+
...(env ? { env: { ...process.env, ...env } } : {}),
|
|
201
|
+
});
|
|
202
|
+
const [code, stdout, stderr] = await Promise.all([
|
|
203
|
+
child.exited,
|
|
204
|
+
new Response(child.stdout).text(),
|
|
205
|
+
new Response(child.stderr).text(),
|
|
206
|
+
]);
|
|
207
|
+
if (code !== 0)
|
|
208
|
+
throw new Error(`${command.join(" ")} failed (exit ${code}).\nstdout:\n${stdout}\nstderr:\n${stderr}`);
|
|
209
|
+
return stdout.trim();
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function checkoutAcpxSource(): Promise<AcpxCheckout> {
|
|
213
|
+
const root = path.join(os.homedir(), ".cache", "gjc", "acpx", ACPX_GIT_HEAD);
|
|
214
|
+
try {
|
|
215
|
+
await fs.access(path.join(root, ".git"));
|
|
216
|
+
} catch {
|
|
217
|
+
await fs.mkdir(path.dirname(root), { recursive: true });
|
|
218
|
+
await commandOutput(["git", "clone", "https://github.com/openclaw/acpx.git", root]);
|
|
219
|
+
}
|
|
220
|
+
await commandOutput(["git", "fetch", "--depth", "1", "origin", ACPX_GIT_HEAD], root);
|
|
221
|
+
await commandOutput(["git", "checkout", "--detach", ACPX_GIT_HEAD], root);
|
|
222
|
+
// A reused cache must match the pin exactly; local edits would invalidate the
|
|
223
|
+
// provenance the report claims.
|
|
224
|
+
await commandOutput(["git", "reset", "--hard", ACPX_GIT_HEAD], root);
|
|
225
|
+
await commandOutput(["git", "clean", "-fdx", "--exclude=node_modules"], root);
|
|
226
|
+
const status = await commandOutput(["git", "status", "--porcelain"], root);
|
|
227
|
+
if (status.length > 0) throw new Error(`acpx source checkout is not clean at ${ACPX_GIT_HEAD}.`);
|
|
228
|
+
return { root, head: await commandOutput(["git", "rev-parse", "HEAD"], root) };
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
async function runRunner(options: { command: string[]; cwd: string; sessionCwd?: string }): Promise<void> {
|
|
232
|
+
// The fixture seeds the corpus scratch workspace; the runner only creates it.
|
|
233
|
+
await commandOutput(
|
|
234
|
+
options.command,
|
|
235
|
+
options.cwd,
|
|
236
|
+
options.sessionCwd ? { GJC_ACP_CONFORMANCE_CWD: options.sessionCwd } : undefined,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
async function readReport(reportPath: string): Promise<unknown> {
|
|
240
|
+
return await Bun.file(reportPath).json();
|
|
241
|
+
}
|
|
242
|
+
async function writeReport(reportPath: string, report: ConformanceReport): Promise<void> {
|
|
243
|
+
await fs.mkdir(path.dirname(reportPath), { recursive: true });
|
|
244
|
+
await Bun.write(reportPath, `${JSON.stringify(report, null, 2)}\n`);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function parseCli(argv: string[]): RunAcpConformanceOptions {
|
|
248
|
+
const values: Partial<RunAcpConformanceOptions> = { format: "json", profile: "acp-core-v1" };
|
|
249
|
+
for (let index = 0; index < argv.length; index++) {
|
|
250
|
+
const flag = argv[index];
|
|
251
|
+
if (flag === "--format") {
|
|
252
|
+
if (argv[++index] !== "json") throw new Error("--format must be json.");
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (flag === "--agent-command") {
|
|
256
|
+
values.agentCommand = argv[++index];
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (flag === "--report") {
|
|
260
|
+
values.reportPath = argv[++index];
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (flag === "--cwd") {
|
|
264
|
+
values.cwd = argv[++index];
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
if (flag === "--profile") {
|
|
268
|
+
values.profile = argv[++index];
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
throw new Error(`Unknown argument: ${flag}.`);
|
|
272
|
+
}
|
|
273
|
+
if (!values.agentCommand || !values.reportPath)
|
|
274
|
+
throw new Error(
|
|
275
|
+
"Usage: conformance:run --agent-command <command> --format json --report <path> [--cwd <path>] [--profile acp-core-v1]",
|
|
276
|
+
);
|
|
277
|
+
return values as RunAcpConformanceOptions;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (import.meta.main) {
|
|
281
|
+
runAcpConformance(parseCli(process.argv.slice(2))).catch(error => {
|
|
282
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
283
|
+
process.exitCode = 1;
|
|
284
|
+
});
|
|
285
|
+
}
|
|
@@ -1421,13 +1421,107 @@ function braceBlockRange(contents: string, openingBrace: number): ShellRange | u
|
|
|
1421
1421
|
return undefined;
|
|
1422
1422
|
}
|
|
1423
1423
|
|
|
1424
|
-
function
|
|
1425
|
-
|
|
1424
|
+
function scopeMatches<T extends RegExpMatchArray>(matches: T[], range: ShellRange): T[] {
|
|
1425
|
+
return matches.filter(match => {
|
|
1426
|
+
const index = match.index ?? -1;
|
|
1427
|
+
return index >= range.start && index < range.end;
|
|
1428
|
+
});
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
function findFunctionRange(contents: string, headerPattern: RegExp): ShellRange | undefined {
|
|
1432
|
+
const header = headerPattern.exec(contents);
|
|
1433
|
+
if (!header) return undefined;
|
|
1434
|
+
const openingBrace = (header.index ?? 0) + header[0].lastIndexOf("{");
|
|
1435
|
+
return braceBlockRange(contents, openingBrace);
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
/**
|
|
1439
|
+
* `relaunchWorkerPaneForMemoryGuard` intentionally re-runs the same sanctioned
|
|
1440
|
+
* tmux send-keys fallback shape as `startTmuxSession` (see
|
|
1441
|
+
* `exactTeamRuntimeSendKeysRanges` below) but through `input.config` /
|
|
1442
|
+
* `newPaneId` instead of `config` / `paneId`, since it dispatches a single
|
|
1443
|
+
* successor pane rather than looping over `config.workers`. Exact-match its
|
|
1444
|
+
* shape the same way so a second legitimate call site does not get treated as
|
|
1445
|
+
* an unsanctioned duplicate.
|
|
1446
|
+
*/
|
|
1447
|
+
function exactMemoryGuardSendKeysRanges(contents: string): ShellRange[] {
|
|
1448
|
+
const fnRange = findFunctionRange(
|
|
1449
|
+
contents,
|
|
1450
|
+
/async\s+function\s+relaunchWorkerPaneForMemoryGuard\s*\([\s\S]{0,600}?\)\s*:\s*Promise<string>\s*\{/,
|
|
1451
|
+
);
|
|
1452
|
+
if (!fnRange) return [];
|
|
1453
|
+
const body = contents.slice(fnRange.start, fnRange.end);
|
|
1454
|
+
const guardMatches = [...body.matchAll(/if\s*\(\s*useSendKeysFallback\s*\)\s*\{/g)];
|
|
1426
1455
|
const payloadMatches = [
|
|
1427
|
-
...
|
|
1428
|
-
/Bun\.spawnSync\(\s*\[\s*config\.tmux_command\s*,\s*["']send-keys["']\s*,\s*["']-l["']\s*,\s*["']-t["']\s*,\s*
|
|
1456
|
+
...body.matchAll(
|
|
1457
|
+
/Bun\.spawnSync\(\s*\[\s*input\.config\.tmux_command\s*,\s*["']send-keys["']\s*,\s*["']-l["']\s*,\s*["']-t["']\s*,\s*newPaneId\s*,\s*workerCommand\s*\]\s*,\s*\{[\s\S]{0,200}?stdout\s*:\s*["']ignore["'][\s\S]{0,200}?stderr\s*:\s*["']ignore["'][\s\S]{0,100}?\}\s*\)\s*;/g,
|
|
1458
|
+
),
|
|
1459
|
+
];
|
|
1460
|
+
const enterMatches = [
|
|
1461
|
+
...body.matchAll(
|
|
1462
|
+
/Bun\.spawnSync\(\s*\[\s*input\.config\.tmux_command\s*,\s*["']send-keys["']\s*,\s*["']-t["']\s*,\s*newPaneId\s*,\s*["']Enter["']\s*\]\s*,\s*\{[\s\S]{0,200}?stdout\s*:\s*["']ignore["'][\s\S]{0,200}?stderr\s*:\s*["']ignore["'][\s\S]{0,100}?\}\s*\)\s*;/g,
|
|
1429
1463
|
),
|
|
1430
1464
|
];
|
|
1465
|
+
const useFallbackMatches = [
|
|
1466
|
+
...body.matchAll(
|
|
1467
|
+
/const\s+useSendKeysFallback\s*=\s*shouldDispatchWorkerWithSendKeys\(input\.config\.tmux_command\s*,\s*input\.platform\)\s*;/g,
|
|
1468
|
+
),
|
|
1469
|
+
];
|
|
1470
|
+
const splitWorkerCommandMatches = [
|
|
1471
|
+
...body.matchAll(/\.\.\.\(useSendKeysFallback\s*\?\s*\[\]\s*:\s*\[workerCommand\]\)\s*,/g),
|
|
1472
|
+
];
|
|
1473
|
+
if (
|
|
1474
|
+
guardMatches.length !== 1 ||
|
|
1475
|
+
payloadMatches.length !== 1 ||
|
|
1476
|
+
enterMatches.length !== 1 ||
|
|
1477
|
+
useFallbackMatches.length !== 1 ||
|
|
1478
|
+
splitWorkerCommandMatches.length !== 1
|
|
1479
|
+
)
|
|
1480
|
+
return [];
|
|
1481
|
+
const guardStart = guardMatches[0].index ?? 0;
|
|
1482
|
+
const payloadStart = payloadMatches[0].index ?? 0;
|
|
1483
|
+
const enterStart = enterMatches[0].index ?? 0;
|
|
1484
|
+
if (
|
|
1485
|
+
(useFallbackMatches[0].index ?? 0) >= (splitWorkerCommandMatches[0].index ?? 0) ||
|
|
1486
|
+
(splitWorkerCommandMatches[0].index ?? 0) >= guardStart ||
|
|
1487
|
+
payloadStart >= enterStart
|
|
1488
|
+
)
|
|
1489
|
+
return [];
|
|
1490
|
+
const guard = guardMatches[0];
|
|
1491
|
+
const openingBrace = (guard.index ?? 0) + guard[0].lastIndexOf("{");
|
|
1492
|
+
const range = braceBlockRange(body, openingBrace);
|
|
1493
|
+
if (
|
|
1494
|
+
!range ||
|
|
1495
|
+
payloadStart < range.start ||
|
|
1496
|
+
payloadStart >= range.end ||
|
|
1497
|
+
enterStart < range.start ||
|
|
1498
|
+
enterStart >= range.end
|
|
1499
|
+
)
|
|
1500
|
+
return [];
|
|
1501
|
+
return [
|
|
1502
|
+
{ start: fnRange.start + payloadStart, end: fnRange.start + payloadStart + payloadMatches[0][0].length },
|
|
1503
|
+
{ start: fnRange.start + enterStart, end: fnRange.start + enterStart + enterMatches[0][0].length },
|
|
1504
|
+
];
|
|
1505
|
+
}
|
|
1506
|
+
function exactTeamRuntimeSendKeysRanges(contents: string): ShellRange[] {
|
|
1507
|
+
// Scope the loop-dispatch counts to `startTmuxSession` so the second
|
|
1508
|
+
// sanctioned call site (`relaunchWorkerPaneForMemoryGuard`, matched by
|
|
1509
|
+
// `exactMemoryGuardSendKeysRanges`) does not read as a duplicate. Fixtures
|
|
1510
|
+
// that carry the canonical shape without the enclosing function keep the
|
|
1511
|
+
// original whole-file scope, so exact-match strictness is unchanged.
|
|
1512
|
+
const mainFnRange = findFunctionRange(
|
|
1513
|
+
contents,
|
|
1514
|
+
/async\s+function\s+startTmuxSession\s*\([\s\S]{0,600}?\)\s*:\s*Promise<GjcTeamWorker\[\]>\s*\{/,
|
|
1515
|
+
) ?? { start: 0, end: contents.length };
|
|
1516
|
+
const guardMatches = scopeMatches([...contents.matchAll(/if\s*\(\s*useSendKeysFallback\s*\)\s*\{/g)], mainFnRange);
|
|
1517
|
+
const payloadMatches = scopeMatches(
|
|
1518
|
+
[
|
|
1519
|
+
...contents.matchAll(
|
|
1520
|
+
/Bun\.spawnSync\(\s*\[\s*config\.tmux_command\s*,\s*["']send-keys["']\s*,\s*["']-l["']\s*,\s*["']-t["']\s*,\s*paneId\s*,\s*workerCommand\s*\]\s*,\s*\{[\s\S]{0,200}?stdout\s*:\s*["']ignore["'][\s\S]{0,200}?stderr\s*:\s*["']ignore["'][\s\S]{0,100}?\}\s*\)\s*;/g,
|
|
1521
|
+
),
|
|
1522
|
+
],
|
|
1523
|
+
mainFnRange,
|
|
1524
|
+
);
|
|
1431
1525
|
const continuationPromptMatches = [
|
|
1432
1526
|
...contents.matchAll(
|
|
1433
1527
|
/(?:const\s+GJC_TEAM_CONTINUATION_PROMPT\s*=\s*["']Continue only your current claimed GJC team task\. Re-read current GJC team state; do not replay prior output; report status\.["']\s*;|import\s*\{[\s\S]{0,1000}?\bGJC_TEAM_CONTINUATION_PROMPT\b[\s\S]{0,1000}?\}\s*from\s*["']\.\/team-workers["']\s*;)/g,
|
|
@@ -1438,24 +1532,31 @@ function exactTeamRuntimeSendKeysRanges(contents: string): ShellRange[] {
|
|
|
1438
1532
|
/const\s+args\s*=\s*Object\.freeze\(\s*\[\s*["']send-keys["']\s*,\s*["']-l["']\s*,\s*["']-t["']\s*,\s*worker\.pane_id\s*,\s*GJC_TEAM_CONTINUATION_PROMPT\s*,\s*["'];["']\s*,\s*["']send-keys["']\s*,\s*["']-t["']\s*,\s*worker\.pane_id\s*,\s*["']Enter["']\s*,?\s*\]\s*\)\s*;\s*const\s+dispatch\s*=\s*gjcTeamRuntimeTestSeams\?\.continuationTmuxDispatch\s*\?\s*gjcTeamRuntimeTestSeams\.continuationTmuxDispatch\(config\.tmux_command\s*,\s*args\)\s*:\s*Bun\.spawnSync\(\[config\.tmux_command\s*,\s*\.\.\.args\]\s*,\s*\{\s*stdout\s*:\s*["']ignore["']\s*,\s*stderr\s*:\s*["']ignore["']\s*,\s*timeout\s*:\s*GJC_TEAM_CONTINUATION_DISPATCH_TIMEOUT_MS\s*,?\s*\}\s*\)\s*;/g,
|
|
1439
1533
|
),
|
|
1440
1534
|
];
|
|
1441
|
-
const enterMatches =
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1535
|
+
const enterMatches = scopeMatches(
|
|
1536
|
+
[
|
|
1537
|
+
...contents.matchAll(
|
|
1538
|
+
/const\s+sendKeys\s*=\s*Bun\.spawnSync\(\s*\[\s*config\.tmux_command\s*,\s*["']send-keys["']\s*,\s*["']-t["']\s*,\s*paneId\s*,\s*["']Enter["']\s*\]\s*,\s*\{[\s\S]{0,200}?stdout\s*:\s*["']ignore["'][\s\S]{0,200}?stderr\s*:\s*["']ignore["'][\s\S]{0,100}?\}\s*\)\s*;/g,
|
|
1539
|
+
),
|
|
1540
|
+
],
|
|
1541
|
+
mainFnRange,
|
|
1542
|
+
);
|
|
1446
1543
|
const fallbackPredicateMatches = [
|
|
1447
1544
|
...contents.matchAll(
|
|
1448
1545
|
/function\s+shouldDispatchWorkerWithSendKeys\([^)]*\)\s*:\s*boolean\s*\{\s*return\s+platform\s*===\s*["']win32["']\s*\|\|\s*path\.basename\(tmuxCommand\)\.toLowerCase\(\)\s*===\s*["']psmux["']\s*;\s*\}/g,
|
|
1449
1546
|
),
|
|
1450
1547
|
];
|
|
1451
|
-
const useFallbackMatches =
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1548
|
+
const useFallbackMatches = scopeMatches(
|
|
1549
|
+
[
|
|
1550
|
+
...contents.matchAll(
|
|
1551
|
+
/const\s+useSendKeysFallback\s*=\s*shouldDispatchWorkerWithSendKeys\(config\.tmux_command\)\s*;/g,
|
|
1552
|
+
),
|
|
1553
|
+
],
|
|
1554
|
+
mainFnRange,
|
|
1555
|
+
);
|
|
1556
|
+
const splitWorkerCommandMatches = scopeMatches(
|
|
1557
|
+
[...contents.matchAll(/\.\.\.\(useSendKeysFallback\s*\?\s*\[\]\s*:\s*\[workerCommand\]\)\s*,/g)],
|
|
1558
|
+
mainFnRange,
|
|
1559
|
+
);
|
|
1459
1560
|
if (
|
|
1460
1561
|
guardMatches.length !== 1 ||
|
|
1461
1562
|
payloadMatches.length !== 1 ||
|
|
@@ -1543,7 +1644,10 @@ function isTypeOnlyTmuxPrimitiveOccurrence(contents: string, occurrence: TmuxPri
|
|
|
1543
1644
|
|
|
1544
1645
|
function tmuxMachineBusViolations(file: string, contents: string): string[] {
|
|
1545
1646
|
if (isGeneratedDocumentationIndex(file)) return [];
|
|
1546
|
-
const allowedTeamFallbackRanges =
|
|
1647
|
+
const allowedTeamFallbackRanges =
|
|
1648
|
+
file === teamRuntimeTmuxPath
|
|
1649
|
+
? [...exactTeamRuntimeSendKeysRanges(contents), ...exactMemoryGuardSendKeysRanges(contents)]
|
|
1650
|
+
: [];
|
|
1547
1651
|
const violations: string[] = [];
|
|
1548
1652
|
for (const occurrence of tmuxPrimitiveOccurrences(contents)) {
|
|
1549
1653
|
const isExactTeamFallback =
|