@pellux/goodvibes-sdk 0.26.1 → 0.26.2

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 (43) hide show
  1. package/dist/_internal/contracts/artifacts/operator-contract.json +34 -7
  2. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +1 -1
  3. package/dist/_internal/contracts/generated/foundation-metadata.js +1 -1
  4. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  5. package/dist/_internal/contracts/generated/operator-contract.js +34 -7
  6. package/dist/_internal/daemon/artifact-upload.d.ts +26 -0
  7. package/dist/_internal/daemon/artifact-upload.d.ts.map +1 -0
  8. package/dist/_internal/daemon/artifact-upload.js +504 -0
  9. package/dist/_internal/daemon/index.d.ts +2 -0
  10. package/dist/_internal/daemon/index.d.ts.map +1 -1
  11. package/dist/_internal/daemon/index.js +1 -0
  12. package/dist/_internal/daemon/knowledge-route-types.d.ts +2 -0
  13. package/dist/_internal/daemon/knowledge-route-types.d.ts.map +1 -1
  14. package/dist/_internal/daemon/knowledge-routes.d.ts.map +1 -1
  15. package/dist/_internal/daemon/knowledge-routes.js +15 -0
  16. package/dist/_internal/daemon/media-routes.d.ts.map +1 -1
  17. package/dist/_internal/daemon/media-routes.js +7 -0
  18. package/dist/_internal/platform/artifacts/store.d.ts +5 -1
  19. package/dist/_internal/platform/artifacts/store.d.ts.map +1 -1
  20. package/dist/_internal/platform/artifacts/store.js +168 -31
  21. package/dist/_internal/platform/artifacts/types.d.ts +12 -0
  22. package/dist/_internal/platform/artifacts/types.d.ts.map +1 -1
  23. package/dist/_internal/platform/config/schema-domain-core.d.ts +3 -0
  24. package/dist/_internal/platform/config/schema-domain-core.d.ts.map +1 -1
  25. package/dist/_internal/platform/config/schema-domain-core.js +10 -0
  26. package/dist/_internal/platform/config/schema-types.d.ts +5 -2
  27. package/dist/_internal/platform/config/schema-types.d.ts.map +1 -1
  28. package/dist/_internal/platform/control-plane/method-catalog-homegraph.d.ts.map +1 -1
  29. package/dist/_internal/platform/control-plane/method-catalog-homegraph.js +6 -1
  30. package/dist/_internal/platform/control-plane/method-catalog-knowledge.d.ts.map +1 -1
  31. package/dist/_internal/platform/control-plane/method-catalog-knowledge.js +5 -1
  32. package/dist/_internal/platform/control-plane/method-catalog-media.d.ts.map +1 -1
  33. package/dist/_internal/platform/control-plane/method-catalog-media.js +5 -1
  34. package/dist/_internal/platform/daemon/http/home-graph-routes.d.ts +2 -0
  35. package/dist/_internal/platform/daemon/http/home-graph-routes.d.ts.map +1 -1
  36. package/dist/_internal/platform/daemon/http/home-graph-routes.js +13 -1
  37. package/dist/_internal/platform/daemon/http/router-route-contexts.d.ts +1 -0
  38. package/dist/_internal/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
  39. package/dist/_internal/platform/daemon/http/router-route-contexts.js +1 -0
  40. package/dist/_internal/platform/daemon/http/router.d.ts.map +1 -1
  41. package/dist/_internal/platform/daemon/http/router.js +2 -0
  42. package/dist/_internal/platform/version.js +1 -1
  43. package/package.json +1 -1
