veryfront 0.1.282 → 0.1.284

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 (114) hide show
  1. package/esm/deno.d.ts +0 -8
  2. package/esm/deno.js +8 -11
  3. package/esm/src/agent/agent-service.d.ts +28 -6
  4. package/esm/src/agent/agent-service.d.ts.map +1 -1
  5. package/esm/src/agent/agent-service.js +23 -1
  6. package/esm/src/agent/index.d.ts +1 -1
  7. package/esm/src/agent/index.d.ts.map +1 -1
  8. package/esm/src/agent/runtime/index.d.ts.map +1 -1
  9. package/esm/src/agent/runtime/index.js +23 -0
  10. package/esm/src/agent/runtime/tool-helpers.d.ts +1 -0
  11. package/esm/src/agent/runtime/tool-helpers.d.ts.map +1 -1
  12. package/esm/src/agent/runtime/tool-helpers.js +21 -0
  13. package/esm/src/embedding/resolve.d.ts.map +1 -1
  14. package/esm/src/embedding/resolve.js +15 -2
  15. package/esm/src/embedding/veryfront-cloud/provider.d.ts.map +1 -1
  16. package/esm/src/embedding/veryfront-cloud/provider.js +2 -7
  17. package/esm/src/extensions/contracts.js +3 -1
  18. package/esm/src/extensions/interfaces/ai-provider.d.ts +50 -0
  19. package/esm/src/extensions/interfaces/ai-provider.d.ts.map +1 -0
  20. package/esm/src/extensions/interfaces/ai-provider.js +13 -0
  21. package/esm/src/extensions/interfaces/code-parser.d.ts +11 -0
  22. package/esm/src/extensions/interfaces/code-parser.d.ts.map +1 -1
  23. package/esm/src/extensions/interfaces/css-processor.d.ts +41 -22
  24. package/esm/src/extensions/interfaces/css-processor.d.ts.map +1 -1
  25. package/esm/src/extensions/interfaces/css-processor.js +10 -1
  26. package/esm/src/extensions/interfaces/index.d.ts +5 -4
  27. package/esm/src/extensions/interfaces/index.d.ts.map +1 -1
  28. package/esm/src/extensions/interfaces/index.js +1 -0
  29. package/esm/src/extensions/interfaces/schema-validator.d.ts +84 -5
  30. package/esm/src/extensions/interfaces/schema-validator.d.ts.map +1 -1
  31. package/esm/src/extensions/interfaces/schema-validator.js +5 -0
  32. package/esm/src/extensions/loader.d.ts +7 -0
  33. package/esm/src/extensions/loader.d.ts.map +1 -1
  34. package/esm/src/extensions/loader.js +12 -0
  35. package/esm/src/extensions/orchestrate.d.ts +2 -0
  36. package/esm/src/extensions/orchestrate.d.ts.map +1 -1
  37. package/esm/src/extensions/orchestrate.js +3 -0
  38. package/esm/src/extensions/recommendations.d.ts.map +1 -1
  39. package/esm/src/extensions/recommendations.js +4 -1
  40. package/esm/src/extensions/registries/ai-provider-registry.d.ts +11 -0
  41. package/esm/src/extensions/registries/ai-provider-registry.d.ts.map +1 -0
  42. package/esm/src/extensions/registries/ai-provider-registry.js +40 -0
  43. package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
  44. package/esm/src/html/styles-builder/plugin-loader.js +4 -16
  45. package/esm/src/html/styles-builder/tailwind-compiler-cache.d.ts +8 -2
  46. package/esm/src/html/styles-builder/tailwind-compiler-cache.d.ts.map +1 -1
  47. package/esm/src/html/styles-builder/tailwind-compiler-cache.js +20 -3
  48. package/esm/src/internal-agents/run-stream.d.ts.map +1 -1
  49. package/esm/src/internal-agents/run-stream.js +22 -0
  50. package/esm/src/provider/model-registry.d.ts.map +1 -1
  51. package/esm/src/provider/model-registry.js +33 -6
  52. package/esm/src/provider/runtime-loader/provider-embedding-responses.d.ts +1 -0
  53. package/esm/src/provider/runtime-loader/provider-embedding-responses.d.ts.map +1 -1
  54. package/esm/src/provider/runtime-loader/provider-embedding-responses.js +1 -1
  55. package/esm/src/provider/runtime-loader/provider-http.d.ts +9 -0
  56. package/esm/src/provider/runtime-loader/provider-http.d.ts.map +1 -1
  57. package/esm/src/provider/runtime-loader/provider-http.js +2 -2
  58. package/esm/src/provider/runtime-loader.d.ts +120 -9
  59. package/esm/src/provider/runtime-loader.d.ts.map +1 -1
  60. package/esm/src/provider/runtime-loader.js +13 -943
  61. package/esm/src/provider/veryfront-cloud/provider.d.ts.map +1 -1
  62. package/esm/src/provider/veryfront-cloud/provider.js +30 -15
  63. package/esm/src/schemas/define.d.ts +31 -0
  64. package/esm/src/schemas/define.d.ts.map +1 -0
  65. package/esm/src/schemas/define.js +42 -0
  66. package/esm/src/schemas/index.d.ts +7 -2
  67. package/esm/src/schemas/index.d.ts.map +1 -1
  68. package/esm/src/schemas/index.js +10 -2
  69. package/esm/src/schemas/zod-adapter.d.ts +25 -0
  70. package/esm/src/schemas/zod-adapter.d.ts.map +1 -0
  71. package/esm/src/schemas/zod-adapter.js +120 -0
  72. package/esm/src/server/bootstrap.d.ts.map +1 -1
  73. package/esm/src/server/bootstrap.js +5 -0
  74. package/esm/src/transforms/plugins/babel-node-positions.d.ts +6 -7
  75. package/esm/src/transforms/plugins/babel-node-positions.d.ts.map +1 -1
  76. package/esm/src/transforms/plugins/babel-node-positions.js +10 -123
  77. package/esm/src/utils/version-constant.d.ts +1 -1
  78. package/esm/src/utils/version-constant.js +1 -1
  79. package/package.json +1 -6
  80. package/src/deno.js +8 -11
  81. package/src/src/agent/agent-service.ts +91 -7
  82. package/src/src/agent/index.ts +4 -0
  83. package/src/src/agent/runtime/index.ts +32 -1
  84. package/src/src/agent/runtime/tool-helpers.ts +32 -0
  85. package/src/src/embedding/resolve.ts +18 -7
  86. package/src/src/embedding/veryfront-cloud/provider.ts +4 -10
  87. package/src/src/extensions/contracts.ts +3 -3
  88. package/src/src/extensions/interfaces/ai-provider.ts +54 -0
  89. package/src/src/extensions/interfaces/code-parser.ts +12 -0
  90. package/src/src/extensions/interfaces/css-processor.ts +43 -22
  91. package/src/src/extensions/interfaces/index.ts +15 -11
  92. package/src/src/extensions/interfaces/schema-validator.ts +112 -5
  93. package/src/src/extensions/loader.ts +14 -0
  94. package/src/src/extensions/orchestrate.ts +5 -0
  95. package/src/src/extensions/recommendations.ts +4 -1
  96. package/src/src/extensions/registries/ai-provider-registry.ts +53 -0
  97. package/src/src/html/styles-builder/plugin-loader.ts +4 -16
  98. package/src/src/html/styles-builder/tailwind-compiler-cache.ts +27 -6
  99. package/src/src/internal-agents/run-stream.ts +34 -0
  100. package/src/src/provider/model-registry.ts +34 -15
  101. package/src/src/provider/runtime-loader/provider-embedding-responses.ts +1 -1
  102. package/src/src/provider/runtime-loader/provider-http.ts +2 -2
  103. package/src/src/provider/runtime-loader.ts +41 -1189
  104. package/src/src/provider/veryfront-cloud/provider.ts +35 -19
  105. package/src/src/schemas/define.ts +48 -0
  106. package/src/src/schemas/index.ts +13 -2
  107. package/src/src/schemas/zod-adapter.ts +180 -0
  108. package/src/src/server/bootstrap.ts +5 -0
  109. package/src/src/transforms/plugins/babel-node-positions.ts +11 -173
  110. package/src/src/utils/version-constant.ts +1 -1
  111. package/esm/src/extensions/interfaces/ai-model-provider.d.ts +0 -94
  112. package/esm/src/extensions/interfaces/ai-model-provider.d.ts.map +0 -1
  113. package/esm/src/extensions/interfaces/ai-model-provider.js +0 -8
  114. package/src/src/extensions/interfaces/ai-model-provider.ts +0 -100
