@amaster.ai/pi-storage 0.1.0-beta.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 (73) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +56 -0
  3. package/dist/artifact-stores.d.ts +13 -0
  4. package/dist/artifact-stores.d.ts.map +1 -0
  5. package/dist/artifact-stores.js +84 -0
  6. package/dist/artifact-stores.js.map +1 -0
  7. package/dist/db-migrations.d.ts +12 -0
  8. package/dist/db-migrations.d.ts.map +1 -0
  9. package/dist/db-migrations.js +151 -0
  10. package/dist/db-migrations.js.map +1 -0
  11. package/dist/db-runtime-storage.d.ts +15 -0
  12. package/dist/db-runtime-storage.d.ts.map +1 -0
  13. package/dist/db-runtime-storage.js +1051 -0
  14. package/dist/db-runtime-storage.js.map +1 -0
  15. package/dist/db.d.ts +3 -0
  16. package/dist/db.d.ts.map +1 -0
  17. package/dist/db.js +3 -0
  18. package/dist/db.js.map +1 -0
  19. package/dist/event-stores.d.ts +69 -0
  20. package/dist/event-stores.d.ts.map +1 -0
  21. package/dist/event-stores.js +196 -0
  22. package/dist/event-stores.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +2 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/internal.d.ts +4 -0
  28. package/dist/internal.d.ts.map +1 -0
  29. package/dist/internal.js +4 -0
  30. package/dist/internal.js.map +1 -0
  31. package/dist/json-file.d.ts +4 -0
  32. package/dist/json-file.d.ts.map +1 -0
  33. package/dist/json-file.js +59 -0
  34. package/dist/json-file.js.map +1 -0
  35. package/dist/json.d.ts +5 -0
  36. package/dist/json.d.ts.map +1 -0
  37. package/dist/json.js +5 -0
  38. package/dist/json.js.map +1 -0
  39. package/dist/migration-main.d.ts +2 -0
  40. package/dist/migration-main.d.ts.map +1 -0
  41. package/dist/migration-main.js +12 -0
  42. package/dist/migration-main.js.map +1 -0
  43. package/dist/redis-locks.d.ts +18 -0
  44. package/dist/redis-locks.d.ts.map +1 -0
  45. package/dist/redis-locks.js +76 -0
  46. package/dist/redis-locks.js.map +1 -0
  47. package/dist/runtime-scope.d.ts +2 -0
  48. package/dist/runtime-scope.d.ts.map +1 -0
  49. package/dist/runtime-scope.js +2 -0
  50. package/dist/runtime-scope.js.map +1 -0
  51. package/dist/runtime-storage.d.ts +30 -0
  52. package/dist/runtime-storage.d.ts.map +1 -0
  53. package/dist/runtime-storage.js +60 -0
  54. package/dist/runtime-storage.js.map +1 -0
  55. package/dist/scheduled-task-stores.d.ts +49 -0
  56. package/dist/scheduled-task-stores.d.ts.map +1 -0
  57. package/dist/scheduled-task-stores.js +381 -0
  58. package/dist/scheduled-task-stores.js.map +1 -0
  59. package/dist/scheduler.d.ts +2 -0
  60. package/dist/scheduler.d.ts.map +1 -0
  61. package/dist/scheduler.js +2 -0
  62. package/dist/scheduler.js.map +1 -0
  63. package/dist/session-stores.d.ts +47 -0
  64. package/dist/session-stores.d.ts.map +1 -0
  65. package/dist/session-stores.js +260 -0
  66. package/dist/session-stores.js.map +1 -0
  67. package/dist/subagent-store.d.ts +26 -0
  68. package/dist/subagent-store.d.ts.map +1 -0
  69. package/dist/subagent-store.js +167 -0
  70. package/dist/subagent-store.js.map +1 -0
  71. package/package.json +70 -0
  72. package/prisma/migrations/mysql/20260514113000_init_runtime/migration.sql +351 -0
  73. package/prisma/schema.prisma +351 -0
