@ironbee-ai/cli 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +19 -8
  2. package/README.md +163 -3
  3. package/dist/analysis/code-changes.d.ts +22 -0
  4. package/dist/analysis/code-changes.d.ts.map +1 -0
  5. package/dist/analysis/code-changes.js +141 -0
  6. package/dist/analysis/code-changes.js.map +1 -0
  7. package/dist/analysis/cross-session.d.ts +34 -0
  8. package/dist/analysis/cross-session.d.ts.map +1 -0
  9. package/dist/analysis/cross-session.js +230 -0
  10. package/dist/analysis/cross-session.js.map +1 -0
  11. package/dist/analysis/fix-effectiveness.d.ts +16 -0
  12. package/dist/analysis/fix-effectiveness.d.ts.map +1 -0
  13. package/dist/analysis/fix-effectiveness.js +99 -0
  14. package/dist/analysis/fix-effectiveness.js.map +1 -0
  15. package/dist/analysis/scoring.d.ts +15 -0
  16. package/dist/analysis/scoring.d.ts.map +1 -0
  17. package/dist/analysis/scoring.js +57 -0
  18. package/dist/analysis/scoring.js.map +1 -0
  19. package/dist/analysis/time-analysis.d.ts +22 -0
  20. package/dist/analysis/time-analysis.d.ts.map +1 -0
  21. package/dist/analysis/time-analysis.js +174 -0
  22. package/dist/analysis/time-analysis.js.map +1 -0
  23. package/dist/analysis/verdict-details.d.ts +23 -0
  24. package/dist/analysis/verdict-details.d.ts.map +1 -0
  25. package/dist/analysis/verdict-details.js +59 -0
  26. package/dist/analysis/verdict-details.js.map +1 -0
  27. package/dist/analysis/verification-quality.d.ts +19 -0
  28. package/dist/analysis/verification-quality.d.ts.map +1 -0
  29. package/dist/analysis/verification-quality.js +182 -0
  30. package/dist/analysis/verification-quality.js.map +1 -0
  31. package/dist/clients/base.d.ts +2 -0
  32. package/dist/clients/base.d.ts.map +1 -1
  33. package/dist/clients/claude/commands/ironbee-analyze.md +42 -0
  34. package/dist/clients/claude/commands/ironbee-verify.md +127 -0
  35. package/dist/clients/claude/hooks/clear-verdict.js +1 -1
  36. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  37. package/dist/clients/claude/hooks/require-verification.d.ts +15 -0
  38. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -0
  39. package/dist/clients/claude/hooks/require-verification.js +63 -0
  40. package/dist/clients/claude/hooks/require-verification.js.map +1 -0
  41. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  42. package/dist/clients/claude/hooks/session-start.js +7 -0
  43. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  44. package/dist/clients/claude/hooks/track-action.d.ts +1 -1
  45. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  46. package/dist/clients/claude/hooks/track-action.js +58 -13
  47. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  48. package/dist/clients/claude/hooks/verify-gate.js +1 -1
  49. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  50. package/dist/clients/claude/index.d.ts +2 -0
  51. package/dist/clients/claude/index.d.ts.map +1 -1
  52. package/dist/clients/claude/index.js +51 -19
  53. package/dist/clients/claude/index.js.map +1 -1
  54. package/dist/clients/claude/rule.md +10 -7
  55. package/dist/clients/claude/skill.md +13 -8
  56. package/dist/clients/claude/skills/ironbee-analyze.md +39 -0
  57. package/dist/clients/cursor/commands/ironbee-analyze/SKILL.md +48 -0
  58. package/dist/clients/cursor/commands/ironbee-verify/SKILL.md +133 -0
  59. package/dist/clients/cursor/hooks/clear-verdict.js +1 -1
  60. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  61. package/dist/clients/cursor/hooks/require-verification.d.ts +15 -0
  62. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -0
  63. package/dist/clients/cursor/hooks/require-verification.js +65 -0
  64. package/dist/clients/cursor/hooks/require-verification.js.map +1 -0
  65. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  66. package/dist/clients/cursor/hooks/session-start.js +3 -0
  67. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  68. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  69. package/dist/clients/cursor/hooks/track-action.js +62 -12
  70. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  71. package/dist/clients/cursor/hooks/verify-gate.js +1 -1
  72. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  73. package/dist/clients/cursor/index.d.ts +2 -0
  74. package/dist/clients/cursor/index.d.ts.map +1 -1
  75. package/dist/clients/cursor/index.js +41 -16
  76. package/dist/clients/cursor/index.js.map +1 -1
  77. package/dist/clients/cursor/rule.md +10 -7
  78. package/dist/clients/cursor/skill.md +13 -8
  79. package/dist/commands/analyze.d.ts +3 -0
  80. package/dist/commands/analyze.d.ts.map +1 -0
  81. package/dist/commands/analyze.js +298 -0
  82. package/dist/commands/analyze.js.map +1 -0
  83. package/dist/commands/hook.d.ts.map +1 -1
  84. package/dist/commands/hook.js +79 -0
  85. package/dist/commands/hook.js.map +1 -1
  86. package/dist/hooks/core/actions.d.ts +19 -0
  87. package/dist/hooks/core/actions.d.ts.map +1 -1
  88. package/dist/hooks/core/actions.js +5 -0
  89. package/dist/hooks/core/actions.js.map +1 -1
  90. package/dist/hooks/core/clear-verdict.d.ts +1 -1
  91. package/dist/hooks/core/clear-verdict.d.ts.map +1 -1
  92. package/dist/hooks/core/clear-verdict.js +13 -9
  93. package/dist/hooks/core/clear-verdict.js.map +1 -1
  94. package/dist/hooks/core/session-state.d.ts +47 -0
  95. package/dist/hooks/core/session-state.d.ts.map +1 -0
  96. package/dist/hooks/core/session-state.js +192 -0
  97. package/dist/hooks/core/session-state.js.map +1 -0
  98. package/dist/hooks/core/submit-verdict.d.ts +1 -0
  99. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  100. package/dist/hooks/core/submit-verdict.js +35 -27
  101. package/dist/hooks/core/submit-verdict.js.map +1 -1
  102. package/dist/hooks/core/verification-lifecycle.d.ts +30 -0
  103. package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -0
  104. package/dist/hooks/core/verification-lifecycle.js +75 -0
  105. package/dist/hooks/core/verification-lifecycle.js.map +1 -0
  106. package/dist/hooks/core/verify-gate.d.ts +1 -1
  107. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  108. package/dist/hooks/core/verify-gate.js +13 -20
  109. package/dist/hooks/core/verify-gate.js.map +1 -1
  110. package/dist/index.js +3 -0
  111. package/dist/index.js.map +1 -1
  112. package/dist/lib/config.d.ts +18 -0
  113. package/dist/lib/config.d.ts.map +1 -1
  114. package/dist/lib/config.js +59 -0
  115. package/dist/lib/config.js.map +1 -1
  116. package/package.json +4 -3
