@codemieai/code 0.15.6 → 0.15.8

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 (292) hide show
  1. package/README.md +16 -0
  2. package/dist/agents/core/AgentCLI.d.ts +20 -0
  3. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  4. package/dist/agents/core/AgentCLI.js +107 -21
  5. package/dist/agents/core/AgentCLI.js.map +1 -1
  6. package/dist/agents/core/BaseAgentAdapter.d.ts +4 -1
  7. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  8. package/dist/agents/core/BaseAgentAdapter.js +15 -0
  9. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  10. package/dist/agents/core/types.d.ts +21 -0
  11. package/dist/agents/core/types.d.ts.map +1 -1
  12. package/dist/agents/core/types.js +5 -1
  13. package/dist/agents/core/types.js.map +1 -1
  14. package/dist/agents/plugins/claude/claude.models.d.ts +1 -1
  15. package/dist/agents/plugins/claude/claude.models.d.ts.map +1 -1
  16. package/dist/agents/plugins/claude/claude.models.js +7 -3
  17. package/dist/agents/plugins/claude/claude.models.js.map +1 -1
  18. package/dist/agents/plugins/claude/claude.session.d.ts +3 -3
  19. package/dist/agents/plugins/claude/claude.session.d.ts.map +1 -1
  20. package/dist/agents/plugins/claude/claude.session.js +8 -4
  21. package/dist/agents/plugins/claude/claude.session.js.map +1 -1
  22. package/dist/agents/plugins/claude/plugin/statusline.bundle.mjs +1 -1
  23. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts +6 -0
  24. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
  25. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +31 -4
  26. package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
  27. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.allowlist.d.ts +46 -0
  28. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.allowlist.d.ts.map +1 -0
  29. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.allowlist.js +165 -0
  30. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.allowlist.js.map +1 -0
  31. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.d.ts +3 -0
  32. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.d.ts.map +1 -0
  33. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.js +3 -0
  34. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.js.map +1 -0
  35. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.d.ts +11 -0
  36. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.d.ts.map +1 -0
  37. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.js +78 -0
  38. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.js.map +1 -0
  39. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.d.ts +63 -0
  40. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.d.ts.map +1 -0
  41. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.js +13 -0
  42. package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.js.map +1 -0
  43. package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
  44. package/dist/agents/plugins/codemie-code.plugin.js +6 -4
  45. package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
  46. package/dist/agents/plugins/codex/codex-models.d.ts.map +1 -1
  47. package/dist/agents/plugins/codex/codex-models.js +9 -6
  48. package/dist/agents/plugins/codex/codex-models.js.map +1 -1
  49. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  50. package/dist/agents/plugins/codex/codex.plugin.js +2 -1
  51. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  52. package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts +3 -2
  53. package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
  54. package/dist/agents/plugins/opencode/opencode-dynamic-models.js +21 -7
  55. package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
  56. package/dist/agents/plugins/opencode/opencode-model-configs.d.ts.map +1 -1
  57. package/dist/agents/plugins/opencode/opencode-model-configs.js +125 -0
  58. package/dist/agents/plugins/opencode/opencode-model-configs.js.map +1 -1
  59. package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
  60. package/dist/agents/plugins/opencode/opencode.plugin.js +6 -4
  61. package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
  62. package/dist/agents/plugins/pi/pi.models.d.ts.map +1 -1
  63. package/dist/agents/plugins/pi/pi.models.js +6 -0
  64. package/dist/agents/plugins/pi/pi.models.js.map +1 -1
  65. package/dist/agents/plugins/utils.d.ts +11 -0
  66. package/dist/agents/plugins/utils.d.ts.map +1 -0
  67. package/dist/agents/plugins/utils.js +46 -0
  68. package/dist/agents/plugins/utils.js.map +1 -0
  69. package/dist/agents/registry.d.ts +3 -1
  70. package/dist/agents/registry.d.ts.map +1 -1
  71. package/dist/agents/registry.js +12 -0
  72. package/dist/agents/registry.js.map +1 -1
  73. package/dist/bin/proxy-daemon.js +4 -0
  74. package/dist/bin/proxy-daemon.js.map +1 -1
  75. package/dist/cli/commands/assistants/setup/configuration/selection.d.ts +3 -1
  76. package/dist/cli/commands/assistants/setup/configuration/selection.d.ts.map +1 -1
  77. package/dist/cli/commands/assistants/setup/configuration/selection.js +6 -3
  78. package/dist/cli/commands/assistants/setup/configuration/selection.js.map +1 -1
  79. package/dist/cli/commands/assistants/setup/configuration/types.d.ts +2 -0
  80. package/dist/cli/commands/assistants/setup/configuration/types.d.ts.map +1 -1
  81. package/dist/cli/commands/assistants/setup/configuration/ui.d.ts.map +1 -1
  82. package/dist/cli/commands/assistants/setup/configuration/ui.js +3 -0
  83. package/dist/cli/commands/assistants/setup/configuration/ui.js.map +1 -1
  84. package/dist/cli/commands/assistants/setup/data.d.ts +6 -2
  85. package/dist/cli/commands/assistants/setup/data.d.ts.map +1 -1
  86. package/dist/cli/commands/assistants/setup/data.js +23 -8
  87. package/dist/cli/commands/assistants/setup/data.js.map +1 -1
  88. package/dist/cli/commands/assistants/setup/helpers.d.ts +1 -0
  89. package/dist/cli/commands/assistants/setup/helpers.d.ts.map +1 -1
  90. package/dist/cli/commands/assistants/setup/helpers.js +11 -0
  91. package/dist/cli/commands/assistants/setup/helpers.js.map +1 -1
  92. package/dist/cli/commands/assistants/setup/index.d.ts.map +1 -1
  93. package/dist/cli/commands/assistants/setup/index.js +24 -6
  94. package/dist/cli/commands/assistants/setup/index.js.map +1 -1
  95. package/dist/cli/commands/assistants/setup/manualConfiguration/index.d.ts +2 -1
  96. package/dist/cli/commands/assistants/setup/manualConfiguration/index.d.ts.map +1 -1
  97. package/dist/cli/commands/assistants/setup/manualConfiguration/index.js +5 -3
  98. package/dist/cli/commands/assistants/setup/manualConfiguration/index.js.map +1 -1
  99. package/dist/cli/commands/assistants/setup/manualConfiguration/types.d.ts +2 -0
  100. package/dist/cli/commands/assistants/setup/manualConfiguration/types.d.ts.map +1 -1
  101. package/dist/cli/commands/assistants/setup/manualConfiguration/ui.d.ts.map +1 -1
  102. package/dist/cli/commands/assistants/setup/manualConfiguration/ui.js +3 -0
  103. package/dist/cli/commands/assistants/setup/manualConfiguration/ui.js.map +1 -1
  104. package/dist/cli/commands/hook.d.ts.map +1 -1
  105. package/dist/cli/commands/hook.js +27 -31
  106. package/dist/cli/commands/hook.js.map +1 -1
  107. package/dist/cli/commands/proxy/connect-orchestrator.d.ts +11 -1
  108. package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -1
  109. package/dist/cli/commands/proxy/connect-orchestrator.js +83 -7
  110. package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -1
  111. package/dist/cli/commands/proxy/connectors/claude-code-otlp.d.ts +41 -0
  112. package/dist/cli/commands/proxy/connectors/claude-code-otlp.d.ts.map +1 -0
  113. package/dist/cli/commands/proxy/connectors/claude-code-otlp.js +352 -0
  114. package/dist/cli/commands/proxy/connectors/claude-code-otlp.js.map +1 -0
  115. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts.map +1 -1
  116. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js +5 -6
  117. package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js.map +1 -1
  118. package/dist/cli/commands/proxy/connectors/vscode-models.d.ts.map +1 -1
  119. package/dist/cli/commands/proxy/connectors/vscode-models.js +45 -0
  120. package/dist/cli/commands/proxy/connectors/vscode-models.js.map +1 -1
  121. package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts +2 -0
  122. package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts.map +1 -1
  123. package/dist/cli/commands/proxy/disconnect-orchestrator.js +43 -5
  124. package/dist/cli/commands/proxy/disconnect-orchestrator.js.map +1 -1
  125. package/dist/cli/commands/proxy/index.d.ts.map +1 -1
  126. package/dist/cli/commands/proxy/index.js +29 -7
  127. package/dist/cli/commands/proxy/index.js.map +1 -1
  128. package/dist/cli/commands/self-update.d.ts.map +1 -1
  129. package/dist/cli/commands/self-update.js +5 -1
  130. package/dist/cli/commands/self-update.js.map +1 -1
  131. package/dist/cli/commands/setup.d.ts.map +1 -1
  132. package/dist/cli/commands/setup.js +3 -2
  133. package/dist/cli/commands/setup.js.map +1 -1
  134. package/dist/cli/commands/shared/constants.d.ts +3 -0
  135. package/dist/cli/commands/shared/constants.d.ts.map +1 -1
  136. package/dist/cli/commands/shared/constants.js +3 -0
  137. package/dist/cli/commands/shared/constants.js.map +1 -1
  138. package/dist/cli/commands/shared/prompts/storage-scope.d.ts +3 -1
  139. package/dist/cli/commands/shared/prompts/storage-scope.d.ts.map +1 -1
  140. package/dist/cli/commands/shared/prompts/storage-scope.js +5 -1
  141. package/dist/cli/commands/shared/prompts/storage-scope.js.map +1 -1
  142. package/dist/cli/commands/skills/setup/data.d.ts +5 -1
  143. package/dist/cli/commands/skills/setup/data.d.ts.map +1 -1
  144. package/dist/cli/commands/skills/setup/data.js +17 -8
  145. package/dist/cli/commands/skills/setup/data.js.map +1 -1
  146. package/dist/cli/commands/skills/setup/helpers.d.ts +1 -0
  147. package/dist/cli/commands/skills/setup/helpers.d.ts.map +1 -1
  148. package/dist/cli/commands/skills/setup/helpers.js +11 -0
  149. package/dist/cli/commands/skills/setup/helpers.js.map +1 -1
  150. package/dist/cli/commands/skills/setup/index.d.ts.map +1 -1
  151. package/dist/cli/commands/skills/setup/index.js +7 -2
  152. package/dist/cli/commands/skills/setup/index.js.map +1 -1
  153. package/dist/cli/index.js +2 -0
  154. package/dist/cli/index.js.map +1 -1
  155. package/dist/mcp/stdio-http-bridge.d.ts.map +1 -1
  156. package/dist/mcp/stdio-http-bridge.js +4 -0
  157. package/dist/mcp/stdio-http-bridge.js.map +1 -1
  158. package/dist/providers/core/base/http-client.d.ts.map +1 -1
  159. package/dist/providers/core/base/http-client.js +16 -3
  160. package/dist/providers/core/base/http-client.js.map +1 -1
  161. package/dist/providers/core/codemie-auth-helpers.d.ts.map +1 -1
  162. package/dist/providers/core/codemie-auth-helpers.js +2 -1
  163. package/dist/providers/core/codemie-auth-helpers.js.map +1 -1
  164. package/dist/providers/core/types.d.ts +3 -0
  165. package/dist/providers/core/types.d.ts.map +1 -1
  166. package/dist/providers/core/types.js.map +1 -1
  167. package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
  168. package/dist/providers/plugins/sso/proxy/plugins/index.js +2 -0
  169. package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
  170. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.d.ts +3 -0
  171. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.d.ts.map +1 -0
  172. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.js +19 -0
  173. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.js.map +1 -0
  174. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.d.ts +30 -0
  175. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.d.ts.map +1 -0
  176. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.js +45 -0
  177. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.js.map +1 -0
  178. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.d.ts +14 -0
  179. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.d.ts.map +1 -0
  180. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.js +300 -0
  181. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.js.map +1 -0
  182. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.d.ts +8 -0
  183. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.d.ts.map +1 -0
  184. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.js +29 -0
  185. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.js.map +1 -0
  186. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.d.ts +40 -0
  187. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.d.ts.map +1 -0
  188. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.js +85 -0
  189. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.js.map +1 -0
  190. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.d.ts +40 -0
  191. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.d.ts.map +1 -0
  192. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.js +66 -0
  193. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.js.map +1 -0
  194. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.d.ts +39 -0
  195. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.d.ts.map +1 -0
  196. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.js +110 -0
  197. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.js.map +1 -0
  198. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.d.ts +24 -0
  199. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.d.ts.map +1 -0
  200. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.js +53 -0
  201. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.js.map +1 -0
  202. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.d.ts +39 -0
  203. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.d.ts.map +1 -0
  204. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.js +61 -0
  205. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.js.map +1 -0
  206. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.d.ts +20 -0
  207. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.d.ts.map +1 -0
  208. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.js +73 -0
  209. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.js.map +1 -0
  210. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.d.ts +12 -0
  211. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.d.ts.map +1 -0
  212. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.js +73 -0
  213. package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.js.map +1 -0
  214. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.d.ts +14 -0
  215. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.d.ts.map +1 -0
  216. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.js +215 -0
  217. package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.js.map +1 -0
  218. package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts +1 -4
  219. package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts.map +1 -1
  220. package/dist/providers/plugins/sso/proxy/proxy-http-client.js +10 -207
  221. package/dist/providers/plugins/sso/proxy/proxy-http-client.js.map +1 -1
  222. package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
  223. package/dist/providers/plugins/sso/proxy/sso.proxy.js +2 -1
  224. package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
  225. package/dist/providers/plugins/sso/session/processors/conversations/constants.d.ts +2 -0
  226. package/dist/providers/plugins/sso/session/processors/conversations/constants.d.ts.map +1 -1
  227. package/dist/providers/plugins/sso/session/processors/conversations/constants.js +2 -0
  228. package/dist/providers/plugins/sso/session/processors/conversations/constants.js.map +1 -1
  229. package/dist/providers/plugins/sso/session/processors/conversations/payload-queue.d.ts +36 -0
  230. package/dist/providers/plugins/sso/session/processors/conversations/payload-queue.d.ts.map +1 -0
  231. package/dist/providers/plugins/sso/session/processors/conversations/payload-queue.js +103 -0
  232. package/dist/providers/plugins/sso/session/processors/conversations/payload-queue.js.map +1 -0
  233. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.d.ts.map +1 -1
  234. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js +86 -68
  235. package/dist/providers/plugins/sso/session/processors/conversations/syncProcessor.js.map +1 -1
  236. package/dist/providers/plugins/sso/session/processors/conversations/types.d.ts +3 -1
  237. package/dist/providers/plugins/sso/session/processors/conversations/types.d.ts.map +1 -1
  238. package/dist/providers/plugins/sso/session/processors/conversations/types.js +3 -1
  239. package/dist/providers/plugins/sso/session/processors/conversations/types.js.map +1 -1
  240. package/dist/providers/plugins/sso/sso.auth-gate.d.ts +18 -0
  241. package/dist/providers/plugins/sso/sso.auth-gate.d.ts.map +1 -0
  242. package/dist/providers/plugins/sso/sso.auth-gate.js +48 -0
  243. package/dist/providers/plugins/sso/sso.auth-gate.js.map +1 -0
  244. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
  245. package/dist/providers/plugins/sso/sso.auth.js +14 -4
  246. package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
  247. package/dist/providers/plugins/sso/sso.http-client.d.ts +12 -0
  248. package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -1
  249. package/dist/providers/plugins/sso/sso.http-client.js +33 -5
  250. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  251. package/dist/providers/plugins/sso/sso.models.d.ts +5 -1
  252. package/dist/providers/plugins/sso/sso.models.d.ts.map +1 -1
  253. package/dist/providers/plugins/sso/sso.models.js +23 -19
  254. package/dist/providers/plugins/sso/sso.models.js.map +1 -1
  255. package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
  256. package/dist/providers/plugins/sso/sso.setup-steps.js +7 -2
  257. package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
  258. package/dist/utils/auth.d.ts.map +1 -1
  259. package/dist/utils/auth.js +4 -0
  260. package/dist/utils/auth.js.map +1 -1
  261. package/dist/utils/cli-updater.d.ts +7 -0
  262. package/dist/utils/cli-updater.d.ts.map +1 -1
  263. package/dist/utils/cli-updater.js +21 -0
  264. package/dist/utils/cli-updater.js.map +1 -1
  265. package/dist/utils/paths.d.ts +1 -1
  266. package/dist/utils/paths.d.ts.map +1 -1
  267. package/dist/utils/paths.js +1 -1
  268. package/dist/utils/paths.js.map +1 -1
  269. package/dist/utils/pricing.json +9 -1
  270. package/dist/utils/processes.d.ts.map +1 -1
  271. package/dist/utils/processes.js +3 -2
  272. package/dist/utils/processes.js.map +1 -1
  273. package/dist/utils/project-root.d.ts +10 -0
  274. package/dist/utils/project-root.d.ts.map +1 -0
  275. package/dist/utils/project-root.js +25 -0
  276. package/dist/utils/project-root.js.map +1 -0
  277. package/dist/utils/sdk-client.d.ts.map +1 -1
  278. package/dist/utils/sdk-client.js +4 -0
  279. package/dist/utils/sdk-client.js.map +1 -1
  280. package/dist/utils/system-proxy-dispatcher.d.ts +8 -0
  281. package/dist/utils/system-proxy-dispatcher.d.ts.map +1 -0
  282. package/dist/utils/system-proxy-dispatcher.js +100 -0
  283. package/dist/utils/system-proxy-dispatcher.js.map +1 -0
  284. package/dist/utils/system-proxy.d.ts +115 -0
  285. package/dist/utils/system-proxy.d.ts.map +1 -0
  286. package/dist/utils/system-proxy.js +899 -0
  287. package/dist/utils/system-proxy.js.map +1 -0
  288. package/dist/utils/windows-path.d.ts +5 -0
  289. package/dist/utils/windows-path.d.ts.map +1 -1
  290. package/dist/utils/windows-path.js +1 -1
  291. package/dist/utils/windows-path.js.map +1 -1
  292. package/package.json +4 -1
