hippo-memory 1.15.0 → 1.17.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 (97) hide show
  1. package/README.md +862 -861
  2. package/dist/audit.d.ts +1 -1
  3. package/dist/audit.d.ts.map +1 -1
  4. package/dist/audit.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +1244 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/customer-notes.d.ts +95 -0
  9. package/dist/customer-notes.d.ts.map +1 -0
  10. package/dist/customer-notes.js +296 -0
  11. package/dist/customer-notes.js.map +1 -0
  12. package/dist/db.d.ts.map +1 -1
  13. package/dist/db.js +731 -1
  14. package/dist/db.js.map +1 -1
  15. package/dist/graph-extract.d.ts +55 -0
  16. package/dist/graph-extract.d.ts.map +1 -0
  17. package/dist/graph-extract.js +259 -0
  18. package/dist/graph-extract.js.map +1 -0
  19. package/dist/graph-recall.d.ts +41 -0
  20. package/dist/graph-recall.d.ts.map +1 -0
  21. package/dist/graph-recall.js +246 -0
  22. package/dist/graph-recall.js.map +1 -0
  23. package/dist/graph.d.ts +137 -0
  24. package/dist/graph.d.ts.map +1 -0
  25. package/dist/graph.js +433 -0
  26. package/dist/graph.js.map +1 -0
  27. package/dist/incidents.d.ts +100 -0
  28. package/dist/incidents.d.ts.map +1 -0
  29. package/dist/incidents.js +322 -0
  30. package/dist/incidents.js.map +1 -0
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/memory.d.ts +6 -0
  36. package/dist/memory.d.ts.map +1 -1
  37. package/dist/memory.js +6 -0
  38. package/dist/memory.js.map +1 -1
  39. package/dist/policies.d.ts +149 -0
  40. package/dist/policies.d.ts.map +1 -0
  41. package/dist/policies.js +380 -0
  42. package/dist/policies.js.map +1 -0
  43. package/dist/processes.d.ts +104 -0
  44. package/dist/processes.d.ts.map +1 -0
  45. package/dist/processes.js +330 -0
  46. package/dist/processes.js.map +1 -0
  47. package/dist/project-briefs.d.ts +126 -0
  48. package/dist/project-briefs.d.ts.map +1 -0
  49. package/dist/project-briefs.js +453 -0
  50. package/dist/project-briefs.js.map +1 -0
  51. package/dist/search.d.ts +7 -0
  52. package/dist/search.d.ts.map +1 -1
  53. package/dist/search.js.map +1 -1
  54. package/dist/server.d.ts.map +1 -1
  55. package/dist/server.js +1028 -16
  56. package/dist/server.js.map +1 -1
  57. package/dist/skills.d.ts +98 -0
  58. package/dist/skills.d.ts.map +1 -0
  59. package/dist/skills.js +339 -0
  60. package/dist/skills.js.map +1 -0
  61. package/dist/src/audit.js.map +1 -1
  62. package/dist/src/cli.js +1244 -3
  63. package/dist/src/cli.js.map +1 -1
  64. package/dist/src/customer-notes.js +296 -0
  65. package/dist/src/customer-notes.js.map +1 -0
  66. package/dist/src/db.js +731 -1
  67. package/dist/src/db.js.map +1 -1
  68. package/dist/src/graph-extract.js +259 -0
  69. package/dist/src/graph-extract.js.map +1 -0
  70. package/dist/src/graph-recall.js +246 -0
  71. package/dist/src/graph-recall.js.map +1 -0
  72. package/dist/src/graph.js +433 -0
  73. package/dist/src/graph.js.map +1 -0
  74. package/dist/src/incidents.js +322 -0
  75. package/dist/src/incidents.js.map +1 -0
  76. package/dist/src/index.js +1 -0
  77. package/dist/src/index.js.map +1 -1
  78. package/dist/src/memory.js +6 -0
  79. package/dist/src/memory.js.map +1 -1
  80. package/dist/src/policies.js +380 -0
  81. package/dist/src/policies.js.map +1 -0
  82. package/dist/src/processes.js +330 -0
  83. package/dist/src/processes.js.map +1 -0
  84. package/dist/src/project-briefs.js +453 -0
  85. package/dist/src/project-briefs.js.map +1 -0
  86. package/dist/src/search.js.map +1 -1
  87. package/dist/src/server.js +1028 -16
  88. package/dist/src/server.js.map +1 -1
  89. package/dist/src/skills.js +339 -0
  90. package/dist/src/skills.js.map +1 -0
  91. package/dist/src/version.js +1 -1
  92. package/dist/version.d.ts +1 -1
  93. package/dist/version.js +1 -1
  94. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  95. package/extensions/openclaw-plugin/package.json +1 -1
  96. package/openclaw.plugin.json +1 -1
  97. package/package.json +2 -2
