pi-fabric 0.114.0 → 0.115.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 (60) hide show
  1. package/dist/chunks/{chunk-G2GKA6TH.js → chunk-3PYRBP3O.js} +2 -2
  2. package/dist/chunks/{chunk-7PPIKFT5.js → chunk-4GGBND7V.js} +2 -2
  3. package/dist/chunks/{chunk-J2HUD36Z.js → chunk-5X35KXBV.js} +14 -2
  4. package/dist/chunks/{chunk-J2HUD36Z.js.map → chunk-5X35KXBV.js.map} +2 -2
  5. package/dist/chunks/{chunk-VYWJVAK5.js → chunk-6EVAHJAR.js} +2 -2
  6. package/dist/chunks/{chunk-GUZG4GGT.js → chunk-7C5IEIQK.js} +2 -2
  7. package/dist/chunks/{chunk-4WCEZL6Y.js → chunk-CUWIRPRV.js} +2 -2
  8. package/dist/chunks/{chunk-XDZMXORT.js → chunk-EQYQICUY.js} +3 -3
  9. package/dist/chunks/{chunk-R4RROLJ4.js → chunk-IQXNJNDI.js} +8 -7
  10. package/dist/chunks/chunk-IQXNJNDI.js.map +7 -0
  11. package/dist/chunks/{chunk-NJK3TKNR.js → chunk-M3MBDI2X.js} +4 -4
  12. package/dist/chunks/{chunk-B54Z662X.js → chunk-PTZ5DKAB.js} +25 -5
  13. package/dist/chunks/chunk-PTZ5DKAB.js.map +7 -0
  14. package/dist/chunks/{chunk-UQWBZKAN.js → chunk-QCCPR3U5.js} +3 -3
  15. package/dist/chunks/{chunk-NWST4TDR.js → chunk-UPPQ3QOH.js} +2 -2
  16. package/dist/chunks/{chunk-T2CJJASQ.js → chunk-VTNUU2VK.js} +3 -3
  17. package/dist/components/configuration.js +4 -4
  18. package/dist/extension-bootstrap.js +6 -6
  19. package/dist/fabric-runtime-state.js +6 -6
  20. package/dist/fabric-runtime-state.js.map +1 -1
  21. package/dist/index.js +6 -6
  22. package/dist/jev/auth.d.ts +2 -0
  23. package/dist/jev/auth.d.ts.map +1 -1
  24. package/dist/jev/client.js +3 -3
  25. package/dist/jev/model-key.d.ts +3 -2
  26. package/dist/jev/model-key.d.ts.map +1 -1
  27. package/dist/jev/observation.js +3 -3
  28. package/dist/jev/routes.d.ts +11 -1
  29. package/dist/jev/routes.d.ts.map +1 -1
  30. package/dist/jev.d.ts +2 -2
  31. package/dist/jev.d.ts.map +1 -1
  32. package/dist/jev.js +17 -9
  33. package/dist/providers/jev-provider.js +7 -7
  34. package/dist/residency/host.js +5 -5
  35. package/dist/residency/pi-entry.js +5 -5
  36. package/dist/runtime/monty-runtime.js +3 -3
  37. package/dist/ui/settings.js +6 -5
  38. package/dist/ui/settings.js.map +2 -2
  39. package/docs/configuration.md +4 -4
  40. package/docs/jev-decisions.md +1 -0
  41. package/docs/jev.md +4 -2
  42. package/package.json +2 -2
  43. package/skillsets/python/fabric-exec/SKILL.md +1 -1
  44. package/skillsets/python/fabric-foreman/SKILL.md +1 -1
  45. package/skillsets/python/fabric-jev/SKILL.md +2 -2
  46. package/skillsets/typescript/fabric-exec/SKILL.md +1 -1
  47. package/skillsets/typescript/fabric-foreman/SKILL.md +1 -1
  48. package/skillsets/typescript/fabric-jev/SKILL.md +2 -2
  49. package/dist/chunks/chunk-B54Z662X.js.map +0 -7
  50. package/dist/chunks/chunk-R4RROLJ4.js.map +0 -7
  51. /package/dist/chunks/{chunk-G2GKA6TH.js.map → chunk-3PYRBP3O.js.map} +0 -0
  52. /package/dist/chunks/{chunk-7PPIKFT5.js.map → chunk-4GGBND7V.js.map} +0 -0
  53. /package/dist/chunks/{chunk-VYWJVAK5.js.map → chunk-6EVAHJAR.js.map} +0 -0
  54. /package/dist/chunks/{chunk-GUZG4GGT.js.map → chunk-7C5IEIQK.js.map} +0 -0
  55. /package/dist/chunks/{chunk-4WCEZL6Y.js.map → chunk-CUWIRPRV.js.map} +0 -0
  56. /package/dist/chunks/{chunk-XDZMXORT.js.map → chunk-EQYQICUY.js.map} +0 -0
  57. /package/dist/chunks/{chunk-NJK3TKNR.js.map → chunk-M3MBDI2X.js.map} +0 -0
  58. /package/dist/chunks/{chunk-UQWBZKAN.js.map → chunk-QCCPR3U5.js.map} +0 -0
  59. /package/dist/chunks/{chunk-NWST4TDR.js.map → chunk-UPPQ3QOH.js.map} +0 -0
  60. /package/dist/chunks/{chunk-T2CJJASQ.js.map → chunk-VTNUU2VK.js.map} +0 -0
@@ -8,7 +8,7 @@ import {
8
8
  agentParticipantRecords,
9
9
  loadModelUsage,
10
10
  useBudgetLedger
11
- } from "./chunk-NWST4TDR.js";
11
+ } from "./chunk-UPPQ3QOH.js";
12
12
  import {
13
13
  MeshStore
14
14
  } from "./chunk-KBYSGB7E.js";
@@ -815,4 +815,4 @@ export {
815
815
  residentIdleDecision,
816
816
  runResidentHostFromConfigPath
817
817
  };
818
- //# sourceMappingURL=chunk-G2GKA6TH.js.map
818
+ //# sourceMappingURL=chunk-3PYRBP3O.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isJevModelId
3
- } from "./chunk-B54Z662X.js";
3
+ } from "./chunk-PTZ5DKAB.js";
4
4
 
5
5
  // src/jev/validation.ts
6
6
  import { Value } from "typebox/value";
@@ -149,4 +149,4 @@ export {
149
149
  checkSchema,
150
150
  checkValue
151
151
  };
152
- //# sourceMappingURL=chunk-7PPIKFT5.js.map
152
+ //# sourceMappingURL=chunk-4GGBND7V.js.map
@@ -12,12 +12,24 @@ var createJevAuthProvider = () => ({
12
12
  stream: noChat,
13
13
  streamSimple: noChat
14
14
  });
15
+ var createSubqAuthProvider = () => ({
16
+ id: "subq",
17
+ name: "SubQ Snap (System One)",
18
+ baseUrl: "https://api.subq.ai/v1",
19
+ auth: { apiKey: envApiKeyAuth("SubQ API key", ["SUBQ_API_KEY"]) },
20
+ getModels: () => [],
21
+ stream: noChat,
22
+ streamSimple: noChat
23
+ });
15
24
  function registerJevAuth(pi) {
16
- if (typeof pi.registerProvider === "function") pi.registerProvider(createJevAuthProvider());
25
+ if (typeof pi.registerProvider !== "function") return;
26
+ pi.registerProvider(createJevAuthProvider());
27
+ pi.registerProvider(createSubqAuthProvider());
17
28
  }
18
29
 
19
30
  export {
20
31
  createJevAuthProvider,
32
+ createSubqAuthProvider,
21
33
  registerJevAuth
22
34
  };
