@sixb/sqlite 0.1.0 → 0.1.2
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/README.md +18 -13
- package/dist/action-run-storage.d.ts +5 -2
- package/dist/action-run-storage.d.ts.map +1 -1
- package/dist/agents/agent-storage.d.ts +4 -2
- package/dist/agents/agent-storage.d.ts.map +1 -1
- package/dist/agents/rows.d.ts +3 -10
- package/dist/agents/rows.d.ts.map +1 -1
- package/dist/agents/runs.d.ts +3 -2
- package/dist/agents/runs.d.ts.map +1 -1
- package/dist/ai-usage-storage.d.ts +22 -0
- package/dist/ai-usage-storage.d.ts.map +1 -0
- package/dist/auth-storage/service-accounts.d.ts.map +1 -1
- package/dist/auth-storage/shared.d.ts +1 -10
- package/dist/auth-storage/shared.d.ts.map +1 -1
- package/dist/connector-connection-storage.d.ts +9 -0
- package/dist/connector-connection-storage.d.ts.map +1 -0
- package/dist/execution-storage.d.ts +14 -0
- package/dist/execution-storage.d.ts.map +1 -0
- package/dist/index.d.ts +13 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4114 -1149
- package/dist/index.js.map +30 -27
- package/dist/latest-run-query.d.ts.map +1 -1
- package/dist/migrations.d.ts +0 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/ontology-storage/materialization-session.d.ts +50 -8
- package/dist/ontology-storage/materialization-session.d.ts.map +1 -1
- package/dist/ontology-storage/materialization-state.d.ts +4 -5
- package/dist/ontology-storage/materialization-state.d.ts.map +1 -1
- package/dist/ontology-storage/materialization-writer.d.ts.map +1 -1
- package/dist/ontology-storage/materializations.d.ts +0 -2
- package/dist/ontology-storage/materializations.d.ts.map +1 -1
- package/dist/ontology-storage/outbox.d.ts.map +1 -1
- package/dist/ontology-storage/shared.d.ts +3 -3
- package/dist/ontology-storage/shared.d.ts.map +1 -1
- package/dist/ontology-storage/sources.d.ts.map +1 -1
- package/dist/pipeline-run-storage.d.ts +7 -2
- package/dist/pipeline-run-storage.d.ts.map +1 -1
- package/dist/projection-run-storage.d.ts +9 -2
- package/dist/projection-run-storage.d.ts.map +1 -1
- package/dist/run-list-query.d.ts +1 -1
- package/dist/run-list-query.d.ts.map +1 -1
- package/dist/sync-run-storage.d.ts +7 -2
- package/dist/sync-run-storage.d.ts.map +1 -1
- package/dist/testing.d.ts +6 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/transactions.d.ts +3 -0
- package/dist/transactions.d.ts.map +1 -1
- package/dist/webhook-run-storage.d.ts +9 -2
- package/dist/webhook-run-storage.d.ts.map +1 -1
- package/dist/workflow-run-storage.d.ts +7 -3
- package/dist/workflow-run-storage.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/action-run-storage.ts +51 -74
- package/src/agents/agent-storage.ts +5 -3
- package/src/agents/rows.ts +8 -40
- package/src/agents/runs.ts +27 -21
- package/src/ai-usage-storage.ts +324 -0
- package/src/auth-storage/service-accounts.ts +14 -21
- package/src/auth-storage/shared.ts +0 -22
- package/src/connector-connection-storage.ts +784 -0
- package/src/execution-storage.ts +158 -0
- package/src/index.ts +63 -22
- package/src/latest-run-query.ts +7 -1
- package/src/migrations/002-workflow-run-output.sql +27 -0
- package/src/migrations/003-merge-sync-runs.sql +71 -0
- package/src/migrations/004-executions.sql +142 -0
- package/src/migrations/005-workflow-executions.sql +7 -0
- package/src/migrations/006-narrow-ontology-source-root-index.sql +4 -0
- package/src/migrations/007-split-overrides.sql +154 -0
- package/src/migrations/008-action-executions.sql +4 -0
- package/src/migrations/009-agent-executions.sql +115 -0
- package/src/migrations/010-ai-usage-accounting-foundation.sql +74 -0
- package/src/migrations/011-sync-failure-record.sql +22 -0
- package/src/migrations/012-pipeline-failure-record.sql +45 -0
- package/src/migrations/013-workflow-failure-record.sql +45 -0
- package/src/migrations/014-agent-failure-record.sql +59 -0
- package/src/migrations/015-projection-failure-record.sql +20 -0
- package/src/migrations/016-webhook-run-failure-record.sql +19 -0
- package/src/migrations/017-action-failure-record.sql +65 -0
- package/src/migrations/018-ontology-outbox-failure-record.sql +80 -0
- package/src/migrations/019-webhook-delivery-failure-record.sql +62 -0
- package/src/migrations/020-drop-run-usage-projections.sql +7 -0
- package/src/migrations/021-sync-pipeline-executions.sql +101 -0
- package/src/migrations/022-projection-executions.sql +244 -0
- package/src/migrations/023-webhook-executions.sql +51 -0
- package/src/migrations/024-ontology-commit-executions.sql +58 -0
- package/src/migrations/025-connector-connections.sql +257 -0
- package/src/migrations.ts +126 -5
- package/src/ontology-storage/materialization-session.ts +317 -143
- package/src/ontology-storage/materialization-state.ts +398 -150
- package/src/ontology-storage/materialization-writer.ts +142 -67
- package/src/ontology-storage/materializations.ts +67 -141
- package/src/ontology-storage/outbox.ts +10 -3
- package/src/ontology-storage/shared.ts +10 -4
- package/src/ontology-storage/sources.ts +4 -1
- package/src/pipeline-run-storage.ts +128 -43
- package/src/projection-run-storage.ts +209 -97
- package/src/run-list-query.ts +9 -4
- package/src/sync-run-storage.ts +120 -34
- package/src/testing.ts +20 -0
- package/src/transactions.ts +10 -3
- package/src/webhook-run-storage.ts +118 -74
- package/src/workflow-run-storage.ts +124 -133
- package/dist/validation.d.ts +0 -5
- package/dist/validation.d.ts.map +0 -1
- package/dist/webhook-delivery-storage.d.ts +0 -27
- package/dist/webhook-delivery-storage.d.ts.map +0 -1
- package/src/validation.ts +0 -30
- package/src/webhook-delivery-storage.ts +0 -272
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite"
|
|
2
|
+
import { parseSixbFailure, serializeSixbFailure } from "@sixb/core/internal/errors"
|
|
3
|
+
import { assertWebhookRunExecution } from "@sixb/core/internal/webhook-run-storage-provider"
|
|
2
4
|
import type {
|
|
5
|
+
ExecutionStorage,
|
|
3
6
|
FinishWebhookRunInput,
|
|
7
|
+
GetWebhookRunByDeliveryInput,
|
|
4
8
|
ListWebhookRunsInput,
|
|
5
9
|
ListWebhookRunsResult,
|
|
10
|
+
RestartWebhookRunInput,
|
|
6
11
|
StartWebhookRunInput,
|
|
7
12
|
WebhookRunRecord,
|
|
8
13
|
WebhookRunStorage,
|
|
9
14
|
} from "@sixb/core/storage"
|
|
10
|
-
import { WebhookRunError } from "@sixb/core/storage"
|
|
15
|
+
import { canRetryWebhookRun, WEBHOOK_RUN_FAILURE_CODES, WebhookRunError } from "@sixb/core/storage"
|
|
11
16
|
import { installFreshSqliteSchema } from "./migrations"
|
|
12
17
|
import {
|
|
13
18
|
appendRunListFilters,
|
|
@@ -23,6 +28,8 @@ import {
|
|
|
23
28
|
} from "./transactions"
|
|
24
29
|
|
|
25
30
|
export interface SqliteWebhookRunStorageOptions {
|
|
31
|
+
/** Execution lookup sharing the same provider transaction. */
|
|
32
|
+
executions: ExecutionStorage
|
|
26
33
|
/** Path to SQLite database file. Defaults to ':memory:' for in-memory database. */
|
|
27
34
|
path?: string
|
|
28
35
|
/** Internal shared connection used by bundled SqliteStorage. */
|
|
@@ -32,80 +39,112 @@ export interface SqliteWebhookRunStorageOptions {
|
|
|
32
39
|
export class SqliteWebhookRunStorage implements WebhookRunStorage {
|
|
33
40
|
private readonly connection: SqliteStoreConnection
|
|
34
41
|
private readonly db: Database
|
|
42
|
+
private readonly executions: ExecutionStorage
|
|
35
43
|
|
|
36
|
-
constructor(options: SqliteWebhookRunStorageOptions
|
|
44
|
+
constructor(options: SqliteWebhookRunStorageOptions) {
|
|
37
45
|
this.connection = openSqliteStoreConnection(options)
|
|
38
46
|
this.db = this.connection.db
|
|
47
|
+
this.executions = options.executions
|
|
39
48
|
|
|
40
|
-
if (this.connection.installFreshSchema)
|
|
41
|
-
installFreshSqliteSchema(this.db)
|
|
42
|
-
}
|
|
49
|
+
if (this.connection.installFreshSchema) installFreshSqliteSchema(this.db)
|
|
43
50
|
}
|
|
44
51
|
|
|
45
52
|
async start(input: StartWebhookRunInput): Promise<WebhookRunRecord> {
|
|
46
53
|
const startedAt = input.startedAt ?? new Date()
|
|
54
|
+
await assertWebhookRunExecution({
|
|
55
|
+
executions: this.executions,
|
|
56
|
+
projectId: input.projectId,
|
|
57
|
+
executionId: input.executionId,
|
|
58
|
+
runId: input.id,
|
|
59
|
+
route: input.route,
|
|
60
|
+
})
|
|
47
61
|
|
|
48
62
|
try {
|
|
49
63
|
this.db
|
|
50
64
|
.query(
|
|
51
65
|
`
|
|
52
66
|
INSERT INTO webhook_runs (
|
|
53
|
-
project_id,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
webhook_id,
|
|
57
|
-
status,
|
|
58
|
-
method,
|
|
59
|
-
route,
|
|
60
|
-
started_at
|
|
61
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
67
|
+
project_id, id, execution_id, connector_id, webhook_id, status, method, route,
|
|
68
|
+
started_at, request_body_bytes, request_body_sha256, idempotency_key
|
|
69
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
62
70
|
`
|
|
63
71
|
)
|
|
64
72
|
.run(
|
|
65
73
|
input.projectId,
|
|
66
74
|
input.id,
|
|
75
|
+
input.executionId,
|
|
67
76
|
input.connectorId,
|
|
68
77
|
input.webhookId,
|
|
69
78
|
"running",
|
|
70
79
|
input.method,
|
|
71
80
|
input.route,
|
|
72
|
-
startedAt.toISOString()
|
|
81
|
+
startedAt.toISOString(),
|
|
82
|
+
input.requestBodyBytes,
|
|
83
|
+
input.requestBodySha256,
|
|
84
|
+
input.idempotencyKey ?? null
|
|
73
85
|
)
|
|
74
86
|
} catch (error) {
|
|
75
87
|
if (isUniqueConstraintError(error)) {
|
|
76
88
|
throw new WebhookRunError(
|
|
77
|
-
`[SixbSqlite] Webhook run '${input.id}' already exists for project '${input.projectId}'
|
|
89
|
+
`[SixbSqlite] Webhook run '${input.id}' or delivery key already exists for project '${input.projectId}'.`,
|
|
90
|
+
"duplicate_run"
|
|
78
91
|
)
|
|
79
92
|
}
|
|
80
|
-
|
|
81
93
|
throw error
|
|
82
94
|
}
|
|
83
95
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
96
|
+
return this.requireWebhookRun(input.projectId, input.id)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async restart(input: RestartWebhookRunInput): Promise<WebhookRunRecord> {
|
|
100
|
+
return this.db.transaction(() => {
|
|
101
|
+
const existing = this.getWebhookRunRow(input.projectId, input.id)
|
|
102
|
+
if (!existing) {
|
|
103
|
+
throw new WebhookRunError(
|
|
104
|
+
`[SixbSqlite] Webhook run '${input.id}' not found for project '${input.projectId}'.`,
|
|
105
|
+
"not_found"
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
if (!canRetryWebhookRun(rowToWebhookRunRecord(existing))) {
|
|
109
|
+
throw new WebhookRunError(
|
|
110
|
+
`[SixbSqlite] Webhook run '${input.id}' cannot restart from status '${existing.status}'.`,
|
|
111
|
+
"invalid_transition"
|
|
112
|
+
)
|
|
113
|
+
}
|
|
90
114
|
|
|
91
|
-
|
|
115
|
+
const result = this.db
|
|
116
|
+
.query(
|
|
117
|
+
`
|
|
118
|
+
UPDATE webhook_runs
|
|
119
|
+
SET status = 'running', started_at = ?, finished_at = NULL,
|
|
120
|
+
response_status = NULL, error = NULL
|
|
121
|
+
WHERE project_id = ? AND id = ? AND status = 'failed'
|
|
122
|
+
`
|
|
123
|
+
)
|
|
124
|
+
.run((input.startedAt ?? new Date()).toISOString(), input.projectId, input.id)
|
|
125
|
+
if (result.changes === 0) {
|
|
126
|
+
throw new WebhookRunError(
|
|
127
|
+
`[SixbSqlite] Webhook run '${input.id}' changed while restarting.`,
|
|
128
|
+
"invalid_transition"
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
return this.requireWebhookRun(input.projectId, input.id)
|
|
132
|
+
})()
|
|
92
133
|
}
|
|
93
134
|
|
|
94
135
|
async finish(input: FinishWebhookRunInput): Promise<WebhookRunRecord> {
|
|
95
136
|
return this.db.transaction(() => {
|
|
96
|
-
const existing = this.
|
|
97
|
-
.query("SELECT * FROM webhook_runs WHERE project_id = ? AND id = ?")
|
|
98
|
-
.get(input.projectId, input.id) as WebhookRunDatabaseRow | null
|
|
99
|
-
|
|
137
|
+
const existing = this.getWebhookRunRow(input.projectId, input.id)
|
|
100
138
|
if (!existing) {
|
|
101
139
|
throw new WebhookRunError(
|
|
102
|
-
`[SixbSqlite] Webhook run '${input.id}' not found for project '${input.projectId}'
|
|
140
|
+
`[SixbSqlite] Webhook run '${input.id}' not found for project '${input.projectId}'.`,
|
|
141
|
+
"not_found"
|
|
103
142
|
)
|
|
104
143
|
}
|
|
105
|
-
|
|
106
144
|
if (existing.status !== "running") {
|
|
107
145
|
throw new WebhookRunError(
|
|
108
|
-
`[SixbSqlite] Webhook run '${input.id}' for project '${input.projectId}' is already terminal
|
|
146
|
+
`[SixbSqlite] Webhook run '${input.id}' for project '${input.projectId}' is already terminal.`,
|
|
147
|
+
"invalid_transition"
|
|
109
148
|
)
|
|
110
149
|
}
|
|
111
150
|
|
|
@@ -113,72 +152,63 @@ export class SqliteWebhookRunStorage implements WebhookRunStorage {
|
|
|
113
152
|
.query(
|
|
114
153
|
`
|
|
115
154
|
UPDATE webhook_runs
|
|
116
|
-
SET
|
|
117
|
-
status = ?,
|
|
118
|
-
finished_at = ?,
|
|
119
|
-
request_body_bytes = ?,
|
|
120
|
-
response_status = ?,
|
|
121
|
-
idempotency_key = ?,
|
|
122
|
-
delivery_claim_result = ?,
|
|
123
|
-
error = ?
|
|
155
|
+
SET status = ?, finished_at = ?, response_status = ?, error = ?
|
|
124
156
|
WHERE project_id = ? AND id = ?
|
|
125
157
|
`
|
|
126
158
|
)
|
|
127
159
|
.run(
|
|
128
160
|
input.status,
|
|
129
161
|
(input.finishedAt ?? new Date()).toISOString(),
|
|
130
|
-
input.requestBodyBytes ?? null,
|
|
131
162
|
input.responseStatus ?? null,
|
|
132
|
-
input.
|
|
133
|
-
|
|
134
|
-
|
|
163
|
+
input.status === "succeeded"
|
|
164
|
+
? null
|
|
165
|
+
: serializeSixbFailure(input.error, WEBHOOK_RUN_FAILURE_CODES),
|
|
135
166
|
input.projectId,
|
|
136
167
|
input.id
|
|
137
168
|
)
|
|
138
|
-
|
|
139
|
-
const updated = this.db
|
|
140
|
-
.query("SELECT * FROM webhook_runs WHERE project_id = ? AND id = ?")
|
|
141
|
-
.get(input.projectId, input.id) as WebhookRunDatabaseRow
|
|
142
|
-
|
|
143
|
-
return rowToWebhookRunRecord(updated)
|
|
169
|
+
return this.requireWebhookRun(input.projectId, input.id)
|
|
144
170
|
})()
|
|
145
171
|
}
|
|
146
172
|
|
|
147
173
|
async getById(params: { projectId: string; id: string }): Promise<WebhookRunRecord | null> {
|
|
148
|
-
const row = this.
|
|
149
|
-
|
|
150
|
-
|
|
174
|
+
const row = this.getWebhookRunRow(params.projectId, params.id)
|
|
175
|
+
return row ? rowToWebhookRunRecord(row) : null
|
|
176
|
+
}
|
|
151
177
|
|
|
178
|
+
async getByDelivery(input: GetWebhookRunByDeliveryInput): Promise<WebhookRunRecord | null> {
|
|
179
|
+
const row = this.db
|
|
180
|
+
.query(
|
|
181
|
+
`
|
|
182
|
+
SELECT * FROM webhook_runs
|
|
183
|
+
WHERE project_id = ? AND connector_id = ? AND webhook_id = ? AND idempotency_key = ?
|
|
184
|
+
`
|
|
185
|
+
)
|
|
186
|
+
.get(
|
|
187
|
+
input.projectId,
|
|
188
|
+
input.connectorId,
|
|
189
|
+
input.webhookId,
|
|
190
|
+
input.idempotencyKey
|
|
191
|
+
) as WebhookRunDatabaseRow | null
|
|
152
192
|
return row ? rowToWebhookRunRecord(row) : null
|
|
153
193
|
}
|
|
154
194
|
|
|
155
195
|
async list(input: ListWebhookRunsInput): Promise<ListWebhookRunsResult> {
|
|
156
|
-
if (hasEmptyStatuses(input)) {
|
|
157
|
-
return {
|
|
158
|
-
runs: [],
|
|
159
|
-
hasMore: false,
|
|
160
|
-
total: 0,
|
|
161
|
-
}
|
|
162
|
-
}
|
|
196
|
+
if (hasEmptyStatuses(input)) return { runs: [], hasMore: false, total: 0 }
|
|
163
197
|
|
|
164
198
|
const whereClauses = ["project_id = ?"]
|
|
165
199
|
const args: SqliteValue[] = [input.projectId]
|
|
166
|
-
|
|
167
200
|
if (input.connectorId) {
|
|
168
201
|
whereClauses.push("connector_id = ?")
|
|
169
202
|
args.push(input.connectorId)
|
|
170
203
|
}
|
|
171
|
-
|
|
172
204
|
if (input.webhookId) {
|
|
173
205
|
whereClauses.push("webhook_id = ?")
|
|
174
206
|
args.push(input.webhookId)
|
|
175
207
|
}
|
|
176
|
-
|
|
177
208
|
if (input.idempotencyKey) {
|
|
178
209
|
whereClauses.push("idempotency_key = ?")
|
|
179
210
|
args.push(input.idempotencyKey)
|
|
180
211
|
}
|
|
181
|
-
|
|
182
212
|
appendRunListFilters(whereClauses, args, input)
|
|
183
213
|
|
|
184
214
|
const { rows, total, hasMore } = queryRunList<WebhookRunDatabaseRow>({
|
|
@@ -190,23 +220,36 @@ export class SqliteWebhookRunStorage implements WebhookRunStorage {
|
|
|
190
220
|
limit: input.limit,
|
|
191
221
|
offset: input.offset,
|
|
192
222
|
})
|
|
193
|
-
|
|
194
|
-
return {
|
|
195
|
-
runs: rows.map(rowToWebhookRunRecord),
|
|
196
|
-
hasMore,
|
|
197
|
-
total,
|
|
198
|
-
}
|
|
223
|
+
return { runs: rows.map(rowToWebhookRunRecord), hasMore, total }
|
|
199
224
|
}
|
|
200
225
|
|
|
201
226
|
close(): void {
|
|
202
227
|
closeSqliteStoreConnection(this.connection)
|
|
203
228
|
}
|
|
229
|
+
|
|
230
|
+
private getWebhookRunRow(projectId: string, id: string): WebhookRunDatabaseRow | null {
|
|
231
|
+
return this.db
|
|
232
|
+
.query("SELECT * FROM webhook_runs WHERE project_id = ? AND id = ?")
|
|
233
|
+
.get(projectId, id) as WebhookRunDatabaseRow | null
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
private requireWebhookRun(projectId: string, id: string): WebhookRunRecord {
|
|
237
|
+
const row = this.getWebhookRunRow(projectId, id)
|
|
238
|
+
if (!row) {
|
|
239
|
+
throw new WebhookRunError(
|
|
240
|
+
`[SixbSqlite] Failed to load webhook run '${id}' for project '${projectId}'.`,
|
|
241
|
+
"not_found"
|
|
242
|
+
)
|
|
243
|
+
}
|
|
244
|
+
return rowToWebhookRunRecord(row)
|
|
245
|
+
}
|
|
204
246
|
}
|
|
205
247
|
|
|
206
248
|
function rowToWebhookRunRecord(row: WebhookRunDatabaseRow): WebhookRunRecord {
|
|
207
249
|
return {
|
|
208
250
|
id: row.id,
|
|
209
251
|
projectId: row.project_id,
|
|
252
|
+
executionId: row.execution_id,
|
|
210
253
|
connectorId: row.connector_id,
|
|
211
254
|
webhookId: row.webhook_id,
|
|
212
255
|
status: row.status,
|
|
@@ -214,17 +257,18 @@ function rowToWebhookRunRecord(row: WebhookRunDatabaseRow): WebhookRunRecord {
|
|
|
214
257
|
route: row.route,
|
|
215
258
|
startedAt: new Date(row.started_at),
|
|
216
259
|
finishedAt: row.finished_at ? new Date(row.finished_at) : undefined,
|
|
217
|
-
requestBodyBytes: row.request_body_bytes
|
|
260
|
+
requestBodyBytes: row.request_body_bytes,
|
|
261
|
+
requestBodySha256: row.request_body_sha256,
|
|
218
262
|
responseStatus: row.response_status ?? undefined,
|
|
219
263
|
idempotencyKey: row.idempotency_key ?? undefined,
|
|
220
|
-
|
|
221
|
-
error: row.error ?? undefined,
|
|
264
|
+
error: row.error === null ? undefined : parseSixbFailure(row.error, WEBHOOK_RUN_FAILURE_CODES),
|
|
222
265
|
}
|
|
223
266
|
}
|
|
224
267
|
|
|
225
268
|
interface WebhookRunDatabaseRow {
|
|
226
269
|
readonly project_id: string
|
|
227
270
|
readonly id: string
|
|
271
|
+
readonly execution_id: string
|
|
228
272
|
readonly connector_id: string
|
|
229
273
|
readonly webhook_id: string
|
|
230
274
|
readonly status: WebhookRunRecord["status"]
|
|
@@ -232,9 +276,9 @@ interface WebhookRunDatabaseRow {
|
|
|
232
276
|
readonly route: string
|
|
233
277
|
readonly started_at: string
|
|
234
278
|
readonly finished_at: string | null
|
|
235
|
-
readonly request_body_bytes: number
|
|
279
|
+
readonly request_body_bytes: number
|
|
280
|
+
readonly request_body_sha256: string
|
|
236
281
|
readonly response_status: number | null
|
|
237
282
|
readonly idempotency_key: string | null
|
|
238
|
-
readonly delivery_claim_result: WebhookRunRecord["deliveryClaimResult"] | null
|
|
239
283
|
readonly error: string | null
|
|
240
284
|
}
|