@codemieai/code 0.15.5 → 0.15.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  2. package/dist/agents/core/AgentCLI.js +3 -0
  3. package/dist/agents/core/AgentCLI.js.map +1 -1
  4. package/dist/agents/core/BaseAgentAdapter.d.ts +4 -1
  5. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  6. package/dist/agents/core/BaseAgentAdapter.js +15 -0
  7. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  8. package/dist/agents/core/session/SessionStore.d.ts +6 -0
  9. package/dist/agents/core/session/SessionStore.d.ts.map +1 -1
  10. package/dist/agents/core/session/SessionStore.js +38 -0
  11. package/dist/agents/core/session/SessionStore.js.map +1 -1
  12. package/dist/agents/core/session/types.d.ts +2 -0
  13. package/dist/agents/core/session/types.d.ts.map +1 -1
  14. package/dist/agents/core/types.d.ts +10 -0
  15. package/dist/agents/core/types.d.ts.map +1 -1
  16. package/dist/agents/core/types.js +5 -1
  17. package/dist/agents/core/types.js.map +1 -1
  18. package/dist/agents/plugins/claude/claude.models.d.ts +19 -3
  19. package/dist/agents/plugins/claude/claude.models.d.ts.map +1 -1
  20. package/dist/agents/plugins/claude/claude.models.js +116 -64
  21. package/dist/agents/plugins/claude/claude.models.js.map +1 -1
  22. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  23. package/dist/agents/plugins/claude/claude.plugin.js +25 -4
  24. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  25. package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
  26. package/dist/agents/plugins/claude/plugin/skills/codemie-assistant-builder/SKILL.md +177 -0
  27. package/dist/agents/plugins/claude/plugin/skills/codemie-assistant-builder/agents/grader.md +38 -0
  28. package/dist/agents/plugins/claude/plugin/skills/codemie-assistant-builder/agents/improver.md +40 -0
  29. package/dist/agents/plugins/claude/plugin/skills/codemie-sdk/SKILL.md +10 -1
  30. package/dist/agents/plugins/claude/plugin/skills/codemie-sdk/examples/assistants.md +23 -0
  31. package/dist/agents/plugins/claude/plugin/statusline.bundle.mjs +57 -21
  32. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts +13 -0
  33. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
  34. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +27 -1
  35. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
  36. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts +6 -0
  37. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts.map +1 -1
  38. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js +21 -0
  39. package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js.map +1 -1
  40. package/dist/agents/plugins/claude/session/processors/messages-before.d.ts +11 -0
  41. package/dist/agents/plugins/claude/session/processors/messages-before.d.ts.map +1 -0
  42. package/dist/agents/plugins/claude/session/processors/messages-before.js +15 -0
  43. package/dist/agents/plugins/claude/session/processors/messages-before.js.map +1 -0
  44. package/dist/agents/plugins/claude/statusline-installer.d.ts +9 -0
  45. package/dist/agents/plugins/claude/statusline-installer.d.ts.map +1 -1
  46. package/dist/agents/plugins/claude/statusline-installer.js +42 -27
  47. package/dist/agents/plugins/claude/statusline-installer.js.map +1 -1
  48. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.d.ts +3 -0
  49. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.d.ts.map +1 -0
  50. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.js +3 -0
  51. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.js.map +1 -0
  52. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.d.ts +11 -0
  53. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.d.ts.map +1 -0
  54. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.js +65 -0
  55. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.js.map +1 -0
  56. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.d.ts +63 -0
  57. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.d.ts.map +1 -0
  58. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.js +13 -0
  59. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.js.map +1 -0
  60. package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
  61. package/dist/agents/plugins/codemie-code.plugin.js +6 -4
  62. package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
  63. package/dist/agents/plugins/codex/codex-models.d.ts.map +1 -1
  64. package/dist/agents/plugins/codex/codex-models.js +9 -6
  65. package/dist/agents/plugins/codex/codex-models.js.map +1 -1
  66. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  67. package/dist/agents/plugins/codex/codex.plugin.js +2 -1
  68. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  69. package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts +3 -2
  70. package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
  71. package/dist/agents/plugins/opencode/opencode-dynamic-models.js +14 -6
  72. package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
  73. package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
  74. package/dist/agents/plugins/opencode/opencode.plugin.js +6 -4
  75. package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
  76. package/dist/agents/plugins/utils.d.ts +11 -0
  77. package/dist/agents/plugins/utils.d.ts.map +1 -0
  78. package/dist/agents/plugins/utils.js +46 -0
  79. package/dist/agents/plugins/utils.js.map +1 -0
  80. package/dist/agents/registry.d.ts +3 -1
  81. package/dist/agents/registry.d.ts.map +1 -1
  82. package/dist/agents/registry.js +12 -0
  83. package/dist/agents/registry.js.map +1 -1
  84. package/dist/bin/proxy-daemon.js +4 -0
  85. package/dist/bin/proxy-daemon.js.map +1 -1
  86. package/dist/cli/commands/assistants/setup/configuration/selection.d.ts +3 -1
  87. package/dist/cli/commands/assistants/setup/configuration/selection.d.ts.map +1 -1
  88. package/dist/cli/commands/assistants/setup/configuration/selection.js +6 -3
  89. package/dist/cli/commands/assistants/setup/configuration/selection.js.map +1 -1
  90. package/dist/cli/commands/assistants/setup/configuration/types.d.ts +2 -0
  91. package/dist/cli/commands/assistants/setup/configuration/types.d.ts.map +1 -1
  92. package/dist/cli/commands/assistants/setup/configuration/ui.d.ts.map +1 -1
  93. package/dist/cli/commands/assistants/setup/configuration/ui.js +3 -0
  94. package/dist/cli/commands/assistants/setup/configuration/ui.js.map +1 -1
  95. package/dist/cli/commands/assistants/setup/data.d.ts +6 -2
  96. package/dist/cli/commands/assistants/setup/data.d.ts.map +1 -1
  97. package/dist/cli/commands/assistants/setup/data.js +23 -8
  98. package/dist/cli/commands/assistants/setup/data.js.map +1 -1
  99. package/dist/cli/commands/assistants/setup/helpers.d.ts +1 -0
  100. package/dist/cli/commands/assistants/setup/helpers.d.ts.map +1 -1
  101. package/dist/cli/commands/assistants/setup/helpers.js +11 -0
  102. package/dist/cli/commands/assistants/setup/helpers.js.map +1 -1
  103. package/dist/cli/commands/assistants/setup/index.d.ts.map +1 -1
  104. package/dist/cli/commands/assistants/setup/index.js +24 -6
  105. package/dist/cli/commands/assistants/setup/index.js.map +1 -1
  106. package/dist/cli/commands/assistants/setup/manualConfiguration/index.d.ts +2 -1
  107. package/dist/cli/commands/assistants/setup/manualConfiguration/index.d.ts.map +1 -1
  108. package/dist/cli/commands/assistants/setup/manualConfiguration/index.js +5 -3
  109. package/dist/cli/commands/assistants/setup/manualConfiguration/index.js.map +1 -1
  110. package/dist/cli/commands/assistants/setup/manualConfiguration/types.d.ts +2 -0
  111. package/dist/cli/commands/assistants/setup/manualConfiguration/types.d.ts.map +1 -1
  112. package/dist/cli/commands/assistants/setup/manualConfiguration/ui.d.ts.map +1 -1
  113. package/dist/cli/commands/assistants/setup/manualConfiguration/ui.js +3 -0
  114. package/dist/cli/commands/assistants/setup/manualConfiguration/ui.js.map +1 -1
  115. package/dist/cli/commands/hook.d.ts.map +1 -1
  116. package/dist/cli/commands/hook.js +24 -29
  117. package/dist/cli/commands/hook.js.map +1 -1
  118. package/dist/cli/commands/proxy/connect-orchestrator.d.ts +8 -1
  119. package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -1
  120. package/dist/cli/commands/proxy/connect-orchestrator.js +65 -4
  121. package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -1
  122. package/dist/cli/commands/proxy/connectors/claude-code-otlp.d.ts +33 -0
  123. package/dist/cli/commands/proxy/connectors/claude-code-otlp.d.ts.map +1 -0
  124. package/dist/cli/commands/proxy/connectors/claude-code-otlp.js +299 -0
  125. package/dist/cli/commands/proxy/connectors/claude-code-otlp.js.map +1 -0
  126. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts.map +1 -1
  127. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js +5 -6
  128. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js.map +1 -1
  129. package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts +2 -0
  130. package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts.map +1 -1
  131. package/dist/cli/commands/proxy/disconnect-orchestrator.js +34 -5
  132. package/dist/cli/commands/proxy/disconnect-orchestrator.js.map +1 -1
  133. package/dist/cli/commands/proxy/index.d.ts.map +1 -1
  134. package/dist/cli/commands/proxy/index.js +19 -2
  135. package/dist/cli/commands/proxy/index.js.map +1 -1
  136. package/dist/cli/commands/sdk/assistant-builder/checks.d.ts +4 -0
  137. package/dist/cli/commands/sdk/assistant-builder/checks.d.ts.map +1 -0
  138. package/dist/cli/commands/sdk/assistant-builder/checks.js +32 -0
  139. package/dist/cli/commands/sdk/assistant-builder/checks.js.map +1 -0
  140. package/dist/cli/commands/sdk/assistant-builder/commands.d.ts +6 -0
  141. package/dist/cli/commands/sdk/assistant-builder/commands.d.ts.map +1 -0
  142. package/dist/cli/commands/sdk/assistant-builder/commands.js +278 -0
  143. package/dist/cli/commands/sdk/assistant-builder/commands.js.map +1 -0
  144. package/dist/cli/commands/sdk/assistant-builder/conversations.d.ts +26 -0
  145. package/dist/cli/commands/sdk/assistant-builder/conversations.d.ts.map +1 -0
  146. package/dist/cli/commands/sdk/assistant-builder/conversations.js +45 -0
  147. package/dist/cli/commands/sdk/assistant-builder/conversations.js.map +1 -0
  148. package/dist/cli/commands/sdk/assistant-builder/normalize.d.ts +11 -0
  149. package/dist/cli/commands/sdk/assistant-builder/normalize.d.ts.map +1 -0
  150. package/dist/cli/commands/sdk/assistant-builder/normalize.js +43 -0
  151. package/dist/cli/commands/sdk/assistant-builder/normalize.js.map +1 -0
  152. package/dist/cli/commands/sdk/assistant-builder/output.d.ts +10 -0
  153. package/dist/cli/commands/sdk/assistant-builder/output.d.ts.map +1 -0
  154. package/dist/cli/commands/sdk/assistant-builder/output.js +29 -0
  155. package/dist/cli/commands/sdk/assistant-builder/output.js.map +1 -0
  156. package/dist/cli/commands/sdk/assistant-builder/report/compare.d.ts +23 -0
  157. package/dist/cli/commands/sdk/assistant-builder/report/compare.d.ts.map +1 -0
  158. package/dist/cli/commands/sdk/assistant-builder/report/compare.js +66 -0
  159. package/dist/cli/commands/sdk/assistant-builder/report/compare.js.map +1 -0
  160. package/dist/cli/commands/sdk/assistant-builder/report/html.d.ts +9 -0
  161. package/dist/cli/commands/sdk/assistant-builder/report/html.d.ts.map +1 -0
  162. package/dist/cli/commands/sdk/assistant-builder/report/html.js +87 -0
  163. package/dist/cli/commands/sdk/assistant-builder/report/html.js.map +1 -0
  164. package/dist/cli/commands/sdk/assistant-builder/report/summary.d.ts +31 -0
  165. package/dist/cli/commands/sdk/assistant-builder/report/summary.d.ts.map +1 -0
  166. package/dist/cli/commands/sdk/assistant-builder/report/summary.js +56 -0
  167. package/dist/cli/commands/sdk/assistant-builder/report/summary.js.map +1 -0
  168. package/dist/cli/commands/sdk/assistant-builder/report/workspace.d.ts +19 -0
  169. package/dist/cli/commands/sdk/assistant-builder/report/workspace.d.ts.map +1 -0
  170. package/dist/cli/commands/sdk/assistant-builder/report/workspace.js +112 -0
  171. package/dist/cli/commands/sdk/assistant-builder/report/workspace.js.map +1 -0
  172. package/dist/cli/commands/sdk/assistant-builder/runner.d.ts +32 -0
  173. package/dist/cli/commands/sdk/assistant-builder/runner.d.ts.map +1 -0
  174. package/dist/cli/commands/sdk/assistant-builder/runner.js +109 -0
  175. package/dist/cli/commands/sdk/assistant-builder/runner.js.map +1 -0
  176. package/dist/cli/commands/sdk/assistant-builder/scenarios.d.ts +5 -0
  177. package/dist/cli/commands/sdk/assistant-builder/scenarios.d.ts.map +1 -0
  178. package/dist/cli/commands/sdk/assistant-builder/scenarios.js +66 -0
  179. package/dist/cli/commands/sdk/assistant-builder/scenarios.js.map +1 -0
  180. package/dist/cli/commands/sdk/assistant-builder/types.d.ts +70 -0
  181. package/dist/cli/commands/sdk/assistant-builder/types.d.ts.map +1 -0
  182. package/dist/cli/commands/sdk/assistant-builder/types.js +2 -0
  183. package/dist/cli/commands/sdk/assistant-builder/types.js.map +1 -0
  184. package/dist/cli/commands/sdk/assistants.d.ts.map +1 -1
  185. package/dist/cli/commands/sdk/assistants.js +2 -0
  186. package/dist/cli/commands/sdk/assistants.js.map +1 -1
  187. package/dist/cli/commands/sdk/services/assistants.d.ts +20 -1
  188. package/dist/cli/commands/sdk/services/assistants.d.ts.map +1 -1
  189. package/dist/cli/commands/sdk/services/assistants.js +80 -2
  190. package/dist/cli/commands/sdk/services/assistants.js.map +1 -1
  191. package/dist/cli/commands/sdk/utils/cli-utils.js +1 -1
  192. package/dist/cli/commands/sdk/utils/cli-utils.js.map +1 -1
  193. package/dist/cli/commands/self-update.d.ts.map +1 -1
  194. package/dist/cli/commands/self-update.js +5 -1
  195. package/dist/cli/commands/self-update.js.map +1 -1
  196. package/dist/cli/commands/shared/constants.d.ts +3 -0
  197. package/dist/cli/commands/shared/constants.d.ts.map +1 -1
  198. package/dist/cli/commands/shared/constants.js +3 -0
  199. package/dist/cli/commands/shared/constants.js.map +1 -1
  200. package/dist/cli/commands/shared/prompts/storage-scope.d.ts +3 -1
  201. package/dist/cli/commands/shared/prompts/storage-scope.d.ts.map +1 -1
  202. package/dist/cli/commands/shared/prompts/storage-scope.js +5 -1
  203. package/dist/cli/commands/shared/prompts/storage-scope.js.map +1 -1
  204. package/dist/cli/commands/skills/setup/data.d.ts +5 -1
  205. package/dist/cli/commands/skills/setup/data.d.ts.map +1 -1
  206. package/dist/cli/commands/skills/setup/data.js +17 -8
  207. package/dist/cli/commands/skills/setup/data.js.map +1 -1
  208. package/dist/cli/commands/skills/setup/helpers.d.ts +1 -0
  209. package/dist/cli/commands/skills/setup/helpers.d.ts.map +1 -1
  210. package/dist/cli/commands/skills/setup/helpers.js +11 -0
  211. package/dist/cli/commands/skills/setup/helpers.js.map +1 -1
  212. package/dist/cli/commands/skills/setup/index.d.ts.map +1 -1
  213. package/dist/cli/commands/skills/setup/index.js +7 -2
  214. package/dist/cli/commands/skills/setup/index.js.map +1 -1
  215. package/dist/cli/index.js +2 -0
  216. package/dist/cli/index.js.map +1 -1
  217. package/dist/mcp/stdio-http-bridge.d.ts.map +1 -1
  218. package/dist/mcp/stdio-http-bridge.js +4 -0
  219. package/dist/mcp/stdio-http-bridge.js.map +1 -1
  220. package/dist/providers/core/base/http-client.d.ts.map +1 -1
  221. package/dist/providers/core/base/http-client.js +16 -3
  222. package/dist/providers/core/base/http-client.js.map +1 -1
  223. package/dist/providers/core/codemie-auth-helpers.d.ts.map +1 -1
  224. package/dist/providers/core/codemie-auth-helpers.js +2 -1
  225. package/dist/providers/core/codemie-auth-helpers.js.map +1 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/core/types.d.ts.map +1 -1
  228. package/dist/providers/core/types.js.map +1 -1
  229. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  230. package/dist/providers/plugins/sso/proxy/plugins/index.js +2 -0
  231. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  232. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.d.ts +3 -0
  233. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.d.ts.map +1 -0
  234. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.js +19 -0
  235. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.js.map +1 -0
  236. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.d.ts +19 -0
  237. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.d.ts.map +1 -0
  238. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.js +33 -0
  239. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.js.map +1 -0
  240. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.d.ts +14 -0
  241. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.d.ts.map +1 -0
  242. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.js +287 -0
  243. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.js.map +1 -0
  244. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.d.ts +8 -0
  245. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.d.ts.map +1 -0
  246. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.js +29 -0
  247. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.js.map +1 -0
  248. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.d.ts +40 -0
  249. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.d.ts.map +1 -0
  250. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.js +82 -0
  251. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.js.map +1 -0
  252. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.d.ts +36 -0
  253. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.d.ts.map +1 -0
  254. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.js +62 -0
  255. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.js.map +1 -0
  256. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.d.ts +39 -0
  257. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.d.ts.map +1 -0
  258. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.js +110 -0
  259. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.js.map +1 -0
  260. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.d.ts +24 -0
  261. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.d.ts.map +1 -0
  262. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.js +53 -0
  263. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.js.map +1 -0
  264. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.d.ts +39 -0
  265. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.d.ts.map +1 -0
  266. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.js +61 -0
  267. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.js.map +1 -0
  268. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.d.ts +20 -0
  269. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.d.ts.map +1 -0
  270. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.js +73 -0
  271. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.js.map +1 -0
  272. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.d.ts +12 -0
  273. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.d.ts.map +1 -0
  274. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.js +55 -0
  275. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.js.map +1 -0
  276. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.d.ts +14 -0
  277. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.d.ts.map +1 -0
  278. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.js +221 -0
  279. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.js.map +1 -0
  280. package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts +1 -4
  281. package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts.map +1 -1
  282. package/dist/providers/plugins/sso/proxy/proxy-http-client.js +10 -207
  283. package/dist/providers/plugins/sso/proxy/proxy-http-client.js.map +1 -1
  284. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  285. package/dist/providers/plugins/sso/proxy/sso.proxy.js +2 -1
  286. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  287. package/dist/providers/plugins/sso/sso.auth-gate.d.ts +18 -0
  288. package/dist/providers/plugins/sso/sso.auth-gate.d.ts.map +1 -0
  289. package/dist/providers/plugins/sso/sso.auth-gate.js +48 -0
  290. package/dist/providers/plugins/sso/sso.auth-gate.js.map +1 -0
  291. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
  292. package/dist/providers/plugins/sso/sso.auth.js +14 -4
  293. package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
  294. package/dist/providers/plugins/sso/sso.http-client.d.ts +17 -0
  295. package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -1
  296. package/dist/providers/plugins/sso/sso.http-client.js +33 -5
  297. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  298. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.d.ts +3 -0
  299. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.d.ts.map +1 -1
  300. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.js +43 -2
  301. package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.js.map +1 -1
  302. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.d.ts.map +1 -1
  303. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js +12 -10
  304. package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js.map +1 -1
  305. package/dist/telemetry/runtime/DesktopRepositoryResolver.d.ts.map +1 -1
  306. package/dist/telemetry/runtime/DesktopRepositoryResolver.js +33 -6
  307. package/dist/telemetry/runtime/DesktopRepositoryResolver.js.map +1 -1
  308. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts +2 -0
  309. package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -1
  310. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +61 -10
  311. package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -1
  312. package/dist/telemetry/runtime/checkpoints.d.ts +6 -0
  313. package/dist/telemetry/runtime/checkpoints.d.ts.map +1 -1
  314. package/dist/telemetry/runtime/checkpoints.js.map +1 -1
  315. package/dist/telemetry/runtime/types.d.ts +5 -0
  316. package/dist/telemetry/runtime/types.d.ts.map +1 -1
  317. package/dist/utils/auth.d.ts.map +1 -1
  318. package/dist/utils/auth.js +4 -0
  319. package/dist/utils/auth.js.map +1 -1
  320. package/dist/utils/cli-updater.d.ts +7 -0
  321. package/dist/utils/cli-updater.d.ts.map +1 -1
  322. package/dist/utils/cli-updater.js +21 -0
  323. package/dist/utils/cli-updater.js.map +1 -1
  324. package/dist/utils/paths.d.ts +1 -1
  325. package/dist/utils/paths.d.ts.map +1 -1
  326. package/dist/utils/paths.js +1 -1
  327. package/dist/utils/paths.js.map +1 -1
  328. package/dist/utils/pricing.json +9 -1
  329. package/dist/utils/processes.d.ts.map +1 -1
  330. package/dist/utils/processes.js +3 -2
  331. package/dist/utils/processes.js.map +1 -1
  332. package/dist/utils/project-root.d.ts +10 -0
  333. package/dist/utils/project-root.d.ts.map +1 -0
  334. package/dist/utils/project-root.js +25 -0
  335. package/dist/utils/project-root.js.map +1 -0
  336. package/dist/utils/sdk-client.d.ts.map +1 -1
  337. package/dist/utils/sdk-client.js +4 -0
  338. package/dist/utils/sdk-client.js.map +1 -1
  339. package/dist/utils/system-proxy-dispatcher.d.ts +8 -0
  340. package/dist/utils/system-proxy-dispatcher.d.ts.map +1 -0
  341. package/dist/utils/system-proxy-dispatcher.js +100 -0
  342. package/dist/utils/system-proxy-dispatcher.js.map +1 -0
  343. package/dist/utils/system-proxy.d.ts +115 -0
  344. package/dist/utils/system-proxy.d.ts.map +1 -0
  345. package/dist/utils/system-proxy.js +899 -0
  346. package/dist/utils/system-proxy.js.map +1 -0
  347. package/dist/utils/windows-path.d.ts +5 -0
  348. package/dist/utils/windows-path.d.ts.map +1 -1
  349. package/dist/utils/windows-path.js +1 -1
  350. package/dist/utils/windows-path.js.map +1 -1
  351. package/package.json +5 -2
  352. package/scripts/bundle-statusline.mjs +14 -1
