@ironbee-ai/cli 0.21.2 → 0.23.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.
Files changed (62) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/assets/auth.html +79 -0
  3. package/dist/clients/claude/agents/ironbee-verifier.md +12 -2
  4. package/dist/clients/claude/commands/ironbee-verify.md +28 -15
  5. package/dist/clients/claude/hooks/activity-start.js +1 -1
  6. package/dist/clients/claude/hooks/require-verdict.js +2 -2
  7. package/dist/clients/claude/hooks/require-verification.js +7 -7
  8. package/dist/clients/claude/hooks/track-action.js +1 -1
  9. package/dist/clients/claude/index.js +4 -4
  10. package/dist/clients/claude/platforms/skill.android.md +65 -0
  11. package/dist/clients/codex/agents/ironbee-verifier.md +11 -1
  12. package/dist/clients/codex/commands/ironbee-verify/SKILL.md +24 -5
  13. package/dist/clients/codex/hooks/require-verification.js +7 -7
  14. package/dist/clients/codex/hooks/track-action.js +1 -1
  15. package/dist/clients/codex/index.js +2 -2
  16. package/dist/clients/codex/platforms/command-verify.android.md +61 -0
  17. package/dist/clients/codex/platforms/rule.android.md +32 -0
  18. package/dist/clients/codex/platforms/skill.android.md +55 -0
  19. package/dist/clients/codex/skills/ironbee-verification.md +3 -0
  20. package/dist/clients/codex/util.js +11 -11
  21. package/dist/clients/cursor/commands/ironbee-verify/SKILL.md +21 -4
  22. package/dist/clients/cursor/hooks/require-verdict.js +1 -1
  23. package/dist/clients/cursor/hooks/require-verification.js +6 -6
  24. package/dist/clients/cursor/hooks/track-action.js +1 -1
  25. package/dist/clients/cursor/index.js +1 -1
  26. package/dist/clients/cursor/platforms/command-verify.android.md +61 -0
  27. package/dist/clients/cursor/platforms/rule.android.md +32 -0
  28. package/dist/clients/cursor/platforms/skill.android.md +55 -0
  29. package/dist/clients/cursor/rules/ironbee-verification.mdc +3 -0
  30. package/dist/clients/cursor/skills/ironbee-verification.md +3 -0
  31. package/dist/commands/android.js +1 -0
  32. package/dist/commands/config.js +2 -2
  33. package/dist/commands/cycle-toggle.js +4 -4
  34. package/dist/commands/hook.js +16 -15
  35. package/dist/commands/import.js +4 -4
  36. package/dist/commands/install.js +1 -1
  37. package/dist/commands/login.js +2 -2
  38. package/dist/commands/mode-select.js +2 -0
  39. package/dist/hooks/core/actions.js +6 -5
  40. package/dist/hooks/core/session-state.js +1 -1
  41. package/dist/hooks/core/submit-verdict.js +4 -4
  42. package/dist/hooks/core/verification-lifecycle.js +1 -1
  43. package/dist/hooks/core/verify-gate.js +29 -23
  44. package/dist/import/claude/events/tool-call.js +1 -1
  45. package/dist/import/codex/events/tool-call.js +1 -1
  46. package/dist/index.js +1 -1
  47. package/dist/lib/auth.js +5 -5
  48. package/dist/lib/collector.js +1 -1
  49. package/dist/lib/config.js +1 -1
  50. package/dist/lib/install-version.js +1 -0
  51. package/dist/lib/platform-section.js +4 -3
  52. package/dist/lib/prompt.js +4 -4
  53. package/dist/lib/recording-tools.js +1 -0
  54. package/dist/lib/schema-sync.js +2 -0
  55. package/dist/lib/version.js +1 -1
  56. package/dist/scripts/postinstall.js +1 -1
  57. package/dist/tui/config/schema.js +1 -1
  58. package/dist/tui/platforms/area.js +2 -2
  59. package/dist/tui/projects/area.js +4 -4
  60. package/dist/tui/sessions/area.js +3 -3
  61. package/package.json +1 -1
  62. package/dist/assets/login.html +0 -93
