@wrongstack/core 0.313.0 → 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 (182) 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 -34324
  131. package/dist/coordination/mailbox-project-server.js +48 -3276
  132. package/dist/coordination/provider-status-tracker.d.ts +4 -0
  133. package/dist/core/agent.d.ts +14 -1
  134. package/dist/core/index.js +267 -12480
  135. package/dist/core/model-ref.js +5 -23
  136. package/dist/core/provider-runner.d.ts +36 -1
  137. package/dist/design/index.js +50 -1087
  138. package/dist/execution/index.d.ts +1 -1
  139. package/dist/execution/index.js +1599 -21888
  140. package/dist/execution/prompt-enhancer.js +16 -535
  141. package/dist/execution/retry-policy.d.ts +31 -1
  142. package/dist/extension/index.js +7 -311
  143. package/dist/goal/index.js +33 -3435
  144. package/dist/hooks/index.js +14 -1138
  145. package/dist/hq/index.js +112 -5139
  146. package/dist/hq/protocol.js +21 -668
  147. package/dist/index.js +1410 -92656
  148. package/dist/infrastructure/index.js +64 -4811
  149. package/dist/kernel/events/provider-events.d.ts +15 -0
  150. package/dist/kernel/index.js +14 -992
  151. package/dist/models/index.js +40 -1117
  152. package/dist/notifications/index.js +3 -108
  153. package/dist/observability/index.js +17 -279
  154. package/dist/plugin/index.js +584 -14835
  155. package/dist/prompts/index.js +14 -948
  156. package/dist/registry/index.js +9 -822
  157. package/dist/registry-R23UBE7H.js +14 -0
  158. package/dist/replay/index.js +6 -84
  159. package/dist/review-finding-store-DKAV3AS6.js +21 -0
  160. package/dist/review-report-store-OWY3EC3N.js +19 -0
  161. package/dist/security/index.js +114 -2202
  162. package/dist/session-catalog/index.js +36 -2103
  163. package/dist/session-catalog/project-server.js +42 -1435
  164. package/dist/skills/index.js +35 -1578
  165. package/dist/storage/index.js +182 -15600
  166. package/dist/tasking/index.js +10 -676
  167. package/dist/tools/index.js +52 -9590
  168. package/dist/types/config/autonomy.d.ts +5 -0
  169. package/dist/types/config/ui.d.ts +1 -1
  170. package/dist/types/errors.d.ts +18 -0
  171. package/dist/types/index.js +121 -1342
  172. package/dist/types/provider-runner.d.ts +8 -0
  173. package/dist/types/session-markers.js +8 -144
  174. package/dist/utils/error.js +3 -4
  175. package/dist/utils/expect-defined.js +3 -9
  176. package/dist/utils/heap-watchdog.js +6 -706
  177. package/dist/utils/index.js +269 -5685
  178. package/dist/utils/sage-output-block.js +5 -42
  179. package/dist/wiring/proxy-rewrite.d.ts +18 -0
  180. package/dist/wiring/proxy-rewrite.js +18 -121
  181. package/dist/worktree/index.js +6 -887
  182. 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