@@ -0,0 +1,899 @@
1
+ /**
2
+ * System Proxy Resolution
3
+ *
4
+ * Resolves the effective proxy for an outbound request, in precedence order:
5
+ * 1. `HTTPS_PROXY` / `HTTP_PROXY` / `NO_PROXY` environment variables
6
+ * 2. Windows Internet Settings — `ProxyOverride`, then `AutoConfigURL` (PAC),
7
+ * then the static `ProxyServer` only when the PAC is unavailable
8
+ *
9
+ * Node's `http`/`https` modules never consult any system proxy configuration, so
10
+ * without this module Windows users behind a PAC-based corporate proxy (Zscaler
11
+ * and similar) have to discover and hand-set `HTTPS_PROXY` themselves.
12
+ *
13
+ * Set `CODEMIE_NO_SYSTEM_PROXY=1` to skip system detection and use env vars only.
14
+ */
15
+ import http from 'http';
16
+ import https from 'https';
17
+ import { createConnection } from 'node:net';
18
+ import { readFileSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { homedir, platform } from 'node:os';
21
+ import { isIP } from 'node:net';
22
+ import { HttpsProxyAgent } from 'https-proxy-agent';
23
+ import { HttpProxyAgent } from 'http-proxy-agent';
24
+ import { exec } from './exec.js';
25
+ import { logger } from './logger.js';
26
+ import { sanitizeLogArgs } from './security.js';
27
+ import { getWindowsSystem32 } from './windows-path.js';
28
+ const USER_INTERNET_SETTINGS_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings';
29
+ const MACHINE_INTERNET_SETTINGS_KEY = 'HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings';
30
+ const INTERNET_SETTINGS_POLICY_KEY = 'HKLM\\Software\\Policies\\Microsoft\\Windows\\CurrentVersion\\Internet Settings';
31
+ /** Registry read is a subprocess spawn; keep it short so startup never stalls. */
32
+ const REGISTRY_TIMEOUT_MS = 5000;
33
+ /** PAC discovery must not hold every CLI invocation hostage when the VPN is down. */
34
+ const PAC_FETCH_TIMEOUT_MS = 3000;
35
+ /** PAC scripts are executable input; bound memory before compiling them. */
36
+ const MAX_PAC_BYTES = 1024 * 1024;
37
+ /** TCP reachability probe when a PAC offers several proxies. */
38
+ const PROXY_PROBE_TIMEOUT_MS = 3000;
39
+ const CONFIG_SUCCESS_TTL_MS = 5 * 60 * 1000;
40
+ const FAILURE_TTL_MS = 5000;
41
+ const PAC_RESOLVER_TTL_MS = 5 * 60 * 1000;
42
+ const PAC_RESULT_TTL_MS = 60 * 1000;
43
+ /**
44
+ * Never proxied. The CLI's own LLM proxy listens on loopback, so routing these
45
+ * through a corporate proxy would break every agent session.
46
+ */
47
+ export const IMPLICIT_NO_PROXY = ['localhost', '127.0.0.1', '::1'];
48
+ export function splitRules(raw, separator = ',') {
49
+ if (!raw)
50
+ return [];
51
+ return raw
52
+ .split(separator)
53
+ .map(entry => entry.trim())
54
+ .filter(Boolean);
55
+ }
56
+ function parseIpv4(ip) {
57
+ const parts = ip.split('.');
58
+ if (parts.length !== 4)
59
+ return null;
60
+ const nums = parts.map(p => Number.parseInt(p, 10));
61
+ if (nums.some(n => !Number.isFinite(n) || n < 0 || n > 255))
62
+ return null;
63
+ return (((nums[0] << 24) >>> 0) | ((nums[1] << 16) >>> 0) | ((nums[2] << 8) >>> 0) | nums[3]) >>> 0;
64
+ }
65
+ function parseCidr(raw) {
66
+ const [ip, maskRaw] = raw.split('/');
67
+ if (!ip || !maskRaw)
68
+ return null;
69
+ const maskBits = Number.parseInt(maskRaw, 10);
70
+ if (!Number.isFinite(maskBits) || maskBits < 0 || maskBits > 32)
71
+ return null;
72
+ const base = parseIpv4(ip);
73
+ if (base === null)
74
+ return null;
75
+ return { base, maskBits };
76
+ }
77
+ /** Convert Windows trailing-octet wildcards such as `192.168.*` to CIDR. */
78
+ function parseIpv4Wildcard(raw) {
79
+ const parts = raw.split('.');
80
+ if (parts.length < 2 || parts.length > 4)
81
+ return null;
82
+ const wildcardIndex = parts.indexOf('*');
83
+ if (wildcardIndex < 1 || parts.slice(wildcardIndex).some(part => part !== '*'))
84
+ return null;
85
+ const numericParts = parts.slice(0, wildcardIndex);
86
+ if (numericParts.some(part => !/^\d+$/.test(part) || Number(part) > 255))
87
+ return null;
88
+ const octets = [...numericParts, ...Array.from({ length: 4 - numericParts.length }, () => '0')];
89
+ const base = parseIpv4(octets.join('.'));
90
+ return base === null ? null : { base, maskBits: wildcardIndex * 8 };
91
+ }
92
+ function ipInCidr(ip, base, maskBits) {
93
+ const value = parseIpv4(ip);
94
+ if (value === null)
95
+ return false;
96
+ const mask = maskBits === 0 ? 0 : ((0xffffffff << (32 - maskBits)) >>> 0);
97
+ return (value & mask) === (base & mask);
98
+ }
99
+ function parseHostPort(raw) {
100
+ if (raw.startsWith('[')) {
101
+ const closingBracket = raw.indexOf(']');
102
+ if (closingBracket > 0 && raw[closingBracket + 1] === ':') {
103
+ const portRaw = raw.slice(closingBracket + 2);
104
+ const port = Number.parseInt(portRaw, 10);
105
+ if (/^\d+$/.test(portRaw) && port >= 1 && port <= 65535) {
106
+ return { host: raw.slice(1, closingBracket), port };
107
+ }
108
+ }
109
+ return { host: raw };
110
+ }
111
+ const separator = raw.lastIndexOf(':');
112
+ if (separator > 0 && raw.indexOf(':') === separator) {
113
+ const host = raw.slice(0, separator);
114
+ const portRaw = raw.slice(separator + 1);
115
+ const port = Number.parseInt(portRaw, 10);
116
+ if (/^\d+$/.test(portRaw) && port >= 1 && port <= 65535) {
117
+ return { host, port };
118
+ }
119
+ }
120
+ return { host: raw };
121
+ }
122
+ export function parseNoProxyRules(values) {
123
+ const rules = [];
124
+ for (const raw of values) {
125
+ const value = raw.toLowerCase();
126
+ if (!value)
127
+ continue;
128
+ if (value === '*') {
129
+ rules.push({ kind: 'all' });
130
+ continue;
131
+ }
132
+ // Windows ProxyOverride tokens: <local> means "hostnames without a dot".
133
+ if (value === '<local>') {
134
+ rules.push({ kind: 'plain-hostname' });
135
+ continue;
136
+ }
137
+ // <-loopback> is a Windows directive, not a bypass entry; loopback is
138
+ // already covered by the implicit localhost rules below.
139
+ if (value === '<-loopback>')
140
+ continue;
141
+ const cidr = parseCidr(value) ?? parseIpv4Wildcard(value);
142
+ if (cidr) {
143
+ rules.push({ kind: 'cidr', ...cidr });
144
+ continue;
145
+ }
146
+ // Windows writes wildcard entries as *.example.com; treat them as domains.
147
+ const normalized = value.startsWith('*.') ? value.slice(1) : value;
148
+ const { host, port } = parseHostPort(normalized);
149
+ if (host.startsWith('.')) {
150
+ rules.push({ kind: 'domain', value: host.slice(1), port });
151
+ continue;
152
+ }
153
+ rules.push({ kind: 'host', value: host, port });
154
+ }
155
+ return rules;
156
+ }
157
+ function readNpmNoProxyEntries() {
158
+ try {
159
+ const npmrcPath = join(homedir(), '.npmrc');
160
+ const raw = readFileSync(npmrcPath, 'utf-8');
161
+ for (const lineRaw of raw.split(/\r?\n/)) {
162
+ const line = lineRaw.trim();
163
+ if (!line || line.startsWith('#') || line.startsWith(';'))
164
+ continue;
165
+ const eq = line.indexOf('=');
166
+ if (eq <= 0)
167
+ continue;
168
+ const key = line.slice(0, eq).trim().toLowerCase();
169
+ if (key === 'noproxy' || key === 'no-proxy') {
170
+ return splitRules(line.slice(eq + 1).trim());
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ // No user npmrc or unreadable file — ignore.
176
+ }
177
+ return [];
178
+ }
179
+ function matchesPort(rule, port) {
180
+ return rule.port === undefined || rule.port === port;
181
+ }
182
+ export function shouldBypassProxy(hostname, port, rules) {
183
+ const host = hostname.toLowerCase().replace(/^\[|\]$/g, '');
184
+ for (const rule of rules) {
185
+ if (rule.kind === 'all')
186
+ return true;
187
+ if (rule.kind === 'plain-hostname') {
188
+ if (!host.includes('.'))
189
+ return true;
190
+ continue;
191
+ }
192
+ if (rule.kind === 'host') {
193
+ if (host === rule.value && matchesPort(rule, port))
194
+ return true;
195
+ continue;
196
+ }
197
+ if (rule.kind === 'domain') {
198
+ const matchesDomain = host === rule.value || host.endsWith(`.${rule.value}`);
199
+ if (matchesDomain && matchesPort(rule, port))
200
+ return true;
201
+ continue;
202
+ }
203
+ if (rule.kind === 'cidr' && isIP(host) === 4) {
204
+ if (ipInCidr(host, rule.base, rule.maskBits))
205
+ return true;
206
+ }
207
+ }
208
+ return false;
209
+ }
210
+ // ---------------------------------------------------------------------------
211
+ // Environment variables
212
+ // ---------------------------------------------------------------------------
213
+ const primedProxyEnvValues = new Map();
214
+ function getEnvProxyUrlForProtocol(protocol, ignorePrimedValues = false) {
215
+ const keys = protocol === 'https:'
216
+ ? ['HTTPS_PROXY', 'https_proxy', 'HTTP_PROXY', 'http_proxy']
217
+ : ['HTTP_PROXY', 'http_proxy'];
218
+ for (const key of keys) {
219
+ const value = process.env[key];
220
+ if (value
221
+ && (!ignorePrimedValues || primedProxyEnvValues.get(key.toLowerCase()) !== value)) {
222
+ return value;
223
+ }
224
+ }
225
+ return undefined;
226
+ }
227
+ export function getEnvProxyUrl(protocol) {
228
+ return getEnvProxyUrlForProtocol(protocol);
229
+ }
230
+ export function getEnvNoProxyEntries() {
231
+ return [
232
+ ...splitRules(process.env.NO_PROXY),
233
+ ...splitRules(process.env.no_proxy),
234
+ ...readNpmNoProxyEntries(),
235
+ ];
236
+ }
237
+ /**
238
+ * Parse `reg query` output lines of the form:
239
+ * ` ProxyEnable REG_DWORD 0x1`
240
+ */
241
+ function parseRegistryOutput(stdout) {
242
+ const values = {};
243
+ for (const line of stdout.split(/\r?\n/)) {
244
+ const match = /^\s+(\S+)\s+REG_(?:SZ|DWORD|EXPAND_SZ)\s+(.*)$/.exec(line);
245
+ if (!match)
246
+ continue;
247
+ values[match[1].toLowerCase()] = match[2].trim();
248
+ }
249
+ return values;
250
+ }
251
+ async function queryRegistryKey(key) {
252
+ try {
253
+ // SECURITY: resolve the trusted system binary directly; PATH/PATHEXT are attacker-controlled.
254
+ const regPath = `${getWindowsSystem32()}\\reg.exe`;
255
+ const result = await exec(regPath, ['query', key], {
256
+ timeout: REGISTRY_TIMEOUT_MS,
257
+ });
258
+ if (result.code !== 0) {
259
+ logger.debug('[system-proxy] Registry query failed', ...sanitizeLogArgs({ key, code: result.code, stderr: result.stderr }));
260
+ return undefined;
261
+ }
262
+ return parseRegistryOutput(result.stdout);
263
+ }
264
+ catch (error) {
265
+ logger.debug('[system-proxy] Unable to query Windows Internet Settings', ...sanitizeLogArgs({ key, error: error instanceof Error ? error.message : String(error) }));
266
+ return undefined;
267
+ }
268
+ }
269
+ async function readWindowsInternetSettings() {
270
+ const policyValues = await queryRegistryKey(INTERNET_SETTINGS_POLICY_KEY);
271
+ const useMachineSettings = Number.parseInt(policyValues?.['proxysettingsperuser'] ?? '1', 16) === 0;
272
+ const values = await queryRegistryKey(useMachineSettings ? MACHINE_INTERNET_SETTINGS_KEY : USER_INTERNET_SETTINGS_KEY);
273
+ if (!values)
274
+ return undefined;
275
+ return {
276
+ // REG_DWORD arrives as 0x0 / 0x1.
277
+ proxyEnable: Number.parseInt(values['proxyenable'] ?? '0', 16) === 1,
278
+ proxyServer: values['proxyserver'] || undefined,
279
+ proxyOverride: values['proxyoverride'] || undefined,
280
+ autoConfigUrl: values['autoconfigurl'] || undefined,
281
+ source: useMachineSettings ? 'machine' : 'user',
282
+ };
283
+ }
284
+ /**
285
+ * `ProxyServer` is either a bare `host:port` applying to every protocol, or a
286
+ * per-protocol list such as `http=host:80;https=host:443;socks=host:1080`.
287
+ */
288
+ function selectStaticProxy(proxyServer, protocol) {
289
+ if (!proxyServer.includes('=')) {
290
+ return normalizeProxyUrl(proxyServer);
291
+ }
292
+ const wanted = protocol === 'https:' ? 'https' : 'http';
293
+ const entries = new Map();
294
+ for (const entry of splitRules(proxyServer, ';')) {
295
+ const eq = entry.indexOf('=');
296
+ if (eq <= 0)
297
+ continue;
298
+ entries.set(entry.slice(0, eq).trim().toLowerCase(), entry.slice(eq + 1).trim());
299
+ }
300
+ const target = entries.get(wanted) ?? entries.get('http');
301
+ return target ? normalizeProxyUrl(target) : undefined;
302
+ }
303
+ function normalizeProxyUrl(raw) {
304
+ const value = raw.trim();
305
+ if (!value)
306
+ return undefined;
307
+ const candidate = /^[a-z][a-z0-9+.-]*:\/\//i.test(value) ? value : `http://${value}`;
308
+ try {
309
+ const parsed = new URL(candidate);
310
+ if (!['http:', 'https:'].includes(parsed.protocol) || !parsed.hostname)
311
+ return undefined;
312
+ if (parsed.pathname !== '/' || parsed.search || parsed.hash)
313
+ return undefined;
314
+ // URL canonicalization removes explicit default ports. Preserve them so
315
+ // diagnostics and child-process environment values match Windows/PAC input.
316
+ const authority = candidate.slice(candidate.indexOf('//') + 2).split(/[/?#]/, 1)[0];
317
+ const hostPort = authority.slice(authority.lastIndexOf('@') + 1);
318
+ const explicitPort = hostPort.startsWith('[')
319
+ ? /^\[[^\]]+\]:(\d+)$/.exec(hostPort)?.[1]
320
+ : /:(\d+)$/.exec(hostPort)?.[1];
321
+ const host = parsed.hostname.includes(':') && !parsed.hostname.startsWith('[')
322
+ ? `[${parsed.hostname}]`
323
+ : parsed.hostname;
324
+ const credentials = parsed.username
325
+ ? `${parsed.username}${parsed.password ? `:${parsed.password}` : ''}@`
326
+ : '';
327
+ const port = parsed.port || explicitPort;
328
+ return `${parsed.protocol}//${credentials}${host}${port ? `:${port}` : ''}`;
329
+ }
330
+ catch {
331
+ return undefined;
332
+ }
333
+ }
334
+ function sanitizedProxyForLog(raw) {
335
+ const normalized = normalizeProxyUrl(raw);
336
+ if (!normalized)
337
+ return '[invalid proxy]';
338
+ const parsed = new URL(normalized);
339
+ return `${parsed.protocol}//${parsed.host}`;
340
+ }
341
+ function sanitizedPacForLog(raw) {
342
+ try {
343
+ return new URL(raw).origin;
344
+ }
345
+ catch {
346
+ return '[invalid PAC URL]';
347
+ }
348
+ }
349
+ // ---------------------------------------------------------------------------
350
+ // PAC (Proxy Auto-Configuration)
351
+ // ---------------------------------------------------------------------------
352
+ /**
353
+ * Fetch the PAC script. Always goes direct — routing the PAC fetch through a
354
+ * proxy would be circular, and the PAC host is reachable on the corporate LAN.
355
+ */
356
+ async function fetchPacScript(pacUrl) {
357
+ return new Promise(resolve => {
358
+ let settled = false;
359
+ const done = (value) => {
360
+ if (settled)
361
+ return;
362
+ settled = true;
363
+ resolve(value);
364
+ };
365
+ try {
366
+ const url = new URL(pacUrl);
367
+ const client = url.protocol === 'https:' ? https : http;
368
+ const req = client.get(pacUrl, {
369
+ timeout: PAC_FETCH_TIMEOUT_MS,
370
+ agent: false,
371
+ ...(url.protocol === 'https:'
372
+ ? { rejectUnauthorized: isTlsVerificationEnabled() }
373
+ : {}),
374
+ }, res => {
375
+ if (!res.statusCode || res.statusCode < 200 || res.statusCode >= 300) {
376
+ logger.debug('[system-proxy] PAC fetch returned non-2xx', { status: res.statusCode });
377
+ res.resume();
378
+ done(undefined);
379
+ return;
380
+ }
381
+ let body = '';
382
+ let bytes = 0;
383
+ res.setEncoding('utf-8');
384
+ res.on('data', chunk => {
385
+ bytes += Buffer.byteLength(chunk);
386
+ if (bytes > MAX_PAC_BYTES) {
387
+ logger.debug('[system-proxy] PAC response exceeded size limit', { bytes, limit: MAX_PAC_BYTES });
388
+ res.destroy();
389
+ done(undefined);
390
+ return;
391
+ }
392
+ body += chunk;
393
+ });
394
+ res.on('end', () => done(body));
395
+ res.on('error', () => done(undefined));
396
+ });
397
+ req.on('error', error => {
398
+ logger.debug('[system-proxy] PAC fetch failed', ...sanitizeLogArgs({ error: error.message }));
399
+ done(undefined);
400
+ });
401
+ req.on('timeout', () => {
402
+ req.destroy();
403
+ done(undefined);
404
+ });
405
+ }
406
+ catch (error) {
407
+ logger.debug('[system-proxy] Invalid PAC URL', { errorType: error instanceof Error ? error.name : 'Error' });
408
+ done(undefined);
409
+ }
410
+ });
411
+ }
412
+ const pacResolverCache = new Map();
413
+ const pacResolverPromises = new Map();
414
+ async function getPacResolver(pacUrl) {
415
+ const cached = pacResolverCache.get(pacUrl);
416
+ if (cached && cached.expiresAt > Date.now())
417
+ return cached.value;
418
+ const inFlight = pacResolverPromises.get(pacUrl);
419
+ if (inFlight)
420
+ return inFlight;
421
+ const resolverPromise = (async () => {
422
+ const source = await fetchPacScript(pacUrl);
423
+ if (!source) {
424
+ pacResolverCache.set(pacUrl, { value: undefined, expiresAt: Date.now() + FAILURE_TTL_MS });
425
+ return undefined;
426
+ }
427
+ try {
428
+ // Imported lazily: most users have no PAC, and this pulls in a WASM runtime.
429
+ const [{ createPacResolver }, { QuickJS }] = await Promise.all([
430
+ import('pac-resolver'),
431
+ import('quickjs-wasi'),
432
+ ]);
433
+ // PAC scripts are fetched over plain HTTP from whatever AutoConfigURL
434
+ // points at, so they run inside the QuickJS WASM sandbox rather than
435
+ // Node's `vm` — a hostile PAC cannot reach the host process.
436
+ const qjs = await QuickJS.create();
437
+ logger.debug('[system-proxy] PAC script loaded', {
438
+ pacOrigin: sanitizedPacForLog(pacUrl),
439
+ bytes: Buffer.byteLength(source),
440
+ });
441
+ const resolver = createPacResolver(qjs, source);
442
+ pacResolverCache.set(pacUrl, {
443
+ value: resolver,
444
+ expiresAt: Date.now() + PAC_RESOLVER_TTL_MS,
445
+ });
446
+ return resolver;
447
+ }
448
+ catch (error) {
449
+ logger.debug('[system-proxy] Failed to compile PAC script', { errorType: error instanceof Error ? error.name : 'Error' });
450
+ pacResolverCache.set(pacUrl, { value: undefined, expiresAt: Date.now() + FAILURE_TTL_MS });
451
+ return undefined;
452
+ }
453
+ })();
454
+ pacResolverPromises.set(pacUrl, resolverPromise);
455
+ try {
456
+ return await resolverPromise;
457
+ }
458
+ finally {
459
+ pacResolverPromises.delete(pacUrl);
460
+ }
461
+ }
462
+ /** Convert a `FindProxyForURL` result into supported directives in order. */
463
+ function parsePacResult(result) {
464
+ const candidates = [];
465
+ for (const entry of splitRules(result, ';')) {
466
+ const [keywordRaw, ...rest] = entry.split(/\s+/);
467
+ const keyword = keywordRaw.toUpperCase();
468
+ if (keyword === 'DIRECT') {
469
+ return { candidates, directFallback: true };
470
+ }
471
+ // PROXY / HTTP / HTTPS / SOCKS / SOCKS5 host:port
472
+ const target = rest.join(' ').trim();
473
+ if (!target)
474
+ continue;
475
+ if (keyword === 'SOCKS' || keyword === 'SOCKS4' || keyword === 'SOCKS5') {
476
+ logger.debug('[system-proxy] Ignoring SOCKS entry from PAC (unsupported)');
477
+ continue;
478
+ }
479
+ if (keyword !== 'PROXY' && keyword !== 'HTTP' && keyword !== 'HTTPS') {
480
+ logger.debug('[system-proxy] Ignoring unsupported PAC directive', { keyword });
481
+ continue;
482
+ }
483
+ const scheme = keyword === 'HTTPS' ? 'https' : 'http';
484
+ const normalized = normalizeProxyUrl(`${scheme}://${target}`);
485
+ if (normalized)
486
+ candidates.push(normalized);
487
+ }
488
+ return { candidates, directFallback: false };
489
+ }
490
+ /** TCP-connect probe so a dead first PAC entry does not stall every request. */
491
+ async function isReachable(proxyUrl) {
492
+ return new Promise(resolve => {
493
+ let settled = false;
494
+ const done = (value) => {
495
+ if (settled)
496
+ return;
497
+ settled = true;
498
+ resolve(value);
499
+ };
500
+ try {
501
+ const url = new URL(proxyUrl);
502
+ const port = Number.parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80);
503
+ const socket = createConnection({ host: url.hostname, port });
504
+ socket.setTimeout(PROXY_PROBE_TIMEOUT_MS);
505
+ socket.once('connect', () => { socket.destroy(); done(true); });
506
+ socket.once('timeout', () => { socket.destroy(); done(false); });
507
+ socket.once('error', () => { socket.destroy(); done(false); });
508
+ }
509
+ catch {
510
+ done(false);
511
+ }
512
+ });
513
+ }
514
+ async function pickReachableProxy(candidates) {
515
+ if (candidates.length === 0)
516
+ return undefined;
517
+ for (const candidate of candidates) {
518
+ if (await isReachable(candidate)) {
519
+ logger.debug('[system-proxy] Selected reachable proxy', { proxy: sanitizedProxyForLog(candidate) });
520
+ return candidate;
521
+ }
522
+ logger.debug('[system-proxy] Proxy candidate unreachable, trying next', { proxy: sanitizedProxyForLog(candidate) });
523
+ }
524
+ return undefined;
525
+ }
526
+ let configCache = null;
527
+ let configPromise = null;
528
+ function systemDetectionDisabled() {
529
+ const flag = process.env.CODEMIE_NO_SYSTEM_PROXY;
530
+ return flag === '1' || flag === 'true';
531
+ }
532
+ async function loadConfig() {
533
+ const environmentNoProxyRules = parseNoProxyRules([
534
+ ...IMPLICIT_NO_PROXY,
535
+ ...getEnvNoProxyEntries(),
536
+ ]);
537
+ if (platform() !== 'win32' || systemDetectionDisabled()) {
538
+ return {
539
+ config: {
540
+ environmentNoProxyRules,
541
+ windowsNoProxyRules: [],
542
+ noProxyRules: environmentNoProxyRules,
543
+ },
544
+ cacheTtlMs: CONFIG_SUCCESS_TTL_MS,
545
+ };
546
+ }
547
+ const settings = await readWindowsInternetSettings();
548
+ const windowsNoProxyRules = parseNoProxyRules(splitRules(settings?.proxyOverride, ';'));
549
+ logger.debug('[system-proxy] Windows Internet Settings', ...sanitizeLogArgs({
550
+ source: settings?.source,
551
+ proxyEnable: settings?.proxyEnable,
552
+ hasProxyServer: !!settings?.proxyServer,
553
+ hasAutoConfigUrl: !!settings?.autoConfigUrl,
554
+ }));
555
+ return {
556
+ config: {
557
+ settings,
558
+ environmentNoProxyRules,
559
+ windowsNoProxyRules,
560
+ noProxyRules: [...environmentNoProxyRules, ...windowsNoProxyRules],
561
+ },
562
+ cacheTtlMs: settings ? CONFIG_SUCCESS_TTL_MS : FAILURE_TTL_MS,
563
+ };
564
+ }
565
+ /** Load the effective proxy configuration with bounded success/failure caching. */
566
+ export async function getSystemProxyConfig() {
567
+ if (configCache && configCache.expiresAt > Date.now())
568
+ return configCache.value;
569
+ if (configPromise)
570
+ return configPromise;
571
+ configPromise = (async () => {
572
+ const loaded = await loadConfig();
573
+ configCache = {
574
+ value: loaded.config,
575
+ expiresAt: Date.now() + loaded.cacheTtlMs,
576
+ };
577
+ return loaded.config;
578
+ })();
579
+ try {
580
+ return await configPromise;
581
+ }
582
+ finally {
583
+ configPromise = null;
584
+ }
585
+ }
586
+ /**
587
+ * Resolve a request to an explicit proxy, direct connection, or unavailable PAC.
588
+ *
589
+ * Explicit NO_PROXY applies first, then user proxy variables. Windows bypass,
590
+ * PAC and static settings are considered only when the user did not override
591
+ * routing through the environment.
592
+ */
593
+ export async function resolveProxyForUrlDetailed(url) {
594
+ const protocol = url.protocol === 'https:' ? 'https:' : 'http:';
595
+ const port = Number.parseInt(url.port, 10) || (protocol === 'https:' ? 443 : 80);
596
+ const config = await getSystemProxyConfig();
597
+ const environmentNoProxyRules = parseNoProxyRules([
598
+ ...IMPLICIT_NO_PROXY,
599
+ ...getEnvNoProxyEntries(),
600
+ ]);
601
+ if (shouldBypassProxy(url.hostname, port, environmentNoProxyRules)) {
602
+ return { kind: 'direct', source: 'bypass' };
603
+ }
604
+ const envProxy = getEnvProxyUrlForProtocol(protocol, true);
605
+ if (envProxy) {
606
+ const normalized = normalizeProxyUrl(envProxy);
607
+ if (normalized)
608
+ return { kind: 'proxy', url: normalized, source: 'environment' };
609
+ logger.debug('[system-proxy] Ignoring invalid environment proxy URL');
610
+ return { kind: 'direct', source: 'invalid-proxy' };
611
+ }
612
+ if (shouldBypassProxy(url.hostname, port, config.windowsNoProxyRules)) {
613
+ return { kind: 'direct', source: 'bypass' };
614
+ }
615
+ const settings = config.settings;
616
+ if (!settings)
617
+ return { kind: 'direct', source: 'none' };
618
+ if (settings.autoConfigUrl) {
619
+ const pacResolution = await resolveViaPac(settings.autoConfigUrl, url);
620
+ if (pacResolution.kind !== 'unavailable')
621
+ return pacResolution;
622
+ }
623
+ if (settings.proxyEnable && settings.proxyServer) {
624
+ const proxyUrl = selectStaticProxy(settings.proxyServer, protocol);
625
+ if (proxyUrl)
626
+ return { kind: 'proxy', url: proxyUrl, source: 'windows-static' };
627
+ logger.debug('[system-proxy] Ignoring invalid static proxy configuration');
628
+ return { kind: 'direct', source: 'invalid-proxy' };
629
+ }
630
+ return { kind: 'direct', source: 'none' };
631
+ }
632
+ /** Resolve the proxy URL for Node HTTP clients, or `undefined` for direct. */
633
+ export async function resolveProxyForUrl(url) {
634
+ const resolution = await resolveProxyForUrlDetailed(url);
635
+ return resolution.kind === 'proxy' ? resolution.url : undefined;
636
+ }
637
+ const pacResultCache = new Map();
638
+ async function resolveViaPac(pacUrl, url) {
639
+ const cacheKey = `${pacUrl}|${url.protocol}//${url.host}`;
640
+ const cached = pacResultCache.get(cacheKey);
641
+ if (cached && cached.expiresAt > Date.now())
642
+ return cached.value;
643
+ try {
644
+ const findProxy = await getPacResolver(pacUrl);
645
+ if (!findProxy) {
646
+ const unavailable = {
647
+ kind: 'unavailable',
648
+ source: 'pac',
649
+ reason: 'PAC script unavailable',
650
+ };
651
+ pacResultCache.set(cacheKey, { value: unavailable, expiresAt: Date.now() + FAILURE_TTL_MS });
652
+ return unavailable;
653
+ }
654
+ const result = await findProxy(url.href, url.hostname);
655
+ const { candidates, directFallback } = parsePacResult(String(result ?? ''));
656
+ if (candidates.length === 0 && directFallback) {
657
+ const direct = { kind: 'direct', source: 'pac' };
658
+ pacResultCache.set(cacheKey, { value: direct, expiresAt: Date.now() + PAC_RESULT_TTL_MS });
659
+ return direct;
660
+ }
661
+ const reachable = candidates.length === 1 && !directFallback
662
+ ? candidates[0]
663
+ : await pickReachableProxy(candidates);
664
+ const resolution = reachable
665
+ ? { kind: 'proxy', url: reachable, source: 'pac' }
666
+ : directFallback
667
+ ? { kind: 'direct', source: 'pac' }
668
+ : candidates.length > 0
669
+ ? { kind: 'proxy', url: candidates[0], source: 'pac' }
670
+ : { kind: 'unavailable', source: 'pac', reason: 'PAC returned no supported directives' };
671
+ logger.debug('[system-proxy] PAC resolution', ...sanitizeLogArgs({
672
+ host: url.hostname,
673
+ directiveCount: splitRules(String(result ?? ''), ';').length,
674
+ route: resolution.kind,
675
+ source: resolution.source,
676
+ proxy: resolution.kind === 'proxy' ? sanitizedProxyForLog(resolution.url) : undefined,
677
+ }));
678
+ pacResultCache.set(cacheKey, {
679
+ value: resolution,
680
+ expiresAt: Date.now() + (resolution.kind === 'unavailable' ? FAILURE_TTL_MS : PAC_RESULT_TTL_MS),
681
+ });
682
+ return resolution;
683
+ }
684
+ catch (error) {
685
+ logger.debug('[system-proxy] PAC evaluation failed', ...sanitizeLogArgs({
686
+ host: url.hostname,
687
+ errorType: error instanceof Error ? error.name : 'Error',
688
+ }));
689
+ const unavailable = {
690
+ kind: 'unavailable',
691
+ source: 'pac',
692
+ reason: 'PAC evaluation failed',
693
+ };
694
+ pacResultCache.set(cacheKey, { value: unavailable, expiresAt: Date.now() + FAILURE_TTL_MS });
695
+ return unavailable;
696
+ }
697
+ }
698
+ const agentCache = new Map();
699
+ /**
700
+ * Agent that routes `url` through the resolved proxy, or `undefined` when the
701
+ * request should go direct (letting Node use its default agent).
702
+ */
703
+ export async function getProxyAgentForUrl(url, options = {}) {
704
+ const proxyUrl = await resolveProxyForUrl(url);
705
+ if (!proxyUrl)
706
+ return undefined;
707
+ const isHttps = url.protocol === 'https:';
708
+ const rejectUnauthorized = options.rejectUnauthorized ?? isTlsVerificationEnabled();
709
+ const keepAlive = options.keepAlive ?? true;
710
+ const maxSockets = options.maxSockets ?? 50;
711
+ const cacheKey = `${isHttps ? 'https' : 'http'}|${proxyUrl}|${rejectUnauthorized}|${keepAlive}|${maxSockets}`;
712
+ const cached = agentCache.get(cacheKey);
713
+ if (cached)
714
+ return cached;
715
+ try {
716
+ const agent = isHttps
717
+ ? new HttpsProxyAgent(proxyUrl, {
718
+ rejectUnauthorized,
719
+ keepAlive,
720
+ maxSockets,
721
+ })
722
+ : new HttpProxyAgent(proxyUrl, { rejectUnauthorized, keepAlive, maxSockets });
723
+ agentCache.set(cacheKey, agent);
724
+ return agent;
725
+ }
726
+ catch (error) {
727
+ logger.debug('[system-proxy] Failed to construct proxy agent; continuing direct', ...sanitizeLogArgs({
728
+ proxy: sanitizedProxyForLog(proxyUrl),
729
+ error: error instanceof Error ? error.message : String(error),
730
+ }));
731
+ return undefined;
732
+ }
733
+ }
734
+ /**
735
+ * Return whether outbound TLS certificates must be verified.
736
+ *
737
+ * Callers pass the result as an explicit `rejectUnauthorized`, which overrides
738
+ * Node's own process-wide `NODE_TLS_REJECT_UNAUTHORIZED=0` opt-out, so honor it
739
+ * here alongside `CODEMIE_INSECURE`.
740
+ */
741
+ export function isTlsVerificationEnabled() {
742
+ return process.env.CODEMIE_INSECURE !== '1' && process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0';
743
+ }
744
+ function formatIpv4(value) {
745
+ return [24, 16, 8, 0].map(shift => (value >>> shift) & 0xff).join('.');
746
+ }
747
+ function normalizeWindowsOverrideForEnv(entry) {
748
+ if (entry.startsWith('<'))
749
+ return undefined;
750
+ if (entry.startsWith('*.'))
751
+ return entry.slice(1);
752
+ const wildcard = parseIpv4Wildcard(entry.toLowerCase());
753
+ return wildcard ? `${formatIpv4(wildcard.base)}/${wildcard.maskBits}` : entry;
754
+ }
755
+ /** Merge NO_PROXY spellings and implicit loopback entries without duplicates. */
756
+ export function mergeNoProxyValues(...values) {
757
+ const entries = [...values.flatMap(value => splitRules(value)), ...IMPLICIT_NO_PROXY];
758
+ const seen = new Set();
759
+ return entries
760
+ .filter(entry => {
761
+ const key = entry.toLowerCase();
762
+ if (seen.has(key))
763
+ return false;
764
+ seen.add(key);
765
+ return true;
766
+ })
767
+ .join(',');
768
+ }
769
+ /** Render representable Windows ProxyOverride entries into NO_PROXY syntax. */
770
+ async function getWindowsNoProxyValue() {
771
+ const { settings } = await getSystemProxyConfig();
772
+ const overrides = splitRules(settings?.proxyOverride, ';')
773
+ .map(normalizeWindowsOverrideForEnv)
774
+ .filter((entry) => Boolean(entry));
775
+ return overrides.join(',');
776
+ }
777
+ function setProxyEnvPair(env, upperKey, value, systemDerived) {
778
+ const lowerKey = upperKey.toLowerCase();
779
+ if (!env[upperKey])
780
+ env[upperKey] = value;
781
+ if (!env[lowerKey])
782
+ env[lowerKey] = value;
783
+ if (systemDerived && env === process.env) {
784
+ primedProxyEnvValues.set(lowerKey, value);
785
+ }
786
+ }
787
+ function existingProxyValue(env, upperKey) {
788
+ const lowerKey = upperKey.toLowerCase();
789
+ for (const key of [upperKey, lowerKey]) {
790
+ const value = env[key];
791
+ if (!value)
792
+ continue;
793
+ if (env !== process.env || primedProxyEnvValues.get(lowerKey) !== value)
794
+ return value;
795
+ }
796
+ return undefined;
797
+ }
798
+ function targetForProtocol(target, protocol) {
799
+ const result = new URL(target);
800
+ result.protocol = protocol;
801
+ if ((protocol === 'http:' && result.port === '443') || (protocol === 'https:' && result.port === '80')) {
802
+ result.port = '';
803
+ }
804
+ return result;
805
+ }
806
+ /**
807
+ * Build the best-effort proxy environment for SDKs and spawned tools.
808
+ * PAC routing is necessarily collapsed to the target host; in-process clients
809
+ * retain per-request accuracy through {@link resolveProxyForUrlDetailed}.
810
+ */
811
+ export async function buildSystemProxyEnvironment(targetUrl, baseEnv = process.env) {
812
+ const nextEnv = { ...baseEnv };
813
+ const target = new URL(targetUrl);
814
+ for (const [upperKey, protocol] of [
815
+ ['HTTP_PROXY', 'http:'],
816
+ ['HTTPS_PROXY', 'https:'],
817
+ ]) {
818
+ const lowerKey = upperKey.toLowerCase();
819
+ const primedValue = primedProxyEnvValues.get(lowerKey);
820
+ if (baseEnv === process.env && primedValue) {
821
+ if (nextEnv[upperKey] === primedValue)
822
+ delete nextEnv[upperKey];
823
+ if (nextEnv[lowerKey] === primedValue)
824
+ delete nextEnv[lowerKey];
825
+ }
826
+ const existing = existingProxyValue(baseEnv, upperKey);
827
+ if (existing) {
828
+ setProxyEnvPair(nextEnv, upperKey, existing, false);
829
+ continue;
830
+ }
831
+ const resolution = await resolveProxyForUrlDetailed(targetForProtocol(target, protocol));
832
+ if (resolution.kind === 'proxy') {
833
+ setProxyEnvPair(nextEnv, upperKey, resolution.url, true);
834
+ }
835
+ }
836
+ const windowsNoProxy = await getWindowsNoProxyValue();
837
+ const noProxy = mergeNoProxyValues(baseEnv.NO_PROXY, baseEnv.no_proxy, windowsNoProxy);
838
+ nextEnv.NO_PROXY = noProxy;
839
+ nextEnv.no_proxy = noProxy;
840
+ return nextEnv;
841
+ }
842
+ /** Apply the shared proxy environment to a mutable process or child environment. */
843
+ export async function applySystemProxyEnvironment(targetUrl, targetEnv = process.env) {
844
+ try {
845
+ const hadExplicitHttpProxy = Boolean(existingProxyValue(targetEnv, 'HTTP_PROXY'));
846
+ const hadExplicitHttpsProxy = Boolean(existingProxyValue(targetEnv, 'HTTPS_PROXY'));
847
+ const resolvedEnv = await buildSystemProxyEnvironment(targetUrl, targetEnv);
848
+ for (const key of ['HTTP_PROXY', 'http_proxy', 'HTTPS_PROXY', 'https_proxy', 'NO_PROXY', 'no_proxy']) {
849
+ if (resolvedEnv[key] !== undefined) {
850
+ targetEnv[key] = resolvedEnv[key];
851
+ }
852
+ else if (targetEnv === process.env
853
+ && primedProxyEnvValues.get(key.toLowerCase()) === targetEnv[key]) {
854
+ delete targetEnv[key];
855
+ }
856
+ }
857
+ if (targetEnv === process.env) {
858
+ if (hadExplicitHttpProxy) {
859
+ primedProxyEnvValues.delete('http_proxy');
860
+ }
861
+ else if (targetEnv.HTTP_PROXY) {
862
+ primedProxyEnvValues.set('http_proxy', targetEnv.HTTP_PROXY);
863
+ }
864
+ else if (!targetEnv.HTTP_PROXY && !targetEnv.http_proxy) {
865
+ primedProxyEnvValues.delete('http_proxy');
866
+ }
867
+ if (hadExplicitHttpsProxy) {
868
+ primedProxyEnvValues.delete('https_proxy');
869
+ }
870
+ else if (targetEnv.HTTPS_PROXY) {
871
+ primedProxyEnvValues.set('https_proxy', targetEnv.HTTPS_PROXY);
872
+ }
873
+ else if (!targetEnv.HTTPS_PROXY && !targetEnv.https_proxy) {
874
+ primedProxyEnvValues.delete('https_proxy');
875
+ }
876
+ }
877
+ logger.debug('[system-proxy] Applied proxy environment', ...sanitizeLogArgs({
878
+ hasHttpProxy: Boolean(targetEnv.HTTP_PROXY || targetEnv.http_proxy),
879
+ hasHttpsProxy: Boolean(targetEnv.HTTPS_PROXY || targetEnv.https_proxy),
880
+ noProxyEntries: splitRules(targetEnv.NO_PROXY).length,
881
+ }));
882
+ }
883
+ catch (error) {
884
+ logger.debug('[system-proxy] Failed to build proxy environment', ...sanitizeLogArgs({ error: error instanceof Error ? error.message : String(error) }));
885
+ }
886
+ }
887
+ /** Test seam: drop cached registry/PAC/agent state. */
888
+ export function resetSystemProxyCache() {
889
+ configCache = null;
890
+ configPromise = null;
891
+ pacResolverCache.clear();
892
+ pacResolverPromises.clear();
893
+ pacResultCache.clear();
894
+ for (const agent of agentCache.values())
895
+ agent.destroy();
896
+ agentCache.clear();
897
+ primedProxyEnvValues.clear();
898
+ }
899
+ //# sourceMappingURL=system-proxy.js.map