@@ -34,9 +34,28 @@ export interface SessionStartAction extends ActionEntry {
34
34
  session_id: string;
35
35
  source?: string;
36
36
  }
37
+ export interface VerificationStartAction extends ActionEntry {
38
+ type: "verification_start";
39
+ verification_id: string;
40
+ trace_id?: string;
41
+ }
42
+ export interface VerificationEndAction extends ActionEntry {
43
+ type: "verification_end";
44
+ verification_id: string;
45
+ trace_id?: string;
46
+ }
47
+ export interface FixStartAction extends ActionEntry {
48
+ type: "fix_start";
49
+ fix_id: string;
50
+ }
51
+ export interface FixEndAction extends ActionEntry {
52
+ type: "fix_end";
53
+ fix_id: string;
54
+ }
37
55
  export declare function appendAction(actionsFile: string, entry: ActionEntry): void;
38
56
  export declare function readActionsSinceLastMarker(actionsFile: string, markerType: string): ActionEntry[];
39
57
  export declare function getToolCallsSinceLastVerification(actionsFile: string): ToolCallAction[];
58
+ export declare function getToolCallsSinceLastFileEdit(actionsFile: string): ToolCallAction[];
40
59
  export declare function hasToolCallsSinceLastVerdict(actionsFile: string): boolean;
41
60
  export declare function hasFileEditsSinceLastVerification(actionsFile: string): boolean;
42
61
  //# sourceMappingURL=actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA4B,SAAQ,WAAW;IAC5D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAO1E;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE,CA6BjG;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAGvF;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGzE;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG9E"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA4B,SAAQ,WAAW;IAC5D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,IAAI,EAAE,eAAe,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IACxD,IAAI,EAAE,oBAAoB,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACtD,IAAI,EAAE,kBAAkB,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC7C,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAO1E;AAED,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE,CA6BjG;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAGvF;AAED,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAGnF;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGzE;AAED,wBAAgB,iCAAiC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG9E"}
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.appendAction = appendAction;
10
10
  exports.readActionsSinceLastMarker = readActionsSinceLastMarker;
11
11
  exports.getToolCallsSinceLastVerification = getToolCallsSinceLastVerification;
12
+ exports.getToolCallsSinceLastFileEdit = getToolCallsSinceLastFileEdit;
12
13
  exports.hasToolCallsSinceLastVerdict = hasToolCallsSinceLastVerdict;
