@ironbee-ai/cli 0.15.0 → 0.17.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 +8 -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 +26 -4
- 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 +20 -1
- package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verdict.d.ts +8 -1
- package/dist/clients/claude/hooks/require-verdict.d.ts.map +1 -1
- package/dist/clients/claude/hooks/require-verdict.js +9 -2
- package/dist/clients/claude/hooks/require-verdict.js.map +1 -1
- package/dist/clients/claude/hooks/require-verification.d.ts +10 -1
- package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/claude/hooks/require-verification.js +34 -6
- package/dist/clients/claude/hooks/require-verification.js.map +1 -1
- package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
- package/dist/clients/claude/hooks/session-end.js +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 +7 -2
- package/dist/clients/claude/index.d.ts.map +1 -1
- package/dist/clients/claude/index.js +72 -32
- 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 +303 -0
- package/dist/clients/codex/hooks/clear-verdict.js.map +1 -0
- package/dist/clients/codex/hooks/require-verdict.d.ts +36 -0
- package/dist/clients/codex/hooks/require-verdict.d.ts.map +1 -0
- package/dist/clients/codex/hooks/require-verdict.js +115 -0
- package/dist/clients/codex/hooks/require-verdict.js.map +1 -0
- package/dist/clients/codex/hooks/require-verification.d.ts +20 -0
- package/dist/clients/codex/hooks/require-verification.d.ts.map +1 -0
- package/dist/clients/codex/hooks/require-verification.js +156 -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 +52 -0
- package/dist/clients/codex/index.d.ts.map +1 -0
- package/dist/clients/codex/index.js +463 -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 +16 -4
- package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
- package/dist/clients/cursor/hooks/require-verdict.d.ts +7 -1
- package/dist/clients/cursor/hooks/require-verdict.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/require-verdict.js +8 -2
- package/dist/clients/cursor/hooks/require-verdict.js.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.d.ts +8 -1
- package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
- package/dist/clients/cursor/hooks/require-verification.js +27 -6
- package/dist/clients/cursor/hooks/require-verification.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 +7 -2
- package/dist/clients/cursor/index.d.ts.map +1 -1
- package/dist/clients/cursor/index.js +69 -30
- 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 +16 -2
- 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/commands/verification-toggle.d.ts +19 -0
- package/dist/commands/verification-toggle.d.ts.map +1 -1
- package/dist/commands/verification-toggle.js +88 -5
- package/dist/commands/verification-toggle.js.map +1 -1
- package/dist/commands/verification.d.ts +3 -0
- package/dist/commands/verification.d.ts.map +1 -1
- package/dist/commands/verification.js +34 -3
- package/dist/commands/verification.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 +8 -0
- package/dist/hooks/core/activity-end.d.ts.map +1 -1
- package/dist/hooks/core/activity-end.js +19 -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/hooks/core/submit-verdict.d.ts.map +1 -1
- package/dist/hooks/core/submit-verdict.js +29 -17
- package/dist/hooks/core/submit-verdict.js.map +1 -1
- package/dist/hooks/core/verification-lifecycle.d.ts +20 -0
- package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -1
- package/dist/hooks/core/verification-lifecycle.js +41 -0
- package/dist/hooks/core/verification-lifecycle.js.map +1 -1
- package/dist/hooks/core/verify-gate.d.ts.map +1 -1
- package/dist/hooks/core/verify-gate.js +11 -5
- package/dist/hooks/core/verify-gate.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 +40 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +52 -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/config/schema.d.ts.map +1 -1
- package/dist/tui/config/schema.js +8 -0
- package/dist/tui/config/schema.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,350 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex — PostToolUse hook adapter (matcher: `.*`)
|
|
4
|
+
*
|
|
5
|
+
* Two routes per tool:
|
|
6
|
+
* - **devtools MCP tools** (mcp__{browser,node,backend}-devtools__*): record
|
|
7
|
+
* a `tool_call` entry in actions.jsonl (verify-gate dep), update recording
|
|
8
|
+
* state for browser-devtools. NOT queue-submitted — devtools MCP server
|
|
9
|
+
* self-ships its own tool_call events to the collector.
|
|
10
|
+
* - **All other tools**: submit a `send_event` job to the queue with a
|
|
11
|
+
* whitelisted `tool_input` projection.
|
|
12
|
+
*
|
|
13
|
+
* Codex-specific: derive `duration` from the timing stash written by
|
|
14
|
+
* `track-action-pre.ts` (Codex hook stdin does not carry duration_ms).
|
|
15
|
+
*
|
|
16
|
+
* Codex has NO PostToolUseFailure event — failures fold into PostToolUse
|
|
17
|
+
* with the error embedded in `tool_response`. We detect failure
|
|
18
|
+
* heuristically (looking for `isError: true` on MCP responses); the
|
|
19
|
+
* `failure_type` / `is_interrupt` fields stay null (Codex provides no
|
|
20
|
+
* structured failure schema).
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.run = run;
|
|
24
|
+
const actions_1 = require("../../../hooks/core/actions");
|
|
25
|
+
const ids_1 = require("../../../import/ids");
|
|
26
|
+
const session_state_1 = require("../../../hooks/core/session-state");
|
|
27
|
+
const tool_use_stash_1 = require("../../../hooks/core/tool-use-stash");
|
|
28
|
+
const config_1 = require("../../../lib/config");
|
|
29
|
+
const logger_1 = require("../../../lib/logger");
|
|
30
|
+
const output_1 = require("../../../lib/output");
|
|
31
|
+
const stdin_1 = require("../../../lib/stdin");
|
|
32
|
+
const queue_1 = require("../../../queue");
|
|
33
|
+
const util_1 = require("../util");
|
|
34
|
+
const RECORDING_START_BARE = "bdt_content_start-recording";
|
|
35
|
+
const RECORDING_STOP_BARE = "bdt_content_stop-recording";
|
|
36
|
+
function safeStringifyBytes(value) {
|
|
37
|
+
if (value === undefined || value === null) {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
// String values (apply_patch + exec_command's custom_tool_call_output
|
|
41
|
+
// wire shape) — return the RAW UTF-8 byte count, not the JSON-encoded
|
|
42
|
+
// size. Import (`import/codex/runner.ts:318`) uses Buffer.byteLength
|
|
43
|
+
// directly on the string. Without this branch, live ships
|
|
44
|
+
// `tool_response_size = utf8(JSON.stringify("foo")) = utf8('"foo"') = 5`
|
|
45
|
+
// while import ships `utf8("foo") = 3` — 5-15% systematic inflation
|
|
46
|
+
// on every Codex tool_call with string tool_response, broken cross-
|
|
47
|
+
// pipeline parity for size aggregates.
|
|
48
|
+
if (typeof value === "string") {
|
|
49
|
+
try {
|
|
50
|
+
return Buffer.byteLength(value, "utf8");
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function detectFailure(toolResponse) {
|
|
64
|
+
if (toolResponse === undefined || toolResponse === null) {
|
|
65
|
+
return { isError: false, errorText: undefined };
|
|
66
|
+
}
|
|
67
|
+
if (typeof toolResponse === "object" && toolResponse !== null) {
|
|
68
|
+
const rec = toolResponse;
|
|
69
|
+
if (rec.isError === true || rec.is_error === true) {
|
|
70
|
+
const msg = rec.error ?? rec.message ?? rec.errorMessage;
|
|
71
|
+
return { isError: true, errorText: typeof msg === "string" ? msg : JSON.stringify(rec).slice(0, 500) };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// String tool_response (apply_patch + exec_command custom_tool_call_output
|
|
75
|
+
// shape). Same regex set as import's `looksLikeError` (`runner.ts:340-358`)
|
|
76
|
+
// + projection's `classifyOutputError`. Without this branch, every failed
|
|
77
|
+
// apply_patch / exec_command live emits `tool_call.error: undefined`
|
|
78
|
+
// despite real failure text. Cross-pipeline parity: import correctly
|
|
79
|
+
// detects these → live must too.
|
|
80
|
+
if (typeof toolResponse === "string") {
|
|
81
|
+
const t = toolResponse;
|
|
82
|
+
if (/(?:^|\n)Process exited with code [1-9]/.test(t)
|
|
83
|
+
|| /^Exit code:\s*[1-9]/m.test(t)
|
|
84
|
+
|| /apply_patch verification failed/i.test(t)
|
|
85
|
+
|| /failed to find expected lines/i.test(t)
|
|
86
|
+
|| /^\s*Error\b/.test(t)
|
|
87
|
+
|| /(?:^|\n)\[Request interrupted by user\]/.test(t)
|
|
88
|
+
// Three patterns the analytics-side classifier counts under
|
|
89
|
+
// `errors.tool_error_categories.{file_changed,file_too_large,file_not_found}`
|
|
90
|
+
// but live + import previously missed — `session_analytics.errors.tool_errors_total`
|
|
91
|
+
// incremented while the per-call `tool_call.error` shipped
|
|
92
|
+
// undefined. Backend joins `Σ tool_call where error IS NOT NULL`
|
|
93
|
+
// vs the session aggregate then diverged on every session with
|
|
94
|
+
// a `cat missing.txt` / stale-read / oversized-read.
|
|
95
|
+
|| /modified since (?:last )?read|stale read/i.test(t)
|
|
96
|
+
|| /file (?:is )?too large|exceeds/i.test(t)
|
|
97
|
+
|| /file not found|No such file or directory|does not exist/i.test(t)) {
|
|
98
|
+
return { isError: true, errorText: t.slice(0, 500) };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return { isError: false, errorText: undefined };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Read `_metadata.toolCallId` from a tool_input (PreToolUse injection by
|
|
105
|
+
* require-verification.ts). Used as the deterministic event.id so live + MCP
|
|
106
|
+
* server-shipped + import all collide cleanly on `(session_id, id)`.
|
|
107
|
+
* Validates UUID-shape so a corrupt / forged rollout can't poison the wire id.
|
|
108
|
+
*/
|
|
109
|
+
function extractMetadataToolCallId(toolInput) {
|
|
110
|
+
if (toolInput === null || typeof toolInput !== "object") {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
const meta = toolInput._metadata;
|
|
114
|
+
if (meta === null || typeof meta !== "object") {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const cid = meta.toolCallId;
|
|
118
|
+
if (typeof cid !== "string") {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
// UUID v4 shape check — same validation `import/codex/events/tool-call.ts`
|
|
122
|
+
// applies. Defensive against malformed rollouts.
|
|
123
|
+
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(cid)) {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
return cid;
|
|
127
|
+
}
|
|
128
|
+
function deriveDurationMs(sessionId, toolUseId) {
|
|
129
|
+
const stashed = (0, tool_use_stash_1.consumeToolUseData)(sessionId, toolUseId);
|
|
130
|
+
if (!stashed?.start_ns) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const delta = process.hrtime.bigint() - BigInt(stashed.start_ns);
|
|
135
|
+
return Number(delta / 1000000n);
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
logger_1.logger.debug(`failed to derive duration from stash: ${e}`);
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function run(projectDir) {
|
|
143
|
+
const input = (0, util_1.parseCodexHookStdin)((0, stdin_1.readStdin)());
|
|
144
|
+
const sessionId = input.session_id ?? "default";
|
|
145
|
+
const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
|
|
146
|
+
const actionsFile = `${sessionDir}/actions.jsonl`;
|
|
147
|
+
(0, logger_1.setLogFile)(`${sessionDir}/session.log`);
|
|
148
|
+
const rawToolName = input.tool_name ?? "";
|
|
149
|
+
const toolUseId = input.tool_use_id ?? "";
|
|
150
|
+
// tool_input is Record | string | undefined — preserve as-is for size
|
|
151
|
+
// calculation; downstream whitelist (extractCodexToolInput) handles both.
|
|
152
|
+
const toolInput = input.tool_input;
|
|
153
|
+
// Strip `_metadata` from tool_input before recording — mirrors Claude
|
|
154
|
+
// (clients/claude/hooks/track-action.ts) and Cursor
|
|
155
|
+
// (clients/cursor/hooks/track-action.ts) live behavior, and matches the
|
|
156
|
+
// canonical contract documented in `docs/claude-md/events.md`:
|
|
157
|
+
// "_metadata is stripped from tool_input before writing to actions.jsonl"
|
|
158
|
+
// Without this, the Codex devtools branch ships the internal correlation
|
|
159
|
+
// block on the wire — `traceState`, `traceId`, `userEmail`, `toolCallId`,
|
|
160
|
+
// AND `collectorApiKey` (a secret) — embedded in `tool_input` for every
|
|
161
|
+
// devtools tool_call event. Size calculations still use the raw `toolInput`
|
|
162
|
+
// so the projected vs raw input/response sizing stays unchanged.
|
|
163
|
+
const toolInputAsRecord = toolInput && typeof toolInput === "object"
|
|
164
|
+
? { ...toolInput, _metadata: undefined }
|
|
165
|
+
: undefined;
|
|
166
|
+
const toolResponse = input.tool_response;
|
|
167
|
+
const mcpServer = (0, util_1.extractCodexMcpServer)(rawToolName);
|
|
168
|
+
const isDevToolsTool = mcpServer === "browser-devtools" ||
|
|
169
|
+
mcpServer === "node-devtools" ||
|
|
170
|
+
mcpServer === "backend-devtools";
|
|
171
|
+
const durationMs = deriveDurationMs(sessionId, toolUseId);
|
|
172
|
+
const failure = detectFailure(toolResponse);
|
|
173
|
+
const classified = (0, util_1.classifyCodexTool)(rawToolName);
|
|
174
|
+
// ─── DevTools branch — record in actions.jsonl, update recording state ───
|
|
175
|
+
if (isDevToolsTool) {
|
|
176
|
+
const bareName = classified.tool_name;
|
|
177
|
+
if (bareName === RECORDING_START_BARE) {
|
|
178
|
+
(0, session_state_1.setRecordingActive)(sessionDir, true);
|
|
179
|
+
}
|
|
180
|
+
else if (bareName === RECORDING_STOP_BARE) {
|
|
181
|
+
(0, session_state_1.setRecordingActive)(sessionDir, false);
|
|
182
|
+
}
|
|
183
|
+
const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
|
|
184
|
+
// `activity_id` is ActivityAwareEvent-required (`string` typing), but the
|
|
185
|
+
// collector schema treats it as a non-empty UUID when present — emitting
|
|
186
|
+
// `activity_id: ""` would either FK-fail or be schema-rejected (same
|
|
187
|
+
// contract as round-27's fix_id treatment in clear-verdict.ts). Live
|
|
188
|
+
// Claude/Cursor use `activityId!` so JSON.stringify drops the key when
|
|
189
|
+
// undefined; Codex was the outlier shipping literal "". Cast and
|
|
190
|
+
// conditionally set so the wire field is OMITTED rather than empty.
|
|
191
|
+
const event = {
|
|
192
|
+
...(0, actions_1.baseFields)(actionsFile),
|
|
193
|
+
type: "tool_call",
|
|
194
|
+
timestamp: Date.now(),
|
|
195
|
+
tool_type: classified.tool_type,
|
|
196
|
+
tool_name: classified.tool_name,
|
|
197
|
+
mcp_server: classified.mcp_server ?? mcpServer,
|
|
198
|
+
tool_input: toolInputAsRecord,
|
|
199
|
+
// Measure POST-`_metadata`-strip — Codex rollout records the
|
|
200
|
+
// model's raw function_call.arguments WITHOUT IronBee's
|
|
201
|
+
// injected `_metadata` block, so import correctly measures the
|
|
202
|
+
// smaller post-strip byte count. Live previously measured the
|
|
203
|
+
// hook-stdin `toolInput` BEFORE strip, inflating
|
|
204
|
+
// `tool_input_size` by ~700 bytes per devtools tool_call vs
|
|
205
|
+
// import — backend `(session_id, id)` LWW dedup then flipped
|
|
206
|
+
// the field between the inflated live value and the correct
|
|
207
|
+
// import value on every re-import. Empirically verified on
|
|
208
|
+
// the real-corpus (121 Codex devtools function_calls scanned:
|
|
209
|
+
// zero carry `_metadata` in the rollout).
|
|
210
|
+
tool_input_size: safeStringifyBytes(toolInputAsRecord),
|
|
211
|
+
// Cross-client parity (Claude+Cursor zero `tool_response_size` on
|
|
212
|
+
// failure — see clients/claude/hooks/track-action.ts:210 +
|
|
213
|
+
// import/claude/events/tool-call.ts:138-140). The documented
|
|
214
|
+
// contract: "live treats `tool_response` as omitted on failure
|
|
215
|
+
// and reports `tool_response_size: 0`". Codex was the outlier
|
|
216
|
+
// shipping the error blob byte count (hundreds of bytes per
|
|
217
|
+
// failed call) — backend cross-client `AVG(tool_response_size)`
|
|
218
|
+
// partitioned by failure status was off for Codex.
|
|
219
|
+
tool_response_size: failure.isError ? 0 : safeStringifyBytes(toolResponse),
|
|
220
|
+
duration: durationMs,
|
|
221
|
+
};
|
|
222
|
+
if (activityId) {
|
|
223
|
+
event.activity_id = activityId;
|
|
224
|
+
}
|
|
225
|
+
// Live↔import event.id parity. Per CLAUDE.md events.md spec: "live
|
|
226
|
+
// and import events collide cleanly on (session_id, id)". For
|
|
227
|
+
// devtools tools, prefer `_metadata.toolCallId` (the UUID baked
|
|
228
|
+
// into tool_input by require-verification — the same id the MCP
|
|
229
|
+
// server uses on its own emitted tool_call events). Falls back to
|
|
230
|
+
// deterministic-from-tool_use_id derivation so re-import dedups
|
|
231
|
+
// without duplicating rows. Without this override, every devtools
|
|
232
|
+
// tool_call in the warehouse duplicates per re-import.
|
|
233
|
+
const metadataToolCallId = extractMetadataToolCallId(toolInput);
|
|
234
|
+
if (metadataToolCallId !== undefined) {
|
|
235
|
+
event.id = metadataToolCallId;
|
|
236
|
+
}
|
|
237
|
+
else if (toolUseId.length > 0) {
|
|
238
|
+
event.id = (0, ids_1.deriveToolCallEventIdFromToolUseId)(sessionId, toolUseId);
|
|
239
|
+
}
|
|
240
|
+
// Claude-parity: tool_use_id is the host-provided join key the
|
|
241
|
+
// devtools MCP server uses on its own emitted tool_call events.
|
|
242
|
+
// Without it, the collector cannot correlate Codex devtools
|
|
243
|
+
// tool_call records (this event) with the MCP-side events. Live-
|
|
244
|
+
// verified in Claude track-action.ts:204; import sets it too at
|
|
245
|
+
// import/codex/events/tool-call.ts:87.
|
|
246
|
+
if (toolUseId) {
|
|
247
|
+
event.tool_use_id = toolUseId;
|
|
248
|
+
}
|
|
249
|
+
const verificationId = (0, session_state_1.getActiveVerificationId)(sessionDir);
|
|
250
|
+
if (verificationId) {
|
|
251
|
+
event.verification_id = verificationId;
|
|
252
|
+
}
|
|
253
|
+
const traceId = (0, session_state_1.getActiveTraceId)(sessionDir);
|
|
254
|
+
if (traceId) {
|
|
255
|
+
event.trace_id = traceId;
|
|
256
|
+
}
|
|
257
|
+
if (failure.isError) {
|
|
258
|
+
event.error = failure.errorText;
|
|
259
|
+
}
|
|
260
|
+
await (0, actions_1.appendAction)(actionsFile, event);
|
|
261
|
+
(0, output_1.writeAndExit)(JSON.stringify({}), 0);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// ─── Non-devtools branch — queue submit for send_event ───
|
|
265
|
+
if (!(0, config_1.isJobQueueEnabled)(projectDir)) {
|
|
266
|
+
(0, output_1.writeAndExit)(JSON.stringify({}), 0);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
|
|
270
|
+
const projectedInput = (0, util_1.extractCodexToolInput)(rawToolName, toolInput);
|
|
271
|
+
const toolInputSize = safeStringifyBytes(toolInput);
|
|
272
|
+
// Cross-client parity — see devtools branch above for full rationale.
|
|
273
|
+
const toolResponseSize = failure.isError ? 0 : safeStringifyBytes(toolResponse);
|
|
274
|
+
// Same `activity_id` rule as the devtools branch above — omit field
|
|
275
|
+
// when no activity is open instead of shipping literal "".
|
|
276
|
+
const event = {
|
|
277
|
+
...(0, actions_1.baseFields)(actionsFile),
|
|
278
|
+
type: "tool_call",
|
|
279
|
+
timestamp: Date.now(),
|
|
280
|
+
tool_type: classified.tool_type,
|
|
281
|
+
tool_name: classified.tool_name || (0, util_1.normalizeCodexToolName)(rawToolName),
|
|
282
|
+
mcp_server: classified.mcp_server,
|
|
283
|
+
tool_input: projectedInput,
|
|
284
|
+
tool_input_size: toolInputSize,
|
|
285
|
+
tool_response_size: toolResponseSize,
|
|
286
|
+
duration: durationMs,
|
|
287
|
+
};
|
|
288
|
+
if (activityId) {
|
|
289
|
+
event.activity_id = activityId;
|
|
290
|
+
}
|
|
291
|
+
// Non-devtools branch: same live↔import event.id parity. No
|
|
292
|
+
// `_metadata.toolCallId` for non-devtools (require-verification only
|
|
293
|
+
// injects it for `mcp__*-devtools__*`), so use the deterministic
|
|
294
|
+
// tool_use_id formula. Without this, every apply_patch / exec_command
|
|
295
|
+
// duplicates in the warehouse on re-import.
|
|
296
|
+
if (toolUseId.length > 0) {
|
|
297
|
+
event.id = (0, ids_1.deriveToolCallEventIdFromToolUseId)(sessionId, toolUseId);
|
|
298
|
+
}
|
|
299
|
+
// Non-devtools branch also missing tool_use_id — same collector-join
|
|
300
|
+
// semantic. Both branches set when the hook provides it.
|
|
301
|
+
if (toolUseId) {
|
|
302
|
+
event.tool_use_id = toolUseId;
|
|
303
|
+
}
|
|
304
|
+
// Verification correlation parity with the devtools branch (and with
|
|
305
|
+
// Claude's track-action — see `clients/claude/hooks/track-action.ts:211`
|
|
306
|
+
// where `verification_id` / `trace_id` ride the SAME `entry` envelope
|
|
307
|
+
// through BOTH the devtools `appendAction` path AND the non-devtools
|
|
308
|
+
// queue `submitEvent` path). Codex previously set these only on the
|
|
309
|
+
// devtools branch, so a Codex session whose agent ran `apply_patch` /
|
|
310
|
+
// `exec_command` / `read_file` etc. during an active verification
|
|
311
|
+
// cycle shipped `tool_call` events with `verification_id` /
|
|
312
|
+
// `trace_id` MISSING, while the IDENTICAL Claude session shipped them
|
|
313
|
+
// populated. Backend cross-tool correlation (which native tools ran
|
|
314
|
+
// during this cycle?) broke cross-client.
|
|
315
|
+
const verificationId = (0, session_state_1.getActiveVerificationId)(sessionDir);
|
|
316
|
+
if (verificationId) {
|
|
317
|
+
event.verification_id = verificationId;
|
|
318
|
+
}
|
|
319
|
+
const traceId = (0, session_state_1.getActiveTraceId)(sessionDir);
|
|
320
|
+
if (traceId) {
|
|
321
|
+
event.trace_id = traceId;
|
|
322
|
+
}
|
|
323
|
+
if (failure.isError) {
|
|
324
|
+
event.error = failure.errorText;
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
(0, queue_1.submit)(projectDir, sessionId, queue_1.SEND_EVENT_TYPE, event);
|
|
328
|
+
}
|
|
329
|
+
catch (e) {
|
|
330
|
+
if (e instanceof queue_1.JobTooLargeError) {
|
|
331
|
+
// Wire form already strips `tool_response` upstream (only
|
|
332
|
+
// `tool_response_size` rides on the event), so overflow here
|
|
333
|
+
// means something pathological — a giant `error` string from
|
|
334
|
+
// exec_command stderr, or an unusually large `tool_input`
|
|
335
|
+
// (projected via the whitelist but still oversized for some
|
|
336
|
+
// long file path / pattern). Re-submitting with an
|
|
337
|
+
// `tool_response_omitted: true` flag (the old retry) was a
|
|
338
|
+
// no-op: nothing got smaller, the same `JobTooLargeError`
|
|
339
|
+
// fired again, and the flag never made it onto the wire. Drop
|
|
340
|
+
// cleanly here — same semantics as Claude/Cursor's
|
|
341
|
+
// `submitEvent` paths in clients/{claude,cursor}/hooks/track-action.ts.
|
|
342
|
+
logger_1.logger.debug(`track-action: wire event too large for tool_call ${rawToolName}; dropping`);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
logger_1.logger.debug(`queue submit failed for tool_call ${rawToolName}: ${e}`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
(0, output_1.writeAndExit)(JSON.stringify({}), 0);
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=track-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-action.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/track-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex — Stop hook adapter (verification-enabled mode)
|
|
3
|
+
*
|
|
4
|
+
* Runs the verify-gate; on block, returns `decision: "block"` + `reason`
|
|
5
|
+
* (Codex turns the reason into a continuation prompt → mechanically forces
|
|
6
|
+
* the agent back into the loop, same semantic as Claude's exit-2-with-stderr
|
|
7
|
+
* and Cursor's followup_message).
|
|
8
|
+
*
|
|
9
|
+
* ALSO writes a tentative `session_end` event ("Stop-as-checkpoint" pattern)
|
|
10
|
+
* with a deterministic id derived from session_id. Codex has no `SessionEnd`
|
|
11
|
+
* hook (`/quit` fires zero hooks), so every Stop is a potential session-end
|
|
12
|
+
* candidate; backend `(session_id, id)` dedup keeps only the latest snapshot.
|
|
13
|
+
*/
|
|
14
|
+
export declare function run(projectDir: string): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=verify-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-gate.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/verify-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF3D"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Codex — Stop hook adapter (verification-enabled mode)
|
|
4
|
+
*
|
|
5
|
+
* Runs the verify-gate; on block, returns `decision: "block"` + `reason`
|
|
6
|
+
* (Codex turns the reason into a continuation prompt → mechanically forces
|
|
7
|
+
* the agent back into the loop, same semantic as Claude's exit-2-with-stderr
|
|
8
|
+
* and Cursor's followup_message).
|
|
9
|
+
*
|
|
10
|
+
* ALSO writes a tentative `session_end` event ("Stop-as-checkpoint" pattern)
|
|
11
|
+
* with a deterministic id derived from session_id. Codex has no `SessionEnd`
|
|
12
|
+
* hook (`/quit` fires zero hooks), so every Stop is a potential session-end
|
|
13
|
+
* candidate; backend `(session_id, id)` dedup keeps only the latest snapshot.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.run = run;
|
|
17
|
+
const actions_1 = require("../../../hooks/core/actions");
|
|
18
|
+
const activity_1 = require("../../../hooks/core/activity");
|
|
19
|
+
const verify_gate_1 = require("../../../hooks/core/verify-gate");
|
|
20
|
+
const config_1 = require("../../../lib/config");
|
|
21
|
+
const logger_1 = require("../../../lib/logger");
|
|
22
|
+
const output_1 = require("../../../lib/output");
|
|
23
|
+
const stdin_1 = require("../../../lib/stdin");
|
|
24
|
+
const queue_1 = require("../../../queue");
|
|
25
|
+
const spawn_1 = require("../../../analytics/codex/spawn");
|
|
26
|
+
const session_state_1 = require("../../../hooks/core/session-state");
|
|
27
|
+
const util_1 = require("../util");
|
|
28
|
+
async function run(projectDir) {
|
|
29
|
+
const input = (0, util_1.parseCodexHookStdin)((0, stdin_1.readStdin)());
|
|
30
|
+
const sessionId = input.session_id ?? "default";
|
|
31
|
+
(0, logger_1.setLogFile)(`${projectDir}/.ironbee/sessions/${sessionId}/session.log`);
|
|
32
|
+
const sessionDir = `${projectDir}/.ironbee/sessions/${sessionId}`;
|
|
33
|
+
const actionsFile = `${sessionDir}/actions.jsonl`;
|
|
34
|
+
const config = (0, config_1.loadConfig)(projectDir);
|
|
35
|
+
const result = await (0, verify_gate_1.runVerifyGate)({
|
|
36
|
+
sessionId,
|
|
37
|
+
sessionDir,
|
|
38
|
+
actionsFile,
|
|
39
|
+
verdictFile: `${sessionDir}/verdict.json`,
|
|
40
|
+
maxRetries: (0, config_1.getMaxRetries)(config),
|
|
41
|
+
config,
|
|
42
|
+
projectDir,
|
|
43
|
+
});
|
|
44
|
+
// Snapshot activity_id BEFORE endActivity clears it. The detached
|
|
45
|
+
// analytics worker below uses this for `session_status.activity_id`
|
|
46
|
+
// correlation — without the pre-capture, `readState` after endActivity
|
|
47
|
+
// reads `activeActivityId: undefined` and the wire field ships as
|
|
48
|
+
// empty string. Hits 100% of Codex sessions with verification enabled.
|
|
49
|
+
const preStopActivityId = (0, session_state_1.readState)(sessionDir)?.activeActivityId ?? "";
|
|
50
|
+
if (result.action === "allow") {
|
|
51
|
+
await (0, activity_1.endActivity)({ sessionDir, actionsFile });
|
|
52
|
+
}
|
|
53
|
+
// Stop-as-checkpoint: write tentative session_end with deterministic id.
|
|
54
|
+
// Backend dedup `(session_id, id)` keeps the latest snapshot.
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
const checkpoint = {
|
|
57
|
+
...(0, actions_1.baseFields)(actionsFile),
|
|
58
|
+
id: (0, actions_1.deterministicSessionEndId)(sessionId),
|
|
59
|
+
type: "session_end",
|
|
60
|
+
timestamp: now,
|
|
61
|
+
session_id: sessionId,
|
|
62
|
+
duration: (0, actions_1.findDurationSinceLastAction)(actionsFile, "session_start", now),
|
|
63
|
+
reason: "checkpoint",
|
|
64
|
+
};
|
|
65
|
+
await (0, actions_1.appendAction)(actionsFile, checkpoint);
|
|
66
|
+
// Codex analytics: api_request + session_status + session_analytics —
|
|
67
|
+
// all emitted by the detached worker (mirror of Claude's
|
|
68
|
+
// spawnDetachedAnalyticsWorker pattern) so the Stop hook returns in
|
|
69
|
+
// ~ms. session_turn_analytics + session_context are intentionally out
|
|
70
|
+
// of scope on Codex. The worker reads new rollout bytes incrementally
|
|
71
|
+
// via state.json cursors. Failures inside the worker land in
|
|
72
|
+
// session.log; the Stop hook is never blocked.
|
|
73
|
+
try {
|
|
74
|
+
const state = (0, session_state_1.readState)(sessionDir);
|
|
75
|
+
(0, spawn_1.spawnDetachedCodexAnalyticsWorker)({
|
|
76
|
+
projectDir,
|
|
77
|
+
sessionId,
|
|
78
|
+
rolloutPath: input.transcript_path,
|
|
79
|
+
userEmail: state?.userEmail ?? undefined,
|
|
80
|
+
usageType: state?.usageType ?? undefined,
|
|
81
|
+
usagePlan: state?.usagePlan ?? undefined,
|
|
82
|
+
activityId: preStopActivityId,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
logger_1.logger.debug(`codex analytics spawn failed: ${e instanceof Error ? e.message : e}`);
|
|
87
|
+
}
|
|
88
|
+
(0, queue_1.flushInBackground)(projectDir, sessionId);
|
|
89
|
+
// Per-Stop straggler retry — re-attempt any snapshots left behind by a
|
|
90
|
+
// prior TransientError. Especially important for Codex: there's no native
|
|
91
|
+
// SessionEnd hook (`/quit` fires zero hooks per #22858), so without this
|
|
92
|
+
// transient-error snapshots accumulate forever and only manual
|
|
93
|
+
// `ironbee queue drain` recovers them.
|
|
94
|
+
(0, queue_1.flushStragglersInBackground)(projectDir, sessionId);
|
|
95
|
+
logger_1.logger.debug(`verify-gate: ${result.action}`);
|
|
96
|
+
if (result.action === "block") {
|
|
97
|
+
(0, output_1.writeAndExit)(JSON.stringify({
|
|
98
|
+
decision: "block",
|
|
99
|
+
reason: result.message ?? "Verification required.",
|
|
100
|
+
}), 0);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
(0, output_1.writeAndExit)(JSON.stringify({}), 0);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=verify-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-gate.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/verify-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI client adapter.
|
|
3
|
+
*
|
|
4
|
+
* Targets interactive Codex TUI (the developer-workstation surface).
|
|
5
|
+
* `codex exec` non-interactive mode is OUT OF SCOPE — hooks don't fire there
|
|
6
|
+
* per regression #24211.
|
|
7
|
+
*
|
|
8
|
+
* Install writes USER-LEVEL artifacts (`~/.codex/hooks.json`,
|
|
9
|
+
* `~/.codex/config.toml`) to bypass Codex's project-trust gate, plus
|
|
10
|
+
* PROJECT-LEVEL guidance (`AGENTS.md` block, `.agents/skills/<name>/SKILL.md`).
|
|
11
|
+
* Uninstall is symmetric — strips IronBee blocks, preserves user content.
|
|
12
|
+
*/
|
|
13
|
+
import { IClient } from "../base";
|
|
14
|
+
import { IronBeeConfig } from "../../lib/config";
|
|
15
|
+
export declare class CodexClient implements IClient {
|
|
16
|
+
readonly name: string;
|
|
17
|
+
detect(projectDir: string): boolean;
|
|
18
|
+
resolveProjectDir(): string;
|
|
19
|
+
install(projectDir: string, config?: IronBeeConfig): void;
|
|
20
|
+
uninstall(projectDir: string): void;
|
|
21
|
+
private cleanupArtifacts;
|
|
22
|
+
runVerifyGate(projectDir: string): Promise<void>;
|
|
23
|
+
runActivityEnd(projectDir: string): Promise<void>;
|
|
24
|
+
runSessionStart(projectDir: string): Promise<void>;
|
|
25
|
+
runActivityStart(projectDir: string): Promise<void>;
|
|
26
|
+
runRequireVerification(projectDir: string, opts?: {
|
|
27
|
+
soft?: boolean;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
runRequireVerdict(projectDir: string, opts?: {
|
|
30
|
+
soft?: boolean;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
runClearVerdict(projectDir: string): Promise<void>;
|
|
33
|
+
runTrackAction(projectDir: string): Promise<void>;
|
|
34
|
+
runTrackActionMonitor(projectDir: string): Promise<void>;
|
|
35
|
+
runTrackActionPre(projectDir: string): Promise<void>;
|
|
36
|
+
runSessionEnd(_projectDir: string): Promise<void>;
|
|
37
|
+
private mergeHooksConfig;
|
|
38
|
+
private removeIronBeeHooks;
|
|
39
|
+
private maybeDeleteEmptyHooks;
|
|
40
|
+
private mergeConfigToml;
|
|
41
|
+
private removeIronBeeMcpServers;
|
|
42
|
+
private writeAgentsMdBlock;
|
|
43
|
+
/**
|
|
44
|
+
* Write the project-level skill files. `includeSkill` controls the
|
|
45
|
+
* auto-invoked `ironbee-verification` skill (enforce only — it's the
|
|
46
|
+
* always-on "you must verify" mandate). The `$ironbee-verify` command skill
|
|
47
|
+
* is always written (it's the manual trigger, wanted in enforce + assist).
|
|
48
|
+
*/
|
|
49
|
+
private writeSkills;
|
|
50
|
+
private removeDir;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/clients/codex/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKlC,OAAO,EAGH,aAAa,EAQhB,MAAM,kBAAkB,CAAC;AA8E1B,qBAAa,WAAY,YAAW,OAAO;IACvC,SAAgB,IAAI,EAAE,MAAM,CAAW;IAEhC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAMnC,iBAAiB,IAAI,MAAM;IAI3B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI;IAoEzD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAK1C,OAAO,CAAC,gBAAgB;IAiCX,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGhD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGjD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGlD,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGnD,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpF,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAG/E,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGlD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGjD,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGxD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpD,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9D,OAAO,CAAC,gBAAgB;IA0FxB,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,kBAAkB;IAuC1B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,SAAS;CASpB"}
|