@ironbee-ai/cli 0.6.2 → 0.7.0
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/CHANGELOG.md +6 -0
- package/README.md +167 -39
- package/dist/analysis/code-changes.js.map +1 -1
- package/dist/analysis/cross-session.js.map +1 -1
- package/dist/analysis/fix-effectiveness.js.map +1 -1
- package/dist/analysis/time-analysis.js.map +1 -1
- package/dist/analysis/verdict-details.js.map +1 -1
- package/dist/analysis/verification-quality.js.map +1 -1
- package/dist/analytics/classifier.d.ts +99 -0
- package/dist/analytics/classifier.d.ts.map +1 -0
- package/dist/analytics/classifier.js +380 -0
- package/dist/analytics/classifier.js.map +1 -0
- package/dist/analytics/emit.d.ts +67 -0
- package/dist/analytics/emit.d.ts.map +1 -0
- package/dist/analytics/emit.js +901 -0
- package/dist/analytics/emit.js.map +1 -0
- package/dist/analytics/errors.d.ts +33 -0
- package/dist/analytics/errors.d.ts.map +1 -0
- package/dist/analytics/errors.js +93 -0
- package/dist/analytics/errors.js.map +1 -0
- package/dist/analytics/hook-trigger.d.ts +39 -0
- package/dist/analytics/hook-trigger.d.ts.map +1 -0
- package/dist/analytics/hook-trigger.js +127 -0
- package/dist/analytics/hook-trigger.js.map +1 -0
- package/dist/analytics/log.d.ts +44 -0
- package/dist/analytics/log.d.ts.map +1 -0
- package/dist/analytics/log.js +158 -0
- package/dist/analytics/log.js.map +1 -0
- package/dist/analytics/merge.d.ts +40 -0
- package/dist/analytics/merge.d.ts.map +1 -0
- package/dist/analytics/merge.js +527 -0
- package/dist/analytics/merge.js.map +1 -0
- package/dist/analytics/pricing.d.ts +149 -0
- package/dist/analytics/pricing.d.ts.map +1 -0
- package/dist/analytics/pricing.js +179 -0
- package/dist/analytics/pricing.js.map +1 -0
- package/dist/analytics/projection.d.ts +356 -0
- package/dist/analytics/projection.d.ts.map +1 -0
- package/dist/analytics/projection.js +2281 -0
- package/dist/analytics/projection.js.map +1 -0
- package/dist/analytics/spawn.d.ts +28 -0
- package/dist/analytics/spawn.d.ts.map +1 -0
- package/dist/analytics/spawn.js +57 -0
- package/dist/analytics/spawn.js.map +1 -0
- package/dist/analytics/state.d.ts +58 -0
- package/dist/analytics/state.d.ts.map +1 -0
- package/dist/analytics/state.js +329 -0
- package/dist/analytics/state.js.map +1 -0
- package/dist/analytics/transcript.d.ts +150 -0
- package/dist/analytics/transcript.d.ts.map +1 -0
- package/dist/analytics/transcript.js +276 -0
- package/dist/analytics/transcript.js.map +1 -0
- package/dist/analytics/types.d.ts +875 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +31 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/clients/base.d.ts +21 -2
- package/dist/clients/base.d.ts.map +1 -1
- package/dist/clients/claude/commands/ironbee-verify.md +15 -7
- package/dist/clients/claude/fragments/command-verify.node.md +33 -0
- package/dist/clients/claude/fragments/rule.node.md +29 -0
- package/dist/clients/claude/fragments/skill.node.md +77 -0
- package/dist/clients/claude/hooks/activity-end.d.ts +13 -0
- package/dist/clients/claude/hooks/activity-end.d.ts.map +1 -0
- package/dist/clients/claude/hooks/activity-end.js +42 -0
- package/dist/clients/claude/hooks/activity-end.js.map +1 -0
- package/dist/clients/claude/hooks/require-verdict.d.ts +3 -2
- package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
- package/dist/clients/claude/hooks/require-verdict.js +6 -5
- package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verification.d.ts +7 -4
- package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/claude/hooks/require-verification.js +44 -22
- package/dist/clients/claude/hooks/require-verification.js.map +1 -1
- package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-end.js +17 -2
- package/dist/clients/claude/hooks/session-end.js.map +1 -1
- package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-start.js +2 -1
- package/dist/clients/claude/hooks/session-start.js.map +1 -1
- package/dist/clients/claude/hooks/track-action-monitor.d.ts +27 -0
- package/dist/clients/claude/hooks/track-action-monitor.d.ts.map +1 -0
- package/dist/clients/claude/hooks/track-action-monitor.js +126 -0
- package/dist/clients/claude/hooks/track-action-monitor.js.map +1 -0
- package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
- package/dist/clients/claude/hooks/track-action.js +29 -20
- package/dist/clients/claude/hooks/track-action.js.map +1 -1
- package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/claude/hooks/verify-gate.js +18 -1
- package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
- package/dist/clients/claude/index.d.ts +4 -1
- package/dist/clients/claude/index.d.ts.map +1 -1
- package/dist/clients/claude/index.js +171 -94
- package/dist/clients/claude/index.js.map +1 -1
- package/dist/clients/claude/rules/ironbee-verification.md +41 -33
- package/dist/clients/claude/skills/ironbee-verification.md +93 -76
- package/dist/clients/cursor/commands/ironbee-verify/SKILL.md +18 -10
- package/dist/clients/cursor/fragments/command-verify.node.md +33 -0
- package/dist/clients/cursor/fragments/rule.node.md +29 -0
- package/dist/clients/cursor/fragments/skill.node.md +77 -0
- package/dist/clients/cursor/hooks/activity-end.d.ts +14 -0
- package/dist/clients/cursor/hooks/activity-end.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/activity-end.js +45 -0
- package/dist/clients/cursor/hooks/activity-end.js.map +1 -0
- package/dist/clients/cursor/hooks/require-verdict.d.ts +1 -1
- package/dist/clients/cursor/hooks/require-verdict.js +4 -4
- package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.js +42 -16
- package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
- package/dist/clients/cursor/hooks/session-end.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/session-end.js +18 -2
- package/dist/clients/cursor/hooks/session-end.js.map +1 -1
- package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/session-start.js +2 -1
- package/dist/clients/cursor/hooks/session-start.js.map +1 -1
- package/dist/clients/cursor/hooks/track-action-monitor.d.ts +27 -0
- package/dist/clients/cursor/hooks/track-action-monitor.d.ts.map +1 -0
- package/dist/clients/cursor/hooks/track-action-monitor.js +133 -0
- package/dist/clients/cursor/hooks/track-action-monitor.js.map +1 -0
- package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/track-action.js +51 -23
- package/dist/clients/cursor/hooks/track-action.js.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.js +14 -1
- package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
- package/dist/clients/cursor/index.d.ts +4 -1
- package/dist/clients/cursor/index.d.ts.map +1 -1
- package/dist/clients/cursor/index.js +117 -71
- package/dist/clients/cursor/index.js.map +1 -1
- package/dist/clients/cursor/rules/ironbee-verification.mdc +37 -29
- package/dist/clients/cursor/skills/ironbee-verification.md +93 -76
- package/dist/clients/registry.d.ts +14 -0
- package/dist/clients/registry.d.ts.map +1 -1
- package/dist/clients/registry.js +34 -0
- package/dist/clients/registry.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +40 -0
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/backend-toggle.d.ts +45 -0
- package/dist/commands/backend-toggle.d.ts.map +1 -0
- package/dist/commands/backend-toggle.js +192 -0
- package/dist/commands/backend-toggle.js.map +1 -0
- package/dist/commands/disable-backend.d.ts +14 -0
- package/dist/commands/disable-backend.d.ts.map +1 -0
- package/dist/commands/disable-backend.js +34 -0
- package/dist/commands/disable-backend.js.map +1 -0
- package/dist/commands/disable-verification.d.ts +16 -0
- package/dist/commands/disable-verification.d.ts.map +1 -0
- package/dist/commands/disable-verification.js +36 -0
- package/dist/commands/disable-verification.js.map +1 -0
- package/dist/commands/enable-backend.d.ts +15 -0
- package/dist/commands/enable-backend.d.ts.map +1 -0
- package/dist/commands/enable-backend.js +35 -0
- package/dist/commands/enable-backend.js.map +1 -0
- package/dist/commands/enable-verification.d.ts +14 -0
- package/dist/commands/enable-verification.d.ts.map +1 -0
- package/dist/commands/enable-verification.js +34 -0
- package/dist/commands/enable-verification.js.map +1 -0
- package/dist/commands/hook.d.ts.map +1 -1
- package/dist/commands/hook.js +60 -0
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/import.d.ts +39 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +369 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +15 -20
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/process-analytics.d.ts +18 -0
- package/dist/commands/process-analytics.d.ts.map +1 -0
- package/dist/commands/process-analytics.js +57 -0
- package/dist/commands/process-analytics.js.map +1 -0
- package/dist/commands/queue.d.ts +2 -3
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +2 -3
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +29 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verification-toggle.d.ts +47 -0
- package/dist/commands/verification-toggle.d.ts.map +1 -0
- package/dist/commands/verification-toggle.js +113 -0
- package/dist/commands/verification-toggle.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +28 -0
- package/dist/commands/verify.js.map +1 -1
- package/dist/hooks/core/actions.d.ts +64 -67
- package/dist/hooks/core/actions.d.ts.map +1 -1
- package/dist/hooks/core/actions.js +39 -24
- package/dist/hooks/core/actions.js.map +1 -1
- package/dist/hooks/core/activity-end.d.ts +20 -0
- package/dist/hooks/core/activity-end.d.ts.map +1 -0
- package/dist/hooks/core/activity-end.js +23 -0
- package/dist/hooks/core/activity-end.js.map +1 -0
- package/dist/hooks/core/required-tools.d.ts +30 -0
- package/dist/hooks/core/required-tools.d.ts.map +1 -0
- package/dist/hooks/core/required-tools.js +70 -0
- package/dist/hooks/core/required-tools.js.map +1 -0
- package/dist/hooks/core/session-state.d.ts +12 -3
- package/dist/hooks/core/session-state.d.ts.map +1 -1
- package/dist/hooks/core/session-state.js +59 -0
- package/dist/hooks/core/session-state.js.map +1 -1
- package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
- package/dist/hooks/core/submit-verdict.js +16 -12
- package/dist/hooks/core/submit-verdict.js.map +1 -1
- package/dist/hooks/core/verify-gate.d.ts +17 -3
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +312 -116
- package/dist/hooks/core/verify-gate.js.map +1 -1
- package/dist/import/claude/analytics-runner.d.ts +42 -0
- package/dist/import/claude/analytics-runner.d.ts.map +1 -0
- package/dist/import/claude/analytics-runner.js +213 -0
- package/dist/import/claude/analytics-runner.js.map +1 -0
- package/dist/import/claude/discovery.d.ts +22 -0
- package/dist/import/claude/discovery.d.ts.map +1 -0
- package/dist/import/claude/discovery.js +197 -0
- package/dist/import/claude/discovery.js.map +1 -0
- package/dist/import/claude/encoding.d.ts +50 -0
- package/dist/import/claude/encoding.d.ts.map +1 -0
- package/dist/import/claude/encoding.js +110 -0
- package/dist/import/claude/encoding.js.map +1 -0
- package/dist/import/claude/events/file-change.d.ts +28 -0
- package/dist/import/claude/events/file-change.d.ts.map +1 -0
- package/dist/import/claude/events/file-change.js +112 -0
- package/dist/import/claude/events/file-change.js.map +1 -0
- package/dist/import/claude/events/tool-call.d.ts +61 -0
- package/dist/import/claude/events/tool-call.d.ts.map +1 -0
- package/dist/import/claude/events/tool-call.js +119 -0
- package/dist/import/claude/events/tool-call.js.map +1 -0
- package/dist/import/claude/runner.d.ts +31 -0
- package/dist/import/claude/runner.d.ts.map +1 -0
- package/dist/import/claude/runner.js +280 -0
- package/dist/import/claude/runner.js.map +1 -0
- package/dist/import/claude/summary.d.ts +23 -0
- package/dist/import/claude/summary.d.ts.map +1 -0
- package/dist/import/claude/summary.js +186 -0
- package/dist/import/claude/summary.js.map +1 -0
- package/dist/import/claude/transcript-walk.d.ts +52 -0
- package/dist/import/claude/transcript-walk.d.ts.map +1 -0
- package/dist/import/claude/transcript-walk.js +187 -0
- package/dist/import/claude/transcript-walk.js.map +1 -0
- package/dist/import/concurrent-pool.d.ts +45 -0
- package/dist/import/concurrent-pool.d.ts.map +1 -0
- package/dist/import/concurrent-pool.js +95 -0
- package/dist/import/concurrent-pool.js.map +1 -0
- package/dist/import/emitter.d.ts +29 -0
- package/dist/import/emitter.d.ts.map +1 -0
- package/dist/import/emitter.js +66 -0
- package/dist/import/emitter.js.map +1 -0
- package/dist/import/events/activity.d.ts +23 -0
- package/dist/import/events/activity.d.ts.map +1 -0
- package/dist/import/events/activity.js +45 -0
- package/dist/import/events/activity.js.map +1 -0
- package/dist/import/events/session.d.ts +24 -0
- package/dist/import/events/session.d.ts.map +1 -0
- package/dist/import/events/session.js +47 -0
- package/dist/import/events/session.js.map +1 -0
- package/dist/import/filter.d.ts +47 -0
- package/dist/import/filter.d.ts.map +1 -0
- package/dist/import/filter.js +90 -0
- package/dist/import/filter.js.map +1 -0
- package/dist/import/ids.d.ts +56 -0
- package/dist/import/ids.d.ts.map +1 -0
- package/dist/import/ids.js +87 -0
- package/dist/import/ids.js.map +1 -0
- package/dist/import/index.d.ts +29 -0
- package/dist/import/index.d.ts.map +1 -0
- package/dist/import/index.js +52 -0
- package/dist/import/index.js.map +1 -0
- package/dist/import/marker.d.ts +20 -0
- package/dist/import/marker.d.ts.map +1 -0
- package/dist/import/marker.js +71 -0
- package/dist/import/marker.js.map +1 -0
- package/dist/import/pipeline.d.ts +41 -0
- package/dist/import/pipeline.d.ts.map +1 -0
- package/dist/import/pipeline.js +47 -0
- package/dist/import/pipeline.js.map +1 -0
- package/dist/import/progress.d.ts +20 -0
- package/dist/import/progress.d.ts.map +1 -0
- package/dist/import/progress.js +69 -0
- package/dist/import/progress.js.map +1 -0
- package/dist/import/skip.d.ts +13 -0
- package/dist/import/skip.d.ts.map +1 -0
- package/dist/import/skip.js +24 -0
- package/dist/import/skip.js.map +1 -0
- package/dist/import/types.d.ts +125 -0
- package/dist/import/types.d.ts.map +1 -0
- package/dist/import/types.js +28 -0
- package/dist/import/types.js.map +1 -0
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/collector.d.ts +29 -3
- package/dist/lib/collector.d.ts.map +1 -1
- package/dist/lib/collector.js +118 -8
- package/dist/lib/collector.js.map +1 -1
- package/dist/lib/config.d.ts +240 -83
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +482 -89
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/event.d.ts +72 -0
- package/dist/lib/event.d.ts.map +1 -0
- package/dist/lib/event.js +42 -0
- package/dist/lib/event.js.map +1 -0
- package/dist/lib/gitignore.d.ts +21 -0
- package/dist/lib/gitignore.d.ts.map +1 -0
- package/dist/lib/gitignore.js +54 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/runtime-section.d.ts +118 -0
- package/dist/lib/runtime-section.d.ts.map +1 -0
- package/dist/lib/runtime-section.js +256 -0
- package/dist/lib/runtime-section.js.map +1 -0
- package/dist/lib/telemetry.d.ts +1 -1
- package/dist/lib/telemetry.d.ts.map +1 -1
- package/dist/lib/telemetry.js +4 -1
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/queue/dead-letter.d.ts +5 -1
- package/dist/queue/dead-letter.d.ts.map +1 -1
- package/dist/queue/dead-letter.js +5 -1
- package/dist/queue/dead-letter.js.map +1 -1
- package/dist/queue/drain.d.ts +3 -2
- package/dist/queue/drain.d.ts.map +1 -1
- package/dist/queue/drain.js +3 -2
- package/dist/queue/drain.js.map +1 -1
- package/dist/queue/flush.d.ts +28 -12
- package/dist/queue/flush.d.ts.map +1 -1
- package/dist/queue/flush.js +43 -18
- package/dist/queue/flush.js.map +1 -1
- package/dist/queue/handlers/send-event.d.ts.map +1 -1
- package/dist/queue/handlers/send-event.js.map +1 -1
- package/dist/queue/index.d.ts +1 -2
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.js +2 -2
- package/dist/queue/index.js.map +1 -1
- package/dist/queue/paths.d.ts +4 -2
- package/dist/queue/paths.d.ts.map +1 -1
- package/dist/queue/paths.js +4 -2
- package/dist/queue/paths.js.map +1 -1
- package/dist/queue/process-file.d.ts +5 -1
- package/dist/queue/process-file.d.ts.map +1 -1
- package/dist/queue/process-file.js +5 -1
- package/dist/queue/process-file.js.map +1 -1
- package/dist/queue/snapshot.d.ts +4 -1
- package/dist/queue/snapshot.d.ts.map +1 -1
- package/dist/queue/snapshot.js +4 -1
- package/dist/queue/snapshot.js.map +1 -1
- package/dist/queue/spawn.d.ts +1 -3
- package/dist/queue/spawn.d.ts.map +1 -1
- package/dist/queue/spawn.js +1 -3
- package/dist/queue/spawn.js.map +1 -1
- package/dist/queue/submit.d.ts +6 -1
- package/dist/queue/submit.d.ts.map +1 -1
- package/dist/queue/submit.js +6 -1
- package/dist/queue/submit.js.map +1 -1
- package/dist/queue/types.d.ts +5 -1
- package/dist/queue/types.d.ts.map +1 -1
- package/dist/queue/types.js +5 -1
- package/dist/queue/types.js.map +1 -1
- package/dist/queue/worker-log.d.ts +3 -1
- package/dist/queue/worker-log.d.ts.map +1 -1
- package/dist/queue/worker-log.js +3 -1
- package/dist/queue/worker-log.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Per-Turn Classifier
|
|
4
|
+
*
|
|
5
|
+
* Adapted from codeburn's `src/classifier.ts` — assigns each agent turn a
|
|
6
|
+
* `TurnCategory` label using:
|
|
7
|
+
* 1. **Tool patterns** — what tools were used (Edit/Read/Bash/Task/...)
|
|
8
|
+
* 2. **User message keywords** — regex match on the human-user prompt text
|
|
9
|
+
* 3. **Bash command keywords** — regex match on raw Bash command bodies
|
|
10
|
+
*
|
|
11
|
+
* The user message text and Bash command text are read locally for regex
|
|
12
|
+
* matching but **never emitted** on the wire — only `TurnCategory` labels
|
|
13
|
+
* and counter aggregates leave this module. Same privacy contract as the
|
|
14
|
+
* existing `extractBashBinary` path: content INPUT, structural label OUTPUT.
|
|
15
|
+
*
|
|
16
|
+
* Pattern coverage extends codeburn's runtime list to support modern JS/TS
|
|
17
|
+
* (vite/turbopack/swc/bun), Python (poetry/pdm/hatch/uv), JVM (gradle/sbt),
|
|
18
|
+
* .NET, Swift, Elixir, Erlang, Mobile (flutter/expo/eas), Cloud deploy
|
|
19
|
+
* (terraform/pulumi/cdk/k8s/helm), and 30+ test frameworks.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.GIT_PATTERNS = exports.INSTALL_PATTERNS = exports.BUILD_PATTERNS = exports.TEST_PATTERNS = exports.URL_PATTERN = exports.SCRIPT_PATTERNS = exports.FILE_PATTERNS = exports.RESEARCH_KEYWORDS = exports.BRAINSTORM_KEYWORDS = exports.REFACTOR_KEYWORDS = exports.FEATURE_KEYWORDS = exports.DEBUG_KEYWORDS = void 0;
|
|
23
|
+
exports.extractUserMsgKeywords = extractUserMsgKeywords;
|
|
24
|
+
exports.applyToolBucketFlags = applyToolBucketFlags;
|
|
25
|
+
exports.emptyToolBucketFlags = emptyToolBucketFlags;
|
|
26
|
+
exports.emptyBashCmdFlags = emptyBashCmdFlags;
|
|
27
|
+
exports.applyBashCmdFlags = applyBashCmdFlags;
|
|
28
|
+
exports.classifyTurn = classifyTurn;
|
|
29
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
30
|
+
// Keyword regexes — applied to USER MESSAGE TEXT
|
|
31
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
32
|
+
exports.DEBUG_KEYWORDS = /\b(fix|bug|error|broken|failing|crash|issue|debug|traceback|exception|stack\s*trace|not\s+working|wrong|unexpected|status\s+code|404|500|401|403|segfault|panic|null\s*pointer|stacktrace|fatal|abort|crashed|fails?)\b/i;
|
|
33
|
+
exports.FEATURE_KEYWORDS = /\b(add|create|implement|new|build|feature|introduce|set\s*up|scaffold|generate|make\s+(?:a|me|the|an|some)|write\s+(?:a|me|the|an|some)|develop|design)\b/i;
|
|
34
|
+
exports.REFACTOR_KEYWORDS = /\b(refactor|clean\s*up|cleanup|rename|reorganize|simplify|extract|restructure|move|migrate|split|consolidate|inline|abstract|generalize|deduplicate)\b/i;
|
|
35
|
+
exports.BRAINSTORM_KEYWORDS = /\b(brainstorm|idea|what\s+if|explore|think\s+about|approach|strategy|design|consider|how\s+should|what\s+would|opinion|suggest|recommend|tradeoff|alternative)\b/i;
|
|
36
|
+
exports.RESEARCH_KEYWORDS = /\b(research|investigate|look\s+into|find\s+out|check|search|analyze|review|understand|explain|how\s+does|what\s+is|show\s+me|list|compare|describe|summarize)\b/i;
|
|
37
|
+
exports.FILE_PATTERNS = /\.(py|js|ts|tsx|jsx|mjs|cjs|json|yaml|yml|toml|sql|sh|bash|zsh|fish|go|rs|java|rb|php|css|html|md|mdx|csv|xml|kt|kts|swift|dart|c|cpp|cc|h|hpp|cs|fs|fsx|ml|mli|hs|elm|ex|exs|erl|hrl|clj|cljs|nim|jl|lua|r|R|scala|sbt|vb|tf|hcl|graphql|gql|proto|svelte|vue|astro|sass|scss|less|stylus|env|gitignore|dockerfile|cfg|ini|properties|gradle|gemspec)\b/i;
|
|
38
|
+
exports.SCRIPT_PATTERNS = /\b(run\s+\S+\.\w+|execute|scrip?t|curl|wget|api\s+\S+|endpoint|request\s+url|fetch\s+\S+|query|database|db\s+\S+|migration|migrate)\b/i;
|
|
39
|
+
exports.URL_PATTERN = /https?:\/\/\S+/i;
|
|
40
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
41
|
+
// Command regexes — applied to USER MESSAGE TEXT and BASH COMMAND TEXT
|
|
42
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
43
|
+
/** Test runners across mainstream languages + CI coverage tooling. */
|
|
44
|
+
exports.TEST_PATTERNS = new RegExp("\\b(" + [
|
|
45
|
+
// Action keywords (very broad — last-resort match)
|
|
46
|
+
"test", "spec", "coverage",
|
|
47
|
+
// JS/TS test frameworks + runners
|
|
48
|
+
"jest", "vitest", "mocha", "cypress", "playwright", "karma", "jasmine", "ava",
|
|
49
|
+
"tape", "wtr",
|
|
50
|
+
"npm\\s+test", "yarn\\s+test", "pnpm\\s+test", "bun\\s+test",
|
|
51
|
+
"npx\\s+(?:jest|vitest|mocha|cypress|playwright|jasmine|ava)",
|
|
52
|
+
// Python
|
|
53
|
+
"pytest", "nosetests?", "tox", "nox", "behave", "robot", "hypothesis",
|
|
54
|
+
"python3?\\s+-m\\s+(?:pytest|unittest|nose)",
|
|
55
|
+
"hatch\\s+test",
|
|
56
|
+
// Ruby
|
|
57
|
+
"rspec", "minitest", "cucumber", "rake\\s+test", "rake\\s+spec",
|
|
58
|
+
"bundle\\s+exec\\s+(?:rspec|cucumber|test)",
|
|
59
|
+
// Go
|
|
60
|
+
"go\\s+test", "gotestsum", "ginkgo",
|
|
61
|
+
// Rust
|
|
62
|
+
"cargo\\s+(?:test|nextest)",
|
|
63
|
+
// JVM (Java/Kotlin/Scala)
|
|
64
|
+
"mvn\\s+test", "gradle\\s+test", "gradlew\\s+test", "sbt\\s+test",
|
|
65
|
+
"junit", "kotest", "spek",
|
|
66
|
+
// PHP
|
|
67
|
+
"phpunit", "pest", "composer\\s+test",
|
|
68
|
+
// .NET
|
|
69
|
+
"dotnet\\s+test", "nunit", "xunit", "mstest",
|
|
70
|
+
// Swift / Apple
|
|
71
|
+
"swift\\s+test", "xcodebuild\\s+test",
|
|
72
|
+
// Elixir / Erlang
|
|
73
|
+
"mix\\s+test", "rebar3\\s+(?:eunit|ct|proper)",
|
|
74
|
+
// Native / Generic build-system test targets
|
|
75
|
+
"make\\s+(?:test|check)", "meson\\s+test", "ctest", "cmake\\s+--build.*--target\\s+test",
|
|
76
|
+
// CI / Coverage tooling
|
|
77
|
+
"codecov", "coveralls", "nyc", "c8", "jacoco",
|
|
78
|
+
].join("|") + ")\\b", "i");
|
|
79
|
+
/** Build, package, and deploy commands. */
|
|
80
|
+
exports.BUILD_PATTERNS = new RegExp("\\b(" + [
|
|
81
|
+
// JS/TS bundlers + frameworks
|
|
82
|
+
"webpack", "rollup", "esbuild", "parcel", "swc", "tsup", "turbopack", "browserify", "rspack",
|
|
83
|
+
"next\\s+build", "nuxt\\s+build", "astro\\s+build", "gatsby\\s+build", "remix\\s+build",
|
|
84
|
+
"vite\\s+build",
|
|
85
|
+
// npm/yarn/pnpm/bun scripts
|
|
86
|
+
"npm\\s+run\\s+(?:build|dev|start|publish)", "npm\\s+(?:start|publish)",
|
|
87
|
+
"yarn\\s+(?:build|dev|start|publish)",
|
|
88
|
+
"pnpm\\s+(?:build|dev|start|publish)",
|
|
89
|
+
"bun\\s+run\\s+(?:build|dev|start)", "bun\\s+build",
|
|
90
|
+
// Python
|
|
91
|
+
"python3?\\s+setup\\.py", "setup\\.py\\s+(?:install|build|sdist|bdist)",
|
|
92
|
+
"poetry\\s+(?:build|publish)", "pdm\\s+build", "hatch\\s+build", "flit\\s+build",
|
|
93
|
+
"python3?\\s+-m\\s+build", "twine\\s+(?:upload|check)",
|
|
94
|
+
// Ruby
|
|
95
|
+
"rake\\s+build", "gem\\s+build", "gem\\s+push",
|
|
96
|
+
// Go
|
|
97
|
+
"go\\s+(?:build|run|install)",
|
|
98
|
+
// Rust
|
|
99
|
+
"cargo\\s+(?:build|run|publish|install)",
|
|
100
|
+
// JVM
|
|
101
|
+
"mvn\\s+(?:install|package|deploy|compile)",
|
|
102
|
+
"gradle\\s+(?:build|assemble|publish)", "gradlew\\s+(?:build|assemble|assembleDebug|assembleRelease)",
|
|
103
|
+
"sbt\\s+(?:compile|assembly|publish)",
|
|
104
|
+
// PHP
|
|
105
|
+
"composer\\s+(?:install|update|require|run)", "php\\s+artisan",
|
|
106
|
+
// .NET
|
|
107
|
+
"dotnet\\s+(?:build|run|publish|pack)",
|
|
108
|
+
// C/C++ / native
|
|
109
|
+
"make", "cmake", "ninja", "bazel\\s+build", "meson\\s+(?:setup|compile)",
|
|
110
|
+
// Containers / orchestration
|
|
111
|
+
"docker\\s+(?:build|push|compose|run|pull)", "docker-compose",
|
|
112
|
+
"podman\\s+(?:build|push|run)",
|
|
113
|
+
"kubectl\\s+(?:apply|delete|rollout|create)",
|
|
114
|
+
"helm\\s+(?:install|upgrade|uninstall)",
|
|
115
|
+
"skaffold", "tilt", "argocd", "flux",
|
|
116
|
+
// Cloud deploy / serverless / IaC
|
|
117
|
+
"vercel", "netlify", "fly\\s+deploy", "fly\\.io",
|
|
118
|
+
"gcloud\\s+(?:deploy|app|run|builds)",
|
|
119
|
+
"aws\\s+(?:s3|lambda|cloudformation|amplify|deploy|elasticbeanstalk)",
|
|
120
|
+
"az\\s+(?:webapp|deploy|functionapp)",
|
|
121
|
+
"terraform\\s+(?:apply|plan|destroy|init)",
|
|
122
|
+
"pulumi\\s+(?:up|destroy|preview)",
|
|
123
|
+
"cdk\\s+(?:deploy|destroy|synth)",
|
|
124
|
+
"ansible-playbook", "chef-client", "salt",
|
|
125
|
+
"serverless\\s+deploy", "sst\\s+deploy",
|
|
126
|
+
// Process managers
|
|
127
|
+
"pm2", "systemctl", "supervisorctl", "launchctl",
|
|
128
|
+
// Mobile
|
|
129
|
+
"flutter\\s+(?:build|run)", "expo\\s+(?:build|publish)", "eas\\s+build",
|
|
130
|
+
"react-native\\s+run", "pod\\s+install", "xcodebuild", "fastlane",
|
|
131
|
+
// Elixir / Erlang
|
|
132
|
+
"mix\\s+(?:compile|release|deps\\.get)", "rebar3\\s+(?:compile|release)",
|
|
133
|
+
// Misc bare keyword
|
|
134
|
+
"deploy",
|
|
135
|
+
].join("|") + ")\\b", "i");
|
|
136
|
+
/** Package install commands across language + system package managers. */
|
|
137
|
+
exports.INSTALL_PATTERNS = new RegExp("\\b(" + [
|
|
138
|
+
// JS/TS
|
|
139
|
+
"npm\\s+(?:install|i|ci|add)",
|
|
140
|
+
"yarn\\s+(?:add|install)",
|
|
141
|
+
"pnpm\\s+(?:install|i|ci|add)",
|
|
142
|
+
"bun\\s+(?:install|i|add)",
|
|
143
|
+
// Python
|
|
144
|
+
"pip3?\\s+install", "pipx\\s+install", "pipenv\\s+install",
|
|
145
|
+
"poetry\\s+(?:add|install)", "pdm\\s+(?:add|install)",
|
|
146
|
+
"conda\\s+install", "mamba\\s+install",
|
|
147
|
+
"uv\\s+(?:pip\\s+install|add|sync)",
|
|
148
|
+
// Ruby
|
|
149
|
+
"gem\\s+install", "bundle\\s+(?:install|add|update)",
|
|
150
|
+
// Go
|
|
151
|
+
"go\\s+(?:get|install|mod\\s+download)",
|
|
152
|
+
// Rust
|
|
153
|
+
"cargo\\s+(?:add|install)",
|
|
154
|
+
// JVM
|
|
155
|
+
"mvn\\s+install", "gradle\\s+install",
|
|
156
|
+
// PHP
|
|
157
|
+
"composer\\s+(?:install|require|update|global)",
|
|
158
|
+
// .NET
|
|
159
|
+
"dotnet\\s+(?:add\\s+package|restore)", "nuget\\s+(?:install|restore)",
|
|
160
|
+
// System / OS package managers
|
|
161
|
+
"brew\\s+(?:install|reinstall|upgrade|tap)",
|
|
162
|
+
"apt(?:-get)?\\s+install", "dpkg\\s+-i",
|
|
163
|
+
"yum\\s+install", "dnf\\s+install",
|
|
164
|
+
"pacman\\s+-S[yu]*",
|
|
165
|
+
"zypper\\s+install", "pkg\\s+install", "apk\\s+add",
|
|
166
|
+
"port\\s+install",
|
|
167
|
+
"choco\\s+install", "scoop\\s+install", "winget\\s+install",
|
|
168
|
+
// Containers
|
|
169
|
+
"docker\\s+pull",
|
|
170
|
+
].join("|") + ")\\b", "i");
|
|
171
|
+
/** Git operations. */
|
|
172
|
+
exports.GIT_PATTERNS = /\bgit\s+(push|pull|commit|merge|rebase|checkout|branch|stash|log|diff|status|add|reset|cherry-pick|tag|fetch|clone|switch|restore|worktree|submodule|remote|init|blame|reflog|revert|bisect)\b/i;
|
|
173
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
174
|
+
// Tool name buckets — used by classifier predicates
|
|
175
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
176
|
+
const EDIT_TOOLS = new Set([
|
|
177
|
+
"Edit", "Write", "MultiEdit", "NotebookEdit", "FileEditTool", "FileWriteTool",
|
|
178
|
+
"StrReplace", "Delete", "edit", "edit_file", "create_file", "delete_file",
|
|
179
|
+
]);
|
|
180
|
+
const READ_TOOLS = new Set([
|
|
181
|
+
"Read", "Grep", "Glob", "FileReadTool", "GrepTool", "GlobTool",
|
|
182
|
+
"read_file", "grep", "glob", "list_dir",
|
|
183
|
+
]);
|
|
184
|
+
const BASH_TOOLS = new Set([
|
|
185
|
+
"Bash", "BashOutput", "KillShell", "BashTool", "PowerShellTool", "Shell", "shell",
|
|
186
|
+
]);
|
|
187
|
+
const TASK_TOOLS = new Set([
|
|
188
|
+
"Task", "Agent", "AgentSpawn", "TodoWrite",
|
|
189
|
+
]);
|
|
190
|
+
const SEARCH_TOOLS = new Set([
|
|
191
|
+
"WebSearch", "WebFetch", "ToolSearch",
|
|
192
|
+
]);
|
|
193
|
+
const PLAN_TOOLS = new Set([
|
|
194
|
+
"TodoWrite", "ExitPlanMode", "Plan",
|
|
195
|
+
]);
|
|
196
|
+
/** Run all user-msg regexes on the prompt text — privacy-safe (only flags returned). */
|
|
197
|
+
function extractUserMsgKeywords(text) {
|
|
198
|
+
if (text.length === 0) {
|
|
199
|
+
return {
|
|
200
|
+
debug: false, feature: false, refactor: false, brainstorm: false,
|
|
201
|
+
research: false, file_pattern: false, script_pattern: false, url: false,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
debug: exports.DEBUG_KEYWORDS.test(text),
|
|
206
|
+
feature: exports.FEATURE_KEYWORDS.test(text),
|
|
207
|
+
refactor: exports.REFACTOR_KEYWORDS.test(text),
|
|
208
|
+
brainstorm: exports.BRAINSTORM_KEYWORDS.test(text),
|
|
209
|
+
research: exports.RESEARCH_KEYWORDS.test(text),
|
|
210
|
+
file_pattern: exports.FILE_PATTERNS.test(text),
|
|
211
|
+
script_pattern: exports.SCRIPT_PATTERNS.test(text),
|
|
212
|
+
url: exports.URL_PATTERN.test(text),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** Update tool-bucket flags to include a single tool name (idempotent OR). */
|
|
216
|
+
function applyToolBucketFlags(flags, toolName) {
|
|
217
|
+
if (EDIT_TOOLS.has(toolName)) {
|
|
218
|
+
flags.edit = true;
|
|
219
|
+
}
|
|
220
|
+
if (READ_TOOLS.has(toolName)) {
|
|
221
|
+
flags.read = true;
|
|
222
|
+
}
|
|
223
|
+
if (BASH_TOOLS.has(toolName)) {
|
|
224
|
+
flags.bash = true;
|
|
225
|
+
}
|
|
226
|
+
if (TASK_TOOLS.has(toolName)) {
|
|
227
|
+
flags.task = true;
|
|
228
|
+
}
|
|
229
|
+
if (SEARCH_TOOLS.has(toolName)) {
|
|
230
|
+
flags.search = true;
|
|
231
|
+
}
|
|
232
|
+
if (PLAN_TOOLS.has(toolName)) {
|
|
233
|
+
flags.plan = true;
|
|
234
|
+
}
|
|
235
|
+
if (toolName.startsWith("mcp__")) {
|
|
236
|
+
flags.mcp = true;
|
|
237
|
+
}
|
|
238
|
+
if (toolName === "Skill" || toolName === "SlashCommand") {
|
|
239
|
+
flags.skill = true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function emptyToolBucketFlags() {
|
|
243
|
+
return { edit: false, read: false, bash: false, task: false, search: false, mcp: false, skill: false, plan: false };
|
|
244
|
+
}
|
|
245
|
+
function emptyBashCmdFlags() {
|
|
246
|
+
return { test: false, build: false, install: false, git: false };
|
|
247
|
+
}
|
|
248
|
+
/** Scan a single Bash command body and OR its keyword flags into `flags`. */
|
|
249
|
+
function applyBashCmdFlags(flags, command) {
|
|
250
|
+
if (command.length === 0) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (exports.TEST_PATTERNS.test(command)) {
|
|
254
|
+
flags.test = true;
|
|
255
|
+
}
|
|
256
|
+
if (exports.BUILD_PATTERNS.test(command)) {
|
|
257
|
+
flags.build = true;
|
|
258
|
+
}
|
|
259
|
+
if (exports.INSTALL_PATTERNS.test(command)) {
|
|
260
|
+
flags.install = true;
|
|
261
|
+
}
|
|
262
|
+
if (exports.GIT_PATTERNS.test(command)) {
|
|
263
|
+
flags.git = true;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Classify a turn into one of 13 categories. Rules mirror codeburn's
|
|
268
|
+
* classifier with extended pattern coverage.
|
|
269
|
+
*
|
|
270
|
+
* Decision tree:
|
|
271
|
+
* 1. No tools used → keyword-only path (`brainstorming` / `exploration` /
|
|
272
|
+
* `debugging` / `feature` / `coding` / `conversation`).
|
|
273
|
+
* 2. Plan tool used (TodoWrite/ExitPlanMode) → `planning`.
|
|
274
|
+
* 3. Task/Agent → `delegation`.
|
|
275
|
+
* 4. Bash without edits → bash-cmd-flags decide first
|
|
276
|
+
* (test → `testing`, git → `git`, build/install → `build/deploy`),
|
|
277
|
+
* else fall through to keyword refinement / coding.
|
|
278
|
+
* 5. Edit/Write present → `coding`, refined by keywords →
|
|
279
|
+
* `debugging` / `refactoring` / `feature` / `coding`.
|
|
280
|
+
* 6. Bash + Read (no edit) → `exploration`, refined to `debugging` if
|
|
281
|
+
* DEBUG keywords match.
|
|
282
|
+
* 7. Read-only → `exploration`.
|
|
283
|
+
* 8. Search / MCP → `exploration`.
|
|
284
|
+
* 9. Skill → `general`.
|
|
285
|
+
*
|
|
286
|
+
* Returns one of the 13 TurnCategory values; never null.
|
|
287
|
+
*/
|
|
288
|
+
function classifyTurn(s) {
|
|
289
|
+
const t = s.tool_buckets;
|
|
290
|
+
const k = s.user_msg_keywords;
|
|
291
|
+
const b = s.bash_cmd_flags;
|
|
292
|
+
const anyTool = t.edit || t.read || t.bash || t.task || t.search || t.mcp || t.skill || t.plan;
|
|
293
|
+
// Path 1: no tools — keyword-only conversation classification
|
|
294
|
+
if (!anyTool) {
|
|
295
|
+
if (k.brainstorm) {
|
|
296
|
+
return "brainstorming";
|
|
297
|
+
}
|
|
298
|
+
if (k.research) {
|
|
299
|
+
return "exploration";
|
|
300
|
+
}
|
|
301
|
+
if (k.debug) {
|
|
302
|
+
return "debugging";
|
|
303
|
+
}
|
|
304
|
+
if (k.feature) {
|
|
305
|
+
return "feature";
|
|
306
|
+
}
|
|
307
|
+
if (k.file_pattern || k.script_pattern) {
|
|
308
|
+
return "coding";
|
|
309
|
+
}
|
|
310
|
+
if (k.url) {
|
|
311
|
+
return "exploration";
|
|
312
|
+
}
|
|
313
|
+
return "conversation";
|
|
314
|
+
}
|
|
315
|
+
// Path 2-3: plan / delegation take precedence over data signals
|
|
316
|
+
if (t.plan && !t.edit) {
|
|
317
|
+
return "planning";
|
|
318
|
+
}
|
|
319
|
+
if (t.task) {
|
|
320
|
+
return "delegation";
|
|
321
|
+
}
|
|
322
|
+
// Path 4: Bash without edits — bash-cmd-flags + user-msg keyword
|
|
323
|
+
if (t.bash && !t.edit) {
|
|
324
|
+
if (b.test) {
|
|
325
|
+
return "testing";
|
|
326
|
+
}
|
|
327
|
+
if (b.git) {
|
|
328
|
+
return "git";
|
|
329
|
+
}
|
|
330
|
+
if (b.build || b.install) {
|
|
331
|
+
return "build/deploy";
|
|
332
|
+
}
|
|
333
|
+
// user-msg keyword fallback (codeburn parity)
|
|
334
|
+
if (k.debug) {
|
|
335
|
+
return "debugging";
|
|
336
|
+
}
|
|
337
|
+
if (k.research) {
|
|
338
|
+
return "exploration";
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Path 5: edit-driven coding, refined by keywords
|
|
342
|
+
if (t.edit) {
|
|
343
|
+
if (k.debug) {
|
|
344
|
+
return "debugging";
|
|
345
|
+
}
|
|
346
|
+
if (k.refactor) {
|
|
347
|
+
return "refactoring";
|
|
348
|
+
}
|
|
349
|
+
if (k.feature) {
|
|
350
|
+
return "feature";
|
|
351
|
+
}
|
|
352
|
+
return "coding";
|
|
353
|
+
}
|
|
354
|
+
// Path 6: bash + read = exploration (could be debugging)
|
|
355
|
+
if (t.bash && t.read) {
|
|
356
|
+
if (k.debug) {
|
|
357
|
+
return "debugging";
|
|
358
|
+
}
|
|
359
|
+
return "exploration";
|
|
360
|
+
}
|
|
361
|
+
// Path 7: bash-only fallback — codeburn calls this "coding" (running
|
|
362
|
+
// a script as part of dev work). Keep parity.
|
|
363
|
+
if (t.bash) {
|
|
364
|
+
return "coding";
|
|
365
|
+
}
|
|
366
|
+
// Path 8: search or MCP → exploration
|
|
367
|
+
if (t.search || t.mcp) {
|
|
368
|
+
return "exploration";
|
|
369
|
+
}
|
|
370
|
+
// Path 9: read-only → exploration
|
|
371
|
+
if (t.read) {
|
|
372
|
+
return "exploration";
|
|
373
|
+
}
|
|
374
|
+
// Path 10: skill → general
|
|
375
|
+
if (t.skill) {
|
|
376
|
+
return "general";
|
|
377
|
+
}
|
|
378
|
+
return "general";
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/analytics/classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Analytics Emit Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Per-trigger algorithm:
|
|
5
|
+
*
|
|
6
|
+
* 1. Load state (or initialState on miss)
|
|
7
|
+
* 2. Reset detection: schema_version, inode, size, first-KB hash
|
|
8
|
+
* 3. Tail-parse new transcript bytes (with truncate-during-read sanity)
|
|
9
|
+
* 4. Turn-safe boundary detection
|
|
10
|
+
* 5. Project delta + merge into accumulated
|
|
11
|
+
* 6. Substantive filter
|
|
12
|
+
* 7. Idempotency check (offset + final-flag)
|
|
13
|
+
* 8. EMIT-FIRST then atomic-rename state file
|
|
14
|
+
*
|
|
15
|
+
* Hook adapters call {@link emitAnalytics} after their existing primary
|
|
16
|
+
* work; failures here log and swallow — never affect the hook outcome.
|
|
17
|
+
*
|
|
18
|
+
* Submission goes DIRECTLY to the collector (`src/lib/collector.ts:sendToCollector`)
|
|
19
|
+
* — bypasses the queue intentionally. The queue's 4 KB per-line limit fits
|
|
20
|
+
* `tool_call` events but is too tight for full session aggregates. Direct
|
|
21
|
+
* HTTPS POST has no size limit; emit's own retry semantics (state isn't
|
|
22
|
+
* advanced on submit failure → next trigger retries) replace the queue's
|
|
23
|
+
* retry layer for this event type.
|
|
24
|
+
*/
|
|
25
|
+
import { TranscriptSource } from "./types";
|
|
26
|
+
import { emptyAccumulated } from "./state";
|
|
27
|
+
import { AnalyticsLog } from "./log";
|
|
28
|
+
export type TriggerType = "Stop" | "SessionEnd";
|
|
29
|
+
export interface EmitOptions {
|
|
30
|
+
projectDir: string;
|
|
31
|
+
sessionId: string;
|
|
32
|
+
triggerType: TriggerType;
|
|
33
|
+
/** Reason from the SessionEnd payload (Claude/Cursor pass it through). */
|
|
34
|
+
endReason?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Override transcript source. Defaults to "claude-code" — Cursor
|
|
37
|
+
* coverage is gated on path resolution (open question §9). Hook
|
|
38
|
+
* adapters that detect Cursor should pass "cursor" or "missing".
|
|
39
|
+
*/
|
|
40
|
+
transcriptSource?: TranscriptSource;
|
|
41
|
+
/**
|
|
42
|
+
* Optional per-session debug log. When provided, every step of the
|
|
43
|
+
* pipeline writes a line to `<analyticsDir>/analytics.log`. Hook
|
|
44
|
+
* adapters supply this via `runAnalyticsTrigger`; tests / direct
|
|
45
|
+
* callers can omit it (no-op).
|
|
46
|
+
*/
|
|
47
|
+
log?: AnalyticsLog;
|
|
48
|
+
}
|
|
49
|
+
export interface EmitOutcome {
|
|
50
|
+
/** What happened: "emitted" | "skipped" | "no-transcript" | "error" */
|
|
51
|
+
status: "emitted" | "skipped" | "no-transcript" | "error";
|
|
52
|
+
/** Reason string for diagnostics. */
|
|
53
|
+
reason: string;
|
|
54
|
+
/** When emitted, the offset that was just covered. */
|
|
55
|
+
offset?: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Drive a full per-trigger projection and (maybe) emit. Fail-safe:
|
|
59
|
+
* any internal exception is caught + logged + swallowed; returns an
|
|
60
|
+
* outcome describing what happened.
|
|
61
|
+
*/
|
|
62
|
+
export declare function emitAnalytics(opts: EmitOptions): Promise<EmitOutcome>;
|
|
63
|
+
/** Exposed for tests — never call from prod code. */
|
|
64
|
+
export declare const __test: {
|
|
65
|
+
emptyAccumulated: typeof emptyAccumulated;
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/analytics/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,EAeH,gBAAgB,EACnB,MAAM,SAAS,CAAC;AAajB,OAAO,EAAE,gBAAgB,EAAuC,MAAM,SAAS,CAAC;AAKhF,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAMrC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC;AAEhD,MAAM,WAAW,WAAW;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;OAKG;IACH,GAAG,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IACxB,uEAAuE;IACvE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,OAAO,CAAC;IAC1D,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAO3E;AA4/BD,qDAAqD;AACrD,eAAO,MAAM,MAAM,EAAE;IAAE,gBAAgB,EAAE,OAAO,gBAAgB,CAAA;CAE/D,CAAC"}
|