@north-light/cli 0.3.515 → 0.3.518

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 (48) hide show
  1. package/dist/api/contract.d.ts +1 -1
  2. package/dist/api/contract.js +1 -1
  3. package/dist/builtin-memory/crouter-plugin/bundles-and-memory.md +7 -1
  4. package/dist/builtin-memory/crouter-plugin/commands.md +18 -1
  5. package/dist/builtin-memory/crouter-sdk/release-notes.md +7 -0
  6. package/dist/clients/attach/render/doc-links.d.ts +5 -0
  7. package/dist/clients/attach/render/doc-links.js +1 -1
  8. package/dist/clients/attach/render/markdown-source.d.ts +5 -0
  9. package/dist/clients/attach/render/markdown-source.js +5 -5
  10. package/dist/clients/attach/session/document-links.js +1 -1
  11. package/dist/clients/attach/viewer.js +544 -535
  12. package/dist/clients/inbox/controller.js +1 -1
  13. package/dist/clients/inbox/tui/page-body.js +1 -1
  14. package/dist/clients/inbox/tui/render.js +2 -2
  15. package/dist/commands/sys/env.js +1 -1
  16. package/dist/core/command-plugins/bundle.js +1 -1
  17. package/dist/core/human/component-docs.js +5 -5
  18. package/dist/core/human/page-schema.d.ts +2 -0
  19. package/dist/core/human/page-schema.js +4 -1
  20. package/dist/core/human/page.js +6 -1
  21. package/dist/core/human/requests.d.ts +4 -1
  22. package/dist/core/human/requests.js +18 -18
  23. package/dist/core/profiles/app-env-store.js +1 -1
  24. package/dist/core/profiles/env-store.d.ts +3 -0
  25. package/dist/core/profiles/env-store.js +2 -2
  26. package/dist/core/runs/operations.js +4 -4
  27. package/dist/core/runs/questions.d.ts +6 -1
  28. package/dist/core/runs/questions.js +3 -3
  29. package/dist/core/termrender/version.d.ts +1 -1
  30. package/dist/core/termrender/version.js +1 -1
  31. package/dist/core/usage/ledger.js +4 -4
  32. package/dist/daemon/api/handlers/questions.d.ts +1 -1
  33. package/dist/daemon/api/handlers/questions.js +1 -1
  34. package/dist/daemon/api/operations.js +1 -1
  35. package/dist/daemon/crtrd.js +8 -8
  36. package/dist/launcher/main.d.ts +1 -1
  37. package/dist/launcher/main.js +1 -3
  38. package/dist/launcher/run.d.ts +5 -0
  39. package/dist/launcher/run.js +3 -0
  40. package/dist/shared/env.d.ts +5 -0
  41. package/dist/shared/env.js +2 -2
  42. package/docs/ci-runner.md +4 -4
  43. package/docs/plugin/bundles-and-memory.md +7 -1
  44. package/docs/plugin/commands.md +18 -1
  45. package/docs/sdk/release-notes.md +7 -0
  46. package/package.json +2 -2
  47. package/packages/crouter-identity/package.json +1 -1
  48. package/runtime.lock.json +12 -12
@@ -1,18 +1,18 @@
1
- var ce=Object.defineProperty;var i=(e,t)=>ce(e,"name",{value:t,configurable:!0});import{prepared as o}from"../sqlite-statements.js";import{createHash as le,randomBytes as w}from"node:crypto";import{existsSync as y,mkdirSync as D,readFileSync as V,readdirSync as _e,realpathSync as x,statSync as me,writeFileSync as pe}from"node:fs";import{basename as C,join as l}from"node:path";import{z as u}from"zod";import{crtrHome as Q,isSafeNodeId as fe,nodesRoot as S}from"../canvas/paths.js";import{openDb as _,withCanvasWrite as E}from"../canvas/db.js";import{syncDirectory as Ee,syncFile as ge}from"../fs-utils.js";import{newNodeId as ye}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,validatePageManifest as z}from"./page-schema.js";import{appendWaitingOnUser as Ae}from"../runs/questions.js";function G(e){return e===1||e===!0}i(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}}i(Z,"recordFromRow");function q(e,t,...r){const s=e.prepare(`SELECT * FROM human_requests WHERE ${t}`).get(...r);return s===void 0?null:Z(s)}i(q,"one");function T(e,t,r=[],s="created_at ASC, request_id ASC"){return e.prepare(`SELECT * FROM human_requests WHERE ${t} ORDER BY ${s}`).all(...r).map(Z)}i(T,"many");function ee(){return l(Q(),"requests")}i(ee,"humanRequestsRoot");function P(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}),l(x(t),e)}i(P,"requestDir");function U(){return w(32).toString("hex")}i(U,"randomTicketId");function H(e,t){return le("sha256").update(`${x(e)}\0${t}`,"utf8").digest("hex")}i(H,"legacyTicketId");const Re={writeFile(e,t){pe(e,t,{flag:"wx",mode:384})},syncFile:ge,syncDirectory:Ee};function ve(e){return l(e,"revisions")}i(ve,"revisionRoot");function te(e,t,r=Re){D(e,{recursive:!0,mode:448});const s=ve(e);D(s,{recursive:!0,mode:448});const n=l(s,w(16).toString("hex"));D(n,{mode:448});const a=qe(n,t.manifest.dialect);if(r.writeFile(a,t.document),r.syncFile(a),t.manifest.dialect==="jsx"){const d=he(n);r.writeFile(d,t.module),r.syncFile(d)}const c=Ne(n);return r.writeFile(c,`${JSON.stringify(t.manifest,null,2)}
2
- `),r.syncFile(c),r.syncDirectory(n),r.syncDirectory(s),r.syncDirectory(e),r.syncDirectory(ee()),n}i(te,"publishPageRevision");function tt(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}i(tt,"presentationDir");function nt(e){const t=e.request_id??ye(),r=P(t),s=te(r,e.prepared),n=new Date().toISOString(),a=e.prepared.manifest;return E(c=>{o(c,`
1
+ var ue=Object.defineProperty;var i=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{prepared as o}from"../sqlite-statements.js";import{createHash as le,randomBytes as w}from"node:crypto";import{existsSync as y,mkdirSync as v,readFileSync as V,readdirSync as _e,realpathSync as x,statSync as pe,writeFileSync as me}from"node:fs";import{basename as C,join as l}from"node:path";import{z as c}from"zod";import{crtrHome as Q,isSafeNodeId as fe,nodesRoot as S}from"../canvas/paths.js";import{openDb as _,withCanvasWrite as E}from"../canvas/db.js";import{syncDirectory as Ee,syncFile as ge}from"../fs-utils.js";import{newNodeId as ye}from"../runtime/nodes.js";import{pageManifestPath as Ne,pageModulePath as qe,pagePath as Te}from"./convention.js";import{preparePageSource as he}from"./page-authoring.js";import{pageAwaitsResponse as be,pageDeliverySchema as Se,pageIsNoticeSql as Ae,validatePageManifest as z}from"./page-schema.js";import{appendWaitingOnUser as De}from"../runs/questions.js";function G(e){return e===1||e===!0}i(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}}i(Z,"recordFromRow");function T(e,t,...r){const s=e.prepare(`SELECT * FROM human_requests WHERE ${t}`).get(...r);return s===void 0?null:Z(s)}i(T,"one");function h(e,t,r=[],s="created_at ASC, request_id ASC"){return e.prepare(`SELECT * FROM human_requests WHERE ${t} ORDER BY ${s}`).all(...r).map(Z)}i(h,"many");function ee(){return l(Q(),"requests")}i(ee,"humanRequestsRoot");function P(e){if(!fe(e))throw new TypeError(`request_id must be a safe path segment: ${e}`);const t=ee();return v(t,{recursive:!0,mode:448}),l(x(t),e)}i(P,"requestDir");function U(){return w(32).toString("hex")}i(U,"randomTicketId");function H(e,t){return le("sha256").update(`${x(e)}\0${t}`,"utf8").digest("hex")}i(H,"legacyTicketId");const Re={writeFile(e,t){me(e,t,{flag:"wx",mode:384})},syncFile:ge,syncDirectory:Ee};function ve(e){return l(e,"revisions")}i(ve,"revisionRoot");function te(e,t,r=Re){v(e,{recursive:!0,mode:448});const s=ve(e);v(s,{recursive:!0,mode:448});const n=l(s,w(16).toString("hex"));v(n,{mode:448});const a=Te(n,t.manifest.dialect);if(r.writeFile(a,t.document),r.syncFile(a),t.manifest.dialect==="jsx"){const d=qe(n);r.writeFile(d,t.module),r.syncFile(d)}const u=Ne(n);return r.writeFile(u,`${JSON.stringify(t.manifest,null,2)}
2
+ `),r.syncFile(u),r.syncDirectory(n),r.syncDirectory(s),r.syncDirectory(e),r.syncDirectory(ee()),n}i(te,"publishPageRevision");function rt(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}i(rt,"presentationDir");function it(e){const t=e.request_id??ye(),r=P(t),s=te(r,e.prepared),n=new Date().toISOString(),a=e.prepared.manifest;return E(u=>{o(u,`
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(),r,s,e.requester_node_id??null,a.delivery.inbox?1:0,a.delivery.inbox||a.delivery.reply?1:0,a.title,a.subtitle??null,JSON.stringify(a),e.action_json??null,n,n);const d=q(c,"request_id = ?",t);if(d===null)throw new Error(`page request insert did not produce a row: ${t}`);return Ae(c,d),d})}i(nt,"createPageRequest");function rt(e){return E(t=>{const r=o(t,`
7
+ `).run(t,e.inbox_ticket_id??U(),r,s,e.requester_node_id??null,a.delivery.inbox?1:0,a.delivery.inbox||a.delivery.reply?1:0,a.title,a.subtitle??null,JSON.stringify(a),e.action_json??null,n,n);const d=T(u,"request_id = ?",t);if(d===null)throw new Error(`page request insert did not produce a row: ${t}`);return De(u,d),d})}i(it,"createPageRequest");function st(e){return E(t=>{const r=o(t,`
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??C(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=q(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:r.changes>0}})}i(rt,"commitBindingRequest");function it(e){return q(_(),"request_id = ?",e)}i(it,"getRequest");function st(e){return q(_(),"inbox_ticket_id = ?",e)}i(st,"getRequestByInboxTicket");function ot(e){let t=e;try{t=x(e)}catch{}return q(_(),"request_dir = ?",t)}i(ot,"getRequestByDirectory");function at(e){return q(_(),"companion_node_id = ? AND state <> 'binding'",e)}i(at,"getRequestByCompanion");function dt(e){return q(_(),"idempotency_key = ?",e)}i(dt,"getRequestByIdempotencyKey");const ne=`NOT (kind = 'page' AND EXISTS (SELECT 1 FROM node_rows n WHERE n.node_id = human_requests.requester_node_id
15
- AND n.run_id IS NOT NULL AND n.grantee IS NOT NULL AND n.grantee <> 'app:terminal'))`;function ut(){return T(_(),`state = 'open' AND inbox_listed = 1 AND ${ne}`,[],"created_at DESC, request_id DESC")}i(ut,"listOpenInboxRequests");function ct(){return T(_(),`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)))}i(ct,"listPendingAsks");function De(e){return T(_(),"state = 'open' AND requester_node_id = ?",[e],"created_at DESC, request_id DESC")}i(De,"openRequestsByRequester");function lt(e){return De(e).some(t=>t.kind==="review"?!0:JSON.parse(t.specification_json).delivery?.reply===!0)}i(lt,"hasOpenReplyBearingRequestByRequester");function _t(){return T(_(),"state = 'open' AND inbox_listed = 1 AND requester_node_id IS NOT NULL",[],"created_at DESC, request_id DESC")}i(_t,"listOpenReplyBearingRequests");function mt(){return T(_(),"kind = 'review' AND state = 'binding'")}i(mt,"listBindingRequests");function pt(){return T(_(),"kind = 'review' AND state = 'open' AND submit_requested_at IS NOT NULL")}i(pt,"listSubmitRequestedRequests");function ft(){return T(_(),"kind = 'review' AND state = 'settled' AND projected_at IS NULL")}i(ft,"listUnprojectedReviews");function Et(e={}){const t=["1"],r=[];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} = ?`),r.push(n));return T(_(),t.join(" AND "),r)}i(Et,"listRequests");function gt(){return o(_(),`
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??C(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=T(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:r.changes>0}})}i(st,"commitBindingRequest");function ot(e){return T(_(),"request_id = ?",e)}i(ot,"getRequest");function at(e){return T(_(),"inbox_ticket_id = ?",e)}i(at,"getRequestByInboxTicket");function dt(e){let t=e;try{t=x(e)}catch{}return T(_(),"request_dir = ?",t)}i(dt,"getRequestByDirectory");function ct(e){return T(_(),"companion_node_id = ? AND state <> 'binding'",e)}i(ct,"getRequestByCompanion");function ut(e){return T(_(),"idempotency_key = ?",e)}i(ut,"getRequestByIdempotencyKey");const Oe=i(e=>`COALESCE(${e}.requester_node_id, CASE WHEN ${e}.kind = 'page' AND ${Ae(`${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 = ${Oe("human_requests")}
15
+ AND n.run_id IS NOT NULL AND n.grantee IS NOT NULL AND n.grantee <> 'app:terminal'))`;function lt(){return h(_(),`state = 'open' AND inbox_listed = 1 AND ${ne}`,[],"created_at DESC, request_id DESC")}i(lt,"listOpenInboxRequests");function _t(){return h(_(),`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)))}i(_t,"listPendingAsks");function je(e){return h(_(),"state = 'open' AND requester_node_id = ?",[e],"created_at DESC, request_id DESC")}i(je,"openRequestsByRequester");function pt(e){return je(e).some(t=>t.kind==="review"?!0:JSON.parse(t.specification_json).delivery?.reply===!0)}i(pt,"hasOpenReplyBearingRequestByRequester");function mt(){return h(_(),"state = 'open' AND inbox_listed = 1 AND requester_node_id IS NOT NULL",[],"created_at DESC, request_id DESC")}i(mt,"listOpenReplyBearingRequests");function ft(){return h(_(),"kind = 'review' AND state = 'binding'")}i(ft,"listBindingRequests");function Et(){return h(_(),"kind = 'review' AND state = 'open' AND submit_requested_at IS NOT NULL")}i(Et,"listSubmitRequestedRequests");function gt(){return h(_(),"kind = 'review' AND state = 'settled' AND projected_at IS NULL")}i(gt,"listUnprojectedReviews");function yt(e={}){const t=["1"],r=[];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} = ?`),r.push(n));return h(_(),t.join(" AND "),r)}i(yt,"listRequests");function Nt(){return o(_(),`
16
16
  SELECT 1 FROM human_requests INDEXED BY idx_human_requests_page_result_exception
17
17
  WHERE kind = 'page' AND result_json IS NOT NULL AND
18
18
  CASE WHEN json_valid(result_json) THEN
@@ -20,37 +20,37 @@ var ce=Object.defineProperty;var i=(e,t)=>ce(e,"name",{value:t,configurable:!0})
20
20
  AND json_type(result_json, '$.summary') IS NOT 'text'
21
21
  ELSE 1 END
22
22
  LIMIT 1
23
- `).get()!==void 0}i(gt,"hasPageResultException");function yt(){return o(_(),`
23
+ `).get()!==void 0}i(Nt,"hasPageResultException");function qt(){return o(_(),`
24
24
  SELECT request_id, specification_json FROM human_requests INDEXED BY idx_human_requests_page_invalid_spec
25
25
  WHERE kind = 'page' AND (NOT json_valid(specification_json)
26
26
  OR CASE WHEN json_valid(specification_json) THEN json_type(specification_json) != 'object' END)
27
27
  ORDER BY created_at ASC, request_id ASC LIMIT 1
28
- `).get()??null}i(yt,"firstInvalidPageSpecification");function Nt(e,t){return E(r=>o(r,"UPDATE human_requests SET state = 'open', opened_at = ?, updated_at = ? WHERE request_id = ? AND state = 'binding'").run(t,t,e).changes>0)}i(Nt,"openRequest");function ht(e,t,r){return E(s=>o(s,`
28
+ `).get()??null}i(qt,"firstInvalidPageSpecification");function Tt(e,t){return E(r=>o(r,"UPDATE human_requests SET state = 'open', opened_at = ?, updated_at = ? WHERE request_id = ? AND state = 'binding'").run(t,t,e).changes>0)}i(Tt,"openRequest");function ht(e,t,r){return E(s=>o(s,`
29
29
  UPDATE human_requests SET state = 'settled', outcome = 'canceled', result_json = ?, settled_at = ?, updated_at = ?
30
30
  WHERE request_id = ? AND kind = 'review' AND state = 'binding'
31
- `).run(JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:t,reason:r}),t,t,e).changes>0)}i(ht,"cancelBindingRequest");function qt(e,t){return E(r=>o(r,"UPDATE human_requests SET submit_requested_at = ?, updated_at = ? WHERE request_id = ? AND kind = 'review' AND state = 'open' AND submit_requested_at IS NULL").run(t,t,e).changes>0)}i(qt,"requestSubmit");function Tt(e,t){return o(e,`
31
+ `).run(JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:t,reason:r}),t,t,e).changes>0)}i(ht,"cancelBindingRequest");function bt(e,t){return E(r=>o(r,"UPDATE human_requests SET submit_requested_at = ?, updated_at = ? WHERE request_id = ? AND kind = 'review' AND state = 'open' AND submit_requested_at IS NULL").run(t,t,e).changes>0)}i(bt,"requestSubmit");function St(e,t){return o(e,`
32
32
  UPDATE human_requests SET state = 'settled', outcome = ?, result_json = ?, settled_at = ?,
