@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,362 @@
1
+ import {
2
+ FORBIDDEN_PROTO_KEYS
3
+ } from "./chunk-DEIQMBD2.js";
4
+ import {
5
+ atomicWrite
6
+ } from "./chunk-7ZHZE5EO.js";
7
+
8
+ // src/utils/config-json.ts
9
+ import * as fs from "node:fs/promises";
10
+ async function readJsonObjectFile(filePath) {
11
+ try {
12
+ const parsed = JSON.parse(await fs.readFile(filePath, "utf8"));
13
+ return isJsonObject(parsed) ? parsed : {};
14
+ } catch {
15
+ return {};
16
+ }
17
+ }
18
+ async function jsonObjectFileExists(filePath) {
19
+ try {
20
+ await fs.access(filePath);
21
+ return true;
22
+ } catch {
23
+ return false;
24
+ }
25
+ }
26
+ async function writeJsonObjectFile(filePath, value) {
27
+ await atomicWrite(filePath, JSON.stringify(value, null, 2), { mode: 384 });
28
+ }
29
+ async function updateJsonObjectFile(filePath, mutator) {
30
+ const config = await readJsonObjectFile(filePath);
31
+ const maybeNext = await mutator(config);
32
+ const next = maybeNext && isJsonObject(maybeNext) ? maybeNext : config;
33
+ await writeJsonObjectFile(filePath, next);
34
+ return next;
35
+ }
36
+ function isForbiddenSegment(segment) {
37
+ return typeof segment === "string" && FORBIDDEN_PROTO_KEYS.has(segment);
38
+ }
39
+ function assertSafePath(path) {
40
+ for (const segment of path) {
41
+ if (isForbiddenSegment(segment)) {
42
+ throw new Error(`Refusing to use reserved key "${String(segment)}" in a JSON path`);
43
+ }
44
+ }
45
+ }
46
+ function getJsonPath(root, path) {
47
+ if (path.some(isForbiddenSegment)) return void 0;
48
+ let current = root;
49
+ for (const segment of path) {
50
+ if (typeof segment === "number") {
51
+ if (!Array.isArray(current)) return void 0;
52
+ current = current[segment];
53
+ continue;
54
+ }
55
+ if (!isJsonObject(current)) return void 0;
56
+ current = current[segment];
57
+ }
58
+ return current;
59
+ }
60
+ function setJsonPath(root, path, value) {
61
+ assertSafePath(path);
62
+ if (path.length === 0) {
63
+ if (!isJsonObject(value)) throw new Error("Root config value must be an object");
64
+ return value;
65
+ }
66
+ const parent = ensureJsonParent(root, path);
67
+ const leaf = lastPathSegment(path);
68
+ if (typeof leaf === "number") {
69
+ if (!Array.isArray(parent))
70
+ throw new Error(`Cannot set numeric segment ${leaf} on non-array parent`);
71
+ parent[leaf] = value;
72
+ } else {
73
+ if (!isJsonObject(parent)) throw new Error(`Cannot set property ${leaf} on non-object parent`);
74
+ parent[leaf] = value;
75
+ }
76
+ return root;
77
+ }
78
+ function removeJsonPath(root, path) {
79
+ if (path.some(isForbiddenSegment)) return false;
80
+ if (path.length === 0) return false;
81
+ const parent = getJsonPath(root, path.slice(0, -1));
82
+ const leaf = lastPathSegment(path);
83
+ if (typeof leaf === "number") {
84
+ if (!Array.isArray(parent) || leaf < 0 || leaf >= parent.length) return false;
85
+ parent.splice(leaf, 1);
86
+ return true;
87
+ }
88
+ if (!isJsonObject(parent) || !(leaf in parent)) return false;
89
+ delete parent[leaf];
90
+ return true;
91
+ }
92
+ async function setJsonPathInFile(filePath, path, value) {
93
+ return updateJsonObjectFile(filePath, (config) => setJsonPath(config, path, value));
94
+ }
95
+ async function removeJsonPathInFile(filePath, path) {
96
+ return updateJsonObjectFile(filePath, (config) => {
97
+ removeJsonPath(config, path);
98
+ });
99
+ }
100
+ function isJsonObject(value) {
101
+ return typeof value === "object" && value !== null && !Array.isArray(value);
102
+ }
103
+ function lastPathSegment(path) {
104
+ const segment = path[path.length - 1];
105
+ if (segment === void 0) throw new Error("Invalid empty JSON path");
106
+ return segment;
107
+ }
108
+ function ensureJsonParent(root, path) {
109
+ assertSafePath(path);
110
+ let current = root;
111
+ for (let i = 0; i < path.length - 1; i += 1) {
112
+ const segment = path[i];
113
+ const nextSegment = path[i + 1];
114
+ if (segment === void 0) throw new Error("Invalid empty JSON path segment");
115
+ const nextContainer = typeof nextSegment === "number" ? [] : {};
116
+ if (typeof segment === "number") {
117
+ if (!Array.isArray(current))
118
+ throw new Error(`Cannot traverse numeric segment ${segment} on non-array parent`);
119
+ if (!isJsonObject(current[segment]) && !Array.isArray(current[segment]))
120
+ current[segment] = nextContainer;
121
+ current = current[segment];
122
+ } else {
123
+ if (!isJsonObject(current))
124
+ throw new Error(`Cannot traverse property ${segment} on non-object parent`);
125
+ if (!isJsonObject(current[segment]) && !Array.isArray(current[segment]))
126
+ current[segment] = nextContainer;
127
+ current = current[segment];
128
+ }
129
+ }
130
+ return current;
131
+ }
132
+
133
+ // src/utils/json-schema-validate.ts
134
+ function validateAgainstSchema(value, schema) {
135
+ const errors = [];
136
+ walk(value, schema, "", errors, 0);
137
+ return { ok: errors.length === 0, errors };
138
+ }
139
+ var MAX_SCHEMA_DEPTH = 64;
140
+ function walk(value, schema, path, errors, depth) {
141
+ if (depth > MAX_SCHEMA_DEPTH) {
142
+ errors.push({
143
+ path: path || "<root>",
144
+ message: `schema nesting exceeds maximum depth (${MAX_SCHEMA_DEPTH})`
145
+ });
146
+ return;
147
+ }
148
+ if (schema.enum !== void 0) {
149
+ if (!enumIncludes(schema.enum, value)) {
150
+ errors.push({
151
+ path: path || "<root>",
152
+ message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`
153
+ });
154
+ return;
155
+ }
156
+ }
157
+ if (typeof schema.type === "string") {
158
+ if (!checkType(value, schema.type)) {
159
+ errors.push({
160
+ path: path || "<root>",
161
+ message: `expected ${schema.type}, got ${describeType(value)} (${previewValue(value)})`
162
+ });
163
+ return;
164
+ }
165
+ }
166
+ if (schema.type === "object" && isPlainObject(value)) {
167
+ const obj = value;
168
+ for (const req of schema.required ?? []) {
169
+ if (!(req in obj)) {
170
+ const expected = schema.properties?.[req]?.type;
171
+ errors.push({
172
+ path: joinPath(path, req),
173
+ message: `required property missing${typeof expected === "string" ? ` (expected ${expected})` : ""}`
174
+ });
175
+ }
176
+ }
177
+ if (schema.properties) {
178
+ for (const [key, subSchema] of Object.entries(schema.properties)) {
179
+ if (key in obj) {
180
+ walk(obj[key], subSchema, joinPath(path, key), errors, depth + 1);
181
+ }
182
+ }
183
+ }
184
+ }
185
+ if (schema.type === "array" && Array.isArray(value) && schema.items) {
186
+ for (let i = 0; i < value.length; i++) {
187
+ walk(value[i], schema.items, `${path}[${i}]`, errors, depth + 1);
188
+ }
189
+ }
190
+ }
191
+ function coerceAgainstSchema(value, schema) {
192
+ return coerceWalk(value, schema, 0);
193
+ }
194
+ function coerceWalk(value, schema, depth) {
195
+ if (depth > MAX_SCHEMA_DEPTH) return { value, changed: false };
196
+ const type = typeof schema.type === "string" ? schema.type : void 0;
197
+ if (type && !checkType(value, type)) {
198
+ if (type === "string" && (typeof value === "number" || typeof value === "boolean")) {
199
+ return { value: String(value), changed: true };
200
+ }
201
+ if ((type === "number" || type === "integer") && typeof value === "string") {
202
+ const trimmed = value.trim();
203
+ if (trimmed !== "" && /^-?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(trimmed)) {
204
+ const num = Number(trimmed);
205
+ if (!Number.isNaN(num) && (type === "number" || Number.isInteger(num))) {
206
+ return { value: num, changed: true };
207
+ }
208
+ }
209
+ return { value, changed: false };
210
+ }
211
+ if (type === "boolean" && typeof value === "string") {
212
+ const lowered = value.trim().toLowerCase();
213
+ if (lowered === "true") return { value: true, changed: true };
214
+ if (lowered === "false") return { value: false, changed: true };
215
+ return { value, changed: false };
216
+ }
217
+ if ((type === "object" || type === "array") && typeof value === "string") {
218
+ try {
219
+ const parsed = JSON.parse(value);
220
+ if (checkType(parsed, type)) {
221
+ return { value: coerceWalk(parsed, schema, depth + 1).value, changed: true };
222
+ }
223
+ } catch {
224
+ }
225
+ return { value, changed: false };
226
+ }
227
+ return { value, changed: false };
228
+ }
229
+ if (type === "object" && isPlainObject(value) && schema.properties) {
230
+ const obj = value;
231
+ let changed = false;
232
+ const out = { ...obj };
233
+ for (const [key, subSchema] of Object.entries(schema.properties)) {
234
+ if (!(key in obj)) continue;
235
+ const r = coerceWalk(obj[key], subSchema, depth + 1);
236
+ if (r.changed) {
237
+ out[key] = r.value;
238
+ changed = true;
239
+ }
240
+ }
241
+ return changed ? { value: out, changed } : { value, changed: false };
242
+ }
243
+ if (type === "array" && Array.isArray(value) && schema.items) {
244
+ let changed = false;
245
+ const out = value.map((item) => {
246
+ const r = coerceWalk(item, schema.items, depth + 1);
247
+ if (r.changed) changed = true;
248
+ return r.value;
249
+ });
250
+ return changed ? { value: out, changed } : { value, changed: false };
251
+ }
252
+ return { value, changed: false };
253
+ }
254
+ function checkType(value, type) {
255
+ switch (type) {
256
+ case "string":
257
+ return typeof value === "string";
258
+ case "number":
259
+ return typeof value === "number" && !Number.isNaN(value);
260
+ case "integer":
261
+ return typeof value === "number" && Number.isInteger(value);
262
+ case "boolean":
263
+ return typeof value === "boolean";
264
+ case "null":
265
+ return value === null;
266
+ case "array":
267
+ return Array.isArray(value);
268
+ case "object":
269
+ return isPlainObject(value);
270
+ default:
271
+ return true;
272
+ }
273
+ }
274
+ function isPlainObject(v) {
275
+ return typeof v === "object" && v !== null && !Array.isArray(v);
276
+ }
277
+ function describeType(v) {
278
+ if (v === null) return "null";
279
+ if (Array.isArray(v)) return "array";
280
+ return typeof v;
281
+ }
282
+ function previewValue(v) {
283
+ try {
284
+ const s = JSON.stringify(v);
285
+ if (s === void 0) return String(v);
286
+ return s.length > 80 ? `${s.slice(0, 80)}\u2026` : s;
287
+ } catch {
288
+ return String(v);
289
+ }
290
+ }
291
+ function joinPath(parent, key) {
292
+ if (!parent) return key;
293
+ return `${parent}.${key}`;
294
+ }
295
+ function enumIncludes(values, value) {
296
+ if (value === null || typeof value !== "object") return values.includes(value);
297
+ return values.some((candidate) => deepEqual(candidate, value));
298
+ }
299
+ function deepEqual(a, b) {
300
+ if (a === b) return true;
301
+ if (typeof a !== typeof b) return false;
302
+ if (a === null || b === null) return a === b;
303
+ if (Array.isArray(a) && Array.isArray(b)) {
304
+ return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));
305
+ }
306
+ if (typeof a === "object" && typeof b === "object") {
307
+ const ak = Object.keys(a);
308
+ const bk = Object.keys(b);
309
+ if (ak.length !== bk.length) return false;
310
+ return ak.every(
311
+ (k) => deepEqual(a[k], b[k])
312
+ );
313
+ }
314
+ return false;
315
+ }
316
+
317
+ // src/utils/tool-name.ts
318
+ import { createHash } from "node:crypto";
319
+ var WIRE_TOOL_NAME_MAX_LENGTH = 128;
320
+ var WIRE_TOOL_NAME_PATTERN = /^[a-zA-Z0-9_-]{1,128}$/;
321
+ var MCP_SERVER_SEGMENT_MAX_LENGTH = 48;
322
+ var MCP_IDENTITY_HASH_LENGTH = 10;
323
+ function sanitizeWireToolName(name) {
324
+ const replaced = name.replace(/[^a-zA-Z0-9_-]/g, "_");
325
+ const clamped = replaced.slice(0, WIRE_TOOL_NAME_MAX_LENGTH);
326
+ return clamped.length > 0 ? clamped : "tool";
327
+ }
328
+ function collisionSafeMcpSegment(value, maxLength) {
329
+ const replaced = value.replace(/[^a-zA-Z0-9_-]/g, "_") || "tool";
330
+ if (replaced === value && replaced.length <= maxLength) return replaced;
331
+ const suffix = `_${createHash("sha256").update(value, "utf8").digest("hex").slice(0, MCP_IDENTITY_HASH_LENGTH)}`;
332
+ return `${replaced.slice(0, Math.max(1, maxLength - suffix.length))}${suffix}`;
333
+ }
334
+ function mcpServerToolPrefix(serverName) {
335
+ return `mcp__${collisionSafeMcpSegment(serverName, MCP_SERVER_SEGMENT_MAX_LENGTH)}__`;
336
+ }
337
+ function mcpQualifiedToolName(serverName, toolName) {
338
+ const prefix = mcpServerToolPrefix(serverName);
339
+ const toolSegment = collisionSafeMcpSegment(toolName, WIRE_TOOL_NAME_MAX_LENGTH - prefix.length);
340
+ return `${prefix}${toolSegment}`;
341
+ }
342
+
343
+ export {
344
+ readJsonObjectFile,
345
+ jsonObjectFileExists,
346
+ writeJsonObjectFile,
347
+ updateJsonObjectFile,
348
+ getJsonPath,
349
+ setJsonPath,
350
+ removeJsonPath,
351
+ setJsonPathInFile,
352
+ removeJsonPathInFile,
353
+ isJsonObject,
354
+ validateAgainstSchema,
355
+ coerceAgainstSchema,
356
+ WIRE_TOOL_NAME_MAX_LENGTH,
357
+ WIRE_TOOL_NAME_PATTERN,
358
+ sanitizeWireToolName,
359
+ mcpServerToolPrefix,
360
+ mcpQualifiedToolName
361
+ };
362
+ //# sourceMappingURL=chunk-FFSX2QDQ.js.map