@@ -1,7 +1,7 @@
1
- "use strict";var _=Object.create;var g=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var l=(e,o)=>g(e,"name",{value:o,configurable:!0});var P=(e,o)=>{for(var n in o)g(e,n,{get:o[n],enumerable:!0})},I=(e,o,n,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of j(o))!N.call(e,r)&&r!==n&&g(e,r,{get:()=>o[r],enumerable:!(i=T(o,r))||i.enumerable});return e};var F=(e,o,n)=>(n=e!=null?_(k(e)):{},I(o||!e||!e.__esModule?g(n,"default",{value:e,enumerable:!0}):n,e)),M=e=>I(g({},"__esModule",{value:!0}),e);var G={};P(G,{importCommand:()=>U,parseFlags:()=>E,promptYesNo:()=>R});module.exports=M(G);var y=require("commander"),w=require("fs"),h=require("path"),O=F(require("readline")),t=require("../lib/output"),S=require("../lib/config"),C=require("../lib/collector"),$=require("../lib/logger"),s=require("../import");const B=4,D=1,z=32,U=new y.Command("import").description("Import historical Claude Code + Codex sessions to the IronBee Collector").option("--since <duration>","import sessions started within the given duration (e.g. 30d, 2w, 6m, 12h)").option("--from <iso-date>","explicit start date (e.g. 2025-04-01)").option("--to <iso-date>","explicit end date (defaults to now)").option("--transcript <path>","import a single transcript .jsonl file (Claude or Codex \u2014 detected from path)").option("--projects <paths>","comma-separated absolute project paths").option("--all-projects","import sessions from every project under ~/.claude/projects/ and ~/.codex/sessions/").option("--dry-run","print the summary and exit without sending events").option("--yes","skip the interactive confirm prompt").option("--force","do not skip sessions with existing .ironbee/sessions/<id>/ directories").option("--concurrency <n>","number of sessions to import in parallel").option("--batch-size <n>","events per collector POST (default: 100). Set to 1 to isolate which event a 400 rejects.").action(async e=>{let o;try{o=E(e)}catch(c){t.log.error(c instanceof Error?c.message:String(c)),process.exit(1)}(0,C.getCollectorTarget)(process.cwd())===null&&(t.log.error("Collector is not configured. ironbee import has no destination to send events to."),t.log.blank(),t.log.dim("To configure, add a collector section to ~/.ironbee/config.json (or your project's .ironbee/config.json):"),t.log.blank(),console.log(t.pc.dim(` {
1
+ "use strict";var x=Object.create;var g=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var l=(e,o)=>g(e,"name",{value:o,configurable:!0});var P=(e,o)=>{for(var n in o)g(e,n,{get:o[n],enumerable:!0})},I=(e,o,n,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of j(o))!N.call(e,r)&&r!==n&&g(e,r,{get:()=>o[r],enumerable:!(s=_(o,r))||s.enumerable});return e};var O=(e,o,n)=>(n=e!=null?x(k(e)):{},I(o||!e||!e.__esModule?g(n,"default",{value:e,enumerable:!0}):n,e)),F=e=>I(g({},"__esModule",{value:!0}),e);var K={};P(K,{importCommand:()=>U,parseFlags:()=>$,promptYesNo:()=>R});module.exports=F(K);var y=require("commander"),w=require("fs"),h=require("path"),M=O(require("readline")),t=require("../lib/output"),S=require("../lib/config"),C=require("../lib/collector"),E=require("../lib/logger"),i=require("../import");const B=4,D=1,z=32,U=new y.Command("import").description("Import historical Claude Code + Codex sessions to the IronBee Collector").option("--since <duration>","import sessions started within the given duration (e.g. 30d, 2w, 6m, 12h)").option("--from <iso-date>","explicit start date (e.g. 2025-04-01)").option("--to <iso-date>","explicit end date (defaults to now)").option("--transcript <path>","import a single transcript .jsonl file (Claude or Codex \u2014 detected from path)").option("--projects <paths>","comma-separated absolute project paths").option("--all-projects","import sessions from every project under ~/.claude/projects/ and ~/.codex/sessions/").option("--dry-run","print the summary and exit without sending events").option("--yes","skip the interactive confirm prompt").option("--force","do not skip sessions with existing .ironbee/sessions/<id>/ directories").option("--concurrency <n>","number of sessions to import in parallel").option("--batch-size <n>","events per collector POST (default: 100). Set to 1 to isolate which event a 400 rejects.").action(async e=>{let o;try{o=$(e)}catch(c){t.log.error(c instanceof Error?c.message:String(c)),process.exit(1)}(0,C.getCollectorTarget)(process.cwd())===null&&(t.log.error("Collector is not configured. ironbee import has no destination to send events to."),t.log.blank(),t.log.dim("To configure, add a collector section to ~/.ironbee/config.json (or your project's .ironbee/config.json):"),t.log.blank(),console.log(t.pc.dim(` {
2
2
  "collector": {
3
3
  "url": "https://your-collector.example.com",
4
- "apiKey": "your-api-key"
4
+ "oauthToken": "<from \`ironbee login\`>"
5
5
  }
6
- }`)),t.log.blank(),t.log.dim("All of `url` (non-empty), `apiKey` (non-empty), and `enable !== false` are required. The IRONBEE_COLLECTOR=false env override also disables."),process.exit(1));const i=(0,s.findTranscripts)(o.scope),r=(0,s.applyTimeRange)(i,o.timeRange);r.length===0&&(t.log.warn("No transcripts found matching the given scope and time range."),process.exit(0)),t.log.info(`Scanning ${r.length} transcript(s)...`);const d=(0,s.estimateImport)({targets:r,timeRange:o.timeRange,concurrency:o.concurrency,force:o.force});A(d,o.dryRun),o.dryRun&&process.exit(0),d.toImportCount===0&&(t.log.warn("Nothing to import (all sessions already tracked). Use --force to re-import."),process.exit(0)),o.yes||await R("Proceed?")||(t.log.info("Aborted."),process.exit(0));const m=r.filter(c=>!q(c,o.force)),a=new s.ProgressReporter(m.length);let p=!1;process.on("SIGINT",()=>{t.log.warn(`
7
- Received SIGINT \u2014 finishing in-flight sessions then exiting...`),p=!0});const b=await(0,s.runConcurrentPool)({items:m,concurrency:o.concurrency,shouldCancel:l(()=>p,"shouldCancel"),onStart:l((c,f)=>{a.onSessionStart(c.sessionId,f)},"onStart"),onComplete:l((c,f,x)=>{a.onSessionComplete(c,x)},"onComplete"),process:l(async c=>{try{return await(0,s.importSession)({target:c,force:o.force,batchSize:o.batchSize})}catch(f){return{sessionId:c.sessionId,status:"failed",eventsSent:(0,s.emptyEventCounts)(),reason:f instanceof Error?f.message:String(f)}}},"process")});a.finalSummary(),b.filter(c=>c.status==="failed").length>0&&process.exit(1)});function E(e){if([e.transcript!==void 0?1:0,e.projects!==void 0?1:0,e.allProjects===!0?1:0].reduce((a,p)=>a+p,0)>1)throw new Error("--transcript, --projects, and --all-projects are mutually exclusive");let n;if(e.transcript!==void 0)n={kind:"transcript",path:(0,h.resolve)(e.transcript)};else if(e.projects!==void 0){const a=e.projects.split(",").map(p=>p.trim()).filter(p=>p.length>0).map(p=>(0,h.resolve)(p));if(a.length===0)throw new Error("--projects must list at least one path");n={kind:"projects",paths:a}}else e.allProjects===!0?n={kind:"all-projects"}:n={kind:"current-project"};if(e.since!==void 0&&e.from!==void 0)throw new Error("--since and --from are mutually exclusive");let i=null;const r=Date.now();if(e.since!==void 0){const a=(0,s.parseSinceDuration)(e.since);if(a===null)throw new Error(`Invalid --since value: "${e.since}". Expected forms: 30d, 2w, 6m, 12h.`);i=(0,s.buildTimeRange)({sinceMs:a,nowMs:r})}else if(e.from!==void 0){const a=(0,s.parseIsoDate)(e.from);if(a===null)throw new Error(`Invalid --from value: "${e.from}". Expected ISO date (e.g. 2025-04-01).`);let p;if(e.to!==void 0){const b=(0,s.parseIsoDate)(e.to);if(b===null)throw new Error(`Invalid --to value: "${e.to}". Expected ISO date.`);p=b}i=(0,s.buildTimeRange)({fromMs:a,toMs:p,nowMs:r})}const d=Y(e.concurrency),m=L(e.batchSize);return{scope:n,timeRange:i,dryRun:e.dryRun===!0,yes:e.yes===!0,force:e.force===!0,concurrency:d,batchSize:m}}l(E,"parseFlags");function L(e){if(e===void 0)return null;const o=parseInt(e,10);if(!Number.isFinite(o)||o<1)throw new Error(`Invalid --batch-size value: "${e}". Must be an integer >= 1.`);return o}l(L,"resolveBatchSize");function Y(e){if(e!==void 0){const i=parseInt(e,10);if(!Number.isFinite(i))throw new Error(`Invalid --concurrency value: "${e}". Must be an integer.`);return v(i)}const n=(0,S.loadConfig)(process.cwd()).import?.concurrency;return typeof n=="number"&&Number.isFinite(n)?v(n):B}l(Y,"resolveConcurrency");function v(e){return Math.min(z,Math.max(D,Math.floor(e)))}l(v,"clamp");function q(e,o){if(o)return!1;const n=`${e.projectDir}/.ironbee/sessions/${e.sessionId}`;try{return(0,w.existsSync)(n)}catch(i){return $.logger.debug(`import skip pre-check failed for ${n}: ${i instanceof Error?i.message:i}`),!1}}l(q,"shouldSkipForRunner");function A(e,o){const n=o?"ironbee import \u2014 dry-run preview":"ironbee import \u2014 preview";t.log.blank(),console.log(t.pc.bold(n)),t.log.blank();const i=e.projects.reduce((r,d)=>r+d.found,0);console.log(`Scope: ${t.pc.bold(String(e.projects.length))} project(s), ${t.pc.bold(String(i))} session(s) found`);for(const r of e.projects)console.log(` ${t.pc.dim(r.projectDir.padEnd(50))} ${String(r.found).padStart(3)} sessions ${t.pc.dim(`${r.skipped} skipped`)}`);if(t.log.blank(),e.timeRange!==null){const r=new Date(e.timeRange.fromMs).toISOString().slice(0,10),d=new Date(e.timeRange.toMs).toISOString().slice(0,10);console.log(`Time range: ${t.pc.bold(r)} .. ${t.pc.bold(d)}`)}else console.log(`Time range: ${t.pc.dim("(no filter \u2014 every session)")}`);t.log.blank(),console.log(`To import: ${t.pc.bold(String(e.toImportCount))} session(s)`),console.log(" Estimated events:"),console.log(` session_start / session_end ${u(e.estimatedEvents.session_start+e.estimatedEvents.session_end)}`),console.log(` activity_start / activity_end ${u(e.estimatedEvents.activity_start+e.estimatedEvents.activity_end)}`),console.log(` tool_call ${u(e.estimatedEvents.tool_call)}`),console.log(` file_change ${u(e.estimatedEvents.file_change)}`),console.log(` api_request ${u(e.estimatedEvents.api_request)}`),console.log(` session_analytics ${u(e.estimatedEvents.session_analytics)}`),console.log(` session_turn_analytics ${u(e.estimatedEvents.session_turn_analytics)}`),console.log(` session_turn_step_analytics ${u(e.estimatedEvents.session_turn_step_analytics)}`),t.log.blank(),console.log(` Estimated total cost surfaced: ${t.pc.bold(`$${e.estimatedCostUsd.toFixed(2)}`)}`),console.log(` Estimated wire bytes: ${t.pc.dim(K(e.estimatedWireBytes))}`),console.log(` Collector endpoint: ${e.collectorUrl!==null?t.pc.bold(e.collectorUrl):t.pc.red("(not configured)")}`),console.log(` Concurrency: ${t.pc.bold(String(e.concurrency))} sessions in flight`),t.log.blank()}l(A,"renderSummary");function u(e){return e.toLocaleString("en-US")}l(u,"formatNum");function K(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}l(K,"formatBytes");async function R(e,o){const n=o?.createInterface??O.createInterface;return new Promise(i=>{const r=n({input:process.stdin,output:process.stdout});r.question(`${e} [Y/n] `,d=>{r.close();const m=d.trim().toLowerCase();if(m==="n"||m==="no"){i(!1);return}i(!0)})})}l(R,"promptYesNo");0&&(module.exports={importCommand,parseFlags,promptYesNo});
6
+ }`)),t.log.blank(),t.log.dim("Required: `url` (non-empty), `enable !== false`, and AT LEAST ONE of `oauthToken` (preferred \u2014 `ironbee login` writes this) or `apiKey` (shared-key path for CI / deployment tooling). The IRONBEE_COLLECTOR=false env override also disables."),process.exit(1));const s=(0,i.findTranscripts)(o.scope),r=(0,i.applyTimeRange)(s,o.timeRange);r.length===0&&(t.log.warn("No transcripts found matching the given scope and time range."),process.exit(0)),t.log.info(`Scanning ${r.length} transcript(s)...`);const d=(0,i.estimateImport)({targets:r,timeRange:o.timeRange,concurrency:o.concurrency,force:o.force});q(d,o.dryRun),o.dryRun&&process.exit(0),d.toImportCount===0&&(t.log.warn("Nothing to import (all sessions already tracked). Use --force to re-import."),process.exit(0)),o.yes||await R("Proceed?")||(t.log.info("Aborted."),process.exit(0));const m=r.filter(c=>!Y(c,o.force)),a=new i.ProgressReporter(m.length);let p=!1;process.on("SIGINT",()=>{t.log.warn(`
7
+ Received SIGINT \u2014 finishing in-flight sessions then exiting...`),p=!0});const b=await(0,i.runConcurrentPool)({items:m,concurrency:o.concurrency,shouldCancel:l(()=>p,"shouldCancel"),onStart:l((c,f)=>{a.onSessionStart(c.sessionId,f)},"onStart"),onComplete:l((c,f,T)=>{a.onSessionComplete(c,T)},"onComplete"),process:l(async c=>{try{return await(0,i.importSession)({target:c,force:o.force,batchSize:o.batchSize})}catch(f){return{sessionId:c.sessionId,status:"failed",eventsSent:(0,i.emptyEventCounts)(),reason:f instanceof Error?f.message:String(f)}}},"process")});a.finalSummary(),b.filter(c=>c.status==="failed").length>0&&process.exit(1)});function $(e){if([e.transcript!==void 0?1:0,e.projects!==void 0?1:0,e.allProjects===!0?1:0].reduce((a,p)=>a+p,0)>1)throw new Error("--transcript, --projects, and --all-projects are mutually exclusive");let n;if(e.transcript!==void 0)n={kind:"transcript",path:(0,h.resolve)(e.transcript)};else if(e.projects!==void 0){const a=e.projects.split(",").map(p=>p.trim()).filter(p=>p.length>0).map(p=>(0,h.resolve)(p));if(a.length===0)throw new Error("--projects must list at least one path");n={kind:"projects",paths:a}}else e.allProjects===!0?n={kind:"all-projects"}:n={kind:"current-project"};if(e.since!==void 0&&e.from!==void 0)throw new Error("--since and --from are mutually exclusive");let s=null;const r=Date.now();if(e.since!==void 0){const a=(0,i.parseSinceDuration)(e.since);if(a===null)throw new Error(`Invalid --since value: "${e.since}". Expected forms: 30d, 2w, 6m, 12h.`);s=(0,i.buildTimeRange)({sinceMs:a,nowMs:r})}else if(e.from!==void 0){const a=(0,i.parseIsoDate)(e.from);if(a===null)throw new Error(`Invalid --from value: "${e.from}". Expected ISO date (e.g. 2025-04-01).`);let p;if(e.to!==void 0){const b=(0,i.parseIsoDate)(e.to);if(b===null)throw new Error(`Invalid --to value: "${e.to}". Expected ISO date.`);p=b}s=(0,i.buildTimeRange)({fromMs:a,toMs:p,nowMs:r})}const d=A(e.concurrency),m=L(e.batchSize);return{scope:n,timeRange:s,dryRun:e.dryRun===!0,yes:e.yes===!0,force:e.force===!0,concurrency:d,batchSize:m}}l($,"parseFlags");function L(e){if(e===void 0)return null;const o=parseInt(e,10);if(!Number.isFinite(o)||o<1)throw new Error(`Invalid --batch-size value: "${e}". Must be an integer >= 1.`);return o}l(L,"resolveBatchSize");function A(e){if(e!==void 0){const s=parseInt(e,10);if(!Number.isFinite(s))throw new Error(`Invalid --concurrency value: "${e}". Must be an integer.`);return v(s)}const n=(0,S.loadConfig)(process.cwd()).import?.concurrency;return typeof n=="number"&&Number.isFinite(n)?v(n):B}l(A,"resolveConcurrency");function v(e){return Math.min(z,Math.max(D,Math.floor(e)))}l(v,"clamp");function Y(e,o){if(o)return!1;const n=`${e.projectDir}/.ironbee/sessions/${e.sessionId}`;try{return(0,w.existsSync)(n)}catch(s){return E.logger.debug(`import skip pre-check failed for ${n}: ${s instanceof Error?s.message:s}`),!1}}l(Y,"shouldSkipForRunner");function q(e,o){const n=o?"ironbee import \u2014 dry-run preview":"ironbee import \u2014 preview";t.log.blank(),console.log(t.pc.bold(n)),t.log.blank();const s=e.projects.reduce((r,d)=>r+d.found,0);console.log(`Scope: ${t.pc.bold(String(e.projects.length))} project(s), ${t.pc.bold(String(s))} session(s) found`);for(const r of e.projects)console.log(` ${t.pc.dim(r.projectDir.padEnd(50))} ${String(r.found).padStart(3)} sessions ${t.pc.dim(`${r.skipped} skipped`)}`);if(t.log.blank(),e.timeRange!==null){const r=new Date(e.timeRange.fromMs).toISOString().slice(0,10),d=new Date(e.timeRange.toMs).toISOString().slice(0,10);console.log(`Time range: ${t.pc.bold(r)} .. ${t.pc.bold(d)}`)}else console.log(`Time range: ${t.pc.dim("(no filter \u2014 every session)")}`);t.log.blank(),console.log(`To import: ${t.pc.bold(String(e.toImportCount))} session(s)`),console.log(" Estimated events:"),console.log(` session_start / session_end ${u(e.estimatedEvents.session_start+e.estimatedEvents.session_end)}`),console.log(` activity_start / activity_end ${u(e.estimatedEvents.activity_start+e.estimatedEvents.activity_end)}`),console.log(` tool_call ${u(e.estimatedEvents.tool_call)}`),console.log(` file_change ${u(e.estimatedEvents.file_change)}`),console.log(` api_request ${u(e.estimatedEvents.api_request)}`),console.log(` session_analytics ${u(e.estimatedEvents.session_analytics)}`),console.log(` session_turn_analytics ${u(e.estimatedEvents.session_turn_analytics)}`),console.log(` session_turn_step_analytics ${u(e.estimatedEvents.session_turn_step_analytics)}`),t.log.blank(),console.log(` Estimated total cost surfaced: ${t.pc.bold(`$${e.estimatedCostUsd.toFixed(2)}`)}`),console.log(` Estimated wire bytes: ${t.pc.dim(G(e.estimatedWireBytes))}`),console.log(` Collector endpoint: ${e.collectorUrl!==null?t.pc.bold(e.collectorUrl):t.pc.red("(not configured)")}`),console.log(` Concurrency: ${t.pc.bold(String(e.concurrency))} sessions in flight`),t.log.blank()}l(q,"renderSummary");function u(e){return e.toLocaleString("en-US")}l(u,"formatNum");function G(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}l(G,"formatBytes");async function R(e,o){const n=o?.createInterface??M.createInterface;return new Promise(s=>{const r=n({input:process.stdin,output:process.stdout});r.question(`${e} [Y/n] `,d=>{r.close();const m=d.trim().toLowerCase();if(m==="n"||m==="no"){s(!1);return}s(!0)})})}l(R,"promptYesNo");0&&(module.exports={importCommand,parseFlags,promptYesNo});
@@ -1 +1 @@
1
- "use strict";var u=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var d=(i,e)=>u(i,"name",{value:e,configurable:!0});var D=(i,e)=>{for(var o in e)u(i,o,{get:e[o],enumerable:!0})},N=(i,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of P(e))!x.call(i,s)&&s!==o&&u(i,s,{get:()=>e[s],enumerable:!(r=E(e,s))||r.enumerable});return i};var L=i=>N(u({},"__esModule",{value:!0}),i);var A={};D(A,{CYCLE_HINTS:()=>k,installCommand:()=>T,runInstallAll:()=>v});module.exports=L(A);var I=require("commander"),w=require("fs"),S=require("path"),l=require("../clients/registry"),b=require("../clients/claude"),c=require("../lib/config"),t=require("../lib/output"),C=require("../lib/projects-registry"),p=require("../lib/prompt"),y=require("../lib/telemetry"),h=require("./cycle-toggle");const k={browser:"web UI \xB7 DOM \xB7 console \xB7 a11y \xB7 screenshots \xB7 recording",node:"Node.js runtime \xB7 tracepoints \xB7 logpoints \xB7 exceptions \xB7 variables \xB7 logs",backend:"HTTP \xB7 gRPC \xB7 GraphQL \xB7 WebSocket \xB7 DB \xB7 logs"};async function M(i,e){if(e!==void 0)return e;const o=(0,c.loadConfig)(i);if((0,c.getVerificationMode)(o)==="monitor"||!(0,p.isInteractive)())return;const r=c.ALL_CYCLES.map(n=>({label:n,hint:k[n]})),s=c.ALL_CYCLES.map((n,m)=>(0,c.isCycleEnabled)(o,n)?m:-1).filter(n=>n>=0);return(await(0,p.promptMultiSelect)("Which platforms should require verification?",r,s)).map(n=>c.ALL_CYCLES[n])}d(M,"resolvePlatformSelection");function j(i,e){if(e===void 0)return;const o=(0,h.reconcileCyclesInLayer)(i,"project",e),r=e.length>0?t.pc.bold(e.join(", ")):t.pc.dim("none (monitoring tools only)"),s=o.length>0?t.pc.dim(` \u2014 updated: ${o.join(", ")}`):"";t.log.info(`Platforms: ${r}${s}`)}d(j,"applyPlatformSelection");function R(i,e){return e!==void 0?(0,l.resolveTargetClients)(i.path,e):(0,l.detectClients)(i.path)}d(R,"clientsForBatchEntry");async function v(i){const e=(0,l.listActiveProjects)();if(e.length===0)return t.log.info("No registered projects to install. Run `ironbee install` somewhere first."),{failures:0,total:0};t.log.info(`Installing across ${t.pc.bold(String(e.length))} registered project(s)\u2026`),t.log.blank();let o=0;const r=[];for(const a of e)try{const n=R(a,i.client);if(n.length===0){t.log.warn(`Skipping ${a.path} \u2014 no resolvable clients`);continue}const m=n.map(f=>f.name);t.log.label("project",t.pc.dim(a.path)),t.log.step(`installing ${t.pc.bold(m.join(", "))}`),(0,b.prepareIronBeeDir)(a.path),j(a.path,i.platforms);for(const f of n)f.install(a.path);(0,C.upsertProject)(a.path),r.push(...m)}catch(n){o++,t.log.error(` ${a.path}: ${n instanceof Error?n.message:String(n)}`)}t.log.blank(),o===0?t.log.success(`Installed across ${e.length} project(s). ${t.pc.dim("Restart your AI coding client(s) to apply.")}`):t.log.warn(`Completed with ${o} failure(s) \u2014 see above.`);const s=Array.from(new Set(r));return s.length>0&&await(0,y.trackInstall)(s),{failures:o,total:e.length}}d(v,"runInstallAll");const T=new I.Command("install").description("Install IronBee hooks and guidance files into a project. Use --all to install across every registered project (e.g. after a global config change).").argument("[project-dir]","target project directory",".").option("--client <name>",`client to install for (${(0,l.clientNames)()}), or "all"`).option("--all","Install across every project in the user-home inventory (~/.ironbee/projects.json) instead of just one. The [project-dir] argument is ignored when --all is set.").option("--platforms <list>",`comma-separated platforms to enable (${c.ALL_CYCLES.join(", ")}); skips the interactive picker. Empty ("") disables all. Default: interactive picker (pre-checked from current config), browser-only on a fresh non-interactive install.`).action(async(i,e)=>{let o;if(e.platforms!==void 0)try{o=(0,h.parsePlatformsFlag)(e.platforms)}catch(n){t.log.error(n instanceof Error?n.message:String(n)),process.exit(1)}if(e.all===!0){(await v({client:e.client,platforms:o})).failures>0&&process.exit(1);return}const r=(0,S.resolve)(i);(0,w.existsSync)(r)||(t.log.error(`Directory not found: ${r}`),process.exit(1));let s;if(e.client!==void 0)try{s=(0,l.resolveTargetClients)(r,e.client)}catch(n){t.log.error(n instanceof Error?n.message:String(n)),process.exit(1)}else{const n=(0,l.detectClients)(r);if(n.length>0){s=n;const m=n.map(f=>f.name).join(", ");t.log.info(`Detected client(s): ${t.pc.bold(m)}`)}else if((0,p.isInteractive)()){const m=[...l.REGISTERED_CLIENTS.map(g=>g.name),"all"],f=m.map(g=>({label:g,hint:g==="all"?"every registered client":void 0}));t.log.warn(`No client detected in ${t.pc.dim(r)}.`);const $=await(0,p.promptSelect)("Which client(s) to install for?",f,0);s=(0,l.resolveTargetClients)(r,m[$])}else t.log.warn(`No client detected. Defaulting to: ${l.REGISTERED_CLIENTS[0].name}`),s=[l.REGISTERED_CLIENTS[0]]}const a=await M(r,o);t.log.blank(),(0,b.prepareIronBeeDir)(r),j(r,a);for(const n of s)n.install(r);(0,C.upsertProject)(r),t.log.blank(),t.log.label("project",t.pc.dim(r)),t.log.blank(),t.log.success(`IronBee installed. ${t.pc.dim("Restart your AI coding client to activate the hooks.")}`),await(0,y.trackInstall)(s.map(n=>n.name),r)});0&&(module.exports={CYCLE_HINTS,installCommand,runInstallAll});
1
+ "use strict";var y=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var u=(i,e)=>y(i,"name",{value:e,configurable:!0});var T=(i,e)=>{for(var o in e)y(i,o,{get:e[o],enumerable:!0})},R=(i,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of A(e))!N.call(i,r)&&r!==o&&y(i,r,{get:()=>e[r],enumerable:!(a=V(e,r))||a.enumerable});return i};var B=i=>R(y({},"__esModule",{value:!0}),i);var q={};T(q,{CYCLE_HINTS:()=>D,installCommand:()=>F,runInstallAll:()=>v,syncSchemaIfChanged:()=>W});module.exports=B(q);var $=require("commander"),P=require("fs"),x=require("path"),c=require("../clients/registry"),M=require("../clients/claude"),m=require("../lib/config"),t=require("../lib/output"),j=require("../lib/projects-registry"),f=require("../lib/prompt"),w=require("../lib/telemetry"),S=require("../lib/install-version"),p=require("../lib/schema-sync"),C=require("./cycle-toggle"),l=require("./mode-select");const D={browser:"web UI \xB7 DOM \xB7 console \xB7 a11y \xB7 screenshots \xB7 recording",node:"Node.js runtime \xB7 tracepoints \xB7 logpoints \xB7 exceptions \xB7 variables \xB7 logs",backend:"HTTP \xB7 gRPC \xB7 GraphQL \xB7 WebSocket \xB7 DB \xB7 logs"};async function _(i,e){if(e!==void 0)return e;if(!(0,f.isInteractive)())return;const o=(0,l.resolveInstallDefaultMode)(i),a=Math.max(0,l.ALL_MODES.indexOf(o)),r=l.ALL_MODES.map(d=>({label:l.MODE_LABELS[d],hint:l.MODE_HINTS[d]})),s=await(0,f.promptSelect)("Which verification mode?",r,a);return l.ALL_MODES[s]}u(_,"resolveModeSelection");function k(i,e){if(e===void 0)return;const a=(0,l.applyModeToLayer)(i,"project",e)?"":t.pc.dim(" (unchanged)");t.log.info(`Mode: ${t.pc.bold(l.MODE_LABELS[e])}${a}`)}u(k,"applyModeSelection");async function O(i,e,o){if(e!==void 0)return e;const a=(0,m.loadConfig)(i);if((o??(0,m.getVerificationMode)(a))==="monitor"||!(0,f.isInteractive)())return;const s=m.ALL_CYCLES.map(n=>({label:n,hint:D[n]})),d=m.ALL_CYCLES.map((n,g)=>(0,m.isCyclePatternsActive)(a,n)?g:-1).filter(n=>n>=0);return(await(0,f.promptMultiSelect)("Which platforms should require verification?",s,d)).map(n=>m.ALL_CYCLES[n])}u(O,"resolvePlatformSelection");function E(i,e){if(e===void 0)return;const o=(0,C.reconcileCyclesInLayer)(i,"project",e,!0),a=e.length>0?t.pc.bold(e.join(", ")):t.pc.dim("none (monitoring tools only)"),r=o.length>0?t.pc.dim(` \u2014 updated: ${o.join(", ")}`):"";t.log.info(`Platforms: ${a}${r}`)}u(E,"applyPlatformSelection");function H(i,e){return e!==void 0?(0,c.resolveTargetClients)(i.path,e):(0,c.detectClients)(i.path)}u(H,"clientsForBatchEntry");async function v(i){const e=(0,c.listActiveProjects)();if(e.length===0)return t.log.info("No registered projects to install. Run `ironbee install` somewhere first."),{failures:0,total:0};t.log.info(`Installing across ${t.pc.bold(String(e.length))} registered project(s)\u2026`),t.log.blank();let o=0;const a=[];for(const s of e)try{const d=H(s,i.client);if(d.length===0){t.log.warn(`Skipping ${s.path} \u2014 no resolvable clients`);continue}const h=d.map(n=>n.name);t.log.label("project",t.pc.dim(s.path)),t.log.step(`installing ${t.pc.bold(h.join(", "))}`),(0,M.prepareIronBeeDir)(s.path),k(s.path,i.mode),E(s.path,i.platforms);for(const n of d)n.install(s.path);(0,j.upsertProject)(s.path),a.push(...h)}catch(d){o++,t.log.error(` ${s.path}: ${d instanceof Error?d.message:String(d)}`)}t.log.blank(),o===0?t.log.success(`Installed across ${e.length} project(s). ${t.pc.dim("Restart your AI coding client(s) to apply.")}`):t.log.warn(`Completed with ${o} failure(s) \u2014 see above.`);const r=Array.from(new Set(a));return r.length>0&&await(0,w.trackInstall)(r),{failures:o,total:e.length}}u(v,"runInstallAll");async function W(){try{if((0,p.isAutoRerenderDisabled)()||(0,p.readSyncedSchemaVersion)()>=S.INSTALL_SCHEMA_VERSION)return!1;const e=(0,c.listActiveProjects)();if(e.length===0)return(0,p.writeSyncedSchemaVersion)(S.INSTALL_SCHEMA_VERSION),!1;if(!(0,f.isInteractive)())return!1;t.log.blank(),t.log.warn(`IronBee's installed setup structure changed in this version \u2014 re-rendering ${t.pc.bold(String(e.length))} registered project(s):`);for(const o of e.slice(0,10))t.log.label("project",t.pc.dim(o.path));return e.length>10&&t.log.info(t.pc.dim(` \u2026and ${e.length-10} more`)),await(0,f.promptAcknowledge)(t.pc.dim(" Press Enter to update them now\u2026 ")),await v({}),(0,p.writeSyncedSchemaVersion)(S.INSTALL_SCHEMA_VERSION),!0}catch(i){return t.log.blank(),t.log.warn(`IronBee schema sync skipped: ${i instanceof Error?i.message:String(i)}`),!1}}u(W,"syncSchemaIfChanged");const F=new $.Command("install").description("Install IronBee hooks and guidance files into a project. Use --all to install across every registered project (e.g. after a global config change).").argument("[project-dir]","target project directory",".").option("--client <name>",`client to install for (${(0,c.clientNames)()}), or "all"`).option("--all","Install across every project in the user-home inventory (~/.ironbee/projects.json) instead of just one. The [project-dir] argument is ignored when --all is set.").option("--platforms <list>",`comma-separated platforms to enable (${m.ALL_CYCLES.join(", ")}); skips the interactive picker. Empty ("") disables all. Default: interactive picker (pre-checked from current config), browser-only on a fresh non-interactive install.`).option("--mode <mode>",`verification mode (${l.ALL_MODES.join(", ")}); skips the interactive picker. enforce = full enforcement (default), assist = tools installed but not enforced, monitor = monitoring-only. Default: interactive picker (pre-selecting the current mode), untouched on a non-interactive install.`).action(async(i,e)=>{let o;if(e.platforms!==void 0)try{o=(0,C.parsePlatformsFlag)(e.platforms)}catch(n){t.log.error(n instanceof Error?n.message:String(n)),process.exit(1)}let a;if(e.mode!==void 0)try{a=(0,l.parseModeFlag)(e.mode)}catch(n){t.log.error(n instanceof Error?n.message:String(n)),process.exit(1)}if(e.all===!0){(await v({client:e.client,platforms:o,mode:a})).failures>0&&process.exit(1);return}const r=(0,x.resolve)(i);(0,P.existsSync)(r)||(t.log.error(`Directory not found: ${r}`),process.exit(1));let s;if(e.client!==void 0)try{s=(0,c.resolveTargetClients)(r,e.client)}catch(n){t.log.error(n instanceof Error?n.message:String(n)),process.exit(1)}else{const n=(0,c.detectClients)(r);if(n.length>0){s=n;const g=n.map(I=>I.name).join(", ");t.log.info(`Detected client(s): ${t.pc.bold(g)}`)}else if((0,f.isInteractive)()){const g=[...c.REGISTERED_CLIENTS.map(b=>b.name),"all"],I=g.map(b=>({label:b,hint:b==="all"?"every registered client":void 0}));t.log.warn(`No client detected in ${t.pc.dim(r)}.`);const L=await(0,f.promptSelect)("Which client(s) to install for?",I,0);s=(0,c.resolveTargetClients)(r,g[L])}else t.log.warn(`No client detected. Defaulting to: ${c.REGISTERED_CLIENTS[0].name}`),s=[c.REGISTERED_CLIENTS[0]]}const d=await _(r,a),h=await O(r,o,d);t.log.blank(),(0,M.prepareIronBeeDir)(r),k(r,d),E(r,h);for(const n of s)n.install(r);(0,j.upsertProject)(r),t.log.blank(),t.log.label("project",t.pc.dim(r)),t.log.blank(),t.log.success(`IronBee installed. ${t.pc.dim("Restart your AI coding client to activate the hooks.")}`),await(0,w.trackInstall)(s.map(n=>n.name),r)});0&&(module.exports={CYCLE_HINTS,installCommand,runInstallAll,syncSchemaIfChanged});
@@ -1,2 +1,2 @@
1
- "use strict";var m=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var c=(o,t)=>m(o,"name",{value:t,configurable:!0});var I=(o,t)=>{for(var e in t)m(o,e,{get:t[e],enumerable:!0})},P=(o,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of U(t))!O.call(o,r)&&r!==e&&m(o,r,{get:()=>t[r],enumerable:!(i=L(t,r))||i.enumerable});return o};var E=o=>P(m({},"__esModule",{value:!0}),o);var _={};I(_,{loginCommand:()=>N});module.exports=E(_);var R=require("commander"),S=require("os"),h=require("path"),s=require("fs"),n=require("../lib/output"),k=require("../lib/prompt"),l=require("../lib/auth");const w="https://console.ironbee.ai",y="https://collector.service.ironbee.ai";function C(){return(0,h.join)((0,S.homedir)(),".ironbee","config.json")}c(C,"globalConfigPath");function W(){const o=C();if(!(0,s.existsSync)(o))return{};try{return JSON.parse((0,s.readFileSync)(o,"utf-8"))}catch{return{}}}c(W,"readGlobalConfig");function A(o){const t=C();(0,s.mkdirSync)((0,h.join)(t,".."),{recursive:!0}),(0,s.writeFileSync)(t,JSON.stringify(o,null,2)+`
2
- `)}c(A,"writeGlobalConfig");function $(o){const t=o.replace(/\/$/,"");return t.startsWith("http://")||t.startsWith("https://")?t:`${t.startsWith("localhost")||t.startsWith("127.0.0.1")?"http":"https"}://${t}`}c($,"withProtocol");const v=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function F(){const o=Date.now();if(!(0,k.isInteractive)())return n.log.dim("Waiting for login... (timeout: 5 min) \u2014 press Ctrl+C to cancel"),()=>{};let e=0;const i=setInterval(()=>{const r=Math.floor((Date.now()-o)/1e3),g=Math.floor(r/60),a=r%60,p=g>0?`${g}m ${String(a).padStart(2,"0")}s`:`${a}s`,f=n.pc.dim(` ${v[e%v.length]} Waiting for browser login\u2026 ${p} (Ctrl+C to cancel)`);process.stdout.write(`\r${f}`),e++},100);return()=>{clearInterval(i),process.stdout.write("\r\x1B[2K")}}c(F,"startWaitSpinner");const N=new R.Command("login").description("Log in to IronBee and configure your API key").option("--console-url <url>",`Console URL, e.g. console.ironbee.dev or localhost:5173 (default: ${w})`).option("--collector-url <url>",`Collector URL, e.g. api.ironbee.dev or localhost:8080 (appends /collect; default: ${y})`).action(async o=>{const t=$(o.consoleUrl??w),e=o.collectorUrl?`${$(o.collectorUrl)}/collect`:y;try{const i=await(0,l.findFreePort)(),r=(0,l.generateState)(),g=`http://localhost:${i}/callback`,a=`${t}/cli-auth?callback=${encodeURIComponent(g)}&state=${r}`;n.log.info(`Opening ${n.pc.cyan(t)} in your browser...`),n.log.blank(),n.log.dim(" If the browser does not open automatically, visit:"),n.log.dim(` ${a}`),n.log.blank();const p=F();let f;try{f=await(0,l.startCallbackServer)(i,r,300*1e3,()=>{(0,l.openBrowser)(a)})}finally{p()}const d=W(),u=d.collector,b=u&&typeof u=="object"&&!Array.isArray(u)?{...u}:{};b.url=e,b.apiKey=f.apiKey,d.collector=b,A(d),n.log.blank(),n.log.success("Logged in successfully!"),n.log.label("Console ",t),n.log.label("Collector",e),n.log.label("Config ",C())}catch(i){const r=i instanceof Error?i.message:String(i);n.log.blank(),n.log.error(`Login failed: ${r}`),process.exit(1)}});0&&(module.exports={loginCommand});
1
+ "use strict";var d=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var a=(o,t)=>d(o,"name",{value:t,configurable:!0});var E=(o,t)=>{for(var r in t)d(o,r,{get:t[r],enumerable:!0})},x=(o,t,r,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of T(t))!O.call(o,n)&&n!==r&&d(o,n,{get:()=>t[n],enumerable:!(l=U(t,n))||l.enumerable});return o};var I=o=>x(d({},"__esModule",{value:!0}),o);var _={};E(_,{loginCommand:()=>F});module.exports=I(_);var S=require("commander"),h=require("os"),y=require("path"),s=require("fs"),e=require("../lib/output"),L=require("../lib/prompt"),i=require("../lib/auth");const w="https://console.ironbee.ai",v="https://collector.service.ironbee.ai";function k(){return(0,y.join)((0,h.homedir)(),".ironbee","config.json")}a(k,"globalConfigPath");function P(){const o=k();if(!(0,s.existsSync)(o))return{};try{return JSON.parse((0,s.readFileSync)(o,"utf-8"))}catch{return{}}}a(P,"readGlobalConfig");function N(o){const t=k();(0,s.mkdirSync)((0,y.join)(t,".."),{recursive:!0}),(0,s.writeFileSync)(t,JSON.stringify(o,null,2)+`
2
+ `)}a(N,"writeGlobalConfig");function $(o){const t=o.replace(/\/$/,"");return t.startsWith("http://")||t.startsWith("https://")?t:`${t.startsWith("localhost")||t.startsWith("127.0.0.1")?"http":"https"}://${t}`}a($,"withProtocol");function W(o){const t=(o??"").trim();if(t.length>0)return t;const r=(0,h.hostname)().trim();return r.length>0?r:"cli"}a(W,"resolveTokenName");const R=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function A(){const o=Date.now();if(!(0,L.isInteractive)())return e.log.dim("Waiting for login... (timeout: 5 min) \u2014 press Ctrl+C to cancel"),()=>{};let r=0;const l=setInterval(()=>{const n=Math.floor((Date.now()-o)/1e3),c=Math.floor(n/60),u=n%60,f=c>0?`${c}m ${String(u).padStart(2,"0")}s`:`${u}s`,b=e.pc.dim(` ${R[r%R.length]} Waiting for browser login\u2026 ${f} (Ctrl+C to cancel)`);process.stdout.write(`\r${b}`),r++},100);return()=>{clearInterval(l),process.stdout.write("\r\x1B[2K")}}a(A,"startWaitSpinner");const F=new S.Command("login").description("Log in to IronBee and configure your access token").option("--console-url <url>",`Console URL, e.g. console.ironbee.dev or localhost:5173 (default: ${w})`).option("--collector-url <url>",`Collector base URL. Events POST to {url}/v1/events; pass the URL exactly as the collector exposes it (no path is appended). Examples: collector.service.ironbee.dev, localhost:8080, https://api.example.com/collect. Default: ${v}`).option("--name <label>","Label for the personal access token shown on the console's /access-tokens page (default: OS hostname)").action(async o=>{const t=$(o.consoleUrl??w),r=o.collectorUrl?$(o.collectorUrl):v,l=W(o.name);try{const n=await(0,i.findFreePort)(),c=(0,i.generateState)(),u=`http://localhost:${n}/callback`,f=`${t}/cli-auth?callback=${encodeURIComponent(u)}&state=${c}&name=${encodeURIComponent(l)}`;e.log.info(`Opening ${e.pc.cyan(t)} in your browser...`),e.log.blank(),e.log.dim(" If the browser does not open automatically, visit:"),e.log.dim(` ${f}`),e.log.blank();const b=A();let g;try{g=await(0,i.startCallbackServer)(n,c,300*1e3,()=>{(0,i.openBrowser)(f)})}finally{b()}const C=P(),p=C.collector,m=p&&typeof p=="object"&&!Array.isArray(p)?{...p}:{};if(m.url=r,g.accessToken)m.oauthToken=g.accessToken,delete m.apiKey;else if(g.apiKey)m.apiKey=g.apiKey,delete m.oauthToken;else throw new Error("the console did not return an access token or API key");C.collector=m,N(C),e.log.blank(),e.log.success("Logged in successfully!"),e.log.label("Console ",t),e.log.label("Collector",r),e.log.label("Token ",g.accessToken?`personal (${l})`:"shared account api key"),e.log.label("Config ",k())}catch(n){const c=n instanceof Error?n.message:String(n);e.log.blank(),e.log.error(`Login failed: ${c}`),process.exit(1)}});0&&(module.exports={loginCommand});
@@ -0,0 +1,2 @@
1
+ "use strict";var f=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var r=(o,e)=>f(o,"name",{value:e,configurable:!0});var v=(o,e)=>{for(var n in e)f(o,n,{get:e[n],enumerable:!0})},M=(o,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of p(e))!V.call(o,i)&&i!==n&&f(o,i,{get:()=>e[i],enumerable:!(a=m(e,i))||a.enumerable});return o};var w=o=>M(f({},"__esModule",{value:!0}),o);var E={};v(E,{ALL_MODES:()=>g,MODE_HINTS:()=>C,MODE_LABELS:()=>L,applyModeToLayer:()=>O,buildVerificationBlockForMode:()=>y,parseModeFlag:()=>S,resolveInstallDefaultMode:()=>x});module.exports=w(E);var t=require("fs"),u=require("path"),c=require("../lib/config"),d=require("../lib/logger");const g=["enforce","assist","monitor"],L={enforce:"auto verify (enforce)",assist:"assist",monitor:"monitor only"},C={enforce:"block task completion until changes are verified \u2014 full enforcement (default)",assist:"tools installed but not enforced \u2014 the agent verifies manually via /ironbee-verify",monitor:"no enforcement \u2014 only track sessions / activity / tools for analytics"};function S(o){const e=o.trim().toLowerCase();if(e==="enforce"||e==="assist"||e==="monitor")return e;throw new Error(`Unknown mode '${o}'. Available: ${g.join(", ")}.`)}r(S,"parseModeFlag");function s(o){if(!(0,t.existsSync)(o))return{};try{return JSON.parse((0,t.readFileSync)(o,"utf-8"))}catch(e){throw d.logger.debug(`failed to read ${o}: ${e}`),new Error(`Config at ${o} is not valid JSON: ${e instanceof Error?e.message:e}`)}}r(s,"readLayerConfig");function B(o,e){(0,t.mkdirSync)((0,u.join)(o,".."),{recursive:!0}),(0,t.writeFileSync)(o,JSON.stringify(e,null,2)+`
2
+ `)}r(B,"writeLayerConfig");function l(o){const e=o.verification;if(e&&typeof e=="object"&&!Array.isArray(e))return e}r(l,"readVerificationBlock");function x(o){let e,n;for(const a of["project","local"]){const i=l(s((0,c.getTargetConfigPath)(a,o)));i!==void 0&&(typeof i.enable=="boolean"&&(e=i.enable),typeof i.auto=="boolean"&&(n=i.auto))}return e===!1?"monitor":n===!1?"assist":"enforce"}r(x,"resolveInstallDefaultMode");function y(o,e){const n={...o??{}};switch(e){case"enforce":n.enable=!0,n.auto=!0;break;case"assist":n.enable=!0,n.auto=!1;break;case"monitor":n.enable=!1,delete n.auto;break}return n}r(y,"buildVerificationBlockForMode");function O(o,e,n){const a=(0,c.getTargetConfigPath)(e,o),i=s(a),b=JSON.stringify(i.verification??null);i.verification=y(l(i),n);const k=JSON.stringify(i.verification);return b===k?!1:(B(a,i),!0)}r(O,"applyModeToLayer");0&&(module.exports={ALL_MODES,MODE_HINTS,MODE_LABELS,applyModeToLayer,buildVerificationBlockForMode,parseModeFlag,resolveInstallDefaultMode});
@@ -1,5 +1,6 @@
1
- "use strict";var v=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var c=(t,e)=>v(t,"name",{value:e,configurable:!0});var j=(t,e)=>{for(var n in e)v(t,n,{get:e[n],enumerable:!0})},N=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of T(e))!R.call(t,r)&&r!==n&&v(t,r,{get:()=>e[r],enumerable:!(i=V(e,r))||i.enumerable});return t};var P=t=>N(v({},"__esModule",{value:!0}),t);var X={};j(X,{ActivityAwareEvent:()=>d.ActivityAwareEvent,Event:()=>d.Event,EventType:()=>d.EventType,EventTypeValue:()=>d.EventTypeValue,FixAwareEvent:()=>d.FixAwareEvent,VerificationAwareEvent:()=>d.VerificationAwareEvent,appendAction:()=>I,baseFields:()=>F,deterministicSessionEndId:()=>D,findDurationSinceLastAction:()=>O,getFileChangesSinceLastFailVerdict:()=>H,getFileChangesSinceLastVerification:()=>B,getToolCallsSinceLastFileChange:()=>J,getToolCallsSinceLastVerification:()=>z,hasFileChangesSinceLastVerification:()=>K,hasToolCallsSinceLastVerdict:()=>W,readActionsSinceLastMarker:()=>x,resolveProjectName:()=>S,summarizeFixFileChanges:()=>Y});module.exports=P(X);var u=require("fs"),y=require("crypto"),a=require("path"),g=require("../../lib/logger"),b=require("../../lib/collector"),$=require("../../lib/config"),w=require("../../queue/submit"),k=require("../../queue/types"),C=require("../../queue/register-handlers"),d=require("../../lib/event");function S(t){let e=t,n;for(;;){const i=(0,a.join)(e,".git");if((0,u.existsSync)(i)){const s=M(i);if(s==="directory"){const o=E(i);return o||(0,a.basename)(e)}if(s==="linked-pointer"){const o=_(i),l=o!==void 0?E(o):void 0;return l||(0,a.basename)(e)}s==="worktree-pointer"&&n===void 0&&(n=U(i))}const r=(0,a.dirname)(e);if(r===e)break;e=r}return n??(0,a.basename)(t)}c(S,"resolveProjectName");function M(t){try{const e=(0,u.statSync)(t);if(e.isDirectory())return"directory";if(!e.isFile())return"other";const n=_(t);return n===void 0?"other":(0,u.existsSync)((0,a.join)(n,"commondir"))?"worktree-pointer":"linked-pointer"}catch(e){return g.logger.debug(`resolveProjectName: stat failed for ${t}: ${e instanceof Error?e.message:e}`),"other"}}c(M,"classifyGitEntry");function _(t){try{const n=(0,u.readFileSync)(t,"utf-8").trim().match(/^gitdir:\s*(.+)$/m);if(!n)return;const i=n[1].trim();return(0,a.isAbsolute)(i)?i:(0,a.resolve)((0,a.dirname)(t),i)}catch(e){g.logger.debug(`resolveProjectName: pointer at ${t} unreadable: ${e instanceof Error?e.message:e}`);return}}c(_,"readGitdirPointer");function E(t){try{const e=(0,a.join)(t,"config");if(!(0,u.existsSync)(e))return;const n=q((0,u.readFileSync)(e,"utf-8"));return n?L(n):void 0}catch(e){g.logger.debug(`resolveProjectName: failed to read git config at ${t}: ${e instanceof Error?e.message:e}`);return}}c(E,"repoNameFromGitConfig");function U(t){const e=_(t);if(e===void 0)return;const n=(0,a.join)(e,"commondir");let i;try{if((0,u.existsSync)(n)){const o=(0,u.readFileSync)(n,"utf-8").trim();i=(0,a.isAbsolute)(o)?o:(0,a.resolve)(e,o)}else i=e}catch(o){g.logger.debug(`resolveProjectName: commondir at ${n} unreadable: ${o instanceof Error?o.message:o}`);return}const r=E(i);if(r)return r;const s=(0,a.basename)(i)===".git"?(0,a.basename)((0,a.dirname)(i)):(0,a.basename)(i);return s.length>0?s:void 0}c(U,"repoNameFromWorktreePointer");function q(t){const e=t.split(/\r?\n/);let n=null,i=null,r,s;for(const o of e){const l=o.trim();if(l.length===0||l.startsWith("#")||l.startsWith(";"))continue;const p=l.match(/^\[([^\s\]]+)(?:\s+"([^"]*)")?\]$/);if(p){n=p[1].toLowerCase(),i=p[2]??null;continue}if(n!=="remote"||i===null)continue;const m=l.match(/^url\s*=\s*(.+?)\s*$/i);if(!m)continue;const f=m[1];i==="origin"&&(r=f),s===void 0&&(s=f)}return r??s}c(q,"readFirstRemoteUrl");function L(t){let e=t.trim();if(e.length===0)return;const n=e.match(/^[^/@]+@[^/:]+:(.+)$/);if(n?e=n[1]:e=e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/]*\//i,""),e=e.replace(/[?#].*$/,"").replace(/\/+$/,""),e.length===0)return;const r=(e.split("/").pop()??"").replace(/\.git$/i,"");return r.length>0?r:void 0}c(L,"repoNameFromRemoteUrl");function F(t){const e=(0,a.basename)((0,a.dirname)(t)),n=(0,a.dirname)((0,a.dirname)((0,a.dirname)((0,a.dirname)(t)))),i=(0,a.dirname)(t),{getUserEmail:r,getUsageType:s,getUsagePlan:o}=require("./session-state"),l=r(i),p=s(i),m=o(i),f={id:(0,y.randomUUID)(),session_id:e,project_name:S(n)};return l&&(f.user_email=l),p&&(f.usage_type=p),m&&(f.usage_plan=m),f}c(F,"baseFields");function D(t){const e=(0,y.createHash)("sha256").update("session_end:"+t).digest("hex");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20,32)}`}c(D,"deterministicSessionEndId");async function I(t,e){const n=F(t);e.id||(e.id=n.id),e.session_id||(e.session_id=n.session_id),e.project_name||(e.project_name=n.project_name);try{(0,u.mkdirSync)((0,a.dirname)(t),{recursive:!0}),(0,u.appendFileSync)(t,JSON.stringify(e)+`
2
- `)}catch(i){g.logger.debug(`failed to append action to ${t}: ${i}`)}if(e.type!=="tool_call"){const i=(0,a.basename)((0,a.dirname)(t)),r=(0,a.dirname)((0,a.dirname)((0,a.dirname)((0,a.dirname)(t))));try{await(0,b.sendToCollector)(e,i,r)}catch(s){s instanceof b.RetriableCollectorError?G(r,i,e,s):g.logger.debug(`failed to send action to collector: ${s}`)}}}c(I,"appendAction");function G(t,e,n,i){if(!(0,$.isJobQueueEnabled)(t)){g.logger.debug(`collector fallback: jobQueue disabled, dropping type=${n.type} id=${n.id} (cause: ${i.message})`);return}try{(0,w.submit)(t,e,C.SEND_EVENT_TYPE,n),g.logger.debug(`collector fallback: enqueued type=${n.type} id=${n.id} as send_event (cause: ${i.message})`)}catch(r){if(r instanceof k.JobTooLargeError){g.logger.debug(`collector fallback: event too large for queue (${r.sizeBytes} bytes), dropping type=${n.type} id=${n.id}`);return}g.logger.debug(`collector fallback: queue submit failed for type=${n.type} id=${n.id}: ${r}`)}}c(G,"enqueueCollectorFallback");function O(t,e,n){if((0,u.existsSync)(t))try{const r=(0,u.readFileSync)(t,"utf-8").trim().split(`
3
- `).filter(s=>s.length>0);for(let s=r.length-1;s>=0;s--)try{const o=JSON.parse(r[s]);if(o.type===e&&typeof o.timestamp=="number")return n-o.timestamp}catch{}}catch(i){g.logger.debug(`failed to find duration for ${e}: ${i}`)}}c(O,"findDurationSinceLastAction");function x(t,e){return h(t,n=>n.type===e)}c(x,"readActionsSinceLastMarker");function h(t,e){if(!(0,u.existsSync)(t))return[];try{const i=(0,u.readFileSync)(t,"utf-8").trim().split(`
4
- `).filter(o=>o.length>0);let r=-1;const s=[];for(let o=0;o<i.length;o++)try{const l=JSON.parse(i[o]);s.push(l),e(l)&&(r=o)}catch{}return s.slice(r+1)}catch(n){return g.logger.debug(`failed to read actions from ${t}: ${n}`),[]}}c(h,"readActionsSinceMatch");function A(t){return t.type!=="verification_requested"?!1:t.action==="allow"}c(A,"isAllowVerificationRequested");function z(t){return h(t,A).filter(n=>n.type==="tool_call")}c(z,"getToolCallsSinceLastVerification");function J(t){return x(t,"file_change").filter(n=>n.type==="tool_call")}c(J,"getToolCallsSinceLastFileChange");function W(t){return x(t,"verdict_write").some(n=>n.type==="tool_call")}c(W,"hasToolCallsSinceLastVerdict");function K(t){return h(t,A).some(n=>n.type==="file_change")}c(K,"hasFileChangesSinceLastVerification");function B(t){return h(t,A).filter(n=>n.type==="file_change")}c(B,"getFileChangesSinceLastVerification");function Q(t){return t.type!=="verdict_write"?!1:t.verdict?.status==="fail"}c(Q,"isFailVerdictWrite");function H(t){if(!(0,u.existsSync)(t))return[];try{const i=(0,u.readFileSync)(t,"utf-8").trim().split(`
5
- `).filter(o=>o.length>0).map(o=>{try{return JSON.parse(o)}catch{return null}});let r=-1;for(let o=0;o<i.length;o++){const l=i[o];l!==null&&Q(l)&&(r=o)}if(r<0)return[];const s=[];for(let o=r+1;o<i.length;o++){const l=i[o];l!==null&&l.type==="file_change"&&s.push(l)}return s}catch(e){return g.logger.debug(`failed to read file changes since last fail verdict: ${e}`),[]}}c(H,"getFileChangesSinceLastFailVerdict");function Y(t){if(t.length===0)return[];const e=new Map,n=[];for(const i of t){const r=i.file_path;let s=e.get(r);s||(s={op:i.operation,added:0,removed:0},e.set(r,s),n.push(r)),s.op=s.op==="create"||i.operation==="create"?"create":i.operation,s.added+=typeof i.lines_added=="number"?i.lines_added:0,s.removed+=typeof i.lines_removed=="number"?i.lines_removed:0}return n.map(i=>{const r=e.get(i);return`${r.op} ${i} (+${r.added}/-${r.removed})`})}c(Y,"summarizeFixFileChanges");0&&(module.exports={ActivityAwareEvent,Event,EventType,EventTypeValue,FixAwareEvent,VerificationAwareEvent,appendAction,baseFields,deterministicSessionEndId,findDurationSinceLastAction,getFileChangesSinceLastFailVerdict,getFileChangesSinceLastVerification,getToolCallsSinceLastFileChange,getToolCallsSinceLastVerification,hasFileChangesSinceLastVerification,hasToolCallsSinceLastVerdict,readActionsSinceLastMarker,resolveProjectName,summarizeFixFileChanges});
1
+ "use strict";var v=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var c=(t,e)=>v(t,"name",{value:e,configurable:!0});var j=(t,e)=>{for(var n in e)v(t,n,{get:e[n],enumerable:!0})},N=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of T(e))!R.call(t,r)&&r!==n&&v(t,r,{get:()=>e[r],enumerable:!(i=V(e,r))||i.enumerable});return t};var P=t=>N(v({},"__esModule",{value:!0}),t);var Z={};j(Z,{ActivityAwareEvent:()=>d.ActivityAwareEvent,Event:()=>d.Event,EventType:()=>d.EventType,EventTypeValue:()=>d.EventTypeValue,FixAwareEvent:()=>d.FixAwareEvent,VerificationAwareEvent:()=>d.VerificationAwareEvent,appendAction:()=>I,baseFields:()=>F,deterministicSessionEndId:()=>D,findDurationSinceLastAction:()=>G,findLastActionTimestamp:()=>J,getFileChangesSinceLastFailVerdict:()=>Y,getFileChangesSinceLastVerification:()=>Q,getToolCallsSinceLastFileChange:()=>W,getToolCallsSinceLastVerification:()=>z,hasFileChangesSinceLastVerification:()=>B,hasToolCallsSinceLastVerdict:()=>K,readActionsSinceLastMarker:()=>x,resolveProjectName:()=>C,summarizeFixFileChanges:()=>X});module.exports=P(Z);var u=require("fs"),y=require("crypto"),a=require("path"),f=require("../../lib/logger"),b=require("../../lib/collector"),$=require("../../lib/config"),w=require("../../queue/submit"),k=require("../../queue/types"),S=require("../../queue/register-handlers"),d=require("../../lib/event");function C(t){let e=t,n;for(;;){const i=(0,a.join)(e,".git");if((0,u.existsSync)(i)){const s=L(i);if(s==="directory"){const o=_(i);return o||(0,a.basename)(e)}if(s==="linked-pointer"){const o=E(i),l=o!==void 0?_(o):void 0;return l||(0,a.basename)(e)}s==="worktree-pointer"&&n===void 0&&(n=M(i))}const r=(0,a.dirname)(e);if(r===e)break;e=r}return n??(0,a.basename)(t)}c(C,"resolveProjectName");function L(t){try{const e=(0,u.statSync)(t);if(e.isDirectory())return"directory";if(!e.isFile())return"other";const n=E(t);return n===void 0?"other":(0,u.existsSync)((0,a.join)(n,"commondir"))?"worktree-pointer":"linked-pointer"}catch(e){return f.logger.debug(`resolveProjectName: stat failed for ${t}: ${e instanceof Error?e.message:e}`),"other"}}c(L,"classifyGitEntry");function E(t){try{const n=(0,u.readFileSync)(t,"utf-8").trim().match(/^gitdir:\s*(.+)$/m);if(!n)return;const i=n[1].trim();return(0,a.isAbsolute)(i)?i:(0,a.resolve)((0,a.dirname)(t),i)}catch(e){f.logger.debug(`resolveProjectName: pointer at ${t} unreadable: ${e instanceof Error?e.message:e}`);return}}c(E,"readGitdirPointer");function _(t){try{const e=(0,a.join)(t,"config");if(!(0,u.existsSync)(e))return;const n=U((0,u.readFileSync)(e,"utf-8"));return n?q(n):void 0}catch(e){f.logger.debug(`resolveProjectName: failed to read git config at ${t}: ${e instanceof Error?e.message:e}`);return}}c(_,"repoNameFromGitConfig");function M(t){const e=E(t);if(e===void 0)return;const n=(0,a.join)(e,"commondir");let i;try{if((0,u.existsSync)(n)){const o=(0,u.readFileSync)(n,"utf-8").trim();i=(0,a.isAbsolute)(o)?o:(0,a.resolve)(e,o)}else i=e}catch(o){f.logger.debug(`resolveProjectName: commondir at ${n} unreadable: ${o instanceof Error?o.message:o}`);return}const r=_(i);if(r)return r;const s=(0,a.basename)(i)===".git"?(0,a.basename)((0,a.dirname)(i)):(0,a.basename)(i);return s.length>0?s:void 0}c(M,"repoNameFromWorktreePointer");function U(t){const e=t.split(/\r?\n/);let n=null,i=null,r,s;for(const o of e){const l=o.trim();if(l.length===0||l.startsWith("#")||l.startsWith(";"))continue;const p=l.match(/^\[([^\s\]]+)(?:\s+"([^"]*)")?\]$/);if(p){n=p[1].toLowerCase(),i=p[2]??null;continue}if(n!=="remote"||i===null)continue;const m=l.match(/^url\s*=\s*(.+?)\s*$/i);if(!m)continue;const g=m[1];i==="origin"&&(r=g),s===void 0&&(s=g)}return r??s}c(U,"readFirstRemoteUrl");function q(t){let e=t.trim();if(e.length===0)return;const n=e.match(/^[^/@]+@[^/:]+:(.+)$/);if(n?e=n[1]:e=e.replace(/^[a-z][a-z0-9+.-]*:\/\/[^/]*\//i,""),e=e.replace(/[?#].*$/,"").replace(/\/+$/,""),e.length===0)return;const r=(e.split("/").pop()??"").replace(/\.git$/i,"");return r.length>0?r:void 0}c(q,"repoNameFromRemoteUrl");function F(t){const e=(0,a.basename)((0,a.dirname)(t)),n=(0,a.dirname)((0,a.dirname)((0,a.dirname)((0,a.dirname)(t)))),i=(0,a.dirname)(t),{getUserEmail:r,getUsageType:s,getUsagePlan:o}=require("./session-state"),l=r(i),p=s(i),m=o(i),g={id:(0,y.randomUUID)(),session_id:e,project_name:C(n)};return l&&(g.user_email=l),p&&(g.usage_type=p),m&&(g.usage_plan=m),g}c(F,"baseFields");function D(t){const e=(0,y.createHash)("sha256").update("session_end:"+t).digest("hex");return`${e.slice(0,8)}-${e.slice(8,12)}-${e.slice(12,16)}-${e.slice(16,20)}-${e.slice(20,32)}`}c(D,"deterministicSessionEndId");async function I(t,e){const n=F(t);e.id||(e.id=n.id),e.session_id||(e.session_id=n.session_id),e.project_name||(e.project_name=n.project_name);try{(0,u.mkdirSync)((0,a.dirname)(t),{recursive:!0}),(0,u.appendFileSync)(t,JSON.stringify(e)+`
2
+ `)}catch(i){f.logger.debug(`failed to append action to ${t}: ${i}`)}if(e.type!=="tool_call"){const i=(0,a.basename)((0,a.dirname)(t)),r=(0,a.dirname)((0,a.dirname)((0,a.dirname)((0,a.dirname)(t))));try{await(0,b.sendToCollector)(e,i,r)}catch(s){s instanceof b.RetriableCollectorError?O(r,i,e,s):f.logger.debug(`failed to send action to collector: ${s}`)}}}c(I,"appendAction");function O(t,e,n,i){if(!(0,$.isJobQueueEnabled)(t)){f.logger.debug(`collector fallback: jobQueue disabled, dropping type=${n.type} id=${n.id} (cause: ${i.message})`);return}try{(0,w.submit)(t,e,S.SEND_EVENT_TYPE,n),f.logger.debug(`collector fallback: enqueued type=${n.type} id=${n.id} as send_event (cause: ${i.message})`)}catch(r){if(r instanceof k.JobTooLargeError){f.logger.debug(`collector fallback: event too large for queue (${r.sizeBytes} bytes), dropping type=${n.type} id=${n.id}`);return}f.logger.debug(`collector fallback: queue submit failed for type=${n.type} id=${n.id}: ${r}`)}}c(O,"enqueueCollectorFallback");function G(t,e,n){if((0,u.existsSync)(t))try{const r=(0,u.readFileSync)(t,"utf-8").trim().split(`
3
+ `).filter(s=>s.length>0);for(let s=r.length-1;s>=0;s--)try{const o=JSON.parse(r[s]);if(o.type===e&&typeof o.timestamp=="number")return n-o.timestamp}catch{}}catch(i){f.logger.debug(`failed to find duration for ${e}: ${i}`)}}c(G,"findDurationSinceLastAction");function x(t,e){return h(t,n=>n.type===e)}c(x,"readActionsSinceLastMarker");function J(t){if((0,u.existsSync)(t))try{const n=(0,u.readFileSync)(t,"utf-8").trim().split(`
4
+ `).filter(i=>i.length>0);for(let i=n.length-1;i>=0;i--)try{const r=JSON.parse(n[i]);if(typeof r.timestamp=="number")return r.timestamp}catch{}}catch(e){f.logger.debug(`failed to read last action timestamp from ${t}: ${e}`)}}c(J,"findLastActionTimestamp");function h(t,e){if(!(0,u.existsSync)(t))return[];try{const i=(0,u.readFileSync)(t,"utf-8").trim().split(`
5
+ `).filter(o=>o.length>0);let r=-1;const s=[];for(let o=0;o<i.length;o++)try{const l=JSON.parse(i[o]);s.push(l),e(l)&&(r=o)}catch{}return s.slice(r+1)}catch(n){return f.logger.debug(`failed to read actions from ${t}: ${n}`),[]}}c(h,"readActionsSinceMatch");function A(t){return t.type!=="verification_requested"?!1:t.action==="allow"}c(A,"isAllowVerificationRequested");function z(t){return h(t,A).filter(n=>n.type==="tool_call")}c(z,"getToolCallsSinceLastVerification");function W(t){return x(t,"file_change").filter(n=>n.type==="tool_call")}c(W,"getToolCallsSinceLastFileChange");function K(t){return x(t,"verdict_write").some(n=>n.type==="tool_call")}c(K,"hasToolCallsSinceLastVerdict");function B(t){return h(t,A).some(n=>n.type==="file_change")}c(B,"hasFileChangesSinceLastVerification");function Q(t){return h(t,A).filter(n=>n.type==="file_change")}c(Q,"getFileChangesSinceLastVerification");function H(t){return t.type!=="verdict_write"?!1:t.verdict?.status==="fail"}c(H,"isFailVerdictWrite");function Y(t){if(!(0,u.existsSync)(t))return[];try{const i=(0,u.readFileSync)(t,"utf-8").trim().split(`
6
+ `).filter(o=>o.length>0).map(o=>{try{return JSON.parse(o)}catch{return null}});let r=-1;for(let o=0;o<i.length;o++){const l=i[o];l!==null&&H(l)&&(r=o)}if(r<0)return[];const s=[];for(let o=r+1;o<i.length;o++){const l=i[o];l!==null&&l.type==="file_change"&&s.push(l)}return s}catch(e){return f.logger.debug(`failed to read file changes since last fail verdict: ${e}`),[]}}c(Y,"getFileChangesSinceLastFailVerdict");function X(t){if(t.length===0)return[];const e=new Map,n=[];for(const i of t){const r=i.file_path;let s=e.get(r);s||(s={op:i.operation,added:0,removed:0},e.set(r,s),n.push(r)),s.op=s.op==="create"||i.operation==="create"?"create":i.operation,s.added+=typeof i.lines_added=="number"?i.lines_added:0,s.removed+=typeof i.lines_removed=="number"?i.lines_removed:0}return n.map(i=>{const r=e.get(i);return`${r.op} ${i} (+${r.added}/-${r.removed})`})}c(X,"summarizeFixFileChanges");0&&(module.exports={ActivityAwareEvent,Event,EventType,EventTypeValue,FixAwareEvent,VerificationAwareEvent,appendAction,baseFields,deterministicSessionEndId,findDurationSinceLastAction,findLastActionTimestamp,getFileChangesSinceLastFailVerdict,getFileChangesSinceLastVerification,getToolCallsSinceLastFileChange,getToolCallsSinceLastVerification,hasFileChangesSinceLastVerification,hasToolCallsSinceLastVerdict,readActionsSinceLastMarker,resolveProjectName,summarizeFixFileChanges});
@@ -1 +1 @@
1
- "use strict";var f=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var a=(i,e)=>f(i,"name",{value:e,configurable:!0});var h=(i,e)=>{for(var n in e)f(i,n,{get:e[n],enumerable:!0})},_=(i,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of A(e))!m.call(i,r)&&r!==n&&f(i,r,{get:()=>e[r],enumerable:!(t=I(e,r))||t.enumerable});return i};var V=i=>_(f({},"__esModule",{value:!0}),i);var gt={};h(gt,{addPendingFixes:()=>nt,clearActiveActivity:()=>ct,clearActiveFix:()=>k,clearActiveVerification:()=>P,clearPendingFixes:()=>rt,closeOpenCycles:()=>st,generateTraceId:()=>b,getActiveActivityId:()=>H,getActiveFixId:()=>U,getActiveTraceId:()=>E,getActiveVerificationId:()=>w,getChainedStatusLine:()=>Z,getContextInjectedVerificationId:()=>tt,getLastVerdictStatus:()=>q,getPendingFixes:()=>it,getPhase:()=>z,getRetries:()=>F,getUsagePlan:()=>X,getUsageType:()=>Q,getUserEmail:()=>K,incrementRetries:()=>R,isActive:()=>W,isRecordingActive:()=>N,isRecordingRequired:()=>O,readState:()=>s,reconcileAbandonedActivity:()=>dt,reconcileForCompact:()=>ut,reconcileSessionState:()=>ot,resetRetries:()=>$,setActive:()=>G,setActiveActivity:()=>at,setActiveFix:()=>L,setActiveVerification:()=>T,setChainedStatusLine:()=>D,setContextInjectedVerificationId:()=>et,setLastVerdictStatus:()=>j,setPhase:()=>C,setRecordingActive:()=>B,setRecordingRequired:()=>J,setUsage:()=>Y,setUserEmail:()=>M,writeState:()=>u});module.exports=V(gt);var x=require("crypto"),l=require("fs"),p=require("path"),g=require("../../lib/logger"),v=require("../../lib/atomic"),d=require("./actions");const y="state.json",S={retries:0,activeVerificationId:null,activeTraceId:null,lastVerdictStatus:null,activeFixId:null,activeActivityId:null,phase:null,recordingRequired:!1,recordingActive:!1,active:!1,userEmail:null,usageType:null,usagePlan:null,chainedStatusLine:null,contextInjectedVerificationId:null,pendingFixes:[]};function b(){return(0,x.randomBytes)(16).toString("hex")}a(b,"generateTraceId");function s(i){const e=(0,p.join)(i,y);if(!(0,l.existsSync)(e))return{...S};try{const n=(0,l.readFileSync)(e,"utf-8"),t=JSON.parse(n),r=["coding","verifying","fixing"],c=["api","subscription"];return{retries:typeof t.retries=="number"?t.retries:0,activeVerificationId:typeof t.activeVerificationId=="string"?t.activeVerificationId:null,activeTraceId:typeof t.activeTraceId=="string"?t.activeTraceId:null,lastVerdictStatus:typeof t.lastVerdictStatus=="string"?t.lastVerdictStatus:null,activeFixId:typeof t.activeFixId=="string"?t.activeFixId:null,activeActivityId:typeof t.activeActivityId=="string"?t.activeActivityId:null,phase:typeof t.phase=="string"&&r.includes(t.phase)?t.phase:null,recordingRequired:typeof t.recordingRequired=="boolean"?t.recordingRequired:!1,recordingActive:typeof t.recordingActive=="boolean"?t.recordingActive:!1,active:typeof t.active=="boolean"?t.active:!1,userEmail:typeof t.userEmail=="string"?t.userEmail:null,usageType:typeof t.usageType=="string"&&c.includes(t.usageType)?t.usageType:null,usagePlan:typeof t.usagePlan=="string"&&t.usagePlan.length>0?t.usagePlan:null,chainedStatusLine:typeof t.chainedStatusLine=="string"&&t.chainedStatusLine.length>0?t.chainedStatusLine:null,contextInjectedVerificationId:typeof t.contextInjectedVerificationId=="string"?t.contextInjectedVerificationId:null,pendingFixes:Array.isArray(t.pendingFixes)?t.pendingFixes.filter(o=>typeof o=="string"&&o.length>0):[]}}catch(n){return g.logger.debug(`failed to read state from ${e}: ${n}`),{...S}}}a(s,"readState");function u(i,e){const n=(0,p.join)(i,y);try{(0,l.mkdirSync)(i,{recursive:!0});const t=`${n}.tmp.${process.pid}.${Date.now()}`,r=JSON.stringify(e,null,2);try{(0,l.writeFileSync)(t,r),(0,v.renameWithRetry)(t,n)}catch(c){try{(0,l.existsSync)(t)&&(0,l.unlinkSync)(t)}catch{}throw c}(0,v.sweepStaleTmpFiles)(n)}catch(t){g.logger.debug(`failed to write state to ${n}: ${t}`)}}a(u,"writeState");function w(i){return s(i).activeVerificationId??void 0}a(w,"getActiveVerificationId");function T(i,e,n){const t=s(i);t.activeVerificationId=e,t.activeTraceId=n,t.phase="verifying",u(i,t)}a(T,"setActiveVerification");function E(i){return s(i).activeTraceId??void 0}a(E,"getActiveTraceId");function P(i){const e=s(i);e.activeVerificationId=null,e.activeTraceId=null,e.phase="coding",u(i,e)}a(P,"clearActiveVerification");function F(i){return s(i).retries}a(F,"getRetries");function R(i){const e=s(i);return e.retries=e.retries+1,u(i,e),e.retries}a(R,"incrementRetries");function $(i){const e=s(i);e.retries=0,u(i,e)}a($,"resetRetries");function q(i){return s(i).lastVerdictStatus??void 0}a(q,"getLastVerdictStatus");function j(i,e){const n=s(i);n.lastVerdictStatus=e,u(i,n)}a(j,"setLastVerdictStatus");function L(i,e){const n=s(i);n.activeFixId=e,u(i,n)}a(L,"setActiveFix");function U(i){return s(i).activeFixId??void 0}a(U,"getActiveFixId");function k(i){const e=s(i);e.activeFixId=null,u(i,e)}a(k,"clearActiveFix");function C(i,e){const n=s(i);n.phase=e,u(i,n)}a(C,"setPhase");function z(i){return s(i).phase}a(z,"getPhase");function O(i){return s(i).recordingRequired}a(O,"isRecordingRequired");function J(i,e){const n=s(i);n.recordingRequired=e,u(i,n)}a(J,"setRecordingRequired");function N(i){return s(i).recordingActive}a(N,"isRecordingActive");function B(i,e){const n=s(i);n.recordingActive=e,u(i,n)}a(B,"setRecordingActive");function W(i){return s(i).active}a(W,"isActive");function G(i,e){const n=s(i);n.active=e,e||(n.activeActivityId=null),u(i,n)}a(G,"setActive");function H(i){return s(i).activeActivityId??void 0}a(H,"getActiveActivityId");function K(i){return s(i).userEmail??void 0}a(K,"getUserEmail");function M(i,e){const n=typeof e=="string"&&e.length>0?e:null,t=s(i);t.userEmail!==n&&(t.userEmail=n,u(i,t))}a(M,"setUserEmail");function Q(i){return s(i).usageType??void 0}a(Q,"getUsageType");function X(i){return s(i).usagePlan??void 0}a(X,"getUsagePlan");function Y(i,e){const n=e.usage_type==="api"||e.usage_type==="subscription"?e.usage_type:null,t=typeof e.usage_plan=="string"&&e.usage_plan.length>0?e.usage_plan:null,r=s(i);r.usageType===n&&r.usagePlan===t||(r.usageType=n,r.usagePlan=t,u(i,r))}a(Y,"setUsage");function Z(i){return s(i).chainedStatusLine??void 0}a(Z,"getChainedStatusLine");function D(i,e){const n=typeof e=="string"&&e.length>0?e:null,t=s(i);t.chainedStatusLine!==n&&(t.chainedStatusLine=n,u(i,t))}a(D,"setChainedStatusLine");function tt(i){return s(i).contextInjectedVerificationId??void 0}a(tt,"getContextInjectedVerificationId");function et(i,e){const n=typeof e=="string"&&e.length>0?e:null,t=s(i);t.contextInjectedVerificationId!==n&&(t.contextInjectedVerificationId=n,u(i,t))}a(et,"setContextInjectedVerificationId");function it(i){return s(i).pendingFixes}a(it,"getPendingFixes");function nt(i,e){const n=e.filter(o=>typeof o=="string"&&o.length>0);if(n.length===0)return;const t=s(i),r=new Set(t.pendingFixes),c=[...t.pendingFixes];for(const o of n)r.has(o)||(r.add(o),c.push(o));c.length!==t.pendingFixes.length&&(t.pendingFixes=c,u(i,t))}a(nt,"addPendingFixes");function rt(i){const e=s(i);e.pendingFixes.length!==0&&(e.pendingFixes=[],u(i,e))}a(rt,"clearPendingFixes");function at(i,e){const n=s(i);n.activeActivityId=e,n.active=!0,u(i,n)}a(at,"setActiveActivity");function ct(i){const e=s(i);e.activeActivityId=null,e.active=!1,u(i,e)}a(ct,"clearActiveActivity");async function st(i,e,n){const t=s(i);let r=!1;if(t.activeVerificationId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"verification_end",timestamp:c,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",c),reason:n};await(0,d.appendAction)(e,o),g.logger.debug(`close-open-cycles: ended verification ${t.activeVerificationId} (${n})`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"fix_end",timestamp:c,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",c),reason:n};await(0,d.appendAction)(e,o),g.logger.debug(`close-open-cycles: ended fix ${t.activeFixId} (${n})`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),r&&u(i,t)}a(st,"closeOpenCycles");async function ot(i,e,n){const t=s(i);let r=!1;if(t.activeVerificationId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"verification_end",timestamp:c,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",c),reason:"session_reconcile"};await n(e,o),g.logger.debug(`reconcile: ended abandoned verification ${t.activeVerificationId}`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"fix_end",timestamp:c,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",c),reason:"session_reconcile"};await n(e,o),g.logger.debug(`reconcile: ended abandoned fix ${t.activeFixId}`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}if(t.active){const c=Date.now(),o={...(0,d.baseFields)(e),type:"activity_end",timestamp:c,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"activity_start",c),reason:"session_reconcile"};await n(e,o),g.logger.debug(`reconcile: ended abandoned activity ${t.activeActivityId??""}`),t.active=!1,t.activeActivityId=null,r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),r&&u(i,t)}a(ot,"reconcileSessionState");async function dt(i,e,n){const t=s(i);if(!t.active&&!t.activeVerificationId&&!t.activeFixId)return;let r=!1;if(t.activeVerificationId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"verification_end",timestamp:c,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",c),reason:"interrupt_inferred"};await n(e,o),g.logger.debug(`interrupt-reconcile: ended verification ${t.activeVerificationId}`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"fix_end",timestamp:c,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",c),reason:"interrupt_inferred"};await n(e,o),g.logger.debug(`interrupt-reconcile: ended fix ${t.activeFixId}`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}if(t.active){const c=Date.now(),o={...(0,d.baseFields)(e),type:"activity_end",timestamp:c,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"activity_start",c),reason:"interrupt_inferred"};await n(e,o),g.logger.debug(`interrupt-reconcile: ended activity ${t.activeActivityId??""}`),t.active=!1,t.activeActivityId=null,r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),r&&u(i,t)}a(dt,"reconcileAbandonedActivity");async function ut(i,e,n){const t=s(i);let r=!1;if(t.activeVerificationId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"verification_end",timestamp:c,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",c),reason:"compact"};await n(e,o),g.logger.debug(`compact-reconcile: ended verification ${t.activeVerificationId}`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const c=Date.now(),o={...(0,d.baseFields)(e),type:"fix_end",timestamp:c,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",c),reason:"compact"};await n(e,o),g.logger.debug(`compact-reconcile: ended fix ${t.activeFixId}`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}if(t.active){const c=Date.now(),o={...(0,d.baseFields)(e),type:"activity_end",timestamp:c,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"activity_start",c),reason:"compact"};await n(e,o),g.logger.debug(`compact-reconcile: ended activity ${t.activeActivityId??""}`),t.active=!1,t.activeActivityId=null,r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),r&&u(i,t)}a(ut,"reconcileForCompact");0&&(module.exports={addPendingFixes,clearActiveActivity,clearActiveFix,clearActiveVerification,clearPendingFixes,closeOpenCycles,generateTraceId,getActiveActivityId,getActiveFixId,getActiveTraceId,getActiveVerificationId,getChainedStatusLine,getContextInjectedVerificationId,getLastVerdictStatus,getPendingFixes,getPhase,getRetries,getUsagePlan,getUsageType,getUserEmail,incrementRetries,isActive,isRecordingActive,isRecordingRequired,readState,reconcileAbandonedActivity,reconcileForCompact,reconcileSessionState,resetRetries,setActive,setActiveActivity,setActiveFix,setActiveVerification,setChainedStatusLine,setContextInjectedVerificationId,setLastVerdictStatus,setPhase,setRecordingActive,setRecordingRequired,setUsage,setUserEmail,writeState});
1
+ "use strict";var g=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var a=(i,e)=>g(i,"name",{value:e,configurable:!0});var h=(i,e)=>{for(var n in e)g(i,n,{get:e[n],enumerable:!0})},_=(i,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of A(e))!m.call(i,r)&&r!==n&&g(i,r,{get:()=>e[r],enumerable:!(t=x(e,r))||t.enumerable});return i};var V=i=>_(g({},"__esModule",{value:!0}),i);var pt={};h(pt,{addPendingFixes:()=>nt,clearActiveActivity:()=>ut,clearActiveFix:()=>k,clearActiveVerification:()=>P,clearPendingFixes:()=>rt,clearVerifyIntent:()=>st,closeOpenCycles:()=>ft,generateTraceId:()=>b,getActiveActivityId:()=>H,getActiveFixId:()=>U,getActiveTraceId:()=>E,getActiveVerificationId:()=>T,getChainedStatusLine:()=>Z,getContextInjectedVerificationId:()=>tt,getLastVerdictStatus:()=>L,getPendingFixes:()=>it,getPhase:()=>z,getRetries:()=>F,getUsagePlan:()=>X,getUsageType:()=>Q,getUserEmail:()=>K,getVerifyIntent:()=>at,incrementRetries:()=>R,isActive:()=>W,isFailLikeVerdictStatus:()=>ot,isRecordingActive:()=>N,isRecordingRequired:()=>O,readState:()=>c,reconcileAbandonedActivity:()=>gt,reconcileForCompact:()=>vt,reconcileSessionState:()=>lt,resetRetries:()=>$,setActive:()=>G,setActiveActivity:()=>dt,setActiveFix:()=>j,setActiveVerification:()=>w,setChainedStatusLine:()=>D,setContextInjectedVerificationId:()=>et,setLastVerdictStatus:()=>q,setPhase:()=>C,setRecordingActive:()=>B,setRecordingRequired:()=>J,setUsage:()=>Y,setUserEmail:()=>M,setVerifyIntent:()=>ct,writeState:()=>u});module.exports=V(pt);var S=require("crypto"),l=require("fs"),p=require("path"),f=require("../../lib/logger"),v=require("../../lib/atomic"),d=require("./actions");const y="state.json",I={retries:0,activeVerificationId:null,activeTraceId:null,lastVerdictStatus:null,activeFixId:null,activeActivityId:null,phase:null,recordingRequired:!1,recordingActive:!1,active:!1,userEmail:null,usageType:null,usagePlan:null,chainedStatusLine:null,contextInjectedVerificationId:null,pendingFixes:[],verifyIntent:null};function b(){return(0,S.randomBytes)(16).toString("hex")}a(b,"generateTraceId");function c(i){const e=(0,p.join)(i,y);if(!(0,l.existsSync)(e))return{...I};try{const n=(0,l.readFileSync)(e,"utf-8"),t=JSON.parse(n),r=["coding","verifying","fixing"],s=["api","subscription"];return{retries:typeof t.retries=="number"?t.retries:0,activeVerificationId:typeof t.activeVerificationId=="string"?t.activeVerificationId:null,activeTraceId:typeof t.activeTraceId=="string"?t.activeTraceId:null,lastVerdictStatus:typeof t.lastVerdictStatus=="string"?t.lastVerdictStatus:null,activeFixId:typeof t.activeFixId=="string"?t.activeFixId:null,activeActivityId:typeof t.activeActivityId=="string"?t.activeActivityId:null,phase:typeof t.phase=="string"&&r.includes(t.phase)?t.phase:null,recordingRequired:typeof t.recordingRequired=="boolean"?t.recordingRequired:!1,recordingActive:typeof t.recordingActive=="boolean"?t.recordingActive:!1,active:typeof t.active=="boolean"?t.active:!1,userEmail:typeof t.userEmail=="string"?t.userEmail:null,usageType:typeof t.usageType=="string"&&s.includes(t.usageType)?t.usageType:null,usagePlan:typeof t.usagePlan=="string"&&t.usagePlan.length>0?t.usagePlan:null,chainedStatusLine:typeof t.chainedStatusLine=="string"&&t.chainedStatusLine.length>0?t.chainedStatusLine:null,contextInjectedVerificationId:typeof t.contextInjectedVerificationId=="string"?t.contextInjectedVerificationId:null,pendingFixes:Array.isArray(t.pendingFixes)?t.pendingFixes.filter(o=>typeof o=="string"&&o.length>0):[],verifyIntent:typeof t.verifyIntent=="string"&&t.verifyIntent.length>0?t.verifyIntent:null}}catch(n){return f.logger.debug(`failed to read state from ${e}: ${n}`),{...I}}}a(c,"readState");function u(i,e){const n=(0,p.join)(i,y);try{(0,l.mkdirSync)(i,{recursive:!0});const t=`${n}.tmp.${process.pid}.${Date.now()}`,r=JSON.stringify(e,null,2);try{(0,l.writeFileSync)(t,r),(0,v.renameWithRetry)(t,n)}catch(s){try{(0,l.existsSync)(t)&&(0,l.unlinkSync)(t)}catch{}throw s}(0,v.sweepStaleTmpFiles)(n)}catch(t){f.logger.debug(`failed to write state to ${n}: ${t}`)}}a(u,"writeState");function T(i){return c(i).activeVerificationId??void 0}a(T,"getActiveVerificationId");function w(i,e,n){const t=c(i);t.activeVerificationId=e,t.activeTraceId=n,t.phase="verifying",u(i,t)}a(w,"setActiveVerification");function E(i){return c(i).activeTraceId??void 0}a(E,"getActiveTraceId");function P(i){const e=c(i);e.activeVerificationId=null,e.activeTraceId=null,e.phase="coding",u(i,e)}a(P,"clearActiveVerification");function F(i){return c(i).retries}a(F,"getRetries");function R(i){const e=c(i);return e.retries=e.retries+1,u(i,e),e.retries}a(R,"incrementRetries");function $(i){const e=c(i);e.retries=0,u(i,e)}a($,"resetRetries");function L(i){return c(i).lastVerdictStatus??void 0}a(L,"getLastVerdictStatus");function q(i,e){const n=c(i);n.lastVerdictStatus=e,u(i,n)}a(q,"setLastVerdictStatus");function j(i,e){const n=c(i);n.activeFixId=e,u(i,n)}a(j,"setActiveFix");function U(i){return c(i).activeFixId??void 0}a(U,"getActiveFixId");function k(i){const e=c(i);e.activeFixId=null,u(i,e)}a(k,"clearActiveFix");function C(i,e){const n=c(i);n.phase=e,u(i,n)}a(C,"setPhase");function z(i){return c(i).phase}a(z,"getPhase");function O(i){return c(i).recordingRequired}a(O,"isRecordingRequired");function J(i,e){const n=c(i);n.recordingRequired=e,u(i,n)}a(J,"setRecordingRequired");function N(i){return c(i).recordingActive}a(N,"isRecordingActive");function B(i,e){const n=c(i);n.recordingActive=e,u(i,n)}a(B,"setRecordingActive");function W(i){return c(i).active}a(W,"isActive");function G(i,e){const n=c(i);n.active=e,e||(n.activeActivityId=null),u(i,n)}a(G,"setActive");function H(i){return c(i).activeActivityId??void 0}a(H,"getActiveActivityId");function K(i){return c(i).userEmail??void 0}a(K,"getUserEmail");function M(i,e){const n=typeof e=="string"&&e.length>0?e:null,t=c(i);t.userEmail!==n&&(t.userEmail=n,u(i,t))}a(M,"setUserEmail");function Q(i){return c(i).usageType??void 0}a(Q,"getUsageType");function X(i){return c(i).usagePlan??void 0}a(X,"getUsagePlan");function Y(i,e){const n=e.usage_type==="api"||e.usage_type==="subscription"?e.usage_type:null,t=typeof e.usage_plan=="string"&&e.usage_plan.length>0?e.usage_plan:null,r=c(i);r.usageType===n&&r.usagePlan===t||(r.usageType=n,r.usagePlan=t,u(i,r))}a(Y,"setUsage");function Z(i){return c(i).chainedStatusLine??void 0}a(Z,"getChainedStatusLine");function D(i,e){const n=typeof e=="string"&&e.length>0?e:null,t=c(i);t.chainedStatusLine!==n&&(t.chainedStatusLine=n,u(i,t))}a(D,"setChainedStatusLine");function tt(i){return c(i).contextInjectedVerificationId??void 0}a(tt,"getContextInjectedVerificationId");function et(i,e){const n=typeof e=="string"&&e.length>0?e:null,t=c(i);t.contextInjectedVerificationId!==n&&(t.contextInjectedVerificationId=n,u(i,t))}a(et,"setContextInjectedVerificationId");function it(i){return c(i).pendingFixes}a(it,"getPendingFixes");function nt(i,e){const n=e.filter(o=>typeof o=="string"&&o.length>0);if(n.length===0)return;const t=c(i),r=new Set(t.pendingFixes),s=[...t.pendingFixes];for(const o of n)r.has(o)||(r.add(o),s.push(o));s.length!==t.pendingFixes.length&&(t.pendingFixes=s,u(i,t))}a(nt,"addPendingFixes");function rt(i){const e=c(i);e.pendingFixes.length!==0&&(e.pendingFixes=[],u(i,e))}a(rt,"clearPendingFixes");function at(i){return c(i).verifyIntent}a(at,"getVerifyIntent");function ct(i,e){const n=c(i);n.verifyIntent!==e&&(n.verifyIntent=e,u(i,n))}a(ct,"setVerifyIntent");function st(i){const e=c(i);e.verifyIntent!==null&&(e.verifyIntent=null,u(i,e))}a(st,"clearVerifyIntent");function ot(i){return i==="fail"||i==="fail_reported"}a(ot,"isFailLikeVerdictStatus");function dt(i,e){const n=c(i);n.activeActivityId=e,n.active=!0,u(i,n)}a(dt,"setActiveActivity");function ut(i){const e=c(i);e.activeActivityId=null,e.active=!1,u(i,e)}a(ut,"clearActiveActivity");async function ft(i,e,n){const t=c(i);let r=!1;if(t.activeVerificationId){const s=Date.now(),o={...(0,d.baseFields)(e),type:"verification_end",timestamp:s,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",s),reason:n};await(0,d.appendAction)(e,o),f.logger.debug(`close-open-cycles: ended verification ${t.activeVerificationId} (${n})`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const s=Date.now(),o={...(0,d.baseFields)(e),type:"fix_end",timestamp:s,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",s),reason:n};await(0,d.appendAction)(e,o),f.logger.debug(`close-open-cycles: ended fix ${t.activeFixId} (${n})`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),t.verifyIntent!==null&&(t.verifyIntent=null,r=!0),r&&u(i,t)}a(ft,"closeOpenCycles");async function lt(i,e,n){const t=c(i);let r=!1;if(t.activeVerificationId){const s=Date.now(),o={...(0,d.baseFields)(e),type:"verification_end",timestamp:s,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",s),reason:"session_reconcile"};await n(e,o),f.logger.debug(`reconcile: ended abandoned verification ${t.activeVerificationId}`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const s=Date.now(),o={...(0,d.baseFields)(e),type:"fix_end",timestamp:s,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",s),reason:"session_reconcile"};await n(e,o),f.logger.debug(`reconcile: ended abandoned fix ${t.activeFixId}`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}if(t.active){const s=Date.now(),o={...(0,d.baseFields)(e),type:"activity_end",timestamp:s,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"activity_start",s),reason:"session_reconcile"};await n(e,o),f.logger.debug(`reconcile: ended abandoned activity ${t.activeActivityId??""}`),t.active=!1,t.activeActivityId=null,r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),t.verifyIntent!==null&&(t.verifyIntent=null,r=!0),r&&u(i,t)}a(lt,"reconcileSessionState");async function gt(i,e,n){const t=c(i);if(!t.active&&!t.activeVerificationId&&!t.activeFixId&&t.verifyIntent===null)return;let r=!1;const s=(0,d.findLastActionTimestamp)(e)??Date.now();if(t.activeVerificationId){const o={...(0,d.baseFields)(e),type:"verification_end",timestamp:s,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",s),reason:"interrupt_inferred"};await n(e,o),f.logger.debug(`interrupt-reconcile: ended verification ${t.activeVerificationId}`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const o={...(0,d.baseFields)(e),type:"fix_end",timestamp:s,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",s),reason:"interrupt_inferred"};await n(e,o),f.logger.debug(`interrupt-reconcile: ended fix ${t.activeFixId}`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}if(t.active){const o={...(0,d.baseFields)(e),type:"activity_end",timestamp:s,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"activity_start",s),reason:"interrupt_inferred"};await n(e,o),f.logger.debug(`interrupt-reconcile: ended activity ${t.activeActivityId??""}`),t.active=!1,t.activeActivityId=null,r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),t.verifyIntent!==null&&(t.verifyIntent=null,r=!0),r&&u(i,t)}a(gt,"reconcileAbandonedActivity");async function vt(i,e,n){const t=c(i);let r=!1;if(t.activeVerificationId){const s=Date.now(),o={...(0,d.baseFields)(e),type:"verification_end",timestamp:s,verification_id:t.activeVerificationId,activity_id:t.activeActivityId,trace_id:t.activeTraceId,duration:(0,d.findDurationSinceLastAction)(e,"verification_start",s),reason:"compact"};await n(e,o),f.logger.debug(`compact-reconcile: ended verification ${t.activeVerificationId}`),t.activeVerificationId=null,t.activeTraceId=null,t.contextInjectedVerificationId=null,r=!0}if(t.activeFixId){const s=Date.now(),o={...(0,d.baseFields)(e),type:"fix_end",timestamp:s,fix_id:t.activeFixId,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"fix_start",s),reason:"compact"};await n(e,o),f.logger.debug(`compact-reconcile: ended fix ${t.activeFixId}`),t.activeFixId=null,t.pendingFixes.length>0&&(t.pendingFixes=[]),r=!0}if(t.active){const s=Date.now(),o={...(0,d.baseFields)(e),type:"activity_end",timestamp:s,activity_id:t.activeActivityId,duration:(0,d.findDurationSinceLastAction)(e,"activity_start",s),reason:"compact"};await n(e,o),f.logger.debug(`compact-reconcile: ended activity ${t.activeActivityId??""}`),t.active=!1,t.activeActivityId=null,r=!0}(t.recordingRequired||t.recordingActive)&&(t.recordingRequired=!1,t.recordingActive=!1,r=!0),t.phase!=="coding"&&(t.phase="coding",r=!0),t.verifyIntent!==null&&(t.verifyIntent=null,r=!0),r&&u(i,t)}a(vt,"reconcileForCompact");0&&(module.exports={addPendingFixes,clearActiveActivity,clearActiveFix,clearActiveVerification,clearPendingFixes,clearVerifyIntent,closeOpenCycles,generateTraceId,getActiveActivityId,getActiveFixId,getActiveTraceId,getActiveVerificationId,getChainedStatusLine,getContextInjectedVerificationId,getLastVerdictStatus,getPendingFixes,getPhase,getRetries,getUsagePlan,getUsageType,getUserEmail,getVerifyIntent,incrementRetries,isActive,isFailLikeVerdictStatus,isRecordingActive,isRecordingRequired,readState,reconcileAbandonedActivity,reconcileForCompact,reconcileSessionState,resetRetries,setActive,setActiveActivity,setActiveFix,setActiveVerification,setChainedStatusLine,setContextInjectedVerificationId,setLastVerdictStatus,setPhase,setRecordingActive,setRecordingRequired,setUsage,setUserEmail,setVerifyIntent,writeState});
@@ -1,8 +1,8 @@
1
- "use strict";var f=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var y=(c,s)=>f(c,"name",{value:s,configurable:!0});var S=(c,s)=>{for(var e in s)f(c,e,{get:s[e],enumerable:!0})},D=(c,s,e,o)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of F(s))!_.call(c,r)&&r!==e&&f(c,r,{get:()=>s[r],enumerable:!(o=A(s,r))||o.enumerable});return c};var C=c=>D(f({},"__esModule",{value:!0}),c);var k={};S(k,{runSubmitVerdict:()=>R});module.exports=C(k);var g=require("fs"),E=require("path"),d=require("../../lib/logger"),b=require("../../lib/telemetry"),n=require("./actions"),t=require("./session-state");function I(c,s){const e=(0,t.getPendingFixes)(c);if(e.length>0)return e;const o=(0,n.summarizeFixFileChanges)((0,n.getFileChangesSinceLastFailVerdict)(s));return o.length>0?o:["re-verified after a prior failure (no tracked code changes in this fix cycle)"]}y(I,"deriveFixes");async function R(c){const{sessionId:s,sessionDir:e,verdictFile:o,actionsFile:r,verdictJson:x,projectDir:V}=c;let i;try{i=JSON.parse(x)}catch(a){return d.logger.debug(`submit-verdict: invalid JSON: ${a}`),{success:!1,message:"REJECTED: verdict is not valid JSON."}}if(i.status!=="pass"&&i.status!=="fail")return{success:!1,message:`REJECTED: status must be "pass" or "fail", got "${i.status}".`};if(!Array.isArray(i.checks)||i.checks.length===0)return{success:!1,message:"REJECTED: checks must be a non-empty array describing what you functionally tested."};if(i.status==="fail"&&(!Array.isArray(i.issues)||i.issues.length===0))return{success:!1,message:'REJECTED: when status is "fail", issues must be a non-empty array describing what failed.'};if(i.status==="pass"&&(0,t.getLastVerdictStatus)(e)==="fail"&&(!Array.isArray(i.fixes)||i.fixes.length===0)&&(i.fixes=I(e,r)),(0,t.isRecordingRequired)(e)&&(0,t.isRecordingActive)(e))return{success:!1,message:`REJECTED: recording is still active.
1
+ "use strict";var g=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var y=(c,s)=>g(c,"name",{value:s,configurable:!0});var D=(c,s)=>{for(var e in s)g(c,e,{get:s[e],enumerable:!0})},C=(c,s,e,o)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of R(s))!S.call(c,r)&&r!==e&&g(c,r,{get:()=>s[r],enumerable:!(o=F(s,r))||o.enumerable});return c};var I=c=>C(g({},"__esModule",{value:!0}),c);var k={};D(k,{runSubmitVerdict:()=>$});module.exports=I(k);var l=require("fs"),E=require("path"),u=require("../../lib/logger"),x=require("../../lib/recording-tools"),b=require("../../lib/telemetry"),n=require("./actions"),i=require("./session-state");function T(c,s){const e=(0,i.getPendingFixes)(c);if(e.length>0)return e;const o=(0,n.summarizeFixFileChanges)((0,n.getFileChangesSinceLastFailVerdict)(s));return o.length>0?o:["re-verified after a prior failure (no tracked code changes in this fix cycle)"]}y(T,"deriveFixes");async function $(c){const{sessionId:s,sessionDir:e,verdictFile:o,actionsFile:r,verdictJson:V,projectDir:h}=c;let t;try{t=JSON.parse(V)}catch(a){return u.logger.debug(`submit-verdict: invalid JSON: ${a}`),{success:!1,message:"REJECTED: verdict is not valid JSON."}}if(t.status!=="pass"&&t.status!=="fail")return{success:!1,message:`REJECTED: status must be "pass" or "fail", got "${t.status}".`};if(!Array.isArray(t.checks)||t.checks.length===0)return{success:!1,message:"REJECTED: checks must be a non-empty array describing what you functionally tested."};if(t.status==="fail"&&(!Array.isArray(t.issues)||t.issues.length===0))return{success:!1,message:'REJECTED: when status is "fail", issues must be a non-empty array describing what failed.'};if(t.status==="pass"&&(0,i.isFailLikeVerdictStatus)((0,i.getLastVerdictStatus)(e))&&(!Array.isArray(t.fixes)||t.fixes.length===0)&&(t.fixes=T(e,r)),(0,i.isRecordingRequired)(e)&&(0,i.isRecordingActive)(e))return{success:!1,message:`REJECTED: recording is still active.
2
2
 
3
3
  1. Stop recording first:
4
- mcp__browser-devtools__bdt_content_stop-recording (Claude)
5
- MCP:bdt_content_stop-recording (Cursor)
4
+ ${(0,x.listRecordingCycleTools)().map(d=>` ${d.stopTool} (${d.cycle} cycle)`).join(`
5
+ `)}
6
6
  2. Then re-run the same submit-verdict command.
7
7
 
8
- Recording start/stop must bracket the verification flow \u2014 start before browser tools, stop before submit-verdict.`};try{(0,g.mkdirSync)((0,E.dirname)(o),{recursive:!0}),(0,g.writeFileSync)(o,JSON.stringify(i,null,2))}catch(a){return d.logger.debug(`submit-verdict: failed to write ${o}: ${a}`),{success:!1,message:`REJECTED: failed to write verdict file: ${a}`}}(0,t.setLastVerdictStatus)(e,i.status),(0,t.clearPendingFixes)(e),(0,t.isRecordingRequired)(e)&&(0,t.setRecordingRequired)(e,!1);const l=(0,t.getActiveActivityId)(e),m=(0,t.getActiveFixId)(e);if(m){const a=Date.now(),p={...(0,n.baseFields)(r),type:"fix_end",timestamp:a,fix_id:m,activity_id:l,duration:(0,n.findDurationSinceLastAction)(r,"fix_start",a)};await(0,n.appendAction)(r,p),(0,t.clearActiveFix)(e),(0,t.setPhase)(e,"coding"),d.logger.debug(`fix-end (verdict): ${m}`)}const u=(0,t.getActiveVerificationId)(e),v=(0,t.getActiveTraceId)(e);if(u){const a=Date.now(),p={...(0,n.baseFields)(r),type:"verification_end",timestamp:a,verification_id:u,activity_id:l,trace_id:v,duration:(0,n.findDurationSinceLastAction)(r,"verification_start",a),status:i.status};await(0,n.appendAction)(r,p),(0,t.clearActiveVerification)(e),d.logger.debug(`verification-end (auto): ${u} trace=${v}`)}const h=i,w={...(0,n.baseFields)(r),type:"verdict_write",timestamp:Date.now(),verification_id:u,activity_id:l,trace_id:v,verdict:h};return await(0,n.appendAction)(r,w),await(0,b.trackVerdictWrite)(s,i.status,V),d.logger.debug(`submit-verdict: session=${s} status=${i.status}`),i.status==="pass"?{success:!0,message:`VERDICT ACCEPTED: pass.${i.fixes?.length?` Fixes: ${i.fixes.join(", ")}`:""}`}:{success:!0,message:`VERDICT ACCEPTED: fail. Issues: ${(i.issues??[]).join(", ")}. Fix and re-verify.`}}y(R,"runSubmitVerdict");0&&(module.exports={runSubmitVerdict});
8
+ Recording start/stop must bracket the verification flow \u2014 start before devtools tools, stop before submit-verdict.`};try{(0,l.mkdirSync)((0,E.dirname)(o),{recursive:!0}),(0,l.writeFileSync)(o,JSON.stringify(t,null,2))}catch(a){return u.logger.debug(`submit-verdict: failed to write ${o}: ${a}`),{success:!1,message:`REJECTED: failed to write verdict file: ${a}`}}(0,i.setLastVerdictStatus)(e,t.status),(0,i.clearPendingFixes)(e),(0,i.isRecordingRequired)(e)&&(0,i.setRecordingRequired)(e,!1);const m=(0,i.getActiveActivityId)(e),v=(0,i.getActiveFixId)(e);if(v){const a=Date.now(),d={...(0,n.baseFields)(r),type:"fix_end",timestamp:a,fix_id:v,activity_id:m,duration:(0,n.findDurationSinceLastAction)(r,"fix_start",a)};await(0,n.appendAction)(r,d),(0,i.clearActiveFix)(e),(0,i.setPhase)(e,"coding"),u.logger.debug(`fix-end (verdict): ${v}`)}const f=(0,i.getActiveVerificationId)(e),p=(0,i.getActiveTraceId)(e);if(f){const a=Date.now(),d={...(0,n.baseFields)(r),type:"verification_end",timestamp:a,verification_id:f,activity_id:m,trace_id:p,duration:(0,n.findDurationSinceLastAction)(r,"verification_start",a),status:t.status};await(0,n.appendAction)(r,d),(0,i.clearActiveVerification)(e),u.logger.debug(`verification-end (auto): ${f} trace=${p}`)}const A=t,w={...(0,n.baseFields)(r),type:"verdict_write",timestamp:Date.now(),verification_id:f,activity_id:m,trace_id:p,verdict:A};return await(0,n.appendAction)(r,w),await(0,b.trackVerdictWrite)(s,t.status,h),u.logger.debug(`submit-verdict: session=${s} status=${t.status}`),t.status==="pass"?{success:!0,message:`VERDICT ACCEPTED: pass.${t.fixes?.length?` Fixes: ${t.fixes.join(", ")}`:""}`}:{success:!0,message:`VERDICT ACCEPTED: fail. Issues: ${(t.issues??[]).join(", ")}. Fix and re-verify.`}}y($,"runSubmitVerdict");0&&(module.exports={runSubmitVerdict});
@@ -1 +1 @@
1
- "use strict";var v=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var x=(n,i)=>v(n,"name",{value:i,configurable:!0});var _=(n,i)=>{for(var e in i)v(n,e,{get:i[e],enumerable:!0})},V=(n,i,e,a)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of y(i))!A.call(n,s)&&s!==e&&v(n,s,{get:()=>i[s],enumerable:!(a=l(i,s))||a.enumerable});return n};var E=n=>V(v({},"__esModule",{value:!0}),n);var D={};_(D,{endVerification:()=>w,openFixCycleIfFixing:()=>b,startVerification:()=>F});module.exports=E(D);var m=require("crypto"),f=require("../../lib/logger"),r=require("./actions"),t=require("./session-state");async function F(n){const{sessionDir:i,actionsFile:e}=n,a=(0,t.getActiveActivityId)(i),s=(0,t.getActiveFixId)(i);if(s){const g=Date.now(),u={...(0,r.baseFields)(e),type:"fix_end",timestamp:g,fix_id:s,activity_id:a,duration:(0,r.findDurationSinceLastAction)(e,"fix_start",g)};await(0,r.appendAction)(e,u),(0,t.clearActiveFix)(i),f.logger.debug(`fix-end: ${s} (starting new verification)`)}const c=(0,t.getActiveVerificationId)(i);if(c){const g=(0,t.getActiveTraceId)(i);f.logger.debug(`ending previous verification ${c} before starting new one`);const u=Date.now(),p={...(0,r.baseFields)(e),type:"verification_end",timestamp:u,verification_id:c,activity_id:a,trace_id:g,duration:(0,r.findDurationSinceLastAction)(e,"verification_start",u)};await(0,r.appendAction)(e,p),(0,t.clearActiveVerification)(i)}const o=(0,m.randomUUID)(),d=(0,t.generateTraceId)(),I={...(0,r.baseFields)(e),type:"verification_start",timestamp:Date.now(),verification_id:o,activity_id:a,trace_id:d};return await(0,r.appendAction)(e,I),(0,t.setActiveVerification)(i,o,d),n.recordingEnabled&&((0,t.setRecordingRequired)(i,!0),(0,t.setRecordingActive)(i,!1)),f.logger.debug(`verification-start: ${o} trace=${d} recording=${!!n.recordingEnabled}`),{verificationId:o,traceId:d}}x(F,"startVerification");async function b(n){const{sessionDir:i,actionsFile:e}=n;if((0,t.getLastVerdictStatus)(i)!=="fail")return;const a=(0,t.getActiveFixId)(i);if(a)return a;const s=(0,t.getActiveActivityId)(i),c=(0,m.randomUUID)(),o={...(0,r.baseFields)(e),type:"fix_start",timestamp:Date.now(),fix_id:c,activity_id:s};return await(0,r.appendAction)(e,o),(0,t.setActiveFix)(i,c),(0,t.setPhase)(i,"fixing"),f.logger.debug(`fix-start (edit after fail): ${c}`),c}x(b,"openFixCycleIfFixing");async function w(n){const{sessionDir:i,actionsFile:e}=n,a=(0,t.getActiveVerificationId)(i);if(!a)return{success:!1,message:"No active verification to end."};const s=(0,t.getActiveTraceId)(i),c=(0,t.getActiveActivityId)(i),o=Date.now(),d={...(0,r.baseFields)(e),type:"verification_end",timestamp:o,verification_id:a,activity_id:c,trace_id:s,duration:(0,r.findDurationSinceLastAction)(e,"verification_start",o)};return await(0,r.appendAction)(e,d),(0,t.clearActiveVerification)(i),f.logger.debug(`verification-end: ${a} trace=${s}`),{success:!0,verificationId:a,traceId:s,message:`Verification ${a} ended.`}}x(w,"endVerification");0&&(module.exports={endVerification,openFixCycleIfFixing,startVerification});
1
+ "use strict";var v=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var x=(n,t)=>v(n,"name",{value:t,configurable:!0});var A=(n,t)=>{for(var e in t)v(n,e,{get:t[e],enumerable:!0})},_=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of y(t))!V.call(n,a)&&a!==e&&v(n,a,{get:()=>t[a],enumerable:!(s=p(t,a))||s.enumerable});return n};var F=n=>_(v({},"__esModule",{value:!0}),n);var D={};A(D,{endVerification:()=>w,openFixCycleIfFixing:()=>b,startVerification:()=>E});module.exports=F(D);var I=require("crypto"),f=require("../../lib/logger"),r=require("./actions"),i=require("./session-state");async function E(n){const{sessionDir:t,actionsFile:e}=n,s=(0,i.getActiveActivityId)(t),a=(0,i.getActiveFixId)(t);if(a){const g=Date.now(),u={...(0,r.baseFields)(e),type:"fix_end",timestamp:g,fix_id:a,activity_id:s,duration:(0,r.findDurationSinceLastAction)(e,"fix_start",g)};await(0,r.appendAction)(e,u),(0,i.clearActiveFix)(t),f.logger.debug(`fix-end: ${a} (starting new verification)`)}const c=(0,i.getActiveVerificationId)(t);if(c){const g=(0,i.getActiveTraceId)(t);f.logger.debug(`ending previous verification ${c} before starting new one`);const u=Date.now(),l={...(0,r.baseFields)(e),type:"verification_end",timestamp:u,verification_id:c,activity_id:s,trace_id:g,duration:(0,r.findDurationSinceLastAction)(e,"verification_start",u)};await(0,r.appendAction)(e,l),(0,i.clearActiveVerification)(t)}const o=(0,I.randomUUID)(),d=(0,i.generateTraceId)(),m={...(0,r.baseFields)(e),type:"verification_start",timestamp:Date.now(),verification_id:o,activity_id:s,trace_id:d};return await(0,r.appendAction)(e,m),(0,i.setActiveVerification)(t,o,d),n.recordingEnabled&&((0,i.setRecordingRequired)(t,!0),(0,i.setRecordingActive)(t,!1)),n.intent==="fix"?(0,i.setVerifyIntent)(t,"fix"):(0,i.clearVerifyIntent)(t),f.logger.debug(`verification-start: ${o} trace=${d} recording=${!!n.recordingEnabled} intent=${n.intent??"-"}`),{verificationId:o,traceId:d}}x(E,"startVerification");async function b(n){const{sessionDir:t,actionsFile:e}=n;if(!(0,i.isFailLikeVerdictStatus)((0,i.getLastVerdictStatus)(t)))return;const s=(0,i.getActiveFixId)(t);if(s)return s;const a=(0,i.getActiveActivityId)(t),c=(0,I.randomUUID)(),o={...(0,r.baseFields)(e),type:"fix_start",timestamp:Date.now(),fix_id:c,activity_id:a};return await(0,r.appendAction)(e,o),(0,i.setActiveFix)(t,c),(0,i.setPhase)(t,"fixing"),f.logger.debug(`fix-start (edit after fail): ${c}`),c}x(b,"openFixCycleIfFixing");async function w(n){const{sessionDir:t,actionsFile:e}=n,s=(0,i.getActiveVerificationId)(t);if(!s)return{success:!1,message:"No active verification to end."};const a=(0,i.getActiveTraceId)(t),c=(0,i.getActiveActivityId)(t),o=Date.now(),d={...(0,r.baseFields)(e),type:"verification_end",timestamp:o,verification_id:s,activity_id:c,trace_id:a,duration:(0,r.findDurationSinceLastAction)(e,"verification_start",o)};return await(0,r.appendAction)(e,d),(0,i.clearActiveVerification)(t),f.logger.debug(`verification-end: ${s} trace=${a}`),{success:!0,verificationId:s,traceId:a,message:`Verification ${s} ended.`}}x(w,"endVerification");0&&(module.exports={endVerification,openFixCycleIfFixing,startVerification});
@@ -1,21 +1,23 @@
1
- "use strict";var w=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var c=(e,t)=>w(e,"name",{value:t,configurable:!0});var B=(e,t)=>{for(var i in t)w(e,i,{get:t[i],enumerable:!0})},M=(e,t,i,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of P(t))!L.call(e,s)&&s!==i&&w(e,s,{get:()=>t[s],enumerable:!(o=q(t,s))||o.enumerable});return e};var G=e=>M(w({},"__esModule",{value:!0}),e);var ee={};B(ee,{runVerifyGate:()=>Z});module.exports=G(ee);var b=require("fs"),h=require("../../lib/logger"),N=require("../../lib/telemetry"),f=require("./actions"),a=require("./session-state"),g=require("../../lib/config"),j=require("./required-tools");const U=3;function J(e){const t=g.CYCLE_TO_SERVER[e];if(t===void 0)throw new Error(`No MCP server registered for cycle '${e}'.`);return t}c(J,"mcpServerForCycle");function p(e){return JSON.stringify({session_id:e,status:"pass",checks:["form submits successfully","new item appears in list","no console errors"]})}c(p,"verdictExamplePass");function F(e){return JSON.stringify({session_id:e,status:"fail",checks:["form renders","submit button unresponsive"],issues:["button click handler not firing","TypeError in console"]})}c(F,"verdictExampleFail");function k(...e){for(const t of e)try{(0,b.existsSync)(t)&&(0,b.unlinkSync)(t)}catch(i){h.logger.debug(`failed to cleanup ${t}: ${i}`)}}c(k,"cleanup");function Y(e,t){const i=(0,f.getFileChangesSinceLastVerification)(e),o=new Set;for(const l of i)for(const d of(0,g.getActiveCycles)(l.file_path,t))o.add(d);const s=[];o.has("browser")&&s.push("browser");for(const l of g.OPTIONAL_CYCLES)o.has(l)&&s.push(l);return s}c(Y,"computeActiveCycles");function H(e,t,i){const o=J(e),s=new Set(t.filter(d=>d.tool_type==="mcp"&&d.mcp_server===o).map(d=>d.tool_name)),l=(0,g.getRequiredToolsConfig)(i,e);return{cycle:e,result:(0,j.satisfyRequiredTools)(s,l),config:l,usedCount:s.size}}c(H,"checkCycleTools");function Q(e){return{cycle:"browser",valid:!0,passCriteriaMet:!0}}c(Q,"checkBrowserEvidence");function z(e){return{cycle:"node",valid:!0,passCriteriaMet:!0}}c(z,"checkNodeEvidence");function W(e){return{cycle:"backend",valid:!0,passCriteriaMet:!0}}c(W,"checkBackendEvidence");function X(e,t){if(!Array.isArray(t.checks)||t.checks.length===0)return{cycle:e,valid:!1,reason:"missing checks"};if(e==="browser")return Q(t);if(e==="node")return z(t);if(e==="backend")return W(t);throw new Error(`No evidence checker registered for cycle '${e}'.`)}c(X,"checkCycleEvidence");function K(e){const t=e.cycle.charAt(0).toUpperCase()+e.cycle.slice(1);if(e.result.missing.length===0)return`${t} cycle: ok.`;const i=e.result.missing.map(o=>` - ${o}`).join(`
1
+ "use strict";var w=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var l=(e,t)=>w(e,"name",{value:t,configurable:!0});var B=(e,t)=>{for(var i in t)w(e,i,{get:t[i],enumerable:!0})},M=(e,t,i,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of P(t))!q.call(e,n)&&n!==i&&w(e,n,{get:()=>t[n],enumerable:!(o=L(t,n))||o.enumerable});return e};var U=e=>M(w({},"__esModule",{value:!0}),e);var te={};B(te,{runVerifyGate:()=>ee});module.exports=U(te);var p=require("fs"),f=require("../../lib/logger"),F=require("../../lib/telemetry"),g=require("./actions"),s=require("./session-state"),h=require("../../lib/config"),N=require("./required-tools");const G=3;function J(e){const t=h.CYCLE_TO_SERVER[e];if(t===void 0)throw new Error(`No MCP server registered for cycle '${e}'.`);return t}l(J,"mcpServerForCycle");function b(e){return JSON.stringify({session_id:e,status:"pass",checks:["form submits successfully","new item appears in list","no console errors"]})}l(b,"verdictExamplePass");function D(e){return JSON.stringify({session_id:e,status:"fail",checks:["form renders","submit button unresponsive"],issues:["button click handler not firing","TypeError in console"]})}l(D,"verdictExampleFail");function _(...e){for(const t of e)try{(0,p.existsSync)(t)&&(0,p.unlinkSync)(t)}catch(i){f.logger.debug(`failed to cleanup ${t}: ${i}`)}}l(_,"cleanup");function Y(e,t){const i=(0,g.getFileChangesSinceLastVerification)(e),o=new Set;for(const u of i)for(const c of(0,h.getActiveCycles)(u.file_path,t))o.add(c);const n=[];o.has("browser")&&n.push("browser");for(const u of h.OPTIONAL_CYCLES)o.has(u)&&n.push(u);return n}l(Y,"computeActiveCycles");function H(e,t,i){const o=J(e),n=new Set(t.filter(c=>c.tool_type==="mcp"&&c.mcp_server===o).map(c=>c.tool_name)),u=(0,h.getRequiredToolsConfig)(i,e);return{cycle:e,result:(0,N.satisfyRequiredTools)(n,u),config:u,usedCount:n.size}}l(H,"checkCycleTools");function Q(e){return{cycle:"browser",valid:!0,passCriteriaMet:!0}}l(Q,"checkBrowserEvidence");function z(e){return{cycle:"node",valid:!0,passCriteriaMet:!0}}l(z,"checkNodeEvidence");function W(e){return{cycle:"backend",valid:!0,passCriteriaMet:!0}}l(W,"checkBackendEvidence");function X(e){return{cycle:"android",valid:!0,passCriteriaMet:!0}}l(X,"checkAndroidEvidence");function K(e,t){if(!Array.isArray(t.checks)||t.checks.length===0)return{cycle:e,valid:!1,reason:"missing checks"};if(e==="browser")return Q(t);if(e==="node")return z(t);if(e==="backend")return W(t);if(e==="android")return X(t);throw new Error(`No evidence checker registered for cycle '${e}'.`)}l(K,"checkCycleEvidence");function Z(e){const t=e.cycle.charAt(0).toUpperCase()+e.cycle.slice(1);if(e.result.missing.length===0)return`${t} cycle: ok.`;const i=e.result.missing.map(o=>` - ${o}`).join(`
2
2
  `);return e.config.evidencePaths.length>0&&e.result.pathName!==void 0?`${t} cycle: incomplete (closest path "${e.result.pathName}", tried [${e.result.triedPaths.join(", ")}]):
3
3
  ${i}`:`${t} cycle: missing required tools:
4
- ${i}`}c(K,"describeMissingTools");async function Z(e){const{sessionId:t,sessionDir:i,actionsFile:o,verdictFile:s,maxRetries:l}=e,d=l??U,_=e.config??(0,g.loadConfig)(e.projectDir);if(h.logger.debug(`verify-gate: session=${t} verdictExists=${(0,b.existsSync)(s)}`),!(0,f.hasFileChangesSinceLastVerification)(o))return(0,a.getLastVerdictStatus)(i)==="fail"?(h.logger.debug("no code changes but last verdict was fail \u2014 blocking (unaddressed)"),await u(o,i,t,"block","fail_verdict_unaddressed",[],e.projectDir),{action:"block",message:`VERIFICATION FAILED \u2014 unaddressed.
4
+ ${i}`}l(Z,"describeMissingTools");async function ee(e){const{sessionId:t,sessionDir:i,actionsFile:o,verdictFile:n,maxRetries:u}=e,c=u??G,k=e.config??(0,h.loadConfig)(e.projectDir);if(f.logger.debug(`verify-gate: session=${t} verdictExists=${(0,p.existsSync)(n)}`),!(0,g.hasFileChangesSinceLastVerification)(o)){if((0,s.getLastVerdictStatus)(i)==="fail"){if((0,s.getVerifyIntent)(i)!=="fix")return f.logger.debug("fail verdict with no code changes in window \u2014 status report, allowing"),(0,s.setLastVerdictStatus)(i,"fail_reported"),await d(o,i,t,"allow","fail_verdict_reported",[],e.projectDir),{action:"allow"};const r=(0,s.incrementRetries)(i);return r>=c?(f.logger.debug(`fix intent declared but retries exhausted (${r}/${c}) \u2014 releasing`),(0,s.resetRetries)(i),await(0,s.closeOpenCycles)(i,o,"max_retries_exceeded"),await d(o,i,t,"allow","max_retries_exceeded",[],e.projectDir),{action:"allow",message:`VERIFICATION FAILED ${c} TIMES. Allowing completion.
5
+
6
+ The fail verdict was never resolved. Report the unresolved issues in your final response.`}):(f.logger.debug(`fix intent declared, fail verdict not addressed \u2014 blocking (unaddressed, attempt ${r}/${c})`),await d(o,i,t,"block","fail_verdict_unaddressed",[],e.projectDir),{action:"block",message:`VERIFICATION FAILED \u2014 unaddressed (attempt ${r}/${c}).
5
7
 
6
8
  You submitted a fail verdict but did not address the reported issues. Either:
7
9
 
8
10
  1. Fix the failing issues in code, then run a fresh verification cycle:
9
- echo '{"session_id":"${t}"}' | ironbee hook verification-start
11
+ echo '{"session_id":"${t}"}' | ironbee hook verification-start --intent fix
10
12
  ... rerun the relevant verification tools and submit a pass verdict ...
11
13
 
12
- 2. Or \u2014 if the issues genuinely cannot be fixed \u2014 start another verification cycle to
13
- confirm the failure (each fail counts toward maxRetries; once exhausted, the gate
14
- will allow completion with the issues reported).`}):(h.logger.debug("no code changes detected, allowing completion"),await u(o,i,t,"allow","no_edits",[],e.projectDir),{action:"allow"});const n=Y(o,_);if(n.length===0)return h.logger.debug("file changes match no cycle pattern, allowing completion"),await u(o,i,t,"allow","no_cycle_active",[],e.projectDir),{action:"allow"};const x=(0,f.getToolCallsSinceLastFileChange)(o),T=n.map(r=>H(r,x,_)),R=T.filter(r=>!r.result.satisfied);if(R.length>0){if(T.every(C=>C.usedCount===0)){await u(o,i,t,"block","no_tools",n,e.projectDir);const C=` echo '${p(t)}' | ironbee hook submit-verdict`,O=` On fail: echo '${F(t)}' | ironbee hook submit-verdict`;return{action:"block",message:`VERIFICATION REQUIRED.
14
+ 2. Or \u2014 if the issues genuinely cannot be fixed \u2014 re-verify (keep the --intent fix flag)
15
+ to confirm the failure: each blocked stop counts toward maxRetries; once exhausted,
16
+ the gate will allow completion with the issues reported.`})}return f.logger.debug("no code changes detected, allowing completion"),await d(o,i,t,"allow","no_edits",[],e.projectDir),{action:"allow"}}const a=Y(o,k);if(a.length===0)return f.logger.debug("file changes match no cycle pattern, allowing completion"),await d(o,i,t,"allow","no_cycle_active",[],e.projectDir),{action:"allow"};const j=(0,g.getToolCallsSinceLastFileChange)(o),T=a.map(r=>H(r,j,k)),$=T.filter(r=>!r.result.satisfied);if($.length>0){if(T.every(C=>C.usedCount===0)){await d(o,i,t,"block","no_tools",a,e.projectDir);const C=` echo '${b(t)}' | ironbee hook submit-verdict`,O=` On fail: echo '${D(t)}' | ironbee hook submit-verdict`;return{action:"block",message:`VERIFICATION REQUIRED.
15
17
 
16
18
  You made code changes but did not verify them.
17
19
 
18
- ${n.includes("browser")?`Browser cycle (UI verification):
20
+ ${a.includes("browser")?`Browser cycle (UI verification):
19
21
  1. Build and start the application if not already running
20
22
  2. Navigate to the affected page(s)
21
23
  3. Functionally test your changes \u2014 click, type, submit, interact with the UI to confirm the code works
@@ -23,53 +25,57 @@ ${n.includes("browser")?`Browser cycle (UI verification):
23
25
  5. Take an accessibility snapshot to verify page structure
24
26
  6. Check console for errors
25
27
  7. Stop the dev server when done
26
- `:""}${n.includes("node")?`Node cycle (Node.js runtime debug):
28
+ `:""}${a.includes("node")?`Node cycle (Node.js runtime debug):
27
29
  1. Connect to the running Node process via ndt_debug_connect
28
30
  2. Set probes (tracepoint / logpoint / exceptionpoint) at the changed code paths
29
31
  3. Exercise the code path so probes fire
30
32
  4. Read snapshots via ndt_debug_get-probe-snapshots, OR inspect runtime errors via ndt_debug_get-logs
31
- `:""}${n.includes("backend")?`Backend cycle (runtime-agnostic service verification \u2014 pick ONE or more evidence paths):
33
+ `:""}${a.includes("backend")?`Backend cycle (runtime-agnostic service verification \u2014 pick ONE or more evidence paths):
32
34
  1. Identify the backend layer affected by your change (HTTP / gRPC / GraphQL / WebSocket endpoint, log output, or database state)
33
35
  2a. Protocol-call path: make a real call against the running service (bedt_request_http / bedt_request_grpc / bedt_request_graphql / bedt_request_websocket-open / bedt_request_replay), inspect status / body / traceId, chain follow-ups to verify side effects
34
36
  2b. Log-evidence path (for when something else drives the request): bedt_log_register-source (file / docker / kubernetes), then bedt_log_read / bedt_log_read-multi / bedt_log_follow
35
37
  2c. DB-evidence path (for schema / migration / seed / query-regression changes): bedt_db_connect (named, readonly by default), then bedt_db_query / bedt_db_describe-table / bedt_db_list-tables / bedt_db_snapshot / bedt_db_diff / bedt_db_get-changes
36
38
  3. (Optional) Pin a correlation trace id for the run via bedt_o11y_new-trace-id / bedt_o11y_set-trace-context \u2014 IronBee already injects an active verification traceId, so the o11y pin only matters when you want a fresh root for log searches.
39
+ `:""}${a.includes("android")?`Android cycle (mobile device / emulator verification \u2014 pick ONE evidence path):
40
+ 1. Connect to a running device or emulator: adt_device_connect
41
+ 2a. Device-evidence path: drive the app UI (adt_device_launch-app / adt_interaction_tap / adt_interaction_input-text / adt_interaction_swipe), then capture BOTH a screenshot (adt_content_take-screenshot) AND a UI snapshot (adt_a11y_take-ui-snapshot) to confirm the visual + structural result
42
+ 2b. Log-evidence path: read Logcat output for the changed code path (adt_o11y_log-read / adt_o11y_log-follow) and confirm expected log lines / absence of errors
37
43
  `:""}
38
44
  Then submit your verdict (single verdict covers every active cycle):
39
45
  ${C}
40
46
  ${O}
41
- If failed, fix the code and re-verify until it passes.`}}return await u(o,i,t,"block","incomplete_tools",n,e.projectDir),{action:"block",message:`INCOMPLETE VERIFICATION.
47
+ If failed, fix the code and re-verify until it passes.`}}return await d(o,i,t,"block","incomplete_tools",a,e.projectDir),{action:"block",message:`INCOMPLETE VERIFICATION.
42
48
 
43
49
  You used the IronBee verification tools but skipped required checks:
44
50
 
45
- ${R.map(C=>K(C)).join(`
51
+ ${$.map(C=>Z(C)).join(`
46
52
  `)}
47
53
 
48
54
  Run the missing tools, functionally test your changes, then submit your verdict:
49
- Pass: echo '${p(t)}' | ironbee hook submit-verdict
50
- Fail: echo '${F(t)}' | ironbee hook submit-verdict`}}if(!(0,b.existsSync)(s))return await u(o,i,t,"block","no_verdict",n,e.projectDir),{action:"block",message:`VERDICT MISSING.
55
+ Pass: echo '${b(t)}' | ironbee hook submit-verdict
56
+ Fail: echo '${D(t)}' | ironbee hook submit-verdict`}}if(!(0,p.existsSync)(n))return await d(o,i,t,"block","no_verdict",a,e.projectDir),{action:"block",message:`VERDICT MISSING.
51
57
 
52
- You ran the verification tools but did not submit a verdict.${(0,a.isRecordingActive)(i)?`
58
+ You ran the verification tools but did not submit a verdict.${(0,s.isRecordingActive)(i)?`
53
59
  \u26A0 Recording is still active \u2014 call mcp__browser-devtools__bdt_content_stop-recording BEFORE submit-verdict (otherwise it will reject with "recording is still active").`:""}
54
60
 
55
61
  Submit your verdict via:
56
- echo '${p(t)}' | ironbee hook submit-verdict`};let y;try{y=JSON.parse((0,b.readFileSync)(s,"utf-8"))}catch(r){return h.logger.debug(`failed to parse verdict ${s}: ${r}`),k(s),await u(o,i,t,"block","invalid_verdict",n,e.projectDir),{action:"block",message:`INVALID VERDICT JSON. Re-submit valid JSON:
57
- echo '${p(t)}' | ironbee hook submit-verdict`}}const $=n.map(r=>X(r,y)),A=$.filter(r=>!r.valid);if(A.length>0)return k(s),await u(o,i,t,"block","invalid_verdict",n,e.projectDir),{action:"block",message:`VERDICT REJECTED:
62
+ echo '${b(t)}' | ironbee hook submit-verdict`};let v;try{v=JSON.parse((0,p.readFileSync)(n,"utf-8"))}catch(r){return f.logger.debug(`failed to parse verdict ${n}: ${r}`),_(n),await d(o,i,t,"block","invalid_verdict",a,e.projectDir),{action:"block",message:`INVALID VERDICT JSON. Re-submit valid JSON:
63
+ echo '${b(t)}' | ironbee hook submit-verdict`}}const R=a.map(r=>K(r,v)),A=R.filter(r=>!r.valid);if(A.length>0)return _(n),await d(o,i,t,"block","invalid_verdict",a,e.projectDir),{action:"block",message:`VERDICT REJECTED:
58
64
  ${A.map(I=>` - ${I.cycle} cycle: ${I.reason}`).join(`
59
65
  `)}
60
66
 
61
67
  Re-submit:
62
- echo '${p(t)}' | ironbee hook submit-verdict`};const m=y.status;if(m!=="pass"&&m!=="fail")return k(s),await u(o,i,t,"block","invalid_verdict",n,e.projectDir),{action:"block",message:`INVALID VERDICT STATUS: "${m}". Status must be "pass" or "fail".
63
- echo '${p(t)}' | ironbee hook submit-verdict`};const E=$.filter(r=>r.passCriteriaMet===!1),S=m==="pass"&&E.length===0?"pass":"fail";if(m==="pass"&&S==="fail"&&h.logger.debug(`verify-gate: status=pass overridden to fail by cycle pass-criteria: ${E.map(r=>r.cycle).join(",")}`),S==="pass")return h.logger.debug("verdict passed, allowing completion"),(0,a.resetRetries)(i),await u(o,i,t,"allow","verdict_pass",n,e.projectDir),{action:"allow"};const V=(0,a.incrementRetries)(i),v=[];if(Array.isArray(y.issues))for(const r of y.issues)v.push(String(r));for(const r of E)v.push(`[${r.cycle}] ${r.passReason??"pass criteria not met"}`);v.length===0&&v.push("unknown");const D=v.join(`
64
- - `);return V>=d?(k(s),(0,a.resetRetries)(i),await(0,a.closeOpenCycles)(i,o,"max_retries_exceeded"),await u(o,i,t,"allow","max_retries_exceeded",n,e.projectDir),{action:"allow",message:`VERIFICATION FAILED ${d} TIMES. Allowing completion.
68
+ echo '${b(t)}' | ironbee hook submit-verdict`};const m=v.status;if(m!=="pass"&&m!=="fail")return _(n),await d(o,i,t,"block","invalid_verdict",a,e.projectDir),{action:"block",message:`INVALID VERDICT STATUS: "${m}". Status must be "pass" or "fail".
69
+ echo '${b(t)}' | ironbee hook submit-verdict`};const E=R.filter(r=>r.passCriteriaMet===!1),S=m==="pass"&&E.length===0?"pass":"fail";if(m==="pass"&&S==="fail"&&f.logger.debug(`verify-gate: status=pass overridden to fail by cycle pass-criteria: ${E.map(r=>r.cycle).join(",")}`),S==="pass")return f.logger.debug("verdict passed, allowing completion"),(0,s.resetRetries)(i),await d(o,i,t,"allow","verdict_pass",a,e.projectDir),{action:"allow"};const x=(0,s.incrementRetries)(i),y=[];if(Array.isArray(v.issues))for(const r of v.issues)y.push(String(r));for(const r of E)y.push(`[${r.cycle}] ${r.passReason??"pass criteria not met"}`);y.length===0&&y.push("unknown");const V=y.join(`
70
+ - `);return x>=c?(_(n),(0,s.resetRetries)(i),await(0,s.closeOpenCycles)(i,o,"max_retries_exceeded"),await d(o,i,t,"allow","max_retries_exceeded",a,e.projectDir),{action:"allow",message:`VERIFICATION FAILED ${c} TIMES. Allowing completion.
65
71
 
66
72
  Unresolved issues:
67
- - ${D}
73
+ - ${V}
68
74
 
69
- Report these issues in your final response.`}):(k(s),await u(o,i,t,"block","verdict_fail",n,e.projectDir),{action:"block",message:`VERIFICATION FAILED (attempt ${V}/${d}).
75
+ Report these issues in your final response.`}):(_(n),await d(o,i,t,"block","verdict_fail",a,e.projectDir),{action:"block",message:`VERIFICATION FAILED (attempt ${x}/${c}).
70
76
 
71
77
  Issues found:
72
- - ${D}
78
+ - ${V}
73
79
 
74
80
  Fix the issues, rebuild if needed, re-test functionally, and re-verify.
75
- Submit verdict: echo '<verdict-json>' | ironbee hook submit-verdict`})}c(Z,"runVerifyGate");async function u(e,t,i,o,s,l,d){const _={...(0,f.baseFields)(e),type:"verification_requested",timestamp:Date.now(),activity_id:(0,a.getActiveActivityId)(t),action:o,reason:s,modes:l.length>0?l:void 0};await(0,f.appendAction)(e,_),await(0,N.trackVerificationRequested)(i,o,s,d)}c(u,"recordMarker");0&&(module.exports={runVerifyGate});
81
+ Submit verdict: echo '<verdict-json>' | ironbee hook submit-verdict`})}l(ee,"runVerifyGate");async function d(e,t,i,o,n,u,c){o==="allow"&&(0,s.clearVerifyIntent)(t);const k={...(0,g.baseFields)(e),type:"verification_requested",timestamp:Date.now(),activity_id:(0,s.getActiveActivityId)(t),action:o,reason:n,modes:u.length>0?u:void 0};await(0,g.appendAction)(e,k),await(0,F.trackVerificationRequested)(i,o,n,c)}l(d,"recordMarker");0&&(module.exports={runVerifyGate});
@@ -1,2 +1,2 @@
1
- "use strict";var c=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var a=(t,n)=>c(t,"name",{value:n,configurable:!0});var O=(t,n)=>{for(var e in n)c(t,e,{get:n[e],enumerable:!0})},U=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of M(n))!N.call(t,i)&&i!==e&&c(t,i,{get:()=>n[i],enumerable:!(r=j(n,i))||r.enumerable});return t};var A=t=>U(c({},"__esModule",{value:!0}),t);var L={};O(L,{buildToolCall:()=>D});module.exports=A(L);var p=require("../../../clients/claude/util"),R=require("../../ids");const g=new Set(["browser-devtools","node-devtools","backend-devtools"]);function D(t){const{sessionId:n,projectName:e,activityId:r,timestamp:i,toolUse:s,toolResult:l}=t,o=(0,p.classifyTool)(s.name,s.input),I=z(n,o,s),C=o.tool_type==="mcp"&&o.mcp_server!==null&&g.has(o.mcp_server)?B(s.input):(0,p.extractClaudeToolInput)(s.name,s.input),x=v(s.input),d=l!==null&&l.is_error?F(l.content):void 0,S=d!==void 0&&/\[Request interrupted by user(?:[^\]]*)?\]/.test(d),w=d!==void 0?S?`interrupted: ${d}`:d:void 0,h=l!==null&&!l.is_error?v(l.content):0,y=Date.parse(i),T=t.resultTimestamp!==void 0&&t.resultTimestamp!==null?Date.parse(t.resultTimestamp):NaN,E=Number.isFinite(T)?T:Number.isFinite(y)?y:Date.now(),u={id:I,type:"tool_call",timestamp:E,session_id:n,project_name:e,activity_id:r,tool_name:o.tool_name,tool_use_id:s.id,tool_input:C,tool_input_size:x,tool_response_size:h,duration:t.durationMs??null};if(o.tool_type!==null&&(u.tool_type=o.tool_type),o.mcp_server!==null&&(u.mcp_server=o.mcp_server),w!==void 0&&(u.error=w),o.tool_type==="mcp"&&o.mcp_server!==null&&g.has(o.mcp_server)){const f=s.input._metadata;if(f!==null&&typeof f=="object"){const b=f,m=b.verificationId;typeof m=="string"&&k.test(m)&&(u.verification_id=m);const _=b.traceId;typeof _=="string"&&_.length>0&&(u.trace_id=_)}}return u}a(D,"buildToolCall");const k=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function z(t,n,e){if(n.tool_type==="mcp"&&n.mcp_server!==null&&g.has(n.mcp_server)){const r=e.input._metadata;if(r!==null&&typeof r=="object"){const i=r.toolCallId;if(typeof i=="string"&&k.test(i))return i}}return(0,R.deriveToolCallEventIdFromToolUseId)(t,e.id)}a(z,"resolveEventId");function B(t){if(!("_metadata"in t))return t;const{_metadata:n,...e}=t;return e}a(B,"stripMetadata");function v(t){if(t==null)return 0;try{const n=typeof t=="string"?t:JSON.stringify(t);return n===void 0?0:Buffer.byteLength(n,"utf-8")}catch{return 0}}a(v,"byteLengthOf");function F(t){if(typeof t=="string")return t;if(Array.isArray(t)){const n=[];for(const e of t)if(e!==null&&typeof e=="object"){const r=e.text;typeof r=="string"&&n.push(r)}return n.join(`
1
+ "use strict";var c=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var a=(t,n)=>c(t,"name",{value:n,configurable:!0});var O=(t,n)=>{for(var e in n)c(t,e,{get:n[e],enumerable:!0})},U=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of M(n))!N.call(t,i)&&i!==e&&c(t,i,{get:()=>n[i],enumerable:!(r=j(n,i))||r.enumerable});return t};var A=t=>U(c({},"__esModule",{value:!0}),t);var L={};O(L,{buildToolCall:()=>D});module.exports=A(L);var p=require("../../../clients/claude/util"),R=require("../../ids");const g=new Set(["browser-devtools","node-devtools","backend-devtools","android-devtools"]);function D(t){const{sessionId:n,projectName:e,activityId:r,timestamp:i,toolUse:s,toolResult:l}=t,o=(0,p.classifyTool)(s.name,s.input),I=z(n,o,s),C=o.tool_type==="mcp"&&o.mcp_server!==null&&g.has(o.mcp_server)?B(s.input):(0,p.extractClaudeToolInput)(s.name,s.input),x=k(s.input),d=l!==null&&l.is_error?F(l.content):void 0,S=d!==void 0&&/\[Request interrupted by user(?:[^\]]*)?\]/.test(d),w=d!==void 0?S?`interrupted: ${d}`:d:void 0,h=l!==null&&!l.is_error?k(l.content):0,y=Date.parse(i),T=t.resultTimestamp!==void 0&&t.resultTimestamp!==null?Date.parse(t.resultTimestamp):NaN,E=Number.isFinite(T)?T:Number.isFinite(y)?y:Date.now(),u={id:I,type:"tool_call",timestamp:E,session_id:n,project_name:e,activity_id:r,tool_name:o.tool_name,tool_use_id:s.id,tool_input:C,tool_input_size:x,tool_response_size:h,duration:t.durationMs??null};if(o.tool_type!==null&&(u.tool_type=o.tool_type),o.mcp_server!==null&&(u.mcp_server=o.mcp_server),w!==void 0&&(u.error=w),o.tool_type==="mcp"&&o.mcp_server!==null&&g.has(o.mcp_server)){const f=s.input._metadata;if(f!==null&&typeof f=="object"){const v=f,m=v.verificationId;typeof m=="string"&&b.test(m)&&(u.verification_id=m);const _=v.traceId;typeof _=="string"&&_.length>0&&(u.trace_id=_)}}return u}a(D,"buildToolCall");const b=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function z(t,n,e){if(n.tool_type==="mcp"&&n.mcp_server!==null&&g.has(n.mcp_server)){const r=e.input._metadata;if(r!==null&&typeof r=="object"){const i=r.toolCallId;if(typeof i=="string"&&b.test(i))return i}}return(0,R.deriveToolCallEventIdFromToolUseId)(t,e.id)}a(z,"resolveEventId");function B(t){if(!("_metadata"in t))return t;const{_metadata:n,...e}=t;return e}a(B,"stripMetadata");function k(t){if(t==null)return 0;try{const n=typeof t=="string"?t:JSON.stringify(t);return n===void 0?0:Buffer.byteLength(n,"utf-8")}catch{return 0}}a(k,"byteLengthOf");function F(t){if(typeof t=="string")return t;if(Array.isArray(t)){const n=[];for(const e of t)if(e!==null&&typeof e=="object"){const r=e.text;typeof r=="string"&&n.push(r)}return n.join(`
2
2
  `)}try{return JSON.stringify(t)}catch{return String(t)}}a(F,"extractErrorMessage");0&&(module.exports={buildToolCall});
@@ -1 +1 @@
1
- "use strict";var c=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var d=(o,t)=>c(o,"name",{value:t,configurable:!0});var O=(o,t)=>{for(var n in t)c(o,n,{get:t[n],enumerable:!0})},h=(o,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of N(t))!S.call(o,e)&&e!==n&&c(o,e,{get:()=>t[e],enumerable:!(i=E(t,e))||i.enumerable});return o};var j=o=>h(c({},"__esModule",{value:!0}),o);var A={};O(A,{buildCodexToolCall:()=>D});module.exports=j(A);var p=require("../../../clients/codex/util"),w=require("../../ids");const b=new Set(["browser-devtools","node-devtools","backend-devtools"]);function D(o){const{sessionId:t,projectName:n,activityId:i,call:e,output:s}=o,r=(0,p.classifyCodexTool)(e.name),y=F(t,r,e),I=(0,p.extractCodexToolInput)(e.name,e.args),x=z(e.args),T=s!==null&&!s.isError?Buffer.byteLength(s.output,"utf-8"):0,C=s!==null&&s.isError?s.output.slice(0,500):void 0,a=Date.parse(e.timestamp),u=s!==null?Date.parse(s.timestamp):NaN,k=Number.isFinite(a)&&Number.isFinite(u)&&u>=a?u-a:null,R=Number.isFinite(u)?u:Number.isFinite(a)?a:Date.now(),l={id:y,type:"tool_call",timestamp:R,session_id:t,project_name:n,activity_id:i,tool_name:r.tool_name,tool_use_id:e.callId,tool_input:I,tool_input_size:x,tool_response_size:T,duration:k};if(r.tool_type!==null&&(l.tool_type=r.tool_type),r.mcp_server!==null&&(l.mcp_server=r.mcp_server),C!==void 0&&(l.error=C),r.tool_type==="mcp"&&r.mcp_server!==null&&b.has(r.mcp_server)){const m=e.args._metadata;if(m!==null&&typeof m=="object"){const _=m,f=_.verificationId;typeof f=="string"&&v.test(f)&&(l.verification_id=f);const g=_.traceId;typeof g=="string"&&g.length>0&&(l.trace_id=g)}}return l}d(D,"buildCodexToolCall");const v=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function F(o,t,n){if(t.tool_type==="mcp"&&t.mcp_server!==null&&b.has(t.mcp_server)){const i=n.args._metadata;if(i!==null&&typeof i=="object"){const e=i.toolCallId;if(typeof e=="string"&&v.test(e))return e}}return(0,w.deriveToolCallEventIdFromToolUseId)(o,n.callId)}d(F,"resolveEventId");function z(o){if(o==null)return 0;try{return Buffer.byteLength(JSON.stringify(o),"utf-8")}catch{return 0}}d(z,"byteLengthOf");0&&(module.exports={buildCodexToolCall});
1
+ "use strict";var d=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var c=(e,t)=>d(e,"name",{value:t,configurable:!0});var O=(e,t)=>{for(var n in t)d(e,n,{get:t[n],enumerable:!0})},h=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of N(t))!S.call(e,o)&&o!==n&&d(e,o,{get:()=>t[o],enumerable:!(i=E(t,o))||i.enumerable});return e};var j=e=>h(d({},"__esModule",{value:!0}),e);var A={};O(A,{buildCodexToolCall:()=>D});module.exports=j(A);var p=require("../../../clients/codex/util"),w=require("../../ids");const v=new Set(["browser-devtools","node-devtools","backend-devtools","android-devtools"]);function D(e){const{sessionId:t,projectName:n,activityId:i,call:o,output:s}=e,r=(0,p.classifyCodexTool)(o.name),y=F(t,r,o),I=(0,p.extractCodexToolInput)(o.name,o.args),x=z(o.args),T=s!==null&&!s.isError?Buffer.byteLength(s.output,"utf-8"):0,C=s!==null&&s.isError?s.output.slice(0,500):void 0,a=Date.parse(o.timestamp),u=s!==null?Date.parse(s.timestamp):NaN,k=Number.isFinite(a)&&Number.isFinite(u)&&u>=a?u-a:null,R=Number.isFinite(u)?u:Number.isFinite(a)?a:Date.now(),l={id:y,type:"tool_call",timestamp:R,session_id:t,project_name:n,activity_id:i,tool_name:r.tool_name,tool_use_id:o.callId,tool_input:I,tool_input_size:x,tool_response_size:T,duration:k};if(r.tool_type!==null&&(l.tool_type=r.tool_type),r.mcp_server!==null&&(l.mcp_server=r.mcp_server),C!==void 0&&(l.error=C),r.tool_type==="mcp"&&r.mcp_server!==null&&v.has(r.mcp_server)){const m=o.args._metadata;if(m!==null&&typeof m=="object"){const _=m,f=_.verificationId;typeof f=="string"&&b.test(f)&&(l.verification_id=f);const g=_.traceId;typeof g=="string"&&g.length>0&&(l.trace_id=g)}}return l}c(D,"buildCodexToolCall");const b=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function F(e,t,n){if(t.tool_type==="mcp"&&t.mcp_server!==null&&v.has(t.mcp_server)){const i=n.args._metadata;if(i!==null&&typeof i=="object"){const o=i.toolCallId;if(typeof o=="string"&&b.test(o))return o}}return(0,w.deriveToolCallEventIdFromToolUseId)(e,n.callId)}c(F,"resolveEventId");function z(e){if(e==null)return 0;try{return Buffer.byteLength(JSON.stringify(e),"utf-8")}catch{return 0}}c(z,"byteLengthOf");0&&(module.exports={buildCodexToolCall});
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var M=Object.defineProperty;var d=(a,n)=>M(a,"name",{value:n,configurable:!0});var t=require("commander"),i=require("fs"),c=require("path"),l=require("./commands/install"),g=require("./commands/uninstall"),p=require("./commands/update"),f=require("./commands/hook"),C=require("./commands/status"),u=require("./commands/verify"),v=require("./commands/queue"),b=require("./commands/process-job-file"),y=require("./clients/codex/cli"),h=require("./commands/browser"),$=require("./commands/node"),j=require("./commands/backend"),k=require("./commands/verification"),I=require("./commands/telemetry"),w=require("./commands/privacy"),B=require("./commands/config"),q=require("./tui"),L=require("./commands/register"),R=require("./commands/unregister"),T=require("./commands/import"),U=require("./clients/claude/cli"),x=require("./commands/login"),F=require("./queue"),S=require("./lib/icon"),m=require("./lib/version"),o=require("./lib/output");const s=JSON.parse((0,i.readFileSync)((0,c.join)(__dirname,"../package.json"),"utf-8"));(0,F.registerQueueHandlers)();const e=new t.Command;e.name("ironbee").description(s.description).version(s.version),e.addCommand(x.loginCommand),e.addCommand(l.installCommand),e.addCommand(g.uninstallCommand),e.addCommand(p.updateCommand),e.addCommand(C.statusCommand),e.addCommand(u.verifyCommand),e.addCommand(v.queueCommand),e.addCommand(h.browserCommand),e.addCommand($.nodeCommand),e.addCommand(j.backendCommand),e.addCommand(k.verificationCommand),e.addCommand(I.telemetryCommand),e.addCommand(w.privacyCommand),e.addCommand(U.claudeCommand),e.addCommand(y.codexCommand),e.addCommand(B.configCommand),e.addCommand(q.tuiCommand),e.addCommand(L.registerCommand),e.addCommand(R.unregisterCommand),e.addCommand(T.importCommand),e.addCommand(b.processJobFileCommand),e.addCommand(f.hookCommand);const N=process.argv[2]==="hook"||process.argv[2]==="process-job-file"||process.argv[2]==="claude"&&process.argv[3]==="process-analytics"||process.argv[2]==="codex"&&process.argv[3]==="process-analytics"||process.argv[2]==="claude"&&process.argv[3]==="otel"&&process.argv[4]==="run";if(process.argv.length===2){(0,S.printBanner)(),console.log(),console.log(` ${o.pc.bold("IronBee CLI")} ${o.pc.dim(`v${(0,m.getLocalVersion)()}`)}`),console.log(` ${o.pc.dim(s.description)}`),console.log(),console.log(` ${o.pc.bold(o.pc.cyan("Usage:"))} ${o.pc.green("ironbee")} ${o.pc.dim("<command> [options]")}`),console.log(),console.log(` ${o.pc.bold(o.pc.cyan("Commands:"))}`);const a=[{name:"install",args:"[project-dir]",desc:"Install hooks + guidance files into a project (--all: every registered project)"},{name:"uninstall",args:"[project-dir]",desc:"Remove IronBee from a project (--all: every registered project)"},{name:"update",args:"",desc:"Update IronBee CLI to the latest version"},{name:"tui",args:"[area]",desc:"Interactive full-screen UI (config \xB7 platforms \xB7 projects \xB7 sessions \xB7 queue \xB7 import)"},{name:"status",args:"[project-dir]",desc:"Show verification status for active sessions"},{name:"verify",args:"[session-id]",desc:"Dry-run verdict validation"},{name:"browser",args:"<enable|disable>",desc:"Toggle the browser verification cycle (default-on)"},{name:"node",args:"<enable|disable>",desc:"Toggle the Node.js runtime debug cycle (opt-in)"},{name:"backend",args:"<enable|disable>",desc:"Toggle the backend protocol cycle (opt-in)"},{name:"verification",args:"<enable|disable>",desc:"Master toggle (enable = enforce; disable = monitoring-only)"},{name:"telemetry",args:"<enable|disable>",desc:"Anonymous PostHog telemetry toggle"},{name:"privacy",args:"<enable|disable>",desc:"Privacy mode \u2014 redact devtools tool detail / screenshots / recordings from collector"},{name:"claude statusline",args:"<enable|disable>",desc:"Claude statusline integration (Claude-only)"},{name:"claude otel",args:"<run|status|stop|retry>",desc:"Claude OTEL collector daemon (Claude-only)"},{name:"config",args:"<get|set|unset|list>",desc:"Read or write project / global / local config"},{name:"register",args:"[-p <dir>]",desc:"Add a project to the user-home inventory (no artifact writes)"},{name:"unregister",args:"[-p <dir>]",desc:"Remove a project from the inventory (no artifact writes)"},{name:"queue",args:"<status|drain|\u2026>",desc:"Inspect / drain the background job queue"},{name:"import",args:"",desc:"Import historical Claude sessions to the collector"}],n=d(r=>r.args.length>0?`${r.name} ${r.args}`:r.name,"term"),A=Math.max(...a.map(r=>n(r).length));for(const r of a){const H=r.args.length>0?`${o.pc.green(r.name)} ${o.pc.dim(r.args)}`:o.pc.green(r.name),J=" ".repeat(A-n(r).length);console.log(` ${H}${J} ${r.desc}`)}console.log(),console.log(` ${o.pc.dim("Run")} ${o.pc.cyan("ironbee <command> --help")} ${o.pc.dim("for more info on a command.")}`),console.log()}else N?e.parse(process.argv):(e.parse(process.argv),(0,m.checkForUpdates)().catch(()=>{}));
2
+ "use strict";var M=Object.defineProperty;var t=(r,n)=>M(r,"name",{value:n,configurable:!0});var i=require("commander"),c=require("fs"),l=require("path"),s=require("./commands/install"),g=require("./commands/uninstall"),p=require("./commands/update"),f=require("./commands/hook"),C=require("./commands/status"),u=require("./commands/verify"),b=require("./commands/queue"),v=require("./commands/process-job-file"),y=require("./clients/codex/cli"),h=require("./commands/browser"),$=require("./commands/node"),j=require("./commands/backend"),w=require("./commands/android"),I=require("./commands/verification"),k=require("./commands/telemetry"),B=require("./commands/privacy"),F=require("./commands/config"),T=require("./tui"),q=require("./commands/register"),A=require("./commands/unregister"),L=require("./commands/import"),R=require("./clients/claude/cli"),S=require("./commands/login"),U=require("./queue"),x=require("./lib/icon"),m=require("./lib/version"),e=require("./lib/output");const d=JSON.parse((0,c.readFileSync)((0,l.join)(__dirname,"../package.json"),"utf-8"));(0,U.registerQueueHandlers)();const o=new i.Command;o.name("ironbee").description(d.description).version(d.version),o.addCommand(S.loginCommand),o.addCommand(s.installCommand),o.addCommand(g.uninstallCommand),o.addCommand(p.updateCommand),o.addCommand(C.statusCommand),o.addCommand(u.verifyCommand),o.addCommand(b.queueCommand),o.addCommand(h.browserCommand),o.addCommand($.nodeCommand),o.addCommand(j.backendCommand),o.addCommand(w.androidCommand),o.addCommand(I.verificationCommand),o.addCommand(k.telemetryCommand),o.addCommand(B.privacyCommand),o.addCommand(R.claudeCommand),o.addCommand(y.codexCommand),o.addCommand(F.configCommand),o.addCommand(T.tuiCommand),o.addCommand(q.registerCommand),o.addCommand(A.unregisterCommand),o.addCommand(L.importCommand),o.addCommand(v.processJobFileCommand),o.addCommand(f.hookCommand);const N=process.argv[2]==="hook"||process.argv[2]==="process-job-file"||process.argv[2]==="claude"&&process.argv[3]==="process-analytics"||process.argv[2]==="codex"&&process.argv[3]==="process-analytics"||process.argv[2]==="claude"&&process.argv[3]==="otel"&&process.argv[4]==="run";if(process.argv.length===2){(0,x.printBanner)(),console.log(),console.log(` ${e.pc.bold("IronBee CLI")} ${e.pc.dim(`v${(0,m.getLocalVersion)()}`)}`),console.log(` ${e.pc.dim(d.description)}`),console.log(),console.log(` ${e.pc.bold(e.pc.cyan("Usage:"))} ${e.pc.green("ironbee")} ${e.pc.dim("<command> [options]")}`),console.log(),console.log(` ${e.pc.bold(e.pc.cyan("Commands:"))}`);const r=[{name:"install",args:"[project-dir]",desc:"Install hooks + guidance files into a project (--all: every registered project)"},{name:"uninstall",args:"[project-dir]",desc:"Remove IronBee from a project (--all: every registered project)"},{name:"update",args:"",desc:"Update IronBee CLI to the latest version"},{name:"tui",args:"[area]",desc:"Interactive full-screen UI (config \xB7 platforms \xB7 projects \xB7 sessions \xB7 queue \xB7 import)"},{name:"status",args:"[project-dir]",desc:"Show verification status for active sessions"},{name:"verify",args:"[session-id]",desc:"Dry-run verdict validation"},{name:"browser",args:"<enable|disable>",desc:"Toggle the browser verification cycle (default-on)"},{name:"node",args:"<enable|disable>",desc:"Toggle the Node.js runtime debug cycle (opt-in)"},{name:"backend",args:"<enable|disable>",desc:"Toggle the backend protocol cycle (opt-in)"},{name:"android",args:"<enable|disable>",desc:"Toggle the Android mobile verification cycle (opt-in)"},{name:"verification",args:"<enable|disable>",desc:"Master toggle (enable = enforce; disable = monitoring-only)"},{name:"telemetry",args:"<enable|disable>",desc:"Anonymous PostHog telemetry toggle"},{name:"privacy",args:"<enable|disable>",desc:"Privacy mode \u2014 redact devtools tool detail / screenshots / recordings from collector"},{name:"claude statusline",args:"<enable|disable>",desc:"Claude statusline integration (Claude-only)"},{name:"claude otel",args:"<run|status|stop|retry>",desc:"Claude OTEL collector daemon (Claude-only)"},{name:"config",args:"<get|set|unset|list>",desc:"Read or write project / global / local config"},{name:"register",args:"[-p <dir>]",desc:"Add a project to the user-home inventory (no artifact writes)"},{name:"unregister",args:"[-p <dir>]",desc:"Remove a project from the inventory (no artifact writes)"},{name:"queue",args:"<status|drain|\u2026>",desc:"Inspect / drain the background job queue"},{name:"import",args:"",desc:"Import historical Claude sessions to the collector"}],n=t(a=>a.args.length>0?`${a.name} ${a.args}`:a.name,"term"),P=Math.max(...r.map(a=>n(a).length));for(const a of r){const H=a.args.length>0?`${e.pc.green(a.name)} ${e.pc.dim(a.args)}`:e.pc.green(a.name),J=" ".repeat(P-n(a).length);console.log(` ${H}${J} ${a.desc}`)}console.log(),console.log(` ${e.pc.dim("Run")} ${e.pc.cyan("ironbee <command> --help")} ${e.pc.dim("for more info on a command.")}`),console.log()}else N?o.parse(process.argv):(async()=>{await o.parseAsync(process.argv),(0,m.checkForUpdates)().catch(()=>{});const r=process.argv[2];r==="install"||r==="uninstall"||r==="update"||await(0,s.syncSchemaIfChanged)()})();