33
33
  progress_json = NULL, updated_at = ?
34
34
  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:q(e,"request_id = ?",t.request_id)}i(Tt,"settleRequestLocked");function bt(e,t,r){o(e,"UPDATE human_requests SET settlement_delivery_id = ?, action_delivery_id = ?, updated_at = ? WHERE request_id = ?").run(r.settlement_delivery_id??null,r.action_delivery_id??null,new Date().toISOString(),t)}i(bt,"setSettlementDeliveryMarksLocked");function St(e,t,r){return o(e,"UPDATE human_requests SET submit_note_delivery_id = ?, updated_at = ? WHERE request_id = ? AND state = 'open' AND submit_note_delivery_id IS NULL").run(r,new Date().toISOString(),t).changes>0}i(St,"setSubmitNoteDeliveryLocked");function At(e,t){return E(r=>o(r,`
35
+ `).run(t.outcome,t.result_json,t.settled_at,t.settled_at,t.request_id).changes===0?null:T(e,"request_id = ?",t.request_id)}i(St,"settleRequestLocked");function At(e,t,r){o(e,"UPDATE human_requests SET settlement_delivery_id = ?, action_delivery_id = ?, updated_at = ? WHERE request_id = ?").run(r.settlement_delivery_id??null,r.action_delivery_id??null,new Date().toISOString(),t)}i(At,"setSettlementDeliveryMarksLocked");function Dt(e,t,r){return o(e,"UPDATE human_requests SET submit_note_delivery_id = ?, updated_at = ? WHERE request_id = ? AND state = 'open' AND submit_note_delivery_id IS NULL").run(r,new Date().toISOString(),t).changes>0}i(Dt,"setSubmitNoteDeliveryLocked");function Rt(e,t){return E(r=>o(r,`
36
36
  UPDATE human_requests SET presentation_dir = ?, specification_json = ?, title = ?, subtitle = ?, inbox_listed = ?, settleable = ?, updated_at = ?
37
37
  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)}i(At,"revisePageRequest");function Rt(e,t){return E(r=>o(r,`
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)}i(Rt,"revisePageRequest");function vt(e,t){return E(r=>o(r,`
39
39
  UPDATE human_requests SET progress_json = ?, updated_at = ?
40
40
  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)}i(Rt,"writeProgress");function vt(e,t){E(r=>o(r,"UPDATE human_requests SET projected_at = ?, projection_error = NULL, updated_at = ? WHERE request_id = ?").run(t,t,e))}i(vt,"markProjected");function Dt(e,t){E(r=>o(r,"UPDATE human_requests SET projection_error = ?, updated_at = ? WHERE request_id = ? AND projected_at IS NULL").run(t,new Date().toISOString(),e))}i(Dt,"markProjectionError");function Ot(e,t){E(r=>o(r,"UPDATE human_requests SET companion_retired_at = ?, updated_at = ? WHERE request_id = ? AND companion_retired_at IS NULL").run(t,t,e))}i(Ot,"markCompanionRetired");function jt(e){const t=o(_(),"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}}i(jt,"readAnchorBase");function It(e,t,r,s){o(e,"UPDATE human_requests SET anchor_base_bytes = ?, anchor_base_sha256 = ?, updated_at = ? WHERE request_id = ?").run(r,s,new Date().toISOString(),t)}i(It,"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)}}i(Oe,"legacyPageResult");function v(e){try{return JSON.parse(V(e,"utf8"))}catch(t){throw new Error(`corrupt required input: ${e}`,{cause:t})}}i(v,"readJson");function $(){return w(16).toString("hex")}i($,"migrationId");function je(e){return Number(o(e,"SELECT COALESCE(MAX(seq), 0) AS seq FROM messages").get().seq)+1}i(je,"nextMessageSeq");function Ie(e,t,r,s){return(s==="page"?o(e,`SELECT d.delivery_id FROM deliveries d JOIN messages m ON m.message_id = d.message_id
41
+ `).run(JSON.stringify({kind:"page",responses:t,savedAt:new Date().toISOString()}),new Date().toISOString(),e).changes>0)}i(vt,"writeProgress");function Ot(e,t){E(r=>o(r,"UPDATE human_requests SET projected_at = ?, projection_error = NULL, updated_at = ? WHERE request_id = ?").run(t,t,e))}i(Ot,"markProjected");function jt(e,t){E(r=>o(r,"UPDATE human_requests SET projection_error = ?, updated_at = ? WHERE request_id = ? AND projected_at IS NULL").run(t,new Date().toISOString(),e))}i(jt,"markProjectionError");function It(e,t){E(r=>o(r,"UPDATE human_requests SET companion_retired_at = ?, updated_at = ? WHERE request_id = ? AND companion_retired_at IS NULL").run(t,t,e))}i(It,"markCompanionRetired");function xt(e){const t=o(_(),"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}}i(xt,"readAnchorBase");function Lt(e,t,r,s){o(e,"UPDATE human_requests SET anchor_base_bytes = ?, anchor_base_sha256 = ?, updated_at = ? WHERE request_id = ?").run(r,s,new Date().toISOString(),t)}i(Lt,"replaceAnchorBaseLocked");function Ie(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)}}i(Ie,"legacyPageResult");function R(e){try{return JSON.parse(V(e,"utf8"))}catch(t){throw new Error(`corrupt required input: ${e}`,{cause:t})}}i(R,"readJson");function $(){return w(16).toString("hex")}i($,"migrationId");function xe(e){return Number(o(e,"SELECT COALESCE(MAX(seq), 0) AS seq FROM messages").get().seq)+1}i(xe,"nextMessageSeq");function Le(e,t,r,s){return(s==="page"?o(e,`SELECT d.delivery_id FROM deliveries d JOIN messages m ON m.message_id = d.message_id
42
42
  WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.sender_node_id = ?
43
43
  AND m.disposition IN ('human-answer', 'human-canceled') LIMIT 1`).get(r,t):o(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(r,`%"review_id":"${t}"%`))?.delivery_id??null}i(Ie,"importedTerminalDelivery");function re(e,t,r){if(t===null||r===null)return!1;const s=o(e,"SELECT status, final_report FROM nodes WHERE node_id = ?").get(t);return s?.status==="canceled"||r==="approved"&&s?.status==="done"&&s.final_report!==null}i(re,"companionRetirementProven");function ie(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"}i(ie,"migratedCancellationReason");function xe(e,t){const r=e.outcome==="canceled"||e.outcome==="dismissed";return[e.kind==="review"?r?`Review ${e.requestId} was canceled \u2014 ${ie(t)}.`:`Review ${e.requestId} was approved by the user.`:r?`Human request ${e.requestId} was canceled \u2014 ${ie(t)}.`:`Human request ${e.requestId} was answered.`,...e.kind==="review"?[`The review result is at ${e.requestDir}/result.json.`]:[],`Result:
44
+ WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.body_json LIKE ? LIMIT 1`).get(r,`%"review_id":"${t}"%`))?.delivery_id??null}i(Le,"importedTerminalDelivery");function re(e,t,r){if(t===null||r===null)return!1;const s=o(e,"SELECT status, final_report FROM nodes WHERE node_id = ?").get(t);return s?.status==="canceled"||r==="approved"&&s?.status==="done"&&s.final_report!==null}i(re,"companionRetirementProven");function ie(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"}i(ie,"migratedCancellationReason");function ke(e,t){const r=e.outcome==="canceled"||e.outcome==="dismissed";return[e.kind==="review"?r?`Review ${e.requestId} was canceled \u2014 ${ie(t)}.`:`Review ${e.requestId} was approved by the user.`:r?`Human request ${e.requestId} was canceled \u2014 ${ie(t)}.`:`Human request ${e.requestId} was answered.`,...e.kind==="review"?[`The review result is at ${e.requestDir}/result.json.`]:[],`Result:
45
45
  ${JSON.stringify(t,null,2)}`].join(`
46
46
 
47
- `)}i(xe,"migratedTerminalBody");function Le(e,t){const r=$(),s=$(),n=Date.parse(t.settledAt),a=Number.isFinite(n)?n:0,c=t.outcome==="answered"||t.outcome==="approved"?"human-answer":"human-canceled",d=JSON.parse(t.resultJson),m=xe(t,d);return o(e,`INSERT INTO messages
47
+ `)}i(ke,"migratedTerminalBody");function we(e,t){const r=$(),s=$(),n=Date.parse(t.settledAt),a=Number.isFinite(n)?n:0,u=t.outcome==="answered"||t.outcome==="approved"?"human-answer":"human-canceled",d=JSON.parse(t.resultJson),p=ke(t,d);return o(e,`INSERT INTO messages
48
48
  (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(r,je(e),$(),t.settledAt,m.split(`
50
- `,1)[0],JSON.stringify({body:m,result:d}),c),o(e,`INSERT INTO deliveries
49
+ VALUES (?, ?, ?, ?, NULL, 'crtrd', 'completed', ?, NULL, ?, ?)`).run(r,xe(e),$(),t.settledAt,p.split(`
50
+ `,1)[0],JSON.stringify({body:p,result:d}),u),o(e,`INSERT INTO deliveries
51
51
  (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,r,t.requesterNodeId,a,a),s}i(Le,"createMigratedTerminalDelivery");function se(e,t){if(t.requesterNodeId===null||t.outcome===null||t.resultJson===null||t.settledAt===null)return null;const r=Ie(e,t.requestId,t.requesterNodeId,t.kind);return r!==null?r:t.deliveredAt!==null&&t.deliveredAt!==void 0?null:Le(e,{requestId:t.requestId,requesterNodeId:t.requesterNodeId,kind:t.kind,outcome:t.outcome,resultJson:t.resultJson,settledAt:t.settledAt,requestDir:t.requestDir})}i(se,"terminalDeliveryMark");const ke=u.object({sessionName:u.string().optional(),askedBy:u.string().optional(),blockedSince:u.string().optional(),profileName:u.string().optional(),nodeId:u.string().optional()}).strict(),we=u.object({id:u.string().regex(/^[A-Za-z0-9_-]{1,64}$/).optional(),kind:u.string().min(1),step:u.number().int().nonnegative(),config:u.record(u.string(),u.unknown()),unvalidated:u.literal(!0).optional(),display:u.literal(!0).optional()}).strict(),Ce=u.object({schema:u.literal("crtr.page/v1"),dialect:u.enum(["md","html","jsx"]),title:u.string().trim().min(1),subtitle:u.string().optional(),placement:u.enum(["inline","panel"]),document:u.enum(["page.md","page.html","page.tsx"]),steps:u.number().int().positive(),slots:u.array(we),source:ke.optional()}).strict().superRefine((e,t)=>{const r=e.dialect==="md"?"page.md":e.dialect==="html"?"page.html":"page.tsx";e.document!==r&&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 Pe(e){if(e.source===void 0)return;const{blockedSince:t,...r}=e.source,s={...r,...t!==void 0&&u.string().datetime({offset:!0}).safeParse(t).success?{emittedAt:t}:{}};return Object.keys(s).length===0?void 0:s}i(Pe,"legacyPresentationSource");function Ue(e,t,r){return`export default function LegacyPage() { return <Page title={${JSON.stringify(e)}}${t===void 0?"":` subtitle={${JSON.stringify(t)}}`}><pre>{${JSON.stringify(r)}}</pre></Page>; }
53
- `}i(Ue,"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 r=t;if(r.kind!=="text"||typeof r.config!="object"||r.config===null||Array.isArray(r.config))return t;const{editable:s,...n}=r.config;return{...r,config:n}})}:e}i(oe,"withoutLegacyTextEditable");function He(e,t){const r=l(e,"page.json"),s=Ce.safeParse(t);if(!s.success)throw new Error(s.error.message);const n=s.data,a=Pe(n),c={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:c,document:"page.tsx",steps:n.steps,slots:n.slots,...a===void 0?{}:{source:a}}));const d=l(e,n.document);if(!y(d))throw new Error(`corrupt required input: ${d}`);const m=V(d,"utf8"),f=Te({dialect:"jsx",document:Ue(n.title,n.subtitle,m),source:a,delivery:c});if(a!==void 0)return f;const{source:g,...N}=f.manifest;return{...f,manifest:N}}i(He,"migrateLegacyPage");function xt(e){e.exec(`
52
+ VALUES (?, ?, 'node_inbox', ?, 'normal', 1, 'pending', 0, ?, ?)`).run(s,r,t.requesterNodeId,a,a),s}i(we,"createMigratedTerminalDelivery");function se(e,t){if(t.requesterNodeId===null||t.outcome===null||t.resultJson===null||t.settledAt===null)return null;const r=Le(e,t.requestId,t.requesterNodeId,t.kind);return r!==null?r:t.deliveredAt!==null&&t.deliveredAt!==void 0?null:we(e,{requestId:t.requestId,requesterNodeId:t.requesterNodeId,kind:t.kind,outcome:t.outcome,resultJson:t.resultJson,settledAt:t.settledAt,requestDir:t.requestDir})}i(se,"terminalDeliveryMark");const Ce=c.object({sessionName:c.string().optional(),askedBy:c.string().optional(),blockedSince:c.string().optional(),profileName:c.string().optional(),nodeId:c.string().optional()}).strict(),Pe=c.object({id:c.string().regex(/^[A-Za-z0-9_-]{1,64}$/).optional(),kind:c.string().min(1),step:c.number().int().nonnegative(),config:c.record(c.string(),c.unknown()),unvalidated:c.literal(!0).optional(),display:c.literal(!0).optional()}).strict(),Ue=c.object({schema:c.literal("crtr.page/v1"),dialect:c.enum(["md","html","jsx"]),title:c.string().trim().min(1),subtitle:c.string().optional(),placement:c.enum(["inline","panel"]),document:c.enum(["page.md","page.html","page.tsx"]),steps:c.number().int().positive(),slots:c.array(Pe),source:Ce.optional()}).strict().superRefine((e,t)=>{const r=e.dialect==="md"?"page.md":e.dialect==="html"?"page.html":"page.tsx";e.document!==r&&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,...r}=e.source,s={...r,...t!==void 0&&c.string().datetime({offset:!0}).safeParse(t).success?{emittedAt:t}:{}};return Object.keys(s).length===0?void 0:s}i(He,"legacyPresentationSource");function $e(e,t,r){return`export default function LegacyPage() { return <Page title={${JSON.stringify(e)}}${t===void 0?"":` subtitle={${JSON.stringify(t)}}`}><pre>{${JSON.stringify(r)}}</pre></Page>; }
53
+ `}i($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 r=t;if(r.kind!=="text"||typeof r.config!="object"||r.config===null||Array.isArray(r.config))return t;const{editable:s,...n}=r.config;return{...r,config:n}})}:e}i(oe,"withoutLegacyTextEditable");function Xe(e,t){const r=l(e,"page.json"),s=Ue.safeParse(t);if(!s.success)throw new Error(s.error.message);const n=s.data,a=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,...a===void 0?{}:{source:a}}));const d=l(e,n.document);if(!y(d))throw new Error(`corrupt required input: ${d}`);const p=V(d,"utf8"),f=he({dialect:"jsx",document:$e(n.title,n.subtitle,p),source:a,delivery:u});if(a!==void 0)return f;const{source:g,...N}=f.manifest;return{...f,manifest:N}}i(Xe,"migrateLegacyPage");function kt(e){e.exec(`
54
54
  CREATE TABLE human_requests (
55
55
  request_id TEXT PRIMARY KEY, kind TEXT NOT NULL CHECK (kind IN ('page','review')),
56
56
  inbox_ticket_id TEXT NOT NULL UNIQUE, request_dir TEXT NOT NULL, presentation_dir TEXT,
@@ -79,4 +79,4 @@ ${JSON.stringify(t,null,2)}`].join(`
79
79
  progress_json, feedback_json, result_json, anchor_base_sha256, anchor_base_bytes, created_at, opened_at,
80
80
  submit_requested_at, settled_at, settlement_delivery_id, action_delivery_id, projected_at, projection_error,
81
81
  companion_retired_at, updated_at
82
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);if(o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'reviews'").get()!==void 0){const s=o(e,"SELECT * FROM reviews").all();for(const n of s){const a=n.state,c=a==="approved"||a==="canceled",d=a==="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(c&&d===null)throw new Error(`corrupt required input: reviews/${n.review_id} has no terminal result`);const m=n.bridge_node_id===null?l(Q(),"reviews",n.review_id):l(S(),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},g=c?a==="approved"?"approved":"canceled":null,N=c?a==="approved"?n.approved_at:n.canceled_at:null,A=se(e,{requestId:n.review_id,requesterNodeId:n.origin_node_id,kind:"review",outcome:g,resultJson:d,settledAt:N,requestDir:m,deliveredAt:n.delivered_at}),O=re(e,n.companion_node_id,g)?N:null;t.run(n.review_id,"review",n.origin_kind==="ticket"?H(S(),C(m)):U(),m,null,n.origin_node_id,n.companion_node_id,n.idempotency_key,c?"settled":a,g,n.origin_kind==="ticket"?1:0,1,C(n.file),n.subtitle,n.file,JSON.stringify(f),null,null,null,d,n.anchor_base_sha256,n.anchor_base_bytes,n.created,n.opened_at,n.submit_requested_at,N,A,null,n.projected_at,n.projection_error,O,n.created)}e.exec("DROP TABLE reviews")}for(const s of y(S())?_e(S(),{withFileTypes:!0}):[]){if(!s.isDirectory())continue;const n=l(S(),s.name),a=l(n,"page.json"),c=l(n,"review.json");if(!y(a)){if(y(c))continue;continue}if(o(e,"SELECT 1 FROM human_requests WHERE request_id = ?").get(s.name)!==void 0)continue;let d,m,f,g;try{const p=v(a);if(typeof p!="object"||p===null||Array.isArray(p))throw new Error("page manifest must be an object");d=p,d.schema==="crtr.page/v1"?(m=He(n,p),d=m.manifest):d.schema==="crtr.page/v2"&&(d=oe(d));const R=Se.safeParse(d.delivery);if(typeof d.title!="string"||!R.success)throw new Error(R.success?"page title must be a string":R.error.message);g=R.data,f=z(d)}catch(p){const R=p instanceof Error&&p.cause instanceof Error?p.cause.message:p instanceof Error?p.message:String(p);console.warn(`skipping legacy page ${a}: ${R}`);continue}let N=x(n);m!==void 0&&(N=te(P(s.name),m));const A=f.source,O=l(n,"response.json"),j=y(O)?v(O):null,h=j===null?null:Oe(j),ae=o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'deliveries'").get()===void 0?null:o(e,"SELECT delivery_id FROM deliveries WHERE idempotency_key = ?").get(`human-action:${H(S(),s.name)}`),X=l(n,"action.json"),M=l(n,"progress.json"),L=l(n,"feedback-comments.json"),k=l(n,"reply-route.json"),b=y(L)?v(L):null;if(b!==null&&(typeof b!="object"||typeof b.companionNodeId<"u"&&typeof b.companionNodeId!="string"))throw new Error(`corrupt required input: ${L}`);const I=y(k)?v(k):null;if(I!==null&&(typeof I!="object"||typeof I.bridge_node_id!="string"))throw new Error(`corrupt required input: ${k}`);const W=I?.bridge_node_id,F=(typeof W!="string"||o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'nodes'").get()===void 0?null:o(e,"SELECT parent FROM nodes WHERE node_id = ?").get(W))?.parent??(typeof A?.nodeId=="string"?A.nodeId:null),J=b?.companionNodeId,B=typeof A?.emittedAt=="string"?A.emittedAt:me(a).mtime.toISOString(),K=j===null?null:JSON.stringify(j),de=se(e,{requestId:s.name,requesterNodeId:F,kind:"page",outcome:h?.outcome??null,resultJson:K,settledAt:h?.settledAt??null,requestDir:n}),ue=re(e,J??null,h?.outcome??null)?h?.settledAt??null:null,Y=P(s.name);D(Y,{recursive:!0,mode:448}),t.run(s.name,"page",H(S(),s.name),Y,N,F,J??null,null,h===null?"open":"settled",h?.outcome??null,g.inbox?1:0,g.inbox||g.reply?1:0,f.title,f.subtitle??null,null,JSON.stringify(f),y(X)?JSON.stringify(v(X)):null,y(M)&&h===null?JSON.stringify(v(M)):null,b===null?null:JSON.stringify(b),K,null,null,B,null,null,h?.settledAt??null,de,ae?.delivery_id??null,null,null,ue,B)}const r=o(e,"SELECT request_id FROM human_requests WHERE state = 'settled' AND result_json IS NULL").get();if(r!==void 0)throw new Error(`human request migration produced terminal row without result: ${r.request_id}`);if(o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get()!==void 0){const s=o(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}`)}}i(xt,"migrateHumanRequestsState");export{ne as NOT_OTHER_APP_QUESTION,ht as cancelBindingRequest,rt as commitBindingRequest,nt as createPageRequest,yt as firstInvalidPageSpecification,it as getRequest,at as getRequestByCompanion,ot as getRequestByDirectory,dt as getRequestByIdempotencyKey,st as getRequestByInboxTicket,lt as hasOpenReplyBearingRequestByRequester,gt as hasPageResultException,ee as humanRequestsRoot,mt as listBindingRequests,ut as listOpenInboxRequests,_t as listOpenReplyBearingRequests,ct as listPendingAsks,Et as listRequests,pt as listSubmitRequestedRequests,ft as listUnprojectedReviews,Ot as markCompanionRetired,vt as markProjected,Dt as markProjectionError,xt as migrateHumanRequestsState,Nt as openRequest,De as openRequestsByRequester,tt as presentationDir,te as publishPageRevision,jt as readAnchorBase,It as replaceAnchorBaseLocked,P as requestDir,qt as requestSubmit,At as revisePageRequest,bt as setSettlementDeliveryMarksLocked,St as setSubmitNoteDeliveryLocked,Tt as settleRequestLocked,Rt as writeProgress};
82
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);if(o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'reviews'").get()!==void 0){const s=o(e,"SELECT * FROM reviews").all();for(const n of s){const a=n.state,u=a==="approved"||a==="canceled",d=a==="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&&d===null)throw new Error(`corrupt required input: reviews/${n.review_id} has no terminal result`);const p=n.bridge_node_id===null?l(Q(),"reviews",n.review_id):l(S(),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},g=u?a==="approved"?"approved":"canceled":null,N=u?a==="approved"?n.approved_at:n.canceled_at:null,A=se(e,{requestId:n.review_id,requesterNodeId:n.origin_node_id,kind:"review",outcome:g,resultJson:d,settledAt:N,requestDir:p,deliveredAt:n.delivered_at}),O=re(e,n.companion_node_id,g)?N:null;t.run(n.review_id,"review",n.origin_kind==="ticket"?H(S(),C(p)):U(),p,null,n.origin_node_id,n.companion_node_id,n.idempotency_key,u?"settled":a,g,n.origin_kind==="ticket"?1:0,1,C(n.file),n.subtitle,n.file,JSON.stringify(f),null,null,null,d,n.anchor_base_sha256,n.anchor_base_bytes,n.created,n.opened_at,n.submit_requested_at,N,A,null,n.projected_at,n.projection_error,O,n.created)}e.exec("DROP TABLE reviews")}for(const s of y(S())?_e(S(),{withFileTypes:!0}):[]){if(!s.isDirectory())continue;const n=l(S(),s.name),a=l(n,"page.json"),u=l(n,"review.json");if(!y(a)){if(y(u))continue;continue}if(o(e,"SELECT 1 FROM human_requests WHERE request_id = ?").get(s.name)!==void 0)continue;let d,p,f,g;try{const m=R(a);if(typeof m!="object"||m===null||Array.isArray(m))throw new Error("page manifest must be an object");d=m,d.schema==="crtr.page/v1"?(p=Xe(n,m),d=p.manifest):d.schema==="crtr.page/v2"&&(d=oe(d));const D=Se.safeParse(d.delivery);if(typeof d.title!="string"||!D.success)throw new Error(D.success?"page title must be a string":D.error.message);g=D.data,f=z(d)}catch(m){const D=m instanceof Error&&m.cause instanceof Error?m.cause.message:m instanceof Error?m.message:String(m);console.warn(`skipping legacy page ${a}: ${D}`);continue}let N=x(n);p!==void 0&&(N=te(P(s.name),p));const A=f.source,O=l(n,"response.json"),j=y(O)?R(O):null,q=j===null?null:Ie(j),ae=o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'deliveries'").get()===void 0?null:o(e,"SELECT delivery_id FROM deliveries WHERE idempotency_key = ?").get(`human-action:${H(S(),s.name)}`),X=l(n,"action.json"),M=l(n,"progress.json"),L=l(n,"feedback-comments.json"),k=l(n,"reply-route.json"),b=y(L)?R(L):null;if(b!==null&&(typeof b!="object"||typeof b.companionNodeId<"u"&&typeof b.companionNodeId!="string"))throw new Error(`corrupt required input: ${L}`);const I=y(k)?R(k):null;if(I!==null&&(typeof I!="object"||typeof I.bridge_node_id!="string"))throw new Error(`corrupt required input: ${k}`);const W=I?.bridge_node_id,F=(typeof W!="string"||o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'nodes'").get()===void 0?null:o(e,"SELECT parent FROM nodes WHERE node_id = ?").get(W))?.parent??(typeof A?.nodeId=="string"?A.nodeId:null),J=b?.companionNodeId,B=typeof A?.emittedAt=="string"?A.emittedAt:pe(a).mtime.toISOString(),K=j===null?null:JSON.stringify(j),de=se(e,{requestId:s.name,requesterNodeId:F,kind:"page",outcome:q?.outcome??null,resultJson:K,settledAt:q?.settledAt??null,requestDir:n}),ce=re(e,J??null,q?.outcome??null)?q?.settledAt??null:null,Y=P(s.name);v(Y,{recursive:!0,mode:448}),t.run(s.name,"page",H(S(),s.name),Y,N,F,J??null,null,q===null?"open":"settled",q?.outcome??null,g.inbox?1:0,g.inbox||g.reply?1:0,f.title,f.subtitle??null,null,JSON.stringify(f),y(X)?JSON.stringify(R(X)):null,y(M)&&q===null?JSON.stringify(R(M)):null,b===null?null:JSON.stringify(b),K,null,null,B,null,null,q?.settledAt??null,de,ae?.delivery_id??null,null,null,ce,B)}const r=o(e,"SELECT request_id FROM human_requests WHERE state = 'settled' AND result_json IS NULL").get();if(r!==void 0)throw new Error(`human request migration produced terminal row without result: ${r.request_id}`);if(o(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get()!==void 0){const s=o(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}`)}}i(kt,"migrateHumanRequestsState");export{ne as NOT_OTHER_APP_QUESTION,Oe as askingNodeSql,ht as cancelBindingRequest,st as commitBindingRequest,it as createPageRequest,qt 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,yt as listRequests,Et as listSubmitRequestedRequests,gt as listUnprojectedReviews,It as markCompanionRetired,Ot as markProjected,jt as markProjectionError,kt as migrateHumanRequestsState,Tt as openRequest,je as openRequestsByRequester,rt as presentationDir,te as publishPageRevision,xt as readAnchorBase,Lt as replaceAnchorBaseLocked,P as requestDir,bt as requestSubmit,Rt as revisePageRequest,At as setSettlementDeliveryMarksLocked,Dt as setSubmitNoteDeliveryLocked,St as settleRequestLocked,vt as writeProgress};
@@ -1,2 +1,2 @@
1
- var h=Object.defineProperty;var o=(r,e)=>h(r,"name",{value:e,configurable:!0});import{existsSync as b,readFileSync as w,writeFileSync as O,chmodSync as S,renameSync as j}from"node:fs";import{basename as E,dirname as a,join as x}from"node:path";import{appSpace as A,secretsDir as N}from"../layout.js";import{ensureDir as f}from"../fs-utils.js";import{withExclusiveDirectoryLock as u}from"../exclusive-lock.js";import{isReservedEnvName as p}from"./env-store.js";import{validateEnvVarName as m}from"../env-name.js";import{usage as v}from"../errors.js";function s(r){return x(N(),"env",E(A(r).root),"_app")}o(s,"storePath");function c(r){const e=Object.create(null);try{if(!b(s(r)))return e;const t=JSON.parse(w(s(r),"utf8"));if(!t||typeof t!="object"||!("vars"in t)||!t.vars||typeof t.vars!="object"||Array.isArray(t.vars))return e;for(const[n,i]of Object.entries(t.vars))m(n).isValid&&!p(n)&&typeof i=="string"&&!i.includes("\0")&&(e[n]=i)}catch{}return e}o(c,"read");function d(r,e){const t=s(r);f(a(t));const n=`${t}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;O(n,JSON.stringify({vars:e})+`
1
+ var h=Object.defineProperty;var o=(r,e)=>h(r,"name",{value:e,configurable:!0});import{existsSync as b,readFileSync as w,writeFileSync as O,chmodSync as S,renameSync as j}from"node:fs";import{basename as A,dirname as a,join as E}from"node:path";import{appSpace as x,secretsDir as N}from"../layout.js";import{ensureDir as f}from"../fs-utils.js";import{withExclusiveDirectoryLock as u}from"../exclusive-lock.js";import{isReservedAppEnvName as p}from"./env-store.js";import{validateEnvVarName as m}from"../env-name.js";import{usage as v}from"../errors.js";function s(r){return E(N(),"env",A(x(r).root),"_app")}o(s,"storePath");function c(r){const e=Object.create(null);try{if(!b(s(r)))return e;const t=JSON.parse(w(s(r),"utf8"));if(!t||typeof t!="object"||!("vars"in t)||!t.vars||typeof t.vars!="object"||Array.isArray(t.vars))return e;for(const[n,i]of Object.entries(t.vars))m(n).isValid&&!p(n)&&typeof i=="string"&&!i.includes("\0")&&(e[n]=i)}catch{}return e}o(c,"read");function d(r,e){const t=s(r);f(a(t));const n=`${t}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;O(n,JSON.stringify({vars:e})+`
2
2
  `,{mode:384}),S(n,384),j(n,t)}o(d,"write");function l(r){if(!m(r).isValid||p(r))throw v(`invalid or reserved env var name: ${r}`,{field:"name"})}o(l,"validate");function M(r){return{...c(r)}}o(M,"readAppEnvVars");function P(r){return Object.keys(c(r)).sort()}o(P,"listAppEnvNames");function R(r,e,t){if(l(e),!t||t.includes("\0"))throw v("a non-empty env value without NUL bytes is required",{field:"value"});const n=s(r);return f(a(n)),u(`${n}.lock`,()=>{const i=c(r),y=!Object.hasOwn(i,e);return i[e]=t,d(r,i),y})}o(R,"setAppEnvVar");function U(r,e){l(e);const t=s(r);return f(a(t)),u(`${t}.lock`,()=>{const n=c(r);return Object.hasOwn(n,e)?(delete n[e],d(r,n),!0):!1})}o(U,"removeAppEnvVar");export{P as listAppEnvNames,M as readAppEnvVars,U as removeAppEnvVar,R as setAppEnvVar};
@@ -1,4 +1,7 @@
1
1
  export declare function isReservedEnvName(name: string): boolean;
2
+ /** The app env store's reservation: `isReservedEnvName` minus the admitted
3
+ * deployment names. Both its write and read paths use this one rule. */
4
+ export declare function isReservedAppEnvName(name: string): boolean;
2
5
  /** Every stored variable NAME for a profile, sorted. Never returns values. */
3
6
  export declare function listProfileEnvNames(profileId: string): string[];
4
7
  /** Set one variable, replacing any prior value under the same name. Holds the
@@ -1,2 +1,2 @@
1
- var E=Object.defineProperty;var n=(e,t)=>E(e,"name",{value:t,configurable:!0});import{existsSync as p,readFileSync as y,renameSync as S,writeFileSync as O,chmodSync as b}from"node:fs";import{dirname as w}from"node:path";import{profileSpace as R}from"../layout.js";import{loadExactProfileManifest as c,withProfileManifestLock as u}from"./manifest.js";import{ensureDir as x}from"../fs-utils.js";import{notFound as N,usage as f}from"../errors.js";const P="CRTR_",g=new Set(["HOME"]);function v(e){return e.startsWith(P)||g.has(e)}n(v,"isReservedEnvName");function m(e){return e.includes("\0")}n(m,"hasNulByte");function l(e){const t=c(e);return R(t.manifest.grantee??"app:terminal",e).env}n(l,"envPath");function s(e){const t=l(e),r=Object.create(null);if(!p(t))return{vars:r};try{const o=JSON.parse(y(t,"utf8"));for(const[i,a]of Object.entries(o.vars??{}))typeof a=="string"&&(m(a)||v(i)||(r[i]=a))}catch{}return{vars:r}}n(s,"readStoreUnlocked");function d(e,t){const r=l(e);x(w(r));const o=`${r}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;O(o,JSON.stringify(t,null,2)+`
2
- `,{mode:384}),b(o,384),S(o,r)}n(d,"writeStoreAtomic");function h(e){try{c(e)}catch(t){throw t instanceof Error&&t.message.startsWith("profile not found:")?N(`profile not found: ${e}`,{received:e}):t}}n(h,"requireProfileExists");function F(e){return Object.keys(s(e).vars).sort()}n(F,"listProfileEnvNames");function A(e,t,r){if(v(t))throw f(`env var name is reserved by crtr: ${t}`,{received:t,field:"name",next:"crtr identity/routing names (CRTR_* and HOME) cannot be stored in a profile env store \u2014 a stored value under one of these names could redirect a broker to a different canvas home. Choose a different name."});if(m(r))throw f("env var value contains a NUL byte, which no OS accepts in an environment variable",{field:"value",next:"Remove NUL bytes from the piped value and retry."});return u(e,()=>{h(e);const o=s(e),i=!Object.hasOwn(o.vars,t);return o.vars[t]=r,d(e,o),i})}n(A,"setProfileEnvVar");function D(e,t){return u(e,()=>{h(e);const r=s(e);return Object.hasOwn(r.vars,t)?(delete r.vars[t],d(e,r),!0):!1})}n(D,"removeProfileEnvVar");function L(e){if(e===null||e==="")return{};try{return{...s(e).vars}}catch{return{}}}n(L,"readProfileEnvVars");export{v as isReservedEnvName,F as listProfileEnvNames,L as readProfileEnvVars,D as removeProfileEnvVar,A as setProfileEnvVar};
1
+ var h=Object.defineProperty;var n=(e,t)=>h(e,"name",{value:t,configurable:!0});import{existsSync as p,readFileSync as R,renameSync as S,writeFileSync as y,chmodSync as N}from"node:fs";import{dirname as _}from"node:path";import{profileSpace as O}from"../layout.js";import{loadExactProfileManifest as u,withProfileManifestLock as f}from"./manifest.js";import{ensureDir as w}from"../fs-utils.js";import{notFound as P,usage as v}from"../errors.js";const b="CRTR_",x=new Set(["HOME"]),T=new Set(["CRTR_FEEDBACK_ENDPOINT","CRTR_FEEDBACK_TOKEN"]);function c(e){return e.startsWith(b)||x.has(e)}n(c,"isReservedEnvName");function j(e){return c(e)&&!T.has(e)}n(j,"isReservedAppEnvName");function E(e){return e.includes("\0")}n(E,"hasNulByte");function m(e){const t=u(e);return O(t.manifest.grantee??"app:terminal",e).env}n(m,"envPath");function s(e){const t=m(e),r=Object.create(null);if(!p(t))return{vars:r};try{const o=JSON.parse(R(t,"utf8"));for(const[i,a]of Object.entries(o.vars??{}))typeof a=="string"&&(E(a)||c(i)||(r[i]=a))}catch{}return{vars:r}}n(s,"readStoreUnlocked");function l(e,t){const r=m(e);w(_(r));const o=`${r}.tmp.${process.pid}.${Math.random().toString(36).slice(2)}`;y(o,JSON.stringify(t,null,2)+`
2
+ `,{mode:384}),N(o,384),S(o,r)}n(l,"writeStoreAtomic");function d(e){try{u(e)}catch(t){throw t instanceof Error&&t.message.startsWith("profile not found:")?P(`profile not found: ${e}`,{received:e}):t}}n(d,"requireProfileExists");function $(e){return Object.keys(s(e).vars).sort()}n($,"listProfileEnvNames");function k(e,t,r){if(c(t))throw v(`env var name is reserved by crtr: ${t}`,{received:t,field:"name",next:"crtr identity/routing names (CRTR_* and HOME) cannot be stored in a profile env store \u2014 a stored value under one of these names could redirect a broker to a different canvas home. Choose a different name."});if(E(r))throw v("env var value contains a NUL byte, which no OS accepts in an environment variable",{field:"value",next:"Remove NUL bytes from the piped value and retry."});return f(e,()=>{d(e);const o=s(e),i=!Object.hasOwn(o.vars,t);return o.vars[t]=r,l(e,o),i})}n(k,"setProfileEnvVar");function B(e,t){return f(e,()=>{d(e);const r=s(e);return Object.hasOwn(r.vars,t)?(delete r.vars[t],l(e,r),!0):!1})}n(B,"removeProfileEnvVar");function K(e){if(e===null||e==="")return{};try{return{...s(e).vars}}catch{return{}}}n(K,"readProfileEnvVars");export{j as isReservedAppEnvName,c as isReservedEnvName,$ as listProfileEnvNames,K as readProfileEnvVars,B as removeProfileEnvVar,k as setProfileEnvVar};
@@ -1,12 +1,12 @@
1
- var ve=Object.defineProperty;var m=(e,t)=>ve(e,"name",{value:t,configurable:!0});import{prepared as w}from"../sqlite-statements.js";import{coveredByAny as be}from"../../shared/env.js";import{createHash as G}from"node:crypto";import{ApiError as Oe}from"../../api/errors.js";import{CrtrError as De}from"../errors.js";import{isAbsolute as X,relative as Me,resolve as Ie,sep as Te,join as Ae}from"node:path";import{SessionManager as Le}from"@earendil-works/pi-coding-agent";import{covers as F}from"@north-light/identity";import{openDb as z,withCanvasWrite as C}from"../canvas/db.js";import{deleteNodeWithOwned as Ce}from"../graph/deletion.js";import{getById as xe}from"../graph/objects.js";import{repairRunConversations as Q}from"../canvas/sessions.js";import{getNode as v,nodeFiles as ke,removeNodeFiles as We,updateNode as Fe}from"../canvas/canvas.js";import{fullName as He}from"../canvas/labels.js";import{renameWindow as qe}from"../runtime/placement.js";import{liveExecutionForNode as V}from"../canvas/executions.js";import{conversationStore as Z,isConversationNotFound as Ue}from"../conversation-store/index.js";import{enqueueNodeMail as Pe}from"../feed/messages.js";import{newestReportBody as Be}from"../feed/reports.js";import{ensureAppProfile as $e,loadExactProfileManifest as je}from"../profiles/manifest.js";import{stopNodeSandboxes as K}from"../spaces/stop.js";import{BrokerUnreachableError as Je}from"../runtime/broker-request.js";import{interruptLive as Ye}from"../runtime/interactive-deliver.js";import{isBrokerLive as ee}from"../runtime/model-swap.js";import{newNodeId as Ge}from"../runtime/nodes.js";import{writeGoal as Xe}from"../runtime/kickoff.js";import{reviveNode as H}from"../runtime/revive.js";import{spawnChildPrepared as ze}from"../runtime/spawn.js";import{isPortableModelToken as Qe}from"../runtime/launch.js";import{parseDurationMs as Ve}from"../wake.js";import{expandModelCandidates as Ze,parseModelSpec as Ke}from"../model-routes.js";import{payerOfGrant as q}from"../grants/mirror.js";import{isolatedBrokerLauncherAvailable as et}from"../runtime/host.js";import{resolveRunKind as tt}from"../runtime/launch-target.js";import{cycleAwareMessages as nt}from"../runtime/session-cycles.js";import{originFor as te}from"../runtime/stamp/protocol.js";import{readOutputRequest as st,readOutputResult as ne}from"../runtime/structured-output.js";import{admitLegacyStructuredOutput as se}from"../../daemon/structured-requests/sidecar.js";import{runSchemaRepromptPending as rt}from"../runtime/stop-guard.js";import{toRunOutcomeDTO as ot}from"../../daemon/api/map.js";import{openAssistantMessageStartSequence as it}from"../../daemon/runs/observer.js";import{closeNode as re}from"../runtime/close.js";import{parseScope as dt}from"@north-light/identity";import{appendRunEvent as oe,subscribeRunEvents as at}from"./events.js";import{runActivity as ct}from"./activity.js";import{cancelOpenQuestions as ie,openQuestionIds as de}from"./questions.js";import{appSpace as U}from"../layout.js";import{ensureAppSpace as ut}from"../spaces/space.js";import{assertUploadsUsable as ae,resolveStorageUrls as mt}from"../storage/attachments.js";import{storageClient as lt,storageConfig as ft}from"../storage/client.js";import{deleteUploadRow as _t,insertUploadUses as ce,releaseRunUploads as pt}from"../storage/tables.js";import{abortProviderCalls as ue}from"../providers/inflight.js";const me=m((e,t,r)=>mt(t,e,r),"defaultResolver"),gt=3e3;function yn(e){return Number(w(e,"UPDATE idempotency_keys SET grantee = 'app:terminal' WHERE grantee = 'user:local'").run().changes)}m(yn,"rewriteLocalIdempotencyGrantee");class S extends Error{static{m(this,"RunError")}status;code;param;details;scope;retryable;constructor(t,r,n,i,c,d,o=t===503){super(n),this.status=t,this.code=r,this.param=i,this.details=c,this.scope=d,this.retryable=o}}const R=m((e,t)=>new S(400,"invalid_request",e,t),"invalid"),P=m(()=>new S(404,"not_found","run not found"),"missing"),B=m(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"usage"),D=m(()=>z(),"db");function x(e,t,r=!1){const n=v(e);if(!n||n.parent!==null||n.run_id!==e||n.grantee!==t||!r&&n.deleting_at)throw P();return n}m(x,"ownedRun");const $=["waiting_on_user","idle","settled"];function T(e){if(e.status==="canceled"||e.status==="dead"||e.status==="done"&&e.intent!=="parked")return"settled";const t=w(D(),`SELECT 1 FROM node_rows n WHERE n.run_id = ? AND n.status = 'active' AND
1
+ var ve=Object.defineProperty;var m=(e,t)=>ve(e,"name",{value:t,configurable:!0});import{prepared as w}from"../sqlite-statements.js";import{coveredByAny as be}from"../../shared/env.js";import{createHash as G}from"node:crypto";import{ApiError as Oe}from"../../api/errors.js";import{CrtrError as De}from"../errors.js";import{isAbsolute as X,relative as Ie,resolve as Me,sep as Te,join as Ae}from"node:path";import{SessionManager as Le}from"@earendil-works/pi-coding-agent";import{covers as F}from"@north-light/identity";import{openDb as z,withCanvasWrite as C}from"../canvas/db.js";import{deleteNodeWithOwned as Ce}from"../graph/deletion.js";import{getById as xe}from"../graph/objects.js";import{repairRunConversations as Q}from"../canvas/sessions.js";import{getNode as v,nodeFiles as ke,removeNodeFiles as We,updateNode as Fe}from"../canvas/canvas.js";import{fullName as He}from"../canvas/labels.js";import{renameWindow as qe}from"../runtime/placement.js";import{liveExecutionForNode as V}from"../canvas/executions.js";import{conversationStore as Z,isConversationNotFound as Ue}from"../conversation-store/index.js";import{enqueueNodeMail as Pe}from"../feed/messages.js";import{newestReportBody as Be}from"../feed/reports.js";import{ensureAppProfile as $e,loadExactProfileManifest as je}from"../profiles/manifest.js";import{stopNodeSandboxes as K}from"../spaces/stop.js";import{BrokerUnreachableError as Je}from"../runtime/broker-request.js";import{interruptLive as Ye}from"../runtime/interactive-deliver.js";import{isBrokerLive as ee}from"../runtime/model-swap.js";import{newNodeId as Ge}from"../runtime/nodes.js";import{writeGoal as Xe}from"../runtime/kickoff.js";import{reviveNode as H}from"../runtime/revive.js";import{spawnChildPrepared as ze}from"../runtime/spawn.js";import{isPortableModelToken as Qe}from"../runtime/launch.js";import{parseDurationMs as Ve}from"../wake.js";import{expandModelCandidates as Ze,parseModelSpec as Ke}from"../model-routes.js";import{payerOfGrant as q}from"../grants/mirror.js";import{isolatedBrokerLauncherAvailable as et}from"../runtime/host.js";import{resolveRunKind as tt}from"../runtime/launch-target.js";import{cycleAwareMessages as nt}from"../runtime/session-cycles.js";import{originFor as te}from"../runtime/stamp/protocol.js";import{readOutputRequest as st,readOutputResult as ne}from"../runtime/structured-output.js";import{admitLegacyStructuredOutput as se}from"../../daemon/structured-requests/sidecar.js";import{runSchemaRepromptPending as rt}from"../runtime/stop-guard.js";import{toRunOutcomeDTO as ot}from"../../daemon/api/map.js";import{openAssistantMessageStartSequence as it}from"../../daemon/runs/observer.js";import{closeNode as re}from"../runtime/close.js";import{parseScope as dt}from"@north-light/identity";import{appendRunEvent as oe,subscribeRunEvents as at}from"./events.js";import{runActivity as ct}from"./activity.js";import{cancelOpenQuestions as ie,openNoticeIds as ut,openQuestionIds as de}from"./questions.js";import{appSpace as U}from"../layout.js";import{ensureAppSpace as mt}from"../spaces/space.js";import{assertUploadsUsable as ae,resolveStorageUrls as lt}from"../storage/attachments.js";import{storageClient as ft,storageConfig as _t}from"../storage/client.js";import{deleteUploadRow as pt,insertUploadUses as ce,releaseRunUploads as gt}from"../storage/tables.js";import{abortProviderCalls as ue}from"../providers/inflight.js";const me=m((e,t,r)=>lt(t,e,r),"defaultResolver"),Et=3e3;function Rn(e){return Number(w(e,"UPDATE idempotency_keys SET grantee = 'app:terminal' WHERE grantee = 'user:local'").run().changes)}m(Rn,"rewriteLocalIdempotencyGrantee");class S extends Error{static{m(this,"RunError")}status;code;param;details;scope;retryable;constructor(t,r,n,i,c,d,o=t===503){super(n),this.status=t,this.code=r,this.param=i,this.details=c,this.scope=d,this.retryable=o}}const R=m((e,t)=>new S(400,"invalid_request",e,t),"invalid"),P=m(()=>new S(404,"not_found","run not found"),"missing"),B=m(()=>({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),"usage"),D=m(()=>z(),"db");function x(e,t,r=!1){const n=v(e);if(!n||n.parent!==null||n.run_id!==e||n.grantee!==t||!r&&n.deleting_at)throw P();return n}m(x,"ownedRun");const $=["waiting_on_user","idle","settled"];function T(e){if(e.status==="canceled"||e.status==="dead"||e.status==="done"&&e.intent!=="parked")return"settled";const t=w(D(),`SELECT 1 FROM node_rows n WHERE n.run_id = ? AND n.status = 'active' AND
2
2
  (n.last_settled_at IS NULL OR EXISTS (
3
3
  SELECT 1 FROM run_events e WHERE e.run_id = ? AND e.node_id = n.node_id AND e.type = 'node.turn.started'
4
4
  AND e.sequence_number > COALESCE((SELECT MAX(c.sequence_number) FROM run_events c
5
5
  WHERE c.run_id = e.run_id AND c.node_id = e.node_id AND c.type = 'node.turn.completed'), 0)
6
- )) LIMIT 1`).get(e.node_id,e.node_id),r=w(D(),"SELECT 1 FROM deliveries WHERE destination_id IN (SELECT node_id FROM nodes WHERE run_id = ?) AND state IN ('armed', 'pending') AND wake = 1 LIMIT 1").get(e.node_id),n=!e.last_settled_at&&e.status!=="done";return t||r||n||rt(e)?"running":de(e.node_id).length?"waiting_on_user":"idle"}m(T,"runStatus");function Rn(e){const t=v(e);return t!==null&&T(t)==="running"}m(Rn,"runIsRunning");function L(e){Q(e.node_id),e=v(e.node_id)??e;const t=T(e),r=t==="settled"?[]:de(e.node_id),n=Be(e.node_id)||void 0,i=t==="settled"?ot(e):null,c=i?.kind==="result"?ne(e.node_id,e.grantee):void 0;return{run_id:e.node_id,name:e.name,status:t,...i?{outcome:i}:{},...c===void 0?{}:{result:c},...n!==void 0?{last_report:n}:{},pending_question_ids:r,...e.last_turn_error_json?{last_turn_error:JSON.parse(e.last_turn_error_json)}:{},usage:JSON.parse(e.usage_json??JSON.stringify(B())),payer:q(e.grant_id),scopes:e.scopes,metadata:e.metadata_json?JSON.parse(e.metadata_json):{},created_at:e.created,...t==="settled"&&e.outcome_at?{settled_at:e.outcome_at}:{},latest_sequence:(e.event_cursor??1)-1,last_activity_at:e.last_activity_at,activity:ct(e.node_id,t)}}m(L,"runObject");const j=864e5,le=255;function Sn(e){if(e!==void 0){if(typeof e!="string"||!e.length||e.length>le)throw R(`Idempotency-Key must be 1-${le} characters`);return e}}m(Sn,"idempotencyKeyOf");function k(e,t,r,n=z()){const i=w(n,"SELECT body_hash, run_id, response_json, created_at FROM idempotency_keys WHERE grantee = ? AND key = ?").get(e,t);if(!(!i||Date.now()-Date.parse(i.created_at)>=j)){if(i.body_hash!==r)throw new S(409,"idempotency_conflict","key used with a different request");return{run_id:i.run_id,response:JSON.parse(i.response_json)}}}m(k,"findIdempotent");function fe(e,t,r,n,i,c,d){w(e,"DELETE FROM idempotency_keys WHERE grantee = ? AND key = ? AND created_at <= ?").run(t,r,new Date(Date.now()-j).toISOString()),w(e,"INSERT INTO idempotency_keys (grantee, key, body_hash, run_id, response_json, created_at) VALUES (?, ?, ?, ?, ?, ?)").run(t,r,n,i,JSON.stringify(c),d)}m(fe,"recordIdempotent");function Nn(e=Date.now()){return C(t=>Number(w(t,"DELETE FROM idempotency_keys WHERE created_at <= ?").run(new Date(e-j).toISOString()).changes))}m(Nn,"pruneExpiredIdempotencyKeys");function _e(e,t,r,n,i){const c=n.text;let d=0;return{messageId:Pe(t,{kind:"message",label:c.slice(0,120),senderNodeId:"human",senderName:r,bodyJson:i?{body:c}:{body:c,start_turn:!1},urgency:i?"normal":"deferred",wake:i?1:0,withinEnqueue:m((a,p)=>{n.uses.length&&(ae(r,n.uses,a),ce(n.uses.map(({upload_id:y,path:g})=>({upload_id:y,path:g,run_id:t})),a)),d=oe(a,t,t,"node.message.accepted",{message_id:p,start_turn:i}).sequence_number},"withinEnqueue")}).messageId,sequence:d}}m(_e,"acceptRunMessage");class pe extends Error{static{m(this,"IdempotentReplay")}winner;constructor(t){super("idempotent replay"),this.winner=t}}const Et=1440*60*1e3;function ge(e){const t=typeof e=="string"?Ve(e):null;if(t===null||!Number.isSafeInteger(t))throw R(`deadline '${String(e)}' is not a duration; use one or more <int>[smhd] parts such as 10m or 1h30m`,"deadline");if(t<=0)throw R("deadline must be greater than zero","deadline");if(t>Et)throw R("deadline must be at most 24h","deadline");return t}m(ge,"parseRunDeadlineMs");async function vn(e,t,r,n=me){if(t.isolated&&!et())throw new S(503,"isolated_unavailable","isolated runs require the Linux root launcher","isolated");t.deadline!==void 0&&ge(t.deadline);const i=G("sha256").update(JSON.stringify(t)).digest("hex");if(r){const s=k(e.grantee,r,i);if(s){const l=x(s.run_id,e.grantee);return!l.pi_pid&&T(l)==="running"&&(t.output_schema!==void 0&&!l.outcome_at&&st(l.node_id).state==="absent"&&ne(l.node_id,l.grantee)===void 0&&se(l.node_id,"terminal",t.output_schema),await H(l.node_id,{resume:!0,capacity:"freeze"})),s.response}}await ut(e.grantee);const c=t.profile===void 0?$e(e.grantee):je(t.profile),d=c.manifest.grantee??"app:terminal";if(d!==e.grantee){const s=`crtr:memory:rw:${d}:profile:${c.profileId}`;if(!e.resolved.some(l=>F(l,s))||t.scopes!==null&&!t.scopes.some(l=>F(l,s)))throw new S(403,"scope_missing",`missing scope ${s}`,"profile",void 0,s)}if(t.model!==void 0){const s=t.model;if(Qe(s)){if(s.includes("/")&&q(e.grant)!=="app"){const l=s.lastIndexOf("/"),h=s.slice(0,l),N=s.slice(l+1);if(["ultra","strong","medium","light"].includes(N)&&Ze({kind:"logical",family:h,strength:N,spec:s},U(e.grantee).files,c.profileId).every(A=>A.family!==h))throw R(`model '${s}' names a model family that is not configured in this daemon`,"model")}}else if(Ke(s)===void 0)throw R(`model '${s}' is not a strength (ultra, strong, medium, light), a family/strength, or a provider/model id`,"model")}const o=Ge(),a=Ae(U(e.grantee).nodes,o);if(t.isolated&&t.cwd!==void 0){const s=Me(a,Ie(t.cwd));if(!X(t.cwd)||s===".."||s.startsWith(`..${Te}`)||X(s))throw R("cwd must be inside the isolated root node folder","cwd")}const p=await n(o,e.grantee,t.prompt),y=p.text;let g;try{g=t.message===void 0?void 0:await n(o,e.grantee,t.message)}catch(s){throw p.cleanup(),s}const E=q(e.grant);let u;try{await ze({kind:tt(c),mode:"base",root:!0,rootLifecycle:"resident",readiness:"launch",cwd:t.isolated?t.cwd??a:U(e.grantee).files,profile:c.profileId,prompt:y,nodeId:o,isolated:t.isolated??!1,...t.model===void 0?{}:{model:t.model},...t.deadline===void 0?{}:{deadlineAt:new Date(Date.now()+ge(t.deadline)).toISOString()},...t.scopes===null?{}:{scopes:t.scopes},run:{grantee:e.grantee,sub:e.sub,grant_id:e.grant,client_id:e.client_id,metadata_json:JSON.stringify(t.metadata),run_id:o,event_cursor:1,usage_json:JSON.stringify(B())},withinCreate:m((s,l)=>{if(r){const N=k(e.grantee,r,i,s);if(N)throw new pe(N)}const h=p.uses;if(h.length&&(ae(e.grantee,h,s),ce(h.map(({upload_id:N,path:A})=>({upload_id:N,path:A,run_id:o})),s)),Xe(o,y),u={run_id:o,node_id:o,grantee:e.grantee,grant:e.grant,rev:e.rev,scopes:t.scopes,payer:E,status:"running",created_at:l.created,metadata:t.metadata,sequence_number:0},oe(s,o,o,"run.started",{scopes:t.scopes,payer:E,usage:B()}),g){const N=_e(s,o,e.grantee,g,!1);u.message={run_id:o,message_id:N.messageId,sequence_number:N.sequence}}r&&fe(s,e.grantee,r,i,o,u,l.created)},"withinCreate")},t.output_schema===void 0?void 0:s=>{se(s,"terminal",t.output_schema)})}catch(s){if(v(o)||(p.cleanup(),g?.cleanup()),s instanceof pe)return s.winner.response;if(t.model!==void 0&&s instanceof De&&s.code==="usage")throw R(s.message,"model");if(s instanceof Oe&&(s.code==="isolated_run"||s.code==="invalid_request")){const l=s.details&&typeof s.details=="object"&&"param"in s.details&&typeof s.details.param=="string"?s.details.param:void 0;throw new S(s.status,s.code,s.message,l)}throw s}if(!u)throw new Error("run creation did not commit");return u}m(vn,"startRun");function bn(e,t){let r;if(t.after)try{const o=JSON.parse(Buffer.from(t.after,"base64url").toString());if(!o||typeof o!="object"||!("activity"in o)||typeof o.activity!="string"||!("id"in o)||typeof o.id!="string")throw new Error("invalid cursor");r={activity:o.activity,id:o.id}}catch{throw R("invalid list cursor","after")}const i=D().prepare(`SELECT node_id, COALESCE(last_activity_at, created) AS activity FROM node_rows
6
+ )) LIMIT 1`).get(e.node_id,e.node_id),r=w(D(),"SELECT 1 FROM deliveries WHERE destination_id IN (SELECT node_id FROM nodes WHERE run_id = ?) AND state IN ('armed', 'pending') AND wake = 1 LIMIT 1").get(e.node_id),n=!e.last_settled_at&&e.status!=="done";return t||r||n||rt(e)?"running":de(e.node_id).length?"waiting_on_user":"idle"}m(T,"runStatus");function Sn(e){const t=v(e);return t!==null&&T(t)==="running"}m(Sn,"runIsRunning");function L(e){Q(e.node_id),e=v(e.node_id)??e;const t=T(e),r=t==="settled"?[]:de(e.node_id),n=Be(e.node_id)||void 0,i=t==="settled"?ot(e):null,c=i?.kind==="result"?ne(e.node_id,e.grantee):void 0;return{run_id:e.node_id,name:e.name,status:t,...i?{outcome:i}:{},...c===void 0?{}:{result:c},...n!==void 0?{last_report:n}:{},pending_question_ids:r,open_notice_ids:t==="settled"?[]:ut(e.node_id),...e.last_turn_error_json?{last_turn_error:JSON.parse(e.last_turn_error_json)}:{},usage:JSON.parse(e.usage_json??JSON.stringify(B())),payer:q(e.grant_id),scopes:e.scopes,metadata:e.metadata_json?JSON.parse(e.metadata_json):{},created_at:e.created,...t==="settled"&&e.outcome_at?{settled_at:e.outcome_at}:{},latest_sequence:(e.event_cursor??1)-1,last_activity_at:e.last_activity_at,activity:ct(e.node_id,t)}}m(L,"runObject");const j=864e5,le=255;function Nn(e){if(e!==void 0){if(typeof e!="string"||!e.length||e.length>le)throw R(`Idempotency-Key must be 1-${le} characters`);return e}}m(Nn,"idempotencyKeyOf");function k(e,t,r,n=z()){const i=w(n,"SELECT body_hash, run_id, response_json, created_at FROM idempotency_keys WHERE grantee = ? AND key = ?").get(e,t);if(!(!i||Date.now()-Date.parse(i.created_at)>=j)){if(i.body_hash!==r)throw new S(409,"idempotency_conflict","key used with a different request");return{run_id:i.run_id,response:JSON.parse(i.response_json)}}}m(k,"findIdempotent");function fe(e,t,r,n,i,c,d){w(e,"DELETE FROM idempotency_keys WHERE grantee = ? AND key = ? AND created_at <= ?").run(t,r,new Date(Date.now()-j).toISOString()),w(e,"INSERT INTO idempotency_keys (grantee, key, body_hash, run_id, response_json, created_at) VALUES (?, ?, ?, ?, ?, ?)").run(t,r,n,i,JSON.stringify(c),d)}m(fe,"recordIdempotent");function vn(e=Date.now()){return C(t=>Number(w(t,"DELETE FROM idempotency_keys WHERE created_at <= ?").run(new Date(e-j).toISOString()).changes))}m(vn,"pruneExpiredIdempotencyKeys");function _e(e,t,r,n,i){const c=n.text;let d=0;return{messageId:Pe(t,{kind:"message",label:c.slice(0,120),senderNodeId:"human",senderName:r,bodyJson:i?{body:c}:{body:c,start_turn:!1},urgency:i?"normal":"deferred",wake:i?1:0,withinEnqueue:m((a,p)=>{n.uses.length&&(ae(r,n.uses,a),ce(n.uses.map(({upload_id:y,path:g})=>({upload_id:y,path:g,run_id:t})),a)),d=oe(a,t,t,"node.message.accepted",{message_id:p,start_turn:i}).sequence_number},"withinEnqueue")}).messageId,sequence:d}}m(_e,"acceptRunMessage");class pe extends Error{static{m(this,"IdempotentReplay")}winner;constructor(t){super("idempotent replay"),this.winner=t}}const wt=1440*60*1e3;function ge(e){const t=typeof e=="string"?Ve(e):null;if(t===null||!Number.isSafeInteger(t))throw R(`deadline '${String(e)}' is not a duration; use one or more <int>[smhd] parts such as 10m or 1h30m`,"deadline");if(t<=0)throw R("deadline must be greater than zero","deadline");if(t>wt)throw R("deadline must be at most 24h","deadline");return t}m(ge,"parseRunDeadlineMs");async function bn(e,t,r,n=me){if(t.isolated&&!et())throw new S(503,"isolated_unavailable","isolated runs require the Linux root launcher","isolated");t.deadline!==void 0&&ge(t.deadline);const i=G("sha256").update(JSON.stringify(t)).digest("hex");if(r){const s=k(e.grantee,r,i);if(s){const l=x(s.run_id,e.grantee);return!l.pi_pid&&T(l)==="running"&&(t.output_schema!==void 0&&!l.outcome_at&&st(l.node_id).state==="absent"&&ne(l.node_id,l.grantee)===void 0&&se(l.node_id,"terminal",t.output_schema),await H(l.node_id,{resume:!0,capacity:"freeze"})),s.response}}await mt(e.grantee);const c=t.profile===void 0?$e(e.grantee):je(t.profile),d=c.manifest.grantee??"app:terminal";if(d!==e.grantee){const s=`crtr:memory:rw:${d}:profile:${c.profileId}`;if(!e.resolved.some(l=>F(l,s))||t.scopes!==null&&!t.scopes.some(l=>F(l,s)))throw new S(403,"scope_missing",`missing scope ${s}`,"profile",void 0,s)}if(t.model!==void 0){const s=t.model;if(Qe(s)){if(s.includes("/")&&q(e.grant)!=="app"){const l=s.lastIndexOf("/"),h=s.slice(0,l),N=s.slice(l+1);if(["ultra","strong","medium","light"].includes(N)&&Ze({kind:"logical",family:h,strength:N,spec:s},U(e.grantee).files,c.profileId).every(A=>A.family!==h))throw R(`model '${s}' names a model family that is not configured in this daemon`,"model")}}else if(Ke(s)===void 0)throw R(`model '${s}' is not a strength (ultra, strong, medium, light), a family/strength, or a provider/model id`,"model")}const o=Ge(),a=Ae(U(e.grantee).nodes,o);if(t.isolated&&t.cwd!==void 0){const s=Ie(a,Me(t.cwd));if(!X(t.cwd)||s===".."||s.startsWith(`..${Te}`)||X(s))throw R("cwd must be inside the isolated root node folder","cwd")}const p=await n(o,e.grantee,t.prompt),y=p.text;let g;try{g=t.message===void 0?void 0:await n(o,e.grantee,t.message)}catch(s){throw p.cleanup(),s}const E=q(e.grant);let u;try{await ze({kind:tt(c),mode:"base",root:!0,rootLifecycle:"resident",readiness:"launch",cwd:t.isolated?t.cwd??a:U(e.grantee).files,profile:c.profileId,prompt:y,nodeId:o,isolated:t.isolated??!1,...t.model===void 0?{}:{model:t.model},...t.deadline===void 0?{}:{deadlineAt:new Date(Date.now()+ge(t.deadline)).toISOString()},...t.scopes===null?{}:{scopes:t.scopes},run:{grantee:e.grantee,sub:e.sub,grant_id:e.grant,client_id:e.client_id,metadata_json:JSON.stringify(t.metadata),run_id:o,event_cursor:1,usage_json:JSON.stringify(B())},withinCreate:m((s,l)=>{if(r){const N=k(e.grantee,r,i,s);if(N)throw new pe(N)}const h=p.uses;if(h.length&&(ae(e.grantee,h,s),ce(h.map(({upload_id:N,path:A})=>({upload_id:N,path:A,run_id:o})),s)),Xe(o,y),u={run_id:o,node_id:o,grantee:e.grantee,grant:e.grant,rev:e.rev,scopes:t.scopes,payer:E,status:"running",created_at:l.created,metadata:t.metadata,sequence_number:0},oe(s,o,o,"run.started",{scopes:t.scopes,payer:E,usage:B()}),g){const N=_e(s,o,e.grantee,g,!1);u.message={run_id:o,message_id:N.messageId,sequence_number:N.sequence}}r&&fe(s,e.grantee,r,i,o,u,l.created)},"withinCreate")},t.output_schema===void 0?void 0:s=>{se(s,"terminal",t.output_schema)})}catch(s){if(v(o)||(p.cleanup(),g?.cleanup()),s instanceof pe)return s.winner.response;if(t.model!==void 0&&s instanceof De&&s.code==="usage")throw R(s.message,"model");if(s instanceof Oe&&(s.code==="isolated_run"||s.code==="invalid_request")){const l=s.details&&typeof s.details=="object"&&"param"in s.details&&typeof s.details.param=="string"?s.details.param:void 0;throw new S(s.status,s.code,s.message,l)}throw s}if(!u)throw new Error("run creation did not commit");return u}m(bn,"startRun");function On(e,t){let r;if(t.after)try{const o=JSON.parse(Buffer.from(t.after,"base64url").toString());if(!o||typeof o!="object"||!("activity"in o)||typeof o.activity!="string"||!("id"in o)||typeof o.id!="string")throw new Error("invalid cursor");r={activity:o.activity,id:o.id}}catch{throw R("invalid list cursor","after")}const i=D().prepare(`SELECT node_id, COALESCE(last_activity_at, created) AS activity FROM node_rows
7
7
  WHERE run_id = node_id AND deleting_at IS NULL ${e===null?"":"AND grantee = ?"}
8
- ORDER BY activity DESC, node_id DESC`).all(...e===null?[]:[e]).filter(({node_id:o})=>!t.visible||t.visible(o)).filter(({activity:o,node_id:a})=>!r||o<r.activity||o===r.activity&&a<r.id).map(o=>({root:v(o.node_id),activity:o.activity})).filter(({root:o})=>!t.status||T(o)===t.status),c=i.slice(0,t.limit),d=c.at(-1);return{runs:c.map(({root:o})=>L(o)),next:i.length>t.limit&&d?Buffer.from(JSON.stringify({activity:d.activity,id:d.root.node_id})).toString("base64url"):null}}m(bn,"listRuns");async function On(e,t,r){const n=x(e,t),i=m(()=>L(x(e,t)),"read");return!r||$.includes(T(n))?i():new Promise((c,d)=>{const o=m(()=>{clearTimeout(y),clearInterval(p),a();try{c(i())}catch(g){d(g)}},"finish"),a=at(e,()=>{try{$.includes(String(i().status))&&o()}catch(g){clearTimeout(y),clearInterval(p),a(),d(g)}}),p=setInterval(()=>{$.includes(String(i().status))&&o()},250),y=setTimeout(o,r*1e3)})}m(On,"waitRun");async function Dn(e,t,r=me,n=!0,i){const c=e.status==="canceled"||e.outcome_reason==="closed",d=e.grantee??"app:terminal",o=G("sha256").update(JSON.stringify(["run.message",e.node_id,t,n])).digest("hex"),a=m(async E=>{const u=v(e.node_id),s=w(D(),"SELECT 1 FROM deliveries WHERE message_id = ? AND state = 'pending' AND canceled_at IS NULL").get(String(E.message_id));return u&&!c&&n&&!u.pi_pid&&s&&await H(e.node_id,{resume:!0,capacity:"freeze"}),E},"replay");if(i){const E=k(d,i,o);if(E)return a(E.response)}if(c)throw new S(409,"run_settled","canceled run cannot receive a message");const p=await r(e.node_id,d,t),y=n&&e.final_report&&!e.pi_pid?(await import("../runtime/reopen.js")).commitReopenResident:void 0;let g;try{g=C(E=>{if(i){const l=k(d,i,o,E);if(l)return{replayed:l.response}}y?.(e.node_id);const u=_e(E,e.node_id,d,p,n),s={run_id:e.node_id,message_id:u.messageId,sequence_number:u.sequence};return i&&fe(E,d,i,o,e.node_id,s,new Date().toISOString()),{result:s}})}catch(E){throw p.cleanup(),E}return"replayed"in g?(p.cleanup(),a(g.replayed)):(n&&!e.pi_pid&&await H(e.node_id,{resume:!0,capacity:"freeze"}),g.result)}m(Dn,"messageRun");async function wt(e){const t=m(()=>new S(503,"service_unavailable",`node ${e} broker was unavailable before the interrupt reached it`),"unavailable");for(let r=0;r<2;r++){const n=v(e);if(!n)throw P();if(!ee(n)){if(n.streaming)throw t();return}const i=V(e)?.executionId;try{await Ye(e)==="turn"&&ue({nodes:[e]});return}catch(c){if(!(c instanceof Je))throw c;const d=v(e);if(!d)throw P();if(!d.streaming)return;if(r===0&&ee(d)&&V(e)?.executionId!==i)continue;throw t()}}throw t()}m(wt,"interruptNode");async function Mn(e,t="stop"){const r=t==="stop"?w(D(),"SELECT node_id FROM nodes WHERE run_id = ?").all(e.node_id).map(({node_id:n})=>n):[e.node_id];return await Promise.all(r.map(n=>wt(n))),L(v(e.node_id)??e)}m(Mn,"interruptRun");async function In(e,t={}){const r=w(D(),"SELECT node_id FROM nodes WHERE run_id = ? ORDER BY created DESC").all(e.node_id).map(d=>d.node_id);ue({run:e.node_id});const n=[];if(T(e)!=="settled")n.push(...re(e.node_id,{preserveEmpty:!0,stopReason:"run_canceled"}).closed);else for(const d of r){if(d===e.node_id)continue;const o=v(d);o&&o.status!=="done"&&o.status!=="canceled"&&o.status!=="dead"&&n.push(...re(d,{preserveEmpty:!0,stopReason:"run_canceled"}).closed)}if(await ie({run_id:e.node_id},"the run was canceled"),(await Promise.all([...new Set([e.node_id,...n])].map(d=>K(d,"run_canceled")))).some(d=>!d.confirmed))throw new S(500,"server_error","run process teardown could not be confirmed",void 0,void 0,void 0,!0);const c=v(e.node_id);return L(c??e)}m(In,"cancelRun");const Ee=200;function Tn(e,t){if(typeof t!="string"||!t.trim())throw R("name is required","name");const r=t.trim();if(r.length>Ee)throw R(`name exceeds ${Ee} characters`,"name");const n=Fe(e.node_id,{name:r});return n.window&&qe(n.window,He(n)),L(n)}m(Tn,"renameRun");async function An(e,t={config:ft,client:lt}){await ie({run_id:e.node_id},"the run was deleted");const r=C(a=>(w(a,"UPDATE nodes SET deleting_at = COALESCE(deleting_at, ?) WHERE node_id = ?").run(new Date().toISOString(),e.node_id),w(a,"SELECT node_id FROM nodes WHERE run_id = ? ORDER BY created DESC").all(e.node_id).map(p=>p.node_id)));if((await Promise.all(r.map(a=>K(a,"run_deleted",{deleting:!0})))).some(a=>!a.confirmed))throw new S(500,"server_error","run process teardown could not be confirmed",void 0,void 0,void 0,!0);const i=r.map(a=>{const p=ke(a);if(p.app===null)throw new Error(`run node missing during deletion: ${a}`);return p}),c=w(D(),"SELECT DISTINCT session_id FROM sessions WHERE session_id IS NOT NULL AND node_id IN (SELECT node_id FROM nodes WHERE run_id = ?)").all(e.node_id);for(const{session_id:a}of c)try{Z().delete(a)}catch(p){if(!Ue(p))throw p}const d=C(a=>{for(const E of r){const u=xe(a,E);u!==null&&u.deleted_at===null&&Ce(a,u)}const p=pt([e.node_id],a);w(a,"DELETE FROM run_events WHERE run_id = ?").run(e.node_id),w(a,"DELETE FROM idempotency_keys WHERE run_id = ?").run(e.node_id);const y=r.map(()=>"?").join(","),g=a.prepare(`SELECT message_id FROM messages WHERE sender_node_id IN (${y}) UNION SELECT message_id FROM deliveries WHERE destination_id IN (${y})`).all(...r,...r);a.prepare(`DELETE FROM deliveries WHERE destination_id IN (${y})`).run(...r);for(const{message_id:E}of g)w(a,"DELETE FROM messages WHERE message_id = ? AND NOT EXISTS (SELECT 1 FROM deliveries WHERE message_id = ?)").run(E,E);return p});for(const a of i)We(a);const{notifyRunDeleted:o}=await import("./events.js");return o(e.node_id),{uploads_pending:await ht(d,t)}}m(An,"deleteRun");async function ht(e,t){if(!e.length||!t.config())return e.length;let r;try{r=t.client()}catch{return e.length}const n=new Set,i=e.map(d=>r.deleteUpload(d).then(()=>{_t(d),n.add(d)},()=>{}));let c;return await Promise.race([Promise.all(i),new Promise(d=>{c=setTimeout(d,t.budgetMs??gt),c.unref?.()})]),clearTimeout(c),e.length-n.size}m(ht,"deleteReleasedUploads");function Ln(e,t,r){x(e,t),Q(e);const n=D();n.exec("BEGIN");try{const c=w(n,"SELECT node_id, parent FROM nodes WHERE run_id = ? ORDER BY CASE WHEN node_id = ? THEN 0 ELSE 1 END, created, node_id").all(e,e).map(u=>({node_id:u.node_id,parent_node_id:u.parent,conversations:w(n,"SELECT DISTINCT session_id FROM sessions WHERE node_id = ? ORDER BY created_at").all(u.node_id).map(({session_id:s})=>{const{header:l,entries:h}=Z().read(s);if(r==="entries")return{conversation_id:s,header:l,entries:h};const N=Le.inMemory(l.cwd,void 0,[l,...h]),A=nt(N)??[],J=new Map(h.map((_,b)=>[_.id,b])),we=h.filter(_=>_.type==="custom"&&_.customType==="crtr-system-prompt").map(_=>({id:_.id,message:{role:"custom",customType:"crtr-system-prompt",data:"data"in _?_.data:void 0,timestamp:_.timestamp}})),Y=h.filter(_=>_.type==="custom_message"&&_.customType==="app_message").map(_=>({id:_.id,message:{role:"custom",customType:"app_message",content:"content"in _?_.content:"",timestamp:_.timestamp}})),he=u.node_id===e?h.find(_=>{if(_.type!=="message"||_.message.role!=="user")return!1;const b=te(h,_.message.timestamp);return b?.type==="runtime"&&b.kind==="kickoff"})?.id:void 0,ye=[...A.filter(({id:_})=>!Y.some(b=>b.id===_)),...we,...Y].sort((_,b)=>(J.get(_.id)??Number.MAX_SAFE_INTEGER)-(J.get(b.id)??Number.MAX_SAFE_INTEGER)).map(({id:_,message:b})=>{const f=b,M=f.usage,W=f.role==="user"?te(h,Number(f.timestamp)):null,Re=W?.type==="human"||_===he,I=f.role==="toolResult"?"tool_result":f.role==="bashExecution"?"bash_execution":f.role==="compactionSummary"?"compaction_summary":f.role==="branchSummary"?"branch_summary":f.role==="custom"&&f.customType==="crtr-system-prompt"?"system":f.role==="user"?Re?"user":"custom":f.role,Se=I==="custom"?f.role==="custom"?f.customType:W?.type==="runtime"?W.kind:"unknown":void 0,Ne=I==="system"&&f.customType==="crtr-system-prompt"?[{type:"text",text:f.data?.text??""}]:typeof f.content=="string"?[{type:"text",text:f.content}]:Array.isArray(f.content)?f.content.map(O=>O.type==="toolCall"?{type:"tool_call",tool_call_id:O.id,name:O.name,arguments:O.arguments}:O.type==="image"?{type:"image",mime_type:O.mimeType}:O.type==="thinking"?{type:"thinking",text:O.thinking}:O):[];return{entry_id:_,role:I,...I==="custom"?{custom_type:Se}:{},time:typeof f.timestamp=="string"?f.timestamp:new Date(Number(f.timestamp??Date.now())).toISOString(),content:Ne,...I==="assistant"?{model:f.model,provider:f.provider,stop_reason:f.stopReason,...f.errorMessage?{error_message:f.errorMessage}:{},...M?{usage:{input_tokens:M.input??0,output_tokens:M.output??0,cache_read_tokens:M.cacheRead??0,cache_write_tokens:M.cacheWrite??0,cost_usd:M.cost?.total??0}}:{}}:{},...I==="tool_result"?{tool_call_id:f.toolCallId,tool_name:f.toolName,is_error:f.isError}:{}}})??[];return{conversation_id:s,messages:ye}})})),o=w(n,"SELECT event_cursor FROM nodes WHERE node_id = ?").get(e).event_cursor-1,a=new Map(c.map(u=>[u.node_id,it(u.node_id)])),p=w(n,`SELECT node_id, sequence_number FROM run_events
8
+ ORDER BY activity DESC, node_id DESC`).all(...e===null?[]:[e]).filter(({node_id:o})=>!t.visible||t.visible(o)).filter(({activity:o,node_id:a})=>!r||o<r.activity||o===r.activity&&a<r.id).map(o=>({root:v(o.node_id),activity:o.activity})).filter(({root:o})=>!t.status||T(o)===t.status),c=i.slice(0,t.limit),d=c.at(-1);return{runs:c.map(({root:o})=>L(o)),next:i.length>t.limit&&d?Buffer.from(JSON.stringify({activity:d.activity,id:d.root.node_id})).toString("base64url"):null}}m(On,"listRuns");async function Dn(e,t,r){const n=x(e,t),i=m(()=>L(x(e,t)),"read");return!r||$.includes(T(n))?i():new Promise((c,d)=>{const o=m(()=>{clearTimeout(y),clearInterval(p),a();try{c(i())}catch(g){d(g)}},"finish"),a=at(e,()=>{try{$.includes(String(i().status))&&o()}catch(g){clearTimeout(y),clearInterval(p),a(),d(g)}}),p=setInterval(()=>{$.includes(String(i().status))&&o()},250),y=setTimeout(o,r*1e3)})}m(Dn,"waitRun");async function In(e,t,r=me,n=!0,i){const c=e.status==="canceled"||e.outcome_reason==="closed",d=e.grantee??"app:terminal",o=G("sha256").update(JSON.stringify(["run.message",e.node_id,t,n])).digest("hex"),a=m(async E=>{const u=v(e.node_id),s=w(D(),"SELECT 1 FROM deliveries WHERE message_id = ? AND state = 'pending' AND canceled_at IS NULL").get(String(E.message_id));return u&&!c&&n&&!u.pi_pid&&s&&await H(e.node_id,{resume:!0,capacity:"freeze"}),E},"replay");if(i){const E=k(d,i,o);if(E)return a(E.response)}if(c)throw new S(409,"run_settled","canceled run cannot receive a message");const p=await r(e.node_id,d,t),y=n&&e.final_report&&!e.pi_pid?(await import("../runtime/reopen.js")).commitReopenResident:void 0;let g;try{g=C(E=>{if(i){const l=k(d,i,o,E);if(l)return{replayed:l.response}}y?.(e.node_id);const u=_e(E,e.node_id,d,p,n),s={run_id:e.node_id,message_id:u.messageId,sequence_number:u.sequence};return i&&fe(E,d,i,o,e.node_id,s,new Date().toISOString()),{result:s}})}catch(E){throw p.cleanup(),E}return"replayed"in g?(p.cleanup(),a(g.replayed)):(n&&!e.pi_pid&&await H(e.node_id,{resume:!0,capacity:"freeze"}),g.result)}m(In,"messageRun");async function ht(e){const t=m(()=>new S(503,"service_unavailable",`node ${e} broker was unavailable before the interrupt reached it`),"unavailable");for(let r=0;r<2;r++){const n=v(e);if(!n)throw P();if(!ee(n)){if(n.streaming)throw t();return}const i=V(e)?.executionId;try{await Ye(e)==="turn"&&ue({nodes:[e]});return}catch(c){if(!(c instanceof Je))throw c;const d=v(e);if(!d)throw P();if(!d.streaming)return;if(r===0&&ee(d)&&V(e)?.executionId!==i)continue;throw t()}}throw t()}m(ht,"interruptNode");async function Mn(e,t="stop"){const r=t==="stop"?w(D(),"SELECT node_id FROM nodes WHERE run_id = ?").all(e.node_id).map(({node_id:n})=>n):[e.node_id];return await Promise.all(r.map(n=>ht(n))),L(v(e.node_id)??e)}m(Mn,"interruptRun");async function Tn(e,t={}){const r=w(D(),"SELECT node_id FROM nodes WHERE run_id = ? ORDER BY created DESC").all(e.node_id).map(d=>d.node_id);ue({run:e.node_id});const n=[];if(T(e)!=="settled")n.push(...re(e.node_id,{preserveEmpty:!0,stopReason:"run_canceled"}).closed);else for(const d of r){if(d===e.node_id)continue;const o=v(d);o&&o.status!=="done"&&o.status!=="canceled"&&o.status!=="dead"&&n.push(...re(d,{preserveEmpty:!0,stopReason:"run_canceled"}).closed)}if(await ie({run_id:e.node_id},"the run was canceled"),(await Promise.all([...new Set([e.node_id,...n])].map(d=>K(d,"run_canceled")))).some(d=>!d.confirmed))throw new S(500,"server_error","run process teardown could not be confirmed",void 0,void 0,void 0,!0);const c=v(e.node_id);return L(c??e)}m(Tn,"cancelRun");const Ee=200;function An(e,t){if(typeof t!="string"||!t.trim())throw R("name is required","name");const r=t.trim();if(r.length>Ee)throw R(`name exceeds ${Ee} characters`,"name");const n=Fe(e.node_id,{name:r});return n.window&&qe(n.window,He(n)),L(n)}m(An,"renameRun");async function Ln(e,t={config:_t,client:ft}){await ie({run_id:e.node_id},"the run was deleted");const r=C(a=>(w(a,"UPDATE nodes SET deleting_at = COALESCE(deleting_at, ?) WHERE node_id = ?").run(new Date().toISOString(),e.node_id),w(a,"SELECT node_id FROM nodes WHERE run_id = ? ORDER BY created DESC").all(e.node_id).map(p=>p.node_id)));if((await Promise.all(r.map(a=>K(a,"run_deleted",{deleting:!0})))).some(a=>!a.confirmed))throw new S(500,"server_error","run process teardown could not be confirmed",void 0,void 0,void 0,!0);const i=r.map(a=>{const p=ke(a);if(p.app===null)throw new Error(`run node missing during deletion: ${a}`);return p}),c=w(D(),"SELECT DISTINCT session_id FROM sessions WHERE session_id IS NOT NULL AND node_id IN (SELECT node_id FROM nodes WHERE run_id = ?)").all(e.node_id);for(const{session_id:a}of c)try{Z().delete(a)}catch(p){if(!Ue(p))throw p}const d=C(a=>{for(const E of r){const u=xe(a,E);u!==null&&u.deleted_at===null&&Ce(a,u)}const p=gt([e.node_id],a);w(a,"DELETE FROM run_events WHERE run_id = ?").run(e.node_id),w(a,"DELETE FROM idempotency_keys WHERE run_id = ?").run(e.node_id);const y=r.map(()=>"?").join(","),g=a.prepare(`SELECT message_id FROM messages WHERE sender_node_id IN (${y}) UNION SELECT message_id FROM deliveries WHERE destination_id IN (${y})`).all(...r,...r);a.prepare(`DELETE FROM deliveries WHERE destination_id IN (${y})`).run(...r);for(const{message_id:E}of g)w(a,"DELETE FROM messages WHERE message_id = ? AND NOT EXISTS (SELECT 1 FROM deliveries WHERE message_id = ?)").run(E,E);return p});for(const a of i)We(a);const{notifyRunDeleted:o}=await import("./events.js");return o(e.node_id),{uploads_pending:await yt(d,t)}}m(Ln,"deleteRun");async function yt(e,t){if(!e.length||!t.config())return e.length;let r;try{r=t.client()}catch{return e.length}const n=new Set,i=e.map(d=>r.deleteUpload(d).then(()=>{pt(d),n.add(d)},()=>{}));let c;return await Promise.race([Promise.all(i),new Promise(d=>{c=setTimeout(d,t.budgetMs??Et),c.unref?.()})]),clearTimeout(c),e.length-n.size}m(yt,"deleteReleasedUploads");function Cn(e,t,r){x(e,t),Q(e);const n=D();n.exec("BEGIN");try{const c=w(n,"SELECT node_id, parent FROM nodes WHERE run_id = ? ORDER BY CASE WHEN node_id = ? THEN 0 ELSE 1 END, created, node_id").all(e,e).map(u=>({node_id:u.node_id,parent_node_id:u.parent,conversations:w(n,"SELECT DISTINCT session_id FROM sessions WHERE node_id = ? ORDER BY created_at").all(u.node_id).map(({session_id:s})=>{const{header:l,entries:h}=Z().read(s);if(r==="entries")return{conversation_id:s,header:l,entries:h};const N=Le.inMemory(l.cwd,void 0,[l,...h]),A=nt(N)??[],J=new Map(h.map((_,b)=>[_.id,b])),we=h.filter(_=>_.type==="custom"&&_.customType==="crtr-system-prompt").map(_=>({id:_.id,message:{role:"custom",customType:"crtr-system-prompt",data:"data"in _?_.data:void 0,timestamp:_.timestamp}})),Y=h.filter(_=>_.type==="custom_message"&&_.customType==="app_message").map(_=>({id:_.id,message:{role:"custom",customType:"app_message",content:"content"in _?_.content:"",timestamp:_.timestamp}})),he=u.node_id===e?h.find(_=>{if(_.type!=="message"||_.message.role!=="user")return!1;const b=te(h,_.message.timestamp);return b?.type==="runtime"&&b.kind==="kickoff"})?.id:void 0,ye=[...A.filter(({id:_})=>!Y.some(b=>b.id===_)),...we,...Y].sort((_,b)=>(J.get(_.id)??Number.MAX_SAFE_INTEGER)-(J.get(b.id)??Number.MAX_SAFE_INTEGER)).map(({id:_,message:b})=>{const f=b,I=f.usage,W=f.role==="user"?te(h,Number(f.timestamp)):null,Re=W?.type==="human"||_===he,M=f.role==="toolResult"?"tool_result":f.role==="bashExecution"?"bash_execution":f.role==="compactionSummary"?"compaction_summary":f.role==="branchSummary"?"branch_summary":f.role==="custom"&&f.customType==="crtr-system-prompt"?"system":f.role==="user"?Re?"user":"custom":f.role,Se=M==="custom"?f.role==="custom"?f.customType:W?.type==="runtime"?W.kind:"unknown":void 0,Ne=M==="system"&&f.customType==="crtr-system-prompt"?[{type:"text",text:f.data?.text??""}]:typeof f.content=="string"?[{type:"text",text:f.content}]:Array.isArray(f.content)?f.content.map(O=>O.type==="toolCall"?{type:"tool_call",tool_call_id:O.id,name:O.name,arguments:O.arguments}:O.type==="image"?{type:"image",mime_type:O.mimeType}:O.type==="thinking"?{type:"thinking",text:O.thinking}:O):[];return{entry_id:_,role:M,...M==="custom"?{custom_type:Se}:{},time:typeof f.timestamp=="string"?f.timestamp:new Date(Number(f.timestamp??Date.now())).toISOString(),content:Ne,...M==="assistant"?{model:f.model,provider:f.provider,stop_reason:f.stopReason,...f.errorMessage?{error_message:f.errorMessage}:{},...I?{usage:{input_tokens:I.input??0,output_tokens:I.output??0,cache_read_tokens:I.cacheRead??0,cache_write_tokens:I.cacheWrite??0,cost_usd:I.cost?.total??0}}:{}}:{},...M==="tool_result"?{tool_call_id:f.toolCallId,tool_name:f.toolName,is_error:f.isError}:{}}})??[];return{conversation_id:s,messages:ye}})})),o=w(n,"SELECT event_cursor FROM nodes WHERE node_id = ?").get(e).event_cursor-1,a=new Map(c.map(u=>[u.node_id,it(u.node_id)])),p=w(n,`SELECT node_id, sequence_number FROM run_events
9
9
  WHERE run_id = ? AND sequence_number <= ? AND type IN ('node.thinking.done', 'node.output_text.done', 'usage')
10
10
  ORDER BY sequence_number`).all(e,o);for(const u of p){const s=a.get(u.node_id);s!=null&&u.sequence_number>=s&&a.set(u.node_id,null)}const y=w(n,`SELECT node_id, sequence_number, type, body_json FROM run_events
11
11
  WHERE run_id = ? AND sequence_number <= ? AND type IN ('node.thinking.delta', 'node.output_text.delta')
12
- ORDER BY sequence_number`).all(e,o),g=new Map;for(const u of y){const s=a.get(u.node_id);if(s==null||u.sequence_number<s)continue;const l=JSON.parse(u.body_json),h=g.get(u.node_id)??{thinking:"",text:""};u.type==="node.thinking.delta"?h.thinking+=l.delta:h.text+=l.delta,g.set(u.node_id,h)}const E=c.map(u=>({...u,in_progress_message:a.get(u.node_id)==null?null:g.get(u.node_id)??{thinking:"",text:""}}));return n.exec("COMMIT"),{run_id:e,latest_sequence:o,nodes:E}}catch(i){throw n.exec("ROLLBACK"),i}}m(Ln,"traceRun");function Cn(e,t,r){if(t===void 0){if(!e.some(n=>F(n,"crtr:llm")))throw new S(403,"scope_missing","missing scope crtr:llm",void 0,void 0,"crtr:llm");return null}if(!Array.isArray(t)||t.some(n=>typeof n!="string"))throw R("scopes must be a list of scope strings","scopes");for(const n of t){try{dt(n)}catch{throw R(`invalid scope ${n}`,"scopes")}if(/^crtr:files:(?:read|rw):app:/.test(n)&&n.split(":")[4]===r.slice(4))throw R(`own-app files cannot narrow a run: ${n}`,"scopes");if(!(/^crtr:memory:(?:read|rw):app:/.test(n)&&n.split(":")[4]===r.slice(4))&&!be(e,n))throw new S(403,"scope_missing",`missing scope ${n}`,void 0,void 0,n)}if(!t.includes("crtr:llm"))throw new S(403,"scope_missing","missing scope crtr:llm",void 0,void 0,"crtr:llm");return t}m(Cn,"requestedScopes");export{j as IDEMPOTENCY_WINDOW_MS,Et as RUN_DEADLINE_MAX_MS,gt as RUN_DELETE_STORAGE_BUDGET_MS,Ee as RUN_NAME_MAX,S as RunError,In as cancelRun,An as deleteRun,Sn as idempotencyKeyOf,Mn as interruptRun,bn as listRuns,Dn as messageRun,x as ownedRun,ge as parseRunDeadlineMs,Nn as pruneExpiredIdempotencyKeys,Tn as renameRun,Cn as requestedScopes,yn as rewriteLocalIdempotencyGrantee,Rn as runIsRunning,L as runObject,vn as startRun,Ln as traceRun,On as waitRun};
12
+ ORDER BY sequence_number`).all(e,o),g=new Map;for(const u of y){const s=a.get(u.node_id);if(s==null||u.sequence_number<s)continue;const l=JSON.parse(u.body_json),h=g.get(u.node_id)??{thinking:"",text:""};u.type==="node.thinking.delta"?h.thinking+=l.delta:h.text+=l.delta,g.set(u.node_id,h)}const E=c.map(u=>({...u,in_progress_message:a.get(u.node_id)==null?null:g.get(u.node_id)??{thinking:"",text:""}}));return n.exec("COMMIT"),{run_id:e,latest_sequence:o,nodes:E}}catch(i){throw n.exec("ROLLBACK"),i}}m(Cn,"traceRun");function xn(e,t,r){if(t===void 0){if(!e.some(n=>F(n,"crtr:llm")))throw new S(403,"scope_missing","missing scope crtr:llm",void 0,void 0,"crtr:llm");return null}if(!Array.isArray(t)||t.some(n=>typeof n!="string"))throw R("scopes must be a list of scope strings","scopes");for(const n of t){try{dt(n)}catch{throw R(`invalid scope ${n}`,"scopes")}if(/^crtr:files:(?:read|rw):app:/.test(n)&&n.split(":")[4]===r.slice(4))throw R(`own-app files cannot narrow a run: ${n}`,"scopes");if(!(/^crtr:memory:(?:read|rw):app:/.test(n)&&n.split(":")[4]===r.slice(4))&&!be(e,n))throw new S(403,"scope_missing",`missing scope ${n}`,void 0,void 0,n)}if(!t.includes("crtr:llm"))throw new S(403,"scope_missing","missing scope crtr:llm",void 0,void 0,"crtr:llm");return t}m(xn,"requestedScopes");export{j as IDEMPOTENCY_WINDOW_MS,wt as RUN_DEADLINE_MAX_MS,Et as RUN_DELETE_STORAGE_BUDGET_MS,Ee as RUN_NAME_MAX,S as RunError,Tn as cancelRun,Ln as deleteRun,Nn as idempotencyKeyOf,Mn as interruptRun,On as listRuns,In as messageRun,x as ownedRun,ge as parseRunDeadlineMs,vn as pruneExpiredIdempotencyKeys,An as renameRun,xn as requestedScopes,Rn as rewriteLocalIdempotencyGrantee,Sn as runIsRunning,L as runObject,bn as startRun,Cn as traceRun,Dn as waitRun};
@@ -31,12 +31,17 @@ export declare function providerApprovalPage(question: {
31
31
  }): PreparedPage;
