@polpo-ai/file-stores 0.11.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 (70) hide show
  1. package/LICENSE +13 -0
  2. package/dist/file-agent-store.d.ts +24 -0
  3. package/dist/file-agent-store.d.ts.map +1 -0
  4. package/dist/file-agent-store.js +102 -0
  5. package/dist/file-agent-store.js.map +1 -0
  6. package/dist/file-approval-store.d.ts +20 -0
  7. package/dist/file-approval-store.d.ts.map +1 -0
  8. package/dist/file-approval-store.js +62 -0
  9. package/dist/file-approval-store.js.map +1 -0
  10. package/dist/file-checkpoint-store.d.ts +18 -0
  11. package/dist/file-checkpoint-store.d.ts.map +1 -0
  12. package/dist/file-checkpoint-store.js +52 -0
  13. package/dist/file-checkpoint-store.js.map +1 -0
  14. package/dist/file-delay-store.d.ts +18 -0
  15. package/dist/file-delay-store.d.ts.map +1 -0
  16. package/dist/file-delay-store.js +52 -0
  17. package/dist/file-delay-store.js.map +1 -0
  18. package/dist/file-log-store.d.ts +22 -0
  19. package/dist/file-log-store.d.ts.map +1 -0
  20. package/dist/file-log-store.js +123 -0
  21. package/dist/file-log-store.js.map +1 -0
  22. package/dist/file-memory-store.d.ts +21 -0
  23. package/dist/file-memory-store.d.ts.map +1 -0
  24. package/dist/file-memory-store.js +85 -0
  25. package/dist/file-memory-store.js.map +1 -0
  26. package/dist/file-playbook-store.d.ts +25 -0
  27. package/dist/file-playbook-store.d.ts.map +1 -0
  28. package/dist/file-playbook-store.js +35 -0
  29. package/dist/file-playbook-store.js.map +1 -0
  30. package/dist/file-run-store.d.ts +29 -0
  31. package/dist/file-run-store.d.ts.map +1 -0
  32. package/dist/file-run-store.js +131 -0
  33. package/dist/file-run-store.js.map +1 -0
  34. package/dist/file-session-store.d.ts +28 -0
  35. package/dist/file-session-store.d.ts.map +1 -0
  36. package/dist/file-session-store.js +245 -0
  37. package/dist/file-session-store.js.map +1 -0
  38. package/dist/file-skill-store.d.ts +26 -0
  39. package/dist/file-skill-store.d.ts.map +1 -0
  40. package/dist/file-skill-store.js +92 -0
  41. package/dist/file-skill-store.js.map +1 -0
  42. package/dist/file-task-store.d.ts +48 -0
  43. package/dist/file-task-store.d.ts.map +1 -0
  44. package/dist/file-task-store.js +296 -0
  45. package/dist/file-task-store.js.map +1 -0
  46. package/dist/file-team-store.d.ts +20 -0
  47. package/dist/file-team-store.d.ts.map +1 -0
  48. package/dist/file-team-store.js +91 -0
  49. package/dist/file-team-store.js.map +1 -0
  50. package/dist/index.d.ts +17 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +19 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/json-config-store.d.ts +25 -0
  55. package/dist/json-config-store.d.ts.map +1 -0
  56. package/dist/json-config-store.js +66 -0
  57. package/dist/json-config-store.js.map +1 -0
  58. package/dist/json-task-store.d.ts +22 -0
  59. package/dist/json-task-store.d.ts.map +1 -0
  60. package/dist/json-task-store.js +112 -0
  61. package/dist/json-task-store.js.map +1 -0
  62. package/dist/paths.d.ts +11 -0
  63. package/dist/paths.d.ts.map +1 -0
  64. package/dist/paths.js +17 -0
  65. package/dist/paths.js.map +1 -0
  66. package/dist/playbook-files.d.ts +38 -0
  67. package/dist/playbook-files.d.ts.map +1 -0
  68. package/dist/playbook-files.js +159 -0
  69. package/dist/playbook-files.js.map +1 -0
  70. package/package.json +36 -0
