@aexol/spectral 0.9.231 → 0.9.234

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 (106) hide show
  1. package/dist/agent/index.d.ts.map +1 -1
  2. package/dist/agent/index.js +89 -14
  3. package/dist/backend/generated-images.d.ts +1 -1
  4. package/dist/backend/generated-images.d.ts.map +1 -1
  5. package/dist/commands/serve.d.ts.map +1 -1
  6. package/dist/commands/serve.js +12 -1
  7. package/dist/extensions/logic-trace.d.ts +1 -1
  8. package/dist/extensions/logic-trace.d.ts.map +1 -1
  9. package/dist/extensions/logic-trace.js +199 -70
  10. package/dist/extensions/video-generation/index.d.ts +3 -0
  11. package/dist/extensions/video-generation/index.d.ts.map +1 -0
  12. package/dist/extensions/video-generation/index.js +299 -0
  13. package/dist/generated/zeus/const.d.ts.map +1 -1
  14. package/dist/generated/zeus/const.js +30 -0
  15. package/dist/generated/zeus/index.d.ts +140 -0
  16. package/dist/generated/zeus/index.d.ts.map +1 -1
  17. package/dist/generated/zeus/index.js +5 -0
  18. package/dist/relay/dispatcher.d.ts +13 -1
  19. package/dist/relay/dispatcher.d.ts.map +1 -1
  20. package/dist/relay/dispatcher.js +11 -0
  21. package/dist/sdk/agent-core/agent-loop.js +13 -3
  22. package/dist/sdk/agent-core/agent.d.ts +11 -4
  23. package/dist/sdk/agent-core/agent.d.ts.map +1 -1
  24. package/dist/sdk/agent-core/agent.js +16 -4
  25. package/dist/sdk/agent-core/tool-call-registry.d.ts +75 -0
  26. package/dist/sdk/agent-core/tool-call-registry.d.ts.map +1 -0
  27. package/dist/sdk/agent-core/tool-call-registry.js +131 -0
  28. package/dist/sdk/agent-core/tool-execution.d.ts.map +1 -1
  29. package/dist/sdk/agent-core/tool-execution.js +103 -4
  30. package/dist/sdk/agent-core/types.d.ts +15 -4
  31. package/dist/sdk/agent-core/types.d.ts.map +1 -1
  32. package/dist/sdk/ai/index.d.ts +3 -0
  33. package/dist/sdk/ai/index.d.ts.map +1 -1
  34. package/dist/sdk/ai/index.js +3 -0
  35. package/dist/sdk/ai/providers/faux.d.ts.map +1 -1
  36. package/dist/sdk/ai/providers/faux.js +3 -0
  37. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts +39 -6
  38. package/dist/sdk/ai/providers/leaked-tool-call-parser.d.ts.map +1 -1
  39. package/dist/sdk/ai/providers/leaked-tool-call-parser.js +159 -18
  40. package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
  41. package/dist/sdk/ai/providers/openai-completions.js +22 -8
  42. package/dist/sdk/ai/providers/openrouter-videos.d.ts +3 -0
  43. package/dist/sdk/ai/providers/openrouter-videos.d.ts.map +1 -0
  44. package/dist/sdk/ai/providers/openrouter-videos.js +412 -0
  45. package/dist/sdk/ai/providers/register-builtins.d.ts.map +1 -1
  46. package/dist/sdk/ai/providers/register-builtins.js +6 -0
  47. package/dist/sdk/ai/providers/simple-options.d.ts +1 -6
  48. package/dist/sdk/ai/providers/simple-options.d.ts.map +1 -1
  49. package/dist/sdk/ai/providers/simple-options.js +0 -22
  50. package/dist/sdk/ai/providers/transform-messages.d.ts.map +1 -1
  51. package/dist/sdk/ai/providers/transform-messages.js +52 -1
  52. package/dist/sdk/ai/types.d.ts +91 -10
  53. package/dist/sdk/ai/types.d.ts.map +1 -1
  54. package/dist/sdk/ai/video-models.d.ts +10 -0
  55. package/dist/sdk/ai/video-models.d.ts.map +1 -0
  56. package/dist/sdk/ai/video-models.generated.d.ts +440 -0
  57. package/dist/sdk/ai/video-models.generated.d.ts.map +1 -0
  58. package/dist/sdk/ai/video-models.generated.js +441 -0
  59. package/dist/sdk/ai/video-models.js +22 -0
  60. package/dist/sdk/ai/videos-api-registry.d.ts +14 -0
  61. package/dist/sdk/ai/videos-api-registry.d.ts.map +1 -0
  62. package/dist/sdk/ai/videos-api-registry.js +21 -0
  63. package/dist/sdk/ai/videos.d.ts +4 -0
  64. package/dist/sdk/ai/videos.d.ts.map +1 -0
  65. package/dist/sdk/ai/videos.js +13 -0
  66. package/dist/sdk/coding-agent/core/agent-session.d.ts +8 -0
  67. package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
  68. package/dist/sdk/coding-agent/core/agent-session.js +11 -0
  69. package/dist/sdk/coding-agent/core/extensions/loader.d.ts.map +1 -1
  70. package/dist/sdk/coding-agent/core/extensions/loader.js +14 -0
  71. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts +26 -0
  72. package/dist/sdk/coding-agent/core/extensions/native-extensions.d.ts.map +1 -1
  73. package/dist/sdk/coding-agent/core/extensions/native-extensions.js +23 -0
  74. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts +2 -2
  75. package/dist/sdk/coding-agent/core/extensions/session-events.d.ts.map +1 -1
  76. package/dist/sdk/coding-agent/core/extensions/types.d.ts +4 -2
  77. package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
  78. package/dist/sdk/coding-agent/core/messages.d.ts.map +1 -1
  79. package/dist/sdk/coding-agent/core/messages.js +42 -2
  80. package/dist/sdk/coding-agent/core/resource-loader.d.ts +11 -0
  81. package/dist/sdk/coding-agent/core/resource-loader.d.ts.map +1 -1
  82. package/dist/sdk/coding-agent/core/resource-loader.js +23 -6
  83. package/dist/sdk/coding-agent/core/sdk.d.ts +24 -2
  84. package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
  85. package/dist/sdk/coding-agent/core/sdk.js +15 -3
  86. package/dist/sdk/coding-agent/core/settings-manager.d.ts +0 -8
  87. package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
  88. package/dist/sdk/coding-agent/core/settings-manager.js +3 -3
  89. package/dist/sdk/coding-agent/index.d.ts +2 -2
  90. package/dist/sdk/coding-agent/index.d.ts.map +1 -1
  91. package/dist/sdk/coding-agent/index.js +1 -1
  92. package/dist/sdk-public.d.ts +96 -0
  93. package/dist/sdk-public.d.ts.map +1 -0
  94. package/dist/sdk-public.js +109 -0
  95. package/dist/server/agent-bridge/rehydrate.d.ts +2 -2
  96. package/dist/server/agent-bridge/rehydrate.d.ts.map +1 -1
  97. package/dist/server/agent-bridge/rehydrate.js +14 -0
  98. package/dist/server/agent-bridge.d.ts +8 -2
  99. package/dist/server/agent-bridge.d.ts.map +1 -1
  100. package/dist/server/agent-bridge.js +25 -2
  101. package/dist/server/session-stream.d.ts +19 -0
  102. package/dist/server/session-stream.d.ts.map +1 -1
  103. package/dist/server/session-stream.js +35 -0
  104. package/dist/server/wire.d.ts +13 -0
  105. package/dist/server/wire.d.ts.map +1 -1
  106. package/package.json +7 -1
