@gajae-code/coding-agent 0.12.18 → 0.12.19

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
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.12.19] - 2026-08-08
6
+
7
+ ### Fixed
8
+
9
+ - Telegram topic-registry archive transitions remain parser-valid across durable-fence load promotion and failed archive-publication rollback. The initial generation-57 fix cleared `disconnectGraceExpiresAt` on direct archive transitions, but loading a `disconnect_grace` record superseded by a newer durable fence could still promote it to `archive_pending` while retaining the grace-only field, and rollback could restore `disconnect_grace` without restoring its required deadline. Both paths now preserve the state/field invariant with parser-roundtrip coverage. This entry also corrects the hotfix attribution omitted from the published 0.12.18 release notes. `DAEMON_GENERATION` bumped to 58.
10
+
5
11
  ## [0.12.18] - 2026-08-08
6
12
 
7
13
  ### Fixed
@@ -88,9 +88,11 @@ export declare const NOTIFICATION_PROTOCOL_VERSION = 3;
88
88
  * lazy native bindings for the startup-cost cut (#3846). Generation 57 clears
89
89
  * disconnect-grace-only fields whenever a topic enters an archive state, so
90
90
  * one stale session cannot make the shared registry unreadable and block every
91
- * later session from creating a topic or replaying notifications.
91
+ * later session from creating a topic or replaying notifications. Generation
92
+ * 58 preserves that invariant during durable-fence load promotion and restores
93
+ * the exact grace deadline when a failed archive publication rolls back.
92
94
  */
93
- export declare const DAEMON_GENERATION = 57;
95
+ export declare const DAEMON_GENERATION = 58;
94
96
  /**
95
97
  * Serving-compatibility boundary for daemon lifecycle requests. Epoch 5
96
98
  * requires the complete generation-36 topic authority contract, so older
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@gajae-code/coding-agent",
4
- "version": "0.12.18",
4
+ "version": "0.12.19",
5
5
  "description": "Gajae Code CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://gajae-code.com",
7
7
  "author": "Yeachan-Heo and Gajae Code Contributors",
@@ -54,13 +54,13 @@
54
54
  "@agentclientprotocol/sdk": "1.3.0",
55
55
  "@babel/parser": "^7.29.3",
56
56
  "@mozilla/readability": "^0.6.0",
57
- "@gajae-code/stats": "0.12.18",
58
- "@gajae-code/agent-core": "0.12.18",
59
- "@gajae-code/ai": "0.12.18",
60
- "@gajae-code/bridge-client": "0.12.18",
61
- "@gajae-code/natives": "0.12.18",
62
- "@gajae-code/tui": "0.12.18",
63
- "@gajae-code/utils": "0.12.18",
57
+ "@gajae-code/stats": "0.12.19",
58
+ "@gajae-code/agent-core": "0.12.19",
59
+ "@gajae-code/ai": "0.12.19",
60
+ "@gajae-code/bridge-client": "0.12.19",
61
+ "@gajae-code/natives": "0.12.19",
62
+ "@gajae-code/tui": "0.12.19",
63
+ "@gajae-code/utils": "0.12.19",
64
64
  "@puppeteer/browsers": "^2.13.0",
65
65
  "@types/turndown": "5.0.6",
66
66
  "@xterm/headless": "^6.0.0",
@@ -90,9 +90,11 @@ export const NOTIFICATION_PROTOCOL_VERSION = 3;
90
90
  * lazy native bindings for the startup-cost cut (#3846). Generation 57 clears
91
91
  * disconnect-grace-only fields whenever a topic enters an archive state, so
92
92
  * one stale session cannot make the shared registry unreadable and block every
93
- * later session from creating a topic or replaying notifications.
93
+ * later session from creating a topic or replaying notifications. Generation
94
+ * 58 preserves that invariant during durable-fence load promotion and restores
95
+ * the exact grace deadline when a failed archive publication rolls back.
94
96
  */
95
- export const DAEMON_GENERATION = 57;
97
+ export const DAEMON_GENERATION = 58;
96
98
 
97
99
  /**
98
100
  * Serving-compatibility boundary for daemon lifecycle requests. Epoch 5
@@ -578,7 +578,10 @@ export class TopicRegistry {
578
578
  : {}),
579
579
  ...(isValidBindingString(raw.archiveHostId) ? { archiveHostId: raw.archiveHostId } : {}),
580
580
  ...(isValidBindingGeneration(raw.archiveLeaseEpoch) ? { archiveLeaseEpoch: raw.archiveLeaseEpoch } : {}),
581
- ...(typeof raw.disconnectGraceExpiresAt === "number" && Number.isFinite(raw.disconnectGraceExpiresAt)
581
+ ...(raw.authorityState === "disconnect_grace" &&
582
+ !fenceSupersedesRecord &&
583
+ typeof raw.disconnectGraceExpiresAt === "number" &&
584
+ Number.isFinite(raw.disconnectGraceExpiresAt)
582
585
  ? { disconnectGraceExpiresAt: raw.disconnectGraceExpiresAt }
583
586
  : {}),
584
587
  ...(bindingMalformed ? { bindingMalformed: true as const } : {}),
@@ -1179,6 +1182,9 @@ export class TopicRegistry {
1179
1182
  } else {
1180
1183
  record.authorityEpoch = snapshot.authorityEpoch;
1181
1184
  record.authorityState = snapshot.authorityState;
1185
+ if (snapshot.authorityState === "disconnect_grace" && snapshot.record?.disconnectGraceExpiresAt !== undefined)
1186
+ record.disconnectGraceExpiresAt = snapshot.record.disconnectGraceExpiresAt;
1187
+ else delete record.disconnectGraceExpiresAt;
1182
1188
  this.rebuildInboundRoutes();
1183
1189
  }
1184
1190
  if (snapshot.fenceEpoch === undefined) this.epochs.delete(snapshot.sessionId);