pi-fabric 0.92.15 → 0.92.16

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 (51) hide show
  1. package/dist/chunks/chunk-4SSMGBF4.js +93 -0
  2. package/dist/chunks/chunk-4SSMGBF4.js.map +7 -0
  3. package/dist/chunks/{chunk-OX7BU3RX.js → chunk-DU4KUTQP.js} +71 -128
  4. package/dist/chunks/chunk-DU4KUTQP.js.map +7 -0
  5. package/dist/chunks/{chunk-ZG3ELJHX.js → chunk-MSCHYMYR.js} +24 -3
  6. package/dist/chunks/chunk-MSCHYMYR.js.map +7 -0
  7. package/dist/chunks/chunk-NQMR3LEL.js +403 -0
  8. package/dist/chunks/chunk-NQMR3LEL.js.map +7 -0
  9. package/dist/chunks/{chunk-U4NSXDRO.js → chunk-RETQZJ4K.js} +2 -2
  10. package/dist/fabric-runtime-state.d.ts +2 -0
  11. package/dist/fabric-runtime-state.d.ts.map +1 -1
  12. package/dist/fabric-runtime-state.js +46 -102
  13. package/dist/fabric-runtime-state.js.map +4 -4
  14. package/dist/fabric-state.d.ts +2 -0
  15. package/dist/fabric-state.d.ts.map +1 -1
  16. package/dist/index.js +12 -6
  17. package/dist/index.js.map +2 -2
  18. package/dist/jev/guest-types.d.ts +1 -1
  19. package/dist/jev/guest-types.d.ts.map +1 -1
  20. package/dist/jev/manager.d.ts +4 -0
  21. package/dist/jev/manager.d.ts.map +1 -1
  22. package/dist/jev/observation.d.ts +59 -0
  23. package/dist/jev/observation.d.ts.map +1 -0
  24. package/dist/jev/observation.js +19 -0
  25. package/dist/jev/observation.js.map +7 -0
  26. package/dist/jev/types.d.ts +47 -0
  27. package/dist/jev/types.d.ts.map +1 -1
  28. package/dist/jev.d.ts +2 -1
  29. package/dist/jev.d.ts.map +1 -1
  30. package/dist/jev.js +8 -1
  31. package/dist/providers/jev-provider.d.ts +15 -0
  32. package/dist/providers/jev-provider.d.ts.map +1 -1
  33. package/dist/providers/jev-provider.js +5 -1
  34. package/dist/runtime/core-override-guest-types.js +2 -2
  35. package/dist/runtime/guest-types.d.ts +1 -1
  36. package/dist/runtime/guest-types.d.ts.map +1 -1
  37. package/dist/runtime/guest-types.js +1 -1
  38. package/dist/runtime/typescript-kernel.js +2 -2
  39. package/docs/agents.md +2 -0
  40. package/docs/jev.md +73 -2
  41. package/docs/skills.md +1 -1
  42. package/package.json +1 -1
  43. package/skillsets/python/fabric-exec/SKILL.md +1 -1
  44. package/skillsets/python/fabric-guide/SKILL.md +1 -1
  45. package/skillsets/python/fabric-jev/SKILL.md +52 -1
  46. package/skillsets/typescript/fabric-exec/SKILL.md +2 -1
  47. package/skillsets/typescript/fabric-guide/SKILL.md +1 -1
  48. package/skillsets/typescript/fabric-jev/SKILL.md +49 -1
  49. package/dist/chunks/chunk-OX7BU3RX.js.map +0 -7
  50. package/dist/chunks/chunk-ZG3ELJHX.js.map +0 -7
  51. /package/dist/chunks/{chunk-U4NSXDRO.js.map → chunk-RETQZJ4K.js.map} +0 -0
