@wrongstack/core 0.310.1 → 0.313.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/dist/chronicle/index.js +84 -6391
  2. package/dist/chronicle/project-server.js +84 -4868
  3. package/dist/chunk-2BUUIMQB.js +225 -0
  4. package/dist/chunk-2FK4WTFF.js +207 -0
  5. package/dist/chunk-2FQL4PDC.js +292 -0
  6. package/dist/chunk-2KKODIQU.js +2256 -0
  7. package/dist/chunk-2YU4WVBW.js +134 -0
  8. package/dist/chunk-3E244UDA.js +356 -0
  9. package/dist/chunk-3XPVB7BA.js +135 -0
  10. package/dist/chunk-4LJJYBAU.js +388 -0
  11. package/dist/chunk-4VWO3ZXL.js +342 -0
  12. package/dist/chunk-4XV6IR37.js +187 -0
  13. package/dist/chunk-4ZHTKJHM.js +183 -0
  14. package/dist/chunk-52RTVH4M.js +361 -0
  15. package/dist/chunk-57GEWK5X.js +26 -0
  16. package/dist/chunk-5DSMEVA4.js +931 -0
  17. package/dist/chunk-5RP3QTRL.js +1223 -0
  18. package/dist/chunk-5S437PRC.js +50 -0
  19. package/dist/chunk-5XDUGTKN.js +511 -0
  20. package/dist/chunk-62V2AFVG.js +422 -0
  21. package/dist/chunk-65RDIOR2.js +2470 -0
  22. package/dist/chunk-6AKOTGLM.js +597 -0
  23. package/dist/chunk-7ZHZE5EO.js +28 -0
  24. package/dist/chunk-A455ATZB.js +140 -0
  25. package/dist/chunk-AD7ZFZCS.js +46 -0
  26. package/dist/chunk-AI4LLQ2U.js +856 -0
  27. package/dist/chunk-ASX6AW36.js +789 -0
  28. package/dist/chunk-AT4V4XGI.js +3522 -0
  29. package/dist/chunk-AWNQ6ED6.js +311 -0
  30. package/dist/chunk-B4AMLZPB.js +9 -0
  31. package/dist/chunk-BAKVJLEV.js +417 -0
  32. package/dist/chunk-BJHVULHO.js +55 -0
  33. package/dist/chunk-CB2HFKTP.js +9 -0
  34. package/dist/chunk-CE4ZOCOI.js +1640 -0
  35. package/dist/chunk-CQQL4ZOQ.js +151 -0
  36. package/dist/chunk-DEIQMBD2.js +65 -0
  37. package/dist/chunk-E6I5RXVK.js +58 -0
  38. package/dist/chunk-EFEHDQGY.js +1589 -0
  39. package/dist/chunk-EODDVJBM.js +82 -0
  40. package/dist/chunk-EPC3GZD4.js +308 -0
  41. package/dist/chunk-FAYRX2AD.js +13 -0
  42. package/dist/chunk-FFSX2QDQ.js +362 -0
  43. package/dist/chunk-FHAMQS7Q.js +5856 -0
  44. package/dist/chunk-FIV4IJL7.js +2263 -0
  45. package/dist/chunk-FNXVT7HF.js +52 -0
  46. package/dist/chunk-FSWCWSTS.js +395 -0
  47. package/dist/chunk-FW5LDDMJ.js +16464 -0
  48. package/dist/chunk-FXQLIX3K.js +211 -0
  49. package/dist/chunk-G5AAKEEZ.js +228 -0
  50. package/dist/chunk-G5S3S5ZN.js +38 -0
  51. package/dist/chunk-GAZEWQEZ.js +231 -0
  52. package/dist/chunk-GFJOMSHG.js +125 -0
  53. package/dist/chunk-GFXZTHNI.js +158 -0
  54. package/dist/chunk-GM54GJBU.js +960 -0
  55. package/dist/chunk-GPQ3NJPR.js +900 -0
  56. package/dist/chunk-GTCU6DZ3.js +1 -0
  57. package/dist/chunk-H5E77KUJ.js +15 -0
  58. package/dist/chunk-H72H4XDU.js +1023 -0
  59. package/dist/chunk-HA4ZYA6T.js +178 -0
  60. package/dist/chunk-I45KAW2N.js +5020 -0
  61. package/dist/chunk-IQ35HMQL.js +1396 -0
  62. package/dist/chunk-IYFBFX34.js +86 -0
  63. package/dist/chunk-JJPMWPB6.js +109 -0
  64. package/dist/chunk-JTHKOYWU.js +663 -0
  65. package/dist/chunk-JVGPR3TS.js +365 -0
  66. package/dist/chunk-JVKB2TBL.js +48 -0
  67. package/dist/chunk-JX7VBZDK.js +31 -0
  68. package/dist/chunk-K3G6JBUC.js +5232 -0
  69. package/dist/chunk-K4YUNKU7.js +589 -0
  70. package/dist/chunk-KBZGE6LN.js +710 -0
  71. package/dist/chunk-KDQJCT2J.js +45 -0
  72. package/dist/chunk-KI4L2DUL.js +560 -0
  73. package/dist/chunk-KJ2ZTQSL.js +47 -0
  74. package/dist/chunk-KSJ5UTP7.js +154 -0
  75. package/dist/chunk-LHOA5DWA.js +28 -0
  76. package/dist/chunk-LX5QWLBL.js +27 -0
  77. package/dist/chunk-LZDDLNCZ.js +279 -0
  78. package/dist/chunk-M2WF6AXG.js +115 -0
  79. package/dist/chunk-M7BS2K6U.js +1 -0
  80. package/dist/chunk-NDBIPFNY.js +102 -0
  81. package/dist/chunk-NEMIWEXC.js +1199 -0
  82. package/dist/chunk-NFAYHPRH.js +323 -0
  83. package/dist/chunk-O37BQ65S.js +21 -0
  84. package/dist/chunk-O74MJHXU.js +187 -0
  85. package/dist/chunk-OJZEX73F.js +112 -0
  86. package/dist/chunk-PAAWLLZX.js +74 -0
  87. package/dist/chunk-PFXFQQRT.js +339 -0
  88. package/dist/chunk-PFZO3C6H.js +14 -0
  89. package/dist/chunk-PHH7LD45.js +113 -0
  90. package/dist/chunk-QRTG4XTI.js +188 -0
  91. package/dist/chunk-QVOVMXJR.js +1351 -0
  92. package/dist/chunk-RCQYT2I4.js +757 -0
  93. package/dist/chunk-RD6DEE36.js +1178 -0
  94. package/dist/chunk-RJIZEJ42.js +30 -0
  95. package/dist/chunk-RPOA7IAE.js +150 -0
  96. package/dist/chunk-SN2DQRL6.js +1172 -0
  97. package/dist/chunk-SQJVFEBV.js +41 -0
  98. package/dist/chunk-SQP64RCS.js +5391 -0
  99. package/dist/chunk-SVT4RNTR.js +49 -0
  100. package/dist/chunk-SWUFN7XM.js +43 -0
  101. package/dist/chunk-SXMVYC5H.js +174 -0
  102. package/dist/chunk-SZ6AYUIZ.js +23 -0
  103. package/dist/chunk-T3KGZBU5.js +3171 -0
  104. package/dist/chunk-TBRL2RCC.js +9 -0
  105. package/dist/chunk-TRT2HRWZ.js +18 -0
  106. package/dist/chunk-TYW2GI5I.js +1077 -0
  107. package/dist/chunk-UIWONWVG.js +4959 -0
  108. package/dist/chunk-VB3H5WWB.js +151 -0
  109. package/dist/chunk-W4A6QA3D.js +258 -0
  110. package/dist/chunk-WBPVKEEE.js +227 -0
  111. package/dist/chunk-WEBMSQP2.js +123 -0
  112. package/dist/chunk-WOEZV3Q4.js +333 -0
  113. package/dist/chunk-WQQON3SV.js +473 -0
  114. package/dist/chunk-WQTOVMGV.js +119 -0
  115. package/dist/chunk-WZO23AWO.js +2779 -0
  116. package/dist/chunk-XBDP4QPW.js +7 -0
  117. package/dist/chunk-XEBHSJLT.js +103 -0
  118. package/dist/chunk-XQ2ECNK3.js +1 -0
  119. package/dist/chunk-XQ2XGIBF.js +2086 -0
  120. package/dist/chunk-Y2GE5TSI.js +355 -0
  121. package/dist/chunk-YBUJCZ57.js +351 -0
  122. package/dist/chunk-YNCVSFGF.js +149 -0
  123. package/dist/chunk-YUPMXOGP.js +282 -0
  124. package/dist/chunk-YY6APYUM.js +49 -0
  125. package/dist/chunk-Z2IJUO45.js +691 -0
  126. package/dist/chunk-ZEHUCJHY.js +129 -0
  127. package/dist/chunk-ZYU2YOJ6.js +1496 -0
  128. package/dist/chunk-ZZ4V3WIZ.js +163 -0
  129. package/dist/coordination/agents/index.js +145 -6260
  130. package/dist/coordination/index.js +365 -34323
  131. package/dist/coordination/mailbox-project-server.js +48 -3220
  132. package/dist/coordination/mailbox-types.d.ts +13 -1
  133. package/dist/coordination/provider-status-tracker.d.ts +4 -0
  134. package/dist/coordination/sqlite-mailbox.d.ts +2 -1
  135. package/dist/core/agent.d.ts +14 -1
  136. package/dist/core/index.js +267 -12479
  137. package/dist/core/model-ref.js +5 -23
  138. package/dist/core/provider-runner.d.ts +36 -1
  139. package/dist/design/index.js +50 -1087
  140. package/dist/execution/index.d.ts +1 -1
  141. package/dist/execution/index.js +1599 -21887
  142. package/dist/execution/prompt-enhancer.js +16 -535
  143. package/dist/execution/retry-policy.d.ts +31 -1
  144. package/dist/extension/index.js +7 -311
  145. package/dist/goal/index.js +33 -3435
  146. package/dist/hooks/index.js +14 -1138
  147. package/dist/hq/index.js +112 -5139
  148. package/dist/hq/protocol.js +21 -668
  149. package/dist/index.js +1410 -92655
  150. package/dist/infrastructure/index.js +64 -4811
  151. package/dist/kernel/events/provider-events.d.ts +15 -0
  152. package/dist/kernel/events/wrongtrace-events.d.ts +26 -0
  153. package/dist/kernel/events.d.ts +16 -7
  154. package/dist/kernel/index.js +14 -992
  155. package/dist/models/index.js +40 -1117
  156. package/dist/notifications/index.js +3 -108
  157. package/dist/observability/index.js +17 -279
  158. package/dist/plugin/index.js +584 -14835
  159. package/dist/prompts/index.js +14 -948
  160. package/dist/registry/index.js +9 -822
  161. package/dist/registry-R23UBE7H.js +14 -0
  162. package/dist/replay/index.js +6 -84
  163. package/dist/review-finding-store-DKAV3AS6.js +21 -0
  164. package/dist/review-report-store-OWY3EC3N.js +19 -0
  165. package/dist/security/index.js +114 -2202
  166. package/dist/session-catalog/index.js +36 -2103
  167. package/dist/session-catalog/project-server.js +42 -1435
  168. package/dist/skills/index.js +35 -1578
  169. package/dist/storage/index.js +182 -15600
  170. package/dist/tasking/index.js +10 -676
  171. package/dist/tools/index.js +52 -9589
  172. package/dist/types/config/autonomy.d.ts +5 -0
  173. package/dist/types/config/tools.d.ts +2 -2
  174. package/dist/types/config/ui.d.ts +1 -1
  175. package/dist/types/errors.d.ts +18 -0
  176. package/dist/types/index.js +121 -1341
  177. package/dist/types/provider-runner.d.ts +8 -0
  178. package/dist/types/session-markers.js +8 -144
  179. package/dist/utils/error.js +3 -4
  180. package/dist/utils/expect-defined.js +3 -9
  181. package/dist/utils/heap-watchdog.js +6 -706
  182. package/dist/utils/index.js +269 -5685
  183. package/dist/utils/sage-output-block.js +5 -42
  184. package/dist/wiring/proxy-rewrite.d.ts +92 -4
  185. package/dist/wiring/proxy-rewrite.js +20 -61
  186. package/dist/worktree/index.js +6 -887
  187. package/package.json +4 -4
