@pikku/kysely 0.13.23 → 0.13.27

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 (80) hide show
  1. package/CHANGELOG.md +248 -0
  2. package/dist/src/index.d.ts +4 -1
  3. package/dist/src/index.js +3 -1
  4. package/dist/src/kysely-analytics-service.d.ts +30 -0
  5. package/dist/src/kysely-analytics-service.js +80 -0
  6. package/dist/src/kysely-feature-flag-store.d.ts +37 -0
  7. package/dist/src/kysely-feature-flag-store.js +239 -0
  8. package/dist/src/kysely-tables.d.ts +45 -0
  9. package/dist/src/kysely-webhook-service.d.ts +1 -1
  10. package/dist/src/kysely-webhook-service.js +1 -1
  11. package/dist/src/schema/analytics.schema.d.ts +17 -0
  12. package/dist/src/schema/analytics.schema.js +48 -0
  13. package/dist/src/schema/flag.schema.d.ts +16 -0
  14. package/dist/src/schema/flag.schema.js +62 -0
  15. package/dist/src/schema/index.d.ts +2 -0
  16. package/dist/src/schema/index.js +6 -0
  17. package/package.json +11 -6
  18. package/run-tests.sh +9 -1
  19. package/bin/pikku-kysely-pure.ts +0 -59
  20. package/dist/src/kysely-lock-vault.d.ts +0 -34
  21. package/dist/src/kysely-lock-vault.js +0 -77
  22. package/dist/src/schema/data-lock.schema.d.ts +0 -15
  23. package/dist/src/schema/data-lock.schema.js +0 -27
  24. package/dist/tsconfig.tsbuildinfo +0 -1
  25. package/src/classification-crypto.test.ts +0 -143
  26. package/src/classification-crypto.ts +0 -163
  27. package/src/classification-plugin.pglite.test.ts +0 -226
  28. package/src/classification-plugin.test.ts +0 -265
  29. package/src/classification-plugin.ts +0 -249
  30. package/src/coercion-plugin.test.ts +0 -160
  31. package/src/coercion-plugin.ts +0 -187
  32. package/src/create-audited-kysely.test.ts +0 -560
  33. package/src/create-audited-kysely.ts +0 -254
  34. package/src/index.ts +0 -81
  35. package/src/kysely-agent-run-scores.ts +0 -47
  36. package/src/kysely-agent-run-service.ts +0 -244
  37. package/src/kysely-agent-run-state-service.ts +0 -200
  38. package/src/kysely-agent-storage-service.ts +0 -632
  39. package/src/kysely-audit-service.test.ts +0 -352
  40. package/src/kysely-audit-service.ts +0 -237
  41. package/src/kysely-channel-store.ts +0 -107
  42. package/src/kysely-credential-service.ts +0 -286
  43. package/src/kysely-deployment-service.ts +0 -163
  44. package/src/kysely-eventhub-store.ts +0 -53
  45. package/src/kysely-json.ts +0 -5
  46. package/src/kysely-scope-service.test.ts +0 -418
  47. package/src/kysely-scope-service.ts +0 -425
  48. package/src/kysely-secret-service.ts +0 -242
  49. package/src/kysely-services.test.ts +0 -405
  50. package/src/kysely-session-store.ts +0 -57
  51. package/src/kysely-tables.test.ts +0 -110
  52. package/src/kysely-tables.ts +0 -434
  53. package/src/kysely-virtual-user-run-store.test.ts +0 -369
  54. package/src/kysely-virtual-user-run-store.ts +0 -235
  55. package/src/kysely-virtual-user-schedule-store.test.ts +0 -187
  56. package/src/kysely-virtual-user-schedule-store.ts +0 -187
  57. package/src/kysely-webhook-service.test.ts +0 -124
  58. package/src/kysely-webhook-service.ts +0 -137
  59. package/src/kysely-workflow-mirror.test.ts +0 -259
  60. package/src/kysely-workflow-mirror.ts +0 -374
  61. package/src/kysely-workflow-run-service.ts +0 -305
  62. package/src/kysely-workflow-service.test.ts +0 -544
  63. package/src/kysely-workflow-service.ts +0 -820
  64. package/src/schema/agent.schema.ts +0 -162
  65. package/src/schema/audit.schema.ts +0 -57
  66. package/src/schema/channel.schema.ts +0 -38
  67. package/src/schema/credential.schema.ts +0 -58
  68. package/src/schema/deployment.schema.ts +0 -47
  69. package/src/schema/index.ts +0 -441
  70. package/src/schema/pikku-schema.types.ts +0 -169
  71. package/src/schema/schema.test.ts +0 -591
  72. package/src/schema/scope.schema.ts +0 -110
  73. package/src/schema/secret.schema.ts +0 -49
  74. package/src/schema/session.schema.ts +0 -20
  75. package/src/schema/virtual-user-schedule.schema.ts +0 -48
  76. package/src/schema/virtual-user.schema.ts +0 -106
  77. package/src/schema/webhook.schema.ts +0 -58
  78. package/src/schema/workflow.schema.ts +0 -150
  79. package/src/serialize-plugin.ts +0 -233
  80. package/tsconfig.json +0 -17
