@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.
- package/dist/chronicle/index.js +84 -6391
- package/dist/chronicle/project-server.js +84 -4868
- package/dist/chunk-2BUUIMQB.js +225 -0
- package/dist/chunk-2FK4WTFF.js +207 -0
- package/dist/chunk-2FQL4PDC.js +292 -0
- package/dist/chunk-2KKODIQU.js +2256 -0
- package/dist/chunk-2YU4WVBW.js +134 -0
- package/dist/chunk-3E244UDA.js +356 -0
- package/dist/chunk-3XPVB7BA.js +135 -0
- package/dist/chunk-4LJJYBAU.js +388 -0
- package/dist/chunk-4VWO3ZXL.js +342 -0
- package/dist/chunk-4XV6IR37.js +187 -0
- package/dist/chunk-4ZHTKJHM.js +183 -0
- package/dist/chunk-52RTVH4M.js +361 -0
- package/dist/chunk-57GEWK5X.js +26 -0
- package/dist/chunk-5DSMEVA4.js +931 -0
- package/dist/chunk-5RP3QTRL.js +1223 -0
- package/dist/chunk-5S437PRC.js +50 -0
- package/dist/chunk-5XDUGTKN.js +511 -0
- package/dist/chunk-62V2AFVG.js +422 -0
- package/dist/chunk-65RDIOR2.js +2470 -0
- package/dist/chunk-6AKOTGLM.js +597 -0
- package/dist/chunk-7ZHZE5EO.js +28 -0
- package/dist/chunk-A455ATZB.js +140 -0
- package/dist/chunk-AD7ZFZCS.js +46 -0
- package/dist/chunk-AI4LLQ2U.js +856 -0
- package/dist/chunk-ASX6AW36.js +789 -0
- package/dist/chunk-AT4V4XGI.js +3522 -0
- package/dist/chunk-AWNQ6ED6.js +311 -0
- package/dist/chunk-B4AMLZPB.js +9 -0
- package/dist/chunk-BAKVJLEV.js +417 -0
- package/dist/chunk-BJHVULHO.js +55 -0
- package/dist/chunk-CB2HFKTP.js +9 -0
- package/dist/chunk-CE4ZOCOI.js +1640 -0
- package/dist/chunk-CQQL4ZOQ.js +151 -0
- package/dist/chunk-DEIQMBD2.js +65 -0
- package/dist/chunk-E6I5RXVK.js +58 -0
- package/dist/chunk-EFEHDQGY.js +1589 -0
- package/dist/chunk-EODDVJBM.js +82 -0
- package/dist/chunk-EPC3GZD4.js +308 -0
- package/dist/chunk-FAYRX2AD.js +13 -0
- package/dist/chunk-FFSX2QDQ.js +362 -0
- package/dist/chunk-FHAMQS7Q.js +5856 -0
- package/dist/chunk-FIV4IJL7.js +2263 -0
- package/dist/chunk-FNXVT7HF.js +52 -0
- package/dist/chunk-FSWCWSTS.js +395 -0
- package/dist/chunk-FW5LDDMJ.js +16464 -0
- package/dist/chunk-FXQLIX3K.js +211 -0
- package/dist/chunk-G5AAKEEZ.js +228 -0
- package/dist/chunk-G5S3S5ZN.js +38 -0
- package/dist/chunk-GAZEWQEZ.js +231 -0
- package/dist/chunk-GFJOMSHG.js +125 -0
- package/dist/chunk-GFXZTHNI.js +158 -0
- package/dist/chunk-GM54GJBU.js +960 -0
- package/dist/chunk-GPQ3NJPR.js +900 -0
- package/dist/chunk-GTCU6DZ3.js +1 -0
- package/dist/chunk-H5E77KUJ.js +15 -0
- package/dist/chunk-H72H4XDU.js +1023 -0
- package/dist/chunk-HA4ZYA6T.js +178 -0
- package/dist/chunk-I45KAW2N.js +5020 -0
- package/dist/chunk-IQ35HMQL.js +1396 -0
- package/dist/chunk-IYFBFX34.js +86 -0
- package/dist/chunk-JJPMWPB6.js +109 -0
- package/dist/chunk-JTHKOYWU.js +663 -0
- package/dist/chunk-JVGPR3TS.js +365 -0
- package/dist/chunk-JVKB2TBL.js +48 -0
- package/dist/chunk-JX7VBZDK.js +31 -0
- package/dist/chunk-K3G6JBUC.js +5232 -0
- package/dist/chunk-K4YUNKU7.js +589 -0
- package/dist/chunk-KBZGE6LN.js +710 -0
- package/dist/chunk-KDQJCT2J.js +45 -0
- package/dist/chunk-KI4L2DUL.js +560 -0
- package/dist/chunk-KJ2ZTQSL.js +47 -0
- package/dist/chunk-KSJ5UTP7.js +154 -0
- package/dist/chunk-LHOA5DWA.js +28 -0
- package/dist/chunk-LX5QWLBL.js +27 -0
- package/dist/chunk-LZDDLNCZ.js +279 -0
- package/dist/chunk-M2WF6AXG.js +115 -0
- package/dist/chunk-M7BS2K6U.js +1 -0
- package/dist/chunk-NDBIPFNY.js +102 -0
- package/dist/chunk-NEMIWEXC.js +1199 -0
- package/dist/chunk-NFAYHPRH.js +323 -0
- package/dist/chunk-O37BQ65S.js +21 -0
- package/dist/chunk-O74MJHXU.js +187 -0
- package/dist/chunk-OJZEX73F.js +112 -0
- package/dist/chunk-PAAWLLZX.js +74 -0
- package/dist/chunk-PFXFQQRT.js +339 -0
- package/dist/chunk-PFZO3C6H.js +14 -0
- package/dist/chunk-PHH7LD45.js +113 -0
- package/dist/chunk-QRTG4XTI.js +188 -0
- package/dist/chunk-QVOVMXJR.js +1351 -0
- package/dist/chunk-RCQYT2I4.js +757 -0
- package/dist/chunk-RD6DEE36.js +1178 -0
- package/dist/chunk-RJIZEJ42.js +30 -0
- package/dist/chunk-RPOA7IAE.js +150 -0
- package/dist/chunk-SN2DQRL6.js +1172 -0
- package/dist/chunk-SQJVFEBV.js +41 -0
- package/dist/chunk-SQP64RCS.js +5391 -0
- package/dist/chunk-SVT4RNTR.js +49 -0
- package/dist/chunk-SWUFN7XM.js +43 -0
- package/dist/chunk-SXMVYC5H.js +174 -0
- package/dist/chunk-SZ6AYUIZ.js +23 -0
- package/dist/chunk-T3KGZBU5.js +3171 -0
- package/dist/chunk-TBRL2RCC.js +9 -0
- package/dist/chunk-TRT2HRWZ.js +18 -0
- package/dist/chunk-TYW2GI5I.js +1077 -0
- package/dist/chunk-UIWONWVG.js +4959 -0
- package/dist/chunk-VB3H5WWB.js +151 -0
- package/dist/chunk-W4A6QA3D.js +258 -0
- package/dist/chunk-WBPVKEEE.js +227 -0
- package/dist/chunk-WEBMSQP2.js +123 -0
- package/dist/chunk-WOEZV3Q4.js +333 -0
- package/dist/chunk-WQQON3SV.js +473 -0
- package/dist/chunk-WQTOVMGV.js +119 -0
- package/dist/chunk-WZO23AWO.js +2779 -0
- package/dist/chunk-XBDP4QPW.js +7 -0
- package/dist/chunk-XEBHSJLT.js +103 -0
- package/dist/chunk-XQ2ECNK3.js +1 -0
- package/dist/chunk-XQ2XGIBF.js +2086 -0
- package/dist/chunk-Y2GE5TSI.js +355 -0
- package/dist/chunk-YBUJCZ57.js +351 -0
- package/dist/chunk-YNCVSFGF.js +149 -0
- package/dist/chunk-YUPMXOGP.js +282 -0
- package/dist/chunk-YY6APYUM.js +49 -0
- package/dist/chunk-Z2IJUO45.js +691 -0
- package/dist/chunk-ZEHUCJHY.js +129 -0
- package/dist/chunk-ZYU2YOJ6.js +1496 -0
- package/dist/chunk-ZZ4V3WIZ.js +163 -0
- package/dist/coordination/agents/index.js +145 -6260
- package/dist/coordination/index.js +365 -34323
- package/dist/coordination/mailbox-project-server.js +48 -3220
- package/dist/coordination/mailbox-types.d.ts +13 -1
- package/dist/coordination/provider-status-tracker.d.ts +4 -0
- package/dist/coordination/sqlite-mailbox.d.ts +2 -1
- package/dist/core/agent.d.ts +14 -1
- package/dist/core/index.js +267 -12479
- package/dist/core/model-ref.js +5 -23
- package/dist/core/provider-runner.d.ts +36 -1
- package/dist/design/index.js +50 -1087
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/index.js +1599 -21887
- package/dist/execution/prompt-enhancer.js +16 -535
- package/dist/execution/retry-policy.d.ts +31 -1
- package/dist/extension/index.js +7 -311
- package/dist/goal/index.js +33 -3435
- package/dist/hooks/index.js +14 -1138
- package/dist/hq/index.js +112 -5139
- package/dist/hq/protocol.js +21 -668
- package/dist/index.js +1410 -92655
- package/dist/infrastructure/index.js +64 -4811
- package/dist/kernel/events/provider-events.d.ts +15 -0
- package/dist/kernel/events/wrongtrace-events.d.ts +26 -0
- package/dist/kernel/events.d.ts +16 -7
- package/dist/kernel/index.js +14 -992
- package/dist/models/index.js +40 -1117
- package/dist/notifications/index.js +3 -108
- package/dist/observability/index.js +17 -279
- package/dist/plugin/index.js +584 -14835
- package/dist/prompts/index.js +14 -948
- package/dist/registry/index.js +9 -822
- package/dist/registry-R23UBE7H.js +14 -0
- package/dist/replay/index.js +6 -84
- package/dist/review-finding-store-DKAV3AS6.js +21 -0
- package/dist/review-report-store-OWY3EC3N.js +19 -0
- package/dist/security/index.js +114 -2202
- package/dist/session-catalog/index.js +36 -2103
- package/dist/session-catalog/project-server.js +42 -1435
- package/dist/skills/index.js +35 -1578
- package/dist/storage/index.js +182 -15600
- package/dist/tasking/index.js +10 -676
- package/dist/tools/index.js +52 -9589
- package/dist/types/config/autonomy.d.ts +5 -0
- package/dist/types/config/tools.d.ts +2 -2
- package/dist/types/config/ui.d.ts +1 -1
- package/dist/types/errors.d.ts +18 -0
- package/dist/types/index.js +121 -1341
- package/dist/types/provider-runner.d.ts +8 -0
- package/dist/types/session-markers.js +8 -144
- package/dist/utils/error.js +3 -4
- package/dist/utils/expect-defined.js +3 -9
- package/dist/utils/heap-watchdog.js +6 -706
- package/dist/utils/index.js +269 -5685
- package/dist/utils/sage-output-block.js +5 -42
- package/dist/wiring/proxy-rewrite.d.ts +92 -4
- package/dist/wiring/proxy-rewrite.js +20 -61
- package/dist/worktree/index.js +6 -887
- 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
|