@caupulican/pi-adaptative 0.93.5 → 0.93.7

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.
Files changed (77) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/bundled-resources/skills/n-plus-2-architecture/SKILL.md +13 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +5 -20
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/autonomy/envelope-enforcement.d.ts +3 -1
  7. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  8. package/dist/core/autonomy/envelope-enforcement.js +23 -12
  9. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  10. package/dist/core/autonomy/gates.d.ts.map +1 -1
  11. package/dist/core/autonomy/gates.js +24 -26
  12. package/dist/core/autonomy/gates.js.map +1 -1
  13. package/dist/core/context-gc.d.ts.map +1 -1
  14. package/dist/core/context-gc.js +128 -3
  15. package/dist/core/context-gc.js.map +1 -1
  16. package/dist/core/session-shutdown.d.ts +9 -0
  17. package/dist/core/session-shutdown.d.ts.map +1 -0
  18. package/dist/core/session-shutdown.js +44 -0
  19. package/dist/core/session-shutdown.js.map +1 -0
  20. package/dist/core/settings-manager.js.map +1 -1
  21. package/dist/core/skill-vault.d.ts +6 -2
  22. package/dist/core/skill-vault.d.ts.map +1 -1
  23. package/dist/core/skill-vault.js +30 -12
  24. package/dist/core/skill-vault.js.map +1 -1
  25. package/dist/core/system-prompt.d.ts.map +1 -1
  26. package/dist/core/system-prompt.js +7 -18
  27. package/dist/core/system-prompt.js.map +1 -1
  28. package/dist/core/tools/bash.d.ts.map +1 -1
  29. package/dist/core/tools/bash.js +2 -3
  30. package/dist/core/tools/bash.js.map +1 -1
  31. package/dist/core/tools/edit.d.ts.map +1 -1
  32. package/dist/core/tools/edit.js +86 -33
  33. package/dist/core/tools/edit.js.map +1 -1
  34. package/dist/core/tools/file-mutation-intent.d.ts +16 -0
  35. package/dist/core/tools/file-mutation-intent.d.ts.map +1 -1
  36. package/dist/core/tools/file-mutation-intent.js +51 -2
  37. package/dist/core/tools/file-mutation-intent.js.map +1 -1
  38. package/dist/core/tools/persistent-process-coordinator.d.ts +8 -2
  39. package/dist/core/tools/persistent-process-coordinator.d.ts.map +1 -1
  40. package/dist/core/tools/persistent-process-coordinator.js +52 -4
  41. package/dist/core/tools/persistent-process-coordinator.js.map +1 -1
  42. package/dist/core/tools/shell-execution-session.d.ts +8 -1
  43. package/dist/core/tools/shell-execution-session.d.ts.map +1 -1
  44. package/dist/core/tools/shell-execution-session.js +54 -3
  45. package/dist/core/tools/shell-execution-session.js.map +1 -1
  46. package/dist/core/tools/shell-session.d.ts +2 -1
  47. package/dist/core/tools/shell-session.d.ts.map +1 -1
  48. package/dist/core/tools/shell-session.js +22 -2
  49. package/dist/core/tools/shell-session.js.map +1 -1
  50. package/dist/core/tools/skill.d.ts +1 -0
  51. package/dist/core/tools/skill.d.ts.map +1 -1
  52. package/dist/core/tools/skill.js +11 -6
  53. package/dist/core/tools/skill.js.map +1 -1
  54. package/dist/core/tools/windows-shell-engine.d.ts +1 -1
  55. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
  56. package/dist/core/tools/windows-shell-engine.js +6 -2
  57. package/dist/core/tools/windows-shell-engine.js.map +1 -1
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +1 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/modes/interactive/components/settings-selector.js +2 -2
  63. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  64. package/dist/utils/shell.d.ts +3 -5
  65. package/dist/utils/shell.d.ts.map +1 -1
  66. package/dist/utils/shell.js +4 -7
  67. package/dist/utils/shell.js.map +1 -1
  68. package/docs/settings.md +7 -7
  69. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  70. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  71. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  72. package/examples/extensions/sandbox/package-lock.json +2 -2
  73. package/examples/extensions/sandbox/package.json +1 -1
  74. package/examples/extensions/with-deps/package-lock.json +2 -2
  75. package/examples/extensions/with-deps/package.json +1 -1
  76. package/npm-shrinkwrap.json +12 -12
  77. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"shell-session.js","sourceRoot":"","sources":["../../../src/core/tools/shell-session.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Persistent shell sessions for the bash tool.\n *\n * One long-lived shell process per agent (keyed registry) replaces process-per-command spawning.\n * On Windows every command previously paid a full PowerShell boot; a persistent session pays it\n * once. Shell state (current directory, environment variables) persists across an agent's\n * commands; each key gets an isolated session so concurrently running agents never share state.\n *\n * Protocol: commands stream to the session over stdin and are terminated by a per-command\n * sentinel carrying a random nonce, the exit code, and (bash) the shell's `$PWD` so failures can\n * report where the command actually ran. Bash wraps commands in an eval of a quoted\n * heredoc (arbitrary content stays data; syntax errors stay contained in eval); PowerShell runs a\n * ReadLine loop decoding base64 lines (no external binaries involved). On bash, command stderr is\n * merged into stdout at the shell so sentinel ordering is guaranteed on one pipe.\n *\n * PowerShell runs each command as a bare `Invoke-Expression`, NOT piped into `Out-Default`: piping\n * a native command's output into another pipeline stage forces PowerShell's NativeCommandProcessor\n * to capture that child's stdout/stderr into an internal pipe and read it to EOF before the\n * pipeline completes. A detached grandchild that inherited those handles (e.g. `start /b` holding\n * stdio open) then keeps that internal pipe's write end open, so the sentinel — written after the\n * pipeline \"completes\" — waits for the grandchild to die instead of the direct child. The bare\n * invocation lets a native command's stdout/stderr handles be inherited directly by the child\n * process; the direct child's own exit is what unblocks the sentinel line, exactly like the\n * per-command backend and like bash's stdio inheritance above. The bounded consequence: a native\n * command's stderr no longer merges into the session's stdout pipe (there is no capturing pipeline\n * stage to merge it) — it arrives on the session's own stderr pipe instead. A nonce-bearing barrier\n * on that pipe joins it deterministically with the stdout completion frame before the command\n * resolves. PowerShell 5.1's habit of wrapping redirected stderr text in a `NativeCommandError`\n * record also disappears, which is an accuracy improvement (the raw stderr bytes are reported,\n * not a wrapped/duplicated rendering of them).\n *\n * Kill semantics: timeout/abort/silence kill the WHOLE session process tree (a hung foreground\n * command cannot be killed individually without job control) and the next exec respawns a fresh\n * session, losing accumulated shell state by design. A command that exits the shell itself\n * (`exit 3`) reports the shell's exit code and also respawns lazily afterwards.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { basename } from \"node:path\";\nimport { createSilenceWatchdog } from \"@caupulican/pi-agent-core/reliability\";\nimport { type ChildProcess, type SpawnOptions, spawn } from \"child_process\";\nimport {\n\tcreatePowerShellHostEnvironment,\n\tPOWERSHELL_ARGS,\n\tPOWERSHELL_BOOTSTRAP,\n\tPOWERSHELL_SESSION_READY_MARKER,\n\tPOWERSHELL_SESSION_STDERR_READY_MARKER,\n\tPOWERSHELL_STDERR_BARRIER_LABEL,\n} from \"../../utils/powershell-session-protocol.ts\";\nimport {\n\tgetPowerShellCandidateConfigs,\n\tgetShellConfig,\n\tgetShellEnv,\n\ttype PlatformShellToolName,\n\tPOWERSHELL_STARTUP_PROBE_TIMEOUT_MS,\n\ttype ShellConfig,\n} from \"../../utils/shell.ts\";\nimport { claimCliPowerShellWarmStart } from \"./early-powershell-session.ts\";\nimport { PersistentProcessCoordinator } from \"./persistent-process-coordinator.ts\";\n\nexport {\n\tPOWERSHELL_SESSION_READY_MARKER,\n\tPOWERSHELL_SESSION_STDERR_READY_MARKER,\n} from \"../../utils/powershell-session-protocol.ts\";\n\nconst SENTINEL_BYTE = 0x1e;\nconst BASH_SENTINEL_PAYLOAD_PREFIX = Buffer.from(\"v1:\", \"latin1\");\nconst MAX_STARTUP_DIAGNOSTIC_BYTES = 16 * 1024;\nconst POWERSHELL_SESSION_READY_BYTES = Buffer.from(POWERSHELL_SESSION_READY_MARKER, \"latin1\");\nconst POWERSHELL_SESSION_STDERR_READY_BYTES = Buffer.from(POWERSHELL_SESSION_STDERR_READY_MARKER, \"latin1\");\n\nexport interface ShellSessionExecOptions {\n\tonData: (data: Buffer) => void;\n\tsignal?: AbortSignal;\n\t/** Wall-clock bound in seconds; when set, a breach kills the session and throws `timeout:<s>`. */\n\ttimeoutSeconds?: number;\n\t/** Output-silence bound in ms; when set, silence kills the session and throws `silence:<s>`. */\n\tsilenceMs?: number;\n\tenv?: NodeJS.ProcessEnv;\n}\n\nexport interface PersistentShellSessionOptions {\n\tresolvePowerShellCandidates?: () => ShellConfig[];\n\tspawn?: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\tstartupTimeoutMs?: number;\n}\n\nfunction escapeSingleQuotesPosix(value: string): string {\n\treturn value.replace(/'/g, \"'\\\\''\");\n}\n\nfunction escapeSingleQuotesPowerShell(value: string): string {\n\treturn value.replace(/'/g, \"''\");\n}\n\n/**\n * The whole command is heredoc-quoted data: eval keeps syntax errors contained (a raw syntax\n * error on the session's stdin would abort the shell), and the random delimiter makes content\n * collisions with agent output practically impossible. `< /dev/null` gives commands the same\n * EOF-stdin the per-command backend's `stdio: [\"ignore\", ...]` provided.\n */\nexport function buildBashWire(command: string, nonce: string, cdTo: string | null): string {\n\tconst body = cdTo ? `command cd -- '${escapeSingleQuotesPosix(cdTo)}' && {\\n${command}\\n}` : command;\n\treturn [\n\t\t`{ eval \"$(cat <<'PI_EOF_${nonce}'`,\n\t\tbody,\n\t\t`PI_EOF_${nonce}`,\n\t\t`)\"; } < /dev/null 2>&1`,\n\t\t// Version and byte length make the frame unambiguous even when a legal POSIX path contains\n\t\t// the record-separator byte used to terminate the sentinel. The subshell keeps its status\n\t\t// scratch variable and LC_ALL change out of the persistent caller session.\n\t\t`(__pi_status=$?; LC_ALL=C; printf '\\\\n\\\\036%s:v1:%s:%s:%s\\\\036' '${nonce}' \"$__pi_status\" \"\\${#PWD}\" \"$PWD\")`,\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\ninterface ParsedShellSentinel {\n\tcloseIndex: number;\n\texitCode: number | null;\n\tcwd?: string;\n}\n\n/** Parse the versioned bash frame plus the legacy exit-only/exit+cwd PowerShell test frames. */\nfunction parseShellSentinel(buffer: Buffer, payloadStart: number): ParsedShellSentinel | undefined {\n\tconst available = buffer.length - payloadStart;\n\tconst prefixComparisonLength = Math.min(available, BASH_SENTINEL_PAYLOAD_PREFIX.length);\n\tconst couldBeVersioned =\n\t\tprefixComparisonLength > 0 &&\n\t\tbuffer.compare(\n\t\t\tBASH_SENTINEL_PAYLOAD_PREFIX,\n\t\t\t0,\n\t\t\tprefixComparisonLength,\n\t\t\tpayloadStart,\n\t\t\tpayloadStart + prefixComparisonLength,\n\t\t) === 0;\n\tif (couldBeVersioned && available < BASH_SENTINEL_PAYLOAD_PREFIX.length) return undefined;\n\n\tif (\n\t\tavailable >= BASH_SENTINEL_PAYLOAD_PREFIX.length &&\n\t\tbuffer.compare(\n\t\t\tBASH_SENTINEL_PAYLOAD_PREFIX,\n\t\t\t0,\n\t\t\tBASH_SENTINEL_PAYLOAD_PREFIX.length,\n\t\t\tpayloadStart,\n\t\t\tpayloadStart + BASH_SENTINEL_PAYLOAD_PREFIX.length,\n\t\t) === 0\n\t) {\n\t\tconst exitStart = payloadStart + BASH_SENTINEL_PAYLOAD_PREFIX.length;\n\t\tconst exitEnd = buffer.indexOf(0x3a, exitStart);\n\t\tif (exitEnd === -1) return undefined;\n\t\tconst lengthEnd = buffer.indexOf(0x3a, exitEnd + 1);\n\t\tif (lengthEnd === -1) return undefined;\n\t\tconst exitCodeText = buffer.subarray(exitStart, exitEnd).toString(\"latin1\");\n\t\tconst cwdLengthText = buffer.subarray(exitEnd + 1, lengthEnd).toString(\"latin1\");\n\t\tconst cwdByteLength = /^\\d+$/.test(cwdLengthText) ? Number.parseInt(cwdLengthText, 10) : Number.NaN;\n\t\tif (Number.isSafeInteger(cwdByteLength)) {\n\t\t\tconst cwdStart = lengthEnd + 1;\n\t\t\tconst closeIndex = cwdStart + cwdByteLength;\n\t\t\tif (buffer.length <= closeIndex) return undefined;\n\t\t\tif (buffer[closeIndex] === SENTINEL_BYTE) {\n\t\t\t\tconst parsedExitCode = Number.parseInt(exitCodeText, 10);\n\t\t\t\treturn {\n\t\t\t\t\tcloseIndex,\n\t\t\t\t\texitCode: Number.isNaN(parsedExitCode) ? null : parsedExitCode,\n\t\t\t\t\t...(cwdByteLength > 0 ? { cwd: buffer.subarray(cwdStart, closeIndex).toString(\"utf8\") } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t// A corrupt versioned payload must still settle like the legacy parser: retain the exit\n\t\t// classification when possible and degrade only the cwd field.\n\t\tconst closeIndex = buffer.indexOf(SENTINEL_BYTE, lengthEnd + 1);\n\t\tif (closeIndex === -1) return undefined;\n\t\tconst parsedExitCode = Number.parseInt(exitCodeText, 10);\n\t\treturn { closeIndex, exitCode: Number.isNaN(parsedExitCode) ? null : parsedExitCode };\n\t}\n\n\tconst closeIndex = buffer.indexOf(SENTINEL_BYTE, payloadStart);\n\tif (closeIndex === -1) return undefined;\n\tconst payload = buffer.subarray(payloadStart, closeIndex);\n\tconst separatorIndex = payload.indexOf(0x3a);\n\tconst exitCodeText = (separatorIndex === -1 ? payload : payload.subarray(0, separatorIndex)).toString(\"latin1\");\n\tconst parsedExitCode = Number.parseInt(exitCodeText, 10);\n\treturn {\n\t\tcloseIndex,\n\t\texitCode: Number.isNaN(parsedExitCode) ? null : parsedExitCode,\n\t\t...(separatorIndex !== -1 && separatorIndex < payload.length - 1\n\t\t\t? { cwd: payload.subarray(separatorIndex + 1).toString(\"utf8\") }\n\t\t\t: {}),\n\t};\n}\n\n/** One protocol line: `<nonce> <base64(utf8 command)>`. Base64 keeps arbitrary multi-line commands line-safe. */\nexport function buildPowerShellWire(command: string, nonce: string, cdTo: string | null): string {\n\tconst body = cdTo\n\t\t? `Set-Location -LiteralPath '${escapeSingleQuotesPowerShell(cdTo)}' -ErrorAction Stop\\n${command}`\n\t\t: command;\n\treturn `${nonce} ${Buffer.from(body, \"utf8\").toString(\"base64\")}\\n`;\n}\n\nfunction shallowEnvEquals(a: NodeJS.ProcessEnv, b: NodeJS.ProcessEnv): boolean {\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\tif (aKeys.length !== bKeys.length) return false;\n\tfor (const key of aKeys) {\n\t\tif (a[key] !== b[key]) return false;\n\t}\n\treturn true;\n}\n\nfunction buildPowerShellEnvironmentPrelude(current: NodeJS.ProcessEnv, desired: NodeJS.ProcessEnv): string | null {\n\tconst currentByName = new Map(\n\t\tObject.entries(current)\n\t\t\t.filter((entry): entry is [string, string] => entry[1] !== undefined)\n\t\t\t.map(([name, value]) => [name.toLowerCase(), { name, value }]),\n\t);\n\tconst desiredByName = new Map(\n\t\tObject.entries(desired)\n\t\t\t.filter((entry): entry is [string, string] => entry[1] !== undefined)\n\t\t\t.map(([name, value]) => [name.toLowerCase(), { name, value }]),\n\t);\n\tconst setValues = [...desiredByName.entries()].flatMap(([identity, entry]) =>\n\t\tcurrentByName.get(identity)?.value === entry.value ? [] : [entry],\n\t);\n\tconst removeNames = [...currentByName.entries()].flatMap(([identity, entry]) =>\n\t\tdesiredByName.has(identity) ? [] : [entry.name],\n\t);\n\tif (setValues.length === 0 && removeNames.length === 0) return null;\n\tconst encoded = Buffer.from(JSON.stringify({ setValues, removeNames }), \"utf8\").toString(\"base64\");\n\treturn [\n\t\t`$__pi_env_delta = ConvertFrom-Json ([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('${encoded}')))`,\n\t\t\"foreach ($__pi_env_item in @($__pi_env_delta.setValues)) { [System.Environment]::SetEnvironmentVariable([string]$__pi_env_item.name, [string]$__pi_env_item.value, 'Process') }\",\n\t\t\"foreach ($__pi_env_name in @($__pi_env_delta.removeNames)) { [System.Environment]::SetEnvironmentVariable([string]$__pi_env_name, $null, 'Process') }\",\n\t\t\"Remove-Variable -Name __pi_env_delta,__pi_env_item,__pi_env_name -ErrorAction SilentlyContinue\",\n\t].join(\"\\n\");\n}\n\ninterface ActiveExec {\n\tonStdout(data: Buffer): void;\n\tonStderr(data: Buffer): void;\n\tonChildClose(code: number | null): void;\n\tfail(error: Error): void;\n}\n\nexport class PersistentShellSession {\n\tprivate readonly key: string;\n\tprivate readonly kind: PlatformShellToolName;\n\tprivate readonly resolvePowerShellCandidates: () => ShellConfig[];\n\tprivate readonly spawnProcess: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\tprivate readonly startupTimeoutMs: number;\n\tprivate readonly coordinator = new PersistentProcessCoordinator();\n\tprivate childEnv: NodeJS.ProcessEnv | null = null;\n\tprivate lastRequestedCwd: string | null = null;\n\tprivate activeExec: ActiveExec | null = null;\n\tprivate rejectStartup: ((error: Error) => void) | null = null;\n\tprivate disposed = false;\n\n\tconstructor(key: string, kind: PlatformShellToolName, options: PersistentShellSessionOptions = {}) {\n\t\tthis.key = key;\n\t\tthis.kind = kind;\n\t\tthis.resolvePowerShellCandidates = options.resolvePowerShellCandidates ?? getPowerShellCandidateConfigs;\n\t\tthis.spawnProcess = options.spawn ?? spawn;\n\t\tthis.startupTimeoutMs = options.startupTimeoutMs ?? POWERSHELL_STARTUP_PROBE_TIMEOUT_MS;\n\t}\n\n\tget sessionKind(): PlatformShellToolName {\n\t\treturn this.kind;\n\t}\n\n\t/** Serialized: one command at a time per session, later calls queue behind earlier ones. */\n\texec(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: ShellSessionExecOptions,\n\t): Promise<{ exitCode: number | null; cwd?: string }> {\n\t\treturn this.coordinator.runSerialized(() => this.execNow(command, cwd, options));\n\t}\n\n\t/** Start and validate the long-lived shell before the first user command. Idempotent per session. */\n\tprewarm(cwd: string, env: NodeJS.ProcessEnv = getShellEnv()): Promise<void> {\n\t\treturn this.coordinator.runSerialized(async () => {\n\t\t\tif (this.disposed) throw new Error(`Shell session \"${this.key}\" is disposed`);\n\t\t\tconst resolvedEnv = this.kind === \"powershell\" ? createPowerShellHostEnvironment(env) : env;\n\t\t\tif (\n\t\t\t\tthis.kind !== \"powershell\" &&\n\t\t\t\tthis.coordinator.child &&\n\t\t\t\tthis.childEnv &&\n\t\t\t\t!shallowEnvEquals(this.childEnv, resolvedEnv)\n\t\t\t) {\n\t\t\t\tthis.killChild();\n\t\t\t}\n\t\t\tif (!this.coordinator.child) await this.spawnChild(cwd, resolvedEnv);\n\t\t\tif (\n\t\t\t\tthis.kind === \"powershell\" &&\n\t\t\t\tthis.childEnv &&\n\t\t\t\t(!shallowEnvEquals(this.childEnv, resolvedEnv) || this.lastRequestedCwd !== cwd)\n\t\t\t) {\n\t\t\t\tconst result = await this.execNow(\"\", cwd, { onData: () => {}, env: resolvedEnv });\n\t\t\t\tif (result.exitCode !== 0) {\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tthrow new Error(`PowerShell session reconciliation failed with exit code ${result.exitCode ?? \"null\"}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.coordinator.setLoopRef(false);\n\t\t});\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.rejectStartup?.(new Error(`Shell session \"${this.key}\" is disposed`));\n\t\tthis.activeExec?.fail(new Error(`Shell session \"${this.key}\" is disposed`));\n\t\tthis.coordinator.dispose();\n\t\tthis.resetChildState();\n\t}\n\n\tprivate async execNow(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\t{ onData, signal, timeoutSeconds, silenceMs, env }: ShellSessionExecOptions,\n\t): Promise<{ exitCode: number | null; cwd?: string }> {\n\t\tif (this.disposed) throw new Error(`Shell session \"${this.key}\" is disposed`);\n\t\tif (signal?.aborted) throw new Error(\"aborted\");\n\n\t\tconst requestedEnv = env ?? getShellEnv();\n\t\tconst resolvedEnv = this.kind === \"powershell\" ? createPowerShellHostEnvironment(requestedEnv) : requestedEnv;\n\t\t// The environment is spawn-time shell config: an env that differs from the running\n\t\t// session's (e.g. a spawn hook rewriting it per command) requires a fresh shell.\n\t\tif (\n\t\t\tthis.kind !== \"powershell\" &&\n\t\t\tthis.coordinator.child &&\n\t\t\tthis.childEnv &&\n\t\t\t!shallowEnvEquals(this.childEnv, resolvedEnv)\n\t\t) {\n\t\t\tthis.killChild();\n\t\t}\n\n\t\t// Re-enter the host-requested cwd only when it CHANGES between calls; an unchanged\n\t\t// request preserves the agent's own in-session `cd` (that persistence is the feature).\n\t\tlet cdTo: string | null = null;\n\t\tif (!this.coordinator.child) await this.spawnChild(cwd, resolvedEnv);\n\t\tif (this.lastRequestedCwd !== cwd) cdTo = cwd;\n\t\tthis.lastRequestedCwd = cwd;\n\t\tlet resolvedCommand = command;\n\t\tif (this.kind === \"powershell\" && this.childEnv && !shallowEnvEquals(this.childEnv, resolvedEnv)) {\n\t\t\tconst environmentPrelude = buildPowerShellEnvironmentPrelude(this.childEnv, resolvedEnv);\n\t\t\tif (environmentPrelude) resolvedCommand = `${environmentPrelude}\\n${command}`;\n\t\t\tthis.childEnv = { ...resolvedEnv };\n\t\t}\n\n\t\tconst child = this.coordinator.child;\n\t\tif (!child?.stdin || !child.stdout || !child.stderr) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(`Failed to start ${this.kind} session`);\n\t\t}\n\n\t\tconst nonce = randomBytes(8).toString(\"hex\");\n\t\tconst wire =\n\t\t\tthis.kind === \"powershell\"\n\t\t\t\t? buildPowerShellWire(resolvedCommand, nonce, cdTo)\n\t\t\t\t: buildBashWire(resolvedCommand, nonce, cdTo);\n\t\tconst sentinelPrefix = Buffer.from(`\\n\\x1e${nonce}:`, \"latin1\");\n\t\tconst stderrBarrier = Buffer.from(`\\x1e${nonce}:${POWERSHELL_STDERR_BARRIER_LABEL}\\x1e\\n`, \"latin1\");\n\n\t\tthis.coordinator.setLoopRef(true);\n\t\ttry {\n\t\t\treturn await new Promise<{ exitCode: number | null; cwd?: string }>((resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tlet stdoutPending: Buffer = Buffer.alloc(0);\n\t\t\t\tlet stderrPending: Buffer = Buffer.alloc(0);\n\t\t\t\tlet commandExitCode: number | null | undefined;\n\t\t\t\tlet commandCwd: string | undefined;\n\t\t\t\tlet stderrBarrierSeen = this.kind !== \"powershell\";\n\t\t\t\tlet timeoutTimer: NodeJS.Timeout | undefined;\n\n\t\t\t\tconst silenceWatchdog =\n\t\t\t\t\ttimeoutSeconds === undefined && silenceMs !== undefined && silenceMs > 0\n\t\t\t\t\t\t? createSilenceWatchdog({\n\t\t\t\t\t\t\t\tsilenceMs,\n\t\t\t\t\t\t\t\tonSilence: () => {\n\t\t\t\t\t\t\t\t\tthis.killChild();\n\t\t\t\t\t\t\t\t\tsettle(() => reject(new Error(`silence:${silenceMs / 1000}`)));\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst settle = (finish: () => void) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\t\t\tsilenceWatchdog?.disarm();\n\t\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.activeExec = null;\n\t\t\t\t\tfinish();\n\t\t\t\t};\n\n\t\t\t\tconst onAbort = () => {\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tsettle(() => reject(new Error(\"aborted\")));\n\t\t\t\t};\n\n\t\t\t\tconst emitStdoutPending = (upTo: number) => {\n\t\t\t\t\tif (upTo <= 0) return;\n\t\t\t\t\tonData(stdoutPending.subarray(0, upTo));\n\t\t\t\t\tstdoutPending = stdoutPending.subarray(upTo);\n\t\t\t\t};\n\t\t\t\tconst emitStderrPending = (upTo: number) => {\n\t\t\t\t\tif (upTo <= 0) return;\n\t\t\t\t\tonData(stderrPending.subarray(0, upTo));\n\t\t\t\t\tstderrPending = stderrPending.subarray(upTo);\n\t\t\t\t};\n\t\t\t\tconst resolveWhenComplete = () => {\n\t\t\t\t\tconst exitCode = commandExitCode;\n\t\t\t\t\tif (exitCode === undefined || !stderrBarrierSeen) return;\n\t\t\t\t\tsettle(() => resolve({ exitCode, cwd: commandCwd }));\n\t\t\t\t};\n\t\t\t\t// Retain only a tail that could still be a sentinel in progress: a sentinel starts\n\t\t\t\t// with \"\\n\" + 0x1e + nonce, so anything whose suffix is inconsistent with that\n\t\t\t\t// prefix streams through immediately. Once the random prefix matches, retain the\n\t\t\t\t// complete length-framed cwd rather than imposing a false filesystem path bound.\n\t\t\t\tconst sentinelHoldback = (): number => {\n\t\t\t\t\tfor (let index = 0; index < stdoutPending.length; index++) {\n\t\t\t\t\t\tif (stdoutPending[index] !== 0x0a) continue;\n\t\t\t\t\t\tif (index + 1 < stdoutPending.length && stdoutPending[index + 1] !== SENTINEL_BYTE) continue;\n\t\t\t\t\t\tconst length = Math.min(stdoutPending.length - index, sentinelPrefix.length);\n\t\t\t\t\t\tif (stdoutPending.compare(sentinelPrefix, 0, length, index, index + length) === 0) {\n\t\t\t\t\t\t\treturn stdoutPending.length - index;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t};\n\n\t\t\t\tthis.activeExec = {\n\t\t\t\t\tonStdout: (data) => {\n\t\t\t\t\t\tsilenceWatchdog?.touch();\n\t\t\t\t\t\tif (commandExitCode !== undefined) {\n\t\t\t\t\t\t\tonData(data);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstdoutPending = stdoutPending.length === 0 ? data : Buffer.concat([stdoutPending, data]);\n\t\t\t\t\t\tconst prefixIndex = stdoutPending.indexOf(sentinelPrefix);\n\t\t\t\t\t\tif (prefixIndex !== -1) {\n\t\t\t\t\t\t\tconst parsed = parseShellSentinel(stdoutPending, prefixIndex + sentinelPrefix.length);\n\t\t\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\t\t\temitStdoutPending(prefixIndex);\n\t\t\t\t\t\t\t\tstdoutPending = stdoutPending.subarray(parsed.closeIndex - prefixIndex + 1);\n\t\t\t\t\t\t\t\temitStdoutPending(stdoutPending.length);\n\t\t\t\t\t\t\t\tcommandExitCode = parsed.exitCode;\n\t\t\t\t\t\t\t\tcommandCwd = parsed.cwd;\n\t\t\t\t\t\t\t\tresolveWhenComplete();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Stream promptly but retain any tail that could be a split sentinel.\n\t\t\t\t\t\temitStdoutPending(stdoutPending.length - sentinelHoldback());\n\t\t\t\t\t},\n\t\t\t\t\tonStderr: (data) => {\n\t\t\t\t\t\tsilenceWatchdog?.touch();\n\t\t\t\t\t\tif (this.kind !== \"powershell\" || stderrBarrierSeen) {\n\t\t\t\t\t\t\tonData(data);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstderrPending = stderrPending.length === 0 ? data : Buffer.concat([stderrPending, data]);\n\t\t\t\t\t\tconst barrierIndex = stderrPending.indexOf(stderrBarrier);\n\t\t\t\t\t\tif (barrierIndex !== -1) {\n\t\t\t\t\t\t\temitStderrPending(barrierIndex);\n\t\t\t\t\t\t\tstderrPending = stderrPending.subarray(stderrBarrier.length);\n\t\t\t\t\t\t\temitStderrPending(stderrPending.length);\n\t\t\t\t\t\t\tstderrBarrierSeen = true;\n\t\t\t\t\t\t\tresolveWhenComplete();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Preserve enough bytes to recognize a barrier split across chunks.\n\t\t\t\t\t\temitStderrPending(stderrPending.length - stderrBarrier.length + 1);\n\t\t\t\t\t},\n\t\t\t\t\tonChildClose: (code) => {\n\t\t\t\t\t\t// The command terminated the shell itself (e.g. `exit 3`) or the shell\n\t\t\t\t\t\t// crashed: report its exit code like the per-command backend would.\n\t\t\t\t\t\temitStdoutPending(stdoutPending.length);\n\t\t\t\t\t\temitStderrPending(stderrPending.length);\n\t\t\t\t\t\tsettle(() => resolve({ exitCode: code }));\n\t\t\t\t\t},\n\t\t\t\t\tfail: (error) => {\n\t\t\t\t\t\tthis.killChild();\n\t\t\t\t\t\tsettle(() => reject(error));\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t\tif (signal.aborted) {\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (timeoutSeconds !== undefined && timeoutSeconds > 0) {\n\t\t\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\t\t\tthis.killChild();\n\t\t\t\t\t\tsettle(() => reject(new Error(`timeout:${timeoutSeconds}`)));\n\t\t\t\t\t}, timeoutSeconds * 1000);\n\t\t\t\t}\n\n\t\t\t\tchild.stdin?.write(wire, (error) => {\n\t\t\t\t\tif (!error) return;\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tsettle(() => reject(new Error(`Failed to write to ${this.kind} session: ${error.message}`)));\n\t\t\t\t});\n\t\t\t});\n\t\t} finally {\n\t\t\tthis.coordinator.setLoopRef(false);\n\t\t}\n\t}\n\n\tprivate async spawnChild(cwd: string, env: NodeJS.ProcessEnv): Promise<void> {\n\t\tlet spawnedCwd = cwd;\n\t\tlet spawnedEnv = env;\n\t\tif (this.kind === \"powershell\") {\n\t\t\t({ cwd: spawnedCwd, env: spawnedEnv } = await this.spawnPowerShellChild(cwd, env));\n\t\t} else {\n\t\t\tconst { shell } = getShellConfig(undefined, this.kind);\n\t\t\tconst args = basename(shell).toLowerCase().includes(\"bash\") ? [\"--noprofile\", \"--norc\"] : [];\n\t\t\tconst child = this.spawnProcess(shell, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tthis.attachReadyChild(child);\n\t\t}\n\t\tthis.childEnv = { ...spawnedEnv };\n\t\tthis.lastRequestedCwd = spawnedCwd;\n\t}\n\n\tprivate async spawnPowerShellChild(\n\t\tcwd: string,\n\t\tenv: NodeJS.ProcessEnv,\n\t): Promise<{ cwd: string; env: NodeJS.ProcessEnv }> {\n\t\tconst warmStart = await claimCliPowerShellWarmStart();\n\t\tif (warmStart) {\n\t\t\ttry {\n\t\t\t\tthis.attachReadyChild(warmStart.child);\n\t\t\t} finally {\n\t\t\t\twarmStart.releaseStartupListeners();\n\t\t\t}\n\t\t\treturn { cwd: warmStart.cwd, env: warmStart.env };\n\t\t}\n\t\tconst failures: string[] = [];\n\t\tfor (const candidate of this.resolvePowerShellCandidates()) {\n\t\t\ttry {\n\t\t\t\tawait this.spawnPowerShellCandidate(candidate.shell, cwd, env);\n\t\t\t\treturn { cwd, env };\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tfailures.push(`${candidate.shell}: ${message}`);\n\t\t\t}\n\t\t}\n\t\tconst detail = failures.length > 0 ? ` Candidate failures: ${failures.join(\"; \")}` : \"\";\n\t\tthrow new Error(`PowerShell 7 (pwsh) was not found. Install pwsh before using the Windows shell.${detail}`);\n\t}\n\n\tprivate spawnPowerShellCandidate(shell: string, cwd: string, env: NodeJS.ProcessEnv): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet startupSettled = false;\n\t\t\tlet startupStdout: Buffer = Buffer.alloc(0);\n\t\t\tlet startupStderr: Buffer = Buffer.alloc(0);\n\t\t\tlet stdoutReady = false;\n\t\t\tlet stderrReady = false;\n\t\t\tlet timeoutTimer: NodeJS.Timeout | undefined;\n\n\t\t\tconst settleStartup = (finish: () => void): void => {\n\t\t\t\tif (startupSettled) return;\n\t\t\t\tstartupSettled = true;\n\t\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\t\tif (this.rejectStartup === rejectStartup) this.rejectStartup = null;\n\t\t\t\tfinish();\n\t\t\t};\n\t\t\tconst startupDiagnostic = (): string => {\n\t\t\t\tconst combined = Buffer.concat([startupStdout, startupStderr]).toString(\"utf8\").trim();\n\t\t\t\treturn combined ? `: ${combined}` : \"\";\n\t\t\t};\n\t\t\tconst rejectStartup = (error: Error): void => {\n\t\t\t\tsettleStartup(() => reject(error));\n\t\t\t};\n\t\t\tconst resolveWhenReady = (): void => {\n\t\t\t\tif (!stdoutReady || !stderrReady) return;\n\t\t\t\tsettleStartup(resolve);\n\t\t\t};\n\n\t\t\tlet child: ChildProcess;\n\t\t\ttry {\n\t\t\t\tchild = this.spawnProcess(shell, [...POWERSHELL_ARGS, POWERSHELL_BOOTSTRAP], {\n\t\t\t\t\tcwd,\n\t\t\t\t\tenv,\n\t\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\t\twindowsHide: true,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\trejectStartup(new Error(`spawn failed: ${message}`));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.rejectStartup = rejectStartup;\n\t\t\tthis.coordinator.attach(child, {\n\t\t\t\tonStdout: (data) => {\n\t\t\t\t\tif (startupSettled) {\n\t\t\t\t\t\tthis.activeExec?.onStdout(data);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tstartupStdout =\n\t\t\t\t\t\tstartupStdout.length === 0\n\t\t\t\t\t\t\t? data\n\t\t\t\t\t\t\t: Buffer.concat([startupStdout, data]).subarray(-MAX_STARTUP_DIAGNOSTIC_BYTES);\n\t\t\t\t\tstdoutReady ||= startupStdout.indexOf(POWERSHELL_SESSION_READY_BYTES) !== -1;\n\t\t\t\t\tresolveWhenReady();\n\t\t\t\t},\n\t\t\t\tonStderr: (data) => {\n\t\t\t\t\tif (startupSettled) {\n\t\t\t\t\t\tthis.activeExec?.onStderr(data);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tstartupStderr =\n\t\t\t\t\t\tstartupStderr.length === 0\n\t\t\t\t\t\t\t? data\n\t\t\t\t\t\t\t: Buffer.concat([startupStderr, data]).subarray(-MAX_STARTUP_DIAGNOSTIC_BYTES);\n\t\t\t\t\tstderrReady ||= startupStderr.indexOf(POWERSHELL_SESSION_STDERR_READY_BYTES) !== -1;\n\t\t\t\t\tresolveWhenReady();\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tthis.resetChildState();\n\t\t\t\t\tif (!startupSettled) rejectStartup(new Error(`${error.message}${startupDiagnostic()}`));\n\t\t\t\t\telse this.activeExec?.fail(error);\n\t\t\t\t},\n\t\t\t\tonClose: (code) => {\n\t\t\t\t\tthis.resetChildState();\n\t\t\t\t\tif (!startupSettled) {\n\t\t\t\t\t\trejectStartup(new Error(`exited with code ${code ?? \"null\"} before readiness${startupDiagnostic()}`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.activeExec?.onChildClose(code);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\tthis.coordinator.kill();\n\t\t\t\tthis.resetChildState();\n\t\t\t\trejectStartup(new Error(`startup timed out after ${this.startupTimeoutMs}ms${startupDiagnostic()}`));\n\t\t\t}, this.startupTimeoutMs);\n\t\t});\n\t}\n\n\tprivate attachReadyChild(child: ChildProcess): void {\n\t\tthis.coordinator.attach(child, {\n\t\t\tonStdout: (data) => this.activeExec?.onStdout(data),\n\t\t\tonStderr: (data) => this.activeExec?.onStderr(data),\n\t\t\tonError: (error) => {\n\t\t\t\tthis.resetChildState();\n\t\t\t\tthis.activeExec?.fail(error);\n\t\t\t},\n\t\t\tonClose: (code) => {\n\t\t\t\tthis.resetChildState();\n\t\t\t\tthis.activeExec?.onChildClose(code);\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate resetChildState(): void {\n\t\tthis.childEnv = null;\n\t\tthis.lastRequestedCwd = null;\n\t}\n\n\tprivate killChild(): void {\n\t\tthis.coordinator.kill();\n\t\tthis.resetChildState();\n\t}\n}\n\nconst shellSessions = new Map<string, PersistentShellSession>();\n\n/** Get or lazily create the persistent session for a key. A kind change replaces the session. */\nexport function acquirePersistentShellSession(key: string, kind: PlatformShellToolName): PersistentShellSession {\n\tconst existing = shellSessions.get(key);\n\tif (existing && existing.sessionKind === kind) return existing;\n\texisting?.dispose();\n\tconst session = new PersistentShellSession(key, kind);\n\tshellSessions.set(key, session);\n\treturn session;\n}\n\n/** Kill and forget a session (agent teardown). Safe to call for keys that never spawned. */\nexport function disposePersistentShellSession(key: string): void {\n\tconst session = shellSessions.get(key);\n\tif (!session) return;\n\tshellSessions.delete(key);\n\tsession.dispose();\n}\n"]}
