pi-fabric 0.1.0

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 (203) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +635 -0
  3. package/THIRD_PARTY_NOTICES.md +9 -0
  4. package/dist/activity/store.d.ts +27 -0
  5. package/dist/activity/store.d.ts.map +1 -0
  6. package/dist/activity/store.js +474 -0
  7. package/dist/activity/store.js.map +1 -0
  8. package/dist/activity/types.d.ts +101 -0
  9. package/dist/activity/types.d.ts.map +1 -0
  10. package/dist/activity/types.js +2 -0
  11. package/dist/activity/types.js.map +1 -0
  12. package/dist/actors/context.d.ts +13 -0
  13. package/dist/actors/context.d.ts.map +1 -0
  14. package/dist/actors/context.js +155 -0
  15. package/dist/actors/context.js.map +1 -0
  16. package/dist/actors/manager.d.ts +33 -0
  17. package/dist/actors/manager.d.ts.map +1 -0
  18. package/dist/actors/manager.js +751 -0
  19. package/dist/actors/manager.js.map +1 -0
  20. package/dist/actors/types.d.ts +67 -0
  21. package/dist/actors/types.d.ts.map +1 -0
  22. package/dist/actors/types.js +2 -0
  23. package/dist/actors/types.js.map +1 -0
  24. package/dist/capture/catalog.d.ts +23 -0
  25. package/dist/capture/catalog.d.ts.map +1 -0
  26. package/dist/capture/catalog.js +53 -0
  27. package/dist/capture/catalog.js.map +1 -0
  28. package/dist/capture/interceptor.d.ts +13 -0
  29. package/dist/capture/interceptor.d.ts.map +1 -0
  30. package/dist/capture/interceptor.js +130 -0
  31. package/dist/capture/interceptor.js.map +1 -0
  32. package/dist/commands/fabric.d.ts +14 -0
  33. package/dist/commands/fabric.d.ts.map +1 -0
  34. package/dist/commands/fabric.js +237 -0
  35. package/dist/commands/fabric.js.map +1 -0
  36. package/dist/config.d.ts +89 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +255 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/core/action-registry.d.ts +71 -0
  41. package/dist/core/action-registry.d.ts.map +1 -0
  42. package/dist/core/action-registry.js +273 -0
  43. package/dist/core/action-registry.js.map +1 -0
  44. package/dist/core/approval-controller.d.ts +11 -0
  45. package/dist/core/approval-controller.d.ts.map +1 -0
  46. package/dist/core/approval-controller.js +45 -0
  47. package/dist/core/approval-controller.js.map +1 -0
  48. package/dist/core/pi-tools.d.ts +4 -0
  49. package/dist/core/pi-tools.d.ts.map +1 -0
  50. package/dist/core/pi-tools.js +11 -0
  51. package/dist/core/pi-tools.js.map +1 -0
  52. package/dist/core/tool-ownership.d.ts +12 -0
  53. package/dist/core/tool-ownership.d.ts.map +1 -0
  54. package/dist/core/tool-ownership.js +41 -0
  55. package/dist/core/tool-ownership.js.map +1 -0
  56. package/dist/execution-service.d.ts +41 -0
  57. package/dist/execution-service.d.ts.map +1 -0
  58. package/dist/execution-service.js +210 -0
  59. package/dist/execution-service.js.map +1 -0
  60. package/dist/fabric-state.d.ts +38 -0
  61. package/dist/fabric-state.d.ts.map +1 -0
  62. package/dist/fabric-state.js +275 -0
  63. package/dist/fabric-state.js.map +1 -0
  64. package/dist/index.d.ts +4 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +491 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/mesh/store.d.ts +68 -0
  69. package/dist/mesh/store.d.ts.map +1 -0
  70. package/dist/mesh/store.js +387 -0
  71. package/dist/mesh/store.js.map +1 -0
  72. package/dist/protocol.d.ts +62 -0
  73. package/dist/protocol.d.ts.map +1 -0
  74. package/dist/protocol.js +3 -0
  75. package/dist/protocol.js.map +1 -0
  76. package/dist/providers/agents-provider.d.ts +15 -0
  77. package/dist/providers/agents-provider.d.ts.map +1 -0
  78. package/dist/providers/agents-provider.js +393 -0
  79. package/dist/providers/agents-provider.js.map +1 -0
  80. package/dist/providers/captured-tools-provider.d.ts +23 -0
  81. package/dist/providers/captured-tools-provider.d.ts.map +1 -0
  82. package/dist/providers/captured-tools-provider.js +170 -0
  83. package/dist/providers/captured-tools-provider.js.map +1 -0
  84. package/dist/providers/mcp-provider.d.ts +15 -0
  85. package/dist/providers/mcp-provider.d.ts.map +1 -0
  86. package/dist/providers/mcp-provider.js +289 -0
  87. package/dist/providers/mcp-provider.js.map +1 -0
  88. package/dist/providers/mesh-provider.d.ts +13 -0
  89. package/dist/providers/mesh-provider.d.ts.map +1 -0
  90. package/dist/providers/mesh-provider.js +175 -0
  91. package/dist/providers/mesh-provider.js.map +1 -0
  92. package/dist/providers/pi-tools-provider.d.ts +14 -0
  93. package/dist/providers/pi-tools-provider.d.ts.map +1 -0
  94. package/dist/providers/pi-tools-provider.js +200 -0
  95. package/dist/providers/pi-tools-provider.js.map +1 -0
  96. package/dist/runtime/guest-types.d.ts +3 -0
  97. package/dist/runtime/guest-types.d.ts.map +1 -0
  98. package/dist/runtime/guest-types.js +313 -0
  99. package/dist/runtime/guest-types.js.map +1 -0
  100. package/dist/runtime/quickjs-runtime.d.ts +18 -0
  101. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  102. package/dist/runtime/quickjs-runtime.js +538 -0
  103. package/dist/runtime/quickjs-runtime.js.map +1 -0
  104. package/dist/runtime/type-checker.d.ts +10 -0
  105. package/dist/runtime/type-checker.d.ts.map +1 -0
  106. package/dist/runtime/type-checker.js +71 -0
  107. package/dist/runtime/type-checker.js.map +1 -0
  108. package/dist/subagents/budget-ledger.d.ts +61 -0
  109. package/dist/subagents/budget-ledger.d.ts.map +1 -0
  110. package/dist/subagents/budget-ledger.js +92 -0
  111. package/dist/subagents/budget-ledger.js.map +1 -0
  112. package/dist/subagents/manager.d.ts +27 -0
  113. package/dist/subagents/manager.d.ts.map +1 -0
  114. package/dist/subagents/manager.js +497 -0
  115. package/dist/subagents/manager.js.map +1 -0
  116. package/dist/subagents/semaphore.d.ts +7 -0
  117. package/dist/subagents/semaphore.d.ts.map +1 -0
  118. package/dist/subagents/semaphore.js +54 -0
  119. package/dist/subagents/semaphore.js.map +1 -0
  120. package/dist/subagents/transports/localterm-transport.d.ts +7 -0
  121. package/dist/subagents/transports/localterm-transport.d.ts.map +1 -0
  122. package/dist/subagents/transports/localterm-transport.js +54 -0
  123. package/dist/subagents/transports/localterm-transport.js.map +1 -0
  124. package/dist/subagents/transports/process-transport.d.ts +7 -0
  125. package/dist/subagents/transports/process-transport.d.ts.map +1 -0
  126. package/dist/subagents/transports/process-transport.js +17 -0
  127. package/dist/subagents/transports/process-transport.js.map +1 -0
  128. package/dist/subagents/transports/process-utils.d.ts +16 -0
  129. package/dist/subagents/transports/process-utils.d.ts.map +1 -0
  130. package/dist/subagents/transports/process-utils.js +57 -0
  131. package/dist/subagents/transports/process-utils.js.map +1 -0
  132. package/dist/subagents/transports/screen-transport.d.ts +7 -0
  133. package/dist/subagents/transports/screen-transport.d.ts.map +1 -0
  134. package/dist/subagents/transports/screen-transport.js +33 -0
  135. package/dist/subagents/transports/screen-transport.js.map +1 -0
  136. package/dist/subagents/transports/tmux-transport.d.ts +7 -0
  137. package/dist/subagents/transports/tmux-transport.d.ts.map +1 -0
  138. package/dist/subagents/transports/tmux-transport.js +41 -0
  139. package/dist/subagents/transports/tmux-transport.js.map +1 -0
  140. package/dist/subagents/types.d.ts +132 -0
  141. package/dist/subagents/types.d.ts.map +1 -0
  142. package/dist/subagents/types.js +2 -0
  143. package/dist/subagents/types.js.map +1 -0
  144. package/dist/subagents/worktree-manager.d.ts +12 -0
  145. package/dist/subagents/worktree-manager.d.ts.map +1 -0
  146. package/dist/subagents/worktree-manager.js +53 -0
  147. package/dist/subagents/worktree-manager.js.map +1 -0
  148. package/dist/ui/controller.d.ts +14 -0
  149. package/dist/ui/controller.d.ts.map +1 -0
  150. package/dist/ui/controller.js +153 -0
  151. package/dist/ui/controller.js.map +1 -0
  152. package/dist/ui/dashboard.d.ts +36 -0
  153. package/dist/ui/dashboard.d.ts.map +1 -0
  154. package/dist/ui/dashboard.js +620 -0
  155. package/dist/ui/dashboard.js.map +1 -0
  156. package/dist/ui/fabric-render.d.ts +28 -0
  157. package/dist/ui/fabric-render.d.ts.map +1 -0
  158. package/dist/ui/fabric-render.js +280 -0
  159. package/dist/ui/fabric-render.js.map +1 -0
  160. package/dist/ui/format.d.ts +7 -0
  161. package/dist/ui/format.d.ts.map +1 -0
  162. package/dist/ui/format.js +57 -0
  163. package/dist/ui/format.js.map +1 -0
  164. package/dist/ui/highlight.d.ts +13 -0
  165. package/dist/ui/highlight.d.ts.map +1 -0
  166. package/dist/ui/highlight.js +337 -0
  167. package/dist/ui/highlight.js.map +1 -0
  168. package/dist/ui/settings.d.ts +21 -0
  169. package/dist/ui/settings.d.ts.map +1 -0
  170. package/dist/ui/settings.js +480 -0
  171. package/dist/ui/settings.js.map +1 -0
  172. package/dist/ui/snapshot.d.ts +5 -0
  173. package/dist/ui/snapshot.d.ts.map +1 -0
  174. package/dist/ui/snapshot.js +120 -0
  175. package/dist/ui/snapshot.js.map +1 -0
  176. package/dist/ui/types.d.ts +57 -0
  177. package/dist/ui/types.d.ts.map +1 -0
  178. package/dist/ui/types.js +11 -0
  179. package/dist/ui/types.js.map +1 -0
  180. package/dist/ui/widget.d.ts +16 -0
  181. package/dist/ui/widget.d.ts.map +1 -0
  182. package/dist/ui/widget.js +199 -0
  183. package/dist/ui/widget.js.map +1 -0
  184. package/dist/util.d.ts +2 -0
  185. package/dist/util.d.ts.map +1 -0
  186. package/dist/util.js +10 -0
  187. package/dist/util.js.map +1 -0
  188. package/dist/worker.d.ts +3 -0
  189. package/dist/worker.d.ts.map +1 -0
  190. package/dist/worker.js +478 -0
  191. package/dist/worker.js.map +1 -0
  192. package/package.json +87 -0
  193. package/skills/fabric-advisor/SKILL.md +53 -0
  194. package/skills/fabric-ambient/SKILL.md +84 -0
  195. package/skills/fabric-council/SKILL.md +37 -0
  196. package/skills/fabric-exec/SKILL.md +39 -0
  197. package/skills/fabric-exec/references/agents.md +78 -0
  198. package/skills/fabric-exec/references/mcp.md +46 -0
  199. package/skills/fabric-exec/references/mesh.md +42 -0
  200. package/skills/fabric-rlm/SKILL.md +84 -0
  201. package/skills/fabric-supervisor/SKILL.md +63 -0
  202. package/skills/fabric-swarm/SKILL.md +85 -0
  203. package/skills/fabric-workflow/SKILL.md +69 -0
