@north-light/cli 0.3.531 → 0.3.533

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 (198) hide show
  1. package/dist/api/client.d.ts +6 -3
  2. package/dist/api/client.js +1 -1
  3. package/dist/api/contract.d.ts +1 -1
  4. package/dist/api/contract.js +1 -1
  5. package/dist/api/dto/canvas.d.ts +2 -0
  6. package/dist/api/dto/crons.d.ts +2 -0
  7. package/dist/builtin-memory/crouter-sdk/release-notes.md +8 -0
  8. package/dist/builtin-memory/northlight-apps/providers/README.md +2 -0
  9. package/dist/builtin-memory/northlight-apps/providers/sms.md +2 -0
  10. package/dist/clients/attach/chrome/inbox-strip.d.ts +6 -1
  11. package/dist/clients/attach/chrome/inbox-strip.js +1 -1
  12. package/dist/clients/attach/chrome/roster.js +1 -1
  13. package/dist/clients/attach/session/chrome-refresh.d.ts +12 -3
  14. package/dist/clients/attach/session/chrome-refresh.js +1 -1
  15. package/dist/clients/attach/session/document-links.js +1 -1
  16. package/dist/clients/attach/viewer.js +586 -587
  17. package/dist/commands/api-client.js +3 -3
  18. package/dist/commands/node/inspect.js +6 -6
  19. package/dist/commands/sys/context/expose.js +2 -2
  20. package/dist/commands/sys/db.d.ts +1 -0
  21. package/dist/commands/sys/db.js +1 -0
  22. package/dist/commands/sys.js +1 -1
  23. package/dist/core/bash-guard.js +9 -3
  24. package/dist/core/canvas/canvas.d.ts +12 -2
  25. package/dist/core/canvas/canvas.js +23 -20
  26. package/dist/core/canvas/daemon-actions.d.ts +0 -3
  27. package/dist/core/canvas/daemon-actions.js +7 -24
  28. package/dist/core/canvas/daemon-owner.d.ts +3 -0
  29. package/dist/core/canvas/daemon-owner.js +1 -6
  30. package/dist/core/canvas/db.d.ts +28 -20
  31. package/dist/core/canvas/db.js +4 -3
  32. package/dist/core/canvas/deliveries.d.ts +5 -0
  33. package/dist/core/canvas/deliveries.js +25 -30
  34. package/dist/core/canvas/export-sqlite.d.ts +14 -0
  35. package/dist/core/canvas/export-sqlite.js +3 -0
  36. package/dist/core/canvas/import-sqlite.d.ts +44 -0
  37. package/dist/core/canvas/import-sqlite.js +7 -0
  38. package/dist/core/canvas/node-tokens.js +3 -3
  39. package/dist/core/canvas/outcome-actions.js +4 -4
  40. package/dist/core/canvas/recovery.js +1 -1
  41. package/dist/core/canvas/schema-pg.sql +1022 -0
  42. package/dist/core/canvas/schema-version.d.ts +4 -0
  43. package/dist/core/canvas/schema-version.js +1 -0
  44. package/dist/core/canvas/sessions.js +3 -3
  45. package/dist/core/canvas/structured-requests.js +2 -2
  46. package/dist/core/canvas/tree.js +6 -6
  47. package/dist/core/canvas/waits.js +1 -1
  48. package/dist/core/feed/inbox.js +1 -1
  49. package/dist/core/feed/messages.js +5 -5
  50. package/dist/core/feed/reports.js +2 -2
  51. package/dist/core/grants/mirror.js +2 -2
  52. package/dist/core/graph/access.js +7 -7
  53. package/dist/core/graph/custom.js +10 -10
  54. package/dist/core/graph/deletion.js +6 -6
  55. package/dist/core/graph/documents.d.ts +1 -1
  56. package/dist/core/graph/documents.js +9 -9
  57. package/dist/core/graph/edges.d.ts +3 -3
  58. package/dist/core/graph/edges.js +3 -1
  59. package/dist/core/graph/events.js +7 -7
  60. package/dist/core/graph/exposures.d.ts +8 -8
  61. package/dist/core/graph/jobs.d.ts +1 -1
  62. package/dist/core/graph/jobs.js +2 -2
  63. package/dist/core/graph/kinds/custom.js +1 -1
  64. package/dist/core/graph/kinds/document.js +4 -4
  65. package/dist/core/graph/kinds/dto.js +1 -1
  66. package/dist/core/graph/kinds/job.js +2 -2
  67. package/dist/core/graph/kinds/kind.d.ts +2 -2
  68. package/dist/core/graph/kinds/kind.js +1 -1
  69. package/dist/core/graph/kinds/live-read.d.ts +5 -0
  70. package/dist/core/graph/kinds/live-read.js +1 -0
  71. package/dist/core/graph/kinds/node.js +5 -5
  72. package/dist/core/graph/kinds/owner.js +2 -2
  73. package/dist/core/graph/names.js +3 -3
  74. package/dist/core/graph/objects.d.ts +5 -5
  75. package/dist/core/graph/objects.js +10 -10
  76. package/dist/core/graph/package-docs.js +6 -5
  77. package/dist/core/graph/reader.d.ts +1 -1
  78. package/dist/core/graph/reader.js +2 -2
  79. package/dist/core/graph/receivers.js +4 -5
  80. package/dist/core/graph/repo-sync/exchange.js +2 -2
  81. package/dist/core/graph/repo-sync/repos.js +3 -3
  82. package/dist/core/graph/repo-sync/sync.js +1 -1
  83. package/dist/core/graph/rules.d.ts +3 -4
  84. package/dist/core/graph/rules.js +3 -3
  85. package/dist/core/graph/spaces/app.js +1 -1
  86. package/dist/core/graph/spaces/index.d.ts +1 -1
  87. package/dist/core/graph/spaces/index.js +1 -1
  88. package/dist/core/graph/spaces/own-memory.js +1 -1
  89. package/dist/core/graph/spaces/person.js +3 -3
  90. package/dist/core/graph/spaces/repo.d.ts +1 -1
  91. package/dist/core/graph/spaces/repo.js +1 -1
  92. package/dist/core/graph/types.d.ts +4 -3
  93. package/dist/core/graph/watches.d.ts +2 -2
  94. package/dist/core/graph/watches.js +17 -17
  95. package/dist/core/human/page-schema.js +5 -4
  96. package/dist/core/human/requests.d.ts +1 -1
  97. package/dist/core/human/requests.js +20 -23
  98. package/dist/core/llm/run.js +2 -2
  99. package/dist/core/peer/home.d.ts +6 -0
  100. package/dist/core/peer/home.js +2 -2
  101. package/dist/core/peer/ingest.js +1 -1
  102. package/dist/core/peer/receiver.js +1 -1
  103. package/dist/core/peer/stubs.js +1 -1
  104. package/dist/core/providers/receipts.js +3 -2
  105. package/dist/core/review/comments.js +5 -4
  106. package/dist/core/runs/activity.js +4 -5
  107. package/dist/core/runs/confinement.d.ts +1 -1
  108. package/dist/core/runs/confinement.js +2 -2
  109. package/dist/core/runs/events.d.ts +1 -1
  110. package/dist/core/runs/events.js +5 -5
  111. package/dist/core/runs/operations.js +6 -4
  112. package/dist/core/runtime/close.d.ts +3 -0
  113. package/dist/core/runtime/close.js +1 -1
  114. package/dist/core/runtime/host.d.ts +5 -1
  115. package/dist/core/runtime/host.js +3 -3
  116. package/dist/core/runtime/launch.js +2 -2
  117. package/dist/core/runtime/ledger.js +3 -3
  118. package/dist/core/runtime/lifecycle.d.ts +9 -0
  119. package/dist/core/runtime/lifecycle.js +2 -2
  120. package/dist/core/runtime/nodes.d.ts +1 -1
  121. package/dist/core/runtime/nodes.js +1 -1
  122. package/dist/core/runtime/roadmap.js +1 -1
  123. package/dist/core/spaces/stop.d.ts +1 -0
  124. package/dist/core/spaces/stop.js +2 -2
  125. package/dist/core/statements.d.ts +17 -0
  126. package/dist/core/statements.js +2 -0
  127. package/dist/core/substrate/delivery/corpus.js +3 -3
  128. package/dist/core/substrate/delivery/deliver.js +5 -5
  129. package/dist/core/substrate/delivery/listings.js +1 -1
  130. package/dist/core/substrate/delivery/match.d.ts +2 -2
  131. package/dist/core/substrate/delivery/match.js +1 -1
  132. package/dist/core/substrate/delivery/plan.js +3 -3
  133. package/dist/core/substrate/delivery/render-boot.js +5 -5
  134. package/dist/core/substrate/delivery/render-event.js +6 -6
  135. package/dist/core/usage/ledger.js +8 -8
  136. package/dist/daemon/api/bridge.js +4 -4
  137. package/dist/daemon/api/document-listener.js +1 -1
  138. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  139. package/dist/daemon/api/handlers/canvas.js +1 -1
  140. package/dist/daemon/api/handlers/crons.js +1 -1
  141. package/dist/daemon/api/handlers/custom-objects.js +3 -3
  142. package/dist/daemon/api/handlers/docs.js +1 -1
  143. package/dist/daemon/api/handlers/inbox.js +1 -1
  144. package/dist/daemon/api/handlers/memory.js +7 -7
  145. package/dist/daemon/api/handlers/messages.js +1 -1
  146. package/dist/daemon/api/handlers/nodes.js +1 -1
  147. package/dist/daemon/api/handlers/objects.js +3 -3
  148. package/dist/daemon/api/handlers/reviews.js +1 -1
  149. package/dist/daemon/api/handlers/structured-requests.js +1 -1
  150. package/dist/daemon/api/reader.js +1 -1
  151. package/dist/daemon/broker-signals/bus.d.ts +14 -6
  152. package/dist/daemon/broker-signals/bus.js +1 -10
  153. package/dist/daemon/crtrd-cli.js +1 -1
  154. package/dist/daemon/crtrd.js +12 -11
  155. package/dist/daemon/due.js +1 -1
  156. package/dist/daemon/export-sqlite-run.d.ts +1 -0
  157. package/dist/daemon/export-sqlite-run.js +4 -0
  158. package/dist/daemon/fleet.d.ts +1 -0
  159. package/dist/daemon/fleet.js +3 -3
  160. package/dist/daemon/human/settle.js +1 -1
  161. package/dist/daemon/manage.d.ts +10 -0
  162. package/dist/daemon/manage.js +3 -2
  163. package/dist/daemon/peer/forward.d.ts +7 -0
  164. package/dist/daemon/peer/forward.js +1 -1
  165. package/dist/daemon/postgres/binary.d.ts +17 -0
  166. package/dist/daemon/postgres/binary.js +2 -0
  167. package/dist/daemon/postgres/cluster.d.ts +37 -0
  168. package/dist/daemon/postgres/cluster.js +6 -0
  169. package/dist/daemon/postgres/index.d.ts +2 -0
  170. package/dist/daemon/postgres/index.js +1 -0
  171. package/dist/daemon/postgres/pins.d.ts +7 -0
  172. package/dist/daemon/postgres/pins.js +1 -0
  173. package/dist/daemon/postgres/supervisor.d.ts +95 -0
  174. package/dist/daemon/postgres/supervisor.js +2 -0
  175. package/dist/daemon/reconcilers/bash-deadline.js +2 -2
  176. package/dist/daemon/reconcilers/delivery-lane.js +2 -2
  177. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +7 -3
  178. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
  179. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
  180. package/dist/daemon/reconcilers/storage-maintenance.d.ts +0 -6
  181. package/dist/daemon/reconcilers/storage-maintenance.js +1 -8
  182. package/dist/daemon/runs/observer.js +5 -4
  183. package/dist/migrations/004-canvas-documents/index.js +1 -1
  184. package/dist/pi-extensions/canvas-doc-substrate.d.ts +2 -0
  185. package/dist/pi-extensions/canvas-doc-substrate.js +6 -6
  186. package/dist/pi-extensions/envelope-merge.d.ts +3 -2
  187. package/dist/pi-extensions/envelope-merge.js +9 -8
  188. package/dist/shared/env.d.ts +3 -0
  189. package/dist/shared/env.js +2 -2
  190. package/docs/apps/providers/README.md +2 -0
  191. package/docs/apps/providers/sms.md +2 -0
  192. package/docs/public-api.md +11 -2
  193. package/docs/sdk/release-notes.md +8 -0
  194. package/package.json +6 -6
  195. package/packages/crouter-identity/package.json +1 -1
  196. package/runtime.lock.json +13 -26
  197. package/scripts/install-runtime.mjs +53 -3
  198. package/scripts/lib/isolation-env.mjs +3 -1
