omp-fabric 0.85.0 → 1.0.2
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/CHANGELOG.md +57 -0
- package/dist/agents/manager.d.ts.map +1 -1
- package/dist/agents/transports/process-transport.d.ts.map +1 -1
- package/dist/agents/transports/process-utils.d.ts +6 -1
- package/dist/agents/transports/process-utils.d.ts.map +1 -1
- package/dist/agents/types.d.ts +1 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/audit/details.d.ts +10 -0
- package/dist/audit/details.d.ts.map +1 -1
- package/dist/chunks/{chunk-GKOFZ76R.js → chunk-2LGLDM34.js} +22 -4
- package/dist/chunks/chunk-2LGLDM34.js.map +7 -0
- package/dist/chunks/{chunk-T6OAX4FO.js → chunk-3TWC6XOS.js} +37 -9
- package/dist/chunks/chunk-3TWC6XOS.js.map +7 -0
- package/dist/chunks/{chunk-ZNAJDPT7.js → chunk-B2SQR2JY.js} +32 -24
- package/dist/chunks/{chunk-ZNAJDPT7.js.map → chunk-B2SQR2JY.js.map} +2 -2
- package/dist/chunks/{chunk-SXMWV447.js → chunk-DOKANNFC.js} +206 -3
- package/dist/chunks/chunk-DOKANNFC.js.map +7 -0
- package/dist/chunks/{chunk-UPCARIJP.js → chunk-FFWALVBN.js} +20 -9
- package/dist/chunks/chunk-FFWALVBN.js.map +7 -0
- package/dist/chunks/{chunk-4LEDA76O.js → chunk-HAJPYJPY.js} +3 -3
- package/dist/chunks/{chunk-ROKMBLGN.js → chunk-IFNDRFW7.js} +34 -14
- package/dist/chunks/chunk-IFNDRFW7.js.map +7 -0
- package/dist/chunks/{chunk-ZTM45GH5.js → chunk-JZWLICMS.js} +125 -42
- package/dist/chunks/chunk-JZWLICMS.js.map +7 -0
- package/dist/chunks/{chunk-5GTPD4BA.js → chunk-L2FNMIOW.js} +66 -22
- package/dist/chunks/chunk-L2FNMIOW.js.map +7 -0
- package/dist/chunks/chunk-NX4SNIMR.js +226 -0
- package/dist/chunks/chunk-NX4SNIMR.js.map +7 -0
- package/dist/chunks/{chunk-YZZIKJX6.js → chunk-RBA54WC7.js} +1 -1
- package/dist/chunks/{chunk-YZZIKJX6.js.map → chunk-RBA54WC7.js.map} +1 -1
- package/dist/chunks/{chunk-OPTP4PSE.js → chunk-YPYVUGON.js} +3 -23
- package/dist/chunks/chunk-YPYVUGON.js.map +7 -0
- package/dist/chunks/{chunk-JP4LIZFT.js → chunk-Z6HEQPXX.js} +23 -6
- package/dist/chunks/chunk-Z6HEQPXX.js.map +7 -0
- package/dist/commands/fabric.d.ts.map +1 -1
- package/dist/core/action-registry.d.ts +2 -1
- package/dist/core/action-registry.d.ts.map +1 -1
- package/dist/core/action-registry.js +2 -2
- package/dist/core/compact-controller.d.ts +28 -3
- package/dist/core/compact-controller.d.ts.map +1 -1
- package/dist/core/compact-outcome-store.d.ts +3 -0
- package/dist/core/compact-outcome-store.d.ts.map +1 -0
- package/dist/entropy/index.js +2 -2
- package/dist/entropy/sessions.d.ts.map +1 -1
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/fabric-exec-tool.d.ts.map +1 -1
- package/dist/fabric-runtime-state.d.ts.map +1 -1
- package/dist/fabric-runtime-state.js +883 -367
- package/dist/fabric-runtime-state.js.map +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +116 -18
- package/dist/index.js.map +3 -3
- package/dist/memory/discovery.d.ts +28 -14
- package/dist/memory/discovery.d.ts.map +1 -1
- package/dist/memory/discovery.js +9 -5
- package/dist/protocol.d.ts +5 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +1 -1
- package/dist/providers/mcp-descriptor-cache.d.ts +2 -0
- package/dist/providers/mcp-descriptor-cache.d.ts.map +1 -1
- package/dist/providers/mcp-provider.d.ts +4 -2
- package/dist/providers/mcp-provider.d.ts.map +1 -1
- package/dist/providers/memory-provider.d.ts.map +1 -1
- package/dist/providers/memory-provider.js +2 -2
- package/dist/providers/omp-tools-provider.d.ts +1 -0
- package/dist/providers/omp-tools-provider.d.ts.map +1 -1
- package/dist/residency/host.js +5 -5
- package/dist/residency/omp-entry.js +5 -5
- package/dist/runtime/core-override-guest-types.js +1 -1
- package/dist/runtime/guest-types.d.ts +2 -2
- package/dist/runtime/guest-types.d.ts.map +1 -1
- package/dist/runtime/guest-types.js +1 -1
- package/dist/runtime/node-process-child-source.d.ts.map +1 -1
- package/dist/runtime/node-process-runtime.d.ts.map +1 -1
- package/dist/runtime/node-process-runtime.js +4 -2
- package/dist/runtime/node-process-runtime.js.map +2 -2
- package/dist/runtime/quickjs-runtime.d.ts +6 -1
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +1 -1
- package/dist/speculation/guest-args.d.ts +2 -0
- package/dist/speculation/guest-args.d.ts.map +1 -0
- package/dist/speculation/scanner.d.ts.map +1 -1
- package/dist/speculation/scanner.js +312 -14
- package/dist/speculation/scanner.js.map +3 -3
- package/dist/speculation/store.d.ts +2 -0
- package/dist/speculation/store.d.ts.map +1 -1
- package/dist/speculation/stream-tap.d.ts +1 -0
- package/dist/speculation/stream-tap.d.ts.map +1 -1
- package/dist/speculation/summary.d.ts +4 -0
- package/dist/speculation/summary.d.ts.map +1 -0
- package/dist/speculation/types.d.ts +4 -0
- package/dist/speculation/types.d.ts.map +1 -1
- package/dist/speculation/warmup.d.ts +17 -0
- package/dist/speculation/warmup.d.ts.map +1 -0
- package/dist/ui/settings.d.ts.map +1 -1
- package/dist/ui/settings.js +6 -6
- package/dist/ui/settings.js.map +2 -2
- package/docs/agents.md +1 -1
- package/docs/compaction.md +2 -2
- package/docs/configuration.md +26 -12
- package/docs/interface.md +2 -2
- package/docs/speculation.md +11 -6
- package/package.json +3 -2
- package/dist/chunks/chunk-5GTPD4BA.js.map +0 -7
- package/dist/chunks/chunk-7BIA5BJN.js +0 -112
- package/dist/chunks/chunk-7BIA5BJN.js.map +0 -7
- package/dist/chunks/chunk-GKOFZ76R.js.map +0 -7
- package/dist/chunks/chunk-JP4LIZFT.js.map +0 -7
- package/dist/chunks/chunk-OPTP4PSE.js.map +0 -7
- package/dist/chunks/chunk-ROKMBLGN.js.map +0 -7
- package/dist/chunks/chunk-SXMWV447.js.map +0 -7
- package/dist/chunks/chunk-T6OAX4FO.js.map +0 -7
- package/dist/chunks/chunk-UPCARIJP.js.map +0 -7
- package/dist/chunks/chunk-ZTM45GH5.js.map +0 -7
- /package/dist/chunks/{chunk-4LEDA76O.js.map → chunk-HAJPYJPY.js.map} +0 -0
|
@@ -4,6 +4,302 @@ import {
|
|
|
4
4
|
|
|
5
5
|
// src/speculation/scanner.ts
|
|
6
6
|
import ts from "typescript";
|
|
7
|
+
|
|
8
|
+
// src/speculation/guest-args.ts
|
|
9
|
+
var STRING_FIELDS = {
|
|
10
|
+
bash: "command",
|
|
11
|
+
read: "path",
|
|
12
|
+
ls: "path",
|
|
13
|
+
grep: "pattern",
|
|
14
|
+
find: "pattern"
|
|
15
|
+
};
|
|
16
|
+
var POSITIONAL_FIELDS = {
|
|
17
|
+
grep: [
|
|
18
|
+
"pattern",
|
|
19
|
+
"path",
|
|
20
|
+
"skip"
|
|
21
|
+
],
|
|
22
|
+
find: [
|
|
23
|
+
"pattern",
|
|
24
|
+
"path",
|
|
25
|
+
"limit"
|
|
26
|
+
],
|
|
27
|
+
write: [
|
|
28
|
+
"path",
|
|
29
|
+
"content"
|
|
30
|
+
],
|
|
31
|
+
edit: [
|
|
32
|
+
"path",
|
|
33
|
+
"oldText",
|
|
34
|
+
"newText"
|
|
35
|
+
]
|
|
36
|
+
};
|
|
37
|
+
var NUMERIC_FIELDS = {
|
|
38
|
+
read: [
|
|
39
|
+
"offset",
|
|
40
|
+
"limit"
|
|
41
|
+
],
|
|
42
|
+
bash: [
|
|
43
|
+
"timeout"
|
|
44
|
+
],
|
|
45
|
+
grep: [
|
|
46
|
+
"skip",
|
|
47
|
+
"context"
|
|
48
|
+
],
|
|
49
|
+
find: [
|
|
50
|
+
"limit"
|
|
51
|
+
],
|
|
52
|
+
ls: [
|
|
53
|
+
"limit"
|
|
54
|
+
]
|
|
55
|
+
};
|
|
56
|
+
var OPTIONAL_FIELDS = {
|
|
57
|
+
read: [
|
|
58
|
+
"offset",
|
|
59
|
+
"limit"
|
|
60
|
+
],
|
|
61
|
+
grep: [
|
|
62
|
+
"path",
|
|
63
|
+
"glob",
|
|
64
|
+
"ignoreCase",
|
|
65
|
+
"literal",
|
|
66
|
+
"context",
|
|
67
|
+
"limit"
|
|
68
|
+
],
|
|
69
|
+
find: [
|
|
70
|
+
"path",
|
|
71
|
+
"limit"
|
|
72
|
+
],
|
|
73
|
+
ls: [
|
|
74
|
+
"path",
|
|
75
|
+
"limit"
|
|
76
|
+
]
|
|
77
|
+
};
|
|
78
|
+
var ARG_ALIASES = {
|
|
79
|
+
bash: {
|
|
80
|
+
cmd: "command",
|
|
81
|
+
shell: "command",
|
|
82
|
+
cmdline: "command",
|
|
83
|
+
script: "command",
|
|
84
|
+
commandLine: "command",
|
|
85
|
+
workdir: "cwd",
|
|
86
|
+
directory: "cwd",
|
|
87
|
+
workingDirectory: "cwd"
|
|
88
|
+
},
|
|
89
|
+
find: {
|
|
90
|
+
query: "pattern",
|
|
91
|
+
regex: "pattern",
|
|
92
|
+
search: "pattern",
|
|
93
|
+
name: "pattern",
|
|
94
|
+
filename: "pattern",
|
|
95
|
+
glob: "pattern",
|
|
96
|
+
expression: "pattern",
|
|
97
|
+
include: "pattern",
|
|
98
|
+
max: "limit"
|
|
99
|
+
},
|
|
100
|
+
grep: {
|
|
101
|
+
query: "pattern",
|
|
102
|
+
regex: "pattern",
|
|
103
|
+
search: "pattern",
|
|
104
|
+
q: "pattern",
|
|
105
|
+
expression: "pattern",
|
|
106
|
+
text: "pattern",
|
|
107
|
+
ic: "ignoreCase",
|
|
108
|
+
caseInsensitive: "ignoreCase",
|
|
109
|
+
globPattern: "glob",
|
|
110
|
+
ctx: "context"
|
|
111
|
+
},
|
|
112
|
+
read: {
|
|
113
|
+
file: "path",
|
|
114
|
+
absolutePath: "path",
|
|
115
|
+
file_path: "path",
|
|
116
|
+
filePath: "path",
|
|
117
|
+
filepath: "path",
|
|
118
|
+
pathname: "path",
|
|
119
|
+
target_file: "path",
|
|
120
|
+
targetFile: "path",
|
|
121
|
+
absolute_path: "path",
|
|
122
|
+
fileAbsolutePath: "path",
|
|
123
|
+
max: "limit",
|
|
124
|
+
start: "offset"
|
|
125
|
+
},
|
|
126
|
+
ls: {
|
|
127
|
+
dir: "path",
|
|
128
|
+
file: "path",
|
|
129
|
+
folder: "path",
|
|
130
|
+
absolutePath: "path",
|
|
131
|
+
file_path: "path",
|
|
132
|
+
filePath: "path",
|
|
133
|
+
filepath: "path",
|
|
134
|
+
pathname: "path",
|
|
135
|
+
target_file: "path",
|
|
136
|
+
targetFile: "path",
|
|
137
|
+
absolute_path: "path",
|
|
138
|
+
fileAbsolutePath: "path",
|
|
139
|
+
directory: "path",
|
|
140
|
+
directoryPath: "path",
|
|
141
|
+
max: "limit"
|
|
142
|
+
},
|
|
143
|
+
edit: {
|
|
144
|
+
file: "path",
|
|
145
|
+
absolutePath: "path",
|
|
146
|
+
file_path: "path",
|
|
147
|
+
filePath: "path",
|
|
148
|
+
filepath: "path",
|
|
149
|
+
pathname: "path",
|
|
150
|
+
target_file: "path",
|
|
151
|
+
targetFile: "path",
|
|
152
|
+
absolute_path: "path",
|
|
153
|
+
fileAbsolutePath: "path",
|
|
154
|
+
old: "oldText",
|
|
155
|
+
old_string: "oldText",
|
|
156
|
+
oldString: "oldText",
|
|
157
|
+
old_str: "oldText",
|
|
158
|
+
oldStr: "oldText",
|
|
159
|
+
from: "oldText",
|
|
160
|
+
old_value: "oldText",
|
|
161
|
+
old_text: "oldText",
|
|
162
|
+
oldContent: "oldText",
|
|
163
|
+
old_content: "oldText",
|
|
164
|
+
new: "newText",
|
|
165
|
+
replacement: "newText",
|
|
166
|
+
new_string: "newText",
|
|
167
|
+
newString: "newText",
|
|
168
|
+
new_str: "newText",
|
|
169
|
+
newStr: "newText",
|
|
170
|
+
to: "newText",
|
|
171
|
+
new_value: "newText",
|
|
172
|
+
new_text: "newText",
|
|
173
|
+
newContent: "newText",
|
|
174
|
+
new_content: "newText"
|
|
175
|
+
},
|
|
176
|
+
write: {
|
|
177
|
+
file: "path",
|
|
178
|
+
absolutePath: "path",
|
|
179
|
+
file_path: "path",
|
|
180
|
+
filePath: "path",
|
|
181
|
+
filepath: "path",
|
|
182
|
+
pathname: "path",
|
|
183
|
+
target_file: "path",
|
|
184
|
+
targetFile: "path",
|
|
185
|
+
absolute_path: "path",
|
|
186
|
+
fileAbsolutePath: "path",
|
|
187
|
+
contents: "content",
|
|
188
|
+
body: "content",
|
|
189
|
+
text: "content",
|
|
190
|
+
data: "content",
|
|
191
|
+
fileContent: "content"
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
195
|
+
var positionalToArgs = (name, rest) => {
|
|
196
|
+
const first = rest[0];
|
|
197
|
+
const second = rest[1];
|
|
198
|
+
const primaryField = STRING_FIELDS[name];
|
|
199
|
+
if (rest.length === 2 && typeof first === "string" && primaryField !== void 0 && isPlainObject(second)) {
|
|
200
|
+
return { ...second, [primaryField]: first };
|
|
201
|
+
}
|
|
202
|
+
const order = POSITIONAL_FIELDS[name];
|
|
203
|
+
if (!order) return rest.length > 0 ? first : {};
|
|
204
|
+
const out = {};
|
|
205
|
+
for (let index = 0; index < rest.length && index < order.length; index += 1) {
|
|
206
|
+
const value = rest[index];
|
|
207
|
+
if (value !== void 0) out[order[index]] = value;
|
|
208
|
+
}
|
|
209
|
+
return out;
|
|
210
|
+
};
|
|
211
|
+
var normalizeOmpArgs = (name, args) => {
|
|
212
|
+
const field = STRING_FIELDS[name];
|
|
213
|
+
if (typeof args === "string" && field) return { [field]: args };
|
|
214
|
+
if (!isPlainObject(args)) return args;
|
|
215
|
+
let out = args;
|
|
216
|
+
const copy = () => {
|
|
217
|
+
if (out === args) out = { ...args };
|
|
218
|
+
};
|
|
219
|
+
if (name === "bash" && "timeoutMs" in out) {
|
|
220
|
+
copy();
|
|
221
|
+
if (!("timeout" in out)) {
|
|
222
|
+
const timeoutMs = out.timeoutMs;
|
|
223
|
+
if (timeoutMs !== null && timeoutMs !== void 0) {
|
|
224
|
+
out.timeout = Number.isFinite(Number(timeoutMs)) ? Number(timeoutMs) / 1e3 : timeoutMs;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
delete out.timeoutMs;
|
|
228
|
+
}
|
|
229
|
+
if (name === "bash" && "settle" in out) {
|
|
230
|
+
copy();
|
|
231
|
+
delete out.settle;
|
|
232
|
+
}
|
|
233
|
+
const aliases = ARG_ALIASES[name];
|
|
234
|
+
if (aliases) {
|
|
235
|
+
for (const alias of Object.keys(aliases)) {
|
|
236
|
+
const canonical = aliases[alias];
|
|
237
|
+
if (!(alias in out)) continue;
|
|
238
|
+
copy();
|
|
239
|
+
if (!(canonical in out)) out[canonical] = out[alias];
|
|
240
|
+
delete out[alias];
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const numerics = NUMERIC_FIELDS[name];
|
|
244
|
+
if (numerics) {
|
|
245
|
+
for (const key of numerics) {
|
|
246
|
+
const value = out[key];
|
|
247
|
+
if (typeof value === "string" && value.trim() !== "" && Number.isFinite(Number(value))) {
|
|
248
|
+
copy();
|
|
249
|
+
out[key] = Number(value);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const optionals = OPTIONAL_FIELDS[name];
|
|
254
|
+
if (optionals) {
|
|
255
|
+
for (const key of optionals) {
|
|
256
|
+
if (out[key] !== null && out[key] !== void 0) continue;
|
|
257
|
+
if (!(key in out)) continue;
|
|
258
|
+
copy();
|
|
259
|
+
delete out[key];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (name === "edit" && Array.isArray(out.edits)) {
|
|
263
|
+
let changed = false;
|
|
264
|
+
const editAliases = ARG_ALIASES.edit;
|
|
265
|
+
const edits = out.edits.map((entry) => {
|
|
266
|
+
if (!isPlainObject(entry)) return entry;
|
|
267
|
+
let edit = entry;
|
|
268
|
+
for (const alias of Object.keys(editAliases)) {
|
|
269
|
+
const canonical = editAliases[alias];
|
|
270
|
+
if (canonical !== "oldText" && canonical !== "newText") continue;
|
|
271
|
+
if (!(alias in edit)) continue;
|
|
272
|
+
if (edit === entry) edit = { ...entry };
|
|
273
|
+
if (!(canonical in edit)) edit[canonical] = edit[alias];
|
|
274
|
+
delete edit[alias];
|
|
275
|
+
changed = true;
|
|
276
|
+
}
|
|
277
|
+
return edit;
|
|
278
|
+
});
|
|
279
|
+
if (changed) {
|
|
280
|
+
copy();
|
|
281
|
+
out.edits = edits;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (name === "edit" && !Array.isArray(out.edits) && ("oldText" in out || "newText" in out)) {
|
|
285
|
+
copy();
|
|
286
|
+
const edit = {};
|
|
287
|
+
if ("oldText" in out) edit.oldText = out.oldText;
|
|
288
|
+
if ("newText" in out) edit.newText = out.newText;
|
|
289
|
+
out.edits = [edit];
|
|
290
|
+
delete out.oldText;
|
|
291
|
+
delete out.newText;
|
|
292
|
+
}
|
|
293
|
+
return out;
|
|
294
|
+
};
|
|
295
|
+
var guestOmpArgs = (name, literalArguments) => {
|
|
296
|
+
const raw = literalArguments.length <= 1 ? literalArguments.length === 1 ? literalArguments[0] : void 0 : positionalToArgs(name, literalArguments);
|
|
297
|
+
const args = raw === void 0 ? {} : raw;
|
|
298
|
+
const normalized = normalizeOmpArgs(name, args);
|
|
299
|
+
return isPlainObject(normalized) ? normalized : void 0;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// src/speculation/scanner.ts
|
|
7
303
|
var ROOTS = /* @__PURE__ */ new Set(["omp", "memory", "state", "schema", "compact", "components", "mcp"]);
|
|
8
304
|
var LITERAL_FAIL = Symbol("literal-fail");
|
|
9
305
|
var literalOk = (value) => ({ ok: true, value });
|
|
@@ -120,7 +416,7 @@ var LiteralCallScanner = class {
|
|
|
120
416
|
if (segments) {
|
|
121
417
|
const ref = refFromChain(segments, this.#tainted);
|
|
122
418
|
if (ref) {
|
|
123
|
-
const args = this.#literalArgs(node);
|
|
419
|
+
const args = this.#literalArgs(ref, node);
|
|
124
420
|
if (args !== void 0) {
|
|
125
421
|
const key = `${ref}
|
|
126
422
|
${stableJsonHash(args)}`;
|
|
@@ -137,21 +433,23 @@ ${stableJsonHash(args)}`;
|
|
|
137
433
|
visit(source);
|
|
138
434
|
return candidates;
|
|
139
435
|
}
|
|
140
|
-
|
|
141
|
-
// fabric calling convention. Positional multi-arg calls are skipped: their
|
|
142
|
-
// normalization lives on the guest bridge, and guessing here would risk
|
|
143
|
-
// keying the speculation store on the wrong argument shape.
|
|
144
|
-
#literalArgs(node) {
|
|
436
|
+
#literalArgs(ref, node) {
|
|
145
437
|
if (node.arguments.length === 0) return {};
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
438
|
+
const values = [];
|
|
439
|
+
for (const argument of node.arguments) {
|
|
440
|
+
if (ts.isSpreadElement(argument)) return void 0;
|
|
441
|
+
const value = evalLiteral(argument);
|
|
442
|
+
if (!value.ok || !isJsonShape(value.value)) return void 0;
|
|
443
|
+
values.push(value.value);
|
|
444
|
+
}
|
|
445
|
+
if (ref.startsWith("omp.")) {
|
|
446
|
+
const args = guestOmpArgs(ref.slice("omp.".length), values);
|
|
447
|
+
return args !== void 0 && isJsonShape(args) ? args : void 0;
|
|
153
448
|
}
|
|
154
|
-
return
|
|
449
|
+
if (values.length !== 1) return void 0;
|
|
450
|
+
const only = values[0];
|
|
451
|
+
if (typeof only !== "object" || only === null || Array.isArray(only)) return void 0;
|
|
452
|
+
return only;
|
|
155
453
|
}
|
|
156
454
|
#collectStatementBindings(node, into) {
|
|
157
455
|
const visit = (current) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/speculation/scanner.ts"],
|
|
4
|
-
"sourcesContent": ["import ts from \"typescript\";\nimport { stableJsonHash } from \"../core/stable-hash.js\";\nimport type { FabricSpeculationCandidate } from \"./types.js\";\n\n// Root namespaces the model can call from a fabric program. Calls are emitted\n// as candidates regardless of action so the tap can apply its eligibility\n// policy in one place; args must still be fully literal.\nconst ROOTS = new Set([\"omp\", \"memory\", \"state\", \"schema\", \"compact\", \"components\", \"mcp\"]);\n\nconst LITERAL_FAIL = Symbol(\"literal-fail\");\n\ntype LiteralResult = { ok: true; value: unknown } | { ok: false };\n\nconst literalOk = (value: unknown): LiteralResult => ({ ok: true, value });\nconst LITERAL_FAIL_RESULT: LiteralResult = { ok: false };\n\n// Accept only values that survive a JSON round trip unchanged in structure so\n// the speculation key (stableJsonHash over prepared args) cannot drift from\n// what the real invocation produces.\nconst isJsonShape = (value: unknown): boolean => {\n if (value === null) return true;\n switch (typeof value) {\n case \"string\":\n case \"boolean\":\n return true;\n case \"number\":\n return Number.isFinite(value);\n case \"object\": {\n if (Array.isArray(value)) return value.every(isJsonShape);\n const record = value as Record<string, unknown>;\n return Object.values(record).every(isJsonShape);\n }\n default:\n return false;\n }\n};\n\nconst evalLiteral = (node: ts.Expression): LiteralResult => {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n return literalOk(node.text);\n }\n if (ts.isNumericLiteral(node)) {\n if (node.text.endsWith(\"n\")) return LITERAL_FAIL_RESULT; // bigint\n const value = Number(node.text);\n return Number.isFinite(value) ? literalOk(value) : LITERAL_FAIL_RESULT;\n }\n if (\n ts.isPrefixUnaryExpression(node) &&\n (node.operator === ts.SyntaxKind.MinusToken || node.operator === ts.SyntaxKind.PlusToken) &&\n ts.isNumericLiteral(node.operand)\n ) {\n if (node.operand.text.endsWith(\"n\")) return LITERAL_FAIL_RESULT;\n const value = Number(node.operand.text);\n if (!Number.isFinite(value)) return LITERAL_FAIL_RESULT;\n return literalOk(node.operator === ts.SyntaxKind.MinusToken ? -value : value);\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) return literalOk(true);\n if (node.kind === ts.SyntaxKind.FalseKeyword) return literalOk(false);\n if (node.kind === ts.SyntaxKind.NullKeyword) return literalOk(null);\n if (ts.isArrayLiteralExpression(node)) {\n const items: unknown[] = [];\n for (const element of node.elements) {\n if (ts.isSpreadElement(element) || ts.isOmittedExpression(element)) return LITERAL_FAIL_RESULT;\n const item = evalLiteral(element);\n if (!item.ok) return item;\n items.push(item.value);\n }\n return literalOk(items);\n }\n if (ts.isObjectLiteralExpression(node)) {\n const record: Record<string, unknown> = {};\n for (const property of node.properties) {\n if (!ts.isPropertyAssignment(property)) return LITERAL_FAIL_RESULT;\n const name = property.name;\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name)) return LITERAL_FAIL_RESULT;\n const value = evalLiteral(property.initializer);\n if (!value.ok) return value;\n record[name.text] = value.value;\n }\n return literalOk(record);\n }\n return LITERAL_FAIL_RESULT;\n};\n\nconst collectBoundNames = (name: ts.BindingName, into: Set<string>): void => {\n if (ts.isIdentifier(name)) {\n into.add(name.text);\n return;\n }\n for (const element of name.elements) {\n if (ts.isBindingElement(element)) collectBoundNames(element.name, into);\n }\n};\n\n/** Property-access chain as segments, e.g. mcp.exa.search -> [\"mcp\",\"exa\",\"search\"]. */\nconst accessChain = (node: ts.Expression): string[] | undefined => {\n const segments: string[] = [];\n let current: ts.Expression = node;\n while (ts.isPropertyAccessExpression(current)) {\n segments.unshift(current.name.text);\n current = current.expression;\n }\n if (!ts.isIdentifier(current)) return undefined;\n segments.unshift(current.text);\n return segments;\n};\n\nconst refFromChain = (segments: string[], tainted: Set<string>): string | undefined => {\n const root = segments[0]!;\n if (!ROOTS.has(root) || tainted.has(root)) return undefined;\n if (segments.length === 2) return `${segments[0]}.${segments[1]}`;\n if (segments.length === 3 && root === \"mcp\") return segments.join(\".\");\n return undefined;\n};\n\n/**\n * Scans a growing partial TypeScript program for completed calls on the spec\n * namespaces whose arguments are all literals. Reparses the full prefix only\n * when newly appended text contains a \")\" \u2014 which is the earliest point a call\n * expression can complete \u2014 so streaming deltas inside string payloads cost a\n * substring scan, not an AST build.\n */\nexport class LiteralCallScanner {\n #scannedLength = 0;\n readonly #tainted = new Set<string>();\n readonly #emitted = new Set<string>();\n\n push(code: string): FabricSpeculationCandidate[] {\n const appended = code.slice(this.#scannedLength);\n const forceScan = code.length < this.#scannedLength;\n if (!forceScan && !appended.includes(\")\")) return [];\n this.#scannedLength = code.length;\n\n const source = ts.createSourceFile(\n \"speculation.ts\",\n code,\n ts.ScriptTarget.ESNext,\n true,\n ts.ScriptKind.TS,\n );\n\n // A local/declared binding that shares a namespace root makes dotted calls\n // ambiguous (e.g. `const omp = { read: () => ... }`); taint that root for\n // the rest of the stream.\n for (const statement of source.statements) {\n this.#collectStatementBindings(statement, this.#tainted);\n }\n\n const candidates: FabricSpeculationCandidate[] = [];\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const segments = accessChain(node.expression);\n if (segments) {\n const ref = refFromChain(segments, this.#tainted);\n if (ref) {\n const args = this.#literalArgs(node);\n if (args !== undefined) {\n const key = `${ref}\\n${stableJsonHash(args)}`;\n if (!this.#emitted.has(key)) {\n this.#emitted.add(key);\n candidates.push({ ref, args });\n }\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n return candidates;\n }\n\n // Zero-arg calls mean `{}`; a single object literal is the documented\n // fabric calling convention. Positional multi-arg calls are skipped: their\n // normalization lives on the guest bridge, and guessing here would risk\n // keying the speculation store on the wrong argument shape.\n #literalArgs(node: ts.CallExpression): Record<string, unknown> | undefined {\n if (node.arguments.length === 0) return {};\n if (node.arguments.length !== 1) return undefined;\n const only = node.arguments[0]!;\n if (ts.isSpreadElement(only)) return undefined;\n const value = evalLiteral(only);\n if (!value.ok) return undefined;\n if (\n typeof value.value !== \"object\" ||\n value.value === null ||\n Array.isArray(value.value) ||\n !isJsonShape(value.value)\n ) {\n return undefined;\n }\n return value.value as Record<string, unknown>;\n }\n\n #collectStatementBindings(node: ts.Node, into: Set<string>): void {\n const visit = (current: ts.Node): void => {\n if (ts.isVariableDeclaration(current)) collectBoundNames(current.name, into);\n else if (\n (ts.isFunctionDeclaration(current) || ts.isClassDeclaration(current)) &&\n current.name\n ) {\n into.add(current.name.text);\n } else if (\n ts.isFunctionExpression(current) ||\n ts.isArrowFunction(current) ||\n ts.isMethodDeclaration(current)\n ) {\n for (const parameter of current.parameters) collectBoundNames(parameter.name, into);\n } else if (ts.isImportDeclaration(current) && current.importClause) {\n const clause = current.importClause;\n if (clause.name) into.add(clause.name.text);\n if (clause.namedBindings) {\n if (ts.isNamespaceImport(clause.namedBindings)) {\n into.add(clause.namedBindings.name.text);\n } else {\n for (const element of clause.namedBindings.elements) into.add(element.name.text);\n }\n }\n }\n ts.forEachChild(current, visit);\n };\n visit(node);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../../src/speculation/scanner.ts", "../../src/speculation/guest-args.ts"],
|
|
4
|
+
"sourcesContent": ["import ts from \"typescript\";\nimport { stableJsonHash } from \"../core/stable-hash.js\";\nimport { guestOmpArgs } from \"./guest-args.js\";\nimport type { FabricSpeculationCandidate } from \"./types.js\";\n\n// Root namespaces the model can call from a fabric program. Calls are emitted\n// as candidates regardless of action so the tap can apply its eligibility\n// policy in one place; args must still be fully literal.\nconst ROOTS = new Set([\"omp\", \"memory\", \"state\", \"schema\", \"compact\", \"components\", \"mcp\"]);\n\nconst LITERAL_FAIL = Symbol(\"literal-fail\");\n\ntype LiteralResult = { ok: true; value: unknown } | { ok: false };\n\nconst literalOk = (value: unknown): LiteralResult => ({ ok: true, value });\nconst LITERAL_FAIL_RESULT: LiteralResult = { ok: false };\n\n// Accept only values that survive a JSON round trip unchanged in structure so\n// the speculation key (stableJsonHash over prepared args) cannot drift from\n// what the real invocation produces.\nconst isJsonShape = (value: unknown): boolean => {\n if (value === null) return true;\n switch (typeof value) {\n case \"string\":\n case \"boolean\":\n return true;\n case \"number\":\n return Number.isFinite(value);\n case \"object\": {\n if (Array.isArray(value)) return value.every(isJsonShape);\n const record = value as Record<string, unknown>;\n return Object.values(record).every(isJsonShape);\n }\n default:\n return false;\n }\n};\n\nconst evalLiteral = (node: ts.Expression): LiteralResult => {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n return literalOk(node.text);\n }\n if (ts.isNumericLiteral(node)) {\n if (node.text.endsWith(\"n\")) return LITERAL_FAIL_RESULT; // bigint\n const value = Number(node.text);\n return Number.isFinite(value) ? literalOk(value) : LITERAL_FAIL_RESULT;\n }\n if (\n ts.isPrefixUnaryExpression(node) &&\n (node.operator === ts.SyntaxKind.MinusToken || node.operator === ts.SyntaxKind.PlusToken) &&\n ts.isNumericLiteral(node.operand)\n ) {\n if (node.operand.text.endsWith(\"n\")) return LITERAL_FAIL_RESULT;\n const value = Number(node.operand.text);\n if (!Number.isFinite(value)) return LITERAL_FAIL_RESULT;\n return literalOk(node.operator === ts.SyntaxKind.MinusToken ? -value : value);\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) return literalOk(true);\n if (node.kind === ts.SyntaxKind.FalseKeyword) return literalOk(false);\n if (node.kind === ts.SyntaxKind.NullKeyword) return literalOk(null);\n if (ts.isArrayLiteralExpression(node)) {\n const items: unknown[] = [];\n for (const element of node.elements) {\n if (ts.isSpreadElement(element) || ts.isOmittedExpression(element)) return LITERAL_FAIL_RESULT;\n const item = evalLiteral(element);\n if (!item.ok) return item;\n items.push(item.value);\n }\n return literalOk(items);\n }\n if (ts.isObjectLiteralExpression(node)) {\n const record: Record<string, unknown> = {};\n for (const property of node.properties) {\n if (!ts.isPropertyAssignment(property)) return LITERAL_FAIL_RESULT;\n const name = property.name;\n if (!ts.isIdentifier(name) && !ts.isStringLiteral(name)) return LITERAL_FAIL_RESULT;\n const value = evalLiteral(property.initializer);\n if (!value.ok) return value;\n record[name.text] = value.value;\n }\n return literalOk(record);\n }\n return LITERAL_FAIL_RESULT;\n};\n\nconst collectBoundNames = (name: ts.BindingName, into: Set<string>): void => {\n if (ts.isIdentifier(name)) {\n into.add(name.text);\n return;\n }\n for (const element of name.elements) {\n if (ts.isBindingElement(element)) collectBoundNames(element.name, into);\n }\n};\n\n/** Property-access chain as segments, e.g. mcp.exa.search -> [\"mcp\",\"exa\",\"search\"]. */\nconst accessChain = (node: ts.Expression): string[] | undefined => {\n const segments: string[] = [];\n let current: ts.Expression = node;\n while (ts.isPropertyAccessExpression(current)) {\n segments.unshift(current.name.text);\n current = current.expression;\n }\n if (!ts.isIdentifier(current)) return undefined;\n segments.unshift(current.text);\n return segments;\n};\n\nconst refFromChain = (segments: string[], tainted: Set<string>): string | undefined => {\n const root = segments[0]!;\n if (!ROOTS.has(root) || tainted.has(root)) return undefined;\n if (segments.length === 2) return `${segments[0]}.${segments[1]}`;\n if (segments.length === 3 && root === \"mcp\") return segments.join(\".\");\n return undefined;\n};\n\n/**\n * Scans a growing partial TypeScript program for completed calls on the spec\n * namespaces whose arguments are all literals. Reparses the full prefix only\n * when newly appended text contains a \")\" \u2014 which is the earliest point a call\n * expression can complete \u2014 so streaming deltas inside string payloads cost a\n * substring scan, not an AST build.\n */\nexport class LiteralCallScanner {\n #scannedLength = 0;\n readonly #tainted = new Set<string>();\n readonly #emitted = new Set<string>();\n\n push(code: string): FabricSpeculationCandidate[] {\n const appended = code.slice(this.#scannedLength);\n const forceScan = code.length < this.#scannedLength;\n if (!forceScan && !appended.includes(\")\")) return [];\n this.#scannedLength = code.length;\n\n const source = ts.createSourceFile(\n \"speculation.ts\",\n code,\n ts.ScriptTarget.ESNext,\n true,\n ts.ScriptKind.TS,\n );\n\n // A local/declared binding that shares a namespace root makes dotted calls\n // ambiguous (e.g. `const omp = { read: () => ... }`); taint that root for\n // the rest of the stream.\n for (const statement of source.statements) {\n this.#collectStatementBindings(statement, this.#tainted);\n }\n\n const candidates: FabricSpeculationCandidate[] = [];\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const segments = accessChain(node.expression);\n if (segments) {\n const ref = refFromChain(segments, this.#tainted);\n if (ref) {\n const args = this.#literalArgs(ref, node);\n if (args !== undefined) {\n const key = `${ref}\\n${stableJsonHash(args)}`;\n if (!this.#emitted.has(key)) {\n this.#emitted.add(key);\n candidates.push({ ref, args });\n }\n }\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n return candidates;\n }\n\n #literalArgs(ref: string, node: ts.CallExpression): Record<string, unknown> | undefined {\n if (node.arguments.length === 0) return {};\n const values: unknown[] = [];\n for (const argument of node.arguments) {\n if (ts.isSpreadElement(argument)) return undefined;\n const value = evalLiteral(argument);\n if (!value.ok || !isJsonShape(value.value)) return undefined;\n values.push(value.value);\n }\n if (ref.startsWith(\"omp.\")) {\n const args = guestOmpArgs(ref.slice(\"omp.\".length), values);\n return args !== undefined && isJsonShape(args) ? args : undefined;\n }\n if (values.length !== 1) return undefined;\n const only = values[0];\n if (typeof only !== \"object\" || only === null || Array.isArray(only)) return undefined;\n return only as Record<string, unknown>;\n }\n\n #collectStatementBindings(node: ts.Node, into: Set<string>): void {\n const visit = (current: ts.Node): void => {\n if (ts.isVariableDeclaration(current)) collectBoundNames(current.name, into);\n else if (\n (ts.isFunctionDeclaration(current) || ts.isClassDeclaration(current)) &&\n current.name\n ) {\n into.add(current.name.text);\n } else if (\n ts.isFunctionExpression(current) ||\n ts.isArrowFunction(current) ||\n ts.isMethodDeclaration(current)\n ) {\n for (const parameter of current.parameters) collectBoundNames(parameter.name, into);\n } else if (ts.isImportDeclaration(current) && current.importClause) {\n const clause = current.importClause;\n if (clause.name) into.add(clause.name.text);\n if (clause.namedBindings) {\n if (ts.isNamespaceImport(clause.namedBindings)) {\n into.add(clause.namedBindings.name.text);\n } else {\n for (const element of clause.namedBindings.elements) into.add(element.name.text);\n }\n }\n }\n ts.forEachChild(current, visit);\n };\n visit(node);\n }\n}\n", "const STRING_FIELDS: Readonly<Record<string, string>> = {\n bash: \"command\",\n read: \"path\",\n ls: \"path\",\n grep: \"pattern\",\n find: \"pattern\"\n};\n\nconst POSITIONAL_FIELDS: Readonly<Record<string, readonly string[]>> = {\n grep: [\n \"pattern\",\n \"path\",\n \"skip\"\n ],\n find: [\n \"pattern\",\n \"path\",\n \"limit\"\n ],\n write: [\n \"path\",\n \"content\"\n ],\n edit: [\n \"path\",\n \"oldText\",\n \"newText\"\n ]\n};\n\nconst NUMERIC_FIELDS: Readonly<Record<string, readonly string[]>> = {\n read: [\n \"offset\",\n \"limit\"\n ],\n bash: [\n \"timeout\"\n ],\n grep: [\n \"skip\",\n \"context\"\n ],\n find: [\n \"limit\"\n ],\n ls: [\n \"limit\"\n ]\n};\n\nconst OPTIONAL_FIELDS: Readonly<Record<string, readonly string[]>> = {\n read: [\n \"offset\",\n \"limit\"\n ],\n grep: [\n \"path\",\n \"glob\",\n \"ignoreCase\",\n \"literal\",\n \"context\",\n \"limit\"\n ],\n find: [\n \"path\",\n \"limit\"\n ],\n ls: [\n \"path\",\n \"limit\"\n ]\n};\n\nconst ARG_ALIASES: Readonly<Record<string, Readonly<Record<string, string>>>> = {\n bash: {\n cmd: \"command\",\n shell: \"command\",\n cmdline: \"command\",\n script: \"command\",\n commandLine: \"command\",\n workdir: \"cwd\",\n directory: \"cwd\",\n workingDirectory: \"cwd\"\n },\n find: {\n query: \"pattern\",\n regex: \"pattern\",\n search: \"pattern\",\n name: \"pattern\",\n filename: \"pattern\",\n glob: \"pattern\",\n expression: \"pattern\",\n include: \"pattern\",\n max: \"limit\"\n },\n grep: {\n query: \"pattern\",\n regex: \"pattern\",\n search: \"pattern\",\n q: \"pattern\",\n expression: \"pattern\",\n text: \"pattern\",\n ic: \"ignoreCase\",\n caseInsensitive: \"ignoreCase\",\n globPattern: \"glob\",\n ctx: \"context\"\n },\n read: {\n file: \"path\",\n absolutePath: \"path\",\n file_path: \"path\",\n filePath: \"path\",\n filepath: \"path\",\n pathname: \"path\",\n target_file: \"path\",\n targetFile: \"path\",\n absolute_path: \"path\",\n fileAbsolutePath: \"path\",\n max: \"limit\",\n start: \"offset\"\n },\n ls: {\n dir: \"path\",\n file: \"path\",\n folder: \"path\",\n absolutePath: \"path\",\n file_path: \"path\",\n filePath: \"path\",\n filepath: \"path\",\n pathname: \"path\",\n target_file: \"path\",\n targetFile: \"path\",\n absolute_path: \"path\",\n fileAbsolutePath: \"path\",\n directory: \"path\",\n directoryPath: \"path\",\n max: \"limit\"\n },\n edit: {\n file: \"path\",\n absolutePath: \"path\",\n file_path: \"path\",\n filePath: \"path\",\n filepath: \"path\",\n pathname: \"path\",\n target_file: \"path\",\n targetFile: \"path\",\n absolute_path: \"path\",\n fileAbsolutePath: \"path\",\n old: \"oldText\",\n old_string: \"oldText\",\n oldString: \"oldText\",\n old_str: \"oldText\",\n oldStr: \"oldText\",\n from: \"oldText\",\n old_value: \"oldText\",\n old_text: \"oldText\",\n oldContent: \"oldText\",\n old_content: \"oldText\",\n new: \"newText\",\n replacement: \"newText\",\n new_string: \"newText\",\n newString: \"newText\",\n new_str: \"newText\",\n newStr: \"newText\",\n to: \"newText\",\n new_value: \"newText\",\n new_text: \"newText\",\n newContent: \"newText\",\n new_content: \"newText\"\n },\n write: {\n file: \"path\",\n absolutePath: \"path\",\n file_path: \"path\",\n filePath: \"path\",\n filepath: \"path\",\n pathname: \"path\",\n target_file: \"path\",\n targetFile: \"path\",\n absolute_path: \"path\",\n fileAbsolutePath: \"path\",\n contents: \"content\",\n body: \"content\",\n text: \"content\",\n data: \"content\",\n fileContent: \"content\"\n }\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst positionalToArgs = (name: string, rest: readonly unknown[]): unknown => {\n const first = rest[0];\n const second = rest[1];\n const primaryField = STRING_FIELDS[name];\n if (\n rest.length === 2 &&\n typeof first === \"string\" &&\n primaryField !== undefined &&\n isPlainObject(second)\n ) {\n return { ...second, [primaryField]: first };\n }\n const order = POSITIONAL_FIELDS[name];\n if (!order) return rest.length > 0 ? first : {};\n const out: Record<string, unknown> = {};\n for (let index = 0; index < rest.length && index < order.length; index += 1) {\n const value = rest[index];\n if (value !== undefined) out[order[index]!] = value;\n }\n return out;\n};\n\nconst normalizeOmpArgs = (name: string, args: unknown): unknown => {\n const field = STRING_FIELDS[name];\n if (typeof args === \"string\" && field) return { [field]: args };\n if (!isPlainObject(args)) return args;\n let out: Record<string, unknown> = args;\n const copy = (): void => {\n if (out === args) out = { ...args };\n };\n if (name === \"bash\" && \"timeoutMs\" in out) {\n copy();\n if (!(\"timeout\" in out)) {\n const timeoutMs = out.timeoutMs;\n if (timeoutMs !== null && timeoutMs !== undefined) {\n out.timeout = Number.isFinite(Number(timeoutMs)) ? Number(timeoutMs) / 1000 : timeoutMs;\n }\n }\n delete out.timeoutMs;\n }\n if (name === \"bash\" && \"settle\" in out) {\n copy();\n delete out.settle;\n }\n const aliases = ARG_ALIASES[name];\n if (aliases) {\n for (const alias of Object.keys(aliases)) {\n const canonical = aliases[alias]!;\n if (!(alias in out)) continue;\n copy();\n if (!(canonical in out)) out[canonical] = out[alias];\n delete out[alias];\n }\n }\n const numerics = NUMERIC_FIELDS[name];\n if (numerics) {\n for (const key of numerics) {\n const value = out[key];\n if (typeof value === \"string\" && value.trim() !== \"\" && Number.isFinite(Number(value))) {\n copy();\n out[key] = Number(value);\n }\n }\n }\n const optionals = OPTIONAL_FIELDS[name];\n if (optionals) {\n for (const key of optionals) {\n if (out[key] !== null && out[key] !== undefined) continue;\n if (!(key in out)) continue;\n copy();\n delete out[key];\n }\n }\n if (name === \"edit\" && Array.isArray(out.edits)) {\n let changed = false;\n const editAliases = ARG_ALIASES.edit!;\n const edits = out.edits.map((entry) => {\n if (!isPlainObject(entry)) return entry;\n let edit: Record<string, unknown> = entry;\n for (const alias of Object.keys(editAliases)) {\n const canonical = editAliases[alias]!;\n if (canonical !== \"oldText\" && canonical !== \"newText\") continue;\n if (!(alias in edit)) continue;\n if (edit === entry) edit = { ...entry };\n if (!(canonical in edit)) edit[canonical] = edit[alias];\n delete edit[alias];\n changed = true;\n }\n return edit;\n });\n if (changed) {\n copy();\n out.edits = edits;\n }\n }\n if (name === \"edit\" && !Array.isArray(out.edits) && (\"oldText\" in out || \"newText\" in out)) {\n copy();\n const edit: Record<string, unknown> = {};\n if (\"oldText\" in out) edit.oldText = out.oldText;\n if (\"newText\" in out) edit.newText = out.newText;\n out.edits = [edit];\n delete out.oldText;\n delete out.newText;\n }\n return out;\n};\n\nexport const guestOmpArgs = (\n name: string,\n literalArguments: readonly unknown[],\n): Record<string, unknown> | undefined => {\n const raw = literalArguments.length <= 1\n ? (literalArguments.length === 1 ? literalArguments[0] : undefined)\n : positionalToArgs(name, literalArguments);\n const args = raw === undefined ? {} : raw;\n const normalized = normalizeOmpArgs(name, args);\n return isPlainObject(normalized) ? normalized : undefined;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -24,6 +24,8 @@ export declare class FabricSpeculationStore implements FabricSpeculationRuntime
|
|
|
24
24
|
};
|
|
25
25
|
bumpEpoch(): void;
|
|
26
26
|
static key(parentToolCallId: string, ref: string, preparedArgs: Record<string, unknown>, bindingToken: string): string;
|
|
27
|
+
beginLaunch(parentToolCallId: string): () => void;
|
|
28
|
+
settleLaunches(parentToolCallId: string, timeoutMs: number): Promise<void>;
|
|
27
29
|
/**
|
|
28
30
|
* Register and start a speculative invocation. Returns false when at
|
|
29
31
|
* capacity; the candidate is dropped silently (a miss costs nothing, the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/speculation/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAuB,YAAW,wBAAwB;;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/speculation/store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,4BAA4B,EAC5B,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAuB,YAAW,wBAAwB;;gBAkBzD,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC;IAMhG,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,KAAK,IAAI,sBAAsB,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAIrD,SAAS,IAAI,IAAI;IAIjB,MAAM,CAAC,GAAG,CACR,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,YAAY,EAAE,MAAM,GACnB,MAAM;IAIT,WAAW,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,IAAI;IAe3C,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAahF;;;;OAIG;IACH,MAAM,CACJ,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,EAClD,SAAS,EAAE,sBAAsB,GAAG,SAAS,EAC7C,MAAM,EAAE,uBAAuB,EAC/B,YAAY,EAAE,MAAM,GACnB,OAAO;IAoCJ,QAAQ,CACZ,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,4BAA4B,CAAC;IA2BxC,2EAA2E;IAC3E,eAAe,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAS/C,wDAAwD;IACxD,KAAK,IAAI,IAAI;CAmCd"}
|
|
@@ -8,6 +8,7 @@ export interface FabricSpeculationTapOptions {
|
|
|
8
8
|
isEligible(ref: string): boolean;
|
|
9
9
|
launch(toolCallId: string, candidate: FabricSpeculationCandidate, context: ExtensionContext): void;
|
|
10
10
|
}
|
|
11
|
+
export declare const streamedToolCallName: (event: MessageUpdateEvent) => string | undefined;
|
|
11
12
|
/**
|
|
12
13
|
* Watches assistant message streaming for fabric_exec tool calls, incrementally
|
|
13
14
|
* decodes the `code` argument, and launches speculative executions for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-tap.d.ts","sourceRoot":"","sources":["../../src/speculation/stream-tap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAS7D,MAAM,WAAW,2BAA2B;IAC1C,OAAO,IAAI,OAAO,CAAC;IACnB,cAAc,IAAI,MAAM,CAAC;IACzB,uFAAuF;IACvF,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,0BAA0B,EACrC,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAAC;CACT;
|
|
1
|
+
{"version":3,"file":"stream-tap.d.ts","sourceRoot":"","sources":["../../src/speculation/stream-tap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAS7D,MAAM,WAAW,2BAA2B;IAC1C,OAAO,IAAI,OAAO,CAAC;IACnB,cAAc,IAAI,MAAM,CAAC;IACzB,uFAAuF;IACvF,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,CACJ,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,0BAA0B,EACrC,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAAC;CACT;AAkBD,eAAO,MAAM,oBAAoB,GAAI,OAAO,kBAAkB,KAAG,MAAM,GAAG,SAOzE,CAAC;AAMF;;;;;GAKG;AACH,qBAAa,0BAA0B;;gBAUzB,OAAO,EAAE,2BAA2B;IAIhD,iBAAiB,CAAC,OAAO,EAAE,MAAM,kBAAkB,GAAG,IAAI;IAqB1D,kEAAkE;IAClE,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAOjF,sDAAsD;IACtD,KAAK,IAAI,IAAI;IAIb,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;CAwDhF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FabricSpeculationSummaryV1 } from "../audit/details.js";
|
|
2
|
+
import type { FabricSpeculationStats } from "./types.js";
|
|
3
|
+
export declare const fabricSpeculationSummary: (stats: FabricSpeculationStats | undefined) => FabricSpeculationSummaryV1 | undefined;
|
|
4
|
+
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/speculation/summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,eAAO,MAAM,wBAAwB,GACnC,OAAO,sBAAsB,GAAG,SAAS,KACxC,0BAA0B,GAAG,SAU/B,CAAC"}
|
|
@@ -16,6 +16,7 @@ export interface FabricSpeculationReplay {
|
|
|
16
16
|
export interface FabricSpeculationStats {
|
|
17
17
|
launched: number;
|
|
18
18
|
served: number;
|
|
19
|
+
absent: number;
|
|
19
20
|
epochInvalidated: number;
|
|
20
21
|
freshnessInvalidated: number;
|
|
21
22
|
failed: number;
|
|
@@ -38,6 +39,9 @@ export type FabricSpeculationServeResult = {
|
|
|
38
39
|
export interface FabricSpeculationRuntime {
|
|
39
40
|
tryServe(parentToolCallId: string, ref: string, preparedArgs: Record<string, unknown>, bindingToken: string): Promise<FabricSpeculationServeResult>;
|
|
40
41
|
bumpEpoch(): void;
|
|
42
|
+
stats?(): FabricSpeculationStats;
|
|
43
|
+
beginLaunch?(parentToolCallId: string): () => void;
|
|
44
|
+
settleLaunches?(parentToolCallId: string, timeoutMs: number): Promise<void>;
|
|
41
45
|
reset?(): void;
|
|
42
46
|
onInvocationEnd?(parentToolCallId: string): void;
|
|
43
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/speculation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,YAAY,EAAE,uBAAuB,EAAE,CAAC;AAGxC,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,oHAAoH;AACpH,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,GAC9D;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAA;CAAE,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CACN,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACzC,SAAS,IAAI,IAAI,CAAC;IAClB,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,eAAe,CAAC,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClD"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/speculation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,YAAY,EAAE,uBAAuB,EAAE,CAAC;AAGxC,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,oHAAoH;AACpH,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAA;CAAE,GAC9D;IAAE,GAAG,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAA;CAAE,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CACN,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACzC,SAAS,IAAI,IAAI,CAAC;IAClB,KAAK,CAAC,IAAI,sBAAsB,CAAC;IACjC,WAAW,CAAC,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IACnD,cAAc,CAAC,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,eAAe,CAAC,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ExtensionContext, MessageUpdateEvent } from "@oh-my-pi/pi-coding-agent";
|
|
2
|
+
import type { FabricSpeculationStreamTap } from "./stream-tap.js";
|
|
3
|
+
export interface FabricSpeculationWarmupOptions {
|
|
4
|
+
enabled(): boolean;
|
|
5
|
+
tap(): FabricSpeculationStreamTap | undefined;
|
|
6
|
+
activate(context: ExtensionContext): Promise<void>;
|
|
7
|
+
maxBufferedEvents?: number;
|
|
8
|
+
maxBufferedChars?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class FabricSpeculationWarmup {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(options: FabricSpeculationWarmupOptions);
|
|
13
|
+
get pending(): number;
|
|
14
|
+
reset(): void;
|
|
15
|
+
handleMessageUpdate(event: MessageUpdateEvent, context: ExtensionContext): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=warmup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"warmup.d.ts","sourceRoot":"","sources":["../../src/speculation/warmup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,WAAW,8BAA8B;IAC7C,OAAO,IAAI,OAAO,CAAC;IACnB,GAAG,IAAI,0BAA0B,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAKD,qBAAa,uBAAuB;;gBAOtB,OAAO,EAAE,8BAA8B;IAInD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,KAAK,IAAI,IAAI;IAMb,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;CA4DhF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/ui/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EACL,SAAS,EAST,YAAY,EACZ,KAAK,WAAW,EAIjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EAItB,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAWL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/ui/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/settings.js
CHANGED
|
@@ -23,8 +23,9 @@ import {
|
|
|
23
23
|
clampCompactionTokenThreshold,
|
|
24
24
|
loadFabricConfigForScope,
|
|
25
25
|
maxExecutorMemoryLimitBytes,
|
|
26
|
+
resolveAgentDir,
|
|
26
27
|
saveFabricConfig
|
|
27
|
-
} from "../chunks/chunk-
|
|
28
|
+
} from "../chunks/chunk-IFNDRFW7.js";
|
|
28
29
|
import {
|
|
29
30
|
THINKING_LEVELS,
|
|
30
31
|
thinkingLabel
|
|
@@ -92,7 +93,7 @@ var SHIKI_THEME_PRESETS = [
|
|
|
92
93
|
];
|
|
93
94
|
var RISKS = ["read", "write", "execute", "network", "agent"];
|
|
94
95
|
var CORE_RISK_TOOLS = ["read", "grep", "find", "edit", "write", "bash"];
|
|
95
|
-
var CORE_DEFAULT_TOOL_CANDIDATES = ["read", "bash", "edit", "write", "grep", "find"
|
|
96
|
+
var CORE_DEFAULT_TOOL_CANDIDATES = ["read", "bash", "edit", "write", "grep", "find"];
|
|
96
97
|
var BUDGET_VALUES = [0, 0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10];
|
|
97
98
|
var TOKEN_VALUES = [0, 5e4, 1e5, 25e4, 5e5, 1e6, 2e6];
|
|
98
99
|
var PREWALK_MODEL_UNSET_LABEL = "Ask each time";
|
|
@@ -609,7 +610,7 @@ var FabricSettingsComponent = class extends Container {
|
|
|
609
610
|
super();
|
|
610
611
|
this.theme = theme;
|
|
611
612
|
this.projectScopeAvailable = options.projectScopeAvailable ?? true;
|
|
612
|
-
this.saveScope = options.initialSaveScope === "
|
|
613
|
+
this.saveScope = options.initialSaveScope === "project" && this.projectScopeAvailable ? "project" : "global";
|
|
613
614
|
this.onChange = onChange;
|
|
614
615
|
this.onCancel = onCancel;
|
|
615
616
|
this.onSaveScopeChange = options.onSaveScopeChange ?? (() => {
|
|
@@ -1776,11 +1777,10 @@ var openRpcFabricSettings = async (context, options) => {
|
|
|
1776
1777
|
};
|
|
1777
1778
|
async function openFabricSettings(context, deps) {
|
|
1778
1779
|
await deps.state.ensure(context);
|
|
1779
|
-
const
|
|
1780
|
-
const agentDir = getAgentDir();
|
|
1780
|
+
const agentDir = resolveAgentDir();
|
|
1781
1781
|
const projectTrusted = context.isProjectTrusted();
|
|
1782
1782
|
const configLocation = { cwd: context.cwd, agentDir, projectTrusted };
|
|
1783
|
-
let saveScope =
|
|
1783
|
+
let saveScope = "global";
|
|
1784
1784
|
let settingsConfig = loadFabricConfigForScope(configLocation, saveScope);
|
|
1785
1785
|
let rootComponent;
|
|
1786
1786
|
const changedSections = /* @__PURE__ */ new Set();
|