@humain/terminal 0.1.1 → 0.2.2

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 (197) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/bundle/chunks/{anthropic-messages-XULXUBIG.js → anthropic-messages-QFCEKGI3.js} +1 -1
  3. package/dist/bundle/chunks/{azure-openai-responses-JEG2XOYC.js → azure-openai-responses-G4ZMHV37.js} +1 -1
  4. package/dist/bundle/chunks/chunk-7T6XCLJF.js +22 -0
  5. package/dist/bundle/chunks/{chunk-LYAMSPR2.js → chunk-ADQYVZ6A.js} +483 -506
  6. package/dist/bundle/chunks/chunk-D6HHRSB5.js +103 -0
  7. package/dist/bundle/chunks/{chunk-JUPSJTFQ.js → chunk-K4JAZYQH.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-HPPQHK3J.js → chunk-KKIB2TVR.js} +1 -1
  9. package/dist/bundle/chunks/chunk-LI2YVPWP.js +2 -0
  10. package/dist/bundle/chunks/chunk-NMPIM7MN.js +2 -0
  11. package/dist/bundle/chunks/{chunk-BZQ53VGE.js → chunk-XSR434CO.js} +1 -1
  12. package/dist/bundle/chunks/compat-CN7WN6DA.js +2 -0
  13. package/dist/bundle/chunks/dist-PRPIUY3U.js +2 -0
  14. package/dist/bundle/chunks/esm-E7UVEYTO.js +4 -0
  15. package/dist/bundle/chunks/{extract-TRW5FBY6.js → extract-CTIFQZDJ.js} +15 -14
  16. package/dist/bundle/chunks/{google-generative-ai-OX6VSCA6.js → google-generative-ai-RSUU4MWO.js} +1 -1
  17. package/dist/bundle/chunks/{google-vertex-GW76GSS2.js → google-vertex-CKQPOITO.js} +1 -1
  18. package/dist/bundle/chunks/host-WP3MVKS2.js +2 -0
  19. package/dist/bundle/chunks/{node-KOIP55YZ.js → node-NF43OPII.js} +1 -1
  20. package/dist/bundle/chunks/{node-XY3CBY3C.js → node-UMFM7CDZ.js} +1 -1
  21. package/dist/bundle/chunks/{openai-codex-responses-NPLWP6ZC.js → openai-codex-responses-S34V5ZSD.js} +1 -1
  22. package/dist/bundle/chunks/{openai-completions-OT2GTJKC.js → openai-completions-T2IGVUEI.js} +1 -1
  23. package/dist/bundle/chunks/{openai-responses-5A6CR7GI.js → openai-responses-GYZODCT3.js} +1 -1
  24. package/dist/bundle/chunks/readability-LAGF34IB.js +3 -0
  25. package/dist/bundle/chunks/turndown.cjs-HRMZVRUL.js +2 -0
  26. package/dist/bundle/cli.js +1 -1
  27. package/dist/bundle/index.js +1 -1
  28. package/dist/bundle/rpc-entry.js +1 -1
  29. package/dist/core/model-runtime.d.ts +21 -0
  30. package/dist/core/model-runtime.d.ts.map +1 -1
  31. package/dist/core/model-runtime.js +34 -4
  32. package/dist/core/model-runtime.js.map +1 -1
  33. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  34. package/dist/core/tools/file-mutation-queue.js +21 -8
  35. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  36. package/dist/core/tools/subagent-env.d.ts +20 -0
  37. package/dist/core/tools/subagent-env.d.ts.map +1 -0
  38. package/dist/core/tools/subagent-env.js +47 -0
  39. package/dist/core/tools/subagent-env.js.map +1 -0
  40. package/dist/core/tools/subagent-scheduler.d.ts +36 -0
  41. package/dist/core/tools/subagent-scheduler.d.ts.map +1 -0
  42. package/dist/core/tools/subagent-scheduler.js +213 -0
  43. package/dist/core/tools/subagent-scheduler.js.map +1 -0
  44. package/dist/core/tools/subagent.d.ts +83 -3
  45. package/dist/core/tools/subagent.d.ts.map +1 -1
  46. package/dist/core/tools/subagent.js +215 -76
  47. package/dist/core/tools/subagent.js.map +1 -1
  48. package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
  49. package/dist/humain/mcp-adapter/vendor/README.md +125 -19
  50. package/dist/humain/mcp-adapter/vendor/agent-plugin-loader.ts +69 -30
  51. package/dist/humain/mcp-adapter/vendor/agent-plugin-provenance.ts +36 -0
  52. package/dist/humain/mcp-adapter/vendor/claude-plugin-loader.ts +365 -0
  53. package/dist/humain/mcp-adapter/vendor/commands.ts +13 -15
  54. package/dist/humain/mcp-adapter/vendor/config.ts +198 -30
  55. package/dist/humain/mcp-adapter/vendor/consent-manager.ts +40 -9
  56. package/dist/humain/mcp-adapter/vendor/direct-tool-surface.ts +250 -0
  57. package/dist/humain/mcp-adapter/vendor/direct-tools.ts +9 -228
  58. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js +74 -32
  59. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-loader.js.map +1 -1
  60. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.d.ts +1 -0
  61. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js +31 -0
  62. package/dist/humain/mcp-adapter/vendor/dist/agent-plugin-provenance.js.map +1 -0
  63. package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.d.ts +9 -0
  64. package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js +362 -0
  65. package/dist/humain/mcp-adapter/vendor/dist/claude-plugin-loader.js.map +1 -0
  66. package/dist/humain/mcp-adapter/vendor/dist/config.d.ts +3 -1
  67. package/dist/humain/mcp-adapter/vendor/dist/config.js +189 -27
  68. package/dist/humain/mcp-adapter/vendor/dist/config.js.map +1 -1
  69. package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js +7 -16
  70. package/dist/humain/mcp-adapter/vendor/dist/metadata-cache.js.map +1 -1
  71. package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js +5 -17
  72. package/dist/humain/mcp-adapter/vendor/dist/package-mcp-loader.js.map +1 -1
  73. package/dist/humain/mcp-adapter/vendor/dist/types.d.ts +30 -4
  74. package/dist/humain/mcp-adapter/vendor/dist/types.js +26 -0
  75. package/dist/humain/mcp-adapter/vendor/dist/types.js.map +1 -1
  76. package/dist/humain/mcp-adapter/vendor/dist/utils.d.ts +6 -0
  77. package/dist/humain/mcp-adapter/vendor/dist/utils.js +65 -6
  78. package/dist/humain/mcp-adapter/vendor/dist/utils.js.map +1 -1
  79. package/dist/humain/mcp-adapter/vendor/host-html-template.ts +20 -19
  80. package/dist/humain/mcp-adapter/vendor/http-ca.ts +84 -0
  81. package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +37102 -15103
  82. package/dist/humain/mcp-adapter/vendor/index.ts +828 -164
  83. package/dist/humain/mcp-adapter/vendor/init.ts +48 -10
  84. package/dist/humain/mcp-adapter/vendor/lazy-loader.ts +7 -0
  85. package/dist/humain/mcp-adapter/vendor/mcp-auth-fetch.ts +113 -0
  86. package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +256 -77
  87. package/dist/humain/mcp-adapter/vendor/mcp-auth.ts +316 -54
  88. package/dist/humain/mcp-adapter/vendor/mcp-code.ts +45 -18
  89. package/dist/humain/mcp-adapter/vendor/mcp-install.ts +60 -0
  90. package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +70 -6
  91. package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +53 -42
  92. package/dist/humain/mcp-adapter/vendor/mcp-panel-theme.ts +105 -0
  93. package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +366 -331
  94. package/dist/humain/mcp-adapter/vendor/mcp-references.ts +9 -14
  95. package/dist/humain/mcp-adapter/vendor/mcp-script-worker.mjs +3 -1
  96. package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +383 -341
  97. package/dist/humain/mcp-adapter/vendor/mcp-status.ts +5 -0
  98. package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +7 -16
  99. package/dist/humain/mcp-adapter/vendor/namespace-tools.ts +61 -3
  100. package/dist/humain/mcp-adapter/vendor/oauth.ts +6 -2
  101. package/dist/humain/mcp-adapter/vendor/package-mcp-loader.ts +5 -17
  102. package/dist/humain/mcp-adapter/vendor/package.json +13 -3
  103. package/dist/humain/mcp-adapter/vendor/prompts.ts +35 -3
  104. package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +108 -7
  105. package/dist/humain/mcp-adapter/vendor/runtime-owner.ts +16 -1
  106. package/dist/humain/mcp-adapter/vendor/sampling-handler.ts +9 -32
  107. package/dist/humain/mcp-adapter/vendor/sandbox-proxy-template.ts +20 -93
  108. package/dist/humain/mcp-adapter/vendor/server-manager.ts +227 -40
  109. package/dist/humain/mcp-adapter/vendor/session-approvals.ts +187 -0
  110. package/dist/humain/mcp-adapter/vendor/skills/mcp-scripting/SKILL.md +9 -1
  111. package/dist/humain/mcp-adapter/vendor/state.ts +10 -1
  112. package/dist/humain/mcp-adapter/vendor/tool-approval.ts +10 -22
  113. package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +14 -0
  114. package/dist/humain/mcp-adapter/vendor/types.ts +57 -4
  115. package/dist/humain/mcp-adapter/vendor/ui-server.ts +36 -28
  116. package/dist/humain/mcp-adapter/vendor/utils.ts +64 -6
  117. package/dist/humain/web-access/vendor/abortable.d.ts +3 -0
  118. package/dist/humain/web-access/vendor/abortable.d.ts.map +1 -0
  119. package/dist/humain/web-access/vendor/abortable.js +22 -0
  120. package/dist/humain/web-access/vendor/abortable.js.map +1 -0
  121. package/dist/humain/web-access/vendor/crawl4ai.d.ts +9 -0
  122. package/dist/humain/web-access/vendor/crawl4ai.d.ts.map +1 -0
  123. package/dist/humain/web-access/vendor/crawl4ai.js +187 -0
  124. package/dist/humain/web-access/vendor/crawl4ai.js.map +1 -0
  125. package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
  126. package/dist/humain/web-access/vendor/credential-source.js +1 -0
  127. package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
  128. package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
  129. package/dist/humain/web-access/vendor/curator-page.js +20 -2
  130. package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
  131. package/dist/humain/web-access/vendor/curator-run.d.ts +11 -0
  132. package/dist/humain/web-access/vendor/curator-run.d.ts.map +1 -0
  133. package/dist/humain/web-access/vendor/curator-run.js +38 -0
  134. package/dist/humain/web-access/vendor/curator-run.js.map +1 -0
  135. package/dist/humain/web-access/vendor/curator-server.d.ts +1 -0
  136. package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
  137. package/dist/humain/web-access/vendor/curator-server.js +2 -0
  138. package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
  139. package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
  140. package/dist/humain/web-access/vendor/duckduckgo.js +1 -1
  141. package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
  142. package/dist/humain/web-access/vendor/extract.d.ts +1 -1
  143. package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
  144. package/dist/humain/web-access/vendor/extract.js +58 -11
  145. package/dist/humain/web-access/vendor/extract.js.map +1 -1
  146. package/dist/humain/web-access/vendor/fetch-params.js +1 -1
  147. package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
  148. package/dist/humain/web-access/vendor/gemini-search.d.ts +2 -2
  149. package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
  150. package/dist/humain/web-access/vendor/gemini-search.js +12 -5
  151. package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
  152. package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
  153. package/dist/humain/web-access/vendor/index.js +23 -19
  154. package/dist/humain/web-access/vendor/index.js.map +1 -1
  155. package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
  156. package/dist/humain/web-access/vendor/openai-search.js +40 -14
  157. package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
  158. package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
  159. package/dist/humain/web-access/vendor/page-query.js +6 -2
  160. package/dist/humain/web-access/vendor/page-query.js.map +1 -1
  161. package/dist/humain/web-access/vendor/query-rewrite.d.ts.map +1 -1
  162. package/dist/humain/web-access/vendor/query-rewrite.js +6 -2
  163. package/dist/humain/web-access/vendor/query-rewrite.js.map +1 -1
  164. package/dist/humain/web-access/vendor/serpapi.d.ts +4 -0
  165. package/dist/humain/web-access/vendor/serpapi.d.ts.map +1 -0
  166. package/dist/humain/web-access/vendor/serpapi.js +215 -0
  167. package/dist/humain/web-access/vendor/serpapi.js.map +1 -0
  168. package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -1
  169. package/dist/humain/web-access/vendor/ssrf-protection.js +5 -1
  170. package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
  171. package/dist/humain/web-access/vendor/storage.d.ts.map +1 -1
  172. package/dist/humain/web-access/vendor/storage.js +9 -0
  173. package/dist/humain/web-access/vendor/storage.js.map +1 -1
  174. package/dist/humain/web-access/vendor/summary-review.d.ts +1 -1
  175. package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
  176. package/dist/humain/web-access/vendor/summary-review.js +35 -24
  177. package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
  178. package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
  179. package/dist/humain/web-access/vendor/utils.js +5 -3
  180. package/dist/humain/web-access/vendor/utils.js.map +1 -1
  181. package/dist/modes/json-event.d.ts +8 -0
  182. package/dist/modes/json-event.d.ts.map +1 -1
  183. package/dist/modes/json-event.js +17 -0
  184. package/dist/modes/json-event.js.map +1 -1
  185. package/dist/modes/print-mode.d.ts.map +1 -1
  186. package/dist/modes/print-mode.js +3 -2
  187. package/dist/modes/print-mode.js.map +1 -1
  188. package/docs/environment-variables.md +9 -0
  189. package/docs/json.md +16 -0
  190. package/npm-shrinkwrap.json +6 -6
  191. package/package.json +2 -2
  192. package/src/humain/mcp-adapter/UPSTREAM.md +56 -7
  193. package/src/humain/mcp-adapter/upstream.json +6 -4
  194. package/src/humain/mcp-adapter/vendor/CHANGELOG.md +78 -0
  195. package/src/humain/web-access/UPSTREAM.md +18 -8
  196. package/src/humain/web-access/upstream.json +6 -5
  197. package/dist/bundle/chunks/chunk-2LC3S3VV.js +0 -105
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { hostname, tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nexport function getWebSearchConfigDir(): string {\n\treturn getAgentDir();\n}\n\nexport function getWebSearchConfigPath(): string {\n\treturn join(getWebSearchConfigDir(), \"web-search.json\");\n}\n\ninterface ApiBaseUrlOptions {\n\tconfigKey: string;\n\tconfiguredValue: unknown;\n\tdefaultValue: string;\n\tenvironmentKey: string;\n\tenvironmentValue: string | undefined;\n}\n\nexport function resolveApiBaseUrl(options: ApiBaseUrlOptions): string {\n\tconst fromEnvironment = options.environmentValue !== undefined;\n\tconst value = fromEnvironment ? options.environmentValue : options.configuredValue;\n\tif (value === undefined) return options.defaultValue;\n\n\tconst source = fromEnvironment\n\t\t? options.environmentKey\n\t\t: `${options.configKey} in ${getWebSearchConfigPath()}`;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value.trim());\n\t} catch {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\tif (url.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must be an absolute HTTPS URL`);\n\t}\n\tif (url.username || url.password) {\n\t\tthrow new Error(`${source} must not include credentials`);\n\t}\n\tif (url.search || url.hash) {\n\t\tthrow new Error(`${source} must not include query parameters or fragments`);\n\t}\n\n\turl.search = \"\";\n\turl.hash = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/, \"\");\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nconst API_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst API_REQUEST_BODY_HEADERS = [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"];\nconst MAX_API_REDIRECTS = 5;\n\nexport async function fetchWithCredentialRedirects(\n\turl: string,\n\tinit: RequestInit,\n\tcredentialHeaders: readonly string[],\n): Promise<Response> {\n\tlet current = new URL(url);\n\tlet requestInit = init;\n\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetch(current, { ...requestInit, redirect: \"manual\" });\n\t\tif (!API_REDIRECT_STATUSES.has(response.status)) return response;\n\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location) return response;\n\t\tif (redirects === MAX_API_REDIRECTS) {\n\t\t\tthrow new Error(`Too many API redirects from ${url}`);\n\t\t}\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n\t\t\tthrow new Error(`API redirect from ${current.origin} must use HTTP(S)`);\n\t\t}\n\t\tconst method = requestInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (\n\t\t\t((response.status === 301 || response.status === 302) && method === \"POST\")\n\t\t\t|| (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")\n\t\t) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of API_REQUEST_BODY_HEADERS) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = requestInit;\n\t\t\trequestInit = { ...withoutBody, method: \"GET\", headers };\n\t\t}\n\t\tif (next.origin !== current.origin) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of credentialHeaders) headers.delete(name);\n\t\t\trequestInit = { ...requestInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t}\n}\n\nexport interface CuratorNetworkConfig {\n\t/** Whether remote access was opted into via curatorRemote. */\n\tenabled: boolean;\n\thost: string;\n\tbind: string;\n}\n\nconst LOCAL_CURATOR_NETWORK_DEFAULTS: CuratorNetworkConfig = { enabled: false, host: \"localhost\", bind: \"127.0.0.1\" };\n\nfunction trimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Resolves the curator server bind address and URL host from `curatorRemote`. */\nexport function resolveCuratorNetworkConfig(): CuratorNetworkConfig {\n\tconst configPath = getWebSearchConfigPath();\n\tif (!existsSync(configPath)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tlet raw: unknown;\n\ttry {\n\t\traw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n\t} catch {\n\t\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n\t}\n\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tconst curatorRemote = (raw as Record<string, unknown>).curatorRemote;\n\tif (curatorRemote === true) return { enabled: true, host: hostname(), bind: \"0.0.0.0\" };\n\n\tif (curatorRemote && typeof curatorRemote === \"object\" && !Array.isArray(curatorRemote)) {\n\t\tconst obj = curatorRemote as Record<string, unknown>;\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\thost: trimmedString(obj.host) ?? hostname(),\n\t\t\tbind: trimmedString(obj.bind) ?? \"0.0.0.0\",\n\t\t};\n\t}\n\n\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n}\n\nexport function formatSeconds(s: number): string {\n\tconst h = Math.floor(s / 3600);\n\tconst m = Math.floor((s % 3600) / 60);\n\tconst sec = s % 60;\n\tif (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(sec).padStart(2, \"0\")}`;\n\treturn `${m}:${String(sec).padStart(2, \"0\")}`;\n}\n\nexport function readExecError(err: unknown): { code?: string; stderr: string; message: string } {\n\tif (!err || typeof err !== \"object\") {\n\t\treturn { stderr: \"\", message: String(err) };\n\t}\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\tconst stderrRaw = (err as { stderr?: Buffer | string }).stderr;\n\tconst stderr = Buffer.isBuffer(stderrRaw)\n\t\t? stderrRaw.toString(\"utf-8\")\n\t\t: typeof stderrRaw === \"string\"\n\t\t\t? stderrRaw\n\t\t\t: \"\";\n\treturn { code, stderr, message };\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tif ((err as { killed?: boolean }).killed) return true;\n\tconst name = (err as { name?: string }).name;\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\treturn name === \"AbortError\" || code === \"ETIMEDOUT\" || message.toLowerCase().includes(\"timed out\");\n}\n\nexport function trimErrorText(text: string): string {\n\treturn text.replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nexport function mapFfmpegError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffmpeg is not installed. Install with: brew install ffmpeg\";\n\tif (isTimeoutError(err)) return \"ffmpeg timed out extracting frame\";\n\tif (stderr.includes(\"403\")) return \"Stream URL returned 403 — may have expired, try again\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffmpeg failed: ${snippet}` : \"ffmpeg failed\";\n}\n\nconst proxyStorage = new AsyncLocalStorage<string | null>();\n\nexport function normalizeProxyUrl(value: unknown, source: string): string | null {\n\tif (value === undefined || value === null) return null;\n\tif (typeof value !== \"string\") throw new Error(`${source} must be an http(s) proxy URL string`);\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(trimmed);\n\t} catch {\n\t\tthrow new Error(`${source} must be a valid proxy URL: ${JSON.stringify(trimmed)}`);\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must use the http:// or https:// scheme: ${trimmed}`);\n\t}\n\tif (!parsed.hostname) throw new Error(`${source} must include a proxy host: ${trimmed}`);\n\tparsed.hash = \"\";\n\tparsed.search = \"\";\n\treturn parsed.toString();\n}\n\nfunction redactProxyUrl(value: string): string {\n\tconst parsed = new URL(value);\n\tif (parsed.username) parsed.username = \"redacted\";\n\tif (parsed.password) parsed.password = \"redacted\";\n\treturn parsed.toString();\n}\n\nfunction loadConfiguredProxy(): string | null {\n\tlet configured: unknown;\n\tconst path = getWebSearchConfigPath();\n\tif (existsSync(path)) {\n\t\tlet raw: unknown;\n\t\ttry {\n\t\t\traw = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`Failed to load proxy config from ${path}: ${message}`);\n\t\t}\n\t\tif (raw && typeof raw === \"object\" && !Array.isArray(raw)) configured = (raw as { proxy?: unknown }).proxy;\n\t}\n\tif (configured === undefined) return null;\n\treturn normalizeProxyUrl(configured, `proxy in ${getWebSearchConfigPath()}`);\n}\n\nexport function runWithProxy<T>(proxy: string | undefined, fn: () => T): T {\n\tconst normalized = proxy === undefined\n\t\t? loadConfiguredProxy()\n\t\t: normalizeProxyUrl(proxy, \"proxy\");\n\treturn proxyStorage.run(normalized, fn);\n}\n\nexport function getActiveProxy(): string | null {\n\treturn proxyStorage.getStore() ?? null;\n}\n\nexport function hasScopedProxyDecision(): boolean {\n\treturn proxyStorage.getStore() !== undefined;\n}\n\nfunction noProxyEntryMatches(hostname: string, entry: string): boolean {\n\tif (!entry) return false;\n\tif (entry === \"*\") return true;\n\tlet host = entry;\n\tif (host.startsWith(\"[\")) {\n\t\tconst close = host.indexOf(\"]\");\n\t\tif (close > 0) host = host.slice(0, close + 1);\n\t} else {\n\t\tconst colon = host.lastIndexOf(\":\");\n\t\tif (colon > -1 && /^\\d+$/.test(host.slice(colon + 1))) host = host.slice(0, colon);\n\t}\n\thost = host.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (!host) return false;\n\treturn hostname === host || hostname.endsWith(host.startsWith(\".\") ? host : `.${host}`);\n}\n\n/** True when a URL must NOT be sent through the active proxy. */\nexport function isProxyBypassedUrl(url: URL): boolean {\n\tconst hostname = url.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (hostname === \"localhost\" || hostname.endsWith(\".localhost\") || hostname === \"127.0.0.1\" || hostname === \"::1\") return true;\n\tconst noProxy = process.env.NO_PROXY || process.env.no_proxy;\n\tif (noProxy && noProxy.split(\",\").some((entry) => noProxyEntryMatches(hostname, entry.trim()))) return true;\n\treturn false;\n}\n\nexport interface ProxiedRequestInit extends RequestInit {\n\t/** Caller-supplied proxy; bypasses AsyncLocalStorage for pLimit-safe contexts. */\n\t__proxy?: string;\n}\n\ninterface ProxiedFetch {\n\t(input: RequestInfo | URL, init?: ProxiedRequestInit): Promise<Response>;\n\t__piWebAccessProxyFetch?: boolean;\n}\n\n/** Wraps globalThis.fetch so every http(s) call routes through curl while a proxy is active. Idempotent. */\nexport function installGlobalProxyFetch(): void {\n\tconst current = globalThis.fetch as ProxiedFetch;\n\tif (typeof current !== \"function\" || current.__piWebAccessProxyFetch === true) return;\n\tconst nativeFetch = current;\n\tconst wrapped: ProxiedFetch = ((input: RequestInfo | URL, init?: ProxiedRequestInit) => {\n\t\t// Explicitly attached proxies survive pLimit context loss. Otherwise only\n\t\t// web-access calls inside runWithProxy may use the configured proxy.\n\t\tconst proxy = init?.__proxy ?? (hasScopedProxyDecision() ? getActiveProxy() : null);\n\t\tif (!proxy) return nativeFetch(input, init);\n\t\tlet url: URL | null = null;\n\t\ttry {\n\t\t\turl = new URL(typeof input === \"string\" || input instanceof URL ? input : input.url);\n\t\t} catch {\n\t\t\turl = null;\n\t\t}\n\t\tif (!url || (url.protocol !== \"http:\" && url.protocol !== \"https:\") || isProxyBypassedUrl(url)) {\n\t\t\treturn nativeFetch(input, init);\n\t\t}\n\t\treturn fetchViaCurl(url, init ?? {}, proxy);\n\t});\n\twrapped.__piWebAccessProxyFetch = true;\n\tglobalThis.fetch = wrapped;\n}\n\nfunction parseHeaderDump(dump: string): { status: number; statusText: string; headers: Array<[string, string]> } {\n\tconst blocks = dump.split(/\\r?\\n\\r?\\n/).filter((block) => /^HTTP\\/[\\d.]+\\s+\\d{3}/.test(block.trim()));\n\tconst block = (blocks.length > 0 ? blocks[blocks.length - 1] : \"\").trim();\n\tconst lines = block.split(/\\r?\\n/);\n\tlet status = 0;\n\tlet statusText = \"\";\n\tconst headers: Array<[string, string]> = [];\n\tfor (const line of lines) {\n\t\tconst match = /^HTTP\\/[\\d.]+\\s+(\\d{3})(?:\\s+(.*))?$/.exec(line.trim());\n\t\tif (match) {\n\t\t\tstatus = Number(match[1]);\n\t\t\tstatusText = match[2] ?? \"\";\n\t\t\theaders.length = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst separator = line.indexOf(\":\");\n\t\tif (separator > 0) {\n\t\t\tconst name = line.slice(0, separator).trim();\n\t\t\tif (name.toLowerCase() === \"content-encoding\" || name.toLowerCase() === \"content-length\") continue;\n\t\t\theaders.push([name, line.slice(separator + 1).trim()]);\n\t\t}\n\t}\n\treturn { status, statusText, headers };\n}\n\nclass CurlTransportError extends Error {}\n\nfunction quoteCurlConfigValue(value: string, label: string): string {\n\tif (/[\\0-\\x08\\x0c\\x0e-\\x1f\\x7f]/.test(value)) {\n\t\tthrow new Error(`${label} contains unsupported control characters`);\n\t}\n\treturn `\"${value\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\"/g, '\\\\\"')\n\t\t.replace(/\\t/g, \"\\\\t\")\n\t\t.replace(/\\n/g, \"\\\\n\")\n\t\t.replace(/\\r/g, \"\\\\r\")\n\t\t.replace(/\\v/g, \"\\\\v\")}\"`;\n}\n\nfunction curlConfigOption(name: string, value?: string, label = name): string {\n\treturn value === undefined ? name : `${name} = ${quoteCurlConfigValue(value, label)}`;\n}\n\nasync function fetchViaCurl(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tlet current = url;\n\tlet currentInit = init;\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetchViaCurlOnce(current, currentInit, proxyUrl);\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location || ![301, 302, 303, 307, 308].includes(response.status)) {\n\t\t\tif (redirects > 0) Object.defineProperty(response, \"redirected\", { value: true, configurable: true });\n\t\t\treturn response;\n\t\t}\n\t\tif (currentInit.redirect === \"manual\") return response;\n\t\tif (currentInit.redirect === \"error\") throw new TypeError(`Proxy fetch redirect blocked from ${current.toString()}`);\n\t\tif (redirects === 20) throw new Error(`Too many proxy redirects from ${url.toString()}`);\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") throw new Error(`Proxy redirect from ${current.origin} must use HTTP(S)`);\n\n\t\tlet headers = new Headers(currentInit.headers);\n\t\tlet nextInit: RequestInit;\n\t\tconst method = currentInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (((response.status === 301 || response.status === 302) && method === \"POST\") || (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")) {\n\t\t\tfor (const name of [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"]) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = currentInit;\n\t\t\tnextInit = { ...withoutBody, method: \"GET\", headers };\n\t\t} else {\n\t\t\tnextInit = { ...currentInit, headers };\n\t\t}\n\n\t\tif (next.origin !== current.origin) {\n\t\t\theaders = new Headers();\n\t\t\tnextInit = { ...nextInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t\tcurrentInit = nextInit;\n\t}\n}\n\nasync function fetchViaCurlOnce(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tconst method = (init.method ?? \"GET\").toUpperCase();\n\tconst headers = new Headers(init.headers);\n\n\tconst dir = await mkdtemp(join(tmpdir(), \"pi-web-access-proxy-\"));\n\tconst headerFile = join(dir, \"headers\");\n\tconst bodyFile = join(dir, \"body\");\n\tconst requestBodyFile = join(dir, \"request-body\");\n\n\tconst config: string[] = [\n\t\tcurlConfigOption(\"silent\"),\n\t\tcurlConfigOption(\"show-error\"),\n\t\tcurlConfigOption(\"compressed\"),\n\t\tcurlConfigOption(\"connect-timeout\", \"20\"),\n\t\tcurlConfigOption(\"proxy\", proxyUrl, \"proxy URL\"),\n\t\tcurlConfigOption(\"dump-header\", headerFile),\n\t\tcurlConfigOption(\"output\", bodyFile),\n\t\tcurlConfigOption(\"write-out\", \"%{json}\"),\n\t];\n\n\tif (method !== \"GET\" && method !== \"HEAD\") config.push(curlConfigOption(\"request\", method));\n\n\tfor (const [name, value] of headers.entries()) {\n\t\tif (value === \"\") continue;\n\t\tconfig.push(curlConfigOption(\"header\", `${name}: ${value}`, `header ${name}`));\n\t}\n\n\tconst body = init.body;\n\tif (body !== undefined && body !== null) {\n\t\tlet buffer: Buffer;\n\t\tif (typeof body === \"string\") buffer = Buffer.from(body, \"utf-8\");\n\t\telse if (body instanceof URLSearchParams) buffer = Buffer.from(body.toString(), \"utf-8\");\n\t\telse if (body instanceof ArrayBuffer) buffer = Buffer.from(body);\n\t\telse if (ArrayBuffer.isView(body)) buffer = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t\telse throw new Error(`Unsupported request body type for proxy fetch: ${typeof body}`);\n\t\tawait writeFile(requestBodyFile, buffer, { mode: 0o600 });\n\t\tconfig.push(curlConfigOption(\"data-binary\", `@${requestBodyFile}`));\n\t\tif (method === \"GET\") config.push(curlConfigOption(\"request\", \"GET\"));\n\t}\n\n\tconfig.push(curlConfigOption(\"url\", url.toString(), \"request URL\"));\n\tconst configInput = `${config.join(\"\\n\")}\\n`;\n\n\tconst signal = init.signal ?? null;\n\tlet stdout: string;\n\ttry {\n\t\tstdout = await new Promise<string>((resolve, reject) => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\treject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst child = spawn(\"curl\", [\"--config\", \"-\"], { windowsHide: true, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\t\tlet out = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tconst onAbort = () => { try { child.kill(); } catch {} };\n\t\t\tif (signal) {\n\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t}\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => { out += chunk.toString(\"utf-8\"); });\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => { if (stderr.length < 4096) stderr += chunk.toString(\"utf-8\"); });\n\t\t\tchild.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(new CurlTransportError(err.code === \"ENOENT\"\n\t\t\t\t\t? \"curl executable not found on PATH; proxy transport requires curl\"\n\t\t\t\t\t: `curl failed to start: ${err.message}`));\n\t\t\t});\n\t\t\tchild.once(\"close\", (code) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tif (signal?.aborted) return reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\tif (code !== 0 && !out.trim()) {\n\t\t\t\t\treturn reject(new CurlTransportError(`curl exited with code ${code ?? \"unknown\"} via ${redactProxyUrl(proxyUrl)}${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`));\n\t\t\t\t}\n\t\t\t\tresolve(out);\n\t\t\t});\n\t\t\tif (!child.stdin) {\n\t\t\t\tchild.kill();\n\t\t\t\treject(new CurlTransportError(\"curl stdin unavailable for protected proxy configuration\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchild.stdin.on(\"error\", (err) => reject(new CurlTransportError(`curl stdin failed: ${err.message}`)));\n\t\t\tchild.stdin.end(configInput);\n\t\t});\n\t} catch (err) {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t\tif (err instanceof CurlTransportError) throw new Error(err.message);\n\t\tthrow err;\n\t}\n\n\tlet bodyBuffer = Buffer.alloc(0);\n\tlet dump = \"\";\n\ttry {\n\t\t[dump, bodyBuffer] = await Promise.all([readFile(headerFile, \"utf-8\"), readFile(bodyFile)]);\n\t} catch {\n\t\t// HEAD or empty responses may not produce output files.\n\t} finally {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t}\n\n\tconst { status, statusText, headers: responseHeaders } = parseHeaderDump(dump);\n\tif (status === 0) {\n\t\tthrow new Error(`Proxy fetch to ${url.toString()} via ${redactProxyUrl(proxyUrl)} returned no HTTP status`);\n\t}\n\n\tlet finalUrl = url.toString();\n\tlet redirected = false;\n\ttry {\n\t\tconst trimmed = stdout.trim();\n\t\tif (trimmed.startsWith(\"{\")) {\n\t\t\tconst writeOut = JSON.parse(trimmed) as { url_effective?: string; num_redirects?: number };\n\t\t\tif (writeOut.url_effective) finalUrl = writeOut.url_effective;\n\t\t\tredirected = (writeOut.num_redirects ?? 0) > 0;\n\t\t}\n\t} catch {\n\t\t// Older curl without %{json}; the header dump already provided the status.\n\t}\n\n\tconst nullBody = status === 204 || status === 205 || status === 304;\n\tconst response = new Response(nullBody ? null : new Uint8Array(bodyBuffer), {\n\t\tstatus,\n\t\tstatusText: statusText || undefined,\n\t\theaders: new Headers(responseHeaders),\n\t});\n\tObject.defineProperty(response, \"url\", { value: finalUrl, configurable: true });\n\tObject.defineProperty(response, \"redirected\", { value: redirected, configurable: true });\n\treturn response;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { mkdtemp, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { hostname, tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nexport function getWebSearchConfigDir(): string {\n\treturn getAgentDir();\n}\n\nexport function getWebSearchConfigPath(): string {\n\treturn join(getWebSearchConfigDir(), \"web-search.json\");\n}\n\ninterface ApiBaseUrlOptions {\n\tconfigKey: string;\n\tconfiguredValue: unknown;\n\tdefaultValue: string;\n\tenvironmentKey: string;\n\tenvironmentValue: string | undefined;\n}\n\nexport function resolveApiBaseUrl(options: ApiBaseUrlOptions): string {\n\tconst fromEnvironment = options.environmentValue !== undefined;\n\tconst value = fromEnvironment ? options.environmentValue : options.configuredValue;\n\tif (value === undefined) return options.defaultValue;\n\n\tconst source = fromEnvironment\n\t\t? options.environmentKey\n\t\t: `${options.configKey} in ${getWebSearchConfigPath()}`;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value.trim());\n\t} catch {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\tif (url.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must be an absolute HTTPS URL`);\n\t}\n\tif (url.username || url.password) {\n\t\tthrow new Error(`${source} must not include credentials`);\n\t}\n\tif (url.search || url.hash) {\n\t\tthrow new Error(`${source} must not include query parameters or fragments`);\n\t}\n\n\turl.search = \"\";\n\turl.hash = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/, \"\");\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nconst API_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst API_REQUEST_BODY_HEADERS = [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"];\nconst MAX_API_REDIRECTS = 5;\n\nexport async function fetchWithCredentialRedirects(\n\turl: string,\n\tinit: RequestInit,\n\tcredentialHeaders: readonly string[],\n): Promise<Response> {\n\tlet current = new URL(url);\n\tlet requestInit = init;\n\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetch(current, { ...requestInit, redirect: \"manual\" });\n\t\tif (!API_REDIRECT_STATUSES.has(response.status)) return response;\n\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location) return response;\n\t\tif (redirects === MAX_API_REDIRECTS) {\n\t\t\tthrow new Error(`Too many API redirects from ${url}`);\n\t\t}\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n\t\t\tthrow new Error(`API redirect from ${current.origin} must use HTTP(S)`);\n\t\t}\n\t\tconst method = requestInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (\n\t\t\t((response.status === 301 || response.status === 302) && method === \"POST\")\n\t\t\t|| (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")\n\t\t) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of API_REQUEST_BODY_HEADERS) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = requestInit;\n\t\t\trequestInit = { ...withoutBody, method: \"GET\", headers };\n\t\t}\n\t\tif (next.origin !== current.origin) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of credentialHeaders) headers.delete(name);\n\t\t\trequestInit = { ...requestInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t}\n}\n\nexport interface CuratorNetworkConfig {\n\t/** Whether remote access was opted into via curatorRemote. */\n\tenabled: boolean;\n\thost: string;\n\tbind: string;\n}\n\nconst LOCAL_CURATOR_NETWORK_DEFAULTS: CuratorNetworkConfig = { enabled: false, host: \"localhost\", bind: \"127.0.0.1\" };\n\nfunction trimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Resolves the curator server bind address and URL host from `curatorRemote`. */\nexport function resolveCuratorNetworkConfig(): CuratorNetworkConfig {\n\tconst configPath = getWebSearchConfigPath();\n\tif (!existsSync(configPath)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tlet raw: unknown;\n\ttry {\n\t\traw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n\t} catch {\n\t\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n\t}\n\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tconst curatorRemote = (raw as Record<string, unknown>).curatorRemote;\n\tif (curatorRemote === true) return { enabled: true, host: hostname(), bind: \"0.0.0.0\" };\n\n\tif (curatorRemote && typeof curatorRemote === \"object\" && !Array.isArray(curatorRemote)) {\n\t\tconst obj = curatorRemote as Record<string, unknown>;\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\thost: trimmedString(obj.host) ?? hostname(),\n\t\t\tbind: trimmedString(obj.bind) ?? \"0.0.0.0\",\n\t\t};\n\t}\n\n\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n}\n\nexport function formatSeconds(s: number): string {\n\tconst h = Math.floor(s / 3600);\n\tconst m = Math.floor((s % 3600) / 60);\n\tconst sec = s % 60;\n\tif (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(sec).padStart(2, \"0\")}`;\n\treturn `${m}:${String(sec).padStart(2, \"0\")}`;\n}\n\nexport function readExecError(err: unknown): { code?: string; stderr: string; message: string } {\n\tif (!err || typeof err !== \"object\") {\n\t\treturn { stderr: \"\", message: String(err) };\n\t}\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\tconst stderrRaw = (err as { stderr?: Buffer | string }).stderr;\n\tconst stderr = Buffer.isBuffer(stderrRaw)\n\t\t? stderrRaw.toString(\"utf-8\")\n\t\t: typeof stderrRaw === \"string\"\n\t\t\t? stderrRaw\n\t\t\t: \"\";\n\treturn { code, stderr, message };\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tif ((err as { killed?: boolean }).killed) return true;\n\tconst name = (err as { name?: string }).name;\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\treturn name === \"AbortError\" || code === \"ETIMEDOUT\" || message.toLowerCase().includes(\"timed out\");\n}\n\nexport function trimErrorText(text: string): string {\n\treturn text.replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nexport function mapFfmpegError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffmpeg is not installed. Install with: brew install ffmpeg\";\n\tif (isTimeoutError(err)) return \"ffmpeg timed out extracting frame\";\n\tif (stderr.includes(\"403\")) return \"Stream URL returned 403 — may have expired, try again\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffmpeg failed: ${snippet}` : \"ffmpeg failed\";\n}\n\nconst proxyStorage = new AsyncLocalStorage<string | null>();\n\nexport function normalizeProxyUrl(value: unknown, source: string): string | null {\n\tif (value === undefined || value === null) return null;\n\tif (typeof value !== \"string\") throw new Error(`${source} must be an http(s) or socks proxy URL string`);\n\tconst trimmed = value.trim();\n\tif (!trimmed) return null;\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(trimmed);\n\t} catch {\n\t\tthrow new Error(`${source} must be a valid proxy URL: ${JSON.stringify(trimmed)}`);\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\" &&\n\t\tparsed.protocol !== \"socks4:\" && parsed.protocol !== \"socks4a:\" &&\n\t\tparsed.protocol !== \"socks5:\" && parsed.protocol !== \"socks5h:\") {\n\t\tthrow new Error(`${source} must use the http://, https://, or socks scheme: ${trimmed}`);\n\t}\n\tif (!parsed.hostname) throw new Error(`${source} must include a proxy host: ${trimmed}`);\n\tparsed.hash = \"\";\n\tparsed.search = \"\";\n\treturn parsed.toString();\n}\n\nfunction redactProxyUrl(value: string): string {\n\tconst parsed = new URL(value);\n\tif (parsed.username) parsed.username = \"redacted\";\n\tif (parsed.password) parsed.password = \"redacted\";\n\treturn parsed.toString();\n}\n\nfunction loadConfiguredProxy(): string | null {\n\tlet configured: unknown;\n\tconst path = getWebSearchConfigPath();\n\tif (existsSync(path)) {\n\t\tlet raw: unknown;\n\t\ttry {\n\t\t\traw = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthrow new Error(`Failed to load proxy config from ${path}: ${message}`);\n\t\t}\n\t\tif (raw && typeof raw === \"object\" && !Array.isArray(raw)) configured = (raw as { proxy?: unknown }).proxy;\n\t}\n\tif (configured === undefined) return null;\n\treturn normalizeProxyUrl(configured, `proxy in ${getWebSearchConfigPath()}`);\n}\n\nexport function runWithProxy<T>(proxy: string | undefined, fn: () => T): T {\n\tconst normalized = proxy === undefined\n\t\t? loadConfiguredProxy()\n\t\t: normalizeProxyUrl(proxy, \"proxy\");\n\treturn proxyStorage.run(normalized, fn);\n}\n\nexport function getActiveProxy(): string | null {\n\treturn proxyStorage.getStore() ?? null;\n}\n\nexport function hasScopedProxyDecision(): boolean {\n\treturn proxyStorage.getStore() !== undefined;\n}\n\nfunction noProxyEntryMatches(hostname: string, entry: string): boolean {\n\tif (!entry) return false;\n\tif (entry === \"*\") return true;\n\tlet host = entry;\n\tif (host.startsWith(\"[\")) {\n\t\tconst close = host.indexOf(\"]\");\n\t\tif (close > 0) host = host.slice(0, close + 1);\n\t} else {\n\t\tconst colon = host.lastIndexOf(\":\");\n\t\tif (colon > -1 && /^\\d+$/.test(host.slice(colon + 1))) host = host.slice(0, colon);\n\t}\n\thost = host.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (!host) return false;\n\treturn hostname === host || hostname.endsWith(host.startsWith(\".\") ? host : `.${host}`);\n}\n\n/** True when a URL must NOT be sent through the active proxy. */\nexport function isProxyBypassedUrl(url: URL): boolean {\n\tconst hostname = url.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\tif (hostname === \"localhost\" || hostname.endsWith(\".localhost\") || hostname === \"127.0.0.1\" || hostname === \"::1\") return true;\n\tconst noProxy = process.env.NO_PROXY || process.env.no_proxy;\n\tif (noProxy && noProxy.split(\",\").some((entry) => noProxyEntryMatches(hostname, entry.trim()))) return true;\n\treturn false;\n}\n\nexport interface ProxiedRequestInit extends RequestInit {\n\t/** Caller-supplied proxy; bypasses AsyncLocalStorage for pLimit-safe contexts. */\n\t__proxy?: string;\n}\n\ninterface ProxiedFetch {\n\t(input: RequestInfo | URL, init?: ProxiedRequestInit): Promise<Response>;\n\t__piWebAccessProxyFetch?: boolean;\n}\n\n/** Wraps globalThis.fetch so every http(s) call routes through curl while a proxy is active. Idempotent. */\nexport function installGlobalProxyFetch(): void {\n\tconst current = globalThis.fetch as ProxiedFetch;\n\tif (typeof current !== \"function\" || current.__piWebAccessProxyFetch === true) return;\n\tconst nativeFetch = current;\n\tconst wrapped: ProxiedFetch = ((input: RequestInfo | URL, init?: ProxiedRequestInit) => {\n\t\t// Explicitly attached proxies survive pLimit context loss. Otherwise only\n\t\t// web-access calls inside runWithProxy may use the configured proxy.\n\t\tconst proxy = init?.__proxy ?? (hasScopedProxyDecision() ? getActiveProxy() : null);\n\t\tif (!proxy) return nativeFetch(input, init);\n\t\tlet url: URL | null = null;\n\t\ttry {\n\t\t\turl = new URL(typeof input === \"string\" || input instanceof URL ? input : input.url);\n\t\t} catch {\n\t\t\turl = null;\n\t\t}\n\t\tif (!url || (url.protocol !== \"http:\" && url.protocol !== \"https:\") || isProxyBypassedUrl(url)) {\n\t\t\treturn nativeFetch(input, init);\n\t\t}\n\t\treturn fetchViaCurl(url, init ?? {}, proxy);\n\t});\n\twrapped.__piWebAccessProxyFetch = true;\n\tglobalThis.fetch = wrapped;\n}\n\nfunction parseHeaderDump(dump: string): { status: number; statusText: string; headers: Array<[string, string]> } {\n\tconst blocks = dump.split(/\\r?\\n\\r?\\n/).filter((block) => /^HTTP\\/[\\d.]+\\s+\\d{3}/.test(block.trim()));\n\tconst block = (blocks.length > 0 ? blocks[blocks.length - 1] : \"\").trim();\n\tconst lines = block.split(/\\r?\\n/);\n\tlet status = 0;\n\tlet statusText = \"\";\n\tconst headers: Array<[string, string]> = [];\n\tfor (const line of lines) {\n\t\tconst match = /^HTTP\\/[\\d.]+\\s+(\\d{3})(?:\\s+(.*))?$/.exec(line.trim());\n\t\tif (match) {\n\t\t\tstatus = Number(match[1]);\n\t\t\tstatusText = match[2] ?? \"\";\n\t\t\theaders.length = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst separator = line.indexOf(\":\");\n\t\tif (separator > 0) {\n\t\t\tconst name = line.slice(0, separator).trim();\n\t\t\tif (name.toLowerCase() === \"content-encoding\" || name.toLowerCase() === \"content-length\") continue;\n\t\t\theaders.push([name, line.slice(separator + 1).trim()]);\n\t\t}\n\t}\n\treturn { status, statusText, headers };\n}\n\nclass CurlTransportError extends Error {}\n\nfunction quoteCurlConfigValue(value: string, label: string): string {\n\tif (/[\\0-\\x08\\x0c\\x0e-\\x1f\\x7f]/.test(value)) {\n\t\tthrow new Error(`${label} contains unsupported control characters`);\n\t}\n\treturn `\"${value\n\t\t.replace(/\\\\/g, \"\\\\\\\\\")\n\t\t.replace(/\"/g, '\\\\\"')\n\t\t.replace(/\\t/g, \"\\\\t\")\n\t\t.replace(/\\n/g, \"\\\\n\")\n\t\t.replace(/\\r/g, \"\\\\r\")\n\t\t.replace(/\\v/g, \"\\\\v\")}\"`;\n}\n\nfunction curlConfigOption(name: string, value?: string, label = name): string {\n\treturn value === undefined ? name : `${name} = ${quoteCurlConfigValue(value, label)}`;\n}\n\nasync function fetchViaCurl(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tlet current = url;\n\tlet currentInit = init;\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetchViaCurlOnce(current, currentInit, proxyUrl);\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location || ![301, 302, 303, 307, 308].includes(response.status)) {\n\t\t\tif (redirects > 0) Object.defineProperty(response, \"redirected\", { value: true, configurable: true });\n\t\t\treturn response;\n\t\t}\n\t\tif (currentInit.redirect === \"manual\") return response;\n\t\tif (currentInit.redirect === \"error\") throw new TypeError(`Proxy fetch redirect blocked from ${current.toString()}`);\n\t\tif (redirects === 20) throw new Error(`Too many proxy redirects from ${url.toString()}`);\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") throw new Error(`Proxy redirect from ${current.origin} must use HTTP(S)`);\n\n\t\tlet headers = new Headers(currentInit.headers);\n\t\tlet nextInit: RequestInit;\n\t\tconst method = currentInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (((response.status === 301 || response.status === 302) && method === \"POST\") || (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")) {\n\t\t\tfor (const name of [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"]) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = currentInit;\n\t\t\tnextInit = { ...withoutBody, method: \"GET\", headers };\n\t\t} else {\n\t\t\tnextInit = { ...currentInit, headers };\n\t\t}\n\n\t\tif (next.origin !== current.origin) {\n\t\t\theaders = new Headers();\n\t\t\tnextInit = { ...nextInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t\tcurrentInit = nextInit;\n\t}\n}\n\nasync function fetchViaCurlOnce(url: URL, init: RequestInit, proxyUrl: string): Promise<Response> {\n\tconst method = (init.method ?? \"GET\").toUpperCase();\n\tconst headers = new Headers(init.headers);\n\n\tconst dir = await mkdtemp(join(tmpdir(), \"pi-web-access-proxy-\"));\n\tconst headerFile = join(dir, \"headers\");\n\tconst bodyFile = join(dir, \"body\");\n\tconst requestBodyFile = join(dir, \"request-body\");\n\n\tconst config: string[] = [\n\t\tcurlConfigOption(\"silent\"),\n\t\tcurlConfigOption(\"show-error\"),\n\t\tcurlConfigOption(\"compressed\"),\n\t\tcurlConfigOption(\"connect-timeout\", \"20\"),\n\t\tcurlConfigOption(\"proxy\", proxyUrl, \"proxy URL\"),\n\t\tcurlConfigOption(\"dump-header\", headerFile),\n\t\tcurlConfigOption(\"output\", bodyFile),\n\t\tcurlConfigOption(\"write-out\", \"%{json}\"),\n\t];\n\n\tif (method !== \"GET\" && method !== \"HEAD\") config.push(curlConfigOption(\"request\", method));\n\n\tfor (const [name, value] of headers.entries()) {\n\t\tif (value === \"\") continue;\n\t\tconfig.push(curlConfigOption(\"header\", `${name}: ${value}`, `header ${name}`));\n\t}\n\n\tconst body = init.body;\n\tif (body !== undefined && body !== null) {\n\t\tlet buffer: Buffer;\n\t\tif (typeof body === \"string\") buffer = Buffer.from(body, \"utf-8\");\n\t\telse if (body instanceof URLSearchParams) buffer = Buffer.from(body.toString(), \"utf-8\");\n\t\telse if (body instanceof ArrayBuffer) buffer = Buffer.from(body);\n\t\telse if (ArrayBuffer.isView(body)) buffer = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t\telse throw new Error(`Unsupported request body type for proxy fetch: ${typeof body}`);\n\t\tawait writeFile(requestBodyFile, buffer, { mode: 0o600 });\n\t\tconfig.push(curlConfigOption(\"data-binary\", `@${requestBodyFile}`));\n\t\tif (method === \"GET\") config.push(curlConfigOption(\"request\", \"GET\"));\n\t}\n\n\tconfig.push(curlConfigOption(\"url\", url.toString(), \"request URL\"));\n\tconst configInput = `${config.join(\"\\n\")}\\n`;\n\n\tconst signal = init.signal ?? null;\n\tlet stdout: string;\n\ttry {\n\t\tstdout = await new Promise<string>((resolve, reject) => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\treject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst child = spawn(\"curl\", [\"--config\", \"-\"], { windowsHide: true, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\t\tlet out = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tconst onAbort = () => { try { child.kill(); } catch {} };\n\t\t\tif (signal) {\n\t\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t}\n\t\t\tchild.stdout?.on(\"data\", (chunk: Buffer) => { out += chunk.toString(\"utf-8\"); });\n\t\t\tchild.stderr?.on(\"data\", (chunk: Buffer) => { if (stderr.length < 4096) stderr += chunk.toString(\"utf-8\"); });\n\t\t\tchild.once(\"error\", (err: NodeJS.ErrnoException) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treject(new CurlTransportError(err.code === \"ENOENT\"\n\t\t\t\t\t? \"curl executable not found on PATH; proxy transport requires curl\"\n\t\t\t\t\t: `curl failed to start: ${err.message}`));\n\t\t\t});\n\t\t\tchild.once(\"close\", (code) => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tif (signal?.aborted) return reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n\t\t\t\tif (code !== 0 && !out.trim()) {\n\t\t\t\t\treturn reject(new CurlTransportError(`curl exited with code ${code ?? \"unknown\"} via ${redactProxyUrl(proxyUrl)}${stderr.trim() ? `: ${stderr.trim()}` : \"\"}`));\n\t\t\t\t}\n\t\t\t\tresolve(out);\n\t\t\t});\n\t\t\tif (!child.stdin) {\n\t\t\t\tchild.kill();\n\t\t\t\treject(new CurlTransportError(\"curl stdin unavailable for protected proxy configuration\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchild.stdin.on(\"error\", (err) => reject(new CurlTransportError(`curl stdin failed: ${err.message}`)));\n\t\t\tchild.stdin.end(configInput);\n\t\t});\n\t} catch (err) {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t\tif (err instanceof CurlTransportError) throw new Error(err.message);\n\t\tthrow err;\n\t}\n\n\tlet bodyBuffer = Buffer.alloc(0);\n\tlet dump = \"\";\n\ttry {\n\t\t[dump, bodyBuffer] = await Promise.all([readFile(headerFile, \"utf-8\"), readFile(bodyFile)]);\n\t} catch {\n\t\t// HEAD or empty responses may not produce output files.\n\t} finally {\n\t\tawait rm(dir, { recursive: true, force: true }).catch(() => {});\n\t}\n\n\tconst { status, statusText, headers: responseHeaders } = parseHeaderDump(dump);\n\tif (status === 0) {\n\t\tthrow new Error(`Proxy fetch to ${url.toString()} via ${redactProxyUrl(proxyUrl)} returned no HTTP status`);\n\t}\n\n\tlet finalUrl = url.toString();\n\tlet redirected = false;\n\ttry {\n\t\tconst trimmed = stdout.trim();\n\t\tif (trimmed.startsWith(\"{\")) {\n\t\t\tconst writeOut = JSON.parse(trimmed) as { url_effective?: string; num_redirects?: number };\n\t\t\tif (writeOut.url_effective) finalUrl = writeOut.url_effective;\n\t\t\tredirected = (writeOut.num_redirects ?? 0) > 0;\n\t\t}\n\t} catch {\n\t\t// Older curl without %{json}; the header dump already provided the status.\n\t}\n\n\tconst nullBody = status === 204 || status === 205 || status === 304;\n\tconst response = new Response(nullBody ? null : new Uint8Array(bodyBuffer), {\n\t\tstatus,\n\t\tstatusText: statusText || undefined,\n\t\theaders: new Headers(responseHeaders),\n\t});\n\tObject.defineProperty(response, \"url\", { value: finalUrl, configurable: true });\n\tObject.defineProperty(response, \"redirected\", { value: redirected, configurable: true });\n\treturn response;\n}\n"]}
@@ -30,5 +30,13 @@ export type JsonAgentSessionEvent = Exclude<AgentSessionEvent, {
30
30
  */
31
31
  export declare function toJsonEvent(event: MessageUpdateEvent): JsonMessageUpdateEvent;
32
32
  export declare function toJsonEvent(event: AgentSessionEvent): JsonAgentSessionEvent;
33
+ /** Identity a subagent child stamps on every wire event so a consumer can rebuild the tree. */
34
+ export interface OrchestrationEnvelope {
35
+ taskId?: string;
36
+ parentTaskId?: string;
37
+ depth?: number;
38
+ }
39
+ export declare function orchestrationEnvelope(env?: NodeJS.ProcessEnv): OrchestrationEnvelope;
40
+ export declare function withEnvelope<T extends object>(event: T, envelope: OrchestrationEnvelope): T & OrchestrationEnvelope;
33
41
  export {};
34
42
  //# sourceMappingURL=json-event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-event.d.ts","sourceRoot":"","sources":["../../src/modes/json-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;AAEjF,KAAK,2BAA2B,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACzF,cAAc,CAAC,CAAC,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpD,cAAc,CAAC,CAAC,CAAC,CAAC;AAErB,KAAK,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAAC;AACjF,KAAK,sBAAsB,GAAG;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB,EAAE,2BAA2B,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC;CAChG,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,GAAG,sBAAsB,CAAC;AAsBpH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,sBAAsB,CAAC;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,qBAAqB,CAAC"}
1
+ {"version":3,"file":"json-event.d.ts","sourceRoot":"","sources":["../../src/modes/json-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;AAEjF,KAAK,2BAA2B,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACzF,cAAc,CAAC,CAAC,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpD,cAAc,CAAC,CAAC,CAAC,CAAC;AAErB,KAAK,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAAC;AACjF,KAAK,sBAAsB,GAAG;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,qBAAqB,EAAE,2BAA2B,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,CAAC,CAAC;CAChG,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC,GAAG,sBAAsB,CAAC;AAsBpH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,sBAAsB,CAAC;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,qBAAqB,CAAC;AAgB7E,+FAA+F;AAC/F,MAAM,WAAW,qBAAqB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,qBAAqB,CASjG;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,qBAAqB,GAAG,CAAC,GAAG,qBAAqB,CAEnH"}
@@ -1,3 +1,4 @@
1
+ import { currentSubagentDepth, currentTaskId, PARENT_TASK_ID_ENV } from "../core/tools/subagent-env.js";
1
2
  function toJsonAssistantMessageEvent(event) {
2
3
  if (event.type === "toolcall_start") {
3
4
  const toolCall = event.partial.content[event.contentIndex];
@@ -26,4 +27,20 @@ export function toJsonEvent(event) {
26
27
  assistantMessageEvent: toJsonAssistantMessageEvent(event.assistantMessageEvent),
27
28
  };
28
29
  }
30
+ export function orchestrationEnvelope(env = process.env) {
31
+ const taskId = currentTaskId(env);
32
+ const parentTaskId = env[PARENT_TASK_ID_ENV]?.trim() || undefined;
33
+ const depth = currentSubagentDepth(env);
34
+ const out = {};
35
+ if (taskId)
36
+ out.taskId = taskId;
37
+ if (parentTaskId)
38
+ out.parentTaskId = parentTaskId;
39
+ if (depth > 0)
40
+ out.depth = depth;
41
+ return out;
42
+ }
43
+ export function withEnvelope(event, envelope) {
44
+ return { ...event, ...envelope };
45
+ }
29
46
  //# sourceMappingURL=json-event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-event.js","sourceRoot":"","sources":["../../src/modes/json-event.ts"],"names":[],"mappings":"AAmBA,SAAS,2BAA2B,CACnC,KAAkD;IAElD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,QAAQ,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,YAAY,qBAAqB,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;QACnD,OAAO,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;IACnD,OAAO,UAAU,CAAC;AACnB,CAAC;AAUD,MAAM,UAAU,WAAW,CAAC,KAAwB;IACnD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACN,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;QAC1B,qBAAqB,EAAE,2BAA2B,CAAC,KAAK,CAAC,qBAAqB,CAAC;KAC/E,CAAC;AACH,CAAC","sourcesContent":["import type { Usage } from \"@earendil-works/pi-ai\";\nimport type { AgentSessionEvent } from \"../core/agent-session.ts\";\n\ntype WithoutPartial<T> = T extends { partial: unknown } ? Omit<T, \"partial\"> : T;\n\ntype ToJsonAssistantMessageEvent<T> = T extends { type: \"toolcall_start\"; partial: unknown }\n\t? WithoutPartial<T> & { id: string; toolName: string }\n\t: WithoutPartial<T>;\n\ntype MessageUpdateEvent = Extract<AgentSessionEvent, { type: \"message_update\" }>;\ntype JsonMessageUpdateEvent = {\n\ttype: \"message_update\";\n\tusage: Usage;\n\tassistantMessageEvent: ToJsonAssistantMessageEvent<MessageUpdateEvent[\"assistantMessageEvent\"]>;\n};\n\n/** Session event shape emitted by the JSON and RPC stdout protocols. */\nexport type JsonAgentSessionEvent = Exclude<AgentSessionEvent, { type: \"message_update\" }> | JsonMessageUpdateEvent;\n\nfunction toJsonAssistantMessageEvent(\n\tevent: MessageUpdateEvent[\"assistantMessageEvent\"],\n): JsonMessageUpdateEvent[\"assistantMessageEvent\"] {\n\tif (event.type === \"toolcall_start\") {\n\t\tconst toolCall = event.partial.content[event.contentIndex];\n\t\tif (toolCall?.type !== \"toolCall\") {\n\t\t\tthrow new Error(`toolcall_start content at index ${event.contentIndex} is not a tool call`);\n\t\t}\n\t\tconst { partial: _partial, ...deltaEvent } = event;\n\t\treturn { ...deltaEvent, id: toolCall.id, toolName: toolCall.name };\n\t}\n\n\tif (!(\"partial\" in event)) {\n\t\treturn event;\n\t}\n\n\tconst { partial: _partial, ...deltaEvent } = event;\n\treturn deltaEvent;\n}\n\n/**\n * Remove cumulative assistant snapshots from streaming wire events.\n * `message_start` provides the initial message, deltas build it, and\n * `message_end` provides the final authoritative message. Cumulative usage,\n * tool-call ids, and tool names remain available because their size is constant.\n */\nexport function toJsonEvent(event: MessageUpdateEvent): JsonMessageUpdateEvent;\nexport function toJsonEvent(event: AgentSessionEvent): JsonAgentSessionEvent;\nexport function toJsonEvent(event: AgentSessionEvent): JsonAgentSessionEvent {\n\tif (event.type !== \"message_update\") {\n\t\treturn event;\n\t}\n\tif (event.message.role !== \"assistant\") {\n\t\tthrow new Error(\"message_update message is not an assistant message\");\n\t}\n\n\treturn {\n\t\ttype: \"message_update\",\n\t\tusage: event.message.usage,\n\t\tassistantMessageEvent: toJsonAssistantMessageEvent(event.assistantMessageEvent),\n\t};\n}\n"]}
1
+ {"version":3,"file":"json-event.js","sourceRoot":"","sources":["../../src/modes/json-event.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAkBxG,SAAS,2BAA2B,CACnC,KAAkD;IAElD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,QAAQ,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,YAAY,qBAAqB,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;QACnD,OAAO,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;IACnD,OAAO,UAAU,CAAC;AACnB,CAAC;AAUD,MAAM,UAAU,WAAW,CAAC,KAAwB;IACnD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO;QACN,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;QAC1B,qBAAqB,EAAE,2BAA2B,CAAC,KAAK,CAAC,qBAAqB,CAAC;KAC/E,CAAC;AACH,CAAC;AASD,MAAM,UAAU,qBAAqB,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;IACzE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAClE,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,IAAI,MAAM;QAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IAChC,IAAI,YAAY;QAAE,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;IAClD,IAAI,KAAK,GAAG,CAAC;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;IACjC,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY,CAAmB,KAAQ,EAAE,QAA+B;IACvF,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;AAClC,CAAC","sourcesContent":["import type { Usage } from \"@earendil-works/pi-ai\";\nimport type { AgentSessionEvent } from \"../core/agent-session.ts\";\nimport { currentSubagentDepth, currentTaskId, PARENT_TASK_ID_ENV } from \"../core/tools/subagent-env.ts\";\n\ntype WithoutPartial<T> = T extends { partial: unknown } ? Omit<T, \"partial\"> : T;\n\ntype ToJsonAssistantMessageEvent<T> = T extends { type: \"toolcall_start\"; partial: unknown }\n\t? WithoutPartial<T> & { id: string; toolName: string }\n\t: WithoutPartial<T>;\n\ntype MessageUpdateEvent = Extract<AgentSessionEvent, { type: \"message_update\" }>;\ntype JsonMessageUpdateEvent = {\n\ttype: \"message_update\";\n\tusage: Usage;\n\tassistantMessageEvent: ToJsonAssistantMessageEvent<MessageUpdateEvent[\"assistantMessageEvent\"]>;\n};\n\n/** Session event shape emitted by the JSON and RPC stdout protocols. */\nexport type JsonAgentSessionEvent = Exclude<AgentSessionEvent, { type: \"message_update\" }> | JsonMessageUpdateEvent;\n\nfunction toJsonAssistantMessageEvent(\n\tevent: MessageUpdateEvent[\"assistantMessageEvent\"],\n): JsonMessageUpdateEvent[\"assistantMessageEvent\"] {\n\tif (event.type === \"toolcall_start\") {\n\t\tconst toolCall = event.partial.content[event.contentIndex];\n\t\tif (toolCall?.type !== \"toolCall\") {\n\t\t\tthrow new Error(`toolcall_start content at index ${event.contentIndex} is not a tool call`);\n\t\t}\n\t\tconst { partial: _partial, ...deltaEvent } = event;\n\t\treturn { ...deltaEvent, id: toolCall.id, toolName: toolCall.name };\n\t}\n\n\tif (!(\"partial\" in event)) {\n\t\treturn event;\n\t}\n\n\tconst { partial: _partial, ...deltaEvent } = event;\n\treturn deltaEvent;\n}\n\n/**\n * Remove cumulative assistant snapshots from streaming wire events.\n * `message_start` provides the initial message, deltas build it, and\n * `message_end` provides the final authoritative message. Cumulative usage,\n * tool-call ids, and tool names remain available because their size is constant.\n */\nexport function toJsonEvent(event: MessageUpdateEvent): JsonMessageUpdateEvent;\nexport function toJsonEvent(event: AgentSessionEvent): JsonAgentSessionEvent;\nexport function toJsonEvent(event: AgentSessionEvent): JsonAgentSessionEvent {\n\tif (event.type !== \"message_update\") {\n\t\treturn event;\n\t}\n\tif (event.message.role !== \"assistant\") {\n\t\tthrow new Error(\"message_update message is not an assistant message\");\n\t}\n\n\treturn {\n\t\ttype: \"message_update\",\n\t\tusage: event.message.usage,\n\t\tassistantMessageEvent: toJsonAssistantMessageEvent(event.assistantMessageEvent),\n\t};\n}\n\n/** Identity a subagent child stamps on every wire event so a consumer can rebuild the tree. */\nexport interface OrchestrationEnvelope {\n\ttaskId?: string;\n\tparentTaskId?: string;\n\tdepth?: number;\n}\n\nexport function orchestrationEnvelope(env: NodeJS.ProcessEnv = process.env): OrchestrationEnvelope {\n\tconst taskId = currentTaskId(env);\n\tconst parentTaskId = env[PARENT_TASK_ID_ENV]?.trim() || undefined;\n\tconst depth = currentSubagentDepth(env);\n\tconst out: OrchestrationEnvelope = {};\n\tif (taskId) out.taskId = taskId;\n\tif (parentTaskId) out.parentTaskId = parentTaskId;\n\tif (depth > 0) out.depth = depth;\n\treturn out;\n}\n\nexport function withEnvelope<T extends object>(event: T, envelope: OrchestrationEnvelope): T & OrchestrationEnvelope {\n\treturn { ...event, ...envelope };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAK5E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwI/G"}
1
+ {"version":3,"file":"print-mode.d.ts","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAK5E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyI/G"}
@@ -7,7 +7,7 @@
7
7
  */
8
8
  import { flushRawStdout, waitForRawStdoutBackpressure, writeRawStdout } from "../core/output-guard.js";
9
9
  import { killTrackedDetachedChildren } from "../utils/shell.js";
10
- import { toJsonEvent } from "./json-event.js";
10
+ import { orchestrationEnvelope, toJsonEvent, withEnvelope } from "./json-event.js";
11
11
  /**
12
12
  * Run in print (single-shot) mode.
13
13
  * Sends prompts to the agent and outputs the result.
@@ -81,9 +81,10 @@ export async function runPrintMode(runtimeHost, options) {
81
81
  });
82
82
  unsubscribe?.();
83
83
  unsubscribeBackpressure?.();
84
+ const envelope = orchestrationEnvelope();
84
85
  unsubscribe = session.subscribe((event) => {
85
86
  if (mode === "json") {
86
- writeRawStdout(`${JSON.stringify(toJsonEvent(event))}\n`);
87
+ writeRawStdout(`${JSON.stringify(withEnvelope(toJsonEvent(event), envelope))}\n`);
87
88
  }
88
89
  });
89
90
  unsubscribeBackpressure =
@@ -1 +1 @@
1
- {"version":3,"file":"print-mode.js","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `pi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { AssistantMessage, ImageContent } from \"@earendil-works/pi-ai\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport { flushRawStdout, waitForRawStdoutBackpressure, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\nimport { toJsonEvent } from \"./json-event.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unsubscribeBackpressure: (() => void) | undefined;\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(toJsonEvent(event))}\\n`);\n\t\t\t}\n\t\t});\n\t\tunsubscribeBackpressure =\n\t\t\tmode === \"json\"\n\t\t\t\t? session.agent.subscribe(async () => {\n\t\t\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\t};\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait session.prompt(initialMessage, { images: initialImages });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait session.prompt(message);\n\t\t}\n\n\t\tif (mode === \"text\") {\n\t\t\tconst state = session.state;\n\t\t\tconst lastMessage = state.messages[state.messages.length - 1];\n\n\t\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = lastMessage as AssistantMessage;\n\t\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t\texitCode = 1;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}
1
+ {"version":3,"file":"print-mode.js","sourceRoot":"","sources":["../../src/modes/print-mode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Print mode (single-shot): Send prompts, output result, exit.\n *\n * Used for:\n * - `pi -p \"prompt\"` - text output\n * - `pi --mode json \"prompt\"` - JSON event stream\n */\n\nimport type { AssistantMessage, ImageContent } from \"@earendil-works/pi-ai\";\nimport type { AgentSessionRuntime } from \"../core/agent-session-runtime.ts\";\nimport { flushRawStdout, waitForRawStdoutBackpressure, writeRawStdout } from \"../core/output-guard.ts\";\nimport { killTrackedDetachedChildren } from \"../utils/shell.ts\";\nimport { orchestrationEnvelope, toJsonEvent, withEnvelope } from \"./json-event.ts\";\n\n/**\n * Options for print mode.\n */\nexport interface PrintModeOptions {\n\t/** Output mode: \"text\" for final response only, \"json\" for all events */\n\tmode: \"text\" | \"json\";\n\t/** Array of additional prompts to send after initialMessage */\n\tmessages?: string[];\n\t/** First message to send (may contain @file content) */\n\tinitialMessage?: string;\n\t/** Images to attach to the initial message */\n\tinitialImages?: ImageContent[];\n}\n\n/**\n * Run in print (single-shot) mode.\n * Sends prompts to the agent and outputs the result.\n */\nexport async function runPrintMode(runtimeHost: AgentSessionRuntime, options: PrintModeOptions): Promise<number> {\n\tconst { mode, messages = [], initialMessage, initialImages } = options;\n\tlet exitCode = 0;\n\tlet session = runtimeHost.session;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unsubscribeBackpressure: (() => void) | undefined;\n\tlet disposed = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\n\tconst disposeRuntime = async (): Promise<void> => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tawait runtimeHost.dispose();\n\t};\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid disposeRuntime().finally(() => {\n\t\t\t\t\tprocess.exit(signal === \"SIGHUP\" ? 129 : 143);\n\t\t\t\t});\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tregisterSignalHandlers();\n\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tsession = runtimeHost.session;\n\t\tawait session.bindExtensions({\n\t\t\tmode: mode === \"json\" ? \"json\" : \"print\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.waitForIdle(),\n\t\t\t\tnewSession: async (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, navigateOptions) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: navigateOptions?.summarize,\n\t\t\t\t\t\tcustomInstructions: navigateOptions?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: navigateOptions?.replaceInstructions,\n\t\t\t\t\t\tlabel: navigateOptions?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, switchOptions) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, switchOptions);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\tconsole.error(`Extension error (${err.extensionPath}): ${err.error}`);\n\t\t\t},\n\t\t});\n\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tconst envelope = orchestrationEnvelope();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\tif (mode === \"json\") {\n\t\t\t\twriteRawStdout(`${JSON.stringify(withEnvelope(toJsonEvent(event), envelope))}\\n`);\n\t\t\t}\n\t\t});\n\t\tunsubscribeBackpressure =\n\t\t\tmode === \"json\"\n\t\t\t\t? session.agent.subscribe(async () => {\n\t\t\t\t\t\tawait waitForRawStdoutBackpressure();\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\t};\n\n\ttry {\n\t\tif (mode === \"json\") {\n\t\t\tconst header = session.sessionManager.getHeader();\n\t\t\tif (header) {\n\t\t\t\twriteRawStdout(`${JSON.stringify(header)}\\n`);\n\t\t\t}\n\t\t}\n\n\t\tawait rebindSession();\n\n\t\tif (initialMessage) {\n\t\t\tawait session.prompt(initialMessage, { images: initialImages });\n\t\t}\n\n\t\tfor (const message of messages) {\n\t\t\tawait session.prompt(message);\n\t\t}\n\n\t\tif (mode === \"text\") {\n\t\t\tconst state = session.state;\n\t\t\tconst lastMessage = state.messages[state.messages.length - 1];\n\n\t\t\tif (lastMessage?.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = lastMessage as AssistantMessage;\n\t\t\t\tif (assistantMsg.stopReason === \"error\" || assistantMsg.stopReason === \"aborted\") {\n\t\t\t\t\tconsole.error(assistantMsg.errorMessage || `Request ${assistantMsg.stopReason}`);\n\t\t\t\t\texitCode = 1;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const content of assistantMsg.content) {\n\t\t\t\t\t\tif (content.type === \"text\") {\n\t\t\t\t\t\t\twriteRawStdout(`${content.text}\\n`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn exitCode;\n\t} catch (error: unknown) {\n\t\tconsole.error(error instanceof Error ? error.message : String(error));\n\t\treturn 1;\n\t} finally {\n\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\tcleanup();\n\t\t}\n\t\tawait disposeRuntime();\n\t\tawait flushRawStdout();\n\t}\n}\n"]}
@@ -88,6 +88,15 @@ These variables are read by HUMAIN Terminal itself:
88
88
  | `PI_TUI_ESC_TIMEOUT` | How long to wait after a lone ESC before treating it as Escape, in milliseconds; defaults to `100` over SSH and `10` otherwise. Increase if Alt-key input is misread as Escape |
89
89
  | `VISUAL`, `EDITOR` | External editor fallback when `externalEditor` is unset |
90
90
  | `HTTP_PROXY`, `HTTPS_PROXY` | Proxy outbound HTTP requests |
91
+ | `HUMAIN_TERMINAL_SUBAGENT_MAX_DEPTH` | Maximum nesting depth for the `subagent` tool. Default `1`, ceiling `3`. |
92
+ | `HUMAIN_TERMINAL_SUBAGENT_MAX_CONCURRENCY` | Maximum children running at once in parallel mode. Default `4`, ceiling `8`. |
93
+ | `HUMAIN_TERMINAL_SUBAGENT_MAX_WORKTREES` | Maximum `isolation: "worktree"` children running at once in parallel mode; the rest queue behind the same concurrency cap. Default equals `HUMAIN_TERMINAL_SUBAGENT_MAX_CONCURRENCY`, ceiling `8`. |
94
+ | `HUMAIN_TERMINAL_SUBAGENT_MAX_TASKS` | Maximum tasks accepted by one parallel call. Default `8`, ceiling `16`. |
95
+ | `HUMAIN_TERMINAL_TASK_ID` | Set by the parent on each child: the child's stable task id. |
96
+ | `HUMAIN_TERMINAL_PARENT_TASK_ID` | Set by the parent on each child: the spawning task id or tool call id. |
97
+ | `HUMAIN_TERMINAL_TASK_BASE_REVISION` | Set by the parent when the task's context packet names a base revision. |
98
+
99
+ Raising `HUMAIN_TERMINAL_SUBAGENT_MAX_DEPTH` multiplies fan-out: each level applies its own task cap, so the tree may reach tasks^depth processes. An aggregate budget is the caller's responsibility. These caps are advisory process configuration read from the environment, not a security boundary; a child with shell access could start a fresh process tree.
91
100
 
92
101
  Provider credentials such as `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and cloud-provider configuration are listed in [Providers](providers.md#environment-variables-or-auth-file).
93
102
 
package/docs/json.md CHANGED
@@ -91,6 +91,22 @@ usage at completion. Use `contentIndex` and `delta` to assemble live text, think
91
91
  arguments if needed. A `toolcall_start` event also includes the constant-sized `id` and `toolName`
92
92
  fields. `message_end` contains the final authoritative message.
93
93
 
94
+ ### Subagent identity fields
95
+
96
+ When the process runs as a subagent child (spawned by the `subagent` tool), every
97
+ event carries three additional top-level fields so a consumer can rebuild the
98
+ delegation tree:
99
+
100
+ | Field | Type | Meaning |
101
+ |---|---|---|
102
+ | `taskId` | string | Stable id of this child, set by the parent (`HUMAIN_TERMINAL_TASK_ID`). |
103
+ | `parentTaskId` | string | Task id of the spawning process, or its tool call id at the top level (`HUMAIN_TERMINAL_PARENT_TASK_ID`). |
104
+ | `depth` | number | Nesting depth, 1 for a direct child (`HUMAIN_TERMINAL_SUBAGENT_DEPTH`). |
105
+
106
+ Top-level processes emit none of these fields.
107
+
108
+ RPC mode (`--mode rpc`) does not currently stamp these fields; the `subagent` tool always spawns children with `--mode json`.
109
+
94
110
  ## Example
95
111
 
96
112
  ```bash
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@humain/terminal",
3
- "version": "0.1.1",
3
+ "version": "0.2.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@humain/terminal",
9
- "version": "0.1.1",
9
+ "version": "0.2.2",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@humain/terminal-contracts": "0.1.0",
12
+ "@humain/terminal-contracts": "0.2.0",
13
13
  "@aws-sdk/client-bedrock-runtime": "3.1127.0",
14
14
  "@earendil-works/pi-agent-core": "0.85.1",
15
15
  "@earendil-works/pi-ai": "0.85.1",
@@ -950,9 +950,9 @@
950
950
  "hasInstallScript": true
951
951
  },
952
952
  "node_modules/@humain/terminal-contracts": {
953
- "version": "0.1.0",
954
- "resolved": "https://registry.npmjs.org/@humain/terminal-contracts/-/terminal-contracts-0.1.0.tgz",
955
- "integrity": "sha512-Mkzk/Z58b3o1vWn2hZqhI4jDmXJwHeLxdz/73ZzhnrrfgTUBnlTc4YvJR2cOM8pzLEwCpnMdpL0RD/EBn+jT2Q==",
953
+ "version": "0.2.0",
954
+ "resolved": "https://registry.npmjs.org/@humain/terminal-contracts/-/terminal-contracts-0.2.0.tgz",
955
+ "integrity": "sha512-ZMu1vL+ZNtH4rEHqwB5cHBN/BXyhj2DVGMUVwqArUrYXoJZqjNucYUpRYt0/dZ/x+gEZRTC0EvUlYTlPr2SpPg==",
956
956
  "license": "MIT",
957
957
  "dependencies": {
958
958
  "typebox": "1.3.27"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humain/terminal",
3
- "version": "0.1.1",
3
+ "version": "0.2.2",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "humainTerminalConfig": {
@@ -67,7 +67,7 @@
67
67
  "prepublishOnly": "npm run clean && npm run build && npm run shrinkwrap"
68
68
  },
69
69
  "dependencies": {
70
- "@humain/terminal-contracts": "0.1.0",
70
+ "@humain/terminal-contracts": "0.2.0",
71
71
  "@aws-sdk/client-bedrock-runtime": "3.1127.0",
72
72
  "@earendil-works/pi-agent-core": "0.85.1",
73
73
  "@earendil-works/pi-ai": "0.85.1",
@@ -1,25 +1,74 @@
1
1
  # pi-mcp-adapter upstream tracking
2
2
 
3
3
  HUMAIN Terminal vendors [`pi-mcp-adapter`](https://github.com/nicobailon/pi-mcp-adapter)
4
- version `2.32.1` so MCP support is available without a separate VM installation.
4
+ version `2.34.0` so MCP support is available without a separate VM installation.
5
5
 
6
6
  The unmodified upstream package is recorded in `upstream.json`, including the
7
- registry integrity and source `gitHead`. The release currentness gate resolves
8
- that exact version from npm and rejects provenance drift before checking whether
9
- a newer version exists.
7
+ registry integrity, tarball shasum, and source `gitHead`. The release currentness
8
+ gate resolves that exact version from npm and rejects provenance drift before
9
+ checking whether a newer version exists.
10
10
 
11
11
  The HUMAIN wrapper establishes Terminal's package manifest as `PI_PACKAGE_DIR`
12
12
  before returning the vendored factory, so its dynamic config and credential
13
13
  lookups stay under `.humain-terminal/agent`. An explicit `PI_PACKAGE_DIR`
14
14
  remains authoritative for downstream distributions and Nix/Guix layouts.
15
15
 
16
+ ## Signature-only provenance for 2.34.0
17
+
18
+ Upstream published `2.34.0` without a `gitHead`, which every release from
19
+ `2.31.0` through `2.33.0` carried. The tarball itself is intact: its sha512
20
+ integrity and shasum match the registry exactly and the registry holds valid npm
21
+ signatures for it, but there is no recorded link back to an upstream source
22
+ commit. `2.34.0` was therefore accepted on integrity, shasum, and npm signature
23
+ alone, and `upstream.json` records that decision explicitly as `"gitHead": null`
24
+ with a `provenanceNote`. The gate treats a recorded `null` as the only way to
25
+ skip the `gitHead` comparison: it still fails on any integrity or shasum
26
+ mismatch, still enforces an exact match whenever a `gitHead` string is recorded,
27
+ and fails again if upstream later starts publishing a `gitHead` for the recorded
28
+ version, so the relaxation cannot outlive the release it was granted for. Restore
29
+ ordinary `gitHead` provenance at the next upstream release that publishes one.
30
+
31
+ ## Host imports
32
+
33
+ Vendored modules import types from `@earendil-works/pi-coding-agent`, which is
34
+ not resolvable here because this repository's coding agent package is
35
+ `@humain/terminal`. Type-only imports are erased at build time and are left
36
+ alone. Every *value* import from that package must be repointed at the
37
+ equivalent repository module, or the bundle will emit an unresolvable external
38
+ import. As of 2.34.0 there are four:
39
+
40
+ | Vendored file | Symbol | Repository module |
41
+ | --- | --- | --- |
42
+ | `mcp-panel.ts` | `copyToClipboard` | `../../../utils/clipboard.ts` |
43
+ | `mcp-panel-theme.ts` | `DynamicBorder` | `../../../modes/interactive/components/dynamic-border.ts` |
44
+ | `index.ts` | `withFileMutationQueue` | `../../../core/tools/file-mutation-queue.ts`, whose queue state lives on `globalThis` under `Symbol.for("humain-terminal:file-mutation-queue")` so the copy inlined into this bundle serializes against the host's `edit`, `write` and `subagent` tools instead of keeping a second queue |
45
+ | `mcp-output-guard.ts` | `DEFAULT_MAX_BYTES`, `DEFAULT_MAX_LINES`, `formatSize`, `truncateHead` | `../../../core/tools/truncate.ts` |
46
+
47
+ After a sync, confirm no value imports remain:
48
+ `grep -rn '@earendil-works/pi-coding-agent' vendor/*.ts` should show only
49
+ `import type` forms and `import { type X }` forms, and the built bundle should
50
+ contain no reference to the package at all.
51
+
52
+ ## Bundled undici
53
+
54
+ `2.33.0` added a direct `undici` `^6` dependency for origin-scoped `caFile` TLS
55
+ trust, and the adapter's `http-ca.ts` requires its `Agent` and its `fetch` to
56
+ come from one undici copy. This repository pins `undici` `8.10.2` for every other
57
+ consumer, so `scripts/build-bundled-mcp-adapter.mjs` aliases `undici` to a
58
+ build-only `undici-v6` alias (`npm:undici@6.28.1`, a root devDependency) and
59
+ inlines it into `vendor/index.bundle.mjs` alone. The shared pin is untouched.
60
+ Because undici is CommonJS, the bundle also carries a `createRequire` banner;
61
+ without it the bundled `require("node:assert")` throws
62
+ `Dynamic require of "node:assert" is not supported` at load time. Keep both when
63
+ changing the bundle script.
64
+
16
65
  During updates:
17
66
 
18
- 1. Fetch and verify the recorded npm tarball integrity and `gitHead`.
67
+ 1. Fetch and verify the recorded npm tarball integrity, shasum, and `gitHead`.
19
68
  2. Review upstream source, dependency, lifecycle, and asset changes.
20
69
  3. Replace `vendor/` from the reviewed tarball.
21
- 4. Reapply the documented HUMAIN host import in `vendor/mcp-panel.ts` and
22
- normalize trailing whitespace in vendored TypeScript for repository checks.
70
+ 4. Reapply the documented HUMAIN host imports above and normalize trailing
71
+ whitespace in vendored TypeScript for repository checks.
23
72
  5. Regenerate `vendor/index.bundle.mjs` with the repository MCP bundle script.
24
73
  6. Update pinned runtime dependencies, every provenance field in `upstream.json`, and this document.
25
74
  7. Run `npm run check:mcp-adapter-upstream`, the MCP bundle tests, and local Node/Bun release smoke tests.
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "name": "pi-mcp-adapter",
3
3
  "repository": "https://github.com/nicobailon/pi-mcp-adapter",
4
- "version": "2.32.1",
5
- "tarball": "https://registry.npmjs.org/pi-mcp-adapter/-/pi-mcp-adapter-2.32.1.tgz",
6
- "integrity": "sha512-GNLYa2U9T5ZqIhZmhx/RTenEjfakJTelq/z6Q+At5SIxyuYvrvobriDEVsnx+lqetVDizUCudTWLfdZytQu0rg==",
7
- "gitHead": "10a45367e033a32026987a75d6f401e37340c86f"
4
+ "version": "2.34.0",
5
+ "tarball": "https://registry.npmjs.org/pi-mcp-adapter/-/pi-mcp-adapter-2.34.0.tgz",
6
+ "integrity": "sha512-3YzoYQlxwKQjk4co0MMnRrhTNWzw5XsoCKCuhfZkIa9XSRBbrOLbi32yu7KOn6Unyk/K0rTof1lX/7cSLobudg==",
7
+ "shasum": "d2dc31a685a94b60a1c3570d9eb8a3b189eff10f",
8
+ "gitHead": null,
9
+ "provenanceNote": "2.34.0 published without gitHead; accepted on integrity, shasum and npm signature (2026-09-17)"
8
10
  }