@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,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
|