@@ -0,0 +1,93 @@
1
+ // src/actors/host-event-payload.ts
2
+ import { createHash } from "node:crypto";
3
+ var normalizedKey = (key) => key.toLowerCase().replaceAll(/[^a-z0-9]/g, "");
4
+ var isSensitiveKey = (key) => {
5
+ const normalized = normalizedKey(key);
6
+ return [
7
+ "password",
8
+ "passwd",
9
+ "secret",
10
+ "token",
11
+ "accesstoken",
12
+ "refreshtoken",
13
+ "authorization",
14
+ "cookie",
15
+ "credential",
16
+ "credentials",
17
+ "apikey",
18
+ "privatekey",
19
+ "clientsecret"
20
+ ].some((sensitive) => normalized === sensitive || normalized.endsWith(sensitive));
21
+ };
22
+ var redactInlineSecrets = (value) => value.replace(/\bBearer\s+[A-Za-z0-9._~+\/-]+=*/gi, "Bearer [redacted]").replace(/\bBasic\s+[A-Za-z0-9+/=]{8,}/gi, "Basic [redacted]").replace(/\b(?:sk|pk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{12,}\b/g, "[redacted]").replace(
23
+ /\b(Authorization|Proxy-Authorization|Cookie|Set-Cookie|X-Api-Key)\s*:\s*[^\r\n;]+/gi,
24
+ "$1: [redacted]"
25
+ ).replace(/(https?:\/\/)[^\s/:@]+:[^\s/@]+@/gi, "$1[redacted]@");
26
+ var looksLikeBase64 = (value) => {
27
+ if (value.startsWith("data:") && value.includes(";base64,")) return true;
28
+ if (value.length < 1024 || value.length % 4 !== 0) return false;
29
+ return /^[A-Za-z0-9+/=_\r\n-]+$/.test(value);
30
+ };
31
+ var isImageContent = (value) => typeof value === "object" && value !== null && !Array.isArray(value) && value.type === "image" && typeof value.data === "string" && typeof value.mimeType === "string";
32
+ var prepareFabricActorHostPayload = (value, maxChars) => {
33
+ const images = [];
34
+ const media = [];
35
+ const imageIndexes = /* @__PURE__ */ new Map();
36
+ const seen = /* @__PURE__ */ new WeakSet();
37
+ let json;
38
+ try {
39
+ const serialized = JSON.stringify(value, (key, nested) => {
40
+ if (key && isSensitiveKey(key)) return "[redacted]";
41
+ if (isImageContent(nested)) {
42
+ const sha256 = createHash("sha256").update(nested.mimeType).update("\0").update(nested.data).digest("hex");
43
+ let mediaIndex = imageIndexes.get(sha256);
44
+ if (mediaIndex === void 0) {
45
+ mediaIndex = images.length;
46
+ imageIndexes.set(sha256, mediaIndex);
47
+ images.push({ type: "image", data: nested.data, mimeType: nested.mimeType });
48
+ media.push({ type: "image", mediaIndex, mimeType: nested.mimeType });
49
+ }
50
+ return {
51
+ type: "image",
52
+ mediaIndex,
53
+ mimeType: nested.mimeType,
54
+ redacted: true
55
+ };
56
+ }
57
+ if (typeof nested === "object" && nested !== null && !Array.isArray(nested) && nested.type === "image") {
58
+ return {
59
+ type: "image",
60
+ ...typeof nested.mimeType === "string" ? { mimeType: nested.mimeType } : {},
61
+ redacted: true
62
+ };
63
+ }
64
+ if (typeof nested === "string") {
65
+ if (looksLikeBase64(nested)) return "[omitted base64]";
66
+ return redactInlineSecrets(nested);
67
+ }
68
+ if (typeof nested === "bigint") return String(nested);
69
+ if (typeof nested === "function" || typeof nested === "symbol") return void 0;
70
+ if (typeof nested === "object" && nested !== null) {
71
+ if (seen.has(nested)) return "[circular or repeated reference]";
72
+ seen.add(nested);
73
+ }
74
+ return nested;
75
+ });
76
+ json = serialized ?? "null";
77
+ } catch {
78
+ json = JSON.stringify(String(value));
79
+ }
80
+ if (json.length > maxChars) json = json.slice(json.length - maxChars);
81
+ let payload;
82
+ try {
83
+ payload = JSON.parse(json);
84
+ } catch {
85
+ payload = json;
86
+ }
87
+ return { payload, images, media };
88
+ };
89
+
90
+ export {
91
+ prepareFabricActorHostPayload
92
+ };
93
+ //# sourceMappingURL=chunk-4SSMGBF4.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/actors/host-event-payload.ts"],
4
+ "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport type { ImageContent } from \"@earendil-works/pi-ai\";\n\ninterface FabricActorHostMediaDescriptor {\n type: \"image\";\n mediaIndex: number;\n mimeType: string;\n}\n\nexport interface PreparedFabricActorHostPayload {\n payload: unknown;\n images: ImageContent[];\n media: FabricActorHostMediaDescriptor[];\n}\n\nconst normalizedKey = (key: string): string =>\n key.toLowerCase().replaceAll(/[^a-z0-9]/g, \"\");\n\nconst isSensitiveKey = (key: string): boolean => {\n const normalized = normalizedKey(key);\n return [\n \"password\",\n \"passwd\",\n \"secret\",\n \"token\",\n \"accesstoken\",\n \"refreshtoken\",\n \"authorization\",\n \"cookie\",\n \"credential\",\n \"credentials\",\n \"apikey\",\n \"privatekey\",\n \"clientsecret\",\n ].some((sensitive) => normalized === sensitive || normalized.endsWith(sensitive));\n};\n\nconst redactInlineSecrets = (value: string): string =>\n value\n .replace(/\\bBearer\\s+[A-Za-z0-9._~+\\/-]+=*/gi, \"Bearer [redacted]\")\n .replace(/\\bBasic\\s+[A-Za-z0-9+/=]{8,}/gi, \"Basic [redacted]\")\n .replace(/\\b(?:sk|pk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{12,}\\b/g, \"[redacted]\")\n .replace(\n /\\b(Authorization|Proxy-Authorization|Cookie|Set-Cookie|X-Api-Key)\\s*:\\s*[^\\r\\n;]+/gi,\n \"$1: [redacted]\",\n )\n .replace(/(https?:\\/\\/)[^\\s/:@]+:[^\\s/@]+@/gi, \"$1[redacted]@\");\n\nconst looksLikeBase64 = (value: string): boolean => {\n if (value.startsWith(\"data:\") && value.includes(\";base64,\")) return true;\n if (value.length < 1_024 || value.length % 4 !== 0) return false;\n return /^[A-Za-z0-9+/=_\\r\\n-]+$/.test(value);\n};\n\nconst isImageContent = (value: unknown): value is ImageContent =>\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n (value as { type?: unknown }).type === \"image\" &&\n typeof (value as { data?: unknown }).data === \"string\" &&\n typeof (value as { mimeType?: unknown }).mimeType === \"string\";\n\nexport const prepareFabricActorHostPayload = (\n value: unknown,\n maxChars: number,\n): PreparedFabricActorHostPayload => {\n const images: ImageContent[] = [];\n const media: FabricActorHostMediaDescriptor[] = [];\n const imageIndexes = new Map<string, number>();\n const seen = new WeakSet<object>();\n let json: string;\n\n try {\n const serialized = JSON.stringify(value, (key, nested) => {\n if (key && isSensitiveKey(key)) return \"[redacted]\";\n if (isImageContent(nested)) {\n const sha256 = createHash(\"sha256\")\n .update(nested.mimeType)\n .update(\"\\0\")\n .update(nested.data)\n .digest(\"hex\");\n let mediaIndex = imageIndexes.get(sha256);\n if (mediaIndex === undefined) {\n mediaIndex = images.length;\n imageIndexes.set(sha256, mediaIndex);\n images.push({ type: \"image\", data: nested.data, mimeType: nested.mimeType });\n media.push({ type: \"image\", mediaIndex, mimeType: nested.mimeType });\n }\n return {\n type: \"image\",\n mediaIndex,\n mimeType: nested.mimeType,\n redacted: true,\n };\n }\n if (\n typeof nested === \"object\" &&\n nested !== null &&\n !Array.isArray(nested) &&\n (nested as { type?: unknown }).type === \"image\"\n ) {\n return {\n type: \"image\",\n ...(typeof (nested as { mimeType?: unknown }).mimeType === \"string\"\n ? { mimeType: (nested as { mimeType: string }).mimeType }\n : {}),\n redacted: true,\n };\n }\n if (typeof nested === \"string\") {\n if (looksLikeBase64(nested)) return \"[omitted base64]\";\n return redactInlineSecrets(nested);\n }\n if (typeof nested === \"bigint\") return String(nested);\n if (typeof nested === \"function\" || typeof nested === \"symbol\") return undefined;\n if (typeof nested === \"object\" && nested !== null) {\n if (seen.has(nested)) return \"[circular or repeated reference]\";\n seen.add(nested);\n }\n return nested;\n });\n json = serialized ?? \"null\";\n } catch {\n json = JSON.stringify(String(value));\n }\n\n if (json.length > maxChars) json = json.slice(json.length - maxChars);\n let payload: unknown;\n try {\n payload = JSON.parse(json) as unknown;\n } catch {\n payload = json;\n }\n return { payload, images, media };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,3 +1,13 @@
1
+ import {
2
+ checkObserve,
3
+ checkRequest,
4
+ checkResponse,
5
+ checkSchema,
6
+ checkValue,
7
+ jevObserveSchema,
8
+ jsonText,
9
+ object
10
+ } from "./chunk-NQMR3LEL.js";
1
11
  import {
2
12
  ApprovalController,
3
13
  FabricSessionApprovals
@@ -14,120 +24,6 @@ import { Type } from "typebox";
14
24
 
15
25
  // src/jev/client.ts
16
26
  import { execFile } from "node:child_process";
17
-
18
- // src/jev/validation.ts
19
- import { Value } from "typebox/value";
20
- function jsonText(value, maxBytes, label) {
21
- let nodes = 0;
22
- const visit = (v, depth) => {
23
- if (++nodes > 1e5 || depth > 32) throw new Error(`${label} exceeds JSON complexity limits`);
24
- if (v === null || typeof v === "string" || typeof v === "boolean") return;
25
- if (typeof v === "number" && Number.isFinite(v)) return;
26
- if (Array.isArray(v)) {
27
- for (const item of v) visit(item, depth + 1);
28
- return;
29
- }
30
- if (typeof v === "object" && v !== null && Object.getPrototypeOf(v) === Object.prototype) {
31
- for (const item of Object.values(v)) visit(item, depth + 1);
32
- return;
33
- }
34
- throw new Error(`${label} must contain only finite JSON values`);
35
- };
36
- visit(value, 0);
37
- const text = JSON.stringify(value);
38
- if (Buffer.byteLength(text) > maxBytes) throw new Error(`${label} exceeds ${maxBytes} bytes`);
39
- return text;
40
- }
41
- var object = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
42
- var description = (v) => typeof v === "string" || object(v) || Array.isArray(v);
43
- var keysOnly = (v, keys) => Object.keys(v).every((k) => keys.includes(k));
44
- function checkRequest(value, maxBytes) {
45
- jsonText(value, maxBytes, "Jev request");
46
- if (!object(value) || !keysOnly(value, ["state", "questions", "model"]) || !description(value.state) || !object(value.questions) || Object.keys(value.questions).length < 1 || Object.keys(value.questions).length > 128 || value.model !== void 0 && (typeof value.model !== "string" || !/^[a-zA-Z0-9._-]{1,128}$/.test(value.model))) {
47
- throw new Error("Invalid Jev request: provide state, 1\u2013128 questions, and an optional model ID");
48
- }
49
- for (const [id, q] of Object.entries(value.questions)) {
50
- if (!id || id.length > 128 || !object(q) || !keysOnly(q, ["type", "instructions", "criteria"]) || !description(q.instructions))
51
- throw new Error("Invalid Jev question: each question needs a type and complete instructions");
52
- if (q.type === "choice") {
53
- if (!object(q.criteria) || Object.keys(q.criteria).length < 1 || Object.keys(q.criteria).length > 255 || !Object.entries(q.criteria).every(([key, v]) => key.length > 0 && key.length <= 256 && (v === null || description(v))))
54
- throw new Error("Choice requires 1\u2013255 named options with descriptions or null");
55
- } else if (q.type === "score") {
56
- if (!Array.isArray(q.criteria) || q.criteria.length < 2 || q.criteria.length > 10 || !q.criteria.every(description))
57
- throw new Error("Score requires 2\u201310 ordered descriptive levels");
58
- } else if (q.type === "noul") {
59
- if (q.criteria !== void 0 && (!object(q.criteria) || !keysOnly(q.criteria, ["true", "false"]) || !Object.values(q.criteria).every(description)))
60
- throw new Error("Noul criteria may describe true and false only");
61
- } else throw new Error("Jev supports choice, score, and noul\u2014not free-text generation");
62
- }
63
- }
64
- var probability = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0 && v <= 1;
65
- function checkResponse(value, request) {
66
- const invalid = () => {
67
- throw new Error("TypeSafe returned an invalid typed response");
68
- };
69
- if (!object(value) || typeof value.model !== "string" || value.model.length > 128 || !object(value.answers) || !object(value.usage)) return invalid();
70
- const usage = value.usage;
71
- if (![usage.input_tokens, usage.output_tokens].every((v) => Number.isSafeInteger(v) && v >= 0)) return invalid();
72
- if (Object.keys(value.answers).length !== Object.keys(request.questions).length) return invalid();
73
- const entries = [];
74
- for (const [id, question2] of Object.entries(request.questions)) {
75
- const a = Object.hasOwn(value.answers, id) ? value.answers[id] : void 0;
76
- if (!object(a) || a.type !== question2.type) return invalid();
77
- if (question2.type === "noul") {
78
- if (!probability(a.noul)) return invalid();
79
- entries.push([id, { type: "noul", noul: a.noul }]);
80
- continue;
81
- }
82
- const keys = question2.type === "choice" ? Object.keys(question2.criteria) : question2.criteria.map((_, i) => String(i));
83
- const p = a.probabilities;
84
- if (!probability(a.confidence) || !object(p) || Object.keys(p).length !== keys.length || !keys.every((k) => Object.hasOwn(p, k) && probability(p[k])) || Math.abs(Object.values(p).reduce((sum, v) => sum + v, 0) - 1) > 0.02) return invalid();
85
- const probabilities = Object.fromEntries(keys.map((k) => [k, p[k]]));
86
- if (question2.type === "choice") {
87
- if (typeof a.choice !== "string" || !Object.hasOwn(question2.criteria, a.choice)) return invalid();
88
- entries.push([id, { type: "choice", choice: a.choice, confidence: a.confidence, probabilities }]);
89
- } else {
90
- if (typeof a.score !== "number" || !Number.isFinite(a.score) || a.score < 0 || a.score > keys.length - 1) return invalid();
91
- const legend = Object.fromEntries(question2.criteria.map((level, i) => [String(i), level]));
92
- entries.push([id, { type: "score", score: a.score, confidence: a.confidence, probabilities, legend }]);
93
- }
94
- }
95
- return { model: value.model, answers: Object.fromEntries(entries), usage: {
96
- input_tokens: usage.input_tokens,
97
- output_tokens: usage.output_tokens
98
- } };
99
- }
100
- var schemaKeys = /* @__PURE__ */ new Set(["type", "properties", "required", "additionalProperties", "items", "enum", "const", "anyOf", "oneOf", "allOf", "minimum", "maximum", "minLength", "maxLength", "minItems", "maxItems", "minProperties", "maxProperties", "description", "title"]);
101
- function checkSchema(schema) {
102
- jsonText(schema, 16384, "Program schema");
103
- let nodes = 0;
104
- const visit = (s, depth) => {
105
- if (!object(s) || ++nodes > 128 || depth > 12 || Object.keys(s).some((k) => !schemaKeys.has(k)))
106
- throw new Error("Unsupported program schema; use the documented bounded JSON Schema subset (no references or regexes)");
107
- if (s.type !== void 0 && !["object", "array", "string", "number", "integer", "boolean", "null"].includes(s.type)) throw new Error("Invalid schema type");
108
- if (s.properties !== void 0) {
109
- if (!object(s.properties)) throw new Error("Schema properties must be an object");
110
- Object.values(s.properties).forEach((v) => visit(v, depth + 1));
111
- }
112
- if (s.required !== void 0 && (!Array.isArray(s.required) || !s.required.every((v) => typeof v === "string"))) throw new Error("Schema required must be a string array");
113
- if (s.additionalProperties !== void 0 && typeof s.additionalProperties !== "boolean") visit(s.additionalProperties, depth + 1);
114
- if (s.items !== void 0) visit(s.items, depth + 1);
115
- for (const k of ["anyOf", "oneOf", "allOf"]) if (s[k] !== void 0) {
116
- if (!Array.isArray(s[k]) || s[k].length < 1 || s[k].length > 16) throw new Error("Invalid schema alternatives");
117
- s[k].forEach((v) => visit(v, depth + 1));
118
- }
119
- for (const k of ["minimum", "maximum", "minLength", "maxLength", "minItems", "maxItems", "minProperties", "maxProperties"])
120
- if (s[k] !== void 0 && (typeof s[k] !== "number" || !Number.isFinite(s[k]) || !["minimum", "maximum"].includes(k) && (!Number.isSafeInteger(s[k]) || s[k] < 0))) throw new Error("Invalid schema bound");
121
- if (s.enum !== void 0 && (!Array.isArray(s.enum) || s.enum.length === 0 || s.enum.length > 256)) throw new Error("Invalid schema enum");
122
- };
123
- visit(schema, 0);
124
- }
125
- function checkValue(schema, value, label) {
126
- jsonText(value, 32768, label);
127
- if (!Value.Check(schema, value)) throw new Error(`${label} does not match its declared schema`);
128
- }
129
-
130
- // src/jev/client.ts
131
27
  var JevCredentials = class {
132
28
  constructor(command, env = process.env, providerAuth) {
133
29
  this.command = command;
@@ -229,6 +125,8 @@ var prelude = `const input = JSON.parse(\u03C0.__jevInput);
229
125
  const program = Object.freeze({
230
126
  sleep: (ms: number): Promise<unknown> => tools.call({ ref: "jev.$sleep", args: { ms } }),
231
127
  emit: (value: unknown): Promise<unknown> => tools.call({ ref: "jev.$emit", args: { value } }),
128
+ nextEvent: (): Promise<FabricJevHostEvent> => tools.call({ ref: "jev.$nextEvent" }) as Promise<FabricJevHostEvent>,
129
+ advise: (args: {eventId: string; message: string}): Promise<FabricJevAdviceResult> => tools.call({ ref: "jev.advise", args: {...args, id: \u03C0.__jevRunId} }) as Promise<FabricJevAdviceResult>,
232
130
  });
233
131
  `;
234
132
  var JevProgramManager = class {
@@ -247,7 +145,8 @@ var JevProgramManager = class {
247
145
  background: info.background,
248
146
  startedAt: info.startedAt,
249
147
  evaluations: info.evaluations,
250
- toolCalls: info.toolCalls
148
+ toolCalls: info.toolCalls,
149
+ ...info.observation ? { observation: structuredClone(info.observation) } : {}
251
150
  }));
252
151
  }
253
152
  #get(id) {
@@ -271,6 +170,13 @@ var JevProgramManager = class {
271
170
  if (run.info.state === "running") run.controller.abort(new Error("Jev run stopped"));
272
171
  return structuredClone(await run.done);
273
172
  }
173
+ advise(id, eventId, message) {
174
+ if (typeof message !== "string" || !message.trim() || message.length > 2e3 || typeof eventId !== "string" || eventId.length > 256)
175
+ throw new Error("Advice requires a current eventId and 1\u20132000 message characters");
176
+ const run = this.#get(id);
177
+ if (!run.observation) throw new Error("Jev run has no observation subscription");
178
+ return run.observation.advise(eventId, message);
179
+ }
274
180
  async launch(request, context, background) {
275
181
  const { config, registry } = this.options;
276
182
  if (this.#closed) throw new Error("Jev program manager is closed");
@@ -281,13 +187,22 @@ var JevProgramManager = class {
281
187
  let lease;
282
188
  let starting = true;
283
189
  try {
284
- const { program: definition, input } = structuredClone(request);
190
+ const { program: definition, input, observe } = structuredClone(request);
191
+ const observationHost = this.options.observationHost;
192
+ const observationRevision = observationHost?.revision;
193
+ if (observe !== void 0) {
194
+ checkObserve(observe);
195
+ if (!background) throw new Error("Observation requires jev.spawn; foreground runs cannot wait for their own turn to end");
196
+ if (!observationHost) throw new Error("Main lifecycle observation is unavailable in this host");
197
+ if (context.extensionContext.sessionManager?.getSessionId() !== observationHost.sessionId)
198
+ throw new Error("Jev observation is scoped to its owning Main session");
199
+ }
285
200
  checkSchema(definition.inputSchema);
286
201
  checkSchema(definition.outputSchema);
287
202
  checkValue(definition.inputSchema, input, "Program input");
288
203
  const requires = [...new Set(definition.requires)];
289
204
  for (const ref of requires) {
290
- if (!/^[a-z][a-z0-9_-]*\.[a-zA-Z0-9_.$-]+$/.test(ref) || ref.startsWith("jev.") && ref !== "jev.evaluate")
205
+ if (!/^[a-z][a-z0-9_-]*\.[a-zA-Z0-9_.$-]+$/.test(ref) || ref.startsWith("jev.") && ref !== "jev.evaluate" && ref !== "jev.advise")
291
206
  throw new Error("Programs require exact action refs; recursive Jev lifecycle calls are not allowed");
292
207
  if (context.capabilityView && !Object.hasOwn(context.capabilityView.bindings, ref))
293
208
  throw new Error(`Jev program cannot widen its caller's capabilities: ${ref}`);
@@ -307,8 +222,19 @@ var JevProgramManager = class {
307
222
  const sources = await registry.guestTypeSources({ ...context, capabilityView: lease.view });
308
223
  const { code, checked } = runtime.prepare(prelude + definition.code, true, [], sources, [], true);
309
224
  if (checked.errors.length) throw new Error(`Jev program typecheck failed: ${checked.errors.map((e) => e.message).join("; ").slice(0, 2e3)}`);
225
+ const approval = new ApprovalController(config.approvals, context.extensionContext, this.#approvals);
226
+ if (observe) await approval.approve({
227
+ ref: "jev.spawn",
228
+ provider: "jev",
229
+ name: "spawn",
230
+ description: "Observe future Main lifecycle events and explicitly selected content for a bounded Jev program",
231
+ inputSchema: {},
232
+ risk: "read"
233
+ }, { observe });
310
234
  if (this.#closed) throw new Error("Jev program manager is closed");
311
235
  context.signal?.throwIfAborted();
236
+ if (observe && observationHost.revision !== observationRevision)
237
+ throw new Error("Main lifecycle changed while preparing the observer; relaunch explicitly with current context");
312
238
  const limits = definition.limits ?? {};
313
239
  const bounded = (value, fallback, ceiling) => Math.min(value ?? fallback, ceiling);
314
240
  const timeoutMs = bounded(limits.timeoutMs, 6e4, config.jev.maxDurationMs);
@@ -336,7 +262,8 @@ var JevProgramManager = class {
336
262
  queueMicrotask(() => controller.abort(new Error(message)));
337
263
  throw new Error(message);
338
264
  };
339
- const approval = new ApprovalController(config.approvals, context.extensionContext, this.#approvals);
265
+ const observation = observe ? observationHost.subscribe(observe, { id, name: definition.name }, controller) : void 0;
266
+ if (observation) info.observation = observation.stats;
340
267
  const runLease = lease;
341
268
  lease = void 0;
342
269
  const abort = () => controller.abort(new Error("Foreground caller cancelled"));
@@ -353,7 +280,7 @@ var JevProgramManager = class {
353
280
  info.events.push({ sequence: info.nextSequence++, at: Date.now(), value });
354
281
  if (info.events.length > 64) info.events.shift();
355
282
  };
356
- const run = { info, controller, done: void 0 };
283
+ const run = { info, controller, observation, done: void 0 };
357
284
  this.#runs.set(id, run);
358
285
  this.#starting--;
359
286
  starting = false;
@@ -378,6 +305,11 @@ var JevProgramManager = class {
378
305
  emit(args.value);
379
306
  return null;
380
307
  }
308
+ if (ref === "jev.$nextEvent") {
309
+ if (!observation) throw new Error("program.nextEvent requires observe on jev.spawn");
310
+ return observation.next();
311
+ }
312
+ if (ref === "jev.advise" && args.id !== id) throw new Error("A Jev program can only advise through its own run");
381
313
  if (!Object.hasOwn(runLease.view.bindings, ref)) throw new Error(`Capability not granted to Jev program: ${ref}`);
382
314
  if (ref === "jev.evaluate") {
383
315
  if (evaluating) throw new Error("One Jev evaluation may be in flight per program; batch independent questions in one request");
@@ -433,7 +365,7 @@ var JevProgramManager = class {
433
365
  maxCpuSliceMs: 100,
434
366
  maxPendingTimers: 128,
435
367
  maxLogChars: 4096,
436
- strings: { __jevInput: JSON.stringify(input) },
368
+ strings: { __jevInput: JSON.stringify(input), __jevRunId: id },
437
369
  signal: controller.signal
438
370
  });
439
371
  info.logs = result.logs;
@@ -458,6 +390,7 @@ var JevProgramManager = class {
458
390
  info.error = (budgetFailure ?? (error instanceof Error ? error.message : "Jev program failed")).slice(0, 2e3);
459
391
  } finally {
460
392
  clearTimeout(timer);
393
+ observation?.close();
461
394
  context.signal?.removeEventListener("abort", abort);
462
395
  await runLease.release();
463
396
  info.endedAt = Date.now();
@@ -490,14 +423,14 @@ var JevProgramManager = class {
490
423
  };
491
424
 
492
425
  // src/providers/jev-provider.ts
493
- var description2 = Type.Union([Type.String(), Type.Array(Type.Unknown()), Type.Record(Type.String(), Type.Unknown())]);
426
+ var description = Type.Union([Type.String(), Type.Array(Type.Unknown()), Type.Record(Type.String(), Type.Unknown())]);
494
427
  var question = Type.Union([
495
- Type.Object({ type: Type.Literal("noul"), instructions: description2, criteria: Type.Optional(Type.Object({ true: Type.Optional(description2), false: Type.Optional(description2) }, { additionalProperties: false })) }, { additionalProperties: false }),
496
- Type.Object({ type: Type.Literal("choice"), instructions: description2, criteria: Type.Record(Type.String(), Type.Union([description2, Type.Null()]), { minProperties: 1, maxProperties: 255 }) }, { additionalProperties: false }),
497
- Type.Object({ type: Type.Literal("score"), instructions: description2, criteria: Type.Array(description2, { minItems: 2, maxItems: 10 }) }, { additionalProperties: false })
428
+ Type.Object({ type: Type.Literal("noul"), instructions: description, criteria: Type.Optional(Type.Object({ true: Type.Optional(description), false: Type.Optional(description) }, { additionalProperties: false })) }, { additionalProperties: false }),
429
+ Type.Object({ type: Type.Literal("choice"), instructions: description, criteria: Type.Record(Type.String(), Type.Union([description, Type.Null()]), { minProperties: 1, maxProperties: 255 }) }, { additionalProperties: false }),
430
+ Type.Object({ type: Type.Literal("score"), instructions: description, criteria: Type.Array(description, { minItems: 2, maxItems: 10 }) }, { additionalProperties: false })
498
431
  ]);
499
432
  var jevRequestSchema = Type.Object({
500
- state: description2,
433
+ state: description,
501
434
  questions: Type.Record(Type.String(), question, { minProperties: 1, maxProperties: 128 }),
502
435
  model: Type.Optional(Type.String({ minLength: 1, maxLength: 128 }))
503
436
  }, { additionalProperties: false });
@@ -515,20 +448,27 @@ var jevLaunchSchema = Type.Object({
515
448
  maxTokens: Type.Optional(Type.Integer({ minimum: 1 }))
516
449
  }, { additionalProperties: false }))
517
450
  }, { additionalProperties: false }),
518
- input: Type.Unknown()
451
+ input: Type.Unknown(),
452
+ observe: Type.Optional(jevObserveSchema)
519
453
  }, { additionalProperties: false });
520
454
  var idSchema = Type.Object({ id: Type.String({ minLength: 1, maxLength: 128 }) }, { additionalProperties: false });
521
455
  var statusSchema = Type.Object({
522
456
  id: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),
523
457
  after: Type.Optional(Type.Integer({ minimum: 0 }))
524
458
  }, { additionalProperties: false });
459
+ var jevAdviceSchema = Type.Object({
460
+ id: Type.String({ minLength: 1, maxLength: 128 }),
461
+ eventId: Type.String({ minLength: 1, maxLength: 256 }),
462
+ message: Type.String({ minLength: 1, maxLength: 2e3 })
463
+ }, { additionalProperties: false });
525
464
  var JEV_ACTION_DESCRIPTORS = [
526
465
  { name: "evaluate", description: "Ask Jev typed Choice, Noul (probability of yes), and Score questions over shared state. No generated text. Batch independent questions. Sends state to TypeSafe and consumes API credits; no automatic retries.", inputSchema: jevRequestSchema, risk: "network", effect: { kind: "emission", resources: ["typesafe:inference"], ordering: "unknown" } },
527
466
  { name: "run", description: "Run an isolated TypeScript System One program in the foreground. Returns a terminal run envelope with schema-validated result or error. Globals: input, jev.evaluate, program.sleep(ms), program.emit(value), and Fabric tools restricted to exact requires. Loops are supported; no host imports or secrets.", inputSchema: jevLaunchSchema, risk: "execute" },
528
- { name: "spawn", description: "Launch the same Jev program in the background and return its run ID. Session-owned, not restart-durable. Poll status for bounded events or join for completion; stop cancels future actions, not past effects.", inputSchema: jevLaunchSchema, risk: "execute" },
467
+ { name: "spawn", description: "Launch a session-owned background Jev program. Optional observe requires read approval and subscribes to Main lifecycle events; program.nextEvent waits without polling and shares only explicitly selected bounded context. program.advise needs observe.delivery and requires jev.advise. Use status, wait/join, and stop; not restart-durable.", inputSchema: jevLaunchSchema, risk: "execute" },
529
468
  { name: "status", description: "Without id: credential configuration status (never retrieves secrets) and run summaries. With id: state, usage, bounded events after sequence, logs, result/error. Retains at most 64 events; nextSequence allows detecting gaps.", inputSchema: statusSchema, risk: "read" },
530
469
  { name: "wait", description: "Wait for a background Jev program's terminal run envelope. Cancelling the wait does not cancel the program.", inputSchema: idSchema, risk: "read" },
531
470
  { name: "join", description: "Alias for jev.wait: wait for a background Jev program's terminal run envelope without cancelling the program when the wait is cancelled.", inputSchema: idSchema, risk: "read" },
471
+ { name: "advise", description: "Deliver bounded advice from an observing Jev run to Main. Requires its current consumed eventId, explicit observe.delivery, freshness, message budget, and the per-input feedback gate. The program helper program.advise supplies its own id. Subject to agent approvals; returns delivered and an optional suppression reason.", inputSchema: jevAdviceSchema, risk: "agent", effect: { kind: "emission", resources: ["main:messages"], ordering: "ordered" } },
532
472
  { name: "stop", description: "Cancel a Jev program and await sandbox cleanup. Idempotent for retained terminal runs; already-issued external effects cannot be undone.", inputSchema: idSchema, risk: "execute" }
533
473
  ];
534
474
  var JevProvider = class {
@@ -568,6 +508,8 @@ var JevProvider = class {
568
508
  case "join":
569
509
  case "wait":
570
510
  return this.manager.wait(args.id, context.signal);
511
+ case "advise":
512
+ return this.manager.advise(args.id, args.eventId, args.message);
571
513
  case "stop":
572
514
  return this.manager.stop(args.id);
573
515
  }
@@ -584,7 +526,8 @@ export {
584
526
  JevProgramManager,
585
527
  jevRequestSchema,
586
528
  jevLaunchSchema,
529
+ jevAdviceSchema,
587
530
  JEV_ACTION_DESCRIPTORS,
588
531
  JevProvider
589
532
  };
590
- //# sourceMappingURL=chunk-OX7BU3RX.js.map
533
+ //# sourceMappingURL=chunk-DU4KUTQP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/providers/jev-provider.ts", "../../src/jev/client.ts", "../../src/jev/manager.ts"],
4
+ "sourcesContent": ["import { Type } from \"typebox\";\nimport { validationMessage } from \"../core/action-arguments.js\";\nimport type { FabricActionDescriptor, FabricInvocationContext, FabricProvider, FabricProviderListRequest } from \"../protocol.js\";\nimport { JevClient, JevCredentials, type JevCredentialSource } from \"../jev/client.js\";\nimport { JevProgramManager, type JevManagerOptions } from \"../jev/manager.js\";\nimport type { JevLaunch, JevRequest } from \"../jev/types.js\";\nimport { jevObserveSchema } from \"../jev/observation.js\";\n\nconst description = Type.Union([Type.String(), Type.Array(Type.Unknown()), Type.Record(Type.String(), Type.Unknown())]);\nconst question = Type.Union([\n Type.Object({ type: Type.Literal(\"noul\"), instructions: description, criteria: Type.Optional(Type.Object({ true: Type.Optional(description), false: Type.Optional(description) }, { additionalProperties: false })) }, { additionalProperties: false }),\n Type.Object({ type: Type.Literal(\"choice\"), instructions: description, criteria: Type.Record(Type.String(), Type.Union([description, Type.Null()]), { minProperties: 1, maxProperties: 255 }) }, { additionalProperties: false }),\n Type.Object({ type: Type.Literal(\"score\"), instructions: description, criteria: Type.Array(description, { minItems: 2, maxItems: 10 }) }, { additionalProperties: false }),\n]);\nexport const jevRequestSchema = Type.Object({\n state: description,\n questions: Type.Record(Type.String(), question, { minProperties: 1, maxProperties: 128 }),\n model: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n}, { additionalProperties: false });\nexport const jevLaunchSchema = Type.Object({\n program: Type.Object({\n name: Type.String({ minLength: 1, maxLength: 128 }),\n code: Type.String({ minLength: 1, maxLength: 65_536 }),\n inputSchema: Type.Record(Type.String(), Type.Unknown()),\n outputSchema: Type.Record(Type.String(), Type.Unknown()),\n requires: Type.Array(Type.String({ minLength: 3, maxLength: 256 }), { maxItems: 64, uniqueItems: true }),\n limits: Type.Optional(Type.Object({\n timeoutMs: Type.Optional(Type.Integer({ minimum: 1 })),\n maxEvaluations: Type.Optional(Type.Integer({ minimum: 1 })),\n maxToolCalls: Type.Optional(Type.Integer({ minimum: 1 })),\n maxTokens: Type.Optional(Type.Integer({ minimum: 1 })),\n }, { additionalProperties: false })),\n }, { additionalProperties: false }),\n input: Type.Unknown(),\n observe: Type.Optional(jevObserveSchema),\n}, { additionalProperties: false });\nconst idSchema = Type.Object({ id: Type.String({ minLength: 1, maxLength: 128 }) }, { additionalProperties: false });\nconst statusSchema = Type.Object({\n id: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n after: Type.Optional(Type.Integer({ minimum: 0 })),\n}, { additionalProperties: false });\nexport const jevAdviceSchema = Type.Object({\n id: Type.String({ minLength: 1, maxLength: 128 }),\n eventId: Type.String({ minLength: 1, maxLength: 256 }),\n message: Type.String({ minLength: 1, maxLength: 2000 }),\n}, { additionalProperties: false });\nexport const JEV_ACTION_DESCRIPTORS: FabricActionDescriptor[] = [\n { name: \"evaluate\", description: \"Ask Jev typed Choice, Noul (probability of yes), and Score questions over shared state. No generated text. Batch independent questions. Sends state to TypeSafe and consumes API credits; no automatic retries.\", inputSchema: jevRequestSchema as unknown as Record<string, unknown>, risk: \"network\", effect: { kind: \"emission\", resources: [\"typesafe:inference\"], ordering: \"unknown\" } },\n { name: \"run\", description: \"Run an isolated TypeScript System One program in the foreground. Returns a terminal run envelope with schema-validated result or error. Globals: input, jev.evaluate, program.sleep(ms), program.emit(value), and Fabric tools restricted to exact requires. Loops are supported; no host imports or secrets.\", inputSchema: jevLaunchSchema as unknown as Record<string, unknown>, risk: \"execute\" },\n { name: \"spawn\", description: \"Launch a session-owned background Jev program. Optional observe requires read approval and subscribes to Main lifecycle events; program.nextEvent waits without polling and shares only explicitly selected bounded context. program.advise needs observe.delivery and requires jev.advise. Use status, wait/join, and stop; not restart-durable.\", inputSchema: jevLaunchSchema as unknown as Record<string, unknown>, risk: \"execute\" },\n { name: \"status\", description: \"Without id: credential configuration status (never retrieves secrets) and run summaries. With id: state, usage, bounded events after sequence, logs, result/error. Retains at most 64 events; nextSequence allows detecting gaps.\", inputSchema: statusSchema as unknown as Record<string, unknown>, risk: \"read\" },\n { name: \"wait\", description: \"Wait for a background Jev program's terminal run envelope. Cancelling the wait does not cancel the program.\", inputSchema: idSchema as unknown as Record<string, unknown>, risk: \"read\" },\n { name: \"join\", description: \"Alias for jev.wait: wait for a background Jev program's terminal run envelope without cancelling the program when the wait is cancelled.\", inputSchema: idSchema as unknown as Record<string, unknown>, risk: \"read\" },\n { name: \"advise\", description: \"Deliver bounded advice from an observing Jev run to Main. Requires its current consumed eventId, explicit observe.delivery, freshness, message budget, and the per-input feedback gate. The program helper program.advise supplies its own id. Subject to agent approvals; returns delivered and an optional suppression reason.\", inputSchema: jevAdviceSchema as unknown as Record<string, unknown>, risk: \"agent\", effect: { kind: \"emission\", resources: [\"main:messages\"], ordering: \"ordered\" } },\n { name: \"stop\", description: \"Cancel a Jev program and await sandbox cleanup. Idempotent for retained terminal runs; already-issued external effects cannot be undone.\", inputSchema: idSchema as unknown as Record<string, unknown>, risk: \"execute\" },\n];\n\nexport class JevProvider implements FabricProvider {\n readonly name = \"jev\";\n readonly description = \"TypeSafe System One judgments and foreground/background reactive TypeScript programs\";\n readonly manager: JevProgramManager;\n readonly client: JevClient;\n constructor(options: JevManagerOptions & { credentialSource?: JevCredentialSource }, client?: JevClient) {\n this.manager = new JevProgramManager(options);\n this.client = client ?? new JevClient(options.config.jev, undefined, new JevCredentials(options.config.jev.credentialCommand, process.env, options.credentialSource));\n }\n async list(request: FabricProviderListRequest): Promise<FabricActionDescriptor[]> {\n const query = request.query?.toLowerCase();\n return JEV_ACTION_DESCRIPTORS.filter(d => !query || `${d.name} ${d.description}`.toLowerCase().includes(query));\n }\n async describe(name: string): Promise<FabricActionDescriptor | undefined> { return JEV_ACTION_DESCRIPTORS.find(d => d.name === name); }\n async invoke(name: string, args: Record<string, unknown>, context: FabricInvocationContext): Promise<unknown> {\n const descriptor = await this.describe(name);\n if (!descriptor) throw new Error(`Unknown Jev action: ${name}`);\n const invalid = validationMessage(descriptor.inputSchema, args);\n if (invalid) throw new Error(`Invalid jev.${name} arguments: ${invalid}`);\n switch (name) {\n case \"evaluate\": return this.client.evaluate(args as unknown as JevRequest, context.signal ?? new AbortController().signal);\n case \"run\": return this.manager.launch(args as unknown as JevLaunch, context, false);\n case \"spawn\": return this.manager.launch(args as unknown as JevLaunch, context, true);\n case \"status\": return typeof args.id === \"string\" ? this.manager.status(args.id, args.after as number | undefined) : {\n credentials: this.client.credentials.status(), model: this.client.config.model, runs: this.manager.list(),\n };\n case \"join\":\n case \"wait\": return this.manager.wait(args.id as string, context.signal);\n case \"advise\": return this.manager.advise(args.id as string, args.eventId as string, args.message as string);\n case \"stop\": return this.manager.stop(args.id as string);\n }\n }\n async close(): Promise<void> { await this.manager.close(); this.client.close(); }\n}\n", "import { execFile } from \"node:child_process\";\nimport { runAbortable } from \"../async-settlement.js\";\nimport type { FabricJevConfig } from \"./config.js\";\nimport type { JevRequest, JevResponse } from \"./types.js\";\nimport { checkRequest, checkResponse, jsonText } from \"./validation.js\";\n\nexport interface JevCredentialSource {\n configured(): boolean;\n resolve(signal: AbortSignal): Promise<string | undefined>;\n}\nexport class JevCredentials {\n #cached: string | undefined;\n constructor(readonly command: readonly string[], private readonly env: NodeJS.ProcessEnv = process.env, private readonly providerAuth?: JevCredentialSource) {}\n status() {\n const source = this.providerAuth?.configured() ? \"pi\" : this.env.TYPESAFE_API_KEY?.trim() ? \"environment\" : this.command.length ? \"command\" : \"missing\";\n return { configured: source !== \"missing\", source, verified: false };\n }\n async resolve(signal: AbortSignal): Promise<string> {\n signal.throwIfAborted();\n if (this.providerAuth) {\n try {\n const key = await this.providerAuth.resolve(signal);\n signal.throwIfAborted();\n if (key?.trim()) return key.trim();\n } catch { throw new Error(\"Jev Pi credential resolution failed\"); }\n }\n const env = this.env.TYPESAFE_API_KEY?.trim();\n if (env) return env;\n if (this.#cached) return this.#cached;\n const [file, ...args] = this.command;\n if (!file) throw new Error(\"Jev credentials unavailable: set TYPESAFE_API_KEY or configure jev.credentialCommand\");\n const secret = await new Promise<string>((resolve, reject) => {\n execFile(file, args, { encoding: \"utf8\", timeout: 5_000, maxBuffer: 16_384, signal, windowsHide: true }, (error, stdout) => {\n // Never propagate subprocess errors: they can contain stdout/stderr secrets.\n if (error) reject(new Error(\"Jev credential resolver failed\"));\n else resolve(stdout.trim());\n });\n });\n signal.throwIfAborted();\n if (!secret || /[\\r\\n]/.test(secret)) throw new Error(\"Jev credential resolver returned an invalid credential\");\n this.#cached = secret;\n return secret;\n }\n clear(): void { this.#cached = undefined; }\n}\nexport class JevClient {\n readonly credentials: JevCredentials;\n constructor(readonly config: FabricJevConfig, private readonly fetcher: typeof fetch = fetch, credentials?: JevCredentials) {\n this.credentials = credentials ?? new JevCredentials(config.credentialCommand);\n }\n async evaluate(request: JevRequest, signal: AbortSignal): Promise<JevResponse> {\n checkRequest(request, this.config.maxRequestBytes);\n const timedSignal = AbortSignal.any([signal, AbortSignal.timeout(this.config.requestTimeoutMs)]);\n const key = await runAbortable(timedSignal, () => this.credentials.resolve(timedSignal));\n const body = jsonText({ ...request, model: request.model ?? this.config.model }, this.config.maxRequestBytes, \"Jev request\");\n let response: Response;\n try {\n response = await runAbortable(timedSignal, () => this.fetcher(\"https://api.typesafe.ai/v1/systemone\", {\n method: \"POST\", redirect: \"error\", signal: timedSignal,\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` }, body,\n }));\n } catch {\n throw new Error(timedSignal.aborted ? \"Jev request cancelled or timed out\" : \"Jev network request failed\");\n }\n if (!response.ok) {\n await response.body?.cancel();\n // No automatic retry: the controller decides whether a delayed decision is still useful.\n throw new Error(`TypeSafe HTTP ${response.status}${[429, 529].includes(response.status) ? \": rate limited; back off before retrying\" : \"\"}`);\n }\n const reader = response.body?.getReader();\n if (!reader) throw new Error(\"TypeSafe returned an empty response\");\n const chunks: Uint8Array[] = [];\n let bytes = 0;\n try {\n for (;;) {\n const { value, done } = await runAbortable(timedSignal, () => reader.read());\n if (done) break;\n bytes += value.byteLength;\n if (bytes > 1_048_576) throw new Error(\"oversize\");\n chunks.push(value);\n }\n return checkResponse(JSON.parse(Buffer.concat(chunks).toString(\"utf8\")), request);\n } catch {\n throw new Error(timedSignal.aborted ? \"Jev response cancelled or timed out\" : \"TypeSafe returned an invalid or oversized typed response\");\n } finally { await reader.cancel().catch(() => undefined); }\n }\n close(): void { this.credentials.clear(); }\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { runAbortable } from \"../async-settlement.js\";\nimport type { ActionRegistry, FabricCapabilityViewLease, FabricCallAudit } from \"../core/action-registry.js\";\nimport { ApprovalController, FabricSessionApprovals } from \"../core/approval-controller.js\";\nimport type { FabricConfig } from \"../config.js\";\nimport type { FabricInvocationContext } from \"../protocol.js\";\nimport type { JevLaunch, JevRunInfo, JevJson, JevResponse } from \"./types.js\";\nimport { checkSchema, checkValue, jsonText, object } from \"./validation.js\";\nimport { checkObserve, type JevObservationHost, type JevSubscription } from \"./observation.js\";\n\ninterface Run {\n info: JevRunInfo;\n controller: AbortController;\n done: Promise<JevRunInfo>;\n observation: JevSubscription | undefined;\n}\nexport interface JevManagerOptions {\n registry: ActionRegistry;\n config: FabricConfig;\n observationHost?: JevObservationHost | undefined;\n authorize?(ref: string, parentToolCallId: string): Promise<void>;\n}\nconst prelude = `const input = JSON.parse(\u03C0.__jevInput);\nconst program = Object.freeze({\n sleep: (ms: number): Promise<unknown> => tools.call({ ref: \"jev.$sleep\", args: { ms } }),\n emit: (value: unknown): Promise<unknown> => tools.call({ ref: \"jev.$emit\", args: { value } }),\n nextEvent: (): Promise<FabricJevHostEvent> => tools.call({ ref: \"jev.$nextEvent\" }) as Promise<FabricJevHostEvent>,\n advise: (args: {eventId: string; message: string}): Promise<FabricJevAdviceResult> => tools.call({ ref: \"jev.advise\", args: {...args, id: \u03C0.__jevRunId} }) as Promise<FabricJevAdviceResult>,\n});\\n`;\n\nexport class JevProgramManager {\n readonly #runs = new Map<string, Run>();\n readonly #approvals = new FabricSessionApprovals();\n #closed = false;\n #starting = 0;\n constructor(readonly options: JevManagerOptions) {}\n list() {\n return [...this.#runs.values()].map(({ info }) => ({\n id: info.id, name: info.name, state: info.state, background: info.background,\n startedAt: info.startedAt, evaluations: info.evaluations, toolCalls: info.toolCalls,\n ...(info.observation ? { observation: structuredClone(info.observation) } : {}),\n }));\n }\n #get(id: string): Run {\n const run = this.#runs.get(id);\n if (!run) throw new Error(\"Unknown or expired Jev run ID\");\n return run;\n }\n status(id: string, after = 0): JevRunInfo {\n const info = this.#get(id).info;\n return structuredClone({ ...info, events: info.events.filter(e => e.sequence > after) });\n }\n async wait(id: string, signal?: AbortSignal): Promise<JevRunInfo> {\n return structuredClone(await runAbortable(signal, () => this.#get(id).done));\n }\n /** Alias for wait. */\n join(id: string, signal?: AbortSignal): Promise<JevRunInfo> {\n return this.wait(id, signal);\n }\n async stop(id: string): Promise<JevRunInfo> {\n const run = this.#get(id);\n if (run.info.state === \"running\") run.controller.abort(new Error(\"Jev run stopped\"));\n return structuredClone(await run.done);\n }\n advise(id: string, eventId: string, message: string) {\n if (typeof message !== \"string\" || !message.trim() || message.length > 2000 || typeof eventId !== \"string\" || eventId.length > 256)\n throw new Error(\"Advice requires a current eventId and 1\u20132000 message characters\");\n const run = this.#get(id);\n if (!run.observation) throw new Error(\"Jev run has no observation subscription\");\n return run.observation.advise(eventId, message);\n }\n async launch(request: JevLaunch, context: FabricInvocationContext, background: boolean): Promise<JevRunInfo> {\n const { config, registry } = this.options;\n if (this.#closed) throw new Error(\"Jev program manager is closed\");\n if (this.#starting + [...this.#runs.values()].filter(r => r.info.state === \"running\").length >= config.jev.maxConcurrentRuns)\n throw new Error(\"Jev concurrent run limit reached\");\n context.signal?.throwIfAborted();\n this.#starting++;\n let lease: FabricCapabilityViewLease | undefined;\n let starting = true;\n try {\n const { program: definition, input, observe } = structuredClone(request);\n const observationHost = this.options.observationHost;\n const observationRevision = observationHost?.revision;\n if (observe !== undefined) {\n checkObserve(observe);\n if (!background) throw new Error(\"Observation requires jev.spawn; foreground runs cannot wait for their own turn to end\");\n if (!observationHost) throw new Error(\"Main lifecycle observation is unavailable in this host\");\n if (context.extensionContext.sessionManager?.getSessionId() !== observationHost.sessionId)\n throw new Error(\"Jev observation is scoped to its owning Main session\");\n }\n checkSchema(definition.inputSchema);\n checkSchema(definition.outputSchema);\n checkValue(definition.inputSchema, input, \"Program input\");\n const requires = [...new Set(definition.requires)];\n for (const ref of requires) {\n if (!/^[a-z][a-z0-9_-]*\\.[a-zA-Z0-9_.$-]+$/.test(ref) || (ref.startsWith(\"jev.\") && ref !== \"jev.evaluate\" && ref !== \"jev.advise\"))\n throw new Error(\"Programs require exact action refs; recursive Jev lifecycle calls are not allowed\");\n if (context.capabilityView && !Object.hasOwn(context.capabilityView.bindings, ref))\n throw new Error(`Jev program cannot widen its caller's capabilities: ${ref}`);\n if (!config.fullCodeMode && (ref.startsWith(\"pi.\") || ref.startsWith(\"extensions.\")))\n throw new Error(\"Full-code tool access is disabled\");\n }\n lease = await registry.acquireCapabilityView(requires, context);\n if (!lease.satisfied || !lease.view) throw new Error(`Missing Jev program capabilities: ${lease.missing.join(\", \")}`);\n if (context.capabilityView) for (const ref of requires) {\n const before = context.capabilityView.bindings[ref]!;\n const after = lease.view.bindings[ref]!;\n if (before.providerBindingId !== after.providerBindingId || before.descriptorHash !== after.descriptorHash)\n throw new Error(\"Caller capability generation changed; relaunch with a fresh commitment\");\n }\n const { TypeScriptKernelRuntime } = await import(\"../runtime/typescript-kernel.js\");\n const runtime = new TypeScriptKernelRuntime(\"quickjs\");\n const sources = await registry.guestTypeSources({ ...context, capabilityView: lease.view });\n const { code, checked } = runtime.prepare(prelude + definition.code, true, [], sources, [], true);\n if (checked.errors.length) throw new Error(`Jev program typecheck failed: ${checked.errors.map(e => e.message).join(\"; \").slice(0, 2000)}`);\n const approval = new ApprovalController(config.approvals, context.extensionContext, this.#approvals);\n if (observe) await approval.approve({\n ref: \"jev.spawn\", provider: \"jev\", name: \"spawn\",\n description: \"Observe future Main lifecycle events and explicitly selected content for a bounded Jev program\",\n inputSchema: {}, risk: \"read\",\n }, { observe });\n if (this.#closed) throw new Error(\"Jev program manager is closed\");\n context.signal?.throwIfAborted();\n if (observe && observationHost!.revision !== observationRevision)\n throw new Error(\"Main lifecycle changed while preparing the observer; relaunch explicitly with current context\");\n const limits = definition.limits ?? {};\n const bounded = (value: number | undefined, fallback: number, ceiling: number) => Math.min(value ?? fallback, ceiling);\n const timeoutMs = bounded(limits.timeoutMs, 60_000, config.jev.maxDurationMs);\n const maxEvaluations = bounded(limits.maxEvaluations, 100, config.jev.maxEvaluations);\n const maxToolCalls = bounded(limits.maxToolCalls, 1000, config.jev.maxToolCalls);\n const maxTokens = bounded(limits.maxTokens, 100_000, config.jev.maxTokens);\n const id = randomUUID();\n const controller = new AbortController();\n const info: JevRunInfo = {\n id, name: definition.name, state: \"running\", background, startedAt: Date.now(),\n evaluations: 0, toolCalls: 0, usage: { input_tokens: 0, output_tokens: 0 },\n events: [], nextSequence: 1, logs: [],\n };\n let budgetFailure: string | undefined;\n const failBudget = (message: string): never => {\n budgetFailure = message;\n queueMicrotask(() => controller.abort(new Error(message)));\n throw new Error(message);\n };\n const observation = observe ? observationHost!.subscribe(observe, { id, name: definition.name }, controller) : undefined;\n if (observation) info.observation = observation.stats;\n const runLease = lease;\n lease = undefined;\n const abort = () => controller.abort(new Error(\"Foreground caller cancelled\"));\n if (!background) context.signal?.addEventListener(\"abort\", abort, { once: true });\n let timedOut = false;\n const timer = setTimeout(() => { timedOut = true; controller.abort(new Error(\"Jev deadline exceeded\")); }, timeoutMs);\n let evaluating = false;\n const audits: FabricCallAudit[] = [];\n const emit = (value: unknown) => {\n jsonText(value, 4096, \"Program event\");\n info.events.push({ sequence: info.nextSequence++, at: Date.now(), value: value as JevJson });\n if (info.events.length > 64) info.events.shift();\n };\n const run: Run = { info, controller, observation, done: undefined! };\n this.#runs.set(id, run);\n this.#starting--;\n starting = false;\n this.#prune();\n // Yield before execution so spawn returns without running a controller tick inline.\n run.done = (async () => {\n try {\n await delay(0, undefined, { signal: controller.signal });\n const result = await runtime.execute(code, async (rawRef, rawArgs, signal) => {\n signal.throwIfAborted();\n controller.signal.throwIfAborted();\n if (budgetFailure) throw new Error(budgetFailure);\n if (++info.toolCalls > maxToolCalls) return failBudget(\"Jev tool-call budget exhausted\");\n const ref = rawRef === \"fabric.$call\" ? rawArgs.ref : rawRef;\n const args = rawRef === \"fabric.$call\" ? rawArgs.args ?? {} : rawArgs;\n if (typeof ref !== \"string\" || !object(args)) throw new Error(\"Invalid Jev program tool call\");\n if (ref === \"jev.$sleep\") {\n if (typeof args.ms !== \"number\" || !Number.isFinite(args.ms) || args.ms < 0 || args.ms > timeoutMs) throw new Error(\"Invalid program.sleep duration\");\n await delay(args.ms, undefined, { signal });\n return null;\n }\n if (ref === \"jev.$emit\") { emit(args.value); return null; }\n if (ref === \"jev.$nextEvent\") {\n if (!observation) throw new Error(\"program.nextEvent requires observe on jev.spawn\");\n return observation.next();\n }\n if (ref === \"jev.advise\" && args.id !== id) throw new Error(\"A Jev program can only advise through its own run\");\n if (!Object.hasOwn(runLease.view!.bindings, ref)) throw new Error(`Capability not granted to Jev program: ${ref}`);\n if (ref === \"jev.evaluate\") {\n if (evaluating) throw new Error(\"One Jev evaluation may be in flight per program; batch independent questions in one request\");\n if (info.evaluations >= maxEvaluations || info.usage.input_tokens + info.usage.output_tokens >= maxTokens)\n return failBudget(\"Jev inference budget exhausted\");\n info.evaluations++;\n evaluating = true;\n }\n try {\n const value = await registry.invoke(ref, args, {\n cwd: context.cwd, extensionContext: context.extensionContext, signal, capabilityView: runLease.view!,\n ...(context.effectPolicy ? { effectPolicy: context.effectPolicy } : {}),\n parentToolCallId: `jev:${id}`, nestedToolCallId: `jev:${id}:${info.toolCalls}`,\n update() {}, activity() {}, attachMedia() {}, attachPreview() {},\n authorize: async action => { await this.options.authorize?.(action.ref, `jev:${id}`); },\n approve: async (action, prepared) => {\n if (action.ref === \"schema.commit\") {\n await approval.approve({ ...action, risk: \"write\" }, prepared);\n await approval.approve({ ...action, risk: \"execute\" }, prepared);\n } else await approval.approve(action, prepared);\n },\n audits, maxResultChars: ref === \"jev.evaluate\" ? 1_048_576 : config.executor.maxNestedResultChars,\n });\n if (ref === \"jev.evaluate\") {\n const response = value as JevResponse;\n info.usage.input_tokens += response.usage.input_tokens;\n info.usage.output_tokens += response.usage.output_tokens;\n if (info.usage.input_tokens + info.usage.output_tokens > maxTokens)\n return failBudget(\"Jev reported-token budget exhausted\");\n }\n return value;\n } finally {\n if (ref === \"jev.evaluate\") evaluating = false;\n // Keep audit retention bounded even in a long-lived loop.\n if (audits.length > 64) audits.splice(0, audits.length - 64);\n }\n }, {\n timeoutMs, memoryLimitBytes: Math.min(config.executor.memoryLimitBytes, 64 * 1024 * 1024),\n maxCpuSliceMs: 100, maxPendingTimers: 128, maxLogChars: 4096, strings: { __jevInput: JSON.stringify(input), __jevRunId: id }, signal: controller.signal,\n });\n info.logs = result.logs;\n if (budgetFailure) { info.state = \"failed\"; info.error = budgetFailure; }\n else if (timedOut || result.terminationReason === \"timed_out\") { info.state = \"timed_out\"; info.error = result.error ?? \"Jev deadline exceeded\"; }\n else if (controller.signal.aborted || result.terminationReason === \"aborted\") { info.state = \"cancelled\"; }\n else if (result.terminationReason !== \"completed\") { info.state = \"failed\"; info.error = result.error ?? \"Jev program failed\"; }\n else {\n checkValue(definition.outputSchema, result.value, \"Program output\");\n info.result = result.value;\n info.state = \"completed\";\n }\n } catch (error) {\n info.state = budgetFailure ? \"failed\" : timedOut ? \"timed_out\" : controller.signal.aborted ? \"cancelled\" : \"failed\";\n info.error = (budgetFailure ?? (error instanceof Error ? error.message : \"Jev program failed\")).slice(0, 2000);\n } finally {\n clearTimeout(timer);\n observation?.close();\n context.signal?.removeEventListener(\"abort\", abort);\n await runLease.release();\n info.endedAt = Date.now();\n this.#prune();\n }\n return info;\n })();\n return background ? this.status(id) : structuredClone(await run.done);\n } finally {\n if (starting) this.#starting--;\n await lease?.release();\n }\n }\n #prune(): void {\n for (const [id, run] of this.#runs) {\n if (this.#runs.size <= this.options.config.jev.maxRetainedRuns) break;\n if (run.info.state !== \"running\") this.#runs.delete(id);\n }\n }\n stopAll(): void {\n for (const run of this.#runs.values()) if (run.info.state === \"running\") run.controller.abort(new Error(\"Jev provider closed\"));\n }\n async close(): Promise<void> {\n this.#closed = true;\n // Terminal runs are already out of QuickJS and may be releasing the last\n // provider lease right now. Waiting for those here would self-deadlock.\n const running = [...this.#runs.values()].filter(r => r.info.state === \"running\");\n this.stopAll();\n await Promise.all(running.map(r => r.done));\n this.#runs.clear();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -19,23 +19,44 @@ interface FabricJevProgram {
19
19
  requires: string[];
20
20
  limits?: { timeoutMs?: number; maxEvaluations?: number; maxToolCalls?: number; maxTokens?: number };
21
21
  }
22
+ type FabricJevHostEventName = "input" | "turn_end" | "tool_error" | "agent_end" | "agent_settled";
23
+ interface FabricJevObserve {
24
+ events: FabricJevHostEventName[];
25
+ include?: Array<"inputText" | "assistantText" | "toolResults">;
26
+ maxChars?: number; queueSize?: number; maxEventAgeMs?: number;
27
+ delivery?: "steer" | "followUp"; triggerTurn?: boolean; maxAdvice?: number;
28
+ }
29
+ interface FabricJevHostEvent {
30
+ id: string; sequence: number; event: FabricJevHostEventName; source: "main";
31
+ sessionId: string; revision: number; at: number; payload: FabricJevJson; truncated: boolean;
32
+ }
33
+ interface FabricJevObservationStats {
34
+ events: FabricJevHostEventName[]; received: number; consumed: number; dropped: number; queued: number;
35
+ adviceDelivered: number; adviceSuppressed: number;
36
+ }
37
+ interface FabricJevAdviceResult {
38
+ delivered: boolean;
39
+ reason?: "disabled" | "stale" | "duplicate" | "budget" | "feedback" | "delivery_failed";
40
+ }
22
41
  interface FabricJevRun<T = unknown> {
23
42
  id: string; name: string; state: "running" | "completed" | "failed" | "cancelled" | "timed_out";
24
43
  background: boolean; startedAt: number; endedAt?: number; result?: T; error?: string;
25
44
  evaluations: number; toolCalls: number; usage: { input_tokens: number; output_tokens: number };
26
45
  events: Array<{ sequence: number; at: number; value: FabricJevJson }>; nextSequence: number; logs: string[];
46
+ observation?: FabricJevObservationStats;
27
47
  }
28
48
  interface FabricJevApi {
29
49
  evaluate<Q extends Record<string, FabricJevQuestion>>(args: {
30
50
  state: string | FabricJevJson[] | { [key: string]: FabricJevJson }; questions: Q; model?: string;
31
51
  }): Promise<{ model: string; answers: { [K in keyof Q]: FabricJevAnswer<Q[K]> }; usage: { input_tokens: number; output_tokens: number } }>;
32
52
  run<T = unknown>(args: { program: FabricJevProgram; input: FabricJevJson }): Promise<FabricJevRun<T>>;
33
- spawn(args: { program: FabricJevProgram; input: FabricJevJson }): Promise<FabricJevRun>;
34
- status(args?: { id?: never; after?: never }): Promise<{ credentials: { configured: boolean; source: "pi" | "environment" | "command" | "missing"; verified: boolean }; model: string; runs: Array<{ id: string; name: string; state: string; background: boolean; startedAt: number; evaluations: number; toolCalls: number }> }>;
53
+ spawn(args: { program: FabricJevProgram; input: FabricJevJson; observe?: FabricJevObserve }): Promise<FabricJevRun>;
54
+ status(args?: { id?: never; after?: never }): Promise<{ credentials: { configured: boolean; source: "pi" | "environment" | "command" | "missing"; verified: boolean }; model: string; runs: Array<{ id: string; name: string; state: string; background: boolean; startedAt: number; evaluations: number; toolCalls: number; observation?: FabricJevObservationStats }> }>;
35
55
  status<T = unknown>(args: { id: string; after?: number }): Promise<FabricJevRun<T>>;
36
56
  wait<T = unknown>(args: { id: string }): Promise<FabricJevRun<T>>;
37
57
  /** Alias for wait. */
38
58
  join<T = unknown>(args: { id: string }): Promise<FabricJevRun<T>>;
59
+ advise(args: { id: string; eventId: string; message: string }): Promise<FabricJevAdviceResult>;
39
60
  stop(args: { id: string }): Promise<FabricJevRun>;
40
61
  }
41
62
  declare const jev: FabricJevApi;
@@ -1400,4 +1421,4 @@ export {
1400
1421
  GUEST_TYPE_DECLARATIONS,
1401
1422
  guestTypeDeclarations
1402
1423
  };
1403
- //# sourceMappingURL=chunk-ZG3ELJHX.js.map
1424
+ //# sourceMappingURL=chunk-MSCHYMYR.js.map