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.
Files changed (115) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/agents/manager.d.ts.map +1 -1
  3. package/dist/agents/transports/process-transport.d.ts.map +1 -1
  4. package/dist/agents/transports/process-utils.d.ts +6 -1
  5. package/dist/agents/transports/process-utils.d.ts.map +1 -1
  6. package/dist/agents/types.d.ts +1 -0
  7. package/dist/agents/types.d.ts.map +1 -1
  8. package/dist/audit/details.d.ts +10 -0
  9. package/dist/audit/details.d.ts.map +1 -1
  10. package/dist/chunks/{chunk-GKOFZ76R.js → chunk-2LGLDM34.js} +22 -4
  11. package/dist/chunks/chunk-2LGLDM34.js.map +7 -0
  12. package/dist/chunks/{chunk-T6OAX4FO.js → chunk-3TWC6XOS.js} +37 -9
  13. package/dist/chunks/chunk-3TWC6XOS.js.map +7 -0
  14. package/dist/chunks/{chunk-ZNAJDPT7.js → chunk-B2SQR2JY.js} +32 -24
  15. package/dist/chunks/{chunk-ZNAJDPT7.js.map → chunk-B2SQR2JY.js.map} +2 -2
  16. package/dist/chunks/{chunk-SXMWV447.js → chunk-DOKANNFC.js} +206 -3
  17. package/dist/chunks/chunk-DOKANNFC.js.map +7 -0
  18. package/dist/chunks/{chunk-UPCARIJP.js → chunk-FFWALVBN.js} +20 -9
  19. package/dist/chunks/chunk-FFWALVBN.js.map +7 -0
  20. package/dist/chunks/{chunk-4LEDA76O.js → chunk-HAJPYJPY.js} +3 -3
  21. package/dist/chunks/{chunk-ROKMBLGN.js → chunk-IFNDRFW7.js} +34 -14
  22. package/dist/chunks/chunk-IFNDRFW7.js.map +7 -0
  23. package/dist/chunks/{chunk-ZTM45GH5.js → chunk-JZWLICMS.js} +125 -42
  24. package/dist/chunks/chunk-JZWLICMS.js.map +7 -0
  25. package/dist/chunks/{chunk-5GTPD4BA.js → chunk-L2FNMIOW.js} +66 -22
  26. package/dist/chunks/chunk-L2FNMIOW.js.map +7 -0
  27. package/dist/chunks/chunk-NX4SNIMR.js +226 -0
  28. package/dist/chunks/chunk-NX4SNIMR.js.map +7 -0
  29. package/dist/chunks/{chunk-YZZIKJX6.js → chunk-RBA54WC7.js} +1 -1
  30. package/dist/chunks/{chunk-YZZIKJX6.js.map → chunk-RBA54WC7.js.map} +1 -1
  31. package/dist/chunks/{chunk-OPTP4PSE.js → chunk-YPYVUGON.js} +3 -23
  32. package/dist/chunks/chunk-YPYVUGON.js.map +7 -0
  33. package/dist/chunks/{chunk-JP4LIZFT.js → chunk-Z6HEQPXX.js} +23 -6
  34. package/dist/chunks/chunk-Z6HEQPXX.js.map +7 -0
  35. package/dist/commands/fabric.d.ts.map +1 -1
  36. package/dist/core/action-registry.d.ts +2 -1
  37. package/dist/core/action-registry.d.ts.map +1 -1
  38. package/dist/core/action-registry.js +2 -2
  39. package/dist/core/compact-controller.d.ts +28 -3
  40. package/dist/core/compact-controller.d.ts.map +1 -1
  41. package/dist/core/compact-outcome-store.d.ts +3 -0
  42. package/dist/core/compact-outcome-store.d.ts.map +1 -0
  43. package/dist/entropy/index.js +2 -2
  44. package/dist/entropy/sessions.d.ts.map +1 -1
  45. package/dist/execution-service.d.ts.map +1 -1
  46. package/dist/fabric-exec-tool.d.ts.map +1 -1
  47. package/dist/fabric-runtime-state.d.ts.map +1 -1
  48. package/dist/fabric-runtime-state.js +883 -367
  49. package/dist/fabric-runtime-state.js.map +4 -4
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +116 -18
  52. package/dist/index.js.map +3 -3
  53. package/dist/memory/discovery.d.ts +28 -14
  54. package/dist/memory/discovery.d.ts.map +1 -1
  55. package/dist/memory/discovery.js +9 -5
  56. package/dist/protocol.d.ts +5 -0
  57. package/dist/protocol.d.ts.map +1 -1
  58. package/dist/protocol.js +1 -1
  59. package/dist/providers/mcp-descriptor-cache.d.ts +2 -0
  60. package/dist/providers/mcp-descriptor-cache.d.ts.map +1 -1
  61. package/dist/providers/mcp-provider.d.ts +4 -2
  62. package/dist/providers/mcp-provider.d.ts.map +1 -1
  63. package/dist/providers/memory-provider.d.ts.map +1 -1
  64. package/dist/providers/memory-provider.js +2 -2
  65. package/dist/providers/omp-tools-provider.d.ts +1 -0
  66. package/dist/providers/omp-tools-provider.d.ts.map +1 -1
  67. package/dist/residency/host.js +5 -5
  68. package/dist/residency/omp-entry.js +5 -5
  69. package/dist/runtime/core-override-guest-types.js +1 -1
  70. package/dist/runtime/guest-types.d.ts +2 -2
  71. package/dist/runtime/guest-types.d.ts.map +1 -1
  72. package/dist/runtime/guest-types.js +1 -1
  73. package/dist/runtime/node-process-child-source.d.ts.map +1 -1
  74. package/dist/runtime/node-process-runtime.d.ts.map +1 -1
  75. package/dist/runtime/node-process-runtime.js +4 -2
  76. package/dist/runtime/node-process-runtime.js.map +2 -2
  77. package/dist/runtime/quickjs-runtime.d.ts +6 -1
  78. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  79. package/dist/runtime/quickjs-runtime.js +1 -1
  80. package/dist/speculation/guest-args.d.ts +2 -0
  81. package/dist/speculation/guest-args.d.ts.map +1 -0
  82. package/dist/speculation/scanner.d.ts.map +1 -1
  83. package/dist/speculation/scanner.js +312 -14
  84. package/dist/speculation/scanner.js.map +3 -3
  85. package/dist/speculation/store.d.ts +2 -0
  86. package/dist/speculation/store.d.ts.map +1 -1
  87. package/dist/speculation/stream-tap.d.ts +1 -0
  88. package/dist/speculation/stream-tap.d.ts.map +1 -1
  89. package/dist/speculation/summary.d.ts +4 -0
  90. package/dist/speculation/summary.d.ts.map +1 -0
  91. package/dist/speculation/types.d.ts +4 -0
  92. package/dist/speculation/types.d.ts.map +1 -1
  93. package/dist/speculation/warmup.d.ts +17 -0
  94. package/dist/speculation/warmup.d.ts.map +1 -0
  95. package/dist/ui/settings.d.ts.map +1 -1
  96. package/dist/ui/settings.js +6 -6
  97. package/dist/ui/settings.js.map +2 -2
  98. package/docs/agents.md +1 -1
  99. package/docs/compaction.md +2 -2
  100. package/docs/configuration.md +26 -12
  101. package/docs/interface.md +2 -2
  102. package/docs/speculation.md +11 -6
  103. package/package.json +3 -2
  104. package/dist/chunks/chunk-5GTPD4BA.js.map +0 -7
  105. package/dist/chunks/chunk-7BIA5BJN.js +0 -112
  106. package/dist/chunks/chunk-7BIA5BJN.js.map +0 -7
  107. package/dist/chunks/chunk-GKOFZ76R.js.map +0 -7
  108. package/dist/chunks/chunk-JP4LIZFT.js.map +0 -7
  109. package/dist/chunks/chunk-OPTP4PSE.js.map +0 -7
  110. package/dist/chunks/chunk-ROKMBLGN.js.map +0 -7
  111. package/dist/chunks/chunk-SXMWV447.js.map +0 -7
  112. package/dist/chunks/chunk-T6OAX4FO.js.map +0 -7
  113. package/dist/chunks/chunk-UPCARIJP.js.map +0 -7
  114. package/dist/chunks/chunk-ZTM45GH5.js.map +0 -7
  115. /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
