@polpo-ai/drizzle 0.1.2 → 0.2.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 (64) hide show
  1. package/dist/__tests__/stores.test.js +3 -3
  2. package/dist/__tests__/stores.test.js.map +1 -1
  3. package/dist/index.d.ts +1703 -703
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +23 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/migrate.d.ts.map +1 -1
  8. package/dist/migrate.js +39 -0
  9. package/dist/migrate.js.map +1 -1
  10. package/dist/schema/index.d.ts +6 -0
  11. package/dist/schema/index.d.ts.map +1 -1
  12. package/dist/schema/index.js +6 -0
  13. package/dist/schema/index.js.map +1 -1
  14. package/dist/schema/memory.d.ts +7 -0
  15. package/dist/schema/memory.d.ts.map +1 -1
  16. package/dist/schema/memory.js +7 -0
  17. package/dist/schema/memory.js.map +1 -1
  18. package/dist/schema/playbooks.d.ts +339 -0
  19. package/dist/schema/playbooks.d.ts.map +1 -0
  20. package/dist/schema/playbooks.js +27 -0
  21. package/dist/schema/playbooks.js.map +1 -0
  22. package/dist/schema/sessions.d.ts +36 -0
  23. package/dist/schema/sessions.d.ts.map +1 -1
  24. package/dist/schema/sessions.js +2 -0
  25. package/dist/schema/sessions.js.map +1 -1
  26. package/dist/schema/teams.d.ts +353 -0
  27. package/dist/schema/teams.d.ts.map +1 -0
  28. package/dist/schema/teams.js +31 -0
  29. package/dist/schema/teams.js.map +1 -0
  30. package/dist/schema/vault.d.ts +267 -0
  31. package/dist/schema/vault.d.ts.map +1 -0
  32. package/dist/schema/vault.js +27 -0
  33. package/dist/schema/vault.js.map +1 -0
  34. package/dist/stores/agent-store.d.ts +24 -0
  35. package/dist/stores/agent-store.d.ts.map +1 -0
  36. package/dist/stores/agent-store.js +114 -0
  37. package/dist/stores/agent-store.js.map +1 -0
  38. package/dist/stores/index.d.ts +4 -0
  39. package/dist/stores/index.d.ts.map +1 -1
  40. package/dist/stores/index.js +4 -0
  41. package/dist/stores/index.js.map +1 -1
  42. package/dist/stores/memory-store.d.ts +9 -5
  43. package/dist/stores/memory-store.d.ts.map +1 -1
  44. package/dist/stores/memory-store.js +28 -14
  45. package/dist/stores/memory-store.js.map +1 -1
  46. package/dist/stores/playbook-store.d.ts +22 -0
  47. package/dist/stores/playbook-store.d.ts.map +1 -0
  48. package/dist/stores/playbook-store.js +88 -0
  49. package/dist/stores/playbook-store.js.map +1 -0
  50. package/dist/stores/session-store.d.ts +2 -2
  51. package/dist/stores/session-store.d.ts.map +1 -1
  52. package/dist/stores/session-store.js +21 -5
  53. package/dist/stores/session-store.js.map +1 -1
  54. package/dist/stores/task-store.js +3 -3
  55. package/dist/stores/task-store.js.map +1 -1
  56. package/dist/stores/team-store.d.ts +21 -0
  57. package/dist/stores/team-store.d.ts.map +1 -0
  58. package/dist/stores/team-store.js +109 -0
  59. package/dist/stores/team-store.js.map +1 -0
  60. package/dist/stores/vault-store.d.ts +44 -0
  61. package/dist/stores/vault-store.d.ts.map +1 -0
  62. package/dist/stores/vault-store.js +144 -0
  63. package/dist/stores/vault-store.js.map +1 -0
  64. package/package.json +4 -3
