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 @@
1
+ {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../../src/integrations/lingxiloop/canvas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { HostAction, WorkItem } from '../../protocol/types.js';
2
+ import type { LingxiLoopServices } from './service-contracts.js';
3
+ export declare const CHAT_METHODS: {
4
+ readonly history: readonly ["limit"];
5
+ readonly send: readonly ["body", "replyToClientMsgNo"];
6
+ readonly ask: readonly ["title", "items", "submitLabel"];
7
+ };
8
+ export declare function executeChat(work: Omit<WorkItem, 'leaseToken'>, action: HostAction, services: LingxiLoopServices, channelType: number): Promise<import("./service-contracts.js").NativeMessage[] | {
9
+ messageId: string;
10
+ messageSeq: number;
11
+ }>;
@@ -0,0 +1,46 @@
1
+ import { questionnaire } from './questionnaire.js';
2
+ export const CHAT_METHODS = { history: ['limit'], send: ['body', 'replyToClientMsgNo'], ask: ['title', 'items', 'submitLabel'] };
3
+ export async function executeChat(work, action, services, channelType) {
4
+ const method = action.action.slice('chat.'.length);
5
+ if (!work.principalId || !action.action.startsWith('chat.') || !Object.hasOwn(CHAT_METHODS, method))
6
+ throw new Error('unsupported chat action or missing principal');
7
+ const allowed = CHAT_METHODS[method];
8
+ if (Object.keys(action.args).some(key => !allowed.includes(key)))
9
+ throw new Error('unknown chat argument');
10
+ await services.permissionService.assertCan({ actorUserId: work.principalId, companyId: work.tenantId,
11
+ action: method === 'history' ? 'conversation:read' : 'conversation:write', resource: { type: 'conversation', id: work.sessionId },
12
+ });
13
+ if (method === 'history') {
14
+ if (!services.advanceAgentReadReceipt)
15
+ throw new Error('native read receipt resource is required');
16
+ const limit = action.args['limit'] ?? 50;
17
+ if (typeof limit !== 'number' || !Number.isInteger(limit) || limit < 1 || limit > 100)
18
+ throw new Error('history limit must be an integer from 1 to 100');
19
+ const messages = await services.wukongClient().syncMessages(work.sessionId, channelType, limit, work.agentId);
20
+ if (messages.some(message => message.channelId !== work.sessionId || message.channelType !== channelType || !Number.isSafeInteger(message.messageSeq) || message.messageSeq < 0))
21
+ throw new Error('invalid native history scope or sequence');
22
+ const readThroughSeq = messages.reduce((max, message) => Math.max(max, message.messageSeq), 0);
23
+ if (readThroughSeq > 0)
24
+ await services.advanceAgentReadReceipt({ companyId: work.tenantId, channelId: work.sessionId, agentId: work.agentId, readThroughSeq });
25
+ return messages;
26
+ }
27
+ if (method === 'ask') {
28
+ const form = questionnaire(action.args);
29
+ return services.wukongClient().sendMessage(work.sessionId, channelType, work.agentId, {
30
+ version: 1, kind: 'questionnaire', clientMsgNo: `questionnaire-${action.idempotencyKey}`, body: form.title,
31
+ refs: { runId: work.id, agentId: work.agentId }, data: { questionnaire: form },
32
+ ...(work.threadId ? { replyToClientMsgNo: work.threadId } : {}),
33
+ });
34
+ }
35
+ const body = action.args['body'];
36
+ const reply = action.args['replyToClientMsgNo'] ?? work.threadId;
37
+ if (typeof body !== 'string' || !body.trim())
38
+ throw new Error('message body is required');
39
+ if (reply !== undefined && (typeof reply !== 'string' || !reply.trim()))
40
+ throw new Error('invalid reply reference');
41
+ return services.wukongClient().sendMessage(work.sessionId, channelType, work.agentId, {
42
+ version: 1, kind: 'text', clientMsgNo: `action-${action.idempotencyKey}`, body,
43
+ ...(reply ? { replyToClientMsgNo: reply } : {}), refs: { runId: work.id, agentId: work.agentId },
44
+ });
45
+ }
46
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/integrations/lingxiloop/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type SqlPool } from '../../control-plane/pg-store.js';
2
+ import type { HostAction, WorkItem } from '../../protocol/types.js';
3
+ import type { LingxiLoopServices } from './service-contracts.js';
4
+ type Services = Pick<LingxiLoopServices, 'documents' | 'permissionService'>;
5
+ export declare function requestDocumentApproval(database: SqlPool, services: Services, work: Omit<WorkItem, 'leaseToken'>, action: HostAction): Promise<import("../../protocol/types.js").HostActionResult>;
6
+ export declare function approveDocument(database: SqlPool, services: Services, input: {
7
+ companyId: string;
8
+ userId: string;
9
+ approvalId: string;
10
+ }): Promise<{
11
+ status: "continuation_unavailable";
12
+ workId: string;
13
+ result: unknown;
14
+ } | {
15
+ status: "already_resumed";
16
+ workId: string;
17
+ } | {
18
+ status: "resumed";
19
+ workId: string;
20
+ }>;
21
+ export {};
@@ -0,0 +1,75 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { withTransaction } from '../../control-plane/pg-store.js';
3
+ import { documentApplication, documentScope, queueDocumentEvents } from './document-content.js';
4
+ import { inspectApproval, persistApproval, resumeApproved } from './approvals.js';
5
+ async function prepareDeletion(db, services, work, action, approverId) {
6
+ if (!services.documents?.writes?.content || action.action !== 'documents.delete'
7
+ || Object.keys(action.args).some(key => !['documentId', 'expectedRevision'].includes(key)))
8
+ throw new Error('document.delete requires native content bindings, documentId and expectedRevision');
9
+ const { scope, documentId, current } = await documentScope(db, services, work, action, approverId);
10
+ const preview = { projectId: scope.projectId, documentId, title: current['title'], createdBy: current['created_by'], revision: current['revision'] };
11
+ return { preview, apply: async () => {
12
+ const { application, events } = documentApplication(db, services, work);
13
+ const result = await application.deleteForAgent(scope, documentId);
14
+ const remaining = await db.query('SELECT id FROM documents WHERE company_id=$1 AND project_id=$2 AND id=$3', [scope.companyId, scope.projectId, documentId]);
15
+ if (!result.ok || remaining.rows.length || !events.some(event => event.type === 'doc.changed' && event.kind === 'document.deleted' && event.documentId === documentId))
16
+ throw new Error('document deletion postcondition was not observed');
17
+ await queueDocumentEvents(db, action, events);
18
+ return { documentId, deleted: true, notification: 'queued' };
19
+ } };
20
+ }
21
+ export async function requestDocumentApproval(database, services, work, action) {
22
+ return withTransaction(database, async (db) => {
23
+ await db.query("SET LOCAL lock_timeout='5s'");
24
+ await db.query("SET LOCAL statement_timeout='15s'");
25
+ const { preview } = await prepareDeletion(db, services, work, action);
26
+ return persistApproval(db, work, action, { summary: 'Delete the reviewed document', scope: { projectId: preview.projectId, conversationId: work.sessionId }, preview });
27
+ });
28
+ }
29
+ export async function approveDocument(database, services, input) {
30
+ const reviewed = await inspectApproval(database, services, input);
31
+ if (reviewed.action.action !== 'documents.delete')
32
+ throw new Error('unsupported document approval');
33
+ if (reviewed.status === 'EXECUTED')
34
+ return resumeApproved(database, input, reviewed);
35
+ if (reviewed.status !== 'PENDING')
36
+ throw new Error('document approval is no longer pending');
37
+ await withTransaction(database, async (db) => {
38
+ await db.query("SET LOCAL lock_timeout='5s'");
39
+ await db.query("SET LOCAL statement_timeout='15s'");
40
+ const pending = await db.query(`SELECT intent.intent FROM approvals approval
41
+ JOIN lingxios.agent_work_items work ON work.id=approval.work_id AND work.tenant_id=approval.company_id
42
+ JOIN lingxios.agent_action_intents intent ON intent.idempotency_key=approval.idempotency_key
43
+ JOIN lingxios.agent_os_sessions session ON session.tenant_id=work.tenant_id AND session.agent_id=work.agent_id
44
+ AND session.session_id=work.session_id AND session.thread_id IS NOT DISTINCT FROM work.thread_id
45
+ WHERE approval.id=$1 AND approval.company_id=$2 AND approval.status='PENDING' AND approval.expires_at>NOW()
46
+ AND approval.idempotency_key=$3 AND approval.args=$4::jsonb AND approval.preview=$5::jsonb
47
+ AND approval.action='documents.delete' AND work.status='completed' AND work.cancel_requested_at IS NULL
48
+ AND work.goal_outcome->>'status'='awaiting_approval' AND work.goal_outcome->>'approvalId'=$1
49
+ AND (work.goal_outcome->>'requestVersion')::integer=$6 AND jsonb_array_length(work.steer_inputs)+1=$6
50
+ AND session.request_snapshot->>'workId'=work.id AND session.request_snapshot->'revisions'=work.steer_inputs
51
+ FOR UPDATE OF approval,work,session`, [input.approvalId, input.companyId, reviewed.action.idempotencyKey,
52
+ JSON.stringify(reviewed.action.args), JSON.stringify(reviewed.preview), reviewed.requestVersion]);
53
+ const intent = pending.rows[0]?.['intent'];
54
+ if (!intent)
55
+ throw new Error('document approval expired or changed before execution');
56
+ const api = services.documents?.writes;
57
+ if (!api)
58
+ throw new Error('native document write bindings are required');
59
+ await api.createPermissionService(db, { lockDependencies: true }).assertCan({ actorUserId: input.userId, companyId: input.companyId,
60
+ action: 'agent_approval:resolve', resource: { type: 'approval', id: input.approvalId } });
61
+ const work = { id: intent.workId, tenantId: intent.tenantId, agentId: intent.agentId, sessionId: intent.sessionId,
62
+ ...(intent.principalId ? { principalId: intent.principalId } : {}) };
63
+ const prepared = await prepareDeletion(db, services, work, reviewed.action, input.userId);
64
+ if (!isDeepStrictEqual(prepared.preview, reviewed.preview))
65
+ throw new Error('document approval preview is stale');
66
+ const value = await prepared.apply();
67
+ await db.query("UPDATE approvals SET status='EXECUTED',resolved_at=NOW(),resolved_by=$2,executed_at=NOW(),result=$3::jsonb,error=NULL WHERE id=$1", [input.approvalId, input.userId, JSON.stringify(value)]);
68
+ const receipt = await db.query(`UPDATE lingxios.agent_action_ledger SET result=$2::jsonb
69
+ WHERE idempotency_key=$1 AND result->'approval'->>'id'=$3 RETURNING idempotency_key`, [reviewed.action.idempotencyKey, JSON.stringify({ ok: true, value }), input.approvalId]);
70
+ if (receipt.rows.length !== 1)
71
+ throw new Error('document approval receipt is missing');
72
+ });
73
+ return resumeApproved(database, input, reviewed);
74
+ }
75
+ //# sourceMappingURL=document-approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-approvals.js","sourceRoot":"","sources":["../../../../src/integrations/lingxiloop/document-approvals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { type SqlPool, type SqlQueryable } from '../../control-plane/pg-store.js';
2
+ import type { HostAction, WorkItem } from '../../protocol/types.js';
3
+ import type { LingxiLoopServices, NativeDocumentChanged, NativeDocumentEdit, NativeDocumentUpdate } from './service-contracts.js';
4
+ type Services = Pick<LingxiLoopServices, 'documents'>;
5
+ export type DocumentWork = Pick<WorkItem, 'id' | 'tenantId' | 'principalId' | 'agentId' | 'sessionId'>;
6
+ export declare function documentOperations(value: unknown): NativeDocumentEdit[];
7
+ /** Locks both the original human's authority and the native agent attribution for the mutation. */
8
+ export declare function documentScope(db: SqlQueryable, services: Services, work: DocumentWork, action: HostAction, approverId?: string): Promise<{
9
+ scope: {
10
+ companyId: string;
11
+ projectId: string;
12
+ userId: string;
13
+ };
14
+ documentId: string;
15
+ current: Record<string, unknown> | undefined;
16
+ }>;
17
+ /** A fresh native room uses this transaction only; no process-global collaboration cache is mutated. */
18
+ export declare function documentApplication(db: SqlQueryable, services: Services, work: DocumentWork): {
19
+ application: {
20
+ createForAgent(scope: {
21
+ companyId: string;
22
+ projectId: string;
23
+ userId: string;
24
+ }, input: {
25
+ id?: string;
26
+ title: string;
27
+ body: string;
28
+ }): Promise<{
29
+ document: import("./service-contracts.js").NativeDocument;
30
+ replayed: boolean;
31
+ }>;
32
+ readForAgent(scope: {
33
+ companyId: string;
34
+ projectId: string;
35
+ userId: string;
36
+ }, documentId: string): Promise<import("./service-contracts.js").NativeDocument & {
37
+ body: string;
38
+ }>;
39
+ editForAgent(scope: {
40
+ companyId: string;
41
+ projectId: string;
42
+ userId: string;
43
+ }, documentId: string, operations: NativeDocumentEdit[]): Promise<import("./service-contracts.js").NativeDocumentEditResult>;
44
+ deleteForAgent(scope: {
45
+ companyId: string;
46
+ projectId: string;
47
+ userId: string;
48
+ }, documentId: string): Promise<{
49
+ ok: true;
50
+ }>;
51
+ };
52
+ events: (NativeDocumentChanged | NativeDocumentUpdate)[];
53
+ };
54
+ export declare function queueDocumentEvents(db: SqlQueryable, action: HostAction, events: Array<NativeDocumentChanged | NativeDocumentUpdate>): Promise<void>;
55
+ export declare function flushDocumentEvents(db: SqlQueryable, services: Services): Promise<void>;
56
+ export declare function executeDocumentContent(database: SqlPool, services: Services, work: Omit<WorkItem, 'leaseToken'>, action: HostAction): Promise<{
57
+ body: string;
58
+ bodyTruncated: boolean;
59
+ revision: unknown;
60
+ id: string;
61
+ title: string;
62
+ createdBy: string;
63
+ conversationId: string | null;
64
+ createdAt: string;
65
+ updatedAt: string;
66
+ documentId?: never;
67
+ result?: never;
68
+ notification?: never;
69
+ } | {
70
+ documentId: string;
71
+ result: import("./service-contracts.js").NativeDocumentEditResult | {
72
+ document: import("./service-contracts.js").NativeDocument;
73
+ replayed: boolean;
74
+ } | (import("./service-contracts.js").NativeDocument & {
75
+ body: string;
76
+ });
77
+ revision: unknown;
78
+ notification: "queued";
79
+ }>;
80
+ export {};
@@ -0,0 +1,195 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { withTransaction } from '../../control-plane/pg-store.js';
3
+ import { flushEventOutbox } from './event-outbox.js';
4
+ function fields(value, allowed) {
5
+ if (!value || typeof value !== 'object' || Array.isArray(value) || Object.keys(value).some(key => !allowed.includes(key)))
6
+ throw new Error('unknown document argument');
7
+ }
8
+ function text(value, name, max = 64_000, empty = false) {
9
+ if (typeof value !== 'string' || (!empty && !value.trim()) || value.length > max)
10
+ throw new Error(`invalid document ${name}`);
11
+ }
12
+ export function documentOperations(value) {
13
+ if (!Array.isArray(value) || !value.length || value.length > 32 || JSON.stringify(value).length > 64_000)
14
+ throw new Error('operations must contain 1-32 edits within 64000 characters');
15
+ for (const op of value) {
16
+ fields(op, ['kind', 'text', 'find', 'replace', 'at', 'anchorText', 'src', 'alt', 'placement', 'match']);
17
+ switch (op['kind']) {
18
+ case 'append':
19
+ fields(op, ['kind', 'text']);
20
+ text(op['text'], 'text');
21
+ break;
22
+ case 'replace':
23
+ fields(op, ['kind', 'find', 'replace']);
24
+ text(op['find'], 'find');
25
+ text(op['replace'], 'replacement', 64_000, true);
26
+ break;
27
+ case 'insertParagraph':
28
+ fields(op, ['kind', 'at', 'text']);
29
+ text(op['text'], 'text');
30
+ if (!['start', 'end'].includes(String(op['at'])))
31
+ throw new Error('paragraph position must be start or end');
32
+ break;
33
+ case 'replaceBlock':
34
+ fields(op, ['kind', 'anchorText', 'text']);
35
+ text(op['anchorText'], 'anchor');
36
+ text(op['text'], 'text', 64_000, true);
37
+ break;
38
+ case 'image': {
39
+ fields(op, ['kind', 'src', 'alt', 'placement']);
40
+ text(op['src'], 'image URL', 8000);
41
+ const url = new URL(op['src']);
42
+ if (url.protocol !== 'https:' || url.username || url.password)
43
+ throw new Error('image source must be an HTTPS URL without credentials');
44
+ if (op['alt'] !== null)
45
+ text(op['alt'], 'image alt', 2000, true);
46
+ const placement = op['placement'];
47
+ fields(placement, ['mode', 'anchorText']);
48
+ if (['start', 'end'].includes(String(placement['mode'])))
49
+ fields(placement, ['mode']);
50
+ else if (['replace', 'after', 'before'].includes(String(placement['mode'])))
51
+ text(placement['anchorText'], 'image anchor');
52
+ else
53
+ throw new Error('invalid image placement');
54
+ break;
55
+ }
56
+ case 'imageDelete': {
57
+ fields(op, ['kind', 'match']);
58
+ const match = op['match'];
59
+ fields(match, ['by', 'src', 'substring', 'alt']);
60
+ const key = match['by'] === 'src' ? 'src' : match['by'] === 'src-contains' ? 'substring' : match['by'] === 'alt' ? 'alt' : undefined;
61
+ if (!key)
62
+ throw new Error('invalid image deletion match');
63
+ fields(match, ['by', key]);
64
+ text(match[key], 'image match', 8000);
65
+ break;
66
+ }
67
+ default: throw new Error('unsupported document edit kind');
68
+ }
69
+ }
70
+ return value;
71
+ }
72
+ /** Locks both the original human's authority and the native agent attribution for the mutation. */
73
+ export async function documentScope(db, services, work, action, approverId) {
74
+ const api = services.documents?.writes;
75
+ if (!api || !work.principalId)
76
+ throw new Error('document write bindings and original human principal are required');
77
+ const agent = await db.query(`SELECT p.id FROM participants p JOIN im_channel_bindings b ON b.company_id=p.company_id AND b.channel_id=$3
78
+ WHERE p.company_id=$1 AND p.id=$2 AND p.kind='agent' AND p.departed_at IS NULL
79
+ AND p.capabilities @> '["documents"]'::jsonb AND b.profile->'members' ? p.id
80
+ AND NOT EXISTS(SELECT 1 FROM learning_project_teacher_agents teacher WHERE teacher.company_id=p.company_id AND teacher.agent_id=p.id)
81
+ FOR SHARE OF p,b`, [work.tenantId, work.agentId, work.sessionId]);
82
+ if (agent.rows.length !== 1)
83
+ throw new Error('document agent capability or membership was revoked');
84
+ const permissions = api.createPermissionService(db, { lockDependencies: true });
85
+ const humans = new Set([work.principalId, ...(approverId ? [approverId] : [])]);
86
+ for (const actorUserId of humans)
87
+ await permissions.assertCan({ actorUserId, companyId: work.tenantId,
88
+ action: 'conversation:read', resource: { type: 'conversation', id: work.sessionId } });
89
+ const room = await db.query('SELECT project_id FROM conversations WHERE company_id=$1 AND id=$2 FOR SHARE', [work.tenantId, work.sessionId]);
90
+ const projectId = room.rows[0]?.['project_id'];
91
+ text(projectId, 'project scope', 2000);
92
+ const create = action.action === 'documents.create';
93
+ const documentId = create ? 'doc_' + createHash('sha256').update(action.idempotencyKey).digest('hex') : action.args['documentId'];
94
+ text(documentId, 'id', 2000);
95
+ let current;
96
+ if (!create) {
97
+ if (action.action !== 'documents.read')
98
+ text(action.args['expectedRevision'], 'expectedRevision', 200);
99
+ const result = await db.query('SELECT title,created_by,conversation_id,updated_at::text AS revision FROM documents WHERE company_id=$1 AND project_id=$2 AND id=$3 FOR UPDATE', [work.tenantId, projectId, documentId]);
100
+ current = result.rows[0];
101
+ if (!current || (action.action !== 'documents.read' && current['revision'] !== action.args['expectedRevision']))
102
+ throw new Error('document changed or is outside this project; read it again');
103
+ if (typeof current['conversation_id'] === 'string')
104
+ await db.query('SELECT id FROM conversations WHERE company_id=$1 AND project_id=$2 AND id=$3 FOR SHARE', [work.tenantId, projectId, current['conversation_id']]);
105
+ }
106
+ for (const actorUserId of humans)
107
+ await permissions.assertCan({ actorUserId, companyId: work.tenantId, projectId,
108
+ action: action.action === 'documents.delete' ? 'document:delete' : action.action === 'documents.read' ? 'document:read' : 'document:write',
109
+ resource: { type: create ? 'project' : 'document', id: create ? projectId : documentId } });
110
+ if (action.action === 'documents.delete' && current?.['created_by'] !== work.agentId)
111
+ throw new Error('only the creating agent can delete this document');
112
+ return { scope: { companyId: work.tenantId, projectId, userId: work.agentId }, documentId, current };
113
+ }
114
+ /** A fresh native room uses this transaction only; no process-global collaboration cache is mutated. */
115
+ export function documentApplication(db, services, work) {
116
+ const api = services.documents?.writes?.content;
117
+ if (!api)
118
+ throw new Error('native document content bindings are required');
119
+ const events = [];
120
+ const collaboration = api.createDocumentCollaborationApplication({
121
+ transaction: callback => callback(db), instanceId: `lingxios:${work.id}`,
122
+ bus: { publish: async (event) => { if (event.type === 'doc.update')
123
+ events.push(event); }, subscribe: async () => { throw new Error('transactional document editor cannot subscribe'); } },
124
+ imageStorage: { normalizeKey: value => api.normalizeStorageKey(value ?? ''), keyFromPublicUrl: value => api.storageKeyFromPublicUrl(value ?? ''),
125
+ signedUrlExpiresSoon: api.signedUrlExpiresSoon, publicUrl: key => api.storage.publicUrl(key) },
126
+ });
127
+ const application = new api.DocumentsApplication(db, { publish: async (event) => { events.push(event); } }, { readText: collaboration.readDocumentText, applyEdit: collaboration.applyAgentEdit });
128
+ return { application, events };
129
+ }
130
+ export async function queueDocumentEvents(db, action, events) {
131
+ if (events.length > 100)
132
+ throw new Error('document mutation emitted too many events');
133
+ for (const event of events)
134
+ await db.query('INSERT INTO lingxios.agent_document_outbox(id,event) VALUES($1,$2::jsonb) ON CONFLICT DO NOTHING', [`${action.idempotencyKey}:${createHash('sha256').update(JSON.stringify(event)).digest('hex')}`, JSON.stringify(event)]);
135
+ }
136
+ export async function flushDocumentEvents(db, services) {
137
+ const api = services.documents?.writes;
138
+ if (api)
139
+ await flushEventOutbox(db, 'agent_document_outbox', async (raw) => {
140
+ const event = raw;
141
+ if (event.type === 'doc.update') {
142
+ if (!api.content)
143
+ throw new Error('document collaboration publisher is unavailable');
144
+ await api.content.publish(api.content.CH_DOC_UPDATE, event);
145
+ }
146
+ else
147
+ await api.publish(api.CH_DOCS, event);
148
+ });
149
+ }
150
+ export async function executeDocumentContent(database, services, work, action) {
151
+ const create = action.action === 'documents.create';
152
+ const read = action.action === 'documents.read';
153
+ if (!create && !read && action.action !== 'documents.edit')
154
+ throw new Error('unsupported document content action');
155
+ fields(action.args, create ? ['title', 'body'] : read ? ['documentId'] : ['documentId', 'expectedRevision', 'operations']);
156
+ if (create) {
157
+ text(action.args['title'], 'title', 200);
158
+ text(action.args['body'], 'body', 64_000, true);
159
+ }
160
+ const operations = create || read ? undefined : documentOperations(action.args['operations']);
161
+ return withTransaction(database, async (db) => {
162
+ await db.query("SET LOCAL lock_timeout='5s'");
163
+ await db.query("SET LOCAL statement_timeout='15s'");
164
+ if (!read) {
165
+ const live = await db.query(`SELECT work.id FROM lingxios.agent_work_items work
166
+ JOIN lingxios.agent_action_intents intent ON intent.idempotency_key=$3
167
+ WHERE work.id=$1 AND work.fence=$2 AND work.status='leased' AND work.lease_expires_at>NOW()
168
+ AND work.cancel_requested_at IS NULL AND work.tenant_id=$4 AND work.principal_id=$5
169
+ AND intent.intent->>'workId'=work.id AND intent.intent->'action'->'args'=$6::jsonb
170
+ AND intent.intent->'action'->>'action'=$7
171
+ AND (intent.intent->>'requestVersion')::integer=jsonb_array_length(work.steer_inputs)+1 FOR UPDATE OF work`, [work.id, work.fence, action.idempotencyKey, work.tenantId, work.principalId, JSON.stringify(action.args), action.action]);
172
+ if (live.rows.length !== 1)
173
+ throw new Error('document mutation requires the current live action intent');
174
+ }
175
+ const { scope, documentId } = await documentScope(db, services, work, action);
176
+ const { application, events } = documentApplication(db, services, work);
177
+ const result = create ? await application.createForAgent(scope, { id: documentId, title: action.args['title'], body: action.args['body'] })
178
+ : read ? await application.readForAgent(scope, documentId) : await application.editForAgent(scope, documentId, operations);
179
+ if (create && (!('document' in result) || result.document.id !== documentId || result.document.createdBy !== work.agentId || result.replayed))
180
+ throw new Error('unexpected document creation result');
181
+ const current = await db.query('SELECT updated_at::text AS revision FROM documents WHERE id=$1 AND company_id=$2 AND project_id=$3', [documentId, work.tenantId, scope.projectId]);
182
+ if (current.rows.length !== 1)
183
+ throw new Error('document mutation postcondition is unavailable');
184
+ await queueDocumentEvents(db, action, events);
185
+ const value = read && 'body' in result ? { ...result, body: result.body.slice(0, 64_000), bodyTruncated: result.body.length > 64_000, revision: current.rows[0]['revision'] }
186
+ : { documentId, result, revision: current.rows[0]['revision'], notification: 'queued' };
187
+ if (!read) {
188
+ const receipt = await db.query('INSERT INTO lingxios.agent_action_ledger(idempotency_key,result) VALUES($1,$2::jsonb) ON CONFLICT DO NOTHING RETURNING idempotency_key', [action.idempotencyKey, JSON.stringify({ ok: true, value })]);
189
+ if (receipt.rows.length !== 1)
190
+ throw new Error('document mutation receipt already exists');
191
+ }
192
+ return value;
193
+ });
194
+ }
195
+ //# sourceMappingURL=document-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-content.js","sourceRoot":"","sources":["../../../../src/integrations/lingxiloop/document-content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type SqlPool } from '../../control-plane/pg-store.js';
2
+ import type { HostAction, WorkItem } from '../../protocol/types.js';
3
+ import type { LingxiLoopServices } from './service-contracts.js';
4
+ export declare function renameDocument(database: SqlPool, services: Pick<LingxiLoopServices, 'documents'>, work: Omit<WorkItem, 'leaseToken'>, action: HostAction): Promise<{
5
+ documentId: string;
6
+ title: string;
7
+ notification: "published" | "unconfirmed";
8
+ }>;
@@ -0,0 +1,49 @@
1
+ import { withTransaction } from '../../control-plane/pg-store.js';
2
+ export async function renameDocument(database, services, work, action) {
3
+ const api = services.documents?.writes;
4
+ if (!api || !work.principalId || action.action !== 'documents.rename')
5
+ throw new Error('document write bindings and original human principal are required');
6
+ if (Object.keys(action.args).some(key => !['documentId', 'title', 'expectedTitle'].includes(key)))
7
+ throw new Error('unknown document rename argument');
8
+ const { documentId, expectedTitle } = action.args;
9
+ if (typeof documentId !== 'string' || !documentId.trim() || documentId.length > 2000)
10
+ throw new Error('documentId is required');
11
+ if (typeof expectedTitle !== 'string' || expectedTitle.length > 2000)
12
+ throw new Error('expectedTitle is required');
13
+ const { title } = api.renameDocumentRequestSchema.parse({ title: action.args['title'] });
14
+ const projectId = await withTransaction(database, async (client) => {
15
+ await client.query("SET LOCAL statement_timeout='10s'");
16
+ const permissions = api.createPermissionService(client, { lockDependencies: true });
17
+ await permissions.assertCan({ actorUserId: work.principalId, companyId: work.tenantId,
18
+ action: 'conversation:read', resource: { type: 'conversation', id: work.sessionId } });
19
+ const room = await client.query('SELECT project_id FROM conversations WHERE id=$1 AND company_id=$2 FOR SHARE', [work.sessionId, work.tenantId]);
20
+ const projectId = room.rows[0]?.['project_id'];
21
+ if (typeof projectId !== 'string' || !projectId)
22
+ throw new Error('document project scope is unavailable');
23
+ const current = await client.query('SELECT title,conversation_id FROM documents WHERE id=$1 AND company_id=$2 AND project_id=$3 FOR UPDATE', [documentId, work.tenantId, projectId]);
24
+ if (current.rows.length !== 1)
25
+ throw new Error('document is outside this project');
26
+ // Native document authorization locks the document, but not its joined conversation membership.
27
+ const conversationId = current.rows[0]['conversation_id'];
28
+ if (typeof conversationId === 'string') {
29
+ await client.query('SELECT id FROM conversations WHERE id=$1 AND company_id=$2 AND project_id=$3 FOR SHARE', [conversationId, work.tenantId, projectId]);
30
+ }
31
+ await permissions.assertCan({ actorUserId: work.principalId, companyId: work.tenantId, projectId,
32
+ action: 'document:write', resource: { type: 'document', id: documentId } });
33
+ if (current.rows[0]['title'] !== expectedTitle)
34
+ throw new Error('document title changed; read it again before renaming');
35
+ if (!await api.renameDocument(client, work.tenantId, projectId, documentId, title))
36
+ throw new Error('document rename did not update a row');
37
+ return projectId;
38
+ });
39
+ let notification = 'published';
40
+ try {
41
+ await api.publish(api.CH_DOCS, { type: 'doc.changed', kind: 'document.updated', companyId: work.tenantId,
42
+ workspaceId: projectId, documentId, actorId: work.agentId });
43
+ }
44
+ catch {
45
+ notification = 'unconfirmed';
46
+ }
47
+ return { documentId, title, notification };
48
+ }
49
+ //# sourceMappingURL=document-writes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-writes.js","sourceRoot":"","sources":["../../../../src/integrations/lingxiloop/document-writes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,iCAAiC,CAAA;AAI/E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB,EAAE,QAA+C,EACrG,IAAkC,EAAE,MAAkB;IACtD,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IACtC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,kBAAkB;QAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IAC3J,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACtJ,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,IAAI,CAAA;IACjD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC/H,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAClH,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,2BAA2B,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACxF,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;QAC/D,MAAM,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QACvD,MAAM,WAAW,GAAG,GAAG,CAAC,uBAAuB,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;QACnF,MAAM,WAAW,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAY,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;YACpF,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;QACxF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,8EAA8E,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;QAChJ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAA;QAC9C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QACzG,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,wGAAwG,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;QACpL,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;QAClF,gGAAgG;QAChG,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,iBAAiB,CAAC,CAAA;QAC1D,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,MAAM,CAAC,KAAK,CAAC,wFAAwF,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;QAC1J,CAAC;QACD,MAAM,WAAW,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAY,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS;YAC/F,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;QAC7E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,KAAK,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;QACzH,IAAI,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QAC3I,OAAO,SAAS,CAAA;IAClB,CAAC,CAAC,CAAA;IACF,IAAI,YAAY,GAAgC,WAAW,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;YACtG,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QAAC,YAAY,GAAG,aAAa,CAAA;IAAC,CAAC;IACxC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { SqlQueryable } from '../../control-plane/pg-store.js';
2
+ import type { HostAction, WorkItem } from '../../protocol/types.js';
3
+ import type { LingxiLoopServices } from './service-contracts.js';
4
+ export declare const DOCUMENT_METHODS: {
5
+ readonly list: readonly [];
6
+ readonly read: readonly ["documentId"];
7
+ };
8
+ export declare function executeDocument(db: SqlQueryable, services: Pick<LingxiLoopServices, 'documents' | 'permissionService'>, work: Omit<WorkItem, 'leaseToken'>, action: HostAction): Promise<{
9
+ documents: import("./service-contracts.js").NativeDocument[];
10
+ truncated: boolean;
11
+ } | {
12
+ body: string;
13
+ bodyTruncated: boolean;
14
+ id: string;
15
+ title: string;
16
+ createdBy: string;
17
+ conversationId: string | null;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ documents?: never;
21
+ truncated?: never;
22
+ }>;