- // Zero-arg calls mean `{}`; a single object literal is the documented
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
- if (node.arguments.length !== 1) return void 0;
147
- const only = node.arguments[0];
148
- if (ts.isSpreadElement(only)) return void 0;
149
- const value = evalLiteral(only);
150
- if (!value.ok) return void 0;
151
- if (typeof value.value !== "object" || value.value === null || Array.isArray(value.value) || !isJsonShape(value.value)) {
152
- return void 0;
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 value.value;
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;;gBAgBzD,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;;;;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;IAmCJ,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;IA0BxC,2EAA2E;IAC3E,eAAe,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAS/C,wDAAwD;IACxD,KAAK,IAAI,IAAI;CAqBd"}
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;AAsBD;;;;;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"}
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":"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"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/ui/settings.ts"],"names":[],"mappings":"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"}
@@ -23,8 +23,9 @@ import {
23
23
  clampCompactionTokenThreshold,
24
24
  loadFabricConfigForScope,
25
25
  maxExecutorMemoryLimitBytes,
26
+ resolveAgentDir,
26
27
  saveFabricConfig
27
- } from "../chunks/chunk-ROKMBLGN.js";
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", "ls"];
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 === "global" || !this.projectScopeAvailable ? "global" : "project";
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 { getAgentDir } = await import("@oh-my-pi/pi-utils");
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 = projectTrusted ? "project" : "global";
1783
+ let saveScope = "global";
1784
1784
  let settingsConfig = loadFabricConfigForScope(configLocation, saveScope);
1785
1785
  let rootComponent;
1786
1786
  const changedSections = /* @__PURE__ */ new Set();