@@ -0,0 +1,299 @@
1
+ import { Type } from "typebox";
2
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { extname, join, resolve } from "node:path";
4
+ import { generateVideos, getVideoModel, getVideoModels } from "../../sdk/ai/index.js";
5
+ import { base64FromImageData } from "../../sdk/ai/utils/image-source.js";
6
+ import { uploadImage } from "../../backend/generated-images.js";
7
+ // Backend routing (backendUrl + machineJwt) is resolved the same way the
8
+ // image tool gets it, so video generation routes through the backend proxy
9
+ // (POST /video/generation) using the backend's own OPENROUTER_API_KEY and
10
+ // falls back to direct OpenRouter when the proxy is unavailable or the CLI
11
+ // is not logged in.
12
+ import { resolveBackendRouting } from "../../backend/machine-routing.js";
13
+ const frameImageSchema = Type.Union([
14
+ Type.String({
15
+ description: "Path to a frame image file (relative to the project working directory or absolute).",
16
+ }),
17
+ Type.Object({
18
+ data: Type.String({ description: "Frame image as raw base64 or data URL." }),
19
+ mimeType: Type.Optional(Type.String({ default: "image/png", description: "Frame image MIME type." })),
20
+ }, { description: "Frame image provided inline as base64 data." }),
21
+ Type.Object({
22
+ path: Type.String({ description: "Path to a frame image file (relative to the project working directory or absolute)." }),
23
+ mimeType: Type.Optional(Type.String({ description: "Frame image MIME type. Defaults to the type detected from the file extension." })),
24
+ }, { description: "Frame image provided as a file path." }),
25
+ ]);
26
+ const videoGenerateSchema = Type.Object({
27
+ prompt: Type.String({ description: "Text prompt describing the video to generate." }),
28
+ model: Type.Optional(Type.String({ default: "google/veo-3.1", description: "OpenRouter video model id." })),
29
+ duration: Type.Optional(Type.Number({ description: "Clip duration in seconds (model-dependent, e.g. 4-10 for Veo)." })),
30
+ resolution: Type.Optional(Type.String({ description: "Resolution tier, e.g. 480p, 720p, 768p, 1080p." })),
31
+ aspect_ratio: Type.Optional(Type.String({ description: "Aspect ratio, e.g. 16:9, 9:16, 1:1." })),
32
+ size: Type.Optional(Type.String({ description: "OpenRouter size shorthand, e.g. 1280x720." })),
33
+ generate_audio: Type.Optional(Type.Boolean({ default: true, description: "Whether to generate audio with the video (model-dependent)." })),
34
+ seed: Type.Optional(Type.Number()),
35
+ frame_images: Type.Optional(Type.Array(frameImageSchema, { description: "Optional frame images for image-to-video generation. Each element may be a file path string, an object { data: <base64 or data URL>, mimeType?: string }, or an object { path: <file path>, mimeType?: string }." })),
36
+ });
37
+ function videoModel(modelId) {
38
+ const exact = getVideoModel("openrouter", modelId);
39
+ if (exact)
40
+ return exact;
41
+ return getVideoModels("openrouter").find((model) => model.id === modelId);
42
+ }
43
+ const GENERATED_VIDEOS_DIR = ".generated_videos";
44
+ const VIDEO_MIME_TYPE = "video/mp4";
45
+ function mimeTypeForPath(filePath) {
46
+ switch (extname(filePath).toLowerCase()) {
47
+ case ".png":
48
+ return "image/png";
49
+ case ".jpg":
50
+ case ".jpeg":
51
+ return "image/jpeg";
52
+ case ".webp":
53
+ return "image/webp";
54
+ case ".gif":
55
+ return "image/gif";
56
+ default:
57
+ return "image/png";
58
+ }
59
+ }
60
+ function readFrameImageFromPath(filePath, mimeType) {
61
+ let data;
62
+ try {
63
+ data = readFileSync(filePath).toString("base64");
64
+ }
65
+ catch (error) {
66
+ const code = error?.code;
67
+ if (code === "ENOENT") {
68
+ throw new Error(`Frame image file does not exist: ${filePath}`);
69
+ }
70
+ if (code === "EACCES" || code === "EPERM") {
71
+ throw new Error(`Permission denied while reading frame image: ${filePath}`);
72
+ }
73
+ const detail = error instanceof Error ? error.message : String(error);
74
+ throw new Error(`Failed to read frame image: ${filePath} (${detail})`);
75
+ }
76
+ return {
77
+ type: "image",
78
+ data,
79
+ mimeType: mimeType ?? mimeTypeForPath(filePath),
80
+ };
81
+ }
82
+ function normalizeFrameImages(frames, cwd) {
83
+ if (!frames)
84
+ return [];
85
+ return frames.map((frame, index) => {
86
+ if (typeof frame === "string") {
87
+ return readFrameImageFromPath(resolve(cwd, frame), undefined);
88
+ }
89
+ if (typeof frame !== "object" || frame === null) {
90
+ throw new Error(`Invalid frame image at index ${index}: expected a file path string or an object with "data" or "path".`);
91
+ }
92
+ const reference = frame;
93
+ if (typeof reference.data === "string" && typeof reference.path === "string") {
94
+ throw new Error(`Invalid frame image at index ${index}: provide only one of "data" (inline base64) or "path" (file path), not both.`);
95
+ }
96
+ if (typeof reference.data === "string") {
97
+ return {
98
+ type: "image",
99
+ data: reference.data,
100
+ mimeType: reference.mimeType ?? "image/png",
101
+ };
102
+ }
103
+ if (typeof reference.path === "string") {
104
+ return readFrameImageFromPath(resolve(cwd, reference.path), reference.mimeType);
105
+ }
106
+ throw new Error(`Invalid frame image at index ${index}: expected a file path string or an object with "data" or "path".`);
107
+ });
108
+ }
109
+ function slugFromPrompt(prompt) {
110
+ const slug = prompt
111
+ .normalize("NFKD")
112
+ .replace(/[\u0300-\u036f]/g, "")
113
+ .toLowerCase()
114
+ .replace(/[^a-z0-9]+/g, "-")
115
+ .replace(/^-+|-+$/g, "")
116
+ .slice(0, 40);
117
+ return slug || "video";
118
+ }
119
+ function timestamp() {
120
+ return new Date().toISOString().replace(/[-:.TZ]/g, "").slice(0, 14);
121
+ }
122
+ /**
123
+ * Save a locally-downloaded video (direct OpenRouter path) under
124
+ * `.generated_videos/`. Proxy-path videos have no inline bytes here — the
125
+ * backend stores them and reports the hosted url instead.
126
+ */
127
+ function saveGeneratedVideo(video, prompt, cwd) {
128
+ if (!video.data)
129
+ return undefined;
130
+ const dir = join(cwd, GENERATED_VIDEOS_DIR);
131
+ mkdirSync(dir, { recursive: true });
132
+ const filename = `${slugFromPrompt(prompt)}-${timestamp()}.mp4`;
133
+ const filepath = join(dir, filename);
134
+ writeFileSync(filepath, Buffer.from(base64FromImageData(video.data), "base64"));
135
+ return filepath;
136
+ }
137
+ function bytesFromVideoData(data) {
138
+ return new Uint8Array(Buffer.from(base64FromImageData(data), "base64"));
139
+ }
140
+ /**
141
+ * Make the generated video reachable through a backend URL so the session can
142
+ * carry a url instead of megabytes of base64. Only applies to videos that
143
+ * came back as inline bytes (direct OpenRouter fallback path) — proxy-path
144
+ * videos are already stored server-side. Best effort by design: an upload
145
+ * failure must not fail video generation; the caller falls back to the local
146
+ * file + inline bytes and annotates the result text.
147
+ */
148
+ async function hostGeneratedVideo(video, routing, signal) {
149
+ if (video.url && video.videoId)
150
+ return { hosted: { url: video.url, videoId: video.videoId } };
151
+ if (!routing)
152
+ return { error: "not routed through the backend (video kept local)" };
153
+ if (!video.data)
154
+ return { error: "video has no inline bytes (kept local)" };
155
+ try {
156
+ const result = await uploadImage({
157
+ backendUrl: routing.backendUrl,
158
+ token: routing.machineJwt,
159
+ bytes: bytesFromVideoData(video.data),
160
+ contentType: video.mimeType || VIDEO_MIME_TYPE,
161
+ kind: "video",
162
+ signal,
163
+ });
164
+ return { result };
165
+ }
166
+ catch (error) {
167
+ return { error: error instanceof Error ? error.message : String(error) };
168
+ }
169
+ }
170
+ function isHosted(outcome) {
171
+ return Boolean(outcome.hosted ?? outcome.result);
172
+ }
173
+ function hostedUrl(outcome) {
174
+ return outcome.hosted?.url ?? outcome.result.url;
175
+ }
176
+ function hostedId(outcome) {
177
+ return outcome.hosted?.videoId ?? outcome.result.imageId;
178
+ }
179
+ function resultText(model, credits, savedPath, outcome) {
180
+ const lines = ["✓ Generated 1 video", `Model: ${model}`];
181
+ lines.push(`Cost: ${credits ?? 0} credits`);
182
+ if (savedPath)
183
+ lines.push(`Saved: ${savedPath}`);
184
+ else if (!isHosted(outcome))
185
+ lines.push("Saved: (no local copy — see errors below)");
186
+ if (isHosted(outcome)) {
187
+ lines.push(`Hosted: ${hostedUrl(outcome)}`);
188
+ }
189
+ if (!isHosted(outcome) && outcome.error) {
190
+ // Explicit annotation: the video bytes were NOT uploaded, so the video
191
+ // exists only as the local file (path above); remote URL unavailable.
192
+ lines.push(`⚠️ The video could not be uploaded to cloud storage and exists only locally; remote URL unavailable.`);
193
+ lines.push(`- ${outcome.error}`);
194
+ }
195
+ return lines.join("\n");
196
+ }
197
+ export default async function videoGenerationExtension(ext) {
198
+ const tool = {
199
+ name: "video_generate",
200
+ label: "Generate Video",
201
+ description: "Generate videos through OpenRouter's Videos API and save them to .generated_videos/ in the project. " +
202
+ "Returns the saved file path and hosted URL so the user can view the generated video. " +
203
+ "Supports text-to-video and image-to-video via optional frame images. " +
204
+ "Models cannot read video — the result carries a text summary; the video block is for the user's UI.",
205
+ promptSnippet: "`video_generate { prompt, model?, duration?, aspect_ratio?, resolution?, frame_images? }` — generate video content (mp4, saved to .generated_videos/)",
206
+ parameters: videoGenerateSchema,
207
+ async execute(_toolCallId, params, signal, onUpdate, ctx) {
208
+ const input = params;
209
+ const modelId = input.model ?? "google/veo-3.1";
210
+ const model = videoModel(modelId);
211
+ if (!model) {
212
+ return {
213
+ content: [{ type: "text", text: `❌ Unknown OpenRouter video model: ${modelId}` }],
214
+ details: { isError: true, model: modelId },
215
+ };
216
+ }
217
+ const context = {
218
+ input: [
219
+ { type: "text", text: input.prompt },
220
+ ...normalizeFrameImages(input.frame_images, ctx.cwd),
221
+ ],
222
+ };
223
+ // Route through the backend video proxy (POST /video/generation)
224
+ // using the machine JWT, mirroring image generation. Falls back to
225
+ // direct OpenRouter (submit + poll + download with the local
226
+ // OPENROUTER_API_KEY) when routing cannot be resolved or the proxy
227
+ // is unavailable.
228
+ const routing = await resolveBackendRouting();
229
+ const response = await generateVideos(model, context, {
230
+ ...input,
231
+ signal,
232
+ ...(routing ? { backendUrl: routing.backendUrl, apiKey: routing.machineJwt } : {}),
233
+ // Surface long-poll progress to the UI as partial tool results.
234
+ onProgress: (message) => {
235
+ try {
236
+ onUpdate?.({
237
+ content: [{ type: "text", text: message }],
238
+ details: { progress: message, model: model.id },
239
+ });
240
+ }
241
+ catch {
242
+ // Progress callbacks must never break generation.
243
+ }
244
+ },
245
+ });
246
+ if (response.stopReason !== "stop") {
247
+ const message = response.errorMessage ?? "Video generation failed";
248
+ return {
249
+ content: [{ type: "text", text: `❌ ${message}` }],
250
+ details: { isError: true, model: model.id, stopReason: response.stopReason, errorMessage: message },
251
+ };
252
+ }
253
+ const video = response.output.find((item) => item.type === "video");
254
+ if (!video) {
255
+ return {
256
+ content: [{ type: "text", text: "❌ Video generation returned no video" }],
257
+ details: { isError: true, model: model.id },
258
+ };
259
+ }
260
+ // Local copy first — for videos that actually came back as bytes
261
+ // (direct OpenRouter fallback). Proxy-path videos have no `data`
262
+ // here, so nothing is written and the hosted url is reported.
263
+ const savedPath = saveGeneratedVideo(video, input.prompt, ctx.cwd);
264
+ const outcome = await hostGeneratedVideo(video, routing, signal);
265
+ // Swap base64 for the hosted URL when possible: the session keeps
266
+ // `{ url, videoId }` and avoids megabytes of base64. Videos that
267
+ // failed to upload keep their inline bytes (fallback, annotated in
268
+ // the result text).
269
+ const block = isHosted(outcome)
270
+ ? {
271
+ type: "video",
272
+ url: hostedUrl(outcome),
273
+ videoId: hostedId(outcome),
274
+ mimeType: video.mimeType,
275
+ }
276
+ : video;
277
+ return {
278
+ content: [
279
+ {
280
+ type: "text",
281
+ text: resultText(response.model, response.usage?.credits, savedPath, outcome),
282
+ },
283
+ block,
284
+ ],
285
+ details: {
286
+ isError: false,
287
+ model: response.model,
288
+ count: 1,
289
+ usage: response.usage,
290
+ savedPath,
291
+ videoId: isHosted(outcome) ? hostedId(outcome) : undefined,
292
+ url: isHosted(outcome) ? hostedUrl(outcome) : undefined,
293
+ },
294
+ };
295
+ },
296
+ };
297
+ ext.registerTool(tool);
298
+ process.stderr.write("[video-generation] Registered video_generate tool.\n");
299
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../src/generated/zeus/const.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAC,GAAG,CA0zB5C,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAC,GAAG,CAumC1C,CAAA;AAED,eAAO,MAAM,GAAG;;;;CAIf,CAAA"}
1
+ {"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../../src/generated/zeus/const.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAC,GAAG,CAm0B5C,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAC,GAAG,CA4nC1C,CAAA;AAED,eAAO,MAAM,GAAG;;;;CAIf,CAAA"}
@@ -41,12 +41,17 @@ export const AllTypesProps = {
41
41
  RiskLevel: "enum",
42
42
  LanguageTag: "enum",
43
43
  PresetSource: "enum",
44
+ FollowUpMode: "enum",
45
+ PresetFollowUpMessageInput: {
46
+ mode: "FollowUpMode"
47
+ },
44
48
  CreatePresetInput: {
45
49
  category: "PresetCategory",
46
50
  costTier: "CostTier",
47
51
  riskLevel: "RiskLevel",
48
52
  source: "PresetSource",
49
53
  languageTags: "LanguageTag",
54
+ followUpMessages: "PresetFollowUpMessageInput",
50
55
  scope: "PresetScope"
51
56
  },
52
57
  UpdatePresetInput: {
@@ -54,6 +59,7 @@ export const AllTypesProps = {
54
59
  costTier: "CostTier",
55
60
  riskLevel: "RiskLevel",
56
61
  languageTags: "LanguageTag",
62
+ followUpMessages: "PresetFollowUpMessageInput",
57
63
  scope: "PresetScope"
58
64
  },
59
65
  AgentMode: "enum",
@@ -399,6 +405,9 @@ export const AllTypesProps = {
399
405
  adminCreateImageBaseModel: {
400
406
  input: "BaseModelCreateInput"
401
407
  },
408
+ adminCreateVideoBaseModel: {
409
+ input: "BaseModelCreateInput"
410
+ },
402
411
  submitLead: {
403
412
  input: "SubmitLeadInput"
404
413
  },
@@ -760,6 +769,10 @@ export const ReturnTypes = {
760
769
  createdAt: "DateTime",
761
770
  updatedAt: "DateTime"
762
771
  },
772
+ PresetFollowUpMessage: {
773
+ content: "String",
774
+ mode: "FollowUpMode"
775
+ },
763
776
  Preset: {
764
777
  id: "ID",
765
778
  teamId: "ID",
@@ -778,6 +791,7 @@ export const ReturnTypes = {
778
791
  goal: "String",
779
792
  intervalMinutes: "Int",
780
793
  languageTags: "LanguageTag",
794
+ followUpMessages: "PresetFollowUpMessage",
781
795
  scope: "PresetScope",
782
796
  createdAt: "DateTime",
783
797
  updatedAt: "DateTime"
@@ -1005,8 +1019,10 @@ export const ReturnTypes = {
1005
1019
  adminBuiltInModels: "UserModel",
1006
1020
  adminBaseModels: "BaseModel",
1007
1021
  adminImageBaseModels: "BaseModel",
1022
+ adminVideoBaseModels: "BaseModel",
1008
1023
  adminOpenRouterCatalog: "OpenRouterModel",
1009
1024
  adminOpenRouterImageCatalog: "OpenRouterModel",
1025
+ adminOpenRouterVideoCatalog: "OpenRouterVideoModel",
1010
1026
  adminOpenRouterModelProviders: "OpenRouterModelProvider",
1011
1027
  adminBillingPlans: "AdminBillingPlan",
1012
1028
  adminBillingPlanCount: "Int",
@@ -1141,6 +1157,7 @@ export const ReturnTypes = {
1141
1157
  adminUpdateBaseModel: "BaseModel",
1142
1158
  adminCreateBaseModel: "BaseModel",
1143
1159
  adminCreateImageBaseModel: "BaseModel",
1160
+ adminCreateVideoBaseModel: "BaseModel",
1144
1161
  submitLead: "Lead",
1145
1162
  adminCreateLead: "Lead",
1146
1163
  adminUpdateLead: "Lead",
@@ -1530,6 +1547,7 @@ export const ReturnTypes = {
1530
1547
  creditCacheReadPer1M: "Int",
1531
1548
  creditCacheWritePer1M: "Int",
1532
1549
  creditPerImage: "Float",
1550
+ creditPerVideoSecond: "Float",
1533
1551
  capabilities: "JSON",
1534
1552
  family: "String",
1535
1553
  enabled: "Boolean",
@@ -1561,6 +1579,18 @@ export const ReturnTypes = {
1561
1579
  outputModalities: "String",
1562
1580
  supportedParameters: "String"
1563
1581
  },
1582
+ OpenRouterVideoModel: {
1583
+ id: "String",
1584
+ name: "String",
1585
+ description: "String",
1586
+ supportedDurations: "Int",
1587
+ supportedResolutions: "String",
1588
+ supportedAspectRatios: "String",
1589
+ supportedSizes: "String",
1590
+ supportedFrameImages: "String",
1591
+ generateAudio: "Boolean",
1592
+ pricingSkus: "JSON"
1593
+ },
1564
1594
  ReleaseAsset: {
1565
1595
  name: "String",
1566
1596
  url: "String"