@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,39 @@
1
+ import { type SpoolStream } from './spool-paths.js';
2
+ /**
3
+ * Append spool bytes and make the session discoverable.
4
+ *
5
+ * Holds the session lock so an append can never interleave with a forwarder
6
+ * snapshot (torn record), a cursor advance, or a sweep deletion.
7
+ */
8
+ export declare function appendSpool(sessionId: string, stream: SpoolStream, data: string | Buffer): Promise<void>;
9
+ export interface PendingBytes {
10
+ /** Cursor the snapshot was taken from — pass it back when acknowledging. */
11
+ cursor: number;
12
+ bytes: Buffer;
13
+ }
14
+ /**
15
+ * Consistent snapshot of the bytes pending for an OTEL stream.
16
+ *
17
+ * The lock guarantees the snapshot never contains a partially written append,
18
+ * so the protobuf payload handed to the backend is always whole.
19
+ * Must NOT be called while already holding the session lock.
20
+ */
21
+ export declare function snapshotPendingBytes(sessionId: string, stream: SpoolStream): Promise<PendingBytes | null>;
22
+ export interface PendingHookBatch {
23
+ cursor: number;
24
+ /** Complete, newline-terminated NDJSON records. */
25
+ records: string[];
26
+ /** Exact number of source bytes these records occupy, including newlines. */
27
+ byteLength: number;
28
+ }
29
+ /**
30
+ * Consistent snapshot of the complete NDJSON records pending for hooks.
31
+ *
32
+ * The chunk is cut at the last newline byte, so an incomplete trailing record
33
+ * stays pending and `byteLength` is a byte-exact acknowledgement amount.
34
+ * Cutting on a newline is safe for UTF-8: `0x0a` cannot occur inside a
35
+ * multi-byte sequence.
36
+ * Must NOT be called while already holding the session lock.
37
+ */
38
+ export declare function snapshotPendingHookRecords(sessionId: string): Promise<PendingHookBatch | null>;
39
+ //# sourceMappingURL=spool-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-io.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA2C3E;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GAAG,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAID,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAQ9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAoBlC"}
@@ -0,0 +1,110 @@
1
+ import { appendFile, mkdir, open, stat } from 'node:fs/promises';
2
+ import { spoolRoot, streamFile } from './spool-paths.js';
3
+ import { withSessionLock } from './session-lock.js';
4
+ import { createStatus, readStatus, writeStatus } from './session-status.js';
5
+ const NEWLINE = 0x0a;
6
+ /* ------------------------------------------------------- unlocked internals --- */
7
+ // These assume the caller already holds the session lock.
8
+ async function fileExists(path) {
9
+ try {
10
+ await stat(path);
11
+ return true;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ /** Range-read everything after `cursor`. Never touches the acknowledged prefix. */
18
+ async function readRange(sessionId, stream, cursor) {
19
+ let handle;
20
+ try {
21
+ handle = await open(streamFile(sessionId, stream), 'r');
22
+ }
23
+ catch {
24
+ return null; // missing file => nothing pending
25
+ }
26
+ try {
27
+ const { size } = await handle.stat();
28
+ if (size <= cursor)
29
+ return null; // drained
30
+ const buffer = Buffer.allocUnsafe(size - cursor);
31
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, cursor);
32
+ return bytesRead > 0 ? buffer.subarray(0, bytesRead) : null;
33
+ }
34
+ finally {
35
+ await handle.close();
36
+ }
37
+ }
38
+ /* --------------------------------------------------------------- producers --- */
39
+ /**
40
+ * Append spool bytes and make the session discoverable.
41
+ *
42
+ * Holds the session lock so an append can never interleave with a forwarder
43
+ * snapshot (torn record), a cursor advance, or a sweep deletion.
44
+ */
45
+ export async function appendSpool(sessionId, stream, data) {
46
+ await withSessionLock(sessionId, async () => {
47
+ await mkdir(spoolRoot(), { recursive: true });
48
+ const path = streamFile(sessionId, stream);
49
+ const recreated = !(await fileExists(path));
50
+ await appendFile(path, data);
51
+ const status = await readStatus(sessionId);
52
+ if (!status) {
53
+ await writeStatus(sessionId, createStatus());
54
+ return;
55
+ }
56
+ // A recreated file restarts at offset 0, so a cursor left over from a swept
57
+ // (or partially deleted) session would otherwise skip these bytes forever.
58
+ if (recreated && status.cursors[stream] !== 0) {
59
+ status.cursors[stream] = 0;
60
+ await writeStatus(sessionId, status);
61
+ }
62
+ });
63
+ }
64
+ /**
65
+ * Consistent snapshot of the bytes pending for an OTEL stream.
66
+ *
67
+ * The lock guarantees the snapshot never contains a partially written append,
68
+ * so the protobuf payload handed to the backend is always whole.
69
+ * Must NOT be called while already holding the session lock.
70
+ */
71
+ export async function snapshotPendingBytes(sessionId, stream) {
72
+ return withSessionLock(sessionId, async () => {
73
+ const status = await readStatus(sessionId);
74
+ if (!status)
75
+ return null; // session was swept
76
+ const cursor = status.cursors[stream];
77
+ const bytes = await readRange(sessionId, stream, cursor);
78
+ return bytes ? { cursor, bytes } : null;
79
+ });
80
+ }
81
+ /**
82
+ * Consistent snapshot of the complete NDJSON records pending for hooks.
83
+ *
84
+ * The chunk is cut at the last newline byte, so an incomplete trailing record
85
+ * stays pending and `byteLength` is a byte-exact acknowledgement amount.
86
+ * Cutting on a newline is safe for UTF-8: `0x0a` cannot occur inside a
87
+ * multi-byte sequence.
88
+ * Must NOT be called while already holding the session lock.
89
+ */
90
+ export async function snapshotPendingHookRecords(sessionId) {
91
+ return withSessionLock(sessionId, async () => {
92
+ const status = await readStatus(sessionId);
93
+ if (!status)
94
+ return null;
95
+ const cursor = status.cursors.hooks;
96
+ const pending = await readRange(sessionId, 'hooks', cursor);
97
+ if (!pending)
98
+ return null;
99
+ const lastNewline = pending.lastIndexOf(NEWLINE);
100
+ if (lastNewline < 0)
101
+ return null; // no complete record yet
102
+ const complete = pending.subarray(0, lastNewline + 1);
103
+ const records = complete
104
+ .toString('utf-8')
105
+ .split('\n')
106
+ .filter((line) => line.trim().length > 0);
107
+ return { cursor, records, byteLength: complete.length };
108
+ });
109
+ }
110
+ //# sourceMappingURL=spool-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-io.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Root directory where all OTLP analytics spool files are stored.
3
+ * Resolves to `~/.codemie/proxy/otlp-spool`.
4
+ */
5
+ export declare function spoolRoot(): string;
6
+ /** OTEL binary streams (protobuf payloads produced by the agent runtime). */
7
+ export declare const OTEL_STREAMS: readonly ["logs", "metrics", "traces"];
8
+ export type OtelStream = (typeof OTEL_STREAMS)[number];
9
+ /** Every spool stream, in a stable order. */
10
+ export declare const SPOOL_STREAMS: readonly ["hooks", "logs", "metrics", "traces"];
11
+ export type SpoolStream = (typeof SPOOL_STREAMS)[number];
12
+ export declare const STATUS_EXT = ".status";
13
+ /** Spool data file for one stream of a session. */
14
+ export declare function streamFile(sessionId: string, stream: SpoolStream): string;
15
+ /** Delivery bookkeeping file for a session. */
16
+ export declare function statusFile(sessionId: string): string;
17
+ /**
18
+ * All session ids currently present in the spool root.
19
+ *
20
+ * Derived from any spool artifact (data or status) so that a session whose
21
+ * producer crashed before writing a status file is still discoverable.
22
+ */
23
+ export declare function listSessionIds(): Promise<string[]>;
24
+ //# sourceMappingURL=spool-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-paths.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,6EAA6E;AAC7E,eAAO,MAAM,YAAY,wCAAyC,CAAC;AACnE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,6CAA6C;AAC7C,eAAO,MAAM,aAAa,iDAAsC,CAAC;AACjE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AASzD,eAAO,MAAM,UAAU,YAAY,CAAC;AAEpC,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAEzE;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAID;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAcxD"}
@@ -0,0 +1,53 @@
1
+ import { readdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { getCodemiePath } from '../../../../../../utils/paths.js';
4
+ /**
5
+ * Root directory where all OTLP analytics spool files are stored.
6
+ * Resolves to `~/.codemie/proxy/otlp-spool`.
7
+ */
8
+ export function spoolRoot() {
9
+ return getCodemiePath('proxy', 'otlp-spool');
10
+ }
11
+ /** OTEL binary streams (protobuf payloads produced by the agent runtime). */
12
+ export const OTEL_STREAMS = ['logs', 'metrics', 'traces'];
13
+ /** Every spool stream, in a stable order. */
14
+ export const SPOOL_STREAMS = ['hooks', ...OTEL_STREAMS];
15
+ const STREAM_EXT = {
16
+ hooks: '.hooks.ndjson',
17
+ logs: '.otel_logs.bin',
18
+ metrics: '.otel_metrics.bin',
19
+ traces: '.otel_traces.bin',
20
+ };
21
+ export const STATUS_EXT = '.status';
22
+ /** Spool data file for one stream of a session. */
23
+ export function streamFile(sessionId, stream) {
24
+ return join(spoolRoot(), sessionId + STREAM_EXT[stream]);
25
+ }
26
+ /** Delivery bookkeeping file for a session. */
27
+ export function statusFile(sessionId) {
28
+ return join(spoolRoot(), sessionId + STATUS_EXT);
29
+ }
30
+ const ALL_SUFFIXES = [STATUS_EXT, ...Object.values(STREAM_EXT)];
31
+ /**
32
+ * All session ids currently present in the spool root.
33
+ *
34
+ * Derived from any spool artifact (data or status) so that a session whose
35
+ * producer crashed before writing a status file is still discoverable.
36
+ */
37
+ export async function listSessionIds() {
38
+ let entries;
39
+ try {
40
+ entries = await readdir(spoolRoot());
41
+ }
42
+ catch {
43
+ return []; // spool root may not exist yet
44
+ }
45
+ const ids = new Set();
46
+ for (const entry of entries) {
47
+ const suffix = ALL_SUFFIXES.find((suffix) => entry.length > suffix.length && entry.endsWith(suffix));
48
+ if (suffix)
49
+ ids.add(entry.slice(0, -suffix.length));
50
+ }
51
+ return [...ids];
52
+ }
53
+ //# sourceMappingURL=spool-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-paths.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,cAAc,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAGnE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAU,CAAC;AAGjE,MAAM,UAAU,GAAgC;IAC9C,KAAK,EAAE,eAAe;IACtB,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,mBAAmB;IAC5B,MAAM,EAAE,kBAAkB;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AAEpC,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,MAAmB;IAC/D,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,GAAG,UAAU,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,YAAY,GAAsB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,+BAA+B;IAC5C,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACrG,IAAI,MAAM;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type SpoolStream } from './spool-paths.js';
2
+ import type { SessionStatus } from './session-status.js';
3
+ export interface StreamState {
4
+ exists: boolean;
5
+ /** Current file size in bytes (0 when missing). */
6
+ size: number;
7
+ /** Acknowledged byte offset from the status file. */
8
+ cursor: number;
9
+ /** Last write time of the spool file, or `null` when missing. */
10
+ mtimeMs: number | null;
11
+ }
12
+ export interface SpoolState {
13
+ sessionId: string;
14
+ streams: Record<SpoolStream, StreamState>;
15
+ /** Latest mtime across existing spool data files — i.e. last producer write. */
16
+ latestWriteMs: number | null;
17
+ }
18
+ /**
19
+ * Snapshot the filesystem truth for a session: spool files are the source of
20
+ * truth for *what was written*, cursors for *what was delivered*.
21
+ */
22
+ export declare function readSpoolState(sessionId: string, status: SessionStatus): Promise<SpoolState>;
23
+ /** The stream was written at some point (sticky, survives the cursor reaching EOF). */
24
+ export declare const hasData: (state: StreamState) => boolean;
25
+ /** Bytes exist after the cursor and still need to be delivered. */
26
+ export declare const hasPending: (state: StreamState) => boolean;
27
+ /** Everything written has been acknowledged (missing/empty files are drained). */
28
+ export declare const isDrained: (state: StreamState) => boolean;
29
+ export declare function hooksGroupPresent(spool: SpoolState): boolean;
30
+ export declare function otelGroupPresent(spool: SpoolState): boolean;
31
+ export declare function hasPendingData(spool: SpoolState): boolean;
32
+ export declare function isSessionDrained(spool: SpoolState): boolean;
33
+ /**
34
+ * Last producer activity. Spool appends bump spool-file mtimes; forwarding and
35
+ * cursor writes only touch the status file, so the status mtime is a fallback
36
+ * used solely when no spool data file exists.
37
+ */
38
+ export declare function lastActivityMs(spool: SpoolState): Promise<number | null>;
39
+ //# sourceMappingURL=spool-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC1C,gFAAgF;IAChF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAED,uFAAuF;AACvF,eAAO,MAAM,OAAO,GAAI,OAAO,WAAW,KAAG,OAAyB,CAAC;AAEvE,mEAAmE;AACnE,eAAO,MAAM,UAAU,GAAI,OAAO,WAAW,KAAG,OAAoC,CAAC;AAErF,kFAAkF;AAClF,eAAO,MAAM,SAAS,GAAI,OAAO,WAAW,KAAG,OAAqC,CAAC;AAErF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE3D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAE3D;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ9E"}
@@ -0,0 +1,61 @@
1
+ import { stat } from 'node:fs/promises';
2
+ import { OTEL_STREAMS, SPOOL_STREAMS, statusFile, streamFile, } from './spool-paths.js';
3
+ /**
4
+ * Snapshot the filesystem truth for a session: spool files are the source of
5
+ * truth for *what was written*, cursors for *what was delivered*.
6
+ */
7
+ export async function readSpoolState(sessionId, status) {
8
+ const entries = await Promise.all(SPOOL_STREAMS.map(async (stream) => {
9
+ const cursor = status.cursors[stream];
10
+ try {
11
+ const info = await stat(streamFile(sessionId, stream));
12
+ return [stream, { exists: true, size: info.size, cursor, mtimeMs: info.mtimeMs }];
13
+ }
14
+ catch {
15
+ return [stream, { exists: false, size: 0, cursor, mtimeMs: null }];
16
+ }
17
+ }));
18
+ const streams = Object.fromEntries(entries);
19
+ const latestWriteMs = SPOOL_STREAMS.reduce((latest, stream) => {
20
+ const mtimeMs = streams[stream].mtimeMs;
21
+ if (mtimeMs === null)
22
+ return latest;
23
+ return latest === null ? mtimeMs : Math.max(latest, mtimeMs);
24
+ }, null);
25
+ return { sessionId, streams, latestWriteMs };
26
+ }
27
+ /** The stream was written at some point (sticky, survives the cursor reaching EOF). */
28
+ export const hasData = (state) => state.size > 0;
29
+ /** Bytes exist after the cursor and still need to be delivered. */
30
+ export const hasPending = (state) => state.size > state.cursor;
31
+ /** Everything written has been acknowledged (missing/empty files are drained). */
32
+ export const isDrained = (state) => state.size <= state.cursor;
33
+ export function hooksGroupPresent(spool) {
34
+ return hasData(spool.streams.hooks);
35
+ }
36
+ export function otelGroupPresent(spool) {
37
+ return OTEL_STREAMS.some((stream) => hasData(spool.streams[stream]));
38
+ }
39
+ export function hasPendingData(spool) {
40
+ return SPOOL_STREAMS.some((stream) => hasPending(spool.streams[stream]));
41
+ }
42
+ export function isSessionDrained(spool) {
43
+ return SPOOL_STREAMS.every((stream) => isDrained(spool.streams[stream]));
44
+ }
45
+ /**
46
+ * Last producer activity. Spool appends bump spool-file mtimes; forwarding and
47
+ * cursor writes only touch the status file, so the status mtime is a fallback
48
+ * used solely when no spool data file exists.
49
+ */
50
+ export async function lastActivityMs(spool) {
51
+ if (spool.latestWriteMs !== null)
52
+ return spool.latestWriteMs;
53
+ try {
54
+ const info = await stat(statusFile(spool.sessionId));
55
+ return info.mtimeMs;
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ //# sourceMappingURL=spool-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool-state.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Lightweight garbage collection for the OTLP spool.
3
+ *
4
+ * Two cleanup paths, both of which require every stream to be drained
5
+ * (`fileSize === cursor`) so no undelivered bytes are ever destroyed:
6
+ *
7
+ * 1. Normally ended sessions (`endedAt` set): deleted once the end grace period
8
+ * has elapsed since the later of `endedAt` and the last spool-file write, so
9
+ * late hook/OTEL writes postpone cleanup.
10
+ * 2. Abandoned sessions (no `endedAt`): deleted once the abandonment timeout has
11
+ * elapsed since the last spool-file write. Activity is read from spool-file
12
+ * mtimes, never from the status file, because cursor updates rewrite the
13
+ * status file without any new data arriving.
14
+ *
15
+ * Consequence: a live session that stays quiet (and fully drained) for longer
16
+ * than the abandonment timeout may have its spool removed. That is safe — the
17
+ * next producer write recreates the status and spool files from scratch.
18
+ */
19
+ export declare function sweepSpool(): Promise<void>;
20
+ //# sourceMappingURL=sweep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAShD"}
@@ -0,0 +1,73 @@
1
+ import { unlink } from 'node:fs/promises';
2
+ import { logger } from '../../../../../../utils/logger.js';
3
+ import { sanitizeLogArgs } from '../../../../../../utils/security.js';
4
+ import { SPOOL_STREAMS, listSessionIds, statusFile, streamFile, } from './spool-paths.js';
5
+ import { withSessionLock } from './session-lock.js';
6
+ import { createStatus, readStatus } from './session-status.js';
7
+ import { isSessionDrained, lastActivityMs, readSpoolState } from './spool-state.js';
8
+ import { abandonedSessionGraceMs, endedSessionGraceMs } from './spool-config.js';
9
+ /**
10
+ * Lightweight garbage collection for the OTLP spool.
11
+ *
12
+ * Two cleanup paths, both of which require every stream to be drained
13
+ * (`fileSize === cursor`) so no undelivered bytes are ever destroyed:
14
+ *
15
+ * 1. Normally ended sessions (`endedAt` set): deleted once the end grace period
16
+ * has elapsed since the later of `endedAt` and the last spool-file write, so
17
+ * late hook/OTEL writes postpone cleanup.
18
+ * 2. Abandoned sessions (no `endedAt`): deleted once the abandonment timeout has
19
+ * elapsed since the last spool-file write. Activity is read from spool-file
20
+ * mtimes, never from the status file, because cursor updates rewrite the
21
+ * status file without any new data arriving.
22
+ *
23
+ * Consequence: a live session that stays quiet (and fully drained) for longer
24
+ * than the abandonment timeout may have its spool removed. That is safe — the
25
+ * next producer write recreates the status and spool files from scratch.
26
+ */
27
+ export async function sweepSpool() {
28
+ for (const sessionId of await listSessionIds()) {
29
+ try {
30
+ await sweepSession(sessionId);
31
+ }
32
+ catch (err) {
33
+ const msg = err instanceof Error ? err.message : String(err);
34
+ logger.debug('[otlp-sweep] per-session error', ...sanitizeLogArgs({ sessionId, err: msg }));
35
+ }
36
+ }
37
+ }
38
+ async function sweepSession(sessionId) {
39
+ // Cheap unlocked pre-scan to keep the sweep off the hot path...
40
+ if (!(await isDeletable(sessionId)))
41
+ return;
42
+ await withSessionLock(sessionId, async () => {
43
+ // ...then re-read status, sizes and mtimes under the lock before deleting.
44
+ if (!(await isDeletable(sessionId)))
45
+ return;
46
+ await deleteSession(sessionId);
47
+ });
48
+ }
49
+ async function isDeletable(sessionId) {
50
+ const status = (await readStatus(sessionId)) ?? createStatus();
51
+ const spool = await readSpoolState(sessionId, status);
52
+ if (!isSessionDrained(spool))
53
+ return false;
54
+ const activityMs = await lastActivityMs(spool);
55
+ if (activityMs === null)
56
+ return false; // nothing on disk to clean up
57
+ const idleSince = status.endedAt !== undefined ? Math.max(status.endedAt, activityMs) : activityMs;
58
+ const timeoutMs = status.endedAt !== undefined ? endedSessionGraceMs() : abandonedSessionGraceMs();
59
+ return Date.now() - idleSince >= timeoutMs;
60
+ }
61
+ async function deleteSession(sessionId) {
62
+ const paths = [...SPOOL_STREAMS.map((s) => streamFile(sessionId, s)), statusFile(sessionId)];
63
+ for (const path of paths) {
64
+ try {
65
+ await unlink(path);
66
+ }
67
+ catch {
68
+ // File may already be gone
69
+ }
70
+ }
71
+ logger.debug('[otlp-sweep] swept session', ...sanitizeLogArgs({ sessionId }));
72
+ }
73
+ //# sourceMappingURL=sweep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { SSOCredentials, JWTCredentials } from '../../../../../core/types.js';
2
+ /**
3
+ * Process one tick for a single session: evaluate the completeness gate and,
4
+ * when it permits forwarding, dispatch a forward pass for the streams that
5
+ * actually have bytes after their cursor.
6
+ *
7
+ * A session stays gate-eligible for as long as its spool files are non-empty,
8
+ * so the pending-data check is what keeps a fully drained tick from issuing
9
+ * any HTTP requests.
10
+ */
11
+ export declare function processSessionTick(sessionId: string, credentials: SSOCredentials | JWTCredentials): Promise<void>;
12
+ //# sourceMappingURL=tick-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick-processor.d.ts","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAWnF;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,cAAc,GAAG,cAAc,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Df"}
@@ -0,0 +1,73 @@
1
+ import { logger } from '../../../../../../utils/logger.js';
2
+ import { sanitizeLogArgs } from '../../../../../../utils/security.js';
3
+ import { withSessionLock } from './session-lock.js';
4
+ import { readStatus, writeStatus } from './session-status.js';
5
+ import { OTEL_STREAMS } from './spool-paths.js';
6
+ import { hasPendingData, readSpoolState } from './spool-state.js';
7
+ import { gateDecision } from './completeness-gate.js';
8
+ import { forwardSession } from './forwarder.js';
9
+ import { areCredentialsStale } from './auth-state.js';
10
+ const currentlyForwarding = new Set();
11
+ /**
12
+ * Process one tick for a single session: evaluate the completeness gate and,
13
+ * when it permits forwarding, dispatch a forward pass for the streams that
14
+ * actually have bytes after their cursor.
15
+ *
16
+ * A session stays gate-eligible for as long as its spool files are non-empty,
17
+ * so the pending-data check is what keeps a fully drained tick from issuing
18
+ * any HTTP requests.
19
+ */
20
+ export async function processSessionTick(sessionId, credentials) {
21
+ let shouldForward = false;
22
+ let hooksOnly = false;
23
+ await withSessionLock(sessionId, async () => {
24
+ const status = await readStatus(sessionId);
25
+ if (!status) {
26
+ return;
27
+ }
28
+ if (areCredentialsStale()) {
29
+ return;
30
+ }
31
+ const spool = await readSpoolState(sessionId, status);
32
+ const decision = gateDecision(spool, status);
33
+ const pending = hasPendingData(spool);
34
+ logger.debug('[otlp-tick] gate decision', ...sanitizeLogArgs({ sessionId, decision, pending, waitTicks: status.waitTicks }));
35
+ if (decision === 'send' || decision === 'hooks-only-force') {
36
+ shouldForward = pending;
37
+ hooksOnly = decision === 'hooks-only-force';
38
+ }
39
+ else if (decision === 'wait') {
40
+ status.waitTicks += 1;
41
+ await writeStatus(sessionId, status);
42
+ }
43
+ else if (decision === 'skip') {
44
+ // INVARIANT: OTEL-only sessions are never forwarded (per-project allowlist,
45
+ // see completeness-gate.ts). Advance cursors to EOF so the session counts
46
+ // as drained and the sweeper deletes it.
47
+ // Pure in-place mutation: the session lock is not reentrant, so do NOT call
48
+ // advanceCursor/updateStatus/ensureStatus here.
49
+ // Without valid credentials the tick returns before the gate, so skipping
50
+ // resumes after a proxy restart with valid credentials.
51
+ // Accepted trade-off: a tracked session whose first hook arrives after the
52
+ // wait limit loses the OTEL bytes received before that.
53
+ if (pending) {
54
+ for (const stream of OTEL_STREAMS) {
55
+ status.cursors[stream] = Math.max(status.cursors[stream], spool.streams[stream].size);
56
+ }
57
+ await writeStatus(sessionId, status);
58
+ }
59
+ }
60
+ // 'noop': nothing written yet
61
+ });
62
+ if (!shouldForward || currentlyForwarding.has(sessionId)) {
63
+ return;
64
+ }
65
+ currentlyForwarding.add(sessionId);
66
+ try {
67
+ await forwardSession(sessionId, hooksOnly, credentials);
68
+ }
69
+ finally {
70
+ currentlyForwarding.delete(sessionId);
71
+ }
72
+ }
73
+ //# sourceMappingURL=tick-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick-processor.js","sourceRoot":"","sources":["../../../../../../../src/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ProxyPlugin, PluginContext, ProxyInterceptor } from './types.js';
2
+ export interface OtlpHookSpoolData {
3
+ agentName: string;
4
+ raw: string;
5
+ timestamp: number;
6
+ }
7
+ export declare class OtlpPlugin implements ProxyPlugin {
8
+ id: string;
9
+ name: string;
10
+ version: string;
11
+ priority: number;
12
+ createInterceptor(context: PluginContext): ProxyInterceptor;
13
+ }
14
+ //# sourceMappingURL=otlp.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/otlp.plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuB/E,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAuOD,qBAAa,UAAW,YAAW,WAAW;IAC5C,EAAE,SAAmB;IACrB,IAAI,SAAoB;IACxB,OAAO,SAAW;IAClB,QAAQ,SAAM;IAEd,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,gBAAgB;CAK5D"}