lingxios 1.0.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/README.md +54 -0
- package/db/schema.sql +306 -0
- package/dist/src/app/artifacts.d.ts +8 -0
- package/dist/src/app/artifacts.js +114 -0
- package/dist/src/app/artifacts.js.map +1 -0
- package/dist/src/app/doctor.d.ts +22 -0
- package/dist/src/app/doctor.js +44 -0
- package/dist/src/app/doctor.js.map +1 -0
- package/dist/src/app/index.d.ts +123 -0
- package/dist/src/app/index.js +291 -0
- package/dist/src/app/index.js.map +1 -0
- package/dist/src/app/input.d.ts +22 -0
- package/dist/src/app/input.js +60 -0
- package/dist/src/app/input.js.map +1 -0
- package/dist/src/app/recover-wait.d.ts +5 -0
- package/dist/src/app/recover-wait.js +59 -0
- package/dist/src/app/recover-wait.js.map +1 -0
- package/dist/src/app/resources.d.ts +5 -0
- package/dist/src/app/resources.js +9 -0
- package/dist/src/app/resources.js.map +1 -0
- package/dist/src/app/storage.d.ts +2 -0
- package/dist/src/app/storage.js +41 -0
- package/dist/src/app/storage.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +2 -0
- package/dist/src/cli/doctor.js +20 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/eval.d.ts +2 -0
- package/dist/src/cli/eval.js +44 -0
- package/dist/src/cli/eval.js.map +1 -0
- package/dist/src/config.d.ts +22 -0
- package/dist/src/config.js +56 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context/attachments.d.ts +10 -0
- package/dist/src/context/attachments.js +18 -0
- package/dist/src/context/attachments.js.map +1 -0
- package/dist/src/context/document-text.d.ts +1 -0
- package/dist/src/context/document-text.js +29 -0
- package/dist/src/context/document-text.js.map +1 -0
- package/dist/src/context/document-worker.d.ts +1 -0
- package/dist/src/context/document-worker.js +62 -0
- package/dist/src/context/document-worker.js.map +1 -0
- package/dist/src/context/evidence.d.ts +19 -0
- package/dist/src/context/evidence.js +37 -0
- package/dist/src/context/evidence.js.map +1 -0
- package/dist/src/context/request.d.ts +21 -0
- package/dist/src/context/request.js +32 -0
- package/dist/src/context/request.js.map +1 -0
- package/dist/src/context/research-evidence.d.ts +4 -0
- package/dist/src/context/research-evidence.js +24 -0
- package/dist/src/context/research-evidence.js.map +1 -0
- package/dist/src/context/resource-checks.d.ts +7 -0
- package/dist/src/context/resource-checks.js +15 -0
- package/dist/src/context/resource-checks.js.map +1 -0
- package/dist/src/context/task-contract.d.ts +11 -0
- package/dist/src/context/task-contract.js +23 -0
- package/dist/src/context/task-contract.js.map +1 -0
- package/dist/src/context/text.d.ts +2 -0
- package/dist/src/context/text.js +7 -0
- package/dist/src/context/text.js.map +1 -0
- package/dist/src/control-plane/http-server.d.ts +22 -0
- package/dist/src/control-plane/http-server.js +196 -0
- package/dist/src/control-plane/http-server.js.map +1 -0
- package/dist/src/control-plane/memory-store.d.ts +71 -0
- package/dist/src/control-plane/memory-store.js +389 -0
- package/dist/src/control-plane/memory-store.js.map +1 -0
- package/dist/src/control-plane/pg-store.d.ts +62 -0
- package/dist/src/control-plane/pg-store.js +386 -0
- package/dist/src/control-plane/pg-store.js.map +1 -0
- package/dist/src/control-plane/service.d.ts +52 -0
- package/dist/src/control-plane/service.js +630 -0
- package/dist/src/control-plane/service.js.map +1 -0
- package/dist/src/control-plane/stores.d.ts +184 -0
- package/dist/src/control-plane/stores.js +19 -0
- package/dist/src/control-plane/stores.js.map +1 -0
- package/dist/src/errors.d.ts +66 -0
- package/dist/src/errors.js +102 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/eval/calibration.d.ts +16 -0
- package/dist/src/eval/calibration.js +28 -0
- package/dist/src/eval/calibration.js.map +1 -0
- package/dist/src/eval/index.d.ts +40 -0
- package/dist/src/eval/index.js +40 -0
- package/dist/src/eval/index.js.map +1 -0
- package/dist/src/eval/review.d.ts +20 -0
- package/dist/src/eval/review.js +49 -0
- package/dist/src/eval/review.js.map +1 -0
- package/dist/src/host/http-client.d.ts +48 -0
- package/dist/src/host/http-client.js +127 -0
- package/dist/src/host/http-client.js.map +1 -0
- package/dist/src/host/port.d.ts +26 -0
- package/dist/src/host/port.js +2 -0
- package/dist/src/host/port.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/lingxiloop/actions.d.ts +25 -0
- package/dist/src/integrations/lingxiloop/actions.js +77 -0
- package/dist/src/integrations/lingxiloop/actions.js.map +1 -0
- package/dist/src/integrations/lingxiloop/app.d.ts +167 -0
- package/dist/src/integrations/lingxiloop/app.js +434 -0
- package/dist/src/integrations/lingxiloop/app.js.map +1 -0
- package/dist/src/integrations/lingxiloop/approvals.d.ts +148 -0
- package/dist/src/integrations/lingxiloop/approvals.js +540 -0
- package/dist/src/integrations/lingxiloop/approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/attachments.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/attachments.js +38 -0
- package/dist/src/integrations/lingxiloop/attachments.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.js +126 -0
- package/dist/src/integrations/lingxiloop/calendar-approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.d.ts +15 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.js +79 -0
- package/dist/src/integrations/lingxiloop/calendar-writes.js.map +1 -0
- package/dist/src/integrations/lingxiloop/calendar.d.ts +19 -0
- package/dist/src/integrations/lingxiloop/calendar.js +43 -0
- package/dist/src/integrations/lingxiloop/calendar.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-events.d.ts +7 -0
- package/dist/src/integrations/lingxiloop/canvas-events.js +53 -0
- package/dist/src/integrations/lingxiloop/canvas-events.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.d.ts +5 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.js +52 -0
- package/dist/src/integrations/lingxiloop/canvas-summary.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.d.ts +12 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.js +120 -0
- package/dist/src/integrations/lingxiloop/canvas-work-report.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas-work.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/canvas-work.js +306 -0
- package/dist/src/integrations/lingxiloop/canvas-work.js.map +1 -0
- package/dist/src/integrations/lingxiloop/canvas.d.ts +12 -0
- package/dist/src/integrations/lingxiloop/canvas.js +79 -0
- package/dist/src/integrations/lingxiloop/canvas.js.map +1 -0
- package/dist/src/integrations/lingxiloop/chat.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/chat.js +46 -0
- package/dist/src/integrations/lingxiloop/chat.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-approvals.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/document-approvals.js +75 -0
- package/dist/src/integrations/lingxiloop/document-approvals.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-content.d.ts +80 -0
- package/dist/src/integrations/lingxiloop/document-content.js +195 -0
- package/dist/src/integrations/lingxiloop/document-content.js.map +1 -0
- package/dist/src/integrations/lingxiloop/document-writes.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/document-writes.js +49 -0
- package/dist/src/integrations/lingxiloop/document-writes.js.map +1 -0
- package/dist/src/integrations/lingxiloop/documents.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/documents.js +38 -0
- package/dist/src/integrations/lingxiloop/documents.js.map +1 -0
- package/dist/src/integrations/lingxiloop/event-outbox.d.ts +5 -0
- package/dist/src/integrations/lingxiloop/event-outbox.js +47 -0
- package/dist/src/integrations/lingxiloop/event-outbox.js.map +1 -0
- package/dist/src/integrations/lingxiloop/index.d.ts +3 -0
- package/dist/src/integrations/lingxiloop/index.js +3 -0
- package/dist/src/integrations/lingxiloop/index.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.d.ts +13 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.js +58 -0
- package/dist/src/integrations/lingxiloop/learning-attempts.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.d.ts +8 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.js +64 -0
- package/dist/src/integrations/lingxiloop/learning-evaluation.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.d.ts +7 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.js +88 -0
- package/dist/src/integrations/lingxiloop/learning-evidence.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning-missions.d.ts +18 -0
- package/dist/src/integrations/lingxiloop/learning-missions.js +95 -0
- package/dist/src/integrations/lingxiloop/learning-missions.js.map +1 -0
- package/dist/src/integrations/lingxiloop/learning.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/learning.js +150 -0
- package/dist/src/integrations/lingxiloop/learning.js.map +1 -0
- package/dist/src/integrations/lingxiloop/memory.d.ts +14 -0
- package/dist/src/integrations/lingxiloop/memory.js +133 -0
- package/dist/src/integrations/lingxiloop/memory.js.map +1 -0
- package/dist/src/integrations/lingxiloop/polls.d.ts +9 -0
- package/dist/src/integrations/lingxiloop/polls.js +47 -0
- package/dist/src/integrations/lingxiloop/polls.js.map +1 -0
- package/dist/src/integrations/lingxiloop/presentations.d.ts +11 -0
- package/dist/src/integrations/lingxiloop/presentations.js +34 -0
- package/dist/src/integrations/lingxiloop/presentations.js.map +1 -0
- package/dist/src/integrations/lingxiloop/questionnaire.d.ts +21 -0
- package/dist/src/integrations/lingxiloop/questionnaire.js +57 -0
- package/dist/src/integrations/lingxiloop/questionnaire.js.map +1 -0
- package/dist/src/integrations/lingxiloop/research.d.ts +19 -0
- package/dist/src/integrations/lingxiloop/research.js +20 -0
- package/dist/src/integrations/lingxiloop/research.js.map +1 -0
- package/dist/src/integrations/lingxiloop/routines.d.ts +91 -0
- package/dist/src/integrations/lingxiloop/routines.js +198 -0
- package/dist/src/integrations/lingxiloop/routines.js.map +1 -0
- package/dist/src/integrations/lingxiloop/service-contracts.d.ts +1045 -0
- package/dist/src/integrations/lingxiloop/service-contracts.js +2 -0
- package/dist/src/integrations/lingxiloop/service-contracts.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-context.d.ts +32 -0
- package/dist/src/integrations/lingxiloop/teacher-context.js +25 -0
- package/dist/src/integrations/lingxiloop/teacher-context.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.d.ts +13 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.js +152 -0
- package/dist/src/integrations/lingxiloop/teacher-digest.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.d.ts +22 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.js +41 -0
- package/dist/src/integrations/lingxiloop/teacher-preview.js.map +1 -0
- package/dist/src/integrations/lingxiloop/teacher.d.ts +24 -0
- package/dist/src/integrations/lingxiloop/teacher.js +224 -0
- package/dist/src/integrations/lingxiloop/teacher.js.map +1 -0
- package/dist/src/kernel/manager.d.ts +52 -0
- package/dist/src/kernel/manager.js +407 -0
- package/dist/src/kernel/manager.js.map +1 -0
- package/dist/src/logging.d.ts +21 -0
- package/dist/src/logging.js +54 -0
- package/dist/src/logging.js.map +1 -0
- package/dist/src/memory/evidence.d.ts +6 -0
- package/dist/src/memory/evidence.js +43 -0
- package/dist/src/memory/evidence.js.map +1 -0
- package/dist/src/memory/processor.d.ts +3 -0
- package/dist/src/memory/processor.js +66 -0
- package/dist/src/memory/processor.js.map +1 -0
- package/dist/src/memory/semantic.d.ts +19 -0
- package/dist/src/memory/semantic.js +93 -0
- package/dist/src/memory/semantic.js.map +1 -0
- package/dist/src/memory/store.d.ts +20 -0
- package/dist/src/memory/store.js +34 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/memory/synthesis.d.ts +24 -0
- package/dist/src/memory/synthesis.js +138 -0
- package/dist/src/memory/synthesis.js.map +1 -0
- package/dist/src/metrics.d.ts +43 -0
- package/dist/src/metrics.js +130 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/model/driver.d.ts +60 -0
- package/dist/src/model/driver.js +2 -0
- package/dist/src/model/driver.js.map +1 -0
- package/dist/src/model/embeddings.d.ts +24 -0
- package/dist/src/model/embeddings.js +97 -0
- package/dist/src/model/embeddings.js.map +1 -0
- package/dist/src/model/openai.d.ts +45 -0
- package/dist/src/model/openai.js +340 -0
- package/dist/src/model/openai.js.map +1 -0
- package/dist/src/outcome/assessment.d.ts +16 -0
- package/dist/src/outcome/assessment.js +45 -0
- package/dist/src/outcome/assessment.js.map +1 -0
- package/dist/src/outcome/content-check.d.ts +19 -0
- package/dist/src/outcome/content-check.js +44 -0
- package/dist/src/outcome/content-check.js.map +1 -0
- package/dist/src/outcome/envelope.d.ts +34 -0
- package/dist/src/outcome/envelope.js +42 -0
- package/dist/src/outcome/envelope.js.map +1 -0
- package/dist/src/protocol/constants.d.ts +25 -0
- package/dist/src/protocol/constants.js +26 -0
- package/dist/src/protocol/constants.js.map +1 -0
- package/dist/src/protocol/kernel-wire.d.ts +74 -0
- package/dist/src/protocol/kernel-wire.js +2 -0
- package/dist/src/protocol/kernel-wire.js.map +1 -0
- package/dist/src/protocol/outcome.d.ts +16 -0
- package/dist/src/protocol/outcome.js +14 -0
- package/dist/src/protocol/outcome.js.map +1 -0
- package/dist/src/protocol/types.d.ts +266 -0
- package/dist/src/protocol/types.js +19 -0
- package/dist/src/protocol/types.js.map +1 -0
- package/dist/src/research/address.d.ts +2 -0
- package/dist/src/research/address.js +32 -0
- package/dist/src/research/address.js.map +1 -0
- package/dist/src/research/fetch.d.ts +7 -0
- package/dist/src/research/fetch.js +83 -0
- package/dist/src/research/fetch.js.map +1 -0
- package/dist/src/research/index.d.ts +26 -0
- package/dist/src/research/index.js +109 -0
- package/dist/src/research/index.js.map +1 -0
- package/dist/src/runtime/compaction.d.ts +41 -0
- package/dist/src/runtime/compaction.js +86 -0
- package/dist/src/runtime/compaction.js.map +1 -0
- package/dist/src/runtime/corrections.d.ts +20 -0
- package/dist/src/runtime/corrections.js +27 -0
- package/dist/src/runtime/corrections.js.map +1 -0
- package/dist/src/runtime/policy.d.ts +42 -0
- package/dist/src/runtime/policy.js +91 -0
- package/dist/src/runtime/policy.js.map +1 -0
- package/dist/src/runtime/resource-refresh.d.ts +8 -0
- package/dist/src/runtime/resource-refresh.js +37 -0
- package/dist/src/runtime/resource-refresh.js.map +1 -0
- package/dist/src/runtime/runtime.d.ts +51 -0
- package/dist/src/runtime/runtime.js +804 -0
- package/dist/src/runtime/runtime.js.map +1 -0
- package/dist/src/runtime/tool.d.ts +13 -0
- package/dist/src/runtime/tool.js +42 -0
- package/dist/src/runtime/tool.js.map +1 -0
- package/dist/src/ui/index.d.ts +27 -0
- package/dist/src/ui/index.js +54 -0
- package/dist/src/ui/index.js.map +1 -0
- package/dist/src/versions.d.ts +9 -0
- package/dist/src/versions.js +11 -0
- package/dist/src/versions.js.map +1 -0
- package/dist/src/worker/index.d.ts +3 -0
- package/dist/src/worker/index.js +57 -0
- package/dist/src/worker/index.js.map +1 -0
- package/dist/src/worker/main.d.ts +2 -0
- package/dist/src/worker/main.js +9 -0
- package/dist/src/worker/main.js.map +1 -0
- package/dist/src/worker/worker.d.ts +45 -0
- package/dist/src/worker/worker.js +154 -0
- package/dist/src/worker/worker.js.map +1 -0
- package/kernel/runner.py +507 -0
- package/package.json +83 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postgres store implementations over an injected pg-compatible pool (any
|
|
3
|
+
* object with `query` and `connect`, e.g. `pg.Pool`). Keeping the driver out
|
|
4
|
+
* of this package's dependency tree lets deployments pin their own.
|
|
5
|
+
*
|
|
6
|
+
* Semantics mirror `memory-store.ts`, which is the executable specification;
|
|
7
|
+
* the schema lives in `db/schema.sql`.
|
|
8
|
+
*/
|
|
9
|
+
import { createHash, randomBytes, randomUUID } from 'node:crypto';
|
|
10
|
+
import { sessionKeyOf } from '../protocol/types.js';
|
|
11
|
+
function hashToken(token) {
|
|
12
|
+
return createHash('sha256').update(token).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
export async function withTransaction(pool, body) {
|
|
15
|
+
const client = await pool.connect();
|
|
16
|
+
try {
|
|
17
|
+
await client.query('BEGIN');
|
|
18
|
+
const result = await body(client);
|
|
19
|
+
await client.query('COMMIT');
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
client.release();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const WORK_SESSION_KEY_SQL = `'[' || to_json(work.tenant_id)::text || ',' || to_json(work.agent_id)::text || ',' || to_json(work.session_id)::text || ',' || COALESCE(to_json(work.thread_id)::text, 'null') || ']'`;
|
|
31
|
+
function workItemFromRow(row, leaseToken, homeEpoch) {
|
|
32
|
+
return {
|
|
33
|
+
id: String(row['id']),
|
|
34
|
+
fence: Number(row['fence']),
|
|
35
|
+
homeEpoch,
|
|
36
|
+
tenantId: String(row['tenant_id']),
|
|
37
|
+
agentId: String(row['agent_id']),
|
|
38
|
+
sessionId: String(row['session_id']),
|
|
39
|
+
...(row['thread_id'] !== null ? { threadId: String(row['thread_id']) } : {}),
|
|
40
|
+
kind: String(row['kind']),
|
|
41
|
+
lane: row['lane'],
|
|
42
|
+
triggerRef: String(row['trigger_ref']),
|
|
43
|
+
...(row['principal_id'] ? { principalId: String(row['principal_id']) } : {}),
|
|
44
|
+
createdAt: new Date(row['created_at']).toISOString(),
|
|
45
|
+
availableAt: new Date(row['available_at']).toISOString(),
|
|
46
|
+
attempts: Number(row['attempts'] ?? 0),
|
|
47
|
+
preemptions: Number(row['preemptions'] ?? 0),
|
|
48
|
+
leaseToken,
|
|
49
|
+
...(row['meta'] ? { meta: row['meta'] } : {}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export class PgWorkStore {
|
|
53
|
+
pool;
|
|
54
|
+
async hasPendingChild(parent, childId, requestVersion) {
|
|
55
|
+
const { rows } = await this.pool.query(`SELECT id FROM lingxios.agent_work_items WHERE id=$1
|
|
56
|
+
AND tenant_id=$2 AND session_id=$3 AND principal_id IS NOT DISTINCT FROM $4
|
|
57
|
+
AND status IN ('queued','leased') AND cancel_requested_at IS NULL
|
|
58
|
+
AND meta->>'parentWorkId'=$5 AND meta->'parentRequestVersion'=$6::jsonb`, [childId, parent.tenantId, parent.sessionId, parent.principalId ?? null, parent.id, JSON.stringify(requestVersion)]);
|
|
59
|
+
return rows.length === 1;
|
|
60
|
+
}
|
|
61
|
+
leaseTtlSeconds;
|
|
62
|
+
workerTimeoutSeconds;
|
|
63
|
+
constructor(pool, options = {}) {
|
|
64
|
+
this.pool = pool;
|
|
65
|
+
this.leaseTtlSeconds = Math.ceil((options.leaseTtlMs ?? 45_000) / 1000);
|
|
66
|
+
this.workerTimeoutSeconds = Math.ceil((options.workerTimeoutMs ?? 90_000) / 1000);
|
|
67
|
+
}
|
|
68
|
+
async enqueue(input) {
|
|
69
|
+
const id = input.id ?? randomUUID();
|
|
70
|
+
const { rows } = await this.pool.query(`INSERT INTO lingxios.agent_work_items
|
|
71
|
+
(id, tenant_id, agent_id, session_id, thread_id, kind, lane, trigger_ref, principal_id, priority, available_at, meta)
|
|
72
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,COALESCE($11::timestamptz, NOW()),$12::jsonb)
|
|
73
|
+
ON CONFLICT (id) DO NOTHING
|
|
74
|
+
RETURNING id`, [id, input.tenantId, input.agentId, input.sessionId, input.threadId ?? null, input.kind, input.lane,
|
|
75
|
+
input.triggerRef, input.principalId ?? null, input.priority ?? 0, input.availableAt ?? null,
|
|
76
|
+
input.meta ? JSON.stringify(input.meta) : null]);
|
|
77
|
+
if (rows.length === 0) {
|
|
78
|
+
const existing = await this.pool.query(`SELECT id FROM lingxios.agent_work_items WHERE id=$1 AND tenant_id=$2 AND agent_id=$3
|
|
79
|
+
AND session_id=$4 AND thread_id IS NOT DISTINCT FROM $5 AND kind=$6 AND lane=$7
|
|
80
|
+
AND trigger_ref=$8 AND principal_id IS NOT DISTINCT FROM $9 AND priority=$10
|
|
81
|
+
AND meta IS NOT DISTINCT FROM $11::jsonb`, [id, input.tenantId, input.agentId, input.sessionId, input.threadId ?? null, input.kind, input.lane,
|
|
82
|
+
input.triggerRef, input.principalId ?? null, input.priority ?? 0,
|
|
83
|
+
input.meta ? JSON.stringify(input.meta) : null]);
|
|
84
|
+
if (existing.rows.length !== 1)
|
|
85
|
+
throw new Error('work identity reused with a different request or principal');
|
|
86
|
+
}
|
|
87
|
+
return { id, deduplicated: rows.length === 0 };
|
|
88
|
+
}
|
|
89
|
+
async claim(workerId) {
|
|
90
|
+
return withTransaction(this.pool, async (client) => {
|
|
91
|
+
await client.query(`INSERT INTO lingxios.agent_os_workers (worker_id, last_seen_at, updated_at) VALUES ($1, NOW(), NOW())
|
|
92
|
+
ON CONFLICT (worker_id) DO UPDATE SET last_seen_at = NOW(), updated_at = NOW()`, [workerId]);
|
|
93
|
+
await client.query(`DELETE FROM lingxios.agent_os_session_leases WHERE expires_at <= NOW()`);
|
|
94
|
+
const { rows } = await client.query(`SELECT work.*
|
|
95
|
+
FROM lingxios.agent_work_items work
|
|
96
|
+
LEFT JOIN lingxios.agent_os_session_routes route
|
|
97
|
+
ON route.session_key = ${WORK_SESSION_KEY_SQL}
|
|
98
|
+
LEFT JOIN lingxios.agent_os_workers route_worker ON route_worker.worker_id = route.worker_id
|
|
99
|
+
WHERE (work.status = 'queued' OR (work.status = 'leased' AND work.lease_expires_at <= NOW()))
|
|
100
|
+
AND (work.kind NOT IN ('memory_synthesis','memory_index') OR work.attempts < 3)
|
|
101
|
+
AND work.cancel_requested_at IS NULL
|
|
102
|
+
AND work.available_at <= NOW()
|
|
103
|
+
AND (route.session_key IS NULL OR route.worker_id = $1
|
|
104
|
+
OR route_worker.last_seen_at IS NULL
|
|
105
|
+
OR route_worker.last_seen_at <= NOW() - make_interval(secs => $2::int))
|
|
106
|
+
AND NOT EXISTS (
|
|
107
|
+
SELECT 1 FROM lingxios.agent_os_session_leases lease
|
|
108
|
+
WHERE lease.session_key = ${WORK_SESSION_KEY_SQL}
|
|
109
|
+
AND lease.expires_at > NOW())
|
|
110
|
+
ORDER BY CASE work.lane
|
|
111
|
+
WHEN 'interactive' THEN 4 WHEN 'approval' THEN 3
|
|
112
|
+
WHEN 'collaboration' THEN 2 ELSE 1 END DESC,
|
|
113
|
+
work.priority DESC, work.created_at ASC
|
|
114
|
+
FOR UPDATE OF work SKIP LOCKED
|
|
115
|
+
LIMIT 1`, [workerId, this.workerTimeoutSeconds]);
|
|
116
|
+
const row = rows[0];
|
|
117
|
+
if (!row)
|
|
118
|
+
return null;
|
|
119
|
+
const sessionKey = sessionKeyOf({ tenantId: String(row['tenant_id']), agentId: String(row['agent_id']), sessionId: String(row['session_id']), ...(row['thread_id'] === null ? {} : { threadId: String(row['thread_id']) }) });
|
|
120
|
+
const { rows: routes } = await client.query(`INSERT INTO lingxios.agent_os_session_routes (session_key, worker_id, home_epoch, updated_at)
|
|
121
|
+
VALUES ($1, $2, 1, NOW())
|
|
122
|
+
ON CONFLICT (session_key) DO UPDATE
|
|
123
|
+
SET worker_id = EXCLUDED.worker_id,
|
|
124
|
+
home_epoch = CASE
|
|
125
|
+
WHEN lingxios.agent_os_session_routes.worker_id = EXCLUDED.worker_id THEN lingxios.agent_os_session_routes.home_epoch
|
|
126
|
+
ELSE lingxios.agent_os_session_routes.home_epoch + 1 END,
|
|
127
|
+
updated_at = NOW()
|
|
128
|
+
WHERE lingxios.agent_os_session_routes.worker_id = EXCLUDED.worker_id
|
|
129
|
+
OR NOT EXISTS (
|
|
130
|
+
SELECT 1 FROM lingxios.agent_os_workers owner
|
|
131
|
+
WHERE owner.worker_id = lingxios.agent_os_session_routes.worker_id
|
|
132
|
+
AND owner.last_seen_at > NOW() - make_interval(secs => $3::int))
|
|
133
|
+
RETURNING home_epoch`, [sessionKey, workerId, this.workerTimeoutSeconds]);
|
|
134
|
+
if (!routes[0])
|
|
135
|
+
return null;
|
|
136
|
+
const proposedFence = Number(row['fence']) + 1;
|
|
137
|
+
const { rows: sessionLease } = await client.query(`INSERT INTO lingxios.agent_os_session_leases (session_key, work_id, fence, expires_at)
|
|
138
|
+
VALUES ($1, $2, $3, NOW() + make_interval(secs => $4::int))
|
|
139
|
+
ON CONFLICT (session_key) DO NOTHING RETURNING session_key`, [sessionKey, row['id'], proposedFence, this.leaseTtlSeconds]);
|
|
140
|
+
if (!sessionLease[0])
|
|
141
|
+
return null;
|
|
142
|
+
const token = randomBytes(32).toString('base64url');
|
|
143
|
+
const { rows: claimed } = await client.query(`UPDATE lingxios.agent_work_items
|
|
144
|
+
SET status = 'leased', fence = fence + 1, lease_token_hash = $2, leased_by = $3,
|
|
145
|
+
lease_expires_at = NOW() + make_interval(secs => $4::int),
|
|
146
|
+
attempts = attempts + 1, updated_at = NOW()
|
|
147
|
+
WHERE id = $1
|
|
148
|
+
RETURNING *`, [row['id'], hashToken(token), workerId, this.leaseTtlSeconds]);
|
|
149
|
+
return workItemFromRow(claimed[0], token, Number(routes[0]['home_epoch']));
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
async heartbeat(id, fence, leaseTokenHash) {
|
|
153
|
+
const { rows } = await this.pool.query(`WITH renewed AS (
|
|
154
|
+
UPDATE lingxios.agent_work_items
|
|
155
|
+
SET lease_expires_at = NOW() + make_interval(secs => $4::int), updated_at = NOW()
|
|
156
|
+
WHERE id = $1 AND fence = $2 AND lease_token_hash = $3 AND status = 'leased'
|
|
157
|
+
AND lease_expires_at > NOW()
|
|
158
|
+
RETURNING cancel_requested_at, preempt_requested_at, steer_inputs, leased_by
|
|
159
|
+
), session_renewed AS (
|
|
160
|
+
UPDATE lingxios.agent_os_session_leases
|
|
161
|
+
SET expires_at = NOW() + make_interval(secs => $4::int), updated_at = NOW()
|
|
162
|
+
WHERE work_id = $1 AND fence = $2 AND EXISTS (SELECT 1 FROM renewed)
|
|
163
|
+
), worker_seen AS (
|
|
164
|
+
INSERT INTO lingxios.agent_os_workers (worker_id, last_seen_at, updated_at)
|
|
165
|
+
SELECT leased_by, NOW(), NOW() FROM renewed WHERE leased_by IS NOT NULL
|
|
166
|
+
ON CONFLICT (worker_id) DO UPDATE SET last_seen_at = NOW(), updated_at = NOW()
|
|
167
|
+
)
|
|
168
|
+
SELECT cancel_requested_at, preempt_requested_at, steer_inputs FROM renewed`, [id, fence, leaseTokenHash, this.leaseTtlSeconds]);
|
|
169
|
+
const row = rows[0];
|
|
170
|
+
if (!row)
|
|
171
|
+
return null;
|
|
172
|
+
return {
|
|
173
|
+
cancelRequested: row['cancel_requested_at'] !== null,
|
|
174
|
+
preemptRequested: row['preempt_requested_at'] !== null,
|
|
175
|
+
steer: (row['steer_inputs'] ?? []),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async getLeased(id, fence, leaseTokenHash) {
|
|
179
|
+
const { rows } = await this.pool.query(`SELECT work.*, COALESCE(route.home_epoch, 1) AS home_epoch
|
|
180
|
+
FROM lingxios.agent_work_items work
|
|
181
|
+
LEFT JOIN lingxios.agent_os_session_routes route
|
|
182
|
+
ON route.session_key = ${WORK_SESSION_KEY_SQL}
|
|
183
|
+
WHERE work.id = $1 AND work.fence = $2 AND work.lease_token_hash = $3
|
|
184
|
+
AND work.status = 'leased' AND work.lease_expires_at > NOW()`, [id, fence, leaseTokenHash]);
|
|
185
|
+
const row = rows[0];
|
|
186
|
+
if (!row)
|
|
187
|
+
return null;
|
|
188
|
+
const { leaseToken: _omit, ...work } = workItemFromRow(row, '', Number(row['home_epoch']));
|
|
189
|
+
return { work, status: 'leased', cancelRequested: row['cancel_requested_at'] !== null };
|
|
190
|
+
}
|
|
191
|
+
async yieldWork(id, fence, leaseTokenHash) {
|
|
192
|
+
return withTransaction(this.pool, async (client) => {
|
|
193
|
+
const { rows } = await client.query(`UPDATE lingxios.agent_work_items
|
|
194
|
+
SET status = 'queued', fence = fence + 1, lease_token_hash = NULL, leased_by = NULL,
|
|
195
|
+
lease_expires_at = NULL, preempt_requested_at = NULL, preemptions = preemptions + 1,
|
|
196
|
+
available_at = NOW() + INTERVAL '1 second', updated_at = NOW()
|
|
197
|
+
WHERE id = $1 AND fence = $2 AND lease_token_hash = $3 AND status = 'leased'
|
|
198
|
+
AND preempt_requested_at IS NOT NULL
|
|
199
|
+
AND lease_expires_at > NOW()
|
|
200
|
+
RETURNING id`, [id, fence, leaseTokenHash]);
|
|
201
|
+
if (!rows[0])
|
|
202
|
+
return false;
|
|
203
|
+
await client.query(`DELETE FROM lingxios.agent_os_session_leases WHERE work_id = $1 AND fence = $2`, [id, fence]);
|
|
204
|
+
return true;
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
async complete(id, fence, leaseTokenHash, completion) {
|
|
208
|
+
return withTransaction(this.pool, async (client) => {
|
|
209
|
+
const { rows } = await client.query(`UPDATE lingxios.agent_work_items
|
|
210
|
+
SET status = $4, result_text = $5, error = $6, goal_outcome = $7::jsonb, lease_token_hash = NULL,
|
|
211
|
+
lease_expires_at = NULL, finished_at = NOW(), updated_at = NOW()
|
|
212
|
+
WHERE id = $1 AND fence = $2 AND lease_token_hash = $3 AND status = 'leased'
|
|
213
|
+
AND lease_expires_at > NOW()
|
|
214
|
+
AND ($4 <> 'completed' OR cancel_requested_at IS NULL)
|
|
215
|
+
AND ($4 <> 'completed' OR jsonb_typeof(meta->'text') IS DISTINCT FROM 'string' OR $7::jsonb IS NOT NULL)
|
|
216
|
+
AND ($4 <> 'completed' OR $8::integer IS NULL OR $8::integer = jsonb_array_length(steer_inputs) + 1)
|
|
217
|
+
RETURNING id`, [id, fence, leaseTokenHash, completion.status, completion.resultText ?? null, completion.error ?? null,
|
|
218
|
+
completion.goalOutcome ? JSON.stringify(completion.goalOutcome) : null, completion.goalOutcome?.requestVersion ?? null]);
|
|
219
|
+
if (!rows[0])
|
|
220
|
+
return false;
|
|
221
|
+
await client.query(`DELETE FROM lingxios.agent_os_session_leases WHERE work_id = $1 AND fence = $2`, [id, fence]);
|
|
222
|
+
return true;
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
async requestCancel(id) {
|
|
226
|
+
const { rowCount } = await this.pool.query(`UPDATE lingxios.agent_work_items
|
|
227
|
+
SET cancel_requested_at = NOW(),
|
|
228
|
+
status = CASE WHEN status = 'queued' THEN 'cancelled' ELSE status END,
|
|
229
|
+
updated_at = NOW()
|
|
230
|
+
WHERE id = $1 AND status IN ('queued','leased')`, [id]);
|
|
231
|
+
return (rowCount ?? 0) > 0;
|
|
232
|
+
}
|
|
233
|
+
async requestPreempt(id) {
|
|
234
|
+
const { rowCount } = await this.pool.query(`UPDATE lingxios.agent_work_items SET preempt_requested_at = NOW(), updated_at = NOW()
|
|
235
|
+
WHERE id = $1 AND status = 'leased'`, [id]);
|
|
236
|
+
return (rowCount ?? 0) > 0;
|
|
237
|
+
}
|
|
238
|
+
async addSteer(id, text) {
|
|
239
|
+
const { rowCount } = await this.pool.query(`UPDATE lingxios.agent_work_items
|
|
240
|
+
SET steer_inputs = steer_inputs || jsonb_build_array(jsonb_build_object(
|
|
241
|
+
'id', gen_random_uuid()::text, 'text', $2::text, 'createdAt', NOW())),
|
|
242
|
+
updated_at = NOW()
|
|
243
|
+
WHERE id = $1 AND status = 'leased'`, [id, text]);
|
|
244
|
+
return (rowCount ?? 0) > 0;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
export class PgSessionStore {
|
|
248
|
+
pool;
|
|
249
|
+
constructor(pool) {
|
|
250
|
+
this.pool = pool;
|
|
251
|
+
}
|
|
252
|
+
async get(key) {
|
|
253
|
+
const { rows } = await this.pool.query(`SELECT * FROM lingxios.agent_os_sessions WHERE session_key = $1`, [key]);
|
|
254
|
+
const row = rows[0];
|
|
255
|
+
if (!row)
|
|
256
|
+
return null;
|
|
257
|
+
return {
|
|
258
|
+
key: String(row['session_key']),
|
|
259
|
+
tenantId: String(row['tenant_id']),
|
|
260
|
+
agentId: String(row['agent_id']),
|
|
261
|
+
sessionId: String(row['session_id']),
|
|
262
|
+
...(row['thread_id'] !== null ? { threadId: String(row['thread_id']) } : {}),
|
|
263
|
+
...(row['summary'] ? { summary: String(row['summary']) } : {}),
|
|
264
|
+
...(row['request_snapshot'] ? { request: row['request_snapshot'] } : {}),
|
|
265
|
+
history: row['history'],
|
|
266
|
+
appliedWorkIds: (row['applied_work_ids'] ?? []),
|
|
267
|
+
revision: Number(row['revision']),
|
|
268
|
+
compactionEpoch: Number(row['compaction_epoch'] ?? 0),
|
|
269
|
+
...(row['prompt_context'] ? { promptContext: row['prompt_context'] } : {}),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
async save(session) {
|
|
273
|
+
if (session.revision > 0) {
|
|
274
|
+
const { rows } = await this.pool.query(`UPDATE lingxios.agent_os_sessions
|
|
275
|
+
SET summary=$3, history=$4::jsonb, applied_work_ids=$5::jsonb,
|
|
276
|
+
compaction_epoch=$6, prompt_context=$7::jsonb, request_snapshot=$8::jsonb,
|
|
277
|
+
revision=revision+1, updated_at=NOW()
|
|
278
|
+
WHERE session_key=$1 AND revision=$2 RETURNING revision`, [session.key, session.revision, session.summary ?? null, JSON.stringify(session.history),
|
|
279
|
+
JSON.stringify(session.appliedWorkIds), session.compactionEpoch,
|
|
280
|
+
session.promptContext ? JSON.stringify(session.promptContext) : null,
|
|
281
|
+
session.request ? JSON.stringify(session.request) : null]);
|
|
282
|
+
return rows[0] ? { ok: true, revision: Number(rows[0]['revision']) } : { ok: false, conflict: true };
|
|
283
|
+
}
|
|
284
|
+
const { rows } = await this.pool.query(`INSERT INTO lingxios.agent_os_sessions
|
|
285
|
+
(session_key, tenant_id, agent_id, session_id, thread_id, summary, history,
|
|
286
|
+
applied_work_ids, revision, compaction_epoch, prompt_context, request_snapshot, updated_at)
|
|
287
|
+
SELECT $1,$2,$3,$4,$5,$6,$7::jsonb,$8::jsonb,1,$10,$11::jsonb,$12::jsonb,NOW()
|
|
288
|
+
WHERE $9 = 0
|
|
289
|
+
ON CONFLICT (session_key) DO NOTHING
|
|
290
|
+
RETURNING revision`, [session.key, session.tenantId, session.agentId, session.sessionId, session.threadId ?? null,
|
|
291
|
+
session.summary ?? null, JSON.stringify(session.history), JSON.stringify(session.appliedWorkIds),
|
|
292
|
+
session.revision, session.compactionEpoch,
|
|
293
|
+
session.promptContext ? JSON.stringify(session.promptContext) : null,
|
|
294
|
+
session.request ? JSON.stringify(session.request) : null]);
|
|
295
|
+
if (!rows[0])
|
|
296
|
+
return { ok: false, conflict: true };
|
|
297
|
+
return { ok: true, revision: Number(rows[0]['revision']) };
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
export class PgEventStore {
|
|
301
|
+
pool;
|
|
302
|
+
constructor(pool) {
|
|
303
|
+
this.pool = pool;
|
|
304
|
+
}
|
|
305
|
+
async append(event) {
|
|
306
|
+
const { rows } = await this.pool.query(`INSERT INTO lingxios.agent_run_events (run_id, seq, tenant_id, agent_id, kind, stage, visibility, data, recorded_at)
|
|
307
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8::jsonb,$9)
|
|
308
|
+
ON CONFLICT (run_id, seq) DO NOTHING RETURNING run_id`, [event.runId, event.seq, event.tenantId, event.agentId, event.kind, event.stage,
|
|
309
|
+
event.visibility, JSON.stringify(event.data), event.recordedAt]);
|
|
310
|
+
return rows.length > 0;
|
|
311
|
+
}
|
|
312
|
+
async listRange(runId, fromSeqExclusive, toSeqInclusive, kinds) {
|
|
313
|
+
const { rows } = await this.pool.query(`SELECT * FROM lingxios.agent_run_events
|
|
314
|
+
WHERE run_id = $1 AND seq > $2 AND seq <= $3
|
|
315
|
+
AND ($4::text[] IS NULL OR kind = ANY($4::text[]))
|
|
316
|
+
ORDER BY seq`, [runId, fromSeqExclusive, toSeqInclusive, kinds ? [...kinds] : null]);
|
|
317
|
+
return rows.map((row) => ({
|
|
318
|
+
runId: String(row['run_id']),
|
|
319
|
+
seq: Number(row['seq']),
|
|
320
|
+
tenantId: String(row['tenant_id']),
|
|
321
|
+
agentId: String(row['agent_id']),
|
|
322
|
+
kind: String(row['kind']),
|
|
323
|
+
stage: row['stage'],
|
|
324
|
+
visibility: row['visibility'],
|
|
325
|
+
data: row['data'],
|
|
326
|
+
recordedAt: new Date(row['recorded_at']).toISOString(),
|
|
327
|
+
}));
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
export class PgActionLedger {
|
|
331
|
+
pool;
|
|
332
|
+
constructor(pool) {
|
|
333
|
+
this.pool = pool;
|
|
334
|
+
}
|
|
335
|
+
async hasWait(workId, requestVersion, wait) {
|
|
336
|
+
const { rows } = await this.pool.query(`SELECT i.idempotency_key FROM lingxios.agent_action_intents i
|
|
337
|
+
JOIN lingxios.agent_action_ledger r USING(idempotency_key)
|
|
338
|
+
WHERE i.intent->>'workId'=$1 AND i.intent->'requestVersion'=$2::jsonb
|
|
339
|
+
AND COALESCE(r.result->>'executionState','')<>'unknown'
|
|
340
|
+
AND CASE WHEN $3::text IS NOT NULL THEN r.result->'approval'->>'status'='PENDING' AND r.result->'approval'->>'id'=$3
|
|
341
|
+
ELSE i.intent->'action'->>'action'='task.ask' AND r.result->>'ok'='true'
|
|
342
|
+
AND r.result->'directive'->>'type'='defer' AND r.result->'directive'->>'reason'='user'
|
|
343
|
+
AND r.result->'directive'->'data'->>'question'=$4::text END LIMIT 1`, [workId, JSON.stringify(requestVersion), 'approvalId' in wait ? wait.approvalId : null, 'question' in wait ? wait.question : null]);
|
|
344
|
+
return rows.length === 1;
|
|
345
|
+
}
|
|
346
|
+
async unsettled(workId) {
|
|
347
|
+
const { rows } = await this.pool.query(`SELECT i.idempotency_key,i.intent->'action'->>'action' AS action,
|
|
348
|
+
CASE WHEN r.result->'approval'->>'status'='PENDING' THEN 'awaiting_approval' ELSE 'unknown' END AS state
|
|
349
|
+
FROM lingxios.agent_action_intents i LEFT JOIN lingxios.agent_action_ledger r USING(idempotency_key)
|
|
350
|
+
WHERE i.intent->>'workId'=$1 AND i.intent->'action'->>'action' NOT LIKE 'task.%'
|
|
351
|
+
AND (r.idempotency_key IS NULL OR r.result->>'executionState'='unknown' OR r.result->'approval'->>'status'='PENDING')
|
|
352
|
+
ORDER BY i.idempotency_key LIMIT 65`, [workId]);
|
|
353
|
+
return rows.map(row => ({ actionKey: String(row['idempotency_key']), action: String(row['action']), state: row['state'] }));
|
|
354
|
+
}
|
|
355
|
+
async reserve(idempotencyKey, fingerprint, intent) {
|
|
356
|
+
if (!intent || intent.action?.idempotencyKey !== idempotencyKey)
|
|
357
|
+
throw new Error('action intent is required and must match its key');
|
|
358
|
+
const { rows } = await this.pool.query(`INSERT INTO lingxios.agent_action_intents (idempotency_key, fingerprint, intent)
|
|
359
|
+
VALUES ($1, $2, $3::jsonb)
|
|
360
|
+
ON CONFLICT (idempotency_key) DO NOTHING RETURNING idempotency_key`, [idempotencyKey, fingerprint, JSON.stringify(intent)]);
|
|
361
|
+
if (rows.length > 0)
|
|
362
|
+
return 'started';
|
|
363
|
+
const existing = await this.pool.query(`SELECT fingerprint FROM lingxios.agent_action_intents WHERE idempotency_key = $1`, [idempotencyKey]);
|
|
364
|
+
if (existing.rows[0]?.['fingerprint'] !== fingerprint) {
|
|
365
|
+
throw new Error('action identity mismatch; reconcile before replay');
|
|
366
|
+
}
|
|
367
|
+
return 'existing';
|
|
368
|
+
}
|
|
369
|
+
async findIntent(idempotencyKey) {
|
|
370
|
+
const { rows } = await this.pool.query('SELECT intent FROM lingxios.agent_action_intents WHERE idempotency_key=$1', [idempotencyKey]);
|
|
371
|
+
return rows[0]?.['intent'] ?? null;
|
|
372
|
+
}
|
|
373
|
+
async find(idempotencyKey) {
|
|
374
|
+
const { rows } = await this.pool.query(`SELECT result FROM lingxios.agent_action_ledger WHERE idempotency_key = $1`, [idempotencyKey]);
|
|
375
|
+
return rows[0] ? rows[0]['result'] : null;
|
|
376
|
+
}
|
|
377
|
+
async record(idempotencyKey, result) {
|
|
378
|
+
const { rows } = await this.pool.query(`INSERT INTO lingxios.agent_action_ledger (idempotency_key, result) VALUES ($1, $2::jsonb)
|
|
379
|
+
ON CONFLICT (idempotency_key) DO NOTHING RETURNING result`, [idempotencyKey, JSON.stringify(result)]);
|
|
380
|
+
if (rows[0])
|
|
381
|
+
return result;
|
|
382
|
+
const existing = await this.find(idempotencyKey);
|
|
383
|
+
return existing ?? result;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=pg-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg-store.js","sourceRoot":"","sources":["../../../src/control-plane/pg-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Logger } from '../logging.js';
|
|
2
|
+
import type { MetricsRegistry } from '../metrics.js';
|
|
3
|
+
import type { AssistantMessage, HeartbeatResult, HostAction, HostActionResult, RunEvent, SessionRecord, TurnContext, WorkCompletion, WorkItem } from '../protocol/types.js';
|
|
4
|
+
import type { ActionExecutor, ActionLedgerStore, CapabilityResolver, ContextProvider, DeliveryPort, EventStore, SessionStore, WorkStore } from './stores.js';
|
|
5
|
+
export interface ControlPlaneDeps {
|
|
6
|
+
work: WorkStore;
|
|
7
|
+
sessions: SessionStore;
|
|
8
|
+
events: EventStore;
|
|
9
|
+
actions: ActionLedgerStore;
|
|
10
|
+
contextProvider: ContextProvider;
|
|
11
|
+
actionExecutor: ActionExecutor;
|
|
12
|
+
capabilityResolver: CapabilityResolver;
|
|
13
|
+
delivery: DeliveryPort;
|
|
14
|
+
logger?: Logger;
|
|
15
|
+
metrics?: MetricsRegistry;
|
|
16
|
+
}
|
|
17
|
+
export declare class ControlPlaneError extends Error {
|
|
18
|
+
readonly status: number;
|
|
19
|
+
constructor(status: number, message: string);
|
|
20
|
+
}
|
|
21
|
+
export interface LeaseProof {
|
|
22
|
+
id: string;
|
|
23
|
+
fence: number;
|
|
24
|
+
leaseToken: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function actionFingerprint(work: Pick<WorkItem, 'tenantId' | 'principalId' | 'agentId' | 'sessionId'>, action: Pick<HostAction, 'action' | 'args'>): string;
|
|
27
|
+
export declare class ControlPlaneService {
|
|
28
|
+
private readonly deps;
|
|
29
|
+
private readonly logger;
|
|
30
|
+
constructor(deps: ControlPlaneDeps);
|
|
31
|
+
enqueue(input: Parameters<WorkStore['enqueue']>[0]): Promise<{
|
|
32
|
+
id: string;
|
|
33
|
+
deduplicated: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
claim(workerId: string): Promise<WorkItem | null>;
|
|
36
|
+
private requireLease;
|
|
37
|
+
heartbeat(proof: LeaseProof): Promise<HeartbeatResult>;
|
|
38
|
+
yieldWork(proof: LeaseProof): Promise<void>;
|
|
39
|
+
complete(proof: LeaseProof, completion: WorkCompletion): Promise<void>;
|
|
40
|
+
requestCancel(id: string): Promise<boolean>;
|
|
41
|
+
private validateWait;
|
|
42
|
+
requestPreempt(id: string): Promise<boolean>;
|
|
43
|
+
addSteer(id: string, text: string): Promise<boolean>;
|
|
44
|
+
loadContext(proof: LeaseProof): Promise<TurnContext>;
|
|
45
|
+
executeAction(proof: LeaseProof, action: HostAction): Promise<HostActionResult>;
|
|
46
|
+
recordEvent(proof: LeaseProof, event: RunEvent): Promise<void>;
|
|
47
|
+
commitMessage(proof: LeaseProof, message: AssistantMessage): Promise<void>;
|
|
48
|
+
getSession(proof: LeaseProof, key: string): Promise<SessionRecord | null>;
|
|
49
|
+
saveSession(proof: LeaseProof, session: SessionRecord): Promise<{
|
|
50
|
+
revision: number;
|
|
51
|
+
}>;
|
|
52
|
+
}
|