@@ -0,0 +1,361 @@
1
+ import {
2
+ SESSION_CATALOG_MAX_FRAME_CHARS,
3
+ SESSION_CATALOG_PROTOCOL_VERSION,
4
+ encodeSessionCatalogMessage,
5
+ sessionCatalogProjectServerEndpoint,
6
+ sessionCatalogProjectServerMetadataPath
7
+ } from "./chunk-E6I5RXVK.js";
8
+
9
+ // src/session-catalog/client.ts
10
+ import { spawn } from "node:child_process";
11
+ import * as fs from "node:fs";
12
+ import * as net from "node:net";
13
+ import * as path from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+ var CONNECT_TIMEOUT_MS = 750;
16
+ var START_TIMEOUT_MS = 1e4;
17
+ var CALL_TIMEOUT_MS = 3e4;
18
+ var MAX_PENDING_REQUESTS = 1024;
19
+ var MAX_EVENT_LISTENERS = 64;
20
+ function locateServer(moduleUrl, exists) {
21
+ for (const candidate of [
22
+ "./project-server.js",
23
+ "../session-catalog/project-server.js",
24
+ "./session-catalog/project-server.js",
25
+ "../../dist/session-catalog/project-server.js"
26
+ ]) {
27
+ try {
28
+ const url = new URL(candidate, moduleUrl);
29
+ if (url.protocol === "file:" && exists(fileURLToPath(url))) return url;
30
+ } catch {
31
+ }
32
+ }
33
+ return null;
34
+ }
35
+ function resolveSessionCatalogDaemonAvailability(moduleUrl = import.meta.url, exists = fs.existsSync) {
36
+ if (process.env["WRONGSTACK_SESSION_CATALOG_INLINE"] || process.env["WRONGSTACK_SESSION_CATALOG_SERVER"] === "0")
37
+ return { kind: "inline-requested" };
38
+ const url = locateServer(moduleUrl, exists);
39
+ return url ? { kind: "available", url } : { kind: "missing-build" };
40
+ }
41
+ function resolveSessionCatalogProjectServerUrl(moduleUrl = import.meta.url, exists = fs.existsSync) {
42
+ const availability = resolveSessionCatalogDaemonAvailability(moduleUrl, exists);
43
+ return availability.kind === "available" ? availability.url : null;
44
+ }
45
+ function normalize(value) {
46
+ const resolved = path.resolve(value);
47
+ return process.platform === "win32" ? resolved.toLowerCase() : resolved;
48
+ }
49
+ function delay(ms) {
50
+ return new Promise((resolve2) => setTimeout(resolve2, ms));
51
+ }
52
+ var SessionCatalogProjectClient = class {
53
+ constructor(options) {
54
+ this.options = options;
55
+ this.endpoint = sessionCatalogProjectServerEndpoint(options.projectDir);
56
+ }
57
+ options;
58
+ endpoint;
59
+ socket = null;
60
+ info = null;
61
+ buffer = "";
62
+ connecting = null;
63
+ connectResolve = null;
64
+ connectReject = null;
65
+ authToken;
66
+ nextId = 1;
67
+ pending = /* @__PURE__ */ new Map();
68
+ eventListeners = /* @__PURE__ */ new Set();
69
+ reconnectTimer;
70
+ explicitlyClosed = false;
71
+ async call(op, args, options = {}) {
72
+ await this.ensureConnected(true);
73
+ return this.request({ type: "request", op, args }, options.timeoutMs ?? CALL_TIMEOUT_MS);
74
+ }
75
+ /**
76
+ * Call an already-running project daemon without starting one.
77
+ *
78
+ * Cross-project discovery must use this path: observing another project is
79
+ * never sufficient authority to wake that project's IPC owner.
80
+ */
81
+ async callExisting(op, args, options = {}) {
82
+ await this.ensureConnected(false);
83
+ return this.request({ type: "request", op, args }, options.timeoutMs ?? CALL_TIMEOUT_MS);
84
+ }
85
+ ping() {
86
+ return this.call("ping", {}, { timeoutMs: 3e3 });
87
+ }
88
+ async subscribe(listener) {
89
+ if (!this.eventListeners.has(listener) && this.eventListeners.size >= MAX_EVENT_LISTENERS) {
90
+ throw new Error(`Session Catalog listener limit reached (${MAX_EVENT_LISTENERS})`);
91
+ }
92
+ this.explicitlyClosed = false;
93
+ this.eventListeners.add(listener);
94
+ try {
95
+ await this.call("subscribe", {});
96
+ } catch (error) {
97
+ this.eventListeners.delete(listener);
98
+ throw error;
99
+ }
100
+ return async () => {
101
+ this.eventListeners.delete(listener);
102
+ if (this.eventListeners.size === 0)
103
+ await this.callExisting("unsubscribe", {}).catch(() => void 0);
104
+ };
105
+ }
106
+ async shutdown(reason) {
107
+ try {
108
+ await this.ensureConnected(false);
109
+ } catch {
110
+ return { stopped: false };
111
+ }
112
+ const result = await this.request({ type: "shutdown", ...reason !== void 0 ? { reason } : {} }, 5e3).catch(
113
+ () => ({ stopped: false })
114
+ );
115
+ if (result.stopped) {
116
+ const metadataPath = sessionCatalogProjectServerMetadataPath(this.options.projectDir);
117
+ const deadline = Date.now() + 5e3;
118
+ while (fs.existsSync(metadataPath) && Date.now() < deadline) await delay(20);
119
+ if (result.pid && result.pid !== process.pid) {
120
+ while (Date.now() < deadline) {
121
+ try {
122
+ process.kill(result.pid, 0);
123
+ await delay(20);
124
+ } catch {
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ return result;
131
+ }
132
+ async close() {
133
+ this.explicitlyClosed = true;
134
+ if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
135
+ this.reconnectTimer = void 0;
136
+ const socket = this.socket;
137
+ this.socket = null;
138
+ this.info = null;
139
+ if (socket && !socket.destroyed)
140
+ await new Promise((resolve2) => {
141
+ socket.once("close", resolve2);
142
+ socket.end();
143
+ });
144
+ }
145
+ async ensureConnected(spawnIfMissing) {
146
+ if (this.socket && !this.socket.destroyed && this.info) return;
147
+ if (this.connecting) return this.connecting;
148
+ this.connecting = this.connectWithElection(spawnIfMissing).finally(() => {
149
+ this.connecting = null;
150
+ });
151
+ return this.connecting;
152
+ }
153
+ async connectWithElection(spawnIfMissing) {
154
+ const deadline = Date.now() + (spawnIfMissing ? START_TIMEOUT_MS : CONNECT_TIMEOUT_MS);
155
+ let spawned = false;
156
+ let lastError = new Error("Session Catalog project server unavailable");
157
+ while (Date.now() < deadline) {
158
+ try {
159
+ await this.connectOnce();
160
+ return;
161
+ } catch (error) {
162
+ lastError = error;
163
+ }
164
+ if (!spawnIfMissing) break;
165
+ if (!spawned) {
166
+ this.spawnDetached();
167
+ spawned = true;
168
+ }
169
+ await delay(75);
170
+ }
171
+ throw lastError;
172
+ }
173
+ connectOnce() {
174
+ this.socket?.destroy();
175
+ this.socket = null;
176
+ this.info = null;
177
+ this.authToken = void 0;
178
+ this.buffer = "";
179
+ return new Promise((resolve2, reject) => {
180
+ const socket = net.createConnection(this.endpoint);
181
+ this.socket = socket;
182
+ socket.setEncoding("utf8");
183
+ const timer = setTimeout(() => {
184
+ reject(new Error("Session Catalog handshake timed out"));
185
+ socket.destroy();
186
+ }, CONNECT_TIMEOUT_MS);
187
+ timer.unref?.();
188
+ this.connectResolve = () => {
189
+ clearTimeout(timer);
190
+ this.connectResolve = null;
191
+ this.connectReject = null;
192
+ resolve2();
193
+ };
194
+ this.connectReject = (error) => {
195
+ clearTimeout(timer);
196
+ this.connectResolve = null;
197
+ this.connectReject = null;
198
+ reject(error);
199
+ };
200
+ socket.on("data", (chunk) => this.onData(socket, chunk));
201
+ socket.on("error", (error) => {
202
+ if (!this.info) this.connectReject?.(error);
203
+ });
204
+ socket.on("close", () => this.onClose(socket));
205
+ });
206
+ }
207
+ currentAuthToken() {
208
+ if (this.authToken === void 0) {
209
+ try {
210
+ const parsed = JSON.parse(
211
+ fs.readFileSync(sessionCatalogProjectServerMetadataPath(this.options.projectDir), "utf8")
212
+ );
213
+ if (typeof parsed.authToken === "string" && parsed.authToken)
214
+ this.authToken = parsed.authToken;
215
+ } catch {
216
+ }
217
+ }
218
+ return this.authToken;
219
+ }
220
+ request(message, timeoutMs) {
221
+ const socket = this.socket;
222
+ if (!socket || socket.destroyed)
223
+ return Promise.reject(new Error("Session Catalog connection is unavailable"));
224
+ const id = this.nextId++;
225
+ if (this.pending.size >= MAX_PENDING_REQUESTS) {
226
+ return Promise.reject(
227
+ new Error(`Session Catalog pending request limit reached (${MAX_PENDING_REQUESTS})`)
228
+ );
229
+ }
230
+ const encoded = encodeSessionCatalogMessage({
231
+ ...message,
232
+ id,
233
+ authToken: this.currentAuthToken()
234
+ });
235
+ if (encoded.length > SESSION_CATALOG_MAX_FRAME_CHARS)
236
+ return Promise.reject(new Error("Session Catalog request exceeded frame limit"));
237
+ return new Promise((resolve2, reject) => {
238
+ const timer = setTimeout(() => {
239
+ const pending = this.pending.get(id);
240
+ if (!pending) return;
241
+ this.pending.delete(id);
242
+ pending.reject(
243
+ new Error(
244
+ `Session Catalog ${message.type === "request" ? message.op : message.type} timed out`
245
+ )
246
+ );
247
+ }, timeoutMs);
248
+ timer.unref?.();
249
+ this.pending.set(id, { resolve: resolve2, reject, timer });
250
+ socket.write(encoded);
251
+ });
252
+ }
253
+ onData(socket, chunk) {
254
+ if (socket !== this.socket) return;
255
+ this.buffer += chunk;
256
+ if (this.buffer.length > SESSION_CATALOG_MAX_FRAME_CHARS) {
257
+ socket.destroy(new Error("Session Catalog response exceeded frame limit"));
258
+ return;
259
+ }
260
+ while (true) {
261
+ const newline = this.buffer.indexOf("\n");
262
+ if (newline < 0) return;
263
+ const line = this.buffer.slice(0, newline);
264
+ this.buffer = this.buffer.slice(newline + 1);
265
+ if (!line) continue;
266
+ try {
267
+ this.onMessage(JSON.parse(line));
268
+ } catch {
269
+ socket.destroy(new Error("Invalid Session Catalog response"));
270
+ return;
271
+ }
272
+ }
273
+ }
274
+ onMessage(message) {
275
+ if (message.type === "hello") {
276
+ if (message.protocolVersion !== SESSION_CATALOG_PROTOCOL_VERSION) {
277
+ this.connectReject?.(
278
+ new Error(
279
+ `Session Catalog protocol mismatch: client=${SESSION_CATALOG_PROTOCOL_VERSION}, server=${message.protocolVersion}`
280
+ )
281
+ );
282
+ this.socket?.destroy();
283
+ return;
284
+ }
285
+ if (normalize(message.projectDir) !== normalize(this.options.projectDir) || normalize(message.projectRoot) !== normalize(this.options.projectRoot)) {
286
+ this.connectReject?.(new Error("Session Catalog project identity mismatch"));
287
+ this.socket?.destroy();
288
+ return;
289
+ }
290
+ this.info = message;
291
+ this.connectResolve?.();
292
+ return;
293
+ }
294
+ if (message.type === "event") {
295
+ for (const listener of this.eventListeners) {
296
+ try {
297
+ listener(message.event);
298
+ } catch {
299
+ }
300
+ }
301
+ return;
302
+ }
303
+ const pending = this.pending.get(message.id);
304
+ if (!pending) return;
305
+ this.pending.delete(message.id);
306
+ clearTimeout(pending.timer);
307
+ if (message.ok) pending.resolve(message.result);
308
+ else {
309
+ const error = new Error(message.error);
310
+ if (message.errorName) error.name = message.errorName;
311
+ pending.reject(error);
312
+ }
313
+ }
314
+ onClose(socket) {
315
+ if (socket !== this.socket) return;
316
+ this.socket = null;
317
+ this.info = null;
318
+ this.authToken = void 0;
319
+ const error = new Error("Session Catalog connection closed");
320
+ this.connectReject?.(error);
321
+ this.connectResolve = null;
322
+ this.connectReject = null;
323
+ for (const pending of this.pending.values()) {
324
+ clearTimeout(pending.timer);
325
+ pending.reject(error);
326
+ }
327
+ this.pending.clear();
328
+ this.scheduleSubscriptionReconnect();
329
+ }
330
+ scheduleSubscriptionReconnect() {
331
+ if (this.explicitlyClosed || this.eventListeners.size === 0 || this.reconnectTimer) return;
332
+ this.reconnectTimer = setTimeout(() => {
333
+ this.reconnectTimer = void 0;
334
+ void this.call("subscribe", {}).catch(() => this.scheduleSubscriptionReconnect());
335
+ }, 250);
336
+ this.reconnectTimer.unref?.();
337
+ }
338
+ spawnDetached() {
339
+ const url = resolveSessionCatalogProjectServerUrl();
340
+ if (!url) throw new Error("Built Session Catalog project server is unavailable");
341
+ const child = spawn(
342
+ process.execPath,
343
+ [
344
+ fileURLToPath(url),
345
+ "--project-dir",
346
+ this.options.projectDir,
347
+ "--project-root",
348
+ this.options.projectRoot
349
+ ],
350
+ { detached: true, stdio: "ignore", windowsHide: true, env: process.env }
351
+ );
352
+ child.unref();
353
+ }
354
+ };
355
+
356
+ export {
357
+ resolveSessionCatalogDaemonAvailability,
358
+ resolveSessionCatalogProjectServerUrl,
359
+ SessionCatalogProjectClient
360
+ };
361
+ //# sourceMappingURL=chunk-52RTVH4M.js.map
@@ -0,0 +1,26 @@
1
+ // src/types/memory.ts
2
+ var MEMORY_TYPE_LABELS = {
3
+ fact: "Fact",
4
+ decision: "Decision",
5
+ convention: "Convention",
6
+ preference: "Preference",
7
+ reference: "Reference",
8
+ anti_pattern: "Anti-pattern"
9
+ };
10
+ function defineMemoryCapability(id) {
11
+ return Object.freeze({
12
+ id,
13
+ /** Identity function that makes the brand a real runtime value so
14
+ * `defineMemoryCapability<A>('x')` and `defineMemoryCapability<B>('x')`
15
+ * produce structurally distinct objects. Capability lookup is still
16
+ * keyed by `id` only — the brand prevents accidental cross-type casts
17
+ * at the type level. */
18
+ __memoryCapabilityType: (v) => v
19
+ });
20
+ }
21
+
22
+ export {
23
+ MEMORY_TYPE_LABELS,
24
+ defineMemoryCapability
25
+ };
26
+ //# sourceMappingURL=chunk-57GEWK5X.js.map