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.
Files changed (298) hide show
  1. package/README.md +54 -0
  2. package/db/schema.sql +306 -0
  3. package/dist/src/app/artifacts.d.ts +8 -0
  4. package/dist/src/app/artifacts.js +114 -0
  5. package/dist/src/app/artifacts.js.map +1 -0
  6. package/dist/src/app/doctor.d.ts +22 -0
  7. package/dist/src/app/doctor.js +44 -0
  8. package/dist/src/app/doctor.js.map +1 -0
  9. package/dist/src/app/index.d.ts +123 -0
  10. package/dist/src/app/index.js +291 -0
  11. package/dist/src/app/index.js.map +1 -0
  12. package/dist/src/app/input.d.ts +22 -0
  13. package/dist/src/app/input.js +60 -0
  14. package/dist/src/app/input.js.map +1 -0
  15. package/dist/src/app/recover-wait.d.ts +5 -0
  16. package/dist/src/app/recover-wait.js +59 -0
  17. package/dist/src/app/recover-wait.js.map +1 -0
  18. package/dist/src/app/resources.d.ts +5 -0
  19. package/dist/src/app/resources.js +9 -0
  20. package/dist/src/app/resources.js.map +1 -0
  21. package/dist/src/app/storage.d.ts +2 -0
  22. package/dist/src/app/storage.js +41 -0
  23. package/dist/src/app/storage.js.map +1 -0
  24. package/dist/src/cli/doctor.d.ts +2 -0
  25. package/dist/src/cli/doctor.js +20 -0
  26. package/dist/src/cli/doctor.js.map +1 -0
  27. package/dist/src/cli/eval.d.ts +2 -0
  28. package/dist/src/cli/eval.js +44 -0
  29. package/dist/src/cli/eval.js.map +1 -0
  30. package/dist/src/config.d.ts +22 -0
  31. package/dist/src/config.js +56 -0
  32. package/dist/src/config.js.map +1 -0
  33. package/dist/src/context/attachments.d.ts +10 -0
  34. package/dist/src/context/attachments.js +18 -0
  35. package/dist/src/context/attachments.js.map +1 -0
  36. package/dist/src/context/document-text.d.ts +1 -0
  37. package/dist/src/context/document-text.js +29 -0
  38. package/dist/src/context/document-text.js.map +1 -0
  39. package/dist/src/context/document-worker.d.ts +1 -0
  40. package/dist/src/context/document-worker.js +62 -0
  41. package/dist/src/context/document-worker.js.map +1 -0
  42. package/dist/src/context/evidence.d.ts +19 -0
  43. package/dist/src/context/evidence.js +37 -0
  44. package/dist/src/context/evidence.js.map +1 -0
  45. package/dist/src/context/request.d.ts +21 -0
  46. package/dist/src/context/request.js +32 -0
  47. package/dist/src/context/request.js.map +1 -0
  48. package/dist/src/context/research-evidence.d.ts +4 -0
  49. package/dist/src/context/research-evidence.js +24 -0
  50. package/dist/src/context/research-evidence.js.map +1 -0
  51. package/dist/src/context/resource-checks.d.ts +7 -0
  52. package/dist/src/context/resource-checks.js +15 -0
  53. package/dist/src/context/resource-checks.js.map +1 -0
  54. package/dist/src/context/task-contract.d.ts +11 -0
  55. package/dist/src/context/task-contract.js +23 -0
  56. package/dist/src/context/task-contract.js.map +1 -0
  57. package/dist/src/context/text.d.ts +2 -0
  58. package/dist/src/context/text.js +7 -0
  59. package/dist/src/context/text.js.map +1 -0
  60. package/dist/src/control-plane/http-server.d.ts +22 -0
  61. package/dist/src/control-plane/http-server.js +196 -0
  62. package/dist/src/control-plane/http-server.js.map +1 -0
  63. package/dist/src/control-plane/memory-store.d.ts +71 -0
  64. package/dist/src/control-plane/memory-store.js +389 -0
  65. package/dist/src/control-plane/memory-store.js.map +1 -0
  66. package/dist/src/control-plane/pg-store.d.ts +62 -0
  67. package/dist/src/control-plane/pg-store.js +386 -0
  68. package/dist/src/control-plane/pg-store.js.map +1 -0
  69. package/dist/src/control-plane/service.d.ts +52 -0
  70. package/dist/src/control-plane/service.js +630 -0
  71. package/dist/src/control-plane/service.js.map +1 -0
  72. package/dist/src/control-plane/stores.d.ts +184 -0
  73. package/dist/src/control-plane/stores.js +19 -0
  74. package/dist/src/control-plane/stores.js.map +1 -0
  75. package/dist/src/errors.d.ts +66 -0
  76. package/dist/src/errors.js +102 -0
  77. package/dist/src/errors.js.map +1 -0
  78. package/dist/src/eval/calibration.d.ts +16 -0
  79. package/dist/src/eval/calibration.js +28 -0
  80. package/dist/src/eval/calibration.js.map +1 -0
  81. package/dist/src/eval/index.d.ts +40 -0
  82. package/dist/src/eval/index.js +40 -0
  83. package/dist/src/eval/index.js.map +1 -0
  84. package/dist/src/eval/review.d.ts +20 -0
  85. package/dist/src/eval/review.js +49 -0
  86. package/dist/src/eval/review.js.map +1 -0
  87. package/dist/src/host/http-client.d.ts +48 -0
  88. package/dist/src/host/http-client.js +127 -0
  89. package/dist/src/host/http-client.js.map +1 -0
  90. package/dist/src/host/port.d.ts +26 -0
  91. package/dist/src/host/port.js +2 -0
  92. package/dist/src/host/port.js.map +1 -0
  93. package/dist/src/index.d.ts +17 -0
  94. package/dist/src/index.js +9 -0
  95. package/dist/src/index.js.map +1 -0
  96. package/dist/src/integrations/lingxiloop/actions.d.ts +25 -0
  97. package/dist/src/integrations/lingxiloop/actions.js +77 -0
  98. package/dist/src/integrations/lingxiloop/actions.js.map +1 -0
  99. package/dist/src/integrations/lingxiloop/app.d.ts +167 -0
  100. package/dist/src/integrations/lingxiloop/app.js +434 -0
  101. package/dist/src/integrations/lingxiloop/app.js.map +1 -0
  102. package/dist/src/integrations/lingxiloop/approvals.d.ts +148 -0
  103. package/dist/src/integrations/lingxiloop/approvals.js +540 -0
  104. package/dist/src/integrations/lingxiloop/approvals.js.map +1 -0
  105. package/dist/src/integrations/lingxiloop/attachments.d.ts +8 -0
  106. package/dist/src/integrations/lingxiloop/attachments.js +38 -0
  107. package/dist/src/integrations/lingxiloop/attachments.js.map +1 -0
  108. package/dist/src/integrations/lingxiloop/calendar-approvals.d.ts +21 -0
  109. package/dist/src/integrations/lingxiloop/calendar-approvals.js +126 -0
  110. package/dist/src/integrations/lingxiloop/calendar-approvals.js.map +1 -0
  111. package/dist/src/integrations/lingxiloop/calendar-writes.d.ts +15 -0
  112. package/dist/src/integrations/lingxiloop/calendar-writes.js +79 -0
  113. package/dist/src/integrations/lingxiloop/calendar-writes.js.map +1 -0
  114. package/dist/src/integrations/lingxiloop/calendar.d.ts +19 -0
  115. package/dist/src/integrations/lingxiloop/calendar.js +43 -0
  116. package/dist/src/integrations/lingxiloop/calendar.js.map +1 -0
  117. package/dist/src/integrations/lingxiloop/canvas-events.d.ts +7 -0
  118. package/dist/src/integrations/lingxiloop/canvas-events.js +53 -0
  119. package/dist/src/integrations/lingxiloop/canvas-events.js.map +1 -0
  120. package/dist/src/integrations/lingxiloop/canvas-summary.d.ts +5 -0
  121. package/dist/src/integrations/lingxiloop/canvas-summary.js +52 -0
  122. package/dist/src/integrations/lingxiloop/canvas-summary.js.map +1 -0
  123. package/dist/src/integrations/lingxiloop/canvas-work-report.d.ts +12 -0
  124. package/dist/src/integrations/lingxiloop/canvas-work-report.js +120 -0
  125. package/dist/src/integrations/lingxiloop/canvas-work-report.js.map +1 -0
  126. package/dist/src/integrations/lingxiloop/canvas-work.d.ts +11 -0
  127. package/dist/src/integrations/lingxiloop/canvas-work.js +306 -0
  128. package/dist/src/integrations/lingxiloop/canvas-work.js.map +1 -0
  129. package/dist/src/integrations/lingxiloop/canvas.d.ts +12 -0
  130. package/dist/src/integrations/lingxiloop/canvas.js +79 -0
  131. package/dist/src/integrations/lingxiloop/canvas.js.map +1 -0
  132. package/dist/src/integrations/lingxiloop/chat.d.ts +11 -0
  133. package/dist/src/integrations/lingxiloop/chat.js +46 -0
  134. package/dist/src/integrations/lingxiloop/chat.js.map +1 -0
  135. package/dist/src/integrations/lingxiloop/document-approvals.d.ts +21 -0
  136. package/dist/src/integrations/lingxiloop/document-approvals.js +75 -0
  137. package/dist/src/integrations/lingxiloop/document-approvals.js.map +1 -0
  138. package/dist/src/integrations/lingxiloop/document-content.d.ts +80 -0
  139. package/dist/src/integrations/lingxiloop/document-content.js +195 -0
  140. package/dist/src/integrations/lingxiloop/document-content.js.map +1 -0
  141. package/dist/src/integrations/lingxiloop/document-writes.d.ts +8 -0
  142. package/dist/src/integrations/lingxiloop/document-writes.js +49 -0
  143. package/dist/src/integrations/lingxiloop/document-writes.js.map +1 -0
  144. package/dist/src/integrations/lingxiloop/documents.d.ts +22 -0
  145. package/dist/src/integrations/lingxiloop/documents.js +38 -0
  146. package/dist/src/integrations/lingxiloop/documents.js.map +1 -0
  147. package/dist/src/integrations/lingxiloop/event-outbox.d.ts +5 -0
  148. package/dist/src/integrations/lingxiloop/event-outbox.js +47 -0
  149. package/dist/src/integrations/lingxiloop/event-outbox.js.map +1 -0
  150. package/dist/src/integrations/lingxiloop/index.d.ts +3 -0
  151. package/dist/src/integrations/lingxiloop/index.js +3 -0
  152. package/dist/src/integrations/lingxiloop/index.js.map +1 -0
  153. package/dist/src/integrations/lingxiloop/learning-attempts.d.ts +13 -0
  154. package/dist/src/integrations/lingxiloop/learning-attempts.js +58 -0
  155. package/dist/src/integrations/lingxiloop/learning-attempts.js.map +1 -0
  156. package/dist/src/integrations/lingxiloop/learning-evaluation.d.ts +8 -0
  157. package/dist/src/integrations/lingxiloop/learning-evaluation.js +64 -0
  158. package/dist/src/integrations/lingxiloop/learning-evaluation.js.map +1 -0
  159. package/dist/src/integrations/lingxiloop/learning-evidence.d.ts +7 -0
  160. package/dist/src/integrations/lingxiloop/learning-evidence.js +88 -0
  161. package/dist/src/integrations/lingxiloop/learning-evidence.js.map +1 -0
  162. package/dist/src/integrations/lingxiloop/learning-missions.d.ts +18 -0
  163. package/dist/src/integrations/lingxiloop/learning-missions.js +95 -0
  164. package/dist/src/integrations/lingxiloop/learning-missions.js.map +1 -0
  165. package/dist/src/integrations/lingxiloop/learning.d.ts +22 -0
  166. package/dist/src/integrations/lingxiloop/learning.js +150 -0
  167. package/dist/src/integrations/lingxiloop/learning.js.map +1 -0
  168. package/dist/src/integrations/lingxiloop/memory.d.ts +14 -0
  169. package/dist/src/integrations/lingxiloop/memory.js +133 -0
  170. package/dist/src/integrations/lingxiloop/memory.js.map +1 -0
  171. package/dist/src/integrations/lingxiloop/polls.d.ts +9 -0
  172. package/dist/src/integrations/lingxiloop/polls.js +47 -0
  173. package/dist/src/integrations/lingxiloop/polls.js.map +1 -0
  174. package/dist/src/integrations/lingxiloop/presentations.d.ts +11 -0
  175. package/dist/src/integrations/lingxiloop/presentations.js +34 -0
  176. package/dist/src/integrations/lingxiloop/presentations.js.map +1 -0
  177. package/dist/src/integrations/lingxiloop/questionnaire.d.ts +21 -0
  178. package/dist/src/integrations/lingxiloop/questionnaire.js +57 -0
  179. package/dist/src/integrations/lingxiloop/questionnaire.js.map +1 -0
  180. package/dist/src/integrations/lingxiloop/research.d.ts +19 -0
  181. package/dist/src/integrations/lingxiloop/research.js +20 -0
  182. package/dist/src/integrations/lingxiloop/research.js.map +1 -0
  183. package/dist/src/integrations/lingxiloop/routines.d.ts +91 -0
  184. package/dist/src/integrations/lingxiloop/routines.js +198 -0
  185. package/dist/src/integrations/lingxiloop/routines.js.map +1 -0
  186. package/dist/src/integrations/lingxiloop/service-contracts.d.ts +1045 -0
  187. package/dist/src/integrations/lingxiloop/service-contracts.js +2 -0
  188. package/dist/src/integrations/lingxiloop/service-contracts.js.map +1 -0
  189. package/dist/src/integrations/lingxiloop/teacher-context.d.ts +32 -0
  190. package/dist/src/integrations/lingxiloop/teacher-context.js +25 -0
  191. package/dist/src/integrations/lingxiloop/teacher-context.js.map +1 -0
  192. package/dist/src/integrations/lingxiloop/teacher-digest.d.ts +13 -0
  193. package/dist/src/integrations/lingxiloop/teacher-digest.js +152 -0
  194. package/dist/src/integrations/lingxiloop/teacher-digest.js.map +1 -0
  195. package/dist/src/integrations/lingxiloop/teacher-preview.d.ts +22 -0
  196. package/dist/src/integrations/lingxiloop/teacher-preview.js +41 -0
  197. package/dist/src/integrations/lingxiloop/teacher-preview.js.map +1 -0
  198. package/dist/src/integrations/lingxiloop/teacher.d.ts +24 -0
  199. package/dist/src/integrations/lingxiloop/teacher.js +224 -0
  200. package/dist/src/integrations/lingxiloop/teacher.js.map +1 -0
  201. package/dist/src/kernel/manager.d.ts +52 -0
  202. package/dist/src/kernel/manager.js +407 -0
  203. package/dist/src/kernel/manager.js.map +1 -0
  204. package/dist/src/logging.d.ts +21 -0
  205. package/dist/src/logging.js +54 -0
  206. package/dist/src/logging.js.map +1 -0
  207. package/dist/src/memory/evidence.d.ts +6 -0
  208. package/dist/src/memory/evidence.js +43 -0
  209. package/dist/src/memory/evidence.js.map +1 -0
  210. package/dist/src/memory/processor.d.ts +3 -0
  211. package/dist/src/memory/processor.js +66 -0
  212. package/dist/src/memory/processor.js.map +1 -0
  213. package/dist/src/memory/semantic.d.ts +19 -0
  214. package/dist/src/memory/semantic.js +93 -0
  215. package/dist/src/memory/semantic.js.map +1 -0
  216. package/dist/src/memory/store.d.ts +20 -0
  217. package/dist/src/memory/store.js +34 -0
  218. package/dist/src/memory/store.js.map +1 -0
  219. package/dist/src/memory/synthesis.d.ts +24 -0
  220. package/dist/src/memory/synthesis.js +138 -0
  221. package/dist/src/memory/synthesis.js.map +1 -0
  222. package/dist/src/metrics.d.ts +43 -0
  223. package/dist/src/metrics.js +130 -0
  224. package/dist/src/metrics.js.map +1 -0
  225. package/dist/src/model/driver.d.ts +60 -0
  226. package/dist/src/model/driver.js +2 -0
  227. package/dist/src/model/driver.js.map +1 -0
  228. package/dist/src/model/embeddings.d.ts +24 -0
  229. package/dist/src/model/embeddings.js +97 -0
  230. package/dist/src/model/embeddings.js.map +1 -0
  231. package/dist/src/model/openai.d.ts +45 -0
  232. package/dist/src/model/openai.js +340 -0
  233. package/dist/src/model/openai.js.map +1 -0
  234. package/dist/src/outcome/assessment.d.ts +16 -0
  235. package/dist/src/outcome/assessment.js +45 -0
  236. package/dist/src/outcome/assessment.js.map +1 -0
  237. package/dist/src/outcome/content-check.d.ts +19 -0
  238. package/dist/src/outcome/content-check.js +44 -0
  239. package/dist/src/outcome/content-check.js.map +1 -0
  240. package/dist/src/outcome/envelope.d.ts +34 -0
  241. package/dist/src/outcome/envelope.js +42 -0
  242. package/dist/src/outcome/envelope.js.map +1 -0
  243. package/dist/src/protocol/constants.d.ts +25 -0
  244. package/dist/src/protocol/constants.js +26 -0
  245. package/dist/src/protocol/constants.js.map +1 -0
  246. package/dist/src/protocol/kernel-wire.d.ts +74 -0
  247. package/dist/src/protocol/kernel-wire.js +2 -0
  248. package/dist/src/protocol/kernel-wire.js.map +1 -0
  249. package/dist/src/protocol/outcome.d.ts +16 -0
  250. package/dist/src/protocol/outcome.js +14 -0
  251. package/dist/src/protocol/outcome.js.map +1 -0
  252. package/dist/src/protocol/types.d.ts +266 -0
  253. package/dist/src/protocol/types.js +19 -0
  254. package/dist/src/protocol/types.js.map +1 -0
  255. package/dist/src/research/address.d.ts +2 -0
  256. package/dist/src/research/address.js +32 -0
  257. package/dist/src/research/address.js.map +1 -0
  258. package/dist/src/research/fetch.d.ts +7 -0
  259. package/dist/src/research/fetch.js +83 -0
  260. package/dist/src/research/fetch.js.map +1 -0
  261. package/dist/src/research/index.d.ts +26 -0
  262. package/dist/src/research/index.js +109 -0
  263. package/dist/src/research/index.js.map +1 -0
  264. package/dist/src/runtime/compaction.d.ts +41 -0
  265. package/dist/src/runtime/compaction.js +86 -0
  266. package/dist/src/runtime/compaction.js.map +1 -0
  267. package/dist/src/runtime/corrections.d.ts +20 -0
  268. package/dist/src/runtime/corrections.js +27 -0
  269. package/dist/src/runtime/corrections.js.map +1 -0
  270. package/dist/src/runtime/policy.d.ts +42 -0
  271. package/dist/src/runtime/policy.js +91 -0
  272. package/dist/src/runtime/policy.js.map +1 -0
  273. package/dist/src/runtime/resource-refresh.d.ts +8 -0
  274. package/dist/src/runtime/resource-refresh.js +37 -0
  275. package/dist/src/runtime/resource-refresh.js.map +1 -0
  276. package/dist/src/runtime/runtime.d.ts +51 -0
  277. package/dist/src/runtime/runtime.js +804 -0
  278. package/dist/src/runtime/runtime.js.map +1 -0
  279. package/dist/src/runtime/tool.d.ts +13 -0
  280. package/dist/src/runtime/tool.js +42 -0
  281. package/dist/src/runtime/tool.js.map +1 -0
  282. package/dist/src/ui/index.d.ts +27 -0
  283. package/dist/src/ui/index.js +54 -0
  284. package/dist/src/ui/index.js.map +1 -0
  285. package/dist/src/versions.d.ts +9 -0
  286. package/dist/src/versions.js +11 -0
  287. package/dist/src/versions.js.map +1 -0
  288. package/dist/src/worker/index.d.ts +3 -0
  289. package/dist/src/worker/index.js +57 -0
  290. package/dist/src/worker/index.js.map +1 -0
  291. package/dist/src/worker/main.d.ts +2 -0
  292. package/dist/src/worker/main.js +9 -0
  293. package/dist/src/worker/main.js.map +1 -0
  294. package/dist/src/worker/worker.d.ts +45 -0
  295. package/dist/src/worker/worker.js +154 -0
  296. package/dist/src/worker/worker.js.map +1 -0
  297. package/kernel/runner.py +507 -0
  298. 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
+ }