1
+ {"version":3,"file":"shell-session.js","sourceRoot":"","sources":["../../../src/core/tools/shell-session.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Persistent shell sessions for the bash tool.\n *\n * One long-lived shell process per agent (keyed registry) replaces process-per-command spawning.\n * On Windows every command previously paid a full PowerShell boot; a persistent session pays it\n * once. Shell state (current directory, environment variables) persists across an agent's\n * commands; each key gets an isolated session so concurrently running agents never share state.\n *\n * Protocol: commands stream to the session over stdin and are terminated by a per-command\n * sentinel carrying a random nonce, the exit code, and (bash) the shell's `$PWD` so failures can\n * report where the command actually ran. Bash wraps commands in an eval of a quoted\n * heredoc (arbitrary content stays data; syntax errors stay contained in eval); PowerShell runs a\n * ReadLine loop decoding base64 lines (no external binaries involved). On bash, command stderr is\n * merged into stdout at the shell so sentinel ordering is guaranteed on one pipe.\n *\n * PowerShell runs each command as a bare `Invoke-Expression`, NOT piped into `Out-Default`: piping\n * a native command's output into another pipeline stage forces PowerShell's NativeCommandProcessor\n * to capture that child's stdout/stderr into an internal pipe and read it to EOF before the\n * pipeline completes. A detached grandchild that inherited those handles (e.g. `start /b` holding\n * stdio open) then keeps that internal pipe's write end open, so the sentinel — written after the\n * pipeline \"completes\" — waits for the grandchild to die instead of the direct child. The bare\n * invocation lets a native command's stdout/stderr handles be inherited directly by the child\n * process; the direct child's own exit is what unblocks the sentinel line, exactly like the\n * per-command backend and like bash's stdio inheritance above. The bounded consequence: a native\n * command's stderr no longer merges into the session's stdout pipe (there is no capturing pipeline\n * stage to merge it) — it arrives on the session's own stderr pipe instead. A nonce-bearing barrier\n * on that pipe joins it deterministically with the stdout completion frame before the command\n * resolves. PowerShell 5.1's habit of wrapping redirected stderr text in a `NativeCommandError`\n * record also disappears, which is an accuracy improvement (the raw stderr bytes are reported,\n * not a wrapped/duplicated rendering of them).\n *\n * Kill semantics: timeout/abort/silence kill the WHOLE session process tree (a hung foreground\n * command cannot be killed individually without job control) and the next exec respawns a fresh\n * session, losing accumulated shell state by design. A command that exits the shell itself\n * (`exit 3`) reports the shell's exit code and also respawns lazily afterwards.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { basename } from \"node:path\";\nimport { createSilenceWatchdog } from \"@caupulican/pi-agent-core/reliability\";\nimport { type ChildProcess, type SpawnOptions, spawn } from \"child_process\";\nimport {\n\tcreatePowerShellHostEnvironment,\n\tPOWERSHELL_ARGS,\n\tPOWERSHELL_BOOTSTRAP,\n\tPOWERSHELL_SESSION_READY_MARKER,\n\tPOWERSHELL_SESSION_STDERR_READY_MARKER,\n\tPOWERSHELL_STDERR_BARRIER_LABEL,\n} from \"../../utils/powershell-session-protocol.ts\";\nimport {\n\tgetPowerShellCandidateConfigs,\n\tgetShellConfig,\n\tgetShellEnv,\n\ttype PlatformShellToolName,\n\tPOWERSHELL_STARTUP_PROBE_TIMEOUT_MS,\n\ttype ShellConfig,\n} from \"../../utils/shell.ts\";\nimport { claimCliPowerShellWarmStart } from \"./early-powershell-session.ts\";\nimport { PersistentProcessCoordinator } from \"./persistent-process-coordinator.ts\";\n\nexport {\n\tPOWERSHELL_SESSION_READY_MARKER,\n\tPOWERSHELL_SESSION_STDERR_READY_MARKER,\n} from \"../../utils/powershell-session-protocol.ts\";\n\nconst SENTINEL_BYTE = 0x1e;\nconst BASH_SENTINEL_PAYLOAD_PREFIX = Buffer.from(\"v1:\", \"latin1\");\nconst MAX_STARTUP_DIAGNOSTIC_BYTES = 16 * 1024;\nconst POWERSHELL_SESSION_READY_BYTES = Buffer.from(POWERSHELL_SESSION_READY_MARKER, \"latin1\");\nconst POWERSHELL_SESSION_STDERR_READY_BYTES = Buffer.from(POWERSHELL_SESSION_STDERR_READY_MARKER, \"latin1\");\n\nexport interface ShellSessionExecOptions {\n\tonData: (data: Buffer) => void;\n\tsignal?: AbortSignal;\n\t/** Wall-clock bound in seconds; when set, a breach kills the session and throws `timeout:<s>`. */\n\ttimeoutSeconds?: number;\n\t/** Output-silence bound in ms; when set, silence kills the session and throws `silence:<s>`. */\n\tsilenceMs?: number;\n\tenv?: NodeJS.ProcessEnv;\n}\n\nexport interface PersistentShellSessionOptions {\n\tresolvePowerShellCandidates?: () => ShellConfig[];\n\tspawn?: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\tstartupTimeoutMs?: number;\n}\n\nfunction escapeSingleQuotesPosix(value: string): string {\n\treturn value.replace(/'/g, \"'\\\\''\");\n}\n\nfunction escapeSingleQuotesPowerShell(value: string): string {\n\treturn value.replace(/'/g, \"''\");\n}\n\n/**\n * The whole command is heredoc-quoted data: eval keeps syntax errors contained (a raw syntax\n * error on the session's stdin would abort the shell), and the random delimiter makes content\n * collisions with agent output practically impossible. `< /dev/null` gives commands the same\n * EOF-stdin the per-command backend's `stdio: [\"ignore\", ...]` provided.\n */\nexport function buildBashWire(command: string, nonce: string, cdTo: string | null): string {\n\tconst body = cdTo ? `command cd -- '${escapeSingleQuotesPosix(cdTo)}' && {\\n${command}\\n}` : command;\n\treturn [\n\t\t`{ eval \"$(cat <<'PI_EOF_${nonce}'`,\n\t\tbody,\n\t\t`PI_EOF_${nonce}`,\n\t\t`)\"; } < /dev/null 2>&1`,\n\t\t// Version and byte length make the frame unambiguous even when a legal POSIX path contains\n\t\t// the record-separator byte used to terminate the sentinel. The subshell keeps its status\n\t\t// scratch variable and LC_ALL change out of the persistent caller session.\n\t\t`(__pi_status=$?; LC_ALL=C; printf '\\\\n\\\\036%s:v1:%s:%s:%s\\\\036' '${nonce}' \"$__pi_status\" \"\\${#PWD}\" \"$PWD\")`,\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\ninterface ParsedShellSentinel {\n\tcloseIndex: number;\n\texitCode: number | null;\n\tcwd?: string;\n}\n\n/** Parse the versioned bash frame plus the legacy exit-only/exit+cwd PowerShell test frames. */\nfunction parseShellSentinel(buffer: Buffer, payloadStart: number): ParsedShellSentinel | undefined {\n\tconst available = buffer.length - payloadStart;\n\tconst prefixComparisonLength = Math.min(available, BASH_SENTINEL_PAYLOAD_PREFIX.length);\n\tconst couldBeVersioned =\n\t\tprefixComparisonLength > 0 &&\n\t\tbuffer.compare(\n\t\t\tBASH_SENTINEL_PAYLOAD_PREFIX,\n\t\t\t0,\n\t\t\tprefixComparisonLength,\n\t\t\tpayloadStart,\n\t\t\tpayloadStart + prefixComparisonLength,\n\t\t) === 0;\n\tif (couldBeVersioned && available < BASH_SENTINEL_PAYLOAD_PREFIX.length) return undefined;\n\n\tif (\n\t\tavailable >= BASH_SENTINEL_PAYLOAD_PREFIX.length &&\n\t\tbuffer.compare(\n\t\t\tBASH_SENTINEL_PAYLOAD_PREFIX,\n\t\t\t0,\n\t\t\tBASH_SENTINEL_PAYLOAD_PREFIX.length,\n\t\t\tpayloadStart,\n\t\t\tpayloadStart + BASH_SENTINEL_PAYLOAD_PREFIX.length,\n\t\t) === 0\n\t) {\n\t\tconst exitStart = payloadStart + BASH_SENTINEL_PAYLOAD_PREFIX.length;\n\t\tconst exitEnd = buffer.indexOf(0x3a, exitStart);\n\t\tif (exitEnd === -1) return undefined;\n\t\tconst lengthEnd = buffer.indexOf(0x3a, exitEnd + 1);\n\t\tif (lengthEnd === -1) return undefined;\n\t\tconst exitCodeText = buffer.subarray(exitStart, exitEnd).toString(\"latin1\");\n\t\tconst cwdLengthText = buffer.subarray(exitEnd + 1, lengthEnd).toString(\"latin1\");\n\t\tconst cwdByteLength = /^\\d+$/.test(cwdLengthText) ? Number.parseInt(cwdLengthText, 10) : Number.NaN;\n\t\tif (Number.isSafeInteger(cwdByteLength)) {\n\t\t\tconst cwdStart = lengthEnd + 1;\n\t\t\tconst closeIndex = cwdStart + cwdByteLength;\n\t\t\tif (buffer.length <= closeIndex) return undefined;\n\t\t\tif (buffer[closeIndex] === SENTINEL_BYTE) {\n\t\t\t\tconst parsedExitCode = Number.parseInt(exitCodeText, 10);\n\t\t\t\treturn {\n\t\t\t\t\tcloseIndex,\n\t\t\t\t\texitCode: Number.isNaN(parsedExitCode) ? null : parsedExitCode,\n\t\t\t\t\t...(cwdByteLength > 0 ? { cwd: buffer.subarray(cwdStart, closeIndex).toString(\"utf8\") } : {}),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\t// A corrupt versioned payload must still settle like the legacy parser: retain the exit\n\t\t// classification when possible and degrade only the cwd field.\n\t\tconst closeIndex = buffer.indexOf(SENTINEL_BYTE, lengthEnd + 1);\n\t\tif (closeIndex === -1) return undefined;\n\t\tconst parsedExitCode = Number.parseInt(exitCodeText, 10);\n\t\treturn { closeIndex, exitCode: Number.isNaN(parsedExitCode) ? null : parsedExitCode };\n\t}\n\n\tconst closeIndex = buffer.indexOf(SENTINEL_BYTE, payloadStart);\n\tif (closeIndex === -1) return undefined;\n\tconst payload = buffer.subarray(payloadStart, closeIndex);\n\tconst separatorIndex = payload.indexOf(0x3a);\n\tconst exitCodeText = (separatorIndex === -1 ? payload : payload.subarray(0, separatorIndex)).toString(\"latin1\");\n\tconst parsedExitCode = Number.parseInt(exitCodeText, 10);\n\treturn {\n\t\tcloseIndex,\n\t\texitCode: Number.isNaN(parsedExitCode) ? null : parsedExitCode,\n\t\t...(separatorIndex !== -1 && separatorIndex < payload.length - 1\n\t\t\t? { cwd: payload.subarray(separatorIndex + 1).toString(\"utf8\") }\n\t\t\t: {}),\n\t};\n}\n\n/** One protocol line: `<nonce> <base64(utf8 command)>`. Base64 keeps arbitrary multi-line commands line-safe. */\nexport function buildPowerShellWire(command: string, nonce: string, cdTo: string | null): string {\n\tconst body = cdTo\n\t\t? `Set-Location -LiteralPath '${escapeSingleQuotesPowerShell(cdTo)}' -ErrorAction Stop\\n${command}`\n\t\t: command;\n\treturn `${nonce} ${Buffer.from(body, \"utf8\").toString(\"base64\")}\\n`;\n}\n\nfunction shallowEnvEquals(a: NodeJS.ProcessEnv, b: NodeJS.ProcessEnv): boolean {\n\tconst aKeys = Object.keys(a);\n\tconst bKeys = Object.keys(b);\n\tif (aKeys.length !== bKeys.length) return false;\n\tfor (const key of aKeys) {\n\t\tif (a[key] !== b[key]) return false;\n\t}\n\treturn true;\n}\n\nfunction buildPowerShellEnvironmentPrelude(current: NodeJS.ProcessEnv, desired: NodeJS.ProcessEnv): string | null {\n\tconst currentByName = new Map(\n\t\tObject.entries(current)\n\t\t\t.filter((entry): entry is [string, string] => entry[1] !== undefined)\n\t\t\t.map(([name, value]) => [name.toLowerCase(), { name, value }]),\n\t);\n\tconst desiredByName = new Map(\n\t\tObject.entries(desired)\n\t\t\t.filter((entry): entry is [string, string] => entry[1] !== undefined)\n\t\t\t.map(([name, value]) => [name.toLowerCase(), { name, value }]),\n\t);\n\tconst setValues = [...desiredByName.entries()].flatMap(([identity, entry]) =>\n\t\tcurrentByName.get(identity)?.value === entry.value ? [] : [entry],\n\t);\n\tconst removeNames = [...currentByName.entries()].flatMap(([identity, entry]) =>\n\t\tdesiredByName.has(identity) ? [] : [entry.name],\n\t);\n\tif (setValues.length === 0 && removeNames.length === 0) return null;\n\tconst encoded = Buffer.from(JSON.stringify({ setValues, removeNames }), \"utf8\").toString(\"base64\");\n\treturn [\n\t\t`$__pi_env_delta = ConvertFrom-Json ([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('${encoded}')))`,\n\t\t\"foreach ($__pi_env_item in @($__pi_env_delta.setValues)) { [System.Environment]::SetEnvironmentVariable([string]$__pi_env_item.name, [string]$__pi_env_item.value, 'Process') }\",\n\t\t\"foreach ($__pi_env_name in @($__pi_env_delta.removeNames)) { [System.Environment]::SetEnvironmentVariable([string]$__pi_env_name, $null, 'Process') }\",\n\t\t\"Remove-Variable -Name __pi_env_delta,__pi_env_item,__pi_env_name -ErrorAction SilentlyContinue\",\n\t].join(\"\\n\");\n}\n\ninterface ActiveExec {\n\tonStdout(data: Buffer): void;\n\tonStderr(data: Buffer): void;\n\tonChildClose(code: number | null): void;\n\tfail(error: Error): void;\n}\n\nexport class PersistentShellSession {\n\tprivate readonly key: string;\n\tprivate readonly kind: PlatformShellToolName;\n\tprivate readonly resolvePowerShellCandidates: () => ShellConfig[];\n\tprivate readonly spawnProcess: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\tprivate readonly startupTimeoutMs: number;\n\tprivate readonly coordinator = new PersistentProcessCoordinator();\n\tprivate childEnv: NodeJS.ProcessEnv | null = null;\n\tprivate lastRequestedCwd: string | null = null;\n\tprivate activeExec: ActiveExec | null = null;\n\tprivate rejectStartup: ((error: Error) => void) | null = null;\n\tprivate disposed = false;\n\n\tconstructor(key: string, kind: PlatformShellToolName, options: PersistentShellSessionOptions = {}) {\n\t\tthis.key = key;\n\t\tthis.kind = kind;\n\t\tthis.resolvePowerShellCandidates = options.resolvePowerShellCandidates ?? getPowerShellCandidateConfigs;\n\t\tthis.spawnProcess = options.spawn ?? spawn;\n\t\tthis.startupTimeoutMs = options.startupTimeoutMs ?? POWERSHELL_STARTUP_PROBE_TIMEOUT_MS;\n\t}\n\n\tget sessionKind(): PlatformShellToolName {\n\t\treturn this.kind;\n\t}\n\n\t/** Serialized: one command at a time per session, later calls queue behind earlier ones. */\n\texec(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: ShellSessionExecOptions,\n\t): Promise<{ exitCode: number | null; cwd?: string }> {\n\t\treturn this.coordinator.runSerialized(() => this.execNow(command, cwd, options));\n\t}\n\n\t/** Start and validate the long-lived shell before the first user command. Idempotent per session. */\n\tprewarm(cwd: string, env: NodeJS.ProcessEnv = getShellEnv()): Promise<void> {\n\t\treturn this.coordinator.runSerialized(async () => {\n\t\t\tif (this.disposed) throw new Error(`Shell session \"${this.key}\" is disposed`);\n\t\t\tconst resolvedEnv = this.kind === \"powershell\" ? createPowerShellHostEnvironment(env) : env;\n\t\t\tif (\n\t\t\t\tthis.kind !== \"powershell\" &&\n\t\t\t\tthis.coordinator.child &&\n\t\t\t\tthis.childEnv &&\n\t\t\t\t!shallowEnvEquals(this.childEnv, resolvedEnv)\n\t\t\t) {\n\t\t\t\tthis.killChild();\n\t\t\t}\n\t\t\tif (!this.coordinator.child) await this.spawnChild(cwd, resolvedEnv);\n\t\t\tif (\n\t\t\t\tthis.kind === \"powershell\" &&\n\t\t\t\tthis.childEnv &&\n\t\t\t\t(!shallowEnvEquals(this.childEnv, resolvedEnv) || this.lastRequestedCwd !== cwd)\n\t\t\t) {\n\t\t\t\tconst result = await this.execNow(\"\", cwd, { onData: () => {}, env: resolvedEnv });\n\t\t\t\tif (result.exitCode !== 0) {\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tthrow new Error(`PowerShell session reconciliation failed with exit code ${result.exitCode ?? \"null\"}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.coordinator.setLoopRef(false);\n\t\t});\n\t}\n\n\tget terminalPromise(): Promise<void> {\n\t\treturn this.coordinator.terminalPromise;\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.rejectStartup?.(new Error(`Shell session \"${this.key}\" is disposed`));\n\t\tthis.activeExec?.fail(new Error(`Shell session \"${this.key}\" is disposed`));\n\t\tthis.coordinator.dispose();\n\t\tthis.resetChildState();\n\t}\n\n\tprivate async execNow(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\t{ onData, signal, timeoutSeconds, silenceMs, env }: ShellSessionExecOptions,\n\t): Promise<{ exitCode: number | null; cwd?: string }> {\n\t\tif (this.disposed) throw new Error(`Shell session \"${this.key}\" is disposed`);\n\t\tif (signal?.aborted) throw new Error(\"aborted\");\n\n\t\tconst requestedEnv = env ?? getShellEnv();\n\t\tconst resolvedEnv = this.kind === \"powershell\" ? createPowerShellHostEnvironment(requestedEnv) : requestedEnv;\n\t\t// The environment is spawn-time shell config: an env that differs from the running\n\t\t// session's (e.g. a spawn hook rewriting it per command) requires a fresh shell.\n\t\tif (\n\t\t\tthis.kind !== \"powershell\" &&\n\t\t\tthis.coordinator.child &&\n\t\t\tthis.childEnv &&\n\t\t\t!shallowEnvEquals(this.childEnv, resolvedEnv)\n\t\t) {\n\t\t\tthis.killChild();\n\t\t}\n\n\t\t// Re-enter the host-requested cwd only when it CHANGES between calls; an unchanged\n\t\t// request preserves the agent's own in-session `cd` (that persistence is the feature).\n\t\tlet cdTo: string | null = null;\n\t\tif (!this.coordinator.child) await this.spawnChild(cwd, resolvedEnv);\n\t\tif (this.lastRequestedCwd !== cwd) cdTo = cwd;\n\t\tthis.lastRequestedCwd = cwd;\n\t\tlet resolvedCommand = command;\n\t\tif (this.kind === \"powershell\" && this.childEnv && !shallowEnvEquals(this.childEnv, resolvedEnv)) {\n\t\t\tconst environmentPrelude = buildPowerShellEnvironmentPrelude(this.childEnv, resolvedEnv);\n\t\t\tif (environmentPrelude) resolvedCommand = `${environmentPrelude}\\n${command}`;\n\t\t\tthis.childEnv = { ...resolvedEnv };\n\t\t}\n\n\t\tconst child = this.coordinator.child;\n\t\tif (!child?.stdin || !child.stdout || !child.stderr) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(`Failed to start ${this.kind} session`);\n\t\t}\n\n\t\tconst nonce = randomBytes(8).toString(\"hex\");\n\t\tconst wire =\n\t\t\tthis.kind === \"powershell\"\n\t\t\t\t? buildPowerShellWire(resolvedCommand, nonce, cdTo)\n\t\t\t\t: buildBashWire(resolvedCommand, nonce, cdTo);\n\t\tconst sentinelPrefix = Buffer.from(`\\n\\x1e${nonce}:`, \"latin1\");\n\t\tconst stderrBarrier = Buffer.from(`\\x1e${nonce}:${POWERSHELL_STDERR_BARRIER_LABEL}\\x1e\\n`, \"latin1\");\n\n\t\tthis.coordinator.setLoopRef(true);\n\t\ttry {\n\t\t\treturn await new Promise<{ exitCode: number | null; cwd?: string }>((resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tlet stdoutPending: Buffer = Buffer.alloc(0);\n\t\t\t\tlet stderrPending: Buffer = Buffer.alloc(0);\n\t\t\t\tlet commandExitCode: number | null | undefined;\n\t\t\t\tlet commandCwd: string | undefined;\n\t\t\t\tlet stderrBarrierSeen = this.kind !== \"powershell\";\n\t\t\t\tlet timeoutTimer: NodeJS.Timeout | undefined;\n\n\t\t\t\tconst silenceWatchdog =\n\t\t\t\t\ttimeoutSeconds === undefined && silenceMs !== undefined && silenceMs > 0\n\t\t\t\t\t\t? createSilenceWatchdog({\n\t\t\t\t\t\t\t\tsilenceMs,\n\t\t\t\t\t\t\t\tonSilence: () => {\n\t\t\t\t\t\t\t\t\tthis.killChild();\n\t\t\t\t\t\t\t\t\tsettle(() => reject(new Error(`silence:${silenceMs / 1000}`)));\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: undefined;\n\n\t\t\t\tconst settle = (finish: () => void) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\t\t\tsilenceWatchdog?.disarm();\n\t\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tthis.activeExec = null;\n\t\t\t\t\tfinish();\n\t\t\t\t};\n\n\t\t\t\tconst onAbort = () => {\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tsettle(() => reject(new Error(\"aborted\")));\n\t\t\t\t};\n\n\t\t\t\tconst emitStdoutPending = (upTo: number) => {\n\t\t\t\t\tif (upTo <= 0) return;\n\t\t\t\t\tonData(stdoutPending.subarray(0, upTo));\n\t\t\t\t\tstdoutPending = stdoutPending.subarray(upTo);\n\t\t\t\t};\n\t\t\t\tconst emitStderrPending = (upTo: number) => {\n\t\t\t\t\tif (upTo <= 0) return;\n\t\t\t\t\tonData(stderrPending.subarray(0, upTo));\n\t\t\t\t\tstderrPending = stderrPending.subarray(upTo);\n\t\t\t\t};\n\t\t\t\tconst resolveWhenComplete = () => {\n\t\t\t\t\tconst exitCode = commandExitCode;\n\t\t\t\t\tif (exitCode === undefined || !stderrBarrierSeen) return;\n\t\t\t\t\tsettle(() => resolve({ exitCode, cwd: commandCwd }));\n\t\t\t\t};\n\t\t\t\t// Retain only a tail that could still be a sentinel in progress: a sentinel starts\n\t\t\t\t// with \"\\n\" + 0x1e + nonce, so anything whose suffix is inconsistent with that\n\t\t\t\t// prefix streams through immediately. Once the random prefix matches, retain the\n\t\t\t\t// complete length-framed cwd rather than imposing a false filesystem path bound.\n\t\t\t\tconst sentinelHoldback = (): number => {\n\t\t\t\t\tfor (let index = 0; index < stdoutPending.length; index++) {\n\t\t\t\t\t\tif (stdoutPending[index] !== 0x0a) continue;\n\t\t\t\t\t\tif (index + 1 < stdoutPending.length && stdoutPending[index + 1] !== SENTINEL_BYTE) continue;\n\t\t\t\t\t\tconst length = Math.min(stdoutPending.length - index, sentinelPrefix.length);\n\t\t\t\t\t\tif (stdoutPending.compare(sentinelPrefix, 0, length, index, index + length) === 0) {\n\t\t\t\t\t\t\treturn stdoutPending.length - index;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t};\n\n\t\t\t\tthis.activeExec = {\n\t\t\t\t\tonStdout: (data) => {\n\t\t\t\t\t\tsilenceWatchdog?.touch();\n\t\t\t\t\t\tif (commandExitCode !== undefined) {\n\t\t\t\t\t\t\tonData(data);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstdoutPending = stdoutPending.length === 0 ? data : Buffer.concat([stdoutPending, data]);\n\t\t\t\t\t\tconst prefixIndex = stdoutPending.indexOf(sentinelPrefix);\n\t\t\t\t\t\tif (prefixIndex !== -1) {\n\t\t\t\t\t\t\tconst parsed = parseShellSentinel(stdoutPending, prefixIndex + sentinelPrefix.length);\n\t\t\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\t\t\temitStdoutPending(prefixIndex);\n\t\t\t\t\t\t\t\tstdoutPending = stdoutPending.subarray(parsed.closeIndex - prefixIndex + 1);\n\t\t\t\t\t\t\t\temitStdoutPending(stdoutPending.length);\n\t\t\t\t\t\t\t\tcommandExitCode = parsed.exitCode;\n\t\t\t\t\t\t\t\tcommandCwd = parsed.cwd;\n\t\t\t\t\t\t\t\tresolveWhenComplete();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Stream promptly but retain any tail that could be a split sentinel.\n\t\t\t\t\t\temitStdoutPending(stdoutPending.length - sentinelHoldback());\n\t\t\t\t\t},\n\t\t\t\t\tonStderr: (data) => {\n\t\t\t\t\t\tsilenceWatchdog?.touch();\n\t\t\t\t\t\tif (this.kind !== \"powershell\" || stderrBarrierSeen) {\n\t\t\t\t\t\t\tonData(data);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstderrPending = stderrPending.length === 0 ? data : Buffer.concat([stderrPending, data]);\n\t\t\t\t\t\tconst barrierIndex = stderrPending.indexOf(stderrBarrier);\n\t\t\t\t\t\tif (barrierIndex !== -1) {\n\t\t\t\t\t\t\temitStderrPending(barrierIndex);\n\t\t\t\t\t\t\tstderrPending = stderrPending.subarray(stderrBarrier.length);\n\t\t\t\t\t\t\temitStderrPending(stderrPending.length);\n\t\t\t\t\t\t\tstderrBarrierSeen = true;\n\t\t\t\t\t\t\tresolveWhenComplete();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Preserve enough bytes to recognize a barrier split across chunks.\n\t\t\t\t\t\temitStderrPending(stderrPending.length - stderrBarrier.length + 1);\n\t\t\t\t\t},\n\t\t\t\t\tonChildClose: (code) => {\n\t\t\t\t\t\t// The command terminated the shell itself (e.g. `exit 3`) or the shell\n\t\t\t\t\t\t// crashed: report its exit code like the per-command backend would.\n\t\t\t\t\t\temitStdoutPending(stdoutPending.length);\n\t\t\t\t\t\temitStderrPending(stderrPending.length);\n\t\t\t\t\t\tsettle(() => resolve({ exitCode: code }));\n\t\t\t\t\t},\n\t\t\t\t\tfail: (error) => {\n\t\t\t\t\t\tthis.killChild();\n\t\t\t\t\t\tsettle(() => reject(error));\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t\tif (signal.aborted) {\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (timeoutSeconds !== undefined && timeoutSeconds > 0) {\n\t\t\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\t\t\tthis.killChild();\n\t\t\t\t\t\tsettle(() => reject(new Error(`timeout:${timeoutSeconds}`)));\n\t\t\t\t\t}, timeoutSeconds * 1000);\n\t\t\t\t}\n\n\t\t\t\tchild.stdin?.write(wire, (error) => {\n\t\t\t\t\tif (!error) return;\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tsettle(() => reject(new Error(`Failed to write to ${this.kind} session: ${error.message}`)));\n\t\t\t\t});\n\t\t\t});\n\t\t} finally {\n\t\t\tthis.coordinator.setLoopRef(false);\n\t\t}\n\t}\n\n\tprivate async spawnChild(cwd: string, env: NodeJS.ProcessEnv): Promise<void> {\n\t\tlet spawnedCwd = cwd;\n\t\tlet spawnedEnv = env;\n\t\tif (this.kind === \"powershell\") {\n\t\t\t({ cwd: spawnedCwd, env: spawnedEnv } = await this.spawnPowerShellChild(cwd, env));\n\t\t} else {\n\t\t\tconst { shell } = getShellConfig(undefined, this.kind);\n\t\t\tconst args = basename(shell).toLowerCase().includes(\"bash\") ? [\"--noprofile\", \"--norc\"] : [];\n\t\t\tconst child = this.spawnProcess(shell, args, {\n\t\t\t\tcwd,\n\t\t\t\tenv,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tthis.attachReadyChild(child);\n\t\t}\n\t\tthis.childEnv = { ...spawnedEnv };\n\t\tthis.lastRequestedCwd = spawnedCwd;\n\t}\n\n\tprivate async spawnPowerShellChild(\n\t\tcwd: string,\n\t\tenv: NodeJS.ProcessEnv,\n\t): Promise<{ cwd: string; env: NodeJS.ProcessEnv }> {\n\t\tconst warmStart = await claimCliPowerShellWarmStart();\n\t\tif (warmStart) {\n\t\t\ttry {\n\t\t\t\tthis.attachReadyChild(warmStart.child);\n\t\t\t} finally {\n\t\t\t\twarmStart.releaseStartupListeners();\n\t\t\t}\n\t\t\treturn { cwd: warmStart.cwd, env: warmStart.env };\n\t\t}\n\t\tconst failures: string[] = [];\n\t\tfor (const candidate of this.resolvePowerShellCandidates()) {\n\t\t\ttry {\n\t\t\t\tawait this.spawnPowerShellCandidate(candidate.shell, cwd, env);\n\t\t\t\treturn { cwd, env };\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tfailures.push(`${candidate.shell}: ${message}`);\n\t\t\t}\n\t\t}\n\t\tconst detail = failures.length > 0 ? ` Candidate failures: ${failures.join(\"; \")}` : \"\";\n\t\tthrow new Error(`PowerShell 7 (pwsh) was not found. Install pwsh before using the Windows shell.${detail}`);\n\t}\n\n\tprivate spawnPowerShellCandidate(shell: string, cwd: string, env: NodeJS.ProcessEnv): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tlet startupSettled = false;\n\t\t\tlet startupStdout: Buffer = Buffer.alloc(0);\n\t\t\tlet startupStderr: Buffer = Buffer.alloc(0);\n\t\t\tlet stdoutReady = false;\n\t\t\tlet stderrReady = false;\n\t\t\tlet timeoutTimer: NodeJS.Timeout | undefined;\n\n\t\t\tconst settleStartup = (finish: () => void): void => {\n\t\t\t\tif (startupSettled) return;\n\t\t\t\tstartupSettled = true;\n\t\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\t\tif (this.rejectStartup === rejectStartup) this.rejectStartup = null;\n\t\t\t\tfinish();\n\t\t\t};\n\t\t\tconst startupDiagnostic = (): string => {\n\t\t\t\tconst combined = Buffer.concat([startupStdout, startupStderr]).toString(\"utf8\").trim();\n\t\t\t\treturn combined ? `: ${combined}` : \"\";\n\t\t\t};\n\t\t\tconst rejectStartup = (error: Error): void => {\n\t\t\t\tsettleStartup(() => reject(error));\n\t\t\t};\n\t\t\tconst resolveWhenReady = (): void => {\n\t\t\t\tif (!stdoutReady || !stderrReady) return;\n\t\t\t\tsettleStartup(resolve);\n\t\t\t};\n\n\t\t\tlet child: ChildProcess;\n\t\t\ttry {\n\t\t\t\tchild = this.spawnProcess(shell, [...POWERSHELL_ARGS, POWERSHELL_BOOTSTRAP], {\n\t\t\t\t\tcwd,\n\t\t\t\t\tenv,\n\t\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\t\twindowsHide: true,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\trejectStartup(new Error(`spawn failed: ${message}`));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.rejectStartup = rejectStartup;\n\t\t\tthis.coordinator.attach(child, {\n\t\t\t\tonStdout: (data) => {\n\t\t\t\t\tif (startupSettled) {\n\t\t\t\t\t\tthis.activeExec?.onStdout(data);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tstartupStdout =\n\t\t\t\t\t\tstartupStdout.length === 0\n\t\t\t\t\t\t\t? data\n\t\t\t\t\t\t\t: Buffer.concat([startupStdout, data]).subarray(-MAX_STARTUP_DIAGNOSTIC_BYTES);\n\t\t\t\t\tstdoutReady ||= startupStdout.indexOf(POWERSHELL_SESSION_READY_BYTES) !== -1;\n\t\t\t\t\tresolveWhenReady();\n\t\t\t\t},\n\t\t\t\tonStderr: (data) => {\n\t\t\t\t\tif (startupSettled) {\n\t\t\t\t\t\tthis.activeExec?.onStderr(data);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tstartupStderr =\n\t\t\t\t\t\tstartupStderr.length === 0\n\t\t\t\t\t\t\t? data\n\t\t\t\t\t\t\t: Buffer.concat([startupStderr, data]).subarray(-MAX_STARTUP_DIAGNOSTIC_BYTES);\n\t\t\t\t\tstderrReady ||= startupStderr.indexOf(POWERSHELL_SESSION_STDERR_READY_BYTES) !== -1;\n\t\t\t\t\tresolveWhenReady();\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tthis.resetChildState();\n\t\t\t\t\tif (!startupSettled) rejectStartup(new Error(`${error.message}${startupDiagnostic()}`));\n\t\t\t\t\telse this.activeExec?.fail(error);\n\t\t\t\t},\n\t\t\t\tonClose: (code) => {\n\t\t\t\t\tthis.resetChildState();\n\t\t\t\t\tif (!startupSettled) {\n\t\t\t\t\t\trejectStartup(new Error(`exited with code ${code ?? \"null\"} before readiness${startupDiagnostic()}`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.activeExec?.onChildClose(code);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\tthis.coordinator.kill();\n\t\t\t\tthis.resetChildState();\n\t\t\t\trejectStartup(new Error(`startup timed out after ${this.startupTimeoutMs}ms${startupDiagnostic()}`));\n\t\t\t}, this.startupTimeoutMs);\n\t\t});\n\t}\n\n\tprivate attachReadyChild(child: ChildProcess): void {\n\t\tthis.coordinator.attach(child, {\n\t\t\tonStdout: (data) => this.activeExec?.onStdout(data),\n\t\t\tonStderr: (data) => this.activeExec?.onStderr(data),\n\t\t\tonError: (error) => {\n\t\t\t\tthis.resetChildState();\n\t\t\t\tthis.activeExec?.fail(error);\n\t\t\t},\n\t\t\tonClose: (code) => {\n\t\t\t\tthis.resetChildState();\n\t\t\t\tthis.activeExec?.onChildClose(code);\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate resetChildState(): void {\n\t\tthis.childEnv = null;\n\t\tthis.lastRequestedCwd = null;\n\t}\n\n\tprivate killChild(): void {\n\t\tthis.coordinator.kill();\n\t\tthis.resetChildState();\n\t}\n}\n\nconst shellSessions = new Map<string, PersistentShellSession>();\nconst retiredShellSessionTerminals = new Map<string, Promise<void>>();\n\nfunction retainShellSessionTerminal(key: string, terminalPromise: Promise<void>): Promise<void> {\n\tconst previous = retiredShellSessionTerminals.get(key);\n\tconst combined = Promise.all([previous ?? Promise.resolve(), terminalPromise])\n\t\t.then(() => undefined)\n\t\t.finally(() => {\n\t\t\tif (retiredShellSessionTerminals.get(key) === combined) {\n\t\t\t\tretiredShellSessionTerminals.delete(key);\n\t\t\t}\n\t\t});\n\tretiredShellSessionTerminals.set(key, combined);\n\treturn combined;\n}\n\n/** Get or lazily create the persistent session for a key. A kind change replaces the session. */\nexport function acquirePersistentShellSession(key: string, kind: PlatformShellToolName): PersistentShellSession {\n\tconst existing = shellSessions.get(key);\n\tif (existing && existing.sessionKind === kind) return existing;\n\tif (existing) {\n\t\texisting.dispose();\n\t\tretainShellSessionTerminal(key, existing.terminalPromise);\n\t}\n\tconst session = new PersistentShellSession(key, kind);\n\tshellSessions.set(key, session);\n\treturn session;\n}\n\n/** Kill and forget a session (agent teardown). Safe to call for keys that never spawned. */\nexport function disposePersistentShellSession(key: string): Promise<void> {\n\tconst session = shellSessions.get(key);\n\tif (!session) return retiredShellSessionTerminals.get(key) ?? Promise.resolve();\n\tshellSessions.delete(key);\n\tsession.dispose();\n\treturn retainShellSessionTerminal(key, session.terminalPromise);\n}\n"]}
@@ -5,6 +5,7 @@ declare const skillSchema: Type.TObject<{
5
5
  action: Type.TUnion<[Type.TLiteral<"search">, Type.TLiteral<"load">, Type.TLiteral<"unload">, Type.TLiteral<"status">]>;
6
6
  query: Type.TOptional<Type.TString>;
7
7
  name: Type.TOptional<Type.TString>;
8
+ pin: Type.TOptional<Type.TBoolean>;
8
9
  }>;