@@ -1,200 +0,0 @@
1
- import { sql } from 'kysely'
2
- import type { Kysely } from 'kysely'
3
- import type { KyselyPikkuDB } from './kysely-tables.js'
4
- import type { AgentRunState } from '@pikku/core/agent'
5
- import type { AgentRunScore } from '@pikku/core/agent-scorer'
6
- import type {
7
- AgentRunStateService,
8
- CreateRunInput,
9
- SaveScoreInput,
10
- } from '@pikku/core/services'
11
- import type { PendingApproval } from '@pikku/core/agent'
12
- import { requirePikkuSchema } from './schema/index.js'
13
- import { agentSchema } from './schema/agent.schema.js'
14
- import { getRunScores, saveRunScore } from './kysely-agent-run-scores.js'
15
-
16
- export class KyselyAgentRunStateService implements AgentRunStateService {
17
- private initialized = false
18
-
19
- constructor(private db: Kysely<KyselyPikkuDB>) {}
20
-
21
- async init(): Promise<void> {
22
- if (this.initialized) return
23
- await requirePikkuSchema(this.db, agentSchema)
24
- this.initialized = true
25
- }
26
-
27
- async createRun(run: CreateRunInput): Promise<string> {
28
- const runId = `run-${crypto.randomUUID()}`
29
- await this.db
30
- .insertInto('agentRun')
31
- .values({
32
- runId,
33
- agentName: run.agentName,
34
- threadId: run.threadId,
35
- resourceId: run.resourceId,
36
- status: run.status ?? 'running',
37
- errorMessage: run.errorMessage ?? null,
38
- suspendReason: run.suspendReason ?? null,
39
- missingRpcs: run.missingRpcs ? JSON.stringify(run.missingRpcs) : null,
40
- usageInputTokens: run.usage?.inputTokens ?? 0,
41
- usageOutputTokens: run.usage?.outputTokens ?? 0,
42
- usageModel: run.usage?.model ?? '',
43
- })
44
- .execute()
45
- return runId
46
- }
47
-
48
- async updateRun(
49
- runId: string,
50
- updates: Partial<AgentRunState>
51
- ): Promise<void> {
52
- const values: Record<string, unknown> = {
53
- updatedAt: sql`CURRENT_TIMESTAMP`,
54
- }
55
- if (updates.status !== undefined) values.status = updates.status
56
- if (updates.errorMessage !== undefined)
57
- values.errorMessage = updates.errorMessage
58
- if (updates.suspendReason !== undefined)
59
- values.suspendReason = updates.suspendReason
60
- if (updates.missingRpcs !== undefined)
61
- values.missingRpcs = JSON.stringify(updates.missingRpcs)
62
- if (updates.pendingApprovals !== undefined)
63
- values.pendingApprovals = JSON.stringify(updates.pendingApprovals)
64
- if (updates.usage) {
65
- values.usageInputTokens = updates.usage.inputTokens
66
- values.usageOutputTokens = updates.usage.outputTokens
67
- values.usageModel = updates.usage.model
68
- }
69
-
70
- await this.db
71
- .updateTable('agentRun')
72
- .set(values)
73
- .where('runId', '=', runId)
74
- .execute()
75
- }
76
-
77
- async getRun(runId: string): Promise<AgentRunState | null> {
78
- const row = await this.db
79
- .selectFrom('agentRun')
80
- .selectAll()
81
- .where('runId', '=', runId)
82
- .executeTakeFirst()
83
- return row ? this.toRunState(row) : null
84
- }
85
-
86
- async getRunsByThread(threadId: string): Promise<AgentRunState[]> {
87
- const rows = await this.db
88
- .selectFrom('agentRun')
89
- .selectAll()
90
- .where('threadId', '=', threadId)
91
- .orderBy('createdAt', 'desc')
92
- .execute()
93
- return rows.map((r) => this.toRunState(r))
94
- }
95
-
96
- async resolveApproval(
97
- toolCallId: string,
98
- status: 'approved' | 'denied'
99
- ): Promise<boolean> {
100
- const rows = await this.db
101
- .selectFrom('agentRun')
102
- .select(['runId', 'pendingApprovals'])
103
- .where('status', '=', 'suspended')
104
- .execute()
105
-
106
- for (const row of rows) {
107
- let approvals: PendingApproval[] = []
108
- if (row.pendingApprovals) {
109
- try {
110
- approvals = JSON.parse(row.pendingApprovals)
111
- } catch {
112
- console.warn(
113
- `Failed to parse pendingApprovals for run ${row.runId}, treating as empty`
114
- )
115
- }
116
- }
117
- const filtered = approvals.filter((a) => a.toolCallId !== toolCallId)
118
- if (filtered.length !== approvals.length) {
119
- const updates: Record<string, unknown> = {
120
- pendingApprovals:
121
- filtered.length > 0 ? JSON.stringify(filtered) : null,
122
- updatedAt: sql`CURRENT_TIMESTAMP`,
123
- }
124
- if (filtered.length === 0) {
125
- updates.status = status
126
- }
127
- // Compare-and-swap on the list we read: a concurrent approver that got
128
- // there first has already rewritten it, and this update matches no row.
129
- const result = await this.db
130
- .updateTable('agentRun')
131
- .set(updates as any)
132
- .where('runId', '=', row.runId)
133
- .where('status', '=', 'suspended')
134
- .where('pendingApprovals', '=', row.pendingApprovals)
135
- .executeTakeFirst()
136
- return Number(result?.numUpdatedRows ?? 0) > 0
137
- }
138
- }
139
- return false
140
- }
141
-
142
- async findRunByToolCallId(
143
- toolCallId: string
144
- ): Promise<{ run: AgentRunState; approval: PendingApproval } | null> {
145
- const rows = await this.db
146
- .selectFrom('agentRun')
147
- .selectAll()
148
- .where('status', '=', 'suspended')
149
- .execute()
150
-
151
- for (const row of rows) {
152
- let approvals: PendingApproval[] = []
153
- if (row.pendingApprovals) {
154
- try {
155
- approvals = JSON.parse(row.pendingApprovals)
156
- } catch {
157
- console.warn(
158
- `Failed to parse pendingApprovals for run ${row.runId}, treating as empty`
159
- )
160
- }
161
- }
162
- const approval = approvals.find((a) => a.toolCallId === toolCallId)
163
- if (approval) {
164
- return { run: this.toRunState(row), approval }
165
- }
166
- }
167
- return null
168
- }
169
-
170
- async saveScore(score: SaveScoreInput): Promise<void> {
171
- await saveRunScore(this.db, score)
172
- }
173
-
174
- async getScores(runId: string): Promise<AgentRunScore[]> {
175
- return getRunScores(this.db, runId)
176
- }
177
-
178
- private toRunState(row: any): AgentRunState {
179
- return {
180
- runId: row.runId,
181
- agentName: row.agentName,
182
- threadId: row.threadId,
183
- resourceId: row.resourceId,
184
- status: row.status,
185
- errorMessage: row.errorMessage ?? undefined,
186
- suspendReason: row.suspendReason ?? undefined,
187
- missingRpcs: row.missingRpcs ? JSON.parse(row.missingRpcs) : undefined,
188
- pendingApprovals: row.pendingApprovals
189
- ? JSON.parse(row.pendingApprovals)
190
- : undefined,
191
- usage: {
192
- inputTokens: row.usageInputTokens ?? 0,
193
- outputTokens: row.usageOutputTokens ?? 0,
194
- model: row.usageModel ?? '',
195
- },
196
- createdAt: new Date(row.createdAt),
197
- updatedAt: new Date(row.updatedAt),
198
- }
199
- }
200
- }