@codemieai/code 0.0.16 → 0.0.17
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/README.md +62 -5
- package/bin/agent-executor.js +7 -28
- package/bin/codemie-claude.js +18 -0
- package/bin/codemie-codex.js +18 -0
- package/bin/codemie-deepagents.js +18 -0
- package/bin/codemie-gemini.js +18 -0
- package/dist/agents/codemie-code/agent.d.ts.map +1 -1
- package/dist/agents/codemie-code/agent.js +3 -32
- package/dist/agents/codemie-code/agent.js.map +1 -1
- package/dist/agents/codemie-code/tools/planning.d.ts +2 -2
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +25 -59
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts +9 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +103 -10
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/core/BaseMetricsAdapter.d.ts +64 -0
- package/dist/agents/core/BaseMetricsAdapter.d.ts.map +1 -0
- package/dist/agents/core/BaseMetricsAdapter.js +74 -0
- package/dist/agents/core/BaseMetricsAdapter.js.map +1 -0
- package/dist/agents/core/types.d.ts +1 -0
- package/dist/agents/core/types.d.ts.map +1 -1
- package/dist/agents/plugins/claude.metrics.d.ts +112 -0
- package/dist/agents/plugins/claude.metrics.d.ts.map +1 -0
- package/dist/agents/plugins/claude.metrics.js +700 -0
- package/dist/agents/plugins/claude.metrics.js.map +1 -0
- package/dist/agents/plugins/claude.plugin.d.ts +9 -0
- package/dist/agents/plugins/claude.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/claude.plugin.js +52 -10
- package/dist/agents/plugins/claude.plugin.js.map +1 -1
- package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js +45 -13
- package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
- package/dist/agents/plugins/codex.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/codex.plugin.js +0 -2
- package/dist/agents/plugins/codex.plugin.js.map +1 -1
- package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -1
- package/dist/agents/plugins/gemini.plugin.js +0 -7
- package/dist/agents/plugins/gemini.plugin.js.map +1 -1
- package/dist/agents/plugins/history-parser.d.ts +52 -0
- package/dist/agents/plugins/history-parser.d.ts.map +1 -0
- package/dist/agents/plugins/history-parser.js +155 -0
- package/dist/agents/plugins/history-parser.js.map +1 -0
- package/dist/cli/commands/analytics/aggregator.d.ts +58 -0
- package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -0
- package/dist/cli/commands/analytics/aggregator.js +702 -0
- package/dist/cli/commands/analytics/aggregator.js.map +1 -0
- package/dist/cli/commands/analytics/data-loader.d.ts +84 -0
- package/dist/cli/commands/analytics/data-loader.d.ts.map +1 -0
- package/dist/cli/commands/analytics/data-loader.js +211 -0
- package/dist/cli/commands/analytics/data-loader.js.map +1 -0
- package/dist/cli/commands/analytics/exporter.d.ts +20 -0
- package/dist/cli/commands/analytics/exporter.d.ts.map +1 -0
- package/dist/cli/commands/analytics/exporter.js +103 -0
- package/dist/cli/commands/analytics/exporter.js.map +1 -0
- package/dist/cli/commands/analytics/formatter.d.ts +49 -0
- package/dist/cli/commands/analytics/formatter.d.ts.map +1 -0
- package/dist/cli/commands/analytics/formatter.js +309 -0
- package/dist/cli/commands/analytics/formatter.js.map +1 -0
- package/dist/cli/commands/analytics/index.d.ts +6 -0
- package/dist/cli/commands/analytics/index.d.ts.map +1 -0
- package/dist/cli/commands/analytics/index.js +157 -0
- package/dist/cli/commands/analytics/index.js.map +1 -0
- package/dist/cli/commands/analytics/model-normalizer.d.ts +21 -0
- package/dist/cli/commands/analytics/model-normalizer.d.ts.map +1 -0
- package/dist/cli/commands/analytics/model-normalizer.js +44 -0
- package/dist/cli/commands/analytics/model-normalizer.js.map +1 -0
- package/dist/cli/commands/analytics/types.d.ts +188 -0
- package/dist/cli/commands/analytics/types.d.ts.map +1 -0
- package/dist/cli/commands/analytics/types.js +6 -0
- package/dist/cli/commands/analytics/types.js.map +1 -0
- package/dist/cli/commands/doctor/checks/AwsCliCheck.d.ts +9 -0
- package/dist/cli/commands/doctor/checks/AwsCliCheck.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/AwsCliCheck.js +28 -0
- package/dist/cli/commands/doctor/checks/AwsCliCheck.js.map +1 -0
- package/dist/cli/commands/doctor/checks/PythonCheck.d.ts.map +1 -1
- package/dist/cli/commands/doctor/checks/PythonCheck.js +10 -0
- package/dist/cli/commands/doctor/checks/PythonCheck.js.map +1 -1
- package/dist/cli/commands/doctor/checks/WorkflowsCheck.d.ts.map +1 -1
- package/dist/cli/commands/doctor/checks/WorkflowsCheck.js +2 -1
- package/dist/cli/commands/doctor/checks/WorkflowsCheck.js.map +1 -1
- package/dist/cli/commands/doctor/checks/index.d.ts +1 -0
- package/dist/cli/commands/doctor/checks/index.d.ts.map +1 -1
- package/dist/cli/commands/doctor/checks/index.js +1 -0
- package/dist/cli/commands/doctor/checks/index.js.map +1 -1
- package/dist/cli/commands/doctor/index.d.ts.map +1 -1
- package/dist/cli/commands/doctor/index.js +85 -3
- package/dist/cli/commands/doctor/index.js.map +1 -1
- package/dist/cli/commands/profile.d.ts.map +1 -1
- package/dist/cli/commands/profile.js +49 -89
- package/dist/cli/commands/profile.js.map +1 -1
- package/dist/cli/commands/setup.js +1 -21
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +14 -2
- package/dist/env/types.d.ts.map +1 -1
- package/dist/env/types.js.map +1 -1
- package/dist/metrics/MetricsOrchestrator.d.ts +67 -0
- package/dist/metrics/MetricsOrchestrator.d.ts.map +1 -0
- package/dist/metrics/MetricsOrchestrator.js +287 -0
- package/dist/metrics/MetricsOrchestrator.js.map +1 -0
- package/dist/metrics/config.d.ts +38 -0
- package/dist/metrics/config.d.ts.map +1 -0
- package/dist/metrics/config.js +80 -0
- package/dist/metrics/config.js.map +1 -0
- package/dist/metrics/core/DeltaWriter.d.ts +49 -0
- package/dist/metrics/core/DeltaWriter.d.ts.map +1 -0
- package/dist/metrics/core/DeltaWriter.js +146 -0
- package/dist/metrics/core/DeltaWriter.js.map +1 -0
- package/dist/metrics/core/FileSnapshotter.d.ts +22 -0
- package/dist/metrics/core/FileSnapshotter.d.ts.map +1 -0
- package/dist/metrics/core/FileSnapshotter.js +74 -0
- package/dist/metrics/core/FileSnapshotter.js.map +1 -0
- package/dist/metrics/core/SessionCorrelator.d.ts +34 -0
- package/dist/metrics/core/SessionCorrelator.d.ts.map +1 -0
- package/dist/metrics/core/SessionCorrelator.js +115 -0
- package/dist/metrics/core/SessionCorrelator.js.map +1 -0
- package/dist/metrics/core/SyncStateManager.d.ts +69 -0
- package/dist/metrics/core/SyncStateManager.d.ts.map +1 -0
- package/dist/metrics/core/SyncStateManager.js +284 -0
- package/dist/metrics/core/SyncStateManager.js.map +1 -0
- package/dist/metrics/index.d.ts +9 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +11 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/session/SessionStore.d.ts +43 -0
- package/dist/metrics/session/SessionStore.d.ts.map +1 -0
- package/dist/metrics/session/SessionStore.js +142 -0
- package/dist/metrics/session/SessionStore.js.map +1 -0
- package/dist/metrics/sync/MetricsApiClient.d.ts +32 -0
- package/dist/metrics/sync/MetricsApiClient.d.ts.map +1 -0
- package/dist/metrics/sync/MetricsApiClient.js +155 -0
- package/dist/metrics/sync/MetricsApiClient.js.map +1 -0
- package/dist/metrics/sync/aggregator.d.ts +13 -0
- package/dist/metrics/sync/aggregator.d.ts.map +1 -0
- package/dist/metrics/sync/aggregator.js +196 -0
- package/dist/metrics/sync/aggregator.js.map +1 -0
- package/dist/metrics/sync/index.d.ts +10 -0
- package/dist/metrics/sync/index.d.ts.map +1 -0
- package/dist/metrics/sync/index.js +10 -0
- package/dist/metrics/sync/index.js.map +1 -0
- package/dist/metrics/sync/jsonl-writer.d.ts +28 -0
- package/dist/metrics/sync/jsonl-writer.d.ts.map +1 -0
- package/dist/metrics/sync/jsonl-writer.js +72 -0
- package/dist/metrics/sync/jsonl-writer.js.map +1 -0
- package/dist/metrics/sync/types.d.ts +72 -0
- package/dist/metrics/sync/types.d.ts.map +1 -0
- package/dist/metrics/sync/types.js +7 -0
- package/dist/metrics/sync/types.js.map +1 -0
- package/dist/metrics/types.d.ts +308 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +8 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/integration/setup-ui.d.ts +1 -1
- package/dist/providers/integration/setup-ui.d.ts.map +1 -1
- package/dist/providers/integration/setup-ui.js +51 -6
- package/dist/providers/integration/setup-ui.js.map +1 -1
- package/dist/providers/plugins/bedrock/bedrock.health.d.ts +53 -0
- package/dist/providers/plugins/bedrock/bedrock.health.d.ts.map +1 -0
- package/dist/providers/plugins/bedrock/bedrock.health.js +115 -0
- package/dist/providers/plugins/bedrock/bedrock.health.js.map +1 -0
- package/dist/providers/plugins/bedrock/bedrock.models.d.ts +26 -0
- package/dist/providers/plugins/bedrock/bedrock.models.d.ts.map +1 -0
- package/dist/providers/plugins/bedrock/bedrock.models.js +89 -0
- package/dist/providers/plugins/bedrock/bedrock.models.js.map +1 -0
- package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts +12 -0
- package/dist/providers/plugins/bedrock/bedrock.setup-steps.d.ts.map +1 -0
- package/dist/providers/plugins/bedrock/bedrock.setup-steps.js +308 -0
- package/dist/providers/plugins/bedrock/bedrock.setup-steps.js.map +1 -0
- package/dist/providers/plugins/bedrock/bedrock.template.d.ts +11 -0
- package/dist/providers/plugins/bedrock/bedrock.template.d.ts.map +1 -0
- package/dist/providers/plugins/bedrock/bedrock.template.js +85 -0
- package/dist/providers/plugins/bedrock/bedrock.template.js.map +1 -0
- package/dist/providers/plugins/bedrock/index.d.ts +11 -0
- package/dist/providers/plugins/bedrock/index.d.ts.map +1 -0
- package/dist/providers/plugins/bedrock/index.js +11 -0
- package/dist/providers/plugins/bedrock/index.js.map +1 -0
- package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -1
- package/dist/providers/plugins/ollama/ollama.template.js +2 -0
- package/dist/providers/plugins/ollama/ollama.template.js.map +1 -1
- package/dist/providers/plugins/sso/sso.http-client.d.ts +2 -0
- package/dist/providers/plugins/sso/sso.http-client.d.ts.map +1 -1
- package/dist/providers/plugins/sso/sso.http-client.js +9 -3
- package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
- package/dist/proxy/http-client.d.ts.map +1 -1
- package/dist/proxy/http-client.js +49 -14
- package/dist/proxy/http-client.js.map +1 -1
- package/dist/proxy/plugins/endpoint-blocker.plugin.d.ts +19 -0
- package/dist/proxy/plugins/endpoint-blocker.plugin.d.ts.map +1 -0
- package/dist/proxy/plugins/endpoint-blocker.plugin.js +61 -0
- package/dist/proxy/plugins/endpoint-blocker.plugin.js.map +1 -0
- package/dist/proxy/plugins/header-injection.plugin.js +3 -0
- package/dist/proxy/plugins/header-injection.plugin.js.map +1 -1
- package/dist/proxy/plugins/index.d.ts +3 -1
- package/dist/proxy/plugins/index.d.ts.map +1 -1
- package/dist/proxy/plugins/index.js +5 -1
- package/dist/proxy/plugins/index.js.map +1 -1
- package/dist/proxy/plugins/logging.plugin.d.ts +3 -3
- package/dist/proxy/plugins/logging.plugin.js +84 -20
- package/dist/proxy/plugins/logging.plugin.js.map +1 -1
- package/dist/proxy/plugins/metrics-sync.plugin.d.ts +33 -0
- package/dist/proxy/plugins/metrics-sync.plugin.d.ts.map +1 -0
- package/dist/proxy/plugins/metrics-sync.plugin.js +310 -0
- package/dist/proxy/plugins/metrics-sync.plugin.js.map +1 -0
- package/dist/proxy/plugins/registry.d.ts.map +1 -1
- package/dist/proxy/plugins/registry.js +8 -1
- package/dist/proxy/plugins/registry.js.map +1 -1
- package/dist/proxy/plugins/types.d.ts +6 -2
- package/dist/proxy/plugins/types.d.ts.map +1 -1
- package/dist/proxy/types.d.ts +7 -0
- package/dist/proxy/types.d.ts.map +1 -1
- package/dist/utils/ascii-logo.d.ts +21 -0
- package/dist/utils/ascii-logo.d.ts.map +1 -0
- package/dist/utils/ascii-logo.js +75 -0
- package/dist/utils/ascii-logo.js.map +1 -0
- package/dist/utils/codemie-proxy.d.ts +0 -6
- package/dist/utils/codemie-proxy.d.ts.map +1 -1
- package/dist/utils/codemie-proxy.js +46 -56
- package/dist/utils/codemie-proxy.js.map +1 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +22 -6
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/exec.d.ts +11 -0
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +17 -1
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/goodbye-messages.d.ts +13 -0
- package/dist/utils/goodbye-messages.d.ts.map +1 -0
- package/dist/utils/goodbye-messages.js +245 -0
- package/dist/utils/goodbye-messages.js.map +1 -0
- package/dist/utils/json-parser.d.ts +52 -0
- package/dist/utils/json-parser.d.ts.map +1 -0
- package/dist/utils/json-parser.js +126 -0
- package/dist/utils/json-parser.js.map +1 -0
- package/dist/utils/logger.d.ts +37 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +92 -20
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/sanitize.d.ts.map +1 -1
- package/dist/utils/sanitize.js +0 -1
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/utils/which.d.ts +20 -0
- package/dist/utils/which.d.ts.map +1 -0
- package/dist/utils/which.js +47 -0
- package/dist/utils/which.js.map +1 -0
- package/package.json +10 -5
- package/dist/analytics/aggregation/adapters/claude.adapter.d.ts +0 -37
- package/dist/analytics/aggregation/adapters/claude.adapter.d.ts.map +0 -1
- package/dist/analytics/aggregation/adapters/claude.adapter.js +0 -531
- package/dist/analytics/aggregation/adapters/claude.adapter.js.map +0 -1
- package/dist/analytics/aggregation/adapters/codex.adapter.d.ts +0 -25
- package/dist/analytics/aggregation/adapters/codex.adapter.d.ts.map +0 -1
- package/dist/analytics/aggregation/adapters/codex.adapter.js +0 -396
- package/dist/analytics/aggregation/adapters/codex.adapter.js.map +0 -1
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts +0 -36
- package/dist/analytics/aggregation/adapters/gemini.adapter.d.ts.map +0 -1
- package/dist/analytics/aggregation/adapters/gemini.adapter.js +0 -365
- package/dist/analytics/aggregation/adapters/gemini.adapter.js.map +0 -1
- package/dist/analytics/aggregation/adapters/index.d.ts +0 -7
- package/dist/analytics/aggregation/adapters/index.d.ts.map +0 -1
- package/dist/analytics/aggregation/adapters/index.js +0 -7
- package/dist/analytics/aggregation/adapters/index.js.map +0 -1
- package/dist/analytics/aggregation/aggregator.d.ts +0 -49
- package/dist/analytics/aggregation/aggregator.d.ts.map +0 -1
- package/dist/analytics/aggregation/aggregator.js +0 -239
- package/dist/analytics/aggregation/aggregator.js.map +0 -1
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts +0 -99
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js +0 -110
- package/dist/analytics/aggregation/core/BaseAnalyticsAdapter.js.map +0 -1
- package/dist/analytics/aggregation/core/adapter.interface.d.ts +0 -76
- package/dist/analytics/aggregation/core/adapter.interface.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/adapter.interface.js +0 -9
- package/dist/analytics/aggregation/core/adapter.interface.js.map +0 -1
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts +0 -86
- package/dist/analytics/aggregation/core/aggregation-utils.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/aggregation-utils.js +0 -126
- package/dist/analytics/aggregation/core/aggregation-utils.js.map +0 -1
- package/dist/analytics/aggregation/core/discovery.d.ts +0 -40
- package/dist/analytics/aggregation/core/discovery.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/discovery.js +0 -132
- package/dist/analytics/aggregation/core/discovery.js.map +0 -1
- package/dist/analytics/aggregation/core/file-utils.d.ts +0 -24
- package/dist/analytics/aggregation/core/file-utils.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/file-utils.js +0 -143
- package/dist/analytics/aggregation/core/file-utils.js.map +0 -1
- package/dist/analytics/aggregation/core/index.d.ts +0 -14
- package/dist/analytics/aggregation/core/index.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/index.js +0 -14
- package/dist/analytics/aggregation/core/index.js.map +0 -1
- package/dist/analytics/aggregation/core/project-mapping.d.ts +0 -50
- package/dist/analytics/aggregation/core/project-mapping.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/project-mapping.js +0 -102
- package/dist/analytics/aggregation/core/project-mapping.js.map +0 -1
- package/dist/analytics/aggregation/core/streaming.d.ts +0 -26
- package/dist/analytics/aggregation/core/streaming.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/streaming.js +0 -58
- package/dist/analytics/aggregation/core/streaming.js.map +0 -1
- package/dist/analytics/aggregation/core/user-prompt-source.d.ts +0 -81
- package/dist/analytics/aggregation/core/user-prompt-source.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/user-prompt-source.js +0 -69
- package/dist/analytics/aggregation/core/user-prompt-source.js.map +0 -1
- package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts +0 -49
- package/dist/analytics/aggregation/core/user-prompt-sources/json.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/user-prompt-sources/json.js +0 -66
- package/dist/analytics/aggregation/core/user-prompt-sources/json.js.map +0 -1
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts +0 -43
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.d.ts.map +0 -1
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js +0 -56
- package/dist/analytics/aggregation/core/user-prompt-sources/jsonl.js.map +0 -1
- package/dist/analytics/aggregation/index.d.ts +0 -8
- package/dist/analytics/aggregation/index.d.ts.map +0 -1
- package/dist/analytics/aggregation/index.js +0 -8
- package/dist/analytics/aggregation/index.js.map +0 -1
- package/dist/analytics/aggregation/types.d.ts +0 -278
- package/dist/analytics/aggregation/types.d.ts.map +0 -1
- package/dist/analytics/aggregation/types.js +0 -8
- package/dist/analytics/aggregation/types.js.map +0 -1
- package/dist/analytics/collector.d.ts +0 -46
- package/dist/analytics/collector.d.ts.map +0 -1
- package/dist/analytics/collector.js +0 -83
- package/dist/analytics/collector.js.map +0 -1
- package/dist/analytics/config.d.ts +0 -15
- package/dist/analytics/config.d.ts.map +0 -1
- package/dist/analytics/config.js +0 -65
- package/dist/analytics/config.js.map +0 -1
- package/dist/analytics/index.d.ts +0 -99
- package/dist/analytics/index.d.ts.map +0 -1
- package/dist/analytics/index.js +0 -280
- package/dist/analytics/index.js.map +0 -1
- package/dist/analytics/plugins/api-metrics.plugin.d.ts +0 -26
- package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +0 -1
- package/dist/analytics/plugins/api-metrics.plugin.js +0 -97
- package/dist/analytics/plugins/api-metrics.plugin.js.map +0 -1
- package/dist/analytics/plugins/index.d.ts +0 -15
- package/dist/analytics/plugins/index.d.ts.map +0 -1
- package/dist/analytics/plugins/index.js +0 -15
- package/dist/analytics/plugins/index.js.map +0 -1
- package/dist/analytics/plugins/model-metrics.plugin.d.ts +0 -39
- package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +0 -1
- package/dist/analytics/plugins/model-metrics.plugin.js +0 -105
- package/dist/analytics/plugins/model-metrics.plugin.js.map +0 -1
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts +0 -41
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +0 -1
- package/dist/analytics/plugins/provider-metrics.plugin.js +0 -123
- package/dist/analytics/plugins/provider-metrics.plugin.js.map +0 -1
- package/dist/analytics/plugins/types.d.ts +0 -61
- package/dist/analytics/plugins/types.d.ts.map +0 -1
- package/dist/analytics/plugins/types.js +0 -54
- package/dist/analytics/plugins/types.js.map +0 -1
- package/dist/analytics/privacy.d.ts +0 -10
- package/dist/analytics/privacy.d.ts.map +0 -1
- package/dist/analytics/privacy.js +0 -20
- package/dist/analytics/privacy.js.map +0 -1
- package/dist/analytics/remote-submission/cursor-manager.d.ts +0 -71
- package/dist/analytics/remote-submission/cursor-manager.d.ts.map +0 -1
- package/dist/analytics/remote-submission/cursor-manager.js +0 -204
- package/dist/analytics/remote-submission/cursor-manager.js.map +0 -1
- package/dist/analytics/remote-submission/index.d.ts +0 -12
- package/dist/analytics/remote-submission/index.d.ts.map +0 -1
- package/dist/analytics/remote-submission/index.js +0 -11
- package/dist/analytics/remote-submission/index.js.map +0 -1
- package/dist/analytics/remote-submission/lock-manager.d.ts +0 -71
- package/dist/analytics/remote-submission/lock-manager.d.ts.map +0 -1
- package/dist/analytics/remote-submission/lock-manager.js +0 -238
- package/dist/analytics/remote-submission/lock-manager.js.map +0 -1
- package/dist/analytics/remote-submission/metric-transformer.d.ts +0 -21
- package/dist/analytics/remote-submission/metric-transformer.d.ts.map +0 -1
- package/dist/analytics/remote-submission/metric-transformer.js +0 -82
- package/dist/analytics/remote-submission/metric-transformer.js.map +0 -1
- package/dist/analytics/remote-submission/submitter.d.ts +0 -79
- package/dist/analytics/remote-submission/submitter.d.ts.map +0 -1
- package/dist/analytics/remote-submission/submitter.js +0 -362
- package/dist/analytics/remote-submission/submitter.js.map +0 -1
- package/dist/analytics/remote-submission/types.d.ts +0 -123
- package/dist/analytics/remote-submission/types.d.ts.map +0 -1
- package/dist/analytics/remote-submission/types.js +0 -13
- package/dist/analytics/remote-submission/types.js.map +0 -1
- package/dist/analytics/session.d.ts +0 -56
- package/dist/analytics/session.d.ts.map +0 -1
- package/dist/analytics/session.js +0 -95
- package/dist/analytics/session.js.map +0 -1
- package/dist/analytics/types.d.ts +0 -104
- package/dist/analytics/types.d.ts.map +0 -1
- package/dist/analytics/types.js +0 -15
- package/dist/analytics/types.js.map +0 -1
- package/dist/analytics/writer.d.ts +0 -18
- package/dist/analytics/writer.d.ts.map +0 -1
- package/dist/analytics/writer.js +0 -44
- package/dist/analytics/writer.js.map +0 -1
- package/dist/cli/commands/analytics.d.ts +0 -3
- package/dist/cli/commands/analytics.d.ts.map +0 -1
- package/dist/cli/commands/analytics.js +0 -748
- package/dist/cli/commands/analytics.js.map +0 -1
- package/dist/utils/analytics-reader.d.ts +0 -117
- package/dist/utils/analytics-reader.d.ts.map +0 -1
- package/dist/utils/analytics-reader.js +0 -421
- package/dist/utils/analytics-reader.js.map +0 -1
- package/dist/utils/date-formatter.d.ts +0 -88
- package/dist/utils/date-formatter.d.ts.map +0 -1
- package/dist/utils/date-formatter.js +0 -133
- package/dist/utils/date-formatter.js.map +0 -1
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates metrics collection across agent lifecycle:
|
|
5
|
+
* 1. Pre-spawn snapshot
|
|
6
|
+
* 2. Post-spawn snapshot + correlation
|
|
7
|
+
* 3. Session creation and persistence
|
|
8
|
+
*
|
|
9
|
+
* Phase 1 & 2 implementation (Phase 3-5 later)
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
import { FileSnapshotter } from './core/FileSnapshotter.js';
|
|
13
|
+
import { SessionCorrelator } from './core/SessionCorrelator.js';
|
|
14
|
+
import { SessionStore } from './session/SessionStore.js';
|
|
15
|
+
import { DeltaWriter } from './core/DeltaWriter.js';
|
|
16
|
+
import { SyncStateManager } from './core/SyncStateManager.js';
|
|
17
|
+
import { METRICS_CONFIG } from './config.js';
|
|
18
|
+
import { logger } from '../utils/logger.js';
|
|
19
|
+
import { watch } from 'fs';
|
|
20
|
+
export class MetricsOrchestrator {
|
|
21
|
+
sessionId;
|
|
22
|
+
agentName;
|
|
23
|
+
provider;
|
|
24
|
+
workingDirectory;
|
|
25
|
+
metricsAdapter;
|
|
26
|
+
snapshotter;
|
|
27
|
+
correlator;
|
|
28
|
+
store;
|
|
29
|
+
// Delta-based components
|
|
30
|
+
deltaWriter = null;
|
|
31
|
+
syncStateManager = null;
|
|
32
|
+
fileWatcher = null;
|
|
33
|
+
beforeSnapshot = null;
|
|
34
|
+
session = null;
|
|
35
|
+
isCollecting = false;
|
|
36
|
+
constructor(options) {
|
|
37
|
+
this.sessionId = options.sessionId || randomUUID();
|
|
38
|
+
this.agentName = options.agentName;
|
|
39
|
+
this.provider = options.provider;
|
|
40
|
+
this.workingDirectory = options.workingDirectory;
|
|
41
|
+
this.metricsAdapter = options.metricsAdapter;
|
|
42
|
+
this.snapshotter = new FileSnapshotter();
|
|
43
|
+
this.correlator = new SessionCorrelator();
|
|
44
|
+
this.store = new SessionStore();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if metrics collection is enabled for this provider
|
|
48
|
+
*/
|
|
49
|
+
isEnabled() {
|
|
50
|
+
return METRICS_CONFIG.enabled(this.provider);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Step 1: Take snapshot before agent spawn
|
|
54
|
+
* Called before spawning the agent process
|
|
55
|
+
*/
|
|
56
|
+
async beforeAgentSpawn() {
|
|
57
|
+
if (!this.isEnabled()) {
|
|
58
|
+
logger.debug('[MetricsOrchestrator] Metrics disabled for provider:', this.provider);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
logger.debug('[MetricsOrchestrator] Taking pre-spawn snapshot...');
|
|
63
|
+
// Get agent data paths
|
|
64
|
+
const { sessionsDir } = this.metricsAdapter.getDataPaths();
|
|
65
|
+
// Take snapshot
|
|
66
|
+
this.beforeSnapshot = await this.snapshotter.snapshot(sessionsDir);
|
|
67
|
+
logger.debug(`[MetricsOrchestrator] Pre-spawn snapshot: ${this.beforeSnapshot.files.length} files`);
|
|
68
|
+
// Create session record
|
|
69
|
+
this.session = {
|
|
70
|
+
sessionId: this.sessionId,
|
|
71
|
+
agentName: this.agentName,
|
|
72
|
+
provider: this.provider,
|
|
73
|
+
startTime: Date.now(),
|
|
74
|
+
workingDirectory: this.workingDirectory,
|
|
75
|
+
status: 'active',
|
|
76
|
+
correlation: {
|
|
77
|
+
status: 'pending',
|
|
78
|
+
retryCount: 0
|
|
79
|
+
},
|
|
80
|
+
monitoring: {
|
|
81
|
+
isActive: false,
|
|
82
|
+
changeCount: 0
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
// Save initial session
|
|
86
|
+
await this.store.saveSession(this.session);
|
|
87
|
+
logger.debug(`[MetricsOrchestrator] Session created: ${this.sessionId}`);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
logger.error('[MetricsOrchestrator] Failed to take pre-spawn snapshot:', error);
|
|
91
|
+
// Don't throw - metrics failures shouldn't break agent execution
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Step 2: Take snapshot after agent spawn + correlate
|
|
96
|
+
* Called after spawning the agent process
|
|
97
|
+
*/
|
|
98
|
+
async afterAgentSpawn() {
|
|
99
|
+
if (!this.isEnabled() || !this.beforeSnapshot || !this.session) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
logger.debug('[MetricsOrchestrator] Waiting for agent initialization...');
|
|
104
|
+
// Wait for agent to initialize and create session file
|
|
105
|
+
const initDelay = this.metricsAdapter.getInitDelay();
|
|
106
|
+
await this.sleep(initDelay);
|
|
107
|
+
logger.debug('[MetricsOrchestrator] Taking post-spawn snapshot...');
|
|
108
|
+
// Get agent data paths
|
|
109
|
+
const { sessionsDir } = this.metricsAdapter.getDataPaths();
|
|
110
|
+
// Take snapshot
|
|
111
|
+
const afterSnapshot = await this.snapshotter.snapshot(sessionsDir);
|
|
112
|
+
logger.debug(`[MetricsOrchestrator] Post-spawn snapshot: ${afterSnapshot.files.length} files`);
|
|
113
|
+
// Compute diff
|
|
114
|
+
const newFiles = this.snapshotter.diff(this.beforeSnapshot, afterSnapshot);
|
|
115
|
+
logger.debug(`[MetricsOrchestrator] Detected ${newFiles.length} new file(s)`);
|
|
116
|
+
// Correlate with retry
|
|
117
|
+
logger.debug('[MetricsOrchestrator] Starting correlation with retry...');
|
|
118
|
+
const correlation = await this.correlator.correlateWithRetry({
|
|
119
|
+
sessionId: this.sessionId,
|
|
120
|
+
agentName: this.agentName,
|
|
121
|
+
workingDirectory: this.workingDirectory,
|
|
122
|
+
newFiles,
|
|
123
|
+
agentPlugin: this.metricsAdapter
|
|
124
|
+
}, async () => {
|
|
125
|
+
// Snapshot function for retries
|
|
126
|
+
const retrySnapshot = await this.snapshotter.snapshot(sessionsDir);
|
|
127
|
+
return this.snapshotter.diff(this.beforeSnapshot, retrySnapshot);
|
|
128
|
+
});
|
|
129
|
+
// Update session with correlation result
|
|
130
|
+
await this.store.updateSessionCorrelation(this.sessionId, correlation);
|
|
131
|
+
// Reload session to get updated correlation
|
|
132
|
+
this.session = await this.store.loadSession(this.sessionId);
|
|
133
|
+
if (correlation.status === 'matched') {
|
|
134
|
+
logger.debug(`[MetricsOrchestrator] Session correlated: ${correlation.agentSessionId}`);
|
|
135
|
+
logger.debug(`[MetricsOrchestrator] Agent file: ${correlation.agentSessionFile}`);
|
|
136
|
+
logger.debug(`[MetricsOrchestrator] Retry count: ${correlation.retryCount}`);
|
|
137
|
+
// Start incremental delta monitoring
|
|
138
|
+
await this.startIncrementalMonitoring(correlation.agentSessionFile);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
logger.warn(`[MetricsOrchestrator] Correlation failed after ${correlation.retryCount} retries`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
logger.error('[MetricsOrchestrator] Failed in post-spawn phase:', error);
|
|
146
|
+
// Don't throw - metrics failures shouldn't break agent execution
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Finalize session on agent exit
|
|
151
|
+
* Called when agent process exits
|
|
152
|
+
*/
|
|
153
|
+
async onAgentExit(exitCode) {
|
|
154
|
+
if (!this.isEnabled() || !this.session) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
logger.debug('[MetricsOrchestrator] Finalizing session...');
|
|
159
|
+
// Stop file watcher
|
|
160
|
+
if (this.fileWatcher) {
|
|
161
|
+
this.fileWatcher.close();
|
|
162
|
+
this.fileWatcher = null;
|
|
163
|
+
logger.debug('[MetricsOrchestrator] Stopped file watcher');
|
|
164
|
+
}
|
|
165
|
+
// Collect final deltas
|
|
166
|
+
if (this.session.correlation.status === 'matched' &&
|
|
167
|
+
this.session.correlation.agentSessionFile) {
|
|
168
|
+
await this.collectDeltas(this.session.correlation.agentSessionFile);
|
|
169
|
+
logger.debug('[MetricsOrchestrator] Collected final deltas');
|
|
170
|
+
}
|
|
171
|
+
// Update sync state status with end time
|
|
172
|
+
const endTime = Date.now();
|
|
173
|
+
const status = exitCode === 0 ? 'completed' : 'failed';
|
|
174
|
+
if (this.syncStateManager) {
|
|
175
|
+
await this.syncStateManager.updateStatus(status, endTime);
|
|
176
|
+
}
|
|
177
|
+
// Update session status
|
|
178
|
+
await this.store.updateSessionStatus(this.sessionId, status);
|
|
179
|
+
logger.debug('[MetricsOrchestrator] Session finalized');
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
logger.error('[MetricsOrchestrator] Failed to finalize session:', error);
|
|
183
|
+
// Don't throw - metrics failures shouldn't break agent execution
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Start incremental monitoring with delta collection
|
|
188
|
+
*/
|
|
189
|
+
async startIncrementalMonitoring(sessionFilePath) {
|
|
190
|
+
if (!this.session || !this.session.correlation.agentSessionId) {
|
|
191
|
+
logger.warn('[MetricsOrchestrator] Cannot start monitoring without correlated session');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
// Initialize delta writer and sync state manager
|
|
196
|
+
this.deltaWriter = new DeltaWriter(this.sessionId);
|
|
197
|
+
this.syncStateManager = new SyncStateManager(this.sessionId);
|
|
198
|
+
// Initialize sync state with session start time
|
|
199
|
+
await this.syncStateManager.initialize(this.sessionId, this.session.correlation.agentSessionId, this.session.startTime);
|
|
200
|
+
logger.debug('[MetricsOrchestrator] Initialized delta-based metrics tracking');
|
|
201
|
+
// Collect initial deltas
|
|
202
|
+
await this.collectDeltas(sessionFilePath);
|
|
203
|
+
// Start file watching
|
|
204
|
+
let debounceTimer = null;
|
|
205
|
+
const DEBOUNCE_DELAY = 5000; // 5 seconds
|
|
206
|
+
this.fileWatcher = watch(sessionFilePath, (eventType) => {
|
|
207
|
+
if (eventType === 'change') {
|
|
208
|
+
// Debounce: wait 5s after last change before collecting
|
|
209
|
+
if (debounceTimer) {
|
|
210
|
+
clearTimeout(debounceTimer);
|
|
211
|
+
}
|
|
212
|
+
debounceTimer = setTimeout(async () => {
|
|
213
|
+
await this.collectDeltas(sessionFilePath);
|
|
214
|
+
}, DEBOUNCE_DELAY);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
logger.debug('[MetricsOrchestrator] Started file watching for incremental metrics');
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
logger.error('[MetricsOrchestrator] Failed to start incremental monitoring:', error);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Collect delta metrics from agent session file
|
|
225
|
+
*/
|
|
226
|
+
async collectDeltas(sessionFilePath) {
|
|
227
|
+
// Prevent concurrent collection
|
|
228
|
+
if (this.isCollecting || !this.deltaWriter || !this.syncStateManager) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
this.isCollecting = true;
|
|
232
|
+
try {
|
|
233
|
+
// Load current sync state
|
|
234
|
+
const syncState = await this.syncStateManager.load();
|
|
235
|
+
// If sync state doesn't exist (file deleted or not initialized yet), skip collection
|
|
236
|
+
if (!syncState) {
|
|
237
|
+
logger.debug('[MetricsOrchestrator] Sync state not available, skipping delta collection');
|
|
238
|
+
this.isCollecting = false;
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
// Get already-processed record IDs from sync state
|
|
242
|
+
const processedRecordIds = new Set(syncState.processedRecordIds);
|
|
243
|
+
// Get already-attached user prompt texts from sync state
|
|
244
|
+
const attachedUserPromptTexts = new Set(syncState.attachedUserPromptTexts || []);
|
|
245
|
+
// Parse incremental metrics with processed record IDs and attached prompts
|
|
246
|
+
const { deltas, lastLine, newlyAttachedPrompts } = await this.metricsAdapter.parseIncrementalMetrics(sessionFilePath, processedRecordIds, attachedUserPromptTexts);
|
|
247
|
+
if (deltas.length === 0) {
|
|
248
|
+
logger.debug('[MetricsOrchestrator] No new deltas to collect');
|
|
249
|
+
this.isCollecting = false;
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
logger.debug(`[MetricsOrchestrator] Collected ${deltas.length} new delta(s)`);
|
|
253
|
+
// Collect record IDs for tracking
|
|
254
|
+
const newRecordIds = [];
|
|
255
|
+
// Append each delta to JSONL
|
|
256
|
+
for (const delta of deltas) {
|
|
257
|
+
// Set CodeMie session ID
|
|
258
|
+
delta.sessionId = this.sessionId;
|
|
259
|
+
// Append to JSONL
|
|
260
|
+
await this.deltaWriter.appendDelta(delta);
|
|
261
|
+
newRecordIds.push(delta.recordId);
|
|
262
|
+
}
|
|
263
|
+
// Update sync state with processed record IDs
|
|
264
|
+
await this.syncStateManager.addProcessedRecords(newRecordIds);
|
|
265
|
+
await this.syncStateManager.updateLastProcessed(lastLine, Date.now());
|
|
266
|
+
await this.syncStateManager.incrementDeltas(deltas.length);
|
|
267
|
+
// Update sync state with newly attached user prompts
|
|
268
|
+
if (newlyAttachedPrompts && newlyAttachedPrompts.length > 0) {
|
|
269
|
+
await this.syncStateManager.addAttachedUserPrompts(newlyAttachedPrompts);
|
|
270
|
+
}
|
|
271
|
+
logger.debug(`[MetricsOrchestrator] Processed up to line ${lastLine}`);
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
logger.error('[MetricsOrchestrator] Failed to collect deltas:', error);
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
this.isCollecting = false;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Sleep utility
|
|
282
|
+
*/
|
|
283
|
+
sleep(ms) {
|
|
284
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=MetricsOrchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricsOrchestrator.js","sourceRoot":"","sources":["../../src/metrics/MetricsOrchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Collection Configuration
|
|
3
|
+
*
|
|
4
|
+
* Centralized configuration for the metrics collection system.
|
|
5
|
+
*/
|
|
6
|
+
import type { MetricsConfig } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Default metrics configuration
|
|
9
|
+
*/
|
|
10
|
+
export declare const METRICS_CONFIG: MetricsConfig;
|
|
11
|
+
/**
|
|
12
|
+
* Storage paths
|
|
13
|
+
*/
|
|
14
|
+
export declare const METRICS_PATHS: {
|
|
15
|
+
root: string;
|
|
16
|
+
sessions: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Get full path for metrics storage
|
|
20
|
+
*/
|
|
21
|
+
export declare function getMetricsPath(subpath?: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Get session metadata file path
|
|
24
|
+
* Format: ~/.codemie/metrics/sessions/{sessionId}.json
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSessionPath(sessionId: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Get session metrics JSONL file path
|
|
29
|
+
* Format: ~/.codemie/metrics/sessions/{sessionId}_metrics.jsonl
|
|
30
|
+
*/
|
|
31
|
+
export declare function getSessionMetricsPath(sessionId: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Get sync state file path (embedded in session metadata)
|
|
34
|
+
* This is a legacy function - sync state is now stored in session.json
|
|
35
|
+
* @deprecated Use session.json for sync state
|
|
36
|
+
*/
|
|
37
|
+
export declare function getSyncStatePath(sessionId: string): string;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/metrics/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,aAqC5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;CAGzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Collection Configuration
|
|
3
|
+
*
|
|
4
|
+
* Centralized configuration for the metrics collection system.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default metrics configuration
|
|
8
|
+
*/
|
|
9
|
+
export const METRICS_CONFIG = {
|
|
10
|
+
/**
|
|
11
|
+
* Metrics only enabled for ai-run-sso provider
|
|
12
|
+
*/
|
|
13
|
+
enabled: (provider) => provider === 'ai-run-sso',
|
|
14
|
+
/**
|
|
15
|
+
* Agent-specific initialization delays (ms)
|
|
16
|
+
* Time to wait after agent spawn before taking post-snapshot
|
|
17
|
+
*/
|
|
18
|
+
initDelay: {
|
|
19
|
+
claude: 500
|
|
20
|
+
// Future: gemini, codex, etc.
|
|
21
|
+
},
|
|
22
|
+
/**
|
|
23
|
+
* Retry configuration for correlation
|
|
24
|
+
*/
|
|
25
|
+
retry: {
|
|
26
|
+
attempts: 5,
|
|
27
|
+
delays: [500, 1000, 2000, 4000, 8000] // Exponential backoff
|
|
28
|
+
},
|
|
29
|
+
/**
|
|
30
|
+
* File monitoring configuration
|
|
31
|
+
*/
|
|
32
|
+
monitoring: {
|
|
33
|
+
pollInterval: 5000, // 5s fallback polling
|
|
34
|
+
debounceDelay: 5000 // 5s debounce before collection
|
|
35
|
+
},
|
|
36
|
+
/**
|
|
37
|
+
* Watermark configuration
|
|
38
|
+
*/
|
|
39
|
+
watermark: {
|
|
40
|
+
ttl: 24 * 60 * 60 * 1000 // 24 hours
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Storage paths
|
|
45
|
+
*/
|
|
46
|
+
export const METRICS_PATHS = {
|
|
47
|
+
root: '.codemie/metrics',
|
|
48
|
+
sessions: 'sessions'
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Get full path for metrics storage
|
|
52
|
+
*/
|
|
53
|
+
export function getMetricsPath(subpath) {
|
|
54
|
+
const homedir = process.env.HOME || process.env.USERPROFILE || '~';
|
|
55
|
+
const base = `${homedir}/${METRICS_PATHS.root}`;
|
|
56
|
+
return subpath ? `${base}/${subpath}` : base;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get session metadata file path
|
|
60
|
+
* Format: ~/.codemie/metrics/sessions/{sessionId}.json
|
|
61
|
+
*/
|
|
62
|
+
export function getSessionPath(sessionId) {
|
|
63
|
+
return getMetricsPath(`${METRICS_PATHS.sessions}/${sessionId}.json`);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get session metrics JSONL file path
|
|
67
|
+
* Format: ~/.codemie/metrics/sessions/{sessionId}_metrics.jsonl
|
|
68
|
+
*/
|
|
69
|
+
export function getSessionMetricsPath(sessionId) {
|
|
70
|
+
return getMetricsPath(`${METRICS_PATHS.sessions}/${sessionId}_metrics.jsonl`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get sync state file path (embedded in session metadata)
|
|
74
|
+
* This is a legacy function - sync state is now stored in session.json
|
|
75
|
+
* @deprecated Use session.json for sync state
|
|
76
|
+
*/
|
|
77
|
+
export function getSyncStatePath(sessionId) {
|
|
78
|
+
return getMetricsPath(`${METRICS_PATHS.sessions}/${sessionId}.json`);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/metrics/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,QAAQ,KAAK,YAAY;IAExD;;;OAGG;IACH,SAAS,EAAE;QACT,MAAM,EAAE,GAAG;QACX,8BAA8B;KAC/B;IAED;;OAEG;IACH,KAAK,EAAE;QACL,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,sBAAsB;KAC7D;IAED;;OAEG;IACH,UAAU,EAAE;QACV,YAAY,EAAE,IAAI,EAAE,sBAAsB;QAC1C,aAAa,EAAE,IAAI,CAAC,gCAAgC;KACrD;IAED;;OAEG;IACH,SAAS,EAAE;QACT,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW;KACrC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC;IACnE,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,cAAc,CAAC,GAAG,aAAa,CAAC,QAAQ,IAAI,SAAS,OAAO,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,cAAc,CAAC,GAAG,aAAa,CAAC,QAAQ,IAAI,SAAS,gBAAgB,CAAC,CAAC;AAChF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,cAAc,CAAC,GAAG,aAAa,CAAC,QAAQ,IAAI,SAAS,OAAO,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delta Writer
|
|
3
|
+
*
|
|
4
|
+
* Handles incremental metrics storage in JSONL format.
|
|
5
|
+
* Stores metrics in: ~/.codemie/metrics/sessions/{sessionId}_metrics.jsonl
|
|
6
|
+
* Provides O(1) append operations and efficient filtering by sync status.
|
|
7
|
+
*/
|
|
8
|
+
import type { MetricDelta, SyncStatus } from '../types.js';
|
|
9
|
+
export declare class DeltaWriter {
|
|
10
|
+
private readonly filePath;
|
|
11
|
+
constructor(sessionId: string);
|
|
12
|
+
/**
|
|
13
|
+
* Append new delta to JSONL file (O(1) operation)
|
|
14
|
+
* Returns the recordId from the delta
|
|
15
|
+
*/
|
|
16
|
+
appendDelta(delta: Omit<MetricDelta, 'syncStatus' | 'syncAttempts'>): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Read all deltas from JSONL file
|
|
19
|
+
*/
|
|
20
|
+
readAll(): Promise<MetricDelta[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Update sync status for specific records
|
|
23
|
+
* This requires rewriting the entire file
|
|
24
|
+
*/
|
|
25
|
+
updateSyncStatus(recordIds: string[], status: SyncStatus, error?: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Get deltas with specific sync status
|
|
28
|
+
*/
|
|
29
|
+
filterByStatus(status: SyncStatus): Promise<MetricDelta[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get sync statistics
|
|
32
|
+
*/
|
|
33
|
+
getSyncStats(): Promise<{
|
|
34
|
+
total: number;
|
|
35
|
+
pending: number;
|
|
36
|
+
syncing: number;
|
|
37
|
+
synced: number;
|
|
38
|
+
failed: number;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Get file path
|
|
42
|
+
*/
|
|
43
|
+
getFilePath(): string;
|
|
44
|
+
/**
|
|
45
|
+
* Check if file exists
|
|
46
|
+
*/
|
|
47
|
+
exists(): boolean;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=DeltaWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeltaWriter.d.ts","sourceRoot":"","sources":["../../../src/metrics/core/DeltaWriter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI3D,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,SAAS,EAAE,MAAM;IAI7B;;;OAGG;IACG,WAAW,CACf,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,cAAc,CAAC,GACtD,OAAO,CAAC,MAAM,CAAC;IA4BlB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAiBvC;;;OAGG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,UAAU,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAmChB;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAWhE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAwBF;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,MAAM,IAAI,OAAO;CAGlB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delta Writer
|
|
3
|
+
*
|
|
4
|
+
* Handles incremental metrics storage in JSONL format.
|
|
5
|
+
* Stores metrics in: ~/.codemie/metrics/sessions/{sessionId}_metrics.jsonl
|
|
6
|
+
* Provides O(1) append operations and efficient filtering by sync status.
|
|
7
|
+
*/
|
|
8
|
+
import { appendFile, readFile, writeFile, mkdir } from 'fs/promises';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { dirname } from 'path';
|
|
11
|
+
import { logger } from '../../utils/logger.js';
|
|
12
|
+
import { getSessionMetricsPath } from '../config.js';
|
|
13
|
+
export class DeltaWriter {
|
|
14
|
+
filePath;
|
|
15
|
+
constructor(sessionId) {
|
|
16
|
+
this.filePath = getSessionMetricsPath(sessionId);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Append new delta to JSONL file (O(1) operation)
|
|
20
|
+
* Returns the recordId from the delta
|
|
21
|
+
*/
|
|
22
|
+
async appendDelta(delta) {
|
|
23
|
+
try {
|
|
24
|
+
// Ensure directory exists
|
|
25
|
+
const dir = dirname(this.filePath);
|
|
26
|
+
if (!existsSync(dir)) {
|
|
27
|
+
await mkdir(dir, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
// Create full delta record (recordId already set from message UUID)
|
|
30
|
+
const fullDelta = {
|
|
31
|
+
...delta,
|
|
32
|
+
syncStatus: 'pending',
|
|
33
|
+
syncAttempts: 0
|
|
34
|
+
};
|
|
35
|
+
// Append to JSONL
|
|
36
|
+
const line = JSON.stringify(fullDelta) + '\n';
|
|
37
|
+
await appendFile(this.filePath, line, 'utf-8');
|
|
38
|
+
logger.debug(`[DeltaWriter] Appended delta: ${delta.recordId}`);
|
|
39
|
+
return delta.recordId;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger.error('[DeltaWriter] Failed to append delta:', error);
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Read all deltas from JSONL file
|
|
48
|
+
*/
|
|
49
|
+
async readAll() {
|
|
50
|
+
try {
|
|
51
|
+
if (!existsSync(this.filePath)) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const content = await readFile(this.filePath, 'utf-8');
|
|
55
|
+
const lines = content.trim().split('\n').filter(line => line.length > 0);
|
|
56
|
+
return lines.map(line => JSON.parse(line));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.error('[DeltaWriter] Failed to read deltas:', error);
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Update sync status for specific records
|
|
65
|
+
* This requires rewriting the entire file
|
|
66
|
+
*/
|
|
67
|
+
async updateSyncStatus(recordIds, status, error) {
|
|
68
|
+
try {
|
|
69
|
+
// Read all deltas
|
|
70
|
+
const deltas = await this.readAll();
|
|
71
|
+
// Update matching records
|
|
72
|
+
const recordIdSet = new Set(recordIds);
|
|
73
|
+
const updatedDeltas = deltas.map(delta => {
|
|
74
|
+
if (recordIdSet.has(delta.recordId)) {
|
|
75
|
+
return {
|
|
76
|
+
...delta,
|
|
77
|
+
syncStatus: status,
|
|
78
|
+
syncedAt: status === 'synced' ? Date.now() : delta.syncedAt,
|
|
79
|
+
syncAttempts: delta.syncAttempts + 1,
|
|
80
|
+
syncError: error
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return delta;
|
|
84
|
+
});
|
|
85
|
+
// Rewrite file
|
|
86
|
+
const content = updatedDeltas
|
|
87
|
+
.map(delta => JSON.stringify(delta))
|
|
88
|
+
.join('\n') + '\n';
|
|
89
|
+
await writeFile(this.filePath, content, 'utf-8');
|
|
90
|
+
logger.debug(`[DeltaWriter] Updated sync status for ${recordIds.length} records to: ${status}`);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
logger.error('[DeltaWriter] Failed to update sync status:', error);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get deltas with specific sync status
|
|
99
|
+
*/
|
|
100
|
+
async filterByStatus(status) {
|
|
101
|
+
try {
|
|
102
|
+
const allDeltas = await this.readAll();
|
|
103
|
+
return allDeltas.filter(delta => delta.syncStatus === status);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
logger.error(`[DeltaWriter] Failed to filter by status ${status}:`, error);
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get sync statistics
|
|
112
|
+
*/
|
|
113
|
+
async getSyncStats() {
|
|
114
|
+
try {
|
|
115
|
+
const deltas = await this.readAll();
|
|
116
|
+
const stats = {
|
|
117
|
+
total: deltas.length,
|
|
118
|
+
pending: 0,
|
|
119
|
+
syncing: 0,
|
|
120
|
+
synced: 0,
|
|
121
|
+
failed: 0
|
|
122
|
+
};
|
|
123
|
+
for (const delta of deltas) {
|
|
124
|
+
stats[delta.syncStatus]++;
|
|
125
|
+
}
|
|
126
|
+
return stats;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.error('[DeltaWriter] Failed to get sync stats:', error);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get file path
|
|
135
|
+
*/
|
|
136
|
+
getFilePath() {
|
|
137
|
+
return this.filePath;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Check if file exists
|
|
141
|
+
*/
|
|
142
|
+
exists() {
|
|
143
|
+
return existsSync(this.filePath);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=DeltaWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeltaWriter.js","sourceRoot":"","sources":["../../../src/metrics/core/DeltaWriter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,OAAO,WAAW;IACL,QAAQ,CAAS;IAElC,YAAY,SAAiB;QAC3B,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,KAAuD;QAEvD,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;YAED,oEAAoE;YACpE,MAAM,SAAS,GAAgB;gBAC7B,GAAG,KAAK;gBACR,UAAU,EAAE,SAAS;gBACrB,YAAY,EAAE,CAAC;aAChB,CAAC;YAEF,kBAAkB;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YAC9C,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAE/C,MAAM,CAAC,KAAK,CAAC,iCAAiC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChE,OAAO,KAAK,CAAC,QAAQ,CAAC;QAExB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC7D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEzE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC,CAAC;QAE5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CACpB,SAAmB,EACnB,MAAkB,EAClB,KAAc;QAEd,IAAI,CAAC;YACH,kBAAkB;YAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAEpC,0BAA0B;YAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBACvC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpC,OAAO;wBACL,GAAG,KAAK;wBACR,UAAU,EAAE,MAAM;wBAClB,QAAQ,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;wBAC3D,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC;wBACpC,SAAS,EAAE,KAAK;qBACjB,CAAC;gBACJ,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,eAAe;YACf,MAAM,OAAO,GAAG,aAAa;iBAC1B,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;iBACnC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAErB,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAEjD,MAAM,CAAC,KAAK,CAAC,yCAAyC,SAAS,CAAC,MAAM,gBAAgB,MAAM,EAAE,CAAC,CAAC;QAElG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,MAAkB;QACrC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC;QAEhE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,4CAA4C,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAOhB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAEpC,MAAM,KAAK,GAAG;gBACZ,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,CAAC;aACV,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,CAAC;YAED,OAAO,KAAK,CAAC;QAEf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Snapshotter
|
|
3
|
+
*
|
|
4
|
+
* Takes snapshots of directory state and computes diffs.
|
|
5
|
+
* Used to detect new files created by agent processes.
|
|
6
|
+
*/
|
|
7
|
+
import type { FileSnapshot, FileInfo } from '../types.js';
|
|
8
|
+
export declare class FileSnapshotter {
|
|
9
|
+
/**
|
|
10
|
+
* Take snapshot of directory
|
|
11
|
+
*/
|
|
12
|
+
snapshot(dirPath: string): Promise<FileSnapshot>;
|
|
13
|
+
/**
|
|
14
|
+
* Compute diff between snapshots (new files only)
|
|
15
|
+
*/
|
|
16
|
+
diff(before: FileSnapshot, after: FileSnapshot): FileInfo[];
|
|
17
|
+
/**
|
|
18
|
+
* Scan directory recursively and collect file information
|
|
19
|
+
*/
|
|
20
|
+
private scanDirectory;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=FileSnapshotter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSnapshotter.d.ts","sourceRoot":"","sources":["../../../src/metrics/core/FileSnapshotter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG1D,qBAAa,eAAe;IAC1B;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAStD;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,QAAQ,EAAE;IAQ3D;;OAEG;YACW,aAAa;CAyC5B"}
|