@@ -0,0 +1,504 @@
1
+ // Synced from packages/daemon-sdk/src/artifact-upload.ts
2
+ import { randomUUID } from 'node:crypto';
3
+ import { createWriteStream } from 'node:fs';
4
+ import { mkdtemp, open, rm } from 'node:fs/promises';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ const JSON_FIELD_NAMES = new Set(['metadata', 'target', 'options']);
8
+ const MAX_MULTIPART_FIELD_BYTES = 1024 * 1024;
9
+ export function isJsonContentType(contentType) {
10
+ const lower = (contentType ?? '').split(';')[0]?.trim().toLowerCase() ?? '';
11
+ return lower === '' || lower === 'application/json' || lower.endsWith('+json');
12
+ }
13
+ export function isArtifactUploadRequest(req) {
14
+ return !isJsonContentType(req.headers.get('content-type'));
15
+ }
16
+ export async function createArtifactFromUploadRequest(artifactStore, req) {
17
+ const contentType = req.headers.get('content-type') ?? '';
18
+ if (contentType.toLowerCase().includes('multipart/form-data')) {
19
+ return createArtifactFromMultipart(artifactStore, req);
20
+ }
21
+ return createArtifactFromRawBody(artifactStore, req);
22
+ }
23
+ function parseUploadField(name, value) {
24
+ const trimmed = value.trim();
25
+ if (JSON_FIELD_NAMES.has(name)) {
26
+ return parseJsonField(trimmed, name);
27
+ }
28
+ if (name === 'tags') {
29
+ if (trimmed.startsWith('[')) {
30
+ const parsed = parseJsonField(trimmed, name);
31
+ return Array.isArray(parsed) ? parsed.filter((entry) => typeof entry === 'string') : [];
32
+ }
33
+ return trimmed.split(',').map((entry) => entry.trim()).filter(Boolean);
34
+ }
35
+ if (name === 'allowPrivateHosts')
36
+ return trimmed === 'true' || trimmed === '1' || trimmed === 'yes';
37
+ if (name === 'retentionMs') {
38
+ const parsed = Number(trimmed);
39
+ return Number.isFinite(parsed) ? parsed : undefined;
40
+ }
41
+ return value;
42
+ }
43
+ function parseJsonField(value, fieldName) {
44
+ if (!value)
45
+ return {};
46
+ try {
47
+ return JSON.parse(value);
48
+ }
49
+ catch {
50
+ throw new Error(`Invalid JSON in multipart field ${fieldName}.`);
51
+ }
52
+ }
53
+ function readStringField(fields, key) {
54
+ const value = fields[key];
55
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
56
+ }
57
+ function readNumberField(fields, key) {
58
+ const value = fields[key];
59
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
60
+ }
61
+ function readMetadata(fields) {
62
+ const metadata = fields.metadata;
63
+ return typeof metadata === 'object' && metadata !== null && !Array.isArray(metadata)
64
+ ? metadata
65
+ : {};
66
+ }
67
+ function readArtifactId(artifact) {
68
+ if (typeof artifact === 'object' && artifact !== null) {
69
+ const id = artifact.id;
70
+ if (typeof id === 'string' && id.trim().length > 0)
71
+ return id;
72
+ }
73
+ return Response.json({ error: 'Artifact store returned an artifact without an id.' }, { status: 500 });
74
+ }
75
+ function isFileLike(value) {
76
+ return typeof value === 'object'
77
+ && value !== null
78
+ && typeof value.stream === 'function'
79
+ && typeof value.arrayBuffer === 'function';
80
+ }
81
+ async function createArtifactFromMultipart(artifactStore, req) {
82
+ if (req.body)
83
+ return createArtifactFromStreamingMultipart(artifactStore, req);
84
+ let form;
85
+ try {
86
+ form = await req.formData();
87
+ }
88
+ catch {
89
+ return Response.json({ error: 'Invalid multipart upload.' }, { status: 400 });
90
+ }
91
+ const fields = {};
92
+ let file = null;
93
+ for (const [name, value] of form.entries()) {
94
+ if (typeof value === 'string') {
95
+ try {
96
+ const parsed = parseUploadField(name, value);
97
+ if (parsed !== undefined)
98
+ fields[name] = parsed;
99
+ }
100
+ catch (error) {
101
+ return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
102
+ }
103
+ continue;
104
+ }
105
+ if (!file && isFileLike(value)) {
106
+ file = value;
107
+ }
108
+ }
109
+ if (!file)
110
+ return Response.json({ error: 'Multipart upload requires a file field.' }, { status: 400 });
111
+ const artifact = await createArtifactFromStream(artifactStore, {
112
+ stream: file.stream(),
113
+ fields,
114
+ filename: readStringField(fields, 'filename') ?? file.name,
115
+ mimeType: readStringField(fields, 'mimeType') ?? file.type,
116
+ sizeBytes: typeof file.size === 'number' ? file.size : undefined,
117
+ });
118
+ const artifactId = readArtifactId(artifact);
119
+ return artifactId instanceof Response ? artifactId : { artifact, artifactId, fields };
120
+ }
121
+ async function createArtifactFromStreamingMultipart(artifactStore, req) {
122
+ let spooled = null;
123
+ try {
124
+ spooled = await spoolMultipartUpload(req, artifactStore.getMaxBytes?.());
125
+ const artifact = await createArtifactFromStream(artifactStore, {
126
+ stream: readFileChunks(spooled.filePath),
127
+ fields: spooled.fields,
128
+ filename: readStringField(spooled.fields, 'filename') ?? spooled.filename,
129
+ mimeType: readStringField(spooled.fields, 'mimeType') ?? spooled.mimeType,
130
+ sizeBytes: spooled.sizeBytes,
131
+ });
132
+ const artifactId = readArtifactId(artifact);
133
+ return artifactId instanceof Response ? artifactId : { artifact, artifactId, fields: spooled.fields };
134
+ }
135
+ catch (error) {
136
+ return Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 });
137
+ }
138
+ finally {
139
+ await spooled?.cleanup();
140
+ }
141
+ }
142
+ async function createArtifactFromRawBody(artifactStore, req) {
143
+ if (!req.body)
144
+ return Response.json({ error: 'Raw artifact upload requires a request body.' }, { status: 400 });
145
+ const url = new URL(req.url);
146
+ const fields = readFieldsFromSearchParams(url.searchParams);
147
+ const contentType = req.headers.get('content-type')?.split(';')[0]?.trim();
148
+ const artifact = await createArtifactFromStream(artifactStore, {
149
+ stream: req.body,
150
+ fields,
151
+ filename: readStringField(fields, 'filename')
152
+ ?? req.headers.get('x-goodvibes-filename')?.trim()
153
+ ?? filenameFromContentDisposition(req.headers.get('content-disposition')),
154
+ mimeType: readStringField(fields, 'mimeType') ?? contentType ?? undefined,
155
+ sizeBytes: readContentLength(req),
156
+ });
157
+ const artifactId = readArtifactId(artifact);
158
+ return artifactId instanceof Response ? artifactId : { artifact, artifactId, fields };
159
+ }
160
+ async function* readFileChunks(path) {
161
+ const handle = await open(path, 'r');
162
+ const buffer = Buffer.allocUnsafe(64 * 1024);
163
+ try {
164
+ for (;;) {
165
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, null);
166
+ if (bytesRead === 0)
167
+ break;
168
+ yield buffer.subarray(0, bytesRead);
169
+ }
170
+ }
171
+ finally {
172
+ await handle.close();
173
+ }
174
+ }
175
+ function readFieldsFromSearchParams(params) {
176
+ const fields = {};
177
+ for (const [name, value] of params.entries()) {
178
+ try {
179
+ const parsed = parseUploadField(name, value);
180
+ if (parsed !== undefined)
181
+ fields[name] = parsed;
182
+ }
183
+ catch {
184
+ fields[name] = value;
185
+ }
186
+ }
187
+ return fields;
188
+ }
189
+ function readContentLength(req) {
190
+ const parsed = Number(req.headers.get('content-length') ?? NaN);
191
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
192
+ }
193
+ function filenameFromContentDisposition(header) {
194
+ if (!header)
195
+ return undefined;
196
+ const match = header.match(/filename\*?=(?:UTF-8''|")?([^";]+)/i);
197
+ if (!match?.[1])
198
+ return undefined;
199
+ try {
200
+ return decodeURIComponent(match[1].replace(/^"|"$/g, ''));
201
+ }
202
+ catch {
203
+ return match[1].replace(/^"|"$/g, '');
204
+ }
205
+ }
206
+ function multipartBoundary(contentType) {
207
+ const match = contentType.match(/(?:^|;)\s*boundary=(?:"([^"]+)"|([^;]+))/i);
208
+ const boundary = match?.[1] ?? match?.[2];
209
+ return boundary && boundary.trim().length > 0 ? boundary.trim() : null;
210
+ }
211
+ function decodeHeaderValue(value) {
212
+ const unquoted = value.trim().replace(/^"|"$/g, '');
213
+ try {
214
+ return decodeURIComponent(unquoted.replace(/^UTF-8''/i, ''));
215
+ }
216
+ catch {
217
+ return unquoted;
218
+ }
219
+ }
220
+ function parseMultipartPartHeaders(headerText) {
221
+ const headers = new Map();
222
+ for (const line of headerText.split('\r\n')) {
223
+ const separator = line.indexOf(':');
224
+ if (separator < 0)
225
+ continue;
226
+ headers.set(line.slice(0, separator).trim().toLowerCase(), line.slice(separator + 1).trim());
227
+ }
228
+ const disposition = headers.get('content-disposition') ?? '';
229
+ const output = {};
230
+ for (const segment of disposition.split(';').slice(1)) {
231
+ const [rawKey, ...rawValue] = segment.split('=');
232
+ const key = rawKey?.trim().toLowerCase();
233
+ const value = rawValue.join('=');
234
+ if (!key || !value)
235
+ continue;
236
+ if (key === 'name')
237
+ output.name = decodeHeaderValue(value);
238
+ if (key === 'filename' || key === 'filename*')
239
+ output.filename = decodeHeaderValue(value);
240
+ }
241
+ const contentType = headers.get('content-type');
242
+ if (contentType)
243
+ output.contentType = contentType.split(';')[0]?.trim();
244
+ return output;
245
+ }
246
+ async function waitForWriterDrain(writer) {
247
+ await new Promise((resolve, reject) => {
248
+ const cleanup = () => {
249
+ writer.off('drain', onDrain);
250
+ writer.off('error', onError);
251
+ };
252
+ const onDrain = () => {
253
+ cleanup();
254
+ resolve();
255
+ };
256
+ const onError = (error) => {
257
+ cleanup();
258
+ reject(error);
259
+ };
260
+ writer.once('drain', onDrain);
261
+ writer.once('error', onError);
262
+ });
263
+ }
264
+ async function finishWriter(writer) {
265
+ await new Promise((resolve, reject) => {
266
+ const cleanup = () => {
267
+ writer.off('finish', onFinish);
268
+ writer.off('error', onError);
269
+ };
270
+ const onFinish = () => {
271
+ cleanup();
272
+ resolve();
273
+ };
274
+ const onError = (error) => {
275
+ cleanup();
276
+ reject(error);
277
+ };
278
+ writer.once('finish', onFinish);
279
+ writer.once('error', onError);
280
+ writer.end();
281
+ });
282
+ }
283
+ async function spoolMultipartUpload(req, maxFileBytes) {
284
+ const boundary = multipartBoundary(req.headers.get('content-type') ?? '');
285
+ if (!boundary)
286
+ throw new Error('Multipart upload is missing a boundary.');
287
+ if (!req.body)
288
+ throw new Error('Multipart upload requires a request body.');
289
+ const tempDir = await mkdtemp(join(tmpdir(), 'goodvibes-upload-'));
290
+ const filePath = join(tempDir, `${randomUUID()}.upload`);
291
+ const fields = {};
292
+ const firstBoundary = Buffer.from(`--${boundary}`);
293
+ const bodyBoundary = Buffer.from(`\r\n--${boundary}`);
294
+ const headerSeparator = Buffer.from('\r\n\r\n');
295
+ const reader = req.body.getReader();
296
+ let buffer = Buffer.alloc(0);
297
+ let fileSeen = false;
298
+ let filename;
299
+ let mimeType;
300
+ let sizeBytes = 0;
301
+ const readMore = async () => {
302
+ const { done, value } = await reader.read();
303
+ if (done)
304
+ return false;
305
+ buffer = Buffer.concat([buffer, Buffer.from(value)]);
306
+ return true;
307
+ };
308
+ const consumeBoundarySuffix = async () => {
309
+ while (buffer.length < 2) {
310
+ if (!await readMore())
311
+ throw new Error('Unexpected end of multipart body.');
312
+ }
313
+ if (buffer.subarray(0, 2).toString() === '--') {
314
+ buffer = buffer.subarray(2);
315
+ return 'done';
316
+ }
317
+ if (buffer.subarray(0, 2).toString() === '\r\n') {
318
+ buffer = buffer.subarray(2);
319
+ return 'next';
320
+ }
321
+ throw new Error('Invalid multipart boundary terminator.');
322
+ };
323
+ const consumeInitialBoundary = async () => {
324
+ for (;;) {
325
+ const index = buffer.indexOf(firstBoundary);
326
+ if (index >= 0) {
327
+ buffer = buffer.subarray(index + firstBoundary.length);
328
+ return consumeBoundarySuffix();
329
+ }
330
+ if (!await readMore())
331
+ throw new Error('Invalid multipart upload.');
332
+ const readIndex = buffer.indexOf(firstBoundary);
333
+ if (readIndex >= 0) {
334
+ buffer = buffer.subarray(readIndex + firstBoundary.length);
335
+ return consumeBoundarySuffix();
336
+ }
337
+ if (buffer.length > firstBoundary.length * 2) {
338
+ buffer = buffer.subarray(buffer.length - firstBoundary.length * 2);
339
+ }
340
+ }
341
+ };
342
+ const readHeaders = async () => {
343
+ for (;;) {
344
+ const index = buffer.indexOf(headerSeparator);
345
+ if (index >= 0) {
346
+ const headerText = buffer.subarray(0, index).toString('utf8');
347
+ buffer = buffer.subarray(index + headerSeparator.length);
348
+ return parseMultipartPartHeaders(headerText);
349
+ }
350
+ if (!await readMore())
351
+ throw new Error('Unexpected end of multipart headers.');
352
+ if (buffer.length > MAX_MULTIPART_FIELD_BYTES)
353
+ throw new Error('Multipart part headers are too large.');
354
+ }
355
+ };
356
+ const readPart = async (onChunk) => {
357
+ const keepBytes = bodyBoundary.length - 1;
358
+ for (;;) {
359
+ const index = buffer.indexOf(bodyBoundary);
360
+ if (index >= 0) {
361
+ if (index > 0)
362
+ await onChunk(buffer.subarray(0, index));
363
+ buffer = buffer.subarray(index + bodyBoundary.length);
364
+ return consumeBoundarySuffix();
365
+ }
366
+ if (buffer.length > keepBytes) {
367
+ await onChunk(buffer.subarray(0, buffer.length - keepBytes));
368
+ buffer = buffer.subarray(buffer.length - keepBytes);
369
+ }
370
+ if (!await readMore())
371
+ throw new Error('Unexpected end of multipart part.');
372
+ }
373
+ };
374
+ const readFieldPart = async (name) => {
375
+ const chunks = [];
376
+ let fieldBytes = 0;
377
+ const state = await readPart(async (chunk) => {
378
+ fieldBytes += chunk.byteLength;
379
+ if (fieldBytes > MAX_MULTIPART_FIELD_BYTES)
380
+ throw new Error(`Multipart field ${name} is too large.`);
381
+ chunks.push(chunk);
382
+ });
383
+ const parsed = parseUploadField(name, Buffer.concat(chunks).toString('utf8'));
384
+ if (parsed !== undefined)
385
+ fields[name] = parsed;
386
+ return state;
387
+ };
388
+ const readFilePart = async (headers) => {
389
+ const writer = createWriteStream(filePath, { flags: 'wx' });
390
+ try {
391
+ const state = await readPart(async (chunk) => {
392
+ sizeBytes += chunk.byteLength;
393
+ if (typeof maxFileBytes === 'number' && sizeBytes > maxFileBytes) {
394
+ throw new Error(`Artifact exceeds the ${maxFileBytes}-byte limit.`);
395
+ }
396
+ if (!writer.write(chunk))
397
+ await waitForWriterDrain(writer);
398
+ });
399
+ await finishWriter(writer);
400
+ fileSeen = true;
401
+ filename = headers.filename;
402
+ mimeType = headers.contentType;
403
+ return state;
404
+ }
405
+ catch (error) {
406
+ writer.destroy();
407
+ throw error;
408
+ }
409
+ };
410
+ try {
411
+ for (let state = await consumeInitialBoundary(); state !== 'done';) {
412
+ const headers = await readHeaders();
413
+ if (headers.filename !== undefined && !fileSeen) {
414
+ state = await readFilePart(headers);
415
+ }
416
+ else if (headers.filename !== undefined) {
417
+ state = await readPart(async () => { });
418
+ }
419
+ else if (headers.name) {
420
+ state = await readFieldPart(headers.name);
421
+ }
422
+ else {
423
+ state = await readPart(async () => { });
424
+ }
425
+ }
426
+ if (!fileSeen)
427
+ throw new Error('Multipart upload requires a file field.');
428
+ return {
429
+ filePath,
430
+ ...(filename ? { filename } : {}),
431
+ ...(mimeType ? { mimeType } : {}),
432
+ sizeBytes,
433
+ fields,
434
+ cleanup: async () => {
435
+ await rm(tempDir, { recursive: true, force: true });
436
+ },
437
+ };
438
+ }
439
+ catch (error) {
440
+ await rm(tempDir, { recursive: true, force: true });
441
+ throw error;
442
+ }
443
+ }
444
+ async function createArtifactFromStream(artifactStore, input) {
445
+ const base = {
446
+ ...(readStringField(input.fields, 'kind') ? { kind: readStringField(input.fields, 'kind') } : {}),
447
+ ...(input.mimeType ? { mimeType: input.mimeType } : {}),
448
+ ...(input.filename ? { filename: input.filename } : {}),
449
+ ...(readStringField(input.fields, 'sourceUri') ? { sourceUri: readStringField(input.fields, 'sourceUri') } : {}),
450
+ ...(typeof input.sizeBytes === 'number' ? { sizeBytes: input.sizeBytes } : {}),
451
+ ...(typeof readNumberField(input.fields, 'retentionMs') === 'number' ? { retentionMs: readNumberField(input.fields, 'retentionMs') } : {}),
452
+ acquisitionMode: 'inline-data',
453
+ fetchMode: 'not-applicable',
454
+ metadata: readMetadata(input.fields),
455
+ };
456
+ if (artifactStore.createFromStream) {
457
+ return artifactStore.createFromStream({
458
+ stream: input.stream,
459
+ ...base,
460
+ });
461
+ }
462
+ const buffer = await bufferUploadStream(input.stream);
463
+ return artifactStore.create({
464
+ ...base,
465
+ dataBase64: buffer.toString('base64'),
466
+ });
467
+ }
468
+ function isWebReadableStream(stream) {
469
+ return typeof stream.getReader === 'function';
470
+ }
471
+ function isAsyncUploadIterable(stream) {
472
+ return typeof stream[Symbol.asyncIterator] === 'function';
473
+ }
474
+ async function* iterateUploadStream(stream) {
475
+ if (isWebReadableStream(stream)) {
476
+ const reader = stream.getReader();
477
+ try {
478
+ for (;;) {
479
+ const { done, value } = await reader.read();
480
+ if (done)
481
+ break;
482
+ if (value)
483
+ yield value;
484
+ }
485
+ }
486
+ finally {
487
+ reader.releaseLock();
488
+ }
489
+ return;
490
+ }
491
+ if (isAsyncUploadIterable(stream)) {
492
+ yield* stream;
493
+ return;
494
+ }
495
+ for (const chunk of stream)
496
+ yield chunk;
497
+ }
498
+ async function bufferUploadStream(stream) {
499
+ const chunks = [];
500
+ for await (const chunk of iterateUploadStream(stream)) {
501
+ chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : Buffer.from(chunk));
502
+ }
503
+ return Buffer.concat(chunks);
504
+ }
@@ -15,6 +15,8 @@ export type { ChannelAccountRegistryLike, DaemonIntegrationRouteContext, Integra
15
15
  export type { ApprovalBrokerLike, AutomationDeliveryGuarantee, AutomationRouteBindingKind, AutomationSessionPolicy, AutomationSurfaceKind, AutomationThreadPolicy, ConfigManagerLike as DaemonSystemConfigManagerLike, DaemonApiClientKind, DaemonSystemRouteContext, PlatformServiceManagerLike, RouteBindingManagerLike, WatcherKind, WatcherRegistryLike, WorkspaceSwapManagerLike, } from './system-route-types.js';
16
16
  export type { AuthenticatedPrincipalLike, AutomationScheduleDefinition, DaemonKnowledgeRouteContext, KnowledgeGraphqlAccessLike, KnowledgeGraphqlResultLike, KnowledgeGraphqlServiceLike, KnowledgePacketDetail, KnowledgeProjectionTargetKind, KnowledgeServiceLike, } from './knowledge-route-types.js';
17
17
  export type { ArtifactKind, DaemonMediaRouteContext, FetchExtractMode, MediaArtifact, MediaProviderRegistryLike, MultimodalAnalysisResult, MultimodalDetail, MultimodalServiceLike, VoiceAudioArtifact, VoiceServiceLike, WebSearchSafeSearch, WebSearchServiceLike, WebSearchTimeRange, WebSearchVerbosity, } from './media-route-types.js';
18
+ export { createArtifactFromUploadRequest, isArtifactUploadRequest, isJsonContentType, } from './artifact-upload.js';
19
+ export type { ArtifactStoreUploadLike, ArtifactUploadFieldMap, ArtifactUploadResult, } from './artifact-upload.js';
18
20
  export { createDaemonControlRouteHandlers } from './control-routes.js';
19
21
  export { createDaemonTelemetryRouteHandlers } from './telemetry-routes.js';
20
22
  export { createDaemonChannelRouteHandlers } from './channel-routes.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/index.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export { dispatchRemoteRoutes } from './remote.js';
6
6
  export { dispatchDaemonApiRoutes } from './api-router.js';
7
7
  export { buildMissingScopeBody, resolveAuthenticatedPrincipal, resolvePrivateHostFetchOptions, } from './http-policy.js';
8
8
  export { isJsonRecord, missingScopes, readChannelConversationKind, readChannelLifecycleAction, scopeMatches, } from './route-helpers.js';
9
+ export { createArtifactFromUploadRequest, isArtifactUploadRequest, isJsonContentType, } from './artifact-upload.js';
9
10
  export { createDaemonControlRouteHandlers } from './control-routes.js';
10
11
  export { createDaemonTelemetryRouteHandlers } from './telemetry-routes.js';
11
12
  export { createDaemonChannelRouteHandlers } from './channel-routes.js';
@@ -1,3 +1,4 @@
1
+ import type { ArtifactStoreUploadLike } from './artifact-upload.js';
1
2
  export type AutomationScheduleDefinition = unknown;
2
3
  export type KnowledgeProjectionTargetKind = 'overview' | 'bundle' | 'source' | 'node' | 'issue';
3
4
  export type KnowledgeUsageKind = string;
@@ -97,6 +98,7 @@ export interface KnowledgeServiceLike {
97
98
  }): Promise<unknown>;