13
14
  exports.hasFileEditsSinceLastVerification = hasFileEditsSinceLastVerification;
14
15
  const fs_1 = require("fs");
@@ -55,6 +56,10 @@ function getToolCallsSinceLastVerification(actionsFile) {
55
56
  const entries = readActionsSinceLastMarker(actionsFile, "verification_requested");
56
57
  return entries.filter((e) => e.type === "tool_call");
57
58
  }
59
+ function getToolCallsSinceLastFileEdit(actionsFile) {
60
+ const entries = readActionsSinceLastMarker(actionsFile, "file_edit");
61
+ return entries.filter((e) => e.type === "tool_call");
62
+ }
58
63
  function hasToolCallsSinceLastVerdict(actionsFile) {
59
64
  const entries = readActionsSinceLastMarker(actionsFile, "verdict_write");
60
65
  return entries.some((e) => e.type === "tool_call");
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA0CH,oCAOC;AAED,gEA6BC;AAED,8EAGC;AAED,oEAGC;AAED,8EAGC;AA7FD,2BAAyE;AACzE,+BAA+B;AAC/B,6CAA0C;AAsC1C,SAAgB,YAAY,CAAC,WAAmB,EAAE,KAAkB;IAChE,IAAI,CAAC;QACD,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAA,mBAAc,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,8BAA8B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;AACL,CAAC;AAED,SAAgB,0BAA0B,CAAC,WAAmB,EAAE,UAAkB;IAC9E,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAW,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAa,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhG,IAAI,eAAe,GAAW,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACD,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAgB,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC5B,eAAe,GAAG,CAAC,CAAC;gBACxB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,uBAAuB;YAC3B,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,+BAA+B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAc,EAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC3F,CAAC;AAED,SAAgB,4BAA4B,CAAC,WAAmB;IAC5D,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAgEH,oCAOC;AAED,gEA6BC;AAED,8EAGC;AAED,sEAGC;AAED,oEAGC;AAED,8EAGC;AAxHD,2BAAyE;AACzE,+BAA+B;AAC/B,6CAA0C;AA4D1C,SAAgB,YAAY,CAAC,WAAmB,EAAE,KAAkB;IAChE,IAAI,CAAC;QACD,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAA,mBAAc,EAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,8BAA8B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;AACL,CAAC;AAED,SAAgB,0BAA0B,CAAC,WAAmB,EAAE,UAAkB;IAC9E,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAW,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAa,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEhG,IAAI,eAAe,GAAW,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACD,MAAM,KAAK,GAAgB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAgB,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC5B,eAAe,GAAG,CAAC,CAAC;gBACxB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,uBAAuB;YAC3B,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,+BAA+B,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAc,EAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC3F,CAAC;AAED,SAAgB,6BAA6B,CAAC,WAAmB;IAC7D,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAc,EAAuB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC3F,CAAC;AAED,SAAgB,4BAA4B,CAAC,WAAmB;IAC5D,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,iCAAiC,CAAC,WAAmB;IACjE,MAAM,OAAO,GAAkB,0BAA0B,CAAC,WAAW,EAAE,wBAAwB,CAAC,CAAC;IACjG,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAc,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  export interface ClearVerdictInput {
8
8
  verdictFile: string;
9
- retryFile: string;
9
+ sessionDir: string;
10
10
  }
11
11
  export declare function runClearVerdict(input: ClearVerdictInput): void;
12
12
  //# sourceMappingURL=clear-verdict.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clear-verdict.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/clear-verdict.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAY9D"}
1
+ {"version":3,"file":"clear-verdict.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/clear-verdict.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAgB9D"}
@@ -9,17 +9,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.runClearVerdict = runClearVerdict;
10
10
  const fs_1 = require("fs");
11
11
  const logger_1 = require("../../lib/logger");
12
+ const session_state_1 = require("./session-state");
12
13
  function runClearVerdict(input) {
13
- const files = [input.verdictFile, input.retryFile];
14
- for (const f of files) {
15
- try {
16
- if ((0, fs_1.existsSync)(f)) {
17
- (0, fs_1.unlinkSync)(f);
18
- }
19
- }
20
- catch (e) {
21
- logger_1.logger.debug(`failed to cleanup ${f}: ${e}`);
14
+ const { verdictFile, sessionDir } = input;
15
+ // delete verdict file
16
+ try {
17
+ if ((0, fs_1.existsSync)(verdictFile)) {
18
+ (0, fs_1.unlinkSync)(verdictFile);
22
19
  }
23
20
  }
21
+ catch (e) {
22
+ logger_1.logger.debug(`failed to cleanup ${verdictFile}: ${e}`);
23
+ }
24
+ // reset retries (new verification cycle after code edit)
25
+ // NOTE: lastVerdictStatus is NOT reset — it persists so that
26
+ // submit-verdict can enforce "fixes" field on pass-after-fail
27
+ (0, session_state_1.resetRetries)(sessionDir);
24
28
  }
25
29
  //# sourceMappingURL=clear-verdict.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clear-verdict.js","sourceRoot":"","sources":["../../../src/hooks/core/clear-verdict.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAUH,0CAYC;AApBD,2BAA4C;AAC5C,6CAA0C;AAO1C,SAAgB,eAAe,CAAC,KAAwB;IACpD,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAE7D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC;YACD,IAAI,IAAA,eAAU,EAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,IAAA,eAAU,EAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACL,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,eAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"clear-verdict.js","sourceRoot":"","sources":["../../../src/hooks/core/clear-verdict.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAWH,0CAgBC;AAzBD,2BAA4C;AAC5C,6CAA0C;AAC1C,mDAA+C;AAO/C,SAAgB,eAAe,CAAC,KAAwB;IACpD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAE1C,sBAAsB;IACtB,IAAI,CAAC;QACD,IAAI,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YAC1B,IAAA,eAAU,EAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,qBAAqB,WAAW,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,yDAAyD;IACzD,6DAA6D;IAC7D,8DAA8D;IAC9D,IAAA,4BAAY,EAAC,UAAU,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * IronBee — Session State Management
3
+ *
4
+ * Centralized state management for session data.
5
+ * All session state (retries, activeVerificationId, lastVerdictStatus)
6
+ * is stored in a single state.json file per session.
7
+ */
8
+ export type SessionPhase = "coding" | "verifying" | "fixing" | null;
9
+ export interface SessionState {
10
+ retries: number;
11
+ activeVerificationId: string | null;
12
+ activeTraceId: string | null;
13
+ lastVerdictStatus: string | null;
14
+ activeFixId: string | null;
15
+ phase: SessionPhase;
16
+ }
17
+ /** Generate an OTEL-compatible trace ID (32 hex chars / 16 bytes). */
18
+ export declare function generateTraceId(): string;
19
+ export declare function readState(sessionDir: string): SessionState;
20
+ export declare function writeState(sessionDir: string, state: SessionState): void;
21
+ export declare function getActiveVerificationId(sessionDir: string): string | undefined;
22
+ export declare function setActiveVerification(sessionDir: string, verificationId: string, traceId: string): void;
23
+ export declare function getActiveTraceId(sessionDir: string): string | undefined;
24
+ export declare function clearActiveVerification(sessionDir: string): void;
25
+ export declare function getRetries(sessionDir: string): number;
26
+ export declare function incrementRetries(sessionDir: string): number;
27
+ export declare function resetRetries(sessionDir: string): void;
28
+ export declare function getLastVerdictStatus(sessionDir: string): string | undefined;
29
+ export declare function setLastVerdictStatus(sessionDir: string, status: string | null): void;
30
+ export declare function setActiveFix(sessionDir: string, fixId: string): void;
31
+ export declare function getActiveFixId(sessionDir: string): string | undefined;
32
+ export declare function clearActiveFix(sessionDir: string): void;
33
+ export declare function setPhase(sessionDir: string, phase: SessionPhase): void;
34
+ export declare function getPhase(sessionDir: string): SessionPhase;
35
+ /**
36
+ * Reconcile session state on session start/resume.
37
+ * Closes any open verification or fix cycles, records appropriate
38
+ * end entries in actions.jsonl, and resets phase to "coding".
39
+ *
40
+ * @param appendFn — action appender function (avoids circular import with actions.ts)
41
+ */
42
+ export declare function reconcileSessionState(sessionDir: string, actionsFile: string, appendFn: (file: string, entry: {
43
+ type: string;
44
+ timestamp: string;
45
+ [key: string]: unknown;
46
+ }) => void): void;
47
+ //# sourceMappingURL=session-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/session-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEpE,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,YAAY,CAAC;CACvB;AAaD,sEAAsE;AACtE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAqB1D;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAQxE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG9E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMvG;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGvE;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAMhE;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAIrD;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3E;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAIpF;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIpE;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAIvD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAItE;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAGzD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,KAAK,IAAI,GACrG,IAAI,CAyCN"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — Session State Management
4
+ *
5
+ * Centralized state management for session data.
6
+ * All session state (retries, activeVerificationId, lastVerdictStatus)
7
+ * is stored in a single state.json file per session.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.generateTraceId = generateTraceId;
11
+ exports.readState = readState;
12
+ exports.writeState = writeState;
13
+ exports.getActiveVerificationId = getActiveVerificationId;
14
+ exports.setActiveVerification = setActiveVerification;
15
+ exports.getActiveTraceId = getActiveTraceId;
16
+ exports.clearActiveVerification = clearActiveVerification;
17
+ exports.getRetries = getRetries;
18
+ exports.incrementRetries = incrementRetries;
19
+ exports.resetRetries = resetRetries;
20
+ exports.getLastVerdictStatus = getLastVerdictStatus;
21
+ exports.setLastVerdictStatus = setLastVerdictStatus;
22
+ exports.setActiveFix = setActiveFix;
23
+ exports.getActiveFixId = getActiveFixId;
24
+ exports.clearActiveFix = clearActiveFix;
25
+ exports.setPhase = setPhase;
26
+ exports.getPhase = getPhase;
27
+ exports.reconcileSessionState = reconcileSessionState;
28
+ const crypto_1 = require("crypto");
29
+ const fs_1 = require("fs");
30
+ const path_1 = require("path");
31
+ const logger_1 = require("../../lib/logger");
32
+ const STATE_FILE = "state.json";
33
+ const DEFAULT_STATE = {
34
+ retries: 0,
35
+ activeVerificationId: null,
36
+ activeTraceId: null,
37
+ lastVerdictStatus: null,
38
+ activeFixId: null,
39
+ phase: null,
40
+ };
41
+ /** Generate an OTEL-compatible trace ID (32 hex chars / 16 bytes). */
42
+ function generateTraceId() {
43
+ return (0, crypto_1.randomBytes)(16).toString("hex");
44
+ }
45
+ function readState(sessionDir) {
46
+ const filePath = (0, path_1.join)(sessionDir, STATE_FILE);
47
+ if (!(0, fs_1.existsSync)(filePath)) {
48
+ return { ...DEFAULT_STATE };
49
+ }
50
+ try {
51
+ const content = (0, fs_1.readFileSync)(filePath, "utf-8");
52
+ const parsed = JSON.parse(content);
53
+ const validPhases = ["coding", "verifying", "fixing"];
54
+ return {
55
+ retries: typeof parsed.retries === "number" ? parsed.retries : 0,
56
+ activeVerificationId: typeof parsed.activeVerificationId === "string" ? parsed.activeVerificationId : null,
57
+ activeTraceId: typeof parsed.activeTraceId === "string" ? parsed.activeTraceId : null,
58
+ lastVerdictStatus: typeof parsed.lastVerdictStatus === "string" ? parsed.lastVerdictStatus : null,
59
+ activeFixId: typeof parsed.activeFixId === "string" ? parsed.activeFixId : null,
60
+ phase: typeof parsed.phase === "string" && validPhases.includes(parsed.phase) ? parsed.phase : null,
61
+ };
62
+ }
63
+ catch (e) {
64
+ logger_1.logger.debug(`failed to read state from ${filePath}: ${e}`);
65
+ return { ...DEFAULT_STATE };
66
+ }
67
+ }
68
+ function writeState(sessionDir, state) {
69
+ const filePath = (0, path_1.join)(sessionDir, STATE_FILE);
70
+ try {
71
+ (0, fs_1.mkdirSync)(sessionDir, { recursive: true });
72
+ (0, fs_1.writeFileSync)(filePath, JSON.stringify(state, null, 2));
73
+ }
74
+ catch (e) {
75
+ logger_1.logger.debug(`failed to write state to ${filePath}: ${e}`);
76
+ }
77
+ }
78
+ function getActiveVerificationId(sessionDir) {
79
+ const state = readState(sessionDir);
80
+ return state.activeVerificationId ?? undefined;
81
+ }
82
+ function setActiveVerification(sessionDir, verificationId, traceId) {
83
+ const state = readState(sessionDir);
84
+ state.activeVerificationId = verificationId;
85
+ state.activeTraceId = traceId;
86
+ state.phase = "verifying";
87
+ writeState(sessionDir, state);
88
+ }
89
+ function getActiveTraceId(sessionDir) {
90
+ const state = readState(sessionDir);
91
+ return state.activeTraceId ?? undefined;
92
+ }
93
+ function clearActiveVerification(sessionDir) {
94
+ const state = readState(sessionDir);
95
+ state.activeVerificationId = null;
96
+ state.activeTraceId = null;
97
+ state.phase = "coding";
98
+ writeState(sessionDir, state);
99
+ }
100
+ function getRetries(sessionDir) {
101
+ const state = readState(sessionDir);
102
+ return state.retries;
103
+ }
104
+ function incrementRetries(sessionDir) {
105
+ const state = readState(sessionDir);
106
+ state.retries = state.retries + 1;
107
+ writeState(sessionDir, state);
108
+ return state.retries;
109
+ }
110
+ function resetRetries(sessionDir) {
111
+ const state = readState(sessionDir);
112
+ state.retries = 0;
113
+ writeState(sessionDir, state);
114
+ }
115
+ function getLastVerdictStatus(sessionDir) {
116
+ const state = readState(sessionDir);
117
+ return state.lastVerdictStatus ?? undefined;
118
+ }
119
+ function setLastVerdictStatus(sessionDir, status) {
120
+ const state = readState(sessionDir);
121
+ state.lastVerdictStatus = status;
122
+ writeState(sessionDir, state);
123
+ }
124
+ function setActiveFix(sessionDir, fixId) {
125
+ const state = readState(sessionDir);
126
+ state.activeFixId = fixId;
127
+ writeState(sessionDir, state);
128
+ }
129
+ function getActiveFixId(sessionDir) {
130
+ const state = readState(sessionDir);
131
+ return state.activeFixId ?? undefined;
132
+ }
133
+ function clearActiveFix(sessionDir) {
134
+ const state = readState(sessionDir);
135
+ state.activeFixId = null;
136
+ writeState(sessionDir, state);
137
+ }
138
+ function setPhase(sessionDir, phase) {
139
+ const state = readState(sessionDir);
140
+ state.phase = phase;
141
+ writeState(sessionDir, state);
142
+ }
143
+ function getPhase(sessionDir) {
144
+ const state = readState(sessionDir);
145
+ return state.phase;
146
+ }
147
+ /**
148
+ * Reconcile session state on session start/resume.
149
+ * Closes any open verification or fix cycles, records appropriate
150
+ * end entries in actions.jsonl, and resets phase to "coding".
151
+ *
152
+ * @param appendFn — action appender function (avoids circular import with actions.ts)
153
+ */
154
+ function reconcileSessionState(sessionDir, actionsFile, appendFn) {
155
+ const state = readState(sessionDir);
156
+ let dirty = false;
157
+ // close abandoned verification
158
+ if (state.activeVerificationId) {
159
+ appendFn(actionsFile, {
160
+ type: "verification_end",
161
+ timestamp: new Date().toISOString(),
162
+ verification_id: state.activeVerificationId,
163
+ trace_id: state.activeTraceId,
164
+ reason: "session_reconcile",
165
+ });
166
+ logger_1.logger.debug(`reconcile: ended abandoned verification ${state.activeVerificationId}`);
167
+ state.activeVerificationId = null;
168
+ state.activeTraceId = null;
169
+ dirty = true;
170
+ }
171
+ // close abandoned fix
172
+ if (state.activeFixId) {
173
+ appendFn(actionsFile, {
174
+ type: "fix_end",
175
+ timestamp: new Date().toISOString(),
176
+ fix_id: state.activeFixId,
177
+ reason: "session_reconcile",
178
+ });
179
+ logger_1.logger.debug(`reconcile: ended abandoned fix ${state.activeFixId}`);
180
+ state.activeFixId = null;
181
+ dirty = true;
182
+ }
183
+ // reset phase to coding
184
+ if (state.phase !== "coding") {
185
+ state.phase = "coding";
186
+ dirty = true;
187
+ }
188
+ if (dirty) {
189
+ writeState(sessionDir, state);
190
+ }
191
+ }
192
+ //# sourceMappingURL=session-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../../src/hooks/core/session-state.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  export interface SubmitVerdictInput {
11
11
  sessionId: string;
12
+ sessionDir: string;
12
13
  verdictFile: string;
13
14
  actionsFile: string;
14
15
  verdictJson: string;
@@ -1 +1 @@
1
- {"version":3,"file":"submit-verdict.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/submit-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAoCD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8E9F"}
1
+ {"version":3,"file":"submit-verdict.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/submit-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAYD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgH9F"}
@@ -10,38 +10,15 @@
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.runSubmitVerdict = runSubmitVerdict;
13
+ const crypto_1 = require("crypto");
13
14
  const fs_1 = require("fs");
14
15
  const path_1 = require("path");
15
16
  const logger_1 = require("../../lib/logger");
16
17
  const telemetry_1 = require("../../lib/telemetry");
17
18
  const actions_1 = require("./actions");
18
- function getLastVerdictStatus(actionsFile) {
19
- if (!(0, fs_1.existsSync)(actionsFile)) {
20
- return undefined;
21
- }
22
- try {
23
- const content = (0, fs_1.readFileSync)(actionsFile, "utf-8");
24
- const lines = content.trim().split("\n").filter((l) => l.length > 0);
25
- for (let i = lines.length - 1; i >= 0; i--) {
26
- try {
27
- const entry = JSON.parse(lines[i]);
28
- if (entry.type === "verdict_write") {
29
- const verdict = entry.verdict;
30
- return typeof verdict.status === "string" ? verdict.status : undefined;
31
- }
32
- }
33
- catch {
34
- // skip malformed lines
35
- }
36
- }
37
- return undefined;
38
- }
39
- catch {
40
- return undefined;
41
- }
42
- }
19
+ const session_state_1 = require("./session-state");
43
20
  async function runSubmitVerdict(input) {
44
- const { sessionId, verdictFile, actionsFile, verdictJson } = input;
21
+ const { sessionId, sessionDir, verdictFile, actionsFile, verdictJson } = input;
45
22
  // parse JSON
46
23
  let verdict;
47
24
  try {
@@ -76,7 +53,7 @@ async function runSubmitVerdict(input) {
76
53
  }
77
54
  // validate fixes — required when pass after a previous fail
78
55
  if (verdict.status === "pass") {
79
- const lastStatus = getLastVerdictStatus(actionsFile);
56
+ const lastStatus = (0, session_state_1.getLastVerdictStatus)(sessionDir);
80
57
  if (lastStatus === "fail") {
81
58
  if (!Array.isArray(verdict.fixes) || verdict.fixes.length === 0) {
82
59
  return { success: false, message: "REJECTED: when status is \"pass\" after a previous fail, fixes must be a non-empty array describing what was fixed." };
@@ -92,14 +69,45 @@ async function runSubmitVerdict(input) {
92
69
  logger_1.logger.debug(`submit-verdict: failed to write ${verdictFile}: ${e}`);
93
70
  return { success: false, message: `REJECTED: failed to write verdict file: ${e}` };
94
71
  }
72
+ // update last verdict status in session state
73
+ (0, session_state_1.setLastVerdictStatus)(sessionDir, verdict.status);
74
+ // auto-record verification_end if there's an active verification
75
+ const verificationId = (0, session_state_1.getActiveVerificationId)(sessionDir);
76
+ const traceId = (0, session_state_1.getActiveTraceId)(sessionDir);
77
+ if (verificationId) {
78
+ const endEntry = {
79
+ type: "verification_end",
80
+ timestamp: new Date().toISOString(),
81
+ verification_id: verificationId,
82
+ trace_id: traceId,
83
+ };
84
+ (0, actions_1.appendAction)(actionsFile, endEntry);
85
+ (0, session_state_1.clearActiveVerification)(sessionDir);
86
+ logger_1.logger.debug(`verification-end (auto): ${verificationId} trace=${traceId}`);
87
+ }
95
88
  // record verdict_write action
96
89
  const entry = {
97
90
  type: "verdict_write",
98
91
  timestamp: new Date().toISOString(),
92
+ verification_id: verificationId,
93
+ trace_id: traceId,
99
94
  verdict: verdict,
100
95
  };
101
96
  (0, actions_1.appendAction)(actionsFile, entry);
102
97
  await (0, telemetry_1.trackVerdictWrite)(sessionId, verdict.status);
98
+ // record fix_start when verdict is fail
99
+ if (verdict.status === "fail") {
100
+ const fixId = (0, crypto_1.randomUUID)();
101
+ const fixEntry = {
102
+ type: "fix_start",
103
+ timestamp: new Date().toISOString(),
104
+ fix_id: fixId,
105
+ };
106
+ (0, actions_1.appendAction)(actionsFile, fixEntry);
107
+ (0, session_state_1.setActiveFix)(sessionDir, fixId);
108
+ (0, session_state_1.setPhase)(sessionDir, "fixing");
109
+ logger_1.logger.debug(`fix-start: ${fixId} (verdict was fail)`);
110
+ }
103
111
  logger_1.logger.debug(`submit-verdict: session=${sessionId} status=${verdict.status}`);
104
112
  if (verdict.status === "pass") {
105
113
  const fixesInfo = verdict.fixes?.length ? ` Fixes: ${verdict.fixes.join(", ")}` : "";
@@ -1 +1 @@
1
- {"version":3,"file":"submit-verdict.js","sourceRoot":"","sources":["../../../src/hooks/core/submit-verdict.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submit-verdict.js","sourceRoot":"","sources":["../../../src/hooks/core/submit-verdict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * IronBee — Verification Lifecycle Core Logic
3
+ *
4
+ * Manages verification start/end boundaries.
5
+ * Each verification cycle gets a unique ID and an OTEL-compatible trace ID
6
+ * linking start → end → verdict.
7
+ */
8
+ export interface VerificationStartInput {
9
+ sessionId: string;
10
+ sessionDir: string;
11
+ actionsFile: string;
12
+ }
13
+ export interface VerificationStartResult {
14
+ verificationId: string;
15
+ traceId: string;
16
+ }
17
+ export interface VerificationEndInput {
18
+ sessionId: string;
19
+ sessionDir: string;
20
+ actionsFile: string;
21
+ }
22
+ export interface VerificationEndResult {
23
+ success: boolean;
24
+ verificationId?: string;
25
+ traceId?: string;
26
+ message: string;
27
+ }
28
+ export declare function startVerification(input: VerificationStartInput): VerificationStartResult;
29
+ export declare function endVerification(input: VerificationEndInput): VerificationEndResult;
30
+ //# sourceMappingURL=verification-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/verification-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,MAAM,WAAW,sBAAsB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,CA8CxF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAsBlF"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee — Verification Lifecycle Core Logic
4
+ *
5
+ * Manages verification start/end boundaries.
6
+ * Each verification cycle gets a unique ID and an OTEL-compatible trace ID
7
+ * linking start → end → verdict.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.startVerification = startVerification;
11
+ exports.endVerification = endVerification;
12
+ const crypto_1 = require("crypto");
13
+ const logger_1 = require("../../lib/logger");
14
+ const actions_1 = require("./actions");
15
+ const session_state_1 = require("./session-state");
16
+ function startVerification(input) {
17
+ const { sessionDir, actionsFile } = input;
18
+ // if there's an active fix, end it before starting verification
19
+ const activeFixId = (0, session_state_1.getActiveFixId)(sessionDir);
20
+ if (activeFixId) {
21
+ const fixEndEntry = {
22
+ type: "fix_end",
23
+ timestamp: new Date().toISOString(),
24
+ fix_id: activeFixId,
25
+ };
26
+ (0, actions_1.appendAction)(actionsFile, fixEndEntry);
27
+ (0, session_state_1.clearActiveFix)(sessionDir);
28
+ logger_1.logger.debug(`fix-end: ${activeFixId} (starting new verification)`);
29
+ }
30
+ // if there's already an active verification, end it first
31
+ const existingId = (0, session_state_1.getActiveVerificationId)(sessionDir);
32
+ if (existingId) {
33
+ const existingTraceId = (0, session_state_1.getActiveTraceId)(sessionDir);
34
+ logger_1.logger.debug(`ending previous verification ${existingId} before starting new one`);
35
+ const endEntry = {
36
+ type: "verification_end",
37
+ timestamp: new Date().toISOString(),
38
+ verification_id: existingId,
39
+ trace_id: existingTraceId,
40
+ };
41
+ (0, actions_1.appendAction)(actionsFile, endEntry);
42
+ (0, session_state_1.clearActiveVerification)(sessionDir);
43
+ }
44
+ const verificationId = (0, crypto_1.randomUUID)();
45
+ const traceId = (0, session_state_1.generateTraceId)();
46
+ const entry = {
47
+ type: "verification_start",
48
+ timestamp: new Date().toISOString(),
49
+ verification_id: verificationId,
50
+ trace_id: traceId,
51
+ };
52
+ (0, actions_1.appendAction)(actionsFile, entry);
53
+ (0, session_state_1.setActiveVerification)(sessionDir, verificationId, traceId);
54
+ logger_1.logger.debug(`verification-start: ${verificationId} trace=${traceId}`);
55
+ return { verificationId, traceId };
56
+ }
57
+ function endVerification(input) {
58
+ const { sessionDir, actionsFile } = input;
59
+ const verificationId = (0, session_state_1.getActiveVerificationId)(sessionDir);
60
+ if (!verificationId) {
61
+ return { success: false, message: "No active verification to end." };
62
+ }
63
+ const traceId = (0, session_state_1.getActiveTraceId)(sessionDir);
64
+ const entry = {
65
+ type: "verification_end",
66
+ timestamp: new Date().toISOString(),
67
+ verification_id: verificationId,
68
+ trace_id: traceId,
69
+ };
70
+ (0, actions_1.appendAction)(actionsFile, entry);
71
+ (0, session_state_1.clearActiveVerification)(sessionDir);
72
+ logger_1.logger.debug(`verification-end: ${verificationId} trace=${traceId}`);
73
+ return { success: true, verificationId, traceId, message: `Verification ${verificationId} ended.` };
74
+ }
75
+ //# sourceMappingURL=verification-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-lifecycle.js","sourceRoot":"","sources":["../../../src/hooks/core/verification-lifecycle.ts"],"names":[],"mappings":"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"}