23
- //# sourceMappingURL=chunk-J2HUD36Z.js.map
35
+ //# sourceMappingURL=chunk-5X35KXBV.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/jev/auth.ts"],
4
- "sourcesContent": ["import { envApiKeyAuth, type Provider } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\n\nconst noChat = (): never => { throw new Error(\"Jev supplies typed judgments, not chat generation\"); };\n\n/** Auth-only native provider: /login support without advertising a chat API.\n * Pi 0.99's createProvider requires an operation API, so use the native contract\n * directly instead of inventing a chat model or an empty API implementation.\n */\nexport const createJevAuthProvider = (): Provider => ({\n id: \"jev\",\n name: \"Jev (TypeSafe System One)\",\n baseUrl: \"https://api.typesafe.ai/v1\",\n auth: { apiKey: envApiKeyAuth(\"TypeSafe API key\", [\"TYPESAFE_API_KEY\"]) },\n getModels: () => [],\n stream: noChat,\n streamSimple: noChat,\n});\nexport function registerJevAuth(pi: ExtensionAPI): void {\n // Keep lightweight test/managed adapters without provider registration usable.\n if (typeof pi.registerProvider === \"function\") pi.registerProvider(createJevAuthProvider());\n}\n"],
5
- "mappings": ";AAAA,SAAS,qBAAoC;AAG7C,IAAM,SAAS,MAAa;AAAE,QAAM,IAAI,MAAM,mDAAmD;AAAG;AAM7F,IAAM,wBAAwB,OAAiB;AAAA,EACpD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM,EAAE,QAAQ,cAAc,oBAAoB,CAAC,kBAAkB,CAAC,EAAE;AAAA,EACxE,WAAW,MAAM,CAAC;AAAA,EAClB,QAAQ;AAAA,EACR,cAAc;AAChB;AACO,SAAS,gBAAgB,IAAwB;AAEtD,MAAI,OAAO,GAAG,qBAAqB,WAAY,IAAG,iBAAiB,sBAAsB,CAAC;AAC5F;",
4
+ "sourcesContent": ["import { envApiKeyAuth, type Provider } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\n\nconst noChat = (): never => { throw new Error(\"Jev supplies typed judgments, not chat generation\"); };\n\n/** Auth-only native provider: /login support without advertising a chat API.\n * Pi 0.99's createProvider requires an operation API, so use the native contract\n * directly instead of inventing a chat model or an empty API implementation.\n */\nexport const createJevAuthProvider = (): Provider => ({\n id: \"jev\",\n name: \"Jev (TypeSafe System One)\",\n baseUrl: \"https://api.typesafe.ai/v1\",\n auth: { apiKey: envApiKeyAuth(\"TypeSafe API key\", [\"TYPESAFE_API_KEY\"]) },\n getModels: () => [],\n stream: noChat,\n streamSimple: noChat,\n});\n/** The same auth-only contract for SubQ's System One route: `/login subq`. */\nexport const createSubqAuthProvider = (): Provider => ({\n id: \"subq\",\n name: \"SubQ Snap (System One)\",\n baseUrl: \"https://api.subq.ai/v1\",\n auth: { apiKey: envApiKeyAuth(\"SubQ API key\", [\"SUBQ_API_KEY\"]) },\n getModels: () => [],\n stream: noChat,\n streamSimple: noChat,\n});\nexport function registerJevAuth(pi: ExtensionAPI): void {\n // Keep lightweight test/managed adapters without provider registration usable.\n if (typeof pi.registerProvider !== \"function\") return;\n pi.registerProvider(createJevAuthProvider());\n pi.registerProvider(createSubqAuthProvider());\n}\n"],
5
+ "mappings": ";AAAA,SAAS,qBAAoC;AAG7C,IAAM,SAAS,MAAa;AAAE,QAAM,IAAI,MAAM,mDAAmD;AAAG;AAM7F,IAAM,wBAAwB,OAAiB;AAAA,EACpD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM,EAAE,QAAQ,cAAc,oBAAoB,CAAC,kBAAkB,CAAC,EAAE;AAAA,EACxE,WAAW,MAAM,CAAC;AAAA,EAClB,QAAQ;AAAA,EACR,cAAc;AAChB;AAEO,IAAM,yBAAyB,OAAiB;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM,EAAE,QAAQ,cAAc,gBAAgB,CAAC,cAAc,CAAC,EAAE;AAAA,EAChE,WAAW,MAAM,CAAC;AAAA,EAClB,QAAQ;AAAA,EACR,cAAc;AAChB;AACO,SAAS,gBAAgB,IAAwB;AAEtD,MAAI,OAAO,GAAG,qBAAqB,WAAY;AAC/C,KAAG,iBAAiB,sBAAsB,CAAC;AAC3C,KAAG,iBAAiB,uBAAuB,CAAC;AAC9C;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-PK4NIJEV.js";
4
4
  import {
5
5
  object
6
- } from "./chunk-7PPIKFT5.js";
6
+ } from "./chunk-4GGBND7V.js";
7
7
  import {
8
8
  validationMessage
9
9
  } from "./chunk-A5XF3ZPJ.js";
@@ -283,4 +283,4 @@ export {
283
283
  JevObservationHost,
284
284
  JevSubscription
285
285
  };
286
- //# sourceMappingURL=chunk-VYWJVAK5.js.map
286
+ //# sourceMappingURL=chunk-6EVAHJAR.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isJevModelId
3
- } from "./chunk-B54Z662X.js";
3
+ } from "./chunk-PTZ5DKAB.js";
4
4
 
5
5
  // src/jev/decision-profiles.ts
6
6
  var DECISION_MAX_BYTES = 16 * 1024 * 1024;
@@ -154,4 +154,4 @@ export {
154
154
  approvalActionOverridesValue,
155
155
  actionApprovalOverride
156
156
  };
157
- //# sourceMappingURL=chunk-GUZG4GGT.js.map
157
+ //# sourceMappingURL=chunk-7C5IEIQK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  writeJsonAtomic
3
- } from "./chunk-T2CJJASQ.js";
3
+ } from "./chunk-VTNUU2VK.js";
4
4
  import {
5
5
  stableJsonHash
6
6
  } from "./chunk-3YZUQESG.js";
@@ -131,4 +131,4 @@ export {
131
131
  FabricComponentConfiguration,
132
132
  watchComponentConfiguration
133
133
  };
134
- //# sourceMappingURL=chunk-4WCEZL6Y.js.map
134
+ //# sourceMappingURL=chunk-CUWIRPRV.js.map
@@ -6,14 +6,14 @@ import {
6
6
  checkResponse,
7
7
  jsonText,
8
8
  reportedUsage
9
- } from "./chunk-7PPIKFT5.js";
9
+ } from "./chunk-4GGBND7V.js";
10
10
  import {
11
11
  runAbortable
12
12
  } from "./chunk-7TB7NXSL.js";
13
13
  import {
14
14
  JEV_TYPESAFE_ROUTE,
15
15
  resolveJevUpstreamModel
16
- } from "./chunk-B54Z662X.js";
16
+ } from "./chunk-PTZ5DKAB.js";
17
17
 
18
18
  // src/jev/client.ts
19
19
  import { execFile } from "node:child_process";
@@ -178,4 +178,4 @@ export {
178
178
  JevCredentials,
179
179
  JevClient
180
180
  };
181
- //# sourceMappingURL=chunk-XDZMXORT.js.map
181
+ //# sourceMappingURL=chunk-EQYQICUY.js.map
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  JevClient,
3
3
  JevCredentials
4
- } from "./chunk-XDZMXORT.js";
4
+ } from "./chunk-EQYQICUY.js";
5
5
  import {
6
6
  checkObserve,
7
7
  jevObserveSchema
8
- } from "./chunk-VYWJVAK5.js";
8
+ } from "./chunk-6EVAHJAR.js";
9
9
  import {
10
10
  JevBilledError,
11
11
  checkSchema,
12
12
  checkValue,
13
13
  jsonText,
14
14
  object
15
- } from "./chunk-7PPIKFT5.js";
15
+ } from "./chunk-4GGBND7V.js";
16
16
  import {
17
17
  validationMessage
18
18
  } from "./chunk-A5XF3ZPJ.js";
@@ -23,14 +23,14 @@ import {
23
23
  ApprovalController,
24
24
  FabricAutoApprovalClassifier,
25
25
  FabricSessionApprovals
26
- } from "./chunk-UQWBZKAN.js";
26
+ } from "./chunk-QCCPR3U5.js";
27
27
  import {
28
28
  DECISION_APIS,
29
29
  DECISION_MAX_BYTES
30
- } from "./chunk-GUZG4GGT.js";
30
+ } from "./chunk-7C5IEIQK.js";
31
31
  import {
32
32
  resolveJevModelRoute
33
- } from "./chunk-B54Z662X.js";
33
+ } from "./chunk-PTZ5DKAB.js";
34
34
 
35
35
  // src/providers/jev-provider.ts
36
36
  import { Type as Type2 } from "typebox";
@@ -44,6 +44,7 @@ var canonical = (provider) => provider === "vercel-ai-gateway" ? "vercel" : prov
44
44
  var authProvider = (provider) => ["vercel", "vercel-evaluate", "vercel-decisions"].includes(provider) ? "vercel-ai-gateway" : provider;
