@kb-labs/core-platform 1.0.0

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 (56) hide show
  1. package/README.md +108 -0
  2. package/dist/adapters/index.cjs +26 -0
  3. package/dist/adapters/index.cjs.map +1 -0
  4. package/dist/adapters/index.d.cts +125 -0
  5. package/dist/adapters/index.d.ts +125 -0
  6. package/dist/adapters/index.js +21 -0
  7. package/dist/adapters/index.js.map +1 -0
  8. package/dist/artifacts-BUghvkUU.d.cts +273 -0
  9. package/dist/artifacts-Bd-1UVTw.d.ts +273 -0
  10. package/dist/artifacts-DrVnkLzu.d.cts +1374 -0
  11. package/dist/artifacts-DrVnkLzu.d.ts +1374 -0
  12. package/dist/core/index.cjs +4 -0
  13. package/dist/core/index.cjs.map +1 -0
  14. package/dist/core/index.d.cts +2 -0
  15. package/dist/core/index.d.ts +2 -0
  16. package/dist/core/index.js +3 -0
  17. package/dist/core/index.js.map +1 -0
  18. package/dist/database-DGV6a1nj.d.cts +427 -0
  19. package/dist/database-DGV6a1nj.d.ts +427 -0
  20. package/dist/index.cjs +1405 -0
  21. package/dist/index.cjs.map +1 -0
  22. package/dist/index.d.cts +579 -0
  23. package/dist/index.d.ts +579 -0
  24. package/dist/index.js +1381 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/log-reader-BVohbSMB.d.cts +314 -0
  27. package/dist/log-reader-uOHBLBax.d.ts +314 -0
  28. package/dist/noop/adapters/index.cjs +656 -0
  29. package/dist/noop/adapters/index.cjs.map +1 -0
  30. package/dist/noop/adapters/index.d.cts +71 -0
  31. package/dist/noop/adapters/index.d.ts +71 -0
  32. package/dist/noop/adapters/index.js +637 -0
  33. package/dist/noop/adapters/index.js.map +1 -0
  34. package/dist/noop/core/index.cjs +217 -0
  35. package/dist/noop/core/index.cjs.map +1 -0
  36. package/dist/noop/core/index.d.cts +94 -0
  37. package/dist/noop/core/index.d.ts +94 -0
  38. package/dist/noop/core/index.js +212 -0
  39. package/dist/noop/core/index.js.map +1 -0
  40. package/dist/noop/index.cjs +806 -0
  41. package/dist/noop/index.cjs.map +1 -0
  42. package/dist/noop/index.d.cts +36 -0
  43. package/dist/noop/index.d.ts +36 -0
  44. package/dist/noop/index.js +787 -0
  45. package/dist/noop/index.js.map +1 -0
  46. package/dist/resources-DaufJFad.d.cts +419 -0
  47. package/dist/resources-DaufJFad.d.ts +419 -0
  48. package/dist/serializable/index.cjs +162 -0
  49. package/dist/serializable/index.cjs.map +1 -0
  50. package/dist/serializable/index.d.cts +352 -0
  51. package/dist/serializable/index.d.ts +352 -0
  52. package/dist/serializable/index.js +152 -0
  53. package/dist/serializable/index.js.map +1 -0
  54. package/dist/snapshot-provider--COac4P-.d.ts +923 -0
  55. package/dist/snapshot-provider-nE9wuc1C.d.cts +923 -0
  56. package/package.json +92 -0