32
32
  /** The question's run, asking node, and app, or null when the request is not a question. */
33
33
  export declare function questionRun(request: HumanRequestRecord, db?: DatabaseSync): AskingNode | null;
34
+ export type QuestionKind = 'decision' | 'notice';
35
+ /** A decision asks for a response; a notice takes none and is acknowledged with empty responses. */
36
+ export declare function questionKind(request: HumanRequestRecord): QuestionKind;
34
37
  /** Called inside the page request's creating write: carries a new question on its run's stream. */
35
38
  export declare function appendWaitingOnUser(db: DatabaseSync, request: HumanRequestRecord): void;
36
39
  /** Called inside the settling write: an answered question emits `question.answered`. */
37
40
  export declare function appendQuestionAnswered(db: DatabaseSync, request: HumanRequestRecord): void;
38
- /** Open questions raised by any node of the run, oldest first. */
41
+ /** Open decisions raised by any node of the run, oldest first; a notice never counts. */
39
42
  export declare function openQuestionIds(runId: string, db?: DatabaseSync): string[];
43
+ /** Open notices raised by any node of the run, oldest first. */
44
+ export declare function openNoticeIds(runId: string, db?: DatabaseSync): string[];
40
45
  export type QuestionStatus = 'open' | 'answered' | 'canceled';
