@inf-minds/jobs 0.0.1
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.
- package/dist/artifact-cleanup.d.ts +30 -0
- package/dist/artifact-cleanup.d.ts.map +1 -0
- package/dist/artifact-cleanup.js +44 -0
- package/dist/artifact-cleanup.js.map +1 -0
- package/dist/artifact-manager.d.ts +41 -0
- package/dist/artifact-manager.d.ts.map +1 -0
- package/dist/artifact-manager.js +254 -0
- package/dist/artifact-manager.js.map +1 -0
- package/dist/artifact-materializer.d.ts +21 -0
- package/dist/artifact-materializer.d.ts.map +1 -0
- package/dist/artifact-materializer.js +33 -0
- package/dist/artifact-materializer.js.map +1 -0
- package/dist/artifact-router.d.ts +131 -0
- package/dist/artifact-router.d.ts.map +1 -0
- package/dist/artifact-router.js +4 -0
- package/dist/artifact-router.js.map +1 -0
- package/dist/default-artifact-router.d.ts +26 -0
- package/dist/default-artifact-router.d.ts.map +1 -0
- package/dist/default-artifact-router.js +125 -0
- package/dist/default-artifact-router.js.map +1 -0
- package/dist/event-appender.d.ts +23 -0
- package/dist/event-appender.d.ts.map +1 -0
- package/dist/event-appender.js +120 -0
- package/dist/event-appender.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/job-context.d.ts +58 -0
- package/dist/job-context.d.ts.map +1 -0
- package/dist/job-context.js +133 -0
- package/dist/job-context.js.map +1 -0
- package/dist/job-manager.d.ts +23 -0
- package/dist/job-manager.d.ts.map +1 -0
- package/dist/job-manager.js +145 -0
- package/dist/job-manager.js.map +1 -0
- package/dist/job-runner.d.ts +32 -0
- package/dist/job-runner.d.ts.map +1 -0
- package/dist/job-runner.js +187 -0
- package/dist/job-runner.js.map +1 -0
- package/dist/job-worker.d.ts +79 -0
- package/dist/job-worker.d.ts.map +1 -0
- package/dist/job-worker.js +134 -0
- package/dist/job-worker.js.map +1 -0
- package/dist/mind-worker.d.ts +63 -0
- package/dist/mind-worker.d.ts.map +1 -0
- package/dist/mind-worker.js +99 -0
- package/dist/mind-worker.js.map +1 -0
- package/dist/schema.d.ts +1143 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +225 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +434 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +24 -0
- package/dist/types.js.map +1 -0
- package/drizzle/0001_create_jobs_tables.sql +70 -0
- package/drizzle/0002_coordinator_tables.sql +78 -0
- package/drizzle/0003_artifacts.sql +24 -0
- package/drizzle/0004_kernel.sql +28 -0
- package/drizzle/0005_artifact_routing.sql +29 -0
- package/package.json +48 -0
- package/src/artifact-cleanup.ts +85 -0
- package/src/artifact-manager.ts +346 -0
- package/src/artifact-materializer.ts +64 -0
- package/src/artifact-router.ts +151 -0
- package/src/default-artifact-router.ts +186 -0
- package/src/event-appender.ts +158 -0
- package/src/index.ts +136 -0
- package/src/job-context.ts +195 -0
- package/src/job-manager.ts +179 -0
- package/src/job-runner.ts +260 -0
- package/src/job-worker.ts +252 -0
- package/src/mind-worker.ts +152 -0
- package/src/schema.ts +290 -0
- package/src/types.ts +542 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { StorageProvider } from '@inf-minds/storage';
|
|
2
|
+
export interface CleanupDb {
|
|
3
|
+
select(): {
|
|
4
|
+
from(table: unknown): {
|
|
5
|
+
where(condition: unknown): Promise<ExpiredArtifact[]>;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
delete(table: unknown): {
|
|
9
|
+
where(condition: unknown): Promise<unknown>;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
interface ExpiredArtifact {
|
|
13
|
+
id: string;
|
|
14
|
+
storageType: 'postgres' | 'external';
|
|
15
|
+
externalKey: string | null;
|
|
16
|
+
}
|
|
17
|
+
export interface CleanupOptions {
|
|
18
|
+
db: CleanupDb;
|
|
19
|
+
externalStorage: Pick<StorageProvider, 'delete'>;
|
|
20
|
+
batchSize?: number;
|
|
21
|
+
table?: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface CleanupResult {
|
|
24
|
+
postgresDeleted: number;
|
|
25
|
+
externalDeleted: number;
|
|
26
|
+
errors: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare function cleanupExpiredArtifacts(options: CleanupOptions): Promise<CleanupResult>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=artifact-cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-cleanup.d.ts","sourceRoot":"","sources":["../src/artifact-cleanup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAI1D,MAAM,WAAW,SAAS;IACxB,MAAM,IAAI;QACR,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG;YACpB,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;SACvD,CAAC;KACH,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG;QACtB,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC7C,CAAC;CACH;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC;IACd,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA6CxB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// ABOUTME: TTL-based artifact cleanup
|
|
2
|
+
// ABOUTME: Removes expired artifacts from PostgreSQL and external storage
|
|
3
|
+
import { jobArtifacts } from './schema.js';
|
|
4
|
+
import { lte } from 'drizzle-orm';
|
|
5
|
+
export async function cleanupExpiredArtifacts(options) {
|
|
6
|
+
const { db, externalStorage, batchSize = 100, table = jobArtifacts } = options;
|
|
7
|
+
const result = {
|
|
8
|
+
postgresDeleted: 0,
|
|
9
|
+
externalDeleted: 0,
|
|
10
|
+
errors: [],
|
|
11
|
+
};
|
|
12
|
+
// Find expired artifacts (WHERE expires_at <= NOW())
|
|
13
|
+
const expired = await db
|
|
14
|
+
.select()
|
|
15
|
+
.from(table)
|
|
16
|
+
.where(lte(table.expiresAt, new Date()));
|
|
17
|
+
// Apply batch size limit
|
|
18
|
+
const batch = expired.slice(0, batchSize);
|
|
19
|
+
if (batch.length === 0) {
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
// Delete external storage objects first
|
|
23
|
+
for (const artifact of batch) {
|
|
24
|
+
if (artifact.storageType === 'external' && artifact.externalKey) {
|
|
25
|
+
try {
|
|
26
|
+
await externalStorage.delete(artifact.externalKey);
|
|
27
|
+
result.externalDeleted++;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
result.errors.push(`Failed to delete ${artifact.externalKey}: ${error instanceof Error ? error.message : String(error)}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (artifact.storageType === 'postgres') {
|
|
34
|
+
result.postgresDeleted++;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Delete from database
|
|
38
|
+
// Note: In real Drizzle usage, this would use inArray(table.id, ids)
|
|
39
|
+
// but for now we use a simplified approach
|
|
40
|
+
const ids = batch.map((a) => a.id);
|
|
41
|
+
await db.delete(table).where({ ids });
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=artifact-cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-cleanup.js","sourceRoot":"","sources":["../src/artifact-cleanup.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,0EAA0E;AAG1E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAgClC,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAuB;IAEvB,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,GAAG,GAAG,EAAE,KAAK,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAE/E,MAAM,MAAM,GAAkB;QAC5B,eAAe,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;QAClB,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,qDAAqD;IACrD,MAAM,OAAO,GAAG,MAAM,EAAE;SACrB,MAAM,EAAE;SACR,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,GAAG,CAAE,KAAa,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpD,yBAAyB;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wCAAwC;IACxC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,WAAW,KAAK,UAAU,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YAChE,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACnD,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,oBAAoB,QAAQ,CAAC,WAAW,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtG,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAC/C,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,qEAAqE;IACrE,2CAA2C;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { StorageProvider } from '@inf-minds/storage';
|
|
2
|
+
import type { ArtifactRef, ArtifactContent, SaveArtifactOptions } from './types.js';
|
|
3
|
+
export interface ArtifactManagerDb {
|
|
4
|
+
insert(table: unknown): {
|
|
5
|
+
values(record: unknown): {
|
|
6
|
+
returning(): Promise<unknown[]>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
select(): {
|
|
10
|
+
from(table: unknown): {
|
|
11
|
+
where(condition: unknown): Promise<unknown[]>;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
delete(table: unknown): {
|
|
15
|
+
where(condition: unknown): Promise<unknown>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface ArtifactManagerOptions {
|
|
19
|
+
db: ArtifactManagerDb;
|
|
20
|
+
postgresStorage: StorageProvider;
|
|
21
|
+
externalStorage: StorageProvider;
|
|
22
|
+
table?: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface ArtifactManager {
|
|
25
|
+
save(jobId: string, name: string, content: string | Buffer, options: SaveArtifactOptions): Promise<ArtifactRef>;
|
|
26
|
+
load(jobId: string, name: string): Promise<ArtifactContent | null>;
|
|
27
|
+
list(jobId: string): Promise<ArtifactRef[]>;
|
|
28
|
+
getSignedUrl(jobId: string, name: string, expiresIn?: number): Promise<string | null>;
|
|
29
|
+
delete(jobId: string, name: string): Promise<void>;
|
|
30
|
+
deleteAll(jobId: string): Promise<void>;
|
|
31
|
+
/** List all artifacts for a kernel session */
|
|
32
|
+
listBySession(sessionId: string): Promise<ArtifactRef[]>;
|
|
33
|
+
/** List artifacts for a specific node in a session */
|
|
34
|
+
listByNode(sessionId: string, nodeId: string): Promise<ArtifactRef[]>;
|
|
35
|
+
/** List artifacts by visibility scope in a session */
|
|
36
|
+
listByVisibility(sessionId: string, visibility: string): Promise<ArtifactRef[]>;
|
|
37
|
+
/** List artifacts published to specific channels in a session */
|
|
38
|
+
listByChannels(sessionId: string, channels: string[]): Promise<ArtifactRef[]>;
|
|
39
|
+
}
|
|
40
|
+
export declare function createArtifactManager(options: ArtifactManagerOptions): ArtifactManager;
|
|
41
|
+
//# sourceMappingURL=artifact-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-manager.d.ts","sourceRoot":"","sources":["../src/artifact-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIpF,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG;QACtB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG;YACvB,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;SACjC,CAAC;KACH,CAAC;IACF,MAAM,IAAI;QACR,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG;YACpB,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;SAC/C,CAAC;KACH,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG;QACtB,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC7C,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,iBAAiB,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAChH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGxC,8CAA8C;IAC9C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,sDAAsD;IACtD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACtE,sDAAsD;IACtD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAChF,iEAAiE;IACjE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC/E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAsStF"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
// ABOUTME: ArtifactManager for job artifact CRUD operations
|
|
2
|
+
// ABOUTME: Routes artifacts to appropriate storage backend
|
|
3
|
+
import { detectMimeType, getStorageType } from '@inf-minds/storage';
|
|
4
|
+
import { jobArtifacts } from './schema.js';
|
|
5
|
+
import { and, eq, sql } from 'drizzle-orm';
|
|
6
|
+
export function createArtifactManager(options) {
|
|
7
|
+
const { db, postgresStorage, externalStorage } = options;
|
|
8
|
+
const table = options.table ?? jobArtifacts;
|
|
9
|
+
return {
|
|
10
|
+
async save(jobId, name, content, options) {
|
|
11
|
+
// Determine MIME type
|
|
12
|
+
const mimeType = options.mimeType ?? detectMimeType(name);
|
|
13
|
+
// Determine storage type based on MIME type
|
|
14
|
+
const storageType = getStorageType(mimeType);
|
|
15
|
+
// Select appropriate storage backend
|
|
16
|
+
const storage = storageType === 'postgres' ? postgresStorage : externalStorage;
|
|
17
|
+
// Build storage key
|
|
18
|
+
const storageKey = storageType === 'postgres' ? name : `${jobId}/${name}`;
|
|
19
|
+
// Store content in appropriate backend
|
|
20
|
+
const putResult = await storage.put(storageKey, content, {
|
|
21
|
+
mimeType,
|
|
22
|
+
metadata: options.metadata,
|
|
23
|
+
});
|
|
24
|
+
// Calculate expiry timestamp
|
|
25
|
+
let expiresAt = null;
|
|
26
|
+
if (options.expiresIn) {
|
|
27
|
+
expiresAt = new Date(Date.now() + options.expiresIn * 1000);
|
|
28
|
+
}
|
|
29
|
+
// Build artifact record
|
|
30
|
+
const artifactRecord = {
|
|
31
|
+
jobId,
|
|
32
|
+
name,
|
|
33
|
+
mimeType,
|
|
34
|
+
storageType,
|
|
35
|
+
content: storageType === 'postgres' ? (typeof content === 'string' ? { text: content } : content) : null,
|
|
36
|
+
externalKey: storageType === 'external' ? putResult.key : null,
|
|
37
|
+
sizeBytes: putResult.sizeBytes,
|
|
38
|
+
metadata: options.metadata ?? {},
|
|
39
|
+
expiresAt,
|
|
40
|
+
};
|
|
41
|
+
// Insert into database
|
|
42
|
+
const [inserted] = await db
|
|
43
|
+
.insert(table)
|
|
44
|
+
.values(artifactRecord)
|
|
45
|
+
.returning();
|
|
46
|
+
if (!inserted) {
|
|
47
|
+
throw new Error('Failed to insert artifact record');
|
|
48
|
+
}
|
|
49
|
+
const artifact = inserted;
|
|
50
|
+
// Return artifact reference
|
|
51
|
+
return {
|
|
52
|
+
name: artifact.name,
|
|
53
|
+
mimeType: artifact.mimeType,
|
|
54
|
+
sizeBytes: artifact.sizeBytes,
|
|
55
|
+
storageType: artifact.storageType,
|
|
56
|
+
metadata: artifact.metadata ?? {},
|
|
57
|
+
createdAt: artifact.createdAt,
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
async load(jobId, name) {
|
|
61
|
+
// Query database for artifact record
|
|
62
|
+
const results = await db
|
|
63
|
+
.select()
|
|
64
|
+
.from(table)
|
|
65
|
+
.where(and(eq(jobArtifacts.jobId, jobId), eq(jobArtifacts.name, name)));
|
|
66
|
+
if (results.length === 0) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
const artifact = results[0];
|
|
70
|
+
// Fetch content from appropriate storage
|
|
71
|
+
let content;
|
|
72
|
+
if (artifact.storageType === 'postgres') {
|
|
73
|
+
const storageResult = await postgresStorage.get(artifact.name);
|
|
74
|
+
if (!storageResult) {
|
|
75
|
+
throw new Error(`Artifact content not found in postgres storage: ${artifact.name}`);
|
|
76
|
+
}
|
|
77
|
+
content = storageResult.content;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
if (!artifact.externalKey) {
|
|
81
|
+
throw new Error(`External key missing for artifact: ${artifact.name}`);
|
|
82
|
+
}
|
|
83
|
+
const storageResult = await externalStorage.get(artifact.externalKey);
|
|
84
|
+
if (!storageResult) {
|
|
85
|
+
throw new Error(`Artifact content not found in external storage: ${artifact.externalKey}`);
|
|
86
|
+
}
|
|
87
|
+
content = storageResult.content;
|
|
88
|
+
}
|
|
89
|
+
// Return artifact with content
|
|
90
|
+
return {
|
|
91
|
+
name: artifact.name,
|
|
92
|
+
mimeType: artifact.mimeType,
|
|
93
|
+
sizeBytes: artifact.sizeBytes,
|
|
94
|
+
storageType: artifact.storageType,
|
|
95
|
+
metadata: artifact.metadata ?? {},
|
|
96
|
+
createdAt: artifact.createdAt,
|
|
97
|
+
content,
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
async list(jobId) {
|
|
101
|
+
// Query database for all artifacts for this job
|
|
102
|
+
const results = await db
|
|
103
|
+
.select()
|
|
104
|
+
.from(table)
|
|
105
|
+
.where(eq(jobArtifacts.jobId, jobId));
|
|
106
|
+
// Map to artifact references
|
|
107
|
+
return results.map((artifact) => {
|
|
108
|
+
const a = artifact;
|
|
109
|
+
return {
|
|
110
|
+
name: a.name,
|
|
111
|
+
mimeType: a.mimeType,
|
|
112
|
+
sizeBytes: a.sizeBytes,
|
|
113
|
+
storageType: a.storageType,
|
|
114
|
+
metadata: a.metadata ?? {},
|
|
115
|
+
createdAt: a.createdAt,
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
},
|
|
119
|
+
async getSignedUrl(jobId, name, expiresIn) {
|
|
120
|
+
// Query database for artifact record
|
|
121
|
+
const results = await db
|
|
122
|
+
.select()
|
|
123
|
+
.from(table)
|
|
124
|
+
.where(and(eq(jobArtifacts.jobId, jobId), eq(jobArtifacts.name, name)));
|
|
125
|
+
if (results.length === 0) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const artifact = results[0];
|
|
129
|
+
// Only external artifacts can have signed URLs
|
|
130
|
+
if (artifact.storageType !== 'external' || !artifact.externalKey) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
// Get signed URL from external storage
|
|
134
|
+
return await externalStorage.getSignedUrl(artifact.externalKey, expiresIn);
|
|
135
|
+
},
|
|
136
|
+
async delete(jobId, name) {
|
|
137
|
+
// Query database for artifact record
|
|
138
|
+
const results = await db
|
|
139
|
+
.select()
|
|
140
|
+
.from(table)
|
|
141
|
+
.where(and(eq(jobArtifacts.jobId, jobId), eq(jobArtifacts.name, name)));
|
|
142
|
+
if (results.length === 0) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const artifact = results[0];
|
|
146
|
+
// Delete from appropriate storage
|
|
147
|
+
if (artifact.storageType === 'postgres') {
|
|
148
|
+
await postgresStorage.delete(artifact.name);
|
|
149
|
+
}
|
|
150
|
+
else if (artifact.externalKey) {
|
|
151
|
+
await externalStorage.delete(artifact.externalKey);
|
|
152
|
+
}
|
|
153
|
+
// Delete database record
|
|
154
|
+
await db
|
|
155
|
+
.delete(table)
|
|
156
|
+
.where(and(eq(jobArtifacts.jobId, jobId), eq(jobArtifacts.name, name)));
|
|
157
|
+
},
|
|
158
|
+
async deleteAll(jobId) {
|
|
159
|
+
// Get all artifacts for this job
|
|
160
|
+
const artifacts = await db
|
|
161
|
+
.select()
|
|
162
|
+
.from(table)
|
|
163
|
+
.where(eq(jobArtifacts.jobId, jobId));
|
|
164
|
+
// Delete from storage backends
|
|
165
|
+
for (const artifact of artifacts) {
|
|
166
|
+
const a = artifact;
|
|
167
|
+
if (a.storageType === 'postgres') {
|
|
168
|
+
await postgresStorage.delete(a.name);
|
|
169
|
+
}
|
|
170
|
+
else if (a.externalKey) {
|
|
171
|
+
await externalStorage.delete(a.externalKey);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Delete all database records
|
|
175
|
+
await db
|
|
176
|
+
.delete(table)
|
|
177
|
+
.where(eq(jobArtifacts.jobId, jobId));
|
|
178
|
+
},
|
|
179
|
+
// Session/visibility query implementations
|
|
180
|
+
async listBySession(sessionId) {
|
|
181
|
+
const results = await db
|
|
182
|
+
.select()
|
|
183
|
+
.from(table)
|
|
184
|
+
.where(eq(jobArtifacts.sessionId, sessionId));
|
|
185
|
+
return results.map((artifact) => {
|
|
186
|
+
const a = artifact;
|
|
187
|
+
return {
|
|
188
|
+
name: a.name,
|
|
189
|
+
mimeType: a.mimeType,
|
|
190
|
+
sizeBytes: a.sizeBytes,
|
|
191
|
+
storageType: a.storageType,
|
|
192
|
+
metadata: a.metadata ?? {},
|
|
193
|
+
createdAt: a.createdAt,
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
},
|
|
197
|
+
async listByNode(sessionId, nodeId) {
|
|
198
|
+
const results = await db
|
|
199
|
+
.select()
|
|
200
|
+
.from(table)
|
|
201
|
+
.where(and(eq(jobArtifacts.sessionId, sessionId), eq(jobArtifacts.nodeId, nodeId)));
|
|
202
|
+
return results.map((artifact) => {
|
|
203
|
+
const a = artifact;
|
|
204
|
+
return {
|
|
205
|
+
name: a.name,
|
|
206
|
+
mimeType: a.mimeType,
|
|
207
|
+
sizeBytes: a.sizeBytes,
|
|
208
|
+
storageType: a.storageType,
|
|
209
|
+
metadata: a.metadata ?? {},
|
|
210
|
+
createdAt: a.createdAt,
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
},
|
|
214
|
+
async listByVisibility(sessionId, visibility) {
|
|
215
|
+
const results = await db
|
|
216
|
+
.select()
|
|
217
|
+
.from(table)
|
|
218
|
+
.where(and(eq(jobArtifacts.sessionId, sessionId), eq(jobArtifacts.visibility, visibility)));
|
|
219
|
+
return results.map((artifact) => {
|
|
220
|
+
const a = artifact;
|
|
221
|
+
return {
|
|
222
|
+
name: a.name,
|
|
223
|
+
mimeType: a.mimeType,
|
|
224
|
+
sizeBytes: a.sizeBytes,
|
|
225
|
+
storageType: a.storageType,
|
|
226
|
+
metadata: a.metadata ?? {},
|
|
227
|
+
createdAt: a.createdAt,
|
|
228
|
+
};
|
|
229
|
+
});
|
|
230
|
+
},
|
|
231
|
+
async listByChannels(sessionId, channels) {
|
|
232
|
+
if (channels.length === 0) {
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
// Query for artifacts where channels array overlaps with requested channels
|
|
236
|
+
const results = await db
|
|
237
|
+
.select()
|
|
238
|
+
.from(table)
|
|
239
|
+
.where(and(eq(jobArtifacts.sessionId, sessionId), sql `${jobArtifacts.channels} && ARRAY[${sql.join(channels.map((c) => sql `${c}`), sql `, `)}]::text[]`));
|
|
240
|
+
return results.map((artifact) => {
|
|
241
|
+
const a = artifact;
|
|
242
|
+
return {
|
|
243
|
+
name: a.name,
|
|
244
|
+
mimeType: a.mimeType,
|
|
245
|
+
sizeBytes: a.sizeBytes,
|
|
246
|
+
storageType: a.storageType,
|
|
247
|
+
metadata: a.metadata ?? {},
|
|
248
|
+
createdAt: a.createdAt,
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=artifact-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-manager.js","sourceRoot":"","sources":["../src/artifact-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ArtifactManager } from './artifact-manager.js';
|
|
2
|
+
import type { MaterializedArtifacts } from './job-context.js';
|
|
3
|
+
export interface ArtifactMaterializerDb {
|
|
4
|
+
select(): {
|
|
5
|
+
from(table: unknown): {
|
|
6
|
+
where(condition: unknown): Promise<{
|
|
7
|
+
dependsOnJobId: string;
|
|
8
|
+
}[]>;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface ArtifactMaterializerOptions {
|
|
13
|
+
db: ArtifactMaterializerDb;
|
|
14
|
+
artifactManager: Pick<ArtifactManager, 'list' | 'load'>;
|
|
15
|
+
dependenciesTable?: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface ArtifactMaterializer {
|
|
18
|
+
materialize(jobId: string): Promise<MaterializedArtifacts>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createArtifactMaterializer(options: ArtifactMaterializerOptions): ArtifactMaterializer;
|
|
21
|
+
//# sourceMappingURL=artifact-materializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-materializer.d.ts","sourceRoot":"","sources":["../src/artifact-materializer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,MAAM,IAAI;QACR,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG;YACpB,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;gBAAE,cAAc,EAAE,MAAM,CAAA;aAAE,EAAE,CAAC,CAAC;SAClE,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,sBAAsB,CAAC;IAC3B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACxD,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAC5D;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,2BAA2B,GACnC,oBAAoB,CAoCtB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// ABOUTME: Materializes artifacts from job dependencies
|
|
2
|
+
// ABOUTME: Makes parent job artifacts available via deps/{jobId}/{name} paths
|
|
3
|
+
export function createArtifactMaterializer(options) {
|
|
4
|
+
const { db, artifactManager } = options;
|
|
5
|
+
return {
|
|
6
|
+
async materialize(jobId) {
|
|
7
|
+
const artifacts = new Map();
|
|
8
|
+
// Get job dependencies
|
|
9
|
+
const dependencies = await db.select()
|
|
10
|
+
.from(null)
|
|
11
|
+
.where({ jobId });
|
|
12
|
+
if (dependencies.length === 0) {
|
|
13
|
+
return { artifacts };
|
|
14
|
+
}
|
|
15
|
+
// Load artifacts from each dependency
|
|
16
|
+
for (const dep of dependencies) {
|
|
17
|
+
const parentJobId = dep.dependsOnJobId;
|
|
18
|
+
// List artifacts for parent job
|
|
19
|
+
const parentArtifacts = await artifactManager.list(parentJobId);
|
|
20
|
+
// Load each artifact
|
|
21
|
+
for (const ref of parentArtifacts) {
|
|
22
|
+
const content = await artifactManager.load(parentJobId, ref.name);
|
|
23
|
+
if (content) {
|
|
24
|
+
const path = `deps/${parentJobId}/${ref.name}`;
|
|
25
|
+
artifacts.set(path, content);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return { artifacts };
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=artifact-materializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-materializer.js","sourceRoot":"","sources":["../src/artifact-materializer.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,8EAA8E;AAwB9E,MAAM,UAAU,0BAA0B,CACxC,OAAoC;IAEpC,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAExC,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,KAAa;YAC7B,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;YAErD,uBAAuB;YACvB,MAAM,YAAY,GAAG,MAAO,EAAE,CAAC,MAAc,EAAE;iBAC5C,IAAI,CAAC,IAAI,CAAC;iBACV,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAEpB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,CAAC;YAED,sCAAsC;YACtC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CAAC;gBAEvC,gCAAgC;gBAChC,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAEhE,qBAAqB;gBACrB,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;oBAClC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAClE,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,IAAI,GAAG,QAAQ,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;wBAC/C,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { ArtifactRef, GraphState } from './types.js';
|
|
2
|
+
import type { ArtifactVisibility } from './schema.js';
|
|
3
|
+
/**
|
|
4
|
+
* Graph edge definition (simplified for routing context).
|
|
5
|
+
*/
|
|
6
|
+
export interface GraphEdge {
|
|
7
|
+
/** Source node ID */
|
|
8
|
+
source: string;
|
|
9
|
+
/** Target node ID */
|
|
10
|
+
target: string;
|
|
11
|
+
/** Named channel for artifact routing (optional) */
|
|
12
|
+
channel?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Context provided for artifact routing decisions.
|
|
16
|
+
*/
|
|
17
|
+
export interface RoutingContext {
|
|
18
|
+
/** Kernel session ID (the parent job ID) */
|
|
19
|
+
sessionId: string;
|
|
20
|
+
/** Current node ID in the graph */
|
|
21
|
+
nodeId: string;
|
|
22
|
+
/** Mind ID being executed (e.g., 'researcher', 'coordinator') */
|
|
23
|
+
mindId: string;
|
|
24
|
+
/** The incoming edge that triggered this node (optional for start nodes) */
|
|
25
|
+
edge?: GraphEdge;
|
|
26
|
+
/** Current graph execution state */
|
|
27
|
+
graphState: GraphState;
|
|
28
|
+
/** Account ID for the session */
|
|
29
|
+
accountId: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Hints provided by minds when saving artifacts.
|
|
33
|
+
*/
|
|
34
|
+
export interface VisibilityHints {
|
|
35
|
+
/** Explicit visibility scope override */
|
|
36
|
+
scope?: ArtifactVisibility;
|
|
37
|
+
/** Specific recipient node IDs */
|
|
38
|
+
recipients?: string[];
|
|
39
|
+
/** Named channels to publish to */
|
|
40
|
+
channels?: string[];
|
|
41
|
+
/** Whether this artifact should persist beyond session */
|
|
42
|
+
persistent?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Artifact with routing metadata.
|
|
46
|
+
*/
|
|
47
|
+
export interface RoutedArtifact extends ArtifactRef {
|
|
48
|
+
/** Resolved visibility scope */
|
|
49
|
+
visibility: ArtifactVisibility;
|
|
50
|
+
/** Session this artifact belongs to */
|
|
51
|
+
sessionId: string;
|
|
52
|
+
/** Node that created this artifact */
|
|
53
|
+
nodeId: string;
|
|
54
|
+
/** Channels this artifact is published to */
|
|
55
|
+
channels: string[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Options for resolving input artifacts.
|
|
59
|
+
*/
|
|
60
|
+
export interface ResolveInputOptions {
|
|
61
|
+
/** Filter by visibility scopes */
|
|
62
|
+
visibilities?: ArtifactVisibility[];
|
|
63
|
+
/** Filter by specific channels */
|
|
64
|
+
channels?: string[];
|
|
65
|
+
/** Filter by source node IDs */
|
|
66
|
+
sourceNodes?: string[];
|
|
67
|
+
/** Include artifacts from all completed predecessor nodes */
|
|
68
|
+
includePredecessors?: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Options for routing output artifacts.
|
|
72
|
+
*/
|
|
73
|
+
export interface RouteOutputOptions {
|
|
74
|
+
/** Artifact reference to route */
|
|
75
|
+
artifact: ArtifactRef;
|
|
76
|
+
/** Visibility hints from the mind */
|
|
77
|
+
hints: VisibilityHints;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Interface for artifact routing in kernel sessions.
|
|
81
|
+
*
|
|
82
|
+
* The router is responsible for:
|
|
83
|
+
* 1. Determining which artifacts a node can access as inputs
|
|
84
|
+
* 2. Routing output artifacts with appropriate visibility
|
|
85
|
+
*
|
|
86
|
+
* Implementation is decoupled from storage - the router only
|
|
87
|
+
* handles visibility and routing logic, not persistence.
|
|
88
|
+
*/
|
|
89
|
+
export interface ArtifactRouter {
|
|
90
|
+
/**
|
|
91
|
+
* Resolve which artifacts are available as inputs for a node.
|
|
92
|
+
*
|
|
93
|
+
* This considers:
|
|
94
|
+
* - Artifacts from predecessor nodes (via edges)
|
|
95
|
+
* - Session-visible artifacts
|
|
96
|
+
* - Channel subscriptions
|
|
97
|
+
*
|
|
98
|
+
* @param context - Current routing context
|
|
99
|
+
* @param options - Optional filtering options
|
|
100
|
+
* @returns List of accessible artifact references
|
|
101
|
+
*/
|
|
102
|
+
resolveInputArtifacts(context: RoutingContext, options?: ResolveInputOptions): Promise<ArtifactRef[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Route output artifacts with visibility and channel assignments.
|
|
105
|
+
*
|
|
106
|
+
* This determines:
|
|
107
|
+
* - Final visibility scope (from hints or defaults)
|
|
108
|
+
* - Channel assignments
|
|
109
|
+
* - Session and node attribution
|
|
110
|
+
*
|
|
111
|
+
* @param outputs - Artifacts with visibility hints
|
|
112
|
+
* @param context - Current routing context
|
|
113
|
+
* @returns Routed artifacts with resolved metadata
|
|
114
|
+
*/
|
|
115
|
+
routeOutputArtifacts(outputs: RouteOutputOptions[], context: RoutingContext): Promise<RoutedArtifact[]>;
|
|
116
|
+
/**
|
|
117
|
+
* Get default visibility for a given artifact path.
|
|
118
|
+
*
|
|
119
|
+
* Visibility can be inferred from path patterns:
|
|
120
|
+
* - `/sessions/{s}/nodes/{n}/private/**` → private
|
|
121
|
+
* - `/sessions/{s}/nodes/{n}/outputs/**` → session
|
|
122
|
+
* - `/sessions/{s}/shared/**` → session
|
|
123
|
+
* - `/persistent/**` → persistent
|
|
124
|
+
*
|
|
125
|
+
* @param path - Artifact path
|
|
126
|
+
* @param context - Routing context
|
|
127
|
+
* @returns Default visibility scope
|
|
128
|
+
*/
|
|
129
|
+
getDefaultVisibility(path: string, context: RoutingContext): ArtifactVisibility;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=artifact-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-router.d.ts","sourceRoot":"","sources":["../src/artifact-router.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oCAAoC;IACpC,UAAU,EAAE,UAAU,CAAC;IACvB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,gCAAgC;IAChC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACpC,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,6DAA6D;IAC7D,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,QAAQ,EAAE,WAAW,CAAC;IACtB,qCAAqC;IACrC,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;OAWG;IACH,qBAAqB,CACnB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE1B;;;;;;;;;;;OAWG;IACH,oBAAoB,CAClB,OAAO,EAAE,kBAAkB,EAAE,EAC7B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE7B;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,GACtB,kBAAkB,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-router.js","sourceRoot":"","sources":["../src/artifact-router.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kFAAkF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ArtifactRouter } from './artifact-router.js';
|
|
2
|
+
/**
|
|
3
|
+
* Database interface for artifact routing queries.
|
|
4
|
+
*/
|
|
5
|
+
export interface ArtifactRouterDb {
|
|
6
|
+
select(fields?: unknown): {
|
|
7
|
+
from(table: unknown): {
|
|
8
|
+
where(condition: unknown): Promise<unknown[]>;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Options for creating a DefaultArtifactRouter.
|
|
14
|
+
*/
|
|
15
|
+
export interface DefaultArtifactRouterOptions {
|
|
16
|
+
/** Database client for queries */
|
|
17
|
+
db: ArtifactRouterDb;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Default implementation of ArtifactRouter.
|
|
21
|
+
*
|
|
22
|
+
* Uses path-based visibility inference and queries artifacts
|
|
23
|
+
* from the database based on session, node, and visibility.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createDefaultArtifactRouter(options: DefaultArtifactRouterOptions): ArtifactRouter;
|
|
26
|
+
//# sourceMappingURL=default-artifact-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-artifact-router.d.ts","sourceRoot":"","sources":["../src/default-artifact-router.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,sBAAsB,CAAC;AAG9B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG;QACxB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG;YACpB,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;SAC/C,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,kCAAkC;IAClC,EAAE,EAAE,gBAAgB,CAAC;CACtB;AAcD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAoIhB"}
|