@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
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex analytics Stop-hook orchestrator.
|
|
4
|
+
*
|
|
5
|
+
* Called once per Stop hook fire (verify-gate.ts / activity-end.ts). Reads
|
|
6
|
+
* the rollout (cursor-incremental) and emits:
|
|
7
|
+
*
|
|
8
|
+
* - one or more `api_request` events (per new token_count)
|
|
9
|
+
* - one or more `session_status` events (per new token_count, gated by
|
|
10
|
+
* event-time min-interval throttle + skip-if-unchanged signature —
|
|
11
|
+
* mirror of Claude statusline cadence, see analytics.md)
|
|
12
|
+
*
|
|
13
|
+
* `session_context` is intentionally OUT OF SCOPE on Codex — the only
|
|
14
|
+
* available source (Codex's `~/.codex/logs_2.sqlite` feedback-logger DB)
|
|
15
|
+
* is selective + retention-limited (we'd see 1 of ~94 API request bodies)
|
|
16
|
+
* AND its `input`/`output` fields are redacted by the logger, so
|
|
17
|
+
* per-turn breakdown reconstruction is impossible. Rollout JSONL carries
|
|
18
|
+
* the dynamic side (user_message / function_call / function_call_output)
|
|
19
|
+
* but has NO instructions/tools, so a hybrid pipeline would still need
|
|
20
|
+
* SQLite for the static portion — net value didn't justify the complexity
|
|
21
|
+
* + native-module dependency.
|
|
22
|
+
*
|
|
23
|
+
* All events POST directly to the collector in a single batch (mirror of
|
|
24
|
+
* Claude analytics dispatch). Cursor advances are staged in-memory and
|
|
25
|
+
* only persisted on POST success — fail keeps cursor stale so the next
|
|
26
|
+
* Stop retries (deterministic event ids make retries idempotent via
|
|
27
|
+
* backend dedup). Fail-safe — analytics failures never break the Stop hook.
|
|
28
|
+
*
|
|
29
|
+
* State persistence: rollout cursor + statusline signature live under
|
|
30
|
+
* `.ironbee/sessions/<sid>/analytics-codex/state.json` (separate from the
|
|
31
|
+
* main analytics state to avoid Anthropic-specific reset semantics
|
|
32
|
+
* leaking into Codex).
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.emitCodexAnalytics = emitCodexAnalytics;
|
|
36
|
+
const fs_1 = require("fs");
|
|
37
|
+
const path_1 = require("path");
|
|
38
|
+
const logger_1 = require("../../lib/logger");
|
|
39
|
+
const actions_1 = require("../../hooks/core/actions");
|
|
40
|
+
const config_1 = require("../../lib/config");
|
|
41
|
+
const collector_1 = require("../../lib/collector");
|
|
42
|
+
const api_request_1 = require("./api-request");
|
|
43
|
+
const status_snapshot_1 = require("./status-snapshot");
|
|
44
|
+
const transcript_1 = require("./transcript");
|
|
45
|
+
function defaultState() {
|
|
46
|
+
return {
|
|
47
|
+
rollout_inode: 0,
|
|
48
|
+
rollout_size: 0,
|
|
49
|
+
rollout_read_offset: 0,
|
|
50
|
+
last_status_signature: "",
|
|
51
|
+
last_status_emit_ms: 0,
|
|
52
|
+
api_response_count: 0,
|
|
53
|
+
turn_token_seq: 0,
|
|
54
|
+
last_turn_id: null,
|
|
55
|
+
last_model: "gpt-5.5",
|
|
56
|
+
session_start_ms: 0,
|
|
57
|
+
session_meta_cached: false,
|
|
58
|
+
cumulative_cost_usd: 0,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function stateDir(projectDir, sessionId) {
|
|
62
|
+
return (0, path_1.join)(projectDir, ".ironbee", "sessions", sessionId, "analytics-codex");
|
|
63
|
+
}
|
|
64
|
+
function statePath(projectDir, sessionId) {
|
|
65
|
+
return (0, path_1.join)(stateDir(projectDir, sessionId), "state.json");
|
|
66
|
+
}
|
|
67
|
+
function readState(projectDir, sessionId) {
|
|
68
|
+
const path = statePath(projectDir, sessionId);
|
|
69
|
+
if (!(0, fs_1.existsSync)(path)) {
|
|
70
|
+
return defaultState();
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const raw = (0, fs_1.readFileSync)(path, "utf-8");
|
|
74
|
+
const parsed = JSON.parse(raw);
|
|
75
|
+
if (parsed !== null && typeof parsed === "object") {
|
|
76
|
+
// Type-safe merge: take a field from the parsed JSON only when
|
|
77
|
+
// it matches the default's typeof — protects against stale
|
|
78
|
+
// schemas, hand-edits, and JSON.stringify(NaN) → null silent
|
|
79
|
+
// type-mismatches that would otherwise survive a spread and
|
|
80
|
+
// poison downstream math (e.g. `now - null = now`).
|
|
81
|
+
return mergeValidatedState(defaultState(), parsed);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
logger_1.logger.debug(`codex emit: state read failed: ${e instanceof Error ? e.message : e}`);
|
|
86
|
+
}
|
|
87
|
+
return defaultState();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Field-by-field merge that drops any property whose typeof doesn't match
|
|
91
|
+
* the default's typeof. `null` always falls back to the default (`null`
|
|
92
|
+
* survives `JSON.stringify(NaN)` and would otherwise break arithmetic).
|
|
93
|
+
*/
|
|
94
|
+
function mergeValidatedState(base, incoming) {
|
|
95
|
+
const out = { ...base };
|
|
96
|
+
for (const [key, val] of Object.entries(incoming)) {
|
|
97
|
+
if (!(key in base)) {
|
|
98
|
+
continue; // unknown field — drop silently (forward-compat)
|
|
99
|
+
}
|
|
100
|
+
const defaultVal = base[key];
|
|
101
|
+
const defType = defaultVal === null ? "object" : typeof defaultVal;
|
|
102
|
+
const incType = val === null ? "object" : typeof val;
|
|
103
|
+
// Allow `null` only where the default also permits it (last_turn_id).
|
|
104
|
+
if (val === null && defaultVal === null) {
|
|
105
|
+
out[key] = null;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (defType !== incType) {
|
|
109
|
+
continue; // type mismatch — keep default
|
|
110
|
+
}
|
|
111
|
+
if (incType === "number" && !Number.isFinite(val)) {
|
|
112
|
+
continue; // NaN / Infinity — keep default
|
|
113
|
+
}
|
|
114
|
+
out[key] = val;
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
function writeState(projectDir, sessionId, state) {
|
|
119
|
+
const path = statePath(projectDir, sessionId);
|
|
120
|
+
try {
|
|
121
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
|
|
122
|
+
const tmp = `${path}.tmp.${process.pid}`;
|
|
123
|
+
(0, fs_1.writeFileSync)(tmp, JSON.stringify(state, null, 2), "utf-8");
|
|
124
|
+
(0, fs_1.renameSync)(tmp, path);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
logger_1.logger.debug(`codex emit: state write failed: ${e instanceof Error ? e.message : e}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Stop-hook orchestrator. Wraps each phase in try/catch so an emission
|
|
132
|
+
* failure on one event class doesn't take down the others.
|
|
133
|
+
*/
|
|
134
|
+
async function emitCodexAnalytics(opts) {
|
|
135
|
+
const config = (0, config_1.loadConfig)(opts.projectDir);
|
|
136
|
+
// Master gate — `analytics.enable: false` suspends all derived analytics
|
|
137
|
+
// events for this project (api_request / session_status). Symmetric
|
|
138
|
+
// with the Claude side and the session_analytics gate in
|
|
139
|
+
// emit.ts.
|
|
140
|
+
if (!(0, config_1.isAnalyticsEnabled)(opts.projectDir)) {
|
|
141
|
+
logger_1.logger.debug(`codex emit: analytics disabled — skipping`);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// Stop-hook gate — `analytics.emitOnStop: false` defers to SessionEnd
|
|
145
|
+
// only (Codex has no SessionEnd hook, so effectively suspends analytics
|
|
146
|
+
// emission entirely; documented behavior).
|
|
147
|
+
if (!(0, config_1.isAnalyticsEmitOnStopEnabled)(opts.projectDir)) {
|
|
148
|
+
logger_1.logger.debug(`codex emit: emitOnStop disabled — skipping`);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
let rolloutPath = opts.rolloutPath ?? null;
|
|
152
|
+
if (rolloutPath === null || !(0, fs_1.existsSync)(rolloutPath)) {
|
|
153
|
+
rolloutPath = (0, transcript_1.findCodexRolloutPath)(opts.sessionId);
|
|
154
|
+
}
|
|
155
|
+
if (rolloutPath === null) {
|
|
156
|
+
logger_1.logger.debug(`codex emit: rollout not found for session ${opts.sessionId}`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const state = readState(opts.projectDir, opts.sessionId);
|
|
160
|
+
// Claude-parity git-aware resolution — MUST match emit.ts (session_analytics)
|
|
161
|
+
// pipeline. Same Stop fires BOTH events-emit AND emit; if these two used
|
|
162
|
+
// different project_name derivation, the wire would carry two distinct
|
|
163
|
+
// project labels for the same session (api_request says "foo", session_analytics
|
|
164
|
+
// says "proj"), breaking backend `session_analytics ⋈ api_request` joins
|
|
165
|
+
// for sessions launched from a subdir. Confirmed parity bug found in
|
|
166
|
+
// round-13 review; fix mirrors src/import/codex/discovery.ts:141.
|
|
167
|
+
const projectName = opts.projectName ?? (0, actions_1.resolveProjectName)(opts.projectDir);
|
|
168
|
+
// ─── Read new rollout bytes (or use worker-preloaded lines) ──────────────
|
|
169
|
+
let newLines = [];
|
|
170
|
+
let nextRolloutOffset = state.rollout_read_offset;
|
|
171
|
+
let sessionMetaFromSlice = null;
|
|
172
|
+
let resetDetected = false;
|
|
173
|
+
if (opts.preloadedLines !== undefined) {
|
|
174
|
+
// Worker pre-parsed the whole rollout once for both pipelines.
|
|
175
|
+
// We process every line — deterministic event ids dedup the
|
|
176
|
+
// already-seen ones at the backend. Advance the cursor to the
|
|
177
|
+
// current file size so a future Stop without preloadedLines
|
|
178
|
+
// resumes incrementally from end-of-file.
|
|
179
|
+
newLines = opts.preloadedLines;
|
|
180
|
+
for (const ln of opts.preloadedLines) {
|
|
181
|
+
if (ln.type === "session_meta" && sessionMetaFromSlice === null) {
|
|
182
|
+
sessionMetaFromSlice = ln.payload;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const stats = (0, fs_1.statSync)(rolloutPath);
|
|
188
|
+
nextRolloutOffset = Number(stats.size);
|
|
189
|
+
if (state.rollout_inode !== 0 && Number(stats.ino) !== state.rollout_inode) {
|
|
190
|
+
resetDetected = true;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// ignore — cursor update handled in finally section
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
try {
|
|
199
|
+
const slice = readNewRolloutLines(rolloutPath, state.rollout_read_offset, state.rollout_inode, state.rollout_size);
|
|
200
|
+
newLines = slice.lines;
|
|
201
|
+
nextRolloutOffset = slice.nextOffset;
|
|
202
|
+
sessionMetaFromSlice = slice.sessionMeta;
|
|
203
|
+
resetDetected = slice.resetDetected;
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
logger_1.logger.debug(`codex emit: rollout read failed: ${e instanceof Error ? e.message : e}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Reset-cache wipe must run BEFORE the cache-on-first-read block so
|
|
210
|
+
// that the SAME emit re-caches from the new rollout's session_meta
|
|
211
|
+
// line. Earlier ordering (cache → reset) wiped session_meta_cached
|
|
212
|
+
// back to false but never re-cached in the same call, leaving the
|
|
213
|
+
// post-reset emit with cached=false and session_status emission
|
|
214
|
+
// gated off (the gate at the session_status block requires
|
|
215
|
+
// session_meta_cached=true). The next Stop would self-heal but at
|
|
216
|
+
// the cost of skipping one rollout-rotation tick.
|
|
217
|
+
if (resetDetected) {
|
|
218
|
+
state.rollout_read_offset = 0;
|
|
219
|
+
state.turn_token_seq = 0;
|
|
220
|
+
state.last_turn_id = null;
|
|
221
|
+
state.api_response_count = 0;
|
|
222
|
+
state.session_meta_cached = false;
|
|
223
|
+
state.session_start_ms = 0;
|
|
224
|
+
// Reset the cumulative-cost accumulator too — a rollout-rotation
|
|
225
|
+
// means the prior session is gone and we restart from zero on the
|
|
226
|
+
// new file. Without this, the next session_status would carry the
|
|
227
|
+
// prior session's cost plus the new session's accruals.
|
|
228
|
+
state.cumulative_cost_usd = 0;
|
|
229
|
+
// Wipe statusline throttle + skip-if-unchanged state too. The
|
|
230
|
+
// prior rollout's last emit timestamp and signature carry no
|
|
231
|
+
// meaning for the new rollout — leaving them set would:
|
|
232
|
+
// (a) throttle out the new rollout's first session_status if
|
|
233
|
+
// the prior rollout's last emit happened within
|
|
234
|
+
// statusLine.emitMinIntervalSeconds (default 10s) before
|
|
235
|
+
// rotation;
|
|
236
|
+
// (b) silently dedup-skip the first post-rotation event when
|
|
237
|
+
// the signatures incidentally collide (same model + cw +
|
|
238
|
+
// cost-after-reset=0 + rate_limits).
|
|
239
|
+
// Either case loses the first wire tick of the new rollout —
|
|
240
|
+
// backend's session_status timeline would have a gap.
|
|
241
|
+
state.last_status_signature = "";
|
|
242
|
+
state.last_status_emit_ms = 0;
|
|
243
|
+
// Wipe `last_model` too — the prior rollout's model has no
|
|
244
|
+
// bearing on the new file's content. Any `token_count` line in
|
|
245
|
+
// the new rollout slice that arrives BEFORE its first
|
|
246
|
+
// `turn_context` line would otherwise be priced + labeled at
|
|
247
|
+
// the prior rollout's model rate (api-request.ts:135
|
|
248
|
+
// `computeCodexCost(currentModel, …)` + line 153
|
|
249
|
+
// `model: currentModel`). The default mirrors `defaultState()`
|
|
250
|
+
// so the very-first-tick fallback is identical to a fresh
|
|
251
|
+
// session.
|
|
252
|
+
state.last_model = "gpt-5.5";
|
|
253
|
+
}
|
|
254
|
+
// Cache session_meta + session_start_ms on first successful read
|
|
255
|
+
// (also runs immediately after a reset wipe — that's the whole point
|
|
256
|
+
// of putting it AFTER the reset block).
|
|
257
|
+
if (sessionMetaFromSlice !== null && !state.session_meta_cached) {
|
|
258
|
+
// Guard against malformed session_meta timestamp — NaN would
|
|
259
|
+
// poison every subsequent `cost.total_duration` and the cached
|
|
260
|
+
// state.json (NaN→null on JSON.stringify, then defaults back to 0
|
|
261
|
+
// on next read, causing intermittent zero-duration bugs).
|
|
262
|
+
const startMs = Date.parse(sessionMetaFromSlice.timestamp);
|
|
263
|
+
state.session_start_ms = Number.isFinite(startMs) ? startMs : 0;
|
|
264
|
+
state.session_meta_cached = true;
|
|
265
|
+
state.last_model = (0, api_request_1.defaultModelFromSessionMeta)(sessionMetaFromSlice);
|
|
266
|
+
}
|
|
267
|
+
// Collect all events from each phase into a single batch. ALL cursor
|
|
268
|
+
// advances are staged in locals and committed atomically only AFTER
|
|
269
|
+
// POST success. On POST failure the cursor stays stale so the next
|
|
270
|
+
// Stop retries the exact same rollout rows + the deterministic event
|
|
271
|
+
// ids dedup at the backend. Half-staging (some fields direct, some
|
|
272
|
+
// staged) would produce duplicate api_request ids on retry.
|
|
273
|
+
const batch = [];
|
|
274
|
+
let statusSigStaged = null;
|
|
275
|
+
let statusEmitMsStaged = null;
|
|
276
|
+
// When the worker supplied `preloadedLines`, `newLines` holds the WHOLE
|
|
277
|
+
// rollout (process-analytics.ts:54-61 parses the full file once for
|
|
278
|
+
// both pipelines). In that case the walk is from-zero, so the staged
|
|
279
|
+
// accumulators MUST start at 0 / null — otherwise every Stop after the
|
|
280
|
+
// first double-counts the prior emit's cumulative totals (Stop 2 ships
|
|
281
|
+
// `cumulative_cost_usd = prior + Σ(all rollout)`; Stop 3 ships
|
|
282
|
+
// `2×prior + Σ(all rollout)`; etc.). Wire impact:
|
|
283
|
+
// `session_status.cost.total_cost_usd` grows ~Nx by the Nth Stop, and
|
|
284
|
+
// `session_status.id` derivation (uses `apiResponseCount`) walks a
|
|
285
|
+
// shifted namespace so deterministic dedup breaks. The incremental
|
|
286
|
+
// path (no preloadedLines, cursor-based slice) is unaffected.
|
|
287
|
+
const fullWalk = opts.preloadedLines !== undefined;
|
|
288
|
+
let apiResponseCountStaged = fullWalk ? 0 : state.api_response_count;
|
|
289
|
+
let lastTurnIdStaged = fullWalk ? null : state.last_turn_id;
|
|
290
|
+
let turnTokenSeqStaged = fullWalk ? 0 : state.turn_token_seq;
|
|
291
|
+
// Even on a full-walk, seed the model from `state.last_model` (which is
|
|
292
|
+
// already either the session_meta default cached at line ~357 or
|
|
293
|
+
// `"gpt-5.5"` after a reset). An earlier version cleared this to `""`
|
|
294
|
+
// on the assumption that `session_meta` lines in the walk would
|
|
295
|
+
// re-populate it — they do not (`deriveCodexApiRequestEvents` only
|
|
296
|
+
// advances `currentModel` on `turn_context` lines). Any `token_count`
|
|
297
|
+
// that precedes the first `turn_context` in the slice would otherwise
|
|
298
|
+
// ship `api_request.model = ""` (diverges from Claude's `<unknown>`
|
|
299
|
+
// fallback AND from the import path which passes
|
|
300
|
+
// `defaultModelFromSessionMeta`). `state.last_model` always carries a
|
|
301
|
+
// sensible value by this point.
|
|
302
|
+
let lastModelStaged = state.last_model;
|
|
303
|
+
let cumulativeCostUsdStaged = fullWalk ? 0 : state.cumulative_cost_usd;
|
|
304
|
+
// ─── api_request + session_status: single interleaved walk ──────────────
|
|
305
|
+
// One token_count walk drives BOTH event types so:
|
|
306
|
+
// - api_request gets one event per token_count (rate-limit / cost
|
|
307
|
+
// audit, default-on)
|
|
308
|
+
// - session_status emits per-token_count too, gated by event-time
|
|
309
|
+
// throttle + skip-if-unchanged. Mirrors Claude statusline cadence:
|
|
310
|
+
// a long single-prompt turn that fires many API calls now produces
|
|
311
|
+
// a context-growth time series, not just one final snapshot.
|
|
312
|
+
//
|
|
313
|
+
// Throttle uses EVENT-TIME (`tc.ts - runningLastEmitMs`), NOT wall-clock
|
|
314
|
+
// `Date.now()`. The detached worker processes many token_counts in one
|
|
315
|
+
// pass; wall-clock would skip every emit after the first within a
|
|
316
|
+
// single Stop (now-now ≈ 0ms < throttle window), collapsing back to
|
|
317
|
+
// legacy "one session_status per Stop" behavior. Event-time spaces
|
|
318
|
+
// emits across the real session timeline regardless of how many
|
|
319
|
+
// token_counts land in one batch.
|
|
320
|
+
//
|
|
321
|
+
// The walk advances turn cursors + api-response counter even when the
|
|
322
|
+
// api_request emit gate is off (`analytics.emitApiRequestEvents: false`),
|
|
323
|
+
// because session_status' cumulative `total_cost_usd` and event id
|
|
324
|
+
// derivation depend on those running totals.
|
|
325
|
+
const emitApiRequest = (0, config_1.isAnalyticsApiRequestEventsEnabled)(opts.projectDir);
|
|
326
|
+
const sessionStatusGate = (0, config_1.isSessionStatusEnabled)(config) && state.session_meta_cached;
|
|
327
|
+
const minIntervalMs = Math.max(0, (0, config_1.getStatusLineEmitMinIntervalSeconds)(config)) * 1000;
|
|
328
|
+
let runningLastEmitMs = state.last_status_emit_ms;
|
|
329
|
+
let runningLastSig = state.last_status_signature;
|
|
330
|
+
let didEmitStatus = false;
|
|
331
|
+
if (newLines.length > 0) {
|
|
332
|
+
try {
|
|
333
|
+
const ctx = {
|
|
334
|
+
sessionId: opts.sessionId,
|
|
335
|
+
projectName,
|
|
336
|
+
userEmail: opts.userEmail,
|
|
337
|
+
usageType: opts.usageType,
|
|
338
|
+
usagePlan: opts.usagePlan,
|
|
339
|
+
// `state.last_model` is the right default for both walks.
|
|
340
|
+
// It's set to the session_meta default at line ~357 right
|
|
341
|
+
// after caching, or to `"gpt-5.5"` after rollout-rotation
|
|
342
|
+
// reset, so pre-first-`turn_context` `token_count` events
|
|
343
|
+
// get a sensible model label instead of empty string.
|
|
344
|
+
defaultModel: state.last_model,
|
|
345
|
+
};
|
|
346
|
+
const { events, tokenCounts, finalState } = (0, api_request_1.deriveCodexApiRequestEvents)(newLines, ctx, {
|
|
347
|
+
turn_id: lastTurnIdStaged,
|
|
348
|
+
turn_token_seq: turnTokenSeqStaged,
|
|
349
|
+
model: lastModelStaged,
|
|
350
|
+
});
|
|
351
|
+
for (let i = 0; i < events.length; i++) {
|
|
352
|
+
const ev = events[i];
|
|
353
|
+
const { tc, ts } = tokenCounts[i];
|
|
354
|
+
if (emitApiRequest) {
|
|
355
|
+
batch.push(ev);
|
|
356
|
+
}
|
|
357
|
+
apiResponseCountStaged += 1;
|
|
358
|
+
// Accumulate per-call cost regardless of the api_request
|
|
359
|
+
// emit gate — session_status' cumulative `total_cost_usd`
|
|
360
|
+
// needs the full session total even when api_request events
|
|
361
|
+
// are suppressed by `analytics.emitApiRequestEvents: false`.
|
|
362
|
+
if (Number.isFinite(ev.cost_usd)) {
|
|
363
|
+
cumulativeCostUsdStaged += ev.cost_usd;
|
|
364
|
+
}
|
|
365
|
+
// Per-token_count session_status emit. Event-time throttle
|
|
366
|
+
// + skip-if-unchanged + per-call running model so a
|
|
367
|
+
// mid-slice turn_context switch is reflected in the next
|
|
368
|
+
// status emit's `model` label (not just the slice-end
|
|
369
|
+
// model).
|
|
370
|
+
if (!sessionStatusGate) {
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
if (minIntervalMs > 0 && ts - runningLastEmitMs < minIntervalMs) {
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
const statusCtx = {
|
|
378
|
+
sessionId: opts.sessionId,
|
|
379
|
+
projectName,
|
|
380
|
+
userEmail: opts.userEmail,
|
|
381
|
+
usageType: opts.usageType,
|
|
382
|
+
usagePlan: opts.usagePlan,
|
|
383
|
+
// Use THIS event's model — captures intra-slice
|
|
384
|
+
// turn_context switches accurately (old "latest
|
|
385
|
+
// only" code happened to be correct because it
|
|
386
|
+
// only emitted from the slice's last token_count;
|
|
387
|
+
// per-iteration must use ev.model explicitly).
|
|
388
|
+
model: ev.model,
|
|
389
|
+
sessionStartMs: state.session_start_ms,
|
|
390
|
+
// Already incremented above — reflects this
|
|
391
|
+
// token_count, so event ids are unique per emit.
|
|
392
|
+
apiResponseCount: apiResponseCountStaged,
|
|
393
|
+
activityId: opts.activityId ?? "",
|
|
394
|
+
// Cumulative through THIS call (already added above).
|
|
395
|
+
totalCostUsd: cumulativeCostUsdStaged,
|
|
396
|
+
};
|
|
397
|
+
const sev = (0, status_snapshot_1.buildCodexSessionStatusEvent)(tc, ts, statusCtx);
|
|
398
|
+
if (sev === null) {
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
const sig = (0, status_snapshot_1.computeCodexStatusSignature)(sev);
|
|
402
|
+
if (sig === runningLastSig) {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
batch.push(sev);
|
|
406
|
+
runningLastSig = sig;
|
|
407
|
+
runningLastEmitMs = ts;
|
|
408
|
+
didEmitStatus = true;
|
|
409
|
+
}
|
|
410
|
+
catch (e) {
|
|
411
|
+
logger_1.logger.debug(`codex emit: session_status failed: ${e instanceof Error ? e.message : e}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
lastTurnIdStaged = finalState.turn_id;
|
|
415
|
+
turnTokenSeqStaged = finalState.turn_token_seq;
|
|
416
|
+
lastModelStaged = finalState.model;
|
|
417
|
+
}
|
|
418
|
+
catch (e) {
|
|
419
|
+
logger_1.logger.debug(`codex emit: api_request derivation failed: ${e instanceof Error ? e.message : e}`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// Stage status gate state for POST-success commit. `runningLastEmitMs`
|
|
423
|
+
// now carries event-time (not wall-clock), so the gate next slice
|
|
424
|
+
// compares against real session-time progression.
|
|
425
|
+
if (didEmitStatus) {
|
|
426
|
+
statusSigStaged = runningLastSig;
|
|
427
|
+
statusEmitMsStaged = runningLastEmitMs;
|
|
428
|
+
}
|
|
429
|
+
// ─── Single batched POST (mirrors Claude analytics dispatch) ────────────
|
|
430
|
+
// Direct POST instead of the `send_event` queue because (a) api_request /
|
|
431
|
+
// session_status are already running in a detached worker so collector
|
|
432
|
+
// backpressure is acceptable, (b) symmetry with the session_analytics
|
|
433
|
+
// path which already POSTs directly.
|
|
434
|
+
if (batch.length > 0) {
|
|
435
|
+
if (!(0, config_1.isCollectorConfigured)(config)) {
|
|
436
|
+
logger_1.logger.debug(`codex emit: collector not configured — dropping batch=${batch.length}`);
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
try {
|
|
440
|
+
await (0, collector_1.sendEventsBatchToCollector)(batch, opts.sessionId, opts.projectDir);
|
|
441
|
+
}
|
|
442
|
+
catch (e) {
|
|
443
|
+
logger_1.logger.debug(`codex emit: POST batch=${batch.length} failed: ${e instanceof Error ? e.message : e}`);
|
|
444
|
+
return; // do NOT advance cursor on failure → next Stop retries
|
|
445
|
+
}
|
|
446
|
+
// Commit POST-gated staging only on success. `last_status_signature`
|
|
447
|
+
// and `last_status_emit_ms` belong here because they gate FUTURE
|
|
448
|
+
// session_status emission — committing them on POST failure would
|
|
449
|
+
// suppress a session_status that never reached the collector.
|
|
450
|
+
if (statusSigStaged !== null && statusEmitMsStaged !== null) {
|
|
451
|
+
state.last_status_signature = statusSigStaged;
|
|
452
|
+
state.last_status_emit_ms = statusEmitMsStaged;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// Walk-state accumulators are POST-independent — they reflect what we
|
|
456
|
+
// OBSERVED in the rollout, not what we successfully POSTed. They MUST
|
|
457
|
+
// commit on every successful walk (including batch=0 cases like
|
|
458
|
+
// `emitApiRequestEvents: false` + session_status throttled/unchanged),
|
|
459
|
+
// otherwise the cursor advances past lines whose accumulation was lost.
|
|
460
|
+
// Trigger: gate off + status quiet → next emit re-derives from stale
|
|
461
|
+
// state → wrong `session_status.cost.total_cost_usd`, wrong
|
|
462
|
+
// `api_request.turn_id`, colliding `session_status.id`. The cursor
|
|
463
|
+
// advance below (skipped only on POST-failure early return) guarantees
|
|
464
|
+
// these accumulators can't be re-derived from rollout next time, so
|
|
465
|
+
// failing to commit them strands the accounting permanently.
|
|
466
|
+
state.api_response_count = apiResponseCountStaged;
|
|
467
|
+
state.last_turn_id = lastTurnIdStaged;
|
|
468
|
+
state.turn_token_seq = turnTokenSeqStaged;
|
|
469
|
+
state.last_model = lastModelStaged;
|
|
470
|
+
state.cumulative_cost_usd = cumulativeCostUsdStaged;
|
|
471
|
+
// ─── Persist cursor state ───────────────────────────────────────────────
|
|
472
|
+
// Skipped entirely when the POST failure path early-returned above —
|
|
473
|
+
// that's the correct "don't advance cursor on POST failure" invariant.
|
|
474
|
+
try {
|
|
475
|
+
state.rollout_read_offset = nextRolloutOffset;
|
|
476
|
+
const stats = (0, fs_1.statSync)(rolloutPath);
|
|
477
|
+
state.rollout_inode = Number(stats.ino);
|
|
478
|
+
state.rollout_size = Number(stats.size);
|
|
479
|
+
writeState(opts.projectDir, opts.sessionId, state);
|
|
480
|
+
}
|
|
481
|
+
catch (e) {
|
|
482
|
+
logger_1.logger.debug(`codex emit: state persist failed: ${e instanceof Error ? e.message : e}`);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/** Read new rollout lines from `state.rollout_read_offset` onwards. */
|
|
486
|
+
function readNewRolloutLines(path, fromOffset, prevInode, prevSize) {
|
|
487
|
+
const stats = (0, fs_1.statSync)(path);
|
|
488
|
+
const currentInode = Number(stats.ino);
|
|
489
|
+
const currentSize = Number(stats.size);
|
|
490
|
+
let resetDetected = false;
|
|
491
|
+
let startOffset = fromOffset;
|
|
492
|
+
if (prevInode !== 0 && currentInode !== prevInode) {
|
|
493
|
+
resetDetected = true;
|
|
494
|
+
startOffset = 0;
|
|
495
|
+
}
|
|
496
|
+
if (prevSize !== 0 && currentSize < prevSize) {
|
|
497
|
+
// Truncated/rewritten
|
|
498
|
+
resetDetected = true;
|
|
499
|
+
startOffset = 0;
|
|
500
|
+
}
|
|
501
|
+
if (startOffset >= currentSize) {
|
|
502
|
+
return { lines: [], nextOffset: startOffset, sessionMeta: null, resetDetected };
|
|
503
|
+
}
|
|
504
|
+
// Byte-range read — only load the new tail starting at `startOffset`.
|
|
505
|
+
// The earlier readFileSync + raw.slice(startOffset) allocated the whole
|
|
506
|
+
// file as a string just to discard the prefix. For a 5MB rollout where
|
|
507
|
+
// new data is 10KB, that's a 500× memory waste per Stop.
|
|
508
|
+
const sliceLen = currentSize - startOffset;
|
|
509
|
+
const buf = Buffer.alloc(sliceLen);
|
|
510
|
+
const fd = (0, fs_1.openSync)(path, "r");
|
|
511
|
+
try {
|
|
512
|
+
(0, fs_1.readSync)(fd, buf, 0, sliceLen, startOffset);
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
try {
|
|
516
|
+
(0, fs_1.closeSync)(fd);
|
|
517
|
+
}
|
|
518
|
+
catch { /* ignore */ }
|
|
519
|
+
}
|
|
520
|
+
const slice = buf.toString("utf-8");
|
|
521
|
+
const lines = [];
|
|
522
|
+
let sessionMeta = null;
|
|
523
|
+
let cursor = 0;
|
|
524
|
+
let lastCompleteByte = startOffset;
|
|
525
|
+
while (cursor < slice.length) {
|
|
526
|
+
const nlIdx = slice.indexOf("\n", cursor);
|
|
527
|
+
if (nlIdx < 0) {
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
const lineStr = slice.slice(cursor, nlIdx);
|
|
531
|
+
const startInFile = startOffset + cursor;
|
|
532
|
+
const endInFile = startOffset + nlIdx + 1;
|
|
533
|
+
if (lineStr.length > 0) {
|
|
534
|
+
try {
|
|
535
|
+
const parsed = JSON.parse(lineStr);
|
|
536
|
+
lines.push(parsed);
|
|
537
|
+
if (parsed.type === "session_meta" && sessionMeta === null) {
|
|
538
|
+
sessionMeta = parsed.payload;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
catch (e) {
|
|
542
|
+
logger_1.logger.debug(`codex emit: malformed rollout line at byte ${startInFile}: ${e instanceof Error ? e.message : e}`);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
lastCompleteByte = endInFile;
|
|
546
|
+
cursor = nlIdx + 1;
|
|
547
|
+
}
|
|
548
|
+
// If we never read session_meta from this slice but startOffset is 0,
|
|
549
|
+
// we just don't have one — caller already handles that.
|
|
550
|
+
if (sessionMeta === null && startOffset === 0 && lines.length > 0 && lines[0].type === "session_meta") {
|
|
551
|
+
sessionMeta = lines[0].payload;
|
|
552
|
+
}
|
|
553
|
+
return { lines, nextOffset: lastCompleteByte, sessionMeta, resetDetected };
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=events-emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events-emit.js","sourceRoot":"","sources":["../../../src/analytics/codex/events-emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex CLI model pricing — USD per 1M tokens.
|
|
3
|
+
*
|
|
4
|
+
* Source: https://developers.openai.com/api/docs/pricing (May 2026 snapshot).
|
|
5
|
+
*
|
|
6
|
+
* Codex single-tier `cached_input_tokens` — no 5m/1h split like Anthropic.
|
|
7
|
+
* `reasoning_output_tokens` is billed at the output rate (per OpenAI's
|
|
8
|
+
* documented pricing model).
|
|
9
|
+
*
|
|
10
|
+
* Long-context tier kicks in above `long_context_threshold` input tokens;
|
|
11
|
+
* we currently apply that tier when `input_tokens > threshold`. Refine if
|
|
12
|
+
* production telemetry shows OpenAI changes the per-request threshold rule.
|
|
13
|
+
*
|
|
14
|
+
* Backend may recompute from raw token counts with authoritative pricing.
|
|
15
|
+
* This is a best-effort client estimate so analytics carry a `cost_usd`
|
|
16
|
+
* field without a network call.
|
|
17
|
+
*/
|
|
18
|
+
import { CodexTokenUsage } from "./types";
|
|
19
|
+
export interface CodexModelPricing {
|
|
20
|
+
/** USD per 1M fresh (non-cached) input tokens. */
|
|
21
|
+
input_per_1m_usd: number;
|
|
22
|
+
/** USD per 1M cached input tokens (prompt cache hit). */
|
|
23
|
+
cached_input_per_1m_usd: number;
|
|
24
|
+
/** USD per 1M output tokens (`output_tokens` field already includes `reasoning_output_tokens` as a subset; total_tokens = input + output empirically across real rollouts). */
|
|
25
|
+
output_per_1m_usd: number;
|
|
26
|
+
/** Long-context threshold (input tokens). Above this, long-context rates apply. */
|
|
27
|
+
long_context_threshold?: number;
|
|
28
|
+
/** USD per 1M input tokens in the long-context tier. */
|
|
29
|
+
long_input_per_1m_usd?: number;
|
|
30
|
+
/** USD per 1M output tokens in the long-context tier. */
|
|
31
|
+
long_output_per_1m_usd?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Exact-id pricing keys. Falls back to GPT-5.5 default for unrecognized
|
|
35
|
+
* model strings (Codex model_provider tag is coarse — `"openai"` — and
|
|
36
|
+
* the precise model id comes through `TurnContextItem.model`).
|
|
37
|
+
*/
|
|
38
|
+
export declare const CODEX_PRICING: Record<string, CodexModelPricing>;
|
|
39
|
+
/**
|
|
40
|
+
* Resolve pricing by exact id with family-prefix fallback. Returns `null` for
|
|
41
|
+
* a completely unknown model (mirrors Claude's `lookupPricing` semantic at
|
|
42
|
+
* `analytics/claude/pricing.ts`). Without null on miss, an unrecognized
|
|
43
|
+
* model id was silently priced at gpt-5.5 default rates — backend cost
|
|
44
|
+
* dashboards couldn't distinguish "real gpt-5.5 session" from "unknown-
|
|
45
|
+
* model session estimated at gpt-5.5 rates", and the Claude vs Codex
|
|
46
|
+
* unknown-model semantics diverged (Claude shipped `cost_usd: 0` as a
|
|
47
|
+
* data-quality flag; Codex shipped a positive estimate).
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveCodexPricing(model: string | null | undefined): CodexModelPricing | null;
|
|
50
|
+
/**
|
|
51
|
+
* Compute USD cost for one API call's token usage. Long-context tier
|
|
52
|
+
* applies above the configured threshold; otherwise standard rates apply.
|
|
53
|
+
*
|
|
54
|
+
* Returns 0 when both input and output are 0 (defensive — never throws).
|
|
55
|
+
*/
|
|
56
|
+
export declare function computeCodexCost(model: string | null | undefined, usage: CodexTokenUsage | null | undefined): number;
|
|
57
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/analytics/codex/pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAC9B,kDAAkD;IAClD,gBAAgB,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,uBAAuB,EAAE,MAAM,CAAC;IAChC,+KAA+K;IAC/K,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wDAAwD;IACxD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yDAAyD;IACzD,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA6B3D,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,CAgB9F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAC1C,MAAM,CAuCR"}
|