@@ -1,29 +1,26 @@
1
- var ue=Object.defineProperty;var r=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{prepared as l}from"../sqlite-statements.js";import{createHash as le,randomBytes as L}from"node:crypto";import{existsSync as y,mkdirSync as D,readFileSync as Y,readdirSync as _e,realpathSync as j,statSync as pe,writeFileSync as me}from"node:fs";import{basename as k,join as _}from"node:path";import{z as d}from"zod";import{crtrHome as V,isSafeNodeId as fe,nodesRoot as b}from"../canvas/paths.js";import{withCanvasWrite as Q,openDb as c}from"../canvas/db.js";import{syncDirectory as Ee,syncFile as ye}from"../fs-utils.js";import{newNodeId as ge}from"../runtime/nodes.js";import{pageManifestPath as Ne,pageModulePath as he,pagePath as qe}from"./convention.js";import{preparePageSource as Te}from"./page-authoring.js";import{pageAwaitsResponse as be,pageDeliverySchema as Se,pageIsNoticeSql as we,validatePageManifest as z}from"./page-schema.js";import{appendWaitingOnUser as Ae}from"../runs/questions.js";function G(e){return e===1||e===!0}r(G,"bool");function Z(e){return{request_id:e.request_id,kind:e.kind,inbox_ticket_id:e.inbox_ticket_id,request_dir:e.request_dir,presentation_dir:e.presentation_dir,requester_node_id:e.requester_node_id,companion_node_id:e.companion_node_id,idempotency_key:e.idempotency_key,state:e.state,outcome:e.outcome,inbox_listed:G(e.inbox_listed),settleable:G(e.settleable),title:e.title,subtitle:e.subtitle,file:e.file,specification_json:e.specification_json,action_json:e.action_json,progress_json:e.progress_json,feedback_json:e.feedback_json,result_json:e.result_json,anchor_base_sha256:e.anchor_base_sha256,anchor_base_bytes:e.anchor_base_bytes===null?null:Buffer.from(e.anchor_base_bytes),created_at:e.created_at,opened_at:e.opened_at,submit_requested_at:e.submit_requested_at,settled_at:e.settled_at,settlement_delivery_id:e.settlement_delivery_id,action_delivery_id:e.action_delivery_id,submit_note_delivery_id:e.submit_note_delivery_id,projected_at:e.projected_at,projection_error:e.projection_error,companion_retired_at:e.companion_retired_at,updated_at:e.updated_at}}r(Z,"recordFromRow");async function h(e,t,...i){const s=await e.prepareUncached(`SELECT * FROM human_requests WHERE ${t}`).get(...i);return s===void 0?null:Z(s)}r(h,"one");async function q(e,t,i=[],s="created_at ASC, request_id ASC"){return(await e.prepareUncached(`SELECT * FROM human_requests WHERE ${t} ORDER BY ${s}`).all(...i)).map(Z)}r(q,"many");function ee(){return _(V(),"requests")}r(ee,"humanRequestsRoot");function C(e){if(!fe(e))throw new TypeError(`request_id must be a safe path segment: ${e}`);const t=ee();return D(t,{recursive:!0,mode:448}),_(j(t),e)}r(C,"requestDir");function U(){return L(32).toString("hex")}r(U,"randomTicketId");function P(e,t){return le("sha256").update(`${j(e)}\0${t}`,"utf8").digest("hex")}r(P,"legacyTicketId");const De={writeFile(e,t){me(e,t,{flag:"wx",mode:384})},syncFile:ye,syncDirectory:Ee};function Re(e){return _(e,"revisions")}r(Re,"revisionRoot");function te(e,t,i=De){D(e,{recursive:!0,mode:448});const s=Re(e);D(s,{recursive:!0,mode:448});const n=_(s,L(16).toString("hex"));D(n,{mode:448});const o=qe(n,t.manifest.dialect);if(i.writeFile(o,t.document),i.syncFile(o),t.manifest.dialect==="jsx"){const a=he(n);i.writeFile(a,t.module),i.syncFile(a)}const u=Ne(n);return i.writeFile(u,`${JSON.stringify(t.manifest,null,2)}
2
- `),i.syncFile(u),i.syncDirectory(n),i.syncDirectory(s),i.syncDirectory(e),i.syncDirectory(ee()),n}r(te,"publishPageRevision");function it(e){if(e.kind!=="page"||e.presentation_dir===null)throw new Error(`page request has no selected presentation: ${e.request_id}`);return e.presentation_dir}r(it,"presentationDir");async function rt(e){const t=e.request_id??await ge(),i=C(t),s=te(i,e.prepared),n=new Date().toISOString(),o=e.prepared.manifest;return await Q(async u=>{await u.prepare(`
1
+ var ue=Object.defineProperty;var r=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{prepared as l}from"../sqlite-statements.js";import{createHash as le,randomBytes as x}from"node:crypto";import{existsSync as E,mkdirSync as R,readFileSync as V,readdirSync as _e,realpathSync as O,statSync as pe,writeFileSync as me}from"node:fs";import{basename as j,join as _}from"node:path";import{z as d}from"zod";import{crtrHome as Q,isSafeNodeId as fe,nodesRoot as b}from"../canvas/paths.js";import{withCanvasWrite as Y,openDb as c}from"../canvas/db.js";import{syncDirectory as ye,syncFile as Ee}from"../fs-utils.js";import{newNodeId as ge}from"../runtime/nodes.js";import{pageManifestPath as Ne,pageModulePath as he,pagePath as qe}from"./convention.js";import{preparePageSource as Te}from"./page-authoring.js";import{pageAwaitsResponse as be,pageDeliverySchema as Se,pageIsNoticeSql as we,validatePageManifest as z}from"./page-schema.js";import{appendWaitingOnUser as Ae}from"../runs/questions.js";function G(e){return e===1||e===!0}r(G,"bool");function Z(e){return{request_id:e.request_id,kind:e.kind,inbox_ticket_id:e.inbox_ticket_id,request_dir:e.request_dir,presentation_dir:e.presentation_dir,requester_node_id:e.requester_node_id,companion_node_id:e.companion_node_id,idempotency_key:e.idempotency_key,state:e.state,outcome:e.outcome,inbox_listed:G(e.inbox_listed),settleable:G(e.settleable),title:e.title,subtitle:e.subtitle,file:e.file,specification_json:e.specification_json,action_json:e.action_json,progress_json:e.progress_json,feedback_json:e.feedback_json,result_json:e.result_json,anchor_base_sha256:e.anchor_base_sha256,anchor_base_bytes:e.anchor_base_bytes===null?null:Buffer.from(e.anchor_base_bytes),created_at:e.created_at,opened_at:e.opened_at,submit_requested_at:e.submit_requested_at,settled_at:e.settled_at,settlement_delivery_id:e.settlement_delivery_id,action_delivery_id:e.action_delivery_id,submit_note_delivery_id:e.submit_note_delivery_id,projected_at:e.projected_at,projection_error:e.projection_error,companion_retired_at:e.companion_retired_at,updated_at:e.updated_at}}r(Z,"recordFromRow");async function h(e,t,...i){const s=await e.prepareUncached(`SELECT * FROM human_requests WHERE ${t}`).get(...i);return s===void 0?null:Z(s)}r(h,"one");async function q(e,t,i=[],s="created_at ASC, request_id ASC"){return(await e.prepareUncached(`SELECT * FROM human_requests WHERE ${t} ORDER BY ${s}`).all(...i)).map(Z)}r(q,"many");function ee(){return _(Q(),"requests")}r(ee,"humanRequestsRoot");function C(e){if(!fe(e))throw new TypeError(`request_id must be a safe path segment: ${e}`);const t=ee();return R(t,{recursive:!0,mode:448}),_(O(t),e)}r(C,"requestDir");function U(){return x(32).toString("hex")}r(U,"randomTicketId");function P(e,t){return le("sha256").update(`${O(e)}\0${t}`,"utf8").digest("hex")}r(P,"legacyTicketId");const Re={writeFile(e,t){me(e,t,{flag:"wx",mode:384})},syncFile:Ee,syncDirectory:ye};function ve(e){return _(e,"revisions")}r(ve,"revisionRoot");function te(e,t,i=Re){R(e,{recursive:!0,mode:448});const s=ve(e);R(s,{recursive:!0,mode:448});const n=_(s,x(16).toString("hex"));R(n,{mode:448});const o=qe(n,t.manifest.dialect);if(i.writeFile(o,t.document),i.syncFile(o),t.manifest.dialect==="jsx"){const a=he(n);i.writeFile(a,t.module),i.syncFile(a)}const u=Ne(n);return i.writeFile(u,`${JSON.stringify(t.manifest,null,2)}
2
+ `),i.syncFile(u),i.syncDirectory(n),i.syncDirectory(s),i.syncDirectory(e),i.syncDirectory(ee()),n}r(te,"publishPageRevision");function it(e){if(e.kind!=="page"||e.presentation_dir===null)throw new Error(`page request has no selected presentation: ${e.request_id}`);return e.presentation_dir}r(it,"presentationDir");async function rt(e){const t=e.request_id??await ge(),i=C(t),s=te(i,e.prepared),n=new Date().toISOString(),o=e.prepared.manifest;return await Y(async u=>{await u.prepare(`
3
3
  INSERT INTO human_requests (
4
4
  request_id, kind, inbox_ticket_id, request_dir, presentation_dir, requester_node_id, state, inbox_listed,
5
5
  settleable, title, subtitle, specification_json, action_json, created_at, updated_at
6
6
  ) VALUES (?, 'page', ?, ?, ?, ?, 'open', ?, ?, ?, ?, ?, ?, ?, ?)
7
- `).run(t,e.inbox_ticket_id??U(),i,s,e.requester_node_id??null,o.delivery.inbox?1:0,o.delivery.inbox||o.delivery.reply?1:0,o.title,o.subtitle??null,JSON.stringify(o),e.action_json??null,n,n);const a=await h(u,"request_id = ?",t);if(a===null)throw new Error(`page request insert did not produce a row: ${t}`);return await Ae(u,a),a})}r(rt,"createPageRequest");async function st(e){return await Q(async t=>{const i=await t.prepare(`
7
+ `).run(t,e.inbox_ticket_id??U(),i,s,e.requester_node_id??null,o.delivery.inbox?1:0,o.delivery.inbox||o.delivery.reply?1:0,o.title,o.subtitle??null,JSON.stringify(o),e.action_json??null,n,n);const a=await h(u,"request_id = ?",t);if(a===null)throw new Error(`page request insert did not produce a row: ${t}`);return await Ae(u,a),a})}r(rt,"createPageRequest");async function st(e){return await Y(async t=>{const i=await t.prepare(`
8
8
  INSERT INTO human_requests (
9
9
  request_id, kind, inbox_ticket_id, request_dir, requester_node_id, companion_node_id,
10
10
  idempotency_key, state, inbox_listed, settleable, title, subtitle, file,
11
11
  specification_json, anchor_base_sha256, anchor_base_bytes, created_at, updated_at
12
12
  ) VALUES (?, 'review', ?, ?, ?, ?, ?, 'binding', ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)
13
13
  ON CONFLICT(idempotency_key) DO NOTHING
14
- `).run(e.request_id,U(),e.request_dir,e.requester_node_id,e.companion_node_id,e.idempotency_key,e.inbox_listed?1:0,e.title??k(e.file),e.subtitle??null,e.file,JSON.stringify(e.specification),e.anchor_base_sha256,e.anchor_base_bytes,e.created_at,e.created_at),s=await h(t,"idempotency_key = ?",e.idempotency_key);if(s===null)throw new Error(`review binding insert did not produce a row: ${e.idempotency_key}`);return{request_id:s.request_id,won:i.changes>0}})}r(st,"commitBindingRequest");async function ot(e){return await h(await c(),"request_id = ?",e)}r(ot,"getRequest");async function at(e){return await h(await c(),"inbox_ticket_id = ?",e)}r(at,"getRequestByInboxTicket");async function dt(e){let t=e;try{t=j(e)}catch{}return await h(await c(),"request_dir = ?",t)}r(dt,"getRequestByDirectory");async function ct(e){return await h(await c(),"companion_node_id = ? AND state <> 'binding'",e)}r(ct,"getRequestByCompanion");async function ut(e){return await h(await c(),"idempotency_key = ?",e)}r(ut,"getRequestByIdempotencyKey");const ve=r(e=>`COALESCE(${e}.requester_node_id, CASE WHEN ${e}.kind = 'page' AND ${we(`${e}.specification_json`)} THEN json_extract(${e}.specification_json, '$.source.nodeId') END)`,"askingNodeSql"),ne=`NOT (kind = 'page' AND EXISTS (SELECT 1 FROM node_rows n WHERE n.node_id = ${ve("human_requests")}
15
- AND n.run_id IS NOT NULL AND n.grantee IS NOT NULL AND n.grantee <> 'app:terminal'))`;async function lt(){return await q(await c(),`state = 'open' AND inbox_listed = 1 AND ${ne}`,[],"created_at DESC, request_id DESC")}r(lt,"listOpenInboxRequests");async function _t(){return(await q(await c(),`state = 'open' AND requester_node_id IS NOT NULL AND ((inbox_listed = 1 AND ${ne}) OR (kind = 'page' AND inbox_listed = 0 AND settleable = 1))`,[],"created_at ASC, request_id ASC")).filter(e=>e.inbox_listed||be(JSON.parse(e.specification_json)))}r(_t,"listPendingAsks");async function Oe(e){return await q(await c(),"state = 'open' AND requester_node_id = ?",[e],"created_at DESC, request_id DESC")}r(Oe,"openRequestsByRequester");async function pt(e){return(await Oe(e)).some(t=>t.kind==="review"?!0:JSON.parse(t.specification_json).delivery?.reply===!0)}r(pt,"hasOpenReplyBearingRequestByRequester");async function mt(){return await q(await c(),"state = 'open' AND inbox_listed = 1 AND requester_node_id IS NOT NULL",[],"created_at DESC, request_id DESC")}r(mt,"listOpenReplyBearingRequests");async function ft(){return await q(await c(),"kind = 'review' AND state = 'binding'")}r(ft,"listBindingRequests");async function Et(){return await q(await c(),"kind = 'review' AND state = 'open' AND submit_requested_at IS NOT NULL")}r(Et,"listSubmitRequestedRequests");async function yt(){return await q(await c(),"kind = 'review' AND state = 'settled' AND projected_at IS NULL")}r(yt,"listUnprojectedReviews");async function gt(e={}){const t=["1"],i=[];for(const[s,n]of Object.entries(e))n!==void 0&&(t.push(s==="page_source_node_id"?"CASE WHEN json_valid(specification_json) THEN json_extract(specification_json, '$.source.nodeId') END = ?":`${s} = ?`),i.push(n));return await q(await c(),t.join(" AND "),i)}r(gt,"listRequests");async function Nt(){return await(await c()).prepare(`
16
- SELECT 1 FROM human_requests INDEXED BY idx_human_requests_page_result_exception
17
- WHERE kind = 'page' AND result_json IS NOT NULL AND
18
- CASE WHEN json_valid(result_json) THEN
19
- json_extract(result_json, '$.kind') = 'page'
20
- AND json_type(result_json, '$.summary') IS NOT 'text'
21
- ELSE 1 END
14
+ `).run(e.request_id,U(),e.request_dir,e.requester_node_id,e.companion_node_id,e.idempotency_key,e.inbox_listed?1:0,e.title??j(e.file),e.subtitle??null,e.file,JSON.stringify(e.specification),e.anchor_base_sha256,e.anchor_base_bytes,e.created_at,e.created_at),s=await h(t,"idempotency_key = ?",e.idempotency_key);if(s===null)throw new Error(`review binding insert did not produce a row: ${e.idempotency_key}`);return{request_id:s.request_id,won:i.changes>0}})}r(st,"commitBindingRequest");async function ot(e){return await h(await c(),"request_id = ?",e)}r(ot,"getRequest");async function at(e){return await h(await c(),"inbox_ticket_id = ?",e)}r(at,"getRequestByInboxTicket");async function dt(e){let t=e;try{t=O(e)}catch{}return await h(await c(),"request_dir = ?",t)}r(dt,"getRequestByDirectory");async function ct(e){return await h(await c(),"companion_node_id = ? AND state <> 'binding'",e)}r(ct,"getRequestByCompanion");async function ut(e){return await h(await c(),"idempotency_key = ?",e)}r(ut,"getRequestByIdempotencyKey");const De=r(e=>`COALESCE(${e}.requester_node_id, CASE WHEN ${e}.kind = 'page' AND ${we(`${e}.specification_json`)} THEN ${e}.specification_json #>> '{source,nodeId}' END)`,"askingNodeSql"),ne=`NOT (kind = 'page' AND EXISTS (SELECT 1 FROM node_rows n WHERE n.node_id = ${De("human_requests")}
15
+ AND n.run_id IS NOT NULL AND n.grantee IS NOT NULL AND n.grantee <> 'app:terminal'))`;async function lt(){return await q(await c(),`state = 'open' AND inbox_listed = 1 AND ${ne}`,[],"created_at DESC, request_id DESC")}r(lt,"listOpenInboxRequests");async function _t(){return(await q(await c(),`state = 'open' AND requester_node_id IS NOT NULL AND ((inbox_listed = 1 AND ${ne}) OR (kind = 'page' AND inbox_listed = 0 AND settleable = 1))`,[],"created_at ASC, request_id ASC")).filter(e=>e.inbox_listed||be(JSON.parse(e.specification_json)))}r(_t,"listPendingAsks");async function Ie(e){return await q(await c(),"state = 'open' AND requester_node_id = ?",[e],"created_at DESC, request_id DESC")}r(Ie,"openRequestsByRequester");async function pt(e){return(await Ie(e)).some(t=>t.kind==="review"?!0:JSON.parse(t.specification_json).delivery?.reply===!0)}r(pt,"hasOpenReplyBearingRequestByRequester");async function mt(){return await q(await c(),"state = 'open' AND inbox_listed = 1 AND requester_node_id IS NOT NULL",[],"created_at DESC, request_id DESC")}r(mt,"listOpenReplyBearingRequests");async function ft(){return await q(await c(),"kind = 'review' AND state = 'binding'")}r(ft,"listBindingRequests");async function yt(){return await q(await c(),"kind = 'review' AND state = 'open' AND submit_requested_at IS NOT NULL")}r(yt,"listSubmitRequestedRequests");async function Et(){return await q(await c(),"kind = 'review' AND state = 'settled' AND projected_at IS NULL")}r(Et,"listUnprojectedReviews");async function gt(e={}){const t=["true"],i=[];for(const[s,n]of Object.entries(e))n!==void 0&&(t.push(s==="page_source_node_id"?"specification_json #>> '{source,nodeId}' = ?":`${s} = ?`),i.push(n));return await q(await c(),t.join(" AND "),i)}r(gt,"listRequests");async function Nt(){return await(await c()).prepare(`
16
+ SELECT 1 FROM human_requests
17
+ WHERE kind = 'page' AND result_json IS NOT NULL
18
+ AND (result_json ->> 'kind') = 'page'
19
+ AND jsonb_typeof(result_json -> 'summary') IS DISTINCT FROM 'string'
22
20
  LIMIT 1
23
21
  `).get()!==void 0}r(Nt,"hasPageResultException");async function ht(){return await(await c()).prepare(`
24
- SELECT request_id, specification_json FROM human_requests INDEXED BY idx_human_requests_page_invalid_spec
25
- WHERE kind = 'page' AND (NOT json_valid(specification_json)
26
- OR CASE WHEN json_valid(specification_json) THEN json_type(specification_json) != 'object' END)
22
+ SELECT request_id, specification_json FROM human_requests
23
+ WHERE kind = 'page' AND jsonb_typeof(specification_json) <> 'object'
27
24
  ORDER BY created_at ASC, request_id ASC LIMIT 1
28
25
  `).get()??null}r(ht,"firstInvalidPageSpecification");async function qt(e,t){return(await(await c()).prepare("UPDATE human_requests SET state = 'open', opened_at = ?, updated_at = ? WHERE request_id = ? AND state = 'binding'").run(t,t,e)).changes>0}r(qt,"openRequest");async function Tt(e,t,i){return(await(await c()).prepare(`
29
26
  UPDATE human_requests SET state = 'settled', outcome = 'canceled', result_json = ?, settled_at = ?, updated_at = ?
@@ -32,25 +29,25 @@ var ue=Object.defineProperty;var r=(e,t)=>ue(e,"name",{value:t,configurable:!0})
32
29
  UPDATE human_requests SET state = 'settled', outcome = ?, result_json = ?, settled_at = ?,
33
30
  progress_json = NULL, updated_at = ?
34
31
  WHERE request_id = ? AND state = 'open'
35
- `).run(t.outcome,t.result_json,t.settled_at,t.settled_at,t.request_id)).changes===0?null:await h(e,"request_id = ?",t.request_id)}r(St,"settleRequestLocked");async function wt(e,t,i){await e.prepare("UPDATE human_requests SET settlement_delivery_id = ?, action_delivery_id = ?, updated_at = ? WHERE request_id = ?").run(i.settlement_delivery_id??null,i.action_delivery_id??null,new Date().toISOString(),t)}r(wt,"setSettlementDeliveryMarksLocked");async function At(e,t,i){return(await e.prepare("UPDATE human_requests SET submit_note_delivery_id = ?, updated_at = ? WHERE request_id = ? AND state = 'open' AND submit_note_delivery_id IS NULL").run(i,new Date().toISOString(),t)).changes>0}r(At,"setSubmitNoteDeliveryLocked");async function Dt(e,t){return(await(await c()).prepare(`
32
+ `).run(t.outcome,t.result_json,t.settled_at,t.settled_at,t.request_id)).changes===0?null:await h(e,"request_id = ?",t.request_id)}r(St,"settleRequestLocked");async function wt(e,t,i){await e.prepare("UPDATE human_requests SET settlement_delivery_id = ?, action_delivery_id = ?, updated_at = ? WHERE request_id = ?").run(i.settlement_delivery_id??null,i.action_delivery_id??null,new Date().toISOString(),t)}r(wt,"setSettlementDeliveryMarksLocked");async function At(e,t,i){return(await e.prepare("UPDATE human_requests SET submit_note_delivery_id = ?, updated_at = ? WHERE request_id = ? AND state = 'open' AND submit_note_delivery_id IS NULL").run(i,new Date().toISOString(),t)).changes>0}r(At,"setSubmitNoteDeliveryLocked");async function Rt(e,t){return(await(await c()).prepare(`
36
33
  UPDATE human_requests SET presentation_dir = ?, specification_json = ?, title = ?, subtitle = ?, inbox_listed = ?, settleable = ?, updated_at = ?
37
34
  WHERE request_id = ? AND kind = 'page' AND state = 'open'
38
- `).run(t.presentation_dir,t.specification_json,t.title,t.subtitle,t.inbox_listed?1:0,t.settleable?1:0,new Date().toISOString(),e)).changes>0}r(Dt,"revisePageRequest");async function Rt(e,t){return(await(await c()).prepare(`
35
+ `).run(t.presentation_dir,t.specification_json,t.title,t.subtitle,t.inbox_listed?1:0,t.settleable?1:0,new Date().toISOString(),e)).changes>0}r(Rt,"revisePageRequest");async function vt(e,t){return(await(await c()).prepare(`
39
36
  UPDATE human_requests SET progress_json = ?, updated_at = ?
40
37
  WHERE inbox_ticket_id = ? AND kind = 'page' AND state = 'open' AND settleable = 1
41
- `).run(JSON.stringify({kind:"page",responses:t,savedAt:new Date().toISOString()}),new Date().toISOString(),e)).changes>0}r(Rt,"writeProgress");async function vt(e,t){await(await c()).prepare("UPDATE human_requests SET projected_at = ?, projection_error = NULL, updated_at = ? WHERE request_id = ?").run(t,t,e)}r(vt,"markProjected");async function Ot(e,t){await(await c()).prepare("UPDATE human_requests SET projection_error = ?, updated_at = ? WHERE request_id = ? AND projected_at IS NULL").run(t,new Date().toISOString(),e)}r(Ot,"markProjectionError");async function jt(e,t){await(await c()).prepare("UPDATE human_requests SET companion_retired_at = ?, updated_at = ? WHERE request_id = ? AND companion_retired_at IS NULL").run(t,t,e)}r(jt,"markCompanionRetired");async function It(e){const t=await(await c()).prepare("SELECT anchor_base_bytes, anchor_base_sha256 FROM human_requests WHERE request_id = ?").get(e);return t===void 0||t.anchor_base_bytes===null||t.anchor_base_sha256===null?null:{bytes:Buffer.from(t.anchor_base_bytes),sha256:t.anchor_base_sha256}}r(It,"readAnchorBase");async function xt(e,t,i,s){await e.prepare("UPDATE human_requests SET anchor_base_bytes = ?, anchor_base_sha256 = ?, updated_at = ? WHERE request_id = ?").run(i,s,new Date().toISOString(),t)}r(xt,"replaceAnchorBaseLocked");function je(e){if(typeof e!="object"||e===null)throw new Error("result is not an object");const t=e;return t.kind==="canceled"?{outcome:t.disposition==="dismissed"?"dismissed":"canceled",settledAt:String(t.canceledAt)}:{outcome:"answered",settledAt:String(t.completedAt)}}r(je,"legacyPageResult");function A(e){try{return JSON.parse(Y(e,"utf8"))}catch(t){throw new Error(`corrupt required input: ${e}`,{cause:t})}}r(A,"readJson");function H(){return L(16).toString("hex")}r(H,"migrationId");function Ie(e){return Number(l(e,"SELECT COALESCE(MAX(seq), 0) AS seq FROM messages").get().seq)+1}r(Ie,"nextMessageSeq");function xe(e,t,i,s){return(s==="page"?l(e,`SELECT d.delivery_id FROM deliveries d JOIN messages m ON m.message_id = d.message_id
38
+ `).run(JSON.stringify({kind:"page",responses:t,savedAt:new Date().toISOString()}),new Date().toISOString(),e)).changes>0}r(vt,"writeProgress");async function Dt(e,t){await(await c()).prepare("UPDATE human_requests SET projected_at = ?, projection_error = NULL, updated_at = ? WHERE request_id = ?").run(t,t,e)}r(Dt,"markProjected");async function It(e,t){await(await c()).prepare("UPDATE human_requests SET projection_error = ?, updated_at = ? WHERE request_id = ? AND projected_at IS NULL").run(t,new Date().toISOString(),e)}r(It,"markProjectionError");async function Ot(e,t){await(await c()).prepare("UPDATE human_requests SET companion_retired_at = ?, updated_at = ? WHERE request_id = ? AND companion_retired_at IS NULL").run(t,t,e)}r(Ot,"markCompanionRetired");async function Lt(e){const t=await(await c()).prepare("SELECT anchor_base_bytes, anchor_base_sha256 FROM human_requests WHERE request_id = ?").get(e);return t===void 0||t.anchor_base_bytes===null||t.anchor_base_sha256===null?null:{bytes:Buffer.from(t.anchor_base_bytes),sha256:t.anchor_base_sha256}}r(Lt,"readAnchorBase");async function kt(e,t,i,s){await e.prepare("UPDATE human_requests SET anchor_base_bytes = ?, anchor_base_sha256 = ?, updated_at = ? WHERE request_id = ?").run(i,s,new Date().toISOString(),t)}r(kt,"replaceAnchorBaseLocked");function Oe(e){if(typeof e!="object"||e===null)throw new Error("result is not an object");const t=e;return t.kind==="canceled"?{outcome:t.disposition==="dismissed"?"dismissed":"canceled",settledAt:String(t.canceledAt)}:{outcome:"answered",settledAt:String(t.completedAt)}}r(Oe,"legacyPageResult");function A(e){try{return JSON.parse(V(e,"utf8"))}catch(t){throw new Error(`corrupt required input: ${e}`,{cause:t})}}r(A,"readJson");function H(){return x(16).toString("hex")}r(H,"migrationId");function Le(e){return Number(l(e,"SELECT COALESCE(MAX(seq), 0) AS seq FROM messages").get().seq)+1}r(Le,"nextMessageSeq");function ke(e,t,i,s){return(s==="page"?l(e,`SELECT d.delivery_id FROM deliveries d JOIN messages m ON m.message_id = d.message_id
42
39
  WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.sender_node_id = ?
43
40
  AND m.disposition IN ('human-answer', 'human-canceled') LIMIT 1`).get(i,t):l(e,`SELECT d.delivery_id FROM deliveries d JOIN messages m ON m.message_id = d.message_id
44
- WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.body_json LIKE ? LIMIT 1`).get(i,`%"review_id":"${t}"%`))?.delivery_id??null}r(xe,"importedTerminalDelivery");function ie(e,t,i){if(t===null||i===null)return!1;const s=l(e,"SELECT status, final_report FROM nodes WHERE node_id = ?").get(t);return s?.status==="canceled"||i==="approved"&&s?.status==="done"&&s.final_report!==null}r(ie,"companionRetirementProven");function re(e){if(typeof e!="object"||e===null)return"no reason was given";const t=e.reason;return typeof t=="string"&&t!==""?t:"no reason was given"}r(re,"migratedCancellationReason");function Le(e,t){const i=e.outcome==="canceled"||e.outcome==="dismissed";return[e.kind==="review"?i?`Review ${e.requestId} was canceled \u2014 ${re(t)}.`:`Review ${e.requestId} was approved by the user.`:i?`Human request ${e.requestId} was canceled \u2014 ${re(t)}.`:`Human request ${e.requestId} was answered.`,...e.kind==="review"?[`The review result is at ${e.requestDir}/result.json.`]:[],`Result:
41
+ WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.body_json LIKE ? LIMIT 1`).get(i,`%"review_id":"${t}"%`))?.delivery_id??null}r(ke,"importedTerminalDelivery");function ie(e,t,i){if(t===null||i===null)return!1;const s=l(e,"SELECT status, final_report FROM nodes WHERE node_id = ?").get(t);return s?.status==="canceled"||i==="approved"&&s?.status==="done"&&s.final_report!==null}r(ie,"companionRetirementProven");function re(e){if(typeof e!="object"||e===null)return"no reason was given";const t=e.reason;return typeof t=="string"&&t!==""?t:"no reason was given"}r(re,"migratedCancellationReason");function xe(e,t){const i=e.outcome==="canceled"||e.outcome==="dismissed";return[e.kind==="review"?i?`Review ${e.requestId} was canceled \u2014 ${re(t)}.`:`Review ${e.requestId} was approved by the user.`:i?`Human request ${e.requestId} was canceled \u2014 ${re(t)}.`:`Human request ${e.requestId} was answered.`,...e.kind==="review"?[`The review result is at ${e.requestDir}/result.json.`]:[],`Result:
45
42
  ${JSON.stringify(t,null,2)}`].join(`
46
43
 
47
- `)}r(Le,"migratedTerminalBody");function ke(e,t){const i=H(),s=H(),n=Date.parse(t.settledAt),o=Number.isFinite(n)?n:0,u=t.outcome==="answered"||t.outcome==="approved"?"human-answer":"human-canceled",a=JSON.parse(t.resultJson),p=Le(t,a);return l(e,`INSERT INTO messages
44
+ `)}r(xe,"migratedTerminalBody");function je(e,t){const i=H(),s=H(),n=Date.parse(t.settledAt),o=Number.isFinite(n)?n:0,u=t.outcome==="answered"||t.outcome==="approved"?"human-answer":"human-canceled",a=JSON.parse(t.resultJson),p=xe(t,a);return l(e,`INSERT INTO messages
48
45
  (message_id, seq, operation_id, created_at, sender_node_id, sender_name, kind, label, body_ref, body_json, disposition)
49
- VALUES (?, ?, ?, ?, NULL, 'crtrd', 'completed', ?, NULL, ?, ?)`).run(i,Ie(e),H(),t.settledAt,p.split(`
46
+ VALUES (?, ?, ?, ?, NULL, 'crtrd', 'completed', ?, NULL, ?, ?)`).run(i,Le(e),H(),t.settledAt,p.split(`
50
47
  `,1)[0],JSON.stringify({body:p,result:a}),u),l(e,`INSERT INTO deliveries
51
48
  (delivery_id, message_id, destination_kind, destination_id, urgency, wake, state, attempts, created_at, updated_at)
52
- VALUES (?, ?, 'node_inbox', ?, 'normal', 1, 'pending', 0, ?, ?)`).run(s,i,t.requesterNodeId,o,o),s}r(ke,"createMigratedTerminalDelivery");function se(e,t){if(t.requesterNodeId===null||t.outcome===null||t.resultJson===null||t.settledAt===null)return null;const i=xe(e,t.requestId,t.requesterNodeId,t.kind);return i!==null?i:t.deliveredAt!==null&&t.deliveredAt!==void 0?null:ke(e,{requestId:t.requestId,requesterNodeId:t.requesterNodeId,kind:t.kind,outcome:t.outcome,resultJson:t.resultJson,settledAt:t.settledAt,requestDir:t.requestDir})}r(se,"terminalDeliveryMark");const Ce=d.object({sessionName:d.string().optional(),askedBy:d.string().optional(),blockedSince:d.string().optional(),profileName:d.string().optional(),nodeId:d.string().optional()}).strict(),Ue=d.object({id:d.string().regex(/^[A-Za-z0-9_-]{1,64}$/).optional(),kind:d.string().min(1),step:d.number().int().nonnegative(),config:d.record(d.string(),d.unknown()),unvalidated:d.literal(!0).optional(),display:d.literal(!0).optional()}).strict(),Pe=d.object({schema:d.literal("crtr.page/v1"),dialect:d.enum(["md","html","jsx"]),title:d.string().trim().min(1),subtitle:d.string().optional(),placement:d.enum(["inline","panel"]),document:d.enum(["page.md","page.html","page.tsx"]),steps:d.number().int().positive(),slots:d.array(Ue),source:Ce.optional()}).strict().superRefine((e,t)=>{const i=e.dialect==="md"?"page.md":e.dialect==="html"?"page.html":"page.tsx";e.document!==i&&t.addIssue({code:"custom",path:["document"],message:"document must agree with dialect"}),e.dialect==="md"&&e.steps!==1&&t.addIssue({code:"custom",path:["steps"],message:"md pages have exactly one step"})});function He(e){if(e.source===void 0)return;const{blockedSince:t,...i}=e.source,s={...i,...t!==void 0&&d.string().datetime({offset:!0}).safeParse(t).success?{emittedAt:t}:{}};return Object.keys(s).length===0?void 0:s}r(He,"legacyPresentationSource");function $e(e,t,i){return`export default function LegacyPage() { return <Page title={${JSON.stringify(e)}}${t===void 0?"":` subtitle={${JSON.stringify(t)}}`}><pre>{${JSON.stringify(i)}}</pre></Page>; }
53
- `}r($e,"legacyReplayDocument");function oe(e){return Array.isArray(e.slots)?{...e,slots:e.slots.map(t=>{if(typeof t!="object"||t===null||Array.isArray(t))return t;const i=t;if(i.kind!=="text"||typeof i.config!="object"||i.config===null||Array.isArray(i.config))return t;const{editable:s,...n}=i.config;return{...i,config:n}})}:e}r(oe,"withoutLegacyTextEditable");function Xe(e,t){const i=_(e,"page.json"),s=Pe.safeParse(t);if(!s.success)throw new Error(s.error.message);const n=s.data,o=He(n),u={placement:n.placement,inbox:!0,reply:n.source?.blockedSince!==void 0};z(oe({schema:"crtr.page/v2",dialect:"jsx",title:n.title,...n.subtitle===void 0?{}:{subtitle:n.subtitle},delivery:u,document:"page.tsx",steps:n.steps,slots:n.slots,...o===void 0?{}:{source:o}}));const a=_(e,n.document);if(!y(a))throw new Error(`corrupt required input: ${a}`);const p=Y(a,"utf8"),f=Te({dialect:"jsx",document:$e(n.title,n.subtitle,p),source:o,delivery:u});if(o!==void 0)return f;const{source:E,...g}=f.manifest;return{...f,manifest:g}}r(Xe,"migrateLegacyPage");function Lt(e){e.exec(`
49
+ VALUES (?, ?, 'node_inbox', ?, 'normal', 1, 'pending', 0, ?, ?)`).run(s,i,t.requesterNodeId,o,o),s}r(je,"createMigratedTerminalDelivery");function se(e,t){if(t.requesterNodeId===null||t.outcome===null||t.resultJson===null||t.settledAt===null)return null;const i=ke(e,t.requestId,t.requesterNodeId,t.kind);return i!==null?i:t.deliveredAt!==null&&t.deliveredAt!==void 0?null:je(e,{requestId:t.requestId,requesterNodeId:t.requesterNodeId,kind:t.kind,outcome:t.outcome,resultJson:t.resultJson,settledAt:t.settledAt,requestDir:t.requestDir})}r(se,"terminalDeliveryMark");const Ce=d.object({sessionName:d.string().optional(),askedBy:d.string().optional(),blockedSince:d.string().optional(),profileName:d.string().optional(),nodeId:d.string().optional()}).strict(),Ue=d.object({id:d.string().regex(/^[A-Za-z0-9_-]{1,64}$/).optional(),kind:d.string().min(1),step:d.number().int().nonnegative(),config:d.record(d.string(),d.unknown()),unvalidated:d.literal(!0).optional(),display:d.literal(!0).optional()}).strict(),Pe=d.object({schema:d.literal("crtr.page/v1"),dialect:d.enum(["md","html","jsx"]),title:d.string().trim().min(1),subtitle:d.string().optional(),placement:d.enum(["inline","panel"]),document:d.enum(["page.md","page.html","page.tsx"]),steps:d.number().int().positive(),slots:d.array(Ue),source:Ce.optional()}).strict().superRefine((e,t)=>{const i=e.dialect==="md"?"page.md":e.dialect==="html"?"page.html":"page.tsx";e.document!==i&&t.addIssue({code:"custom",path:["document"],message:"document must agree with dialect"}),e.dialect==="md"&&e.steps!==1&&t.addIssue({code:"custom",path:["steps"],message:"md pages have exactly one step"})});function He(e){if(e.source===void 0)return;const{blockedSince:t,...i}=e.source,s={...i,...t!==void 0&&d.string().datetime({offset:!0}).safeParse(t).success?{emittedAt:t}:{}};return Object.keys(s).length===0?void 0:s}r(He,"legacyPresentationSource");function $e(e,t,i){return`export default function LegacyPage() { return <Page title={${JSON.stringify(e)}}${t===void 0?"":` subtitle={${JSON.stringify(t)}}`}><pre>{${JSON.stringify(i)}}</pre></Page>; }
50
+ `}r($e,"legacyReplayDocument");function oe(e){return Array.isArray(e.slots)?{...e,slots:e.slots.map(t=>{if(typeof t!="object"||t===null||Array.isArray(t))return t;const i=t;if(i.kind!=="text"||typeof i.config!="object"||i.config===null||Array.isArray(i.config))return t;const{editable:s,...n}=i.config;return{...i,config:n}})}:e}r(oe,"withoutLegacyTextEditable");function Me(e,t){const i=_(e,"page.json"),s=Pe.safeParse(t);if(!s.success)throw new Error(s.error.message);const n=s.data,o=He(n),u={placement:n.placement,inbox:!0,reply:n.source?.blockedSince!==void 0};z(oe({schema:"crtr.page/v2",dialect:"jsx",title:n.title,...n.subtitle===void 0?{}:{subtitle:n.subtitle},delivery:u,document:"page.tsx",steps:n.steps,slots:n.slots,...o===void 0?{}:{source:o}}));const a=_(e,n.document);if(!E(a))throw new Error(`corrupt required input: ${a}`);const p=V(a,"utf8"),f=Te({dialect:"jsx",document:$e(n.title,n.subtitle,p),source:o,delivery:u});if(o!==void 0)return f;const{source:y,...g}=f.manifest;return{...f,manifest:g}}r(Me,"migrateLegacyPage");function xt(e){e.exec(`
54
51
  CREATE TABLE human_requests (
55
52
  request_id TEXT PRIMARY KEY, kind TEXT NOT NULL CHECK (kind IN ('page','review')),
56
53
  inbox_ticket_id TEXT NOT NULL UNIQUE, request_dir TEXT NOT NULL, presentation_dir TEXT,
@@ -79,4 +76,4 @@ ${JSON.stringify(t,null,2)}`].join(`
79
76
  progress_json, feedback_json, result_json, anchor_base_sha256, anchor_base_bytes, created_at, opened_at,
80
77
  submit_requested_at, settled_at, settlement_delivery_id, action_delivery_id, projected_at, projection_error,
81
78
  companion_retired_at, updated_at
82
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);if(l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'reviews'").get()!==void 0){const s=l(e,"SELECT * FROM reviews").all();for(const n of s){const o=n.state,u=o==="approved"||o==="canceled",a=o==="canceled"&&n.result_json===null?JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:n.canceled_at,...n.cancel_reason===""||n.cancel_reason===null?{}:{reason:n.cancel_reason},...n.cancel_actor===null?{}:{actor:n.cancel_actor}}):n.result_json;if(u&&a===null)throw new Error(`corrupt required input: reviews/${n.review_id} has no terminal result`);const p=n.bridge_node_id===null?_(V(),"reviews",n.review_id):_(b(),n.bridge_node_id),f={origin_kind:n.origin_kind,bridge_node_id:n.bridge_node_id,origin_session_file:n.origin_session_file,origin_session_id:n.origin_session_id,origin_leaf_id:n.origin_leaf_id,model_spec:n.model_spec,branch_file:n.branch_file,baseline_sha256:n.baseline_sha256,baseline_bytes:n.baseline_bytes,captured_at:n.captured_at,output_path:n.output_path},E=u?o==="approved"?"approved":"canceled":null,g=u?o==="approved"?n.approved_at:n.canceled_at:null,S=se(e,{requestId:n.review_id,requesterNodeId:n.origin_node_id,kind:"review",outcome:E,resultJson:a,settledAt:g,requestDir:p,deliveredAt:n.delivered_at}),R=ie(e,n.companion_node_id,E)?g:null;t.run(n.review_id,"review",n.origin_kind==="ticket"?P(b(),k(p)):U(),p,null,n.origin_node_id,n.companion_node_id,n.idempotency_key,u?"settled":o,E,n.origin_kind==="ticket"?1:0,1,k(n.file),n.subtitle,n.file,JSON.stringify(f),null,null,null,a,n.anchor_base_sha256,n.anchor_base_bytes,n.created,n.opened_at,n.submit_requested_at,g,S,null,n.projected_at,n.projection_error,R,n.created)}e.exec("DROP TABLE reviews")}for(const s of y(b())?_e(b(),{withFileTypes:!0}):[]){if(!s.isDirectory())continue;const n=_(b(),s.name),o=_(n,"page.json"),u=_(n,"review.json");if(!y(o)){if(y(u))continue;continue}if(l(e,"SELECT 1 FROM human_requests WHERE request_id = ?").get(s.name)!==void 0)continue;let a,p,f,E;try{const m=A(o);if(typeof m!="object"||m===null||Array.isArray(m))throw new Error("page manifest must be an object");a=m,a.schema==="crtr.page/v1"?(p=Xe(n,m),a=p.manifest):a.schema==="crtr.page/v2"&&(a=oe(a));const w=Se.safeParse(a.delivery);if(typeof a.title!="string"||!w.success)throw new Error(w.success?"page title must be a string":w.error.message);E=w.data,f=z(a)}catch(m){const w=m instanceof Error&&m.cause instanceof Error?m.cause.message:m instanceof Error?m.message:String(m);console.warn(`skipping legacy page ${o}: ${w}`);continue}let g=j(n);p!==void 0&&(g=te(C(s.name),p));const S=f.source,R=_(n,"response.json"),v=y(R)?A(R):null,N=v===null?null:je(v),ae=l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'deliveries'").get()===void 0?null:l(e,"SELECT delivery_id FROM deliveries WHERE idempotency_key = ?").get(`human-action:${P(b(),s.name)}`),$=_(n,"action.json"),X=_(n,"progress.json"),I=_(n,"feedback-comments.json"),x=_(n,"reply-route.json"),T=y(I)?A(I):null;if(T!==null&&(typeof T!="object"||typeof T.companionNodeId<"u"&&typeof T.companionNodeId!="string"))throw new Error(`corrupt required input: ${I}`);const O=y(x)?A(x):null;if(O!==null&&(typeof O!="object"||typeof O.bridge_node_id!="string"))throw new Error(`corrupt required input: ${x}`);const M=O?.bridge_node_id,W=(typeof M!="string"||l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'nodes'").get()===void 0?null:l(e,"SELECT parent FROM nodes WHERE node_id = ?").get(M))?.parent??(typeof S?.nodeId=="string"?S.nodeId:null),F=T?.companionNodeId,J=typeof S?.emittedAt=="string"?S.emittedAt:pe(o).mtime.toISOString(),B=v===null?null:JSON.stringify(v),de=se(e,{requestId:s.name,requesterNodeId:W,kind:"page",outcome:N?.outcome??null,resultJson:B,settledAt:N?.settledAt??null,requestDir:n}),ce=ie(e,F??null,N?.outcome??null)?N?.settledAt??null:null,K=C(s.name);D(K,{recursive:!0,mode:448}),t.run(s.name,"page",P(b(),s.name),K,g,W,F??null,null,N===null?"open":"settled",N?.outcome??null,E.inbox?1:0,E.inbox||E.reply?1:0,f.title,f.subtitle??null,null,JSON.stringify(f),y($)?JSON.stringify(A($)):null,y(X)&&N===null?JSON.stringify(A(X)):null,T===null?null:JSON.stringify(T),B,null,null,J,null,null,N?.settledAt??null,de,ae?.delivery_id??null,null,null,ce,J)}const i=l(e,"SELECT request_id FROM human_requests WHERE state = 'settled' AND result_json IS NULL").get();if(i!==void 0)throw new Error(`human request migration produced terminal row without result: ${i.request_id}`);if(l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get()!==void 0){const s=l(e,"SELECT review_id FROM review_comments WHERE review_id NOT IN (SELECT request_id FROM human_requests WHERE kind = 'review') LIMIT 1").get();if(s!==void 0)throw new Error(`review comment has no migrated review request: ${s.review_id}`)}}r(Lt,"migrateHumanRequestsState");export{ne as NOT_OTHER_APP_QUESTION,ve as askingNodeSql,Tt as cancelBindingRequest,st as commitBindingRequest,rt as createPageRequest,ht as firstInvalidPageSpecification,ot as getRequest,ct as getRequestByCompanion,dt as getRequestByDirectory,ut as getRequestByIdempotencyKey,at as getRequestByInboxTicket,pt as hasOpenReplyBearingRequestByRequester,Nt as hasPageResultException,ee as humanRequestsRoot,ft as listBindingRequests,lt as listOpenInboxRequests,mt as listOpenReplyBearingRequests,_t as listPendingAsks,gt as listRequests,Et as listSubmitRequestedRequests,yt as listUnprojectedReviews,jt as markCompanionRetired,vt as markProjected,Ot as markProjectionError,Lt as migrateHumanRequestsState,qt as openRequest,Oe as openRequestsByRequester,it as presentationDir,te as publishPageRevision,It as readAnchorBase,xt as replaceAnchorBaseLocked,C as requestDir,bt as requestSubmit,Dt as revisePageRequest,wt as setSettlementDeliveryMarksLocked,At as setSubmitNoteDeliveryLocked,St as settleRequestLocked,Rt as writeProgress};
79
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);if(l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'reviews'").get()!==void 0){const s=l(e,"SELECT * FROM reviews").all();for(const n of s){const o=n.state,u=o==="approved"||o==="canceled",a=o==="canceled"&&n.result_json===null?JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:n.canceled_at,...n.cancel_reason===""||n.cancel_reason===null?{}:{reason:n.cancel_reason},...n.cancel_actor===null?{}:{actor:n.cancel_actor}}):n.result_json;if(u&&a===null)throw new Error(`corrupt required input: reviews/${n.review_id} has no terminal result`);const p=n.bridge_node_id===null?_(Q(),"reviews",n.review_id):_(b(),n.bridge_node_id),f={origin_kind:n.origin_kind,bridge_node_id:n.bridge_node_id,origin_session_file:n.origin_session_file,origin_session_id:n.origin_session_id,origin_leaf_id:n.origin_leaf_id,model_spec:n.model_spec,branch_file:n.branch_file,baseline_sha256:n.baseline_sha256,baseline_bytes:n.baseline_bytes,captured_at:n.captured_at,output_path:n.output_path},y=u?o==="approved"?"approved":"canceled":null,g=u?o==="approved"?n.approved_at:n.canceled_at:null,S=se(e,{requestId:n.review_id,requesterNodeId:n.origin_node_id,kind:"review",outcome:y,resultJson:a,settledAt:g,requestDir:p,deliveredAt:n.delivered_at}),v=ie(e,n.companion_node_id,y)?g:null;t.run(n.review_id,"review",n.origin_kind==="ticket"?P(b(),j(p)):U(),p,null,n.origin_node_id,n.companion_node_id,n.idempotency_key,u?"settled":o,y,n.origin_kind==="ticket"?1:0,1,j(n.file),n.subtitle,n.file,JSON.stringify(f),null,null,null,a,n.anchor_base_sha256,n.anchor_base_bytes,n.created,n.opened_at,n.submit_requested_at,g,S,null,n.projected_at,n.projection_error,v,n.created)}e.exec("DROP TABLE reviews")}for(const s of E(b())?_e(b(),{withFileTypes:!0}):[]){if(!s.isDirectory())continue;const n=_(b(),s.name),o=_(n,"page.json"),u=_(n,"review.json");if(!E(o)){if(E(u))continue;continue}if(l(e,"SELECT 1 FROM human_requests WHERE request_id = ?").get(s.name)!==void 0)continue;let a,p,f,y;try{const m=A(o);if(typeof m!="object"||m===null||Array.isArray(m))throw new Error("page manifest must be an object");a=m,a.schema==="crtr.page/v1"?(p=Me(n,m),a=p.manifest):a.schema==="crtr.page/v2"&&(a=oe(a));const w=Se.safeParse(a.delivery);if(typeof a.title!="string"||!w.success)throw new Error(w.success?"page title must be a string":w.error.message);y=w.data,f=z(a)}catch(m){const w=m instanceof Error&&m.cause instanceof Error?m.cause.message:m instanceof Error?m.message:String(m);console.warn(`skipping legacy page ${o}: ${w}`);continue}let g=O(n);p!==void 0&&(g=te(C(s.name),p));const S=f.source,v=_(n,"response.json"),D=E(v)?A(v):null,N=D===null?null:Oe(D),ae=l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'deliveries'").get()===void 0?null:l(e,"SELECT delivery_id FROM deliveries WHERE idempotency_key = ?").get(`human-action:${P(b(),s.name)}`),$=_(n,"action.json"),M=_(n,"progress.json"),L=_(n,"feedback-comments.json"),k=_(n,"reply-route.json"),T=E(L)?A(L):null;if(T!==null&&(typeof T!="object"||typeof T.companionNodeId<"u"&&typeof T.companionNodeId!="string"))throw new Error(`corrupt required input: ${L}`);const I=E(k)?A(k):null;if(I!==null&&(typeof I!="object"||typeof I.bridge_node_id!="string"))throw new Error(`corrupt required input: ${k}`);const X=I?.bridge_node_id,F=(typeof X!="string"||l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'nodes'").get()===void 0?null:l(e,"SELECT parent FROM nodes WHERE node_id = ?").get(X))?.parent??(typeof S?.nodeId=="string"?S.nodeId:null),W=T?.companionNodeId,J=typeof S?.emittedAt=="string"?S.emittedAt:pe(o).mtime.toISOString(),B=D===null?null:JSON.stringify(D),de=se(e,{requestId:s.name,requesterNodeId:F,kind:"page",outcome:N?.outcome??null,resultJson:B,settledAt:N?.settledAt??null,requestDir:n}),ce=ie(e,W??null,N?.outcome??null)?N?.settledAt??null:null,K=C(s.name);R(K,{recursive:!0,mode:448}),t.run(s.name,"page",P(b(),s.name),K,g,F,W??null,null,N===null?"open":"settled",N?.outcome??null,y.inbox?1:0,y.inbox||y.reply?1:0,f.title,f.subtitle??null,null,JSON.stringify(f),E($)?JSON.stringify(A($)):null,E(M)&&N===null?JSON.stringify(A(M)):null,T===null?null:JSON.stringify(T),B,null,null,J,null,null,N?.settledAt??null,de,ae?.delivery_id??null,null,null,ce,J)}const i=l(e,"SELECT request_id FROM human_requests WHERE state = 'settled' AND result_json IS NULL").get();if(i!==void 0)throw new Error(`human request migration produced terminal row without result: ${i.request_id}`);if(l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get()!==void 0){const s=l(e,"SELECT review_id FROM review_comments WHERE review_id NOT IN (SELECT request_id FROM human_requests WHERE kind = 'review') LIMIT 1").get();if(s!==void 0)throw new Error(`review comment has no migrated review request: ${s.review_id}`)}}r(xt,"migrateHumanRequestsState");export{ne as NOT_OTHER_APP_QUESTION,De as askingNodeSql,Tt as cancelBindingRequest,st as commitBindingRequest,rt as createPageRequest,ht as firstInvalidPageSpecification,ot as getRequest,ct as getRequestByCompanion,dt as getRequestByDirectory,ut as getRequestByIdempotencyKey,at as getRequestByInboxTicket,pt as hasOpenReplyBearingRequestByRequester,Nt as hasPageResultException,ee as humanRequestsRoot,ft as listBindingRequests,lt as listOpenInboxRequests,mt as listOpenReplyBearingRequests,_t as listPendingAsks,gt as listRequests,yt as listSubmitRequestedRequests,Et as listUnprojectedReviews,Ot as markCompanionRetired,Dt as markProjected,It as markProjectionError,xt as migrateHumanRequestsState,qt as openRequest,Ie as openRequestsByRequester,it as presentationDir,te as publishPageRevision,Lt as readAnchorBase,kt as replaceAnchorBaseLocked,C as requestDir,bt as requestSubmit,Rt as revisePageRequest,wt as setSettlementDeliveryMarksLocked,At as setSubmitNoteDeliveryLocked,St as settleRequestLocked,vt as writeProgress};
@@ -1,3 +1,3 @@
1
- var be=Object.defineProperty;var u=(e,t)=>be(e,"name",{value:t,configurable:!0});import{randomUUID as ve}from"node:crypto";import{streamSimple as we}from"@earendil-works/pi-ai/compat";import{expandModelCandidates as ie,parseModelSpec as se,probeRouteAvailability as xe}from"../model-routes.js";import{readMergedLaunchConfig as ae}from"../config.js";import{openModelRegistry as ke}from"../runtime/model-registry.js";import{MAX_RATE_LIMIT_COOLDOWN_MS as de,coolingUntilFor as le,isManagedProvider as H,markSubscriptionRateLimited as je,markSubscriptionSuccess as Me,readSubscriptionPool as Ae,retryAfterMsFromHeaders as K,retryAfterMsFromError as qe,refreshSubscriptionCredential as $e,subscriptionNeedsSuccessWrite as Re}from"../subscription-state.js";import{classifyRateLimit as Ie,describeRateLimitScope as ce,rateLimitHeaders as Ce}from"../rate-limit-scope.js";import{RunError as i}from"../runs/operations.js";import{recognizeProviderError as Y}from"../provider-error-recognition.js";import{isSafetyRefusal as Se}from"./refusal.js";import{assertUnderCap as Oe,recordModelUsage as ue}from"../usage/ledger.js";import{outboundToken as Le}from"../providers/mint.js";import{discardFile as Ee}from"../providers/token-cache.js";import{ProviderError as Ne}from"../providers/errors.js";import{appCandidates as De}from"./app-rungs.js";function Fe(e){return typeof e=="string"||e===null||Array.isArray(e)&&e.every(t=>t&&typeof t=="object"&&(t.type==="text"&&typeof t.text=="string"||t.type==="image_url"&&typeof t.image_url?.url=="string"&&/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/]+={0,2}$/.test(t.image_url.url)))}u(Fe,"validContent");function fe(e){return Array.isArray(e)?e.map(t=>{if(t.type==="text")return t;const[,n,r]=/^data:(image\/(?:png|jpeg|gif|webp));base64,(.*)$/.exec(t.image_url.url);return{type:"image",mimeType:n,data:r}}):e??""}u(fe,"imageContent");function Te(e,t){const n=(e instanceof Error?e.message:String(e)).split("; stack=",1)[0],r=Y({message:n}).kind;return r!=="connection"&&r!=="connection-only"?e:new i(503,"upstream_model_unavailable",n.slice(0,500),void 0,{served_model:t})}u(Te,"refreshFailure");function lt(e){if(!e||typeof e!="object"||Array.isArray(e))throw new i(400,"invalid_request","body must be an object");const t=e;if(!Array.isArray(t.messages)||!t.messages.every(n=>n&&typeof n=="object"&&["system","user","assistant","tool"].includes(n.role)&&Fe(n.content)))throw new i(400,"invalid_request","messages must be chat messages","messages");if(t.messages.some(n=>["system","assistant"].includes(n.role)&&typeof n.content!="string"&&n.content!==null))throw new i(400,"invalid_request","system and assistant content must be text","messages");if(t.model!==void 0&&typeof t.model!="string")throw new i(400,"invalid_request","model must be a string","model");if(t.model_policy!==void 0&&!["exact","substitute"].includes(t.model_policy))throw new i(400,"invalid_request","invalid model_policy","model_policy");if(t.payer!==void 0&&!["user","app"].includes(t.payer))throw new i(400,"invalid_request","invalid payer","payer");if(t.reasoning_effort!==void 0&&!["minimal","low","medium","high","xhigh","max"].includes(t.reasoning_effort))throw new i(400,"invalid_request","invalid reasoning_effort","reasoning_effort");if(t.stream!==void 0&&typeof t.stream!="boolean")throw new i(400,"invalid_request","stream must be boolean","stream");if(t.tools!==void 0&&(!Array.isArray(t.tools)||!t.tools.every(n=>n?.type==="function"&&typeof n.function?.name=="string"&&n.function.name.length>0&&(n.function.description===void 0||typeof n.function.description=="string")&&(n.function.parameters===void 0||n.function.parameters!==null&&typeof n.function.parameters=="object"&&!Array.isArray(n.function.parameters)&&n.function.parameters.type==="object"))))throw new i(400,"invalid_request","invalid tools","tools");if(t.tool_choice!==void 0&&t.tool_choice!=="auto"&&t.tool_choice!=="none"&&t.tool_choice!=="required"&&(typeof t.tool_choice!="object"||t.tool_choice===null||t.tool_choice.type!=="function"||typeof t.tool_choice.function?.name!="string"))throw new i(400,"invalid_request","invalid tool_choice","tool_choice");if(t.messages.some(n=>n.role==="assistant"&&n.tool_calls!==void 0&&(!Array.isArray(n.tool_calls)||!n.tool_calls.every(r=>r&&typeof r.id=="string"&&typeof r.function?.name=="string"&&typeof r.function.arguments=="string"&&Pe(r.function.arguments)))))throw new i(400,"invalid_request","invalid assistant tool_calls","messages");if(t.stop!==void 0&&!(typeof t.stop=="string"||Array.isArray(t.stop)&&t.stop.every(n=>typeof n=="string")))throw new i(400,"invalid_request","invalid stop","stop");if(t.seed!==void 0&&!Number.isSafeInteger(t.seed))throw new i(400,"invalid_request","invalid seed","seed");for(const[n,r]of[["temperature",t.temperature],["top_p",t.top_p],["max_tokens",t.max_tokens]])if(r!==void 0&&(typeof r!="number"||!Number.isFinite(r)||n==="temperature"&&(r<0||r>2)||n==="top_p"&&(r<0||r>1)||n==="max_tokens"&&(!Number.isSafeInteger(r)||r<1)))throw new i(400,"invalid_request",`invalid ${n}`,n);if(t.response_format!==void 0){const n=t.response_format;if(!n||typeof n!="object"||Array.isArray(n)||!["text","json_object","json_schema"].includes(n.type)||n.type==="json_schema"&&(typeof n.json_schema?.name!="string"||!n.json_schema.name||!n.json_schema.schema||typeof n.json_schema.schema!="object"||Array.isArray(n.json_schema.schema)))throw new i(400,"invalid_request","invalid response_format","response_format")}if(t.metadata!==void 0&&Buffer.byteLength(JSON.stringify(t.metadata)??"")>4096)throw new i(400,"invalid_request","metadata exceeds 4 KB","metadata");return t}u(lt,"parseLlmRequest");function Pe(e){try{const t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)}catch{return!1}}u(Pe,"isJsonObject");function Ue(e){const t=Date.now(),n=e.messages.map(s=>s.role==="system"?{role:"system",content:s.content??"",timestamp:t}:s.role==="tool"?{role:"toolResult",toolCallId:s.tool_call_id??"",toolName:"",content:typeof s.content=="string"||s.content===null?[{type:"text",text:s.content??""}]:fe(s.content),isError:!1,timestamp:t}:s.role==="assistant"?{role:"assistant",content:[...s.content?[{type:"text",text:s.content}]:[],...(s.tool_calls??[]).map(g=>({type:"toolCall",id:g.id,name:g.function.name,arguments:JSON.parse(g.function.arguments)}))],api:"openai-completions",provider:"openai",model:e.model??"",usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:t}:{role:"user",content:fe(s.content),timestamp:t}),r=n.findIndex(s=>s.role!=="system"),w=n.slice(0,r<0?n.length:r).map(s=>s.content),y=w.join(`
1
+ var be=Object.defineProperty;var u=(e,t)=>be(e,"name",{value:t,configurable:!0});import{randomUUID as ve}from"node:crypto";import{streamSimple as we}from"@earendil-works/pi-ai/compat";import{APP_FAMILY as xe,expandModelCandidates as ie,parseModelSpec as se,probeRouteAvailability as ke}from"../model-routes.js";import{readMergedLaunchConfig as ae}from"../config.js";import{openModelRegistry as Me}from"../runtime/model-registry.js";import{MAX_RATE_LIMIT_COOLDOWN_MS as de,coolingUntilFor as le,isManagedProvider as H,markSubscriptionRateLimited as je,markSubscriptionSuccess as Ae,readSubscriptionPool as qe,retryAfterMsFromHeaders as K,retryAfterMsFromError as $e,refreshSubscriptionCredential as Re,subscriptionNeedsSuccessWrite as Ie}from"../subscription-state.js";import{classifyRateLimit as Ce,describeRateLimitScope as ce,rateLimitHeaders as Se}from"../rate-limit-scope.js";import{RunError as i}from"../runs/operations.js";import{recognizeProviderError as V}from"../provider-error-recognition.js";import{isSafetyRefusal as Oe}from"./refusal.js";import{assertUnderCap as Le,recordModelUsage as ue}from"../usage/ledger.js";import{outboundToken as Ee}from"../providers/mint.js";import{discardFile as Fe}from"../providers/token-cache.js";import{ProviderError as Ne}from"../providers/errors.js";import{appCandidates as De}from"./app-rungs.js";function Pe(e){return typeof e=="string"||e===null||Array.isArray(e)&&e.every(t=>t&&typeof t=="object"&&(t.type==="text"&&typeof t.text=="string"||t.type==="image_url"&&typeof t.image_url?.url=="string"&&/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/]+={0,2}$/.test(t.image_url.url)))}u(Pe,"validContent");function fe(e){return Array.isArray(e)?e.map(t=>{if(t.type==="text")return t;const[,n,r]=/^data:(image\/(?:png|jpeg|gif|webp));base64,(.*)$/.exec(t.image_url.url);return{type:"image",mimeType:n,data:r}}):e??""}u(fe,"imageContent");function Te(e,t){const n=(e instanceof Error?e.message:String(e)).split("; stack=",1)[0],r=V({message:n}).kind;return r!=="connection"&&r!=="connection-only"?e:new i(503,"upstream_model_unavailable",n.slice(0,500),void 0,{served_model:t})}u(Te,"refreshFailure");function ct(e){if(!e||typeof e!="object"||Array.isArray(e))throw new i(400,"invalid_request","body must be an object");const t=e;if(!Array.isArray(t.messages)||!t.messages.every(n=>n&&typeof n=="object"&&["system","user","assistant","tool"].includes(n.role)&&Pe(n.content)))throw new i(400,"invalid_request","messages must be chat messages","messages");if(t.messages.some(n=>["system","assistant"].includes(n.role)&&typeof n.content!="string"&&n.content!==null))throw new i(400,"invalid_request","system and assistant content must be text","messages");if(t.model!==void 0&&typeof t.model!="string")throw new i(400,"invalid_request","model must be a string","model");if(t.model_policy!==void 0&&!["exact","substitute"].includes(t.model_policy))throw new i(400,"invalid_request","invalid model_policy","model_policy");if(t.payer!==void 0&&!["user","app"].includes(t.payer))throw new i(400,"invalid_request","invalid payer","payer");if(t.reasoning_effort!==void 0&&!["minimal","low","medium","high","xhigh","max"].includes(t.reasoning_effort))throw new i(400,"invalid_request","invalid reasoning_effort","reasoning_effort");if(t.stream!==void 0&&typeof t.stream!="boolean")throw new i(400,"invalid_request","stream must be boolean","stream");if(t.tools!==void 0&&(!Array.isArray(t.tools)||!t.tools.every(n=>n?.type==="function"&&typeof n.function?.name=="string"&&n.function.name.length>0&&(n.function.description===void 0||typeof n.function.description=="string")&&(n.function.parameters===void 0||n.function.parameters!==null&&typeof n.function.parameters=="object"&&!Array.isArray(n.function.parameters)&&n.function.parameters.type==="object"))))throw new i(400,"invalid_request","invalid tools","tools");if(t.tool_choice!==void 0&&t.tool_choice!=="auto"&&t.tool_choice!=="none"&&t.tool_choice!=="required"&&(typeof t.tool_choice!="object"||t.tool_choice===null||t.tool_choice.type!=="function"||typeof t.tool_choice.function?.name!="string"))throw new i(400,"invalid_request","invalid tool_choice","tool_choice");if(t.messages.some(n=>n.role==="assistant"&&n.tool_calls!==void 0&&(!Array.isArray(n.tool_calls)||!n.tool_calls.every(r=>r&&typeof r.id=="string"&&typeof r.function?.name=="string"&&typeof r.function.arguments=="string"&&Ue(r.function.arguments)))))throw new i(400,"invalid_request","invalid assistant tool_calls","messages");if(t.stop!==void 0&&!(typeof t.stop=="string"||Array.isArray(t.stop)&&t.stop.every(n=>typeof n=="string")))throw new i(400,"invalid_request","invalid stop","stop");if(t.seed!==void 0&&!Number.isSafeInteger(t.seed))throw new i(400,"invalid_request","invalid seed","seed");for(const[n,r]of[["temperature",t.temperature],["top_p",t.top_p],["max_tokens",t.max_tokens]])if(r!==void 0&&(typeof r!="number"||!Number.isFinite(r)||n==="temperature"&&(r<0||r>2)||n==="top_p"&&(r<0||r>1)||n==="max_tokens"&&(!Number.isSafeInteger(r)||r<1)))throw new i(400,"invalid_request",`invalid ${n}`,n);if(t.response_format!==void 0){const n=t.response_format;if(!n||typeof n!="object"||Array.isArray(n)||!["text","json_object","json_schema"].includes(n.type)||n.type==="json_schema"&&(typeof n.json_schema?.name!="string"||!n.json_schema.name||!n.json_schema.schema||typeof n.json_schema.schema!="object"||Array.isArray(n.json_schema.schema)))throw new i(400,"invalid_request","invalid response_format","response_format")}if(t.metadata!==void 0&&Buffer.byteLength(JSON.stringify(t.metadata)??"")>4096)throw new i(400,"invalid_request","metadata exceeds 4 KB","metadata");return t}u(ct,"parseLlmRequest");function Ue(e){try{const t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)}catch{return!1}}u(Ue,"isJsonObject");function Je(e){const t=Date.now(),n=e.messages.map(a=>a.role==="system"?{role:"system",content:a.content??"",timestamp:t}:a.role==="tool"?{role:"toolResult",toolCallId:a.tool_call_id??"",toolName:"",content:typeof a.content=="string"||a.content===null?[{type:"text",text:a.content??""}]:fe(a.content),isError:!1,timestamp:t}:a.role==="assistant"?{role:"assistant",content:[...a.content?[{type:"text",text:a.content}]:[],...(a.tool_calls??[]).map(g=>({type:"toolCall",id:g.id,name:g.function.name,arguments:JSON.parse(g.function.arguments)}))],api:"openai-completions",provider:"openai",model:e.model??"",usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:t}:{role:"user",content:fe(a.content),timestamp:t}),r=n.findIndex(a=>a.role!=="system"),k=n.slice(0,r<0?n.length:r).map(a=>a.content),_=k.join(`
2
2
 
3
- `),l=e.tools?.map(({function:s})=>({name:s.name,description:s.description??"",parameters:s.parameters??{type:"object",properties:{}}}));return{...y?{systemPrompt:y}:{},messages:n.slice(w.length),...l?{tools:l}:{}}}u(Ue,"contextOf");function me(e,t,n,r){if(!e){const y=ae(n,r),l=Object.values({...y.modelRoutes??{},...y.legacyModelRoutes??{}}),s=l.length?[y.modelLadders.defaultProvider,...y.modelRouting?.familyOrder??[],...l.map(g=>g.family)].find(g=>l.some(E=>E.family===g)):y.modelLadders.defaultProvider??"anthropic";return{kind:"logical",family:s,strength:"strong",spec:`${s}/strong`}}const w=/^([^/]+)\/(ultra|strong|medium|light)$/.exec(e);return w?{kind:"logical",family:w[1],strength:w[2],spec:e}:{kind:t==="exact"?"exact":"concrete",spec:e}}u(me,"requestFor");function Je(e,t){const{input:n,output:r,cacheRead:w,cacheWrite:y}=e.cost;return n===0&&r===0&&w===0&&y===0?null:Number.isFinite(t)&&t>=0?t:null}u(Je,"usdEquivalent");function We(e,t){return e.compat?.allowedFallbackModels?.find(r=>r.provider===e.provider&&r.model===t)}u(We,"allowedFallback");function ct(e){return e?{payer:e.payer??"user",sub:e.sub,grantee:e.grantee,inference_endpoint:e.inference_endpoint??null}:void 0}u(ct,"llmCallerOf");function He(e){return e instanceof Ne?e.code==="server_error"?new i(503,"upstream_model_unavailable",e.message):new i(404,"model_unavailable",e.message):e}u(He,"mintFailure");const Ke=/\bmodel is not supported when using Codex with a ChatGPT account\b/i;function ze(e,t,n){if(!(e!=="openai-codex"||t===void 0||!Ke.test(t)))return new i(404,"model_unavailable",t,void 0,{served_model:n})}u(ze,"codexAccountModelRejection");async function ut(e,t,n,r,w,y){const l=y?.payer==="app"?y:void 0;if(e.payer==="app"&&!l)throw new i(403,"payer_not_app","this grant is not app-paid");if(e.payer==="user"&&l)throw new i(400,"invalid_request","this grant is app-paid; payer cannot be user","payer");if(l&&!l.inference_endpoint)throw new i(404,"model_unavailable",`${l.grantee} is app-paid but its grant carries no inference endpoint`);const s=l?.inference_endpoint??void 0;l||await Oe(w);const g=await ke(),E=u(c=>c.routeId!=="concrete"&&c.routeId!=="exact","configured"),ee=u(c=>{const h=g.find(c.providerId,c.modelId);return h!==void 0&&(!e.reasoning_effort||h.reasoning)&&(e.seed===void 0&&e.response_format===void 0||h.api==="openai-completions")&&(e.stop===void 0||["openai-completions","anthropic-messages"].includes(h.api))},"matchesFeatures"),pe=u(()=>{const c=me(e.model,e.model_policy,r?.cwd,r?.profileId),h=ie(c.kind==="exact"?{kind:"concrete",spec:c.spec}:c,r?.cwd,r?.profileId).filter(E);let a;if(c.kind==="logical")a=e.model_policy==="exact"?h.filter(m=>m.family===c.family&&m.strength===c.strength).slice(0,1):h;else{const m=se(c.spec),q=h.filter(j=>j.providerId===m?.providerId&&j.modelId===m.modelId&&(e.model_policy!=="exact"||j.thinkingLevel===m.thinkingLevel)&&ee(j));if(e.model_policy==="exact")a=q.slice(0,1);else if(q.length)a=q;else{const j=ae(r?.cwd,r?.profileId),x=[...Object.values(j.modelRoutes??{}).flatMap(v=>Object.entries(v.models)),...[j.modelLadders.anthropic,j.modelLadders.openai].flatMap(v=>Object.entries(v))].find(([,v])=>v===c.spec)?.[0],f=me(void 0,"substitute",r?.cwd,r?.profileId);a=x&&f.kind==="logical"?ie({...f,strength:x,spec:c.spec},r?.cwd,r?.profileId).filter(v=>E(v)&&v.strength===x):[]}}return a},"ownerCandidates");let R;if(s?R=De(s,e.model,e.model_policy==="exact").flatMap((c,h)=>{const a=se(c.model);return a?[{routeId:"app",credentialSource:"app",family:"app",strength:c.strength,...a,rank:h}]:[]}):R=pe(),R=R.filter(ee),R.length===0)throw e.model_policy==="exact"?new i(400,"substitution_refused","no eligible model route is configured"):new i(404,"model_unavailable","no eligible model route is configured");const te=`chatcmpl-${ve()}`;let I=1/0,b,z;for(const c of R){if(!l&&!xe(c,g).authenticated)continue;const h=g.find(c.providerId,c.modelId);if(!h)continue;const a=s?{...h,baseUrl:`${s.base_url}/${h.provider}`}:h,m=c.providerId,q=!l&&H(m)?Ae(m).filter(x=>!x.authFailure):[],j=q.filter(x=>le(x,a.id)<=Date.now());if(q.length&&!j.length){const x=Math.min(...q.map(f=>le(f,a.id)));x<I&&(I=x,z=`${a.provider}/${a.id}`);continue}const oe=l?[void 0,void 0]:q.length?j:[void 0];for(const[x,f]of oe.entries()){const v=Date.now();let ne=f?.access;if(f&&f.expires<=Date.now()&&H(m)){const o=g.getProvider(m)?.auth.oauth;if(!o)throw new i(503,"upstream_model_unavailable",`no OAuth refresh for ${m}`,void 0,{served_model:`${a.provider}/${a.id}`});ne=(await $e(m,f.label,async(k,re)=>{const W=await o.refresh({type:"oauth",refresh:k,access:"",expires:0,...re?{clientId:re}:{}},t??new AbortController().signal).catch(ge=>{throw Te(ge,`${a.provider}/${a.id}`)}),V=W.clientId;return{refresh:W.refresh,access:W.access,expires:W.expires,...typeof V=="string"&&V?{clientId:V}:{}}})).access}const he=Ue(e);let N;if(l&&s)try{N=await Le({audience:s.base_url,sub:l.sub,grantee:l.grantee,initiating_app:l.grantee,scope:["crtr:llm"]},{signal:t})}catch(o){throw He(o)}const C=f||l?void 0:await g.getApiKeyAndHeaders(a);if(C&&!C.ok)continue;const p=`${a.provider}/${a.id}`,S=e.model??p;let A=!1,L,M=3e4,$;const B=[],X=[],D=[];let d,F;const T=u((o,_=null)=>({id:te,object:"chat.completion.chunk",created:Math.floor(v/1e3),model:p,served_model:p,requested_model:S,substituted:S!==p&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(S),choices:[{index:0,delta:o,finish_reason:_}]}),"chunk"),P=u(o=>{B.push(o),n?.(o)},"emit"),_e=we(a,he,{apiKey:N?.access_token??ne??(C?.ok?C.apiKey:void 0),...C?.ok?{headers:C.headers}:{},signal:t,reasoning:e.reasoning_effort??c.thinkingLevel,...e.temperature!==void 0?{temperature:e.temperature}:{},...e.max_tokens!==void 0?{maxTokens:e.max_tokens}:{},...e.top_p!==void 0?{samplingParams:{top_p:e.top_p}}:{},...e.tool_choice==="none"?{toolChoice:"none"}:{},onPayload:u(o=>{if(!o||typeof o!="object")return;const _=e.tool_choice,k=_==="required"?a.api==="anthropic-messages"?{type:"any"}:"required":typeof _=="object"&&_!==null?a.api==="anthropic-messages"?{type:"tool",name:_.function.name}:_:void 0;return{...o,...k?{tool_choice:k}:{},...e.stop!==void 0?{[a.api==="anthropic-messages"?"stop_sequences":"stop"]:typeof e.stop=="string"?[e.stop]:e.stop}:{},...e.seed!==void 0?{seed:e.seed}:{},...e.response_format!==void 0?{response_format:e.response_format}:{}}},"onPayload"),fetch:u(async(o,_)=>{const k=await fetch(o,_);return L=k.status,k.status===429&&(A=!0,$=k.headers,M=K(k.headers)??15e3),k},"fetch"),onResponse:u(o=>{o.status===429&&(A=!0,$=o.headers,M=K(o.headers)??15e3)},"onResponse")});try{for await(const o of _e)o.type==="text_delta"&&(X.push(o.delta),P(T({content:o.delta}))),o.type==="thinking_delta"&&(D.push(o.delta),P(T({reasoning_content:o.delta}))),o.type==="done"&&(d=o.message),o.type==="error"&&(d=o.error)}catch(o){const _=qe(o);$===void 0&&o&&typeof o=="object"&&"headers"in o&&Object.keys(Ce(o.headers)).length&&($=o.headers);const k=Y({status:o&&typeof o=="object"&&"status"in o?o.status:void 0,message:o instanceof Error?o.message:String(o)});if(l)F=o;else{if(!A&&k.kind!=="rate-limit")throw B.length?new i(503,"upstream_model_unavailable",o instanceof Error?o.message:String(o),void 0,{served_model:p}):o;A=!0,M=_??M}}if(l){if(L===401){if(N&&Ee(N.key),x===0)continue;throw new i(404,"model_unavailable",`${s.base_url} refuses this runtime's tokens`,void 0,{served_model:p})}if(A&&K($)===void 0)throw new i(503,"upstream_model_unavailable",`${p} was rate-limited without a retry-after`,void 0,{served_model:p});if(!A&&(F!==void 0||L!==void 0&&L>=500))throw new i(503,"upstream_model_unavailable",F instanceof Error?F.message:d?.errorMessage??"inference endpoint failed",void 0,{served_model:p})}if(!A&&d?.stopReason==="error"&&Y({message:d.errorMessage}).kind==="rate-limit"&&(A=!0,M=15e3),A){const o=Ie($,a.id);if(K($)===void 0&&o.resetAt!==void 0&&(M=Math.max(M,o.resetAt-Date.now())),b={provider:m,model:a.id,...f?{account:f.label}:{},observation:o},console.error(`[llm] 429 from ${p}${f?` account "${f.label}"`:""}: scope=${ce(o.scope)} retry_after_ms=${M} headers=${JSON.stringify(o.headers)}`),f&&H(m)&&await je(m,f.label,M,v,Date.now(),o.scope),Date.now()+Math.min(M,de)<I&&(I=Date.now()+Math.min(M,de),z=p),X.length||D.length)throw new i(503,"service_unavailable","vendor rate limit after output began",void 0,{served_model:p});if(l)break;continue}const U=Se(d);if(L===400&&e.tool_choice!==void 0&&e.tool_choice!=="auto"&&e.tool_choice!=="none"&&/\btool[_ ]choice\b/i.test(d?.errorMessage??"")&&/not supported|does not support|unsupported|cannot|must be auto/i.test(d?.errorMessage??""))throw new i(400,"invalid_request",d.errorMessage,"tool_choice",{served_model:p});if(d?.stopReason==="error"){const o=ze(a.provider,d.errorMessage,p);if(o)throw o}if(!d||d.stopReason==="error"&&!U||d.stopReason==="aborted")throw new i(503,"upstream_model_unavailable",d?.errorMessage??"model request failed",void 0,{served_model:p});f&&H(m)&&Re(f,a.id)&&await Me(m,f.label,v,a.id);const G=d.content.filter(o=>o.type==="toolCall").map(o=>({id:o.id,type:"function",function:{name:o.name,arguments:JSON.stringify(o.arguments)}})),Z=U?"content_filter":d.stopReason==="toolUse"?"tool_calls":d.stopReason==="length"?"length":"stop",Q=d.responseModel?We(a,d.responseModel):void 0,O=Q?`${a.provider}/${Q.model}`:p,J={prompt_tokens:d.usage.input,completion_tokens:d.usage.output,total_tokens:d.usage.totalTokens,cache_read_tokens:d.usage.cacheRead,cache_write_tokens:d.usage.cacheWrite,usd_equivalent:Je(Q??a,d.usage.cost.total),served_model:O};l?await ue(l.grantee,"app",O,d.usage,J.usd_equivalent):w&&await ue(w.grantee,"user",O,d.usage,J.usd_equivalent);const ye={id:te,object:"chat.completion",created:Math.floor(v/1e3),model:O,served_model:O,requested_model:S,substituted:S!==O&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(S),choices:[{index:0,message:{role:"assistant",content:X.join("")||null,...D.length?{reasoning_content:D.join("")}:{},...G.length?{tool_calls:G}:{},...U?{refusal:d.errorMessage??"Content filtered"}:{}},finish_reason:Z}],usage:J,...e.metadata!==void 0?{metadata:e.metadata}:{}};for(const[o,_]of G.entries())P(T({tool_calls:[{index:o,..._}]}));return P({...T({},Z),...U?{choices:[{index:0,delta:{},finish_reason:Z,message:{refusal:d.errorMessage??"Content filtered"}}]}:{},usage:J}),{completion:ye,chunks:B}}}throw I!==1/0?new i(429,"all_routes_exhausted","all eligible model routes are rate-limited",void 0,{retry_after_s:Math.max(1,Math.ceil((I-Date.now())/1e3)),served_model:b?`${b.provider}/${b.model}`:z,...b?{rate_limit:{provider:b.provider,model:b.model,...b.account?{account:b.account}:{},scope:ce(b.observation.scope),...b.observation.claim?{claim:b.observation.claim}:{},headers:b.observation.headers}}:{}},void 0,!0):e.model_policy==="exact"?new i(400,"substitution_refused","the requested model is unavailable"):new i(404,"model_unavailable","no usable model route is available")}u(ut,"runLlm");export{ct as llmCallerOf,lt as parseLlmRequest,ut as runLlm};
3
+ `),s=e.tools?.map(({function:a})=>({name:a.name,description:a.description??"",parameters:a.parameters??{type:"object",properties:{}}}));return{..._?{systemPrompt:_}:{},messages:n.slice(k.length),...s?{tools:s}:{}}}u(Je,"contextOf");function me(e,t,n,r){const k=u(()=>{const s=ae(n,r),a=Object.values({...s.modelRoutes??{},...s.legacyModelRoutes??{}});return a.length?[s.modelLadders.defaultProvider,...s.modelRouting?.familyOrder??[],...a.map(g=>g.family)].find(g=>a.some(E=>E.family===g)):s.modelLadders.defaultProvider??"anthropic"},"ownerFamily");if(!e){const s=k();return{kind:"logical",family:s,strength:"strong",spec:`${s}/strong`}}const _=/^([^/]+)\/(ultra|strong|medium|light)$/.exec(e);if(_){if(_[1]===xe){const s=k();return{kind:"logical",family:s,strength:_[2],spec:`${s}/${_[2]}`}}return{kind:"logical",family:_[1],strength:_[2],spec:e}}return{kind:t==="exact"?"exact":"concrete",spec:e}}u(me,"requestFor");function We(e,t){const{input:n,output:r,cacheRead:k,cacheWrite:_}=e.cost;return n===0&&r===0&&k===0&&_===0?null:Number.isFinite(t)&&t>=0?t:null}u(We,"usdEquivalent");function He(e,t){return e.compat?.allowedFallbackModels?.find(r=>r.provider===e.provider&&r.model===t)}u(He,"allowedFallback");function ut(e){return e?{payer:e.payer??"user",sub:e.sub,grantee:e.grantee,inference_endpoint:e.inference_endpoint??null}:void 0}u(ut,"llmCallerOf");function Ke(e){return e instanceof Ne?e.code==="server_error"?new i(503,"upstream_model_unavailable",e.message):new i(404,"model_unavailable",e.message):e}u(Ke,"mintFailure");const ze=/\bmodel is not supported when using Codex with a ChatGPT account\b/i;function Be(e,t,n){if(!(e!=="openai-codex"||t===void 0||!ze.test(t)))return new i(404,"model_unavailable",t,void 0,{served_model:n})}u(Be,"codexAccountModelRejection");async function ft(e,t,n,r,k,_){const s=_?.payer==="app"?_:void 0;if(e.payer==="app"&&!s)throw new i(403,"payer_not_app","this grant is not app-paid");if(e.payer==="user"&&s)throw new i(400,"invalid_request","this grant is app-paid; payer cannot be user","payer");if(s&&!s.inference_endpoint)throw new i(404,"model_unavailable",`${s.grantee} is app-paid but its grant carries no inference endpoint`);const a=s?.inference_endpoint??void 0;s||await Le(k);const g=await Me(),E=u(c=>c.routeId!=="concrete"&&c.routeId!=="exact","configured"),ee=u(c=>{const h=g.find(c.providerId,c.modelId);return h!==void 0&&(!e.reasoning_effort||h.reasoning)&&(e.seed===void 0&&e.response_format===void 0||h.api==="openai-completions")&&(e.stop===void 0||["openai-completions","anthropic-messages"].includes(h.api))},"matchesFeatures"),pe=u(()=>{const c=me(e.model,e.model_policy,r?.cwd,r?.profileId),h=ie(c.kind==="exact"?{kind:"concrete",spec:c.spec}:c,r?.cwd,r?.profileId).filter(E);let d;if(c.kind==="logical")d=e.model_policy==="exact"?h.filter(m=>m.family===c.family&&m.strength===c.strength).slice(0,1):h;else{const m=se(c.spec),q=h.filter(M=>M.providerId===m?.providerId&&M.modelId===m.modelId&&(e.model_policy!=="exact"||M.thinkingLevel===m.thinkingLevel)&&ee(M));if(e.model_policy==="exact")d=q.slice(0,1);else if(q.length)d=q;else{const M=ae(r?.cwd,r?.profileId),w=[...Object.values(M.modelRoutes??{}).flatMap(v=>Object.entries(v.models)),...[M.modelLadders.anthropic,M.modelLadders.openai].flatMap(v=>Object.entries(v))].find(([,v])=>v===c.spec)?.[0],f=me(void 0,"substitute",r?.cwd,r?.profileId);d=w&&f.kind==="logical"?ie({...f,strength:w,spec:c.spec},r?.cwd,r?.profileId).filter(v=>E(v)&&v.strength===w):[]}}return d},"ownerCandidates");let R;if(a?R=De(a,e.model,e.model_policy==="exact").flatMap((c,h)=>{const d=se(c.model);return d?[{routeId:"app",credentialSource:"app",family:"app",strength:c.strength,...d,rank:h}]:[]}):R=pe(),R=R.filter(ee),R.length===0)throw e.model_policy==="exact"?new i(400,"substitution_refused","no eligible model route is configured"):new i(404,"model_unavailable","no eligible model route is configured");const te=`chatcmpl-${ve()}`;let I=1/0,b,z;for(const c of R){if(!s&&!ke(c,g).authenticated)continue;const h=g.find(c.providerId,c.modelId);if(!h)continue;const d=a?{...h,baseUrl:`${a.base_url}/${h.provider}`}:h,m=c.providerId,q=!s&&H(m)?qe(m).filter(w=>!w.authFailure):[],M=q.filter(w=>le(w,d.id)<=Date.now());if(q.length&&!M.length){const w=Math.min(...q.map(f=>le(f,d.id)));w<I&&(I=w,z=`${d.provider}/${d.id}`);continue}const oe=s?[void 0,void 0]:q.length?M:[void 0];for(const[w,f]of oe.entries()){const v=Date.now();let ne=f?.access;if(f&&f.expires<=Date.now()&&H(m)){const o=g.getProvider(m)?.auth.oauth;if(!o)throw new i(503,"upstream_model_unavailable",`no OAuth refresh for ${m}`,void 0,{served_model:`${d.provider}/${d.id}`});ne=(await Re(m,f.label,async(x,re)=>{const W=await o.refresh({type:"oauth",refresh:x,access:"",expires:0,...re?{clientId:re}:{}},t??new AbortController().signal).catch(ge=>{throw Te(ge,`${d.provider}/${d.id}`)}),Q=W.clientId;return{refresh:W.refresh,access:W.access,expires:W.expires,...typeof Q=="string"&&Q?{clientId:Q}:{}}})).access}const he=Je(e);let F;if(s&&a)try{F=await Ee({audience:a.base_url,sub:s.sub,grantee:s.grantee,initiating_app:s.grantee,scope:["crtr:llm"]},{signal:t})}catch(o){throw Ke(o)}const C=f||s?void 0:await g.getApiKeyAndHeaders(d);if(C&&!C.ok)continue;const p=`${d.provider}/${d.id}`,S=e.model??p;let A=!1,L,j=3e4,$;const B=[],X=[],N=[];let l,D;const P=u((o,y=null)=>({id:te,object:"chat.completion.chunk",created:Math.floor(v/1e3),model:p,served_model:p,requested_model:S,substituted:S!==p&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(S),choices:[{index:0,delta:o,finish_reason:y}]}),"chunk"),T=u(o=>{B.push(o),n?.(o)},"emit"),_e=we(d,he,{apiKey:F?.access_token??ne??(C?.ok?C.apiKey:void 0),...C?.ok?{headers:C.headers}:{},signal:t,reasoning:e.reasoning_effort??c.thinkingLevel,...e.temperature!==void 0?{temperature:e.temperature}:{},...e.max_tokens!==void 0?{maxTokens:e.max_tokens}:{},...e.top_p!==void 0?{samplingParams:{top_p:e.top_p}}:{},...e.tool_choice==="none"?{toolChoice:"none"}:{},onPayload:u(o=>{if(!o||typeof o!="object")return;const y=e.tool_choice,x=y==="required"?d.api==="anthropic-messages"?{type:"any"}:"required":typeof y=="object"&&y!==null?d.api==="anthropic-messages"?{type:"tool",name:y.function.name}:y:void 0;return{...o,...x?{tool_choice:x}:{},...e.stop!==void 0?{[d.api==="anthropic-messages"?"stop_sequences":"stop"]:typeof e.stop=="string"?[e.stop]:e.stop}:{},...e.seed!==void 0?{seed:e.seed}:{},...e.response_format!==void 0?{response_format:e.response_format}:{}}},"onPayload"),fetch:u(async(o,y)=>{const x=await fetch(o,y);return L=x.status,x.status===429&&(A=!0,$=x.headers,j=K(x.headers)??15e3),x},"fetch"),onResponse:u(o=>{o.status===429&&(A=!0,$=o.headers,j=K(o.headers)??15e3)},"onResponse")});try{for await(const o of _e)o.type==="text_delta"&&(X.push(o.delta),T(P({content:o.delta}))),o.type==="thinking_delta"&&(N.push(o.delta),T(P({reasoning_content:o.delta}))),o.type==="done"&&(l=o.message),o.type==="error"&&(l=o.error)}catch(o){const y=$e(o);$===void 0&&o&&typeof o=="object"&&"headers"in o&&Object.keys(Se(o.headers)).length&&($=o.headers);const x=V({status:o&&typeof o=="object"&&"status"in o?o.status:void 0,message:o instanceof Error?o.message:String(o)});if(s)D=o;else{if(!A&&x.kind!=="rate-limit")throw B.length?new i(503,"upstream_model_unavailable",o instanceof Error?o.message:String(o),void 0,{served_model:p}):o;A=!0,j=y??j}}if(s){if(L===401){if(F&&Fe(F.key),w===0)continue;throw new i(404,"model_unavailable",`${a.base_url} refuses this runtime's tokens`,void 0,{served_model:p})}if(A&&K($)===void 0)throw new i(503,"upstream_model_unavailable",`${p} was rate-limited without a retry-after`,void 0,{served_model:p});if(!A&&(D!==void 0||L!==void 0&&L>=500))throw new i(503,"upstream_model_unavailable",D instanceof Error?D.message:l?.errorMessage??"inference endpoint failed",void 0,{served_model:p})}if(!A&&l?.stopReason==="error"&&V({message:l.errorMessage}).kind==="rate-limit"&&(A=!0,j=15e3),A){const o=Ce($,d.id);if(K($)===void 0&&o.resetAt!==void 0&&(j=Math.max(j,o.resetAt-Date.now())),b={provider:m,model:d.id,...f?{account:f.label}:{},observation:o},console.error(`[llm] 429 from ${p}${f?` account "${f.label}"`:""}: scope=${ce(o.scope)} retry_after_ms=${j} headers=${JSON.stringify(o.headers)}`),f&&H(m)&&await je(m,f.label,j,v,Date.now(),o.scope),Date.now()+Math.min(j,de)<I&&(I=Date.now()+Math.min(j,de),z=p),X.length||N.length)throw new i(503,"service_unavailable","vendor rate limit after output began",void 0,{served_model:p});if(s)break;continue}const U=Oe(l);if(L===400&&e.tool_choice!==void 0&&e.tool_choice!=="auto"&&e.tool_choice!=="none"&&/\btool[_ ]choice\b/i.test(l?.errorMessage??"")&&/not supported|does not support|unsupported|cannot|must be auto/i.test(l?.errorMessage??""))throw new i(400,"invalid_request",l.errorMessage,"tool_choice",{served_model:p});if(l?.stopReason==="error"){const o=Be(d.provider,l.errorMessage,p);if(o)throw o}if(!l||l.stopReason==="error"&&!U||l.stopReason==="aborted")throw new i(503,"upstream_model_unavailable",l?.errorMessage??"model request failed",void 0,{served_model:p});f&&H(m)&&Ie(f,d.id)&&await Ae(m,f.label,v,d.id);const G=l.content.filter(o=>o.type==="toolCall").map(o=>({id:o.id,type:"function",function:{name:o.name,arguments:JSON.stringify(o.arguments)}})),Y=U?"content_filter":l.stopReason==="toolUse"?"tool_calls":l.stopReason==="length"?"length":"stop",Z=l.responseModel?He(d,l.responseModel):void 0,O=Z?`${d.provider}/${Z.model}`:p,J={prompt_tokens:l.usage.input,completion_tokens:l.usage.output,total_tokens:l.usage.totalTokens,cache_read_tokens:l.usage.cacheRead,cache_write_tokens:l.usage.cacheWrite,usd_equivalent:We(Z??d,l.usage.cost.total),served_model:O};s?await ue(s.grantee,"app",O,l.usage,J.usd_equivalent):k&&await ue(k.grantee,"user",O,l.usage,J.usd_equivalent);const ye={id:te,object:"chat.completion",created:Math.floor(v/1e3),model:O,served_model:O,requested_model:S,substituted:S!==O&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(S),choices:[{index:0,message:{role:"assistant",content:X.join("")||null,...N.length?{reasoning_content:N.join("")}:{},...G.length?{tool_calls:G}:{},...U?{refusal:l.errorMessage??"Content filtered"}:{}},finish_reason:Y}],usage:J,...e.metadata!==void 0?{metadata:e.metadata}:{}};for(const[o,y]of G.entries())T(P({tool_calls:[{index:o,...y}]}));return T({...P({},Y),...U?{choices:[{index:0,delta:{},finish_reason:Y,message:{refusal:l.errorMessage??"Content filtered"}}]}:{},usage:J}),{completion:ye,chunks:B}}}throw I!==1/0?new i(429,"all_routes_exhausted","all eligible model routes are rate-limited",void 0,{retry_after_s:Math.max(1,Math.ceil((I-Date.now())/1e3)),served_model:b?`${b.provider}/${b.model}`:z,...b?{rate_limit:{provider:b.provider,model:b.model,...b.account?{account:b.account}:{},scope:ce(b.observation.scope),...b.observation.claim?{claim:b.observation.claim}:{},headers:b.observation.headers}}:{}},void 0,!0):e.model_policy==="exact"?new i(400,"substitution_refused","the requested model is unavailable"):new i(404,"model_unavailable","no usable model route is available")}u(ft,"runLlm");export{ut as llmCallerOf,ct as parseLlmRequest,ft as runLlm};
@@ -29,6 +29,12 @@ export declare const defaultHomeDeps: HomeDeps;
29
29
  export declare function cachedLocation(db: CanvasDb, id: string): Promise<string | null>;
30
30
  export declare function rememberLocation(db: CanvasDb, id: string, machine: string, now?: number): Promise<void>;
31
31
  export declare function dropLocation(db: CanvasDb, id: string): Promise<void>;
32
+ /** The machines a lookup asks: every runtime of the account but this one (and `skip`), or `unknown` when the directory cannot list them.
33
+ * Empty for an unjoined daemon. */
34
+ export declare function peersToAsk(deps: HomeDeps, skip?: string): Promise<Machine[] | {
35
+ where: 'unknown';
36
+ unreachable: string[];
37
+ }>;
32
38
  /** Ask every other machine "do you hold `id`?". First `here`/`moved` wins; unreachable machines are listed. */
33
39
  export declare function locate(db: CanvasDb, id: string, deps?: HomeDeps, skip?: string): Promise<HomeAnswer>;
34
40
  /** Where `id` lives. `hint` is the machine the request names (`?machine=`). */
@@ -1,2 +1,2 @@
1
- var _=Object.defineProperty;var t=(n,a)=>_(n,"name",{value:a,configurable:!0});import{getById as y}from"../graph/objects.js";import{isUnreachable as E,peerCall as b}from"./client.js";import{directoryIssuer as x,listMachines as O,normalizeMachineId as d,ownMachineId as T}from"./directory.js";import{stubOf as I}from"./stubs.js";const l={call:t((n,a)=>b(n,a),"call"),machines:O,self:T,now:Date.now,joined:t(()=>x()!==null,"joined")};async function L(n,a){return(await n.prepare("SELECT machine_id FROM peer_locations WHERE id = ?").get(a))?.machine_id??null}t(L,"cachedLocation");async function g(n,a,r,i=Date.now()){await n.prepare(`INSERT INTO peer_locations (id, machine_id, learned_at) VALUES (?, ?, ?)
2
- ON CONFLICT(id) DO UPDATE SET machine_id = excluded.machine_id, learned_at = excluded.learned_at`).run(a,r,i)}t(g,"rememberLocation");async function D(n,a){await n.prepare("DELETE FROM peer_locations WHERE id = ?").run(a)}t(D,"dropLocation");async function f(n,a,r=l,i){if(!r.joined())return{where:"nowhere"};let c;try{c=await r.machines()}catch(e){return{where:"unknown",unreachable:[`directory (${e instanceof Error?e.message:String(e)})`]}}const s=r.self(),p=c.filter(e=>e.machine_id!==s&&e.machine_id!==i&&e.kind!=="device"),m=await Promise.all(p.map(async e=>{const o=await r.call(e.machine_id,{method:"POST",path:"/v1/peer/locate",body:{id:a}});if(E(o))return{m:e,state:"unreachable"};const h=o.body;return o.status===200&&h?.answer==="here"?{m:e,state:"here",machine:e.machine_id}:o.status===200&&h?.answer==="moved"&&typeof h.machine=="string"?{m:e,state:"here",machine:d(h.machine)}:o.status===200&&h?.answer==="no"?{m:e,state:"no"}:{m:e,state:"unreachable"}})),u=m.find(e=>e.state==="here");if(u&&"machine"in u)return await g(n,a,u.machine,r.now()),{where:"machine",machine:u.machine,source:"locate"};const w=m.filter(e=>e.state==="unreachable").map(e=>e.m.name||e.m.machine_id);return w.length>0?{where:"unknown",unreachable:w}:{where:"nowhere"}}t(f,"locate");async function j(n,a,r={}){const i=await y(n,a);if(i!==null){const s=await I(n,i);return s===null?{where:"here"}:{where:"machine",machine:s.home_machine,source:"stub"}}if(!(r.deps??l).joined())return{where:"nowhere"};if(r.hint)return{where:"machine",machine:d(r.hint),source:"hint"};const c=await L(n,a);return c!==null?{where:"machine",machine:c,source:"cache"}:f(n,a,r.deps)}t(j,"homeOf");async function k(n,a,r,i=l){return await D(n,a),f(n,a,i,r)}t(k,"relocate");export{L as cachedLocation,l as defaultHomeDeps,D as dropLocation,j as homeOf,f as locate,k as relocate,g as rememberLocation};
1
+ var d=Object.defineProperty;var c=(e,n)=>d(e,"name",{value:n,configurable:!0});import{getById as p}from"../graph/objects.js";import{isUnreachable as _,peerCall as y}from"./client.js";import{directoryIssuer as E,listMachines as x,normalizeMachineId as w,ownMachineId as b}from"./directory.js";import{stubOf as O}from"./stubs.js";const l={call:c((e,n)=>y(e,n),"call"),machines:x,self:b,now:Date.now,joined:c(()=>E()!==null,"joined")};async function T(e,n){return(await e.prepare("SELECT machine_id FROM peer_locations WHERE id = ?").get(n))?.machine_id??null}c(T,"cachedLocation");async function I(e,n,a,i=Date.now()){await e.prepare(`INSERT INTO peer_locations (id, machine_id, learned_at) VALUES (?, ?, ?)
2
+ ON CONFLICT(id) DO UPDATE SET machine_id = excluded.machine_id, learned_at = excluded.learned_at`).run(n,a,i)}c(I,"rememberLocation");async function L(e,n){await e.prepare("DELETE FROM peer_locations WHERE id = ?").run(n)}c(L,"dropLocation");async function g(e,n){if(!e.joined())return[];let a;try{a=await e.machines()}catch(r){return{where:"unknown",unreachable:[`directory (${r instanceof Error?r.message:String(r)})`]}}const i=e.self();return a.filter(r=>r.machine_id!==i&&r.machine_id!==n&&r.kind!=="device")}c(g,"peersToAsk");async function f(e,n,a=l,i){const r=await g(a,i);if("where"in r)return r;const o=await Promise.all(r.map(async t=>{const h=await a.call(t.machine_id,{method:"POST",path:"/v1/peer/locate",body:{id:n}});if(_(h))return{m:t,state:"unreachable"};const s=h.body;return h.status===200&&s?.answer==="here"?{m:t,state:"here",machine:t.machine_id}:h.status===200&&s?.answer==="moved"&&typeof s.machine=="string"?{m:t,state:"here",machine:w(s.machine)}:h.status===200&&s?.answer==="no"?{m:t,state:"no"}:{m:t,state:"unreachable"}})),u=o.find(t=>t.state==="here");if(u&&"machine"in u)return await I(e,n,u.machine,a.now()),{where:"machine",machine:u.machine,source:"locate"};const m=o.filter(t=>t.state==="unreachable").map(t=>t.m.name||t.m.machine_id);return m.length>0?{where:"unknown",unreachable:m}:{where:"nowhere"}}c(f,"locate");async function C(e,n,a={}){const i=await p(e,n);if(i!==null){const o=await O(e,i);return o===null?{where:"here"}:{where:"machine",machine:o.home_machine,source:"stub"}}if(!(a.deps??l).joined())return{where:"nowhere"};if(a.hint)return{where:"machine",machine:w(a.hint),source:"hint"};const r=await T(e,n);return r!==null?{where:"machine",machine:r,source:"cache"}:f(e,n,a.deps)}c(C,"homeOf");async function N(e,n,a,i=l){return await L(e,n),f(e,n,i,a)}c(N,"relocate");export{T as cachedLocation,l as defaultHomeDeps,L as dropLocation,C as homeOf,f as locate,g as peersToAsk,N as relocate,I as rememberLocation};
@@ -1 +1 @@
1
- var g=Object.defineProperty;var o=(e,t)=>g(e,"name",{value:t,configurable:!0});import{CrtrError as _}from"../errors.js";import{getById as k,getByRowid as R}from"../graph/objects.js";import{publish as O}from"../graph/events.js";import{markLinkWatch as h,recordWatch as S}from"../graph/watches.js";import{armObjectWaitForWatch as L}from"../graph/object-waits.js";import{ackRows as $,claimRows as T}from"./outbox-store.js";import{ensureStub as u,localOwnerActor as W,stubOf as w}from"./stubs.js";import{withCanvasWrite as x}from"../canvas/db.js";const P=100,U=o(e=>e==="unknown_event"||e==="unknown_kind","isCatalogLag"),y=o((e,t)=>`peer:${e}:${t}`,"ingestKey");async function A(e,t){return await e.prepare("SELECT 1 FROM peer_ingested WHERE key = ?").get(t)!==void 0?!0:await e.prepare("SELECT 1 FROM deliveries WHERE idempotency_key >= ? AND idempotency_key < ? LIMIT 1").get(`${t}:`,`${t};`)!==void 0}o(A,"applied");const f=o(async(e,t,n)=>{await e.prepare("INSERT OR IGNORE INTO peer_ingested_destinations (key, ingested_at) VALUES (?, ?)").run(`${t}:${n}`,Date.now())},"markDestination");async function C(e,t,n){return await e.prepare("SELECT 1 FROM peer_ingested_destinations WHERE key = ?").get(`${t}:${n}`)!==void 0||await e.prepare("SELECT 1 FROM deliveries WHERE idempotency_key = ?").get(`${t}:${n}`)!==void 0}o(C,"destinationDone");async function F(e,t,n){return await W(e,t)??await u(e,t.id,t.type,n,void 0,t)}o(F,"actorFor");async function E(e,t,n,r,a){const c=n.actor===null?null:await F(e,n.actor,t),l=n.body_text,i=n.body===void 0&&l===void 0?void 0:{...n.body??{},...l===void 0?{}:{body:l}};await O(e,{event:n.event,object:r,actor:c,level:n.level,attrs:n.attrs,...i===void 0?{}:{messageBody:i},idempotencyKey:y(t,n.message_id),...a===void 0?{}:{onlyWatchers:a}})}o(E,"apply");async function N(e,t){const n=`ev:${t.message_id}:`;if(!t.key.startsWith(n)||t.key.length===n.length)return null;const r=await k(e,t.key.slice(n.length));return r!==null&&r.type==="node"&&r.deleted_at===null&&await w(e,r)===null?r:null}o(N,"localDestination");async function X(e,t,n){const r={accepted:[],rejected:[]};for(const a of n){const c=y(t,a.message_id),l=await A(e,c);try{await x(async()=>{const i=await N(e,a);if(l&&i===null)return;const s=await u(e,a.object.id,a.object.type,t,void 0,a.object),d=a.linked===!0&&i!==null&&s.owner!==null?await R(e,s.owner):null,p=d!==null&&d.type==="app"?d:null;if(i!==null&&await e.prepare("SELECT 1 FROM watches WHERE watcher = ? AND object = ?").get(i.rowid,s.rowid)===void 0?(await S(e,i,s,"act",{patterns:[">"],...p===null?{}:{linkApp:p}}),await L(e,i,s)):i!==null&&p!==null&&await h(e,i,s,p),l)await C(e,c,i.id)||await E(e,t,a,s,[i.id]);else{await E(e,t,a,s),await e.prepare("INSERT OR IGNORE INTO peer_ingested (key, ingested_at) VALUES (?, ?)").run(c,Date.now());for(const m of await e.prepare("SELECT destination_id FROM deliveries WHERE idempotency_key >= ? AND idempotency_key < ?").all(`${c}:`,`${c};`))await f(e,c,m.destination_id)}i!==null&&await f(e,c,i.id)},{savepoint:!0}),r.accepted.push(a.key)}catch(i){const s=i instanceof _?i.code:"invalid_event";r.rejected.push({key:a.key,code:s,message:i instanceof Error?i.message:String(i)})}}return r}o(X,"ingestPeerEvents");const q=o(async(e,t,n)=>(await w(e,t))?.home_machine===n,"isStubOf"),v=o(async(e,t,n)=>await T(e,t,n),"claimFor"),z=o(async(e,t,n)=>await $(e,t,n),"ackFor");export{P as MAX_EVENTS_PER_CALL,z as ackFor,v as claimFor,y as ingestKey,X as ingestPeerEvents,U as isCatalogLag,q as isStubOf};
1
+ var g=Object.defineProperty;var o=(e,t)=>g(e,"name",{value:t,configurable:!0});import{CrtrError as k}from"../errors.js";import{getById as u}from"../graph/objects.js";import{publish as O}from"../graph/events.js";import{markLinkWatch as R,recordWatch as N}from"../graph/watches.js";import{armObjectWaitForWatch as T}from"../graph/object-waits.js";import{ackRows as h,claimRows as L}from"./outbox-store.js";import{ensureStub as y,localOwnerActor as C,stubOf as w}from"./stubs.js";import{withCanvasWrite as S}from"../canvas/db.js";const K=100,P=o(e=>e==="unknown_event"||e==="unknown_kind","isCatalogLag"),f=o((e,t)=>`peer:${e}:${t}`,"ingestKey");async function $(e,t){return await e.prepare("SELECT 1 FROM peer_ingested WHERE key = ?").get(t)!==void 0?!0:await e.prepare("SELECT 1 FROM deliveries WHERE idempotency_key >= ? AND idempotency_key < ? LIMIT 1").get(`${t}:`,`${t};`)!==void 0}o($,"applied");const m=o(async(e,t,n)=>{await e.prepare("INSERT INTO peer_ingested_destinations (key, ingested_at) VALUES (?, ?) ON CONFLICT DO NOTHING").run(`${t}:${n}`,Date.now())},"markDestination");async function F(e,t,n){return await e.prepare("SELECT 1 FROM peer_ingested_destinations WHERE key = ?").get(`${t}:${n}`)!==void 0||await e.prepare("SELECT 1 FROM deliveries WHERE idempotency_key = ?").get(`${t}:${n}`)!==void 0}o(F,"destinationDone");async function I(e,t,n){return await C(e,t)??await y(e,t.id,t.type,n,void 0,t)}o(I,"actorFor");async function E(e,t,n,r,i){const c=n.actor===null?null:await I(e,n.actor,t),l=n.body_text,a=n.body===void 0&&l===void 0?void 0:{...n.body??{},...l===void 0?{}:{body:l}};await O(e,{event:n.event,object:r,actor:c,level:n.level,attrs:n.attrs,...a===void 0?{}:{messageBody:a},idempotencyKey:f(t,n.message_id),...i===void 0?{}:{onlyWatchers:i}})}o(E,"apply");async function W(e,t){const n=`ev:${t.message_id}:`;if(!t.key.startsWith(n)||t.key.length===n.length)return null;const r=await u(e,t.key.slice(n.length));return r!==null&&r.type==="node"&&r.deleted_at===null&&await w(e,r)===null?r:null}o(W,"localDestination");async function U(e,t,n){const r={accepted:[],rejected:[]};for(const i of n){const c=f(t,i.message_id),l=await $(e,c);try{await S(async()=>{const a=await W(e,i);if(l&&a===null)return;const s=await y(e,i.object.id,i.object.type,t,void 0,i.object),d=i.linked===!0&&a!==null&&s.owner!==null?await u(e,s.owner):null,p=d!==null&&d.type==="app"?d:null;if(a!==null&&await e.prepare("SELECT 1 FROM watches WHERE watcher = ? AND object = ?").get(a.id,s.id)===void 0?(await N(e,a,s,"act",{patterns:[">"],...p===null?{}:{linkApp:p}}),await T(e,a,s)):a!==null&&p!==null&&await R(e,a,s,p),l)await F(e,c,a.id)||await E(e,t,i,s,[a.id]);else{await E(e,t,i,s),await e.prepare("INSERT INTO peer_ingested (key, ingested_at) VALUES (?, ?) ON CONFLICT DO NOTHING").run(c,Date.now());for(const _ of await e.prepare("SELECT destination_id FROM deliveries WHERE idempotency_key >= ? AND idempotency_key < ?").all(`${c}:`,`${c};`))await m(e,c,_.destination_id)}a!==null&&await m(e,c,a.id)},{savepoint:!0}),r.accepted.push(i.key)}catch(a){const s=a instanceof k?a.code:"invalid_event";r.rejected.push({key:i.key,code:s,message:a instanceof Error?a.message:String(a)})}}return r}o(U,"ingestPeerEvents");const X=o(async(e,t,n)=>(await w(e,t))?.home_machine===n,"isStubOf"),q=o(async(e,t,n)=>await L(e,t,n),"claimFor"),v=o(async(e,t,n)=>await h(e,t,n),"ackFor");export{K as MAX_EVENTS_PER_CALL,v as ackFor,q as claimFor,f as ingestKey,U as ingestPeerEvents,P as isCatalogLag,X as isStubOf};
@@ -1 +1 @@
1
- var p=Object.defineProperty;var a=(t,n)=>p(t,"name",{value:n,configurable:!0});import{heads as y}from"../graph/documents.js";import{bodyOf as _}from"../graph/bodies.js";import{getById as s}from"../graph/objects.js";import{enqueuePeerRow as m}from"./outbox-store.js";import{describeObject as l,stubOf as w}from"./stubs.js";const b=a((t,n)=>`ev:${t}:${n}`,"eventKey");async function j(t,n){const i=typeof n?.pointer=="string"?n.pointer:void 0,e=i===void 0?null:await s(t,i);if(e===null||e.type!=="document"||e.deleted_at!==null)return;const o=(await y(t,e))[0];if(o===void 0)return;const r=await t.prepare("SELECT source_path FROM documents WHERE object = ?").get(e.rowid);return _(o.body_hash,r?.source_path??null)}a(j,"reportText");async function g(t,n,i){const e=await t.prepare("SELECT message_id, event, object_id, level, actor_id, body_ref, body_json FROM messages WHERE message_id = ?").get(n);if(e===void 0)throw new Error(`no message ${n}`);const o=await s(t,e.object_id);if(o===null)throw new Error(`no object ${e.object_id}`);const r=e.actor_id===null?null:await s(t,e.actor_id),f=e.body_json===null?{}:JSON.parse(e.body_json),{push:d,bodyRef:h,...c}=f,u=e.body_ref===null?void 0:await j(t,d);return{key:i,message_id:e.message_id,event:e.event,level:e.level,object:await l(t,o),actor:r===null?null:await l(t,r),attrs:d?.attrs??{},...Object.keys(c).length>0?{body:c}:{},...u===void 0?{}:{body_text:u}}}a(g,"payloadFor");const T={bodyOwner:a(()=>null,"bodyOwner"),async enqueue(t,n,i){for(const e of i){const o=await w(t,e.id);if(o===null)continue;const r=b(n.messageId,e.id);await m(t,{peer:o.home_machine,kind:"event",key:r,payload:{...await g(t,n.messageId,r),...e.linked?{linked:!0}:{}}})}}};export{b as eventKey,g as payloadFor,T as peerReceiver};
1
+ var p=Object.defineProperty;var a=(t,n)=>p(t,"name",{value:n,configurable:!0});import{heads as y}from"../graph/documents.js";import{bodyOf as _}from"../graph/bodies.js";import{getById as s}from"../graph/objects.js";import{enqueuePeerRow as m}from"./outbox-store.js";import{describeObject as l,stubOf as w}from"./stubs.js";const b=a((t,n)=>`ev:${t}:${n}`,"eventKey");async function j(t,n){const i=typeof n?.pointer=="string"?n.pointer:void 0,e=i===void 0?null:await s(t,i);if(e===null||e.type!=="document"||e.deleted_at!==null)return;const o=(await y(t,e))[0];if(o===void 0)return;const r=await t.prepare("SELECT source_path FROM documents WHERE object = ?").get(e.id);return _(o.body_hash,r?.source_path??null)}a(j,"reportText");async function g(t,n,i){const e=await t.prepare("SELECT message_id, event, object_id, level, actor_id, body_ref, body_json FROM messages WHERE message_id = ?").get(n);if(e===void 0)throw new Error(`no message ${n}`);const o=await s(t,e.object_id);if(o===null)throw new Error(`no object ${e.object_id}`);const r=e.actor_id===null?null:await s(t,e.actor_id),f=e.body_json===null?{}:JSON.parse(e.body_json),{push:d,bodyRef:h,...c}=f,u=e.body_ref===null?void 0:await j(t,d);return{key:i,message_id:e.message_id,event:e.event,level:e.level,object:await l(t,o),actor:r===null?null:await l(t,r),attrs:d?.attrs??{},...Object.keys(c).length>0?{body:c}:{},...u===void 0?{}:{body_text:u}}}a(g,"payloadFor");const T={bodyOwner:a(()=>null,"bodyOwner"),async enqueue(t,n,i){for(const e of i){const o=await w(t,e.id);if(o===null)continue;const r=b(n.messageId,e.id);await m(t,{peer:o.home_machine,kind:"event",key:r,payload:{...await g(t,n.messageId,r),...e.linked?{linked:!0}:{}}})}}};export{b as eventKey,g as payloadFor,T as peerReceiver};
@@ -1 +1 @@
1
- var O=Object.defineProperty;var i=(n,e)=>O(n,"name",{value:e,configurable:!0});import{createObject as x,ensureOwner as y,getById as _,getByRowid as u}from"../graph/objects.js";import{upsertKind as A}from"../graph/custom.js";import{CrtrError as d}from"../errors.js";import{ExitCode as E}from"../../types.js";import{normalizeMachineId as b}from"./names.js";const H=["public","friends","private"],N=i(n=>{const e=n.act.act;return e===void 0?{sub:n.sub,app:null,node:null,node_scopes:null,place:null}:{sub:n.sub,app:e.sub,node:e.node,node_scopes:e.node_scopes,place:e.place}},"identityOfEnvelope");async function h(n,e){const r=typeof e=="string"?await _(n,e):e;if(r===null)return null;const t=await n.prepare("SELECT home_machine, envelope_json FROM peer_stubs WHERE object = ?").get(r.rowid);return t?{object:r,home_machine:t.home_machine,identity:t.envelope_json===null?null:JSON.parse(t.envelope_json)}:null}i(h,"stubOf");const U=i(async(n,e)=>await n.prepare("SELECT 1 FROM peer_stubs WHERE object = ?").get(e.rowid)!==void 0,"isStub");async function l(n){return await y(n,"person","local-user","user:local","user")}i(l,"localPerson");async function f(n,e){return e==="user:local"?await l(n):await y(n,"app","app",e,e.replace(/^app:/,""))}i(f,"localApp");async function C(n,e){return e.type==="app"?await f(n,`app:${e.name}`):e.type==="person"?await l(n):null}i(C,"localOwnerActor");async function v(n,e,r){if(e!==null)return e.app===null?await l(n):await f(n,e.app);const t=r?.owner;return t?.type==="app"?await f(n,t.external_id??`app:${t.handle}`):await l(n)}i(v,"ownerFor");async function W(n,e,r,t,m,a){const c=m===void 0?null:N(m),p=a?.privacy??"public";if(!H.includes(p))throw new d("invalid_event",`invalid privacy ${JSON.stringify(p)}`,E.GENERAL,{id:e});const o=await _(n,e);if(o!==null){const s=await h(n,o);if(s===null)throw new d("conflict",`${e} is a local ${o.type}, not a stub of ${t}`,E.GENERAL,{id:e});if(s.home_machine!==t)throw new d("conflict",`${e} is already a stub of ${s.home_machine}, not ${t}`,E.GENERAL,{id:e,home_machine:s.home_machine});return c!==null&&(await n.prepare("UPDATE peer_stubs SET envelope_json = ? WHERE object = ?").run(JSON.stringify(c),o.rowid),await n.prepare("UPDATE objects SET reception = 2 WHERE rowid = ?").run(o.rowid)),a!==void 0&&(await S(n,r,a),a.privacy!==void 0&&o.privacy!==p)?(await n.prepare("UPDATE objects SET privacy = ? WHERE rowid = ?").run(p,o.rowid),await u(n,o.rowid)):o}const T=await v(n,c,a);await S(n,r,a);const w=await x(n,{id:e,type:r,kind:a?.kind??null,owner:T.rowid,privacy:p,name:a?.name??e,preview:a?.preview??"",home_machine:t});return await n.prepare("INSERT INTO peer_stubs (object, home_machine, envelope_json, created_at) VALUES (?, ?, ?, ?)").run(w.rowid,t,c===null?null:JSON.stringify(c),new Date().toISOString()),c!==null&&await n.prepare("UPDATE objects SET reception = 2 WHERE rowid = ?").run(w.rowid),await u(n,w.rowid)}i(W,"ensureStub");async function S(n,e,r){const t=r?.kind_decl;t===void 0||t.name!==e||await A(n,{name:t.name,owner:await v(n,null,{...r,owner:t.owner}),description:t.description,events:t.events,read:null,source:"peer"})}i(S,"holdKind");async function I(n,e,r){const t=await W(n,e,"node",b(r));return await n.prepare("UPDATE objects SET reception = 2 WHERE rowid = ?").run(t.rowid),await u(n,t.rowid)}i(I,"ensureNodeStub");async function F(n,e,r){const t=await h(n,e);t===null||t.home_machine===r||(await n.prepare("UPDATE peer_stubs SET home_machine = ? WHERE object = ?").run(r,t.object.rowid),await n.prepare("UPDATE objects SET home_machine = ? WHERE rowid = ?").run(r,t.object.rowid))}i(F,"rehomeStub");async function J(n,e){const r=await R(n,e.owner===null?null:await u(n,e.owner)),t=await j(n,e.type);return{id:e.id,type:e.type,kind:e.kind,name:e.name,preview:e.preview,owner:r,privacy:e.privacy,...t===null?{}:{kind_decl:t}}}i(J,"describeObject");async function R(n,e){if(e===null||e.type!=="person"&&e.type!=="app"&&e.type!=="repo"&&e.type!=="profile")return null;const r=await n.prepare("SELECT scheme, external_id FROM identities WHERE object = ?").get(e.rowid);return{id:e.id,type:e.type,scheme:r?.scheme??null,external_id:r?.external_id??null,handle:e.name}}i(R,"ownerRefOf");async function j(n,e){const r=await n.prepare("SELECT owner, description, events_json FROM object_kinds WHERE name = ?").get(e),t=r===void 0?null:await R(n,await u(n,r.owner));return r===void 0||t===null?null:{name:e,description:r.description,events:JSON.parse(r.events_json),owner:t}}i(j,"kindDeclarationOf");async function M(n,e,r){const t=await j(n,e.type);return t===null?r:{...r,kind_decl:t}}i(M,"withKindDecl");export{J as describeObject,I as ensureNodeStub,W as ensureStub,N as identityOfEnvelope,U as isStub,j as kindDeclarationOf,C as localOwnerActor,F as rehomeStub,h as stubOf,M as withKindDecl};
1
+ var T=Object.defineProperty;var a=(n,e)=>T(n,"name",{value:e,configurable:!0});import{createObject as O,ensureOwner as y,getById as c}from"../graph/objects.js";import{upsertKind as x}from"../graph/custom.js";import{CrtrError as d}from"../errors.js";import{ExitCode as E}from"../../types.js";import{normalizeMachineId as A}from"./names.js";const b=["public","friends","private"],H=a(n=>{const e=n.act.act;return e===void 0?{sub:n.sub,app:null,node:null,node_scopes:null,place:null}:{sub:n.sub,app:e.sub,node:e.node,node_scopes:e.node_scopes,place:e.place}},"identityOfEnvelope");async function _(n,e){const i=typeof e=="string"?await c(n,e):e;if(i===null)return null;const t=await n.prepare("SELECT home_machine, envelope_json FROM peer_stubs WHERE object = ?").get(i.id);return t?{object:i,home_machine:t.home_machine,identity:t.envelope_json===null?null:JSON.parse(t.envelope_json)}:null}a(_,"stubOf");const L=a(async(n,e)=>await n.prepare("SELECT 1 FROM peer_stubs WHERE object = ?").get(e.id)!==void 0,"isStub");async function l(n){return await y(n,"person","local-user","user:local","user")}a(l,"localPerson");async function f(n,e){return e==="user:local"?await l(n):await y(n,"app","app",e,e.replace(/^app:/,""))}a(f,"localApp");async function U(n,e){return e.type==="app"?await f(n,`app:${e.name}`):e.type==="person"?await l(n):null}a(U,"localOwnerActor");async function h(n,e,i){if(e!==null)return e.app===null?await l(n):await f(n,e.app);const t=i?.owner;return t?.type==="app"?await f(n,t.external_id??`app:${t.handle}`):await l(n)}a(h,"ownerFor");async function N(n,e,i,t,m,r){const p=m===void 0?null:H(m),u=r?.privacy??"public";if(!b.includes(u))throw new d("invalid_event",`invalid privacy ${JSON.stringify(u)}`,E.GENERAL,{id:e});const o=await c(n,e);if(o!==null){const s=await _(n,o);if(s===null)throw new d("conflict",`${e} is a local ${o.type}, not a stub of ${t}`,E.GENERAL,{id:e});if(s.home_machine!==t)throw new d("conflict",`${e} is already a stub of ${s.home_machine}, not ${t}`,E.GENERAL,{id:e,home_machine:s.home_machine});return p!==null&&(await n.prepare("UPDATE peer_stubs SET envelope_json = ? WHERE object = ?").run(JSON.stringify(p),o.id),await n.prepare("UPDATE objects SET reception = 2 WHERE id = ?").run(o.id)),r!==void 0&&(await v(n,i,r),r.privacy!==void 0&&o.privacy!==u)?(await n.prepare("UPDATE objects SET privacy = ? WHERE id = ?").run(u,o.id),await c(n,o.id)):o}const R=await h(n,p,r);await v(n,i,r);const w=await O(n,{id:e,type:i,kind:r?.kind??null,owner:R.id,privacy:u,name:r?.name??e,preview:r?.preview??"",home_machine:t});return await n.prepare("INSERT INTO peer_stubs (object, home_machine, envelope_json, created_at) VALUES (?, ?, ?, ?)").run(w.id,t,p===null?null:JSON.stringify(p),new Date().toISOString()),p!==null&&await n.prepare("UPDATE objects SET reception = 2 WHERE id = ?").run(w.id),await c(n,w.id)}a(N,"ensureStub");async function v(n,e,i){const t=i?.kind_decl;t===void 0||t.name!==e||await x(n,{name:t.name,owner:await h(n,null,{...i,owner:t.owner}),description:t.description,events:t.events,read:null,source:"peer"})}a(v,"holdKind");async function C(n,e,i){const t=await N(n,e,"node",A(i));return await n.prepare("UPDATE objects SET reception = 2 WHERE id = ?").run(t.id),await c(n,t.id)}a(C,"ensureNodeStub");async function I(n,e,i){const t=await _(n,e);t===null||t.home_machine===i||(await n.prepare("UPDATE peer_stubs SET home_machine = ? WHERE object = ?").run(i,t.object.id),await n.prepare("UPDATE objects SET home_machine = ? WHERE id = ?").run(i,t.object.id))}a(I,"rehomeStub");async function F(n,e){const i=await S(n,e.owner===null?null:await c(n,e.owner)),t=await j(n,e.type);return{id:e.id,type:e.type,kind:e.kind,name:e.name,preview:e.preview,owner:i,privacy:e.privacy,...t===null?{}:{kind_decl:t}}}a(F,"describeObject");async function S(n,e){if(e===null||e.type!=="person"&&e.type!=="app"&&e.type!=="repo"&&e.type!=="profile")return null;const i=await n.prepare("SELECT scheme, external_id FROM identities WHERE object = ?").get(e.id);return{id:e.id,type:e.type,scheme:i?.scheme??null,external_id:i?.external_id??null,handle:e.name}}a(S,"ownerRefOf");async function j(n,e){const i=await n.prepare("SELECT owner, description, events_json FROM object_kinds WHERE name = ?").get(e),t=i===void 0?null:await S(n,await c(n,i.owner));return i===void 0||t===null?null:{name:e,description:i.description,events:JSON.parse(i.events_json),owner:t}}a(j,"kindDeclarationOf");async function J(n,e,i){const t=await j(n,e.type);return t===null?i:{...i,kind_decl:t}}a(J,"withKindDecl");export{F as describeObject,C as ensureNodeStub,N as ensureStub,H as identityOfEnvelope,L as isStub,j as kindDeclarationOf,U as localOwnerActor,I as rehomeStub,_ as stubOf,J as withKindDecl};
@@ -1,2 +1,3 @@
1
- var p=Object.defineProperty;var a=(t,r)=>p(t,"name",{value:r,configurable:!0});import{withCanvasWrite as _}from"../canvas/db.js";import{addUsage as f}from"../usage/ledger.js";const g=8,y=65536;function c(t,r){if(!t||typeof t!="object"||Array.isArray(t))return!1;const e=t;return typeof e.receipt_id=="string"&&!!e.receipt_id&&e.receipt_id.length<=256&&e.provider===`app:${r.provider}`&&e.tool===r.tool&&e.request_id===r.request_id&&e.sub===r.sub&&e.grantee===r.grantee&&e.payer===r.payer&&(e.run_id??null)===r.run_id&&typeof e.unit=="string"&&!!e.unit&&typeof e.units=="number"&&Number.isFinite(e.units)&&e.units>=0&&typeof e.time=="string"&&Number.isFinite(Date.parse(e.time))&&typeof e.usd_equivalent=="number"&&Number.isFinite(e.usd_equivalent)&&e.usd_equivalent>=0}a(c,"belongsToCall");async function S(t,r){const e=Array.isArray(t)?t[0]:t;if(!e||e.length>y)return;let n;try{n=JSON.parse(e)}catch{return}if(Array.isArray(n)&&n.length>g)return;const o=(Array.isArray(n)?n:[n]).filter(i=>c(i,r));if(o.length)return await _(async i=>{for(const s of o){if(!(await i.prepare(`INSERT OR IGNORE INTO provider_receipts
2
- (provider, receipt_id, grantee, run_id, usd_equivalent, received_at) VALUES (?, ?, ?, ?, ?, ?)`).run(r.provider,s.receipt_id,r.grantee,r.run_id,s.usd_equivalent,new Date().toISOString())).changes||(await f(i,{grantee:r.ledger_grantee??r.grantee,payer:r.payer.startsWith("app:")?"app":"user",source:`provider:${r.provider}`,served_model:"",input_tokens:0,output_tokens:0,cached_tokens:0,usd_equivalent:s.usd_equivalent}),!r.run_id))continue;const d=await i.prepare("SELECT usage_json FROM nodes WHERE node_id = ? AND run_id = ?").get(r.run_id,r.run_id);if(!d)continue;const u=d.usage_json?JSON.parse(d.usage_json):{};u.cost_usd=(typeof u.cost_usd=="number"?u.cost_usd:0)+s.usd_equivalent,await i.prepare("UPDATE nodes SET usage_json = ? WHERE node_id = ?").run(JSON.stringify(u),r.run_id)}}),o[0].receipt_id}a(S,"acceptProviderReceipt");export{S as acceptProviderReceipt};
1
+ var p=Object.defineProperty;var a=(t,r)=>p(t,"name",{value:r,configurable:!0});import{withCanvasWrite as _}from"../canvas/db.js";import{addUsage as f}from"../usage/ledger.js";const g=8,y=65536;function c(t,r){if(!t||typeof t!="object"||Array.isArray(t))return!1;const e=t;return typeof e.receipt_id=="string"&&!!e.receipt_id&&e.receipt_id.length<=256&&e.provider===`app:${r.provider}`&&e.tool===r.tool&&e.request_id===r.request_id&&e.sub===r.sub&&e.grantee===r.grantee&&e.payer===r.payer&&(e.run_id??null)===r.run_id&&typeof e.unit=="string"&&!!e.unit&&typeof e.units=="number"&&Number.isFinite(e.units)&&e.units>=0&&typeof e.time=="string"&&Number.isFinite(Date.parse(e.time))&&typeof e.usd_equivalent=="number"&&Number.isFinite(e.usd_equivalent)&&e.usd_equivalent>=0}a(c,"belongsToCall");async function N(t,r){const e=Array.isArray(t)?t[0]:t;if(!e||e.length>y)return;let n;try{n=JSON.parse(e)}catch{return}if(Array.isArray(n)&&n.length>g)return;const o=(Array.isArray(n)?n:[n]).filter(i=>c(i,r));if(o.length)return await _(async i=>{for(const s of o){if(!(await i.prepare(`INSERT INTO provider_receipts
2
+ (provider, receipt_id, grantee, run_id, usd_equivalent, received_at) VALUES (?, ?, ?, ?, ?, ?)
3
+ ON CONFLICT DO NOTHING`).run(r.provider,s.receipt_id,r.grantee,r.run_id,s.usd_equivalent,new Date().toISOString())).changes||(await f(i,{grantee:r.ledger_grantee??r.grantee,payer:r.payer.startsWith("app:")?"app":"user",source:`provider:${r.provider}`,served_model:"",input_tokens:0,output_tokens:0,cached_tokens:0,usd_equivalent:s.usd_equivalent}),!r.run_id))continue;const d=await i.prepare("SELECT usage_json FROM nodes WHERE node_id = ? AND run_id = ?").get(r.run_id,r.run_id);if(!d)continue;const u=d.usage_json?JSON.parse(d.usage_json):{};u.cost_usd=(typeof u.cost_usd=="number"?u.cost_usd:0)+s.usd_equivalent,await i.prepare("UPDATE nodes SET usage_json = ? WHERE node_id = ?").run(JSON.stringify(u),r.run_id)}}),o[0].receipt_id}a(N,"acceptProviderReceipt");export{N as acceptProviderReceipt};
@@ -1,8 +1,9 @@
1
- var A=Object.defineProperty;var i=(e,t)=>A(e,"name",{value:t,configurable:!0});import{randomBytes as D}from"node:crypto";import{withCanvasWrite as u,openDb as l}from"../canvas/db.js";import{nowIso as h}from"../fs-utils.js";import{signalReviewActivity as v}from"./signal.js";import{COMMENT_EVENTS_PAGE_DEFAULT as F,COMMENT_EVENTS_PAGE_MAX as U,COMMENT_LINE_TEXT_MAX as W,COMMENT_TEXT_MAX as R,LIVE_COMMENTS_MAX as T,ReviewOperationError as m}from"./types.js";function _(e){return{comment_id:e.comment_id,review_id:e.review_id,status:e.status,revision:e.revision,text:e.text,anchor:{line:e.anchor_line,end_line:e.anchor_end_line,...e.anchor_col_start===null?{}:{col_start:e.anchor_col_start},...e.anchor_col_end===null?{}:{col_end:e.anchor_col_end},...e.anchor_quote===null?{}:{quote:e.anchor_quote}},anchor_state:e.anchor_state,anchor_line_text:e.anchor_line_text,anchor_doc_hash:e.anchor_doc_hash,author:{kind:e.author_kind,node_id:e.author_node_id},updated_by:{kind:e.updated_by_kind,node_id:e.updated_by_node_id},created_at:e.created_at,updated_at:e.updated_at,resolved_at:e.resolved_at,deleted_at:e.deleted_at,created_seq:e.created_seq}}i(_,"commentFromRow");function k(e){return{seq:e.seq,review_id:e.review_id,comment_id:e.comment_id,kind:e.kind,state_change:e.state_change===0?0:1,revision_after:e.revision_after,actor:{kind:e.actor_kind,node_id:e.actor_node_id},at:e.at,operation_id:e.operation_id,...e.payload===null?{}:{payload:JSON.parse(e.payload)}}}i(k,"eventFromRow");function N(e){return JSON.stringify(e)}i(N,"json");function q(){let e;do e=D(16).toString("hex");while(/^0+$/.test(e));return e}i(q,"commentId");function C(e){const t=e.trim();if(t==="")throw new Error("comment text must not be empty");const n=Buffer.byteLength(t,"utf8");if(n>R)throw new m("text_too_long","comment text exceeds the maximum length",{limit:R,received:n});return t}i(C,"trimText");function B(e,t){if(Buffer.byteLength(e,"utf8")<=t)return e;const n="\u2026 [truncated]",r=Buffer.byteLength(n,"utf8"),o=Buffer.from(e,"utf8");let a=Math.max(0,t-r);for(;a>0&&(o[a]&192)===128;)a-=1;return`${o.subarray(0,a).toString("utf8")}${n}`}i(B,"truncateUtf8");async function p(e,t){return await e.prepare("SELECT * FROM review_comments WHERE comment_id = ?").get(t)??null}i(p,"getStoredComment");async function E(e,t){const n=await p(e,t);if(n===null)throw new m("unknown_comment","comment was not found",{received:t});return n}i(E,"requireStoredComment");async function L(e,t){if(await e.prepare("SELECT request_id FROM human_requests WHERE request_id = ? AND kind = 'review' AND state = 'open'").get(t)===void 0)throw new m("unknown_review","review was not found",{received:t})}i(L,"assertReviewExists");function S(e,t){if(t!==void 0&&t!==e.revision)throw new m("stale_comment","comment revision is stale",{revision:e.revision,text:e.text})}i(S,"assertRevision");async function w(e,t){const n=await e.prepare(`
1
+ var A=Object.defineProperty;var i=(e,t)=>A(e,"name",{value:t,configurable:!0});import{randomBytes as D}from"node:crypto";import{withCanvasWrite as u,openDb as l}from"../canvas/db.js";import{nowIso as h}from"../fs-utils.js";import{signalReviewActivity as v}from"./signal.js";import{COMMENT_EVENTS_PAGE_DEFAULT as U,COMMENT_EVENTS_PAGE_MAX as F,COMMENT_LINE_TEXT_MAX as W,COMMENT_TEXT_MAX as R,LIVE_COMMENTS_MAX as T,ReviewOperationError as m}from"./types.js";function _(e){return{comment_id:e.comment_id,review_id:e.review_id,status:e.status,revision:e.revision,text:e.text,anchor:{line:e.anchor_line,end_line:e.anchor_end_line,...e.anchor_col_start===null?{}:{col_start:e.anchor_col_start},...e.anchor_col_end===null?{}:{col_end:e.anchor_col_end},...e.anchor_quote===null?{}:{quote:e.anchor_quote}},anchor_state:e.anchor_state,anchor_line_text:e.anchor_line_text,anchor_doc_hash:e.anchor_doc_hash,author:{kind:e.author_kind,node_id:e.author_node_id},updated_by:{kind:e.updated_by_kind,node_id:e.updated_by_node_id},created_at:e.created_at,updated_at:e.updated_at,resolved_at:e.resolved_at,deleted_at:e.deleted_at,created_seq:e.created_seq}}i(_,"commentFromRow");function N(e){return{seq:e.seq,review_id:e.review_id,comment_id:e.comment_id,kind:e.kind,state_change:e.state_change===0?0:1,revision_after:e.revision_after,actor:{kind:e.actor_kind,node_id:e.actor_node_id},at:e.at,operation_id:e.operation_id,...e.payload===null?{}:{payload:JSON.parse(e.payload)}}}i(N,"eventFromRow");function k(e){return JSON.stringify(e)}i(k,"json");function q(){let e;do e=D(16).toString("hex");while(/^0+$/.test(e));return e}i(q,"commentId");function C(e){const t=e.trim();if(t==="")throw new Error("comment text must not be empty");const n=Buffer.byteLength(t,"utf8");if(n>R)throw new m("text_too_long","comment text exceeds the maximum length",{limit:R,received:n});return t}i(C,"trimText");function B(e,t){if(Buffer.byteLength(e,"utf8")<=t)return e;const n="\u2026 [truncated]",r=Buffer.byteLength(n,"utf8"),o=Buffer.from(e,"utf8");let a=Math.max(0,t-r);for(;a>0&&(o[a]&192)===128;)a-=1;return`${o.subarray(0,a).toString("utf8")}${n}`}i(B,"truncateUtf8");async function p(e,t){return await e.prepare("SELECT * FROM review_comments WHERE comment_id = ?").get(t)??null}i(p,"getStoredComment");async function E(e,t){const n=await p(e,t);if(n===null)throw new m("unknown_comment","comment was not found",{received:t});return n}i(E,"requireStoredComment");async function L(e,t){if(await e.prepare("SELECT request_id FROM human_requests WHERE request_id = ? AND kind = 'review' AND state = 'open'").get(t)===void 0)throw new m("unknown_review","review was not found",{received:t})}i(L,"assertReviewExists");function S(e,t){if(t!==void 0&&t!==e.revision)throw new m("stale_comment","comment revision is stale",{revision:e.revision,text:e.text})}i(S,"assertRevision");async function w(e,t){const n=await e.prepare(`
2
2
  INSERT INTO review_comment_events
3
3
  (review_id, comment_id, kind, state_change, revision_after, actor_kind, actor_node_id, at, operation_id, payload)
4
4
  VALUES (?, ?, ?, 1, ?, ?, ?, ?, ?, ?)
5
- `).run(t.row.review_id,t.row.comment_id,t.kind,t.row.revision,t.actor.kind,t.actor.node_id,t.at,t.operation_id,N(t.payload));return Number(n.lastInsertRowid)}i(w,"appendStateEvent");async function M(e,t,n,r,o){const a=t.revision+1;return await e.prepare(`
5
+ RETURNING seq
6
+ `).get(t.row.review_id,t.row.comment_id,t.kind,t.row.revision,t.actor.kind,t.actor.node_id,t.at,t.operation_id,k(t.payload));return Number(n.seq)}i(w,"appendStateEvent");async function M(e,t,n,r,o){const a=t.revision+1;return await e.prepare(`
6
7
  UPDATE review_comments
7
8
  SET status = ?, revision = ?, text = ?, updated_by_kind = ?, updated_by_node_id = ?,
8
9
  updated_at = ?, resolved_at = ?, deleted_at = ?
@@ -14,8 +15,8 @@ var A=Object.defineProperty;var i=(e,t)=>A(e,"name",{value:t,configurable:!0});i
14
15
  author_kind, author_node_id, updated_by_kind, updated_by_node_id, created_at,
15
16
  updated_at, resolved_at, deleted_at, created_seq)
16
17
  VALUES (?, ?, 'open', 1, ?, ?, ?, ?, ?, ?, ?, ?, 'live', ?, ?, ?, ?, ?, ?, NULL, NULL, 0)
17
- `).run(c,e.review_id,o,e.anchor.line,e.anchor.end_line,e.anchor.col_start??null,e.anchor.col_end??null,e.anchor.quote??null,a,e.doc_hash,e.actor.kind,e.actor.node_id,e.actor.kind,e.actor.node_id,d,d)).changes!==1)throw new Error("failed to insert review comment");const y=await p(n,c),x=await w(n,{row:y,kind:"created",actor:e.actor,operation_id:e.operation_id,at:d,payload:{text:o,anchor:e.anchor,line_text:a,doc_hash:e.doc_hash}});return await n.prepare("UPDATE review_comments SET created_seq = ? WHERE comment_id = ?").run(x,c),{comment:_({...y,created_seq:x}),changed:!0}});return v(),t}i(P,"createComment");async function $(e,t){const n=await u(async r=>{const o=await E(r,e);if(o.status==="deleted")throw new m("comment_deleted","comment is a deleted tombstone",{comment_id:o.comment_id,deleted_at:o.deleted_at});const a=C(t.text);if(o.text===a)return{comment:_(o),changed:!1};S(o,t.if_revision);const d=h(),c=_(o).anchor,s=await M(r,o,{text:a},t.actor,d);return await w(r,{row:s,kind:"edited",actor:t.actor,operation_id:t.operation_id,at:d,payload:{previous_text:o.text,text:a,previous_anchor:c,anchor:_(s).anchor}}),{comment:_(s),changed:!0}});return O(n)}i($,"editComment");async function f(e,t,n,r){const o=await u(async a=>{const d=await E(a,e);if(d.status==="deleted"){if(n==="deleted")return{comment:_(d),changed:!1};throw new m("comment_deleted","comment is a deleted tombstone",{comment_id:d.comment_id,deleted_at:d.deleted_at})}if(d.status===n)return{comment:_(d),changed:!1};S(d,t.if_revision);const c=h(),s=await M(a,d,{status:n,resolved_at:n==="resolved"?c:n==="open"?null:void 0,deleted_at:n==="deleted"?c:void 0},t.actor,c);return await w(a,{row:s,kind:r,actor:t.actor,operation_id:t.operation_id,at:c,payload:{previous_status:d.status,status:n,previous_text:d.text,text:s.text,previous_anchor:_(d).anchor,anchor:_(s).anchor}}),{comment:_(s),changed:!0}});return O(o)}i(f,"transitionComment");async function G(e,t){return await f(e,t,"resolved","resolved")}i(G,"resolveComment");async function J(e,t){return await f(e,t,"open","reopened")}i(J,"reopenComment");async function j(e,t){return await f(e,t,"deleted","deleted")}i(j,"deleteComment");async function z(e,t){const n=await l(),r=t?.status;return(r===void 0?await n.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status != 'deleted' ORDER BY anchor_line, created_seq").all(e):r==="all"?await n.prepare("SELECT * FROM review_comments WHERE review_id = ? ORDER BY anchor_line, created_seq").all(e):await n.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status = ? ORDER BY anchor_line, created_seq").all(e,r)).map(_)}i(z,"listComments");async function K(e){const t=await p(await l(),e);return t===null?null:_(t)}i(K,"getComment");async function Q(e){return(await(await l()).prepare("SELECT * FROM review_comment_events WHERE comment_id = ? ORDER BY seq").all(e)).map(k)}i(Q,"listCommentEvents");async function Z(e,t){const n=t.since_seq??0,r=Math.min(Math.max(t.limit??F,1),U),a=(await(await l()).prepare("SELECT * FROM review_comment_events WHERE review_id = ? AND seq > ? ORDER BY seq LIMIT ?").all(e,n,r)).map(k);return{events:a,next_since_seq:a.length===0?n:a[a.length-1].seq}}i(Z,"listReviewEvents");async function g(e,t){const n=await e.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status != 'deleted' ORDER BY anchor_line, created_seq").all(t);return{comments:n.map(o=>({id:o.comment_id,line:o.anchor_line,endLine:o.anchor_end_line,...o.anchor_quote===null?{}:{quote:o.anchor_quote},...o.anchor_col_start===null?{}:{colStart:o.anchor_col_start},...o.anchor_col_end===null?{}:{colEnd:o.anchor_col_end},lineText:o.anchor_line_text,comment:o.text,createdAt:o.created_at})),total:n.length,unresolved:n.filter(o=>o.status==="open").length}}i(g,"snapshotCommentsLocked");async function ee(e){await u(async t=>{if(await L(t,e.review_id),(await E(t,e.comment_id)).review_id!==e.review_id)throw new m("unknown_comment","comment was not found",{received:e.comment_id});await t.prepare(`
18
+ `).run(c,e.review_id,o,e.anchor.line,e.anchor.end_line,e.anchor.col_start??null,e.anchor.col_end??null,e.anchor.quote??null,a,e.doc_hash,e.actor.kind,e.actor.node_id,e.actor.kind,e.actor.node_id,d,d)).changes!==1)throw new Error("failed to insert review comment");const y=await p(n,c),x=await w(n,{row:y,kind:"created",actor:e.actor,operation_id:e.operation_id,at:d,payload:{text:o,anchor:e.anchor,line_text:a,doc_hash:e.doc_hash}});return await n.prepare("UPDATE review_comments SET created_seq = ? WHERE comment_id = ?").run(x,c),{comment:_({...y,created_seq:x}),changed:!0}});return v(),t}i(P,"createComment");async function G(e,t){const n=await u(async r=>{const o=await E(r,e);if(o.status==="deleted")throw new m("comment_deleted","comment is a deleted tombstone",{comment_id:o.comment_id,deleted_at:o.deleted_at});const a=C(t.text);if(o.text===a)return{comment:_(o),changed:!1};S(o,t.if_revision);const d=h(),c=_(o).anchor,s=await M(r,o,{text:a},t.actor,d);return await w(r,{row:s,kind:"edited",actor:t.actor,operation_id:t.operation_id,at:d,payload:{previous_text:o.text,text:a,previous_anchor:c,anchor:_(s).anchor}}),{comment:_(s),changed:!0}});return O(n)}i(G,"editComment");async function f(e,t,n,r){const o=await u(async a=>{const d=await E(a,e);if(d.status==="deleted"){if(n==="deleted")return{comment:_(d),changed:!1};throw new m("comment_deleted","comment is a deleted tombstone",{comment_id:d.comment_id,deleted_at:d.deleted_at})}if(d.status===n)return{comment:_(d),changed:!1};S(d,t.if_revision);const c=h(),s=await M(a,d,{status:n,resolved_at:n==="resolved"?c:n==="open"?null:void 0,deleted_at:n==="deleted"?c:void 0},t.actor,c);return await w(a,{row:s,kind:r,actor:t.actor,operation_id:t.operation_id,at:c,payload:{previous_status:d.status,status:n,previous_text:d.text,text:s.text,previous_anchor:_(d).anchor,anchor:_(s).anchor}}),{comment:_(s),changed:!0}});return O(o)}i(f,"transitionComment");async function $(e,t){return await f(e,t,"resolved","resolved")}i($,"resolveComment");async function J(e,t){return await f(e,t,"open","reopened")}i(J,"reopenComment");async function j(e,t){return await f(e,t,"deleted","deleted")}i(j,"deleteComment");async function z(e,t){const n=await l(),r=t?.status;return(r===void 0?await n.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status != 'deleted' ORDER BY anchor_line, created_seq").all(e):r==="all"?await n.prepare("SELECT * FROM review_comments WHERE review_id = ? ORDER BY anchor_line, created_seq").all(e):await n.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status = ? ORDER BY anchor_line, created_seq").all(e,r)).map(_)}i(z,"listComments");async function K(e){const t=await p(await l(),e);return t===null?null:_(t)}i(K,"getComment");async function Q(e){return(await(await l()).prepare("SELECT * FROM review_comment_events WHERE comment_id = ? ORDER BY seq").all(e)).map(N)}i(Q,"listCommentEvents");async function Z(e,t){const n=t.since_seq??0,r=Math.min(Math.max(t.limit??U,1),F),a=(await(await l()).prepare("SELECT * FROM review_comment_events WHERE review_id = ? AND seq > ? ORDER BY seq LIMIT ?").all(e,n,r)).map(N);return{events:a,next_since_seq:a.length===0?n:a[a.length-1].seq}}i(Z,"listReviewEvents");async function g(e,t){const n=await e.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status != 'deleted' ORDER BY anchor_line, created_seq").all(t);return{comments:n.map(o=>({id:o.comment_id,line:o.anchor_line,endLine:o.anchor_end_line,...o.anchor_quote===null?{}:{quote:o.anchor_quote},...o.anchor_col_start===null?{}:{colStart:o.anchor_col_start},...o.anchor_col_end===null?{}:{colEnd:o.anchor_col_end},lineText:o.anchor_line_text,comment:o.text,createdAt:o.created_at})),total:n.length,unresolved:n.filter(o=>o.status==="open").length}}i(g,"snapshotCommentsLocked");async function ee(e){await u(async t=>{if(await L(t,e.review_id),(await E(t,e.comment_id)).review_id!==e.review_id)throw new m("unknown_comment","comment was not found",{received:e.comment_id});await t.prepare(`
18
19
  INSERT INTO review_comment_events
19
20
  (review_id, comment_id, kind, state_change, revision_after, actor_kind, actor_node_id, at, operation_id, payload)
20
21
  VALUES (?, ?, ?, 0, NULL, 'system', NULL, ?, ?, ?)
21
- `).run(e.review_id,e.comment_id,e.kind,h(),e.operation_id,N(e.payload))}),v()}i(ee,"appendDeliveryEvent");export{ee as appendDeliveryEvent,P as createComment,j as deleteComment,$ as editComment,K as getComment,Q as listCommentEvents,z as listComments,Z as listReviewEvents,J as reopenComment,G as resolveComment,g as snapshotCommentsLocked};
22
+ `).run(e.review_id,e.comment_id,e.kind,h(),e.operation_id,k(e.payload))}),v()}i(ee,"appendDeliveryEvent");export{ee as appendDeliveryEvent,P as createComment,j as deleteComment,G as editComment,K as getComment,Q as listCommentEvents,z as listComments,Z as listReviewEvents,J as reopenComment,$ as resolveComment,g as snapshotCommentsLocked};
@@ -1,6 +1,5 @@
1
- var d=Object.defineProperty;var i=(e,t)=>d(e,"name",{value:t,configurable:!0});import{openDb as f}from"../canvas/db.js";import{openAssistantBlock as b}from"../../daemon/runs/observer.js";import{SUBMIT_RESULT_TOOL as m}from"../runtime/structured-output.js";const p=120;function y(e){if(!e||typeof e!="object")return null;const t=e,s=[t.command,t.file_path,t.path].find(o=>typeof o=="string"&&o.trim()!=="");if(s===void 0)return null;const r=s.trim().split(`
2
- `)[0].trim();return r.length>p?`${r.slice(0,p-1)}\u2026`:r}i(y,"toolCallSummary");async function S(e,t,s=()=>b(e)){if(t!=="running")return null;const r=await f(),o=await r.prepare(`SELECT type, sequence_number FROM run_events WHERE run_id = ? AND node_id = ?
3
- AND type IN ('node.turn.started', 'node.turn.completed') ORDER BY sequence_number DESC LIMIT 1`).get(e,e);if(!o)return{phase:"starting"};if(o.type==="node.turn.completed")return{phase:"between_turns"};const l=s();if(l?.kind==="text")return{phase:"writing"};if(l?.kind==="tool_call")return l.name===m?{phase:"submitting_result"}:{phase:"tool",tool:{name:l.name,summary:null}};if(l===null){const u=await r.prepare(`SELECT type, json_extract(body_json, '$.tool_call_id') AS id, sequence_number FROM run_events
1
+ var d=Object.defineProperty;var l=(t,n)=>d(t,"name",{value:n,configurable:!0});import{openDb as _}from"../canvas/db.js";import{openAssistantBlock as f}from"../../daemon/runs/observer.js";import{SUBMIT_RESULT_TOOL as p}from"../runtime/structured-output.js";const m=120;function y(t){if(!t||typeof t!="object")return null;const n=t,s=[n.command,n.file_path,n.path].find(r=>typeof r=="string"&&r.trim()!=="");if(s===void 0)return null;const o=s.trim().split(`
2
+ `)[0].trim();return o.length>m?`${o.slice(0,m-1)}\u2026`:o}l(y,"toolCallSummary");async function g(t,n,s=()=>f(t)){if(n!=="running")return null;const o=await _(),r=await o.prepare(`SELECT type, sequence_number FROM run_events WHERE run_id = ? AND node_id = ?
3
+ AND type IN ('node.turn.started', 'node.turn.completed') ORDER BY sequence_number DESC LIMIT 1`).get(t,t);if(!r)return{phase:"starting"};if(r.type==="node.turn.completed")return{phase:"between_turns"};const i=s();if(i?.kind==="text")return{phase:"writing"};if(i?.kind==="tool_call")return i.name===p?{phase:"submitting_result"}:{phase:"tool",tool:{name:i.name,summary:null}};if(i===null){const a=(await o.prepare(`SELECT type, body_json, sequence_number FROM run_events
4
4
  WHERE run_id = ? AND node_id = ? AND type IN ('node.tool_call.started', 'node.tool_call.completed') AND sequence_number > ?
5
- ORDER BY sequence_number`).all(e,e,o.sequence_number),_=new Set(u.filter(n=>n.type==="node.tool_call.completed").map(n=>n.id)),c=u.filter(n=>n.type==="node.tool_call.started"&&!_.has(n.id)).at(-1);if(c){const n=await r.prepare(`SELECT json_extract(body_json, '$.name') AS name, json_extract(body_json, '$.arguments') AS args
6
- FROM run_events WHERE run_id = ? AND sequence_number = ?`).get(e,c.sequence_number);if(n.name===m)return{phase:"submitting_result"};let a=null;try{a=n.args===null?null:JSON.parse(n.args)}catch{a=null}return{phase:"tool",tool:{name:n.name,summary:y(a)}}}}return{phase:"thinking"}}i(S,"runActivity");export{S as runActivity,y as toolCallSummary};
5
+ ORDER BY sequence_number`).all(t,t,r.sequence_number)).map(e=>({...e,id:JSON.parse(e.body_json).tool_call_id})),c=new Set(a.filter(e=>e.type==="node.tool_call.completed").map(e=>e.id)),u=a.filter(e=>e.type==="node.tool_call.started"&&!c.has(e.id)).at(-1);if(u){const e=JSON.parse(u.body_json);return e.name===p?{phase:"submitting_result"}:{phase:"tool",tool:{name:e.name,summary:y(e.arguments??null)}}}}return{phase:"thinking"}}l(g,"runActivity");export{g as runActivity,y as toolCallSummary};
@@ -12,7 +12,7 @@ export declare function runPlace(nodeId: string, db?: CanvasDb): Promise<RunPlac
12
12
  export declare function rememberDeletedIsolated(nodeId: string, db?: CanvasDb): Promise<void>;