@@ -0,0 +1,212 @@
1
+ // src/noop/core/workflow.ts
2
+ var NoOpWorkflowEngine = class {
3
+ async execute(_workflowId, _input, _options) {
4
+ throw new Error(
5
+ "Workflow engine not configured. Initialize platform with core-runtime."
6
+ );
7
+ }
8
+ async getStatus(_runId) {
9
+ throw new Error(
10
+ "Workflow engine not configured. Initialize platform with core-runtime."
11
+ );
12
+ }
13
+ async cancel(_runId) {
14
+ throw new Error(
15
+ "Workflow engine not configured. Initialize platform with core-runtime."
16
+ );
17
+ }
18
+ async retry(_runId, _fromStep) {
19
+ throw new Error(
20
+ "Workflow engine not configured. Initialize platform with core-runtime."
21
+ );
22
+ }
23
+ async list(_filter) {
24
+ throw new Error(
25
+ "Workflow engine not configured. Initialize platform with core-runtime."
26
+ );
27
+ }
28
+ };
29
+
30
+ // src/noop/core/jobs.ts
31
+ var NoOpJobScheduler = class {
32
+ jobs = /* @__PURE__ */ new Map();
33
+ idCounter = 0;
34
+ async submit(job) {
35
+ const id = `noop-job-${++this.idCounter}`;
36
+ const handle = {
37
+ id,
38
+ type: job.type,
39
+ tenantId: job.tenantId ?? "default",
40
+ status: "completed",
41
+ createdAt: /* @__PURE__ */ new Date(),
42
+ startedAt: /* @__PURE__ */ new Date(),
43
+ completedAt: /* @__PURE__ */ new Date()
44
+ };
45
+ this.jobs.set(id, handle);
46
+ return handle;
47
+ }
48
+ async schedule(job, _schedule) {
49
+ return this.submit(job);
50
+ }
51
+ async cancel(jobId) {
52
+ const job = this.jobs.get(jobId);
53
+ if (!job) {
54
+ return false;
55
+ }
56
+ job.status = "cancelled";
57
+ return true;
58
+ }
59
+ async getStatus(jobId) {
60
+ return this.jobs.get(jobId) ?? null;
61
+ }
62
+ async list(filter) {
63
+ let results = Array.from(this.jobs.values());
64
+ if (filter?.type) {
65
+ results = results.filter((j) => j.type === filter.type);
66
+ }
67
+ if (filter?.status) {
68
+ results = results.filter((j) => j.status === filter.status);
69
+ }
70
+ if (filter?.tenantId) {
71
+ results = results.filter((j) => j.tenantId === filter.tenantId);
72
+ }
73
+ return results;
74
+ }
75
+ /**
76
+ * Clear all jobs (for testing).
77
+ */
78
+ clear() {
79
+ this.jobs.clear();
80
+ this.idCounter = 0;
81
+ }
82
+ };
83
+
84
+ // src/noop/core/cron.ts
85
+ var NoOpCronManager = class {
86
+ cronJobs = /* @__PURE__ */ new Map();
87
+ register(id, schedule, handler) {
88
+ this.cronJobs.set(id, {
89
+ id,
90
+ schedule,
91
+ handler,
92
+ status: "active",
93
+ runCount: 0
94
+ });
95
+ }
96
+ unregister(id) {
97
+ this.cronJobs.delete(id);
98
+ }
99
+ list() {
100
+ return Array.from(this.cronJobs.values()).map((entry) => ({
101
+ id: entry.id,
102
+ schedule: entry.schedule,
103
+ status: entry.status,
104
+ lastRun: entry.lastRun,
105
+ nextRun: void 0,
106
+ // NoOp doesn't calculate next run
107
+ runCount: entry.runCount
108
+ }));
109
+ }
110
+ async trigger(id) {
111
+ const entry = this.cronJobs.get(id);
112
+ if (!entry) {
113
+ throw new Error(`Cron job not found: ${id}`);
114
+ }
115
+ if (entry.status === "paused") {
116
+ throw new Error(`Cron job is paused: ${id}`);
117
+ }
118
+ const now = /* @__PURE__ */ new Date();
119
+ await entry.handler({
120
+ jobId: id,
121
+ scheduledAt: now,
122
+ executedAt: now,
123
+ runCount: entry.runCount + 1
124
+ });
125
+ entry.lastRun = now;
126
+ entry.runCount++;
127
+ }
128
+ pause(id) {
129
+ const entry = this.cronJobs.get(id);
130
+ if (entry) {
131
+ entry.status = "paused";
132
+ }
133
+ }
134
+ resume(id) {
135
+ const entry = this.cronJobs.get(id);
136
+ if (entry) {
137
+ entry.status = "active";
138
+ }
139
+ }
140
+ /**
141
+ * Clear all cron jobs (for testing).
142
+ */
143
+ clear() {
144
+ this.cronJobs.clear();
145
+ }
146
+ };
147
+
148
+ // src/noop/core/resources.ts
149
+ var UNLIMITED_QUOTAS = {
150
+ maxConcurrentWorkflows: Number.MAX_SAFE_INTEGER,
151
+ maxConcurrentJobs: Number.MAX_SAFE_INTEGER,
152
+ maxQueuedJobs: Number.MAX_SAFE_INTEGER,
153
+ apiRequestsPerMinute: Number.MAX_SAFE_INTEGER,
154
+ llmTokensPerDay: Number.MAX_SAFE_INTEGER,
155
+ storageBytes: Number.MAX_SAFE_INTEGER
156
+ };
157
+ var NoOpResourceManager = class {
158
+ quotas = /* @__PURE__ */ new Map();
159
+ slots = /* @__PURE__ */ new Map();
160
+ idCounter = 0;
161
+ async acquireSlot(resource, tenantId, timeout) {
162
+ const slot = {
163
+ id: `noop-slot-${++this.idCounter}`,
164
+ resource,
165
+ tenantId,
166
+ acquiredAt: /* @__PURE__ */ new Date(),
167
+ expiresAt: timeout ? new Date(Date.now() + timeout) : void 0
168
+ };
169
+ this.slots.set(slot.id, slot);
170
+ return slot;
171
+ }
172
+ async releaseSlot(slot) {
173
+ this.slots.delete(slot.id);
174
+ }
175
+ async getAvailability(resource, tenantId) {
176
+ const usedSlots = Array.from(this.slots.values()).filter(
177
+ (s) => s.resource === resource && (!tenantId || s.tenantId === tenantId)
178
+ );
179
+ return {
180
+ resource,
181
+ total: Number.MAX_SAFE_INTEGER,
182
+ used: usedSlots.length,
183
+ available: Number.MAX_SAFE_INTEGER,
184
+ queueLength: 0
185
+ };
186
+ }
187
+ async setQuota(tenantId, quotas) {
188
+ const existing = this.quotas.get(tenantId) ?? { ...UNLIMITED_QUOTAS };
189
+ this.quotas.set(tenantId, { ...existing, ...quotas });
190
+ }
191
+ async getQuota(tenantId) {
192
+ return this.quotas.get(tenantId) ?? { ...UNLIMITED_QUOTAS };
193
+ }
194
+ /**
195
+ * Get the current number of active slots (for testing).
196
+ */
197
+ get activeSlotCount() {
198
+ return this.slots.size;
199
+ }
200
+ /**
201
+ * Clear all slots and quotas (for testing).
202
+ */
203
+ clear() {
204
+ this.slots.clear();
205
+ this.quotas.clear();
206
+ this.idCounter = 0;
207
+ }
208
+ };
209
+
210
+ export { NoOpCronManager, NoOpJobScheduler, NoOpResourceManager, NoOpWorkflowEngine };
211
+ //# sourceMappingURL=index.js.map
212
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/noop/core/workflow.ts","../../../src/noop/core/jobs.ts","../../../src/noop/core/cron.ts","../../../src/noop/core/resources.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/core-platform/noop/core/workflow\n * NoOp workflow engine implementation.\n */\n\nimport type {\n IWorkflowEngine,\n WorkflowOptions,\n WorkflowRun,\n WorkflowFilter,\n} from '../../core/workflow.js';\n\n/**\n * NoOp workflow engine that throws errors.\n * Workflows are critical core features - use real implementation.\n */\nexport class NoOpWorkflowEngine implements IWorkflowEngine {\n async execute(\n _workflowId: string,\n _input: unknown,\n _options?: WorkflowOptions\n ): Promise<WorkflowRun> {\n throw new Error(\n 'Workflow engine not configured. Initialize platform with core-runtime.'\n );\n }\n\n async getStatus(_runId: string): Promise<WorkflowRun | null> {\n throw new Error(\n 'Workflow engine not configured. Initialize platform with core-runtime.'\n );\n }\n\n async cancel(_runId: string): Promise<void> {\n throw new Error(\n 'Workflow engine not configured. Initialize platform with core-runtime.'\n );\n }\n\n async retry(_runId: string, _fromStep?: string): Promise<WorkflowRun> {\n throw new Error(\n 'Workflow engine not configured. Initialize platform with core-runtime.'\n );\n }\n\n async list(_filter?: WorkflowFilter): Promise<WorkflowRun[]> {\n throw new Error(\n 'Workflow engine not configured. Initialize platform with core-runtime.'\n );\n }\n}\n","/**\n * @module @kb-labs/core-platform/noop/core/jobs\n * NoOp job scheduler implementation.\n */\n\nimport type {\n IJobScheduler,\n JobDefinition,\n JobHandle,\n JobFilter,\n CronExpression,\n} from '../../core/jobs.js';\n\n/**\n * NoOp job scheduler that executes jobs synchronously.\n * Useful for testing without background processing.\n */\nexport class NoOpJobScheduler implements IJobScheduler {\n private jobs = new Map<string, JobHandle>();\n private idCounter = 0;\n\n async submit(job: JobDefinition): Promise<JobHandle> {\n const id = `noop-job-${++this.idCounter}`;\n const handle: JobHandle = {\n id,\n type: job.type,\n tenantId: job.tenantId ?? 'default',\n status: 'completed',\n createdAt: new Date(),\n startedAt: new Date(),\n completedAt: new Date(),\n };\n\n this.jobs.set(id, handle);\n return handle;\n }\n\n async schedule(\n job: JobDefinition,\n _schedule: CronExpression | Date\n ): Promise<JobHandle> {\n // In NoOp mode, scheduled jobs are just submitted immediately\n return this.submit(job);\n }\n\n async cancel(jobId: string): Promise<boolean> {\n const job = this.jobs.get(jobId);\n if (!job) {\n return false;\n }\n\n job.status = 'cancelled';\n return true;\n }\n\n async getStatus(jobId: string): Promise<JobHandle | null> {\n return this.jobs.get(jobId) ?? null;\n }\n\n async list(filter?: JobFilter): Promise<JobHandle[]> {\n let results = Array.from(this.jobs.values());\n\n if (filter?.type) {\n results = results.filter((j) => j.type === filter.type);\n }\n if (filter?.status) {\n results = results.filter((j) => j.status === filter.status);\n }\n if (filter?.tenantId) {\n results = results.filter((j) => j.tenantId === filter.tenantId);\n }\n\n return results;\n }\n\n /**\n * Clear all jobs (for testing).\n */\n clear(): void {\n this.jobs.clear();\n this.idCounter = 0;\n }\n}\n","/**\n * @module @kb-labs/core-platform/noop/core/cron\n * NoOp cron manager implementation.\n */\n\nimport type {\n ICronManager,\n CronJob,\n CronHandler,\n} from '../../core/cron.js';\nimport type { CronExpression } from '../../core/jobs.js';\n\ninterface CronEntry {\n id: string;\n schedule: CronExpression;\n handler: CronHandler;\n status: 'active' | 'paused';\n lastRun?: Date;\n runCount: number;\n}\n\n/**\n * NoOp cron manager that stores registrations but doesn't schedule.\n * Use trigger() to manually execute cron jobs in tests.\n */\nexport class NoOpCronManager implements ICronManager {\n private cronJobs = new Map<string, CronEntry>();\n\n register(id: string, schedule: CronExpression, handler: CronHandler): void {\n this.cronJobs.set(id, {\n id,\n schedule,\n handler,\n status: 'active',\n runCount: 0,\n });\n }\n\n unregister(id: string): void {\n this.cronJobs.delete(id);\n }\n\n list(): CronJob[] {\n return Array.from(this.cronJobs.values()).map((entry) => ({\n id: entry.id,\n schedule: entry.schedule,\n status: entry.status,\n lastRun: entry.lastRun,\n nextRun: undefined, // NoOp doesn't calculate next run\n runCount: entry.runCount,\n }));\n }\n\n async trigger(id: string): Promise<void> {\n const entry = this.cronJobs.get(id);\n if (!entry) {\n throw new Error(`Cron job not found: ${id}`);\n }\n\n if (entry.status === 'paused') {\n throw new Error(`Cron job is paused: ${id}`);\n }\n\n const now = new Date();\n\n // Execute the handler\n await entry.handler({\n jobId: id,\n scheduledAt: now,\n executedAt: now,\n runCount: entry.runCount + 1,\n });\n\n entry.lastRun = now;\n entry.runCount++;\n }\n\n pause(id: string): void {\n const entry = this.cronJobs.get(id);\n if (entry) {\n entry.status = 'paused';\n }\n }\n\n resume(id: string): void {\n const entry = this.cronJobs.get(id);\n if (entry) {\n entry.status = 'active';\n }\n }\n\n /**\n * Clear all cron jobs (for testing).\n */\n clear(): void {\n this.cronJobs.clear();\n }\n}\n","/**\n * @module @kb-labs/core-platform/noop/core/resources\n * NoOp resource manager implementation.\n */\n\nimport type {\n IResourceManager,\n ResourceType,\n ResourceSlot,\n ResourceAvailability,\n TenantQuotas,\n} from '../../core/resources.js';\n\n/**\n * Default unlimited quotas for NoOp mode.\n */\nconst UNLIMITED_QUOTAS: TenantQuotas = {\n maxConcurrentWorkflows: Number.MAX_SAFE_INTEGER,\n maxConcurrentJobs: Number.MAX_SAFE_INTEGER,\n maxQueuedJobs: Number.MAX_SAFE_INTEGER,\n apiRequestsPerMinute: Number.MAX_SAFE_INTEGER,\n llmTokensPerDay: Number.MAX_SAFE_INTEGER,\n storageBytes: Number.MAX_SAFE_INTEGER,\n};\n\n/**\n * NoOp resource manager that always allows resource acquisition.\n * No actual quota enforcement - useful for testing.\n */\nexport class NoOpResourceManager implements IResourceManager {\n private quotas = new Map<string, TenantQuotas>();\n private slots = new Map<string, ResourceSlot>();\n private idCounter = 0;\n\n async acquireSlot(\n resource: ResourceType,\n tenantId: string,\n timeout?: number\n ): Promise<ResourceSlot | null> {\n const slot: ResourceSlot = {\n id: `noop-slot-${++this.idCounter}`,\n resource,\n tenantId,\n acquiredAt: new Date(),\n expiresAt: timeout ? new Date(Date.now() + timeout) : undefined,\n };\n\n this.slots.set(slot.id, slot);\n return slot;\n }\n\n async releaseSlot(slot: ResourceSlot): Promise<void> {\n this.slots.delete(slot.id);\n }\n\n async getAvailability(\n resource: ResourceType,\n tenantId?: string\n ): Promise<ResourceAvailability> {\n const usedSlots = Array.from(this.slots.values()).filter(\n (s) =>\n s.resource === resource && (!tenantId || s.tenantId === tenantId)\n );\n\n return {\n resource,\n total: Number.MAX_SAFE_INTEGER,\n used: usedSlots.length,\n available: Number.MAX_SAFE_INTEGER,\n queueLength: 0,\n };\n }\n\n async setQuota(tenantId: string, quotas: Partial<TenantQuotas>): Promise<void> {\n const existing = this.quotas.get(tenantId) ?? { ...UNLIMITED_QUOTAS };\n this.quotas.set(tenantId, { ...existing, ...quotas });\n }\n\n async getQuota(tenantId: string): Promise<TenantQuotas> {\n return this.quotas.get(tenantId) ?? { ...UNLIMITED_QUOTAS };\n }\n\n /**\n * Get the current number of active slots (for testing).\n */\n get activeSlotCount(): number {\n return this.slots.size;\n }\n\n /**\n * Clear all slots and quotas (for testing).\n */\n clear(): void {\n this.slots.clear();\n this.quotas.clear();\n this.idCounter = 0;\n }\n}\n"]}