@assemblyline-agents/postgres 0.1.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.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/adapter-checkpoints.d.ts +6 -0
- package/dist/adapter-checkpoints.d.ts.map +1 -0
- package/dist/adapter-checkpoints.js +110 -0
- package/dist/adapter-checkpoints.js.map +1 -0
- package/dist/adapter-conversation-turns.d.ts +20 -0
- package/dist/adapter-conversation-turns.d.ts.map +1 -0
- package/dist/adapter-conversation-turns.js +216 -0
- package/dist/adapter-conversation-turns.js.map +1 -0
- package/dist/adapter-conversations.d.ts +46 -0
- package/dist/adapter-conversations.d.ts.map +1 -0
- package/dist/adapter-conversations.js +129 -0
- package/dist/adapter-conversations.js.map +1 -0
- package/dist/adapter-delivery.d.ts +13 -0
- package/dist/adapter-delivery.d.ts.map +1 -0
- package/dist/adapter-delivery.js +157 -0
- package/dist/adapter-delivery.js.map +1 -0
- package/dist/adapter-grants.d.ts +11 -0
- package/dist/adapter-grants.d.ts.map +1 -0
- package/dist/adapter-grants.js +125 -0
- package/dist/adapter-grants.js.map +1 -0
- package/dist/adapter-memory.d.ts +21 -0
- package/dist/adapter-memory.d.ts.map +1 -0
- package/dist/adapter-memory.js +181 -0
- package/dist/adapter-memory.js.map +1 -0
- package/dist/adapter-misc.d.ts +61 -0
- package/dist/adapter-misc.d.ts.map +1 -0
- package/dist/adapter-misc.js +127 -0
- package/dist/adapter-misc.js.map +1 -0
- package/dist/adapter-runs.d.ts +20 -0
- package/dist/adapter-runs.d.ts.map +1 -0
- package/dist/adapter-runs.js +193 -0
- package/dist/adapter-runs.js.map +1 -0
- package/dist/adapter-sandbox.d.ts +27 -0
- package/dist/adapter-sandbox.d.ts.map +1 -0
- package/dist/adapter-sandbox.js +267 -0
- package/dist/adapter-sandbox.js.map +1 -0
- package/dist/adapter-settings.d.ts +8 -0
- package/dist/adapter-settings.d.ts.map +1 -0
- package/dist/adapter-settings.js +38 -0
- package/dist/adapter-settings.js.map +1 -0
- package/dist/adapter-usage.d.ts +7 -0
- package/dist/adapter-usage.d.ts.map +1 -0
- package/dist/adapter-usage.js +243 -0
- package/dist/adapter-usage.js.map +1 -0
- package/dist/client-types.d.ts +6 -0
- package/dist/client-types.d.ts.map +1 -0
- package/dist/client-types.js +2 -0
- package/dist/client-types.js.map +1 -0
- package/dist/index.d.ts +208 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +424 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations.d.ts +35 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +694 -0
- package/dist/migrations.js.map +1 -0
- package/dist/presets.d.ts +19 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +31 -0
- package/dist/presets.js.map +1 -0
- package/dist/provider.d.ts +12 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +86 -0
- package/dist/provider.js.map +1 -0
- package/dist/row-mappers.d.ts +24 -0
- package/dist/row-mappers.d.ts.map +1 -0
- package/dist/row-mappers.js +450 -0
- package/dist/row-mappers.js.map +1 -0
- package/dist/sql-helpers.d.ts +46 -0
- package/dist/sql-helpers.d.ts.map +1 -0
- package/dist/sql-helpers.js +244 -0
- package/dist/sql-helpers.js.map +1 -0
- package/dist/stores.d.ts +40 -0
- package/dist/stores.d.ts.map +1 -0
- package/dist/stores.js +210 -0
- package/dist/stores.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 OpenEve contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# @assemblyline-agents/postgres
|
|
2
|
+
|
|
3
|
+
Official Assembly Line Postgres durable-state and scheduler plugin.
|
|
4
|
+
|
|
5
|
+
It implements the runtime's state adapter interfaces on top of Postgres: runs, conversations and messages, checkpoints, delivery, memory, grants, sandbox records, settings, and miscellaneous state, plus schema migrations and ready-made presets. Usage observations have unique idempotency keys, exact integer micro-dollar fields for provider-reported cash, explicit unavailable provenance, and transactional receipt reconciliation across replicas. They do not reserve quota or gate requests. Use it to give a deployed Assembly Line agent durable storage and scheduling backed by a Postgres database.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @assemblyline-agents/postgres
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Part of Assembly Line
|
|
14
|
+
|
|
15
|
+
This package is part of [Assembly Line](https://github.com/jasonbadeaux/openeve), a vendor-neutral, filesystem-first framework for durable AI agents. See the developer documentation in [docs/developers/](https://github.com/jasonbadeaux/openeve/tree/main/docs/developers) for setup, agent authoring, and deployment guides.
|
|
16
|
+
|
|
17
|
+
## License
|
|
18
|
+
|
|
19
|
+
MIT
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CheckpointRecord, CheckpointRetentionOptions, CheckpointRetentionResult } from "@assemblyline-agents/runtime";
|
|
2
|
+
import type { QueryClient } from "./client-types.js";
|
|
3
|
+
export declare function createCheckpoint(client: QueryClient, input: Omit<CheckpointRecord, "id" | "createdAt">): Promise<CheckpointRecord>;
|
|
4
|
+
export declare function listCheckpoints(client: QueryClient, runId: string): Promise<CheckpointRecord[]>;
|
|
5
|
+
export declare function compactCheckpoints(client: QueryClient, options?: CheckpointRetentionOptions): Promise<CheckpointRetentionResult>;
|
|
6
|
+
//# sourceMappingURL=adapter-checkpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-checkpoints.d.ts","sourceRoot":"","sources":["../src/adapter-checkpoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgBrD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAOxI;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAGrG;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,0BAA+B,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAuB1I"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mapCheckpoint } from "./row-mappers.js";
|
|
3
|
+
import { addCheckpointRetentionStats, checkpointNowMs, emptyCheckpointRetentionResult, numberValue, positiveLimit, timestamp, ttlCutoffIso } from "./sql-helpers.js";
|
|
4
|
+
const ACTIVE_CHECKPOINT_STATUSES = ["created", "running", "waiting_for_approval", "waiting_for_input", "waiting_for_connection", "suspended"];
|
|
5
|
+
const TERMINAL_CHECKPOINT_STATUSES = ["completed", "failed", "cancelled"];
|
|
6
|
+
export async function createCheckpoint(client, input) {
|
|
7
|
+
const checkpoint = { ...input, id: randomUUID(), createdAt: timestamp() };
|
|
8
|
+
await client.query("insert into openeve_checkpoints (id, run_id, name, data, created_at) values ($1,$2,$3,$4::jsonb,$5)", [checkpoint.id, checkpoint.runId, checkpoint.name, JSON.stringify(checkpoint.data), checkpoint.createdAt]);
|
|
9
|
+
return checkpoint;
|
|
10
|
+
}
|
|
11
|
+
export async function listCheckpoints(client, runId) {
|
|
12
|
+
const result = await client.query("select * from openeve_checkpoints where run_id=$1 order by created_at asc", [runId]);
|
|
13
|
+
return result.rows.map(mapCheckpoint);
|
|
14
|
+
}
|
|
15
|
+
export async function compactCheckpoints(client, options = {}) {
|
|
16
|
+
const dryRun = options.dryRun === true;
|
|
17
|
+
const result = emptyCheckpointRetentionResult(dryRun);
|
|
18
|
+
const maxActive = options.maxActivePerRunName === undefined ? 0 : positiveLimit(options.maxActivePerRunName, 1);
|
|
19
|
+
if (maxActive > 0) {
|
|
20
|
+
addCheckpointRetentionStats(result, "active_compaction", await compactActiveCheckpoints(client, maxActive, options, dryRun));
|
|
21
|
+
}
|
|
22
|
+
if (options.terminalTtlMs !== undefined ||
|
|
23
|
+
options.failedRunTtlMs !== undefined ||
|
|
24
|
+
options.scheduledRunTtlMs !== undefined) {
|
|
25
|
+
addCheckpointRetentionStats(result, "terminal_ttl", await compactTerminalCheckpoints(client, options, dryRun));
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
async function compactActiveCheckpoints(client, maxActive, options, dryRun) {
|
|
30
|
+
const params = [maxActive, ACTIVE_CHECKPOINT_STATUSES];
|
|
31
|
+
const where = ["r.status = any($2)"];
|
|
32
|
+
if (options.runId) {
|
|
33
|
+
params.push(options.runId);
|
|
34
|
+
where.push(`c.run_id=$${params.length}`);
|
|
35
|
+
}
|
|
36
|
+
if (options.activeNames && options.activeNames.length > 0) {
|
|
37
|
+
params.push(options.activeNames);
|
|
38
|
+
where.push(`c.name = any($${params.length})`);
|
|
39
|
+
}
|
|
40
|
+
const candidates = `
|
|
41
|
+
with ranked as (
|
|
42
|
+
select c.id,
|
|
43
|
+
pg_column_size(c.data)::bigint as bytes,
|
|
44
|
+
row_number() over (partition by c.run_id, c.name order by c.created_at desc, c.id desc) as rn
|
|
45
|
+
from openeve_checkpoints c
|
|
46
|
+
join openeve_runs r on r.id = c.run_id
|
|
47
|
+
where ${where.join(" and ")}
|
|
48
|
+
),
|
|
49
|
+
candidates as (
|
|
50
|
+
select id, bytes from ranked where rn > $1
|
|
51
|
+
)
|
|
52
|
+
`;
|
|
53
|
+
return checkpointCandidateStats(client, candidates, params, dryRun);
|
|
54
|
+
}
|
|
55
|
+
async function compactTerminalCheckpoints(client, options, dryRun) {
|
|
56
|
+
const nowMs = checkpointNowMs(options.now);
|
|
57
|
+
const terminalCutoff = ttlCutoffIso(nowMs, options.terminalTtlMs);
|
|
58
|
+
const failedCutoff = ttlCutoffIso(nowMs, options.failedRunTtlMs ?? options.terminalTtlMs);
|
|
59
|
+
const scheduledCutoff = ttlCutoffIso(nowMs, options.scheduledRunTtlMs);
|
|
60
|
+
const params = [TERMINAL_CHECKPOINT_STATUSES, terminalCutoff, failedCutoff, scheduledCutoff];
|
|
61
|
+
const where = ["r.status = any($1)"];
|
|
62
|
+
if (options.runId) {
|
|
63
|
+
params.push(options.runId);
|
|
64
|
+
where.push(`c.run_id=$${params.length}`);
|
|
65
|
+
}
|
|
66
|
+
const candidates = `
|
|
67
|
+
with candidates as (
|
|
68
|
+
select c.id, pg_column_size(c.data)::bigint as bytes
|
|
69
|
+
from openeve_checkpoints c
|
|
70
|
+
join openeve_runs r on r.id = c.run_id
|
|
71
|
+
where ${where.join(" and ")}
|
|
72
|
+
and (
|
|
73
|
+
(
|
|
74
|
+
$4::timestamptz is not null
|
|
75
|
+
and (
|
|
76
|
+
r.input->>'channel' = 'schedule'
|
|
77
|
+
or exists (select 1 from openeve_schedule_runs sr where sr.run_id = r.id)
|
|
78
|
+
)
|
|
79
|
+
and r.updated_at <= $4::timestamptz
|
|
80
|
+
)
|
|
81
|
+
or (
|
|
82
|
+
$3::timestamptz is not null
|
|
83
|
+
and r.status = 'failed'
|
|
84
|
+
and r.updated_at <= $3::timestamptz
|
|
85
|
+
)
|
|
86
|
+
or (
|
|
87
|
+
$2::timestamptz is not null
|
|
88
|
+
and r.status in ('completed', 'cancelled')
|
|
89
|
+
and r.updated_at <= $2::timestamptz
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
`;
|
|
94
|
+
return checkpointCandidateStats(client, candidates, params, dryRun);
|
|
95
|
+
}
|
|
96
|
+
async function checkpointCandidateStats(client, candidatesCte, params, dryRun) {
|
|
97
|
+
const sql = dryRun
|
|
98
|
+
? `${candidatesCte} select count(*)::int as rows, coalesce(sum(bytes), 0)::bigint as bytes from candidates`
|
|
99
|
+
: `${candidatesCte},
|
|
100
|
+
deleted as (
|
|
101
|
+
delete from openeve_checkpoints c
|
|
102
|
+
using candidates
|
|
103
|
+
where c.id = candidates.id
|
|
104
|
+
returning pg_column_size(c.data)::bigint as bytes
|
|
105
|
+
)
|
|
106
|
+
select count(*)::int as rows, coalesce(sum(bytes), 0)::bigint as bytes from deleted`;
|
|
107
|
+
const row = (await client.query(sql, params)).rows[0] ?? {};
|
|
108
|
+
return { rows: numberValue(row.rows), bytes: numberValue(row.bytes) };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=adapter-checkpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-checkpoints.js","sourceRoot":"","sources":["../src/adapter-checkpoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ConversationTurnRecord, ConversationTurnStatus, ConversationTurnStore } from "@assemblyline-agents/runtime";
|
|
2
|
+
import type { QueryClient } from "./client-types.js";
|
|
3
|
+
export declare function enqueueConversationTurn(client: QueryClient, input: Parameters<ConversationTurnStore["enqueueConversationTurn"]>[0]): ReturnType<ConversationTurnStore["enqueueConversationTurn"]>;
|
|
4
|
+
export declare function leaseNextConversationTurn(client: QueryClient, options: Parameters<ConversationTurnStore["leaseNextConversationTurn"]>[0]): ReturnType<ConversationTurnStore["leaseNextConversationTurn"]>;
|
|
5
|
+
export declare function attachConversationTurnRun(client: QueryClient, id: string, leaseToken: string, runId: string): Promise<ConversationTurnRecord>;
|
|
6
|
+
export declare function settleConversationTurn(client: QueryClient, id: string, leaseToken: string, status: "blocked" | "completed" | "failed" | "cancelled", options?: {
|
|
7
|
+
runId?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}): Promise<ConversationTurnRecord>;
|
|
10
|
+
export declare function settleConversationTurnByRunId(client: QueryClient, runId: string, status: "blocked" | "completed" | "failed" | "cancelled", options?: {
|
|
11
|
+
error?: string;
|
|
12
|
+
}): Promise<ConversationTurnRecord | undefined>;
|
|
13
|
+
export declare function retryConversationTurn(client: QueryClient, id: string, leaseToken: string, error: string): Promise<ConversationTurnRecord>;
|
|
14
|
+
export declare function recoverExpiredConversationTurns(client: QueryClient, now?: Date): Promise<ConversationTurnRecord[]>;
|
|
15
|
+
export declare function listConversationTurns(client: QueryClient, options?: {
|
|
16
|
+
agentScope?: string;
|
|
17
|
+
conversationId?: string;
|
|
18
|
+
status?: ConversationTurnStatus;
|
|
19
|
+
}): Promise<ConversationTurnRecord[]>;
|
|
20
|
+
//# sourceMappingURL=adapter-conversation-turns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-conversation-turns.d.ts","sourceRoot":"","sources":["../src/adapter-conversation-turns.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA6BrD,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,GACrE,UAAU,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC,CAkC9D;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,UAAU,CAAC,qBAAqB,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,GACzE,UAAU,CAAC,qBAAqB,CAAC,2BAA2B,CAAC,CAAC,CAgDhE;AAED,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,sBAAsB,CAAC,CAWjC;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,EACxD,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,OAAO,CAAC,sBAAsB,CAAC,CAgBjC;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,EACxD,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAc7C;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,EACnB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,sBAAsB,CAAC,CAoBjC;AAED,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,WAAW,EACnB,GAAG,OAAa,GACf,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAkCnC;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC5B,GACL,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAqBnC"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { normalizeJsonObject, timestamp, toIso } from "./sql-helpers.js";
|
|
3
|
+
function mapConversationTurn(row) {
|
|
4
|
+
const record = {
|
|
5
|
+
id: String(row.id),
|
|
6
|
+
agentScope: String(row.agent_scope),
|
|
7
|
+
conversationId: String(row.conversation_id),
|
|
8
|
+
channel: String(row.channel),
|
|
9
|
+
eventId: String(row.event_id),
|
|
10
|
+
payload: normalizeJsonObject(row.payload),
|
|
11
|
+
idempotencyScope: String(row.idempotency_scope),
|
|
12
|
+
idempotencyKey: String(row.idempotency_key),
|
|
13
|
+
status: String(row.status),
|
|
14
|
+
attemptCount: Number(row.attempt_count ?? 0),
|
|
15
|
+
maxAttempts: Number(row.max_attempts ?? 5),
|
|
16
|
+
nextAttemptAt: toIso(row.next_attempt_at),
|
|
17
|
+
createdAt: toIso(row.created_at),
|
|
18
|
+
updatedAt: toIso(row.updated_at)
|
|
19
|
+
};
|
|
20
|
+
if (row.run_id)
|
|
21
|
+
record.runId = String(row.run_id);
|
|
22
|
+
if (row.lease_token)
|
|
23
|
+
record.leaseToken = String(row.lease_token);
|
|
24
|
+
if (row.lease_expires_at)
|
|
25
|
+
record.leaseExpiresAt = toIso(row.lease_expires_at);
|
|
26
|
+
if (row.last_error)
|
|
27
|
+
record.lastError = String(row.last_error);
|
|
28
|
+
return record;
|
|
29
|
+
}
|
|
30
|
+
export async function enqueueConversationTurn(client, input) {
|
|
31
|
+
const now = timestamp();
|
|
32
|
+
const id = randomUUID();
|
|
33
|
+
const result = await client.query(`insert into openeve_conversation_turns
|
|
34
|
+
(id, agent_scope, conversation_id, channel, event_id, payload,
|
|
35
|
+
idempotency_scope, idempotency_key, status, attempt_count, max_attempts,
|
|
36
|
+
next_attempt_at, created_at, updated_at)
|
|
37
|
+
values ($1,$2,$3,$4,$5,$6::jsonb,$7,$8,'pending',0,$9,$10,$10,$10)
|
|
38
|
+
on conflict (agent_scope, idempotency_scope, idempotency_key) do nothing
|
|
39
|
+
returning *`, [
|
|
40
|
+
id,
|
|
41
|
+
input.agentScope,
|
|
42
|
+
input.conversationId,
|
|
43
|
+
input.channel,
|
|
44
|
+
input.eventId,
|
|
45
|
+
JSON.stringify(input.payload),
|
|
46
|
+
input.idempotencyScope,
|
|
47
|
+
input.idempotencyKey,
|
|
48
|
+
Math.max(1, Math.floor(input.maxAttempts ?? 5)),
|
|
49
|
+
now
|
|
50
|
+
]);
|
|
51
|
+
const inserted = result.rows[0];
|
|
52
|
+
if (inserted)
|
|
53
|
+
return { turn: mapConversationTurn(inserted), inserted: true };
|
|
54
|
+
const existing = await client.query(`select * from openeve_conversation_turns
|
|
55
|
+
where agent_scope=$1 and idempotency_scope=$2 and idempotency_key=$3`, [input.agentScope, input.idempotencyScope, input.idempotencyKey]);
|
|
56
|
+
const row = existing.rows[0];
|
|
57
|
+
if (!row)
|
|
58
|
+
throw new Error("Conversation turn idempotency conflict could not be reloaded.");
|
|
59
|
+
return { turn: mapConversationTurn(row), inserted: false };
|
|
60
|
+
}
|
|
61
|
+
export async function leaseNextConversationTurn(client, options) {
|
|
62
|
+
const now = options.now ?? new Date();
|
|
63
|
+
const leaseToken = randomUUID();
|
|
64
|
+
const leaseExpiresAt = new Date(now.getTime() + Math.max(1, options.leaseForMs)).toISOString();
|
|
65
|
+
try {
|
|
66
|
+
const result = await client.query(`with candidate as (
|
|
67
|
+
select turn.id
|
|
68
|
+
from openeve_conversation_turns turn
|
|
69
|
+
where turn.agent_scope=$1
|
|
70
|
+
and turn.status='pending'
|
|
71
|
+
and turn.next_attempt_at <= $2
|
|
72
|
+
and not exists (
|
|
73
|
+
select 1 from openeve_conversation_turns active
|
|
74
|
+
where active.agent_scope=turn.agent_scope
|
|
75
|
+
and active.conversation_id=turn.conversation_id
|
|
76
|
+
and active.status in ('running','blocked')
|
|
77
|
+
)
|
|
78
|
+
and not exists (
|
|
79
|
+
select 1 from openeve_conversation_turns earlier
|
|
80
|
+
where earlier.agent_scope=turn.agent_scope
|
|
81
|
+
and earlier.conversation_id=turn.conversation_id
|
|
82
|
+
and earlier.status='pending'
|
|
83
|
+
and earlier.enqueue_sequence < turn.enqueue_sequence
|
|
84
|
+
)
|
|
85
|
+
order by turn.enqueue_sequence asc
|
|
86
|
+
for update skip locked
|
|
87
|
+
limit 1
|
|
88
|
+
)
|
|
89
|
+
update openeve_conversation_turns turn
|
|
90
|
+
set status='running',
|
|
91
|
+
attempt_count=turn.attempt_count + 1,
|
|
92
|
+
lease_token=$3,
|
|
93
|
+
lease_expires_at=$4,
|
|
94
|
+
updated_at=$2
|
|
95
|
+
from candidate
|
|
96
|
+
where turn.id=candidate.id
|
|
97
|
+
returning turn.*`, [options.agentScope, now.toISOString(), leaseToken, leaseExpiresAt]);
|
|
98
|
+
const row = result.rows[0];
|
|
99
|
+
return row ? mapConversationTurn(row) : undefined;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Two replicas may race on different pending rows for the same
|
|
103
|
+
// conversation. The partial unique index is the final arbiter.
|
|
104
|
+
if (error.code === "23505")
|
|
105
|
+
return undefined;
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export async function attachConversationTurnRun(client, id, leaseToken, runId) {
|
|
110
|
+
const result = await client.query(`update openeve_conversation_turns
|
|
111
|
+
set run_id=$3, updated_at=$4
|
|
112
|
+
where id=$1 and status='running' and lease_token=$2
|
|
113
|
+
returning *`, [id, leaseToken, runId, timestamp()]);
|
|
114
|
+
const row = result.rows[0];
|
|
115
|
+
if (!row)
|
|
116
|
+
throw new Error(`Conversation turn lease mismatch: ${id}`);
|
|
117
|
+
return mapConversationTurn(row);
|
|
118
|
+
}
|
|
119
|
+
export async function settleConversationTurn(client, id, leaseToken, status, options = {}) {
|
|
120
|
+
const result = await client.query(`update openeve_conversation_turns
|
|
121
|
+
set status=$3,
|
|
122
|
+
run_id=coalesce($4, run_id),
|
|
123
|
+
last_error=coalesce($5, last_error),
|
|
124
|
+
lease_token=null,
|
|
125
|
+
lease_expires_at=null,
|
|
126
|
+
updated_at=$6
|
|
127
|
+
where id=$1 and status='running' and lease_token=$2
|
|
128
|
+
returning *`, [id, leaseToken, status, options.runId ?? null, options.error ?? null, timestamp()]);
|
|
129
|
+
const row = result.rows[0];
|
|
130
|
+
if (!row)
|
|
131
|
+
throw new Error(`Conversation turn lease mismatch: ${id}`);
|
|
132
|
+
return mapConversationTurn(row);
|
|
133
|
+
}
|
|
134
|
+
export async function settleConversationTurnByRunId(client, runId, status, options = {}) {
|
|
135
|
+
const result = await client.query(`update openeve_conversation_turns
|
|
136
|
+
set status=$2,
|
|
137
|
+
last_error=coalesce($3, last_error),
|
|
138
|
+
lease_token=null,
|
|
139
|
+
lease_expires_at=null,
|
|
140
|
+
updated_at=$4
|
|
141
|
+
where run_id=$1 and status in ('running','blocked')
|
|
142
|
+
returning *`, [runId, status, options.error ?? null, timestamp()]);
|
|
143
|
+
const row = result.rows[0];
|
|
144
|
+
return row ? mapConversationTurn(row) : undefined;
|
|
145
|
+
}
|
|
146
|
+
export async function retryConversationTurn(client, id, leaseToken, error) {
|
|
147
|
+
const now = new Date();
|
|
148
|
+
const result = await client.query(`update openeve_conversation_turns
|
|
149
|
+
set status=case when attempt_count >= max_attempts then 'failed' else 'pending' end,
|
|
150
|
+
next_attempt_at=case
|
|
151
|
+
when attempt_count >= max_attempts then $4::timestamptz
|
|
152
|
+
else $4::timestamptz + least(60000, 1000 * power(2, greatest(0, attempt_count - 1))) * interval '1 millisecond'
|
|
153
|
+
end,
|
|
154
|
+
last_error=$3,
|
|
155
|
+
lease_token=null,
|
|
156
|
+
lease_expires_at=null,
|
|
157
|
+
updated_at=$4
|
|
158
|
+
where id=$1 and status='running' and lease_token=$2
|
|
159
|
+
returning *`, [id, leaseToken, error, now.toISOString()]);
|
|
160
|
+
const row = result.rows[0];
|
|
161
|
+
if (!row)
|
|
162
|
+
throw new Error(`Conversation turn lease mismatch: ${id}`);
|
|
163
|
+
return mapConversationTurn(row);
|
|
164
|
+
}
|
|
165
|
+
export async function recoverExpiredConversationTurns(client, now = new Date()) {
|
|
166
|
+
const result = await client.query(`update openeve_conversation_turns turn
|
|
167
|
+
set status=case
|
|
168
|
+
when turn.run_id is null and turn.attempt_count >= turn.max_attempts then 'failed'
|
|
169
|
+
when turn.run_id is null then 'pending'
|
|
170
|
+
when run.status in ('waiting_for_approval','waiting_for_input','waiting_for_connection','suspended') then 'blocked'
|
|
171
|
+
when run.status in ('completed','failed','cancelled') then run.status
|
|
172
|
+
else turn.status
|
|
173
|
+
end,
|
|
174
|
+
next_attempt_at=case when turn.run_id is null then $1 else turn.next_attempt_at end,
|
|
175
|
+
lease_token=case
|
|
176
|
+
when turn.run_id is null or run.status not in ('created','running') then null
|
|
177
|
+
else turn.lease_token
|
|
178
|
+
end,
|
|
179
|
+
lease_expires_at=case
|
|
180
|
+
when turn.run_id is null or run.status not in ('created','running') then null
|
|
181
|
+
else turn.lease_expires_at
|
|
182
|
+
end,
|
|
183
|
+
last_error=case
|
|
184
|
+
when turn.run_id is null then coalesce(turn.last_error, 'Conversation turn lease expired before a run was attached.')
|
|
185
|
+
else turn.last_error
|
|
186
|
+
end,
|
|
187
|
+
updated_at=$1
|
|
188
|
+
from openeve_conversation_turns source
|
|
189
|
+
left join openeve_runs run on run.id=source.run_id
|
|
190
|
+
where turn.id=source.id
|
|
191
|
+
and turn.status='running'
|
|
192
|
+
and turn.lease_expires_at <= $1
|
|
193
|
+
and (turn.run_id is null or run.status not in ('created','running'))
|
|
194
|
+
returning turn.*`, [now.toISOString()]);
|
|
195
|
+
return result.rows.map(mapConversationTurn);
|
|
196
|
+
}
|
|
197
|
+
export async function listConversationTurns(client, options = {}) {
|
|
198
|
+
const values = [];
|
|
199
|
+
const clauses = [];
|
|
200
|
+
if (options.agentScope) {
|
|
201
|
+
values.push(options.agentScope);
|
|
202
|
+
clauses.push(`agent_scope=$${values.length}`);
|
|
203
|
+
}
|
|
204
|
+
if (options.conversationId) {
|
|
205
|
+
values.push(options.conversationId);
|
|
206
|
+
clauses.push(`conversation_id=$${values.length}`);
|
|
207
|
+
}
|
|
208
|
+
if (options.status) {
|
|
209
|
+
values.push(options.status);
|
|
210
|
+
clauses.push(`status=$${values.length}`);
|
|
211
|
+
}
|
|
212
|
+
const where = clauses.length > 0 ? `where ${clauses.join(" and ")}` : "";
|
|
213
|
+
const result = await client.query(`select * from openeve_conversation_turns ${where} order by enqueue_sequence asc`, values);
|
|
214
|
+
return result.rows.map(mapConversationTurn);
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=adapter-conversation-turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-conversation-turns.js","sourceRoot":"","sources":["../src/adapter-conversation-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { JsonObject } from "@assemblyline-agents/core";
|
|
2
|
+
import type { ConversationCursor, ConversationRecord, MessageCursor, MessageRecord } from "@assemblyline-agents/runtime";
|
|
3
|
+
import type { QueryClient } from "./client-types.js";
|
|
4
|
+
export declare function upsertConversation(client: QueryClient, input: {
|
|
5
|
+
id: string;
|
|
6
|
+
agentScope?: string;
|
|
7
|
+
agentRevision: string;
|
|
8
|
+
channel: string;
|
|
9
|
+
subject?: string;
|
|
10
|
+
title?: string;
|
|
11
|
+
metadata?: JsonObject;
|
|
12
|
+
}): Promise<ConversationRecord>;
|
|
13
|
+
export declare function getConversation(client: QueryClient, id: string): Promise<ConversationRecord | undefined>;
|
|
14
|
+
export declare function listConversations(client: QueryClient, input: {
|
|
15
|
+
agentScope: string;
|
|
16
|
+
channel?: string;
|
|
17
|
+
subject?: string;
|
|
18
|
+
archived?: boolean;
|
|
19
|
+
before?: ConversationCursor;
|
|
20
|
+
limit?: number;
|
|
21
|
+
}): Promise<ConversationRecord[]>;
|
|
22
|
+
export declare function updateConversation(client: QueryClient, id: string, patch: {
|
|
23
|
+
title?: string | null;
|
|
24
|
+
archivedAt?: string | null;
|
|
25
|
+
metadata?: JsonObject;
|
|
26
|
+
}): Promise<ConversationRecord | undefined>;
|
|
27
|
+
export declare function listRecentConversationsBySubject(client: QueryClient, input: {
|
|
28
|
+
channel: string;
|
|
29
|
+
subject: string;
|
|
30
|
+
since?: string;
|
|
31
|
+
limit?: number;
|
|
32
|
+
excludeId?: string;
|
|
33
|
+
}): Promise<ConversationRecord[]>;
|
|
34
|
+
export declare function appendMessage(client: QueryClient, input: {
|
|
35
|
+
conversationId: string;
|
|
36
|
+
runId?: string;
|
|
37
|
+
role: MessageRecord["role"];
|
|
38
|
+
content: JsonObject;
|
|
39
|
+
}): Promise<MessageRecord>;
|
|
40
|
+
export declare function listRecentMessages(client: QueryClient, conversationId: string, limit?: number): Promise<MessageRecord[]>;
|
|
41
|
+
export declare function listMessages(client: QueryClient, input: {
|
|
42
|
+
conversationId: string;
|
|
43
|
+
before?: MessageCursor;
|
|
44
|
+
limit?: number;
|
|
45
|
+
}): Promise<MessageRecord[]>;
|
|
46
|
+
//# sourceMappingURL=adapter-conversations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-conversations.d.ts","sourceRoot":"","sources":["../src/adapter-conversations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACzH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;IACnE,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4B9B;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAI9G;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyBhC;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAsB1C;AAED,wBAAsB,gCAAgC,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAoBhC;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,EAAE,UAAU,CAAC;CACrB,GAAG,OAAO,CAAC,aAAa,CAAC,CAezB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAM1H;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAgB3B"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mapConversation, mapMessage } from "./row-mappers.js";
|
|
3
|
+
import { timestamp } from "./sql-helpers.js";
|
|
4
|
+
export async function upsertConversation(client, input) {
|
|
5
|
+
const now = timestamp();
|
|
6
|
+
const result = await client.query(`insert into openeve_conversations
|
|
7
|
+
(id, agent_id, agent_scope, agent_revision, channel, subject, title, metadata, created_at, updated_at)
|
|
8
|
+
values ($1, null, $2, $3, $4, $5, $6, $7::jsonb, $8, $9)
|
|
9
|
+
on conflict (id) do update set
|
|
10
|
+
agent_scope=coalesce(excluded.agent_scope, openeve_conversations.agent_scope),
|
|
11
|
+
agent_revision=excluded.agent_revision,
|
|
12
|
+
channel=excluded.channel,
|
|
13
|
+
subject=coalesce(excluded.subject, openeve_conversations.subject),
|
|
14
|
+
title=coalesce(excluded.title, openeve_conversations.title),
|
|
15
|
+
metadata=openeve_conversations.metadata || excluded.metadata,
|
|
16
|
+
updated_at=excluded.updated_at
|
|
17
|
+
returning *`, [
|
|
18
|
+
input.id,
|
|
19
|
+
input.agentScope ?? null,
|
|
20
|
+
input.agentRevision,
|
|
21
|
+
input.channel,
|
|
22
|
+
input.subject ?? null,
|
|
23
|
+
input.title ?? null,
|
|
24
|
+
JSON.stringify(input.metadata ?? {}),
|
|
25
|
+
now,
|
|
26
|
+
now
|
|
27
|
+
]);
|
|
28
|
+
return mapConversation(result.rows[0]);
|
|
29
|
+
}
|
|
30
|
+
export async function getConversation(client, id) {
|
|
31
|
+
const result = await client.query("select * from openeve_conversations where id=$1", [id]);
|
|
32
|
+
const row = result.rows[0];
|
|
33
|
+
return row ? mapConversation(row) : undefined;
|
|
34
|
+
}
|
|
35
|
+
export async function listConversations(client, input) {
|
|
36
|
+
const clauses = ["coalesce(agent_scope, agent_revision, agent_id)=$1"];
|
|
37
|
+
const values = [input.agentScope];
|
|
38
|
+
if (input.channel) {
|
|
39
|
+
values.push(input.channel);
|
|
40
|
+
clauses.push(`channel=$${values.length}`);
|
|
41
|
+
}
|
|
42
|
+
if (input.subject) {
|
|
43
|
+
values.push(input.subject);
|
|
44
|
+
clauses.push(`subject=$${values.length}`);
|
|
45
|
+
}
|
|
46
|
+
if (input.archived !== undefined)
|
|
47
|
+
clauses.push(input.archived ? "archived_at is not null" : "archived_at is null");
|
|
48
|
+
if (input.before) {
|
|
49
|
+
values.push(input.before.updatedAt, input.before.id);
|
|
50
|
+
clauses.push(`(updated_at, id) < ($${values.length - 1}, $${values.length})`);
|
|
51
|
+
}
|
|
52
|
+
values.push(Math.max(0, input.limit ?? 50));
|
|
53
|
+
const result = await client.query(`select * from openeve_conversations
|
|
54
|
+
where ${clauses.join(" and ")}
|
|
55
|
+
order by updated_at desc, id desc
|
|
56
|
+
limit $${values.length}`, values);
|
|
57
|
+
return result.rows.map(mapConversation);
|
|
58
|
+
}
|
|
59
|
+
export async function updateConversation(client, id, patch) {
|
|
60
|
+
const now = timestamp();
|
|
61
|
+
const result = await client.query(`update openeve_conversations set
|
|
62
|
+
title=case when $2::boolean then $3 else title end,
|
|
63
|
+
archived_at=case when $4::boolean then $5::timestamptz else archived_at end,
|
|
64
|
+
metadata=metadata || $6::jsonb,
|
|
65
|
+
updated_at=$7
|
|
66
|
+
where id=$1
|
|
67
|
+
returning *`, [
|
|
68
|
+
id,
|
|
69
|
+
patch.title !== undefined,
|
|
70
|
+
patch.title ?? null,
|
|
71
|
+
patch.archivedAt !== undefined,
|
|
72
|
+
patch.archivedAt ?? null,
|
|
73
|
+
JSON.stringify(patch.metadata ?? {}),
|
|
74
|
+
now
|
|
75
|
+
]);
|
|
76
|
+
const row = result.rows[0];
|
|
77
|
+
return row ? mapConversation(row) : undefined;
|
|
78
|
+
}
|
|
79
|
+
export async function listRecentConversationsBySubject(client, input) {
|
|
80
|
+
const clauses = ["channel=$1", "subject=$2"];
|
|
81
|
+
const values = [input.channel, input.subject];
|
|
82
|
+
if (input.since) {
|
|
83
|
+
values.push(input.since);
|
|
84
|
+
clauses.push(`updated_at >= $${values.length}`);
|
|
85
|
+
}
|
|
86
|
+
if (input.excludeId) {
|
|
87
|
+
values.push(input.excludeId);
|
|
88
|
+
clauses.push(`id <> $${values.length}`);
|
|
89
|
+
}
|
|
90
|
+
values.push(Math.max(0, input.limit ?? 10));
|
|
91
|
+
const result = await client.query(`select * from openeve_conversations
|
|
92
|
+
where ${clauses.join(" and ")}
|
|
93
|
+
order by updated_at desc
|
|
94
|
+
limit $${values.length}`, values);
|
|
95
|
+
return result.rows.map(mapConversation);
|
|
96
|
+
}
|
|
97
|
+
export async function appendMessage(client, input) {
|
|
98
|
+
const record = {
|
|
99
|
+
id: randomUUID(),
|
|
100
|
+
conversationId: input.conversationId,
|
|
101
|
+
role: input.role,
|
|
102
|
+
content: input.content,
|
|
103
|
+
createdAt: timestamp()
|
|
104
|
+
};
|
|
105
|
+
if (input.runId)
|
|
106
|
+
record.runId = input.runId;
|
|
107
|
+
await client.query(`insert into openeve_messages (id, conversation_id, run_id, role, content, created_at)
|
|
108
|
+
values ($1,$2,$3,$4,$5::jsonb,$6)`, [record.id, record.conversationId, record.runId ?? null, record.role, JSON.stringify(record.content), record.createdAt]);
|
|
109
|
+
return record;
|
|
110
|
+
}
|
|
111
|
+
export async function listRecentMessages(client, conversationId, limit = 20) {
|
|
112
|
+
const result = await client.query("select * from openeve_messages where conversation_id=$1 order by created_at desc limit $2", [conversationId, limit]);
|
|
113
|
+
return result.rows.map(mapMessage).reverse();
|
|
114
|
+
}
|
|
115
|
+
export async function listMessages(client, input) {
|
|
116
|
+
const values = [input.conversationId];
|
|
117
|
+
const clauses = ["conversation_id=$1"];
|
|
118
|
+
if (input.before) {
|
|
119
|
+
values.push(input.before.createdAt, input.before.id);
|
|
120
|
+
clauses.push(`(created_at, id) < ($${values.length - 1}, $${values.length})`);
|
|
121
|
+
}
|
|
122
|
+
values.push(Math.max(0, input.limit ?? 50));
|
|
123
|
+
const result = await client.query(`select * from openeve_messages
|
|
124
|
+
where ${clauses.join(" and ")}
|
|
125
|
+
order by created_at desc, id desc
|
|
126
|
+
limit $${values.length}`, values);
|
|
127
|
+
return result.rows.map(mapMessage).reverse();
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=adapter-conversations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-conversations.js","sourceRoot":"","sources":["../src/adapter-conversations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JsonObject } from "@assemblyline-agents/core";
|
|
2
|
+
import type { DeliveryFailureInput, DeliveryLeaseOptions, DeliveryObligation, DeliveryObligationInput, DeliveryObligationPatch } from "@assemblyline-agents/runtime";
|
|
3
|
+
import type { QueryClient } from "./client-types.js";
|
|
4
|
+
export declare function createDelivery(client: QueryClient, input: DeliveryObligationInput): Promise<DeliveryObligation>;
|
|
5
|
+
export declare function updateDelivery(client: QueryClient, id: string, patch: DeliveryObligationPatch): Promise<DeliveryObligation>;
|
|
6
|
+
export declare function listDeliveries(client: QueryClient, runId: string): Promise<DeliveryObligation[]>;
|
|
7
|
+
export declare function leaseDueDeliveries(client: QueryClient, options?: DeliveryLeaseOptions): Promise<DeliveryObligation[]>;
|
|
8
|
+
export declare function completeDeliverySend(client: QueryClient, id: string, leaseToken: string, patch?: {
|
|
9
|
+
payload?: JsonObject;
|
|
10
|
+
}): Promise<DeliveryObligation>;
|
|
11
|
+
export declare function failDeliverySend(client: QueryClient, id: string, leaseToken: string, failure: DeliveryFailureInput): Promise<DeliveryObligation>;
|
|
12
|
+
export declare function recoverExpiredDeliveries(client: QueryClient, now?: Date): Promise<DeliveryObligation[]>;
|
|
13
|
+
//# sourceMappingURL=adapter-delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-delivery.d.ts","sourceRoot":"","sources":["../src/adapter-delivery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoCrH;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAMjI;AAyBD,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAGtG;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyB/H;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE;IAAE,OAAO,CAAC,EAAE,UAAU,CAAA;CAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsBjK;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+BtJ;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAWzH"}
|