@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.
Files changed (76) hide show
  1. package/dist/artifact-cleanup.d.ts +30 -0
  2. package/dist/artifact-cleanup.d.ts.map +1 -0
  3. package/dist/artifact-cleanup.js +44 -0
  4. package/dist/artifact-cleanup.js.map +1 -0
  5. package/dist/artifact-manager.d.ts +41 -0
  6. package/dist/artifact-manager.d.ts.map +1 -0
  7. package/dist/artifact-manager.js +254 -0
  8. package/dist/artifact-manager.js.map +1 -0
  9. package/dist/artifact-materializer.d.ts +21 -0
  10. package/dist/artifact-materializer.d.ts.map +1 -0
  11. package/dist/artifact-materializer.js +33 -0
  12. package/dist/artifact-materializer.js.map +1 -0
  13. package/dist/artifact-router.d.ts +131 -0
  14. package/dist/artifact-router.d.ts.map +1 -0
  15. package/dist/artifact-router.js +4 -0
  16. package/dist/artifact-router.js.map +1 -0
  17. package/dist/default-artifact-router.d.ts +26 -0
  18. package/dist/default-artifact-router.d.ts.map +1 -0
  19. package/dist/default-artifact-router.js +125 -0
  20. package/dist/default-artifact-router.js.map +1 -0
  21. package/dist/event-appender.d.ts +23 -0
  22. package/dist/event-appender.d.ts.map +1 -0
  23. package/dist/event-appender.js +120 -0
  24. package/dist/event-appender.js.map +1 -0
  25. package/dist/index.d.ts +16 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +28 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/job-context.d.ts +58 -0
  30. package/dist/job-context.d.ts.map +1 -0
  31. package/dist/job-context.js +133 -0
  32. package/dist/job-context.js.map +1 -0
  33. package/dist/job-manager.d.ts +23 -0
  34. package/dist/job-manager.d.ts.map +1 -0
  35. package/dist/job-manager.js +145 -0
  36. package/dist/job-manager.js.map +1 -0
  37. package/dist/job-runner.d.ts +32 -0
  38. package/dist/job-runner.d.ts.map +1 -0
  39. package/dist/job-runner.js +187 -0
  40. package/dist/job-runner.js.map +1 -0
  41. package/dist/job-worker.d.ts +79 -0
  42. package/dist/job-worker.d.ts.map +1 -0
  43. package/dist/job-worker.js +134 -0
  44. package/dist/job-worker.js.map +1 -0
  45. package/dist/mind-worker.d.ts +63 -0
  46. package/dist/mind-worker.d.ts.map +1 -0
  47. package/dist/mind-worker.js +99 -0
  48. package/dist/mind-worker.js.map +1 -0
  49. package/dist/schema.d.ts +1143 -0
  50. package/dist/schema.d.ts.map +1 -0
  51. package/dist/schema.js +225 -0
  52. package/dist/schema.js.map +1 -0
  53. package/dist/types.d.ts +434 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +24 -0
  56. package/dist/types.js.map +1 -0
  57. package/drizzle/0001_create_jobs_tables.sql +70 -0
  58. package/drizzle/0002_coordinator_tables.sql +78 -0
  59. package/drizzle/0003_artifacts.sql +24 -0
  60. package/drizzle/0004_kernel.sql +28 -0
  61. package/drizzle/0005_artifact_routing.sql +29 -0
  62. package/package.json +48 -0
  63. package/src/artifact-cleanup.ts +85 -0
  64. package/src/artifact-manager.ts +346 -0
  65. package/src/artifact-materializer.ts +64 -0
  66. package/src/artifact-router.ts +151 -0
  67. package/src/default-artifact-router.ts +186 -0
  68. package/src/event-appender.ts +158 -0
  69. package/src/index.ts +136 -0
  70. package/src/job-context.ts +195 -0
  71. package/src/job-manager.ts +179 -0
  72. package/src/job-runner.ts +260 -0
  73. package/src/job-worker.ts +252 -0
  74. package/src/mind-worker.ts +152 -0
  75. package/src/schema.ts +290 -0
  76. 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,4 @@
1
+ // ABOUTME: ArtifactRouter interface for kernel artifact visibility and routing
2
+ // ABOUTME: Determines which artifacts nodes can access and how outputs are routed
3
+ export {};
4
+ //# sourceMappingURL=artifact-router.js.map
@@ -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"}