9
10
  export type SkillToolInput = Static<typeof skillSchema>;
10
11
  export type SkillToolDetails = {
@@ -1 +1 @@
1
- {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpH,QAAA,MAAM,WAAW;;;;EAUhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAuBlD,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CA+D9G"}
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpH,QAAA,MAAM,WAAW;;;;;EAWhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAyBlD,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CA+D9G"}
@@ -3,6 +3,7 @@ const skillSchema = Type.Object({
3
3
  action: Type.Union([Type.Literal("search"), Type.Literal("load"), Type.Literal("unload"), Type.Literal("status")], { description: "search | load | unload | status" }),
4
4
  query: Type.Optional(Type.String({ description: "search query" })),
5
5
  name: Type.Optional(Type.String({ description: "exact skill name; unload without it unloads all" })),
6
+ pin: Type.Optional(Type.Boolean({ description: "protect from eviction while loaded; max 2" })),
6
7
  }, { additionalProperties: false });
7
8
  function searchText(result) {
8
9
  if (result.candidates.length === 0)
@@ -10,16 +11,20 @@ function searchText(result) {
10
11
  return result.candidates.map((candidate) => `${candidate.name}: ${candidate.description}`).join("\n");
11
12
  }
12
13
  function loadText(result) {
14
+ const pin = result.pinned ? " (pinned)" : "";
13
15
  const evicted = result.evicted ? `; EVICTED: ${result.evicted.join(", ")}` : "";
14
- return `skill loaded_pending: ${result.name} (base ${result.baseDir}), activates next request; expires when idle${evicted}`;
16
+ return `skill loaded_pending: ${result.name}${pin} (base ${result.baseDir}), activates next request; expires when idle${evicted}`;
15
17
  }
16
18
  function statusText(result) {
17
19
  if (result.slots.length === 0)
18
20
  return `skill state: unloaded${result.reason ? `, ${result.reason}` : ""}`;
19
21
  return result.slots
20
- .map((slot) => slot.state === "loaded_pending"
21
- ? `skill state: loaded_pending, ${slot.name}, activates next request`
22
- : `skill state: active, ${slot.name}, idle ${Math.round(slot.idleForMs ?? 0)}ms, expires ${Math.round(slot.expiresInMs ?? 0)}ms`)
22
+ .map((slot) => {
23
+ const pin = slot.pinned ? " (pinned)" : "";
24
+ return slot.state === "loaded_pending"
25
+ ? `skill state: loaded_pending, ${slot.name}${pin}, activates next request`
26
+ : `skill state: active, ${slot.name}${pin}, idle ${Math.round(slot.idleForMs ?? 0)}ms, expires ${Math.round(slot.expiresInMs ?? 0)}ms`;
27
+ })
23
28
  .join("\n");
24
29
  }
25
30
  /** One compact agent surface over the host-owned skill lifecycle. */
@@ -28,7 +33,7 @@ export function createSkillVaultToolDefinition(vault) {
28
33
  name: "skill",
29
34
  label: "Skill",
30
35
  toolGroup: "skills",
31
- description: "Skill vault, up to 3 concurrent skills under one byte budget. Specialist guidance useful: search, load exact name before work. Load may evict the least-recently-used skill and reports it. Host injects bodies transiently starting next request, expires idle; unload one name or all.",
36
+ description: "Skill vault, up to 3 concurrent skills under one byte budget. Specialist guidance useful: search, load exact name before work. Load may evict the oldest-loaded unpinned skill and reports it; pin protects up to 2 task-critical skills from eviction (they still expire idle). Host injects bodies transiently starting next request, expires idle; unload one name or all.",
32
37
  promptSnippet: "Search/load skill.",
33
38
  parameters: skillSchema,
34
39
  async execute(_toolCallId, input) {
@@ -50,7 +55,7 @@ export function createSkillVaultToolDefinition(vault) {
50
55
  }
51
56
  case "load": {
52
57
  const result = input.name?.trim()
53
- ? vault.load(input.name.trim(), "model")
58
+ ? vault.load(input.name.trim(), "model", input.pin === true)
54
59
  : { ok: false, reason: "not_found", message: "skill load requires exact name" };
55
60
  return {
56
61
  content: [
@@ -1 +1 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { SkillLoadResult, SkillSearchResult, SkillVaultController, SkillVaultStatus } from \"../skill-vault.ts\";\n\nconst skillSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[Type.Literal(\"search\"), Type.Literal(\"load\"), Type.Literal(\"unload\"), Type.Literal(\"status\")],\n\t\t\t{ description: \"search | load | unload | status\" },\n\t\t),\n\t\tquery: Type.Optional(Type.String({ description: \"search query\" })),\n\t\tname: Type.Optional(Type.String({ description: \"exact skill name; unload without it unloads all\" })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type SkillToolInput = Static<typeof skillSchema>;\nexport type SkillToolDetails =\n\t| { action: \"search\"; result: SkillSearchResult }\n\t| { action: \"load\"; result: SkillLoadResult }\n\t| { action: \"unload\"; result: { ok: true; unloaded: string[] } }\n\t| { action: \"status\"; result: SkillVaultStatus };\n\nfunction searchText(result: SkillSearchResult): string {\n\tif (result.candidates.length === 0) return \"skill search: no match\";\n\treturn result.candidates.map((candidate) => `${candidate.name}: ${candidate.description}`).join(\"\\n\");\n}\n\nfunction loadText(result: Extract<SkillLoadResult, { ok: true }>): string {\n\tconst evicted = result.evicted ? `; EVICTED: ${result.evicted.join(\", \")}` : \"\";\n\treturn `skill loaded_pending: ${result.name} (base ${result.baseDir}), activates next request; expires when idle${evicted}`;\n}\n\nfunction statusText(result: SkillVaultStatus): string {\n\tif (result.slots.length === 0) return `skill state: unloaded${result.reason ? `, ${result.reason}` : \"\"}`;\n\treturn result.slots\n\t\t.map((slot) =>\n\t\t\tslot.state === \"loaded_pending\"\n\t\t\t\t? `skill state: loaded_pending, ${slot.name}, activates next request`\n\t\t\t\t: `skill state: active, ${slot.name}, idle ${Math.round(slot.idleForMs ?? 0)}ms, expires ${Math.round(slot.expiresInMs ?? 0)}ms`,\n\t\t)\n\t\t.join(\"\\n\");\n}\n\n/** One compact agent surface over the host-owned skill lifecycle. */\nexport function createSkillVaultToolDefinition(vault: SkillVaultController): ToolDefinition<typeof skillSchema> {\n\treturn {\n\t\tname: \"skill\",\n\t\tlabel: \"Skill\",\n\t\ttoolGroup: \"skills\",\n\t\tdescription:\n\t\t\t\"Skill vault, up to 3 concurrent skills under one byte budget. Specialist guidance useful: search, load exact name before work. Load may evict the least-recently-used skill and reports it. Host injects bodies transiently starting next request, expires idle; unload one name or all.\",\n\t\tpromptSnippet: \"Search/load skill.\",\n\t\tparameters: skillSchema,\n\t\tasync execute(_toolCallId, input) {\n\t\t\tswitch (input.action) {\n\t\t\t\tcase \"search\": {\n\t\t\t\t\tif (!input.query?.trim()) {\n\t\t\t\t\t\tconst result: SkillSearchResult = { candidates: [] };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"skill search requires query\" }],\n\t\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tconst result = vault.search(input.query);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: searchText(result) }],\n\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"load\": {\n\t\t\t\t\tconst result: SkillLoadResult = input.name?.trim()\n\t\t\t\t\t\t? vault.load(input.name.trim(), \"model\")\n\t\t\t\t\t\t: { ok: false, reason: \"not_found\", message: \"skill load requires exact name\" };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: result.ok ? loadText(result) : `skill load failed: ${result.message}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"load\" as const, result },\n\t\t\t\t\t\tisError: !result.ok,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"unload\": {\n\t\t\t\t\tconst result = vault.unload(input.name?.trim() || undefined);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `skill unloaded: ${result.unloaded.length > 0 ? result.unloaded.join(\", \") : \"none\"}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"unload\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst result = vault.status();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: statusText(result) }],\n\t\t\t\t\t\tdetails: { action: \"status\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { SkillLoadResult, SkillSearchResult, SkillVaultController, SkillVaultStatus } from \"../skill-vault.ts\";\n\nconst skillSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[Type.Literal(\"search\"), Type.Literal(\"load\"), Type.Literal(\"unload\"), Type.Literal(\"status\")],\n\t\t\t{ description: \"search | load | unload | status\" },\n\t\t),\n\t\tquery: Type.Optional(Type.String({ description: \"search query\" })),\n\t\tname: Type.Optional(Type.String({ description: \"exact skill name; unload without it unloads all\" })),\n\t\tpin: Type.Optional(Type.Boolean({ description: \"protect from eviction while loaded; max 2\" })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type SkillToolInput = Static<typeof skillSchema>;\nexport type SkillToolDetails =\n\t| { action: \"search\"; result: SkillSearchResult }\n\t| { action: \"load\"; result: SkillLoadResult }\n\t| { action: \"unload\"; result: { ok: true; unloaded: string[] } }\n\t| { action: \"status\"; result: SkillVaultStatus };\n\nfunction searchText(result: SkillSearchResult): string {\n\tif (result.candidates.length === 0) return \"skill search: no match\";\n\treturn result.candidates.map((candidate) => `${candidate.name}: ${candidate.description}`).join(\"\\n\");\n}\n\nfunction loadText(result: Extract<SkillLoadResult, { ok: true }>): string {\n\tconst pin = result.pinned ? \" (pinned)\" : \"\";\n\tconst evicted = result.evicted ? `; EVICTED: ${result.evicted.join(\", \")}` : \"\";\n\treturn `skill loaded_pending: ${result.name}${pin} (base ${result.baseDir}), activates next request; expires when idle${evicted}`;\n}\n\nfunction statusText(result: SkillVaultStatus): string {\n\tif (result.slots.length === 0) return `skill state: unloaded${result.reason ? `, ${result.reason}` : \"\"}`;\n\treturn result.slots\n\t\t.map((slot) => {\n\t\t\tconst pin = slot.pinned ? \" (pinned)\" : \"\";\n\t\t\treturn slot.state === \"loaded_pending\"\n\t\t\t\t? `skill state: loaded_pending, ${slot.name}${pin}, activates next request`\n\t\t\t\t: `skill state: active, ${slot.name}${pin}, idle ${Math.round(slot.idleForMs ?? 0)}ms, expires ${Math.round(slot.expiresInMs ?? 0)}ms`;\n\t\t})\n\t\t.join(\"\\n\");\n}\n\n/** One compact agent surface over the host-owned skill lifecycle. */\nexport function createSkillVaultToolDefinition(vault: SkillVaultController): ToolDefinition<typeof skillSchema> {\n\treturn {\n\t\tname: \"skill\",\n\t\tlabel: \"Skill\",\n\t\ttoolGroup: \"skills\",\n\t\tdescription:\n\t\t\t\"Skill vault, up to 3 concurrent skills under one byte budget. Specialist guidance useful: search, load exact name before work. Load may evict the oldest-loaded unpinned skill and reports it; pin protects up to 2 task-critical skills from eviction (they still expire idle). Host injects bodies transiently starting next request, expires idle; unload one name or all.\",\n\t\tpromptSnippet: \"Search/load skill.\",\n\t\tparameters: skillSchema,\n\t\tasync execute(_toolCallId, input) {\n\t\t\tswitch (input.action) {\n\t\t\t\tcase \"search\": {\n\t\t\t\t\tif (!input.query?.trim()) {\n\t\t\t\t\t\tconst result: SkillSearchResult = { candidates: [] };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"skill search requires query\" }],\n\t\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tconst result = vault.search(input.query);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: searchText(result) }],\n\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"load\": {\n\t\t\t\t\tconst result: SkillLoadResult = input.name?.trim()\n\t\t\t\t\t\t? vault.load(input.name.trim(), \"model\", input.pin === true)\n\t\t\t\t\t\t: { ok: false, reason: \"not_found\", message: \"skill load requires exact name\" };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: result.ok ? loadText(result) : `skill load failed: ${result.message}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"load\" as const, result },\n\t\t\t\t\t\tisError: !result.ok,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"unload\": {\n\t\t\t\t\tconst result = vault.unload(input.name?.trim() || undefined);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `skill unloaded: ${result.unloaded.length > 0 ? result.unloaded.join(\", \") : \"none\"}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"unload\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst result = vault.status();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: statusText(result) }],\n\t\t\t\t\t\tdetails: { action: \"status\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
@@ -42,7 +42,7 @@ export interface WindowsShellEngineOptions {
42
42
  resolvePowerShellPath?: () => string;
43
43
  }
44
44
  /** Kill and forget a Python coordinator. The next call for this key starts a clean process. */
45
- export declare function disposeWindowsShellEngineSession(key: string): void;
45
+ export declare function disposeWindowsShellEngineSession(key: string): Promise<void>;
46
46
  /** Create the Python-engine tier for one bash-tool session. */
47
47
  export declare function createWindowsShellEngineOperations(sessionKey: string, options?: WindowsShellEngineOptions): BashOperations;
48
48
  //# sourceMappingURL=windows-shell-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"windows-shell-engine.d.ts","sourceRoot":"","sources":["../../../src/core/tools/windows-shell-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMrE,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGhD,OAAO,EAKN,KAAK,iBAAiB,EACtB,MAAM,0BAA0B,CAAC;AAMlC,uEAAuE;AACvE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,WAAW,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChF;AAiCD,qBAAa,yBAA0B,SAAQ,KAAK;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,YAAY,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAIlD;CACD;AAsED,MAAM,WAAW,yBAAyB;IACzC,+FAA+F;IAC/F,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrD,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACrD,sFAAsF;IACtF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;IACjF,2FAA2F;IAC3F,qBAAqB,CAAC,EAAE,MAAM,MAAM,CAAC;CACrC;AA0SD,+FAA+F;AAC/F,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKlE;AAED,+DAA+D;AAC/D,wBAAgB,kCAAkC,CACjD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,yBAA8B,GACrC,cAAc,CAQhB"}
1
+ {"version":3,"file":"windows-shell-engine.d.ts","sourceRoot":"","sources":["../../../src/core/tools/windows-shell-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMrE,OAAO,EAAuB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGhD,OAAO,EAKN,KAAK,iBAAiB,EACtB,MAAM,0BAA0B,CAAC;AAMlC,uEAAuE;AACvE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,WAAW,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChF;AAiCD,qBAAa,yBAA0B,SAAQ,KAAK;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,YAAY,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAIlD;CACD;AAsED,MAAM,WAAW,yBAAyB;IACzC,+FAA+F;IAC/F,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrD,iGAAiG;IACjG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACrD,sFAAsF;IACtF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;IACjF,2FAA2F;IAC3F,qBAAqB,CAAC,EAAE,MAAM,MAAM,CAAC;CACrC;AA8SD,+FAA+F;AAC/F,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E;AAED,+DAA+D;AAC/D,wBAAgB,kCAAkC,CACjD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,yBAA8B,GACrC,cAAc,CAQhB"}
@@ -118,13 +118,16 @@ class PersistentWindowsShellEngineSession {
118
118
  exec(command, cwd, options) {
119
119
  return this.coordinator.runSerialized(() => this.execNow(command, cwd, options));
120
120
  }
121
+ get terminalPromise() {
122
+ return this.coordinator.terminalPromise;
123
+ }
121
124
  dispose() {
122
125
  if (this.disposed)
123
126
  return;
124
127
  this.disposed = true;
125
128
  const active = this.activeExec;
126
- this.coordinator.dispose();
127
129
  active?.fail(new Error(`Windows shell engine session "${this.key}" is disposed`));
130
+ this.coordinator.dispose();
128
131
  }
129
132
  async execNow(command, cwd, { onData, signal, timeout, env }) {
130
133
  if (this.disposed)
@@ -362,9 +365,10 @@ function acquireWindowsShellEngineSession(key, options) {
362
365
  export function disposeWindowsShellEngineSession(key) {
363
366
  const session = engineSessions.get(key);
364
367
  if (!session)
365
- return;
368
+ return Promise.resolve();
366
369
  engineSessions.delete(key);
367
370
  session.dispose();
371
+ return session.terminalPromise;
368
372
  }
369
373
  /** Create the Python-engine tier for one bash-tool session. */
370
374
  export function createWindowsShellEngineOperations(sessionKey, options = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"windows-shell-engine.js","sourceRoot":"","sources":["../../../src/core/tools/windows-shell-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Persistent Windows Python shell-engine sessions.\n *\n * One coordinator process is keyed to each agent session. Requests are serialized as JSON lines;\n * Node remains the sole owner of cwd/environment state and derives each request only after the\n * preceding terminal frame has been applied. Command bytes stream on stdout, followed by a\n * request-specific output barrier. A correlated control frame arrives on stderr. Requiring both\n * channels before settlement prevents cross-pipe tail loss and stale-frame reuse.\n *\n * Timeout, abort, protocol failure, or coordinator death resets the whole process tree. The next\n * request starts a clean coordinator from the last state Node actually acknowledged.\n */\n\nimport type { ChildProcess, SpawnOptions } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { dirname, join } from \"node:path\";\nimport { getBundledResourcesDir } from \"../../config.ts\";\nimport { spawnProcess } from \"../../utils/child-process.ts\";\nimport { getShellConfig, getShellEnv } from \"../../utils/shell.ts\";\nimport { ensurePythonRuntime, type PythonRuntimeOutcome } from \"../python-runtime.ts\";\nimport { isRecordObject } from \"../util/value-guards.ts\";\nimport type { BashOperations } from \"./bash.ts\";\nimport { PersistentProcessCoordinator } from \"./persistent-process-coordinator.ts\";\nimport { tokenizeShellCommand } from \"./shell-command-parser.ts\";\nimport {\n\tapplyEngineFrame,\n\tgetOrCreateWindowsShellState,\n\tmergeEffectiveEnv,\n\tresolveEffectiveCwd,\n\ttype WindowsShellState,\n} from \"./windows-shell-state.ts\";\n\nconst ENGINE_FRAME_SENTINEL = 0x1e;\nconst MAX_CONTROL_FRAME_BYTES = 64 * 1024;\nconst SOFT_DEADLINE_HEADSTART_MS = 100;\n\n/** State/result fields returned for every completed engine command. */\nexport interface WindowsShellEngineFrame {\n\texitCode: number;\n\tcwd: string;\n\tenvDelta: Record<string, string | null>;\n\tunsupported: { code: \"unsupported\"; construct: string; message: string } | null;\n}\n\ninterface WindowsShellEngineControlFrame extends WindowsShellEngineFrame {\n\trequestId: string;\n}\n\ninterface WindowsShellEngineRequest {\n\trequestId: string;\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n\tpowershellPath?: string;\n\ttimeoutMs?: number;\n}\n\ninterface ParsedControlFrame {\n\tkind: \"frame\";\n\tframe: WindowsShellEngineControlFrame;\n\tframeStart: number;\n\tframeEnd: number;\n}\n\ninterface InvalidControlFrame {\n\tkind: \"invalid\";\n}\n\ninterface ActiveEngineExec {\n\tonStdout(data: Buffer): void;\n\tonStderr(data: Buffer): void;\n\tonChildClose(code: number | null): void;\n\tfail(error: Error): void;\n}\n\nexport class WindowsShellEngineFailure extends Error {\n\treadonly capturedOutput: string;\n\n\tconstructor(message: string, capturedOutput: string) {\n\t\tsuper(message);\n\t\tthis.name = \"WindowsShellEngineFailure\";\n\t\tthis.capturedOutput = capturedOutput;\n\t}\n}\n\nfunction resolveEngineScriptPath(): string {\n\treturn join(getBundledResourcesDir(), \"runtimes\", \"pi-shell-engine\", \"main.py\");\n}\n\nfunction invokesPowerShellScript(command: string): boolean {\n\tconst tokens = tokenizeShellCommand(command);\n\t// An unparseable command is already heading to the authoritative Python parser;\n\t// resolve conservatively so script adaptation cannot lose an explicit host choice.\n\tif (!tokens) return /\\.ps1\\b/iu.test(command);\n\n\tlet atCommandStart = true;\n\tlet skipRedirectTarget = false;\n\tfor (const token of tokens) {\n\t\tif (token.kind === \"operator\" || token.kind === \"pipe\") {\n\t\t\tatCommandStart = true;\n\t\t\tskipRedirectTarget = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.kind === \"redirect\") {\n\t\t\tskipRedirectTarget = !/^\\d*[<>]&[\\d-]+$/u.test(token.value);\n\t\t\tcontinue;\n\t\t}\n\t\tif (skipRedirectTarget) {\n\t\t\tskipRedirectTarget = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!atCommandStart || /^[A-Za-z_][A-Za-z0-9_]*=/u.test(token.value)) continue;\n\t\tif (token.value.toLowerCase().endsWith(\".ps1\")) return true;\n\t\tatCommandStart = false;\n\t}\n\treturn false;\n}\n\nfunction parseControlFrame(buffer: Buffer): ParsedControlFrame | InvalidControlFrame | undefined {\n\tconst frameStart = buffer.indexOf(ENGINE_FRAME_SENTINEL);\n\tif (frameStart === -1) return undefined;\n\tconst closeIndex = buffer.indexOf(ENGINE_FRAME_SENTINEL, frameStart + 1);\n\tif (closeIndex === -1) return undefined;\n\ttry {\n\t\tconst raw: unknown = JSON.parse(buffer.subarray(frameStart + 1, closeIndex).toString(\"utf8\"));\n\t\tif (\n\t\t\tisRecordObject(raw) &&\n\t\t\ttypeof raw.requestId === \"string\" &&\n\t\t\t/^[0-9a-f]{16}$/u.test(raw.requestId) &&\n\t\t\ttypeof raw.exitCode === \"number\" &&\n\t\t\tNumber.isInteger(raw.exitCode) &&\n\t\t\ttypeof raw.cwd === \"string\" &&\n\t\t\tisRecordObject(raw.envDelta) &&\n\t\t\t(raw.unsupported === null || isRecordObject(raw.unsupported)) &&\n\t\t\t(raw.unsupported === null ||\n\t\t\t\t(raw.unsupported.code === \"unsupported\" &&\n\t\t\t\t\ttypeof raw.unsupported.construct === \"string\" &&\n\t\t\t\t\ttypeof raw.unsupported.message === \"string\")) &&\n\t\t\tObject.values(raw.envDelta).every((value) => value === null || typeof value === \"string\")\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkind: \"frame\",\n\t\t\t\tframe: raw as unknown as WindowsShellEngineControlFrame,\n\t\t\t\tframeStart,\n\t\t\t\tframeEnd: closeIndex + 1,\n\t\t\t};\n\t\t}\n\t} catch {\n\t\t// A complete delimited record that is not JSON is a terminal protocol fault.\n\t}\n\treturn { kind: \"invalid\" };\n}\n\nexport interface WindowsShellEngineOptions {\n\t/** Override for tests: resolves the Python runtime outcome. Default: `ensurePythonRuntime`. */\n\tresolveRuntime?: () => Promise<PythonRuntimeOutcome>;\n\t/** Override for tests: absolute path to the engine's `main.py`. Default: the bundled runtime. */\n\tengineScriptPath?: string;\n\t/** Override for tests: the per-session state store lookup. Default: the shared module store. */\n\tgetState?: (sessionKey: string) => WindowsShellState;\n\t/** Override for tests: spawns the persistent coordinator. Default: `spawnProcess`. */\n\tspawn?: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\t/** Override for tests: selected PowerShell host used to adapt `.ps1` external commands. */\n\tresolvePowerShellPath?: () => string;\n}\n\nfunction degradationError(\n\toutcome: Extract<PythonRuntimeOutcome, { status: \"offline\" | \"uv-unavailable\" | \"python-unavailable\" }>,\n): Error {\n\treturn new Error(\n\t\t`The Windows shell engine (Python) is unavailable: ${outcome.reason} The simple-command PowerShell floor still works; fix the Python runtime (uv/network) to restore for loops, portable builtins such as printf, pipelines, redirection, expansion, and chaining.`,\n\t);\n}\n\nclass PersistentWindowsShellEngineSession {\n\tprivate readonly key: string;\n\tprivate readonly resolveRuntime: () => Promise<PythonRuntimeOutcome>;\n\tprivate readonly engineScriptPath: string;\n\tprivate readonly getState: (sessionKey: string) => WindowsShellState;\n\tprivate readonly spawn: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\tprivate readonly resolvePowerShellPath: () => string;\n\tprivate readonly coordinator = new PersistentProcessCoordinator();\n\tprivate activeExec: ActiveEngineExec | null = null;\n\tprivate disposed = false;\n\n\tconstructor(key: string, options: WindowsShellEngineOptions) {\n\t\tthis.key = key;\n\t\tthis.resolveRuntime = options.resolveRuntime ?? (() => ensurePythonRuntime({ silent: true }));\n\t\tthis.engineScriptPath = options.engineScriptPath ?? resolveEngineScriptPath();\n\t\tthis.getState = options.getState ?? getOrCreateWindowsShellState;\n\t\tthis.spawn = options.spawn ?? spawnProcess;\n\t\tthis.resolvePowerShellPath =\n\t\t\toptions.resolvePowerShellPath ??\n\t\t\t(() => (process.platform === \"win32\" ? getShellConfig(undefined, \"powershell\").shell : \"powershell\"));\n\t}\n\n\texec(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: Parameters<BashOperations[\"exec\"]>[2],\n\t): Promise<{ exitCode: number | null }> {\n\t\treturn this.coordinator.runSerialized(() => this.execNow(command, cwd, options));\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tconst active = this.activeExec;\n\t\tthis.coordinator.dispose();\n\t\tactive?.fail(new Error(`Windows shell engine session \"${this.key}\" is disposed`));\n\t}\n\n\tprivate async execNow(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\t{ onData, signal, timeout, env }: Parameters<BashOperations[\"exec\"]>[2],\n\t): Promise<{ exitCode: number | null }> {\n\t\tif (this.disposed) throw new Error(`Windows shell engine session \"${this.key}\" is disposed`);\n\t\tif (signal?.aborted) throw new Error(\"aborted\");\n\n\t\tconst state = this.getState(this.key);\n\t\tconst effectiveCwd = resolveEffectiveCwd(state, cwd);\n\t\tconst effectiveEnv = mergeEffectiveEnv(state, env ?? getShellEnv());\n\t\tconst child = await this.ensureChild(effectiveEnv);\n\t\tif (this.disposed) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(`Windows shell engine session \"${this.key}\" is disposed`);\n\t\t}\n\t\tif (signal?.aborted) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(\"aborted\");\n\t\t}\n\t\tif (!child.stdin || !child.stdout || !child.stderr || child !== this.coordinator.child) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(\"Failed to start Windows shell engine coordinator\");\n\t\t}\n\n\t\tconst timeoutMs = timeout !== undefined && timeout > 0 ? timeout * 1000 : undefined;\n\t\tconst requestTimeoutMs =\n\t\t\ttimeoutMs !== undefined ? Math.max(timeoutMs - SOFT_DEADLINE_HEADSTART_MS, 1) : undefined;\n\t\tconst requestId = randomBytes(8).toString(\"hex\");\n\t\tconst request: WindowsShellEngineRequest = {\n\t\t\trequestId,\n\t\t\tcommand,\n\t\t\tcwd: effectiveCwd,\n\t\t\tenv: effectiveEnv,\n\t\t\t...(invokesPowerShellScript(command) ? { powershellPath: this.resolvePowerShellPath() } : {}),\n\t\t\t...(requestTimeoutMs !== undefined ? { timeoutMs: requestTimeoutMs } : {}),\n\t\t};\n\t\tconst outputBarrier = Buffer.from(`\\x1e${requestId}\\x1e`, \"latin1\");\n\n\t\tthis.coordinator.setLoopRef(true);\n\t\ttry {\n\t\t\treturn await new Promise<{ exitCode: number | null }>((resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tlet pendingOutput: Buffer<ArrayBufferLike> = Buffer.alloc(0);\n\t\t\t\tlet controlBuffer: Buffer<ArrayBufferLike> = Buffer.alloc(0);\n\t\t\t\tlet controlOverflow = false;\n\t\t\t\tlet sawOutputBarrier = false;\n\t\t\t\tlet controlFrame: WindowsShellEngineControlFrame | undefined;\n\t\t\t\tlet completionScheduled = false;\n\t\t\t\tlet timeoutTimer: NodeJS.Timeout | undefined;\n\n\t\t\t\tconst settle = (finish: () => void): void => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tif (this.activeExec === active) this.activeExec = null;\n\t\t\t\t\tfinish();\n\t\t\t\t};\n\n\t\t\t\tconst emitPending = (upTo: number): void => {\n\t\t\t\t\tif (upTo <= 0) return;\n\t\t\t\t\tonData(pendingOutput.subarray(0, upTo));\n\t\t\t\t\tpendingOutput = pendingOutput.subarray(upTo);\n\t\t\t\t};\n\n\t\t\t\tconst capturedControl = (): string =>\n\t\t\t\t\tcontrolOverflow\n\t\t\t\t\t\t? `control frame exceeded ${MAX_CONTROL_FRAME_BYTES} bytes`\n\t\t\t\t\t\t: controlBuffer.toString(\"utf8\");\n\n\t\t\t\tconst failAndReset = (error: Error): void => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\temitPending(pendingOutput.length);\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tsettle(() => reject(error));\n\t\t\t\t};\n\n\t\t\t\tconst protocolFailure = (message: string): WindowsShellEngineFailure => {\n\t\t\t\t\tconst capturedOutput = capturedControl();\n\t\t\t\t\treturn new WindowsShellEngineFailure(`${message}\\n${capturedOutput}`, capturedOutput);\n\t\t\t\t};\n\n\t\t\t\tconst maybeComplete = (): void => {\n\t\t\t\t\tif (!sawOutputBarrier || !controlFrame || settled || completionScheduled) return;\n\t\t\t\t\tcompletionScheduled = true;\n\t\t\t\t\t// stdout and stderr are independent pipes. Keep this request active through the\n\t\t\t\t\t// next check phase so already-delivered post-barrier bytes are rejected here,\n\t\t\t\t\t// never forwarded into a queued request that starts in a promise microtask.\n\t\t\t\t\tsetImmediate(() => {\n\t\t\t\t\t\tif (settled || this.activeExec !== active || !controlFrame) return;\n\t\t\t\t\t\tapplyEngineFrame(state, controlFrame);\n\t\t\t\t\t\tif (controlFrame.unsupported) {\n\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\treject(new Error(controlFrame?.unsupported?.message ?? \"Unsupported shell construct\")),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsettle(() => resolve({ exitCode: controlFrame?.exitCode ?? null }));\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst onAbort = (): void => failAndReset(new Error(\"aborted\"));\n\n\t\t\t\tconst active: ActiveEngineExec = {\n\t\t\t\t\tonStdout: (data) => {\n\t\t\t\t\t\tif (sawOutputBarrier) {\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine emitted output after its terminal barrier.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpendingOutput = pendingOutput.length === 0 ? data : Buffer.concat([pendingOutput, data]);\n\t\t\t\t\t\tconst barrierIndex = pendingOutput.indexOf(outputBarrier);\n\t\t\t\t\t\tif (barrierIndex !== -1) {\n\t\t\t\t\t\t\temitPending(barrierIndex);\n\t\t\t\t\t\t\tpendingOutput = pendingOutput.subarray(outputBarrier.length);\n\t\t\t\t\t\t\tif (pendingOutput.length > 0) {\n\t\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine emitted bytes after its terminal barrier.\"));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsawOutputBarrier = true;\n\t\t\t\t\t\t\tmaybeComplete();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\temitPending(pendingOutput.length - (outputBarrier.length - 1));\n\t\t\t\t\t},\n\t\t\t\t\tonStderr: (data) => {\n\t\t\t\t\t\tif (controlOverflow) return;\n\t\t\t\t\t\tif (controlBuffer.length + data.length > MAX_CONTROL_FRAME_BYTES) {\n\t\t\t\t\t\t\tcontrolOverflow = true;\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine control frame overflowed.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontrolBuffer = controlBuffer.length === 0 ? data : Buffer.concat([controlBuffer, data]);\n\t\t\t\t\t\tconst parsed = parseControlFrame(controlBuffer);\n\t\t\t\t\t\tif (!parsed) return;\n\t\t\t\t\t\tif (parsed.kind === \"invalid\") {\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine returned a malformed control frame.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (parsed.frame.requestId !== requestId) {\n\t\t\t\t\t\t\tfailAndReset(\n\t\t\t\t\t\t\t\tprotocolFailure(\n\t\t\t\t\t\t\t\t\t`Windows shell engine returned stale control frame ${parsed.frame.requestId}; expected ${requestId}.`,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (controlBuffer.subarray(parsed.frameEnd).toString(\"utf8\").trim().length > 0) {\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine emitted trailing control bytes.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontrolFrame = parsed.frame;\n\t\t\t\t\t\tmaybeComplete();\n\t\t\t\t\t},\n\t\t\t\t\tonChildClose: (code) => {\n\t\t\t\t\t\tconst capturedOutput = capturedControl();\n\t\t\t\t\t\temitPending(pendingOutput.length);\n\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\tnew WindowsShellEngineFailure(\n\t\t\t\t\t\t\t\t\t`Windows shell engine coordinator exited (${code ?? \"null\"}) before a complete terminal handoff.\\n${capturedOutput}`,\n\t\t\t\t\t\t\t\t\tcapturedOutput,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tfail: (error) => failAndReset(error),\n\t\t\t\t};\n\n\t\t\t\tthis.activeExec = active;\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t\tif (signal.aborted) {\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutTimer = setTimeout(() => failAndReset(new Error(`timeout:${timeout}`)), timeoutMs);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tchild.stdin?.write(`${JSON.stringify(request)}\\n`, \"utf8\", (error) => {\n\t\t\t\t\t\tif (!error) return;\n\t\t\t\t\t\tfailAndReset(new Error(`Failed to write to Windows shell engine coordinator: ${error.message}`));\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tfailAndReset(new Error(`Failed to write to Windows shell engine coordinator: ${message}`));\n\t\t\t\t}\n\t\t\t});\n\t\t} finally {\n\t\t\tthis.coordinator.setLoopRef(false);\n\t\t}\n\t}\n\n\tprivate async ensureChild(env: NodeJS.ProcessEnv): Promise<ChildProcess> {\n\t\tif (this.coordinator.child) return this.coordinator.child;\n\t\tconst runtime = await this.resolveRuntime();\n\t\tif (runtime.status !== \"ready\") throw degradationError(runtime);\n\t\tif (this.disposed) throw new Error(`Windows shell engine session \"${this.key}\" is disposed`);\n\n\t\tconst child = this.spawn(runtime.pythonPath, [\"-B\", this.engineScriptPath, \"--server\"], {\n\t\t\tcwd: dirname(this.engineScriptPath),\n\t\t\tenv: {\n\t\t\t\t...env,\n\t\t\t\tPYTHONDONTWRITEBYTECODE: \"1\",\n\t\t\t\tPYTHONIOENCODING: \"utf-8\",\n\t\t\t\tPYTHONUNBUFFERED: \"1\",\n\t\t\t\tPYTHONUTF8: \"1\",\n\t\t\t},\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\twindowsHide: true,\n\t\t});\n\t\tthis.coordinator.attach(child, {\n\t\t\tonStdout: (data) => {\n\t\t\t\tconst active = this.activeExec;\n\t\t\t\tif (active) active.onStdout(data);\n\t\t\t\telse if (data.length > 0) this.killChild();\n\t\t\t},\n\t\t\tonStderr: (data) => {\n\t\t\t\tconst active = this.activeExec;\n\t\t\t\tif (active) active.onStderr(data);\n\t\t\t\telse if (data.length > 0) this.killChild();\n\t\t\t},\n\t\t\tonError: (error) => this.activeExec?.fail(error),\n\t\t\tonClose: (code) => this.activeExec?.onChildClose(code),\n\t\t});\n\t\treturn child;\n\t}\n\n\tprivate killChild(): void {\n\t\tthis.coordinator.kill();\n\t}\n}\n\nconst engineSessions = new Map<string, PersistentWindowsShellEngineSession>();\n\nfunction acquireWindowsShellEngineSession(\n\tkey: string,\n\toptions: WindowsShellEngineOptions,\n): PersistentWindowsShellEngineSession {\n\tconst existing = engineSessions.get(key);\n\tif (existing) return existing;\n\tconst session = new PersistentWindowsShellEngineSession(key, options);\n\tengineSessions.set(key, session);\n\treturn session;\n}\n\n/** Kill and forget a Python coordinator. The next call for this key starts a clean process. */\nexport function disposeWindowsShellEngineSession(key: string): void {\n\tconst session = engineSessions.get(key);\n\tif (!session) return;\n\tengineSessions.delete(key);\n\tsession.dispose();\n}\n\n/** Create the Python-engine tier for one bash-tool session. */\nexport function createWindowsShellEngineOperations(\n\tsessionKey: string,\n\toptions: WindowsShellEngineOptions = {},\n): BashOperations {\n\treturn {\n\t\t// Resolve through the registry for every command. Session teardown (for example after\n\t\t// credential/environment changes) deletes only this tenant's entry; an already-built tool\n\t\t// then lazily acquires a fresh coordinator instead of retaining the disposed instance.\n\t\texec: (command, cwd, execOptions) =>\n\t\t\tacquireWindowsShellEngineSession(sessionKey, options).exec(command, cwd, execOptions),\n\t};\n}\n"]}
1
+ {"version":3,"file":"windows-shell-engine.js","sourceRoot":"","sources":["../../../src/core/tools/windows-shell-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Persistent Windows Python shell-engine sessions.\n *\n * One coordinator process is keyed to each agent session. Requests are serialized as JSON lines;\n * Node remains the sole owner of cwd/environment state and derives each request only after the\n * preceding terminal frame has been applied. Command bytes stream on stdout, followed by a\n * request-specific output barrier. A correlated control frame arrives on stderr. Requiring both\n * channels before settlement prevents cross-pipe tail loss and stale-frame reuse.\n *\n * Timeout, abort, protocol failure, or coordinator death resets the whole process tree. The next\n * request starts a clean coordinator from the last state Node actually acknowledged.\n */\n\nimport type { ChildProcess, SpawnOptions } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { dirname, join } from \"node:path\";\nimport { getBundledResourcesDir } from \"../../config.ts\";\nimport { spawnProcess } from \"../../utils/child-process.ts\";\nimport { getShellConfig, getShellEnv } from \"../../utils/shell.ts\";\nimport { ensurePythonRuntime, type PythonRuntimeOutcome } from \"../python-runtime.ts\";\nimport { isRecordObject } from \"../util/value-guards.ts\";\nimport type { BashOperations } from \"./bash.ts\";\nimport { PersistentProcessCoordinator } from \"./persistent-process-coordinator.ts\";\nimport { tokenizeShellCommand } from \"./shell-command-parser.ts\";\nimport {\n\tapplyEngineFrame,\n\tgetOrCreateWindowsShellState,\n\tmergeEffectiveEnv,\n\tresolveEffectiveCwd,\n\ttype WindowsShellState,\n} from \"./windows-shell-state.ts\";\n\nconst ENGINE_FRAME_SENTINEL = 0x1e;\nconst MAX_CONTROL_FRAME_BYTES = 64 * 1024;\nconst SOFT_DEADLINE_HEADSTART_MS = 100;\n\n/** State/result fields returned for every completed engine command. */\nexport interface WindowsShellEngineFrame {\n\texitCode: number;\n\tcwd: string;\n\tenvDelta: Record<string, string | null>;\n\tunsupported: { code: \"unsupported\"; construct: string; message: string } | null;\n}\n\ninterface WindowsShellEngineControlFrame extends WindowsShellEngineFrame {\n\trequestId: string;\n}\n\ninterface WindowsShellEngineRequest {\n\trequestId: string;\n\tcommand: string;\n\tcwd: string;\n\tenv: NodeJS.ProcessEnv;\n\tpowershellPath?: string;\n\ttimeoutMs?: number;\n}\n\ninterface ParsedControlFrame {\n\tkind: \"frame\";\n\tframe: WindowsShellEngineControlFrame;\n\tframeStart: number;\n\tframeEnd: number;\n}\n\ninterface InvalidControlFrame {\n\tkind: \"invalid\";\n}\n\ninterface ActiveEngineExec {\n\tonStdout(data: Buffer): void;\n\tonStderr(data: Buffer): void;\n\tonChildClose(code: number | null): void;\n\tfail(error: Error): void;\n}\n\nexport class WindowsShellEngineFailure extends Error {\n\treadonly capturedOutput: string;\n\n\tconstructor(message: string, capturedOutput: string) {\n\t\tsuper(message);\n\t\tthis.name = \"WindowsShellEngineFailure\";\n\t\tthis.capturedOutput = capturedOutput;\n\t}\n}\n\nfunction resolveEngineScriptPath(): string {\n\treturn join(getBundledResourcesDir(), \"runtimes\", \"pi-shell-engine\", \"main.py\");\n}\n\nfunction invokesPowerShellScript(command: string): boolean {\n\tconst tokens = tokenizeShellCommand(command);\n\t// An unparseable command is already heading to the authoritative Python parser;\n\t// resolve conservatively so script adaptation cannot lose an explicit host choice.\n\tif (!tokens) return /\\.ps1\\b/iu.test(command);\n\n\tlet atCommandStart = true;\n\tlet skipRedirectTarget = false;\n\tfor (const token of tokens) {\n\t\tif (token.kind === \"operator\" || token.kind === \"pipe\") {\n\t\t\tatCommandStart = true;\n\t\t\tskipRedirectTarget = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token.kind === \"redirect\") {\n\t\t\tskipRedirectTarget = !/^\\d*[<>]&[\\d-]+$/u.test(token.value);\n\t\t\tcontinue;\n\t\t}\n\t\tif (skipRedirectTarget) {\n\t\t\tskipRedirectTarget = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!atCommandStart || /^[A-Za-z_][A-Za-z0-9_]*=/u.test(token.value)) continue;\n\t\tif (token.value.toLowerCase().endsWith(\".ps1\")) return true;\n\t\tatCommandStart = false;\n\t}\n\treturn false;\n}\n\nfunction parseControlFrame(buffer: Buffer): ParsedControlFrame | InvalidControlFrame | undefined {\n\tconst frameStart = buffer.indexOf(ENGINE_FRAME_SENTINEL);\n\tif (frameStart === -1) return undefined;\n\tconst closeIndex = buffer.indexOf(ENGINE_FRAME_SENTINEL, frameStart + 1);\n\tif (closeIndex === -1) return undefined;\n\ttry {\n\t\tconst raw: unknown = JSON.parse(buffer.subarray(frameStart + 1, closeIndex).toString(\"utf8\"));\n\t\tif (\n\t\t\tisRecordObject(raw) &&\n\t\t\ttypeof raw.requestId === \"string\" &&\n\t\t\t/^[0-9a-f]{16}$/u.test(raw.requestId) &&\n\t\t\ttypeof raw.exitCode === \"number\" &&\n\t\t\tNumber.isInteger(raw.exitCode) &&\n\t\t\ttypeof raw.cwd === \"string\" &&\n\t\t\tisRecordObject(raw.envDelta) &&\n\t\t\t(raw.unsupported === null || isRecordObject(raw.unsupported)) &&\n\t\t\t(raw.unsupported === null ||\n\t\t\t\t(raw.unsupported.code === \"unsupported\" &&\n\t\t\t\t\ttypeof raw.unsupported.construct === \"string\" &&\n\t\t\t\t\ttypeof raw.unsupported.message === \"string\")) &&\n\t\t\tObject.values(raw.envDelta).every((value) => value === null || typeof value === \"string\")\n\t\t) {\n\t\t\treturn {\n\t\t\t\tkind: \"frame\",\n\t\t\t\tframe: raw as unknown as WindowsShellEngineControlFrame,\n\t\t\t\tframeStart,\n\t\t\t\tframeEnd: closeIndex + 1,\n\t\t\t};\n\t\t}\n\t} catch {\n\t\t// A complete delimited record that is not JSON is a terminal protocol fault.\n\t}\n\treturn { kind: \"invalid\" };\n}\n\nexport interface WindowsShellEngineOptions {\n\t/** Override for tests: resolves the Python runtime outcome. Default: `ensurePythonRuntime`. */\n\tresolveRuntime?: () => Promise<PythonRuntimeOutcome>;\n\t/** Override for tests: absolute path to the engine's `main.py`. Default: the bundled runtime. */\n\tengineScriptPath?: string;\n\t/** Override for tests: the per-session state store lookup. Default: the shared module store. */\n\tgetState?: (sessionKey: string) => WindowsShellState;\n\t/** Override for tests: spawns the persistent coordinator. Default: `spawnProcess`. */\n\tspawn?: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\t/** Override for tests: selected PowerShell host used to adapt `.ps1` external commands. */\n\tresolvePowerShellPath?: () => string;\n}\n\nfunction degradationError(\n\toutcome: Extract<PythonRuntimeOutcome, { status: \"offline\" | \"uv-unavailable\" | \"python-unavailable\" }>,\n): Error {\n\treturn new Error(\n\t\t`The Windows shell engine (Python) is unavailable: ${outcome.reason} The simple-command PowerShell floor still works; fix the Python runtime (uv/network) to restore for loops, portable builtins such as printf, pipelines, redirection, expansion, and chaining.`,\n\t);\n}\n\nclass PersistentWindowsShellEngineSession {\n\tprivate readonly key: string;\n\tprivate readonly resolveRuntime: () => Promise<PythonRuntimeOutcome>;\n\tprivate readonly engineScriptPath: string;\n\tprivate readonly getState: (sessionKey: string) => WindowsShellState;\n\tprivate readonly spawn: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n\tprivate readonly resolvePowerShellPath: () => string;\n\tprivate readonly coordinator = new PersistentProcessCoordinator();\n\tprivate activeExec: ActiveEngineExec | null = null;\n\tprivate disposed = false;\n\n\tconstructor(key: string, options: WindowsShellEngineOptions) {\n\t\tthis.key = key;\n\t\tthis.resolveRuntime = options.resolveRuntime ?? (() => ensurePythonRuntime({ silent: true }));\n\t\tthis.engineScriptPath = options.engineScriptPath ?? resolveEngineScriptPath();\n\t\tthis.getState = options.getState ?? getOrCreateWindowsShellState;\n\t\tthis.spawn = options.spawn ?? spawnProcess;\n\t\tthis.resolvePowerShellPath =\n\t\t\toptions.resolvePowerShellPath ??\n\t\t\t(() => (process.platform === \"win32\" ? getShellConfig(undefined, \"powershell\").shell : \"powershell\"));\n\t}\n\n\texec(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\toptions: Parameters<BashOperations[\"exec\"]>[2],\n\t): Promise<{ exitCode: number | null }> {\n\t\treturn this.coordinator.runSerialized(() => this.execNow(command, cwd, options));\n\t}\n\n\tget terminalPromise(): Promise<void> {\n\t\treturn this.coordinator.terminalPromise;\n\t}\n\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tconst active = this.activeExec;\n\t\tactive?.fail(new Error(`Windows shell engine session \"${this.key}\" is disposed`));\n\t\tthis.coordinator.dispose();\n\t}\n\n\tprivate async execNow(\n\t\tcommand: string,\n\t\tcwd: string,\n\t\t{ onData, signal, timeout, env }: Parameters<BashOperations[\"exec\"]>[2],\n\t): Promise<{ exitCode: number | null }> {\n\t\tif (this.disposed) throw new Error(`Windows shell engine session \"${this.key}\" is disposed`);\n\t\tif (signal?.aborted) throw new Error(\"aborted\");\n\n\t\tconst state = this.getState(this.key);\n\t\tconst effectiveCwd = resolveEffectiveCwd(state, cwd);\n\t\tconst effectiveEnv = mergeEffectiveEnv(state, env ?? getShellEnv());\n\t\tconst child = await this.ensureChild(effectiveEnv);\n\t\tif (this.disposed) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(`Windows shell engine session \"${this.key}\" is disposed`);\n\t\t}\n\t\tif (signal?.aborted) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(\"aborted\");\n\t\t}\n\t\tif (!child.stdin || !child.stdout || !child.stderr || child !== this.coordinator.child) {\n\t\t\tthis.killChild();\n\t\t\tthrow new Error(\"Failed to start Windows shell engine coordinator\");\n\t\t}\n\n\t\tconst timeoutMs = timeout !== undefined && timeout > 0 ? timeout * 1000 : undefined;\n\t\tconst requestTimeoutMs =\n\t\t\ttimeoutMs !== undefined ? Math.max(timeoutMs - SOFT_DEADLINE_HEADSTART_MS, 1) : undefined;\n\t\tconst requestId = randomBytes(8).toString(\"hex\");\n\t\tconst request: WindowsShellEngineRequest = {\n\t\t\trequestId,\n\t\t\tcommand,\n\t\t\tcwd: effectiveCwd,\n\t\t\tenv: effectiveEnv,\n\t\t\t...(invokesPowerShellScript(command) ? { powershellPath: this.resolvePowerShellPath() } : {}),\n\t\t\t...(requestTimeoutMs !== undefined ? { timeoutMs: requestTimeoutMs } : {}),\n\t\t};\n\t\tconst outputBarrier = Buffer.from(`\\x1e${requestId}\\x1e`, \"latin1\");\n\n\t\tthis.coordinator.setLoopRef(true);\n\t\ttry {\n\t\t\treturn await new Promise<{ exitCode: number | null }>((resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tlet pendingOutput: Buffer<ArrayBufferLike> = Buffer.alloc(0);\n\t\t\t\tlet controlBuffer: Buffer<ArrayBufferLike> = Buffer.alloc(0);\n\t\t\t\tlet controlOverflow = false;\n\t\t\t\tlet sawOutputBarrier = false;\n\t\t\t\tlet controlFrame: WindowsShellEngineControlFrame | undefined;\n\t\t\t\tlet completionScheduled = false;\n\t\t\t\tlet timeoutTimer: NodeJS.Timeout | undefined;\n\n\t\t\t\tconst settle = (finish: () => void): void => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tif (timeoutTimer) clearTimeout(timeoutTimer);\n\t\t\t\t\tif (signal) signal.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\tif (this.activeExec === active) this.activeExec = null;\n\t\t\t\t\tfinish();\n\t\t\t\t};\n\n\t\t\t\tconst emitPending = (upTo: number): void => {\n\t\t\t\t\tif (upTo <= 0) return;\n\t\t\t\t\tonData(pendingOutput.subarray(0, upTo));\n\t\t\t\t\tpendingOutput = pendingOutput.subarray(upTo);\n\t\t\t\t};\n\n\t\t\t\tconst capturedControl = (): string =>\n\t\t\t\t\tcontrolOverflow\n\t\t\t\t\t\t? `control frame exceeded ${MAX_CONTROL_FRAME_BYTES} bytes`\n\t\t\t\t\t\t: controlBuffer.toString(\"utf8\");\n\n\t\t\t\tconst failAndReset = (error: Error): void => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\temitPending(pendingOutput.length);\n\t\t\t\t\tthis.killChild();\n\t\t\t\t\tsettle(() => reject(error));\n\t\t\t\t};\n\n\t\t\t\tconst protocolFailure = (message: string): WindowsShellEngineFailure => {\n\t\t\t\t\tconst capturedOutput = capturedControl();\n\t\t\t\t\treturn new WindowsShellEngineFailure(`${message}\\n${capturedOutput}`, capturedOutput);\n\t\t\t\t};\n\n\t\t\t\tconst maybeComplete = (): void => {\n\t\t\t\t\tif (!sawOutputBarrier || !controlFrame || settled || completionScheduled) return;\n\t\t\t\t\tcompletionScheduled = true;\n\t\t\t\t\t// stdout and stderr are independent pipes. Keep this request active through the\n\t\t\t\t\t// next check phase so already-delivered post-barrier bytes are rejected here,\n\t\t\t\t\t// never forwarded into a queued request that starts in a promise microtask.\n\t\t\t\t\tsetImmediate(() => {\n\t\t\t\t\t\tif (settled || this.activeExec !== active || !controlFrame) return;\n\t\t\t\t\t\tapplyEngineFrame(state, controlFrame);\n\t\t\t\t\t\tif (controlFrame.unsupported) {\n\t\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\t\treject(new Error(controlFrame?.unsupported?.message ?? \"Unsupported shell construct\")),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsettle(() => resolve({ exitCode: controlFrame?.exitCode ?? null }));\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst onAbort = (): void => failAndReset(new Error(\"aborted\"));\n\n\t\t\t\tconst active: ActiveEngineExec = {\n\t\t\t\t\tonStdout: (data) => {\n\t\t\t\t\t\tif (sawOutputBarrier) {\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine emitted output after its terminal barrier.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpendingOutput = pendingOutput.length === 0 ? data : Buffer.concat([pendingOutput, data]);\n\t\t\t\t\t\tconst barrierIndex = pendingOutput.indexOf(outputBarrier);\n\t\t\t\t\t\tif (barrierIndex !== -1) {\n\t\t\t\t\t\t\temitPending(barrierIndex);\n\t\t\t\t\t\t\tpendingOutput = pendingOutput.subarray(outputBarrier.length);\n\t\t\t\t\t\t\tif (pendingOutput.length > 0) {\n\t\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine emitted bytes after its terminal barrier.\"));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsawOutputBarrier = true;\n\t\t\t\t\t\t\tmaybeComplete();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\temitPending(pendingOutput.length - (outputBarrier.length - 1));\n\t\t\t\t\t},\n\t\t\t\t\tonStderr: (data) => {\n\t\t\t\t\t\tif (controlOverflow) return;\n\t\t\t\t\t\tif (controlBuffer.length + data.length > MAX_CONTROL_FRAME_BYTES) {\n\t\t\t\t\t\t\tcontrolOverflow = true;\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine control frame overflowed.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontrolBuffer = controlBuffer.length === 0 ? data : Buffer.concat([controlBuffer, data]);\n\t\t\t\t\t\tconst parsed = parseControlFrame(controlBuffer);\n\t\t\t\t\t\tif (!parsed) return;\n\t\t\t\t\t\tif (parsed.kind === \"invalid\") {\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine returned a malformed control frame.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (parsed.frame.requestId !== requestId) {\n\t\t\t\t\t\t\tfailAndReset(\n\t\t\t\t\t\t\t\tprotocolFailure(\n\t\t\t\t\t\t\t\t\t`Windows shell engine returned stale control frame ${parsed.frame.requestId}; expected ${requestId}.`,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (controlBuffer.subarray(parsed.frameEnd).toString(\"utf8\").trim().length > 0) {\n\t\t\t\t\t\t\tfailAndReset(protocolFailure(\"Windows shell engine emitted trailing control bytes.\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontrolFrame = parsed.frame;\n\t\t\t\t\t\tmaybeComplete();\n\t\t\t\t\t},\n\t\t\t\t\tonChildClose: (code) => {\n\t\t\t\t\t\tconst capturedOutput = capturedControl();\n\t\t\t\t\t\temitPending(pendingOutput.length);\n\t\t\t\t\t\tsettle(() =>\n\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\tnew WindowsShellEngineFailure(\n\t\t\t\t\t\t\t\t\t`Windows shell engine coordinator exited (${code ?? \"null\"}) before a complete terminal handoff.\\n${capturedOutput}`,\n\t\t\t\t\t\t\t\t\tcapturedOutput,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tfail: (error) => failAndReset(error),\n\t\t\t\t};\n\n\t\t\t\tthis.activeExec = active;\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t\tif (signal.aborted) {\n\t\t\t\t\t\tonAbort();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutTimer = setTimeout(() => failAndReset(new Error(`timeout:${timeout}`)), timeoutMs);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tchild.stdin?.write(`${JSON.stringify(request)}\\n`, \"utf8\", (error) => {\n\t\t\t\t\t\tif (!error) return;\n\t\t\t\t\t\tfailAndReset(new Error(`Failed to write to Windows shell engine coordinator: ${error.message}`));\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tfailAndReset(new Error(`Failed to write to Windows shell engine coordinator: ${message}`));\n\t\t\t\t}\n\t\t\t});\n\t\t} finally {\n\t\t\tthis.coordinator.setLoopRef(false);\n\t\t}\n\t}\n\n\tprivate async ensureChild(env: NodeJS.ProcessEnv): Promise<ChildProcess> {\n\t\tif (this.coordinator.child) return this.coordinator.child;\n\t\tconst runtime = await this.resolveRuntime();\n\t\tif (runtime.status !== \"ready\") throw degradationError(runtime);\n\t\tif (this.disposed) throw new Error(`Windows shell engine session \"${this.key}\" is disposed`);\n\n\t\tconst child = this.spawn(runtime.pythonPath, [\"-B\", this.engineScriptPath, \"--server\"], {\n\t\t\tcwd: dirname(this.engineScriptPath),\n\t\t\tenv: {\n\t\t\t\t...env,\n\t\t\t\tPYTHONDONTWRITEBYTECODE: \"1\",\n\t\t\t\tPYTHONIOENCODING: \"utf-8\",\n\t\t\t\tPYTHONUNBUFFERED: \"1\",\n\t\t\t\tPYTHONUTF8: \"1\",\n\t\t\t},\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\twindowsHide: true,\n\t\t});\n\t\tthis.coordinator.attach(child, {\n\t\t\tonStdout: (data) => {\n\t\t\t\tconst active = this.activeExec;\n\t\t\t\tif (active) active.onStdout(data);\n\t\t\t\telse if (data.length > 0) this.killChild();\n\t\t\t},\n\t\t\tonStderr: (data) => {\n\t\t\t\tconst active = this.activeExec;\n\t\t\t\tif (active) active.onStderr(data);\n\t\t\t\telse if (data.length > 0) this.killChild();\n\t\t\t},\n\t\t\tonError: (error) => this.activeExec?.fail(error),\n\t\t\tonClose: (code) => this.activeExec?.onChildClose(code),\n\t\t});\n\t\treturn child;\n\t}\n\n\tprivate killChild(): void {\n\t\tthis.coordinator.kill();\n\t}\n}\n\nconst engineSessions = new Map<string, PersistentWindowsShellEngineSession>();\n\nfunction acquireWindowsShellEngineSession(\n\tkey: string,\n\toptions: WindowsShellEngineOptions,\n): PersistentWindowsShellEngineSession {\n\tconst existing = engineSessions.get(key);\n\tif (existing) return existing;\n\tconst session = new PersistentWindowsShellEngineSession(key, options);\n\tengineSessions.set(key, session);\n\treturn session;\n}\n\n/** Kill and forget a Python coordinator. The next call for this key starts a clean process. */\nexport function disposeWindowsShellEngineSession(key: string): Promise<void> {\n\tconst session = engineSessions.get(key);\n\tif (!session) return Promise.resolve();\n\tengineSessions.delete(key);\n\tsession.dispose();\n\treturn session.terminalPromise;\n}\n\n/** Create the Python-engine tier for one bash-tool session. */\nexport function createWindowsShellEngineOperations(\n\tsessionKey: string,\n\toptions: WindowsShellEngineOptions = {},\n): BashOperations {\n\treturn {\n\t\t// Resolve through the registry for every command. Session teardown (for example after\n\t\t// credential/environment changes) deletes only this tenant's entry; an already-built tool\n\t\t// then lazily acquires a fresh coordinator instead of retaining the disposed instance.\n\t\texec: (command, cwd, execOptions) =>\n\t\t\tacquireWindowsShellEngineSession(sessionKey, options).exec(command, cwd, execOptions),\n\t};\n}\n"]}