@@ -0,0 +1,144 @@
1
+ import { eq, and } from "drizzle-orm";
2
+ import { resolveKey, encryptJson, decryptJson } from "@polpo-ai/vault-crypto";
3
+ /**
4
+ * Drizzle ORM implementation of VaultStore with AES-256-GCM encryption at rest.
5
+ *
6
+ * Stores vault entries in a `vault` table with composite PK (agent, service).
7
+ * Credentials are encrypted before writing and decrypted on read using the
8
+ * same key material as EncryptedVaultStore (POLPO_VAULT_KEY env or ~/.polpo/vault.key).
9
+ *
10
+ * The `credentials` column stores a base64-encoded encrypted blob (always TEXT,
11
+ * regardless of dialect). Type and label are stored in cleartext for querying.
12
+ */
13
+ export class DrizzleVaultStore {
14
+ db;
15
+ vault;
16
+ key;
17
+ constructor(db, vault) {
18
+ this.db = db;
19
+ this.vault = vault;
20
+ this.key = resolveKey();
21
+ }
22
+ async get(agent, service) {
23
+ const rows = await this.db.select().from(this.vault)
24
+ .where(and(eq(this.vault.agent, agent), eq(this.vault.service, service)));
25
+ if (rows.length === 0)
26
+ return undefined;
27
+ return this.rowToEntry(rows[0]);
28
+ }
29
+ async getAllForAgent(agent) {
30
+ const rows = await this.db.select().from(this.vault)
31
+ .where(eq(this.vault.agent, agent));
32
+ const result = {};
33
+ for (const row of rows) {
34
+ result[row.service] = this.rowToEntry(row);
35
+ }
36
+ return result;
37
+ }
38
+ async set(agent, service, entry) {
39
+ const now = new Date().toISOString();
40
+ const encCreds = encryptJson(entry.credentials, this.key);
41
+ const values = {
42
+ agent,
43
+ service,
44
+ type: entry.type,
45
+ label: entry.label ?? null,
46
+ credentials: encCreds,
47
+ createdAt: now,
48
+ updatedAt: now,
49
+ };
50
+ await this.db.insert(this.vault).values(values)
51
+ .onConflictDoUpdate({
52
+ target: [this.vault.agent, this.vault.service],
53
+ set: {
54
+ type: entry.type,
55
+ label: entry.label ?? null,
56
+ credentials: encCreds,
57
+ updatedAt: now,
58
+ },
59
+ });
60
+ }
61
+ async patch(agent, service, partial) {
62
+ const existing = await this.get(agent, service);
63
+ if (!existing && !partial.type) {
64
+ throw new Error(`No vault entry "${service}" for agent "${agent}" — type is required to create a new entry.`);
65
+ }
66
+ const merged = {
67
+ type: partial.type ?? existing?.type ?? "custom",
68
+ ...(partial.label !== undefined ? { label: partial.label } : existing?.label ? { label: existing.label } : {}),
69
+ credentials: { ...(existing?.credentials ?? {}), ...(partial.credentials ?? {}) },
70
+ };
71
+ await this.set(agent, service, merged);
72
+ return Object.keys(merged.credentials);
73
+ }
74
+ async remove(agent, service) {
75
+ const result = await this.db.delete(this.vault)
76
+ .where(and(eq(this.vault.agent, agent), eq(this.vault.service, service)));
77
+ // Drizzle returns { rowsAffected } for SQLite, { rowCount } for PG
78
+ const affected = result?.rowsAffected ?? result?.rowCount ?? result?.changes ?? 0;
79
+ return affected > 0;
80
+ }
81
+ async list(agent) {
82
+ const rows = await this.db.select().from(this.vault)
83
+ .where(eq(this.vault.agent, agent));
84
+ return rows.map((row) => {
85
+ const creds = decryptJson(row.credentials, this.key, {});
86
+ return {
87
+ service: row.service,
88
+ type: row.type,
89
+ label: row.label ?? undefined,
90
+ keys: Object.keys(creds),
91
+ };
92
+ });
93
+ }
94
+ async hasEntries(agent) {
95
+ const rows = await this.db.select({ service: this.vault.service }).from(this.vault)
96
+ .where(eq(this.vault.agent, agent))
97
+ .limit(1);
98
+ return rows.length > 0;
99
+ }
100
+ async renameAgent(oldName, newName) {
101
+ const now = new Date().toISOString();
102
+ await this.db.update(this.vault)
103
+ .set({ agent: newName, updatedAt: now })
104
+ .where(eq(this.vault.agent, oldName));
105
+ }
106
+ async removeAgent(agent) {
107
+ await this.db.delete(this.vault)
108
+ .where(eq(this.vault.agent, agent));
109
+ }
110
+ async migrateFromConfigs(agents) {
111
+ let migrated = 0;
112
+ for (const agent of agents) {
113
+ if (!agent.vault)
114
+ continue;
115
+ for (const [service, entry] of Object.entries(agent.vault)) {
116
+ // Skip if already in store
117
+ const existing = await this.get(agent.name, service);
118
+ if (existing)
119
+ continue;
120
+ await this.set(agent.name, service, entry);
121
+ migrated++;
122
+ }
123
+ // Strip credential VALUES from the config (keep metadata)
124
+ for (const [service, entry] of Object.entries(agent.vault)) {
125
+ const stripped = {};
126
+ for (const key of Object.keys(entry.credentials)) {
127
+ stripped[key] = ""; // Empty string signals "stored in vault"
128
+ }
129
+ agent.vault[service] = { ...entry, credentials: stripped };
130
+ }
131
+ }
132
+ return migrated;
133
+ }
134
+ // ── Internal ──
135
+ rowToEntry(row) {
136
+ const creds = decryptJson(row.credentials, this.key, {});
137
+ return {
138
+ type: row.type,
139
+ ...(row.label ? { label: row.label } : {}),
140
+ credentials: creds,
141
+ };
142
+ }
143
+ }
144
+ //# sourceMappingURL=vault-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-store.js","sourceRoot":"","sources":["../../src/stores/vault-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@polpo-ai/drizzle",
3
- "version": "0.1.2",
4
- "description": "Drizzle ORM store implementations for the Polpo AI agent orchestration framework (PostgreSQL + SQLite)",
3
+ "version": "0.2.0",
4
+ "description": "Drizzle ORM store implementations for the Polpo AI agent orchestration platform (PostgreSQL + SQLite)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -15,7 +15,8 @@
15
15
  "dependencies": {
16
16
  "drizzle-orm": "^0.44.0",
17
17
  "nanoid": "^5.1.2",
18
- "@polpo-ai/core": "0.1.2"
18
+ "@polpo-ai/core": "0.2.0",
19
+ "@polpo-ai/vault-crypto": "0.2.0"
19
20
  },
20
21
  "peerDependencies": {
21
22
  "postgres": "^3.4.0",