@sentropic/h2a-runtime 0.98.6 → 0.98.7-rc.10
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/dist/agent-launch-args.d.ts.map +1 -1
- package/dist/agent-launch-args.js +5 -5
- package/dist/agent-launch-args.js.map +1 -1
- package/dist/agy-claude.d.ts +42 -0
- package/dist/agy-claude.d.ts.map +1 -0
- package/dist/agy-claude.js +148 -0
- package/dist/agy-claude.js.map +1 -0
- package/dist/agy-headless.d.ts +11 -0
- package/dist/agy-headless.d.ts.map +1 -0
- package/dist/agy-headless.js +104 -0
- package/dist/agy-headless.js.map +1 -0
- package/dist/attach.d.ts +5 -0
- package/dist/attach.d.ts.map +1 -1
- package/dist/attach.js +75 -6
- package/dist/attach.js.map +1 -1
- package/dist/auth-login.d.ts +24 -1
- package/dist/auth-login.d.ts.map +1 -1
- package/dist/auth-login.js +132 -4
- package/dist/auth-login.js.map +1 -1
- package/dist/central-mcp.d.ts +34 -0
- package/dist/central-mcp.d.ts.map +1 -1
- package/dist/central-mcp.js +275 -71
- package/dist/central-mcp.js.map +1 -1
- package/dist/claude-code-cli-isolation.d.ts +53 -0
- package/dist/claude-code-cli-isolation.d.ts.map +1 -0
- package/dist/claude-code-cli-isolation.js +277 -0
- package/dist/claude-code-cli-isolation.js.map +1 -0
- package/dist/claude-code-cli-lifecycle.d.ts +80 -0
- package/dist/claude-code-cli-lifecycle.d.ts.map +1 -0
- package/dist/claude-code-cli-lifecycle.js +402 -0
- package/dist/claude-code-cli-lifecycle.js.map +1 -0
- package/dist/claude-code-cli-runner.d.ts +89 -0
- package/dist/claude-code-cli-runner.d.ts.map +1 -0
- package/dist/claude-code-cli-runner.js +659 -0
- package/dist/claude-code-cli-runner.js.map +1 -0
- package/dist/claude-seat-input.d.ts +47 -0
- package/dist/claude-seat-input.d.ts.map +1 -0
- package/dist/claude-seat-input.js +272 -0
- package/dist/claude-seat-input.js.map +1 -0
- package/dist/claude-seat-mesh-contract.d.ts +88 -0
- package/dist/claude-seat-mesh-contract.d.ts.map +1 -0
- package/dist/claude-seat-mesh-contract.js +13 -0
- package/dist/claude-seat-mesh-contract.js.map +1 -0
- package/dist/cli-help-groups.js +1 -1
- package/dist/cli-help-groups.js.map +1 -1
- package/dist/cli-seat-codecs.d.ts +86 -0
- package/dist/cli-seat-codecs.d.ts.map +1 -0
- package/dist/cli-seat-codecs.js +255 -0
- package/dist/cli-seat-codecs.js.map +1 -0
- package/dist/cli-seat-fixtures.d.ts +86 -0
- package/dist/cli-seat-fixtures.d.ts.map +1 -0
- package/dist/cli-seat-fixtures.js +114 -0
- package/dist/cli-seat-fixtures.js.map +1 -0
- package/dist/cli-seat-materialization.d.ts +245 -0
- package/dist/cli-seat-materialization.d.ts.map +1 -0
- package/dist/cli-seat-materialization.js +646 -0
- package/dist/cli-seat-materialization.js.map +1 -0
- package/dist/conv-guard.d.ts.map +1 -1
- package/dist/conv-guard.js +6 -2
- package/dist/conv-guard.js.map +1 -1
- package/dist/crash-log.d.ts +112 -0
- package/dist/crash-log.d.ts.map +1 -0
- package/dist/crash-log.js +560 -0
- package/dist/crash-log.js.map +1 -0
- package/dist/delegate.d.ts +10 -0
- package/dist/delegate.d.ts.map +1 -1
- package/dist/delegate.js +29 -0
- package/dist/delegate.js.map +1 -1
- package/dist/file-lock.d.ts +4 -2
- package/dist/file-lock.d.ts.map +1 -1
- package/dist/file-lock.js +24 -10
- package/dist/file-lock.js.map +1 -1
- package/dist/gateway-host/claude-seat-client.d.ts +32 -0
- package/dist/gateway-host/claude-seat-client.d.ts.map +1 -0
- package/dist/gateway-host/claude-seat-client.js +38 -0
- package/dist/gateway-host/claude-seat-client.js.map +1 -0
- package/dist/gateway-host/config-file.d.ts +2 -0
- package/dist/gateway-host/config-file.d.ts.map +1 -1
- package/dist/gateway-host/config-file.js +5 -1
- package/dist/gateway-host/config-file.js.map +1 -1
- package/dist/gateway-host/daemon.d.ts.map +1 -1
- package/dist/gateway-host/daemon.js +1 -2
- package/dist/gateway-host/daemon.js.map +1 -1
- package/dist/gateway-host/host.d.ts +6 -0
- package/dist/gateway-host/host.d.ts.map +1 -1
- package/dist/gateway-host/host.js +24 -3
- package/dist/gateway-host/host.js.map +1 -1
- package/dist/gateway-host/live-auth.d.ts +62 -0
- package/dist/gateway-host/live-auth.d.ts.map +1 -0
- package/dist/gateway-host/live-auth.js +87 -0
- package/dist/gateway-host/live-auth.js.map +1 -0
- package/dist/gateway-host/live-declarations.d.ts +58 -0
- package/dist/gateway-host/live-declarations.d.ts.map +1 -0
- package/dist/gateway-host/live-declarations.js +429 -0
- package/dist/gateway-host/live-declarations.js.map +1 -0
- package/dist/gateway-host/live-disclosure.d.ts +124 -0
- package/dist/gateway-host/live-disclosure.d.ts.map +1 -0
- package/dist/gateway-host/live-disclosure.js +347 -0
- package/dist/gateway-host/live-disclosure.js.map +1 -0
- package/dist/gateway-host/live-github.d.ts +11 -0
- package/dist/gateway-host/live-github.d.ts.map +1 -0
- package/dist/gateway-host/live-github.js +374 -0
- package/dist/gateway-host/live-github.js.map +1 -0
- package/dist/gateway-host/live-host.d.ts +20 -0
- package/dist/gateway-host/live-host.d.ts.map +1 -0
- package/dist/gateway-host/live-host.js +14 -0
- package/dist/gateway-host/live-host.js.map +1 -0
- package/dist/gateway-host/live-object-store.d.ts +35 -0
- package/dist/gateway-host/live-object-store.d.ts.map +1 -0
- package/dist/gateway-host/live-object-store.js +447 -0
- package/dist/gateway-host/live-object-store.js.map +1 -0
- package/dist/gateway-host/live-registration.d.ts +162 -0
- package/dist/gateway-host/live-registration.d.ts.map +1 -0
- package/dist/gateway-host/live-registration.js +455 -0
- package/dist/gateway-host/live-registration.js.map +1 -0
- package/dist/gateway-model-catalog/model-catalog.d.ts +38 -0
- package/dist/gateway-model-catalog/model-catalog.d.ts.map +1 -0
- package/dist/gateway-model-catalog/model-catalog.js +167 -0
- package/dist/gateway-model-catalog/model-catalog.js.map +1 -0
- package/dist/identity-cull/cull.js +1 -1
- package/dist/identity-cull/cull.js.map +1 -1
- package/dist/identity-cull/identity-fence.d.ts +48 -0
- package/dist/identity-cull/identity-fence.d.ts.map +1 -0
- package/dist/identity-cull/identity-fence.js +221 -0
- package/dist/identity-cull/identity-fence.js.map +1 -0
- package/dist/identity-operator-break.d.ts +43 -0
- package/dist/identity-operator-break.d.ts.map +1 -0
- package/dist/identity-operator-break.js +85 -0
- package/dist/identity-operator-break.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +525 -132
- package/dist/index.js.map +1 -1
- package/dist/launch-layout.d.ts.map +1 -1
- package/dist/launch-layout.js +10 -2
- package/dist/launch-layout.js.map +1 -1
- package/dist/llm-mesh-accounts.d.ts +128 -6
- package/dist/llm-mesh-accounts.d.ts.map +1 -1
- package/dist/llm-mesh-accounts.js +370 -14
- package/dist/llm-mesh-accounts.js.map +1 -1
- package/dist/native-host.d.ts +25 -1
- package/dist/native-host.d.ts.map +1 -1
- package/dist/native-host.js +211 -28
- package/dist/native-host.js.map +1 -1
- package/dist/native-restart.d.ts +2 -0
- package/dist/native-restart.d.ts.map +1 -1
- package/dist/native-restart.js +7 -0
- package/dist/native-restart.js.map +1 -1
- package/dist/native-terminal/fleet.d.ts +11 -0
- package/dist/native-terminal/fleet.d.ts.map +1 -1
- package/dist/native-terminal/fleet.js +58 -1
- package/dist/native-terminal/fleet.js.map +1 -1
- package/dist/native-terminal/host-scope.d.ts +18 -0
- package/dist/native-terminal/host-scope.d.ts.map +1 -0
- package/dist/native-terminal/host-scope.js +65 -0
- package/dist/native-terminal/host-scope.js.map +1 -0
- package/dist/native-terminal/host.d.ts +7 -1
- package/dist/native-terminal/host.d.ts.map +1 -1
- package/dist/native-terminal/host.js +10 -26
- package/dist/native-terminal/host.js.map +1 -1
- package/dist/native-terminal/journal.d.ts +5 -0
- package/dist/native-terminal/journal.d.ts.map +1 -1
- package/dist/native-terminal/journal.js +28 -16
- package/dist/native-terminal/journal.js.map +1 -1
- package/dist/native-terminal/op.d.ts +49 -1
- package/dist/native-terminal/op.d.ts.map +1 -1
- package/dist/native-terminal/op.js +254 -38
- package/dist/native-terminal/op.js.map +1 -1
- package/dist/native-terminal/process.d.ts.map +1 -1
- package/dist/native-terminal/process.js +10 -1
- package/dist/native-terminal/process.js.map +1 -1
- package/dist/native-terminal/screen.d.ts.map +1 -1
- package/dist/native-terminal/screen.js +1 -1
- package/dist/native-terminal/screen.js.map +1 -1
- package/dist/native-terminal/server.d.ts +12 -2
- package/dist/native-terminal/server.d.ts.map +1 -1
- package/dist/native-terminal/server.js +143 -42
- package/dist/native-terminal/server.js.map +1 -1
- package/dist/native-terminal/session-scope.d.ts +2 -0
- package/dist/native-terminal/session-scope.d.ts.map +1 -0
- package/dist/native-terminal/session-scope.js +32 -0
- package/dist/native-terminal/session-scope.js.map +1 -0
- package/dist/proc-identity.d.ts +31 -0
- package/dist/proc-identity.d.ts.map +1 -1
- package/dist/proc-identity.js +54 -0
- package/dist/proc-identity.js.map +1 -1
- package/dist/prompt-delivery.d.ts +3 -0
- package/dist/prompt-delivery.d.ts.map +1 -1
- package/dist/prompt-delivery.js +8 -3
- package/dist/prompt-delivery.js.map +1 -1
- package/dist/protocol-local.d.ts +16 -0
- package/dist/protocol-local.d.ts.map +1 -1
- package/dist/protocol-local.js +14 -0
- package/dist/protocol-local.js.map +1 -1
- package/dist/registry.d.ts +16 -12
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +39 -5
- package/dist/registry.js.map +1 -1
- package/dist/relaunch.d.ts +16 -0
- package/dist/relaunch.d.ts.map +1 -1
- package/dist/relaunch.js +42 -1
- package/dist/relaunch.js.map +1 -1
- package/dist/restore.d.ts +4 -0
- package/dist/restore.d.ts.map +1 -1
- package/dist/restore.js +9 -37
- package/dist/restore.js.map +1 -1
- package/dist/resume-launch-options.d.ts +3 -3
- package/dist/resume-launch-options.d.ts.map +1 -1
- package/dist/resume-launch-options.js +7 -4
- package/dist/resume-launch-options.js.map +1 -1
- package/dist/run.d.ts +2 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +88 -20
- package/dist/run.js.map +1 -1
- package/dist/soft-refresh.d.ts.map +1 -1
- package/dist/soft-refresh.js +6 -0
- package/dist/soft-refresh.js.map +1 -1
- package/dist/terminal-reset.d.ts +104 -0
- package/dist/terminal-reset.d.ts.map +1 -0
- package/dist/terminal-reset.js +229 -0
- package/dist/terminal-reset.js.map +1 -0
- package/dist/tmux.d.ts +54 -8
- package/dist/tmux.d.ts.map +1 -1
- package/dist/tmux.js +143 -36
- package/dist/tmux.js.map +1 -1
- package/dist/vendor/engram-live/contracts.d.ts +825 -0
- package/dist/vendor/engram-live/contracts.js +1734 -0
- package/dist/vendor/engram-live/integration.d.ts +113 -0
- package/dist/vendor/engram-live/integration.js +254 -0
- package/dist/vendor/engram-live/pr-sync.d.ts +144 -0
- package/dist/vendor/engram-live/pr-sync.js +411 -0
- package/dist/vendor/engram-live/registration.d.ts +138 -0
- package/dist/vendor/engram-live/registration.js +358 -0
- package/dist/vendor/engram-live/retention.d.ts +56 -0
- package/dist/vendor/engram-live/retention.js +179 -0
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-launch-args.d.ts","sourceRoot":"","sources":["../src/agent-launch-args.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-launch-args.d.ts","sourceRoot":"","sources":["../src/agent-launch-args.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,qDAAsD,CAAC;AACzF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,eAAO,MAAM,oBAAoB,6CAA8C,CAAC;AAChF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAE/E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,CAE7E;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAGF,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAEpD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAM1D;AAUD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAY5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC,GACvE,MAAM,GAAG,SAAS,CAUpB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,EAAE,CA4F9E"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeAgyEffort, resolveAgyModel } from "./agy-claude.js";
|
|
1
2
|
export const AGENT_LAUNCH_PROFILES = ["claude", "codex", "agy", "muse", "vibe"];
|
|
2
3
|
export const AGENT_LAUNCH_EFFORTS = ["low", "medium", "high", "xhigh"];
|
|
3
4
|
export function isAgentLaunchProfile(value) {
|
|
@@ -68,9 +69,6 @@ export function buildAgentLaunchArgs(options) {
|
|
|
68
69
|
if (options.headless && options.resumeId) {
|
|
69
70
|
throw new Error("headless agent launch cannot resume a conversation");
|
|
70
71
|
}
|
|
71
|
-
if (options.profile === "agy" && options.effort === "xhigh") {
|
|
72
|
-
throw new Error("AGY effort must be low|medium|high");
|
|
73
|
-
}
|
|
74
72
|
if (options.profile === "claude") {
|
|
75
73
|
return [
|
|
76
74
|
...(options.bare ? ["--bare"] : []),
|
|
@@ -81,10 +79,12 @@ export function buildAgentLaunchArgs(options) {
|
|
|
81
79
|
];
|
|
82
80
|
}
|
|
83
81
|
if (options.profile === "agy") {
|
|
82
|
+
const effort = normalizeAgyEffort(options.effort);
|
|
83
|
+
const model = resolveAgyModel(options.model, effort);
|
|
84
84
|
return [
|
|
85
85
|
...(options.agent ? ["--agent", options.agent] : []),
|
|
86
|
-
...(
|
|
87
|
-
...(
|
|
86
|
+
...(model ? ["--model", model] : []),
|
|
87
|
+
...(effort ? ["--effort", effort] : []),
|
|
88
88
|
...(options.headless
|
|
89
89
|
? [
|
|
90
90
|
"--input-format",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-launch-args.js","sourceRoot":"","sources":["../src/agent-launch-args.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAGzF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAGhF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAQ,qBAA2C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAaD,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AACxD,MAAM,CAAC,MAAM,6BAA6B,GAAG,MAAM,CAAC;AAEpD,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc;IACpD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,6BAA6B,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,+BAA+B,6BAA6B,cAAc,CAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAwE;IAExE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACnD,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAClD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YACvB,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;SACrC,CAAC,IAAI,CAAC;IACT,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA+B;IAClE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-launch-args.js","sourceRoot":"","sources":["../src/agent-launch-args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export declare const AGY_CLAUDE_QUOTA_CODE = "agy-claude-quota-exhausted";
|
|
2
|
+
export type AgyEffort = "low" | "medium" | "high";
|
|
3
|
+
export declare class AgyEffortError extends Error {
|
|
4
|
+
readonly code = "agy-effort-unsupported";
|
|
5
|
+
}
|
|
6
|
+
export declare function normalizeAgyEffort(effort: string | undefined): AgyEffort | undefined;
|
|
7
|
+
export declare function isAgyClaudeModel(model: string | undefined): boolean;
|
|
8
|
+
export declare function resolveAgyModel(model: string | undefined, effort?: string): string | undefined;
|
|
9
|
+
export declare class AgyClaudeBuildOptInError extends Error {
|
|
10
|
+
readonly code = "agy-claude-build-requires-opt-in";
|
|
11
|
+
}
|
|
12
|
+
export declare function assertAgyClaudeBuildAllowed(options: {
|
|
13
|
+
profile: string;
|
|
14
|
+
model?: string | undefined;
|
|
15
|
+
role?: string | undefined;
|
|
16
|
+
allowClaudeBuild?: boolean | undefined;
|
|
17
|
+
}): void;
|
|
18
|
+
export type AgyClaudeQuotaStatus = {
|
|
19
|
+
status: "unknown" | "exhausted";
|
|
20
|
+
observedAt?: string;
|
|
21
|
+
resetsAt?: string;
|
|
22
|
+
signature?: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function detectAgyClaudeQuotaExhaustion(output: string, now?: number): {
|
|
25
|
+
exhausted: boolean;
|
|
26
|
+
signature?: string;
|
|
27
|
+
resetsAt?: string;
|
|
28
|
+
};
|
|
29
|
+
export declare class AgyClaudeQuotaExhaustedError extends Error {
|
|
30
|
+
readonly signature: string;
|
|
31
|
+
readonly code = "agy-claude-quota-exhausted";
|
|
32
|
+
readonly retrySafe = false;
|
|
33
|
+
readonly retryable = false;
|
|
34
|
+
readonly quota: AgyClaudeQuotaStatus;
|
|
35
|
+
constructor(signature: string, output: string, now?: number);
|
|
36
|
+
get resetsAt(): string | undefined;
|
|
37
|
+
}
|
|
38
|
+
export declare function agyClaudeQuotaError(signature: string, output: string, now?: number): AgyClaudeQuotaExhaustedError;
|
|
39
|
+
export declare function agyQuotaStatusPath(): string;
|
|
40
|
+
export declare function readAgyClaudeQuotaStatus(path?: string): AgyClaudeQuotaStatus;
|
|
41
|
+
export declare function writeAgyClaudeQuotaStatus(status: AgyClaudeQuotaStatus, path?: string): void;
|
|
42
|
+
//# sourceMappingURL=agy-claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agy-claude.d.ts","sourceRoot":"","sources":["../src/agy-claude.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,qBAAqB,+BAA+B,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAClD,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,4BAA4B;CAC1C;AACD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAKpF;AACD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEnE;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU9F;AACD,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,sCAAsC;CACpD;AACD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChH,GAAG,IAAI,CAOP;AACD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG;IAChF,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3D,CAyCA;AACD,qBAAa,4BAA6B,SAAQ,KAAK;IAKzC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAJtC,QAAQ,CAAC,IAAI,gCAAyB;IACtC,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;gBAChB,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa;IAMxE,IAAI,QAAQ,IAAI,MAAM,GAAG,SAAS,CAAgC;CACnE;AACD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,4BAA4B,CAErH;AACD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AACD,wBAAgB,wBAAwB,CAAC,IAAI,SAAuB,GAAG,oBAAoB,CAU1F;AACD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,oBAAoB,EAAE,IAAI,SAAuB,GAAG,IAAI,CAKzG"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// AGY/Claude shared contract — VENDORED copy of
|
|
2
|
+
// `packages/h2a/src/runtime/agy-claude.ts` (see agy-claude-vendor-sync.test.ts).
|
|
3
|
+
// Why vendored instead of imported: this module is a leaf (node builtins
|
|
4
|
+
// only) that both the runtime and the core need; a cross-package import in
|
|
5
|
+
// either direction creates an undeclared edge that breaks isolated installs
|
|
6
|
+
// of this package (MODULE_NOT_FOUND at host startup) or an unorderable
|
|
7
|
+
// typecheck cycle. Edit the CORE copy first, then sync this file exactly
|
|
8
|
+
// (the sync test fails closed on any drift).
|
|
9
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { homedir } from "node:os";
|
|
11
|
+
import { dirname, join } from "node:path";
|
|
12
|
+
export const AGY_CLAUDE_QUOTA_CODE = "agy-claude-quota-exhausted";
|
|
13
|
+
export class AgyEffortError extends Error {
|
|
14
|
+
code = "agy-effort-unsupported";
|
|
15
|
+
}
|
|
16
|
+
export function normalizeAgyEffort(effort) {
|
|
17
|
+
if (effort === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (effort === "max")
|
|
20
|
+
return "high";
|
|
21
|
+
if (effort === "low" || effort === "medium" || effort === "high")
|
|
22
|
+
return effort;
|
|
23
|
+
throw new AgyEffortError(`invalid AGY effort ${effort}; AGY effort must be low|medium|high (max maps to high)`);
|
|
24
|
+
}
|
|
25
|
+
export function isAgyClaudeModel(model) {
|
|
26
|
+
return model?.startsWith("claude-") ?? false;
|
|
27
|
+
}
|
|
28
|
+
export function resolveAgyModel(model, effort) {
|
|
29
|
+
const level = normalizeAgyEffort(effort);
|
|
30
|
+
const claude = model && /^(claude-(?:opus|sonnet)-5-5)(?:-(.*))?$/.exec(model);
|
|
31
|
+
if (claude) {
|
|
32
|
+
// Validate a supplied suffix even when a separate effort overrides it.
|
|
33
|
+
const suffix = normalizeAgyEffort(claude[2]);
|
|
34
|
+
const resolved = level ?? suffix;
|
|
35
|
+
return resolved ? `${claude[1]}-${resolved}` : model;
|
|
36
|
+
}
|
|
37
|
+
return model;
|
|
38
|
+
}
|
|
39
|
+
export class AgyClaudeBuildOptInError extends Error {
|
|
40
|
+
code = "agy-claude-build-requires-opt-in";
|
|
41
|
+
}
|
|
42
|
+
export function assertAgyClaudeBuildAllowed(options) {
|
|
43
|
+
if (options.role !== undefined && !["review", "challenge", "build"].includes(options.role)) {
|
|
44
|
+
throw new Error("invalid agy run role: expected review|challenge|build");
|
|
45
|
+
}
|
|
46
|
+
if (options.profile === "agy" && isAgyClaudeModel(options.model) && options.role === "build" && options.allowClaudeBuild !== true) {
|
|
47
|
+
throw new AgyClaudeBuildOptInError("AGY Claude credits are reserved for reviews and adversarial challenges; build requires --allow-claude-build");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function detectAgyClaudeQuotaExhaustion(output, now = Date.now()) {
|
|
51
|
+
let preliminary = { exhausted: false };
|
|
52
|
+
const lines = output.split(/\r?\n/);
|
|
53
|
+
for (let index = 0; index < lines.length; index++) {
|
|
54
|
+
let line = lines[index];
|
|
55
|
+
// Provider diagnostics only: prose mentioning 429/quota is not evidence.
|
|
56
|
+
if (!/^\s*(?:AGY_ERROR\s*\{|(?:API )?error\s*:)/i.test(line))
|
|
57
|
+
continue;
|
|
58
|
+
let structured = /AGY_ERROR\s*(\{.*)/.exec(line)?.[1];
|
|
59
|
+
if (structured) {
|
|
60
|
+
// Native/tmux screen captures insert newlines at visual column wraps,
|
|
61
|
+
// including inside JSON strings. Reassemble only an anchored diagnostic,
|
|
62
|
+
// require complete JSON, and never consume the next provider diagnostic.
|
|
63
|
+
let end = index;
|
|
64
|
+
for (;;) {
|
|
65
|
+
try {
|
|
66
|
+
JSON.parse(structured);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
const next = lines[end + 1];
|
|
71
|
+
if (next === undefined || /^\s*(?:AGY_ERROR\s*\{|(?:API )?error\s*:)/i.test(next))
|
|
72
|
+
break;
|
|
73
|
+
structured += next;
|
|
74
|
+
end++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
JSON.parse(structured);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
continue;
|
|
82
|
+
} // Partial chunks still prove no complete reset.
|
|
83
|
+
line = `AGY_ERROR ${structured}`;
|
|
84
|
+
index = end;
|
|
85
|
+
}
|
|
86
|
+
let signature;
|
|
87
|
+
if (/\b429\b/.test(line))
|
|
88
|
+
signature = "agy-claude:http-429";
|
|
89
|
+
else if (/RESOURCE_EXHAUSTED/i.test(line))
|
|
90
|
+
signature = "agy-claude:resource-exhausted";
|
|
91
|
+
else if (/quota (?:exceeded|reached)|individual quota/i.test(line))
|
|
92
|
+
signature = "agy-claude:quota-exceeded";
|
|
93
|
+
if (!signature)
|
|
94
|
+
continue;
|
|
95
|
+
const duration = /Resets in\s+((?:\d+(?:\.\d+)?\s*[dhms]\s*)+)/i.exec(line)?.[1];
|
|
96
|
+
let ms = 0;
|
|
97
|
+
if (duration)
|
|
98
|
+
for (const part of duration.matchAll(/(\d+(?:\.\d+)?)\s*([dhms])/gi)) {
|
|
99
|
+
ms += Number(part[1]) * ({ d: 86_400_000, h: 3_600_000, m: 60_000, s: 1_000 }[part[2].toLowerCase()] ?? 0);
|
|
100
|
+
}
|
|
101
|
+
const resetsAt = duration && Number.isFinite(now + ms) && ms < 8.64e15 - now
|
|
102
|
+
? new Date(now + ms).toISOString() : undefined;
|
|
103
|
+
if (resetsAt)
|
|
104
|
+
return { exhausted: true, signature, resetsAt };
|
|
105
|
+
preliminary = { exhausted: true, signature };
|
|
106
|
+
}
|
|
107
|
+
return preliminary;
|
|
108
|
+
}
|
|
109
|
+
export class AgyClaudeQuotaExhaustedError extends Error {
|
|
110
|
+
signature;
|
|
111
|
+
code = AGY_CLAUDE_QUOTA_CODE;
|
|
112
|
+
retrySafe = false;
|
|
113
|
+
retryable = false;
|
|
114
|
+
quota;
|
|
115
|
+
constructor(signature, output, now = Date.now()) {
|
|
116
|
+
super("AGY Claude quota exhausted; no fallback or automatic retry. The caller chooses the next action.");
|
|
117
|
+
this.signature = signature;
|
|
118
|
+
const detected = detectAgyClaudeQuotaExhaustion(output, now);
|
|
119
|
+
this.quota = { status: "exhausted", signature, observedAt: new Date(now).toISOString(),
|
|
120
|
+
...(detected.resetsAt ? { resetsAt: detected.resetsAt } : {}) };
|
|
121
|
+
}
|
|
122
|
+
get resetsAt() { return this.quota.resetsAt; }
|
|
123
|
+
}
|
|
124
|
+
export function agyClaudeQuotaError(signature, output, now = Date.now()) {
|
|
125
|
+
return new AgyClaudeQuotaExhaustedError(signature, output, now);
|
|
126
|
+
}
|
|
127
|
+
export function agyQuotaStatusPath() {
|
|
128
|
+
return join(process.env.XDG_STATE_HOME ?? join(homedir(), ".local", "state"), "h2a", "agy-claude-quota.json");
|
|
129
|
+
}
|
|
130
|
+
export function readAgyClaudeQuotaStatus(path = agyQuotaStatusPath()) {
|
|
131
|
+
try {
|
|
132
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
133
|
+
if (value.status === "exhausted" && typeof value.observedAt === "string" && Number.isFinite(Date.parse(value.observedAt))) {
|
|
134
|
+
return { status: value.status, observedAt: value.observedAt,
|
|
135
|
+
...(typeof value.signature === "string" ? { signature: value.signature } : {}),
|
|
136
|
+
...(typeof value.resetsAt === "string" && Number.isFinite(Date.parse(value.resetsAt)) ? { resetsAt: value.resetsAt } : {}) };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch { /* No provider observation: never invent availability. */ }
|
|
140
|
+
return { status: "unknown" };
|
|
141
|
+
}
|
|
142
|
+
export function writeAgyClaudeQuotaStatus(status, path = agyQuotaStatusPath()) {
|
|
143
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
144
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
145
|
+
writeFileSync(temporary, JSON.stringify(status), { mode: 0o600 });
|
|
146
|
+
renameSync(temporary, path);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=agy-claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agy-claude.js","sourceRoot":"","sources":["../src/agy-claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Private run-once supervisor, shared by native and tmux launch paths. */
|
|
2
|
+
export declare function runAgyClaudeHeadless(options: {
|
|
3
|
+
command: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
model: string;
|
|
6
|
+
resultPath: string;
|
|
7
|
+
logPath: string;
|
|
8
|
+
promptFile?: string | undefined;
|
|
9
|
+
outputFile?: string | undefined;
|
|
10
|
+
}): Promise<Record<string, unknown>>;
|
|
11
|
+
//# sourceMappingURL=agy-headless.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agy-headless.d.ts","sourceRoot":"","sources":["../src/agy-headless.ts"],"names":[],"mappings":"AAMA,2EAA2E;AAC3E,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IACpF,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA+EnC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createWriteStream, existsSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { agyClaudeQuotaError, detectAgyClaudeQuotaExhaustion, readAgyClaudeQuotaStatus, writeAgyClaudeQuotaStatus } from "./agy-claude.js";
|
|
6
|
+
/** Private run-once supervisor, shared by native and tmux launch paths. */
|
|
7
|
+
export async function runAgyClaudeHeadless(options) {
|
|
8
|
+
const priorOutput = options.outputFile && existsSync(options.outputFile) ? statSync(options.outputFile) : undefined;
|
|
9
|
+
const input = options.promptFile ? readFileSync(options.promptFile) : undefined;
|
|
10
|
+
if (options.promptFile)
|
|
11
|
+
unlinkSync(options.promptFile);
|
|
12
|
+
const log = createWriteStream(options.logPath, { mode: 0o600 });
|
|
13
|
+
const diagnostic = { stdout: "", stderr: "" };
|
|
14
|
+
let observedModel;
|
|
15
|
+
let modelMismatch = false;
|
|
16
|
+
let pendingLine = "";
|
|
17
|
+
let quotaError;
|
|
18
|
+
const observeModel = (line) => {
|
|
19
|
+
try {
|
|
20
|
+
const event = JSON.parse(line);
|
|
21
|
+
if (typeof event.model === "string") {
|
|
22
|
+
observedModel = event.model;
|
|
23
|
+
modelMismatch ||= observedModel !== options.model;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch { /* Provider text is retained in the log. */ }
|
|
27
|
+
};
|
|
28
|
+
const collect = (stream, chunk) => {
|
|
29
|
+
log.write(chunk);
|
|
30
|
+
// Preserve a quota observation even if later output fills the bounded tail.
|
|
31
|
+
// Keep the streams separate: stderr JSON can span chunks interleaved with stdout.
|
|
32
|
+
const collected = diagnostic[stream] + chunk.toString("utf8");
|
|
33
|
+
const verdict = detectAgyClaudeQuotaExhaustion(collected);
|
|
34
|
+
if (verdict.exhausted && (!quotaError || (!quotaError.resetsAt && verdict.resetsAt))) {
|
|
35
|
+
quotaError = agyClaudeQuotaError(verdict.signature, collected);
|
|
36
|
+
}
|
|
37
|
+
diagnostic[stream] = collected.slice(-65_536);
|
|
38
|
+
if (stream !== "stdout")
|
|
39
|
+
return;
|
|
40
|
+
const lines = (pendingLine + chunk.toString("utf8")).split("\n");
|
|
41
|
+
// Consume complete events before bounding the unfinished line. A large
|
|
42
|
+
// following event must not erase a preceding model declaration.
|
|
43
|
+
pendingLine = lines.pop().slice(-65_536);
|
|
44
|
+
for (const line of lines)
|
|
45
|
+
observeModel(line);
|
|
46
|
+
};
|
|
47
|
+
const completion = await new Promise((done) => {
|
|
48
|
+
const child = spawn(options.command, options.args, { shell: false, stdio: ["pipe", "pipe", "pipe"] });
|
|
49
|
+
const signals = ["SIGTERM", "SIGINT", "SIGHUP"];
|
|
50
|
+
const forward = (signal) => { child.kill(signal); };
|
|
51
|
+
for (const signal of signals)
|
|
52
|
+
process.on(signal, forward);
|
|
53
|
+
child.stdout.on("data", chunk => collect("stdout", chunk));
|
|
54
|
+
child.stderr.on("data", chunk => collect("stderr", chunk));
|
|
55
|
+
child.stdin.on("error", () => { });
|
|
56
|
+
child.stdin.end(input);
|
|
57
|
+
let spawnError;
|
|
58
|
+
child.on("error", error => { spawnError = error.message; });
|
|
59
|
+
child.on("close", (code, signal) => {
|
|
60
|
+
for (const signal of signals)
|
|
61
|
+
process.removeListener(signal, forward);
|
|
62
|
+
done({ exitCode: code ?? 1,
|
|
63
|
+
...(spawnError || signal ? { spawnError: spawnError ?? `agy terminated by ${signal}` } : {}) });
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
observeModel(pendingLine);
|
|
67
|
+
await new Promise(done => log.end(done));
|
|
68
|
+
let quota = readAgyClaudeQuotaStatus();
|
|
69
|
+
if (quotaError) {
|
|
70
|
+
quota = quotaError.quota;
|
|
71
|
+
try {
|
|
72
|
+
writeAgyClaudeQuotaStatus(quota);
|
|
73
|
+
}
|
|
74
|
+
catch { /* Final result still carries the observation. */ }
|
|
75
|
+
}
|
|
76
|
+
const output = options.outputFile ? (() => {
|
|
77
|
+
if (!existsSync(options.outputFile))
|
|
78
|
+
return { path: options.outputFile, state: "missing" };
|
|
79
|
+
const current = statSync(options.outputFile);
|
|
80
|
+
return { path: options.outputFile, state: !priorOutput || current.mtimeMs !== priorOutput.mtimeMs || current.ctimeMs !== priorOutput.ctimeMs ? "written" : "unchanged" };
|
|
81
|
+
})() : { state: "not-requested" };
|
|
82
|
+
const mismatch = modelMismatch;
|
|
83
|
+
const code = quotaError?.code ?? (mismatch ? "agy-model-mismatch" : output.state === "missing" || output.state === "unchanged" ? "agy-output-missing" : completion.exitCode !== 0 ? "agy-process-failed" : undefined);
|
|
84
|
+
const result = {
|
|
85
|
+
kind: code ? "h2a.run.failure" : "h2a.run.completion", version: 1,
|
|
86
|
+
state: code || completion.exitCode !== 0 ? "failed" : "done",
|
|
87
|
+
...completion, model: options.model, modelSource: "launch-argument",
|
|
88
|
+
effectiveModel: observedModel ?? "unknown", quota, output,
|
|
89
|
+
...(code ? { code, error: quotaError?.message ?? (mismatch ? "AGY reported a different model; no fallback permitted" : code === "agy-process-failed" ? completion.spawnError ?? `AGY exited with code ${completion.exitCode}` : "AGY exited without writing the expected output file"), retrySafe: false, retryable: false,
|
|
90
|
+
...(quotaError?.resetsAt ? { resetsAt: quotaError.resetsAt } : {}) } : {}),
|
|
91
|
+
};
|
|
92
|
+
const temporary = `${options.resultPath}.${process.pid}.tmp`;
|
|
93
|
+
writeFileSync(temporary, JSON.stringify(result) + "\n", { mode: 0o600 });
|
|
94
|
+
renameSync(temporary, options.resultPath);
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
98
|
+
const [resultPath, logPath, promptFile, model, outputFile, command, ...args] = process.argv.slice(2);
|
|
99
|
+
if (!resultPath || !logPath || !model || !command)
|
|
100
|
+
throw new Error("invalid private AGY supervisor arguments");
|
|
101
|
+
const result = await runAgyClaudeHeadless({ command, args, model, resultPath, logPath, promptFile: promptFile || undefined, outputFile: outputFile || undefined });
|
|
102
|
+
process.exitCode = result.state === "done" ? 0 : 1;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=agy-headless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agy-headless.js","sourceRoot":"","sources":["../src/agy-headless.ts"],"names":[],"mappings":"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"}
|
package/dist/attach.d.ts
CHANGED
|
@@ -32,6 +32,8 @@ export type ReconnectOptions = {
|
|
|
32
32
|
readonly maxDelayMs?: number;
|
|
33
33
|
/** Consecutive short-lived streams tolerated before giving up. */
|
|
34
34
|
readonly maxShortCycles?: number;
|
|
35
|
+
/** Reopen attempts per outage before declaring the stream lost. */
|
|
36
|
+
readonly maxAttempts?: number;
|
|
35
37
|
};
|
|
36
38
|
export type AttachResult = {
|
|
37
39
|
readonly close: () => Promise<void>;
|
|
@@ -90,6 +92,9 @@ export declare function createRemoteSession(baseUrl: string, body: {
|
|
|
90
92
|
workspacePath?: string;
|
|
91
93
|
home?: string;
|
|
92
94
|
agentImage?: string;
|
|
95
|
+
/** Explicit per-session opt-in to LLM-gateway routing. Transmitted ONLY
|
|
96
|
+
* when the user asked for it; absent otherwise (direct by default). */
|
|
97
|
+
llmGateway?: boolean;
|
|
93
98
|
}, fetchImpl?: typeof fetch): Promise<{
|
|
94
99
|
id: string;
|
|
95
100
|
}>;
|
package/dist/attach.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../src/attach.ts"],"names":[],"mappings":"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"}
|
package/dist/attach.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { authHeaders, DEFAULT_SESSION_TARGET } from "./config.js";
|
|
2
2
|
import { ensureConnected } from "./tunnel.js";
|
|
3
|
+
import { appendCrashLog, crashSignalName } from "./crash-log.js";
|
|
4
|
+
import { resetClientTerminal, restoreTtyState, saveTtyState, SIGNAL_NUMBERS, } from "./terminal-reset.js";
|
|
3
5
|
const DEFAULT_RECONNECT = {
|
|
4
6
|
minStreamMs: 1000,
|
|
5
7
|
baseDelayMs: 250,
|
|
6
8
|
maxDelayMs: 8000,
|
|
7
9
|
maxShortCycles: 10,
|
|
10
|
+
maxAttempts: 120,
|
|
8
11
|
};
|
|
9
12
|
const DEFAULT_INPUT_RETRY = {
|
|
10
13
|
maxAttempts: 6,
|
|
@@ -62,6 +65,7 @@ export async function attach(options) {
|
|
|
62
65
|
signal: controller.signal,
|
|
63
66
|
});
|
|
64
67
|
if (!sseResponse.ok || !sseResponse.body) {
|
|
68
|
+
appendCrashLog("attach", { event: "refusal", sessionId, reason: "sse-open-failed", detail: `${sseResponse.status} ${sseResponse.statusText}` });
|
|
65
69
|
throw new Error(`attach: SSE stream returned ${sseResponse.status} ${sseResponse.statusText}`);
|
|
66
70
|
}
|
|
67
71
|
let reader = sseResponse.body.getReader();
|
|
@@ -70,9 +74,16 @@ export async function attach(options) {
|
|
|
70
74
|
const finished = new Promise((resolve) => {
|
|
71
75
|
finishedResolve = resolve;
|
|
72
76
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
// rev351-2/3.2: the remote session drives the REAL client terminal via
|
|
78
|
+
// relayed VT bytes (plus raw stdin). Every close path — detach, remote
|
|
79
|
+
// exit, 404, give-up — must emit the VT reset and restore termios/raw,
|
|
80
|
+
// even when the live session keeps running server-side and emits no
|
|
81
|
+
// closing sequence of its own.
|
|
82
|
+
// rev351r2-2: shared save/restore home (terminal-reset.ts), no local copy.
|
|
83
|
+
const ttyState = saveTtyState(stdin);
|
|
84
|
+
const restoreClientTerminal = () => {
|
|
85
|
+
restoreTtyState(ttyState, stdin, () => resetClientTerminal(stdout));
|
|
86
|
+
};
|
|
76
87
|
if (stdin.isTTY)
|
|
77
88
|
stdin.setRawMode?.(true);
|
|
78
89
|
stdin.resume();
|
|
@@ -197,11 +208,26 @@ export async function attach(options) {
|
|
|
197
208
|
};
|
|
198
209
|
stdin.on("data", onStdin);
|
|
199
210
|
stdout.on?.("resize", onResize);
|
|
211
|
+
// Async relay: the event loop runs, so handlers CAN execute (unlike the
|
|
212
|
+
// blocking spawnSync wrappers). On a fatal signal, reset synchronously and
|
|
213
|
+
// preserve signal-death semantics via 128+n.
|
|
214
|
+
const signalHandlers = new Map();
|
|
215
|
+
const uninstallSignals = () => {
|
|
216
|
+
for (const [signal, handler] of signalHandlers) {
|
|
217
|
+
process.removeListener(signal, handler);
|
|
218
|
+
}
|
|
219
|
+
signalHandlers.clear();
|
|
220
|
+
};
|
|
200
221
|
let closed = false;
|
|
201
222
|
const close = async () => {
|
|
202
223
|
if (closed)
|
|
203
224
|
return;
|
|
204
225
|
closed = true;
|
|
226
|
+
// rev351r2-5: restore FIRST, before the drain wait below. Uninstalling
|
|
227
|
+
// the handlers and then waiting left a window where a signal killed
|
|
228
|
+
// without reset; the restore is idempotent, the wait is not.
|
|
229
|
+
restoreClientTerminal();
|
|
230
|
+
uninstallSignals();
|
|
205
231
|
if (detachTimer) {
|
|
206
232
|
clearTimeout(detachTimer);
|
|
207
233
|
detachTimer = null;
|
|
@@ -215,11 +241,33 @@ export async function attach(options) {
|
|
|
215
241
|
aborted = true;
|
|
216
242
|
controller.abort();
|
|
217
243
|
stdout.off?.("resize", onResize);
|
|
218
|
-
if (stdin.isTTY)
|
|
219
|
-
stdin.setRawMode?.(wasRaw);
|
|
220
244
|
stdin.pause();
|
|
221
245
|
finishedResolve();
|
|
222
246
|
};
|
|
247
|
+
for (const signal of ["SIGHUP", "SIGINT", "SIGQUIT", "SIGTERM"]) {
|
|
248
|
+
const number = SIGNAL_NUMBERS[signal] ?? 0;
|
|
249
|
+
const handler = () => {
|
|
250
|
+
if (closed) {
|
|
251
|
+
process.exit(128 + number);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
restoreClientTerminal();
|
|
256
|
+
}
|
|
257
|
+
finally {
|
|
258
|
+
uninstallSignals();
|
|
259
|
+
try {
|
|
260
|
+
controller.abort();
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// Best effort before exiting.
|
|
264
|
+
}
|
|
265
|
+
process.exit(128 + number);
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
signalHandlers.set(signal, handler);
|
|
269
|
+
process.on(signal, handler);
|
|
270
|
+
}
|
|
223
271
|
(async () => {
|
|
224
272
|
let buffer = "";
|
|
225
273
|
// Outer loop: stream → on unexpected end (network change / sleep / tunnel
|
|
@@ -257,6 +305,20 @@ export async function attach(options) {
|
|
|
257
305
|
}
|
|
258
306
|
}
|
|
259
307
|
else if (envelope.type === "terminal.exited") {
|
|
308
|
+
const exitedPayload = envelope.payload;
|
|
309
|
+
const exitedCode = typeof exitedPayload.exitCode === "number" && Number.isSafeInteger(exitedPayload.exitCode)
|
|
310
|
+
? exitedPayload.exitCode
|
|
311
|
+
: undefined;
|
|
312
|
+
const exitedSignal = crashSignalName(typeof exitedPayload.signal === "number" || typeof exitedPayload.signal === "string"
|
|
313
|
+
? exitedPayload.signal
|
|
314
|
+
: undefined);
|
|
315
|
+
appendCrashLog("attach", {
|
|
316
|
+
event: "sessionExit",
|
|
317
|
+
sessionId,
|
|
318
|
+
...(exitedCode !== undefined ? { exitCode: exitedCode } : {}),
|
|
319
|
+
...(exitedSignal ? { signal: exitedSignal } : {}),
|
|
320
|
+
detail: "terminal.exited",
|
|
321
|
+
});
|
|
260
322
|
await close();
|
|
261
323
|
return;
|
|
262
324
|
}
|
|
@@ -300,6 +362,7 @@ export async function attach(options) {
|
|
|
300
362
|
`(${futileCycles} times in a row, last one after ${lifetimeMs}ms) — giving up ` +
|
|
301
363
|
`instead of reconnecting in a loop. The session may still be alive: ` +
|
|
302
364
|
`retry with h2a attach ${sessionId}.\r\n`);
|
|
365
|
+
appendCrashLog("attach", { event: "refusal", sessionId, reason: "reconnect-give-up", detail: `${futileCycles} futile cycles, last stream ${lifetimeMs}ms` });
|
|
303
366
|
await close();
|
|
304
367
|
return;
|
|
305
368
|
}
|
|
@@ -317,7 +380,7 @@ export async function attach(options) {
|
|
|
317
380
|
stderr.write("\r\n[h2a] connection lost — reconnecting…\r\n");
|
|
318
381
|
buffer = "";
|
|
319
382
|
let reopened = false;
|
|
320
|
-
for (let attempt = 0; attempt <
|
|
383
|
+
for (let attempt = 0; attempt < reconnectCfg.maxAttempts && !closed; attempt++) {
|
|
321
384
|
try {
|
|
322
385
|
await ensureConnected(baseUrl, stderr);
|
|
323
386
|
const resp = await doFetch(joinUrl(baseUrl, `/sessions/${sessionId}/events`), {
|
|
@@ -326,6 +389,7 @@ export async function attach(options) {
|
|
|
326
389
|
});
|
|
327
390
|
if (resp.status === 404) {
|
|
328
391
|
stderr.write("[h2a] session ended\r\n");
|
|
392
|
+
appendCrashLog("attach", { event: "sessionExit", sessionId, reason: "http-404" });
|
|
329
393
|
await close();
|
|
330
394
|
return;
|
|
331
395
|
}
|
|
@@ -346,6 +410,9 @@ export async function attach(options) {
|
|
|
346
410
|
await new Promise((r) => setTimeout(r, 1000));
|
|
347
411
|
}
|
|
348
412
|
if (!reopened) {
|
|
413
|
+
// No child exited: the event stream would not reopen, so this attach
|
|
414
|
+
// ends. `exit` (not `childExit`) keeps the record honest.
|
|
415
|
+
appendCrashLog("attach", { event: "exit", sessionId, reason: "reconnect-failed", detail: "could not reopen the event stream" });
|
|
349
416
|
await close();
|
|
350
417
|
return;
|
|
351
418
|
}
|
|
@@ -460,6 +527,8 @@ export async function createRemoteSession(baseUrl, body, fetchImpl = fetch) {
|
|
|
460
527
|
};
|
|
461
528
|
if (body.displayName)
|
|
462
529
|
payload.displayName = body.displayName;
|
|
530
|
+
if (body.llmGateway === true)
|
|
531
|
+
payload.llmGateway = true;
|
|
463
532
|
if (body.workspaceSync)
|
|
464
533
|
payload.workspaceSync = true;
|
|
465
534
|
if (body.workspaceExport)
|