@ironbee-ai/cli 0.6.2 → 0.7.1
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 +12 -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 +122 -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 +72 -70
- package/dist/hooks/core/actions.d.ts.map +1 -1
- package/dist/hooks/core/actions.js +191 -28
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"file-change.d.ts","sourceRoot":"","sources":["../../../../src/import/claude/events/file-change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAuB,MAAM,6BAA6B,CAAC;AAEpF,OAAO,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,IAAI,CAuDlF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Import file_change derivation.
|
|
4
|
+
*
|
|
5
|
+
* One `file_change` event per `Write`/`Edit` tool_use. Filters via the
|
|
6
|
+
* current project config's verifyPatterns / ignoredVerifyPatterns (since
|
|
7
|
+
* historical config values are unrecoverable, we use the current snapshot).
|
|
8
|
+
*
|
|
9
|
+
* Operation heuristic: live mode uses pre-tool-use `existsSync`, which we
|
|
10
|
+
* cannot replay. We inspect the matched `tool_result.content` for a
|
|
11
|
+
* "created"/"updated" marker and default to "update" on miss.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.buildFileChange = buildFileChange;
|
|
15
|
+
const file_diff_1 = require("../../../hooks/core/file-diff");
|
|
16
|
+
const config_1 = require("../../../lib/config");
|
|
17
|
+
const ids_1 = require("../../ids");
|
|
18
|
+
/** Returns null when the tool_use is not a Write/Edit, or the file is filtered. */
|
|
19
|
+
function buildFileChange(opts) {
|
|
20
|
+
const { sessionId, projectName, activityId, timestamp, toolUse, toolResult, config } = opts;
|
|
21
|
+
const toolName = toolUse.name;
|
|
22
|
+
if (toolName !== "Write" && toolName !== "Edit") {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const filePath = readString(toolUse.input, "file_path");
|
|
26
|
+
if (filePath === undefined) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
if (!(0, config_1.requiresVerification)(filePath, config)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
let operation;
|
|
33
|
+
let linesAdded;
|
|
34
|
+
let linesRemoved;
|
|
35
|
+
if (toolName === "Edit") {
|
|
36
|
+
const oldStr = readString(toolUse.input, "old_string") ?? "";
|
|
37
|
+
const newStr = readString(toolUse.input, "new_string") ?? "";
|
|
38
|
+
const counts = (0, file_diff_1.diffLineCounts)(oldStr, newStr);
|
|
39
|
+
operation = "update";
|
|
40
|
+
linesAdded = counts.added;
|
|
41
|
+
linesRemoved = counts.removed;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Write
|
|
45
|
+
const content = readString(toolUse.input, "content") ?? "";
|
|
46
|
+
operation = inferOperationFromResult(toolResult);
|
|
47
|
+
linesAdded = (0, file_diff_1.countLines)(content);
|
|
48
|
+
linesRemoved = null; // we don't pre-read prior content; matches live behavior
|
|
49
|
+
}
|
|
50
|
+
const tsMs = Date.parse(timestamp);
|
|
51
|
+
// Import has no fix cycles, so `fix_id` is OMITTED from the wire payload
|
|
52
|
+
// (matches live mode's behavior when no fix is active — `getActiveFixId`
|
|
53
|
+
// returns undefined and JSON.stringify drops the key). Earlier we set
|
|
54
|
+
// `fix_id: ""` literally, which made it past TS `FixAwareEvent.fix_id:
|
|
55
|
+
// string` typing but was rejected by the collector's schema validator
|
|
56
|
+
// (Java side likely has `@NotBlank` on the field). The cast lets us
|
|
57
|
+
// satisfy the TS type without emitting the empty value on the wire.
|
|
58
|
+
const event = {
|
|
59
|
+
id: (0, ids_1.deriveFileChangeEventId)(sessionId, toolUse.id),
|
|
60
|
+
type: "file_change",
|
|
61
|
+
timestamp: Number.isFinite(tsMs) ? tsMs : Date.now(),
|
|
62
|
+
session_id: sessionId,
|
|
63
|
+
project_name: projectName,
|
|
64
|
+
activity_id: activityId,
|
|
65
|
+
tool_name: toolName,
|
|
66
|
+
file_path: filePath,
|
|
67
|
+
operation,
|
|
68
|
+
lines_added: linesAdded,
|
|
69
|
+
lines_removed: linesRemoved,
|
|
70
|
+
};
|
|
71
|
+
return event;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Operation heuristic for `Write`. Inspects the matched
|
|
75
|
+
* `tool_result.content` text for "created"/"File created"/"updated" markers.
|
|
76
|
+
* Defaults to `"update"` on miss (the safer fallback — we'd rather mislabel
|
|
77
|
+
* a create as update than the reverse, since "update" is the dominant case
|
|
78
|
+
* in real sessions). Always returns a definite operation.
|
|
79
|
+
*/
|
|
80
|
+
function inferOperationFromResult(result) {
|
|
81
|
+
if (result === null || result.is_error) {
|
|
82
|
+
return "update";
|
|
83
|
+
}
|
|
84
|
+
const text = stringifyContent(result.content).toLowerCase();
|
|
85
|
+
if (text.includes("file created") || text.includes("created successfully")) {
|
|
86
|
+
return "create";
|
|
87
|
+
}
|
|
88
|
+
return "update";
|
|
89
|
+
}
|
|
90
|
+
function stringifyContent(content) {
|
|
91
|
+
if (typeof content === "string") {
|
|
92
|
+
return content;
|
|
93
|
+
}
|
|
94
|
+
if (Array.isArray(content)) {
|
|
95
|
+
const parts = [];
|
|
96
|
+
for (const block of content) {
|
|
97
|
+
if (block !== null && typeof block === "object") {
|
|
98
|
+
const text = block.text;
|
|
99
|
+
if (typeof text === "string") {
|
|
100
|
+
parts.push(text);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return parts.join("\n");
|
|
105
|
+
}
|
|
106
|
+
return "";
|
|
107
|
+
}
|
|
108
|
+
function readString(input, key) {
|
|
109
|
+
const value = input[key];
|
|
110
|
+
return typeof value === "string" ? value : undefined;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=file-change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-change.js","sourceRoot":"","sources":["../../../../src/import/claude/events/file-change.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Import tool_call derivation.
|
|
3
|
+
*
|
|
4
|
+
* One `tool_call` event per `tool_use` block in any assistant message.
|
|
5
|
+
*
|
|
6
|
+
* For `bdt_` / `ndt_` (devtools-MCP) tools: when `_metadata.toolCallId` is
|
|
7
|
+
* present in the transcript, use it as the event `id`
|
|
8
|
+
* verbatim. Live MCP-shipped events use the same id, so collector dedup on
|
|
9
|
+
* `(session_id, id)` collapses live↔import duplicates. For older transcripts
|
|
10
|
+
* without `toolCallId` (or for any non-devtools tool), fall back to the
|
|
11
|
+
* deterministic formula from `tool_use.id`.
|
|
12
|
+
*
|
|
13
|
+
* `tool_input` is whitelisted via `extractClaudeToolInput` — same projection
|
|
14
|
+
* the live track-action hook applies. `tool_response` is not shipped on the
|
|
15
|
+
* wire, only its byte size.
|
|
16
|
+
*
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
import { ToolCallAction } from "../../../hooks/core/actions";
|
|
20
|
+
/** Lightly-typed tool_use shape we walk out of the transcript. */
|
|
21
|
+
export interface RawToolUse {
|
|
22
|
+
/** `tool_use.id` — host-supplied per-call identifier. */
|
|
23
|
+
id: string;
|
|
24
|
+
/** Raw tool name with prefix (e.g. `mcp__browser-devtools__bdt_navigation_go-to`). */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Raw input — may contain `_metadata` for devtools (bdt_/ndt_) tools. */
|
|
27
|
+
input: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
/** Lightly-typed tool_result shape. `null` means no matching result yet. */
|
|
30
|
+
export interface RawToolResult {
|
|
31
|
+
/** Joined to `tool_use.id`. */
|
|
32
|
+
tool_use_id: string;
|
|
33
|
+
/** `is_error: true` is propagated to event.error. */
|
|
34
|
+
is_error: boolean;
|
|
35
|
+
/** Content block — string or array. Used for size + error message extraction. */
|
|
36
|
+
content: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface BuildToolCallOpts {
|
|
39
|
+
sessionId: string;
|
|
40
|
+
projectName: string;
|
|
41
|
+
/** Parent turn's activity_id (from `deriveActivityId`). */
|
|
42
|
+
activityId: string;
|
|
43
|
+
/** ISO timestamp from the assistant line carrying the tool_use. */
|
|
44
|
+
timestamp: string;
|
|
45
|
+
toolUse: RawToolUse;
|
|
46
|
+
/** Matched tool_result for this tool_use, or null when unmatched. */
|
|
47
|
+
toolResult: RawToolResult | null;
|
|
48
|
+
/**
|
|
49
|
+
* Estimated duration in ms. Live mode reads `duration_ms` from the
|
|
50
|
+
* PostToolUse hook stdin (exact wall-clock per call). Transcripts don't
|
|
51
|
+
* carry per-tool latency, so the import runner approximates by computing
|
|
52
|
+
* the bracket between the assistant message timestamp and the next user
|
|
53
|
+
* message timestamp — accurate for messages with a single tool_use,
|
|
54
|
+
* approximate (an upper bound) for parallel multi-tool messages. The
|
|
55
|
+
* runner passes `null` in those ambiguous cases; we forward `null`
|
|
56
|
+
* verbatim and downstream treats it as "unknown" (NOT zero).
|
|
57
|
+
*/
|
|
58
|
+
durationMs?: number | null;
|
|
59
|
+
}
|
|
60
|
+
export declare function buildToolCall(opts: BuildToolCallOpts): ToolCallAction;
|
|
61
|
+
//# sourceMappingURL=tool-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call.d.ts","sourceRoot":"","sources":["../../../../src/import/claude/events/tool-call.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACvB,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC1B,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,qEAAqE;IACrE,UAAU,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAgDrE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Import tool_call derivation.
|
|
4
|
+
*
|
|
5
|
+
* One `tool_call` event per `tool_use` block in any assistant message.
|
|
6
|
+
*
|
|
7
|
+
* For `bdt_` / `ndt_` (devtools-MCP) tools: when `_metadata.toolCallId` is
|
|
8
|
+
* present in the transcript, use it as the event `id`
|
|
9
|
+
* verbatim. Live MCP-shipped events use the same id, so collector dedup on
|
|
10
|
+
* `(session_id, id)` collapses live↔import duplicates. For older transcripts
|
|
11
|
+
* without `toolCallId` (or for any non-devtools tool), fall back to the
|
|
12
|
+
* deterministic formula from `tool_use.id`.
|
|
13
|
+
*
|
|
14
|
+
* `tool_input` is whitelisted via `extractClaudeToolInput` — same projection
|
|
15
|
+
* the live track-action hook applies. `tool_response` is not shipped on the
|
|
16
|
+
* wire, only its byte size.
|
|
17
|
+
*
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.buildToolCall = buildToolCall;
|
|
22
|
+
const util_1 = require("../../../clients/claude/util");
|
|
23
|
+
const ids_1 = require("../../ids");
|
|
24
|
+
const DEVTOOLS_MCP_SERVERS = new Set(["browser-devtools", "node-devtools"]);
|
|
25
|
+
function buildToolCall(opts) {
|
|
26
|
+
const { sessionId, projectName, activityId, timestamp, toolUse, toolResult } = opts;
|
|
27
|
+
const classified = (0, util_1.classifyTool)(toolUse.name, toolUse.input);
|
|
28
|
+
// Event id: prefer _metadata.toolCallId for devtools (bdt_/ndt_) tools
|
|
29
|
+
// when present in the transcript; otherwise fall back to
|
|
30
|
+
// deterministic-from-tool_use_id.
|
|
31
|
+
const eventId = resolveEventId(sessionId, classified, toolUse);
|
|
32
|
+
// tool_input projection: whitelist via extractClaudeToolInput. For
|
|
33
|
+
// browser-devtools/node-devtools tools, util.ts intentionally bypasses
|
|
34
|
+
// extraction and returns the raw input — that's fine for actions.jsonl
|
|
35
|
+
// but on the wire we still want it pruned. Since we are NOT going through
|
|
36
|
+
// the live track-action queue path, we just ship whatever extractClaudeToolInput
|
|
37
|
+
// returns (matches live wire shape for non-devtools; for devtools, includes
|
|
38
|
+
// _metadata which collector consumers already tolerate).
|
|
39
|
+
const projectedInput = (0, util_1.extractClaudeToolInput)(toolUse.name, toolUse.input);
|
|
40
|
+
const inputSize = byteLengthOf(toolUse.input);
|
|
41
|
+
const responseSize = toolResult !== null ? byteLengthOf(toolResult.content) : 0;
|
|
42
|
+
const errorMsg = toolResult !== null && toolResult.is_error
|
|
43
|
+
? extractErrorMessage(toolResult.content)
|
|
44
|
+
: undefined;
|
|
45
|
+
const tsMs = Date.parse(timestamp);
|
|
46
|
+
const event = {
|
|
47
|
+
id: eventId,
|
|
48
|
+
type: "tool_call",
|
|
49
|
+
timestamp: Number.isFinite(tsMs) ? tsMs : Date.now(),
|
|
50
|
+
session_id: sessionId,
|
|
51
|
+
project_name: projectName,
|
|
52
|
+
activity_id: activityId,
|
|
53
|
+
tool_name: classified.tool_name,
|
|
54
|
+
tool_use_id: toolUse.id,
|
|
55
|
+
tool_input: projectedInput,
|
|
56
|
+
tool_input_size: inputSize,
|
|
57
|
+
tool_response_size: responseSize,
|
|
58
|
+
duration: opts.durationMs ?? null,
|
|
59
|
+
};
|
|
60
|
+
if (classified.tool_type !== null) {
|
|
61
|
+
event.tool_type = classified.tool_type;
|
|
62
|
+
}
|
|
63
|
+
if (classified.mcp_server !== null) {
|
|
64
|
+
event.mcp_server = classified.mcp_server;
|
|
65
|
+
}
|
|
66
|
+
if (errorMsg !== undefined) {
|
|
67
|
+
event.error = errorMsg;
|
|
68
|
+
}
|
|
69
|
+
return event;
|
|
70
|
+
}
|
|
71
|
+
function resolveEventId(sessionId, classified, toolUse) {
|
|
72
|
+
if (classified.tool_type === "mcp"
|
|
73
|
+
&& classified.mcp_server !== null
|
|
74
|
+
&& DEVTOOLS_MCP_SERVERS.has(classified.mcp_server)) {
|
|
75
|
+
const meta = toolUse.input._metadata;
|
|
76
|
+
if (meta !== null && typeof meta === "object") {
|
|
77
|
+
const toolCallId = meta.toolCallId;
|
|
78
|
+
if (typeof toolCallId === "string" && toolCallId.length > 0) {
|
|
79
|
+
return toolCallId;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return (0, ids_1.deriveToolCallEventIdFromToolUseId)(sessionId, toolUse.id);
|
|
84
|
+
}
|
|
85
|
+
function byteLengthOf(value) {
|
|
86
|
+
if (value === undefined || value === null) {
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
return Buffer.byteLength(JSON.stringify(value), "utf-8");
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function extractErrorMessage(content) {
|
|
97
|
+
if (typeof content === "string") {
|
|
98
|
+
return content;
|
|
99
|
+
}
|
|
100
|
+
if (Array.isArray(content)) {
|
|
101
|
+
const parts = [];
|
|
102
|
+
for (const block of content) {
|
|
103
|
+
if (block !== null && typeof block === "object") {
|
|
104
|
+
const text = block.text;
|
|
105
|
+
if (typeof text === "string") {
|
|
106
|
+
parts.push(text);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return parts.join("\n");
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
return JSON.stringify(content);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return String(content);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=tool-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call.js","sourceRoot":"","sources":["../../../../src/import/claude/events/tool-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Claude Per-Session Import Runner
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the full import of one Claude transcript:
|
|
5
|
+
* 1. Skip check (`<projectDir>/.ironbee/sessions/<id>/`).
|
|
6
|
+
* 2. Run analytics-runner — produces session_analytics + turn + step +
|
|
7
|
+
* api_request events.
|
|
8
|
+
* 3. Walk the Claude transcript separately for non-analytics events:
|
|
9
|
+
* session_start, session_end, activity_start/end (per turn,
|
|
10
|
+
* host_inject suppressed), tool_call (per tool_use), file_change
|
|
11
|
+
* (Write/Edit).
|
|
12
|
+
* 4. POST all events via the import emitter (transient retry).
|
|
13
|
+
* 5. Write the marker.
|
|
14
|
+
*
|
|
15
|
+
* Claude-specific because the transcript walk depends on Claude's JSONL
|
|
16
|
+
* shape. When Cursor support lands, a parallel `cursor/runner.ts` will
|
|
17
|
+
* implement the same `IClientRunner` contract — never mixed in this file.
|
|
18
|
+
*
|
|
19
|
+
* Per-session atomicity: on any unrecoverable failure mid-emit,
|
|
20
|
+
* the marker is NOT written and the session re-attempts on the next
|
|
21
|
+
* `ironbee import` run.
|
|
22
|
+
*/
|
|
23
|
+
import { ImportResult, ImportTarget } from "../types";
|
|
24
|
+
export interface ClaudeRunnerOpts {
|
|
25
|
+
target: ImportTarget;
|
|
26
|
+
force: boolean;
|
|
27
|
+
/** Events per collector POST; null = use target/default. */
|
|
28
|
+
batchSize?: number | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function importClaudeSession(opts: ClaudeRunnerOpts): Promise<ImportResult>;
|
|
31
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/import/claude/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAQH,OAAO,EAIH,YAAY,EACZ,YAAY,EACf,MAAM,UAAU,CAAC;AAqBlB,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoNvF"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Claude Per-Session Import Runner
|
|
4
|
+
*
|
|
5
|
+
* Orchestrates the full import of one Claude transcript:
|
|
6
|
+
* 1. Skip check (`<projectDir>/.ironbee/sessions/<id>/`).
|
|
7
|
+
* 2. Run analytics-runner — produces session_analytics + turn + step +
|
|
8
|
+
* api_request events.
|
|
9
|
+
* 3. Walk the Claude transcript separately for non-analytics events:
|
|
10
|
+
* session_start, session_end, activity_start/end (per turn,
|
|
11
|
+
* host_inject suppressed), tool_call (per tool_use), file_change
|
|
12
|
+
* (Write/Edit).
|
|
13
|
+
* 4. POST all events via the import emitter (transient retry).
|
|
14
|
+
* 5. Write the marker.
|
|
15
|
+
*
|
|
16
|
+
* Claude-specific because the transcript walk depends on Claude's JSONL
|
|
17
|
+
* shape. When Cursor support lands, a parallel `cursor/runner.ts` will
|
|
18
|
+
* implement the same `IClientRunner` contract — never mixed in this file.
|
|
19
|
+
*
|
|
20
|
+
* Per-session atomicity: on any unrecoverable failure mid-emit,
|
|
21
|
+
* the marker is NOT written and the session re-attempts on the next
|
|
22
|
+
* `ironbee import` run.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.importClaudeSession = importClaudeSession;
|
|
26
|
+
const fs_1 = require("fs");
|
|
27
|
+
const collector_1 = require("../../lib/collector");
|
|
28
|
+
const config_1 = require("../../lib/config");
|
|
29
|
+
const logger_1 = require("../../lib/logger");
|
|
30
|
+
const transcript_1 = require("../../analytics/transcript");
|
|
31
|
+
const types_1 = require("../types");
|
|
32
|
+
const skip_1 = require("../skip");
|
|
33
|
+
const marker_1 = require("../marker");
|
|
34
|
+
const analytics_runner_1 = require("./analytics-runner");
|
|
35
|
+
const session_1 = require("../events/session");
|
|
36
|
+
const activity_1 = require("../events/activity");
|
|
37
|
+
const tool_call_1 = require("./events/tool-call");
|
|
38
|
+
const file_change_1 = require("./events/file-change");
|
|
39
|
+
const ids_1 = require("../ids");
|
|
40
|
+
const emitter_1 = require("../emitter");
|
|
41
|
+
const transcript_walk_1 = require("./transcript-walk");
|
|
42
|
+
async function importClaudeSession(opts) {
|
|
43
|
+
const { target, force } = opts;
|
|
44
|
+
const batchSize = opts.batchSize ?? null;
|
|
45
|
+
// Analytics events (session_analytics + turn + step + api_request) ride
|
|
46
|
+
// the existing `analytics` master switch — opt-in by config presence,
|
|
47
|
+
// opt-out by `analytics.enable: false`. When disabled, import still
|
|
48
|
+
// emits structural events (session/activity/tool_call/file_change) but
|
|
49
|
+
// skips analytics-derived emission.
|
|
50
|
+
const analyticsEnabled = (0, config_1.isAnalyticsEnabled)(target.projectDir);
|
|
51
|
+
const { sessionId, transcriptPath, projectDir, projectName } = target;
|
|
52
|
+
if ((0, skip_1.shouldSkip)(projectDir, sessionId, force)) {
|
|
53
|
+
return {
|
|
54
|
+
sessionId,
|
|
55
|
+
status: "skipped",
|
|
56
|
+
eventsSent: (0, types_1.emptyEventCounts)(),
|
|
57
|
+
reason: "already tracked",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const collectorTarget = (0, collector_1.getCollectorTarget)(projectDir);
|
|
62
|
+
const config = (0, config_1.loadConfig)(projectDir);
|
|
63
|
+
// Step 1 — analytics events.
|
|
64
|
+
const analytics = (0, analytics_runner_1.runImportAnalytics)({
|
|
65
|
+
sessionId,
|
|
66
|
+
projectName,
|
|
67
|
+
projectDir,
|
|
68
|
+
transcriptPath,
|
|
69
|
+
});
|
|
70
|
+
// Step 2 — non-analytics events. Re-read transcript, walk lines.
|
|
71
|
+
const fileBytes = (0, fs_1.readFileSync)(transcriptPath);
|
|
72
|
+
const parsed = (0, transcript_1.parseJsonl)(fileBytes, 0);
|
|
73
|
+
const transcriptLines = parsed.lines
|
|
74
|
+
.filter((ln) => ln.parsed !== null)
|
|
75
|
+
.map((ln) => ln.parsed);
|
|
76
|
+
const counts = (0, types_1.emptyEventCounts)();
|
|
77
|
+
const events = [];
|
|
78
|
+
events.push((0, session_1.buildSessionStart)(target, "claude"));
|
|
79
|
+
counts.session_start = 1;
|
|
80
|
+
// Walk BACKWARDS to find the last line carrying a top-level
|
|
81
|
+
// `timestamp`. Some Claude transcripts end with non-message rows
|
|
82
|
+
// (`summary`, host telemetry) that don't expose a timestamp; an
|
|
83
|
+
// earlier version peeked only at the very last line and fell back
|
|
84
|
+
// to `sessionStartMs`, which produced session_end == session_start
|
|
85
|
+
// and made session_end appear chronologically before its own
|
|
86
|
+
// activity_end on the wire.
|
|
87
|
+
const lastTimestampMs = findLastLineTimestamp(transcriptLines, target.sessionStartMs);
|
|
88
|
+
const endReason = (0, transcript_walk_1.readSummaryEndReason)(transcriptLines) ?? "unknown";
|
|
89
|
+
events.push((0, session_1.buildSessionEnd)(target, lastTimestampMs, endReason));
|
|
90
|
+
counts.session_end = 1;
|
|
91
|
+
// Use analytics-runner's turn events as authoritative when available.
|
|
92
|
+
// When `analytics.emitTurnEvents=false` (the default), fall back to
|
|
93
|
+
// a transcript-derived turn walker so activity_* still emits.
|
|
94
|
+
const turnBoundaries = analytics.turnEvents.length > 0
|
|
95
|
+
? analytics.turnEvents.map((te) => ({
|
|
96
|
+
turnIndex: te.turn.turn_index,
|
|
97
|
+
startTime: te.turn.start_time,
|
|
98
|
+
endTime: te.turn.end_time,
|
|
99
|
+
triggeredBy: te.turn.triggered_by,
|
|
100
|
+
}))
|
|
101
|
+
: (0, transcript_walk_1.deriveTurnBoundariesFromTranscript)(transcriptLines);
|
|
102
|
+
for (const tb of turnBoundaries) {
|
|
103
|
+
if (tb.triggeredBy === "host_inject") {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const boundary = {
|
|
107
|
+
turnIndex: tb.turnIndex,
|
|
108
|
+
startTime: tb.startTime,
|
|
109
|
+
endTime: tb.endTime,
|
|
110
|
+
};
|
|
111
|
+
events.push((0, activity_1.buildActivityStart)(sessionId, projectName, boundary));
|
|
112
|
+
events.push((0, activity_1.buildActivityEnd)(sessionId, projectName, boundary));
|
|
113
|
+
counts.activity_start += 1;
|
|
114
|
+
counts.activity_end += 1;
|
|
115
|
+
}
|
|
116
|
+
const turnLookup = (0, transcript_walk_1.buildTurnLookup)(turnBoundaries);
|
|
117
|
+
for (let i = 0; i < transcriptLines.length; i++) {
|
|
118
|
+
const line = transcriptLines[i];
|
|
119
|
+
if (line.type !== "assistant") {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const lineTimestamp = line.timestamp ?? "";
|
|
123
|
+
const turnIdx = turnLookup.lookup(lineTimestamp);
|
|
124
|
+
if (turnIdx === null) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const tb = turnBoundaries.find((b) => b.turnIndex === turnIdx);
|
|
128
|
+
if (tb === undefined) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const activityId = (0, ids_1.deriveActivityId)(sessionId, tb.turnIndex, tb.startTime);
|
|
132
|
+
const toolUses = (0, transcript_walk_1.extractToolUsesFromLine)(line);
|
|
133
|
+
if (toolUses.length === 0) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const nextUser = (0, transcript_walk_1.findNextUserLine)(transcriptLines, i);
|
|
137
|
+
const resultsByToolUseId = nextUser !== undefined
|
|
138
|
+
? (0, transcript_walk_1.extractToolResultsByToolUseId)(nextUser)
|
|
139
|
+
: new Map();
|
|
140
|
+
// Bracket-time duration approximation: assistant emits the
|
|
141
|
+
// tool_use at `lineTimestamp`; the next user message carries
|
|
142
|
+
// the tool_result with its own timestamp. The delta is the
|
|
143
|
+
// round-trip from "agent dispatched the tool" to "result was
|
|
144
|
+
// delivered back". Live mode reads this from `duration_ms` on
|
|
145
|
+
// PostToolUse stdin — exact per-call. Transcripts don't carry
|
|
146
|
+
// that, so we use the bracket as a best-effort estimate. We
|
|
147
|
+
// ONLY apply it when the assistant message has a single
|
|
148
|
+
// tool_use; with multiple parallel tool_uses the bracket is
|
|
149
|
+
// an upper bound on the slowest tool (≠ each individual
|
|
150
|
+
// tool's duration), and overstating per-tool latency would
|
|
151
|
+
// distort downstream aggregates. In that case duration stays
|
|
152
|
+
// null (matches "unknown, not zero" semantics).
|
|
153
|
+
const bracketMs = toolUses.length === 1
|
|
154
|
+
? computeBracketMs(lineTimestamp, nextUser)
|
|
155
|
+
: null;
|
|
156
|
+
for (const tu of toolUses) {
|
|
157
|
+
const result = resultsByToolUseId.get(tu.id) ?? null;
|
|
158
|
+
// Only assign a duration when the tool_result is actually
|
|
159
|
+
// present in the next user message — without that, the
|
|
160
|
+
// tool didn't complete (interrupted / session ended) and
|
|
161
|
+
// any timestamp delta would be a fiction.
|
|
162
|
+
const durationMs = (bracketMs !== null && result !== null) ? bracketMs : null;
|
|
163
|
+
events.push((0, tool_call_1.buildToolCall)({
|
|
164
|
+
sessionId,
|
|
165
|
+
projectName,
|
|
166
|
+
activityId,
|
|
167
|
+
timestamp: lineTimestamp,
|
|
168
|
+
toolUse: tu,
|
|
169
|
+
toolResult: result,
|
|
170
|
+
durationMs,
|
|
171
|
+
}));
|
|
172
|
+
counts.tool_call += 1;
|
|
173
|
+
const fcEvent = (0, file_change_1.buildFileChange)({
|
|
174
|
+
sessionId,
|
|
175
|
+
projectName,
|
|
176
|
+
activityId,
|
|
177
|
+
timestamp: lineTimestamp,
|
|
178
|
+
toolUse: tu,
|
|
179
|
+
toolResult: result,
|
|
180
|
+
config,
|
|
181
|
+
});
|
|
182
|
+
if (fcEvent !== null) {
|
|
183
|
+
events.push(fcEvent);
|
|
184
|
+
counts.file_change += 1;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Add analytics events — gated by `analytics` config master switch.
|
|
189
|
+
// Even when gated off, we keep the analytics-runner output: (1)
|
|
190
|
+
// `transcriptOffset` is the marker's source-of-truth, (2) the turn-
|
|
191
|
+
// boundary lookup we just used for activity_id derivation is more
|
|
192
|
+
// accurate than the fallback walker. Cost is just ~2× transcript
|
|
193
|
+
// read; events are dropped before POST.
|
|
194
|
+
if (analyticsEnabled) {
|
|
195
|
+
events.push(analytics.sessionAnalytics);
|
|
196
|
+
counts.session_analytics = 1;
|
|
197
|
+
for (const te of analytics.turnEvents) {
|
|
198
|
+
events.push(te);
|
|
199
|
+
}
|
|
200
|
+
counts.session_turn_analytics = analytics.turnEvents.length;
|
|
201
|
+
for (const se of analytics.stepEvents) {
|
|
202
|
+
events.push(se);
|
|
203
|
+
}
|
|
204
|
+
counts.session_turn_step_analytics = analytics.stepEvents.length;
|
|
205
|
+
for (const are of analytics.apiRequestEvents) {
|
|
206
|
+
events.push(are);
|
|
207
|
+
}
|
|
208
|
+
counts.api_request = analytics.apiRequestEvents.length;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
logger_1.logger.debug(`import claude-runner: session ${sessionId} — analytics disabled, suppressing ${analytics.turnEvents.length} turn / ${analytics.stepEvents.length} step / ${analytics.apiRequestEvents.length} api_request / 1 session_analytics events`);
|
|
212
|
+
}
|
|
213
|
+
// POST.
|
|
214
|
+
await (0, emitter_1.postEvents)(events, {
|
|
215
|
+
sessionId,
|
|
216
|
+
projectDir,
|
|
217
|
+
target: collectorTarget,
|
|
218
|
+
...(batchSize !== null ? { batchSize } : {}),
|
|
219
|
+
});
|
|
220
|
+
// Marker.
|
|
221
|
+
(0, marker_1.writeImportMarker)(projectDir, sessionId, transcriptPath, analytics.transcriptOffset, counts);
|
|
222
|
+
return {
|
|
223
|
+
sessionId,
|
|
224
|
+
status: "imported",
|
|
225
|
+
eventsSent: counts,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
230
|
+
logger_1.logger.debug(`import claude-runner: session ${sessionId} failed: ${reason}`);
|
|
231
|
+
return {
|
|
232
|
+
sessionId,
|
|
233
|
+
status: "failed",
|
|
234
|
+
eventsSent: (0, types_1.emptyEventCounts)(),
|
|
235
|
+
reason,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Bracket time between an assistant tool_use and the matching tool_result
|
|
241
|
+
* in the next user message. Returns null when either timestamp is missing
|
|
242
|
+
* or unparseable, or when the next user line is absent. See `runner.ts`
|
|
243
|
+
* for the full rationale and the single-vs-multi-tool gating decision.
|
|
244
|
+
*/
|
|
245
|
+
function computeBracketMs(assistantTs, nextUser) {
|
|
246
|
+
if (nextUser === undefined) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
const nextTs = nextUser.timestamp;
|
|
250
|
+
if (typeof nextTs !== "string") {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
const startMs = Date.parse(assistantTs);
|
|
254
|
+
const endMs = Date.parse(nextTs);
|
|
255
|
+
if (!Number.isFinite(startMs) || !Number.isFinite(endMs)) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
const delta = endMs - startMs;
|
|
259
|
+
return delta >= 0 ? delta : null;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Walk transcript lines from the tail forward and return the first
|
|
263
|
+
* top-level `timestamp` we find (parsed to epoch ms). Falls back to
|
|
264
|
+
* `fallbackMs` when no row in the transcript exposes a top-level
|
|
265
|
+
* timestamp — should never happen with real Claude transcripts but
|
|
266
|
+
* keeps the contract safe.
|
|
267
|
+
*/
|
|
268
|
+
function findLastLineTimestamp(lines, fallbackMs) {
|
|
269
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
270
|
+
const ts = lines[i].timestamp;
|
|
271
|
+
if (typeof ts === "string") {
|
|
272
|
+
const ms = Date.parse(ts);
|
|
273
|
+
if (Number.isFinite(ms)) {
|
|
274
|
+
return ms;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return fallbackMs;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/import/claude/runner.ts"],"names":[],"mappings":"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"}
|