13
13
  /** The place of the node that registered a custom object, which is where that object
14
14
  * reads from; null when the person or the app's server registered it. */
15
- export declare function objectPlace(objectRowid: number, db?: CanvasDb): Promise<RunPlace | null>;
15
+ export declare function objectPlace(objectId: string, db?: CanvasDb): Promise<RunPlace | null>;
16
16
  /** The confinement predicate: two places see each other when they are the same
17
17
  * run, or when neither run is isolated. */
18
18
  export declare function runsSeeEachOther(a: RunPlace, b: RunPlace): boolean;
@@ -1,2 +1,2 @@
1
- var d=Object.defineProperty;var n=(t,e)=>d(t,"name",{value:e,configurable:!0});import{openDb as o}from"../canvas/db.js";async function u(t,e){e??=await o();const r=await e.prepare(`SELECT n.run_id, n.isolated, r.isolated AS root_isolated FROM nodes n
2
- LEFT JOIN nodes r ON r.node_id = n.run_id WHERE n.node_id = ?`).get(t);if(!r){const a=await e.prepare("SELECT run_id FROM deleted_isolated_nodes WHERE node_id = ?").get(t);return a?{run:a.run_id,isolated:!0}:null}return{run:r.run_id??t,isolated:r.isolated===1||r.root_isolated===1}}n(u,"runPlace");async function E(t,e){e??=await o();const r=await u(t,e);r?.isolated&&await e.prepare("INSERT OR REPLACE INTO deleted_isolated_nodes (node_id, run_id) VALUES (?, ?)").run(t,r.run)}n(E,"rememberDeletedIsolated");async function w(t,e){e??=await o();const r=await e.prepare("SELECT registered_by FROM custom_objects WHERE object = ?").get(t);return r?.registered_by?await u(r.registered_by,e)??{run:r.registered_by,isolated:!1}:null}n(w,"objectPlace");function l(t,e){return t.run===e.run||!t.isolated&&!e.isolated}n(l,"runsSeeEachOther");async function R(t,e,r,a,i){i??=await o();const s=await u(t,i);return s===null?!0:await c(s,e,r,a,i)}n(R,"nodeMayReach");async function c(t,e,r,a,i){if(i??=await o(),(a??"app:terminal")!==e)return!0;const s=await u(r,i);return s===null?!t.isolated:l(t,s)}n(c,"placeMayReach");async function f(t,e){return e??=await o(),(await e.prepare("SELECT node_id FROM nodes WHERE run_id = ? OR node_id = ?").all(t,t)).map(r=>r.node_id)}n(f,"runNodeIds");export{R as nodeMayReach,w as objectPlace,c as placeMayReach,E as rememberDeletedIsolated,f as runNodeIds,u as runPlace,l as runsSeeEachOther};
1
+ var s=Object.defineProperty;var n=(t,e)=>s(t,"name",{value:e,configurable:!0});import{openDb as o}from"../canvas/db.js";async function u(t,e){e??=await o();const r=await e.prepare(`SELECT n.run_id, n.isolated, r.isolated AS root_isolated FROM nodes n
2
+ LEFT JOIN nodes r ON r.node_id = n.run_id WHERE n.node_id = ?`).get(t);if(!r){const a=await e.prepare("SELECT run_id FROM deleted_isolated_nodes WHERE node_id = ?").get(t);return a?{run:a.run_id,isolated:!0}:null}return{run:r.run_id??t,isolated:r.isolated===1||r.root_isolated===1}}n(u,"runPlace");async function E(t,e){e??=await o();const r=await u(t,e);r?.isolated&&await e.prepare("INSERT INTO deleted_isolated_nodes (node_id, run_id) VALUES (?, ?) ON CONFLICT (node_id) DO UPDATE SET run_id = excluded.run_id").run(t,r.run)}n(E,"rememberDeletedIsolated");async function w(t,e){e??=await o();const r=await e.prepare("SELECT registered_by FROM custom_objects WHERE object = ?").get(t);return r?.registered_by?await u(r.registered_by,e)??{run:r.registered_by,isolated:!1}:null}n(w,"objectPlace");function l(t,e){return t.run===e.run||!t.isolated&&!e.isolated}n(l,"runsSeeEachOther");async function f(t,e,r,a,i){i??=await o();const d=await u(t,i);return d===null?!0:await c(d,e,r,a,i)}n(f,"nodeMayReach");async function c(t,e,r,a,i){if(i??=await o(),(a??"app:terminal")!==e)return!0;const d=await u(r,i);return d===null?!t.isolated:l(t,d)}n(c,"placeMayReach");async function y(t,e){return e??=await o(),(await e.prepare("SELECT node_id FROM nodes WHERE run_id = ? OR node_id = ?").all(t,t)).map(r=>r.node_id)}n(y,"runNodeIds");export{f as nodeMayReach,w as objectPlace,c as placeMayReach,E as rememberDeletedIsolated,y as runNodeIds,u as runPlace,l as runsSeeEachOther};
@@ -31,7 +31,7 @@ export declare function expireRunEvents(now: number, limit?: number): Promise<nu
31
31
  * An open turn's deltas and status/settlement markers are never redacted. Cursor scans
32
32
  * avoid re-searching the whole log each tick. Old event payload replay is a
33
33
  * deliberate tradeoff; event identities and 30-day sequence gaps survive. */
34
- export declare function compactRunEvents(now: number, afterRowid?: number, scanLimit?: number, writeLimit?: number): Promise<{
34
+ export declare function compactRunEvents(now: number, afterSeq?: number, scanLimit?: number, writeLimit?: number): Promise<{
35
35
  cursor: number;
36
36
  compacted: number;
37
37
  }>;