45
45
  var envKeys = {
46
46
  typesafe: ["TYPESAFE_API_KEY"],
47
+ subq: ["SUBQ_API_KEY"],
47
48
  openrouter: ["OPENROUTER_API_KEY", "TYPESAFE_OPENROUTER_API_KEY"],
48
49
  "vercel-ai-gateway": ["AI_GATEWAY_API_KEY"],
49
50
  openai: ["OPENAI_API_KEY"],
@@ -850,4 +851,4 @@ export {
850
851
  JEV_ACTION_DESCRIPTORS,
851
852
  JevProvider
852
853
  };
853
- //# sourceMappingURL=chunk-R4RROLJ4.js.map
854
+ //# sourceMappingURL=chunk-IQXNJNDI.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/providers/jev-provider.ts", "../../src/jev/manager.ts", "../../src/jev/decisions.ts", "../../src/jev/decision-schema.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, type JevDispatch } from \"../jev/client.js\";\nimport type { DurableShellBridge } from \"../jev-fabric/bridge.js\";\nimport type { JevFabricServe } from \"../jev-fabric/serve.js\";\nimport { JevProgramManager, type JevManagerOptions } from \"../jev/manager.js\";\nimport { resolveJevModelRoute, type JevRoute } from \"../jev/routes.js\";\nimport type { JevLaunch, JevRequest } from \"../jev/types.js\";\nimport { jevObserveSchema } from \"../jev/observation.js\";\nimport { decisionRequestSchema } from \"../jev/decision-schema.js\";\nimport { JevDecisions, decisionEnvironment } from \"../jev/decisions.js\";\nimport type { DecisionRequest } from \"../jev/decision-types.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: 0 })),\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: \"decide\", description: \"Explicit lossless decision inference through native adapters. Returns status (including error), rawJson, provenance, refusals and nullable usage without legacy normalization. Requires decisions and decision-targets; no classify fallback. Endpoint overrides require an exact trusted profile/registered/preset route. Inspect budget.exhausted; calls consume credits.\", inputSchema: decisionRequestSchema as unknown as Record<string, unknown>, risk: \"network\", effect: { kind: \"emission\", resources: [\"decision:inference\"], ordering: \"ordered\" } },\n { name: \"resolveDecision\", description: \"Resolve a per-call decision target offline before credentials. No model requests or key lookup; returns target, unresolved credential env, image support, generated flag and selected profile only.\", inputSchema: Type.Object({ request: decisionRequestSchema }, { additionalProperties: false }) as unknown as Record<string, unknown>, risk: \"read\" },\n { name: \"decisionProviders\", description: \"List native decision adapter presets and capabilities offline. These are not verified live models or credential checks.\", inputSchema: Type.Object({}, { additionalProperties: false }) as unknown as Record<string, unknown>, risk: \"read\" },\n { name: \"models\", description: \"List registered Pi classifier handles intersected with native decision adapter capabilities, image support, generated/logit provenance and unverified credential presence. No inference or credential resolver execution.\", inputSchema: Type.Object({}, { additionalProperties: false }) as unknown as Record<string, unknown>, risk: \"read\" },\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 a bounded TypeScript shell orchestrator or typed-decision 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. Use granted pi.bash and tasks.wait/watch for shell orchestration; maxEvaluations:0 disables program inference. No automatic judgments, 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 = \"Shell-first TypeScript orchestration with explicit typed Jev decisions\";\n readonly manager: JevProgramManager;\n readonly client: JevClient;\n readonly route: JevRoute;\n /** One jev-fabric `serve` connection per program run: one client, one budget, like a Bend program. */\n readonly #runs = new Map<string, Promise<JevFabricServe | undefined>>();\n #transport: \"fabric\" | \"jev-fabric\" | undefined;\n readonly #jevFabric: DurableShellBridge | undefined;\n readonly #decisions: JevDecisions;\n readonly #runDecisions = new Map<string, JevDecisions>();\n readonly #decisionEnv: NodeJS.ProcessEnv;\n #closed = false;\n constructor(options: JevManagerOptions & { credentialSource?: JevCredentialSource; jevFabric?: DurableShellBridge | undefined }, client?: JevClient) {\n this.#jevFabric = options.jevFabric;\n this.#decisions = new JevDecisions(options.config.jev);\n this.#decisionEnv = decisionEnvironment(options.config.jev);\n this.manager = new JevProgramManager({ ...options, onRunStarted: id => { this.#runDecisions.set(`jev:${id}`, this.#decisions.fork()); options.onRunStarted?.(id); } });\n this.route = resolveJevModelRoute(options.config.jev.model).route;\n this.client = client ?? new JevClient(options.config.jev, undefined,\n new JevCredentials(options.config.jev.credentialCommand, process.env, options.credentialSource, this.route.envKeys), this.route);\n }\n /** UI integration: future direct calls/new programs only; never resets the session budget. */\n setDecisionProfile(profile: string | null | undefined): void { this.#decisions.setProfile(profile); }\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 if (this.#closed) throw new Error(\"Jev provider is closed\");\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 \"decide\":\n case \"resolveDecision\":\n case \"decisionProviders\":\n case \"models\": {\n const scope = context.parentToolCallId.startsWith(\"jev:\") ? context.parentToolCallId : \"$decision-session\";\n const serve = (await this.#connection(scope, true))!;\n const adapter = this.#runDecisions.get(scope) ?? this.#decisions;\n if (name === \"decide\") return adapter.decide(serve, args as unknown as DecisionRequest, context);\n if (name === \"resolveDecision\") return adapter.resolve(serve, args.request as Partial<DecisionRequest>, context);\n if (name === \"models\") return adapter.models(serve, context);\n return adapter.providers(serve, context.signal);\n }\n case \"evaluate\": {\n const dispatch = await this.#dispatchFor(context.parentToolCallId);\n this.#transport = dispatch ? \"jev-fabric\" : \"fabric\";\n return this.client.evaluate(args as unknown as JevRequest, context.signal ?? new AbortController().signal, dispatch);\n }\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, route: this.route.id, runs: this.manager.list(),\n transport: { configured: this.client.config.transport, ...(this.#transport ? { last: this.#transport } : {}) },\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 /**\n * Program decisions go through the run's own jev-fabric connection when\n * configured and available; direct calls stay in-process. `auto` falls back\n * to in-process only when no suitable binary resolves, never after a request fails.\n */\n async #dispatchFor(scope: string | undefined): Promise<JevDispatch | undefined> {\n // Direct legacy calls are deliberately unchanged and remain in-process.\n if (!scope?.startsWith(\"jev:\")) return undefined;\n const decisions = this.manager.usesDecisions(scope.slice(4));\n if (this.client.config.transport === \"fabric\" && !decisions) return undefined;\n const serve = await this.#connection(scope, decisions);\n if (!serve) return undefined;\n const provider = this.route.id === \"vercel-ai-gateway\" ? \"vercel\" : this.route.id;\n return (request, credential, signal) => serve.request(\"jev\", {\n request, provider, credential, timeoutMs: this.client.config.requestTimeoutMs,\n }, signal);\n }\n\n async #connection(scope: string, decisions: boolean): Promise<JevFabricServe | undefined> {\n const transport = this.client.config.transport;\n const bridge = this.#jevFabric;\n if (!bridge) {\n if (decisions || transport === \"jev-fabric\") throw new Error(\"Jev decisions/jev.transport jev-fabric needs jev-fabric, which runs on macOS and Linux outside managed hosts\");\n return undefined;\n }\n let pending = this.#runs.get(scope);\n if (!pending) {\n pending = (async () => {\n let binary: string;\n try {\n binary = (await bridge.resolve(decisions ? \"decisions\" : \"jev\")).path;\n } catch (error) {\n if (decisions || transport === \"jev-fabric\") throw error;\n return undefined;\n }\n const { JevFabricServe } = await import(\"../jev-fabric/serve.js\");\n const limits = scope.startsWith(\"jev:\") ? this.manager.inferenceLimits(scope.slice(4)) : undefined;\n return JevFabricServe.open(binary, {\n home: bridge.home, cwd: bridge.options.cwd, timeoutMs: 86_400_000,\n evaluations: limits?.evaluations ?? this.client.config.maxEvaluations, tokens: limits?.tokens ?? this.client.config.maxTokens,\n env: this.#decisionEnv,\n });\n })();\n this.#runs.set(scope, pending);\n }\n const serve = await pending;\n if (decisions && (!serve || serve.banner.protocol < 2 || ![\"decisions\", \"decision-targets\"].every(feature => serve.banner.features?.includes(feature)))) {\n await serve?.close();\n throw new Error(\"Lossless decisions require native decisions and decision-targets features; no legacy fallback is permitted\");\n }\n return serve;\n }\n\n async invocationEnded(parentToolCallId: string): Promise<void> {\n this.#runDecisions.get(parentToolCallId)?.close();\n this.#runDecisions.delete(parentToolCallId);\n const pending = this.#runs.get(parentToolCallId);\n if (!pending) return;\n this.#runs.delete(parentToolCallId);\n await (await pending.catch(() => undefined))?.close();\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n await this.manager.close();\n this.client.close();\n this.#decisions.close();\n for (const adapter of this.#runDecisions.values()) adapter.close();\n this.#runDecisions.clear();\n const connections = [...this.#runs.values()];\n this.#runs.clear();\n await Promise.allSettled(connections.map(async pending => (await pending)?.close()));\n }\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 { FabricAutoApprovalClassifier } from \"../core/auto-approval-classifier.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, JevBilledError } from \"./validation.js\";\nimport { checkObserve, type JevObservationHost, type JevSubscription } from \"./observation.js\";\nimport { decisionUsage } from \"./decisions.js\";\nimport { DECISION_MAX_BYTES } from \"./decision-profiles.js\";\nimport type { DecisionResult } from \"./decision-types.js\";\n\ninterface Run {\n usesDecisions: boolean;\n inferenceLimits: { evaluations: number; tokens: number };\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 /** Host-only target snapshot hook, before any guest execution. */\n onRunStarted?(id: string): void;\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 usesDecisions(id: string): boolean { return this.#runs.get(id)?.usesDecisions ?? false; }\n inferenceLimits(id: string) { return this.#runs.get(id)?.inferenceLimits; }\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.\") && ![\"jev.evaluate\", \"jev.decide\", \"jev.resolveDecision\", \"jev.decisionProviders\", \"jev.models\", \"jev.advise\"].includes(ref)))\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, new FabricAutoApprovalClassifier(() => config.jev));\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 let inferenceBlocked = false;\n let reportedTokens = 0;\n const accountInference = (response: { input: number | null; output: number | null; exhausted: boolean }) => {\n info.usage.input_tokens = response.input === null || info.usage.input_tokens === null ? null : info.usage.input_tokens + response.input;\n info.usage.output_tokens = response.output === null || info.usage.output_tokens === null ? null : info.usage.output_tokens + response.output;\n reportedTokens += (response.input ?? 0) + (response.output ?? 0);\n inferenceBlocked ||= response.exhausted || reportedTokens >= maxTokens;\n };\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, usesDecisions: requires.includes(\"jev.decide\"), inferenceLimits: { evaluations: maxEvaluations, tokens: maxTokens }, done: undefined! };\n this.#runs.set(id, run);\n this.options.onRunStarted?.(id);\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 const inference = ref === \"jev.evaluate\" || ref === \"jev.decide\";\n if (inference) {\n if (evaluating) throw new Error(\"One Jev evaluation may be in flight per program; batch independent questions in one request\");\n if (inferenceBlocked || info.evaluations >= maxEvaluations || reportedTokens >= maxTokens)\n return failBudget(\"Jev inference budget exhausted\");\n info.evaluations++;\n evaluating = true;\n }\n let accounted = false;\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.decide\" ? DECISION_MAX_BYTES : ref === \"jev.evaluate\" ? 1_048_576 : config.executor.maxNestedResultChars,\n });\n if (inference) {\n accountInference(ref === \"jev.decide\" ? decisionUsage(value as DecisionResult) : {\n input: (value as JevResponse).usage.input_tokens, output: (value as JevResponse).usage.output_tokens, exhausted: false,\n });\n accounted = true;\n // Lossless calls retain even the final over-budget/error response.\n // The next inference is blocked; deterministic inspection still works.\n if (ref === \"jev.evaluate\" && reportedTokens > maxTokens)\n return failBudget(\"Jev reported-token budget exhausted\");\n }\n return value;\n } catch (error) {\n if (inference && !accounted) {\n if (ref === \"jev.evaluate\" && error instanceof JevBilledError) {\n // A malformed answer with well-formed usage, or a transient HTTP error at\n // its reported or fixed cost, is billed and does not close inference:\n // the guest may fall back, back off and retry within its budgets.\n accountInference({ input: error.usage.input_tokens, output: error.usage.output_tokens, exhausted: false });\n accounted = true;\n if (reportedTokens > maxTokens) return failBudget(\"Jev reported-token budget exhausted\");\n } else {\n // A failed dispatch may still have billed. Do not let a guest catch\n // it and start another inference with a fabricated zero usage count.\n inferenceBlocked = true; info.usage.input_tokens = null; info.usage.output_tokens = null;\n }\n }\n throw error;\n } finally {\n if (inference) 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 // Providers release what this run acquired (interactive sessions, leases),\n // exactly as they do when a fabric_exec invocation ends.\n await registry.endInvocation(`jev:${id}`).catch(() => undefined);\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", "import type { FabricInvocationContext } from \"../protocol.js\";\nimport type { JevFabricServe } from \"../jev-fabric/serve.js\";\nimport { runAbortable } from \"../async-settlement.js\";\nimport { JevCredentials } from \"./client.js\";\nimport type { FabricJevConfig } from \"./config.js\";\nimport { DECISION_MAX_BYTES } from \"./decision-profiles.js\";\nimport type { DecisionAPI, DecisionModel, DecisionProvider, DecisionRequest, DecisionResolution, DecisionResult, DecisionTarget } from \"./decision-types.js\";\nimport { resolveJevModelRoute } from \"./routes.js\";\n\nconst canonical = (provider: string): string => provider === \"vercel-ai-gateway\" ? \"vercel\" : provider === \"jev\" ? \"typesafe\" : provider;\nconst authProvider = (provider: string): string => [\"vercel\", \"vercel-evaluate\", \"vercel-decisions\"].includes(provider) ? \"vercel-ai-gateway\" : provider;\nconst envKeys: Record<string, string[]> = {\n typesafe: [\"TYPESAFE_API_KEY\"], subq: [\"SUBQ_API_KEY\"], openrouter: [\"OPENROUTER_API_KEY\", \"TYPESAFE_OPENROUTER_API_KEY\"],\n \"vercel-ai-gateway\": [\"AI_GATEWAY_API_KEY\"], openai: [\"OPENAI_API_KEY\"],\n \"cloudflare-workers-ai\": [\"CLOUDFLARE_API_TOKEN\", \"CLOUDFLARE_API_KEY\"], opencode: [\"OPENCODE_API_KEY\"],\n \"llama.cpp\": [\"LLAMA_API_KEY\"], \"llama-system-one\": [\"LLAMA_API_KEY\"],\n anthropic: [\"ANTHROPIC_API_KEY\"], google: [\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"], custom: [\"DECISION_API_KEY\"],\n};\n/** Host-owned connections never inherit an ambient target, resolver, or key. */\nexport function decisionEnvironment(config: FabricJevConfig, source: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\n const env = { ...source };\n for (const key of [\"DECISION_PROVIDER\", \"DECISION_MODEL\", \"DECISION_ENDPOINT\", \"DECISION_PROFILE\", \"DECISION_PROFILES\", \"DECISION_PROFILES_FILE\", \"DECISION_CREDENTIAL_COMMAND\", ...Object.values(envKeys).flat()]) delete env[key];\n if (config.decisionProfiles) env.DECISION_PROFILES = JSON.stringify(config.decisionProfiles);\n if (config.decisionProfile) env.DECISION_PROFILE = config.decisionProfile;\n return env;\n}\n\ntype Registry = FabricInvocationContext[\"extensionContext\"][\"modelRegistry\"];\ntype CatalogModel = { provider: string; id: string; name: string; api: string; baseUrl: string; input: readonly string[] };\nfunction registeredTarget(model: CatalogModel, presets: readonly DecisionProvider[]): DecisionTarget | undefined {\n const api: DecisionAPI | undefined = ({ \"typesafe-system-one\": \"system-one\", \"cloudflare-workers-ai-system-one\": \"cloudflare\", \"openai-decisions\": \"openai-decisions\", \"llama-cpp-classify\": \"llama-cpp\" } as Record<string, DecisionAPI>)[model.api];\n if (!api || !model.baseUrl) return undefined;\n const provider = canonical(model.provider);\n const preset = presets.find(p => p.provider === provider);\n const nativeProvider = preset?.api === api ? provider : \"custom\";\n let endpoint = model.baseUrl.replace(/\\/+$/, \"\");\n // Pi's Cloudflare catalog carries an account placeholder. Expanding an ambient\n // non-secret account id is offline; never invoke auth merely to discover it.\n const account = process.env.CLOUDFLARE_ACCOUNT_ID;\n if (api === \"cloudflare\" && account && /^[a-fA-F0-9]{32}$/.test(account)) endpoint = endpoint.replaceAll(\"{CLOUDFLARE_ACCOUNT_ID}\", account);\n if (api === \"system-one\") endpoint += \"/systemone\";\n if (api === \"openai-decisions\") endpoint += \"/decisions\";\n if (api === \"cloudflare\") {\n endpoint += \"/run\";\n if ([\"clef\", \"clef-flash\", \"@cf/cloudflare/clef\", \"@cf/cloudflare/clef-flash\"].includes(model.id)) endpoint += `/@cf/cloudflare/${model.id.split(\"/\").at(-1)}`;\n }\n if (api === \"llama-cpp\") endpoint = endpoint.replace(/\\/v1$/, \"\");\n return { provider: nativeProvider, api, model: model.id, endpoint };\n}\nfunction catalog(registry: Registry | undefined): readonly CatalogModel[] {\n return registry?.getModelsOfType?.(\"classifier\") ?? [];\n}\nfunction freeze<T>(value: T): T {\n if (value && typeof value === \"object\") { Object.freeze(value); for (const child of Object.values(value)) freeze(child); }\n return value;\n}\nfunction snapshot<T>(value: T): T {\n const text = JSON.stringify(value, (_key, item: unknown) => {\n if ((typeof item === \"number\" && !Number.isFinite(item)) || [\"bigint\", \"function\", \"symbol\", \"undefined\"].includes(typeof item)) throw new Error(\"Decision requests must contain finite JSON values\");\n return item;\n });\n if (!text || Buffer.byteLength(text, \"utf8\") > DECISION_MAX_BYTES) throw new Error(\"Decision request exceeds 16 MiB JSON limit\");\n return freeze(JSON.parse(text) as T);\n}\n/** Unknown counters are not zero. This does not rewrite any returned evidence. */\nexport function decisionUsage(result: DecisionResult): { input: number | null; output: number | null; exhausted: boolean } {\n const count = (v: unknown): number | null => typeof v === \"number\" && Number.isSafeInteger(v) && v >= 0 ? v : null;\n const input = count(result?.usage?.input_tokens), output = count(result?.usage?.output_tokens);\n return { input, output, exhausted: input === null || output === null || result?.budget?.exhausted === true };\n}\n\n/** Auth and trust adapter only. All decision parsing/provenance stays in the native engine. */\nexport class JevDecisions {\n readonly #config: FabricJevConfig;\n readonly #commands = new Map<string, JevCredentials>();\n readonly #exhausted = new WeakSet<JevFabricServe>();\n constructor(config: FabricJevConfig) { this.#config = structuredClone(config); }\n /** Freeze the selected default for a newly launched managed program. */\n fork(): JevDecisions { return new JevDecisions(this.#config); }\n /** Trusted UI-only selector update. Existing request snapshots and budgets survive. */\n setProfile(profile: string | null | undefined): void {\n if (profile !== undefined && profile !== null && (!/^[A-Za-z0-9_.-]{1,128}$/.test(profile) || !this.#config.decisionProfiles || !Object.hasOwn(this.#config.decisionProfiles.profiles, profile)))\n throw new Error(\"jev.decisionProfile must name a known decision profile\");\n if (profile === undefined) delete this.#config.decisionProfile;\n else this.#config.decisionProfile = profile;\n }\n async providers(serve: JevFabricServe, signal?: AbortSignal): Promise<DecisionProvider[]> {\n return serve.request(\"decisionProviders\", {}, signal);\n }\n #profile(request: Partial<DecisionRequest>): string | undefined {\n const profile = request.profile ?? (request.provider === undefined ? this.#config.decisionProfile ?? this.#config.decisionProfiles?.defaultProfile : undefined);\n if (profile !== undefined) {\n const profiles = this.#config.decisionProfiles?.profiles;\n const target = profiles && Object.hasOwn(profiles, profile) ? profiles[profile] : undefined;\n if (!target) throw new Error(\"Unknown decision profile\");\n if (request.provider !== undefined && canonical(request.provider) !== canonical(target.provider)) throw new Error(\"Decision profile and provider disagree\");\n }\n return profile;\n }\n async #resolve(serve: JevFabricServe, original: Partial<DecisionRequest>, context: FabricInvocationContext): Promise<{ resolution: DecisionResolution; request: Partial<DecisionRequest>; auth: string }> {\n const request = snapshot(original);\n const profile = this.#profile(request);\n const trustedProfile = profile ? this.#config.decisionProfiles!.profiles[profile] : undefined;\n // Whole-field overlay, matching the standalone contract. In particular,\n // providerOptions is replaced, never deep-merged with a profile's options.\n const effective: Partial<DecisionRequest> = { ...trustedProfile, ...request };\n delete effective.profile;\n const selectedProvider = canonical(effective.provider ?? \"typesafe\");\n const selectedModel = effective.model;\n const presets = await this.providers(serve, context.signal);\n const models = catalog(context.extensionContext.modelRegistry);\n const registered = models.find(m => canonical(m.provider) === selectedProvider && m.id === selectedModel);\n const target = registered ? registeredTarget(registered, presets) : undefined;\n // A profile's explicit endpoint wins over registry metadata. Guest endpoints never\n // acquire authority merely by sharing an origin with either route.\n const baseline: Partial<DecisionRequest> = { ...effective, provider: selectedProvider };\n delete baseline.endpoint;\n if (trustedProfile?.endpoint) {\n baseline.endpoint = trustedProfile.endpoint;\n // The trusted profile author selected the credential owner. A Pi-only\n // provider is projected to a native adapter, never used as an auth alias.\n if (!presets.some(p => p.provider === selectedProvider)) {\n baseline.provider = \"custom\";\n if (baseline.api === undefined && target?.api) baseline.api = target.api;\n }\n } else if (target) {\n if (effective.api !== undefined && effective.api !== target.api) throw new Error(\"Decision API differs from the registered classifier target\");\n Object.assign(baseline, target);\n }\n if (selectedProvider === \"custom\" && !trustedProfile && !target) throw new Error(\"Custom decision targets require a trusted profile or registered classifier\");\n // Native resolution is OFFLINE and precedes every credential lookup.\n const raw = await serve.request<DecisionResolution>(\"resolveDecision\", { request: baseline }, context.signal);\n const resolvedEndpoint = raw.target.endpoint;\n if (request.endpoint !== undefined && request.endpoint !== resolvedEndpoint) throw new Error(\"Decision endpoint must exactly match a trusted profile, registered classifier route, or preset default\");\n // Project only the fixed resolution contract: never echo state/questions/images,\n // auth results, or arbitrary native fields through this read-only operation.\n const cleanTarget: DecisionResolution[\"target\"] = {\n provider: raw.target.provider, api: raw.target.api, model: raw.target.model, endpoint: raw.target.endpoint,\n allowLocal: raw.target.allowLocal, allowGenerated: raw.target.allowGenerated,\n ...(raw.target.providerOptions === undefined ? {} : { providerOptions: raw.target.providerOptions }),\n ...(raw.target.temperature === undefined ? {} : { temperature: raw.target.temperature }),\n };\n const resolution = freeze({ target: cleanTarget, credential: { env: raw.credential.env, resolved: false as const }, imageSupport: raw.imageSupport, generated: raw.generated, ...(profile ? { profile } : {}) });\n const prepared = freeze({ ...effective, ...resolution.target });\n // Never infer an auth provider from a URL/model match. A profile declaring\n // provider:custom uses only custom auth, even if its model resembles another\n // registered vendor. To use Pi login, name that vendor in the trusted profile.\n return { resolution, request: prepared, auth: authProvider(selectedProvider) };\n }\n async resolve(serve: JevFabricServe, request: Partial<DecisionRequest>, context: FabricInvocationContext): Promise<DecisionResolution> {\n return (await this.#resolve(serve, request, context)).resolution;\n }\n async models(serve: JevFabricServe, context: FabricInvocationContext): Promise<DecisionModel[]> {\n const presets = await this.providers(serve, context.signal);\n const registry = context.extensionContext.modelRegistry;\n return Promise.all(catalog(registry).map(async model => {\n const target = registeredTarget(model, presets);\n let capabilities: DecisionResolution | undefined;\n if (target) {\n try {\n // Use the engine's real offline preflight, including endpoint-specific\n // image exclusions and local/generated opt-ins. No model requests or auth.\n capabilities = await serve.request<DecisionResolution>(\"resolveDecision\", { request: {\n ...target, ...(target.api === \"llama-cpp\" || target.api === \"llama-system-one\" ? { allowLocal: true } : {}),\n state: {}, questions: { capability: { type: \"boolean\", instructions: \"Offline capability validation only\" } },\n } }, context.signal);\n } catch (error) { if (context.signal?.aborted || serve.closed) throw error; }\n }\n const support = capabilities?.imageSupport ?? \"unsupported\";\n const provider = authProvider(canonical(model.provider));\n // Presence only: don't use getAvailableOfType, getProviderAuth, or key resolvers.\n const configured = (provider === \"typesafe\" && registry?.getProviderAuthStatus?.(\"jev\")?.configured) || registry?.getProviderAuthStatus?.(provider)?.configured || (envKeys[provider] ?? []).some(key => !!process.env[key]?.trim()) || (provider === authProvider(canonical(resolveJevModelRoute(this.#config.model).route.id)) && this.#config.credentialCommand.length > 0);\n return {\n model: { provider: model.provider, id: model.id }, name: model.name, api: model.api,\n ...(target ? { target: { ...target, provider: model.provider } } : {}), supported: !!capabilities,\n imageSupport: !model.input.includes(\"image\") || support === \"unsupported\" || canonical(model.provider) === \"openrouter\" ? \"unsupported\" : support,\n generated: capabilities?.generated ?? false, logits: target?.api === \"llama-cpp\",\n credentials: { configured: !!configured, verified: false },\n };\n }));\n }\n async #credential(provider: string, registry: Registry | undefined, signal: AbortSignal, local: boolean): Promise<string> {\n signal.throwIfAborted();\n try {\n // Jev's auth-only TypeSafe login is an alias, never a cross-provider fallback.\n const ids = provider === \"typesafe\" ? [\"jev\", \"typesafe\"] : [provider];\n for (const id of ids) {\n const key = await runAbortable(signal, () => registry?.getApiKeyForProvider?.(id));\n if (key?.trim()) return key.trim();\n }\n } catch { throw new Error(\"Decision Pi credential resolution failed\"); }\n const keys = envKeys[provider] ?? [];\n for (const key of keys) if (process.env[key]?.trim()) return process.env[key]!.trim();\n // The legacy command is explicitly bound to its configured provider, not a\n // wildcard that can accidentally send TypeSafe credentials to another vendor.\n const legacyProvider = authProvider(canonical(resolveJevModelRoute(this.#config.model).route.id));\n if (provider === legacyProvider && this.#config.credentialCommand.length) {\n let credentials = this.#commands.get(provider);\n if (!credentials) { credentials = new JevCredentials(this.#config.credentialCommand, {}, undefined, keys); this.#commands.set(provider, credentials); }\n return credentials.resolve(signal);\n }\n if (local) return \"\";\n throw new Error(\"Decision credentials unavailable for the selected provider\");\n }\n async decide(serve: JevFabricServe, request: DecisionRequest, context: FabricInvocationContext): Promise<DecisionResult> {\n if (this.#exhausted.has(serve)) throw new Error(\"Decision inference budget exhausted or prior usage unknown\");\n const signal = AbortSignal.any([...(context.signal ? [context.signal] : []), AbortSignal.timeout(this.#config.requestTimeoutMs)]);\n const selected = await this.#resolve(serve, request, { ...context, signal });\n const url = new URL(selected.resolution.target.endpoint);\n const local = selected.resolution.target.allowLocal && [\"127.0.0.1\", \"[::1]\"].includes(url.hostname) && ![\"anthropic\", \"google\"].includes(selected.resolution.target.api);\n const credential = await this.#credential(selected.auth, context.extensionContext.modelRegistry, signal, local);\n signal.throwIfAborted();\n if (this.#exhausted.has(serve)) throw new Error(\"Decision inference budget exhausted or prior usage unknown\");\n try {\n const result = await serve.request<DecisionResult>(\"decide\", { request: selected.request, timeoutMs: this.#config.requestTimeoutMs, credential }, signal);\n if (decisionUsage(result).exhausted) this.#exhausted.add(serve);\n return result; // No legacy checkResponse, projection, truncation or invented counters.\n } catch (error) {\n this.#exhausted.add(serve);\n if (signal.aborted) await serve.close();\n throw error;\n }\n }\n close(): void { for (const credentials of this.#commands.values()) credentials.clear(); this.#commands.clear(); }\n}\n", "import { Type } from \"typebox\";\nimport { DECISION_APIS } from \"./decision-profiles.js\";\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.Union([\"boolean\", \"bool\", \"noul\", \"predicate\"].map(v => Type.Literal(v))), 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 decisionRequestSchema = Type.Object({\n state: description,\n questions: Type.Record(Type.String({ minLength: 1, maxLength: 128 }), question, { minProperties: 1, maxProperties: 128 }),\n profile: Type.Optional(Type.String({ pattern: \"^[A-Za-z0-9_.-]{1,128}$\" })),\n provider: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n api: Type.Optional(Type.Union(DECISION_APIS.map(v => Type.Literal(v)))),\n model: Type.Optional(Type.String({ minLength: 1 })),\n endpoint: Type.Optional(Type.String({ minLength: 1 })),\n allowLocal: Type.Optional(Type.Boolean()),\n allowGenerated: Type.Optional(Type.Boolean()),\n providerOptions: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n temperature: Type.Optional(Type.Number()),\n images: Type.Optional(Type.Array(Type.Object({ type: Type.Optional(Type.Literal(\"image\")), data: Type.String({ minLength: 1 }), mimeType: Type.Union([\"image/png\", \"image/jpeg\", \"image/webp\", \"image/gif\"].map(v => Type.Literal(v))) }, { additionalProperties: false }), { maxItems: 128 })),\n}, { additionalProperties: false });\n"],
5
+ "mappings": "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",
6
+ "names": ["Type", "description", "Type", "question"]
7
+ }
@@ -129,7 +129,7 @@ import {
129
129
  loadFabricConfigForScope,
130
130
  resolveForegroundTools,
131
131
  saveFabricConfig
132
- } from "./chunk-T2CJJASQ.js";
132
+ } from "./chunk-VTNUU2VK.js";
133
133
  import {
134
134
  defaultCodePreviewSettings
135
135
  } from "./chunk-OKOHRXGF.js";