@@ -0,0 +1,76 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { Redis } from "ioredis";
3
+ const RELEASE_REDIS_LOCK_SCRIPT = `
4
+ if redis.call("GET", KEYS[1]) == ARGV[1] then
5
+ return redis.call("DEL", KEYS[1])
6
+ end
7
+ return 0
8
+ `;
9
+ const EXTEND_LOCK_SCRIPT = `
10
+ if redis.call("GET", KEYS[1]) == ARGV[1] then
11
+ return redis.call("PEXPIRE", KEYS[1], ARGV[2])
12
+ end
13
+ return 0
14
+ `;
15
+ export class RedisLockManager {
16
+ owner;
17
+ redis;
18
+ constructor(redisUrl, owner = `${process.pid}:${randomUUID()}`) {
19
+ this.owner = owner;
20
+ this.redis = new Redis(redisUrl, {
21
+ lazyConnect: true,
22
+ maxRetriesPerRequest: 2,
23
+ enableOfflineQueue: false,
24
+ });
25
+ this.redis.on("error", () => {
26
+ // ioredis also rejects the operation promise; this prevents unhandled error events.
27
+ });
28
+ }
29
+ async ping() {
30
+ if (this.redis.status === "wait") {
31
+ await this.redis.connect();
32
+ }
33
+ await this.redis.ping();
34
+ }
35
+ async acquire(key, ttlMs) {
36
+ if (this.redis.status === "wait") {
37
+ await this.redis.connect();
38
+ }
39
+ const result = await this.redis.set(key, this.owner, "PX", ttlMs, "NX");
40
+ return result === "OK";
41
+ }
42
+ async extend(key, ttlMs) {
43
+ const result = await this.redis.eval(EXTEND_LOCK_SCRIPT, 1, key, this.owner, String(ttlMs));
44
+ return Number(result) === 1;
45
+ }
46
+ async release(key) {
47
+ await this.redis.eval(RELEASE_REDIS_LOCK_SCRIPT, 1, key, this.owner);
48
+ }
49
+ async withLock(input) {
50
+ const startedAt = Date.now();
51
+ const retryMs = input.retryMs ?? 50;
52
+ for (;;) {
53
+ if (await this.acquire(input.key, input.ttlMs)) {
54
+ try {
55
+ return await input.task();
56
+ }
57
+ finally {
58
+ await this.release(input.key);
59
+ }
60
+ }
61
+ if (Date.now() - startedAt >= input.timeoutMs) {
62
+ throw new Error(`Timed out acquiring Redis lock: ${input.key}`);
63
+ }
64
+ await sleep(retryMs);
65
+ }
66
+ }
67
+ async disconnect() {
68
+ await this.redis.quit().catch(() => {
69
+ this.redis.disconnect();
70
+ });
71
+ }
72
+ }
73
+ async function sleep(ms) {
74
+ await new Promise((resolve) => setTimeout(resolve, ms));
75
+ }
76
+ //# sourceMappingURL=redis-locks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-locks.js","sourceRoot":"","sources":["../src/redis-locks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { RuntimeScope } from "@amaster.ai/pi-types";
2
+ //# sourceMappingURL=runtime-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-scope.d.ts","sourceRoot":"","sources":["../src/runtime-scope.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runtime-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-scope.js","sourceRoot":"","sources":["../src/runtime-scope.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import type { CopilotMemoryStore, LlmGenerationEventStore, RuntimeArtifactStore, RuntimeEventStore, RuntimeSessionStore, RuntimeTimelineEventStore, SubagentRunStore, ToolEventStore, TranscriptStore } from "@amaster.ai/pi-types";
2
+ export type RuntimeStorageMode = "json" | "db";
3
+ export type RuntimeStorageBundle = {
4
+ store: RuntimeSessionStore;
5
+ transcripts: TranscriptStore;
6
+ memory: CopilotMemoryStore;
7
+ runtimeEvents: RuntimeEventStore;
8
+ toolEvents: ToolEventStore;
9
+ llmGenerationEvents: LlmGenerationEventStore;
10
+ timelineEvents: RuntimeTimelineEventStore;
11
+ subagents: SubagentRunStore;
12
+ artifacts: RuntimeArtifactStore;
13
+ };
14
+ export declare function createRuntimeStorage(input: {
15
+ mode: RuntimeStorageMode;
16
+ agentDir: string;
17
+ databaseUrl?: string | undefined;
18
+ redisUrl?: string | undefined;
19
+ eventLimits: {
20
+ runtimeEvents: number;
21
+ toolEvents: number;
22
+ llmGenerationEvents: number;
23
+ };
24
+ }): RuntimeStorageBundle;
25
+ export declare function verifyRuntimeStorage(input: {
26
+ mode: RuntimeStorageMode;
27
+ databaseUrl?: string | undefined;
28
+ redisUrl?: string | undefined;
29
+ }): Promise<void>;
30
+ //# sourceMappingURL=runtime-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-storage.d.ts","sourceRoot":"","sources":["../src/runtime-storage.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAAC;AAE/C,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,aAAa,EAAE,iBAAiB,CAAC;IACjC,UAAU,EAAE,cAAc,CAAC;IAC3B,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,cAAc,EAAE,yBAAyB,CAAC;IAC1C,SAAS,EAAE,gBAAgB,CAAC;IAC5B,SAAS,EAAE,oBAAoB,CAAC;CACjC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH,GAAG,oBAAoB,CAOvB;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Runtime storage adapter factory.
3
+ *
4
+ * Owns the concrete store selection for local JSON and platform DB modes. Route
5
+ * and runtime code depend on store interfaces only.
6
+ */
7
+ import path from "node:path";
8
+ import { JsonFileLlmGenerationEventStore, JsonFileRuntimeEventStore, JsonFileRuntimeTimelineEventStore, JsonFileToolEventStore, } from "./event-stores.js";
9
+ import { JsonFileConversationStore, JsonFileMemoryStore, JsonFileTranscriptStore, } from "./session-stores.js";
10
+ import { JsonFileSubagentRunStore } from "./subagent-store.js";
11
+ import { createDbRuntimeStores, verifyDbRuntimeSchema } from "./db-runtime-storage.js";
12
+ import { JsonFileArtifactStore } from "./artifact-stores.js";
13
+ import { RedisLockManager } from "./redis-locks.js";
14
+ export function createRuntimeStorage(input) {
15
+ if (input.mode === "db") {
16
+ assertDatabaseStorageConfigured(input.databaseUrl);
17
+ assertRedisStorageConfigured(input.redisUrl);
18
+ return createDbRuntimeStores(input.databaseUrl, input.redisUrl);
19
+ }
20
+ return createJsonRuntimeStorage(input.agentDir, input.eventLimits);
21
+ }
22
+ export async function verifyRuntimeStorage(input) {
23
+ if (input.mode !== "db") {
24
+ return;
25
+ }
26
+ assertDatabaseStorageConfigured(input.databaseUrl);
27
+ assertRedisStorageConfigured(input.redisUrl);
28
+ await verifyDbRuntimeSchema(input.databaseUrl);
29
+ const locks = new RedisLockManager(input.redisUrl);
30
+ try {
31
+ await locks.ping();
32
+ }
33
+ finally {
34
+ await locks.disconnect();
35
+ }
36
+ }
37
+ function createJsonRuntimeStorage(agentDir, eventLimits) {
38
+ return {
39
+ store: new JsonFileConversationStore(path.join(agentDir, "sessions.json")),
40
+ transcripts: new JsonFileTranscriptStore(path.join(agentDir, "transcripts.json")),
41
+ memory: new JsonFileMemoryStore(path.join(agentDir, "memory.json")),
42
+ runtimeEvents: new JsonFileRuntimeEventStore(path.join(agentDir, "runtime-events.json"), eventLimits.runtimeEvents),
43
+ toolEvents: new JsonFileToolEventStore(path.join(agentDir, "tool-events.json"), eventLimits.toolEvents),
44
+ llmGenerationEvents: new JsonFileLlmGenerationEventStore(path.join(agentDir, "llm-generation-events.json"), eventLimits.llmGenerationEvents),
45
+ timelineEvents: new JsonFileRuntimeTimelineEventStore(path.join(agentDir, "events.json"), Math.max(eventLimits.runtimeEvents, eventLimits.toolEvents, eventLimits.llmGenerationEvents)),
46
+ subagents: new JsonFileSubagentRunStore(path.join(agentDir, "subagents.json")),
47
+ artifacts: new JsonFileArtifactStore(path.join(agentDir, "artifacts.json")),
48
+ };
49
+ }
50
+ function assertDatabaseStorageConfigured(databaseUrl) {
51
+ if (!databaseUrl) {
52
+ throw new Error("STORAGE_MODE=db requires DATABASE_URL.");
53
+ }
54
+ }
55
+ function assertRedisStorageConfigured(redisUrl) {
56
+ if (!redisUrl) {
57
+ throw new Error("STORAGE_MODE=db requires REDIS_URL.");
58
+ }
59
+ }
60
+ //# sourceMappingURL=runtime-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-storage.js","sourceRoot":"","sources":["../src/runtime-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type ScheduledTask, type ScheduledTaskStore, type SchedulerLock, type TaskSchedulerScope } from "@amaster.ai/pi-task-scheduler";
2
+ export declare class JsonScheduledTaskStore implements ScheduledTaskStore {
3
+ private readonly filePath;
4
+ private loaded;
5
+ private readonly tasks;
6
+ constructor(filePath: string);
7
+ list(scope?: TaskSchedulerScope): Promise<ScheduledTask[]>;
8
+ get(taskId: string, scope?: TaskSchedulerScope): Promise<ScheduledTask | undefined>;
9
+ create(task: ScheduledTask): Promise<ScheduledTask>;
10
+ update(taskId: string, task: ScheduledTask, scope?: TaskSchedulerScope): Promise<ScheduledTask | undefined>;
11
+ delete(taskId: string, scope?: TaskSchedulerScope): Promise<boolean>;
12
+ private load;
13
+ private save;
14
+ }
15
+ export declare class FileSchedulerLock implements SchedulerLock {
16
+ readonly path: string;
17
+ private acquired;
18
+ constructor(path: string);
19
+ acquire(): boolean;
20
+ release(): void;
21
+ isAcquired(): boolean;
22
+ holderPid(): number | undefined;
23
+ }
24
+ export declare class RedisSchedulerLock implements SchedulerLock {
25
+ private readonly key;
26
+ private readonly ttlMs;
27
+ readonly path: string;
28
+ private acquired;
29
+ private readonly locks;
30
+ constructor(redisUrl: string, key?: string, ttlMs?: number);
31
+ acquire(): Promise<boolean>;
32
+ extend(): Promise<boolean>;
33
+ release(): Promise<void>;
34
+ isAcquired(): boolean;
35
+ holderPid(): number | undefined;
36
+ }
37
+ export declare class DbScheduledTaskStore implements ScheduledTaskStore {
38
+ private readonly prisma;
39
+ constructor(databaseUrl: string);
40
+ list(scope?: TaskSchedulerScope): Promise<ScheduledTask[]>;
41
+ get(taskId: string, scope?: TaskSchedulerScope): Promise<ScheduledTask | undefined>;
42
+ create(task: ScheduledTask): Promise<ScheduledTask>;
43
+ update(taskId: string, task: ScheduledTask, scope?: TaskSchedulerScope): Promise<ScheduledTask | undefined>;
44
+ delete(taskId: string, scope?: TaskSchedulerScope): Promise<boolean>;
45
+ private taskFromPrisma;
46
+ private listRunHistory;
47
+ private syncTaskRuns;
48
+ }
49
+ //# sourceMappingURL=scheduled-task-stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled-task-stores.d.ts","sourceRoot":"","sources":["../src/scheduled-task-stores.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,aAAa,EAIlB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,+BAA+B,CAAC;AAIvC,qBAAa,sBAAuB,YAAW,kBAAkB;IAInD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBAE7B,QAAQ,EAAE,MAAM;IAEvC,IAAI,CAAC,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAK9D,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAMvF,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAQnD,MAAM,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,EACnB,KAAK,GAAE,kBAAuB,GAC7B,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAY/B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;YAWhE,IAAI;YAaJ,IAAI;CAGnB;AAED,qBAAa,iBAAkB,YAAW,aAAa;IAGzC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAFjC,OAAO,CAAC,QAAQ,CAAS;gBAEJ,IAAI,EAAE,MAAM;IAEjC,OAAO,IAAI,OAAO;IAwBlB,OAAO,IAAI,IAAI;IAef,UAAU,IAAI,OAAO;IAIrB,SAAS,IAAI,MAAM,GAAG,SAAS;CAYhC;AAED,qBAAa,kBAAmB,YAAW,aAAa;IAOpD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;gBAGvC,QAAQ,EAAE,MAAM,EACC,GAAG,SAAwB,EAC3B,KAAK,SAAS;IAM3B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAK3B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,UAAU,IAAI,OAAO;IAIrB,SAAS,IAAI,MAAM,GAAG,SAAS;CAGhC;AAED,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,WAAW,EAAE,MAAM;IAQzB,IAAI,CAAC,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAQ9D,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAOvF,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IASnD,MAAM,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,EACnB,KAAK,GAAE,kBAAuB,GAC7B,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAa/B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,kBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;YAQhE,cAAc;YA4Bd,cAAc;YASd,YAAY;CAU3B"}
@@ -0,0 +1,381 @@
1
+ import { mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { Prisma, PrismaClient } from "@prisma/client";
4
+ import { normalizeScheduledTask, } from "@amaster.ai/pi-task-scheduler";
5
+ import { readJsonFile, writeJsonFile } from "./json-file.js";
6
+ import { RedisLockManager } from "./redis-locks.js";
7
+ export class JsonScheduledTaskStore {
8
+ filePath;
9
+ loaded = false;
10
+ tasks = new Map();
11
+ constructor(filePath) {
12
+ this.filePath = filePath;
13
+ }
14
+ async list(scope = {}) {
15
+ await this.load();
16
+ return [...this.tasks.values()].filter((task) => taskMatchesScope(task, scope));
17
+ }
18
+ async get(taskId, scope = {}) {
19
+ await this.load();
20
+ const task = this.tasks.get(taskId);
21
+ return task && taskMatchesScope(task, scope) ? task : undefined;
22
+ }
23
+ async create(task) {
24
+ await this.load();
25
+ const normalized = normalizeScheduledTask(task);
26
+ this.tasks.set(normalized.id, normalized);
27
+ await this.save();
28
+ return normalized;
29
+ }
30
+ async update(taskId, task, scope = {}) {
31
+ await this.load();
32
+ const existing = await this.get(taskId, scope);
33
+ if (!existing) {
34
+ return undefined;
35
+ }
36
+ const normalized = normalizeScheduledTask(task);
37
+ this.tasks.set(taskId, normalized);
38
+ await this.save();
39
+ return normalized;
40
+ }
41
+ async delete(taskId, scope = {}) {
42
+ await this.load();
43
+ const existing = await this.get(taskId, scope);
44
+ if (!existing) {
45
+ return false;
46
+ }
47
+ const deleted = this.tasks.delete(taskId);
48
+ await this.save();
49
+ return deleted;
50
+ }
51
+ async load() {
52
+ if (this.loaded) {
53
+ return;
54
+ }
55
+ const tasks = await readJsonFile(this.filePath, []);
56
+ this.tasks.clear();
57
+ for (const rawTask of tasks) {
58
+ const task = normalizeScheduledTask(rawTask);
59
+ this.tasks.set(task.id, task);
60
+ }
61
+ this.loaded = true;
62
+ }
63
+ async save() {
64
+ await writeJsonFile(this.filePath, [...this.tasks.values()]);
65
+ }
66
+ }
67
+ export class FileSchedulerLock {
68
+ path;
69
+ acquired = false;
70
+ constructor(path) {
71
+ this.path = path;
72
+ }
73
+ acquire() {
74
+ mkdirSync(path.dirname(this.path), { recursive: true });
75
+ const holder = this.holderPid();
76
+ if (holder && holder !== process.pid) {
77
+ return false;
78
+ }
79
+ try {
80
+ unlinkSync(this.path);
81
+ }
82
+ catch {
83
+ // Lock did not exist or was already removed between checks.
84
+ }
85
+ try {
86
+ writeFileSync(this.path, String(process.pid), { flag: "wx" });
87
+ this.acquired = true;
88
+ return true;
89
+ }
90
+ catch (error) {
91
+ if (error.code === "EEXIST") {
92
+ this.acquired = false;
93
+ return false;
94
+ }
95
+ throw error;
96
+ }
97
+ }
98
+ release() {
99
+ if (!this.acquired) {
100
+ return;
101
+ }
102
+ try {
103
+ const pid = Number(readFileSync(this.path, "utf8").trim());
104
+ if (pid === process.pid) {
105
+ unlinkSync(this.path);
106
+ }
107
+ }
108
+ catch {
109
+ // Lock was already gone; the scheduler is stopping anyway.
110
+ }
111
+ this.acquired = false;
112
+ }
113
+ isAcquired() {
114
+ return this.acquired;
115
+ }
116
+ holderPid() {
117
+ try {
118
+ const pid = Number(readFileSync(this.path, "utf8").trim());
119
+ if (Number.isInteger(pid) && pid > 0 && isProcessAlive(pid)) {
120
+ return pid;
121
+ }
122
+ unlinkSync(this.path);
123
+ return undefined;
124
+ }
125
+ catch {
126
+ return undefined;
127
+ }
128
+ }
129
+ }
130
+ export class RedisSchedulerLock {
131
+ key;
132
+ ttlMs;
133
+ path;
134
+ acquired = false;
135
+ locks;
136
+ constructor(redisUrl, key = "pi:scheduler:leader", ttlMs = 30_000) {
137
+ this.key = key;
138
+ this.ttlMs = ttlMs;
139
+ this.path = `redis:${key}`;
140
+ this.locks = new RedisLockManager(redisUrl);
141
+ }
142
+ async acquire() {
143
+ this.acquired = await this.locks.acquire(this.key, this.ttlMs);
144
+ return this.acquired;
145
+ }
146
+ async extend() {
147
+ this.acquired = await this.locks.extend(this.key, this.ttlMs);
148
+ return this.acquired;
149
+ }
150
+ async release() {
151
+ this.acquired = false;
152
+ await this.locks.release(this.key);
153
+ }
154
+ isAcquired() {
155
+ return this.acquired;
156
+ }
157
+ holderPid() {
158
+ return this.acquired ? process.pid : undefined;
159
+ }
160
+ }
161
+ export class DbScheduledTaskStore {
162
+ prisma;
163
+ constructor(databaseUrl) {
164
+ this.prisma = new PrismaClient({
165
+ datasources: {
166
+ db: { url: databaseUrl },
167
+ },
168
+ });
169
+ }
170
+ async list(scope = {}) {
171
+ const rows = await this.prisma.piAgentScheduledTask.findMany({
172
+ where: scheduledTaskWhere(scope),
173
+ orderBy: { updatedAt: "desc" },
174
+ });
175
+ return await Promise.all(rows.map((row) => this.taskFromPrisma(row)));
176
+ }
177
+ async get(taskId, scope = {}) {
178
+ const row = await this.prisma.piAgentScheduledTask.findFirst({
179
+ where: scheduledTaskWhere(scope, { id: taskId }),
180
+ });
181
+ return row ? await this.taskFromPrisma(row) : undefined;
182
+ }
183
+ async create(task) {
184
+ const normalized = normalizeScheduledTask(task);
185
+ await this.prisma.piAgentScheduledTask.create({
186
+ data: scheduledTaskPrismaData(normalized),
187
+ });
188
+ await this.syncTaskRuns(normalized);
189
+ return await this.get(normalized.id) ?? normalized;
190
+ }
191
+ async update(taskId, task, scope = {}) {
192
+ const normalized = normalizeScheduledTask(task);
193
+ const result = await this.prisma.piAgentScheduledTask.updateMany({
194
+ where: scheduledTaskWhere(scope, { id: taskId }),
195
+ data: scheduledTaskPrismaData(normalized),
196
+ });
197
+ if (result.count === 0) {
198
+ return undefined;
199
+ }
200
+ await this.syncTaskRuns(normalized);
201
+ return await this.get(taskId, scope);
202
+ }
203
+ async delete(taskId, scope = {}) {
204
+ const result = await this.prisma.piAgentScheduledTask.updateMany({
205
+ where: scheduledTaskWhere(scope, { id: taskId }),
206
+ data: { deletedAt: new Date(), updatedAt: new Date() },
207
+ });
208
+ return result.count > 0;
209
+ }
210
+ async taskFromPrisma(row) {
211
+ return normalizeScheduledTask({
212
+ id: row.id,
213
+ tenantId: row.tenantId,
214
+ userId: row.userId,
215
+ ...(row.workspaceId ? { workspaceId: row.workspaceId } : {}),
216
+ sessionId: row.sessionId,
217
+ ...(row.name ? { name: row.name } : {}),
218
+ prompt: row.prompt,
219
+ type: row.taskType,
220
+ schedule: row.schedule ?? "",
221
+ intervalSeconds: row.intervalSeconds ?? 0,
222
+ enabled: Boolean(row.enabled),
223
+ model: parseModel(row.modelJson),
224
+ toolPolicyProfile: row.toolPolicyProfile ?? "scheduled",
225
+ ...(row.workspaceDir ? { workspaceDir: row.workspaceDir } : {}),
226
+ ...(row.description ? { description: row.description } : {}),
227
+ createdAt: toIso(row.createdAt),
228
+ updatedAt: toIso(row.updatedAt),
229
+ ...(row.lastRunAt ? { lastRunAt: toIso(row.lastRunAt) } : {}),
230
+ ...(row.nextRunAt ? { nextRunAt: toIso(row.nextRunAt) } : {}),
231
+ runCount: Number(row.runCount ?? 0),
232
+ ...(row.lastStatus ? { lastStatus: row.lastStatus } : {}),
233
+ ...(row.lastError ? { lastError: row.lastError } : {}),
234
+ runHistory: await this.listRunHistory(row.id),
235
+ });
236
+ }
237
+ async listRunHistory(taskId) {
238
+ const rows = await this.prisma.piAgentTaskRun.findMany({
239
+ where: { taskId },
240
+ orderBy: { createdAt: "desc" },
241
+ take: 25,
242
+ });
243
+ return rows.map(taskRunHistoryFromPrisma).reverse();
244
+ }
245
+ async syncTaskRuns(task) {
246
+ for (const entry of task.runHistory ?? []) {
247
+ const status = entry.status;
248
+ await this.prisma.piAgentTaskRun.upsert({
249
+ where: { id: entry.id },
250
+ create: taskRunPrismaCreate(task, entry, status),
251
+ update: taskRunPrismaUpdate(task, entry, status),
252
+ });
253
+ }
254
+ }
255
+ }
256
+ function taskMatchesScope(task, scope) {
257
+ return (!scope.tenantId || task.tenantId === scope.tenantId) &&
258
+ (!scope.userId || task.userId === scope.userId);
259
+ }
260
+ function isProcessAlive(pid) {
261
+ try {
262
+ process.kill(pid, 0);
263
+ return true;
264
+ }
265
+ catch {
266
+ return false;
267
+ }
268
+ }
269
+ function scheduledTaskWhere(scope, extra = {}) {
270
+ return {
271
+ deletedAt: null,
272
+ ...(scope.tenantId ? { tenantId: scope.tenantId } : {}),
273
+ ...(scope.userId ? { userId: scope.userId } : {}),
274
+ ...extra,
275
+ };
276
+ }
277
+ function scheduledTaskPrismaData(task) {
278
+ return {
279
+ id: task.id,
280
+ tenantId: task.tenantId ?? "default",
281
+ userId: task.userId ?? "system",
282
+ workspaceId: task.workspaceId ?? null,
283
+ sessionId: task.sessionId,
284
+ name: task.name ?? null,
285
+ description: task.description ?? null,
286
+ prompt: task.prompt,
287
+ taskType: task.type,
288
+ schedule: task.schedule,
289
+ intervalSeconds: task.intervalSeconds,
290
+ enabled: task.enabled,
291
+ modelJson: jsonInput(task.model),
292
+ toolPolicyProfile: task.toolPolicyProfile,
293
+ workspaceDir: task.workspaceDir ?? null,
294
+ lastRunAt: task.lastRunAt ? toDate(task.lastRunAt) : null,
295
+ nextRunAt: task.nextRunAt ? toDate(task.nextRunAt) : null,
296
+ runCount: BigInt(task.runCount),
297
+ lastStatus: task.lastStatus ?? null,
298
+ lastError: task.lastError ?? null,
299
+ createdAt: toDate(task.createdAt),
300
+ updatedAt: toDate(task.updatedAt),
301
+ deletedAt: null,
302
+ };
303
+ }
304
+ function taskRunPrismaCreate(task, entry, status) {
305
+ return {
306
+ id: entry.id,
307
+ tenantId: task.tenantId ?? "default",
308
+ userId: task.userId ?? "system",
309
+ workspaceId: task.workspaceId ?? null,
310
+ taskId: task.id,
311
+ sessionId: entry.sessionId ?? task.sessionId,
312
+ status,
313
+ message: entry.message ?? null,
314
+ errorJson: errorJson(task, entry),
315
+ startedAt: status === "running" ? toDate(entry.createdAt) : null,
316
+ endedAt: status === "success" || status === "error" ? toDate(task.lastRunAt ?? task.updatedAt) : null,
317
+ createdAt: toDate(entry.createdAt),
318
+ };
319
+ }
320
+ function taskRunPrismaUpdate(task, entry, status) {
321
+ return {
322
+ sessionId: entry.sessionId ?? task.sessionId,
323
+ status,
324
+ message: entry.message ?? null,
325
+ errorJson: errorJson(task, entry),
326
+ endedAt: status === "success" || status === "error" ? toDate(task.lastRunAt ?? task.updatedAt) : null,
327
+ };
328
+ }
329
+ function errorJson(task, entry) {
330
+ return entry.status === "error"
331
+ ? jsonInput({ message: entry.message ?? task.lastError ?? "Scheduled task failed" })
332
+ : Prisma.JsonNull;
333
+ }
334
+ function taskRunHistoryFromPrisma(row) {
335
+ return {
336
+ id: row.id,
337
+ status: row.status,
338
+ createdAt: toIso(row.createdAt),
339
+ ...(row.sessionId ? { sessionId: row.sessionId } : {}),
340
+ ...(row.message ? { message: row.message } : {}),
341
+ };
342
+ }
343
+ function parseModel(value) {
344
+ if (typeof value === "string") {
345
+ try {
346
+ return parseModel(JSON.parse(value));
347
+ }
348
+ catch {
349
+ return { provider: "unknown", model: "unknown" };
350
+ }
351
+ }
352
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
353
+ return { provider: "unknown", model: "unknown" };
354
+ }
355
+ const raw = value;
356
+ return {
357
+ provider: typeof raw.provider === "string" ? raw.provider : "unknown",
358
+ model: typeof raw.model === "string" ? raw.model : "unknown",
359
+ ...(isThinkingLevel(raw.thinkingLevel) ? { thinkingLevel: raw.thinkingLevel } : {}),
360
+ ...(typeof raw.authProfileId === "string" ? { authProfileId: raw.authProfileId } : {}),
361
+ ...(raw.reasoning === true ? { reasoning: true } : {}),
362
+ };
363
+ }
364
+ function isThinkingLevel(value) {
365
+ return (value === "off" ||
366
+ value === "minimal" ||
367
+ value === "low" ||
368
+ value === "medium" ||
369
+ value === "high" ||
370
+ value === "xhigh");
371
+ }
372
+ function jsonInput(value) {
373
+ return JSON.parse(JSON.stringify(value ?? null));
374
+ }
375
+ function toDate(value) {
376
+ return value instanceof Date ? value : new Date(value);
377
+ }
378
+ function toIso(value) {
379
+ return value instanceof Date ? value.toISOString() : value;
380
+ }
381
+ //# sourceMappingURL=scheduled-task-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled-task-stores.js","sourceRoot":"","sources":["../src/scheduled-task-stores.ts"],"names":[],"mappings":"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"}