@@ -0,0 +1,25 @@
1
+ import type { PolpoConfig, ProjectConfig } from "@polpo-ai/core/types";
2
+ import type { ConfigStore } from "@polpo-ai/core/config-store";
3
+ /**
4
+ * JSON-file backed ConfigStore.
5
+ * Reads/writes `.polpo/polpo.json`.
6
+ */
7
+ export declare class PolpoConfigStore implements ConfigStore {
8
+ private readonly filePath;
9
+ constructor(polpoDir: string);
10
+ exists(): Promise<boolean>;
11
+ get(): Promise<PolpoConfig | undefined>;
12
+ save(config: PolpoConfig): Promise<void>;
13
+ }
14
+ /**
15
+ * Legacy JSON-file backed ConfigStore.
16
+ * Reads/writes `config.json` directly in the given directory.
17
+ */
18
+ export declare class JsonConfigStore {
19
+ private readonly filePath;
20
+ constructor(dir: string);
21
+ exists(): boolean;
22
+ get(): ProjectConfig | undefined;
23
+ save(config: ProjectConfig): void;
24
+ }
25
+ //# sourceMappingURL=json-config-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-config-store.d.ts","sourceRoot":"","sources":["../src/json-config-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,QAAQ,EAAE,MAAM;IAItB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,GAAG,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAOvC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK/C;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,GAAG,EAAE,MAAM;IAIvB,MAAM,IAAI,OAAO;IAIjB,GAAG,IAAI,aAAa,GAAG,SAAS;IAUhC,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;CAKlC"}
@@ -0,0 +1,66 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ /**
4
+ * JSON-file backed ConfigStore.
5
+ * Reads/writes `.polpo/polpo.json`.
6
+ */
7
+ export class PolpoConfigStore {
8
+ filePath;
9
+ constructor(polpoDir) {
10
+ this.filePath = join(polpoDir, "polpo.json");
11
+ }
12
+ async exists() {
13
+ return existsSync(this.filePath);
14
+ }
15
+ async get() {
16
+ if (!existsSync(this.filePath))
17
+ return undefined;
18
+ try {
19
+ return JSON.parse(readFileSync(this.filePath, "utf-8"));
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ async save(config) {
26
+ const dir = dirname(this.filePath);
27
+ if (!existsSync(dir))
28
+ mkdirSync(dir, { recursive: true });
29
+ writeFileSync(this.filePath, JSON.stringify(config, null, 2), "utf-8");
30
+ }
31
+ }
32
+ /**
33
+ * Legacy JSON-file backed ConfigStore.
34
+ * Reads/writes `config.json` directly in the given directory.
35
+ */
36
+ export class JsonConfigStore {
37
+ filePath;
38
+ constructor(dir) {
39
+ this.filePath = join(dir, "config.json");
40
+ }
41
+ exists() {
42
+ return existsSync(this.filePath);
43
+ }
44
+ get() {
45
+ if (!existsSync(this.filePath))
46
+ return undefined;
47
+ try {
48
+ const parsed = JSON.parse(readFileSync(this.filePath, "utf-8"));
49
+ if (!parsed || typeof parsed !== "object")
50
+ return undefined;
51
+ if (typeof parsed.project !== "string")
52
+ return undefined;
53
+ return parsed;
54
+ }
55
+ catch {
56
+ return undefined;
57
+ }
58
+ }
59
+ save(config) {
60
+ const dir = dirname(this.filePath);
61
+ if (!existsSync(dir))
62
+ mkdirSync(dir, { recursive: true });
63
+ writeFileSync(this.filePath, JSON.stringify(config, null, 2), "utf-8");
64
+ }
65
+ }
66
+ //# sourceMappingURL=json-config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-config-store.js","sourceRoot":"","sources":["../src/json-config-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI1C;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IACV,QAAQ,CAAS;IAElC,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QACjD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAgB,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,SAAS,CAAC;QAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAmB;QAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IACT,QAAQ,CAAS;IAElC,YAAY,GAAW;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM;QACJ,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,GAAG;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC5D,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YACzD,OAAO,MAAuB,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,SAAS,CAAC;QAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,MAAqB;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import type { Task, TaskStatus, PolpoState } from "@polpo-ai/core/types";
2
+ import type { TaskStore } from "@polpo-ai/core/task-store";
3
+ export declare class JsonTaskStore implements TaskStore {
4
+ private statePath;
5
+ private state;
6
+ constructor(polpoDir: string);
7
+ private load;
8
+ private persist;
9
+ getState(): Promise<PolpoState>;
10
+ setState(partial: Partial<PolpoState>): Promise<void>;
11
+ addTask(task: Omit<Task, "id" | "status" | "retries" | "createdAt" | "updatedAt"> & {
12
+ status?: TaskStatus;
13
+ }): Promise<Task>;
14
+ getTask(taskId: string): Promise<Task | undefined>;
15
+ getAllTasks(): Promise<Task[]>;
16
+ unsafeSetStatus(taskId: string, newStatus: TaskStatus, reason: string): Promise<Task>;
17
+ updateTask(taskId: string, updates: Partial<Omit<Task, "id" | "status">>): Promise<Task>;
18
+ removeTask(taskId: string): Promise<boolean>;
19
+ removeTasks(filter: (task: Task) => boolean): Promise<number>;
20
+ transition(taskId: string, newStatus: TaskStatus): Promise<Task>;
21
+ }
22
+ //# sourceMappingURL=json-task-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-task-store.d.ts","sourceRoot":"","sources":["../src/json-task-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG3D,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAa;gBAEd,QAAQ,EAAE,MAAM;IAK5B,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,OAAO;IAWT,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC;IAI/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,OAAO,CACX,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,UAAU,CAAA;KAAE,GAClG,OAAO,CAAC,IAAI,CAAC;IAeV,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAIlD,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAI9B,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrF,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxF,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ5C,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ7D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBvE"}
@@ -0,0 +1,112 @@
1
+ import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { nanoid } from "nanoid";
4
+ import { assertValidTransition } from "@polpo-ai/core/state-machine";
5
+ export class JsonTaskStore {
6
+ statePath;
7
+ state;
8
+ constructor(polpoDir) {
9
+ this.statePath = join(polpoDir, "state.json");
10
+ this.state = this.load();
11
+ }
12
+ load() {
13
+ if (existsSync(this.statePath)) {
14
+ const raw = readFileSync(this.statePath, "utf-8");
15
+ return JSON.parse(raw);
16
+ }
17
+ return {
18
+ project: "",
19
+ teams: [{ name: "", agents: [] }],
20
+ tasks: [],
21
+ processes: [],
22
+ };
23
+ }
24
+ persist() {
25
+ const dir = join(this.statePath, "..");
26
+ if (!existsSync(dir)) {
27
+ mkdirSync(dir, { recursive: true });
28
+ }
29
+ // Atomic write: write to temp file, then rename
30
+ const tmp = this.statePath + ".tmp";
31
+ writeFileSync(tmp, JSON.stringify(this.state, null, 2), "utf-8");
32
+ renameSync(tmp, this.statePath);
33
+ }
34
+ async getState() {
35
+ return this.state;
36
+ }
37
+ async setState(partial) {
38
+ Object.assign(this.state, partial);
39
+ this.persist();
40
+ }
41
+ async addTask(task) {
42
+ const now = new Date().toISOString();
43
+ const newTask = {
44
+ ...task,
45
+ id: nanoid(),
46
+ status: task.status ?? "pending",
47
+ retries: 0,
48
+ createdAt: now,
49
+ updatedAt: now,
50
+ };
51
+ this.state.tasks.push(newTask);
52
+ this.persist();
53
+ return newTask;
54
+ }
55
+ async getTask(taskId) {
56
+ return this.state.tasks.find((t) => t.id === taskId);
57
+ }
58
+ async getAllTasks() {
59
+ return this.state.tasks;
60
+ }
61
+ async unsafeSetStatus(taskId, newStatus, reason) {
62
+ const task = this.state.tasks.find((t) => t.id === taskId);
63
+ if (!task)
64
+ throw new Error(`Task not found: ${taskId}`);
65
+ const from = task.status;
66
+ task.status = newStatus;
67
+ task.updatedAt = new Date().toISOString();
68
+ this.persist();
69
+ console.warn(`[unsafeSetStatus] ${taskId}: ${from} → ${newStatus} — ${reason}`);
70
+ return task;
71
+ }
72
+ async updateTask(taskId, updates) {
73
+ const task = this.state.tasks.find((t) => t.id === taskId);
74
+ if (!task) {
75
+ throw new Error(`Task not found: ${taskId}`);
76
+ }
77
+ Object.assign(task, updates, { updatedAt: new Date().toISOString() });
78
+ this.persist();
79
+ return task;
80
+ }
81
+ async removeTask(taskId) {
82
+ const idx = this.state.tasks.findIndex((t) => t.id === taskId);
83
+ if (idx < 0)
84
+ return false;
85
+ this.state.tasks.splice(idx, 1);
86
+ this.persist();
87
+ return true;
88
+ }
89
+ async removeTasks(filter) {
90
+ const before = this.state.tasks.length;
91
+ this.state.tasks = this.state.tasks.filter((t) => !filter(t));
92
+ const removed = before - this.state.tasks.length;
93
+ if (removed > 0)
94
+ this.persist();
95
+ return removed;
96
+ }
97
+ async transition(taskId, newStatus) {
98
+ const task = this.state.tasks.find((t) => t.id === taskId);
99
+ if (!task) {
100
+ throw new Error(`Task not found: ${taskId}`);
101
+ }
102
+ assertValidTransition(task.status, newStatus);
103
+ if (newStatus === "pending" && task.status === "failed") {
104
+ task.retries += 1;
105
+ }
106
+ task.status = newStatus;
107
+ task.updatedAt = new Date().toISOString();
108
+ this.persist();
109
+ return task;
110
+ }
111
+ }
112
+ //# sourceMappingURL=json-task-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-task-store.js","sourceRoot":"","sources":["../src/json-task-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Canonical .polpo directory layout helpers — owned by the file-stores
3
+ * package because the directory layout IS the file persistence contract.
4
+ */
5
+ /** Name of the per-project config directory. */
6
+ export declare const POLPO_DIR_NAME = ".polpo";
7
+ /** Resolve the per-project `.polpo` directory from a working directory. */
8
+ export declare function getPolpoDir(workDir: string): string;
9
+ /** Resolve the global `~/.polpo` directory in the user's home. */
10
+ export declare function getGlobalPolpoDir(): string;
11
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,gDAAgD;AAChD,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
package/dist/paths.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Canonical .polpo directory layout helpers — owned by the file-stores
3
+ * package because the directory layout IS the file persistence contract.
4
+ */
5
+ import { resolve, join } from "node:path";
6
+ import { homedir } from "node:os";
7
+ /** Name of the per-project config directory. */
8
+ export const POLPO_DIR_NAME = ".polpo";
9
+ /** Resolve the per-project `.polpo` directory from a working directory. */
10
+ export function getPolpoDir(workDir) {
11
+ return resolve(workDir, POLPO_DIR_NAME);
12
+ }
13
+ /** Resolve the global `~/.polpo` directory in the user's home. */
14
+ export function getGlobalPolpoDir() {
15
+ return join(homedir(), POLPO_DIR_NAME);
16
+ }
17
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,gDAAgD;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AAC1C,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Playbook file persistence — discovery and CRUD over the .polpo/playbooks
3
+ * directory layout (with legacy templates/ compatibility). Pure logic
4
+ * (validation, instantiation) lives in @polpo-ai/core (playbook-logic).
5
+ */
6
+ import type { PlaybookDefinition, PlaybookInfo } from "@polpo-ai/core/playbook-store";
7
+ /**
8
+ * Discover all available playbooks from known locations.
9
+ * Returns deduplicated list (first occurrence wins by name).
10
+ *
11
+ * Also scans legacy templates/ directories for backward compatibility.
12
+ */
13
+ export declare function discoverPlaybooks(cwd: string, polpoDir?: string): PlaybookInfo[];
14
+ /**
15
+ * Load a full playbook definition by name.
16
+ * Returns null if not found.
17
+ */
18
+ export declare function loadPlaybook(cwd: string, polpoDir: string | undefined, name: string): PlaybookDefinition | null;
19
+ /**
20
+ * Save a playbook to disk.
21
+ *
22
+ * Creates/overwrites `<polpoDir>/playbooks/<name>/playbook.json`.
23
+ * Validates the definition structure before writing.
24
+ *
25
+ * @returns The absolute path to the saved playbook directory.
26
+ * @throws If validation fails or the write fails.
27
+ */
28
+ export declare function savePlaybook(polpoDir: string, definition: PlaybookDefinition): string;
29
+ /**
30
+ * Delete a playbook from disk.
31
+ *
32
+ * Removes the `<polpoDir>/playbooks/<name>/` directory entirely.
33
+ * Also checks `~/.polpo/playbooks/<name>/` if not found in polpoDir.
34
+ *
35
+ * @returns true if deleted, false if not found.
36
+ */
37
+ export declare function deletePlaybook(cwd: string, polpoDir: string | undefined, name: string): boolean;
38
+ //# sourceMappingURL=playbook-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-files.d.ts","sourceRoot":"","sources":["../src/playbook-files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA+DtF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CAkChF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAiB/G;AAGD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,MAAM,CAarF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/F"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Playbook file persistence — discovery and CRUD over the .polpo/playbooks
3
+ * directory layout (with legacy templates/ compatibility). Pure logic
4
+ * (validation, instantiation) lives in @polpo-ai/core (playbook-logic).
5
+ */
6
+ import { readdirSync, readFileSync, existsSync, realpathSync, statSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
7
+ import { join, resolve } from "node:path";
8
+ import { validatePlaybookDefinition } from "@polpo-ai/core";
9
+ import { getPolpoDir, getGlobalPolpoDir } from "./paths.js";
10
+ // ── Discovery ──────────────────────────────────────────────────────────
11
+ function scanPlaybookDir(dir) {
12
+ if (!existsSync(dir))
13
+ return [];
14
+ const results = [];
15
+ let entries;
16
+ try {
17
+ entries = readdirSync(dir);
18
+ }
19
+ catch {
20
+ return [];
21
+ }
22
+ for (const entry of entries) {
23
+ const entryPath = join(dir, entry);
24
+ // Follow symlinks
25
+ let realPath;
26
+ try {
27
+ realPath = realpathSync(entryPath);
28
+ }
29
+ catch {
30
+ continue; // broken symlink
31
+ }
32
+ // Must be a directory
33
+ try {
34
+ if (!statSync(realPath).isDirectory())
35
+ continue;
36
+ }
37
+ catch {
38
+ continue;
39
+ }
40
+ // Must contain playbook.json or template.json (backward compat)
41
+ let playbookFile = join(realPath, "playbook.json");
42
+ if (!existsSync(playbookFile)) {
43
+ playbookFile = join(realPath, "template.json");
44
+ if (!existsSync(playbookFile))
45
+ continue;
46
+ }
47
+ try {
48
+ const raw = readFileSync(playbookFile, "utf-8");
49
+ const def = JSON.parse(raw);
50
+ if (!def.name || !def.description || !def.mission)
51
+ continue;
52
+ results.push({
53
+ name: def.name,
54
+ description: def.description,
55
+ parameters: def.parameters ?? [],
56
+ path: realPath,
57
+ });
58
+ }
59
+ catch {
60
+ // Invalid JSON — skip silently
61
+ }
62
+ }
63
+ return results;
64
+ }
65
+ /**
66
+ * Discover all available playbooks from known locations.
67
+ * Returns deduplicated list (first occurrence wins by name).
68
+ *
69
+ * Also scans legacy templates/ directories for backward compatibility.
70
+ */
71
+ export function discoverPlaybooks(cwd, polpoDir) {
72
+ const seen = new Set();
73
+ const results = [];
74
+ const dirs = [];
75
+ // 1. Project-level: <polpoDir>/playbooks/ (+ legacy templates/)
76
+ if (polpoDir) {
77
+ dirs.push(join(polpoDir, "playbooks"));
78
+ dirs.push(join(polpoDir, "templates"));
79
+ }
80
+ // 2. Fallback if polpoDir is not the default .polpo
81
+ const defaultPolpoDir = getPolpoDir(cwd);
82
+ if (!polpoDir || resolve(polpoDir) !== resolve(defaultPolpoDir)) {
83
+ dirs.push(join(defaultPolpoDir, "playbooks"));
84
+ dirs.push(join(defaultPolpoDir, "templates"));
85
+ }
86
+ // 3. User-level: ~/.polpo/playbooks/ (+ legacy templates/)
87
+ const globalDir = getGlobalPolpoDir();
88
+ dirs.push(join(globalDir, "playbooks"));
89
+ dirs.push(join(globalDir, "templates"));
90
+ for (const dir of dirs) {
91
+ for (const pb of scanPlaybookDir(dir)) {
92
+ if (!seen.has(pb.name)) {
93
+ seen.add(pb.name);
94
+ results.push(pb);
95
+ }
96
+ }
97
+ }
98
+ return results;
99
+ }
100
+ /**
101
+ * Load a full playbook definition by name.
102
+ * Returns null if not found.
103
+ */
104
+ export function loadPlaybook(cwd, polpoDir, name) {
105
+ const playbooks = discoverPlaybooks(cwd, polpoDir);
106
+ const info = playbooks.find(p => p.name === name);
107
+ if (!info)
108
+ return null;
109
+ // Try playbook.json first, then template.json (backward compat)
110
+ let playbookFile = join(info.path, "playbook.json");
111
+ if (!existsSync(playbookFile)) {
112
+ playbookFile = join(info.path, "template.json");
113
+ }
114
+ try {
115
+ const raw = readFileSync(playbookFile, "utf-8");
116
+ return JSON.parse(raw);
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ /**
123
+ * Save a playbook to disk.
124
+ *
125
+ * Creates/overwrites `<polpoDir>/playbooks/<name>/playbook.json`.
126
+ * Validates the definition structure before writing.
127
+ *
128
+ * @returns The absolute path to the saved playbook directory.
129
+ * @throws If validation fails or the write fails.
130
+ */
131
+ export function savePlaybook(polpoDir, definition) {
132
+ const errors = validatePlaybookDefinition(definition);
133
+ if (errors.length > 0) {
134
+ throw new Error(`Invalid playbook definition:\n - ${errors.join("\n - ")}`);
135
+ }
136
+ const playbookDir = join(polpoDir, "playbooks", definition.name);
137
+ mkdirSync(playbookDir, { recursive: true });
138
+ const playbookFile = join(playbookDir, "playbook.json");
139
+ writeFileSync(playbookFile, JSON.stringify(definition, null, 2), "utf-8");
140
+ return playbookDir;
141
+ }
142
+ /**
143
+ * Delete a playbook from disk.
144
+ *
145
+ * Removes the `<polpoDir>/playbooks/<name>/` directory entirely.
146
+ * Also checks `~/.polpo/playbooks/<name>/` if not found in polpoDir.
147
+ *
148
+ * @returns true if deleted, false if not found.
149
+ */
150
+ export function deletePlaybook(cwd, polpoDir, name) {
151
+ // Find where the playbook lives
152
+ const playbooks = discoverPlaybooks(cwd, polpoDir);
153
+ const info = playbooks.find(p => p.name === name);
154
+ if (!info)
155
+ return false;
156
+ rmSync(info.path, { recursive: true, force: true });
157
+ return true;
158
+ }
159
+ //# sourceMappingURL=playbook-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-files.js","sourceRoot":"","sources":["../src/playbook-files.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@polpo-ai/file-stores",
3
+ "version": "0.11.0",
4
+ "description": "File-based store implementations for Polpo — the default zero-dependency persistence backend (JSON/Markdown files)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "dependencies": {
19
+ "nanoid": "^5.0.9",
20
+ "@polpo-ai/core": "0.11.0"
21
+ },
22
+ "license": "MIT",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/lumea-labs/polpo.git",
26
+ "directory": "packages/file-stores"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "dev": "tsc --watch",
34
+ "test": "vitest run"
35
+ }
36
+ }