@codemieai/code 0.15.5 → 0.15.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +3 -0
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts +4 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +15 -0
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/session/SessionStore.d.ts +6 -0
- package/dist/agents/core/session/SessionStore.d.ts.map +1 -1
- package/dist/agents/core/session/SessionStore.js +38 -0
- package/dist/agents/core/session/SessionStore.js.map +1 -1
- package/dist/agents/core/session/types.d.ts +2 -0
- package/dist/agents/core/session/types.d.ts.map +1 -1
- package/dist/agents/core/types.d.ts +10 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/core/types.js +5 -1
- package/dist/agents/core/types.js.map +1 -1
- package/dist/agents/plugins/claude/claude.models.d.ts +19 -3
- package/dist/agents/plugins/claude/claude.models.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.models.js +116 -64
- package/dist/agents/plugins/claude/claude.models.js.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude/claude.plugin.js +25 -4
- package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/agents/plugins/claude/plugin/skills/codemie-assistant-builder/SKILL.md +177 -0
- package/dist/agents/plugins/claude/plugin/skills/codemie-assistant-builder/agents/grader.md +38 -0
- package/dist/agents/plugins/claude/plugin/skills/codemie-assistant-builder/agents/improver.md +40 -0
- package/dist/agents/plugins/claude/plugin/skills/codemie-sdk/SKILL.md +10 -1
- package/dist/agents/plugins/claude/plugin/skills/codemie-sdk/examples/assistants.md +23 -0
- package/dist/agents/plugins/claude/plugin/statusline.bundle.mjs +57 -21
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts +13 -0
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.d.ts.map +1 -1
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js +27 -1
- package/dist/agents/plugins/claude/session/processors/claude.conversations-processor.js.map +1 -1
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts +6 -0
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.d.ts.map +1 -1
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js +21 -0
- package/dist/agents/plugins/claude/session/processors/claude.metrics-processor.js.map +1 -1
- package/dist/agents/plugins/claude/session/processors/messages-before.d.ts +11 -0
- package/dist/agents/plugins/claude/session/processors/messages-before.d.ts.map +1 -0
- package/dist/agents/plugins/claude/session/processors/messages-before.js +15 -0
- package/dist/agents/plugins/claude/session/processors/messages-before.js.map +1 -0
- package/dist/agents/plugins/claude/statusline-installer.d.ts +9 -0
- package/dist/agents/plugins/claude/statusline-installer.d.ts.map +1 -1
- package/dist/agents/plugins/claude/statusline-installer.js +42 -27
- package/dist/agents/plugins/claude/statusline-installer.js.map +1 -1
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.d.ts +3 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.d.ts.map +1 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.js +3 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.constants.js.map +1 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.d.ts +11 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.js +65 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.plugin.js.map +1 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.d.ts +63 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.d.ts.map +1 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.js +13 -0
- package/dist/agents/plugins/claude-code-otlp/claude-code-otlp.types.js.map +1 -0
- package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js +6 -4
- package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
- package/dist/agents/plugins/codex/codex-models.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex-models.js +9 -6
- package/dist/agents/plugins/codex/codex-models.js.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex/codex.plugin.js +2 -1
- package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts +3 -2
- package/dist/agents/plugins/opencode/opencode-dynamic-models.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode-dynamic-models.js +14 -6
- package/dist/agents/plugins/opencode/opencode-dynamic-models.js.map +1 -1
- package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/opencode/opencode.plugin.js +6 -4
- package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -1
- package/dist/agents/plugins/utils.d.ts +11 -0
- package/dist/agents/plugins/utils.d.ts.map +1 -0
- package/dist/agents/plugins/utils.js +46 -0
- package/dist/agents/plugins/utils.js.map +1 -0
- package/dist/agents/registry.d.ts +3 -1
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +12 -0
- package/dist/agents/registry.js.map +1 -1
- package/dist/bin/proxy-daemon.js +4 -0
- package/dist/bin/proxy-daemon.js.map +1 -1
- package/dist/cli/commands/assistants/setup/configuration/selection.d.ts +3 -1
- package/dist/cli/commands/assistants/setup/configuration/selection.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/configuration/selection.js +6 -3
- package/dist/cli/commands/assistants/setup/configuration/selection.js.map +1 -1
- package/dist/cli/commands/assistants/setup/configuration/types.d.ts +2 -0
- package/dist/cli/commands/assistants/setup/configuration/types.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/configuration/ui.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/configuration/ui.js +3 -0
- package/dist/cli/commands/assistants/setup/configuration/ui.js.map +1 -1
- package/dist/cli/commands/assistants/setup/data.d.ts +6 -2
- package/dist/cli/commands/assistants/setup/data.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/data.js +23 -8
- package/dist/cli/commands/assistants/setup/data.js.map +1 -1
- package/dist/cli/commands/assistants/setup/helpers.d.ts +1 -0
- package/dist/cli/commands/assistants/setup/helpers.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/helpers.js +11 -0
- package/dist/cli/commands/assistants/setup/helpers.js.map +1 -1
- package/dist/cli/commands/assistants/setup/index.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/index.js +24 -6
- package/dist/cli/commands/assistants/setup/index.js.map +1 -1
- package/dist/cli/commands/assistants/setup/manualConfiguration/index.d.ts +2 -1
- package/dist/cli/commands/assistants/setup/manualConfiguration/index.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/manualConfiguration/index.js +5 -3
- package/dist/cli/commands/assistants/setup/manualConfiguration/index.js.map +1 -1
- package/dist/cli/commands/assistants/setup/manualConfiguration/types.d.ts +2 -0
- package/dist/cli/commands/assistants/setup/manualConfiguration/types.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/manualConfiguration/ui.d.ts.map +1 -1
- package/dist/cli/commands/assistants/setup/manualConfiguration/ui.js +3 -0
- package/dist/cli/commands/assistants/setup/manualConfiguration/ui.js.map +1 -1
- package/dist/cli/commands/hook.d.ts.map +1 -1
- package/dist/cli/commands/hook.js +24 -29
- package/dist/cli/commands/hook.js.map +1 -1
- package/dist/cli/commands/proxy/connect-orchestrator.d.ts +8 -1
- package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connect-orchestrator.js +65 -4
- package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -1
- package/dist/cli/commands/proxy/connectors/claude-code-otlp.d.ts +33 -0
- package/dist/cli/commands/proxy/connectors/claude-code-otlp.d.ts.map +1 -0
- package/dist/cli/commands/proxy/connectors/claude-code-otlp.js +299 -0
- package/dist/cli/commands/proxy/connectors/claude-code-otlp.js.map +1 -0
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.d.ts.map +1 -1
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js +5 -6
- package/dist/cli/commands/proxy/connectors/managed-mcp-remote.js.map +1 -1
- package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts +2 -0
- package/dist/cli/commands/proxy/disconnect-orchestrator.d.ts.map +1 -1
- package/dist/cli/commands/proxy/disconnect-orchestrator.js +34 -5
- package/dist/cli/commands/proxy/disconnect-orchestrator.js.map +1 -1
- package/dist/cli/commands/proxy/index.d.ts.map +1 -1
- package/dist/cli/commands/proxy/index.js +19 -2
- package/dist/cli/commands/proxy/index.js.map +1 -1
- package/dist/cli/commands/sdk/assistant-builder/checks.d.ts +4 -0
- package/dist/cli/commands/sdk/assistant-builder/checks.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/checks.js +32 -0
- package/dist/cli/commands/sdk/assistant-builder/checks.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/commands.d.ts +6 -0
- package/dist/cli/commands/sdk/assistant-builder/commands.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/commands.js +278 -0
- package/dist/cli/commands/sdk/assistant-builder/commands.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/conversations.d.ts +26 -0
- package/dist/cli/commands/sdk/assistant-builder/conversations.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/conversations.js +45 -0
- package/dist/cli/commands/sdk/assistant-builder/conversations.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/normalize.d.ts +11 -0
- package/dist/cli/commands/sdk/assistant-builder/normalize.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/normalize.js +43 -0
- package/dist/cli/commands/sdk/assistant-builder/normalize.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/output.d.ts +10 -0
- package/dist/cli/commands/sdk/assistant-builder/output.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/output.js +29 -0
- package/dist/cli/commands/sdk/assistant-builder/output.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/compare.d.ts +23 -0
- package/dist/cli/commands/sdk/assistant-builder/report/compare.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/compare.js +66 -0
- package/dist/cli/commands/sdk/assistant-builder/report/compare.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/html.d.ts +9 -0
- package/dist/cli/commands/sdk/assistant-builder/report/html.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/html.js +87 -0
- package/dist/cli/commands/sdk/assistant-builder/report/html.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/summary.d.ts +31 -0
- package/dist/cli/commands/sdk/assistant-builder/report/summary.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/summary.js +56 -0
- package/dist/cli/commands/sdk/assistant-builder/report/summary.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/workspace.d.ts +19 -0
- package/dist/cli/commands/sdk/assistant-builder/report/workspace.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/report/workspace.js +112 -0
- package/dist/cli/commands/sdk/assistant-builder/report/workspace.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/runner.d.ts +32 -0
- package/dist/cli/commands/sdk/assistant-builder/runner.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/runner.js +109 -0
- package/dist/cli/commands/sdk/assistant-builder/runner.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/scenarios.d.ts +5 -0
- package/dist/cli/commands/sdk/assistant-builder/scenarios.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/scenarios.js +66 -0
- package/dist/cli/commands/sdk/assistant-builder/scenarios.js.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/types.d.ts +70 -0
- package/dist/cli/commands/sdk/assistant-builder/types.d.ts.map +1 -0
- package/dist/cli/commands/sdk/assistant-builder/types.js +2 -0
- package/dist/cli/commands/sdk/assistant-builder/types.js.map +1 -0
- package/dist/cli/commands/sdk/assistants.d.ts.map +1 -1
- package/dist/cli/commands/sdk/assistants.js +2 -0
- package/dist/cli/commands/sdk/assistants.js.map +1 -1
- package/dist/cli/commands/sdk/services/assistants.d.ts +20 -1
- package/dist/cli/commands/sdk/services/assistants.d.ts.map +1 -1
- package/dist/cli/commands/sdk/services/assistants.js +80 -2
- package/dist/cli/commands/sdk/services/assistants.js.map +1 -1
- package/dist/cli/commands/sdk/utils/cli-utils.js +1 -1
- package/dist/cli/commands/sdk/utils/cli-utils.js.map +1 -1
- package/dist/cli/commands/self-update.d.ts.map +1 -1
- package/dist/cli/commands/self-update.js +5 -1
- package/dist/cli/commands/self-update.js.map +1 -1
- package/dist/cli/commands/shared/constants.d.ts +3 -0
- package/dist/cli/commands/shared/constants.d.ts.map +1 -1
- package/dist/cli/commands/shared/constants.js +3 -0
- package/dist/cli/commands/shared/constants.js.map +1 -1
- package/dist/cli/commands/shared/prompts/storage-scope.d.ts +3 -1
- package/dist/cli/commands/shared/prompts/storage-scope.d.ts.map +1 -1
- package/dist/cli/commands/shared/prompts/storage-scope.js +5 -1
- package/dist/cli/commands/shared/prompts/storage-scope.js.map +1 -1
- package/dist/cli/commands/skills/setup/data.d.ts +5 -1
- package/dist/cli/commands/skills/setup/data.d.ts.map +1 -1
- package/dist/cli/commands/skills/setup/data.js +17 -8
- package/dist/cli/commands/skills/setup/data.js.map +1 -1
- package/dist/cli/commands/skills/setup/helpers.d.ts +1 -0
- package/dist/cli/commands/skills/setup/helpers.d.ts.map +1 -1
- package/dist/cli/commands/skills/setup/helpers.js +11 -0
- package/dist/cli/commands/skills/setup/helpers.js.map +1 -1
- package/dist/cli/commands/skills/setup/index.d.ts.map +1 -1
- package/dist/cli/commands/skills/setup/index.js +7 -2
- package/dist/cli/commands/skills/setup/index.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/mcp/stdio-http-bridge.d.ts.map +1 -1
- package/dist/mcp/stdio-http-bridge.js +4 -0
- package/dist/mcp/stdio-http-bridge.js.map +1 -1
- package/dist/providers/core/base/http-client.d.ts.map +1 -1
- package/dist/providers/core/base/http-client.js +16 -3
- package/dist/providers/core/base/http-client.js.map +1 -1
- package/dist/providers/core/codemie-auth-helpers.d.ts.map +1 -1
- package/dist/providers/core/codemie-auth-helpers.js +2 -1
- package/dist/providers/core/codemie-auth-helpers.js.map +1 -1
- package/dist/providers/core/types.d.ts +3 -0
- package/dist/providers/core/types.d.ts.map +1 -1
- package/dist/providers/core/types.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/index.js +2 -0
- package/dist/providers/plugins/sso/proxy/plugins/index.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.d.ts +3 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.js +19 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/auth-state.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.d.ts +19 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.js +33 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/completeness-gate.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.d.ts +14 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.js +287 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/forwarder.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.d.ts +8 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.js +29 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-lock.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.d.ts +40 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.js +82 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/session-status.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.d.ts +36 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.js +62 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-config.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.d.ts +39 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.js +110 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-io.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.d.ts +24 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.js +53 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-paths.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.d.ts +39 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.js +61 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/spool-state.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.d.ts +20 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.js +73 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/sweep.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.d.ts +12 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.js +55 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp-spool/tick-processor.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.d.ts +14 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.d.ts.map +1 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.js +221 -0
- package/dist/providers/plugins/sso/proxy/plugins/otlp.plugin.js.map +1 -0
- package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts +1 -4
- package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/proxy-http-client.js +10 -207
- package/dist/providers/plugins/sso/proxy/proxy-http-client.js.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.d.ts.map +1 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.js +2 -1
- package/dist/providers/plugins/sso/proxy/sso.proxy.js.map +1 -1
- package/dist/providers/plugins/sso/sso.auth-gate.d.ts +18 -0
- package/dist/providers/plugins/sso/sso.auth-gate.d.ts.map +1 -0
- package/dist/providers/plugins/sso/sso.auth-gate.js +48 -0
- package/dist/providers/plugins/sso/sso.auth-gate.js.map +1 -0
- package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.auth.js +14 -4
- package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
- package/dist/providers/plugins/sso/sso.http-client.d.ts +17 -0
- package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.http-client.js +33 -5
- package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
- package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.d.ts +3 -0
- package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.d.ts.map +1 -1
- package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.js +43 -2
- package/dist/telemetry/clients/claude-desktop/ClaudeDesktopTelemetryAdapter.js.map +1 -1
- package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.d.ts.map +1 -1
- package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js +12 -10
- package/dist/telemetry/clients/claude-desktop/claude-desktop.discovery.js.map +1 -1
- package/dist/telemetry/runtime/DesktopRepositoryResolver.d.ts.map +1 -1
- package/dist/telemetry/runtime/DesktopRepositoryResolver.js +33 -6
- package/dist/telemetry/runtime/DesktopRepositoryResolver.js.map +1 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts +2 -0
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.d.ts.map +1 -1
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.js +61 -10
- package/dist/telemetry/runtime/DesktopTelemetryRuntime.js.map +1 -1
- package/dist/telemetry/runtime/checkpoints.d.ts +6 -0
- package/dist/telemetry/runtime/checkpoints.d.ts.map +1 -1
- package/dist/telemetry/runtime/checkpoints.js.map +1 -1
- package/dist/telemetry/runtime/types.d.ts +5 -0
- package/dist/telemetry/runtime/types.d.ts.map +1 -1
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +4 -0
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/cli-updater.d.ts +7 -0
- package/dist/utils/cli-updater.d.ts.map +1 -1
- package/dist/utils/cli-updater.js +21 -0
- package/dist/utils/cli-updater.js.map +1 -1
- package/dist/utils/paths.d.ts +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/pricing.json +9 -1
- package/dist/utils/processes.d.ts.map +1 -1
- package/dist/utils/processes.js +3 -2
- package/dist/utils/processes.js.map +1 -1
- package/dist/utils/project-root.d.ts +10 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +25 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/utils/sdk-client.d.ts.map +1 -1
- package/dist/utils/sdk-client.js +4 -0
- package/dist/utils/sdk-client.js.map +1 -1
- package/dist/utils/system-proxy-dispatcher.d.ts +8 -0
- package/dist/utils/system-proxy-dispatcher.d.ts.map +1 -0
- package/dist/utils/system-proxy-dispatcher.js +100 -0
- package/dist/utils/system-proxy-dispatcher.js.map +1 -0
- package/dist/utils/system-proxy.d.ts +115 -0
- package/dist/utils/system-proxy.d.ts.map +1 -0
- package/dist/utils/system-proxy.js +899 -0
- package/dist/utils/system-proxy.js.map +1 -0
- package/dist/utils/windows-path.d.ts +5 -0
- package/dist/utils/windows-path.d.ts.map +1 -1
- package/dist/utils/windows-path.js +1 -1
- package/dist/utils/windows-path.js.map +1 -1
- package/package.json +5 -2
- package/scripts/bundle-statusline.mjs +14 -1
|
@@ -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;AAUnF;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,cAAc,GAAG,cAAc,GAC3C,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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 { hasPendingData, readSpoolState } from './spool-state.js';
|
|
6
|
+
import { gateDecision } from './completeness-gate.js';
|
|
7
|
+
import { forwardSession } from './forwarder.js';
|
|
8
|
+
import { areCredentialsStale } from './auth-state.js';
|
|
9
|
+
const currentlyForwarding = new Set();
|
|
10
|
+
/**
|
|
11
|
+
* Process one tick for a single session: evaluate the completeness gate and,
|
|
12
|
+
* when it permits forwarding, dispatch a forward pass for the streams that
|
|
13
|
+
* actually have bytes after their cursor.
|
|
14
|
+
*
|
|
15
|
+
* A session stays gate-eligible for as long as its spool files are non-empty,
|
|
16
|
+
* so the pending-data check is what keeps a fully drained tick from issuing
|
|
17
|
+
* any HTTP requests.
|
|
18
|
+
*/
|
|
19
|
+
export async function processSessionTick(sessionId, credentials) {
|
|
20
|
+
let shouldForward = false;
|
|
21
|
+
let hooksOnly = false;
|
|
22
|
+
await withSessionLock(sessionId, async () => {
|
|
23
|
+
const status = await readStatus(sessionId);
|
|
24
|
+
if (!status) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (areCredentialsStale()) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const spool = await readSpoolState(sessionId, status);
|
|
31
|
+
const decision = gateDecision(spool, status);
|
|
32
|
+
const pending = hasPendingData(spool);
|
|
33
|
+
logger.debug('[otlp-tick] gate decision', ...sanitizeLogArgs({ sessionId, decision, pending, waitTicks: status.waitTicks }));
|
|
34
|
+
if (decision === 'send' || decision === 'hooks-only-force') {
|
|
35
|
+
shouldForward = pending;
|
|
36
|
+
hooksOnly = decision === 'hooks-only-force';
|
|
37
|
+
}
|
|
38
|
+
else if (decision === 'wait') {
|
|
39
|
+
status.waitTicks += 1;
|
|
40
|
+
await writeStatus(sessionId, status);
|
|
41
|
+
}
|
|
42
|
+
// 'noop': nothing written yet
|
|
43
|
+
});
|
|
44
|
+
if (!shouldForward || currentlyForwarding.has(sessionId)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
currentlyForwarding.add(sessionId);
|
|
48
|
+
try {
|
|
49
|
+
await forwardSession(sessionId, hooksOnly, credentials);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
currentlyForwarding.delete(sessionId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# 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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,WAA4C;IAE5C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,eAAe,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,IAAI,mBAAmB,EAAE,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,CAAC,KAAK,CACV,2BAA2B,EAC3B,GAAG,eAAe,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAClF,CAAC;QAEF,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;YAC3D,aAAa,GAAG,OAAO,CAAC;YACxB,SAAS,GAAG,QAAQ,KAAK,kBAAkB,CAAC;QAC9C,CAAC;aAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;YACtB,MAAM,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QACD,8BAA8B;IAChC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,IAAI,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACzD,OAAO;IACT,CAAC;IAED,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;YAAS,CAAC;QACT,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -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":"AAEA,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;AA2OD,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"}
|