41
46
  export declare function questionStatus(request: HumanRequestRecord): QuestionStatus;
42
47
  /** The stored answer or cancellation of a settled question. */
@@ -1,4 +1,4 @@
1
- var _=Object.defineProperty;var i=(n,e)=>_(n,"name",{value:e,configurable:!0});import{prepared as a}from"../sqlite-statements.js";import{openDb as d}from"../canvas/db.js";import{getRequest as f}from"../human/requests.js";import{preparePageSource as m}from"../human/page-authoring.js";import{appendRunEvent as l}from"./events.js";function p(n,e){return a(n,"SELECT question_id, grantee, sub, provider, tool, status, option_id FROM provider_approvals WHERE question_id = ?").get(e)??null}i(p,"providerQuestion");function R(n){if(!n.title.trim()||!n.body.trim()||!Array.isArray(n.options)||n.options.length===0)throw new Error("provider approval needs a title, body, and options");const e=new Set(["deny"]);for(const o of n.options){if(!o.option_id||!o.label||e.has(o.option_id))throw new Error("provider approval option ids must be nonempty, unique, and different from deny");e.add(o.option_id)}const t=[...n.options.map(({option_id:o,label:s})=>({id:o,label:s})),{id:"deny",label:"Don't do this"}],r=`export default function Approval() { return <Page title={${JSON.stringify(n.title)}}><UserQuestion id="options" label="Choose an option" body={${JSON.stringify(n.body)}} mode="single" required={true} allowFreetext={false} options={${JSON.stringify(t)}} /></Page>; }`;return m({dialect:"jsx",document:r,delivery:{placement:"inline",inbox:!1,reply:!0}})}i(R,"providerApprovalPage");function w(n,e){return e===null?null:a(n,"SELECT node_id, run_id, grantee FROM node_rows WHERE node_id = ? AND run_id IS NOT NULL").get(e)??null}i(w,"askingNode");function g(n){return JSON.parse(n.specification_json)}i(g,"manifestOf");function u(n,e=d()){return n.kind!=="page"||!n.settleable?null:w(e,n.requester_node_id)}i(u,"questionRun");function c(n,e,t=d()){const r=g(n),o=p(t,n.request_id);return{question_id:n.request_id,initiating_app:e,title:n.title,...n.subtitle?{subtitle:n.subtitle}:{},...o?{provider:o.provider,tool:o.tool}:{},steps:r.steps,slots:r.slots.map(s=>({...s.id===void 0?{}:{id:s.id},kind:s.kind,step:s.step,config:s.config}))}}i(c,"questionFields");function D(n,e){const t=u(e,n);t===null||e.state!=="open"||l(n,t.run_id,t.node_id,"waiting_on_user",c(e,t.grantee,n))}i(D,"appendWaitingOnUser");function T(n,e){const t=e.result_json===null?null:JSON.parse(e.result_json);if(p(n,e.request_id)!==null){const s=t?.responses?.options?.selectedOptionIds?.[0];if(e.outcome==="answered"&&(typeof s!="string"||!s))throw new Error(`provider approval ${e.request_id} has no selected option`);a(n,"UPDATE provider_approvals SET status = ?, option_id = ? WHERE question_id = ? AND status = 'open'").run(e.outcome==="answered"?"answered":"canceled",e.outcome==="answered"?s:null,e.request_id)}if(e.outcome!=="answered"||t===null)return;const o=u(e,n);o!==null&&l(n,o.run_id,o.node_id,"question.answered",{question_id:e.request_id,answer:t.responses??{}})}i(T,"appendQuestionAnswered");function k(n,e=d()){return a(e,`SELECT h.request_id FROM human_requests h JOIN node_rows n ON n.node_id = h.requester_node_id
1
+ var h=Object.defineProperty;var r=(n,e)=>h(n,"name",{value:e,configurable:!0});import{prepared as p}from"../sqlite-statements.js";import{openDb as d}from"../canvas/db.js";import{askingNodeSql as f,getRequest as N}from"../human/requests.js";import{preparePageSource as E}from"../human/page-authoring.js";import{pageAwaitsResponse as a}from"../human/page-schema.js";import{appendRunEvent as _}from"./events.js";function u(n,e){return p(n,"SELECT question_id, grantee, sub, provider, tool, status, option_id FROM provider_approvals WHERE question_id = ?").get(e)??null}r(u,"providerQuestion");function J(n){if(!n.title.trim()||!n.body.trim()||!Array.isArray(n.options)||n.options.length===0)throw new Error("provider approval needs a title, body, and options");const e=new Set(["deny"]);for(const t of n.options){if(!t.option_id||!t.label||e.has(t.option_id))throw new Error("provider approval option ids must be nonempty, unique, and different from deny");e.add(t.option_id)}const o=[...n.options.map(({option_id:t,label:s})=>({id:t,label:s})),{id:"deny",label:"Don't do this"}],i=`export default function Approval() { return <Page title={${JSON.stringify(n.title)}}><UserQuestion id="options" label="Choose an option" body={${JSON.stringify(n.body)}} mode="single" required={true} allowFreetext={false} options={${JSON.stringify(o)}} /></Page>; }`;return E({dialect:"jsx",document:i,delivery:{placement:"inline",inbox:!1,reply:!0}})}r(J,"providerApprovalPage");function v(n,e){return e===null?null:p(n,"SELECT node_id, run_id, grantee FROM node_rows WHERE node_id = ? AND run_id IS NOT NULL").get(e)??null}r(v,"askingNode");function l(n){return JSON.parse(n.specification_json)}r(l,"manifestOf");function c(n,e=d()){if(n.kind!=="page"||!n.settleable)return null;const o=l(n);return v(e,n.requester_node_id??(a(o)?null:o.source?.nodeId??null))}r(c,"questionRun");function m(n){return a(l(n))?"decision":"notice"}r(m,"questionKind");function w(n,e,o=d()){const i=l(n),t=u(o,n.request_id);return{question_id:n.request_id,initiating_app:e,title:n.title,...n.subtitle?{subtitle:n.subtitle}:{},...t?{provider:t.provider,tool:t.tool}:{},steps:i.steps,slots:i.slots.map(s=>({...s.id===void 0?{}:{id:s.id},kind:s.kind,step:s.step,config:s.config}))}}r(w,"questionFields");function T(n,e){const o=c(e,n);o===null||e.state!=="open"||m(e)==="notice"||_(n,o.run_id,o.node_id,"waiting_on_user",w(e,o.grantee,n))}r(T,"appendWaitingOnUser");function L(n,e){const o=e.result_json===null?null:JSON.parse(e.result_json);if(u(n,e.request_id)!==null){const s=o?.responses?.options?.selectedOptionIds?.[0];if(e.outcome==="answered"&&(typeof s!="string"||!s))throw new Error(`provider approval ${e.request_id} has no selected option`);p(n,"UPDATE provider_approvals SET status = ?, option_id = ? WHERE question_id = ? AND status = 'open'").run(e.outcome==="answered"?"answered":"canceled",e.outcome==="answered"?s:null,e.request_id)}if(e.outcome!=="answered"||o===null)return;const t=c(e,n);t!==null&&_(n,t.run_id,t.node_id,"question.answered",{question_id:e.request_id,answer:o.responses??{}})}r(L,"appendQuestionAnswered");function g(n,e,o){return p(o,`SELECT h.request_id, h.specification_json FROM human_requests h JOIN node_rows n ON n.node_id = ${f("h")}
2
2
  WHERE n.run_id = ? AND h.kind = 'page' AND h.state = 'open' AND h.settleable = 1
3
- ORDER BY h.created_at, h.request_id`).all(n).map(t=>t.request_id)}i(k,"openQuestionIds");function h(n){return n.state!=="settled"?"open":n.outcome==="answered"?"answered":"canceled"}i(h,"questionStatus");function E(n){if(n.result_json===null)return null;const e=JSON.parse(n.result_json);return n.outcome==="answered"?e.responses??{}:e}i(E,"questionResult");function J(n,e,t){const r=h(n);return{...c(n,e?.grantee??t.grantee),...e===null?{}:{run_id:e.run_id,node_id:e.node_id},status:r,...r==="answered"?{answer:E(n)}:{}}}i(J,"questionObject");function L(n){const e=f(n);if(e===null||e.kind!=="page"||!e.settleable)return null;const t=d(),r=u(e,t),o=p(t,n);return r===null&&o===null?null:{request:e,run:r,approval:o}}i(L,"getQuestion");function v(n){const[e,t]="run_id"in n?["n.run_id = ?",n.run_id]:"node_id"in n?["n.node_id = ?",n.node_id]:["n.grantee = ?",n.grantee];return d().prepare(`SELECT h.request_id FROM human_requests h JOIN node_rows n ON n.node_id = h.requester_node_id
4
- WHERE ${e} AND n.run_id IS NOT NULL AND h.kind = 'page' AND h.state = 'open' AND h.settleable = 1`).all(t).map(r=>r.request_id)}i(v,"openQuestionIdsFor");async function j(n,e){const t=v(n);if(!t.length)return 0;const{cancelHumanTicket:r}=await import("../../daemon/human/finish.js");let o=0;for(const s of t)(await r(s,{reason:e,actor:"crtrd"})).outcome==="settled"&&(o+=1);return o}i(j,"cancelOpenQuestions");export{T as appendQuestionAnswered,D as appendWaitingOnUser,j as cancelOpenQuestions,L as getQuestion,k as openQuestionIds,v as openQuestionIdsFor,R as providerApprovalPage,J as questionObject,E as questionResult,u as questionRun,h as questionStatus};
3
+ ORDER BY h.created_at, h.request_id`).all(n).filter(i=>a(JSON.parse(i.specification_json))===(e==="decision")).map(i=>i.request_id)}r(g,"openIdsOfKind");function F(n,e=d()){return g(n,"decision",e)}r(F,"openQuestionIds");function Q(n,e=d()){return g(n,"notice",e)}r(Q,"openNoticeIds");function O(n){return n.state!=="settled"?"open":n.outcome==="answered"?"answered":"canceled"}r(O,"questionStatus");function S(n){if(n.result_json===null)return null;const e=JSON.parse(n.result_json);return n.outcome==="answered"?e.responses??{}:e}r(S,"questionResult");function $(n,e,o){const i=O(n);return{...w(n,e?.grantee??o.grantee),kind:m(n),...e===null?{}:{run_id:e.run_id,node_id:e.node_id},status:i,...i==="answered"?{answer:S(n)}:{}}}r($,"questionObject");function H(n){const e=N(n);if(e===null||e.kind!=="page"||!e.settleable)return null;const o=d(),i=c(e,o),t=u(o,n);return i===null&&t===null?null:{request:e,run:i,approval:t}}r(H,"getQuestion");function x(n){const[e,o]="run_id"in n?["n.run_id = ?",n.run_id]:"node_id"in n?["n.node_id = ?",n.node_id]:["n.grantee = ?",n.grantee];return d().prepare(`SELECT h.request_id FROM human_requests h JOIN node_rows n ON n.node_id = ${f("h")}
4
+ WHERE ${e} AND n.run_id IS NOT NULL AND h.kind = 'page' AND h.state = 'open' AND h.settleable = 1`).all(o).map(i=>i.request_id)}r(x,"openQuestionIdsFor");async function W(n,e){const o=x(n);if(!o.length)return 0;const{cancelHumanTicket:i}=await import("../../daemon/human/finish.js");let t=0;for(const s of o)(await i(s,{reason:e,actor:"crtrd"})).outcome==="settled"&&(t+=1);return t}r(W,"cancelOpenQuestions");export{L as appendQuestionAnswered,T as appendWaitingOnUser,W as cancelOpenQuestions,H as getQuestion,Q as openNoticeIds,F as openQuestionIds,x as openQuestionIdsFor,J as providerApprovalPage,m as questionKind,$ as questionObject,S as questionResult,c as questionRun,O as questionStatus};
@@ -1 +1 @@
1
- export declare const TERMRENDER_VERSION = "4.12.12";
1
+ export declare const TERMRENDER_VERSION = "4.13.0";
@@ -1 +1 @@
1
- const E="4.12.12";export{E as TERMRENDER_VERSION};
1
+ const E="4.13.0";export{E as TERMRENDER_VERSION};
@@ -1,10 +1,10 @@
1
- var q=Object.defineProperty;var s=(e,t)=>q(e,"name",{value:t,configurable:!0});import{prepared as d}from"../sqlite-statements.js";import{openDb as _,withCanvasWrite as k}from"../canvas/db.js";import{RunError as l}from"../runs/operations.js";const N="app:terminal";function p(e=new Date){return e.toISOString().slice(0,7)}s(p,"usageMonth");function c(e){const[t,n]=e.split("-").map(Number);return new Date(Date.UTC(t,n,1)).toISOString()}s(c,"resetAt");function S(e,t,n=new Date){const u=p(n);d(e,`INSERT INTO usage (grantee, month, payer, source, served_model, input_tokens, output_tokens, cached_tokens, usd_equivalent)
1
+ var q=Object.defineProperty;var s=(e,t)=>q(e,"name",{value:t,configurable:!0});import{prepared as i}from"../sqlite-statements.js";import{openDb as _,withCanvasWrite as k}from"../canvas/db.js";import{RunError as l}from"../runs/operations.js";const N="app:terminal";function p(e=new Date){return e.toISOString().slice(0,7)}s(p,"usageMonth");function c(e){const[t,n]=e.split("-").map(Number);return new Date(Date.UTC(t,n,1)).toISOString()}s(c,"resetAt");function S(e,t,n=new Date){const u=p(n);i(e,`INSERT INTO usage (grantee, month, payer, source, served_model, input_tokens, output_tokens, cached_tokens, usd_equivalent)
2
2
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
3
3
  ON CONFLICT(grantee, month, payer, source, served_model) DO UPDATE SET
4
4
  input_tokens = input_tokens + excluded.input_tokens,
5
5
  output_tokens = output_tokens + excluded.output_tokens,
6
6
  cached_tokens = cached_tokens + excluded.cached_tokens,
7
7
  usd_equivalent = CASE WHEN usd_equivalent IS NULL AND excluded.usd_equivalent IS NULL THEN NULL
8
- ELSE COALESCE(usd_equivalent, 0) + COALESCE(excluded.usd_equivalent, 0) END`).run(t.grantee,u,t.payer,t.source,t.served_model,t.input_tokens,t.output_tokens,t.cached_tokens,t.usd_equivalent),t.payer==="user"&&t.source==="model"&&t.usd_equivalent!==null&&t.usd_equivalent>0&&d(e,`INSERT INTO grantee_usage (grantee, month, usd_equivalent) VALUES (?, ?, ?)
9
- ON CONFLICT(grantee, month) DO UPDATE SET usd_equivalent = usd_equivalent + excluded.usd_equivalent`).run(t.grantee,u,t.usd_equivalent)}s(S,"addUsage");function L(e,t,n,u,o){k(i=>S(i,{grantee:e,payer:t,source:"model",served_model:n,input_tokens:u.input,output_tokens:u.output,cached_tokens:u.cacheRead,usd_equivalent:o}))}s(L,"recordModelUsage");function m(e,t=p()){return d(_(),"SELECT usd_equivalent FROM grantee_usage WHERE grantee = ? AND month = ?").get(e,t)?.usd_equivalent??0}s(m,"monthSpend");function E(e){return e.grantee===N?null:e.spend_cap}s(E,"effectiveCap");function O(e,t=new Date){if(!e)return;const n=E(e);if(n===null)return;const u=p(t),o=m(e.grantee,u);if(!(o<n))throw new l(402,"cap_exhausted",`${e.grantee} reached its $${n} monthly spend cap ($${o.toFixed(2)} used this month)`,void 0,{spend_cap:n,usd_equivalent:o,reset_at:c(u)})}s(O,"assertUnderCap");function T(e,t,n=p()){const u=d(_(),`SELECT payer, source, served_model, input_tokens, output_tokens, usd_equivalent
10
- FROM usage WHERE grantee = ? AND month = ? ORDER BY served_model`).all(e,n),o=s(r=>u.filter(a=>a.payer===r&&a.source==="model").map(({served_model:a,input_tokens:v,output_tokens:h,usd_equivalent:f})=>({served_model:a,input_tokens:v,output_tokens:h,usd_equivalent:f})),"byModel"),i=u.filter(r=>r.payer==="app").reduce((r,a)=>r+(a.usd_equivalent??0),0);return{grantee:e,month:n,usd_equivalent:m(e,n),by_model:o("user"),app_paid:{usd_equivalent:i,by_model:o("app")},spend_cap:E({grantee:e,spend_cap:t}),reset_at:c(n)}}s(T,"usageFor");function A(e){if(e===null)return p();if(!/^[1-9]\d{3}-(0[1-9]|1[0-2])$/.test(e))throw new l(400,"invalid_request","month must be YYYY-MM","month");return e}s(A,"parseUsageMonth");export{N as UNCAPPED_GRANTEE,S as addUsage,O as assertUnderCap,E as effectiveCap,m as monthSpend,A as parseUsageMonth,L as recordModelUsage,c as resetAt,T as usageFor,p as usageMonth};
8
+ ELSE COALESCE(usd_equivalent, 0) + COALESCE(excluded.usd_equivalent, 0) END`).run(t.grantee,u,t.payer,t.source,t.served_model,t.input_tokens,t.output_tokens,t.cached_tokens,t.usd_equivalent),t.payer==="user"&&t.source==="model"&&t.usd_equivalent!==null&&t.usd_equivalent>0&&i(e,`INSERT INTO grantee_usage (grantee, month, usd_equivalent) VALUES (?, ?, ?)
9
+ ON CONFLICT(grantee, month) DO UPDATE SET usd_equivalent = usd_equivalent + excluded.usd_equivalent`).run(t.grantee,u,t.usd_equivalent)}s(S,"addUsage");function L(e,t,n,u,o){k(d=>S(d,{grantee:e,payer:t,source:"model",served_model:n,input_tokens:u.input,output_tokens:u.output,cached_tokens:u.cacheRead,usd_equivalent:o}))}s(L,"recordModelUsage");function m(e,t=p()){return i(_(),"SELECT usd_equivalent FROM grantee_usage WHERE grantee = ? AND month = ?").get(e,t)?.usd_equivalent??0}s(m,"monthSpend");function E(e){return e.grantee===N?null:e.spend_cap}s(E,"effectiveCap");function O(e,t=new Date){if(!e)return;const n=E(e);if(n===null)return;const u=p(t),o=m(e.grantee,u);if(!(o<n))throw new l(402,"cap_exhausted",`${e.grantee} reached its monthly usage limit`,void 0,{spend_cap:n,usd_equivalent:o,reset_at:c(u)})}s(O,"assertUnderCap");function T(e,t,n=p()){const u=i(_(),`SELECT payer, source, served_model, input_tokens, output_tokens, usd_equivalent
10
+ FROM usage WHERE grantee = ? AND month = ? ORDER BY served_model`).all(e,n),o=s(r=>u.filter(a=>a.payer===r&&a.source==="model").map(({served_model:a,input_tokens:v,output_tokens:f,usd_equivalent:h})=>({served_model:a,input_tokens:v,output_tokens:f,usd_equivalent:h})),"byModel"),d=u.filter(r=>r.payer==="app").reduce((r,a)=>r+(a.usd_equivalent??0),0);return{grantee:e,month:n,usd_equivalent:m(e,n),by_model:o("user"),app_paid:{usd_equivalent:d,by_model:o("app")},spend_cap:E({grantee:e,spend_cap:t}),reset_at:c(n)}}s(T,"usageFor");function A(e){if(e===null)return p();if(!/^[1-9]\d{3}-(0[1-9]|1[0-2])$/.test(e))throw new l(400,"invalid_request","month must be YYYY-MM","month");return e}s(A,"parseUsageMonth");export{N as UNCAPPED_GRANTEE,S as addUsage,O as assertUnderCap,E as effectiveCap,m as monthSpend,A as parseUsageMonth,L as recordModelUsage,c as resetAt,T as usageFor,p as usageMonth};
@@ -1,6 +1,6 @@
1
1
  import type { AppPrincipal } from '../principal.js';