@@ -0,0 +1,95 @@
1
+ /**
2
+ * E2 customer_note first-class object - the LAST E2 object
3
+ * (docs/plans/2026-06-01-e2-customer-note-object.md).
4
+ *
5
+ * A `customer_note` is a discrete note recorded against an account/customer entity:
6
+ * a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
7
+ * Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt -
8
+ * E3.1 planned - so an FK is deferred). Unlike project_brief's one-summary-per-repo,
9
+ * a customer accrues MANY discrete notes over time, each with its own supersede chain
10
+ * (correct a note -> a new version preserving history; close retires it).
11
+ *
12
+ * Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
13
+ * + CAS + INSERT-preflight + server-derived version + change_summary + supersede
14
+ * tenant-match trigger). It has NO assembler/renderer (the simplest E2 object): the
15
+ * contribution is purely the entity-scoping dimension.
16
+ *
17
+ * The `customer_notes` table is the source of truth (survives memory decay); the
18
+ * memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
19
+ *
20
+ * Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
21
+ */
22
+ export type NoteStatus = 'active' | 'superseded' | 'closed';
23
+ export declare const VALID_NOTE_STATES: ReadonlySet<NoteStatus>;
24
+ /** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
25
+ * than the 4096 short-field convention. */
26
+ export declare const MAX_CUSTOMER_LEN = 256;
27
+ export declare const MAX_NOTE_LEN = 8192;
28
+ export declare const MAX_CHANGE_SUMMARY_LEN = 4096;
29
+ export interface CustomerNote {
30
+ id: number;
31
+ /** Nullable: ON DELETE SET NULL lets memory deletion proceed without breaking
32
+ * the note row. */
33
+ memoryId: string | null;
34
+ tenantId: string;
35
+ /** The account/customer entity this note is scoped to (free-form identifier). */
36
+ customer: string;
37
+ /** The note body. */
38
+ note: string;
39
+ /** Server-derived: 1 on a fresh create, predecessor.version + 1 on supersede. */
40
+ version: number;
41
+ status: NoteStatus;
42
+ supersededBy: number | null;
43
+ supersededAt: string | null;
44
+ /** The per-version delta note; set on a successor row only (NULL on a v1). */
45
+ changeSummary: string | null;
46
+ closedAt: string | null;
47
+ createdAt: string;
48
+ }
49
+ export interface SaveCustomerNoteOpts {
50
+ customer: string;
51
+ note: string;
52
+ /** The delta note for a supersession; ignored (stored NULL) on a fresh create. */
53
+ changeSummary?: string;
54
+ /** Table id of an ACTIVE note this new version supersedes. */
55
+ supersedesNoteId?: number;
56
+ /** Extra memory tags merged after ['customer_note', 'customer:<lc>']. */
57
+ extraTags?: string[];
58
+ }
59
+ export interface ListCustomerNotesOpts {
60
+ status?: NoteStatus;
61
+ /** Filter to a single customer. */
62
+ customer?: string;
63
+ limit?: number;
64
+ }
65
+ /**
66
+ * Create a customer_note (or a new version that supersedes an existing one). Writes
67
+ * the memory mirror + the customer_notes row atomically inside writeEntry's SAVEPOINT.
68
+ * When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
69
+ * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same SAVEPOINT;
70
+ * the new version = predecessor.version + 1 (server-derived).
71
+ *
72
+ * The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
73
+ * + caller extraTags) so scope-aware recall treats the note as entity-local - the
74
+ * project_brief codex-P2 recall-locality lesson applied to entity scoping. There is
75
+ * no self-recursion path (customer_note has no receipt-query/refresh).
76
+ */
77
+ export declare function saveCustomerNote(hippoRoot: string, tenantId: string, opts: SaveCustomerNoteOpts, actor?: string): CustomerNote;
78
+ /**
79
+ * Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
80
+ * distinguishes not-found from not-active. A superseded row is terminal.
81
+ */
82
+ export declare function closeCustomerNote(hippoRoot: string, tenantId: string, id: number, actor?: string): CustomerNote;
83
+ export declare function loadCustomerNoteById(hippoRoot: string, tenantId: string, id: number): CustomerNote | null;
84
+ export declare function loadCustomerNotes(hippoRoot: string, tenantId: string, opts?: ListCustomerNotesOpts): CustomerNote[];
85
+ /**
86
+ * All ACTIVE notes for a customer, newest first. Returns a LIST (a customer accrues
87
+ * MANY notes) - this deliberately DIVERGES from project_brief's
88
+ * loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
89
+ * evolving summary. A future caller cloning the project_brief shape by analogy must
90
+ * not assume a single-return here; the plural name signals the list contract.
91
+ */
92
+ export declare function loadActiveNotesForCustomer(hippoRoot: string, tenantId: string, customer: string, opts?: {
93
+ limit?: number;
94
+ }): CustomerNote[];
95
+ //# sourceMappingURL=customer-notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-notes.d.ts","sourceRoot":"","sources":["../src/customer-notes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAWH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE5D,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,UAAU,CAIpD,CAAC;AAEH;4CAC4C;AAC5C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX;wBACoB;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,8EAA8E;IAC9E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAuFD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,oBAAoB,EAC1B,KAAK,GAAE,MAAc,GACpB,YAAY,CA+Gd;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,MAAc,GACpB,YAAY,CAkDd;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACT,YAAY,GAAG,IAAI,CAUrB;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,qBAA0B,GAC/B,YAAY,EAAE,CA+BhB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5B,YAAY,EAAE,CAEhB"}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * E2 customer_note first-class object - the LAST E2 object
3
+ * (docs/plans/2026-06-01-e2-customer-note-object.md).
4
+ *
5
+ * A `customer_note` is a discrete note recorded against an account/customer entity:
6
+ * a `note` body scoped to a `customer`, evolving via the supersede delta lifecycle.
7
+ * Entity-scoping is a free-form `customer` column (the `entities` table is unbuilt -
8
+ * E3.1 planned - so an FK is deferred). Unlike project_brief's one-summary-per-repo,
9
+ * a customer accrues MANY discrete notes over time, each with its own supersede chain
10
+ * (correct a note -> a new version preserving history; close retires it).
11
+ *
12
+ * Reuses the project_brief/skill supersede machinery verbatim (superseded_by self-FK
13
+ * + CAS + INSERT-preflight + server-derived version + change_summary + supersede
14
+ * tenant-match trigger). It has NO assembler/renderer (the simplest E2 object): the
15
+ * contribution is purely the entity-scoping dimension.
16
+ *
17
+ * The `customer_notes` table is the source of truth (survives memory decay); the
18
+ * memory mirror is for recall. memory_id is NULLABLE with ON DELETE SET NULL.
19
+ *
20
+ * Lifecycle: active -> superseded (a corrected version) or active -> closed (retired).
21
+ */
22
+ import { openHippoDb, closeHippoDb } from './db.js';
23
+ import { writeEntry, assertTenantId } from './store.js';
24
+ import { createMemory, Layer, CUSTOMER_NOTE_HALF_LIFE_DAYS } from './memory.js';
25
+ import { appendAuditEvent } from './audit.js';
26
+ export const VALID_NOTE_STATES = new Set([
27
+ 'active',
28
+ 'superseded',
29
+ 'closed',
30
+ ]);
31
+ /** Field caps (untrusted at the HTTP/SDK boundary). note is a body, so a larger cap
32
+ * than the 4096 short-field convention. */
33
+ export const MAX_CUSTOMER_LEN = 256;
34
+ export const MAX_NOTE_LEN = 8192;
35
+ export const MAX_CHANGE_SUMMARY_LEN = 4096;
36
+ // ---------------------------------------------------------------------------
37
+ // Validation
38
+ // ---------------------------------------------------------------------------
39
+ /**
40
+ * Validate + normalise note fields. `customer` is trimmed and MUST be a single line
41
+ * (no newlines): it becomes a `customer:<lc>` recall tag AND an identifier. `note` is
42
+ * kept verbatim (operator content) but capped. Returns the normalised customer.
43
+ */
44
+ function validateNoteFields(customer, note, changeSummary) {
45
+ const normalizedCustomer = (customer ?? '').trim();
46
+ if (normalizedCustomer.length === 0)
47
+ throw new Error('saveCustomerNote: customer is required');
48
+ if (/[\r\n]/.test(normalizedCustomer)) {
49
+ throw new Error('saveCustomerNote: customer must be a single line (no newlines)');
50
+ }
51
+ if (normalizedCustomer.length > MAX_CUSTOMER_LEN) {
52
+ throw new Error(`saveCustomerNote: customer exceeds the ${MAX_CUSTOMER_LEN}-char cap`);
53
+ }
54
+ if (!note || note.trim().length === 0) {
55
+ throw new Error('saveCustomerNote: note is required');
56
+ }
57
+ if (note.length > MAX_NOTE_LEN) {
58
+ throw new Error(`saveCustomerNote: note exceeds the ${MAX_NOTE_LEN}-char cap`);
59
+ }
60
+ if (changeSummary !== undefined && changeSummary.length > MAX_CHANGE_SUMMARY_LEN) {
61
+ throw new Error(`saveCustomerNote: changeSummary exceeds the ${MAX_CHANGE_SUMMARY_LEN}-char cap`);
62
+ }
63
+ return { customer: normalizedCustomer };
64
+ }
65
+ function rowToCustomerNote(row) {
66
+ return {
67
+ id: row.id,
68
+ memoryId: row.memory_id,
69
+ tenantId: row.tenant_id,
70
+ customer: row.customer,
71
+ note: row.note,
72
+ version: row.version,
73
+ status: row.status,
74
+ supersededBy: row.superseded_by,
75
+ supersededAt: row.superseded_at,
76
+ changeSummary: row.change_summary,
77
+ closedAt: row.closed_at,
78
+ createdAt: row.created_at,
79
+ };
80
+ }
81
+ const NOTE_COLS = `
82
+ id, memory_id, tenant_id, customer, note, version, status,
83
+ superseded_by, superseded_at, change_summary, closed_at, created_at
84
+ `;
85
+ /** Recall-surface content for the memory mirror: customer + note. Named (mirrors
86
+ * buildBriefContent) so the recall surface is deterministic + unit-testable. */
87
+ function buildNoteContent(customer, note) {
88
+ return `${customer}\n\n${note}`;
89
+ }
90
+ // ---------------------------------------------------------------------------
91
+ // Public API
92
+ // ---------------------------------------------------------------------------
93
+ /**
94
+ * Create a customer_note (or a new version that supersedes an existing one). Writes
95
+ * the memory mirror + the customer_notes row atomically inside writeEntry's SAVEPOINT.
96
+ * When supersedesNoteId is given, the referenced ACTIVE row is preflighted (status +
97
+ * version) BEFORE the INSERT, then CAS-UPDATEd -> superseded in the same SAVEPOINT;
98
+ * the new version = predecessor.version + 1 (server-derived).
99
+ *
100
+ * The memory mirror carries a `customer:<lc>` tag (in addition to ['customer_note']
101
+ * + caller extraTags) so scope-aware recall treats the note as entity-local - the
102
+ * project_brief codex-P2 recall-locality lesson applied to entity scoping. There is
103
+ * no self-recursion path (customer_note has no receipt-query/refresh).
104
+ */
105
+ export function saveCustomerNote(hippoRoot, tenantId, opts, actor = 'cli') {
106
+ assertTenantId('saveCustomerNote', tenantId);
107
+ const { customer } = validateNoteFields(opts.customer, opts.note, opts.changeSummary);
108
+ const isSupersede = opts.supersedesNoteId !== undefined;
109
+ const changeSummary = isSupersede ? (opts.changeSummary ?? null) : null;
110
+ const now = new Date().toISOString();
111
+ const content = buildNoteContent(customer, opts.note);
112
+ const tags = ['customer_note', `customer:${customer.toLowerCase()}`, ...(opts.extraTags ?? [])];
113
+ const mem = createMemory(content, {
114
+ tags,
115
+ layer: Layer.Semantic,
116
+ confidence: 'verified',
117
+ source: 'customer_note',
118
+ tenantId,
119
+ });
120
+ mem.half_life_days = CUSTOMER_NOTE_HALF_LIFE_DAYS;
121
+ let savedRow;
122
+ writeEntry(hippoRoot, mem, {
123
+ actor,
124
+ afterWrite: (db, memoryId) => {
125
+ // Preflight the supersede target BEFORE inserting the new row (so the new
126
+ // autoincrement id can never be its own supersede target); read the
127
+ // predecessor version in the same SELECT for server-derived versioning.
128
+ // Mirrors saveProjectBrief / saveSkill (codex P1 2026-05-28).
129
+ let version = 1;
130
+ if (opts.supersedesNoteId !== undefined) {
131
+ const pred = db.prepare(`SELECT status, version FROM customer_notes WHERE id = ? AND tenant_id = ?`).get(opts.supersedesNoteId, tenantId);
132
+ if (!pred) {
133
+ throw new Error(`saveCustomerNote: note ${opts.supersedesNoteId} to supersede not found for tenant ${tenantId}`);
134
+ }
135
+ if (pred.status !== 'active') {
136
+ throw new Error(`saveCustomerNote: note ${opts.supersedesNoteId} is not active (status='${pred.status}'); only active notes can be superseded.`);
137
+ }
138
+ version = pred.version + 1;
139
+ }
140
+ const result = db.prepare(`
141
+ INSERT INTO customer_notes(
142
+ memory_id, tenant_id, customer, note, version,
143
+ status, superseded_by, superseded_at, change_summary, closed_at, created_at
144
+ ) VALUES (?, ?, ?, ?, ?, 'active', NULL, NULL, ?, NULL, ?)
145
+ `).run(memoryId, tenantId, customer, opts.note, version, changeSummary, now);
146
+ const noteId = Number(result.lastInsertRowid ?? 0);
147
+ if (opts.supersedesNoteId !== undefined) {
148
+ const sup = db.prepare(`
149
+ UPDATE customer_notes
150
+ SET status = 'superseded', superseded_by = ?, superseded_at = ?
151
+ WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
152
+ `).run(noteId, now, opts.supersedesNoteId, tenantId, noteId);
153
+ if (sup.changes === 0) {
154
+ throw new Error(`saveCustomerNote: note ${opts.supersedesNoteId} could not be superseded (no longer active or self-reference).`);
155
+ }
156
+ appendAuditEvent(db, {
157
+ tenantId,
158
+ actor,
159
+ op: 'customer_note_supersede',
160
+ targetId: String(opts.supersedesNoteId),
161
+ metadata: {
162
+ note_id: opts.supersedesNoteId,
163
+ superseded_by: noteId,
164
+ new_version: version,
165
+ },
166
+ });
167
+ }
168
+ const row = db.prepare(`SELECT ${NOTE_COLS} FROM customer_notes WHERE id = ?`)
169
+ .get(noteId);
170
+ if (!row)
171
+ throw new Error('saveCustomerNote: failed to reload saved note row');
172
+ savedRow = row;
173
+ // GDPR-light metadata: ids + flags only, no note text.
174
+ appendAuditEvent(db, {
175
+ tenantId,
176
+ actor,
177
+ op: 'customer_note_create',
178
+ targetId: String(noteId),
179
+ metadata: {
180
+ note_id: noteId,
181
+ customer,
182
+ version,
183
+ },
184
+ });
185
+ },
186
+ });
187
+ if (!savedRow) {
188
+ throw new Error('saveCustomerNote: afterWrite did not populate the row');
189
+ }
190
+ return rowToCustomerNote(savedRow);
191
+ }
192
+ /**
193
+ * Close (retire) an active note. CAS guard WHERE status='active'; 0 changes
194
+ * distinguishes not-found from not-active. A superseded row is terminal.
195
+ */
196
+ export function closeCustomerNote(hippoRoot, tenantId, id, actor = 'cli') {
197
+ assertTenantId('closeCustomerNote', tenantId);
198
+ const now = new Date().toISOString();
199
+ const db = openHippoDb(hippoRoot);
200
+ try {
201
+ db.exec('BEGIN IMMEDIATE');
202
+ try {
203
+ const updateResult = db.prepare(`
204
+ UPDATE customer_notes
205
+ SET status = 'closed', closed_at = ?
206
+ WHERE id = ? AND tenant_id = ? AND status = 'active'
207
+ `).run(now, id, tenantId);
208
+ if (updateResult.changes === 0) {
209
+ const existing = db.prepare(`SELECT status FROM customer_notes WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
210
+ if (!existing) {
211
+ throw new Error(`closeCustomerNote: note ${id} not found for tenant ${tenantId}`);
212
+ }
213
+ throw new Error(`closeCustomerNote: note ${id} is not active (status='${existing.status}'); only active notes can be closed.`);
214
+ }
215
+ const row = db.prepare(`SELECT ${NOTE_COLS} FROM customer_notes WHERE id = ? AND tenant_id = ?`)
216
+ .get(id, tenantId);
217
+ if (!row)
218
+ throw new Error(`closeCustomerNote: note ${id} not found after UPDATE`);
219
+ appendAuditEvent(db, {
220
+ tenantId,
221
+ actor,
222
+ op: 'customer_note_close',
223
+ targetId: String(id),
224
+ metadata: { note_id: id },
225
+ });
226
+ db.exec('COMMIT');
227
+ return rowToCustomerNote(row);
228
+ }
229
+ catch (e) {
230
+ try {
231
+ db.exec('ROLLBACK');
232
+ }
233
+ catch {
234
+ // Ignore rollback failures — the throw below is what matters.
235
+ }
236
+ throw e;
237
+ }
238
+ }
239
+ finally {
240
+ closeHippoDb(db);
241
+ }
242
+ }
243
+ export function loadCustomerNoteById(hippoRoot, tenantId, id) {
244
+ assertTenantId('loadCustomerNoteById', tenantId);
245
+ const db = openHippoDb(hippoRoot);
246
+ try {
247
+ const row = db.prepare(`SELECT ${NOTE_COLS} FROM customer_notes WHERE id = ? AND tenant_id = ?`)
248
+ .get(id, tenantId);
249
+ return row ? rowToCustomerNote(row) : null;
250
+ }
251
+ finally {
252
+ closeHippoDb(db);
253
+ }
254
+ }
255
+ export function loadCustomerNotes(hippoRoot, tenantId, opts = {}) {
256
+ assertTenantId('loadCustomerNotes', tenantId);
257
+ const limit = opts.limit ?? 100;
258
+ if (opts.status && !VALID_NOTE_STATES.has(opts.status)) {
259
+ throw new Error(`loadCustomerNotes: status must be one of ${Array.from(VALID_NOTE_STATES).join('|')}; got ${opts.status}`);
260
+ }
261
+ const db = openHippoDb(hippoRoot);
262
+ try {
263
+ const clauses = ['tenant_id = ?'];
264
+ const params = [tenantId];
265
+ if (opts.status) {
266
+ clauses.push('status = ?');
267
+ params.push(opts.status);
268
+ }
269
+ if (opts.customer) {
270
+ clauses.push('customer = ?');
271
+ params.push(opts.customer);
272
+ }
273
+ params.push(limit);
274
+ const rows = db.prepare(`
275
+ SELECT ${NOTE_COLS} FROM customer_notes
276
+ WHERE ${clauses.join(' AND ')}
277
+ ORDER BY created_at DESC, id DESC
278
+ LIMIT ?
279
+ `).all(...params);
280
+ return rows.map(rowToCustomerNote);
281
+ }
282
+ finally {
283
+ closeHippoDb(db);
284
+ }
285
+ }
286
+ /**
287
+ * All ACTIVE notes for a customer, newest first. Returns a LIST (a customer accrues
288
+ * MANY notes) - this deliberately DIVERGES from project_brief's
289
+ * loadActiveBriefForRepo, which returns a single brief-or-null because a repo has one
290
+ * evolving summary. A future caller cloning the project_brief shape by analogy must
291
+ * not assume a single-return here; the plural name signals the list contract.
292
+ */
293
+ export function loadActiveNotesForCustomer(hippoRoot, tenantId, customer, opts = {}) {
294
+ return loadCustomerNotes(hippoRoot, tenantId, { customer, status: 'active', limit: opts.limit });
295
+ }
296
+ //# sourceMappingURL=customer-notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-notes.js","sourceRoot":"","sources":["../src/customer-notes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQ9C,MAAM,CAAC,MAAM,iBAAiB,GAA4B,IAAI,GAAG,CAAa;IAC5E,QAAQ;IACR,YAAY;IACZ,QAAQ;CACT,CAAC,CAAC;AAEH;4CAC4C;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAyC3C,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;GAIG;AACH,SAAS,kBAAkB,CACzB,QAAgB,EAChB,IAAY,EACZ,aAAiC;IAEjC,MAAM,kBAAkB,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC/F,IAAI,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,kBAAkB,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,0CAA0C,gBAAgB,WAAW,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,WAAW,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,+CAA+C,sBAAsB,WAAW,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;AAC1C,CAAC;AAqBD,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAoB;QAChC,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF;iFACiF;AACjF,SAAS,gBAAgB,CAAC,QAAgB,EAAE,IAAY;IACtD,OAAO,GAAG,QAAQ,OAAO,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,QAAgB,EAChB,IAA0B,EAC1B,QAAgB,KAAK;IAErB,cAAc,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,KAAK,SAAS,CAAC;IACxD,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAExE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,eAAe,EAAE,YAAY,QAAQ,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAChG,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE;QAChC,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,QAAQ;QACrB,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,eAAe;QACvB,QAAQ;KACT,CAAC,CAAC;IACH,GAAG,CAAC,cAAc,GAAG,4BAA4B,CAAC;IAElD,IAAI,QAAqC,CAAC;IAE1C,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK;QACL,UAAU,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE;YAC3B,0EAA0E;YAC1E,oEAAoE;YACpE,wEAAwE;YACxE,8DAA8D;YAC9D,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,2EAA2E,CAC5E,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAExB,CAAC;gBACd,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,gBAAgB,sCAAsC,QAAQ,EAAE,CAChG,CAAC;gBACJ,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,gBAAgB,2BAA2B,IAAI,CAAC,MAAM,0CAA0C,CAChI,CAAC;gBACJ,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;OAKzB,CAAC,CAAC,GAAG,CACJ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,IAAI,CAAC,IAAI,EACT,OAAO,EACP,aAAa,EACb,GAAG,CACJ,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;YAEnD,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;;;SAItB,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC7D,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,gBAAgB,gEAAgE,CAChH,CAAC;gBACJ,CAAC;gBACD,gBAAgB,CAAC,EAAE,EAAE;oBACnB,QAAQ;oBACR,KAAK;oBACL,EAAE,EAAE,yBAAyB;oBAC7B,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;oBACvC,QAAQ,EAAE;wBACR,OAAO,EAAE,IAAI,CAAC,gBAAgB;wBAC9B,aAAa,EAAE,MAAM;wBACrB,WAAW,EAAE,OAAO;qBACrB;iBACF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,SAAS,mCAAmC,CAAC;iBAC3E,GAAG,CAAC,MAAM,CAAgC,CAAC;YAC9C,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YAC/E,QAAQ,GAAG,GAAG,CAAC;YAEf,uDAAuD;YACvD,gBAAgB,CAAC,EAAE,EAAE;gBACnB,QAAQ;gBACR,KAAK;gBACL,EAAE,EAAE,sBAAsB;gBAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;gBACxB,QAAQ,EAAE;oBACR,OAAO,EAAE,MAAM;oBACf,QAAQ;oBACR,OAAO;iBACR;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,QAAgB,EAChB,EAAU,EACV,QAAgB,KAAK;IAErB,cAAc,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC;;;;OAI/B,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE1B,IAAI,YAAY,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,kEAAkE,CACnE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAmC,CAAC;gBACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE,yBAAyB,QAAQ,EAAE,CAAC,CAAC;gBACpF,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,2BAA2B,EAAE,2BAA2B,QAAQ,CAAC,MAAM,sCAAsC,CAC9G,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,SAAS,qDAAqD,CAAC;iBAC7F,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAgC,CAAC;YACpD,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,CAAC;YAElF,gBAAgB,CAAC,EAAE,EAAE;gBACnB,QAAQ;gBACR,KAAK;gBACL,EAAE,EAAE,qBAAqB;gBACzB,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBACpB,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;aAC1B,CAAC,CAAC;YAEH,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClB,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,QAAgB,EAChB,EAAU;IAEV,cAAc,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,SAAS,qDAAqD,CAAC;aAC7F,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAgC,CAAC;QACpD,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,QAAgB,EAChB,OAA8B,EAAE;IAEhC,cAAc,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,4CAA4C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAC1G,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,CAAC,eAAe,CAAC,CAAC;QAClC,MAAM,MAAM,GAAc,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;eACb,SAAS;cACV,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;;;KAG9B,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAsB,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,0BAA0B,CACxC,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,OAA2B,EAAE;IAE7B,OAAO,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACnG,CAAC"}
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AASA,UAAU,iBAAiB;IACzB,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;CACf;AAymCD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAcD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CA2B/D;AAgDD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,GAAG,MAAM,CAI7D;AAwDD,wBAAgB,YAAY,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAEvD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,CAGhF;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAE5D;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,SAAK,GAAG,IAAI,CAS5E"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AASA,UAAU,iBAAiB;IACzB,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG;QAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,GAAG,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACxC,KAAK,IAAI,IAAI,CAAC;CACf;AAu0DD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAcD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CA2B/D;AAgDD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,GAAG,MAAM,CAI7D;AAwDD,wBAAgB,YAAY,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,CAEvD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,MAAM,CAGhF;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAE5D;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,SAAK,GAAG,IAAI,CAS5E"}