@ironbee-ai/cli 0.18.4 → 0.18.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.18.5 (2026-06-05)
4
+
5
+ ### Bug Fixes
6
+
7
+ * **codex:** gate Stop-as-checkpoint session_end on activity closure ([0cd3ed1](https://github.com/ironbee-ai/ironbee-cli/commit/0cd3ed1cfb995f9783c75cc689a464c5dde950f8))
8
+
3
9
  ## 0.18.4 (2026-06-04)
4
10
 
5
11
  ### Bug Fixes
@@ -1 +1 @@
1
- {"version":3,"file":"activity-end.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/activity-end.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD3D"}
1
+ {"version":3,"file":"activity-end.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/activity-end.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD3D"}
@@ -29,18 +29,25 @@ async function run(projectDir) {
29
29
  // the wire ships activity_id: "" → backend can't correlate the
30
30
  // API-cost snapshot with the turn that produced it.
31
31
  const preStopActivityId = (0, session_state_1.readState)(sessionDir)?.activeActivityId ?? "";
32
- await (0, activity_end_1.runActivityEnd)({ sessionDir, actionsFile, projectDir, sessionId });
33
- const now = Date.now();
34
- const checkpoint = {
35
- ...(0, actions_1.baseFields)(actionsFile),
36
- id: (0, actions_1.deterministicSessionEndId)(sessionId),
37
- type: "session_end",
38
- timestamp: now,
39
- session_id: sessionId,
40
- duration: (0, actions_1.findDurationSinceLastAction)(actionsFile, "session_start", now),
41
- reason: "checkpoint",
42
- };
43
- await (0, actions_1.appendAction)(actionsFile, checkpoint);
32
+ const activityClosed = await (0, activity_end_1.runActivityEnd)({ sessionDir, actionsFile, projectDir, sessionId });
33
+ // Stop-as-checkpoint session_end — gated on the activity having actually
34
+ // closed, so a session_end is never written while an activity is still open
35
+ // (`session > activity` hierarchy). Same rule as enforce-mode verify-gate.
36
+ // Codex sessions abandoned with no open activity are closed by backend
37
+ // inactivity reconciliation instead. See docs/flow.md.
38
+ if (activityClosed) {
39
+ const now = Date.now();
40
+ const checkpoint = {
41
+ ...(0, actions_1.baseFields)(actionsFile),
42
+ id: (0, actions_1.deterministicSessionEndId)(sessionId),
43
+ type: "session_end",
44
+ timestamp: now,
45
+ session_id: sessionId,
46
+ duration: (0, actions_1.findDurationSinceLastAction)(actionsFile, "session_start", now),
47
+ reason: "checkpoint",
48
+ };
49
+ await (0, actions_1.appendAction)(actionsFile, checkpoint);
50
+ }
44
51
  // Codex analytics: api_request + session_status + session_analytics —
45
52
  // all emitted in a detached worker so the Stop hook returns fast.
46
53
  // session_turn_analytics + session_context are out of scope on Codex
@@ -1 +1 @@
1
- {"version":3,"file":"activity-end.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/activity-end.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAiBH,kBAiDC;AAhED,yDAMqC;AACrC,mEAAkE;AAClE,gDAAyD;AACzD,gDAAmD;AACnD,8CAA+C;AAC/C,0DAAmF;AACnF,qEAA8D;AAC9D,kCAA8C;AAEvC,KAAK,UAAU,GAAG,CAAC,UAAkB;IACxC,MAAM,KAAK,GAA2C,IAAA,0BAAmB,EAAC,IAAA,iBAAS,GAAE,CAAC,CAAC;IACvF,MAAM,SAAS,GAAW,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IACxD,MAAM,UAAU,GAAW,GAAG,UAAU,sBAAsB,SAAS,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAW,GAAG,UAAU,gBAAgB,CAAC;IAC1D,IAAA,mBAAU,EAAC,GAAG,UAAU,cAAc,CAAC,CAAC;IAExC,uEAAuE;IACvE,oDAAoD;IACpD,sEAAsE;IACtE,oEAAoE;IACpE,+DAA+D;IAC/D,oDAAoD;IACpD,MAAM,iBAAiB,GAAW,IAAA,yBAAS,EAAC,UAAU,CAAC,EAAE,gBAAgB,IAAI,EAAE,CAAC;IAEhF,MAAM,IAAA,6BAAc,EAAC,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzE,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAqB;QACjC,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;QAC1B,EAAE,EAAE,IAAA,mCAAyB,EAAC,SAAS,CAAC;QACxC,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,GAAG;QACd,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,IAAA,qCAA2B,EAAC,WAAW,EAAE,eAAe,EAAE,GAAG,CAAC;QACxE,MAAM,EAAE,YAAY;KACvB,CAAC;IACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAE5C,sEAAsE;IACtE,kEAAkE;IAClE,qEAAqE;IACrE,IAAI,CAAC;QACD,MAAM,KAAK,GAAiC,IAAA,yBAAS,EAAC,UAAU,CAAC,CAAC;QAClE,IAAA,yCAAiC,EAAC;YAC9B,UAAU;YACV,SAAS;YACT,WAAW,EAAE,KAAK,CAAC,eAAe;YAClC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,SAAS;YACxC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,SAAS;YACxC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,SAAS;YACxC,UAAU,EAAE,iBAAiB;SAChC,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;IAC3C,IAAA,qBAAY,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"activity-end.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/activity-end.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAiBH,kBAwDC;AAvED,yDAMqC;AACrC,mEAAkE;AAClE,gDAAyD;AACzD,gDAAmD;AACnD,8CAA+C;AAC/C,0DAAmF;AACnF,qEAA8D;AAC9D,kCAA8C;AAEvC,KAAK,UAAU,GAAG,CAAC,UAAkB;IACxC,MAAM,KAAK,GAA2C,IAAA,0BAAmB,EAAC,IAAA,iBAAS,GAAE,CAAC,CAAC;IACvF,MAAM,SAAS,GAAW,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;IACxD,MAAM,UAAU,GAAW,GAAG,UAAU,sBAAsB,SAAS,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAW,GAAG,UAAU,gBAAgB,CAAC;IAC1D,IAAA,mBAAU,EAAC,GAAG,UAAU,cAAc,CAAC,CAAC;IAExC,uEAAuE;IACvE,oDAAoD;IACpD,sEAAsE;IACtE,oEAAoE;IACpE,+DAA+D;IAC/D,oDAAoD;IACpD,MAAM,iBAAiB,GAAW,IAAA,yBAAS,EAAC,UAAU,CAAC,EAAE,gBAAgB,IAAI,EAAE,CAAC;IAEhF,MAAM,cAAc,GAAY,MAAM,IAAA,6BAAc,EAAC,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzG,yEAAyE;IACzE,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,uDAAuD;IACvD,IAAI,cAAc,EAAE,CAAC;QACjB,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAqB;YACjC,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;YAC1B,EAAE,EAAE,IAAA,mCAAyB,EAAC,SAAS,CAAC;YACxC,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,IAAA,qCAA2B,EAAC,WAAW,EAAE,eAAe,EAAE,GAAG,CAAC;YACxE,MAAM,EAAE,YAAY;SACvB,CAAC;QACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,sEAAsE;IACtE,kEAAkE;IAClE,qEAAqE;IACrE,IAAI,CAAC;QACD,MAAM,KAAK,GAAiC,IAAA,yBAAS,EAAC,UAAU,CAAC,CAAC;QAClE,IAAA,yCAAiC,EAAC;YAC9B,UAAU;YACV,SAAS;YACT,WAAW,EAAE,KAAK,CAAC,eAAe;YAClC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,SAAS;YACxC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,SAAS;YACxC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,SAAS;YACxC,UAAU,EAAE,iBAAiB;SAChC,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,eAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;IAC3C,IAAA,qBAAY,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify-gate.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/verify-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF3D"}
1
+ {"version":3,"file":"verify-gate.d.ts","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/verify-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoBH,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgG3D"}
@@ -47,22 +47,35 @@ async function run(projectDir) {
47
47
  // reads `activeActivityId: undefined` and the wire field ships as
48
48
  // empty string. Hits 100% of Codex sessions with verification enabled.
49
49
  const preStopActivityId = (0, session_state_1.readState)(sessionDir)?.activeActivityId ?? "";
50
- if (result.action === "allow") {
51
- await (0, activity_1.endActivity)({ sessionDir, actionsFile });
52
- }
50
+ // Only an allow Stop closes the activity. Capture whether an activity was
51
+ // actually closed the Stop-as-checkpoint session_end below is gated on it.
52
+ const activityClosed = result.action === "allow"
53
+ ? await (0, activity_1.endActivity)({ sessionDir, actionsFile })
54
+ : false;
53
55
  // Stop-as-checkpoint: write tentative session_end with deterministic id.
54
56
  // Backend dedup `(session_id, id)` keeps the latest snapshot.
55
- const now = Date.now();
56
- const checkpoint = {
57
- ...(0, actions_1.baseFields)(actionsFile),
58
- id: (0, actions_1.deterministicSessionEndId)(sessionId),
59
- type: "session_end",
60
- timestamp: now,
61
- session_id: sessionId,
62
- duration: (0, actions_1.findDurationSinceLastAction)(actionsFile, "session_start", now),
63
- reason: "checkpoint",
64
- };
65
- await (0, actions_1.appendAction)(actionsFile, checkpoint);
57
+ //
58
+ // Gated on `activityClosed` to preserve the `session > activity` hierarchy:
59
+ // Codex has no SessionEnd hook, so this is the only session_end source — but
60
+ // a session_end must never be written while an activity is still open. On a
61
+ // BLOCK Stop the turn continues (activity stays open) so we emit nothing; on
62
+ // an allow Stop with no open activity (already reconciled) there is likewise
63
+ // nothing to checkpoint. Sessions abandoned mid-turn (blocked, then a
64
+ // hookless Esc/`/quit` — #22858) therefore get NO session_end from the CLI
65
+ // and are closed by backend inactivity reconciliation. See docs/flow.md.
66
+ if (activityClosed) {
67
+ const now = Date.now();
68
+ const checkpoint = {
69
+ ...(0, actions_1.baseFields)(actionsFile),
70
+ id: (0, actions_1.deterministicSessionEndId)(sessionId),
71
+ type: "session_end",
72
+ timestamp: now,
73
+ session_id: sessionId,
74
+ duration: (0, actions_1.findDurationSinceLastAction)(actionsFile, "session_start", now),
75
+ reason: "checkpoint",
76
+ };
77
+ await (0, actions_1.appendAction)(actionsFile, checkpoint);
78
+ }
66
79
  // Codex analytics: api_request + session_status + session_analytics —
67
80
  // all emitted by the detached worker (mirror of Claude's
68
81
  // spawnDetachedAnalyticsWorker pattern) so the Stop hook returns in
@@ -1 +1 @@
1
- {"version":3,"file":"verify-gate.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/verify-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify-gate.js","sourceRoot":"","sources":["../../../../src/clients/codex/hooks/verify-gate.ts"],"names":[],"mappings":"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"}
@@ -24,5 +24,11 @@ export interface ActivityEndInput {
24
24
  projectDir: string;
25
25
  sessionId: string;
26
26
  }
27
- export declare function runActivityEnd(input: ActivityEndInput): Promise<void>;
27
+ /**
28
+ * Returns whether an open activity was actually closed (propagated from
29
+ * `endActivity`). Codex's monitoring-mode Stop adapter gates its
30
+ * Stop-as-checkpoint `session_end` on this so a `session_end` is never written
31
+ * while an activity is still open.
32
+ */
33
+ export declare function runActivityEnd(input: ActivityEndInput): Promise<boolean>;
28
34
  //# sourceMappingURL=activity-end.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-end.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/activity-end.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3E"}
1
+ {"version":3,"file":"activity-end.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/activity-end.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAe9E"}
@@ -24,6 +24,12 @@ exports.runActivityEnd = runActivityEnd;
24
24
  const activity_1 = require("./activity");
25
25
  const session_state_1 = require("./session-state");
26
26
  const queue_1 = require("../../queue");
27
+ /**
28
+ * Returns whether an open activity was actually closed (propagated from
29
+ * `endActivity`). Codex's monitoring-mode Stop adapter gates its
30
+ * Stop-as-checkpoint `session_end` on this so a `session_end` is never written
31
+ * while an activity is still open.
32
+ */
27
33
  async function runActivityEnd(input) {
28
34
  const { sessionDir, actionsFile, projectDir, sessionId } = input;
29
35
  // Close any verification/fix cycle left open at the turn boundary (assist
@@ -32,11 +38,12 @@ async function runActivityEnd(input) {
32
38
  // Runs BEFORE endActivity so the cycle-end events still carry the active
33
39
  // activity_id.
34
40
  await (0, session_state_1.closeOpenCycles)(sessionDir, actionsFile, "stop");
35
- await (0, activity_1.endActivity)({ sessionDir, actionsFile });
41
+ const activityClosed = await (0, activity_1.endActivity)({ sessionDir, actionsFile });
36
42
  (0, queue_1.flushInBackground)(projectDir, sessionId);
37
43
  // Re-attempt prior TransientError snapshots — covers cases where this
38
44
  // Stop is one of many before SessionEnd (which may be days away or
39
45
  // never fire on Codex).
40
46
  (0, queue_1.flushStragglersInBackground)(projectDir, sessionId);
47
+ return activityClosed;
41
48
  }
42
49
  //# sourceMappingURL=activity-end.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity-end.js","sourceRoot":"","sources":["../../../src/hooks/core/activity-end.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAaH,wCAcC;AAzBD,yCAAyC;AACzC,mDAAkD;AAClD,uCAA6E;AAStE,KAAK,UAAU,cAAc,CAAC,KAAuB;IACxD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACjE,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,eAAe;IACf,MAAM,IAAA,+BAAe,EAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,IAAA,sBAAW,EAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/C,IAAA,yBAAiB,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACzC,sEAAsE;IACtE,mEAAmE;IACnE,wBAAwB;IACxB,IAAA,mCAA2B,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC"}
1
+ {"version":3,"file":"activity-end.js","sourceRoot":"","sources":["../../../src/hooks/core/activity-end.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAmBH,wCAeC;AAhCD,yCAAyC;AACzC,mDAAkD;AAClD,uCAA6E;AAS7E;;;;;GAKG;AACI,KAAK,UAAU,cAAc,CAAC,KAAuB;IACxD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACjE,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,eAAe;IACf,MAAM,IAAA,+BAAe,EAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,cAAc,GAAY,MAAM,IAAA,sBAAW,EAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/E,IAAA,yBAAiB,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACzC,sEAAsE;IACtE,mEAAmE;IACnE,wBAAwB;IACxB,IAAA,mCAA2B,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnD,OAAO,cAAc,CAAC;AAC1B,CAAC"}
@@ -16,5 +16,15 @@ export interface EndActivityInput {
16
16
  actionsFile: string;
17
17
  }
18
18
  export declare function startActivity(input: StartActivityInput): Promise<void>;
19
- export declare function endActivity(input: EndActivityInput): Promise<void>;
19
+ /**
20
+ * Close the active activity, writing an `activity_end` event.
21
+ *
22
+ * Returns `true` when an open activity was actually closed (an `activity_end`
23
+ * was written), `false` when there was nothing to close (no-op). Callers that
24
+ * gate a parent-lifecycle write on the activity having closed — notably the
25
+ * Codex Stop-as-checkpoint `session_end` — use this to preserve the
26
+ * `session > activity` hierarchy: never emit `session_end` while an activity
27
+ * is still open.
28
+ */
29
+ export declare function endActivity(input: EndActivityInput): Promise<boolean>;
20
30
  //# sourceMappingURL=activity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBxE"}
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5E;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuB3E"}
@@ -31,10 +31,20 @@ async function startActivity(input) {
31
31
  await (0, actions_1.appendAction)(actionsFile, entry);
32
32
  logger_1.logger.debug(`activity-start: ${activityId} source=${source ?? "unknown"}`);
33
33
  }
34
+ /**
35
+ * Close the active activity, writing an `activity_end` event.
36
+ *
37
+ * Returns `true` when an open activity was actually closed (an `activity_end`
38
+ * was written), `false` when there was nothing to close (no-op). Callers that
39
+ * gate a parent-lifecycle write on the activity having closed — notably the
40
+ * Codex Stop-as-checkpoint `session_end` — use this to preserve the
41
+ * `session > activity` hierarchy: never emit `session_end` while an activity
42
+ * is still open.
43
+ */
34
44
  async function endActivity(input) {
35
45
  const { sessionDir, actionsFile } = input;
36
46
  if (!(0, session_state_1.isActive)(sessionDir)) {
37
- return;
47
+ return false;
38
48
  }
39
49
  const activityId = (0, session_state_1.getActiveActivityId)(sessionDir);
40
50
  (0, session_state_1.clearActiveActivity)(sessionDir);
@@ -49,5 +59,6 @@ async function endActivity(input) {
49
59
  };
50
60
  await (0, actions_1.appendAction)(actionsFile, entry);
51
61
  logger_1.logger.debug(`activity-end: ${activityId ?? ""} duration=${duration ?? "unknown"}`);
62
+ return true;
52
63
  }
53
64
  //# sourceMappingURL=activity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAkBH,sCAmBC;AAED,kCAsBC;AA3DD,mCAAoC;AACpC,6CAA0C;AAC1C,mDAAwG;AACxG,uCAA0H;AAanH,KAAK,UAAU,aAAa,CAAC,KAAyB;IACzD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAElD,IAAI,IAAA,wBAAQ,EAAC,UAAU,CAAC,EAAE,CAAC;QACvB,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAW,IAAA,mBAAU,GAAE,CAAC;IACxC,IAAA,iCAAiB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAwB;QAC/B,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;QAC1B,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,WAAW,EAAE,UAAU;QACvB,MAAM;KACT,CAAC;IACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvC,eAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,WAAW,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AAChF,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,KAAuB;IACrD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAE1C,IAAI,CAAC,IAAA,wBAAQ,EAAC,UAAU,CAAC,EAAE,CAAC;QACxB,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAuB,IAAA,mCAAmB,EAAC,UAAU,CAAC,CAAC;IACvE,IAAA,mCAAmB,EAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAuB,IAAA,qCAA2B,EAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAErG,MAAM,KAAK,GAAsB;QAC7B,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;QAC1B,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,UAAW;QACxB,QAAQ;KACX,CAAC;IACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvC,eAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,IAAI,EAAE,aAAa,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/hooks/core/activity.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAkBH,sCAmBC;AAYD,kCAuBC;AAtED,mCAAoC;AACpC,6CAA0C;AAC1C,mDAAwG;AACxG,uCAA0H;AAanH,KAAK,UAAU,aAAa,CAAC,KAAyB;IACzD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAElD,IAAI,IAAA,wBAAQ,EAAC,UAAU,CAAC,EAAE,CAAC;QACvB,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAW,IAAA,mBAAU,GAAE,CAAC;IACxC,IAAA,iCAAiB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAwB;QAC/B,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;QAC1B,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,WAAW,EAAE,UAAU;QACvB,MAAM;KACT,CAAC;IACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvC,eAAM,CAAC,KAAK,CAAC,mBAAmB,UAAU,WAAW,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,WAAW,CAAC,KAAuB;IACrD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAE1C,IAAI,CAAC,IAAA,wBAAQ,EAAC,UAAU,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,UAAU,GAAuB,IAAA,mCAAmB,EAAC,UAAU,CAAC,CAAC;IACvE,IAAA,mCAAmB,EAAC,UAAU,CAAC,CAAC;IAEhC,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAuB,IAAA,qCAA2B,EAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAErG,MAAM,KAAK,GAAsB;QAC7B,GAAG,IAAA,oBAAU,EAAC,WAAW,CAAC;QAC1B,IAAI,EAAE,cAAc;QACpB,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,UAAW;QACxB,QAAQ;KACX,CAAC;IACF,MAAM,IAAA,sBAAY,EAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACvC,eAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,IAAI,EAAE,aAAa,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ironbee-ai/cli",
3
- "version": "0.18.4",
3
+ "version": "0.18.5",
4
4
  "description": "The CLI for IronBee — Verification and Intelligence Layer for Agentic Development",
5
5
  "main": "dist/index.js",
6
6
  "bin": {