@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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/adapter-checkpoints.d.ts +6 -0
  4. package/dist/adapter-checkpoints.d.ts.map +1 -0
  5. package/dist/adapter-checkpoints.js +110 -0
  6. package/dist/adapter-checkpoints.js.map +1 -0
  7. package/dist/adapter-conversation-turns.d.ts +20 -0
  8. package/dist/adapter-conversation-turns.d.ts.map +1 -0
  9. package/dist/adapter-conversation-turns.js +216 -0
  10. package/dist/adapter-conversation-turns.js.map +1 -0
  11. package/dist/adapter-conversations.d.ts +46 -0
  12. package/dist/adapter-conversations.d.ts.map +1 -0
  13. package/dist/adapter-conversations.js +129 -0
  14. package/dist/adapter-conversations.js.map +1 -0
  15. package/dist/adapter-delivery.d.ts +13 -0
  16. package/dist/adapter-delivery.d.ts.map +1 -0
  17. package/dist/adapter-delivery.js +157 -0
  18. package/dist/adapter-delivery.js.map +1 -0
  19. package/dist/adapter-grants.d.ts +11 -0
  20. package/dist/adapter-grants.d.ts.map +1 -0
  21. package/dist/adapter-grants.js +125 -0
  22. package/dist/adapter-grants.js.map +1 -0
  23. package/dist/adapter-memory.d.ts +21 -0
  24. package/dist/adapter-memory.d.ts.map +1 -0
  25. package/dist/adapter-memory.js +181 -0
  26. package/dist/adapter-memory.js.map +1 -0
  27. package/dist/adapter-misc.d.ts +61 -0
  28. package/dist/adapter-misc.d.ts.map +1 -0
  29. package/dist/adapter-misc.js +127 -0
  30. package/dist/adapter-misc.js.map +1 -0
  31. package/dist/adapter-runs.d.ts +20 -0
  32. package/dist/adapter-runs.d.ts.map +1 -0
  33. package/dist/adapter-runs.js +193 -0
  34. package/dist/adapter-runs.js.map +1 -0
  35. package/dist/adapter-sandbox.d.ts +27 -0
  36. package/dist/adapter-sandbox.d.ts.map +1 -0
  37. package/dist/adapter-sandbox.js +267 -0
  38. package/dist/adapter-sandbox.js.map +1 -0
  39. package/dist/adapter-settings.d.ts +8 -0
  40. package/dist/adapter-settings.d.ts.map +1 -0
  41. package/dist/adapter-settings.js +38 -0
  42. package/dist/adapter-settings.js.map +1 -0
  43. package/dist/adapter-usage.d.ts +7 -0
  44. package/dist/adapter-usage.d.ts.map +1 -0
  45. package/dist/adapter-usage.js +243 -0
  46. package/dist/adapter-usage.js.map +1 -0
  47. package/dist/client-types.d.ts +6 -0
  48. package/dist/client-types.d.ts.map +1 -0
  49. package/dist/client-types.js +2 -0
  50. package/dist/client-types.js.map +1 -0
  51. package/dist/index.d.ts +208 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +424 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/migrations.d.ts +35 -0
  56. package/dist/migrations.d.ts.map +1 -0
  57. package/dist/migrations.js +694 -0
  58. package/dist/migrations.js.map +1 -0
  59. package/dist/presets.d.ts +19 -0
  60. package/dist/presets.d.ts.map +1 -0
  61. package/dist/presets.js +31 -0
  62. package/dist/presets.js.map +1 -0
  63. package/dist/provider.d.ts +12 -0
  64. package/dist/provider.d.ts.map +1 -0
  65. package/dist/provider.js +86 -0
  66. package/dist/provider.js.map +1 -0
  67. package/dist/row-mappers.d.ts +24 -0
  68. package/dist/row-mappers.d.ts.map +1 -0
  69. package/dist/row-mappers.js +450 -0
  70. package/dist/row-mappers.js.map +1 -0
  71. package/dist/sql-helpers.d.ts +46 -0
  72. package/dist/sql-helpers.d.ts.map +1 -0
  73. package/dist/sql-helpers.js +244 -0
  74. package/dist/sql-helpers.js.map +1 -0
  75. package/dist/stores.d.ts +40 -0
  76. package/dist/stores.d.ts.map +1 -0
  77. package/dist/stores.js +210 -0
  78. package/dist/stores.js.map +1 -0
  79. 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"}