@@ -0,0 +1,538 @@
1
+ import releaseSyncVariant from "@jitl/quickjs-singlefile-mjs-release-sync";
2
+ import { newQuickJSWASMModuleFromVariant, shouldInterruptAfterDeadline, } from "quickjs-emscripten-core";
3
+ import ts from "typescript";
4
+ let quickJsModulePromise;
5
+ const quickJsModule = () => {
6
+ quickJsModulePromise ??= newQuickJSWASMModuleFromVariant(releaseSyncVariant);
7
+ return quickJsModulePromise;
8
+ };
9
+ const guestSetup = `
10
+ const __call = (ref, args) => globalThis.__fabricHostCall(ref, args ?? {});
11
+ globalThis.tools = Object.freeze({
12
+ providers: () => __call("fabric.$providers", {}),
13
+ list: (args = {}) => __call("fabric.$list", args),
14
+ search: (args) => __call("fabric.$search", args),
15
+ describe: (args) => __call("fabric.$describe", args),
16
+ call: (args) => __call("fabric.$call", args),
17
+ progress: (args) => __call("fabric.$progress", args),
18
+ });
19
+ const __piStringFields = { bash: "command", read: "path", ls: "path", grep: "pattern", find: "pattern" };
20
+ const __piArgAliases = {
21
+ bash: { cmd: "command" },
22
+ find: { query: "pattern" },
23
+ grep: { query: "pattern" },
24
+ read: { file: "path" },
25
+ ls: { dir: "path", file: "path" },
26
+ edit: { file: "path" },
27
+ write: { file: "path" },
28
+ };
29
+ const __normalizePiArgs = (name, args) => {
30
+ const field = __piStringFields[name];
31
+ if (typeof args === "string" && field) return { [field]: args };
32
+ if (args === null || typeof args !== "object" || Array.isArray(args)) return args;
33
+ const aliases = __piArgAliases[name];
34
+ let out = args;
35
+ if (aliases) {
36
+ for (const alias in aliases) {
37
+ const canonical = aliases[alias];
38
+ if (alias in out) {
39
+ if (out === args) out = Object.assign({}, args);
40
+ if (!(canonical in out)) out[canonical] = out[alias];
41
+ delete out[alias];
42
+ }
43
+ }
44
+ }
45
+ if (name === "edit" && !Array.isArray(out.edits) && ("oldText" in out || "newText" in out)) {
46
+ if (out === args) out = Object.assign({}, args);
47
+ const edit = {};
48
+ if ("oldText" in out) edit.oldText = out.oldText;
49
+ if ("newText" in out) edit.newText = out.newText;
50
+ out.edits = [edit];
51
+ delete out.oldText;
52
+ delete out.newText;
53
+ }
54
+ return out;
55
+ };
56
+ globalThis.pi = new Proxy({}, {
57
+ get(_target, property) {
58
+ if (property === "then") return undefined;
59
+ const name = String(property);
60
+ return (args = {}) => __call("pi." + name, __normalizePiArgs(name, args));
61
+ },
62
+ });
63
+ const __piStrings = (typeof globalThis["π"] === "object" && globalThis["π"] !== null) ? globalThis["π"] : {};
64
+ const __piToolNames = ["read","bash","edit","write","grep","find","ls"];
65
+ globalThis["π"] = new Proxy(__piStrings, {
66
+ get(target, property) {
67
+ if (typeof property === "symbol") return undefined;
68
+ const name = String(property);
69
+ if (name === "then" || name === "toJSON" || name === "constructor") return undefined;
70
+ if (Object.prototype.hasOwnProperty.call(target, name)) return target[name];
71
+ if (__piToolNames.indexOf(name) >= 0) {
72
+ throw new Error(
73
+ "π." + name + " is the strings accessor, not a tool. For the Pi core tool, call pi." + name + "(args)."
74
+ );
75
+ }
76
+ const provided = Object.keys(target);
77
+ throw new Error(
78
+ "π." + name + " is not defined. π only exposes keys from the fabric_exec strings parameter" +
79
+ (provided.length ? " (provided: " + provided.join(", ") + ")" : " (none provided)") +
80
+ ". Pass strings: { " + name + ": '...' } to use π." + name + "."
81
+ );
82
+ },
83
+ ownKeys(target) { return Reflect.ownKeys(target); },
84
+ getOwnPropertyDescriptor(target, prop) { return Reflect.getOwnPropertyDescriptor(target, prop); },
85
+ has(target, prop) { return Object.prototype.hasOwnProperty.call(target, prop); }
86
+ });
87
+ globalThis.extensions = new Proxy({}, {
88
+ get(_target, property) {
89
+ if (property === "then") return undefined;
90
+ return (args = {}) => __call("extensions." + String(property), args);
91
+ },
92
+ });
93
+ globalThis.agents = Object.freeze({
94
+ run: (args) => __call("agents.run", args),
95
+ spawn: (args) => __call("agents.spawn", args),
96
+ wait: (args) => __call("agents.wait", args),
97
+ status: (args) => __call("agents.status", args),
98
+ list: () => __call("agents.list", {}),
99
+ stop: (args) => __call("agents.stop", args),
100
+ cleanup: (args) => __call("agents.cleanup", args),
101
+ create: (args) => __call("agents.create", args),
102
+ ask: (args) => __call("agents.ask", args),
103
+ tell: (args) => __call("agents.tell", args),
104
+ actorStatus: (args) => __call("agents.actorStatus", args),
105
+ actors: () => __call("agents.actors", {}),
106
+ messages: (args) => __call("agents.messages", args),
107
+ remove: (args) => __call("agents.remove", args),
108
+ });
109
+ globalThis.mesh = Object.freeze({
110
+ self: () => __call("mesh.self", {}),
111
+ publish: (args) => __call("mesh.publish", args),
112
+ read: (args = {}) => __call("mesh.read", args),
113
+ members: (args = {}) => __call("mesh.members", args),
114
+ get: (args) => __call("mesh.get", args),
115
+ list: (args = {}) => __call("mesh.list", args),
116
+ put: (args) => __call("mesh.put", args),
117
+ delete: (args) => __call("mesh.delete", args),
118
+ });
119
+ globalThis.mcp = new Proxy({}, {
120
+ get(_target, server) {
121
+ if (server === "then") return undefined;
122
+ if (server === "servers") return () => __call("mcp.$servers", {});
123
+ if (server === "reload") return () => __call("mcp.$reload", {});
124
+ if (server === "register") return (args) => __call("mcp.$register", args);
125
+ if (server === "call") return (args) => __call("mcp.$call", args);
126
+ return new Proxy({}, {
127
+ get(_serverTarget, tool) {
128
+ if (tool === "then") return undefined;
129
+ return (args = {}) => __call("mcp." + String(server) + "." + String(tool), args);
130
+ },
131
+ });
132
+ },
133
+ });
134
+ let __workflowSpentTokens = 0;
135
+ const __workflowBudgetTotal = Number.isFinite(globalThis.__fabricTokenBudget)
136
+ ? Math.max(0, globalThis.__fabricTokenBudget)
137
+ : Number.POSITIVE_INFINITY;
138
+ const __recordAgentUsage = (result) => {
139
+ const usage = result && result.usage;
140
+ if (usage) __workflowSpentTokens += Number(usage.input || 0) + Number(usage.output || 0);
141
+ return result;
142
+ };
143
+ const __workflowAgent = async (prompt, options = {}) => {
144
+ if (__workflowSpentTokens >= __workflowBudgetTotal) {
145
+ throw new Error("Fabric workflow token budget exhausted");
146
+ }
147
+ const { label, ...agentOptions } = options;
148
+ const workerName = String(label || agentOptions.name || "Fabric workflow agent");
149
+ const result = __recordAgentUsage(await agents.run({
150
+ ...agentOptions,
151
+ ...(label && !agentOptions.name ? { name: label } : {}),
152
+ task: prompt,
153
+ }));
154
+ if (!result || result.status !== "completed") {
155
+ const reason = result && result.error ? result.error : "agent did not complete";
156
+ throw new Error(workerName + " failed: " + reason);
157
+ }
158
+ return result.value !== undefined ? result.value : result.text;
159
+ };
160
+ const __runParallel = async (thunks, options) => {
161
+ if (!Array.isArray(thunks) || thunks.some((thunk) => typeof thunk !== "function")) {
162
+ throw new TypeError("workflow.parallel expects an array of functions or (items, mapper)");
163
+ }
164
+ if (thunks.length === 0) return [];
165
+ const concurrencyOpt = typeof options === "number" ? { concurrency: options } : options ?? {};
166
+ const requestedConcurrency = Number(concurrencyOpt.concurrency ?? thunks.length);
167
+ if (!Number.isFinite(requestedConcurrency) || requestedConcurrency < 1) {
168
+ throw new RangeError("workflow.parallel concurrency must be a positive finite number");
169
+ }
170
+ const concurrency = Math.max(1, Math.min(thunks.length || 1, Math.floor(requestedConcurrency)));
171
+ const results = new Array(thunks.length);
172
+ let cursor = 0;
173
+ await Promise.all(Array.from({ length: concurrency }, async () => {
174
+ while (cursor < thunks.length) {
175
+ const index = cursor++;
176
+ results[index] = await thunks[index]();
177
+ }
178
+ }));
179
+ return results;
180
+ };
181
+ const __workflowParallel = async (items, arg2, arg3) => {
182
+ if (typeof arg2 === "function") {
183
+ if (!Array.isArray(items)) throw new TypeError("workflow.parallel expects an array as the first argument");
184
+ return __runParallel(items.map((item, index) => () => arg2(item, index)), arg3);
185
+ }
186
+ return __runParallel(items, arg2);
187
+ };
188
+ const __workflowPipeline = async (items, ...stages) => {
189
+ if (!Array.isArray(items) || stages.some((stage) => typeof stage !== "function")) {
190
+ throw new TypeError("workflow.pipeline expects an array followed by stage functions");
191
+ }
192
+ return __workflowParallel(items.map((original, index) => async () => {
193
+ let value = original;
194
+ for (const stage of stages) value = await stage(value, original, index);
195
+ return value;
196
+ }));
197
+ };
198
+ globalThis.workflow = Object.freeze({
199
+ agent: __workflowAgent,
200
+ parallel: __workflowParallel,
201
+ pipeline: __workflowPipeline,
202
+ configure: (args) => __call("fabric.$configure", args),
203
+ phase: (name, options = {}) => __call("fabric.$phase", { ...options, name }),
204
+ item: (args) => __call("fabric.$item", args),
205
+ event: (args) => __call("fabric.$event", args),
206
+ log: (...values) => print(...values),
207
+ budget: Object.freeze({
208
+ total: __workflowBudgetTotal,
209
+ spent: () => __workflowSpentTokens,
210
+ remaining: () => Math.max(0, __workflowBudgetTotal - __workflowSpentTokens),
211
+ }),
212
+ });
213
+ globalThis.agent = __workflowAgent;
214
+ globalThis.parallel = __workflowParallel;
215
+ globalThis.pipeline = __workflowPipeline;
216
+ globalThis.phase = workflow.phase;
217
+ globalThis.log = workflow.log;
218
+ globalThis.budget = workflow.budget;
219
+ globalThis.rlm = Object.freeze({
220
+ query: (args) => agents.run({ ...args, recursive: true }),
221
+ });
222
+ globalThis.council = Object.freeze({
223
+ async run(args) {
224
+ const { task, roles, synthesize = true, ...agentOptions } = args;
225
+ const results = await Promise.all(roles.map((role) => agents.run({
226
+ ...agentOptions,
227
+ name: role,
228
+ task: "Act as the " + role + " council member. Independently analyze this task:\\n\\n" + task,
229
+ })));
230
+ if (!synthesize) return results;
231
+ return agents.run({
232
+ ...agentOptions,
233
+ name: "council-synthesizer",
234
+ task: "Synthesize the council's independent reports into one decision. Preserve disagreements and cite which role raised each concern.\\n\\nTask:\\n" + task + "\\n\\nReports:\\n" + JSON.stringify(results),
235
+ });
236
+ },
237
+ });
238
+ globalThis.console = Object.freeze({ log: print, info: print, warn: print, error: print });
239
+ const __timerCallbacks = new Map();
240
+ let __nextTimerId = 1;
241
+ globalThis.setTimeout = (callback, ms = 0) => {
242
+ const id = __nextTimerId++;
243
+ __timerCallbacks.set(id, { callback, interval: false });
244
+ __call("fabric.$timer", { ms }).then(() => {
245
+ const entry = __timerCallbacks.get(id);
246
+ if (!entry) return;
247
+ __timerCallbacks.delete(id);
248
+ try { entry.callback(); } catch { /* swallow timer callback errors */ }
249
+ });
250
+ return id;
251
+ };
252
+ globalThis.setInterval = (callback, ms = 0) => {
253
+ const id = __nextTimerId++;
254
+ __timerCallbacks.set(id, { callback, interval: true });
255
+ const schedule = () => {
256
+ __call("fabric.$timer", { ms }).then(() => {
257
+ const entry = __timerCallbacks.get(id);
258
+ if (!entry) return;
259
+ try { entry.callback(); } catch { /* swallow timer callback errors */ }
260
+ if (__timerCallbacks.has(id)) schedule();
261
+ });
262
+ };
263
+ schedule();
264
+ return id;
265
+ };
266
+ globalThis.clearTimeout = (id) => { __timerCallbacks.delete(id); };
267
+ globalThis.clearInterval = (id) => { __timerCallbacks.delete(id); };
268
+ `;
269
+ const transpile = (code) => ts.transpileModule(code, {
270
+ compilerOptions: {
271
+ target: ts.ScriptTarget.ES2022,
272
+ module: ts.ModuleKind.ESNext,
273
+ },
274
+ }).outputText;
275
+ const formatValue = (value) => {
276
+ if (typeof value === "string")
277
+ return value;
278
+ if (value instanceof Error)
279
+ return value.stack ?? value.message;
280
+ try {
281
+ return JSON.stringify(value);
282
+ }
283
+ catch {
284
+ return String(value);
285
+ }
286
+ };
287
+ const jsonText = (value) => {
288
+ const serialized = JSON.stringify(value);
289
+ if (serialized === undefined)
290
+ return "null";
291
+ return serialized;
292
+ };
293
+ const jsonHandle = (context, value) => {
294
+ if (value === undefined)
295
+ return context.undefined;
296
+ const result = context.evalCode(`JSON.parse(${JSON.stringify(jsonText(value))})`);
297
+ return context.unwrapResult(result);
298
+ };
299
+ const resolveQuickJsPromise = async (context, runtime, promiseHandle, hardDeadlineMs) => {
300
+ const resolution = context.resolvePromise(promiseHandle);
301
+ let settled = false;
302
+ void resolution.finally(() => {
303
+ settled = true;
304
+ });
305
+ while (!settled) {
306
+ if (Date.now() > hardDeadlineMs)
307
+ break;
308
+ runtime.executePendingJobs();
309
+ await new Promise((resolve) => setImmediate(resolve));
310
+ }
311
+ return resolution;
312
+ };
313
+ export class QuickJsRuntime {
314
+ async execute(code, hostCall, options) {
315
+ if (options.signal?.aborted) {
316
+ return { value: undefined, logs: [], error: "Execution cancelled" };
317
+ }
318
+ const module = await quickJsModule();
319
+ const context = module.newContext();
320
+ const runtime = context.runtime;
321
+ runtime.setMemoryLimit(options.memoryLimitBytes);
322
+ runtime.setInterruptHandler(shouldInterruptAfterDeadline(Date.now() + options.timeoutMs));
323
+ const logs = [];
324
+ const maxLogChars = options.maxLogChars ?? 100_000;
325
+ let logChars = 0;
326
+ let logsTruncated = false;
327
+ const pendingHostPromises = new Set();
328
+ const hostTasks = new Set();
329
+ const pendingTimers = new Set();
330
+ let closing = false;
331
+ let cancelled = false;
332
+ let timedOut = false;
333
+ let timeout;
334
+ let abortHandler;
335
+ let activePromiseHandle;
336
+ let executionGate;
337
+ let pendingResolution;
338
+ const hostAbortController = new AbortController();
339
+ const abortHostCalls = (reason) => {
340
+ if (!hostAbortController.signal.aborted) {
341
+ hostAbortController.abort(new Error(reason));
342
+ }
343
+ };
344
+ const rejectExecutionGate = (message) => {
345
+ if (!executionGate || executionGate.alive === false)
346
+ return;
347
+ const errorHandle = context.newError(message);
348
+ executionGate.reject(errorHandle);
349
+ errorHandle.dispose();
350
+ runtime.executePendingJobs();
351
+ };
352
+ try {
353
+ const hostFunction = context.newFunction("__fabricHostCall", (referenceHandle, argsHandle) => {
354
+ const reference = context.getString(referenceHandle);
355
+ const dumpedArgs = context.dump(argsHandle);
356
+ const args = typeof dumpedArgs === "object" && dumpedArgs !== null && !Array.isArray(dumpedArgs)
357
+ ? dumpedArgs
358
+ : {};
359
+ const promise = context.newPromise();
360
+ pendingHostPromises.add(promise);
361
+ void promise.settled.then(() => pendingHostPromises.delete(promise));
362
+ if (reference === "fabric.$timer") {
363
+ const ms = Math.max(0, Number(args.ms ?? 0));
364
+ const timer = setTimeout(() => {
365
+ if (closing || promise.alive === false)
366
+ return;
367
+ promise.resolve(context.undefined);
368
+ runtime.executePendingJobs();
369
+ }, ms);
370
+ timer.unref?.();
371
+ pendingTimers.add(timer);
372
+ void promise.settled.then(() => pendingTimers.delete(timer));
373
+ return promise.handle;
374
+ }
375
+ const task = hostCall(reference, args, hostAbortController.signal)
376
+ .then((value) => {
377
+ if (closing || promise.alive === false)
378
+ return;
379
+ const handle = jsonHandle(context, value);
380
+ promise.resolve(handle);
381
+ handle.dispose();
382
+ })
383
+ .catch((error) => {
384
+ if (closing || promise.alive === false)
385
+ return;
386
+ const errorHandle = context.newError(error instanceof Error ? error.message : String(error));
387
+ promise.reject(errorHandle);
388
+ errorHandle.dispose();
389
+ })
390
+ .finally(() => {
391
+ if (!closing)
392
+ runtime.executePendingJobs();
393
+ });
394
+ hostTasks.add(task);
395
+ void task.finally(() => hostTasks.delete(task));
396
+ return promise.handle;
397
+ });
398
+ context.setProp(context.global, "__fabricHostCall", hostFunction);
399
+ hostFunction.dispose();
400
+ const printFunction = context.newFunction("print", (...handles) => {
401
+ if (logsTruncated)
402
+ return;
403
+ const line = handles.map((handle) => formatValue(context.dump(handle))).join(" ");
404
+ const remaining = maxLogChars - logChars;
405
+ if (line.length > remaining) {
406
+ if (remaining > 0)
407
+ logs.push(line.slice(0, remaining));
408
+ logs.push("[Pi Fabric log output truncated]");
409
+ logsTruncated = true;
410
+ return;
411
+ }
412
+ logs.push(line);
413
+ logChars += line.length;
414
+ });
415
+ context.setProp(context.global, "print", printFunction);
416
+ printFunction.dispose();
417
+ const strings = jsonHandle(context, options.strings ?? {});
418
+ context.setProp(context.global, "π", strings);
419
+ strings.dispose();
420
+ const tokenBudget = context.newNumber(options.tokenBudget ?? Number.POSITIVE_INFINITY);
421
+ context.setProp(context.global, "__fabricTokenBudget", tokenBudget);
422
+ tokenBudget.dispose();
423
+ const setupResult = context.evalCode(guestSetup, "pi-fabric-setup.js");
424
+ if (setupResult.error) {
425
+ const error = formatValue(context.dump(setupResult.error));
426
+ setupResult.error.dispose();
427
+ abortHostCalls(error);
428
+ return { value: undefined, logs, error };
429
+ }
430
+ setupResult.value.dispose();
431
+ executionGate = context.newPromise();
432
+ context.setProp(context.global, "__fabricExecutionGate", executionGate.handle);
433
+ const wrappedCode = `Promise.race([(async function __piFabricMain() {\n${transpile(code)}\n})(), globalThis.__fabricExecutionGate])`;
434
+ const evaluation = context.evalCode(wrappedCode, "pi-fabric-guest.js");
435
+ runtime.executePendingJobs();
436
+ if (evaluation.error) {
437
+ const error = formatValue(context.dump(evaluation.error));
438
+ evaluation.error.dispose();
439
+ abortHostCalls(error);
440
+ return { value: undefined, logs, error };
441
+ }
442
+ activePromiseHandle = evaluation.value;
443
+ const cancellation = new Promise((_resolve, reject) => {
444
+ abortHandler = () => {
445
+ cancelled = true;
446
+ hostAbortController.abort(options.signal?.reason);
447
+ rejectExecutionGate("Execution cancelled");
448
+ reject(new Error("Execution cancelled"));
449
+ };
450
+ if (options.signal?.aborted)
451
+ abortHandler();
452
+ else
453
+ options.signal?.addEventListener("abort", abortHandler, { once: true });
454
+ });
455
+ void cancellation.catch(() => undefined);
456
+ const deadline = new Promise((_resolve, reject) => {
457
+ timeout = setTimeout(() => {
458
+ timedOut = true;
459
+ const message = `Execution timed out after ${options.timeoutMs}ms`;
460
+ hostAbortController.abort(new Error(message));
461
+ rejectExecutionGate(message);
462
+ reject(new Error(message));
463
+ }, options.timeoutMs);
464
+ });
465
+ pendingResolution = resolveQuickJsPromise(context, runtime, activePromiseHandle, Date.now() + options.timeoutMs + 5_000);
466
+ const resolution = await Promise.race([pendingResolution, deadline, cancellation]);
467
+ activePromiseHandle.dispose();
468
+ activePromiseHandle = undefined;
469
+ if (resolution.error) {
470
+ const error = formatValue(context.dump(resolution.error));
471
+ resolution.error.dispose();
472
+ abortHostCalls(error);
473
+ return { value: undefined, logs, error };
474
+ }
475
+ const value = context.dump(resolution.value);
476
+ resolution.value.dispose();
477
+ return { value, logs };
478
+ }
479
+ catch (error) {
480
+ abortHostCalls(error instanceof Error ? error.message : String(error));
481
+ return {
482
+ value: undefined,
483
+ logs,
484
+ error: cancelled
485
+ ? "Execution cancelled"
486
+ : error instanceof Error
487
+ ? error.message
488
+ : String(error),
489
+ };
490
+ }
491
+ finally {
492
+ if (timeout)
493
+ clearTimeout(timeout);
494
+ for (const timer of pendingTimers)
495
+ clearTimeout(timer);
496
+ if (abortHandler)
497
+ options.signal?.removeEventListener("abort", abortHandler);
498
+ if (!timedOut && !cancelled && hostTasks.size > 0) {
499
+ await Promise.allSettled(hostTasks);
500
+ runtime.executePendingJobs();
501
+ }
502
+ closing = true;
503
+ if (timedOut || cancelled) {
504
+ if (!hostAbortController.signal.aborted)
505
+ hostAbortController.abort();
506
+ rejectExecutionGate(cancelled ? "Execution cancelled" : `Execution timed out after ${options.timeoutMs}ms`);
507
+ const errorHandle = context.newError(cancelled ? "Execution cancelled" : `Execution timed out after ${options.timeoutMs}ms`);
508
+ for (const promise of pendingHostPromises)
509
+ promise.reject(errorHandle);
510
+ errorHandle.dispose();
511
+ runtime.executePendingJobs();
512
+ await new Promise((resolve) => setImmediate(resolve));
513
+ const settled = await Promise.race([
514
+ pendingResolution ? pendingResolution.catch(() => undefined) : Promise.resolve(undefined),
515
+ new Promise((resolve) => {
516
+ const timer = setTimeout(() => resolve(undefined), 1_000);
517
+ timer.unref?.();
518
+ }),
519
+ ]);
520
+ if (settled?.error)
521
+ settled.error.dispose();
522
+ if (settled?.value)
523
+ settled.value.dispose();
524
+ for (const promise of pendingHostPromises) {
525
+ if (promise.alive !== false)
526
+ promise.dispose();
527
+ }
528
+ }
529
+ if (activePromiseHandle?.alive !== false)
530
+ activePromiseHandle?.dispose();
531
+ if (executionGate?.alive !== false)
532
+ executionGate?.dispose();
533
+ runtime.executePendingJobs();
534
+ context.dispose();
535
+ }
536
+ }
537
+ }
538
+ //# sourceMappingURL=quickjs-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickjs-runtime.js","sourceRoot":"","sources":["../../src/runtime/quickjs-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface FabricTypeError {
2
+ line: number;
3
+ column: number;
4
+ message: string;
5
+ }
6
+ export interface FabricTypeCheckResult {
7
+ errors: FabricTypeError[];
8
+ }
9
+ export declare const typeCheckFabricCode: (code: string, declarations: string) => FabricTypeCheckResult;
10
+ //# sourceMappingURL=type-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-checker.d.ts","sourceRoot":"","sources":["../../src/runtime/type-checker.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,mBAAmB,GAC9B,MAAM,MAAM,EACZ,cAAc,MAAM,KACnB,qBA2EF,CAAC"}
@@ -0,0 +1,71 @@
1
+ import path from "node:path";
2
+ import ts from "typescript";
3
+ export const typeCheckFabricCode = (code, declarations) => {
4
+ const virtualFile = path.resolve("/__pi_fabric_guest__.ts");
5
+ const declarationLineCount = declarations.split("\n").length;
6
+ const sourceText = `${declarations}\nasync function __piFabricMain() {\n${code}\n}\n`;
7
+ // Functional-errors-only: disable strict type-correctness (null-safety,
8
+ // union narrowing, implicit any, strict function types) so valid code isn't
9
+ // blocked. Genuine breakage still fails fast at type-check (syntax, undefined
10
+ // names, wrong arity); the rest surfaces as a runtime error from the sandbox.
11
+ const compilerOptions = {
12
+ target: ts.ScriptTarget.ES2022,
13
+ module: ts.ModuleKind.ESNext,
14
+ moduleResolution: ts.ModuleResolutionKind.NodeNext,
15
+ strict: false,
16
+ noImplicitAny: false,
17
+ strictNullChecks: false,
18
+ strictFunctionTypes: false,
19
+ strictBindCallApply: false,
20
+ alwaysStrict: false,
21
+ strictPropertyInitialization: false,
22
+ noImplicitThis: false,
23
+ useUnknownInCatchVariables: false,
24
+ noEmit: true,
25
+ skipLibCheck: true,
26
+ lib: ["lib.es2022.d.ts"],
27
+ };
28
+ const baseHost = ts.createCompilerHost(compilerOptions, true);
29
+ const sourceFile = ts.createSourceFile(virtualFile, sourceText, ts.ScriptTarget.ES2022, true);
30
+ const host = {
31
+ ...baseHost,
32
+ fileExists: (fileName) => fileName === virtualFile || baseHost.fileExists(fileName),
33
+ readFile: (fileName) => (fileName === virtualFile ? sourceText : baseHost.readFile(fileName)),
34
+ getSourceFile: (fileName, languageVersion, onError, shouldCreateNewSourceFile) => fileName === virtualFile
35
+ ? sourceFile
36
+ : baseHost.getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile),
37
+ };
38
+ const program = ts.createProgram([virtualFile], compilerOptions, host);
39
+ // Pure type-correctness codes — drop so only functional errors reach the
40
+ // model. Property-access/assignability/narrowing fall through to a runtime
41
+ // error; undefined-name (2304) and wrong-arity (2554) are kept (real breakage).
42
+ // Excess-property (2350/2561) is deliberately KEPT — it catches typo'd
43
+ // argument keys, which are functional (wrong tool shape). Only pure
44
+ // type-correctness (narrowing/assignability/null/any) is dropped below.
45
+ const TYPE_CORRECTNESS_CODES = new Set([
46
+ 2339, 2551, // property access / union narrowing -> runtime
47
+ 2322, 2345, 2367, // not-assignable -> runtime
48
+ 2531, 2532, 18047, 18048, // possibly null/undefined
49
+ 7006, 7008, 7019, 7031, 7032, 7033, 7034, // implicit any
50
+ ]);
51
+ const diagnostics = [
52
+ ...program.getSyntacticDiagnostics(sourceFile),
53
+ ...program.getSemanticDiagnostics(sourceFile).filter((diagnostic) => !TYPE_CORRECTNESS_CODES.has(diagnostic.code)),
54
+ ];
55
+ return {
56
+ errors: diagnostics.map((diagnostic) => {
57
+ const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
58
+ if (!diagnostic.file || diagnostic.start === undefined) {
59
+ return { line: 0, column: 0, message };
60
+ }
61
+ const position = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
62
+ const line = position.line - declarationLineCount;
63
+ return {
64
+ line: Math.max(1, line),
65
+ column: position.character + 1,
66
+ message,
67
+ };
68
+ }),
69
+ };
70
+ };
71
+ //# sourceMappingURL=type-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-checker.js","sourceRoot":"","sources":["../../src/runtime/type-checker.ts"],"names":[],"mappings":"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"}