@@ -0,0 +1,14 @@
1
+ import type { SSOCredentials, JWTCredentials } from '../../../../../core/types.js';
2
+ /**
3
+ * Forward everything a session has pending to the CodeMie analytics backend.
4
+ *
5
+ * Each stream is read from its own cursor and acknowledged independently, so a
6
+ * failure on one stream never blocks or rewinds another. Cursors only advance
7
+ * after a successful response, which yields at-least-once delivery: a crash
8
+ * between backend success and cursor persistence re-sends that batch.
9
+ *
10
+ * A forwarded `SessionEnd` only records `endedAt`; it never stops later ticks
11
+ * from delivering bytes that failed or were appended afterwards.
12
+ */
13
+ export declare function forwardSession(sessionId: string, hooksOnly: boolean, credentials: SSOCredentials | JWTCredentials): Promise<void>;
14
+ //# sourceMappingURL=forwarder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarder.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAmXnF;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,EAClB,WAAW,EAAE,cAAc,GAAG,cAAc,GAC3C,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,300 @@
1
+ import { logger } from '../../../../../../utils/logger.js';
2
+ import { sanitizeLogArgs } from '../../../../../../utils/security.js';
3
+ import { isSSOCredentials, isJWTCredentials } from '../../../../../core/types.js';
4
+ import { buildAuthHeaders } from '../../../../../core/codemie-auth-helpers.js';
5
+ import { CODEMIE_ENDPOINTS } from '../../../sso.http-client.js';
6
+ import { OTEL_STREAMS } from './spool-paths.js';
7
+ import { advanceCursor, markSessionEnded, } from './session-status.js';
8
+ import { snapshotPendingBytes, snapshotPendingHookRecords } from './spool-io.js';
9
+ import { areCredentialsStale, markCredentialsStale } from './auth-state.js';
10
+ const HOOK_EVENT_TYPE_MAP = {
11
+ SessionStart: 'agent.session.start',
12
+ Stop: 'agent.session.stop',
13
+ StopFailure: 'agent.turn.error',
14
+ SessionEnd: 'agent.session.end',
15
+ UserPromptSubmit: 'agent.prompt.submit',
16
+ PreToolUse: 'agent.tool.start',
17
+ PostToolUse: 'agent.tool.end',
18
+ PostToolUseFailure: 'agent.tool.error',
19
+ SubagentStart: 'agent.subagent.start',
20
+ SubagentStop: 'agent.subagent.stop',
21
+ PreCompact: 'agent.session.compact',
22
+ Notification: 'agent.notification',
23
+ };
24
+ const OTEL_ENDPOINTS = {
25
+ logs: CODEMIE_ENDPOINTS.CLI_ANALYTICS_LOGS,
26
+ metrics: CODEMIE_ENDPOINTS.CLI_ANALYTICS_METRICS,
27
+ traces: CODEMIE_ENDPOINTS.CLI_ANALYTICS_TRACES,
28
+ };
29
+ const MAX_PROMPT_CHARS = 200;
30
+ const MAX_TOOL_FIELD_CHARS = 300;
31
+ const FORWARD_TIMEOUT_MS = 20_000;
32
+ /* ------------------------------------------------------------------ auth --- */
33
+ function decodeJwtClaims(token) {
34
+ const parts = token.split('.');
35
+ if (parts.length < 2) {
36
+ return {};
37
+ }
38
+ try {
39
+ return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
40
+ }
41
+ catch {
42
+ return {};
43
+ }
44
+ }
45
+ function resolveUserEmail(credentials) {
46
+ if (isJWTCredentials(credentials)) {
47
+ const claims = decodeJwtClaims(credentials.token);
48
+ if (typeof claims['email'] === 'string' && claims['email']) {
49
+ return claims['email'];
50
+ }
51
+ }
52
+ if (isSSOCredentials(credentials)) {
53
+ const accessToken = credentials.cookies['codemie_access_token'];
54
+ if (accessToken) {
55
+ const claims = decodeJwtClaims(accessToken);
56
+ const email = claims['email'] ?? claims['preferred_username'];
57
+ if (typeof email === 'string' && email) {
58
+ return email;
59
+ }
60
+ }
61
+ }
62
+ return '';
63
+ }
64
+ function buildAuthHeadersFromCreds(credentials) {
65
+ if (isSSOCredentials(credentials)) {
66
+ return buildAuthHeaders(credentials.cookies);
67
+ }
68
+ if (isJWTCredentials(credentials)) {
69
+ return buildAuthHeaders(credentials.token);
70
+ }
71
+ return null;
72
+ }
73
+ /* ------------------------------------------------------------------ http --- */
74
+ async function postToBackend(url, body, contentType, credentials) {
75
+ const headers = buildAuthHeadersFromCreds(credentials);
76
+ if (!headers) {
77
+ throw new Error('Unsupported credential type');
78
+ }
79
+ headers['Content-Type'] = contentType;
80
+ const controller = new AbortController();
81
+ const timer = setTimeout(() => controller.abort(), FORWARD_TIMEOUT_MS);
82
+ try {
83
+ return await fetch(url, { method: 'POST', headers, body, signal: controller.signal });
84
+ }
85
+ finally {
86
+ clearTimeout(timer);
87
+ }
88
+ }
89
+ const isAuthFailure = (response) => response.status === 401 || response.status === 403;
90
+ /**
91
+ * POST a batch, retrying once on 401/403. Anything other than `'ok'` leaves the
92
+ * bytes on disk with the cursor untouched, so the next tick retries them.
93
+ */
94
+ async function send(sessionId, stream, url, body, contentType, credentials) {
95
+ if (areCredentialsStale()) {
96
+ return 'failed';
97
+ }
98
+ try {
99
+ let response = await postToBackend(url, body, contentType, credentials);
100
+ if (isAuthFailure(response)) {
101
+ response = await postToBackend(url, body, contentType, credentials);
102
+ if (isAuthFailure(response)) {
103
+ return 'auth-expired';
104
+ }
105
+ }
106
+ if (response.ok) {
107
+ return 'ok';
108
+ }
109
+ logger.debug('[otlp-forwarder] non-success response', ...sanitizeLogArgs({ sessionId, stream, status: response.status }));
110
+ return 'failed';
111
+ }
112
+ catch (err) {
113
+ const msg = err instanceof Error ? err.message : String(err);
114
+ logger.debug('[otlp-forwarder] request error', ...sanitizeLogArgs({ sessionId, stream, err: msg }));
115
+ return 'failed';
116
+ }
117
+ }
118
+ /* --------------------------------------------------------------- mapping --- */
119
+ function hookEventType(hookName, event) {
120
+ if (hookName === 'PreToolUse') {
121
+ return event['input'] && event['input']['denied']
122
+ ? 'agent.tool.denied'
123
+ : 'agent.tool.start';
124
+ }
125
+ return HOOK_EVENT_TYPE_MAP[hookName] ?? 'agent.event';
126
+ }
127
+ function boundedText(value, maxChars) {
128
+ if (value === undefined || value === null) {
129
+ return '';
130
+ }
131
+ const text = typeof value === 'string'
132
+ ? value
133
+ : (() => {
134
+ try {
135
+ return JSON.stringify(value) ?? String(value);
136
+ }
137
+ catch {
138
+ return String(value);
139
+ }
140
+ })();
141
+ return text.slice(0, maxChars);
142
+ }
143
+ function limitHookPayload(hookEvent) {
144
+ const limited = { ...hookEvent };
145
+ if (Object.prototype.hasOwnProperty.call(hookEvent, 'prompt')) {
146
+ limited.prompt = boundedText(hookEvent.prompt, MAX_PROMPT_CHARS);
147
+ }
148
+ for (const field of ['tool_input', 'tool_response', 'error']) {
149
+ if (Object.prototype.hasOwnProperty.call(hookEvent, field)) {
150
+ limited[field] = boundedText(hookEvent[field], MAX_TOOL_FIELD_CHARS);
151
+ }
152
+ }
153
+ // Prevent a nested/raw copy from bypassing the limits.
154
+ delete limited.raw;
155
+ return limited;
156
+ }
157
+ async function resolveGitInfo(ctx, cwd) {
158
+ if (!cwd || ctx.git.branch !== undefined) {
159
+ return;
160
+ }
161
+ try {
162
+ const { detectGitBranch, detectGitRemoteRepo } = await import('../../../../../../utils/processes.js');
163
+ const [branch, remote] = await Promise.all([
164
+ detectGitBranch(cwd).then((v) => v ?? ''),
165
+ detectGitRemoteRepo(cwd).then((v) => v ?? ''),
166
+ ]);
167
+ ctx.git.branch = branch;
168
+ ctx.git.remote = remote;
169
+ }
170
+ catch {
171
+ /* best-effort */
172
+ }
173
+ }
174
+ async function mapHookRecords(records, ctx) {
175
+ const mapped = [];
176
+ let containsSessionEnd = false;
177
+ let malformed = 0;
178
+ for (const record of records) {
179
+ let spoolData;
180
+ let hookEvent;
181
+ try {
182
+ spoolData = JSON.parse(record);
183
+ hookEvent = JSON.parse(spoolData.raw);
184
+ }
185
+ catch {
186
+ // Complete but unusable record: dropped deliberately. Its bytes are still
187
+ // acknowledged with the batch so the cursor can never get stuck on it.
188
+ malformed += 1;
189
+ continue;
190
+ }
191
+ const hookName = String(hookEvent['hook_event_name'] ?? '');
192
+ if (hookName === 'SessionEnd') {
193
+ containsSessionEnd = true;
194
+ }
195
+ const cwd = String(hookEvent['cwd'] ?? '');
196
+ await resolveGitInfo(ctx, cwd);
197
+ const limited = limitHookPayload(hookEvent);
198
+ mapped.push(JSON.stringify({
199
+ ...limited,
200
+ type: hookEventType(hookName, hookEvent),
201
+ session_id: String(hookEvent['session_id'] ?? ''),
202
+ timestamp: new Date(spoolData.timestamp).toISOString(),
203
+ user_email: ctx.userEmail,
204
+ developer_name: ctx.userEmail,
205
+ git_branch: ctx.git.branch ?? '',
206
+ repo_remote: ctx.git.remote ?? '',
207
+ codemie_project_name: ctx.projectName,
208
+ cwd,
209
+ prompt_body: boundedText(hookEvent['prompt'], MAX_PROMPT_CHARS),
210
+ raw: limited,
211
+ }));
212
+ }
213
+ return {
214
+ ndjson: mapped.length > 0 ? `${mapped.join('\n')}\n` : '',
215
+ containsSessionEnd,
216
+ malformed,
217
+ };
218
+ }
219
+ /* ------------------------------------------------------------ forwarding --- */
220
+ async function buildForwardContext(credentials) {
221
+ const { readState } = await import('../../../../../../cli/commands/proxy/daemon-manager.js');
222
+ const state = await readState();
223
+ return {
224
+ credentials,
225
+ baseUrl: state?.targetUrl ?? state?.url ?? '',
226
+ projectName: state?.project ?? '',
227
+ userEmail: resolveUserEmail(credentials),
228
+ git: {},
229
+ };
230
+ }
231
+ /** Forward the complete hook records after the hooks cursor. */
232
+ async function forwardHooks(sessionId, ctx) {
233
+ const batch = await snapshotPendingHookRecords(sessionId);
234
+ if (!batch) {
235
+ return 'idle';
236
+ }
237
+ const payload = await mapHookRecords(batch.records, ctx);
238
+ if (payload.malformed > 0) {
239
+ logger.debug('[otlp-forwarder] skipped malformed hook records', ...sanitizeLogArgs({ sessionId, count: payload.malformed }));
240
+ }
241
+ if (payload.ndjson.length === 0) {
242
+ // Nothing sendable, but the bytes were consumed — keep the cursor aligned.
243
+ await advanceCursor(sessionId, 'hooks', batch.cursor + batch.byteLength);
244
+ return 'idle';
245
+ }
246
+ const url = `${ctx.baseUrl}${CODEMIE_ENDPOINTS.CLI_ANALYTICS_EVENT_HOOKS}`;
247
+ const result = await send(sessionId, 'hooks', url, payload.ndjson, 'application/x-ndjson', ctx.credentials);
248
+ if (result !== 'ok') {
249
+ return result;
250
+ }
251
+ await advanceCursor(sessionId, 'hooks', batch.cursor + batch.byteLength);
252
+ if (payload.containsSessionEnd) {
253
+ await markSessionEnded(sessionId);
254
+ }
255
+ return 'ok';
256
+ }
257
+ /** Forward the raw protobuf bytes after an OTEL stream's cursor. */
258
+ async function forwardOtelStream(sessionId, stream, ctx) {
259
+ const pending = await snapshotPendingBytes(sessionId, stream);
260
+ if (!pending) {
261
+ return 'idle';
262
+ }
263
+ const url = `${ctx.baseUrl}${OTEL_ENDPOINTS[stream]}`;
264
+ const result = await send(sessionId, stream, url, pending.bytes, 'application/x-protobuf', ctx.credentials);
265
+ if (result !== 'ok') {
266
+ return result;
267
+ }
268
+ await advanceCursor(sessionId, stream, pending.cursor + pending.bytes.length);
269
+ return 'ok';
270
+ }
271
+ /**
272
+ * Forward everything a session has pending to the CodeMie analytics backend.
273
+ *
274
+ * Each stream is read from its own cursor and acknowledged independently, so a
275
+ * failure on one stream never blocks or rewinds another. Cursors only advance
276
+ * after a successful response, which yields at-least-once delivery: a crash
277
+ * between backend success and cursor persistence re-sends that batch.
278
+ *
279
+ * A forwarded `SessionEnd` only records `endedAt`; it never stops later ticks
280
+ * from delivering bytes that failed or were appended afterwards.
281
+ */
282
+ export async function forwardSession(sessionId, hooksOnly, credentials) {
283
+ const ctx = await buildForwardContext(credentials);
284
+ const hooksResult = await forwardHooks(sessionId, ctx);
285
+ if (hooksResult === 'auth-expired') {
286
+ markCredentialsStale();
287
+ return;
288
+ }
289
+ if (hooksOnly) {
290
+ return;
291
+ }
292
+ for (const stream of OTEL_STREAMS) {
293
+ const result = await forwardOtelStream(sessionId, stream, ctx);
294
+ if (result === 'auth-expired') {
295
+ markCredentialsStale();
296
+ return;
297
+ }
298
+ }
299
+ }
300
+ //# sourceMappingURL=forwarder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forwarder.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Per-session serialization lock.
3
+ *
4
+ * Same-session operations are serialized; different sessions run fully in
5
+ * parallel. The map entry is cleaned up once no more waiters remain.
6
+ */
7
+ export declare function withSessionLock<T>(sessionId: string, fn: () => Promise<T>): Promise<T>;
8
+ //# sourceMappingURL=session-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lock.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAqBtF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Per-session serialization lock.
3
+ *
4
+ * Same-session operations are serialized; different sessions run fully in
5
+ * parallel. The map entry is cleaned up once no more waiters remain.
6
+ */
7
+ const locks = new Map();
8
+ export function withSessionLock(sessionId, fn) {
9
+ const previous = locks.get(sessionId) ?? Promise.resolve();
10
+ let resolveCurrent;
11
+ const current = new Promise((resolve) => {
12
+ resolveCurrent = resolve;
13
+ });
14
+ locks.set(sessionId, current);
15
+ const result = previous.then(async () => {
16
+ try {
17
+ return await fn();
18
+ }
19
+ finally {
20
+ // Clean up the map entry only if it still points to this chain link.
21
+ if (locks.get(sessionId) === current) {
22
+ locks.delete(sessionId);
23
+ }
24
+ resolveCurrent();
25
+ }
26
+ });
27
+ return result;
28
+ }
29
+ //# sourceMappingURL=session-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lock.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE/C,MAAM,UAAU,eAAe,CAAI,SAAiB,EAAE,EAAoB;IACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,IAAI,cAA2B,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,cAAc,GAAG,OAAO,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,qEAAqE;YACrE,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC;gBACrC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1B,CAAC;YACD,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { type SpoolStream } from './spool-paths.js';
2
+ /** Byte offsets that have been acknowledged by the backend, per stream. */
3
+ export type SessionCursors = Record<SpoolStream, number>;
4
+ export interface SessionStatus {
5
+ /**
6
+ * Delivery progress. A cursor is a byte offset into the corresponding spool
7
+ * file and is only advanced after the backend acknowledges those bytes.
8
+ */
9
+ cursors: SessionCursors;
10
+ /** Consecutive ticks a session has waited for its missing group (hooks-only or OTEL-only). */
11
+ waitTicks: number;
12
+ /**
13
+ * Time when a successfully forwarded hooks batch contained `SessionEnd`.
14
+ * Marks *normal completion*, not *delivery completion*: forwarding continues
15
+ * for any bytes that are still pending or appended afterwards.
16
+ */
17
+ endedAt?: number;
18
+ }
19
+ export declare function createStatus(): SessionStatus;
20
+ /** Read and normalize a session status, or `null` when there is no status file. */
21
+ export declare function readStatus(sessionId: string): Promise<SessionStatus | null>;
22
+ export declare function writeStatus(sessionId: string, status: SessionStatus): Promise<void>;
23
+ /**
24
+ * Read-modify-write a status under the session lock.
25
+ *
26
+ * NOTE: the session lock is not reentrant — never call this while already
27
+ * holding the lock for the same session.
28
+ */
29
+ export declare function updateStatus(sessionId: string, mutate: (status: SessionStatus) => void): Promise<void>;
30
+ export declare function markSessionEnded(sessionId: string): Promise<void>;
31
+ /** Advance an acknowledged cursor. Monotonic: never moves backwards. */
32
+ export declare function advanceCursor(sessionId: string, stream: SpoolStream, nextOffset: number): Promise<void>;
33
+ /**
34
+ * Create a default status if the session has none.
35
+ * Caller MUST already hold the session lock.
36
+ */
37
+ export declare function ensureStatusLocked(sessionId: string): Promise<void>;
38
+ /** Lock-acquiring variant — never call while holding the session lock. */
39
+ export declare function ensureStatus(sessionId: string): Promise<void>;
40
+ //# sourceMappingURL=session-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-status.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG1F,2EAA2E;AAC3E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,OAAO,EAAE,cAAc,CAAC;IACxB,8FAA8F;IAC9F,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,IAAI,aAAa,CAE5C;AA8BD,mFAAmF;AACnF,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAOjF;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzF;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GACtC,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIvE;AAED,wEAAwE;AACxE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED,0EAA0E;AAC1E,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE"}
@@ -0,0 +1,85 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { SPOOL_STREAMS, spoolRoot, statusFile } from './spool-paths.js';
3
+ import { withSessionLock } from './session-lock.js';
4
+ export function createStatus() {
5
+ return { cursors: { hooks: 0, logs: 0, metrics: 0, traces: 0 }, waitTicks: 0 };
6
+ }
7
+ function toOffset(value) {
8
+ return typeof value === 'number' && Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;
9
+ }
10
+ /**
11
+ * Coerce whatever is on disk into a well-formed status. Unknown fields (e.g.
12
+ * the removed `*Written` flags, flat cursors, `forwarded`) are dropped.
13
+ */
14
+ function normalizeStatus(raw) {
15
+ const status = createStatus();
16
+ if (typeof raw !== 'object' || raw === null) {
17
+ return status;
18
+ }
19
+ const source = raw;
20
+ const cursors = (source['cursors'] ?? {});
21
+ for (const stream of SPOOL_STREAMS) {
22
+ status.cursors[stream] = toOffset(cursors[stream]);
23
+ }
24
+ status.waitTicks = toOffset(source['waitTicks']);
25
+ const endedAt = toOffset(source['endedAt']);
26
+ if (endedAt > 0) {
27
+ status.endedAt = endedAt;
28
+ }
29
+ return status;
30
+ }
31
+ /** Read and normalize a session status, or `null` when there is no status file. */
32
+ export async function readStatus(sessionId) {
33
+ try {
34
+ const raw = await readFile(statusFile(sessionId), 'utf-8');
35
+ return normalizeStatus(JSON.parse(raw));
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ export async function writeStatus(sessionId, status) {
42
+ await mkdir(spoolRoot(), { recursive: true });
43
+ await writeFile(statusFile(sessionId), JSON.stringify(status), 'utf-8');
44
+ }
45
+ /**
46
+ * Read-modify-write a status under the session lock.
47
+ *
48
+ * NOTE: the session lock is not reentrant — never call this while already
49
+ * holding the lock for the same session.
50
+ */
51
+ export async function updateStatus(sessionId, mutate) {
52
+ await withSessionLock(sessionId, async () => {
53
+ const status = await readStatus(sessionId);
54
+ if (!status)
55
+ return; // session was swept — nothing to acknowledge
56
+ mutate(status);
57
+ await writeStatus(sessionId, status);
58
+ });
59
+ }
60
+ export async function markSessionEnded(sessionId) {
61
+ await updateStatus(sessionId, (status) => {
62
+ status.endedAt ??= Date.now();
63
+ });
64
+ }
65
+ /** Advance an acknowledged cursor. Monotonic: never moves backwards. */
66
+ export async function advanceCursor(sessionId, stream, nextOffset) {
67
+ await updateStatus(sessionId, (status) => {
68
+ status.cursors[stream] = Math.max(status.cursors[stream], nextOffset);
69
+ });
70
+ }
71
+ /**
72
+ * Create a default status if the session has none.
73
+ * Caller MUST already hold the session lock.
74
+ */
75
+ export async function ensureStatusLocked(sessionId) {
76
+ if (await readStatus(sessionId)) {
77
+ return;
78
+ }
79
+ await writeStatus(sessionId, createStatus());
80
+ }
81
+ /** Lock-acquiring variant — never call while holding the session lock. */
82
+ export async function ensureStatus(sessionId) {
83
+ await withSessionLock(sessionId, () => ensureStatusLocked(sessionId));
84
+ }
85
+ //# sourceMappingURL=session-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-status.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Env-backed tuning for the OTLP spool. Read lazily on every call so overrides
3
+ * take effect without a restart.
4
+ *
5
+ * Duration knobs are in minutes and accept fractions (`0.5` = 30s). A missing,
6
+ * unparsable, zero or negative value falls back to the default — notably, a
7
+ * zero interval would otherwise degenerate into a spin loop.
8
+ */
9
+ /** How often pending spool bytes are forwarded. */
10
+ export declare function sendIntervalMs(): number;
11
+ /** How often drained, inactive sessions are garbage-collected. */
12
+ export declare function sweepIntervalMs(): number;
13
+ /**
14
+ * Ticks a hooks-only session waits for OTEL data before being force-forwarded.
15
+ *
16
+ * NOTE: this is a tick count, so the effective wait is
17
+ * `sendIntervalMs() * hooksOnlyWaitTicks()` — currently ~6 minutes, chosen to
18
+ * out-wait one OTEL exporter flush cycle (~60s) plus a send interval.
19
+ * Revisit this value whenever OTLP_SEND_INTERVAL_MINUTES changes.
20
+ *
21
+ * The same tick limit also bounds how long an OTEL-only session waits for hooks
22
+ * before being skipped, so changing it changes the untracked-data retention
23
+ * window and the late-hooks tolerance for tracked sessions.
24
+ */
25
+ export declare function hooksOnlyWaitTicks(): number;
26
+ /** Whether a hooks-only session may be forwarded without any OTEL data. */
27
+ export declare function hooksOnlyForwardAllowed(): boolean;
28
+ /**
29
+ * Quiet period after a normally ended session (`endedAt`) before its drained
30
+ * spool may be deleted. Sized to cover a late OTEL export plus the send
31
+ * interval needed to forward it.
32
+ */
33
+ export declare function endedSessionGraceMs(): number;
34
+ /**
35
+ * Inactivity period after which a session that never reported `SessionEnd` is
36
+ * considered abandoned and its drained spool may be deleted. Measured from the
37
+ * latest spool-file write, never from session creation or cursor updates.
38
+ */
39
+ export declare function abandonedSessionGraceMs(): number;
40
+ //# sourceMappingURL=spool-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,mDAAmD;AACnD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,kEAAkE;AAClE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,2EAA2E;AAC3E,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Env-backed tuning for the OTLP spool. Read lazily on every call so overrides
3
+ * take effect without a restart.
4
+ *
5
+ * Duration knobs are in minutes and accept fractions (`0.5` = 30s). A missing,
6
+ * unparsable, zero or negative value falls back to the default — notably, a
7
+ * zero interval would otherwise degenerate into a spin loop.
8
+ */
9
+ const MINUTE_MS = 60_000;
10
+ function envMinutesMs(name, fallbackMinutes) {
11
+ const parsed = Number(process.env[name]);
12
+ const minutes = Number.isFinite(parsed) && parsed > 0 ? parsed : fallbackMinutes;
13
+ return minutes * MINUTE_MS;
14
+ }
15
+ function envCount(name, fallbackValue) {
16
+ const parsed = Number(process.env[name]);
17
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallbackValue;
18
+ }
19
+ function envBoolean(name, fallbackValue) {
20
+ const raw = process.env[name];
21
+ return raw === undefined ? fallbackValue : raw === 'true';
22
+ }
23
+ /** How often pending spool bytes are forwarded. */
24
+ export function sendIntervalMs() {
25
+ return envMinutesMs('OTLP_SEND_INTERVAL_MINUTES', 2);
26
+ }
27
+ /** How often drained, inactive sessions are garbage-collected. */
28
+ export function sweepIntervalMs() {
29
+ return envMinutesMs('OTLP_SWEEP_INTERVAL_MINUTES', 15);
30
+ }
31
+ /**
32
+ * Ticks a hooks-only session waits for OTEL data before being force-forwarded.
33
+ *
34
+ * NOTE: this is a tick count, so the effective wait is
35
+ * `sendIntervalMs() * hooksOnlyWaitTicks()` — currently ~6 minutes, chosen to
36
+ * out-wait one OTEL exporter flush cycle (~60s) plus a send interval.
37
+ * Revisit this value whenever OTLP_SEND_INTERVAL_MINUTES changes.
38
+ *
39
+ * The same tick limit also bounds how long an OTEL-only session waits for hooks
40
+ * before being skipped, so changing it changes the untracked-data retention
41
+ * window and the late-hooks tolerance for tracked sessions.
42
+ */
43
+ export function hooksOnlyWaitTicks() {
44
+ return envCount('OTLP_SEND_MAX_ATTEMPTS', 3);
45
+ }
46
+ /** Whether a hooks-only session may be forwarded without any OTEL data. */
47
+ export function hooksOnlyForwardAllowed() {
48
+ return envBoolean('OTLP_ALLOW_HOOKS_ONLY_FORWARD', true);
49
+ }
50
+ /**
51
+ * Quiet period after a normally ended session (`endedAt`) before its drained
52
+ * spool may be deleted. Sized to cover a late OTEL export plus the send
53
+ * interval needed to forward it.
54
+ */
55
+ export function endedSessionGraceMs() {
56
+ return envMinutesMs('OTLP_ENDED_SESSION_GRACE_MINUTES', 15);
57
+ }
58
+ /**
59
+ * Inactivity period after which a session that never reported `SessionEnd` is
60
+ * considered abandoned and its drained spool may be deleted. Measured from the
61
+ * latest spool-file write, never from session creation or cursor updates.
62
+ */
63
+ export function abandonedSessionGraceMs() {
64
+ return envMinutesMs('OTLP_ABANDONED_SESSION_GRACE_MINUTES', 60);
65
+ }
66
+ //# sourceMappingURL=spool-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-config.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,SAAS,YAAY,CAAC,IAAY,EAAE,eAAuB;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IACjF,OAAO,OAAO,GAAG,SAAS,CAAC;AAC7B,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,aAAqB;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;AACzE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,aAAsB;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC;AAC5D,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,QAAQ,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,uBAAuB;IACrC,OAAO,UAAU,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,YAAY,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC"}