2
2
  export declare const QUESTION_OPERATIONS: Set<string>;
3
- /** `question.get` / `question.answer` (daemon-operations §question.*) for an app caller. */
3
+ /** `question.get` / `question.answer` / `question.cancel` (daemon-operations §question.*) for an app caller. */
4
4
  export declare function handleQuestionOperation(name: string, caller: AppPrincipal, questionId: string, body: unknown): Promise<{
5
5
  status: number;
6
6
  body: unknown;
@@ -1 +1 @@
1
- var g=Object.defineProperty;var o=(e,t)=>g(e,"name",{value:t,configurable:!0});import{validatePageTicketResponses as h}from"../../../core/human/tickets.js";import{getRequest as y}from"../../../core/human/requests.js";import{RunError as a}from"../../../core/runs/operations.js";import{getQuestion as _,questionObject as b,questionResult as v,questionStatus as d}from"../../../core/runs/questions.js";import{answerPageTicket as R}from"../../human/finish.js";import{requireRun as A}from"../router.js";const Q=new Set(["question.get","question.answer"]),f=o(()=>new a(404,"not_found","question not found"),"missing");function l(e,t,n){const r=_(t);if(r===null)throw f();if(r.run===null){if(r.approval?.grantee!==e.grantee||r.approval.sub!==e.sub)throw f()}else try{A(e,r.run.run_id,n)}catch(s){throw s instanceof a&&s.code==="not_found"?f():s}return r}o(l,"reachable");function w(e){const t=y(e);return new a(409,"run_settled",`question ${e} is already ${d(t)}`,void 0,{state:d(t),result:v(t)})}o(w,"settled");function O(e){return/slot(?: id)? "([^"]+)"/.exec(e)?.[1]??"responses"}o(O,"slotParam");async function N(e,t,n,r){if(e==="question.get"){const{request:i,run:c,approval:q}=l(t,n,!1);return{status:200,body:b(i,c,q)}}const{request:s}=l(t,n,!0);if(s.state==="settled")throw w(n);const u=r&&typeof r=="object"&&!Array.isArray(r)?r.responses:void 0;if(!u||typeof u!="object"||Array.isArray(u))throw new a(400,"invalid_request","responses must be an object keyed by slot id","responses");try{h(s.request_dir,u)}catch(i){const c=i instanceof Error?i.message:String(i);throw new a(400,"invalid_request",c,O(c))}const p=await R(s.request_id,u,{actor:t.grantee});if(p.outcome==="already_settled")throw w(n);const m=p.result;return{status:200,body:{question_id:s.request_id,status:"answered",answer:m.responses}}}o(N,"handleQuestionOperation");export{Q as QUESTION_OPERATIONS,N as handleQuestionOperation};
1
+ var b=Object.defineProperty;var i=(e,t)=>b(e,"name",{value:t,configurable:!0});import{validatePageTicketResponses as v}from"../../../core/human/tickets.js";import{getRequest as l}from"../../../core/human/requests.js";import{RunError as u}from"../../../core/runs/operations.js";import{getQuestion as R,questionObject as m,questionResult as A,questionStatus as w}from"../../../core/runs/questions.js";import{answerPageTicket as O,cancelHumanTicket as S}from"../../human/finish.js";import{requireRun as T}from"../router.js";const H=new Set(["question.get","question.answer","question.cancel"]),d=i(()=>new u(404,"not_found","question not found"),"missing");function q(e,t,n){const r=R(t);if(r===null)throw d();if(r.run===null){if(r.approval?.grantee!==e.grantee||r.approval.sub!==e.sub)throw d()}else try{T(e,r.run.run_id,n)}catch(s){throw s instanceof u&&s.code==="not_found"?d():s}return r}i(q,"reachable");function f(e){const t=l(e);return new u(409,"run_settled",`question ${e} is already ${w(t)}`,void 0,{state:w(t),result:A(t)})}i(f,"settled");function j(e){return/slot(?: id)? "([^"]+)"/.exec(e)?.[1]??"responses"}i(j,"slotParam");async function U(e,t,n,r){if(e==="question.get"){const{request:o,run:c,approval:_}=q(t,n,!1);return{status:200,body:m(o,c,_)}}const{request:s,run:g,approval:h}=q(t,n,!0);if(s.state==="settled")throw f(n);if(e==="question.cancel"){if((await S(s.request_id,{reason:"dismissed from the app",actor:t.grantee,disposition:"dismissed"})).outcome==="already_settled")throw f(n);return{status:200,body:m(l(n),g,h)}}const a=r&&typeof r=="object"&&!Array.isArray(r)?r.responses:void 0;if(!a||typeof a!="object"||Array.isArray(a))throw new u(400,"invalid_request","responses must be an object keyed by slot id","responses");try{v(s.request_dir,a)}catch(o){const c=o instanceof Error?o.message:String(o);throw new u(400,"invalid_request",c,j(c))}const p=await O(s.request_id,a,{actor:t.grantee});if(p.outcome==="already_settled")throw f(n);const y=p.result;return{status:200,body:{question_id:s.request_id,status:"answered",answer:y.responses}}}i(U,"handleQuestionOperation");export{H as QUESTION_OPERATIONS,U as handleQuestionOperation};