@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,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Import Module Direct Collector POST
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around `lib/collector.ts:sendEventsBatchToCollector` with
|
|
5
|
+
* transient-failure retry (1s/4s/16s backoff ).
|
|
6
|
+
* Never touches `actions.jsonl`, the queue, or any session state writers.
|
|
7
|
+
*
|
|
8
|
+
* Per-event-type batching: events of mixed types are POSTed in a single
|
|
9
|
+
* batch (the collector contract is a flat `Event[]`). Caller chunks by
|
|
10
|
+
* size if desired.
|
|
11
|
+
*/
|
|
12
|
+
import { Event } from "../lib/event";
|
|
13
|
+
import { CollectorTarget } from "../lib/collector";
|
|
14
|
+
export interface EmitterOpts {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
projectDir: string;
|
|
17
|
+
target: CollectorTarget | null;
|
|
18
|
+
/** Override per-batch cap. Defaults to `target.batchSize` or 100. */
|
|
19
|
+
batchSize?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* POST a batch of events with retry. Returns when every batch has either
|
|
23
|
+
* succeeded or exhausted retries. On exhaustion, throws the last error so
|
|
24
|
+
* the pipeline can mark the session `failed` (per-session atomicity).
|
|
25
|
+
*
|
|
26
|
+
* Silent no-op when `target === null` (collector disabled).
|
|
27
|
+
*/
|
|
28
|
+
export declare function postEvents(events: Event[], opts: EmitterOpts): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/import/emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,eAAe,EAA8B,MAAM,kBAAkB,CAAC;AAG/E,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Import Module Direct Collector POST
|
|
4
|
+
*
|
|
5
|
+
* Thin wrapper around `lib/collector.ts:sendEventsBatchToCollector` with
|
|
6
|
+
* transient-failure retry (1s/4s/16s backoff ).
|
|
7
|
+
* Never touches `actions.jsonl`, the queue, or any session state writers.
|
|
8
|
+
*
|
|
9
|
+
* Per-event-type batching: events of mixed types are POSTed in a single
|
|
10
|
+
* batch (the collector contract is a flat `Event[]`). Caller chunks by
|
|
11
|
+
* size if desired.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.postEvents = postEvents;
|
|
15
|
+
const collector_1 = require("../lib/collector");
|
|
16
|
+
const logger_1 = require("../lib/logger");
|
|
17
|
+
const DEFAULT_BATCH_SIZE = 100;
|
|
18
|
+
const RETRY_DELAYS_MS = [1000, 4000, 16000];
|
|
19
|
+
/**
|
|
20
|
+
* POST a batch of events with retry. Returns when every batch has either
|
|
21
|
+
* succeeded or exhausted retries. On exhaustion, throws the last error so
|
|
22
|
+
* the pipeline can mark the session `failed` (per-session atomicity).
|
|
23
|
+
*
|
|
24
|
+
* Silent no-op when `target === null` (collector disabled).
|
|
25
|
+
*/
|
|
26
|
+
async function postEvents(events, opts) {
|
|
27
|
+
if (events.length === 0) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (opts.target === null) {
|
|
31
|
+
logger_1.logger.debug(`import emitter: collector disabled — dropping ${events.length} events`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const batchSize = opts.batchSize
|
|
35
|
+
?? (typeof opts.target.batchSize === "number" && opts.target.batchSize >= 1
|
|
36
|
+
? opts.target.batchSize
|
|
37
|
+
: DEFAULT_BATCH_SIZE);
|
|
38
|
+
for (let i = 0; i < events.length; i += batchSize) {
|
|
39
|
+
const batch = events.slice(i, Math.min(i + batchSize, events.length));
|
|
40
|
+
await postOneBatchWithRetry(batch, opts);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function postOneBatchWithRetry(batch, opts) {
|
|
44
|
+
let lastErr = null;
|
|
45
|
+
for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {
|
|
46
|
+
try {
|
|
47
|
+
await (0, collector_1.sendEventsBatchToCollector)(batch, opts.sessionId, opts.projectDir, opts.target);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
lastErr = e instanceof Error ? e : new Error(String(e));
|
|
52
|
+
if (attempt < RETRY_DELAYS_MS.length) {
|
|
53
|
+
const delay = RETRY_DELAYS_MS[attempt];
|
|
54
|
+
logger_1.logger.debug(`import emitter: batch send failed (attempt ${attempt + 1}): ${lastErr.message} — retry in ${delay}ms`);
|
|
55
|
+
await sleep(delay);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
throw lastErr ?? new Error("import emitter: send failed after retries");
|
|
60
|
+
}
|
|
61
|
+
function sleep(ms) {
|
|
62
|
+
return new Promise((resolve) => {
|
|
63
|
+
setTimeout(resolve, ms);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/import/emitter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAwBH,gCAiBC;AAtCD,gDAA+E;AAC/E,0CAAuC;AAUvC,MAAM,kBAAkB,GAAW,GAAG,CAAC;AACvC,MAAM,eAAe,GAAa,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAEtD;;;;;;GAMG;AACI,KAAK,UAAU,UAAU,CAAC,MAAe,EAAE,IAAiB;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;IACX,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACvB,eAAM,CAAC,KAAK,CAAC,iDAAiD,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;QACtF,OAAO;IACX,CAAC;IACD,MAAM,SAAS,GAAW,IAAI,CAAC,SAAS;WACjC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC;YACvE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;YACvB,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACxD,MAAM,KAAK,GAAY,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/E,MAAM,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;AACL,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,KAAc,EAAE,IAAiB;IAClE,IAAI,OAAO,GAAiB,IAAI,CAAC;IACjC,KAAK,IAAI,OAAO,GAAW,CAAC,EAAE,OAAO,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACzE,IAAI,CAAC;YACD,MAAM,IAAA,sCAA0B,EAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtF,OAAO;QACX,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAW,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC/C,eAAM,CAAC,KAAK,CAAC,8CAA8C,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,eAAe,KAAK,IAAI,CAAC,CAAC;gBACrH,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IACD,MAAM,OAAO,IAAI,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAmB,EAAQ,EAAE;QACnD,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Import activity_start / activity_end derivation.
|
|
3
|
+
*
|
|
4
|
+
* Behavior:
|
|
5
|
+
* - one activity_start + one activity_end per turn (host_inject continuations
|
|
6
|
+
* are filtered upstream — by the analytics-runner caller)
|
|
7
|
+
* - source: "user_prompt" (we cannot recover the original `pre_tool_use`
|
|
8
|
+
* fallback signal from transcript alone)
|
|
9
|
+
* - duration_ms on end = end_time - start_time
|
|
10
|
+
* - activity_id matches the analytics turn_id (parent foreign key)
|
|
11
|
+
*/
|
|
12
|
+
import { ActivityStartAction, ActivityEndAction } from "../../hooks/core/actions";
|
|
13
|
+
export interface TurnBoundary {
|
|
14
|
+
/** 1-based positional turn index from the analytics projection. */
|
|
15
|
+
turnIndex: number;
|
|
16
|
+
/** ISO-8601 string from the transcript. */
|
|
17
|
+
startTime: string;
|
|
18
|
+
/** ISO-8601 string. Falls back to startTime when transcript truncates mid-turn. */
|
|
19
|
+
endTime: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function buildActivityStart(sessionId: string, projectName: string, boundary: TurnBoundary): ActivityStartAction;
|
|
22
|
+
export declare function buildActivityEnd(sessionId: string, projectName: string, boundary: TurnBoundary): ActivityEndAction;
|
|
23
|
+
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/import/events/activity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlF,MAAM,WAAW,YAAY;IACzB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,YAAY,GACvB,mBAAmB,CAWrB;AAED,wBAAgB,gBAAgB,CAC5B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,YAAY,GACvB,iBAAiB,CAenB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Import activity_start / activity_end derivation.
|
|
4
|
+
*
|
|
5
|
+
* Behavior:
|
|
6
|
+
* - one activity_start + one activity_end per turn (host_inject continuations
|
|
7
|
+
* are filtered upstream — by the analytics-runner caller)
|
|
8
|
+
* - source: "user_prompt" (we cannot recover the original `pre_tool_use`
|
|
9
|
+
* fallback signal from transcript alone)
|
|
10
|
+
* - duration_ms on end = end_time - start_time
|
|
11
|
+
* - activity_id matches the analytics turn_id (parent foreign key)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.buildActivityStart = buildActivityStart;
|
|
15
|
+
exports.buildActivityEnd = buildActivityEnd;
|
|
16
|
+
const ids_1 = require("../ids");
|
|
17
|
+
function buildActivityStart(sessionId, projectName, boundary) {
|
|
18
|
+
const activityId = (0, ids_1.deriveActivityId)(sessionId, boundary.turnIndex, boundary.startTime);
|
|
19
|
+
return {
|
|
20
|
+
id: (0, ids_1.deriveActivityStartEventId)(sessionId, boundary.turnIndex),
|
|
21
|
+
type: "activity_start",
|
|
22
|
+
timestamp: Date.parse(boundary.startTime),
|
|
23
|
+
session_id: sessionId,
|
|
24
|
+
project_name: projectName,
|
|
25
|
+
activity_id: activityId,
|
|
26
|
+
source: "user_prompt",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function buildActivityEnd(sessionId, projectName, boundary) {
|
|
30
|
+
const activityId = (0, ids_1.deriveActivityId)(sessionId, boundary.turnIndex, boundary.startTime);
|
|
31
|
+
const startMs = Date.parse(boundary.startTime);
|
|
32
|
+
const endMs = Date.parse(boundary.endTime);
|
|
33
|
+
const durationMs = Number.isFinite(endMs) && Number.isFinite(startMs) ? endMs - startMs : 0;
|
|
34
|
+
return {
|
|
35
|
+
id: (0, ids_1.deriveActivityEndEventId)(sessionId, boundary.turnIndex),
|
|
36
|
+
type: "activity_end",
|
|
37
|
+
timestamp: Number.isFinite(endMs) ? endMs : startMs,
|
|
38
|
+
session_id: sessionId,
|
|
39
|
+
project_name: projectName,
|
|
40
|
+
activity_id: activityId,
|
|
41
|
+
duration: durationMs,
|
|
42
|
+
reason: "import",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/import/events/activity.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAcH,gDAeC;AAED,4CAmBC;AA/CD,gCAAgG;AAWhG,SAAgB,kBAAkB,CAC9B,SAAiB,EACjB,WAAmB,EACnB,QAAsB;IAEtB,MAAM,UAAU,GAAW,IAAA,sBAAgB,EAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/F,OAAO;QACH,EAAE,EAAE,IAAA,gCAA0B,EAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC;QAC7D,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QACzC,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,UAAU;QACvB,MAAM,EAAE,aAAa;KACxB,CAAC;AACN,CAAC;AAED,SAAgB,gBAAgB,CAC5B,SAAiB,EACjB,WAAmB,EACnB,QAAsB;IAEtB,MAAM,UAAU,GAAW,IAAA,sBAAgB,EAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,UAAU,GAAW,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,OAAO;QACH,EAAE,EAAE,IAAA,8BAAwB,EAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC;QAC3D,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;QACnD,UAAU,EAAE,SAAS;QACrB,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,QAAQ;KACnB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Import session_start / session_end derivation.
|
|
3
|
+
*
|
|
4
|
+
* Behavior:
|
|
5
|
+
* - timestamp from first/last transcript line
|
|
6
|
+
* - id from sha256("session_*:" + session_id)
|
|
7
|
+
* - one of each per transcript
|
|
8
|
+
*/
|
|
9
|
+
import { SessionStartAction, SessionEndAction } from "../../hooks/core/actions";
|
|
10
|
+
import { ImportTarget } from "../types";
|
|
11
|
+
/**
|
|
12
|
+
* Build a `session_start` event from import metadata. `client` is the
|
|
13
|
+
* upstream agent that produced the transcript ("claude", "cursor", …) —
|
|
14
|
+
* matches live mode where session-start hooks set the same field. Caller
|
|
15
|
+
* is the per-client runner (`claude/runner.ts`, `cursor/runner.ts`), so
|
|
16
|
+
* this stays generic.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildSessionStart(target: ImportTarget, client: string): SessionStartAction;
|
|
19
|
+
/**
|
|
20
|
+
* Build a `session_end` event. `endTimestampMs` and `endReason` come from
|
|
21
|
+
* the transcript tail (last-line timestamp and summary line if present).
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildSessionEnd(target: ImportTarget, endTimestampMs: number, endReason: string): SessionEndAction;
|
|
24
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/import/events/session.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAU1F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,MAAM,EAAE,YAAY,EACpB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAClB,gBAAgB,CAUlB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Import session_start / session_end derivation.
|
|
4
|
+
*
|
|
5
|
+
* Behavior:
|
|
6
|
+
* - timestamp from first/last transcript line
|
|
7
|
+
* - id from sha256("session_*:" + session_id)
|
|
8
|
+
* - one of each per transcript
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.buildSessionStart = buildSessionStart;
|
|
12
|
+
exports.buildSessionEnd = buildSessionEnd;
|
|
13
|
+
const ids_1 = require("../ids");
|
|
14
|
+
/**
|
|
15
|
+
* Build a `session_start` event from import metadata. `client` is the
|
|
16
|
+
* upstream agent that produced the transcript ("claude", "cursor", …) —
|
|
17
|
+
* matches live mode where session-start hooks set the same field. Caller
|
|
18
|
+
* is the per-client runner (`claude/runner.ts`, `cursor/runner.ts`), so
|
|
19
|
+
* this stays generic.
|
|
20
|
+
*/
|
|
21
|
+
function buildSessionStart(target, client) {
|
|
22
|
+
return {
|
|
23
|
+
id: (0, ids_1.deriveSessionStartEventId)(target.sessionId),
|
|
24
|
+
type: "session_start",
|
|
25
|
+
timestamp: target.sessionStartMs,
|
|
26
|
+
session_id: target.sessionId,
|
|
27
|
+
project_name: target.projectName,
|
|
28
|
+
client,
|
|
29
|
+
source: "import",
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build a `session_end` event. `endTimestampMs` and `endReason` come from
|
|
34
|
+
* the transcript tail (last-line timestamp and summary line if present).
|
|
35
|
+
*/
|
|
36
|
+
function buildSessionEnd(target, endTimestampMs, endReason) {
|
|
37
|
+
return {
|
|
38
|
+
id: (0, ids_1.deriveSessionEndEventId)(target.sessionId),
|
|
39
|
+
type: "session_end",
|
|
40
|
+
timestamp: endTimestampMs,
|
|
41
|
+
session_id: target.sessionId,
|
|
42
|
+
project_name: target.projectName,
|
|
43
|
+
reason: endReason,
|
|
44
|
+
duration: endTimestampMs - target.sessionStartMs,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/import/events/session.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAaH,8CAUC;AAMD,0CAcC;AAvCD,gCAA4E;AAE5E;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,MAAoB,EAAE,MAAc;IAClE,OAAO;QACH,EAAE,EAAE,IAAA,+BAAyB,EAAC,MAAM,CAAC,SAAS,CAAC;QAC/C,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,MAAM,CAAC,cAAc;QAChC,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,MAAM;QACN,MAAM,EAAE,QAAQ;KACnB,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAC3B,MAAoB,EACpB,cAAsB,EACtB,SAAiB;IAEjB,OAAO;QACH,EAAE,EAAE,IAAA,6BAAuB,EAAC,MAAM,CAAC,SAAS,CAAC;QAC7C,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC,cAAc;KACnD,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Import Module Time-Range Filter
|
|
3
|
+
*
|
|
4
|
+
* Two-pass filter:
|
|
5
|
+
* 1. mtime — drop transcripts whose `mtimeMs` falls outside [from, to].
|
|
6
|
+
* Already filtered at discovery time (statSync), so no extra I/O here.
|
|
7
|
+
* 2. session-start timestamp — drop transcripts whose first-line
|
|
8
|
+
* `timestamp` is outside the window. Already on the target (read at
|
|
9
|
+
* discovery time), so this step is also pure logic.
|
|
10
|
+
*
|
|
11
|
+
* Also exports `parseSinceDuration` for `--since 30d` / `2w` / `6m` style
|
|
12
|
+
* inputs, and `parseIsoDate` for `--from` / `--to`.
|
|
13
|
+
*
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
16
|
+
import { ImportTarget, ImportTimeRange } from "./types";
|
|
17
|
+
/**
|
|
18
|
+
* Apply both passes. Targets whose mtime AND first-line timestamp both fall
|
|
19
|
+
* inside the window survive. Empty range (`null`) → no filter, all pass.
|
|
20
|
+
*
|
|
21
|
+
* The mtime check is the **outer** gate (we'd discover sessions whose mtime
|
|
22
|
+
* is in-range but whose start is out-of-range — those still pass mtime, fail
|
|
23
|
+
* start-timestamp). The start-timestamp check is the **inner** gate that
|
|
24
|
+
* makes `--from / --to` strict.
|
|
25
|
+
*/
|
|
26
|
+
export declare function applyTimeRange(targets: ImportTarget[], range: ImportTimeRange | null): ImportTarget[];
|
|
27
|
+
/**
|
|
28
|
+
* Parse `--since 30d` / `2w` / `6m` / `12h` into ms. Returns `null` when the
|
|
29
|
+
* input is malformed or zero/negative.
|
|
30
|
+
*
|
|
31
|
+
* Suffixes: `h` (hour), `d` (day), `w` (7-day week), `m` (30-day month).
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseSinceDuration(input: string): number | null;
|
|
34
|
+
/**
|
|
35
|
+
* Parse an ISO date string (`2025-04-15` or `2025-04-15T12:00:00Z`).
|
|
36
|
+
* Returns `null` when unparseable. Date-only inputs resolve to local
|
|
37
|
+
* midnight (matches the analytics `messages_by_date` convention).
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseIsoDate(input: string): number | null;
|
|
40
|
+
/** Build an `ImportTimeRange` from `--since` / `--from / --to` flags. */
|
|
41
|
+
export declare function buildTimeRange(opts: {
|
|
42
|
+
sinceMs?: number;
|
|
43
|
+
fromMs?: number;
|
|
44
|
+
toMs?: number;
|
|
45
|
+
nowMs: number;
|
|
46
|
+
}): ImportTimeRange | null;
|
|
47
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/import/filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAExD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,YAAY,EAAE,CAarG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB/D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGzD;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,GAAG,eAAe,GAAG,IAAI,CAQzB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Import Module Time-Range Filter
|
|
4
|
+
*
|
|
5
|
+
* Two-pass filter:
|
|
6
|
+
* 1. mtime — drop transcripts whose `mtimeMs` falls outside [from, to].
|
|
7
|
+
* Already filtered at discovery time (statSync), so no extra I/O here.
|
|
8
|
+
* 2. session-start timestamp — drop transcripts whose first-line
|
|
9
|
+
* `timestamp` is outside the window. Already on the target (read at
|
|
10
|
+
* discovery time), so this step is also pure logic.
|
|
11
|
+
*
|
|
12
|
+
* Also exports `parseSinceDuration` for `--since 30d` / `2w` / `6m` style
|
|
13
|
+
* inputs, and `parseIsoDate` for `--from` / `--to`.
|
|
14
|
+
*
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.applyTimeRange = applyTimeRange;
|
|
19
|
+
exports.parseSinceDuration = parseSinceDuration;
|
|
20
|
+
exports.parseIsoDate = parseIsoDate;
|
|
21
|
+
exports.buildTimeRange = buildTimeRange;
|
|
22
|
+
/**
|
|
23
|
+
* Apply both passes. Targets whose mtime AND first-line timestamp both fall
|
|
24
|
+
* inside the window survive. Empty range (`null`) → no filter, all pass.
|
|
25
|
+
*
|
|
26
|
+
* The mtime check is the **outer** gate (we'd discover sessions whose mtime
|
|
27
|
+
* is in-range but whose start is out-of-range — those still pass mtime, fail
|
|
28
|
+
* start-timestamp). The start-timestamp check is the **inner** gate that
|
|
29
|
+
* makes `--from / --to` strict.
|
|
30
|
+
*/
|
|
31
|
+
function applyTimeRange(targets, range) {
|
|
32
|
+
if (range === null) {
|
|
33
|
+
return targets;
|
|
34
|
+
}
|
|
35
|
+
return targets.filter((t) => {
|
|
36
|
+
if (t.mtimeMs < range.fromMs || t.mtimeMs > range.toMs) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (t.sessionStartMs < range.fromMs || t.sessionStartMs > range.toMs) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse `--since 30d` / `2w` / `6m` / `12h` into ms. Returns `null` when the
|
|
47
|
+
* input is malformed or zero/negative.
|
|
48
|
+
*
|
|
49
|
+
* Suffixes: `h` (hour), `d` (day), `w` (7-day week), `m` (30-day month).
|
|
50
|
+
*/
|
|
51
|
+
function parseSinceDuration(input) {
|
|
52
|
+
const m = input.match(/^(\d+)([hdwm])$/);
|
|
53
|
+
if (m === null) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const value = parseInt(m[1], 10);
|
|
57
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const unit = m[2];
|
|
61
|
+
const HOUR_MS = 60 * 60 * 1000;
|
|
62
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
63
|
+
switch (unit) {
|
|
64
|
+
case "h": return value * HOUR_MS;
|
|
65
|
+
case "d": return value * DAY_MS;
|
|
66
|
+
case "w": return value * 7 * DAY_MS;
|
|
67
|
+
case "m": return value * 30 * DAY_MS;
|
|
68
|
+
default: return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Parse an ISO date string (`2025-04-15` or `2025-04-15T12:00:00Z`).
|
|
73
|
+
* Returns `null` when unparseable. Date-only inputs resolve to local
|
|
74
|
+
* midnight (matches the analytics `messages_by_date` convention).
|
|
75
|
+
*/
|
|
76
|
+
function parseIsoDate(input) {
|
|
77
|
+
const ts = Date.parse(input);
|
|
78
|
+
return Number.isFinite(ts) ? ts : null;
|
|
79
|
+
}
|
|
80
|
+
/** Build an `ImportTimeRange` from `--since` / `--from / --to` flags. */
|
|
81
|
+
function buildTimeRange(opts) {
|
|
82
|
+
if (opts.sinceMs !== undefined) {
|
|
83
|
+
return { fromMs: opts.nowMs - opts.sinceMs, toMs: opts.nowMs };
|
|
84
|
+
}
|
|
85
|
+
if (opts.fromMs !== undefined) {
|
|
86
|
+
return { fromMs: opts.fromMs, toMs: opts.toMs ?? opts.nowMs };
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/import/filter.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAaH,wCAaC;AAQD,gDAmBC;AAOD,oCAGC;AAGD,wCAaC;AA3ED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAAC,OAAuB,EAAE,KAA6B;IACjF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAe,EAAW,EAAE;QAC/C,IAAI,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YACnE,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,KAAa;IAC5C,MAAM,CAAC,GAA4B,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAW,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,IAAI,GAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAW,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,MAAM,GAAW,EAAE,GAAG,OAAO,CAAC;IACpC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,CAAC,OAAO,KAAK,GAAG,OAAO,CAAC;QACjC,KAAK,GAAG,CAAC,CAAC,OAAO,KAAK,GAAG,MAAM,CAAC;QAChC,KAAK,GAAG,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC;QACpC,KAAK,GAAG,CAAC,CAAC,OAAO,KAAK,GAAG,EAAE,GAAG,MAAM,CAAC;QACrC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACzB,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,KAAa;IACtC,MAAM,EAAE,GAAW,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED,yEAAyE;AACzE,SAAgB,cAAc,CAAC,IAK9B;IACG,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACnE,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Import Module Deterministic UUID Derivers
|
|
3
|
+
*
|
|
4
|
+
* Every event emitted by `ironbee import` carries a UUID-shaped `id` derived
|
|
5
|
+
* deterministically from the transcript content (session_id + per-event
|
|
6
|
+
* positional key). Re-running import on the same transcript produces the
|
|
7
|
+
* same ids, so collector-side dedup on `(session_id, id)` collapses
|
|
8
|
+
* duplicates without coordination.
|
|
9
|
+
*
|
|
10
|
+
* Analytics events have their own deriver in `src/analytics/projection.ts`
|
|
11
|
+
* (`deriveSessionAnalyticsEventId`, `deriveTurnEventId`, `deriveStepEventId`).
|
|
12
|
+
* This module covers the non-analytics import-emitted events: session,
|
|
13
|
+
* activity, tool_call, file_change.
|
|
14
|
+
*
|
|
15
|
+
* All formulas: `formatHexAsUuid(sha256("<event_type>:" + session_id + ":"
|
|
16
|
+
* + <positional_key>))` — positional key is `turn_index` for activity ids
|
|
17
|
+
* and `tool_use.id` for tool_call / file_change. Same `(transcript content,
|
|
18
|
+
* session_id)` always produces the same UUID.
|
|
19
|
+
*/
|
|
20
|
+
export declare function deriveSessionStartEventId(sessionId: string): string;
|
|
21
|
+
export declare function deriveSessionEndEventId(sessionId: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Activity (turn) ids. `turnIndex` is the analytics-side `turn_index` (1-based,
|
|
24
|
+
* positional in the transcript). Activity is one-per-user-turn: host_inject
|
|
25
|
+
* continuation turns are filtered out before we ever derive an id, so there
|
|
26
|
+
* are no gaps from the import emitter's perspective.
|
|
27
|
+
*/
|
|
28
|
+
export declare function deriveActivityStartEventId(sessionId: string, turnIndex: number): string;
|
|
29
|
+
export declare function deriveActivityEndEventId(sessionId: string, turnIndex: number): string;
|
|
30
|
+
/**
|
|
31
|
+
/**
|
|
32
|
+
* Activity-id (the `activity_id` foreign key carried by child events).
|
|
33
|
+
*
|
|
34
|
+
* Format: UUID-shaped (8-4-4-4-12) — matches what live mode emits (live
|
|
35
|
+
* uses `randomUUID()` at the SessionStart hook, baked into `state.json`,
|
|
36
|
+
* then read by every PreToolUse). Backends that store `activity_id` as a
|
|
37
|
+
* UUID column accept both live and import values uniformly.
|
|
38
|
+
*
|
|
39
|
+
* Determinism: same `(session_id, turn_index, start_time)` tuple always
|
|
40
|
+
* produces the same UUID, so re-imports collide cleanly. Independent of
|
|
41
|
+
* `session_turn_analytics.turn_id` (which keeps its 16-char hex form per
|
|
42
|
+
* analytics spec) — they're separate identifiers for related-but-distinct
|
|
43
|
+
* concepts (hook-runtime activity vs. analytics-projection turn).
|
|
44
|
+
*/
|
|
45
|
+
export declare function deriveActivityId(sessionId: string, turnIndex: number, startTime: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Default tool_call event id when `_metadata.toolCallId` is absent (transcript
|
|
48
|
+
* predates the `_metadata.toolCallId` convention). Falls back to a
|
|
49
|
+
* deterministic derivation from the host's `tool_use.id`. For transcripts
|
|
50
|
+
* that DO carry `_metadata.toolCallId`, the import emitter uses that
|
|
51
|
+
* UUID verbatim instead — collapses cleanly with the live MCP-shipped
|
|
52
|
+
* event id on the collector.
|
|
53
|
+
*/
|
|
54
|
+
export declare function deriveToolCallEventIdFromToolUseId(sessionId: string, toolUseId: string): string;
|
|
55
|
+
export declare function deriveFileChangeEventId(sessionId: string, toolUseId: string): string;
|
|
56
|
+
//# sourceMappingURL=ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/import/ids.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAErF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhG;AAED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/F;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Import Module Deterministic UUID Derivers
|
|
4
|
+
*
|
|
5
|
+
* Every event emitted by `ironbee import` carries a UUID-shaped `id` derived
|
|
6
|
+
* deterministically from the transcript content (session_id + per-event
|
|
7
|
+
* positional key). Re-running import on the same transcript produces the
|
|
8
|
+
* same ids, so collector-side dedup on `(session_id, id)` collapses
|
|
9
|
+
* duplicates without coordination.
|
|
10
|
+
*
|
|
11
|
+
* Analytics events have their own deriver in `src/analytics/projection.ts`
|
|
12
|
+
* (`deriveSessionAnalyticsEventId`, `deriveTurnEventId`, `deriveStepEventId`).
|
|
13
|
+
* This module covers the non-analytics import-emitted events: session,
|
|
14
|
+
* activity, tool_call, file_change.
|
|
15
|
+
*
|
|
16
|
+
* All formulas: `formatHexAsUuid(sha256("<event_type>:" + session_id + ":"
|
|
17
|
+
* + <positional_key>))` — positional key is `turn_index` for activity ids
|
|
18
|
+
* and `tool_use.id` for tool_call / file_change. Same `(transcript content,
|
|
19
|
+
* session_id)` always produces the same UUID.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.deriveSessionStartEventId = deriveSessionStartEventId;
|
|
23
|
+
exports.deriveSessionEndEventId = deriveSessionEndEventId;
|
|
24
|
+
exports.deriveActivityStartEventId = deriveActivityStartEventId;
|
|
25
|
+
exports.deriveActivityEndEventId = deriveActivityEndEventId;
|
|
26
|
+
exports.deriveActivityId = deriveActivityId;
|
|
27
|
+
exports.deriveToolCallEventIdFromToolUseId = deriveToolCallEventIdFromToolUseId;
|
|
28
|
+
exports.deriveFileChangeEventId = deriveFileChangeEventId;
|
|
29
|
+
const crypto_1 = require("crypto");
|
|
30
|
+
const projection_1 = require("../analytics/projection");
|
|
31
|
+
/** SHA-256 the input and format the first 32 hex chars as a UUID. */
|
|
32
|
+
function sha256Uuid(input) {
|
|
33
|
+
const hex32 = (0, crypto_1.createHash)("sha256").update(input).digest("hex").slice(0, 32);
|
|
34
|
+
return (0, projection_1.formatHexAsUuid)(hex32);
|
|
35
|
+
}
|
|
36
|
+
function deriveSessionStartEventId(sessionId) {
|
|
37
|
+
return sha256Uuid(`session_start:${sessionId}`);
|
|
38
|
+
}
|
|
39
|
+
function deriveSessionEndEventId(sessionId) {
|
|
40
|
+
return sha256Uuid(`session_end:${sessionId}`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Activity (turn) ids. `turnIndex` is the analytics-side `turn_index` (1-based,
|
|
44
|
+
* positional in the transcript). Activity is one-per-user-turn: host_inject
|
|
45
|
+
* continuation turns are filtered out before we ever derive an id, so there
|
|
46
|
+
* are no gaps from the import emitter's perspective.
|
|
47
|
+
*/
|
|
48
|
+
function deriveActivityStartEventId(sessionId, turnIndex) {
|
|
49
|
+
return sha256Uuid(`activity_start:${sessionId}:${turnIndex}`);
|
|
50
|
+
}
|
|
51
|
+
function deriveActivityEndEventId(sessionId, turnIndex) {
|
|
52
|
+
return sha256Uuid(`activity_end:${sessionId}:${turnIndex}`);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
/**
|
|
56
|
+
* Activity-id (the `activity_id` foreign key carried by child events).
|
|
57
|
+
*
|
|
58
|
+
* Format: UUID-shaped (8-4-4-4-12) — matches what live mode emits (live
|
|
59
|
+
* uses `randomUUID()` at the SessionStart hook, baked into `state.json`,
|
|
60
|
+
* then read by every PreToolUse). Backends that store `activity_id` as a
|
|
61
|
+
* UUID column accept both live and import values uniformly.
|
|
62
|
+
*
|
|
63
|
+
* Determinism: same `(session_id, turn_index, start_time)` tuple always
|
|
64
|
+
* produces the same UUID, so re-imports collide cleanly. Independent of
|
|
65
|
+
* `session_turn_analytics.turn_id` (which keeps its 16-char hex form per
|
|
66
|
+
* analytics spec) — they're separate identifiers for related-but-distinct
|
|
67
|
+
* concepts (hook-runtime activity vs. analytics-projection turn).
|
|
68
|
+
*/
|
|
69
|
+
function deriveActivityId(sessionId, turnIndex, startTime) {
|
|
70
|
+
const hex32 = (0, crypto_1.createHash)("sha256").update(`${sessionId}|${turnIndex}|${startTime}`).digest("hex").slice(0, 32);
|
|
71
|
+
return (0, projection_1.formatHexAsUuid)(hex32);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Default tool_call event id when `_metadata.toolCallId` is absent (transcript
|
|
75
|
+
* predates the `_metadata.toolCallId` convention). Falls back to a
|
|
76
|
+
* deterministic derivation from the host's `tool_use.id`. For transcripts
|
|
77
|
+
* that DO carry `_metadata.toolCallId`, the import emitter uses that
|
|
78
|
+
* UUID verbatim instead — collapses cleanly with the live MCP-shipped
|
|
79
|
+
* event id on the collector.
|
|
80
|
+
*/
|
|
81
|
+
function deriveToolCallEventIdFromToolUseId(sessionId, toolUseId) {
|
|
82
|
+
return sha256Uuid(`tool_call:${sessionId}:${toolUseId}`);
|
|
83
|
+
}
|
|
84
|
+
function deriveFileChangeEventId(sessionId, toolUseId) {
|
|
85
|
+
return sha256Uuid(`file_change:${sessionId}:${toolUseId}`);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/import/ids.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;AAWH,8DAEC;AAED,0DAEC;AAQD,gEAEC;AAED,4DAEC;AAiBD,4CAGC;AAUD,gFAEC;AAED,0DAEC;AAjED,mCAAoC;AACpC,wDAA0D;AAE1D,qEAAqE;AACrE,SAAS,UAAU,CAAC,KAAa;IAC7B,MAAM,KAAK,GAAW,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,yBAAyB,CAAC,SAAiB;IACvD,OAAO,UAAU,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,uBAAuB,CAAC,SAAiB;IACrD,OAAO,UAAU,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,0BAA0B,CAAC,SAAiB,EAAE,SAAiB;IAC3E,OAAO,UAAU,CAAC,kBAAkB,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,wBAAwB,CAAC,SAAiB,EAAE,SAAiB;IACzE,OAAO,UAAU,CAAC,gBAAgB,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,gBAAgB,CAAC,SAAiB,EAAE,SAAiB,EAAE,SAAiB;IACpF,MAAM,KAAK,GAAW,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvH,OAAO,IAAA,4BAAe,EAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kCAAkC,CAAC,SAAiB,EAAE,SAAiB;IACnF,OAAO,UAAU,CAAC,aAAa,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAgB,uBAAuB,CAAC,SAAiB,EAAE,SAAiB;IACxE,OAAO,UAAU,CAAC,eAAe,SAAS,IAAI,SAAS,EAAE,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Import Module Public Barrel
|
|
3
|
+
*
|
|
4
|
+
* Exposes ONLY the client-agnostic API. Client-specific modules
|
|
5
|
+
* (`claude/**`, future `cursor/**`) are NOT re-exported here —
|
|
6
|
+
* `commands/import.ts` and any other consumer must go through the
|
|
7
|
+
* generic dispatcher in `pipeline.ts` so adding a new client never
|
|
8
|
+
* forces a CLI change.
|
|
9
|
+
*
|
|
10
|
+
* Public surface:
|
|
11
|
+
* - findTranscripts(scope) — discovery (dispatched per client)
|
|
12
|
+
* - estimateImport(opts) — dry-run estimator (dispatched per client)
|
|
13
|
+
* - importSession(opts) — per-session driver (dispatched per client)
|
|
14
|
+
* - applyTimeRange / parseSinceDuration / parseIsoDate / buildTimeRange — generic
|
|
15
|
+
* - shouldSkip — generic skip rule
|
|
16
|
+
* - writeImportMarker / readImportMarker — generic marker file R/W
|
|
17
|
+
* - postEvents — generic collector POST helper
|
|
18
|
+
* - ProgressReporter — generic progress UI
|
|
19
|
+
* - All `Import*` types
|
|
20
|
+
*/
|
|
21
|
+
export { findTranscripts, estimateImport, importSession, ImportSessionOpts, EstimateOpts } from "./pipeline";
|
|
22
|
+
export { runConcurrentPool, ConcurrentPoolOpts } from "./concurrent-pool";
|
|
23
|
+
export { applyTimeRange, parseSinceDuration, parseIsoDate, buildTimeRange } from "./filter";
|
|
24
|
+
export { shouldSkip } from "./skip";
|
|
25
|
+
export { writeImportMarker, readImportMarker, MARKER_SCHEMA_VERSION, markerPath } from "./marker";
|
|
26
|
+
export { postEvents, EmitterOpts } from "./emitter";
|
|
27
|
+
export { ProgressReporter } from "./progress";
|
|
28
|
+
export { ImportEventCounts, ImportMarker, ImportOptions, ImportProjectSummary, ImportResult, ImportScope, ImportSummary, ImportTarget, ImportTimeRange, DerivedEvent, emptyEventCounts, } from "./types";
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/import/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG7G,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAClG,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,GACnB,MAAM,SAAS,CAAC"}
|