@@ -155,12 +155,12 @@ import {
155
155
  } from "./chunk-V73NIH6B.js";
156
156
  import {
157
157
  registerJevAuth
158
- } from "./chunk-J2HUD36Z.js";
158
+ } from "./chunk-5X35KXBV.js";
159
159
  import {
160
160
  ApprovalController,
161
161
  FabricAutoApprovalClassifier,
162
162
  FabricSessionApprovals
163
- } from "./chunk-UQWBZKAN.js";
163
+ } from "./chunk-QCCPR3U5.js";
164
164
  import {
165
165
  getActiveRepairCompiler,
166
166
  setActiveCompiledSurface
@@ -6623,4 +6623,4 @@ export {
6623
6623
  FABRIC_MANAGED_HOST_VERSION,
6624
6624
  createFabricExtension
6625
6625
  };
6626
- //# sourceMappingURL=chunk-NJK3TKNR.js.map
6626
+ //# sourceMappingURL=chunk-M3MBDI2X.js.map
@@ -2,10 +2,12 @@
2
2
  var JEV_TYPESAFE_MODEL_PREFIX = "pi-fabric/typesafe/";
3
3
  var JEV_OPENROUTER_MODEL_PREFIX = "pi-fabric/openrouter/";
4
4
  var JEV_VERCEL_MODEL_PREFIX = "pi-fabric/vercel-ai-gateway/";
5
+ var JEV_SUBQ_MODEL_PREFIX = "pi-fabric/subq/";
5
6
  var ROUTE_PREFIXES = [
6
7
  ["typesafe", JEV_TYPESAFE_MODEL_PREFIX],
7
8
  ["openrouter", JEV_OPENROUTER_MODEL_PREFIX],
8
- ["vercel-ai-gateway", JEV_VERCEL_MODEL_PREFIX]
9
+ ["vercel-ai-gateway", JEV_VERCEL_MODEL_PREFIX],
10
+ ["subq", JEV_SUBQ_MODEL_PREFIX]
9
11
  ];
10
12
  var normalizeJevApprovalModel = (key) => key?.startsWith("jev/") ? `${JEV_TYPESAFE_MODEL_PREFIX}${key.slice(4)}` : key;
11
13
  var parseJevApprovalModel = (key) => {
@@ -54,31 +56,46 @@ var JEV_VERCEL_ROUTE = {
54
56
  modelPrefix: JEV_VERCEL_MODEL_PREFIX,
55
57
  aliases: Object.keys(JEV_VERCEL_MODELS)
56
58
  };
59
+ var JEV_SUBQ_MODELS = ["subq-snap-preview"];
60
+ var JEV_SUBQ_ROUTE = {
61
+ id: "subq",
62
+ label: "SubQ",
63
+ endpoint: "https://api.subq.ai/v1/systemone",
64
+ providerId: "subq",
65
+ envKeys: ["SUBQ_API_KEY"],
66
+ modelPrefix: JEV_SUBQ_MODEL_PREFIX,
67
+ aliases: JEV_SUBQ_MODELS
68
+ };
57
69
  var JEV_ROUTES = {
58
70
  "typesafe": JEV_TYPESAFE_ROUTE,
59
71
  "openrouter": JEV_OPENROUTER_ROUTE,
60
- "vercel-ai-gateway": JEV_VERCEL_ROUTE
72
+ "vercel-ai-gateway": JEV_VERCEL_ROUTE,
73
+ "subq": JEV_SUBQ_ROUTE
61
74
  };
62
- var JEV_ROUTE_ORDER = [JEV_TYPESAFE_ROUTE, JEV_OPENROUTER_ROUTE, JEV_VERCEL_ROUTE];
75
+ var JEV_ROUTE_ORDER = [JEV_TYPESAFE_ROUTE, JEV_OPENROUTER_ROUTE, JEV_VERCEL_ROUTE, JEV_SUBQ_ROUTE];
63
76
  var JEV_PROVIDER_PREFIX = "pi-fabric/";
64
77
  var jevClassifierKey = (route, model) => `${route.modelPrefix}${model}`;
65
78
  var TYPESAFE_MODEL = /^[a-zA-Z0-9._-]{1,128}$/;
66
79
  var isJevOpenRouterModelId = (model) => /^~?typesafe\/[a-zA-Z0-9._-]{1,120}$/.test(model);
67
80
  var isJevVercelModelId = (model) => /^typesafe-ai\/[a-zA-Z0-9._-]{1,120}$/.test(model);
81
+ var isJevSubqModelId = (model) => /^subq-[a-zA-Z0-9._-]{1,120}$/.test(model);
68
82
  var isJevModelId = (model) => TYPESAFE_MODEL.test(model) || isJevOpenRouterModelId(model) || isJevVercelModelId(model);
69
83
  var resolveJevModelRoute = (model) => {
70
84
  if (isJevOpenRouterModelId(model)) return { route: JEV_OPENROUTER_ROUTE, model };
71
85
  if (isJevVercelModelId(model)) return { route: JEV_VERCEL_ROUTE, model };
86
+ if (isJevSubqModelId(model)) return { route: JEV_SUBQ_ROUTE, model };
72
87
  return { route: JEV_TYPESAFE_ROUTE, model };
73
88
  };
74
89
  var resolveJevUpstreamModel = (route, model) => {
75
90
  if (route.id === "openrouter") return JEV_OPENROUTER_MODELS[model] ?? (isJevOpenRouterModelId(model) ? model : void 0);
76
91
  if (route.id === "vercel-ai-gateway") return JEV_VERCEL_MODELS[model] ?? (isJevVercelModelId(model) ? model : void 0);
92
+ if (route.id === "subq") return isJevSubqModelId(model) ? model : void 0;
77
93
  return TYPESAFE_MODEL.test(model) ? model : void 0;
78
94
  };
79
95
  var unavailableModelMessage = (route, model) => {
80
96
  if (route.id === "openrouter") return `OpenRouter serves ${Object.keys(JEV_OPENROUTER_MODELS).join(", ")}; "${model}" is not available`;
81
97
  if (route.id === "vercel-ai-gateway") return `Vercel AI Gateway serves ${Object.keys(JEV_VERCEL_MODELS).join(", ")}; "${model}" is not available`;
98
+ if (route.id === "subq") return `SubQ serves ${JEV_SUBQ_MODELS.join(", ")}; "${model}" is not a SubQ model ID`;
82
99
  return `Invalid Jev auto-approval model; use ${JEV_TYPESAFE_MODEL_PREFIX}<model-id>`;
83
100
  };
84
101
  var resolveJevClassifierTarget = (key) => {
@@ -86,7 +103,7 @@ var resolveJevClassifierTarget = (key) => {
86
103
  if (!parsed) {
87
104
  return {
88
105
  ok: false,
89
- message: `Invalid Jev auto-approval model; use ${JEV_TYPESAFE_MODEL_PREFIX}<model-id>, ${JEV_OPENROUTER_MODEL_PREFIX}<model-id>, or ${JEV_VERCEL_MODEL_PREFIX}<model-id>`
106
+ message: `Invalid Jev auto-approval model; use ${JEV_TYPESAFE_MODEL_PREFIX}<model-id>, ${JEV_OPENROUTER_MODEL_PREFIX}<model-id>, ${JEV_VERCEL_MODEL_PREFIX}<model-id>, or ${JEV_SUBQ_MODEL_PREFIX}<model-id>`
90
107
  };
91
108
  }
92
109
  const route = JEV_ROUTES[parsed.route];
@@ -115,13 +132,16 @@ export {
115
132
  JEV_OPENROUTER_ROUTE,
116
133
  JEV_VERCEL_MODELS,
117
134
  JEV_VERCEL_ROUTE,
135
+ JEV_SUBQ_MODELS,
136
+ JEV_SUBQ_ROUTE,
118
137
  jevClassifierKey,
119
138
  isJevOpenRouterModelId,
120
139
  isJevVercelModelId,
140
+ isJevSubqModelId,
121
141
  isJevModelId,
122
142
  resolveJevModelRoute,
123
143
  resolveJevUpstreamModel,
124
144
  resolveJevClassifierTarget,
125
145
  jevClassifierModels
126
146
  };
127
- //# sourceMappingURL=chunk-B54Z662X.js.map
147
+ //# sourceMappingURL=chunk-PTZ5DKAB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jev/model-key.ts", "../../src/jev/routes.ts"],
4
+ "sourcesContent": ["/** Fabric classifier keys, not Pi chat-provider or upstream TypeSafe/OpenRouter/Vercel/SubQ model IDs. */\nexport const JEV_TYPESAFE_MODEL_PREFIX = \"pi-fabric/typesafe/\";\nexport const JEV_OPENROUTER_MODEL_PREFIX = \"pi-fabric/openrouter/\";\nexport const JEV_VERCEL_MODEL_PREFIX = \"pi-fabric/vercel-ai-gateway/\";\nexport const JEV_SUBQ_MODEL_PREFIX = \"pi-fabric/subq/\";\n\nexport type JevClassifierRoute = \"typesafe\" | \"openrouter\" | \"vercel-ai-gateway\" | \"subq\";\n\nconst ROUTE_PREFIXES: ReadonlyArray<readonly [route: JevClassifierRoute, prefix: string]> = [\n [\"typesafe\", JEV_TYPESAFE_MODEL_PREFIX],\n [\"openrouter\", JEV_OPENROUTER_MODEL_PREFIX],\n [\"vercel-ai-gateway\", JEV_VERCEL_MODEL_PREFIX],\n [\"subq\", JEV_SUBQ_MODEL_PREFIX],\n];\n\n/** Keep saved pre-namespace overrides usable without moving /login jev credentials. */\nexport const normalizeJevApprovalModel = (key: string | undefined): string | undefined =>\n key?.startsWith(\"jev/\") ? `${JEV_TYPESAFE_MODEL_PREFIX}${key.slice(4)}` : key;\n\nexport const parseJevApprovalModel = (\n key: string | undefined,\n): { route: JevClassifierRoute; model: string } | undefined => {\n const normalized = normalizeJevApprovalModel(key);\n if (!normalized) return undefined;\n for (const [route, prefix] of ROUTE_PREFIXES) {\n if (normalized.startsWith(prefix)) return { route, model: normalized.slice(prefix.length) };\n }\n return undefined;\n};\n\nexport const isJevApprovalModel = (key: string | undefined): boolean =>\n parseJevApprovalModel(key) !== undefined;\n", "import {\n JEV_OPENROUTER_MODEL_PREFIX,\n JEV_SUBQ_MODEL_PREFIX,\n JEV_TYPESAFE_MODEL_PREFIX,\n JEV_VERCEL_MODEL_PREFIX,\n parseJevApprovalModel,\n type JevClassifierRoute,\n} from \"./model-key.js\";\n\nexport interface JevRoute {\n readonly id: JevClassifierRoute;\n /** Human label used in host-visible errors and status. */\n readonly label: string;\n /** Fixed HTTPS endpoint receiving the typed System One request. */\n readonly endpoint: string;\n /** Pi auth provider whose auth.json login and environment keys authenticate this route. */\n readonly providerId: string;\n /** Environment fallbacks, checked when Pi provider auth is not configured. */\n readonly envKeys: readonly string[];\n /** Classifier key prefix stored in `approvals.model` for this route. */\n readonly modelPrefix: string;\n /** Aliases offered in host pickers and accepted as upstream overrides. */\n readonly aliases: readonly string[];\n}\n\n/** Direct TypeSafe aliases. All of them resolve to `jev-1.13.0` today. */\nexport const JEV_TYPESAFE_MODELS: readonly string[] = [\"jev-latest\", \"jev-1.13\", \"jev-1.13.0\", \"jev-preview\"];\n\nexport const JEV_TYPESAFE_ROUTE: JevRoute = {\n id: \"typesafe\",\n label: \"TypeSafe\",\n endpoint: \"https://api.typesafe.ai/v1/systemone\",\n providerId: \"jev\",\n envKeys: [\"TYPESAFE_API_KEY\"],\n modelPrefix: JEV_TYPESAFE_MODEL_PREFIX,\n aliases: JEV_TYPESAFE_MODELS,\n};\n\n/** OpenRouter decisions model IDs by alias. OpenRouter has no `jev-preview` alias. */\nexport const JEV_OPENROUTER_MODELS: Readonly<Record<string, string>> = {\n \"jev-latest\": \"~typesafe/jev-latest\",\n \"jev-1.13\": \"typesafe/jev-1.13\",\n};\n\n/**\n * OpenRouter serves decisions models on its Decisions API, not chat completions.\n * The user's existing openrouter auth (`/login openrouter`, `OPENROUTER_API_KEY`)\n * is the primary credential; `TYPESAFE_OPENROUTER_API_KEY` is an explicit fallback.\n */\nexport const JEV_OPENROUTER_ROUTE: JevRoute = {\n id: \"openrouter\",\n label: \"OpenRouter\",\n endpoint: \"https://openrouter.ai/api/alpha/decisions\",\n providerId: \"openrouter\",\n envKeys: [\"OPENROUTER_API_KEY\", \"TYPESAFE_OPENROUTER_API_KEY\"],\n modelPrefix: JEV_OPENROUTER_MODEL_PREFIX,\n aliases: Object.keys(JEV_OPENROUTER_MODELS),\n};\n\n/** Vercel AI Gateway evaluation model IDs by alias. The gateway serves one Jev build today. */\nexport const JEV_VERCEL_MODELS: Readonly<Record<string, string>> = {\n \"jev-latest\": \"typesafe-ai/jev\",\n};\n\n/**\n * Vercel AI Gateway exposes a TypeSafe-compatible endpoint, so request and\n * response shapes stay TypeSafe's own and only the base URL and credential\n * change. The existing Pi `vercel-ai-gateway` login authenticates it.\n */\nexport const JEV_VERCEL_ROUTE: JevRoute = {\n id: \"vercel-ai-gateway\",\n label: \"Vercel AI Gateway\",\n endpoint: \"https://ai-gateway.vercel.sh/typesafe/v1/systemone\",\n providerId: \"vercel-ai-gateway\",\n envKeys: [\"AI_GATEWAY_API_KEY\"],\n modelPrefix: JEV_VERCEL_MODEL_PREFIX,\n aliases: Object.keys(JEV_VERCEL_MODELS),\n};\n\n/** SubQ's System One models. Their IDs are their own: SubQ has no Jev aliases. */\nexport const JEV_SUBQ_MODELS: readonly string[] = [\"subq-snap-preview\"];\n\n/**\n * SubQ Snap is a System One model served by SubQ itself, with TypeSafe's request\n * and response shapes at its own base URL. `/login subq` or `SUBQ_API_KEY`\n * authenticates it.\n */\nexport const JEV_SUBQ_ROUTE: JevRoute = {\n id: \"subq\",\n label: \"SubQ\",\n endpoint: \"https://api.subq.ai/v1/systemone\",\n providerId: \"subq\",\n envKeys: [\"SUBQ_API_KEY\"],\n modelPrefix: JEV_SUBQ_MODEL_PREFIX,\n aliases: JEV_SUBQ_MODELS,\n};\n\nconst JEV_ROUTES: Readonly<Record<JevClassifierRoute, JevRoute>> = {\n \"typesafe\": JEV_TYPESAFE_ROUTE,\n \"openrouter\": JEV_OPENROUTER_ROUTE,\n \"vercel-ai-gateway\": JEV_VERCEL_ROUTE,\n \"subq\": JEV_SUBQ_ROUTE,\n};\n\n/** Picker order: direct TypeSafe aliases, then OpenRouter, Vercel AI Gateway, and SubQ. */\nconst JEV_ROUTE_ORDER: readonly JevRoute[] = [JEV_TYPESAFE_ROUTE, JEV_OPENROUTER_ROUTE, JEV_VERCEL_ROUTE, JEV_SUBQ_ROUTE];\n\nconst JEV_PROVIDER_PREFIX = \"pi-fabric/\";\n\n/** Classifier key stored in `approvals.model` for one route and upstream model. */\nexport const jevClassifierKey = (route: JevRoute, model: string): string => `${route.modelPrefix}${model}`;\n\nconst TYPESAFE_MODEL = /^[a-zA-Z0-9._-]{1,128}$/;\n/** OpenRouter decisions IDs are `~typesafe/<family>` or `typesafe/<build>`. */\nexport const isJevOpenRouterModelId = (model: string): boolean =>\n /^~?typesafe\\/[a-zA-Z0-9._-]{1,120}$/.test(model);\n/** Vercel AI Gateway model IDs are `typesafe-ai/<family>`. */\nexport const isJevVercelModelId = (model: string): boolean =>\n /^typesafe-ai\\/[a-zA-Z0-9._-]{1,120}$/.test(model);\n/** SubQ model IDs are `subq-<name>`. They also fit a bare alias, so they are checked first. */\nexport const isJevSubqModelId = (model: string): boolean =>\n /^subq-[a-zA-Z0-9._-]{1,120}$/.test(model);\n/** A bare TypeSafe alias or a routable OpenRouter/Vercel AI Gateway/SubQ model ID. */\nexport const isJevModelId = (model: string): boolean =>\n TYPESAFE_MODEL.test(model) || isJevOpenRouterModelId(model) || isJevVercelModelId(model);\n\nexport interface JevRouteTarget {\n readonly route: JevRoute;\n readonly model: string;\n}\n\n/** Route and upstream model ID for a raw `jev.model` value. */\nexport const resolveJevModelRoute = (model: string): JevRouteTarget => {\n if (isJevOpenRouterModelId(model)) return { route: JEV_OPENROUTER_ROUTE, model };\n if (isJevVercelModelId(model)) return { route: JEV_VERCEL_ROUTE, model };\n if (isJevSubqModelId(model)) return { route: JEV_SUBQ_ROUTE, model };\n return { route: JEV_TYPESAFE_ROUTE, model };\n};\n\n/** Upstream model ID for an alias or override on an already-selected route. */\nexport const resolveJevUpstreamModel = (route: JevRoute, model: string): string | undefined => {\n if (route.id === \"openrouter\") return JEV_OPENROUTER_MODELS[model] ?? (isJevOpenRouterModelId(model) ? model : undefined);\n if (route.id === \"vercel-ai-gateway\") return JEV_VERCEL_MODELS[model] ?? (isJevVercelModelId(model) ? model : undefined);\n if (route.id === \"subq\") return isJevSubqModelId(model) ? model : undefined;\n return TYPESAFE_MODEL.test(model) ? model : undefined;\n};\n\nexport type JevClassifierTarget =\n | { readonly ok: true; readonly route: JevRoute; readonly model: string }\n | { readonly ok: false; readonly message: string };\n\nconst unavailableModelMessage = (route: JevRoute, model: string): string => {\n if (route.id === \"openrouter\") return `OpenRouter serves ${Object.keys(JEV_OPENROUTER_MODELS).join(\", \")}; \"${model}\" is not available`;\n if (route.id === \"vercel-ai-gateway\") return `Vercel AI Gateway serves ${Object.keys(JEV_VERCEL_MODELS).join(\", \")}; \"${model}\" is not available`;\n if (route.id === \"subq\") return `SubQ serves ${JEV_SUBQ_MODELS.join(\", \")}; \"${model}\" is not a SubQ model ID`;\n return `Invalid Jev auto-approval model; use ${JEV_TYPESAFE_MODEL_PREFIX}<model-id>`;\n};\n\n/** Route and upstream model ID for a stored `pi-fabric/<route>/<model>` approvals key. */\nexport const resolveJevClassifierTarget = (key: string): JevClassifierTarget => {\n const parsed = parseJevApprovalModel(key);\n if (!parsed) {\n return {\n ok: false,\n message: `Invalid Jev auto-approval model; use ${JEV_TYPESAFE_MODEL_PREFIX}<model-id>, ${JEV_OPENROUTER_MODEL_PREFIX}<model-id>, ${JEV_VERCEL_MODEL_PREFIX}<model-id>, or ${JEV_SUBQ_MODEL_PREFIX}<model-id>`,\n };\n }\n const route = JEV_ROUTES[parsed.route];\n const model = resolveJevUpstreamModel(route, parsed.model);\n return model ? { ok: true, route, model } : { ok: false, message: unavailableModelMessage(route, parsed.model) };\n};\n\nexport interface JevClassifierPickerModel {\n readonly provider: \"pi-fabric\";\n readonly id: string;\n readonly name: string;\n}\n\n/** Approvals picker entries: every supported classifier key plus the configured model. */\nexport const jevClassifierModels = (configuredModel?: string): JevClassifierPickerModel[] => {\n const configured = configuredModel ? resolveJevModelRoute(configuredModel) : undefined;\n return JEV_ROUTE_ORDER.flatMap((route) => {\n const models = new Set(route.aliases);\n if (configured?.route.id === route.id && configuredModel) models.add(configuredModel);\n return [...models].map((model): JevClassifierPickerModel => ({\n provider: \"pi-fabric\", id: jevClassifierKey(route, model).slice(JEV_PROVIDER_PREFIX.length),\n name: `Jev (${route.label} safety classifier \u00B7 ${model})`,\n }));\n });\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -4,12 +4,12 @@ import {
4
4
  import {
5
5
  DEFAULT_JEV_CONFIG,
6
6
  actionApprovalOverride
7
- } from "./chunk-GUZG4GGT.js";
7
+ } from "./chunk-7C5IEIQK.js";
8
8
  import {
9
9
  isJevApprovalModel,
10
10
  jevClassifierKey,
11
11
  resolveJevClassifierTarget
12
- } from "./chunk-B54Z662X.js";
12
+ } from "./chunk-PTZ5DKAB.js";
13
13
  import {
14
14
  FabricTraceSafeError
15
15
  } from "./chunk-HCNHKJDA.js";
@@ -573,4 +573,4 @@ export {
573
573
  FabricSessionApprovals,
574
574
  ApprovalController
575
575
  };
576
- //# sourceMappingURL=chunk-UQWBZKAN.js.map
576
+ //# sourceMappingURL=chunk-QCCPR3U5.js.map
@@ -47,7 +47,7 @@ import {
47
47
  DEFAULT_FABRIC_CONFIG,
48
48
  MAX_AGENT_TIMEOUT_MS,
49
49
  MIN_AGENT_TIMEOUT_MS
50
- } from "./chunk-T2CJJASQ.js";
50
+ } from "./chunk-VTNUU2VK.js";
51
51
  import {
52
52
  readJsonlPage
53
53
  } from "./chunk-CGPK5WHX.js";
@@ -7844,4 +7844,4 @@ export {
7844
7844
  agentParticipantRecords,
7845
7845
  actorParticipantRecord
7846
7846
  };
7847
- //# sourceMappingURL=chunk-NWST4TDR.js.map
7847
+ //# sourceMappingURL=chunk-UPPQ3QOH.js.map
@@ -20,10 +20,10 @@ import {
20
20
  DEFAULT_JEV_CONFIG,
21
21
  approvalActionOverridesValue,
22
22
  normalizeJevConfig
23
- } from "./chunk-GUZG4GGT.js";
23
+ } from "./chunk-7C5IEIQK.js";
24
24
  import {
25
25
  normalizeJevApprovalModel
26
- } from "./chunk-B54Z662X.js";
26
+ } from "./chunk-PTZ5DKAB.js";
27
27
  import {
28
28
  PI_CORE_TOOL_NAME_SET
29
29
  } from "./chunk-YU62DDKK.js";
@@ -1366,4 +1366,4 @@ export {
1366
1366
  loadFabricConfig,
1367
1367
  saveFabricConfig
1368
1368
  };
1369
- //# sourceMappingURL=chunk-T2CJJASQ.js.map
1369
+ //# sourceMappingURL=chunk-VTNUU2VK.js.map