@@ -26,21 +26,70 @@ export interface AgentServiceServerConfig {
26
26
  cors?: boolean;
27
27
  }
28
28
 
29
- /**
30
- * Phase-0 contract draft for the future framework-owned hosted agent service.
31
- */
32
- export interface AgentContract<
29
+ export type AgentRegistry = Record<string, Agent>;
30
+
31
+ export interface AgentServiceContractBase<
33
32
  TStartInput = void,
34
33
  TRun = unknown,
35
34
  TEvent = unknown,
36
35
  TTerminalState = unknown,
37
36
  > {
38
37
  serviceName: string;
39
- agent: Agent;
40
38
  server?: AgentServiceServerConfig;
41
39
  durableRunSink?: DurableRunSink<TStartInput, TRun, TEvent, TTerminalState>;
42
40
  }
43
41
 
42
+ /**
43
+ * Multi-agent hosted-service contract. Framework services route to
44
+ * `defaultAgentId` unless the host chooses another registered agent.
45
+ */
46
+ export interface AgentServiceRegistryContract<
47
+ TStartInput = void,
48
+ TRun = unknown,
49
+ TEvent = unknown,
50
+ TTerminalState = unknown,
51
+ > extends AgentServiceContractBase<TStartInput, TRun, TEvent, TTerminalState> {
52
+ agents: AgentRegistry;
53
+ defaultAgentId: string;
54
+ }
55
+
56
+ /**
57
+ * Single-agent convenience accepted by `defineAgentService()`. Implementations
58
+ * must normalize this shape into the same registry path used by multi-agent
59
+ * services so framework users are not boxed into one-agent-per-process.
60
+ */
61
+ export interface AgentServiceSingleAgentContract<
62
+ TStartInput = void,
63
+ TRun = unknown,
64
+ TEvent = unknown,
65
+ TTerminalState = unknown,
66
+ > extends AgentServiceContractBase<TStartInput, TRun, TEvent, TTerminalState> {
67
+ agent: Agent;
68
+ defaultAgentId?: string;
69
+ }
70
+
71
+ /**
72
+ * Phase-0 contract draft for the future framework-owned hosted agent service.
73
+ */
74
+ export type AgentContract<
75
+ TStartInput = void,
76
+ TRun = unknown,
77
+ TEvent = unknown,
78
+ TTerminalState = unknown,
79
+ > =
80
+ | AgentServiceRegistryContract<TStartInput, TRun, TEvent, TTerminalState>
81
+ | AgentServiceSingleAgentContract<TStartInput, TRun, TEvent, TTerminalState>;
82
+
83
+ export interface NormalizedAgentServiceContract<
84
+ TStartInput = void,
85
+ TRun = unknown,
86
+ TEvent = unknown,
87
+ TTerminalState = unknown,
88
+ > extends AgentServiceContractBase<TStartInput, TRun, TEvent, TTerminalState> {
89
+ agents: AgentRegistry;
90
+ defaultAgentId: string;
91
+ }
92
+
44
93
  /**
45
94
  * Type-preserving service definition reserved ahead of the runtime
46
95
  * implementation landing in a later migration phase.
@@ -51,12 +100,47 @@ export interface AgentServiceDefinition<
51
100
  TEvent = unknown,
52
101
  TTerminalState = unknown,
53
102
  > {
54
- contract: AgentContract<TStartInput, TRun, TEvent, TTerminalState>;
103
+ contract: NormalizedAgentServiceContract<TStartInput, TRun, TEvent, TTerminalState>;
55
104
  }
56
105
 
57
106
  const DEFINE_AGENT_SERVICE_STUB_ERROR =
58
107
  "defineAgentService() is a Phase 0 stub. The framework contract is reserved, but the hosted runtime implementation has not landed yet.";
59
108
 
109
+ function getSingleAgentDefaultId(contract: {
110
+ agent: Agent;
111
+ defaultAgentId?: string;
112
+ }): string {
113
+ return contract.defaultAgentId ?? contract.agent.id ?? "default";
114
+ }
115
+
116
+ function normalizeAgentServiceContract<
117
+ TStartInput = void,
118
+ TRun = unknown,
119
+ TEvent = unknown,
120
+ TTerminalState = unknown,
121
+ >(
122
+ contract: AgentContract<TStartInput, TRun, TEvent, TTerminalState>,
123
+ ): NormalizedAgentServiceContract<TStartInput, TRun, TEvent, TTerminalState> {
124
+ if ("agents" in contract) {
125
+ return {
126
+ serviceName: contract.serviceName,
127
+ agents: contract.agents,
128
+ defaultAgentId: contract.defaultAgentId,
129
+ server: contract.server,
130
+ durableRunSink: contract.durableRunSink,
131
+ };
132
+ }
133
+
134
+ const defaultAgentId = getSingleAgentDefaultId(contract);
135
+ return {
136
+ serviceName: contract.serviceName,
137
+ agents: { [defaultAgentId]: contract.agent },
138
+ defaultAgentId,
139
+ server: contract.server,
140
+ durableRunSink: contract.durableRunSink,
141
+ };
142
+ }
143
+
60
144
  /**
61
145
  * Reserve the public hosted agent-service signature before the runtime
62
146
  * implementation lands.
@@ -69,6 +153,6 @@ export function defineAgentService<
69
153
  >(
70
154
  contract: AgentContract<TStartInput, TRun, TEvent, TTerminalState>,
71
155
  ): AgentServiceDefinition<TStartInput, TRun, TEvent, TTerminalState> {
72
- void contract;
156
+ void normalizeAgentServiceContract(contract);
73
157
  throw new Error(DEFINE_AGENT_SERVICE_STUB_ERROR);
74
158
  }
@@ -143,10 +143,14 @@ export {
143
143
  export { agent } from "./factory.js";
144
144
  export {
145
145
  type AgentContract,
146
+ type AgentRegistry,
146
147
  type AgentServiceDefinition,
148
+ type AgentServiceRegistryContract,
147
149
  type AgentServiceServerConfig,
150
+ type AgentServiceSingleAgentContract,
148
151
  defineAgentService,
149
152
  type DurableRunSink,
153
+ type NormalizedAgentServiceContract,
150
154
  } from "./agent-service.js";
151
155
  export {
152
156
  type AgUiRuntimeHandlerConfig,
@@ -47,7 +47,7 @@ import { repairToolCall } from "./repair-tool-call.js";
47
47
  import { MiddlewareChain } from "../middleware/chain.js";
48
48
  import { AGENT_DEFAULTS } from "../defaults.js";
49
49
  import { tryGetCacheKeyContext } from "../../cache/cache-key-builder.js";
50
- import type { ToolExecutionContext } from "../../tool/index.js";
50
+ import type { ToolDefinition, ToolExecutionContext } from "../../tool/index.js";
51
51
  import { isLocalModelRuntime } from "../../provider/runtime-inspection.js";
52
52
  import { generateText, streamText } from "../../runtime/runtime-bridge.js";
53
53
 
@@ -110,6 +110,9 @@ const LOAD_SKILL_TOOL_ID = "load-skill";
110
110
 
111
111
  type RuntimeToolFilterConfig = AgentConfig & {
112
112
  __vfAllowedRemoteTools?: string[];
113
+ __vfForwardedIntegrationToolDefs?: Array<
114
+ { name: string; description: string; parameters: Record<string, unknown> }
115
+ >;
113
116
  };
114
117
 
115
118
  function isAbortError(error: unknown, abortSignal?: AbortSignal): boolean {
@@ -418,6 +421,30 @@ function getRuntimeAllowedRemoteTools(config: AgentConfig): string[] | undefined
418
421
  return raw.every((toolName) => typeof toolName === "string") ? raw : [];
419
422
  }
420
423
 
424
+ function getRuntimeForwardedIntegrationToolDefs(
425
+ config: AgentConfig,
426
+ ): ToolDefinition[] | undefined {
427
+ const configWithFilters = config as RuntimeToolFilterConfig;
428
+ const raw = configWithFilters.__vfForwardedIntegrationToolDefs;
429
+ if (!Array.isArray(raw) || raw.length === 0) return undefined;
430
+ return raw
431
+ .filter(
432
+ (def): def is { name: string; description: string; parameters: Record<string, unknown> } =>
433
+ typeof def === "object" &&
434
+ def !== null &&
435
+ typeof def.name === "string" &&
436
+ typeof def.description === "string",
437
+ )
438
+ .map((def) => ({
439
+ name: def.name,
440
+ description: def.description,
441
+ parameters: typeof def.parameters === "object" && def.parameters !== null &&
442
+ !Array.isArray(def.parameters)
443
+ ? def.parameters
444
+ : { type: "object", properties: {} },
445
+ }));
446
+ }
447
+
421
448
  type ResolvedModelTransport = {
422
449
  requestedModel: string;
423
450
  resolvedModelString: string;
@@ -722,6 +749,7 @@ export class AgentRuntime {
722
749
  // Request-scoped skill policy (not class-level mutable state)
723
750
  let activeSkillPolicy: string[] | undefined;
724
751
  const allowedRemoteToolNames = getRuntimeAllowedRemoteTools(this.config);
752
+ const forwardedRemoteToolDefinitions = getRuntimeForwardedIntegrationToolDefs(this.config);
725
753
  let currentSystemPrompt = systemPrompt;
726
754
  let currentRuntimeContext = runtimeContext;
727
755
 
@@ -743,6 +771,7 @@ export class AgentRuntime {
743
771
  let tools = isLocal ? [] : await getAvailableTools(this.config.tools, {
744
772
  includeSkillTools: Boolean(this.config.skills),
745
773
  allowedRemoteToolNames,
774
+ forwardedRemoteToolDefinitions,
746
775
  remoteToolSources: this.config.remoteTools,
747
776
  remoteToolContext: toolContext,
748
777
  });
@@ -1004,6 +1033,7 @@ export class AgentRuntime {
1004
1033
  let finalFinishReason: string | undefined;
1005
1034
  let latestAssistantText = "";
1006
1035
  const allowedRemoteToolNames = getRuntimeAllowedRemoteTools(this.config);
1036
+ const forwardedRemoteToolDefinitions = getRuntimeForwardedIntegrationToolDefs(this.config);
1007
1037
  let currentSystemPrompt = systemPrompt;
1008
1038
  let currentRuntimeContext = runtimeContext;
1009
1039
 
@@ -1026,6 +1056,7 @@ export class AgentRuntime {
1026
1056
  let tools = isLocalStreaming ? [] : await getAvailableTools(this.config.tools, {
1027
1057
  includeSkillTools: Boolean(this.config.skills),
1028
1058
  allowedRemoteToolNames,
1059
+ forwardedRemoteToolDefinitions,
1029
1060
  remoteToolSources: this.config.remoteTools,
1030
1061
  remoteToolContext: toolContext,
1031
1062
  });
@@ -297,6 +297,27 @@ function addToolDefinition(
297
297
  tools.push(def);
298
298
  }
299
299
 
300
+ /**
301
+ * Merge forwarded integration tool definitions into the remote defs array.
302
+ * Forwarded definitions are provided by the API when the runtime cannot
303
+ * fetch them directly (e.g., the runtime token lacks user auth).
304
+ * Only appends definitions not already present in the array.
305
+ */
306
+ function appendForwardedToolDefinitions(
307
+ remoteDefs: ToolDefinition[],
308
+ forwarded: ToolDefinition[] | undefined,
309
+ allowedNames: string[] | undefined,
310
+ ): void {
311
+ if (!forwarded?.length) return;
312
+ const existing = new Set(remoteDefs.map((def) => def.name));
313
+ for (const def of forwarded) {
314
+ if (existing.has(def.name)) continue;
315
+ if (allowedNames && !allowedNames.includes(def.name)) continue;
316
+ remoteDefs.push(def);
317
+ existing.add(def.name);
318
+ }
319
+ }
320
+
300
321
  /**
301
322
  * Get available tools based on agent configuration.
302
323
  * When tools === true, loads all tools from registry.
@@ -311,6 +332,7 @@ export async function getAvailableTools(
311
332
  includeSkillTools?: boolean;
312
333
  includeIntegrationTools?: boolean;
313
334
  allowedRemoteToolNames?: string[];
335
+ forwardedRemoteToolDefinitions?: ToolDefinition[];
314
336
  remoteToolSources?: RemoteToolSource[];
315
337
  remoteToolContext?: ToolExecutionContext;
316
338
  },
@@ -333,6 +355,11 @@ export async function getAvailableTools(
333
355
 
334
356
  // Append remote integration tools (per-request, project-scoped)
335
357
  const remoteDefs = await getRemoteToolDefinitions(options);
358
+ appendForwardedToolDefinitions(
359
+ remoteDefs,
360
+ options?.forwardedRemoteToolDefinitions,
361
+ options?.allowedRemoteToolNames,
362
+ );
336
363
  for (const def of remoteDefs) {
337
364
  logToolDefinition(def.name, def);
338
365
  }
@@ -343,6 +370,11 @@ export async function getAvailableTools(
343
370
 
344
371
  const tools: ToolDefinition[] = [];
345
372
  const remoteDefs = await getRemoteToolDefinitions(options);
373
+ appendForwardedToolDefinitions(
374
+ remoteDefs,
375
+ options?.forwardedRemoteToolDefinitions,
376
+ options?.allowedRemoteToolNames,
377
+ );
346
378
  const remoteToolNames = new Set(remoteDefs.map((def) => def.name));
347
379
  const explicitlyRequestedRemoteToolNames = new Set<string>();
348
380
  const unresolvedConfiguredToolNames: string[] = [];
@@ -1,11 +1,11 @@
1
1
  import { createError, toError } from "../errors/veryfront-error.js";
2
2
  import { getGoogleGenAIEnvConfig, getOpenAIEnvConfig } from "../config/env.js";
3
3
  import { createLocalEmbeddingModel } from "../provider/local/embedding-runtime-adapter.js";
4
- import {
5
- createGoogleEmbeddingRuntime,
6
- createOpenAIEmbeddingRuntime,
7
- } from "../provider/runtime-loader.js";
4
+ import { createGoogleEmbeddingRuntime } from "../provider/runtime-loader.js";
8
5
  import type { EmbeddingRuntime } from "../provider/types.js";
6
+ import { tryResolve } from "../extensions/contracts.js";
7
+ import type { AIProviderRegistry } from "../extensions/interfaces/index.js";
8
+ import { AIProviderRegistryName } from "../extensions/interfaces/index.js";
9
9
  import { createVeryfrontCloudEmbeddingModel } from "./veryfront-cloud/provider.js";
10
10
 
11
11
  type EmbeddingProviderFactory = (modelId: string) => EmbeddingRuntime;
@@ -44,9 +44,20 @@ function autoInitializeFromEnv(): void {
44
44
  }),
45
45
  );
46
46
  }
47
- return createOpenAIEmbeddingRuntime(
48
- { apiKey: config.apiKey, baseURL: config.baseURL },
49
- id,
47
+ const registry = tryResolve<AIProviderRegistry>(AIProviderRegistryName);
48
+ const provider = registry?.get("openai");
49
+ if (provider?.createEmbedding) {
50
+ return provider.createEmbedding(id, {
51
+ credential: config.apiKey,
52
+ baseURL: config.baseURL,
53
+ });
54
+ }
55
+ throw toError(
56
+ createError({
57
+ type: "config",
58
+ message:
59
+ "OpenAI provider not installed. Add @veryfront/ext-openai to use openai/* embedding models.",
60
+ }),
50
61
  );
51
62
  });
52
63
  }
@@ -1,8 +1,5 @@
1
1
  import { createError, toError } from "../../errors/veryfront-error.js";
2
- import {
3
- createGoogleEmbeddingRuntime,
4
- createOpenAIEmbeddingRuntime,
5
- } from "../../provider/runtime-loader.js";
2
+ import { createGoogleEmbeddingRuntime } from "../../provider/runtime-loader.js";
6
3
  import type { EmbeddingRuntime } from "../../provider/types.js";
7
4
  import {
8
5
  createVeryfrontCloudFetch,
@@ -19,12 +16,9 @@ export function createVeryfrontCloudEmbeddingModel(modelId: string): EmbeddingRu
19
16
 
20
17
  switch (provider) {
21
18
  case "openai":
22
- return createOpenAIEmbeddingRuntime({
23
- apiKey: apiToken,
24
- baseURL,
25
- name: "veryfront-cloud",
26
- fetch,
27
- }, upstreamModelId);
19
+ throw new Error(
20
+ "OpenAI provider not installed. Add @veryfront/ext-openai to use openai embedding models via veryfront-cloud.",
21
+ );
28
22
 
29
23
  case "google":
30
24
  return createGoogleEmbeddingRuntime({
@@ -14,9 +14,9 @@ export function resolve<T>(name: string): T {
14
14
  if (impl === undefined) {
15
15
  const recommendation = getRecommendation(name);
16
16
  throw MISSING_EXTENSION_ERROR.create({
17
- message: `Missing extension for contract "${name}"${
18
- recommendation ? `. Recommended: ${recommendation}` : ""
19
- }`,
17
+ message: recommendation
18
+ ? `Missing extension for contract "${name}". Install it with: deno add ${recommendation}`
19
+ : `Missing extension for contract "${name}"`,
20
20
  detail: recommendation ? `Install it with: deno add ${recommendation}` : undefined,
21
21
  });
22
22
  }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Contract interface for LLM provider extensions.
3
+ *
4
+ * A single `AIProviderRegistry` impl lives in the contract registry under
5
+ * {@link AIProviderRegistryName}. Each provider extension resolves the
6
+ * registry in its `setup()` and calls `registry.register(provider)`.
7
+ * Core consumers (model-registry, veryfront-cloud) resolve the registry
8
+ * and dispatch on provider id parsed from `"provider/model"` strings.
9
+ *
10
+ * @module extensions/interfaces/ai-provider
11
+ */
12
+
13
+ import type { EmbeddingRuntime, ModelRuntime } from "../../provider/types.js";
14
+
15
+ /** Config passed to any provider's create* method. */
16
+ export interface AIProviderConfig {
17
+ /** API credential — maps to OpenAI `apiKey`, Anthropic `authToken`, Google `apiKey` internally. */
18
+ credential: string;
19
+ /** Override the provider's base URL (e.g. Azure OpenAI, self-hosted gateway). */
20
+ baseURL?: string;
21
+ /** Override fetch (veryfront-cloud uses this to inject project auth headers). */
22
+ fetch?: typeof fetch;
23
+ /** Display name shown in errors + telemetry. Defaults to provider id. */
24
+ name?: string;
25
+ /** Provider-specific extras. */
26
+ [key: string]: unknown;
27
+ }
28
+
29
+ /**
30
+ * An LLM provider implementation. Extensions register one of these with the
31
+ * {@link AIProviderRegistry} during setup(). `createModel` is required;
32
+ * `createEmbedding` and `createResponses` are optional and absent on
33
+ * providers that don't support them.
34
+ */
35
+ export interface AIProvider {
36
+ /** Stable id used in model strings: "openai" / "anthropic" / "google". */
37
+ readonly id: string;
38
+ createModel(modelId: string, config: AIProviderConfig): ModelRuntime;
39
+ createEmbedding?(modelId: string, config: AIProviderConfig): EmbeddingRuntime;
40
+ createResponses?(modelId: string, config: AIProviderConfig): ModelRuntime;
41
+ }
42
+
43
+ /** Registry contract. Single impl created at bootstrap. */
44
+ export interface AIProviderRegistry {
45
+ register(provider: AIProvider): void;
46
+ unregister(id: string): void;
47
+ get(id: string): AIProvider | undefined;
48
+ require(id: string): AIProvider;
49
+ list(): AIProvider[];
50
+ has(id: string): boolean;
51
+ }
52
+
53
+ /** Contract name used for `resolve()` / `provide()`. */
54
+ export const AIProviderRegistryName = "AIProviderRegistry" as const;
@@ -74,6 +74,12 @@ export interface GenerateResult {
74
74
  * Implementations parse source code into ASTs, traverse/transform
75
75
  * nodes, and generate code back from modified trees.
76
76
  */
77
+ /** Options for {@link CodeParser.injectJsxNodePositions}. */
78
+ export interface InjectJsxNodePositionsOptions {
79
+ /** Source file path — emitted into `data-node-file` attributes. */
80
+ filePath: string;
81
+ }
82
+
77
83
  export interface CodeParser {
78
84
  /** Parse source code into an abstract syntax tree. */
79
85
  parse(options: ParseOptions): Promise<ASTNode>;
@@ -81,4 +87,10 @@ export interface CodeParser {
81
87
  traverse(ast: ASTNode, visitor: TraverseVisitor): void;
82
88
  /** Generate source code from an AST. */
83
89
  generate(ast: ASTNode, options?: GenerateOptions): Promise<GenerateResult>;
90
+ /**
91
+ * Inject `data-node-*` attributes into every JSX element in the source,
92
+ * enabling Studio Navigator to map rendered elements back to their
93
+ * source positions. Parsing failures return the input unchanged.
94
+ */
95
+ injectJsxNodePositions(source: string, options: InjectJsxNodePositionsOptions): string;
84
96
  }
@@ -1,40 +1,61 @@
1
1
  /**
2
- * Contract interface for CSS processing engines.
2
+ * Contract interface for CSS processing engines (Tailwind-style compile
3
+ * pipelines).
3
4
  *
4
5
  * Default implementation: `@veryfront/ext-tailwind`
5
6
  *
7
+ * The contract mirrors the Tailwind v4 `compile()` surface: a stateful
8
+ * compiler is constructed once per stylesheet and emits CSS output for the
9
+ * set of class-name candidates discovered at render time. Core scans the
10
+ * rendered HTML for candidates and calls `CSSCompiler.build(candidates)`
11
+ * on each request; the compiler accumulates state across calls, so per-
12
+ * project isolation is the caller's responsibility (see
13
+ * `tailwind-compiler-cache.ts`).
14
+ *
6
15
  * @module extensions/interfaces/css-processor
7
16
  */
8
17
 
9
- /** Options passed to {@link CSSProcessor.process}. */
10
- export interface CSSProcessOptions {
11
- /** Raw CSS or utility-class input. */
18
+ /** A loaded stylesheet body with the base path used to resolve relative imports. */
19
+ export interface CSSStylesheetSource {
12
20
  content: string;
13
- /** Paths to source files used for scanning class usage. */
14
- sources?: string[];
15
- /** Enable minification of the output. */
16
- minify?: boolean;
17
- /** Extra implementation-specific options. */
18
- [key: string]: unknown;
21
+ base: string;
22
+ path: string;
23
+ }
24
+
25
+ /** A loaded module (Tailwind plugin). `module` is the plugin's default export. */
26
+ export interface CSSModuleSource {
27
+ module: unknown;
28
+ base: string;
29
+ path: string;
30
+ }
31
+
32
+ /** Options passed to {@link CSSProcessor.compile}. */
33
+ export interface CSSCompileOptions {
34
+ /** Base path used to resolve relative `@import` specifiers. */
35
+ base: string;
36
+ /** Resolver invoked when the compiler encounters an `@import` it doesn't recognize. */
37
+ loadStylesheet(id: string): Promise<CSSStylesheetSource>;
38
+ /** Resolver invoked for `@plugin` directives. */
39
+ loadModule(id: string): Promise<CSSModuleSource>;
19
40
  }
20
41
 
21
- /** Result returned from {@link CSSProcessor.process}. */
22
- export interface CSSProcessResult {
23
- /** Processed CSS output. */
24
- css: string;
25
- /** Source map, if generated. */
26
- map?: string;
42
+ /** Stateful compiler returned by {@link CSSProcessor.compile}. */
43
+ export interface CSSCompiler {
44
+ /**
45
+ * Emit CSS for the supplied list of class-name candidates. Stateful — the
46
+ * compiler accumulates candidates across calls for the lifetime of the
47
+ * underlying compile session.
48
+ */
49
+ build(candidates: string[]): string;
27
50
  }
28
51
 
29
52
  /**
30
53
  * CSSProcessor contract interface.
31
54
  *
32
- * Implementations compile utility classes or raw CSS into optimized
33
- * stylesheets ready for the browser.
55
+ * Implementations wire a utility-class compiler (Tailwind, UnoCSS, etc.) so
56
+ * core's styles-builder can emit per-request CSS without importing the
57
+ * underlying engine directly.
34
58
  */
35
59
  export interface CSSProcessor {
36
- /** Process CSS input and return the compiled result. */
37
- process(options: CSSProcessOptions): Promise<CSSProcessResult>;
38
- /** Merge class names using the processor's conflict-resolution strategy. */
39
- mergeClasses?(...classes: string[]): string;
60
+ compile(stylesheet: string, options: CSSCompileOptions): Promise<CSSCompiler>;
40
61
  }
@@ -27,7 +27,13 @@ export type { CacheStore } from "./cache-store.js";
27
27
  export type { TokenCacheEntry, TokenCacheStats, TokenCacheStore } from "./token-cache-store.js";
28
28
 
29
29
  // CSS processor
30
- export type { CSSProcessOptions, CSSProcessor, CSSProcessResult } from "./css-processor.js";
30
+ export type {
31
+ CSSCompileOptions,
32
+ CSSCompiler,
33
+ CSSModuleSource,
34
+ CSSProcessor,
35
+ CSSStylesheetSource,
36
+ } from "./css-processor.js";
31
37
 
32
38
  // Content transformer
33
39
  export type {
@@ -51,16 +57,9 @@ export type {
51
57
  // Tracing exporter
52
58
  export type { SpanData, TracerProvider, TracingExporter } from "./tracing-exporter.js";
53
59
 
54
- // AI model provider
55
- export type {
56
- AIModelProvider,
57
- ChatMessage,
58
- CompletionOptions,
59
- CompletionResult,
60
- ContentPart,
61
- StreamChunk,
62
- ToolDefinition,
63
- } from "./ai-model-provider.js";
60
+ // AI provider (registry + per-provider contract)
61
+ export type { AIProvider, AIProviderConfig, AIProviderRegistry } from "./ai-provider.js";
62
+ export { AIProviderRegistryName } from "./ai-provider.js";
64
63
 
65
64
  // Embedding provider
66
65
  export type { EmbeddingOptions, EmbeddingProvider, EmbeddingResult } from "./embedding-provider.js";
@@ -71,6 +70,7 @@ export type {
71
70
  CodeParser,
72
71
  GenerateOptions,
73
72
  GenerateResult,
73
+ InjectJsxNodePositionsOptions,
74
74
  NodePath,
75
75
  ParseOptions,
76
76
  TraverseVisitor,
@@ -78,8 +78,12 @@ export type {
78
78
 
79
79
  // Schema validator
80
80
  export type {
81
+ InferSchema,
82
+ InferShape,
81
83
  Schema,
84
+ SchemaFactory,
82
85
  SchemaValidator,
86
+ SchemaValidatorCoerce,
83
87
  ValidationFailure,
84
88
  ValidationIssue,
85
89
  ValidationResult,