@elizaos/plugin-finances 2.0.3-beta.5 → 2.0.3-beta.7
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.
- package/dist/actions/finances.d.ts +38 -0
- package/dist/actions/finances.d.ts.map +1 -0
- package/dist/actions/finances.js +368 -0
- package/dist/actions/finances.js.map +1 -0
- package/dist/components/finances/FinancesSpatialView.d.ts +80 -0
- package/dist/components/finances/FinancesSpatialView.d.ts.map +1 -0
- package/dist/components/finances/FinancesSpatialView.js +157 -0
- package/dist/components/finances/FinancesSpatialView.js.map +1 -0
- package/dist/components/finances/FinancesView.d.ts +97 -0
- package/dist/components/finances/FinancesView.d.ts.map +1 -0
- package/dist/components/finances/FinancesView.js +231 -0
- package/dist/components/finances/FinancesView.js.map +1 -0
- package/dist/components/finances/finances-view-bundle.d.ts +10 -0
- package/dist/components/finances/finances-view-bundle.d.ts.map +1 -0
- package/dist/components/finances/finances-view-bundle.js +5 -0
- package/dist/components/finances/finances-view-bundle.js.map +1 -0
- package/dist/db/finances-repository.d.ts +51 -0
- package/dist/db/finances-repository.d.ts.map +1 -0
- package/dist/db/finances-repository.js +521 -0
- package/dist/db/finances-repository.js.map +1 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +6 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +2615 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +133 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/sql.d.ts +65 -0
- package/dist/db/sql.d.ts.map +1 -0
- package/dist/db/sql.js +182 -0
- package/dist/db/sql.js.map +1 -0
- package/dist/finance-normalize.d.ts +24 -0
- package/dist/finance-normalize.d.ts.map +1 -0
- package/dist/finance-normalize.js +66 -0
- package/dist/finance-normalize.js.map +1 -0
- package/dist/finances-service.d.ts +179 -0
- package/dist/finances-service.d.ts.map +1 -0
- package/dist/finances-service.js +1122 -0
- package/dist/finances-service.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/payment-csv-import.d.ts +23 -0
- package/dist/payment-csv-import.d.ts.map +1 -0
- package/dist/payment-csv-import.js +271 -0
- package/dist/payment-csv-import.js.map +1 -0
- package/dist/payment-recurrence.d.ts +14 -0
- package/dist/payment-recurrence.d.ts.map +1 -0
- package/dist/payment-recurrence.js +190 -0
- package/dist/payment-recurrence.js.map +1 -0
- package/dist/payment-types.d.ts +158 -0
- package/dist/payment-types.d.ts.map +1 -0
- package/dist/payment-types.js +1 -0
- package/dist/payment-types.js.map +1 -0
- package/dist/plugin.d.ts +15 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +31 -0
- package/dist/plugin.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +21 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +9 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +5 -0
- package/dist/register.js.map +1 -0
- package/dist/services/browser-bridge-seam.d.ts +40 -0
- package/dist/services/browser-bridge-seam.d.ts.map +1 -0
- package/dist/services/browser-bridge-seam.js +39 -0
- package/dist/services/browser-bridge-seam.js.map +1 -0
- package/dist/services/gmail-seam.d.ts +40 -0
- package/dist/services/gmail-seam.d.ts.map +1 -0
- package/dist/services/gmail-seam.js +208 -0
- package/dist/services/gmail-seam.js.map +1 -0
- package/dist/services/migration.d.ts +65 -0
- package/dist/services/migration.d.ts.map +1 -0
- package/dist/services/migration.js +116 -0
- package/dist/services/migration.js.map +1 -0
- package/dist/services/subscriptions-service.d.ts +76 -0
- package/dist/services/subscriptions-service.d.ts.map +1 -0
- package/dist/services/subscriptions-service.js +1002 -0
- package/dist/services/subscriptions-service.js.map +1 -0
- package/dist/subscriptions-playbooks.d.ts +79 -0
- package/dist/subscriptions-playbooks.d.ts.map +1 -0
- package/dist/subscriptions-playbooks.js +871 -0
- package/dist/subscriptions-playbooks.js.map +1 -0
- package/dist/subscriptions-types.d.ts +80 -0
- package/dist/subscriptions-types.d.ts.map +1 -0
- package/dist/subscriptions-types.js +1 -0
- package/dist/subscriptions-types.js.map +1 -0
- package/dist/token-encryption.d.ts +42 -0
- package/dist/token-encryption.d.ts.map +1 -0
- package/dist/token-encryption.js +96 -0
- package/dist/token-encryption.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.js.map +1 -0
- package/dist/views/bundle.js +411 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +11 -11
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import {
|
|
3
|
+
executeRawSql,
|
|
4
|
+
parseJsonArray,
|
|
5
|
+
parseJsonRecord,
|
|
6
|
+
sqlBoolean,
|
|
7
|
+
sqlInteger,
|
|
8
|
+
sqlJson,
|
|
9
|
+
sqlNumber,
|
|
10
|
+
sqlQuote,
|
|
11
|
+
sqlText,
|
|
12
|
+
toBoolean,
|
|
13
|
+
toNumber,
|
|
14
|
+
toText
|
|
15
|
+
} from "./sql.js";
|
|
16
|
+
const FINANCE_SCHEMA = "app_finances";
|
|
17
|
+
const FINANCE_TABLES = {
|
|
18
|
+
paymentSources: `${FINANCE_SCHEMA}.life_payment_sources`,
|
|
19
|
+
paymentTransactions: `${FINANCE_SCHEMA}.life_payment_transactions`,
|
|
20
|
+
subscriptionAudits: `${FINANCE_SCHEMA}.life_subscription_audits`,
|
|
21
|
+
subscriptionCandidates: `${FINANCE_SCHEMA}.life_subscription_candidates`,
|
|
22
|
+
subscriptionCancellations: `${FINANCE_SCHEMA}.life_subscription_cancellations`
|
|
23
|
+
};
|
|
24
|
+
function isoNow() {
|
|
25
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
26
|
+
}
|
|
27
|
+
function parseSubscriptionAudit(row) {
|
|
28
|
+
return {
|
|
29
|
+
id: toText(row.id),
|
|
30
|
+
agentId: toText(row.agent_id),
|
|
31
|
+
source: toText(row.source, "gmail"),
|
|
32
|
+
queryWindowDays: toNumber(row.query_window_days, 180),
|
|
33
|
+
status: toText(
|
|
34
|
+
row.status,
|
|
35
|
+
"completed"
|
|
36
|
+
),
|
|
37
|
+
totalCandidates: toNumber(row.total_candidates, 0),
|
|
38
|
+
activeCandidates: toNumber(row.active_candidates, 0),
|
|
39
|
+
canceledCandidates: toNumber(row.canceled_candidates, 0),
|
|
40
|
+
uncertainCandidates: toNumber(row.uncertain_candidates, 0),
|
|
41
|
+
summary: toText(row.summary),
|
|
42
|
+
metadata: parseJsonRecord(row.metadata_json),
|
|
43
|
+
createdAt: toText(row.created_at),
|
|
44
|
+
updatedAt: toText(row.updated_at)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function parseSubscriptionCandidate(row) {
|
|
48
|
+
return {
|
|
49
|
+
id: toText(row.id),
|
|
50
|
+
agentId: toText(row.agent_id),
|
|
51
|
+
auditId: toText(row.audit_id),
|
|
52
|
+
serviceSlug: toText(row.service_slug),
|
|
53
|
+
serviceName: toText(row.service_name),
|
|
54
|
+
provider: toText(row.provider),
|
|
55
|
+
cadence: toText(
|
|
56
|
+
row.cadence,
|
|
57
|
+
"unknown"
|
|
58
|
+
),
|
|
59
|
+
state: toText(
|
|
60
|
+
row.state,
|
|
61
|
+
"uncertain"
|
|
62
|
+
),
|
|
63
|
+
confidence: toNumber(row.confidence, 0),
|
|
64
|
+
annualCostEstimateUsd: row.annual_cost_estimate_usd === null || row.annual_cost_estimate_usd === void 0 ? null : toNumber(row.annual_cost_estimate_usd, 0),
|
|
65
|
+
managementUrl: row.management_url ? toText(row.management_url) : null,
|
|
66
|
+
latestEvidenceAt: row.latest_evidence_at ? toText(row.latest_evidence_at) : null,
|
|
67
|
+
evidenceJson: parseJsonArray(row.evidence_json),
|
|
68
|
+
metadata: parseJsonRecord(row.metadata_json),
|
|
69
|
+
createdAt: toText(row.created_at),
|
|
70
|
+
updatedAt: toText(row.updated_at)
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function parseSubscriptionCancellation(row) {
|
|
74
|
+
return {
|
|
75
|
+
id: toText(row.id),
|
|
76
|
+
agentId: toText(row.agent_id),
|
|
77
|
+
auditId: row.audit_id ? toText(row.audit_id) : null,
|
|
78
|
+
candidateId: row.candidate_id ? toText(row.candidate_id) : null,
|
|
79
|
+
serviceSlug: toText(row.service_slug),
|
|
80
|
+
serviceName: toText(row.service_name),
|
|
81
|
+
executor: toText(
|
|
82
|
+
row.executor,
|
|
83
|
+
"agent_browser"
|
|
84
|
+
),
|
|
85
|
+
status: toText(
|
|
86
|
+
row.status,
|
|
87
|
+
"draft"
|
|
88
|
+
),
|
|
89
|
+
confirmed: toBoolean(row.confirmed),
|
|
90
|
+
currentStep: row.current_step ? toText(row.current_step) : null,
|
|
91
|
+
browserSessionId: row.browser_session_id ? toText(row.browser_session_id) : null,
|
|
92
|
+
evidenceSummary: row.evidence_summary ? toText(row.evidence_summary) : null,
|
|
93
|
+
artifactCount: toNumber(row.artifact_count, 0),
|
|
94
|
+
managementUrl: row.management_url ? toText(row.management_url) : null,
|
|
95
|
+
error: row.error ? toText(row.error) : null,
|
|
96
|
+
metadata: parseJsonRecord(row.metadata_json),
|
|
97
|
+
createdAt: toText(row.created_at),
|
|
98
|
+
updatedAt: toText(row.updated_at),
|
|
99
|
+
finishedAt: row.finished_at ? toText(row.finished_at) : null
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function parsePaymentSource(row) {
|
|
103
|
+
return {
|
|
104
|
+
id: toText(row.id),
|
|
105
|
+
agentId: toText(row.agent_id),
|
|
106
|
+
kind: toText(row.kind, "manual"),
|
|
107
|
+
label: toText(row.label),
|
|
108
|
+
institution: row.institution ? toText(row.institution) : null,
|
|
109
|
+
accountMask: row.account_mask ? toText(row.account_mask) : null,
|
|
110
|
+
status: toText(row.status, "active"),
|
|
111
|
+
lastSyncedAt: row.last_synced_at ? toText(row.last_synced_at) : null,
|
|
112
|
+
transactionCount: toNumber(row.transaction_count, 0),
|
|
113
|
+
metadata: parseJsonRecord(row.metadata_json),
|
|
114
|
+
createdAt: toText(row.created_at),
|
|
115
|
+
updatedAt: toText(row.updated_at)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function parsePaymentTransaction(row) {
|
|
119
|
+
return {
|
|
120
|
+
id: toText(row.id),
|
|
121
|
+
agentId: toText(row.agent_id),
|
|
122
|
+
sourceId: toText(row.source_id),
|
|
123
|
+
externalId: row.external_id ? toText(row.external_id) : null,
|
|
124
|
+
postedAt: toText(row.posted_at),
|
|
125
|
+
amountUsd: toNumber(row.amount_usd, 0),
|
|
126
|
+
direction: toText(row.direction, "debit"),
|
|
127
|
+
merchantRaw: toText(row.merchant_raw),
|
|
128
|
+
merchantNormalized: toText(row.merchant_normalized),
|
|
129
|
+
description: row.description ? toText(row.description) : null,
|
|
130
|
+
category: row.category ? toText(row.category) : null,
|
|
131
|
+
currency: toText(row.currency, "USD"),
|
|
132
|
+
metadata: parseJsonRecord(row.metadata_json),
|
|
133
|
+
createdAt: toText(row.created_at)
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function createLifeOpsSubscriptionAudit(params) {
|
|
137
|
+
const timestamp = isoNow();
|
|
138
|
+
return {
|
|
139
|
+
...params,
|
|
140
|
+
id: crypto.randomUUID(),
|
|
141
|
+
createdAt: timestamp,
|
|
142
|
+
updatedAt: timestamp
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function createLifeOpsSubscriptionCandidate(params) {
|
|
146
|
+
const timestamp = isoNow();
|
|
147
|
+
return {
|
|
148
|
+
...params,
|
|
149
|
+
id: crypto.randomUUID(),
|
|
150
|
+
createdAt: timestamp,
|
|
151
|
+
updatedAt: timestamp
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function createLifeOpsSubscriptionCancellation(params) {
|
|
155
|
+
const timestamp = isoNow();
|
|
156
|
+
return {
|
|
157
|
+
...params,
|
|
158
|
+
id: crypto.randomUUID(),
|
|
159
|
+
createdAt: timestamp,
|
|
160
|
+
updatedAt: timestamp
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
class FinancesRepository {
|
|
164
|
+
constructor(runtime) {
|
|
165
|
+
this.runtime = runtime;
|
|
166
|
+
}
|
|
167
|
+
runtime;
|
|
168
|
+
async createSubscriptionAudit(audit) {
|
|
169
|
+
await executeRawSql(
|
|
170
|
+
this.runtime,
|
|
171
|
+
`INSERT INTO ${FINANCE_TABLES.subscriptionAudits} (
|
|
172
|
+
id, agent_id, source, query_window_days, status, total_candidates,
|
|
173
|
+
active_candidates, canceled_candidates, uncertain_candidates, summary,
|
|
174
|
+
metadata_json, created_at, updated_at
|
|
175
|
+
) VALUES (
|
|
176
|
+
${sqlQuote(audit.id)},
|
|
177
|
+
${sqlQuote(audit.agentId)},
|
|
178
|
+
${sqlQuote(audit.source)},
|
|
179
|
+
${sqlInteger(audit.queryWindowDays)},
|
|
180
|
+
${sqlQuote(audit.status)},
|
|
181
|
+
${sqlInteger(audit.totalCandidates)},
|
|
182
|
+
${sqlInteger(audit.activeCandidates)},
|
|
183
|
+
${sqlInteger(audit.canceledCandidates)},
|
|
184
|
+
${sqlInteger(audit.uncertainCandidates)},
|
|
185
|
+
${sqlQuote(audit.summary)},
|
|
186
|
+
${sqlJson(audit.metadata)},
|
|
187
|
+
${sqlQuote(audit.createdAt)},
|
|
188
|
+
${sqlQuote(audit.updatedAt)}
|
|
189
|
+
)`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
async updateSubscriptionAudit(audit) {
|
|
193
|
+
await executeRawSql(
|
|
194
|
+
this.runtime,
|
|
195
|
+
`UPDATE ${FINANCE_TABLES.subscriptionAudits}
|
|
196
|
+
SET source = ${sqlQuote(audit.source)},
|
|
197
|
+
query_window_days = ${sqlInteger(audit.queryWindowDays)},
|
|
198
|
+
status = ${sqlQuote(audit.status)},
|
|
199
|
+
total_candidates = ${sqlInteger(audit.totalCandidates)},
|
|
200
|
+
active_candidates = ${sqlInteger(audit.activeCandidates)},
|
|
201
|
+
canceled_candidates = ${sqlInteger(audit.canceledCandidates)},
|
|
202
|
+
uncertain_candidates = ${sqlInteger(audit.uncertainCandidates)},
|
|
203
|
+
summary = ${sqlQuote(audit.summary)},
|
|
204
|
+
metadata_json = ${sqlJson(audit.metadata)},
|
|
205
|
+
updated_at = ${sqlQuote(audit.updatedAt)}
|
|
206
|
+
WHERE id = ${sqlQuote(audit.id)}
|
|
207
|
+
AND agent_id = ${sqlQuote(audit.agentId)}`
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
async getSubscriptionAudit(agentId, auditId) {
|
|
211
|
+
const rows = await executeRawSql(
|
|
212
|
+
this.runtime,
|
|
213
|
+
`SELECT *
|
|
214
|
+
FROM ${FINANCE_TABLES.subscriptionAudits}
|
|
215
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
216
|
+
AND id = ${sqlQuote(auditId)}
|
|
217
|
+
LIMIT 1`
|
|
218
|
+
);
|
|
219
|
+
const row = rows[0];
|
|
220
|
+
return row ? parseSubscriptionAudit(row) : null;
|
|
221
|
+
}
|
|
222
|
+
async getLatestSubscriptionAudit(agentId) {
|
|
223
|
+
const rows = await executeRawSql(
|
|
224
|
+
this.runtime,
|
|
225
|
+
`SELECT *
|
|
226
|
+
FROM ${FINANCE_TABLES.subscriptionAudits}
|
|
227
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
228
|
+
ORDER BY updated_at DESC, created_at DESC
|
|
229
|
+
LIMIT 1`
|
|
230
|
+
);
|
|
231
|
+
const row = rows[0];
|
|
232
|
+
return row ? parseSubscriptionAudit(row) : null;
|
|
233
|
+
}
|
|
234
|
+
async createSubscriptionCandidate(candidate) {
|
|
235
|
+
await executeRawSql(
|
|
236
|
+
this.runtime,
|
|
237
|
+
`INSERT INTO ${FINANCE_TABLES.subscriptionCandidates} (
|
|
238
|
+
id, agent_id, audit_id, service_slug, service_name, provider, cadence,
|
|
239
|
+
state, confidence, annual_cost_estimate_usd, management_url,
|
|
240
|
+
latest_evidence_at, evidence_json, metadata_json, created_at, updated_at
|
|
241
|
+
) VALUES (
|
|
242
|
+
${sqlQuote(candidate.id)},
|
|
243
|
+
${sqlQuote(candidate.agentId)},
|
|
244
|
+
${sqlQuote(candidate.auditId)},
|
|
245
|
+
${sqlQuote(candidate.serviceSlug)},
|
|
246
|
+
${sqlQuote(candidate.serviceName)},
|
|
247
|
+
${sqlQuote(candidate.provider)},
|
|
248
|
+
${sqlQuote(candidate.cadence)},
|
|
249
|
+
${sqlQuote(candidate.state)},
|
|
250
|
+
${sqlNumber(candidate.confidence)},
|
|
251
|
+
${sqlNumber(candidate.annualCostEstimateUsd)},
|
|
252
|
+
${sqlText(candidate.managementUrl)},
|
|
253
|
+
${sqlText(candidate.latestEvidenceAt)},
|
|
254
|
+
${sqlJson(candidate.evidenceJson)},
|
|
255
|
+
${sqlJson(candidate.metadata)},
|
|
256
|
+
${sqlQuote(candidate.createdAt)},
|
|
257
|
+
${sqlQuote(candidate.updatedAt)}
|
|
258
|
+
)
|
|
259
|
+
ON CONFLICT(agent_id, audit_id, service_slug) DO UPDATE SET
|
|
260
|
+
service_name = excluded.service_name,
|
|
261
|
+
provider = excluded.provider,
|
|
262
|
+
cadence = excluded.cadence,
|
|
263
|
+
state = excluded.state,
|
|
264
|
+
confidence = excluded.confidence,
|
|
265
|
+
annual_cost_estimate_usd = excluded.annual_cost_estimate_usd,
|
|
266
|
+
management_url = excluded.management_url,
|
|
267
|
+
latest_evidence_at = excluded.latest_evidence_at,
|
|
268
|
+
evidence_json = excluded.evidence_json,
|
|
269
|
+
metadata_json = excluded.metadata_json,
|
|
270
|
+
updated_at = excluded.updated_at`
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
async listSubscriptionCandidatesForAudit(agentId, auditId) {
|
|
274
|
+
const rows = await executeRawSql(
|
|
275
|
+
this.runtime,
|
|
276
|
+
`SELECT *
|
|
277
|
+
FROM ${FINANCE_TABLES.subscriptionCandidates}
|
|
278
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
279
|
+
AND audit_id = ${sqlQuote(auditId)}
|
|
280
|
+
ORDER BY confidence DESC, service_name ASC`
|
|
281
|
+
);
|
|
282
|
+
return rows.map(parseSubscriptionCandidate);
|
|
283
|
+
}
|
|
284
|
+
async getSubscriptionCandidate(agentId, candidateId) {
|
|
285
|
+
const rows = await executeRawSql(
|
|
286
|
+
this.runtime,
|
|
287
|
+
`SELECT *
|
|
288
|
+
FROM ${FINANCE_TABLES.subscriptionCandidates}
|
|
289
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
290
|
+
AND id = ${sqlQuote(candidateId)}
|
|
291
|
+
LIMIT 1`
|
|
292
|
+
);
|
|
293
|
+
const row = rows[0];
|
|
294
|
+
return row ? parseSubscriptionCandidate(row) : null;
|
|
295
|
+
}
|
|
296
|
+
async createSubscriptionCancellation(cancellation) {
|
|
297
|
+
await executeRawSql(
|
|
298
|
+
this.runtime,
|
|
299
|
+
`INSERT INTO ${FINANCE_TABLES.subscriptionCancellations} (
|
|
300
|
+
id, agent_id, audit_id, candidate_id, service_slug, service_name,
|
|
301
|
+
executor, status, confirmed, current_step, browser_session_id,
|
|
302
|
+
evidence_summary, artifact_count, management_url, error, metadata_json,
|
|
303
|
+
created_at, updated_at, finished_at
|
|
304
|
+
) VALUES (
|
|
305
|
+
${sqlQuote(cancellation.id)},
|
|
306
|
+
${sqlQuote(cancellation.agentId)},
|
|
307
|
+
${sqlText(cancellation.auditId)},
|
|
308
|
+
${sqlText(cancellation.candidateId)},
|
|
309
|
+
${sqlQuote(cancellation.serviceSlug)},
|
|
310
|
+
${sqlQuote(cancellation.serviceName)},
|
|
311
|
+
${sqlQuote(cancellation.executor)},
|
|
312
|
+
${sqlQuote(cancellation.status)},
|
|
313
|
+
${sqlBoolean(cancellation.confirmed)},
|
|
314
|
+
${sqlText(cancellation.currentStep)},
|
|
315
|
+
${sqlText(cancellation.browserSessionId)},
|
|
316
|
+
${sqlText(cancellation.evidenceSummary)},
|
|
317
|
+
${sqlInteger(cancellation.artifactCount)},
|
|
318
|
+
${sqlText(cancellation.managementUrl)},
|
|
319
|
+
${sqlText(cancellation.error)},
|
|
320
|
+
${sqlJson(cancellation.metadata)},
|
|
321
|
+
${sqlQuote(cancellation.createdAt)},
|
|
322
|
+
${sqlQuote(cancellation.updatedAt)},
|
|
323
|
+
${sqlText(cancellation.finishedAt)}
|
|
324
|
+
)`
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
async updateSubscriptionCancellation(cancellation) {
|
|
328
|
+
await executeRawSql(
|
|
329
|
+
this.runtime,
|
|
330
|
+
`UPDATE ${FINANCE_TABLES.subscriptionCancellations}
|
|
331
|
+
SET audit_id = ${sqlText(cancellation.auditId)},
|
|
332
|
+
candidate_id = ${sqlText(cancellation.candidateId)},
|
|
333
|
+
service_slug = ${sqlQuote(cancellation.serviceSlug)},
|
|
334
|
+
service_name = ${sqlQuote(cancellation.serviceName)},
|
|
335
|
+
executor = ${sqlQuote(cancellation.executor)},
|
|
336
|
+
status = ${sqlQuote(cancellation.status)},
|
|
337
|
+
confirmed = ${sqlBoolean(cancellation.confirmed)},
|
|
338
|
+
current_step = ${sqlText(cancellation.currentStep)},
|
|
339
|
+
browser_session_id = ${sqlText(cancellation.browserSessionId)},
|
|
340
|
+
evidence_summary = ${sqlText(cancellation.evidenceSummary)},
|
|
341
|
+
artifact_count = ${sqlInteger(cancellation.artifactCount)},
|
|
342
|
+
management_url = ${sqlText(cancellation.managementUrl)},
|
|
343
|
+
error = ${sqlText(cancellation.error)},
|
|
344
|
+
metadata_json = ${sqlJson(cancellation.metadata)},
|
|
345
|
+
updated_at = ${sqlQuote(cancellation.updatedAt)},
|
|
346
|
+
finished_at = ${sqlText(cancellation.finishedAt)}
|
|
347
|
+
WHERE id = ${sqlQuote(cancellation.id)}
|
|
348
|
+
AND agent_id = ${sqlQuote(cancellation.agentId)}`
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
async getSubscriptionCancellation(agentId, cancellationId) {
|
|
352
|
+
const rows = await executeRawSql(
|
|
353
|
+
this.runtime,
|
|
354
|
+
`SELECT *
|
|
355
|
+
FROM ${FINANCE_TABLES.subscriptionCancellations}
|
|
356
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
357
|
+
AND id = ${sqlQuote(cancellationId)}
|
|
358
|
+
LIMIT 1`
|
|
359
|
+
);
|
|
360
|
+
const row = rows[0];
|
|
361
|
+
return row ? parseSubscriptionCancellation(row) : null;
|
|
362
|
+
}
|
|
363
|
+
async getLatestSubscriptionCancellation(agentId, serviceSlug) {
|
|
364
|
+
const serviceClause = serviceSlug ? `AND service_slug = ${sqlQuote(serviceSlug)}` : "";
|
|
365
|
+
const rows = await executeRawSql(
|
|
366
|
+
this.runtime,
|
|
367
|
+
`SELECT *
|
|
368
|
+
FROM ${FINANCE_TABLES.subscriptionCancellations}
|
|
369
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
370
|
+
${serviceClause}
|
|
371
|
+
ORDER BY updated_at DESC, created_at DESC
|
|
372
|
+
LIMIT 1`
|
|
373
|
+
);
|
|
374
|
+
const row = rows[0];
|
|
375
|
+
return row ? parseSubscriptionCancellation(row) : null;
|
|
376
|
+
}
|
|
377
|
+
async upsertPaymentSource(source) {
|
|
378
|
+
await executeRawSql(
|
|
379
|
+
this.runtime,
|
|
380
|
+
`INSERT INTO ${FINANCE_TABLES.paymentSources} (
|
|
381
|
+
id, agent_id, kind, label, institution, account_mask, status,
|
|
382
|
+
last_synced_at, transaction_count, metadata_json, created_at, updated_at
|
|
383
|
+
) VALUES (
|
|
384
|
+
${sqlQuote(source.id)},
|
|
385
|
+
${sqlQuote(source.agentId)},
|
|
386
|
+
${sqlQuote(source.kind)},
|
|
387
|
+
${sqlQuote(source.label)},
|
|
388
|
+
${sqlText(source.institution)},
|
|
389
|
+
${sqlText(source.accountMask)},
|
|
390
|
+
${sqlQuote(source.status)},
|
|
391
|
+
${sqlText(source.lastSyncedAt)},
|
|
392
|
+
${sqlInteger(source.transactionCount)},
|
|
393
|
+
${sqlJson(source.metadata)},
|
|
394
|
+
${sqlQuote(source.createdAt)},
|
|
395
|
+
${sqlQuote(source.updatedAt)}
|
|
396
|
+
)
|
|
397
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
398
|
+
kind = excluded.kind,
|
|
399
|
+
label = excluded.label,
|
|
400
|
+
institution = excluded.institution,
|
|
401
|
+
account_mask = excluded.account_mask,
|
|
402
|
+
status = excluded.status,
|
|
403
|
+
last_synced_at = excluded.last_synced_at,
|
|
404
|
+
transaction_count = excluded.transaction_count,
|
|
405
|
+
metadata_json = excluded.metadata_json,
|
|
406
|
+
updated_at = excluded.updated_at`
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
async listPaymentSources(agentId) {
|
|
410
|
+
const rows = await executeRawSql(
|
|
411
|
+
this.runtime,
|
|
412
|
+
`SELECT *
|
|
413
|
+
FROM ${FINANCE_TABLES.paymentSources}
|
|
414
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
415
|
+
ORDER BY created_at DESC`
|
|
416
|
+
);
|
|
417
|
+
return rows.map(parsePaymentSource);
|
|
418
|
+
}
|
|
419
|
+
async getPaymentSource(agentId, sourceId) {
|
|
420
|
+
const rows = await executeRawSql(
|
|
421
|
+
this.runtime,
|
|
422
|
+
`SELECT *
|
|
423
|
+
FROM ${FINANCE_TABLES.paymentSources}
|
|
424
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
425
|
+
AND id = ${sqlQuote(sourceId)}
|
|
426
|
+
LIMIT 1`
|
|
427
|
+
);
|
|
428
|
+
const row = rows[0];
|
|
429
|
+
return row ? parsePaymentSource(row) : null;
|
|
430
|
+
}
|
|
431
|
+
async deletePaymentSource(agentId, sourceId) {
|
|
432
|
+
await executeRawSql(
|
|
433
|
+
this.runtime,
|
|
434
|
+
`DELETE FROM ${FINANCE_TABLES.paymentTransactions}
|
|
435
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
436
|
+
AND source_id = ${sqlQuote(sourceId)}`
|
|
437
|
+
);
|
|
438
|
+
await executeRawSql(
|
|
439
|
+
this.runtime,
|
|
440
|
+
`DELETE FROM ${FINANCE_TABLES.paymentSources}
|
|
441
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
442
|
+
AND id = ${sqlQuote(sourceId)}`
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
async deletePaymentTransactionById(agentId, transactionId) {
|
|
446
|
+
await executeRawSql(
|
|
447
|
+
this.runtime,
|
|
448
|
+
`DELETE FROM ${FINANCE_TABLES.paymentTransactions}
|
|
449
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
450
|
+
AND id = ${sqlQuote(transactionId)}`
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
async insertPaymentTransaction(transaction) {
|
|
454
|
+
const rows = await executeRawSql(
|
|
455
|
+
this.runtime,
|
|
456
|
+
`INSERT INTO ${FINANCE_TABLES.paymentTransactions} (
|
|
457
|
+
id, agent_id, source_id, external_id, posted_at, amount_usd, direction,
|
|
458
|
+
merchant_raw, merchant_normalized, description, category, currency,
|
|
459
|
+
metadata_json, created_at
|
|
460
|
+
) VALUES (
|
|
461
|
+
${sqlQuote(transaction.id)},
|
|
462
|
+
${sqlQuote(transaction.agentId)},
|
|
463
|
+
${sqlQuote(transaction.sourceId)},
|
|
464
|
+
${sqlText(transaction.externalId)},
|
|
465
|
+
${sqlQuote(transaction.postedAt)},
|
|
466
|
+
${sqlNumber(transaction.amountUsd)},
|
|
467
|
+
${sqlQuote(transaction.direction)},
|
|
468
|
+
${sqlQuote(transaction.merchantRaw)},
|
|
469
|
+
${sqlQuote(transaction.merchantNormalized)},
|
|
470
|
+
${sqlText(transaction.description)},
|
|
471
|
+
${sqlText(transaction.category)},
|
|
472
|
+
${sqlQuote(transaction.currency)},
|
|
473
|
+
${sqlJson(transaction.metadata)},
|
|
474
|
+
${sqlQuote(transaction.createdAt)}
|
|
475
|
+
)
|
|
476
|
+
ON CONFLICT DO NOTHING
|
|
477
|
+
RETURNING id`
|
|
478
|
+
);
|
|
479
|
+
return rows.length > 0;
|
|
480
|
+
}
|
|
481
|
+
async listPaymentTransactions(agentId, args = {}) {
|
|
482
|
+
const limit = Math.max(1, Math.min(5e3, Math.trunc(args.limit ?? 500)));
|
|
483
|
+
const sourceClause = args.sourceId ? `AND source_id = ${sqlQuote(args.sourceId)}` : "";
|
|
484
|
+
const sinceClause = args.sinceAt ? `AND posted_at >= ${sqlQuote(args.sinceAt)}` : "";
|
|
485
|
+
const untilClause = args.untilAt ? `AND posted_at <= ${sqlQuote(args.untilAt)}` : "";
|
|
486
|
+
const merchantClause = args.merchantContains ? `AND merchant_normalized LIKE ${sqlQuote(`%${args.merchantContains.trim().toLowerCase()}%`)}` : "";
|
|
487
|
+
const directionClause = args.onlyDebits ? `AND direction = ${sqlQuote("debit")}` : "";
|
|
488
|
+
const rows = await executeRawSql(
|
|
489
|
+
this.runtime,
|
|
490
|
+
`SELECT *
|
|
491
|
+
FROM ${FINANCE_TABLES.paymentTransactions}
|
|
492
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
493
|
+
${sourceClause}
|
|
494
|
+
${sinceClause}
|
|
495
|
+
${untilClause}
|
|
496
|
+
${merchantClause}
|
|
497
|
+
${directionClause}
|
|
498
|
+
ORDER BY posted_at DESC
|
|
499
|
+
LIMIT ${limit}`
|
|
500
|
+
);
|
|
501
|
+
return rows.map(parsePaymentTransaction);
|
|
502
|
+
}
|
|
503
|
+
async countPaymentTransactionsForSource(agentId, sourceId) {
|
|
504
|
+
const rows = await executeRawSql(
|
|
505
|
+
this.runtime,
|
|
506
|
+
`SELECT COUNT(*) AS count
|
|
507
|
+
FROM ${FINANCE_TABLES.paymentTransactions}
|
|
508
|
+
WHERE agent_id = ${sqlQuote(agentId)}
|
|
509
|
+
AND source_id = ${sqlQuote(sourceId)}`
|
|
510
|
+
);
|
|
511
|
+
const row = rows[0];
|
|
512
|
+
return row ? toNumber(row.count ?? row.COUNT, 0) : 0;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
export {
|
|
516
|
+
FinancesRepository,
|
|
517
|
+
createLifeOpsSubscriptionAudit,
|
|
518
|
+
createLifeOpsSubscriptionCancellation,
|
|
519
|
+
createLifeOpsSubscriptionCandidate
|
|
520
|
+
};
|
|
521
|
+
//# sourceMappingURL=finances-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/finances-repository.ts"],"sourcesContent":["/**\n * Raw-SQL repository for the finance back-end.\n *\n * Owns all reads/writes against the `app_finances` schema (payment sources,\n * payment transactions, subscription audits / candidates / cancellations).\n * Table NAMES are preserved verbatim from the original LifeOps tables\n * (`life_payment_*`, `life_subscription_*`) so the schema-copy migration in\n * {@link ../services/migration.ts} can move existing rows across schemas.\n *\n * Every statement qualifies its table with the `app_finances.` prefix via\n * {@link FINANCE_TABLES}. SQL execution + value encoding go through the\n * self-contained {@link ./sql.ts} helpers (the runtime DB handle), so this\n * repository has no dependency on plugin-personal-assistant.\n */\n\nimport crypto from \"node:crypto\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport type {\n LifeOpsPaymentDirection,\n LifeOpsPaymentSource,\n LifeOpsPaymentSourceKind,\n LifeOpsPaymentSourceStatus,\n LifeOpsPaymentTransaction,\n} from \"../payment-types.js\";\nimport type {\n LifeOpsSubscriptionAudit,\n LifeOpsSubscriptionCancellation,\n LifeOpsSubscriptionCandidate,\n} from \"../subscriptions-types.js\";\nimport {\n executeRawSql,\n parseJsonArray,\n parseJsonRecord,\n sqlBoolean,\n sqlInteger,\n sqlJson,\n sqlNumber,\n sqlQuote,\n sqlText,\n toBoolean,\n toNumber,\n toText,\n} from \"./sql.js\";\n\nconst FINANCE_SCHEMA = \"app_finances\";\nconst FINANCE_TABLES = {\n paymentSources: `${FINANCE_SCHEMA}.life_payment_sources`,\n paymentTransactions: `${FINANCE_SCHEMA}.life_payment_transactions`,\n subscriptionAudits: `${FINANCE_SCHEMA}.life_subscription_audits`,\n subscriptionCandidates: `${FINANCE_SCHEMA}.life_subscription_candidates`,\n subscriptionCancellations: `${FINANCE_SCHEMA}.life_subscription_cancellations`,\n} as const;\n\nfunction isoNow(): string {\n return new Date().toISOString();\n}\n\n// ---------------------------------------------------------------------------\n// Row parsers — DB row → domain object\n// ---------------------------------------------------------------------------\n\nfunction parseSubscriptionAudit(\n row: Record<string, unknown>,\n): LifeOpsSubscriptionAudit {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n source: toText(row.source, \"gmail\") as LifeOpsSubscriptionAudit[\"source\"],\n queryWindowDays: toNumber(row.query_window_days, 180),\n status: toText(\n row.status,\n \"completed\",\n ) as LifeOpsSubscriptionAudit[\"status\"],\n totalCandidates: toNumber(row.total_candidates, 0),\n activeCandidates: toNumber(row.active_candidates, 0),\n canceledCandidates: toNumber(row.canceled_candidates, 0),\n uncertainCandidates: toNumber(row.uncertain_candidates, 0),\n summary: toText(row.summary),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseSubscriptionCandidate(\n row: Record<string, unknown>,\n): LifeOpsSubscriptionCandidate {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n auditId: toText(row.audit_id),\n serviceSlug: toText(row.service_slug),\n serviceName: toText(row.service_name),\n provider: toText(row.provider),\n cadence: toText(\n row.cadence,\n \"unknown\",\n ) as LifeOpsSubscriptionCandidate[\"cadence\"],\n state: toText(\n row.state,\n \"uncertain\",\n ) as LifeOpsSubscriptionCandidate[\"state\"],\n confidence: toNumber(row.confidence, 0),\n annualCostEstimateUsd:\n row.annual_cost_estimate_usd === null ||\n row.annual_cost_estimate_usd === undefined\n ? null\n : toNumber(row.annual_cost_estimate_usd, 0),\n managementUrl: row.management_url ? toText(row.management_url) : null,\n latestEvidenceAt: row.latest_evidence_at\n ? toText(row.latest_evidence_at)\n : null,\n evidenceJson: parseJsonArray<Record<string, unknown>>(row.evidence_json),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parseSubscriptionCancellation(\n row: Record<string, unknown>,\n): LifeOpsSubscriptionCancellation {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n auditId: row.audit_id ? toText(row.audit_id) : null,\n candidateId: row.candidate_id ? toText(row.candidate_id) : null,\n serviceSlug: toText(row.service_slug),\n serviceName: toText(row.service_name),\n executor: toText(\n row.executor,\n \"agent_browser\",\n ) as LifeOpsSubscriptionCancellation[\"executor\"],\n status: toText(\n row.status,\n \"draft\",\n ) as LifeOpsSubscriptionCancellation[\"status\"],\n confirmed: toBoolean(row.confirmed),\n currentStep: row.current_step ? toText(row.current_step) : null,\n browserSessionId: row.browser_session_id\n ? toText(row.browser_session_id)\n : null,\n evidenceSummary: row.evidence_summary ? toText(row.evidence_summary) : null,\n artifactCount: toNumber(row.artifact_count, 0),\n managementUrl: row.management_url ? toText(row.management_url) : null,\n error: row.error ? toText(row.error) : null,\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n finishedAt: row.finished_at ? toText(row.finished_at) : null,\n };\n}\n\nfunction parsePaymentSource(\n row: Record<string, unknown>,\n): LifeOpsPaymentSource {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n kind: toText(row.kind, \"manual\") as LifeOpsPaymentSourceKind,\n label: toText(row.label),\n institution: row.institution ? toText(row.institution) : null,\n accountMask: row.account_mask ? toText(row.account_mask) : null,\n status: toText(row.status, \"active\") as LifeOpsPaymentSourceStatus,\n lastSyncedAt: row.last_synced_at ? toText(row.last_synced_at) : null,\n transactionCount: toNumber(row.transaction_count, 0),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n updatedAt: toText(row.updated_at),\n };\n}\n\nfunction parsePaymentTransaction(\n row: Record<string, unknown>,\n): LifeOpsPaymentTransaction {\n return {\n id: toText(row.id),\n agentId: toText(row.agent_id),\n sourceId: toText(row.source_id),\n externalId: row.external_id ? toText(row.external_id) : null,\n postedAt: toText(row.posted_at),\n amountUsd: toNumber(row.amount_usd, 0),\n direction: toText(row.direction, \"debit\") as LifeOpsPaymentDirection,\n merchantRaw: toText(row.merchant_raw),\n merchantNormalized: toText(row.merchant_normalized),\n description: row.description ? toText(row.description) : null,\n category: row.category ? toText(row.category) : null,\n currency: toText(row.currency, \"USD\"),\n metadata: parseJsonRecord(row.metadata_json),\n createdAt: toText(row.created_at),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Domain-object factories (id + timestamps)\n// ---------------------------------------------------------------------------\n\nexport function createLifeOpsSubscriptionAudit(\n params: Omit<LifeOpsSubscriptionAudit, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsSubscriptionAudit {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsSubscriptionCandidate(\n params: Omit<LifeOpsSubscriptionCandidate, \"id\" | \"createdAt\" | \"updatedAt\">,\n): LifeOpsSubscriptionCandidate {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\nexport function createLifeOpsSubscriptionCancellation(\n params: Omit<\n LifeOpsSubscriptionCancellation,\n \"id\" | \"createdAt\" | \"updatedAt\"\n >,\n): LifeOpsSubscriptionCancellation {\n const timestamp = isoNow();\n return {\n ...params,\n id: crypto.randomUUID(),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Repository\n// ---------------------------------------------------------------------------\n\nexport class FinancesRepository {\n constructor(public readonly runtime: IAgentRuntime) {}\n\n async createSubscriptionAudit(\n audit: LifeOpsSubscriptionAudit,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${FINANCE_TABLES.subscriptionAudits} (\n id, agent_id, source, query_window_days, status, total_candidates,\n active_candidates, canceled_candidates, uncertain_candidates, summary,\n metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(audit.id)},\n ${sqlQuote(audit.agentId)},\n ${sqlQuote(audit.source)},\n ${sqlInteger(audit.queryWindowDays)},\n ${sqlQuote(audit.status)},\n ${sqlInteger(audit.totalCandidates)},\n ${sqlInteger(audit.activeCandidates)},\n ${sqlInteger(audit.canceledCandidates)},\n ${sqlInteger(audit.uncertainCandidates)},\n ${sqlQuote(audit.summary)},\n ${sqlJson(audit.metadata)},\n ${sqlQuote(audit.createdAt)},\n ${sqlQuote(audit.updatedAt)}\n )`,\n );\n }\n\n async updateSubscriptionAudit(\n audit: LifeOpsSubscriptionAudit,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE ${FINANCE_TABLES.subscriptionAudits}\n SET source = ${sqlQuote(audit.source)},\n query_window_days = ${sqlInteger(audit.queryWindowDays)},\n status = ${sqlQuote(audit.status)},\n total_candidates = ${sqlInteger(audit.totalCandidates)},\n active_candidates = ${sqlInteger(audit.activeCandidates)},\n canceled_candidates = ${sqlInteger(audit.canceledCandidates)},\n uncertain_candidates = ${sqlInteger(audit.uncertainCandidates)},\n summary = ${sqlQuote(audit.summary)},\n metadata_json = ${sqlJson(audit.metadata)},\n updated_at = ${sqlQuote(audit.updatedAt)}\n WHERE id = ${sqlQuote(audit.id)}\n AND agent_id = ${sqlQuote(audit.agentId)}`,\n );\n }\n\n async getSubscriptionAudit(\n agentId: string,\n auditId: string,\n ): Promise<LifeOpsSubscriptionAudit | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.subscriptionAudits}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(auditId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseSubscriptionAudit(row) : null;\n }\n\n async getLatestSubscriptionAudit(\n agentId: string,\n ): Promise<LifeOpsSubscriptionAudit | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.subscriptionAudits}\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY updated_at DESC, created_at DESC\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseSubscriptionAudit(row) : null;\n }\n\n async createSubscriptionCandidate(\n candidate: LifeOpsSubscriptionCandidate,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${FINANCE_TABLES.subscriptionCandidates} (\n id, agent_id, audit_id, service_slug, service_name, provider, cadence,\n state, confidence, annual_cost_estimate_usd, management_url,\n latest_evidence_at, evidence_json, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(candidate.id)},\n ${sqlQuote(candidate.agentId)},\n ${sqlQuote(candidate.auditId)},\n ${sqlQuote(candidate.serviceSlug)},\n ${sqlQuote(candidate.serviceName)},\n ${sqlQuote(candidate.provider)},\n ${sqlQuote(candidate.cadence)},\n ${sqlQuote(candidate.state)},\n ${sqlNumber(candidate.confidence)},\n ${sqlNumber(candidate.annualCostEstimateUsd)},\n ${sqlText(candidate.managementUrl)},\n ${sqlText(candidate.latestEvidenceAt)},\n ${sqlJson(candidate.evidenceJson)},\n ${sqlJson(candidate.metadata)},\n ${sqlQuote(candidate.createdAt)},\n ${sqlQuote(candidate.updatedAt)}\n )\n ON CONFLICT(agent_id, audit_id, service_slug) DO UPDATE SET\n service_name = excluded.service_name,\n provider = excluded.provider,\n cadence = excluded.cadence,\n state = excluded.state,\n confidence = excluded.confidence,\n annual_cost_estimate_usd = excluded.annual_cost_estimate_usd,\n management_url = excluded.management_url,\n latest_evidence_at = excluded.latest_evidence_at,\n evidence_json = excluded.evidence_json,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listSubscriptionCandidatesForAudit(\n agentId: string,\n auditId: string,\n ): Promise<LifeOpsSubscriptionCandidate[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.subscriptionCandidates}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND audit_id = ${sqlQuote(auditId)}\n ORDER BY confidence DESC, service_name ASC`,\n );\n return rows.map(parseSubscriptionCandidate);\n }\n\n async getSubscriptionCandidate(\n agentId: string,\n candidateId: string,\n ): Promise<LifeOpsSubscriptionCandidate | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.subscriptionCandidates}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(candidateId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseSubscriptionCandidate(row) : null;\n }\n\n async createSubscriptionCancellation(\n cancellation: LifeOpsSubscriptionCancellation,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${FINANCE_TABLES.subscriptionCancellations} (\n id, agent_id, audit_id, candidate_id, service_slug, service_name,\n executor, status, confirmed, current_step, browser_session_id,\n evidence_summary, artifact_count, management_url, error, metadata_json,\n created_at, updated_at, finished_at\n ) VALUES (\n ${sqlQuote(cancellation.id)},\n ${sqlQuote(cancellation.agentId)},\n ${sqlText(cancellation.auditId)},\n ${sqlText(cancellation.candidateId)},\n ${sqlQuote(cancellation.serviceSlug)},\n ${sqlQuote(cancellation.serviceName)},\n ${sqlQuote(cancellation.executor)},\n ${sqlQuote(cancellation.status)},\n ${sqlBoolean(cancellation.confirmed)},\n ${sqlText(cancellation.currentStep)},\n ${sqlText(cancellation.browserSessionId)},\n ${sqlText(cancellation.evidenceSummary)},\n ${sqlInteger(cancellation.artifactCount)},\n ${sqlText(cancellation.managementUrl)},\n ${sqlText(cancellation.error)},\n ${sqlJson(cancellation.metadata)},\n ${sqlQuote(cancellation.createdAt)},\n ${sqlQuote(cancellation.updatedAt)},\n ${sqlText(cancellation.finishedAt)}\n )`,\n );\n }\n\n async updateSubscriptionCancellation(\n cancellation: LifeOpsSubscriptionCancellation,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `UPDATE ${FINANCE_TABLES.subscriptionCancellations}\n SET audit_id = ${sqlText(cancellation.auditId)},\n candidate_id = ${sqlText(cancellation.candidateId)},\n service_slug = ${sqlQuote(cancellation.serviceSlug)},\n service_name = ${sqlQuote(cancellation.serviceName)},\n executor = ${sqlQuote(cancellation.executor)},\n status = ${sqlQuote(cancellation.status)},\n confirmed = ${sqlBoolean(cancellation.confirmed)},\n current_step = ${sqlText(cancellation.currentStep)},\n browser_session_id = ${sqlText(cancellation.browserSessionId)},\n evidence_summary = ${sqlText(cancellation.evidenceSummary)},\n artifact_count = ${sqlInteger(cancellation.artifactCount)},\n management_url = ${sqlText(cancellation.managementUrl)},\n error = ${sqlText(cancellation.error)},\n metadata_json = ${sqlJson(cancellation.metadata)},\n updated_at = ${sqlQuote(cancellation.updatedAt)},\n finished_at = ${sqlText(cancellation.finishedAt)}\n WHERE id = ${sqlQuote(cancellation.id)}\n AND agent_id = ${sqlQuote(cancellation.agentId)}`,\n );\n }\n\n async getSubscriptionCancellation(\n agentId: string,\n cancellationId: string,\n ): Promise<LifeOpsSubscriptionCancellation | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.subscriptionCancellations}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(cancellationId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseSubscriptionCancellation(row) : null;\n }\n\n async getLatestSubscriptionCancellation(\n agentId: string,\n serviceSlug?: string,\n ): Promise<LifeOpsSubscriptionCancellation | null> {\n const serviceClause = serviceSlug\n ? `AND service_slug = ${sqlQuote(serviceSlug)}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.subscriptionCancellations}\n WHERE agent_id = ${sqlQuote(agentId)}\n ${serviceClause}\n ORDER BY updated_at DESC, created_at DESC\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parseSubscriptionCancellation(row) : null;\n }\n\n async upsertPaymentSource(source: LifeOpsPaymentSource): Promise<void> {\n await executeRawSql(\n this.runtime,\n `INSERT INTO ${FINANCE_TABLES.paymentSources} (\n id, agent_id, kind, label, institution, account_mask, status,\n last_synced_at, transaction_count, metadata_json, created_at, updated_at\n ) VALUES (\n ${sqlQuote(source.id)},\n ${sqlQuote(source.agentId)},\n ${sqlQuote(source.kind)},\n ${sqlQuote(source.label)},\n ${sqlText(source.institution)},\n ${sqlText(source.accountMask)},\n ${sqlQuote(source.status)},\n ${sqlText(source.lastSyncedAt)},\n ${sqlInteger(source.transactionCount)},\n ${sqlJson(source.metadata)},\n ${sqlQuote(source.createdAt)},\n ${sqlQuote(source.updatedAt)}\n )\n ON CONFLICT(id) DO UPDATE SET\n kind = excluded.kind,\n label = excluded.label,\n institution = excluded.institution,\n account_mask = excluded.account_mask,\n status = excluded.status,\n last_synced_at = excluded.last_synced_at,\n transaction_count = excluded.transaction_count,\n metadata_json = excluded.metadata_json,\n updated_at = excluded.updated_at`,\n );\n }\n\n async listPaymentSources(agentId: string): Promise<LifeOpsPaymentSource[]> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.paymentSources}\n WHERE agent_id = ${sqlQuote(agentId)}\n ORDER BY created_at DESC`,\n );\n return rows.map(parsePaymentSource);\n }\n\n async getPaymentSource(\n agentId: string,\n sourceId: string,\n ): Promise<LifeOpsPaymentSource | null> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.paymentSources}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(sourceId)}\n LIMIT 1`,\n );\n const row = rows[0];\n return row ? parsePaymentSource(row) : null;\n }\n\n async deletePaymentSource(agentId: string, sourceId: string): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM ${FINANCE_TABLES.paymentTransactions}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND source_id = ${sqlQuote(sourceId)}`,\n );\n await executeRawSql(\n this.runtime,\n `DELETE FROM ${FINANCE_TABLES.paymentSources}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(sourceId)}`,\n );\n }\n\n async deletePaymentTransactionById(\n agentId: string,\n transactionId: string,\n ): Promise<void> {\n await executeRawSql(\n this.runtime,\n `DELETE FROM ${FINANCE_TABLES.paymentTransactions}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND id = ${sqlQuote(transactionId)}`,\n );\n }\n\n async insertPaymentTransaction(\n transaction: LifeOpsPaymentTransaction,\n ): Promise<boolean> {\n const rows = await executeRawSql(\n this.runtime,\n `INSERT INTO ${FINANCE_TABLES.paymentTransactions} (\n id, agent_id, source_id, external_id, posted_at, amount_usd, direction,\n merchant_raw, merchant_normalized, description, category, currency,\n metadata_json, created_at\n ) VALUES (\n ${sqlQuote(transaction.id)},\n ${sqlQuote(transaction.agentId)},\n ${sqlQuote(transaction.sourceId)},\n ${sqlText(transaction.externalId)},\n ${sqlQuote(transaction.postedAt)},\n ${sqlNumber(transaction.amountUsd)},\n ${sqlQuote(transaction.direction)},\n ${sqlQuote(transaction.merchantRaw)},\n ${sqlQuote(transaction.merchantNormalized)},\n ${sqlText(transaction.description)},\n ${sqlText(transaction.category)},\n ${sqlQuote(transaction.currency)},\n ${sqlJson(transaction.metadata)},\n ${sqlQuote(transaction.createdAt)}\n )\n ON CONFLICT DO NOTHING\n RETURNING id`,\n );\n return rows.length > 0;\n }\n\n async listPaymentTransactions(\n agentId: string,\n args: {\n sourceId?: string | null;\n sinceAt?: string | null;\n untilAt?: string | null;\n limit?: number | null;\n merchantContains?: string | null;\n onlyDebits?: boolean | null;\n } = {},\n ): Promise<LifeOpsPaymentTransaction[]> {\n const limit = Math.max(1, Math.min(5000, Math.trunc(args.limit ?? 500)));\n const sourceClause = args.sourceId\n ? `AND source_id = ${sqlQuote(args.sourceId)}`\n : \"\";\n const sinceClause = args.sinceAt\n ? `AND posted_at >= ${sqlQuote(args.sinceAt)}`\n : \"\";\n const untilClause = args.untilAt\n ? `AND posted_at <= ${sqlQuote(args.untilAt)}`\n : \"\";\n const merchantClause = args.merchantContains\n ? `AND merchant_normalized LIKE ${sqlQuote(`%${args.merchantContains.trim().toLowerCase()}%`)}`\n : \"\";\n const directionClause = args.onlyDebits\n ? `AND direction = ${sqlQuote(\"debit\")}`\n : \"\";\n const rows = await executeRawSql(\n this.runtime,\n `SELECT *\n FROM ${FINANCE_TABLES.paymentTransactions}\n WHERE agent_id = ${sqlQuote(agentId)}\n ${sourceClause}\n ${sinceClause}\n ${untilClause}\n ${merchantClause}\n ${directionClause}\n ORDER BY posted_at DESC\n LIMIT ${limit}`,\n );\n return rows.map(parsePaymentTransaction);\n }\n\n async countPaymentTransactionsForSource(\n agentId: string,\n sourceId: string,\n ): Promise<number> {\n const rows = await executeRawSql(\n this.runtime,\n `SELECT COUNT(*) AS count\n FROM ${FINANCE_TABLES.paymentTransactions}\n WHERE agent_id = ${sqlQuote(agentId)}\n AND source_id = ${sqlQuote(sourceId)}`,\n );\n const row = rows[0] as Record<string, unknown> | undefined;\n return row ? toNumber(row.count ?? row.COUNT, 0) : 0;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["export * from \"./schema.js\";\nexport { financesDbSchema as default } from \"./schema.js\";\n"],"mappings":"AAAA,cAAc;AACd,SAA6B,wBAAe;","names":[]}
|