98
99
  }
99
100
  export interface DaemonKnowledgeRouteContext {
101
+ readonly artifactStore: ArtifactStoreUploadLike;
100
102
  readonly configManager: {
101
103
  get(key: string): unknown;
102
104
  };
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-route-types.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/knowledge-route-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-route-types.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/knowledge-route-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-routes.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/knowledge-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAO3D,OAAO,KAAK,EAEV,2BAA2B,EAM5B,MAAM,4BAA4B,CAAC;AAIpC,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,2BAA2B,GACnC,IAAI,CACL,sBAAsB,EACpB,oBAAoB,GACpB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,wBAAwB,GACxB,uBAAuB,GACvB,6BAA6B,GAC7B,+BAA+B,GAC/B,2BAA2B,GAC3B,yBAAyB,GACzB,mBAAmB,GACnB,wBAAwB,GACxB,uBAAuB,GACvB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,8BAA8B,GAC9B,kBAAkB,GAClB,iBAAiB,GACjB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,wBAAwB,GACxB,6BAA6B,GAC7B,iCAAiC,GACjC,8BAA8B,GAC9B,yBAAyB,GACzB,8BAA8B,GAC9B,qBAAqB,GACrB,qBAAqB,GACrB,8BAA8B,GAC9B,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,GACtB,2BAA2B,GAC3B,yBAAyB,GACzB,iCAAiC,GACjC,+BAA+B,GAC/B,oCAAoC,GACpC,yBAAyB,CAC5B,CAwIA"}
1
+ {"version":3,"file":"knowledge-routes.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/knowledge-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAQ3D,OAAO,KAAK,EAEV,2BAA2B,EAM5B,MAAM,4BAA4B,CAAC;AAIpC,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,2BAA2B,GACnC,IAAI,CACL,sBAAsB,EACpB,oBAAoB,GACpB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,GAClB,wBAAwB,GACxB,uBAAuB,GACvB,6BAA6B,GAC7B,+BAA+B,GAC/B,2BAA2B,GAC3B,yBAAyB,GACzB,mBAAmB,GACnB,wBAAwB,GACxB,uBAAuB,GACvB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,8BAA8B,GAC9B,kBAAkB,GAClB,iBAAiB,GACjB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,wBAAwB,GACxB,6BAA6B,GAC7B,iCAAiC,GACjC,8BAA8B,GAC9B,yBAAyB,GACzB,8BAA8B,GAC9B,qBAAqB,GACrB,qBAAqB,GACrB,8BAA8B,GAC9B,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,GACtB,2BAA2B,GAC3B,yBAAyB,GACzB,iCAAiC,GACjC,+BAA+B,GAC/B,oCAAoC,GACpC,yBAAyB,CAC5B,CAwIA"}
@@ -1,6 +1,7 @@
1
1
  import { buildMissingScopeBody, resolvePrivateHostFetchOptions, } from './http-policy.js';
2
2
  import { GoodVibesSdkError, DaemonErrorCategory } from '../errors/index.js';
3
3
  import { jsonErrorResponse, summarizeErrorForRecord } from './error-response.js';
4
+ import { createArtifactFromUploadRequest, isArtifactUploadRequest } from './artifact-upload.js';
4
5
  export function createDaemonKnowledgeRouteHandlers(context) {
5
6
  return {
6
7
  getKnowledgeStatus: async () => Response.json(await context.knowledgeService.getStatus()),
@@ -325,6 +326,20 @@ async function handleKnowledgeIngestArtifact(context, request) {
325
326
  const admin = context.requireAdmin(request);
326
327
  if (admin)
327
328
  return admin;
329
+ if (isArtifactUploadRequest(request)) {
330
+ const uploaded = await createArtifactFromUploadRequest(context.artifactStore, request);
331
+ if (uploaded instanceof Response)
332
+ return uploaded;
333
+ try {
334
+ return Response.json(await context.knowledgeService.ingestArtifact({
335
+ ...uploaded.fields,
336
+ artifactId: uploaded.artifactId,
337
+ }), { status: 201 });
338
+ }
339
+ catch (error) {
340
+ return jsonErrorResponse(error, { status: 400 });
341
+ }
342
+ }
328
343
  const body = await context.parseJsonBody(request);
329
344
  if (body instanceof Response)
330
345
  return body;
@@ -1 +1 @@
1
- {"version":3,"file":"media-routes.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/media-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAI3D,OAAO,KAAK,EAEV,uBAAuB,EAUxB,MAAM,wBAAwB,CAAC;AA2BhC,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,uBAAuB,GAC/B,IAAI,CACL,sBAAsB,EACpB,gBAAgB,GAChB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,cAAc,GACd,0BAA0B,GAC1B,uBAAuB,GACvB,eAAe,GACf,cAAc,GACd,cAAc,GACd,aAAa,GACb,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,uBAAuB,GACvB,sBAAsB,GACtB,yBAAyB,CAC5B,CAgCA"}
1
+ {"version":3,"file":"media-routes.d.ts","sourceRoot":"","sources":["../../../src/_internal/daemon/media-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAK3D,OAAO,KAAK,EAEV,uBAAuB,EAUxB,MAAM,wBAAwB,CAAC;AA2BhC,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,uBAAuB,GAC/B,IAAI,CACL,sBAAsB,EACpB,gBAAgB,GAChB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,cAAc,GACd,0BAA0B,GAC1B,uBAAuB,GACvB,eAAe,GACf,cAAc,GACd,cAAc,GACd,aAAa,GACb,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,uBAAuB,GACvB,sBAAsB,GACtB,yBAAyB,CAC5B,CAgCA"}
@@ -1,6 +1,7 @@
1
1
  import { resolvePrivateHostFetchOptions } from './http-policy.js';
2
2
  import { jsonErrorResponse } from './error-response.js';
3
3
  import { DaemonErrorCategory } from '../errors/index.js';
4
+ import { createArtifactFromUploadRequest, isArtifactUploadRequest } from './artifact-upload.js';
4
5
  function readErrorMessage(error) {
5
6
  if (typeof error === 'string')
6
7
  return error;
@@ -233,6 +234,12 @@ async function handleMediaAnalyze(context, req) {
233
234
  }));
234
235
  }
235
236
  async function handleArtifactCreate(context, req) {
237
+ if (isArtifactUploadRequest(req)) {
238
+ const uploaded = await createArtifactFromUploadRequest(context.artifactStore, req);
239
+ if (uploaded instanceof Response)
240
+ return uploaded;
241
+ return Response.json({ artifact: uploaded.artifact }, { status: 201 });
242
+ }
236
243
  const body = await context.parseJsonBody(req);
237
244
  if (body instanceof Response)
238
245
  return body;
@@ -1,5 +1,5 @@
1
1
  import type { ConfigKey } from '../config/schema.js';
2
- import type { ArtifactAttachment, ArtifactCreateInput, ArtifactDescriptor, ArtifactRecord, ArtifactReference } from './types.js';
2
+ import type { ArtifactAttachment, ArtifactCreateInput, ArtifactDescriptor, ArtifactRecord, ArtifactReference, ArtifactStreamCreateInput } from './types.js';
3
3
  export interface ArtifactStoreConfig {
4
4
  readonly rootDir?: string;
5
5
  readonly configManager?: {
@@ -24,6 +24,7 @@ export declare class ArtifactStore {
24
24
  private readonly allowPrivateHostFetches;
25
25
  constructor(config: ArtifactStoreConfig);
26
26
  get storagePath(): string;
27
+ getMaxBytes(): number;
27
28
  list(limit?: number): ArtifactDescriptor[];
28
29
  get(id: string): ArtifactDescriptor | null;
29
30
  getRecord(id: string): ArtifactRecord | null;
@@ -32,6 +33,9 @@ export declare class ArtifactStore {
32
33
  buffer: Buffer;
33
34
  }>;
34
35
  create(input: ArtifactCreateInput): Promise<ArtifactDescriptor>;
36
+ createFromStream(input: ArtifactStreamCreateInput): Promise<ArtifactDescriptor>;
37
+ private writeResolvedArtifact;
38
+ private writeStreamContent;
35
39
  toAttachment(reference: ArtifactReference, options?: {
36
40
  readonly contentUrl?: string;
37
41
  readonly includeBase64IfSmallerThan?: number;