@ironbee-ai/cli 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/dist/analytics/{emit.d.ts → claude/emit.d.ts} +1 -1
- package/dist/analytics/claude/emit.d.ts.map +1 -0
- package/dist/analytics/{emit.js → claude/emit.js} +34 -7
- package/dist/analytics/claude/emit.js.map +1 -0
- package/dist/analytics/{hook-trigger.d.ts → claude/hook-trigger.d.ts} +1 -1
- package/dist/analytics/claude/hook-trigger.d.ts.map +1 -0
- package/dist/analytics/{hook-trigger.js → claude/hook-trigger.js} +2 -2
- package/dist/analytics/claude/hook-trigger.js.map +1 -0
- package/dist/analytics/claude/log.d.ts.map +1 -0
- package/dist/analytics/{log.js → claude/log.js} +1 -1
- package/dist/analytics/claude/log.js.map +1 -0
- package/dist/analytics/{merge.d.ts → claude/merge.d.ts} +2 -1
- package/dist/analytics/claude/merge.d.ts.map +1 -0
- package/dist/analytics/{merge.js → claude/merge.js} +13 -1
- package/dist/analytics/claude/merge.js.map +1 -0
- package/dist/analytics/{pricing.d.ts → claude/pricing.d.ts} +1 -13
- package/dist/analytics/claude/pricing.d.ts.map +1 -0
- package/dist/analytics/{pricing.js → claude/pricing.js} +6 -14
- package/dist/analytics/claude/pricing.js.map +1 -0
- package/dist/analytics/{projection.d.ts → claude/projection.d.ts} +31 -7
- package/dist/analytics/claude/projection.d.ts.map +1 -0
- package/dist/analytics/{projection.js → claude/projection.js} +631 -327
- package/dist/analytics/claude/projection.js.map +1 -0
- package/dist/analytics/{spawn.d.ts → claude/spawn.d.ts} +4 -4
- package/dist/analytics/claude/spawn.d.ts.map +1 -0
- package/dist/analytics/{spawn.js → claude/spawn.js} +4 -3
- package/dist/analytics/claude/spawn.js.map +1 -0
- package/dist/analytics/{state.d.ts → claude/state.d.ts} +1 -1
- package/dist/analytics/claude/state.d.ts.map +1 -0
- package/dist/analytics/{state.js → claude/state.js} +2 -2
- package/dist/analytics/claude/state.js.map +1 -0
- package/dist/analytics/claude/transcript.d.ts.map +1 -0
- package/dist/analytics/{transcript.js → claude/transcript.js} +1 -1
- package/dist/analytics/claude/transcript.js.map +1 -0
- package/dist/analytics/codex/api-request.d.ts +108 -0
- package/dist/analytics/codex/api-request.d.ts.map +1 -0
- package/dist/analytics/codex/api-request.js +155 -0
- package/dist/analytics/codex/api-request.js.map +1 -0
- package/dist/analytics/codex/apply-patch.d.ts +21 -0
- package/dist/analytics/codex/apply-patch.d.ts.map +1 -0
- package/dist/analytics/codex/apply-patch.js +49 -0
- package/dist/analytics/codex/apply-patch.js.map +1 -0
- package/dist/analytics/codex/classifier.d.ts +28 -0
- package/dist/analytics/codex/classifier.d.ts.map +1 -0
- package/dist/analytics/codex/classifier.js +111 -0
- package/dist/analytics/codex/classifier.js.map +1 -0
- package/dist/analytics/codex/emit.d.ts +47 -0
- package/dist/analytics/codex/emit.d.ts.map +1 -0
- package/dist/analytics/codex/emit.js +158 -0
- package/dist/analytics/codex/emit.js.map +1 -0
- package/dist/analytics/codex/events-emit.d.ts +62 -0
- package/dist/analytics/codex/events-emit.d.ts.map +1 -0
- package/dist/analytics/codex/events-emit.js +555 -0
- package/dist/analytics/codex/events-emit.js.map +1 -0
- package/dist/analytics/codex/pricing.d.ts +57 -0
- package/dist/analytics/codex/pricing.d.ts.map +1 -0
- package/dist/analytics/codex/pricing.js +125 -0
- package/dist/analytics/codex/pricing.js.map +1 -0
- package/dist/analytics/codex/projection.d.ts +51 -0
- package/dist/analytics/codex/projection.d.ts.map +1 -0
- package/dist/analytics/codex/projection.js +1477 -0
- package/dist/analytics/codex/projection.js.map +1 -0
- package/dist/analytics/codex/spawn.d.ts +27 -0
- package/dist/analytics/codex/spawn.d.ts.map +1 -0
- package/dist/analytics/codex/spawn.js +64 -0
- package/dist/analytics/codex/spawn.js.map +1 -0
- package/dist/analytics/codex/status-snapshot.d.ts +80 -0
- package/dist/analytics/codex/status-snapshot.d.ts.map +1 -0
- package/dist/analytics/codex/status-snapshot.js +206 -0
- package/dist/analytics/codex/status-snapshot.js.map +1 -0
- package/dist/analytics/codex/transcript.d.ts +51 -0
- package/dist/analytics/codex/transcript.d.ts.map +1 -0
- package/dist/analytics/codex/transcript.js +134 -0
- package/dist/analytics/codex/transcript.js.map +1 -0
- package/dist/analytics/codex/types.d.ts +253 -0
- package/dist/analytics/codex/types.d.ts.map +1 -0
- package/dist/analytics/codex/types.js +29 -0
- package/dist/analytics/codex/types.js.map +1 -0
- package/dist/analytics/shared/classifier.d.ts.map +1 -0
- package/dist/analytics/{classifier.js → shared/classifier.js} +9 -0
- package/dist/analytics/shared/classifier.js.map +1 -0
- package/dist/analytics/shared/errors.d.ts.map +1 -0
- package/dist/analytics/shared/errors.js.map +1 -0
- package/dist/analytics/shared/tokens.d.ts +14 -0
- package/dist/analytics/shared/tokens.d.ts.map +1 -0
- package/dist/analytics/shared/tokens.js +17 -0
- package/dist/analytics/shared/tokens.js.map +1 -0
- package/dist/analytics/{types.d.ts → shared/types.d.ts} +42 -9
- package/dist/analytics/shared/types.d.ts.map +1 -0
- package/dist/analytics/shared/types.js.map +1 -0
- package/dist/clients/base.d.ts +9 -0
- package/dist/clients/base.d.ts.map +1 -1
- package/dist/clients/claude/hooks/activity-end.js +1 -1
- package/dist/clients/claude/hooks/activity-end.js.map +1 -1
- package/dist/clients/claude/hooks/activity-start.js +1 -1
- package/dist/clients/claude/hooks/activity-start.js.map +1 -1
- package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
- package/dist/clients/claude/hooks/clear-verdict.js +14 -0
- package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-end.js +7 -1
- 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 +7 -1
- package/dist/clients/claude/hooks/session-start.js.map +1 -1
- package/dist/clients/claude/hooks/session-status.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-status.js +13 -9
- package/dist/clients/claude/hooks/session-status.js.map +1 -1
- package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
- package/dist/clients/claude/hooks/track-action.js +26 -1
- 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 +8 -1
- package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
- package/dist/clients/claude/index.d.ts +1 -0
- package/dist/clients/claude/index.d.ts.map +1 -1
- package/dist/clients/claude/index.js +7 -0
- package/dist/clients/claude/index.js.map +1 -1
- package/dist/clients/claude/util.d.ts.map +1 -1
- package/dist/clients/claude/util.js +55 -0
- package/dist/clients/claude/util.js.map +1 -1
- package/dist/clients/codex/commands/ironbee-verify/SKILL.md +58 -0
- package/dist/clients/codex/hooks/activity-end.d.ts +9 -0
- package/dist/clients/codex/hooks/activity-end.d.ts.map +1 -0
- package/dist/clients/codex/hooks/activity-end.js +65 -0
- package/dist/clients/codex/hooks/activity-end.js.map +1 -0
- package/dist/clients/codex/hooks/activity-start.d.ts +17 -0
- package/dist/clients/codex/hooks/activity-start.d.ts.map +1 -0
- package/dist/clients/codex/hooks/activity-start.js +38 -0
- package/dist/clients/codex/hooks/activity-start.js.map +1 -0
- package/dist/clients/codex/hooks/clear-verdict.d.ts +55 -0
- package/dist/clients/codex/hooks/clear-verdict.d.ts.map +1 -0
- package/dist/clients/codex/hooks/clear-verdict.js +299 -0
- package/dist/clients/codex/hooks/clear-verdict.js.map +1 -0
- package/dist/clients/codex/hooks/require-verdict.d.ts +30 -0
- package/dist/clients/codex/hooks/require-verdict.d.ts.map +1 -0
- package/dist/clients/codex/hooks/require-verdict.js +109 -0
- package/dist/clients/codex/hooks/require-verdict.js.map +1 -0
- package/dist/clients/codex/hooks/require-verification.d.ts +12 -0
- package/dist/clients/codex/hooks/require-verification.d.ts.map +1 -0
- package/dist/clients/codex/hooks/require-verification.js +136 -0
- package/dist/clients/codex/hooks/require-verification.js.map +1 -0
- package/dist/clients/codex/hooks/session-start.d.ts +10 -0
- package/dist/clients/codex/hooks/session-start.d.ts.map +1 -0
- package/dist/clients/codex/hooks/session-start.js +94 -0
- package/dist/clients/codex/hooks/session-start.js.map +1 -0
- package/dist/clients/codex/hooks/track-action-monitor.d.ts +10 -0
- package/dist/clients/codex/hooks/track-action-monitor.d.ts.map +1 -0
- package/dist/clients/codex/hooks/track-action-monitor.js +168 -0
- package/dist/clients/codex/hooks/track-action-monitor.js.map +1 -0
- package/dist/clients/codex/hooks/track-action-pre.d.ts +18 -0
- package/dist/clients/codex/hooks/track-action-pre.d.ts.map +1 -0
- package/dist/clients/codex/hooks/track-action-pre.js +35 -0
- package/dist/clients/codex/hooks/track-action-pre.js.map +1 -0
- package/dist/clients/codex/hooks/track-action.d.ts +22 -0
- package/dist/clients/codex/hooks/track-action.d.ts.map +1 -0
- package/dist/clients/codex/hooks/track-action.js +350 -0
- package/dist/clients/codex/hooks/track-action.js.map +1 -0
- package/dist/clients/codex/hooks/verify-gate.d.ts +15 -0
- package/dist/clients/codex/hooks/verify-gate.d.ts.map +1 -0
- package/dist/clients/codex/hooks/verify-gate.js +105 -0
- package/dist/clients/codex/hooks/verify-gate.js.map +1 -0
- package/dist/clients/codex/index.d.ts +42 -0
- package/dist/clients/codex/index.d.ts.map +1 -0
- package/dist/clients/codex/index.js +427 -0
- package/dist/clients/codex/index.js.map +1 -0
- package/dist/clients/codex/platforms/command-verify.backend.md +108 -0
- package/dist/clients/codex/platforms/command-verify.browser.md +108 -0
- package/dist/clients/codex/platforms/command-verify.node.md +61 -0
- package/dist/clients/codex/platforms/rule.backend.md +32 -0
- package/dist/clients/codex/platforms/rule.browser.md +17 -0
- package/dist/clients/codex/platforms/rule.node.md +28 -0
- package/dist/clients/codex/platforms/skill.backend.md +95 -0
- package/dist/clients/codex/platforms/skill.browser.md +28 -0
- package/dist/clients/codex/platforms/skill.node.md +62 -0
- package/dist/clients/codex/rules/ironbee-verification.md +48 -0
- package/dist/clients/codex/skills/ironbee-verification.md +80 -0
- package/dist/clients/codex/util.d.ts +193 -0
- package/dist/clients/codex/util.d.ts.map +1 -0
- package/dist/clients/codex/util.js +784 -0
- package/dist/clients/codex/util.js.map +1 -0
- package/dist/clients/cursor/hooks/activity-end.js +1 -1
- package/dist/clients/cursor/hooks/activity-end.js.map +1 -1
- package/dist/clients/cursor/hooks/clear-verdict.d.ts +5 -2
- package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/clear-verdict.js +12 -3
- package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/cursor/hooks/session-end.js +1 -1
- package/dist/clients/cursor/hooks/session-end.js.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/verify-gate.js +6 -1
- package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
- package/dist/clients/cursor/index.d.ts +1 -0
- package/dist/clients/cursor/index.d.ts.map +1 -1
- package/dist/clients/cursor/index.js +13 -0
- package/dist/clients/cursor/index.js.map +1 -1
- package/dist/clients/registry.d.ts.map +1 -1
- package/dist/clients/registry.js +2 -1
- package/dist/clients/registry.js.map +1 -1
- package/dist/commands/{claude.d.ts → claude/index.d.ts} +1 -1
- package/dist/commands/claude/index.d.ts.map +1 -0
- package/dist/commands/{claude.js → claude/index.js} +12 -6
- package/dist/commands/claude/index.js.map +1 -0
- package/dist/commands/{otel.d.ts → claude/otel.d.ts} +5 -1
- package/dist/commands/claude/otel.d.ts.map +1 -0
- package/dist/commands/{otel.js → claude/otel.js} +9 -5
- package/dist/commands/claude/otel.js.map +1 -0
- package/dist/commands/claude/process-analytics.d.ts +19 -0
- package/dist/commands/claude/process-analytics.d.ts.map +1 -0
- package/dist/commands/{process-analytics.js → claude/process-analytics.js} +16 -15
- package/dist/commands/claude/process-analytics.js.map +1 -0
- package/dist/commands/{statusline-toggle.d.ts → claude/statusline-toggle.d.ts} +2 -2
- package/dist/commands/claude/statusline-toggle.d.ts.map +1 -0
- package/dist/commands/{statusline-toggle.js → claude/statusline-toggle.js} +8 -8
- package/dist/commands/claude/statusline-toggle.js.map +1 -0
- package/dist/commands/{statusline.d.ts → claude/statusline.d.ts} +1 -1
- package/dist/commands/claude/statusline.d.ts.map +1 -0
- package/dist/commands/{statusline.js → claude/statusline.js} +4 -4
- package/dist/commands/claude/statusline.js.map +1 -0
- package/dist/commands/codex/index.d.ts +11 -0
- package/dist/commands/codex/index.d.ts.map +1 -0
- package/dist/commands/codex/index.js +17 -0
- package/dist/commands/codex/index.js.map +1 -0
- package/dist/commands/codex/process-analytics.d.ts +14 -0
- package/dist/commands/codex/process-analytics.d.ts.map +1 -0
- package/dist/commands/codex/process-analytics.js +111 -0
- package/dist/commands/codex/process-analytics.js.map +1 -0
- package/dist/commands/hook.js +12 -0
- package/dist/commands/hook.js.map +1 -1
- package/dist/commands/import.js +3 -3
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/queue.js +3 -1
- package/dist/commands/queue.js.map +1 -1
- package/dist/hooks/core/actions.d.ts +17 -1
- package/dist/hooks/core/actions.d.ts.map +1 -1
- package/dist/hooks/core/actions.js +13 -0
- package/dist/hooks/core/actions.js.map +1 -1
- package/dist/hooks/core/activity-end.d.ts.map +1 -1
- package/dist/hooks/core/activity-end.js +4 -0
- package/dist/hooks/core/activity-end.js.map +1 -1
- package/dist/hooks/core/session-state.d.ts +15 -1
- package/dist/hooks/core/session-state.d.ts.map +1 -1
- package/dist/hooks/core/session-state.js +102 -7
- package/dist/hooks/core/session-state.js.map +1 -1
- package/dist/import/claude/analytics-runner.d.ts +1 -1
- package/dist/import/claude/analytics-runner.d.ts.map +1 -1
- package/dist/import/claude/analytics-runner.js +5 -5
- package/dist/import/claude/analytics-runner.js.map +1 -1
- package/dist/import/claude/auth-mode.d.ts +1 -1
- package/dist/import/claude/auth-mode.d.ts.map +1 -1
- package/dist/import/claude/discovery.js +1 -1
- package/dist/import/claude/discovery.js.map +1 -1
- package/dist/import/claude/encoding.js +1 -1
- package/dist/import/claude/encoding.js.map +1 -1
- package/dist/import/claude/events/file-change.d.ts +10 -1
- package/dist/import/claude/events/file-change.d.ts.map +1 -1
- package/dist/import/claude/events/file-change.js +79 -5
- package/dist/import/claude/events/file-change.js.map +1 -1
- package/dist/import/claude/events/tool-call.d.ts +16 -1
- package/dist/import/claude/events/tool-call.d.ts.map +1 -1
- package/dist/import/claude/events/tool-call.js +122 -15
- package/dist/import/claude/events/tool-call.js.map +1 -1
- package/dist/import/claude/runner.d.ts.map +1 -1
- package/dist/import/claude/runner.js +45 -3
- package/dist/import/claude/runner.js.map +1 -1
- package/dist/import/claude/summary.js +1 -1
- package/dist/import/claude/summary.js.map +1 -1
- package/dist/import/claude/transcript-walk.d.ts +1 -1
- package/dist/import/claude/transcript-walk.d.ts.map +1 -1
- package/dist/import/claude/transcript-walk.js +11 -4
- package/dist/import/claude/transcript-walk.js.map +1 -1
- package/dist/import/codex/analytics-runner.d.ts +46 -0
- package/dist/import/codex/analytics-runner.d.ts.map +1 -0
- package/dist/import/codex/analytics-runner.js +116 -0
- package/dist/import/codex/analytics-runner.js.map +1 -0
- package/dist/import/codex/discovery.d.ts +33 -0
- package/dist/import/codex/discovery.d.ts.map +1 -0
- package/dist/import/codex/discovery.js +202 -0
- package/dist/import/codex/discovery.js.map +1 -0
- package/dist/import/codex/events/file-change.d.ts +42 -0
- package/dist/import/codex/events/file-change.d.ts.map +1 -0
- package/dist/import/codex/events/file-change.js +125 -0
- package/dist/import/codex/events/file-change.js.map +1 -0
- package/dist/import/codex/events/tool-call.d.ts +49 -0
- package/dist/import/codex/events/tool-call.d.ts.map +1 -0
- package/dist/import/codex/events/tool-call.js +151 -0
- package/dist/import/codex/events/tool-call.js.map +1 -0
- package/dist/import/codex/runner.d.ts +34 -0
- package/dist/import/codex/runner.d.ts.map +1 -0
- package/dist/import/codex/runner.js +456 -0
- package/dist/import/codex/runner.js.map +1 -0
- package/dist/import/codex/summary.d.ts +20 -0
- package/dist/import/codex/summary.d.ts.map +1 -0
- package/dist/import/codex/summary.js +206 -0
- package/dist/import/codex/summary.js.map +1 -0
- package/dist/import/events/activity.d.ts.map +1 -1
- package/dist/import/events/activity.js +17 -2
- package/dist/import/events/activity.js.map +1 -1
- package/dist/import/events/session.d.ts +11 -1
- package/dist/import/events/session.d.ts.map +1 -1
- package/dist/import/events/session.js +19 -1
- package/dist/import/events/session.js.map +1 -1
- package/dist/import/ids.js +3 -3
- package/dist/import/ids.js.map +1 -1
- package/dist/import/pipeline.d.ts +22 -15
- package/dist/import/pipeline.d.ts.map +1 -1
- package/dist/import/pipeline.js +99 -18
- package/dist/import/pipeline.js.map +1 -1
- package/dist/import/types.d.ts +4 -0
- package/dist/import/types.d.ts.map +1 -1
- package/dist/import/types.js.map +1 -1
- package/dist/index.js +9 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/collector.d.ts +2 -1
- package/dist/lib/collector.d.ts.map +1 -1
- package/dist/lib/collector.js +28 -3
- package/dist/lib/collector.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/event.d.ts +18 -1
- package/dist/lib/event.d.ts.map +1 -1
- package/dist/lib/event.js +25 -1
- package/dist/lib/event.js.map +1 -1
- package/dist/lib/platform-section.d.ts.map +1 -1
- package/dist/lib/platform-section.js +8 -0
- package/dist/lib/platform-section.js.map +1 -1
- package/dist/otel/{context → claude/context}/build.d.ts +1 -1
- package/dist/otel/claude/context/build.d.ts.map +1 -0
- package/dist/otel/{context → claude/context}/build.js +3 -7
- package/dist/otel/claude/context/build.js.map +1 -0
- package/dist/otel/claude/context/classify.d.ts.map +1 -0
- package/dist/otel/claude/context/classify.js.map +1 -0
- package/dist/otel/{context → claude/context}/extract.d.ts +1 -1
- package/dist/otel/claude/context/extract.d.ts.map +1 -0
- package/dist/otel/claude/context/extract.js.map +1 -0
- package/dist/otel/claude/context/markers.d.ts.map +1 -0
- package/dist/otel/{context → claude/context}/markers.js +22 -3
- package/dist/otel/claude/context/markers.js.map +1 -0
- package/dist/otel/claude/context/util.d.ts.map +1 -0
- package/dist/otel/claude/context/util.js.map +1 -0
- package/dist/otel/{daemon → claude/daemon}/ensure.d.ts +1 -1
- package/dist/otel/claude/daemon/ensure.d.ts.map +1 -0
- package/dist/otel/{daemon → claude/daemon}/ensure.js +6 -6
- package/dist/otel/claude/daemon/ensure.js.map +1 -0
- package/dist/otel/{daemon → claude/daemon}/forward.d.ts +1 -1
- package/dist/otel/claude/daemon/forward.d.ts.map +1 -0
- package/dist/otel/{daemon → claude/daemon}/forward.js +0 -0
- package/dist/otel/claude/daemon/forward.js.map +1 -0
- package/dist/otel/claude/daemon/paths.d.ts.map +1 -0
- package/dist/otel/claude/daemon/paths.js.map +1 -0
- package/dist/otel/{daemon → claude/daemon}/process.d.ts +1 -1
- package/dist/otel/claude/daemon/process.d.ts.map +1 -0
- package/dist/otel/{daemon → claude/daemon}/process.js +1 -1
- package/dist/otel/claude/daemon/process.js.map +1 -0
- package/dist/otel/claude/daemon/reprocess.d.ts.map +1 -0
- package/dist/otel/{daemon → claude/daemon}/reprocess.js +2 -2
- package/dist/otel/claude/daemon/reprocess.js.map +1 -0
- package/dist/otel/claude/log-handler.d.ts.map +1 -0
- package/dist/otel/{log-handler.js → claude/log-handler.js} +1 -1
- package/dist/otel/claude/log-handler.js.map +1 -0
- package/dist/otel/collector.js +4 -4
- package/dist/otel/collector.js.map +1 -1
- package/dist/queue/flush.d.ts +23 -0
- package/dist/queue/flush.d.ts.map +1 -1
- package/dist/queue/flush.js +44 -0
- 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 +5 -4
- package/dist/queue/handlers/send-event.js.map +1 -1
- package/dist/queue/index.d.ts +2 -2
- package/dist/queue/index.d.ts.map +1 -1
- package/dist/queue/index.js +4 -1
- package/dist/queue/index.js.map +1 -1
- package/dist/queue/spawn.d.ts +20 -0
- package/dist/queue/spawn.d.ts.map +1 -1
- package/dist/queue/spawn.js +37 -0
- package/dist/queue/spawn.js.map +1 -1
- package/dist/tui/import/area.js +3 -3
- package/dist/tui/import/area.js.map +1 -1
- package/package.json +2 -1
- package/dist/analytics/classifier.d.ts.map +0 -1
- package/dist/analytics/classifier.js.map +0 -1
- package/dist/analytics/emit.d.ts.map +0 -1
- package/dist/analytics/emit.js.map +0 -1
- package/dist/analytics/errors.d.ts.map +0 -1
- package/dist/analytics/errors.js.map +0 -1
- package/dist/analytics/hook-trigger.d.ts.map +0 -1
- package/dist/analytics/hook-trigger.js.map +0 -1
- package/dist/analytics/log.d.ts.map +0 -1
- package/dist/analytics/log.js.map +0 -1
- package/dist/analytics/merge.d.ts.map +0 -1
- package/dist/analytics/merge.js.map +0 -1
- package/dist/analytics/pricing.d.ts.map +0 -1
- package/dist/analytics/pricing.js.map +0 -1
- package/dist/analytics/projection.d.ts.map +0 -1
- package/dist/analytics/projection.js.map +0 -1
- package/dist/analytics/spawn.d.ts.map +0 -1
- package/dist/analytics/spawn.js.map +0 -1
- package/dist/analytics/state.d.ts.map +0 -1
- package/dist/analytics/state.js.map +0 -1
- package/dist/analytics/transcript.d.ts.map +0 -1
- package/dist/analytics/transcript.js.map +0 -1
- package/dist/analytics/types.d.ts.map +0 -1
- package/dist/analytics/types.js.map +0 -1
- package/dist/commands/claude.d.ts.map +0 -1
- package/dist/commands/claude.js.map +0 -1
- package/dist/commands/otel.d.ts.map +0 -1
- package/dist/commands/otel.js.map +0 -1
- package/dist/commands/process-analytics.d.ts +0 -18
- package/dist/commands/process-analytics.d.ts.map +0 -1
- package/dist/commands/process-analytics.js.map +0 -1
- package/dist/commands/statusline-toggle.d.ts.map +0 -1
- package/dist/commands/statusline-toggle.js.map +0 -1
- package/dist/commands/statusline.d.ts.map +0 -1
- package/dist/commands/statusline.js.map +0 -1
- package/dist/otel/context/build.d.ts.map +0 -1
- package/dist/otel/context/build.js.map +0 -1
- package/dist/otel/context/classify.d.ts.map +0 -1
- package/dist/otel/context/classify.js.map +0 -1
- package/dist/otel/context/extract.d.ts.map +0 -1
- package/dist/otel/context/extract.js.map +0 -1
- package/dist/otel/context/markers.d.ts.map +0 -1
- package/dist/otel/context/markers.js.map +0 -1
- package/dist/otel/context/util.d.ts.map +0 -1
- package/dist/otel/context/util.js.map +0 -1
- package/dist/otel/daemon/ensure.d.ts.map +0 -1
- package/dist/otel/daemon/ensure.js.map +0 -1
- package/dist/otel/daemon/forward.d.ts.map +0 -1
- package/dist/otel/daemon/forward.js.map +0 -1
- package/dist/otel/daemon/paths.d.ts.map +0 -1
- package/dist/otel/daemon/paths.js.map +0 -1
- package/dist/otel/daemon/process.d.ts.map +0 -1
- package/dist/otel/daemon/process.js.map +0 -1
- package/dist/otel/daemon/reprocess.d.ts.map +0 -1
- package/dist/otel/daemon/reprocess.js.map +0 -1
- package/dist/otel/log-handler.d.ts.map +0 -1
- package/dist/otel/log-handler.js.map +0 -1
- /package/dist/analytics/{log.d.ts → claude/log.d.ts} +0 -0
- /package/dist/analytics/{transcript.d.ts → claude/transcript.d.ts} +0 -0
- /package/dist/analytics/{classifier.d.ts → shared/classifier.d.ts} +0 -0
- /package/dist/analytics/{errors.d.ts → shared/errors.d.ts} +0 -0
- /package/dist/analytics/{errors.js → shared/errors.js} +0 -0
- /package/dist/analytics/{types.js → shared/types.js} +0 -0
- /package/dist/otel/{context → claude/context}/classify.d.ts +0 -0
- /package/dist/otel/{context → claude/context}/classify.js +0 -0
- /package/dist/otel/{context → claude/context}/extract.js +0 -0
- /package/dist/otel/{context → claude/context}/markers.d.ts +0 -0
- /package/dist/otel/{context → claude/context}/util.d.ts +0 -0
- /package/dist/otel/{context → claude/context}/util.js +0 -0
- /package/dist/otel/{daemon → claude/daemon}/paths.d.ts +0 -0
- /package/dist/otel/{daemon → claude/daemon}/paths.js +0 -0
- /package/dist/otel/{daemon → claude/daemon}/reprocess.d.ts +0 -0
- /package/dist/otel/{log-handler.d.ts → claude/log-handler.d.ts} +0 -0
|
@@ -30,8 +30,18 @@ function isHumanTextUserLine(line) {
|
|
|
30
30
|
return false;
|
|
31
31
|
}
|
|
32
32
|
const content = line.message.content;
|
|
33
|
+
// Match `src/analytics/claude/projection.ts:isHumanTextUser` exactly
|
|
34
|
+
// so import-derived turn boundaries (used by `deriveTurnBoundariesFromTranscript`
|
|
35
|
+
// for activity_start/end emission) match live-derived ones for the
|
|
36
|
+
// same transcript bytes. Two prior divergences:
|
|
37
|
+
// (a) string content: live trims whitespace before length check;
|
|
38
|
+
// import did not, so a whitespace-only message would be treated
|
|
39
|
+
// as a real human turn opener by import but not by live.
|
|
40
|
+
// (b) mixed `[tool_result, text]` blocks: live keeps scanning for
|
|
41
|
+
// a text block (returns true if found); import short-circuited
|
|
42
|
+
// false on the first tool_result, missing the trailing text.
|
|
33
43
|
if (typeof content === "string") {
|
|
34
|
-
return content.length > 0;
|
|
44
|
+
return content.trim().length > 0;
|
|
35
45
|
}
|
|
36
46
|
if (Array.isArray(content)) {
|
|
37
47
|
for (const block of content) {
|
|
@@ -40,9 +50,6 @@ function isHumanTextUserLine(line) {
|
|
|
40
50
|
if (t === "text" && typeof block.text === "string") {
|
|
41
51
|
return true;
|
|
42
52
|
}
|
|
43
|
-
if (t === "tool_result") {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
53
|
}
|
|
47
54
|
}
|
|
48
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-walk.js","sourceRoot":"","sources":["../../../src/import/claude/transcript-walk.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAUH,
|
|
1
|
+
{"version":3,"file":"transcript-walk.js","sourceRoot":"","sources":["../../../src/import/claude/transcript-walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Codex Import Analytics Runner
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the Codex analytics derivation for a full rollout JSONL.
|
|
5
|
+
* Mirror of `src/analytics/codex/emit.ts`'s projection step BUT:
|
|
6
|
+
*
|
|
7
|
+
* - never reads / writes the per-session `analytics-codex/state.json`
|
|
8
|
+
* - always treats the slice as final (`is_final: true`)
|
|
9
|
+
* - full from-zero parse — no cursor tracking
|
|
10
|
+
*
|
|
11
|
+
* Returns the `SessionAnalyticsEvent` the import pipeline should POST.
|
|
12
|
+
* The pipeline is responsible for POST + marker. We deliberately do NOT
|
|
13
|
+
* emit `session_turn_analytics` here — it's out of scope on Codex;
|
|
14
|
+
* the master record carries the same signals at session granularity.
|
|
15
|
+
*
|
|
16
|
+
* Independent of Claude's `import/claude/analytics-runner.ts` — Codex
|
|
17
|
+
* projection consumes the RolloutItem enum, not Claude's transcript
|
|
18
|
+
* message lines. Imports share the same `projectCodexDelta` core as the
|
|
19
|
+
* live `codex/emit.ts`, so live + import produce SEMANTICALLY
|
|
20
|
+
* identical `session_analytics` records for the same session content —
|
|
21
|
+
* modulo `is_final` (import=true / live=false), `end_reason`
|
|
22
|
+
* ("import" / undefined), `snapshot_at` (per-emit ISO timestamp), and
|
|
23
|
+
* envelope `timestamp` (Date.now() at emit). Aside from those four
|
|
24
|
+
* deliberately-divergent fields, the projection output is byte-identical.
|
|
25
|
+
*/
|
|
26
|
+
import { SessionAnalyticsEvent } from "../../analytics/shared/types";
|
|
27
|
+
export interface CodexAnalyticsRunnerInput {
|
|
28
|
+
sessionId: string;
|
|
29
|
+
projectName: string;
|
|
30
|
+
transcriptPath: string;
|
|
31
|
+
/** Surfaced on `session_analytics.end_reason`. Defaults to `"import"`. */
|
|
32
|
+
endReason?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface CodexAnalyticsRunnerOutput {
|
|
35
|
+
/** Null when the rollout couldn't be parsed (caller falls back to skipping). */
|
|
36
|
+
sessionAnalytics: SessionAnalyticsEvent | null;
|
|
37
|
+
/** Number of bytes processed — written into the import marker for resume diagnostics. */
|
|
38
|
+
transcriptOffset: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run the full rollout through the Codex session-projection and return
|
|
42
|
+
* the master `session_analytics` event. Throws on read errors; on parse
|
|
43
|
+
* errors the projection itself is defensive and skips malformed lines.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runCodexImportAnalytics(input: CodexAnalyticsRunnerInput): CodexAnalyticsRunnerOutput;
|
|
46
|
+
//# sourceMappingURL=analytics-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-runner.d.ts","sourceRoot":"","sources":["../../../src/import/codex/analytics-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAoB,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQvF,MAAM,WAAW,yBAAyB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CAMtB;AAED,MAAM,WAAW,0BAA0B;IACvC,gFAAgF;IAChF,gBAAgB,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC/C,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,yBAAyB,GAAG,0BAA0B,CAwEpG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Codex Import Analytics Runner
|
|
4
|
+
*
|
|
5
|
+
* Orchestrates the Codex analytics derivation for a full rollout JSONL.
|
|
6
|
+
* Mirror of `src/analytics/codex/emit.ts`'s projection step BUT:
|
|
7
|
+
*
|
|
8
|
+
* - never reads / writes the per-session `analytics-codex/state.json`
|
|
9
|
+
* - always treats the slice as final (`is_final: true`)
|
|
10
|
+
* - full from-zero parse — no cursor tracking
|
|
11
|
+
*
|
|
12
|
+
* Returns the `SessionAnalyticsEvent` the import pipeline should POST.
|
|
13
|
+
* The pipeline is responsible for POST + marker. We deliberately do NOT
|
|
14
|
+
* emit `session_turn_analytics` here — it's out of scope on Codex;
|
|
15
|
+
* the master record carries the same signals at session granularity.
|
|
16
|
+
*
|
|
17
|
+
* Independent of Claude's `import/claude/analytics-runner.ts` — Codex
|
|
18
|
+
* projection consumes the RolloutItem enum, not Claude's transcript
|
|
19
|
+
* message lines. Imports share the same `projectCodexDelta` core as the
|
|
20
|
+
* live `codex/emit.ts`, so live + import produce SEMANTICALLY
|
|
21
|
+
* identical `session_analytics` records for the same session content —
|
|
22
|
+
* modulo `is_final` (import=true / live=false), `end_reason`
|
|
23
|
+
* ("import" / undefined), `snapshot_at` (per-emit ISO timestamp), and
|
|
24
|
+
* envelope `timestamp` (Date.now() at emit). Aside from those four
|
|
25
|
+
* deliberately-divergent fields, the projection output is byte-identical.
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.runCodexImportAnalytics = runCodexImportAnalytics;
|
|
29
|
+
const fs_1 = require("fs");
|
|
30
|
+
const logger_1 = require("../../lib/logger");
|
|
31
|
+
const projection_1 = require("../../analytics/codex/projection");
|
|
32
|
+
/**
|
|
33
|
+
* Run the full rollout through the Codex session-projection and return
|
|
34
|
+
* the master `session_analytics` event. Throws on read errors; on parse
|
|
35
|
+
* errors the projection itself is defensive and skips malformed lines.
|
|
36
|
+
*/
|
|
37
|
+
function runCodexImportAnalytics(input) {
|
|
38
|
+
const raw = (0, fs_1.readFileSync)(input.transcriptPath);
|
|
39
|
+
const offset = raw.length;
|
|
40
|
+
const text = raw.toString("utf-8");
|
|
41
|
+
const lines = [];
|
|
42
|
+
for (const line of text.split("\n")) {
|
|
43
|
+
if (line.length === 0) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
lines.push(JSON.parse(line));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// malformed line — skip (matches live behavior)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (lines.length === 0) {
|
|
54
|
+
logger_1.logger.debug(`codex import analytics: ${input.transcriptPath} parsed to zero rollout lines`);
|
|
55
|
+
return { sessionAnalytics: null, transcriptOffset: offset };
|
|
56
|
+
}
|
|
57
|
+
let projection;
|
|
58
|
+
try {
|
|
59
|
+
projection = (0, projection_1.projectCodexDelta)({
|
|
60
|
+
sessionId: input.sessionId,
|
|
61
|
+
projectName: input.projectName,
|
|
62
|
+
lines,
|
|
63
|
+
endReason: input.endReason ?? "import",
|
|
64
|
+
// Imports replay COMPLETE historical sessions — the rollout ends
|
|
65
|
+
// because the user already closed the session. `is_final: true`
|
|
66
|
+
// is correct here (mirrors Claude-import semantic). The LIVE
|
|
67
|
+
// path in `commands/codex/process-analytics.ts` passes false
|
|
68
|
+
// because each Stop is a checkpoint, not a terminal.
|
|
69
|
+
isFinal: true,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
logger_1.logger.debug(`codex import analytics: projection failed for ${input.sessionId}: ${e instanceof Error ? e.message : e}`);
|
|
74
|
+
return { sessionAnalytics: null, transcriptOffset: offset };
|
|
75
|
+
}
|
|
76
|
+
// Wire shape: `analytics` MUST be NESTED (mirrors Claude side; the
|
|
77
|
+
// collector's session_analytics envelope requires this single nested
|
|
78
|
+
// body field). Earlier flat version POSTed all SessionAnalytics
|
|
79
|
+
// fields at the top level and the collector dropped them as unknown
|
|
80
|
+
// properties → `analytics` missing → validation reject → 400.
|
|
81
|
+
//
|
|
82
|
+
// user_email / usage_type / usage_plan are intentionally NOT stamped
|
|
83
|
+
// here — `applyUsageToEvents` in runner.ts sets them on every event
|
|
84
|
+
// (this one included) after we return.
|
|
85
|
+
const analyticsBody = { ...projection.delta };
|
|
86
|
+
// Wire timestamp anchors to the session's last in-transcript activity,
|
|
87
|
+
// not the import-run wall clock — mirror of Claude import's
|
|
88
|
+
// analytics-runner.ts (parseIsoOrNow(merged.last_activity_time)).
|
|
89
|
+
// Without this, importing a months-old Codex rollout stamps every
|
|
90
|
+
// session_analytics event with "today", which breaks any backend
|
|
91
|
+
// query that windows on Event.timestamp (timeline plots, time-bucketed
|
|
92
|
+
// dashboards, cohort analyses cluster all imported Codex sessions on
|
|
93
|
+
// the import moment instead of when they actually happened). The live
|
|
94
|
+
// Codex emit path (analytics/codex/emit.ts) correctly uses Date.now()
|
|
95
|
+
// because the live emit IS the current moment — only the import path
|
|
96
|
+
// is wrong. Falls back to Date.now() only when last_activity_time is
|
|
97
|
+
// missing / unparseable.
|
|
98
|
+
const sessionTsMs = parseIsoOrNow(analyticsBody.last_activity_time);
|
|
99
|
+
const event = {
|
|
100
|
+
id: (0, projection_1.deriveCodexSessionAnalyticsEventId)(input.sessionId),
|
|
101
|
+
type: "session_analytics",
|
|
102
|
+
timestamp: sessionTsMs,
|
|
103
|
+
session_id: input.sessionId,
|
|
104
|
+
project_name: input.projectName,
|
|
105
|
+
analytics: analyticsBody,
|
|
106
|
+
};
|
|
107
|
+
return { sessionAnalytics: event, transcriptOffset: offset };
|
|
108
|
+
}
|
|
109
|
+
function parseIsoOrNow(iso) {
|
|
110
|
+
if (typeof iso !== "string" || iso.length === 0) {
|
|
111
|
+
return Date.now();
|
|
112
|
+
}
|
|
113
|
+
const ms = Date.parse(iso);
|
|
114
|
+
return Number.isFinite(ms) ? ms : Date.now();
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=analytics-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics-runner.js","sourceRoot":"","sources":["../../../src/import/codex/analytics-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Codex Import Discovery
|
|
3
|
+
*
|
|
4
|
+
* Resolves an `ImportScope` to a list of `ImportTarget`s by walking
|
|
5
|
+
* `~/.codex/sessions/YYYY/MM/DD/rollout-<ISO>-<UUID>.jsonl`.
|
|
6
|
+
*
|
|
7
|
+
* Unlike Claude (encoded project folder under ~/.claude/projects/), Codex
|
|
8
|
+
* stores rollouts flat by date. Project association is recovered by
|
|
9
|
+
* reading the first line's `session_meta.payload.cwd`. So:
|
|
10
|
+
* - `current-project` → scan every rollout, keep those whose first-line
|
|
11
|
+
* cwd matches the current cwd
|
|
12
|
+
* - `projects <paths>` → scan every rollout, keep those whose first-line
|
|
13
|
+
* cwd matches any of the supplied paths
|
|
14
|
+
* - `all-projects` → scan every rollout, project comes from each rollout's
|
|
15
|
+
* own first-line cwd (one project per rollout)
|
|
16
|
+
* - `transcript <path>` → single file, project from its session_meta line
|
|
17
|
+
*
|
|
18
|
+
* Discovery does NOT apply the time-range filter — `filter.ts` does that
|
|
19
|
+
* after a session is found.
|
|
20
|
+
*/
|
|
21
|
+
import { ImportScope, ImportTarget } from "../types";
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the scope flag to a list of candidate transcripts. Each returned
|
|
24
|
+
* `ImportTarget` is fully populated EXCEPT that no time-range filter has
|
|
25
|
+
* been applied yet — callers run `filter.ts` over this list.
|
|
26
|
+
*
|
|
27
|
+
* Codex's flat-by-date layout means every scope (except `transcript`) does
|
|
28
|
+
* a full walk + per-file first-line read. That's O(rollouts) per import
|
|
29
|
+
* invocation — acceptable: rollouts are < 10K per machine for a typical
|
|
30
|
+
* dev box, and the first-line read peeks at ≤ 4 KB.
|
|
31
|
+
*/
|
|
32
|
+
export declare function findCodexTranscripts(scope: ImportScope): ImportTarget[];
|
|
33
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/import/codex/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAWH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAErD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,EAAE,CA6BvE"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Codex Import Discovery
|
|
4
|
+
*
|
|
5
|
+
* Resolves an `ImportScope` to a list of `ImportTarget`s by walking
|
|
6
|
+
* `~/.codex/sessions/YYYY/MM/DD/rollout-<ISO>-<UUID>.jsonl`.
|
|
7
|
+
*
|
|
8
|
+
* Unlike Claude (encoded project folder under ~/.claude/projects/), Codex
|
|
9
|
+
* stores rollouts flat by date. Project association is recovered by
|
|
10
|
+
* reading the first line's `session_meta.payload.cwd`. So:
|
|
11
|
+
* - `current-project` → scan every rollout, keep those whose first-line
|
|
12
|
+
* cwd matches the current cwd
|
|
13
|
+
* - `projects <paths>` → scan every rollout, keep those whose first-line
|
|
14
|
+
* cwd matches any of the supplied paths
|
|
15
|
+
* - `all-projects` → scan every rollout, project comes from each rollout's
|
|
16
|
+
* own first-line cwd (one project per rollout)
|
|
17
|
+
* - `transcript <path>` → single file, project from its session_meta line
|
|
18
|
+
*
|
|
19
|
+
* Discovery does NOT apply the time-range filter — `filter.ts` does that
|
|
20
|
+
* after a session is found.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.findCodexTranscripts = findCodexTranscripts;
|
|
24
|
+
const fs_1 = require("fs");
|
|
25
|
+
const path_1 = require("path");
|
|
26
|
+
const logger_1 = require("../../lib/logger");
|
|
27
|
+
const actions_1 = require("../../hooks/core/actions");
|
|
28
|
+
const transcript_1 = require("../../analytics/codex/transcript");
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the scope flag to a list of candidate transcripts. Each returned
|
|
31
|
+
* `ImportTarget` is fully populated EXCEPT that no time-range filter has
|
|
32
|
+
* been applied yet — callers run `filter.ts` over this list.
|
|
33
|
+
*
|
|
34
|
+
* Codex's flat-by-date layout means every scope (except `transcript`) does
|
|
35
|
+
* a full walk + per-file first-line read. That's O(rollouts) per import
|
|
36
|
+
* invocation — acceptable: rollouts are < 10K per machine for a typical
|
|
37
|
+
* dev box, and the first-line read peeks at ≤ 4 KB.
|
|
38
|
+
*/
|
|
39
|
+
function findCodexTranscripts(scope) {
|
|
40
|
+
if (scope.kind === "transcript") {
|
|
41
|
+
const t = buildSingleTranscriptTarget(scope.path);
|
|
42
|
+
return t !== null ? [t] : [];
|
|
43
|
+
}
|
|
44
|
+
if (!(0, fs_1.existsSync)((0, transcript_1.codexSessionsRoot)())) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
// Canonicalize comparison paths via realpathSync — macOS resolves
|
|
48
|
+
// `/var/folders/...` → `/private/var/folders/...` and session_meta.cwd
|
|
49
|
+
// typically holds the realpath form; without canonicalization a
|
|
50
|
+
// symlinked `--projects /tmp/proj` silently returns zero targets when
|
|
51
|
+
// Codex stored `/private/tmp/proj`. Same for cwd on `current-project`.
|
|
52
|
+
const allowProjects = scope.kind === "current-project"
|
|
53
|
+
? new Set([tryRealpath(process.cwd())])
|
|
54
|
+
: scope.kind === "projects"
|
|
55
|
+
? new Set(scope.paths.map((p) => tryRealpath((0, path_1.resolve)(p))))
|
|
56
|
+
: null; // all-projects: accept every cwd
|
|
57
|
+
const out = [];
|
|
58
|
+
for (const rolloutPath of (0, transcript_1.walkAllCodexRollouts)()) {
|
|
59
|
+
const t = buildTargetFromRollout(rolloutPath, allowProjects);
|
|
60
|
+
if (t !== null) {
|
|
61
|
+
out.push(t);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
function buildSingleTranscriptTarget(path) {
|
|
67
|
+
const absPath = (0, path_1.isAbsolute)(path) ? path : (0, path_1.resolve)(path);
|
|
68
|
+
if (!(0, fs_1.existsSync)(absPath)) {
|
|
69
|
+
logger_1.logger.debug(`codex import discovery: --transcript ${absPath} doesn't exist`);
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
if (!absPath.endsWith(".jsonl")) {
|
|
73
|
+
logger_1.logger.debug(`codex import discovery: --transcript ${absPath} is not a .jsonl file`);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
// No allow-list filter for single-transcript mode — caller explicitly
|
|
77
|
+
// asked for this file, so we accept whatever cwd the rollout has.
|
|
78
|
+
return buildTargetFromRollout(absPath, null);
|
|
79
|
+
}
|
|
80
|
+
function tryRealpath(p) {
|
|
81
|
+
try {
|
|
82
|
+
return (0, fs_1.realpathSync)(p);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Path doesn't exist on this machine (deleted, never created, or
|
|
86
|
+
// typo). Fall back to the lexical form — the allow-list will
|
|
87
|
+
// simply never match, which is the desired behavior.
|
|
88
|
+
return p;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function buildTargetFromRollout(rolloutPath, allowProjects) {
|
|
92
|
+
const sessionId = (0, transcript_1.sessionIdFromRolloutPath)(rolloutPath);
|
|
93
|
+
if (sessionId === null) {
|
|
94
|
+
logger_1.logger.debug(`codex import discovery: filename shape mismatch ${rolloutPath} — skipping`);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const meta = peekSessionMeta(rolloutPath);
|
|
98
|
+
if (meta === null) {
|
|
99
|
+
logger_1.logger.debug(`codex import discovery: ${rolloutPath} has no session_meta in header — skipping`);
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
if (allowProjects !== null && !allowProjects.has(meta.cwd)) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
let mtimeMs;
|
|
106
|
+
let sizeBytes;
|
|
107
|
+
try {
|
|
108
|
+
const s = (0, fs_1.statSync)(rolloutPath);
|
|
109
|
+
mtimeMs = s.mtimeMs;
|
|
110
|
+
sizeBytes = s.size;
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
logger_1.logger.debug(`codex import discovery: stat(${rolloutPath}) failed: ${e instanceof Error ? e.message : e}`);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const sessionStartMs = Date.parse(meta.timestamp);
|
|
117
|
+
if (!Number.isFinite(sessionStartMs)) {
|
|
118
|
+
logger_1.logger.debug(`codex import discovery: ${rolloutPath} session_meta has unparseable timestamp ${meta.timestamp} — skipping`);
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
client: "codex",
|
|
123
|
+
sessionId,
|
|
124
|
+
transcriptPath: rolloutPath,
|
|
125
|
+
projectDir: meta.cwd,
|
|
126
|
+
// Use git-aware resolveProjectName (Claude-parity) so the import
|
|
127
|
+
// matches the live emit's project_name. Plain basename diverges when
|
|
128
|
+
// a session was launched from a subdir or when the local dir name
|
|
129
|
+
// differs from the git remote name — backend would then see "same
|
|
130
|
+
// session, two different project labels" depending on which path
|
|
131
|
+
// (live vs import) wrote last. See `analytics/codex/emit.ts`
|
|
132
|
+
// for the same fix on the live side.
|
|
133
|
+
projectName: (0, actions_1.resolveProjectName)(meta.cwd),
|
|
134
|
+
sessionStartMs,
|
|
135
|
+
mtimeMs,
|
|
136
|
+
sizeBytes,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Read the first ≤ 4 KB of the rollout, parse the first complete line as
|
|
141
|
+
* the session_meta entry, and pull out `cwd` + `timestamp`. Returns null
|
|
142
|
+
* when the first line isn't a session_meta or the read fails. Sized to be
|
|
143
|
+
* cheap (one syscall + small alloc) so a full-store walk stays fast.
|
|
144
|
+
*/
|
|
145
|
+
function peekSessionMeta(rolloutPath) {
|
|
146
|
+
const READ_CAP = 4 * 1024;
|
|
147
|
+
let fd;
|
|
148
|
+
try {
|
|
149
|
+
fd = (0, fs_1.openSync)(rolloutPath, "r");
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
let firstLine;
|
|
155
|
+
try {
|
|
156
|
+
const buf = Buffer.alloc(READ_CAP);
|
|
157
|
+
const n = (0, fs_1.readSync)(fd, buf, 0, READ_CAP, 0);
|
|
158
|
+
const head = buf.subarray(0, n).toString("utf-8");
|
|
159
|
+
const newlineIdx = head.indexOf("\n");
|
|
160
|
+
firstLine = newlineIdx === -1 ? head : head.slice(0, newlineIdx);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Finally runs in all paths — closeSync below handles cleanup.
|
|
164
|
+
// No inner close here (it would double-close → EBADF).
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
try {
|
|
169
|
+
(0, fs_1.closeSync)(fd);
|
|
170
|
+
}
|
|
171
|
+
catch { /* ignore */ }
|
|
172
|
+
}
|
|
173
|
+
if (firstLine.length === 0) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
let parsed;
|
|
177
|
+
try {
|
|
178
|
+
parsed = JSON.parse(firstLine);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const obj = parsed;
|
|
187
|
+
if (obj.type !== "session_meta") {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const payload = obj.payload;
|
|
191
|
+
if (payload === null || typeof payload !== "object" || Array.isArray(payload)) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
const p = payload;
|
|
195
|
+
const cwd = p.cwd;
|
|
196
|
+
const timestamp = p.timestamp ?? obj.timestamp;
|
|
197
|
+
if (typeof cwd !== "string" || cwd.length === 0 || typeof timestamp !== "string" || timestamp.length === 0) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
return { cwd, timestamp };
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/import/codex/discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IronBee CLI — Codex import file_change derivation.
|
|
3
|
+
*
|
|
4
|
+
* One `file_change` event per file entry inside each `apply_patch`
|
|
5
|
+
* function_call body. Parses the patch via the SAME `parseApplyPatchBody`
|
|
6
|
+
* that the live `clear-verdict` hook uses, so live and import agree
|
|
7
|
+
* byte-for-byte on operation + line counts.
|
|
8
|
+
*
|
|
9
|
+
* Filtered by the project's `verifyPatterns` config (a Write of `foo.test.ts`
|
|
10
|
+
* generates no event when the verify cycle excludes test files).
|
|
11
|
+
*
|
|
12
|
+
* `changeset` parity: live emits a hunks-only V4A per-file slice as the
|
|
13
|
+
* captureChangeset FALLBACK (clear-verdict.ts:284-285 — used when the
|
|
14
|
+
* PreToolUse stash is missing or the unified-diff build fails). The same
|
|
15
|
+
* `e.body` slice is available offline from `parseApplyPatchBody`. When the
|
|
16
|
+
* operator has `fileChange.captureChangeset: true` we emit it here too —
|
|
17
|
+
* without parity, re-import overwrites the live `changeset` field with
|
|
18
|
+
* `undefined` via `(session_id, id)` latest-wins dedup. We deliberately
|
|
19
|
+
* skip the unified-diff primary path: that requires the prior file content
|
|
20
|
+
* which import predates (working tree has moved on).
|
|
21
|
+
*/
|
|
22
|
+
import { FileChangeAction } from "../../../hooks/core/actions";
|
|
23
|
+
export interface BuildCodexFileChangeOpts {
|
|
24
|
+
sessionId: string;
|
|
25
|
+
projectName: string;
|
|
26
|
+
projectDir: string;
|
|
27
|
+
/** Parent turn's activity_id. */
|
|
28
|
+
activityId: string;
|
|
29
|
+
/** `call_id` of the apply_patch call — drives event id derivation. */
|
|
30
|
+
callId: string;
|
|
31
|
+
/** ISO-8601 timestamp from the rollout line. */
|
|
32
|
+
timestamp: string;
|
|
33
|
+
/** Raw `apply_patch.arguments.input` body string. */
|
|
34
|
+
patchBody: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse the patch body and produce one event per file. Returns an empty
|
|
38
|
+
* array when (a) the body is unparseable, (b) every entry's path is
|
|
39
|
+
* ignored, or (c) every entry's path doesn't match any active cycle.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildCodexFileChanges(opts: BuildCodexFileChangeOpts): FileChangeAction[];
|
|
42
|
+
//# sourceMappingURL=file-change.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-change.d.ts","sourceRoot":"","sources":["../../../../src/import/codex/events/file-change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,gBAAgB,EAAuB,MAAM,6BAA6B,CAAC;AAWpF,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,wBAAwB,GAAG,gBAAgB,EAAE,CA2DxF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* IronBee CLI — Codex import file_change derivation.
|
|
4
|
+
*
|
|
5
|
+
* One `file_change` event per file entry inside each `apply_patch`
|
|
6
|
+
* function_call body. Parses the patch via the SAME `parseApplyPatchBody`
|
|
7
|
+
* that the live `clear-verdict` hook uses, so live and import agree
|
|
8
|
+
* byte-for-byte on operation + line counts.
|
|
9
|
+
*
|
|
10
|
+
* Filtered by the project's `verifyPatterns` config (a Write of `foo.test.ts`
|
|
11
|
+
* generates no event when the verify cycle excludes test files).
|
|
12
|
+
*
|
|
13
|
+
* `changeset` parity: live emits a hunks-only V4A per-file slice as the
|
|
14
|
+
* captureChangeset FALLBACK (clear-verdict.ts:284-285 — used when the
|
|
15
|
+
* PreToolUse stash is missing or the unified-diff build fails). The same
|
|
16
|
+
* `e.body` slice is available offline from `parseApplyPatchBody`. When the
|
|
17
|
+
* operator has `fileChange.captureChangeset: true` we emit it here too —
|
|
18
|
+
* without parity, re-import overwrites the live `changeset` field with
|
|
19
|
+
* `undefined` via `(session_id, id)` latest-wins dedup. We deliberately
|
|
20
|
+
* skip the unified-diff primary path: that requires the prior file content
|
|
21
|
+
* which import predates (working tree has moved on).
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.buildCodexFileChanges = buildCodexFileChanges;
|
|
25
|
+
const clear_verdict_1 = require("../../../clients/codex/hooks/clear-verdict");
|
|
26
|
+
const config_1 = require("../../../lib/config");
|
|
27
|
+
const ids_1 = require("../../ids");
|
|
28
|
+
/**
|
|
29
|
+
* Parse the patch body and produce one event per file. Returns an empty
|
|
30
|
+
* array when (a) the body is unparseable, (b) every entry's path is
|
|
31
|
+
* ignored, or (c) every entry's path doesn't match any active cycle.
|
|
32
|
+
*/
|
|
33
|
+
function buildCodexFileChanges(opts) {
|
|
34
|
+
const config = (0, config_1.loadConfig)(opts.projectDir);
|
|
35
|
+
let entries;
|
|
36
|
+
try {
|
|
37
|
+
entries = (0, clear_verdict_1.parseApplyPatchBody)(opts.patchBody);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
const captureChangeset = (0, config_1.getCaptureFileChangeset)(config);
|
|
43
|
+
const maxChangesetBytes = (0, config_1.getMaxChangesetBytes)(config);
|
|
44
|
+
const events = [];
|
|
45
|
+
const tsMs = Date.parse(opts.timestamp);
|
|
46
|
+
const stamp = Number.isFinite(tsMs) ? tsMs : Date.now();
|
|
47
|
+
for (let i = 0; i < entries.length; i++) {
|
|
48
|
+
const e = entries[i];
|
|
49
|
+
if (!shouldEmit(config, e.path)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const op = e.operation;
|
|
53
|
+
// Multi-file patches share one call_id — qualify the event id with
|
|
54
|
+
// the entry index + file path so each emits a distinct UUID.
|
|
55
|
+
const event = {
|
|
56
|
+
id: (0, ids_1.deriveFileChangeEventId)(opts.sessionId, `${opts.callId}:${i}:${e.path}`),
|
|
57
|
+
type: "file_change",
|
|
58
|
+
timestamp: stamp,
|
|
59
|
+
session_id: opts.sessionId,
|
|
60
|
+
project_name: opts.projectName,
|
|
61
|
+
activity_id: opts.activityId,
|
|
62
|
+
// Cross-event vocab parity (round 68). See clear-verdict.ts for
|
|
63
|
+
// full rationale: tool_call.tool_name ships "Edit" (round 67)
|
|
64
|
+
// and session_analytics.tools["Edit"] aggregates (round 66), so
|
|
65
|
+
// file_change must use the same alias to keep the backend
|
|
66
|
+
// tool_call ↔ file_change JOIN on tool_name working. Live ↔
|
|
67
|
+
// import parity: this matches `clear-verdict.ts:255`.
|
|
68
|
+
tool_name: "Edit",
|
|
69
|
+
file_path: e.path,
|
|
70
|
+
operation: op,
|
|
71
|
+
// Live parity (clear-verdict.ts). DELETE: BOTH null (whole file
|
|
72
|
+
// removed; prior content unrecoverable; parser's 0 isn't
|
|
73
|
+
// meaningful). CREATE: `lines_removed: 0` — new file has zero
|
|
74
|
+
// prior content, so zero lines were removed. Cross-client
|
|
75
|
+
// parity with Claude Write-create (clients/claude/hooks/
|
|
76
|
+
// clear-verdict.ts:77 + import/claude/events/file-change.ts:85).
|
|
77
|
+
// UPDATE: both real counts.
|
|
78
|
+
lines_added: op === "delete" ? null : e.linesAdded,
|
|
79
|
+
lines_removed: op === "delete" ? null : (op === "create" ? 0 : e.linesRemoved),
|
|
80
|
+
};
|
|
81
|
+
// Live parity for `changeset`: mirror the V4A fallback path
|
|
82
|
+
// (clear-verdict.ts:284-285). `e.body` is hunks-only per-file slice
|
|
83
|
+
// parsed from the rollout's apply_patch body — same source the live
|
|
84
|
+
// fallback uses. Without this, re-import dedup
|
|
85
|
+
// (`(session_id, id)` latest-wins) overwrites live's `changeset`
|
|
86
|
+
// field with `undefined` and the warehouse loses the diff.
|
|
87
|
+
if (captureChangeset && e.body.length > 0) {
|
|
88
|
+
event.changeset = truncateChangeset(e.body, maxChangesetBytes);
|
|
89
|
+
}
|
|
90
|
+
events.push(event);
|
|
91
|
+
}
|
|
92
|
+
return events;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Hunks-only truncation. Mirror of live's `truncateChangeset` in
|
|
96
|
+
* clear-verdict.ts (same head + footer shape) so the wire string is
|
|
97
|
+
* byte-identical when the body fits and footer-identical on overflow.
|
|
98
|
+
*/
|
|
99
|
+
function truncateChangeset(s, maxBytes) {
|
|
100
|
+
if (maxBytes <= 0) {
|
|
101
|
+
return s;
|
|
102
|
+
}
|
|
103
|
+
const buf = Buffer.from(s, "utf-8");
|
|
104
|
+
if (buf.length <= maxBytes) {
|
|
105
|
+
return s;
|
|
106
|
+
}
|
|
107
|
+
const omitted = buf.length - maxBytes;
|
|
108
|
+
const footer = `\n... (truncated, ${omitted} bytes omitted)\n`;
|
|
109
|
+
const footerLen = Buffer.byteLength(footer, "utf-8");
|
|
110
|
+
const headLen = Math.max(0, maxBytes - footerLen);
|
|
111
|
+
const head = buf.subarray(0, headLen).toString("utf-8");
|
|
112
|
+
return head + footer;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Verify-pattern gate. Mirrors what live mode emits: a file_change is on
|
|
116
|
+
* the wire only when `requiresVerification(filePath, config)` returns true
|
|
117
|
+
* — i.e. some cycle's verifyPatterns matches AND the file isn't on the
|
|
118
|
+
* cross-cycle ignore list. Pre-fix import emitted every patch entry
|
|
119
|
+
* unconditionally, which is louder than live + a privacy concern for
|
|
120
|
+
* patterns the operator explicitly excluded.
|
|
121
|
+
*/
|
|
122
|
+
function shouldEmit(config, filePath) {
|
|
123
|
+
return (0, config_1.requiresVerification)(filePath, config);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=file-change.js.map
|