@north-light/cli 0.3.532 → 0.3.533
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.d.ts +6 -3
- package/dist/api/client.js +1 -1
- package/dist/api/contract.d.ts +1 -1
- package/dist/api/contract.js +1 -1
- package/dist/api/dto/canvas.d.ts +2 -0
- package/dist/api/dto/crons.d.ts +2 -0
- package/dist/builtin-memory/crouter-sdk/release-notes.md +8 -0
- package/dist/builtin-memory/northlight-apps/providers/README.md +2 -0
- package/dist/builtin-memory/northlight-apps/providers/sms.md +2 -0
- package/dist/clients/attach/chrome/inbox-strip.d.ts +6 -1
- package/dist/clients/attach/chrome/inbox-strip.js +1 -1
- package/dist/clients/attach/chrome/roster.js +1 -1
- package/dist/clients/attach/session/chrome-refresh.d.ts +12 -3
- package/dist/clients/attach/session/chrome-refresh.js +1 -1
- package/dist/clients/attach/session/document-links.js +1 -1
- package/dist/clients/attach/viewer.js +586 -587
- package/dist/commands/api-client.js +3 -3
- package/dist/commands/node/inspect.js +6 -6
- package/dist/commands/sys/context/expose.js +2 -2
- package/dist/commands/sys/db.d.ts +1 -0
- package/dist/commands/sys/db.js +1 -0
- package/dist/commands/sys.js +1 -1
- package/dist/core/bash-guard.js +9 -3
- package/dist/core/canvas/canvas.d.ts +12 -2
- package/dist/core/canvas/canvas.js +23 -20
- package/dist/core/canvas/daemon-actions.d.ts +0 -3
- package/dist/core/canvas/daemon-actions.js +7 -24
- package/dist/core/canvas/daemon-owner.d.ts +3 -0
- package/dist/core/canvas/daemon-owner.js +1 -6
- package/dist/core/canvas/db.d.ts +28 -20
- package/dist/core/canvas/db.js +4 -3
- package/dist/core/canvas/deliveries.d.ts +5 -0
- package/dist/core/canvas/deliveries.js +25 -30
- package/dist/core/canvas/export-sqlite.d.ts +14 -0
- package/dist/core/canvas/export-sqlite.js +3 -0
- package/dist/core/canvas/import-sqlite.d.ts +44 -0
- package/dist/core/canvas/import-sqlite.js +7 -0
- package/dist/core/canvas/node-tokens.js +3 -3
- package/dist/core/canvas/outcome-actions.js +4 -4
- package/dist/core/canvas/recovery.js +1 -1
- package/dist/core/canvas/schema-pg.sql +1022 -0
- package/dist/core/canvas/schema-version.d.ts +4 -0
- package/dist/core/canvas/schema-version.js +1 -0
- package/dist/core/canvas/sessions.js +3 -3
- package/dist/core/canvas/structured-requests.js +2 -2
- package/dist/core/canvas/tree.js +6 -6
- package/dist/core/canvas/waits.js +1 -1
- package/dist/core/feed/inbox.js +1 -1
- package/dist/core/feed/messages.js +5 -5
- package/dist/core/feed/reports.js +2 -2
- package/dist/core/grants/mirror.js +2 -2
- package/dist/core/graph/access.js +7 -7
- package/dist/core/graph/custom.js +10 -10
- package/dist/core/graph/deletion.js +6 -6
- package/dist/core/graph/documents.d.ts +1 -1
- package/dist/core/graph/documents.js +9 -9
- package/dist/core/graph/edges.d.ts +3 -3
- package/dist/core/graph/edges.js +3 -1
- package/dist/core/graph/events.js +7 -7
- package/dist/core/graph/exposures.d.ts +8 -8
- package/dist/core/graph/jobs.d.ts +1 -1
- package/dist/core/graph/jobs.js +2 -2
- package/dist/core/graph/kinds/custom.js +1 -1
- package/dist/core/graph/kinds/document.js +4 -4
- package/dist/core/graph/kinds/dto.js +1 -1
- package/dist/core/graph/kinds/job.js +2 -2
- package/dist/core/graph/kinds/kind.d.ts +2 -2
- package/dist/core/graph/kinds/kind.js +1 -1
- package/dist/core/graph/kinds/live-read.d.ts +5 -0
- package/dist/core/graph/kinds/live-read.js +1 -0
- package/dist/core/graph/kinds/node.js +5 -5
- package/dist/core/graph/kinds/owner.js +2 -2
- package/dist/core/graph/names.js +3 -3
- package/dist/core/graph/objects.d.ts +5 -5
- package/dist/core/graph/objects.js +10 -10
- package/dist/core/graph/package-docs.js +6 -5
- package/dist/core/graph/reader.d.ts +1 -1
- package/dist/core/graph/reader.js +2 -2
- package/dist/core/graph/receivers.js +4 -5
- package/dist/core/graph/repo-sync/exchange.js +2 -2
- package/dist/core/graph/repo-sync/repos.js +3 -3
- package/dist/core/graph/repo-sync/sync.js +1 -1
- package/dist/core/graph/rules.d.ts +3 -4
- package/dist/core/graph/rules.js +3 -3
- package/dist/core/graph/spaces/app.js +1 -1
- package/dist/core/graph/spaces/index.d.ts +1 -1
- package/dist/core/graph/spaces/index.js +1 -1
- package/dist/core/graph/spaces/own-memory.js +1 -1
- package/dist/core/graph/spaces/person.js +3 -3
- package/dist/core/graph/spaces/repo.d.ts +1 -1
- package/dist/core/graph/spaces/repo.js +1 -1
- package/dist/core/graph/types.d.ts +4 -3
- package/dist/core/graph/watches.d.ts +2 -2
- package/dist/core/graph/watches.js +17 -17
- package/dist/core/human/page-schema.js +5 -4
- package/dist/core/human/requests.d.ts +1 -1
- package/dist/core/human/requests.js +20 -23
- package/dist/core/peer/ingest.js +1 -1
- package/dist/core/peer/receiver.js +1 -1
- package/dist/core/peer/stubs.js +1 -1
- package/dist/core/providers/receipts.js +3 -2
- package/dist/core/review/comments.js +5 -4
- package/dist/core/runs/activity.js +4 -5
- package/dist/core/runs/confinement.d.ts +1 -1
- package/dist/core/runs/confinement.js +2 -2
- package/dist/core/runs/events.d.ts +1 -1
- package/dist/core/runs/events.js +5 -5
- package/dist/core/runs/operations.js +6 -4
- package/dist/core/runtime/close.d.ts +3 -0
- package/dist/core/runtime/close.js +1 -1
- package/dist/core/runtime/host.d.ts +5 -1
- package/dist/core/runtime/host.js +3 -3
- package/dist/core/runtime/launch.js +2 -2
- package/dist/core/runtime/ledger.js +3 -3
- package/dist/core/runtime/lifecycle.d.ts +9 -0
- package/dist/core/runtime/lifecycle.js +2 -2
- package/dist/core/runtime/nodes.d.ts +1 -1
- package/dist/core/runtime/nodes.js +1 -1
- package/dist/core/runtime/roadmap.js +1 -1
- package/dist/core/spaces/stop.d.ts +1 -0
- package/dist/core/spaces/stop.js +2 -2
- package/dist/core/statements.d.ts +17 -0
- package/dist/core/statements.js +2 -0
- package/dist/core/substrate/delivery/corpus.js +3 -3
- package/dist/core/substrate/delivery/deliver.js +5 -5
- package/dist/core/substrate/delivery/listings.js +1 -1
- package/dist/core/substrate/delivery/match.d.ts +2 -2
- package/dist/core/substrate/delivery/match.js +1 -1
- package/dist/core/substrate/delivery/plan.js +3 -3
- package/dist/core/substrate/delivery/render-boot.js +5 -5
- package/dist/core/substrate/delivery/render-event.js +6 -6
- package/dist/core/usage/ledger.js +8 -8
- package/dist/daemon/api/bridge.js +4 -4
- package/dist/daemon/api/document-listener.js +1 -1
- package/dist/daemon/api/handlers/broker-ops.js +1 -1
- package/dist/daemon/api/handlers/canvas.js +1 -1
- package/dist/daemon/api/handlers/crons.js +1 -1
- package/dist/daemon/api/handlers/custom-objects.js +3 -3
- package/dist/daemon/api/handlers/docs.js +1 -1
- package/dist/daemon/api/handlers/inbox.js +1 -1
- package/dist/daemon/api/handlers/memory.js +7 -7
- package/dist/daemon/api/handlers/messages.js +1 -1
- package/dist/daemon/api/handlers/nodes.js +1 -1
- package/dist/daemon/api/handlers/objects.js +3 -3
- package/dist/daemon/api/handlers/reviews.js +1 -1
- package/dist/daemon/api/handlers/structured-requests.js +1 -1
- package/dist/daemon/api/reader.js +1 -1
- package/dist/daemon/broker-signals/bus.d.ts +14 -6
- package/dist/daemon/broker-signals/bus.js +1 -10
- package/dist/daemon/crtrd-cli.js +1 -1
- package/dist/daemon/crtrd.js +12 -11
- package/dist/daemon/due.js +1 -1
- package/dist/daemon/export-sqlite-run.d.ts +1 -0
- package/dist/daemon/export-sqlite-run.js +4 -0
- package/dist/daemon/fleet.d.ts +1 -0
- package/dist/daemon/fleet.js +3 -3
- package/dist/daemon/human/settle.js +1 -1
- package/dist/daemon/manage.d.ts +10 -0
- package/dist/daemon/manage.js +3 -2
- package/dist/daemon/postgres/binary.d.ts +17 -0
- package/dist/daemon/postgres/binary.js +2 -0
- package/dist/daemon/postgres/cluster.d.ts +37 -0
- package/dist/daemon/postgres/cluster.js +6 -0
- package/dist/daemon/postgres/index.d.ts +2 -0
- package/dist/daemon/postgres/index.js +1 -0
- package/dist/daemon/postgres/pins.d.ts +7 -0
- package/dist/daemon/postgres/pins.js +1 -0
- package/dist/daemon/postgres/supervisor.d.ts +95 -0
- package/dist/daemon/postgres/supervisor.js +2 -0
- package/dist/daemon/reconcilers/bash-deadline.js +2 -2
- package/dist/daemon/reconcilers/delivery-lane.js +2 -2
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +7 -3
- package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
- package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
- package/dist/daemon/reconcilers/storage-maintenance.d.ts +0 -6
- package/dist/daemon/reconcilers/storage-maintenance.js +1 -8
- package/dist/daemon/runs/observer.js +5 -4
- package/dist/migrations/004-canvas-documents/index.js +1 -1
- package/dist/pi-extensions/canvas-doc-substrate.d.ts +2 -0
- package/dist/pi-extensions/canvas-doc-substrate.js +6 -6
- package/dist/pi-extensions/envelope-merge.d.ts +3 -2
- package/dist/pi-extensions/envelope-merge.js +9 -8
- package/dist/shared/env.d.ts +3 -0
- package/dist/shared/env.js +2 -2
- package/docs/apps/providers/README.md +2 -0
- package/docs/apps/providers/sms.md +2 -0
- package/docs/public-api.md +11 -2
- package/docs/sdk/release-notes.md +8 -0
- package/package.json +6 -6
- package/packages/crouter-identity/package.json +1 -1
- package/runtime.lock.json +13 -26
- package/scripts/install-runtime.mjs +53 -3
- package/scripts/lib/isolation-env.mjs +3 -1
|
@@ -1,29 +1,26 @@
|
|
|
1
|
-
var ue=Object.defineProperty;var r=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{prepared as l}from"../sqlite-statements.js";import{createHash as le,randomBytes as
|
|
2
|
-
`),i.syncFile(u),i.syncDirectory(n),i.syncDirectory(s),i.syncDirectory(e),i.syncDirectory(ee()),n}r(te,"publishPageRevision");function it(e){if(e.kind!=="page"||e.presentation_dir===null)throw new Error(`page request has no selected presentation: ${e.request_id}`);return e.presentation_dir}r(it,"presentationDir");async function rt(e){const t=e.request_id??await ge(),i=C(t),s=te(i,e.prepared),n=new Date().toISOString(),o=e.prepared.manifest;return await
|
|
1
|
+
var ue=Object.defineProperty;var r=(e,t)=>ue(e,"name",{value:t,configurable:!0});import{prepared as l}from"../sqlite-statements.js";import{createHash as le,randomBytes as x}from"node:crypto";import{existsSync as E,mkdirSync as R,readFileSync as V,readdirSync as _e,realpathSync as O,statSync as pe,writeFileSync as me}from"node:fs";import{basename as j,join as _}from"node:path";import{z as d}from"zod";import{crtrHome as Q,isSafeNodeId as fe,nodesRoot as b}from"../canvas/paths.js";import{withCanvasWrite as Y,openDb as c}from"../canvas/db.js";import{syncDirectory as ye,syncFile as Ee}from"../fs-utils.js";import{newNodeId as ge}from"../runtime/nodes.js";import{pageManifestPath as Ne,pageModulePath as he,pagePath as qe}from"./convention.js";import{preparePageSource as Te}from"./page-authoring.js";import{pageAwaitsResponse as be,pageDeliverySchema as Se,pageIsNoticeSql as we,validatePageManifest as z}from"./page-schema.js";import{appendWaitingOnUser as Ae}from"../runs/questions.js";function G(e){return e===1||e===!0}r(G,"bool");function Z(e){return{request_id:e.request_id,kind:e.kind,inbox_ticket_id:e.inbox_ticket_id,request_dir:e.request_dir,presentation_dir:e.presentation_dir,requester_node_id:e.requester_node_id,companion_node_id:e.companion_node_id,idempotency_key:e.idempotency_key,state:e.state,outcome:e.outcome,inbox_listed:G(e.inbox_listed),settleable:G(e.settleable),title:e.title,subtitle:e.subtitle,file:e.file,specification_json:e.specification_json,action_json:e.action_json,progress_json:e.progress_json,feedback_json:e.feedback_json,result_json:e.result_json,anchor_base_sha256:e.anchor_base_sha256,anchor_base_bytes:e.anchor_base_bytes===null?null:Buffer.from(e.anchor_base_bytes),created_at:e.created_at,opened_at:e.opened_at,submit_requested_at:e.submit_requested_at,settled_at:e.settled_at,settlement_delivery_id:e.settlement_delivery_id,action_delivery_id:e.action_delivery_id,submit_note_delivery_id:e.submit_note_delivery_id,projected_at:e.projected_at,projection_error:e.projection_error,companion_retired_at:e.companion_retired_at,updated_at:e.updated_at}}r(Z,"recordFromRow");async function h(e,t,...i){const s=await e.prepareUncached(`SELECT * FROM human_requests WHERE ${t}`).get(...i);return s===void 0?null:Z(s)}r(h,"one");async function q(e,t,i=[],s="created_at ASC, request_id ASC"){return(await e.prepareUncached(`SELECT * FROM human_requests WHERE ${t} ORDER BY ${s}`).all(...i)).map(Z)}r(q,"many");function ee(){return _(Q(),"requests")}r(ee,"humanRequestsRoot");function C(e){if(!fe(e))throw new TypeError(`request_id must be a safe path segment: ${e}`);const t=ee();return R(t,{recursive:!0,mode:448}),_(O(t),e)}r(C,"requestDir");function U(){return x(32).toString("hex")}r(U,"randomTicketId");function P(e,t){return le("sha256").update(`${O(e)}\0${t}`,"utf8").digest("hex")}r(P,"legacyTicketId");const Re={writeFile(e,t){me(e,t,{flag:"wx",mode:384})},syncFile:Ee,syncDirectory:ye};function ve(e){return _(e,"revisions")}r(ve,"revisionRoot");function te(e,t,i=Re){R(e,{recursive:!0,mode:448});const s=ve(e);R(s,{recursive:!0,mode:448});const n=_(s,x(16).toString("hex"));R(n,{mode:448});const o=qe(n,t.manifest.dialect);if(i.writeFile(o,t.document),i.syncFile(o),t.manifest.dialect==="jsx"){const a=he(n);i.writeFile(a,t.module),i.syncFile(a)}const u=Ne(n);return i.writeFile(u,`${JSON.stringify(t.manifest,null,2)}
|
|
2
|
+
`),i.syncFile(u),i.syncDirectory(n),i.syncDirectory(s),i.syncDirectory(e),i.syncDirectory(ee()),n}r(te,"publishPageRevision");function it(e){if(e.kind!=="page"||e.presentation_dir===null)throw new Error(`page request has no selected presentation: ${e.request_id}`);return e.presentation_dir}r(it,"presentationDir");async function rt(e){const t=e.request_id??await ge(),i=C(t),s=te(i,e.prepared),n=new Date().toISOString(),o=e.prepared.manifest;return await Y(async u=>{await u.prepare(`
|
|
3
3
|
INSERT INTO human_requests (
|
|
4
4
|
request_id, kind, inbox_ticket_id, request_dir, presentation_dir, requester_node_id, state, inbox_listed,
|
|
5
5
|
settleable, title, subtitle, specification_json, action_json, created_at, updated_at
|
|
6
6
|
) VALUES (?, 'page', ?, ?, ?, ?, 'open', ?, ?, ?, ?, ?, ?, ?, ?)
|
|
7
|
-
`).run(t,e.inbox_ticket_id??U(),i,s,e.requester_node_id??null,o.delivery.inbox?1:0,o.delivery.inbox||o.delivery.reply?1:0,o.title,o.subtitle??null,JSON.stringify(o),e.action_json??null,n,n);const a=await h(u,"request_id = ?",t);if(a===null)throw new Error(`page request insert did not produce a row: ${t}`);return await Ae(u,a),a})}r(rt,"createPageRequest");async function st(e){return await
|
|
7
|
+
`).run(t,e.inbox_ticket_id??U(),i,s,e.requester_node_id??null,o.delivery.inbox?1:0,o.delivery.inbox||o.delivery.reply?1:0,o.title,o.subtitle??null,JSON.stringify(o),e.action_json??null,n,n);const a=await h(u,"request_id = ?",t);if(a===null)throw new Error(`page request insert did not produce a row: ${t}`);return await Ae(u,a),a})}r(rt,"createPageRequest");async function st(e){return await Y(async t=>{const i=await t.prepare(`
|
|
8
8
|
INSERT INTO human_requests (
|
|
9
9
|
request_id, kind, inbox_ticket_id, request_dir, requester_node_id, companion_node_id,
|
|
10
10
|
idempotency_key, state, inbox_listed, settleable, title, subtitle, file,
|
|
11
11
|
specification_json, anchor_base_sha256, anchor_base_bytes, created_at, updated_at
|
|
12
12
|
) VALUES (?, 'review', ?, ?, ?, ?, ?, 'binding', ?, 1, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
13
13
|
ON CONFLICT(idempotency_key) DO NOTHING
|
|
14
|
-
`).run(e.request_id,U(),e.request_dir,e.requester_node_id,e.companion_node_id,e.idempotency_key,e.inbox_listed?1:0,e.title??
|
|
15
|
-
AND n.run_id IS NOT NULL AND n.grantee IS NOT NULL AND n.grantee <> 'app:terminal'))`;async function lt(){return await q(await c(),`state = 'open' AND inbox_listed = 1 AND ${ne}`,[],"created_at DESC, request_id DESC")}r(lt,"listOpenInboxRequests");async function _t(){return(await q(await c(),`state = 'open' AND requester_node_id IS NOT NULL AND ((inbox_listed = 1 AND ${ne}) OR (kind = 'page' AND inbox_listed = 0 AND settleable = 1))`,[],"created_at ASC, request_id ASC")).filter(e=>e.inbox_listed||be(JSON.parse(e.specification_json)))}r(_t,"listPendingAsks");async function
|
|
16
|
-
SELECT 1 FROM human_requests
|
|
17
|
-
WHERE kind = 'page' AND result_json IS NOT NULL
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
AND json_type(result_json, '$.summary') IS NOT 'text'
|
|
21
|
-
ELSE 1 END
|
|
14
|
+
`).run(e.request_id,U(),e.request_dir,e.requester_node_id,e.companion_node_id,e.idempotency_key,e.inbox_listed?1:0,e.title??j(e.file),e.subtitle??null,e.file,JSON.stringify(e.specification),e.anchor_base_sha256,e.anchor_base_bytes,e.created_at,e.created_at),s=await h(t,"idempotency_key = ?",e.idempotency_key);if(s===null)throw new Error(`review binding insert did not produce a row: ${e.idempotency_key}`);return{request_id:s.request_id,won:i.changes>0}})}r(st,"commitBindingRequest");async function ot(e){return await h(await c(),"request_id = ?",e)}r(ot,"getRequest");async function at(e){return await h(await c(),"inbox_ticket_id = ?",e)}r(at,"getRequestByInboxTicket");async function dt(e){let t=e;try{t=O(e)}catch{}return await h(await c(),"request_dir = ?",t)}r(dt,"getRequestByDirectory");async function ct(e){return await h(await c(),"companion_node_id = ? AND state <> 'binding'",e)}r(ct,"getRequestByCompanion");async function ut(e){return await h(await c(),"idempotency_key = ?",e)}r(ut,"getRequestByIdempotencyKey");const De=r(e=>`COALESCE(${e}.requester_node_id, CASE WHEN ${e}.kind = 'page' AND ${we(`${e}.specification_json`)} THEN ${e}.specification_json #>> '{source,nodeId}' END)`,"askingNodeSql"),ne=`NOT (kind = 'page' AND EXISTS (SELECT 1 FROM node_rows n WHERE n.node_id = ${De("human_requests")}
|
|
15
|
+
AND n.run_id IS NOT NULL AND n.grantee IS NOT NULL AND n.grantee <> 'app:terminal'))`;async function lt(){return await q(await c(),`state = 'open' AND inbox_listed = 1 AND ${ne}`,[],"created_at DESC, request_id DESC")}r(lt,"listOpenInboxRequests");async function _t(){return(await q(await c(),`state = 'open' AND requester_node_id IS NOT NULL AND ((inbox_listed = 1 AND ${ne}) OR (kind = 'page' AND inbox_listed = 0 AND settleable = 1))`,[],"created_at ASC, request_id ASC")).filter(e=>e.inbox_listed||be(JSON.parse(e.specification_json)))}r(_t,"listPendingAsks");async function Ie(e){return await q(await c(),"state = 'open' AND requester_node_id = ?",[e],"created_at DESC, request_id DESC")}r(Ie,"openRequestsByRequester");async function pt(e){return(await Ie(e)).some(t=>t.kind==="review"?!0:JSON.parse(t.specification_json).delivery?.reply===!0)}r(pt,"hasOpenReplyBearingRequestByRequester");async function mt(){return await q(await c(),"state = 'open' AND inbox_listed = 1 AND requester_node_id IS NOT NULL",[],"created_at DESC, request_id DESC")}r(mt,"listOpenReplyBearingRequests");async function ft(){return await q(await c(),"kind = 'review' AND state = 'binding'")}r(ft,"listBindingRequests");async function yt(){return await q(await c(),"kind = 'review' AND state = 'open' AND submit_requested_at IS NOT NULL")}r(yt,"listSubmitRequestedRequests");async function Et(){return await q(await c(),"kind = 'review' AND state = 'settled' AND projected_at IS NULL")}r(Et,"listUnprojectedReviews");async function gt(e={}){const t=["true"],i=[];for(const[s,n]of Object.entries(e))n!==void 0&&(t.push(s==="page_source_node_id"?"specification_json #>> '{source,nodeId}' = ?":`${s} = ?`),i.push(n));return await q(await c(),t.join(" AND "),i)}r(gt,"listRequests");async function Nt(){return await(await c()).prepare(`
|
|
16
|
+
SELECT 1 FROM human_requests
|
|
17
|
+
WHERE kind = 'page' AND result_json IS NOT NULL
|
|
18
|
+
AND (result_json ->> 'kind') = 'page'
|
|
19
|
+
AND jsonb_typeof(result_json -> 'summary') IS DISTINCT FROM 'string'
|
|
22
20
|
LIMIT 1
|
|
23
21
|
`).get()!==void 0}r(Nt,"hasPageResultException");async function ht(){return await(await c()).prepare(`
|
|
24
|
-
SELECT request_id, specification_json FROM human_requests
|
|
25
|
-
WHERE kind = 'page' AND (
|
|
26
|
-
OR CASE WHEN json_valid(specification_json) THEN json_type(specification_json) != 'object' END)
|
|
22
|
+
SELECT request_id, specification_json FROM human_requests
|
|
23
|
+
WHERE kind = 'page' AND jsonb_typeof(specification_json) <> 'object'
|
|
27
24
|
ORDER BY created_at ASC, request_id ASC LIMIT 1
|
|
28
25
|
`).get()??null}r(ht,"firstInvalidPageSpecification");async function qt(e,t){return(await(await c()).prepare("UPDATE human_requests SET state = 'open', opened_at = ?, updated_at = ? WHERE request_id = ? AND state = 'binding'").run(t,t,e)).changes>0}r(qt,"openRequest");async function Tt(e,t,i){return(await(await c()).prepare(`
|
|
29
26
|
UPDATE human_requests SET state = 'settled', outcome = 'canceled', result_json = ?, settled_at = ?, updated_at = ?
|
|
@@ -32,25 +29,25 @@ var ue=Object.defineProperty;var r=(e,t)=>ue(e,"name",{value:t,configurable:!0})
|
|
|
32
29
|
UPDATE human_requests SET state = 'settled', outcome = ?, result_json = ?, settled_at = ?,
|
|
33
30
|
progress_json = NULL, updated_at = ?
|
|
34
31
|
WHERE request_id = ? AND state = 'open'
|
|
35
|
-
`).run(t.outcome,t.result_json,t.settled_at,t.settled_at,t.request_id)).changes===0?null:await h(e,"request_id = ?",t.request_id)}r(St,"settleRequestLocked");async function wt(e,t,i){await e.prepare("UPDATE human_requests SET settlement_delivery_id = ?, action_delivery_id = ?, updated_at = ? WHERE request_id = ?").run(i.settlement_delivery_id??null,i.action_delivery_id??null,new Date().toISOString(),t)}r(wt,"setSettlementDeliveryMarksLocked");async function At(e,t,i){return(await e.prepare("UPDATE human_requests SET submit_note_delivery_id = ?, updated_at = ? WHERE request_id = ? AND state = 'open' AND submit_note_delivery_id IS NULL").run(i,new Date().toISOString(),t)).changes>0}r(At,"setSubmitNoteDeliveryLocked");async function
|
|
32
|
+
`).run(t.outcome,t.result_json,t.settled_at,t.settled_at,t.request_id)).changes===0?null:await h(e,"request_id = ?",t.request_id)}r(St,"settleRequestLocked");async function wt(e,t,i){await e.prepare("UPDATE human_requests SET settlement_delivery_id = ?, action_delivery_id = ?, updated_at = ? WHERE request_id = ?").run(i.settlement_delivery_id??null,i.action_delivery_id??null,new Date().toISOString(),t)}r(wt,"setSettlementDeliveryMarksLocked");async function At(e,t,i){return(await e.prepare("UPDATE human_requests SET submit_note_delivery_id = ?, updated_at = ? WHERE request_id = ? AND state = 'open' AND submit_note_delivery_id IS NULL").run(i,new Date().toISOString(),t)).changes>0}r(At,"setSubmitNoteDeliveryLocked");async function Rt(e,t){return(await(await c()).prepare(`
|
|
36
33
|
UPDATE human_requests SET presentation_dir = ?, specification_json = ?, title = ?, subtitle = ?, inbox_listed = ?, settleable = ?, updated_at = ?
|
|
37
34
|
WHERE request_id = ? AND kind = 'page' AND state = 'open'
|
|
38
|
-
`).run(t.presentation_dir,t.specification_json,t.title,t.subtitle,t.inbox_listed?1:0,t.settleable?1:0,new Date().toISOString(),e)).changes>0}r(
|
|
35
|
+
`).run(t.presentation_dir,t.specification_json,t.title,t.subtitle,t.inbox_listed?1:0,t.settleable?1:0,new Date().toISOString(),e)).changes>0}r(Rt,"revisePageRequest");async function vt(e,t){return(await(await c()).prepare(`
|
|
39
36
|
UPDATE human_requests SET progress_json = ?, updated_at = ?
|
|
40
37
|
WHERE inbox_ticket_id = ? AND kind = 'page' AND state = 'open' AND settleable = 1
|
|
41
|
-
`).run(JSON.stringify({kind:"page",responses:t,savedAt:new Date().toISOString()}),new Date().toISOString(),e)).changes>0}r(
|
|
38
|
+
`).run(JSON.stringify({kind:"page",responses:t,savedAt:new Date().toISOString()}),new Date().toISOString(),e)).changes>0}r(vt,"writeProgress");async function Dt(e,t){await(await c()).prepare("UPDATE human_requests SET projected_at = ?, projection_error = NULL, updated_at = ? WHERE request_id = ?").run(t,t,e)}r(Dt,"markProjected");async function It(e,t){await(await c()).prepare("UPDATE human_requests SET projection_error = ?, updated_at = ? WHERE request_id = ? AND projected_at IS NULL").run(t,new Date().toISOString(),e)}r(It,"markProjectionError");async function Ot(e,t){await(await c()).prepare("UPDATE human_requests SET companion_retired_at = ?, updated_at = ? WHERE request_id = ? AND companion_retired_at IS NULL").run(t,t,e)}r(Ot,"markCompanionRetired");async function Lt(e){const t=await(await c()).prepare("SELECT anchor_base_bytes, anchor_base_sha256 FROM human_requests WHERE request_id = ?").get(e);return t===void 0||t.anchor_base_bytes===null||t.anchor_base_sha256===null?null:{bytes:Buffer.from(t.anchor_base_bytes),sha256:t.anchor_base_sha256}}r(Lt,"readAnchorBase");async function kt(e,t,i,s){await e.prepare("UPDATE human_requests SET anchor_base_bytes = ?, anchor_base_sha256 = ?, updated_at = ? WHERE request_id = ?").run(i,s,new Date().toISOString(),t)}r(kt,"replaceAnchorBaseLocked");function Oe(e){if(typeof e!="object"||e===null)throw new Error("result is not an object");const t=e;return t.kind==="canceled"?{outcome:t.disposition==="dismissed"?"dismissed":"canceled",settledAt:String(t.canceledAt)}:{outcome:"answered",settledAt:String(t.completedAt)}}r(Oe,"legacyPageResult");function A(e){try{return JSON.parse(V(e,"utf8"))}catch(t){throw new Error(`corrupt required input: ${e}`,{cause:t})}}r(A,"readJson");function H(){return x(16).toString("hex")}r(H,"migrationId");function Le(e){return Number(l(e,"SELECT COALESCE(MAX(seq), 0) AS seq FROM messages").get().seq)+1}r(Le,"nextMessageSeq");function ke(e,t,i,s){return(s==="page"?l(e,`SELECT d.delivery_id FROM deliveries d JOIN messages m ON m.message_id = d.message_id
|
|
42
39
|
WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.sender_node_id = ?
|
|
43
40
|
AND m.disposition IN ('human-answer', 'human-canceled') LIMIT 1`).get(i,t):l(e,`SELECT d.delivery_id FROM deliveries d JOIN messages m ON m.message_id = d.message_id
|
|
44
|
-
WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.body_json LIKE ? LIMIT 1`).get(i,`%"review_id":"${t}"%`))?.delivery_id??null}r(
|
|
41
|
+
WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND m.body_json LIKE ? LIMIT 1`).get(i,`%"review_id":"${t}"%`))?.delivery_id??null}r(ke,"importedTerminalDelivery");function ie(e,t,i){if(t===null||i===null)return!1;const s=l(e,"SELECT status, final_report FROM nodes WHERE node_id = ?").get(t);return s?.status==="canceled"||i==="approved"&&s?.status==="done"&&s.final_report!==null}r(ie,"companionRetirementProven");function re(e){if(typeof e!="object"||e===null)return"no reason was given";const t=e.reason;return typeof t=="string"&&t!==""?t:"no reason was given"}r(re,"migratedCancellationReason");function xe(e,t){const i=e.outcome==="canceled"||e.outcome==="dismissed";return[e.kind==="review"?i?`Review ${e.requestId} was canceled \u2014 ${re(t)}.`:`Review ${e.requestId} was approved by the user.`:i?`Human request ${e.requestId} was canceled \u2014 ${re(t)}.`:`Human request ${e.requestId} was answered.`,...e.kind==="review"?[`The review result is at ${e.requestDir}/result.json.`]:[],`Result:
|
|
45
42
|
${JSON.stringify(t,null,2)}`].join(`
|
|
46
43
|
|
|
47
|
-
`)}r(
|
|
44
|
+
`)}r(xe,"migratedTerminalBody");function je(e,t){const i=H(),s=H(),n=Date.parse(t.settledAt),o=Number.isFinite(n)?n:0,u=t.outcome==="answered"||t.outcome==="approved"?"human-answer":"human-canceled",a=JSON.parse(t.resultJson),p=xe(t,a);return l(e,`INSERT INTO messages
|
|
48
45
|
(message_id, seq, operation_id, created_at, sender_node_id, sender_name, kind, label, body_ref, body_json, disposition)
|
|
49
|
-
VALUES (?, ?, ?, ?, NULL, 'crtrd', 'completed', ?, NULL, ?, ?)`).run(i,
|
|
46
|
+
VALUES (?, ?, ?, ?, NULL, 'crtrd', 'completed', ?, NULL, ?, ?)`).run(i,Le(e),H(),t.settledAt,p.split(`
|
|
50
47
|
`,1)[0],JSON.stringify({body:p,result:a}),u),l(e,`INSERT INTO deliveries
|
|
51
48
|
(delivery_id, message_id, destination_kind, destination_id, urgency, wake, state, attempts, created_at, updated_at)
|
|
52
|
-
VALUES (?, ?, 'node_inbox', ?, 'normal', 1, 'pending', 0, ?, ?)`).run(s,i,t.requesterNodeId,o,o),s}r(
|
|
53
|
-
`}r($e,"legacyReplayDocument");function oe(e){return Array.isArray(e.slots)?{...e,slots:e.slots.map(t=>{if(typeof t!="object"||t===null||Array.isArray(t))return t;const i=t;if(i.kind!=="text"||typeof i.config!="object"||i.config===null||Array.isArray(i.config))return t;const{editable:s,...n}=i.config;return{...i,config:n}})}:e}r(oe,"withoutLegacyTextEditable");function
|
|
49
|
+
VALUES (?, ?, 'node_inbox', ?, 'normal', 1, 'pending', 0, ?, ?)`).run(s,i,t.requesterNodeId,o,o),s}r(je,"createMigratedTerminalDelivery");function se(e,t){if(t.requesterNodeId===null||t.outcome===null||t.resultJson===null||t.settledAt===null)return null;const i=ke(e,t.requestId,t.requesterNodeId,t.kind);return i!==null?i:t.deliveredAt!==null&&t.deliveredAt!==void 0?null:je(e,{requestId:t.requestId,requesterNodeId:t.requesterNodeId,kind:t.kind,outcome:t.outcome,resultJson:t.resultJson,settledAt:t.settledAt,requestDir:t.requestDir})}r(se,"terminalDeliveryMark");const Ce=d.object({sessionName:d.string().optional(),askedBy:d.string().optional(),blockedSince:d.string().optional(),profileName:d.string().optional(),nodeId:d.string().optional()}).strict(),Ue=d.object({id:d.string().regex(/^[A-Za-z0-9_-]{1,64}$/).optional(),kind:d.string().min(1),step:d.number().int().nonnegative(),config:d.record(d.string(),d.unknown()),unvalidated:d.literal(!0).optional(),display:d.literal(!0).optional()}).strict(),Pe=d.object({schema:d.literal("crtr.page/v1"),dialect:d.enum(["md","html","jsx"]),title:d.string().trim().min(1),subtitle:d.string().optional(),placement:d.enum(["inline","panel"]),document:d.enum(["page.md","page.html","page.tsx"]),steps:d.number().int().positive(),slots:d.array(Ue),source:Ce.optional()}).strict().superRefine((e,t)=>{const i=e.dialect==="md"?"page.md":e.dialect==="html"?"page.html":"page.tsx";e.document!==i&&t.addIssue({code:"custom",path:["document"],message:"document must agree with dialect"}),e.dialect==="md"&&e.steps!==1&&t.addIssue({code:"custom",path:["steps"],message:"md pages have exactly one step"})});function He(e){if(e.source===void 0)return;const{blockedSince:t,...i}=e.source,s={...i,...t!==void 0&&d.string().datetime({offset:!0}).safeParse(t).success?{emittedAt:t}:{}};return Object.keys(s).length===0?void 0:s}r(He,"legacyPresentationSource");function $e(e,t,i){return`export default function LegacyPage() { return <Page title={${JSON.stringify(e)}}${t===void 0?"":` subtitle={${JSON.stringify(t)}}`}><pre>{${JSON.stringify(i)}}</pre></Page>; }
|
|
50
|
+
`}r($e,"legacyReplayDocument");function oe(e){return Array.isArray(e.slots)?{...e,slots:e.slots.map(t=>{if(typeof t!="object"||t===null||Array.isArray(t))return t;const i=t;if(i.kind!=="text"||typeof i.config!="object"||i.config===null||Array.isArray(i.config))return t;const{editable:s,...n}=i.config;return{...i,config:n}})}:e}r(oe,"withoutLegacyTextEditable");function Me(e,t){const i=_(e,"page.json"),s=Pe.safeParse(t);if(!s.success)throw new Error(s.error.message);const n=s.data,o=He(n),u={placement:n.placement,inbox:!0,reply:n.source?.blockedSince!==void 0};z(oe({schema:"crtr.page/v2",dialect:"jsx",title:n.title,...n.subtitle===void 0?{}:{subtitle:n.subtitle},delivery:u,document:"page.tsx",steps:n.steps,slots:n.slots,...o===void 0?{}:{source:o}}));const a=_(e,n.document);if(!E(a))throw new Error(`corrupt required input: ${a}`);const p=V(a,"utf8"),f=Te({dialect:"jsx",document:$e(n.title,n.subtitle,p),source:o,delivery:u});if(o!==void 0)return f;const{source:y,...g}=f.manifest;return{...f,manifest:g}}r(Me,"migrateLegacyPage");function xt(e){e.exec(`
|
|
54
51
|
CREATE TABLE human_requests (
|
|
55
52
|
request_id TEXT PRIMARY KEY, kind TEXT NOT NULL CHECK (kind IN ('page','review')),
|
|
56
53
|
inbox_ticket_id TEXT NOT NULL UNIQUE, request_dir TEXT NOT NULL, presentation_dir TEXT,
|
|
@@ -79,4 +76,4 @@ ${JSON.stringify(t,null,2)}`].join(`
|
|
|
79
76
|
progress_json, feedback_json, result_json, anchor_base_sha256, anchor_base_bytes, created_at, opened_at,
|
|
80
77
|
submit_requested_at, settled_at, settlement_delivery_id, action_delivery_id, projected_at, projection_error,
|
|
81
78
|
companion_retired_at, updated_at
|
|
82
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);if(l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'reviews'").get()!==void 0){const s=l(e,"SELECT * FROM reviews").all();for(const n of s){const o=n.state,u=o==="approved"||o==="canceled",a=o==="canceled"&&n.result_json===null?JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:n.canceled_at,...n.cancel_reason===""||n.cancel_reason===null?{}:{reason:n.cancel_reason},...n.cancel_actor===null?{}:{actor:n.cancel_actor}}):n.result_json;if(u&&a===null)throw new Error(`corrupt required input: reviews/${n.review_id} has no terminal result`);const p=n.bridge_node_id===null?_(
|
|
79
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);if(l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'reviews'").get()!==void 0){const s=l(e,"SELECT * FROM reviews").all();for(const n of s){const o=n.state,u=o==="approved"||o==="canceled",a=o==="canceled"&&n.result_json===null?JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:n.canceled_at,...n.cancel_reason===""||n.cancel_reason===null?{}:{reason:n.cancel_reason},...n.cancel_actor===null?{}:{actor:n.cancel_actor}}):n.result_json;if(u&&a===null)throw new Error(`corrupt required input: reviews/${n.review_id} has no terminal result`);const p=n.bridge_node_id===null?_(Q(),"reviews",n.review_id):_(b(),n.bridge_node_id),f={origin_kind:n.origin_kind,bridge_node_id:n.bridge_node_id,origin_session_file:n.origin_session_file,origin_session_id:n.origin_session_id,origin_leaf_id:n.origin_leaf_id,model_spec:n.model_spec,branch_file:n.branch_file,baseline_sha256:n.baseline_sha256,baseline_bytes:n.baseline_bytes,captured_at:n.captured_at,output_path:n.output_path},y=u?o==="approved"?"approved":"canceled":null,g=u?o==="approved"?n.approved_at:n.canceled_at:null,S=se(e,{requestId:n.review_id,requesterNodeId:n.origin_node_id,kind:"review",outcome:y,resultJson:a,settledAt:g,requestDir:p,deliveredAt:n.delivered_at}),v=ie(e,n.companion_node_id,y)?g:null;t.run(n.review_id,"review",n.origin_kind==="ticket"?P(b(),j(p)):U(),p,null,n.origin_node_id,n.companion_node_id,n.idempotency_key,u?"settled":o,y,n.origin_kind==="ticket"?1:0,1,j(n.file),n.subtitle,n.file,JSON.stringify(f),null,null,null,a,n.anchor_base_sha256,n.anchor_base_bytes,n.created,n.opened_at,n.submit_requested_at,g,S,null,n.projected_at,n.projection_error,v,n.created)}e.exec("DROP TABLE reviews")}for(const s of E(b())?_e(b(),{withFileTypes:!0}):[]){if(!s.isDirectory())continue;const n=_(b(),s.name),o=_(n,"page.json"),u=_(n,"review.json");if(!E(o)){if(E(u))continue;continue}if(l(e,"SELECT 1 FROM human_requests WHERE request_id = ?").get(s.name)!==void 0)continue;let a,p,f,y;try{const m=A(o);if(typeof m!="object"||m===null||Array.isArray(m))throw new Error("page manifest must be an object");a=m,a.schema==="crtr.page/v1"?(p=Me(n,m),a=p.manifest):a.schema==="crtr.page/v2"&&(a=oe(a));const w=Se.safeParse(a.delivery);if(typeof a.title!="string"||!w.success)throw new Error(w.success?"page title must be a string":w.error.message);y=w.data,f=z(a)}catch(m){const w=m instanceof Error&&m.cause instanceof Error?m.cause.message:m instanceof Error?m.message:String(m);console.warn(`skipping legacy page ${o}: ${w}`);continue}let g=O(n);p!==void 0&&(g=te(C(s.name),p));const S=f.source,v=_(n,"response.json"),D=E(v)?A(v):null,N=D===null?null:Oe(D),ae=l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'deliveries'").get()===void 0?null:l(e,"SELECT delivery_id FROM deliveries WHERE idempotency_key = ?").get(`human-action:${P(b(),s.name)}`),$=_(n,"action.json"),M=_(n,"progress.json"),L=_(n,"feedback-comments.json"),k=_(n,"reply-route.json"),T=E(L)?A(L):null;if(T!==null&&(typeof T!="object"||typeof T.companionNodeId<"u"&&typeof T.companionNodeId!="string"))throw new Error(`corrupt required input: ${L}`);const I=E(k)?A(k):null;if(I!==null&&(typeof I!="object"||typeof I.bridge_node_id!="string"))throw new Error(`corrupt required input: ${k}`);const X=I?.bridge_node_id,F=(typeof X!="string"||l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'nodes'").get()===void 0?null:l(e,"SELECT parent FROM nodes WHERE node_id = ?").get(X))?.parent??(typeof S?.nodeId=="string"?S.nodeId:null),W=T?.companionNodeId,J=typeof S?.emittedAt=="string"?S.emittedAt:pe(o).mtime.toISOString(),B=D===null?null:JSON.stringify(D),de=se(e,{requestId:s.name,requesterNodeId:F,kind:"page",outcome:N?.outcome??null,resultJson:B,settledAt:N?.settledAt??null,requestDir:n}),ce=ie(e,W??null,N?.outcome??null)?N?.settledAt??null:null,K=C(s.name);R(K,{recursive:!0,mode:448}),t.run(s.name,"page",P(b(),s.name),K,g,F,W??null,null,N===null?"open":"settled",N?.outcome??null,y.inbox?1:0,y.inbox||y.reply?1:0,f.title,f.subtitle??null,null,JSON.stringify(f),E($)?JSON.stringify(A($)):null,E(M)&&N===null?JSON.stringify(A(M)):null,T===null?null:JSON.stringify(T),B,null,null,J,null,null,N?.settledAt??null,de,ae?.delivery_id??null,null,null,ce,J)}const i=l(e,"SELECT request_id FROM human_requests WHERE state = 'settled' AND result_json IS NULL").get();if(i!==void 0)throw new Error(`human request migration produced terminal row without result: ${i.request_id}`);if(l(e,"SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get()!==void 0){const s=l(e,"SELECT review_id FROM review_comments WHERE review_id NOT IN (SELECT request_id FROM human_requests WHERE kind = 'review') LIMIT 1").get();if(s!==void 0)throw new Error(`review comment has no migrated review request: ${s.review_id}`)}}r(xt,"migrateHumanRequestsState");export{ne as NOT_OTHER_APP_QUESTION,De as askingNodeSql,Tt as cancelBindingRequest,st as commitBindingRequest,rt as createPageRequest,ht as firstInvalidPageSpecification,ot as getRequest,ct as getRequestByCompanion,dt as getRequestByDirectory,ut as getRequestByIdempotencyKey,at as getRequestByInboxTicket,pt as hasOpenReplyBearingRequestByRequester,Nt as hasPageResultException,ee as humanRequestsRoot,ft as listBindingRequests,lt as listOpenInboxRequests,mt as listOpenReplyBearingRequests,_t as listPendingAsks,gt as listRequests,yt as listSubmitRequestedRequests,Et as listUnprojectedReviews,Ot as markCompanionRetired,Dt as markProjected,It as markProjectionError,xt as migrateHumanRequestsState,qt as openRequest,Ie as openRequestsByRequester,it as presentationDir,te as publishPageRevision,Lt as readAnchorBase,kt as replaceAnchorBaseLocked,C as requestDir,bt as requestSubmit,Rt as revisePageRequest,wt as setSettlementDeliveryMarksLocked,At as setSubmitNoteDeliveryLocked,St as settleRequestLocked,vt as writeProgress};
|
package/dist/core/peer/ingest.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var g=Object.defineProperty;var o=(e,t)=>g(e,"name",{value:t,configurable:!0});import{CrtrError as
|
|
1
|
+
var g=Object.defineProperty;var o=(e,t)=>g(e,"name",{value:t,configurable:!0});import{CrtrError as k}from"../errors.js";import{getById as u}from"../graph/objects.js";import{publish as O}from"../graph/events.js";import{markLinkWatch as R,recordWatch as N}from"../graph/watches.js";import{armObjectWaitForWatch as T}from"../graph/object-waits.js";import{ackRows as h,claimRows as L}from"./outbox-store.js";import{ensureStub as y,localOwnerActor as C,stubOf as w}from"./stubs.js";import{withCanvasWrite as S}from"../canvas/db.js";const K=100,P=o(e=>e==="unknown_event"||e==="unknown_kind","isCatalogLag"),f=o((e,t)=>`peer:${e}:${t}`,"ingestKey");async function $(e,t){return await e.prepare("SELECT 1 FROM peer_ingested WHERE key = ?").get(t)!==void 0?!0:await e.prepare("SELECT 1 FROM deliveries WHERE idempotency_key >= ? AND idempotency_key < ? LIMIT 1").get(`${t}:`,`${t};`)!==void 0}o($,"applied");const m=o(async(e,t,n)=>{await e.prepare("INSERT INTO peer_ingested_destinations (key, ingested_at) VALUES (?, ?) ON CONFLICT DO NOTHING").run(`${t}:${n}`,Date.now())},"markDestination");async function F(e,t,n){return await e.prepare("SELECT 1 FROM peer_ingested_destinations WHERE key = ?").get(`${t}:${n}`)!==void 0||await e.prepare("SELECT 1 FROM deliveries WHERE idempotency_key = ?").get(`${t}:${n}`)!==void 0}o(F,"destinationDone");async function I(e,t,n){return await C(e,t)??await y(e,t.id,t.type,n,void 0,t)}o(I,"actorFor");async function E(e,t,n,r,i){const c=n.actor===null?null:await I(e,n.actor,t),l=n.body_text,a=n.body===void 0&&l===void 0?void 0:{...n.body??{},...l===void 0?{}:{body:l}};await O(e,{event:n.event,object:r,actor:c,level:n.level,attrs:n.attrs,...a===void 0?{}:{messageBody:a},idempotencyKey:f(t,n.message_id),...i===void 0?{}:{onlyWatchers:i}})}o(E,"apply");async function W(e,t){const n=`ev:${t.message_id}:`;if(!t.key.startsWith(n)||t.key.length===n.length)return null;const r=await u(e,t.key.slice(n.length));return r!==null&&r.type==="node"&&r.deleted_at===null&&await w(e,r)===null?r:null}o(W,"localDestination");async function U(e,t,n){const r={accepted:[],rejected:[]};for(const i of n){const c=f(t,i.message_id),l=await $(e,c);try{await S(async()=>{const a=await W(e,i);if(l&&a===null)return;const s=await y(e,i.object.id,i.object.type,t,void 0,i.object),d=i.linked===!0&&a!==null&&s.owner!==null?await u(e,s.owner):null,p=d!==null&&d.type==="app"?d:null;if(a!==null&&await e.prepare("SELECT 1 FROM watches WHERE watcher = ? AND object = ?").get(a.id,s.id)===void 0?(await N(e,a,s,"act",{patterns:[">"],...p===null?{}:{linkApp:p}}),await T(e,a,s)):a!==null&&p!==null&&await R(e,a,s,p),l)await F(e,c,a.id)||await E(e,t,i,s,[a.id]);else{await E(e,t,i,s),await e.prepare("INSERT INTO peer_ingested (key, ingested_at) VALUES (?, ?) ON CONFLICT DO NOTHING").run(c,Date.now());for(const _ of await e.prepare("SELECT destination_id FROM deliveries WHERE idempotency_key >= ? AND idempotency_key < ?").all(`${c}:`,`${c};`))await m(e,c,_.destination_id)}a!==null&&await m(e,c,a.id)},{savepoint:!0}),r.accepted.push(i.key)}catch(a){const s=a instanceof k?a.code:"invalid_event";r.rejected.push({key:i.key,code:s,message:a instanceof Error?a.message:String(a)})}}return r}o(U,"ingestPeerEvents");const X=o(async(e,t,n)=>(await w(e,t))?.home_machine===n,"isStubOf"),q=o(async(e,t,n)=>await L(e,t,n),"claimFor"),v=o(async(e,t,n)=>await h(e,t,n),"ackFor");export{K as MAX_EVENTS_PER_CALL,v as ackFor,q as claimFor,f as ingestKey,U as ingestPeerEvents,P as isCatalogLag,X as isStubOf};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var p=Object.defineProperty;var a=(t,n)=>p(t,"name",{value:n,configurable:!0});import{heads as y}from"../graph/documents.js";import{bodyOf as _}from"../graph/bodies.js";import{getById as s}from"../graph/objects.js";import{enqueuePeerRow as m}from"./outbox-store.js";import{describeObject as l,stubOf as w}from"./stubs.js";const b=a((t,n)=>`ev:${t}:${n}`,"eventKey");async function j(t,n){const i=typeof n?.pointer=="string"?n.pointer:void 0,e=i===void 0?null:await s(t,i);if(e===null||e.type!=="document"||e.deleted_at!==null)return;const o=(await y(t,e))[0];if(o===void 0)return;const r=await t.prepare("SELECT source_path FROM documents WHERE object = ?").get(e.
|
|
1
|
+
var p=Object.defineProperty;var a=(t,n)=>p(t,"name",{value:n,configurable:!0});import{heads as y}from"../graph/documents.js";import{bodyOf as _}from"../graph/bodies.js";import{getById as s}from"../graph/objects.js";import{enqueuePeerRow as m}from"./outbox-store.js";import{describeObject as l,stubOf as w}from"./stubs.js";const b=a((t,n)=>`ev:${t}:${n}`,"eventKey");async function j(t,n){const i=typeof n?.pointer=="string"?n.pointer:void 0,e=i===void 0?null:await s(t,i);if(e===null||e.type!=="document"||e.deleted_at!==null)return;const o=(await y(t,e))[0];if(o===void 0)return;const r=await t.prepare("SELECT source_path FROM documents WHERE object = ?").get(e.id);return _(o.body_hash,r?.source_path??null)}a(j,"reportText");async function g(t,n,i){const e=await t.prepare("SELECT message_id, event, object_id, level, actor_id, body_ref, body_json FROM messages WHERE message_id = ?").get(n);if(e===void 0)throw new Error(`no message ${n}`);const o=await s(t,e.object_id);if(o===null)throw new Error(`no object ${e.object_id}`);const r=e.actor_id===null?null:await s(t,e.actor_id),f=e.body_json===null?{}:JSON.parse(e.body_json),{push:d,bodyRef:h,...c}=f,u=e.body_ref===null?void 0:await j(t,d);return{key:i,message_id:e.message_id,event:e.event,level:e.level,object:await l(t,o),actor:r===null?null:await l(t,r),attrs:d?.attrs??{},...Object.keys(c).length>0?{body:c}:{},...u===void 0?{}:{body_text:u}}}a(g,"payloadFor");const T={bodyOwner:a(()=>null,"bodyOwner"),async enqueue(t,n,i){for(const e of i){const o=await w(t,e.id);if(o===null)continue;const r=b(n.messageId,e.id);await m(t,{peer:o.home_machine,kind:"event",key:r,payload:{...await g(t,n.messageId,r),...e.linked?{linked:!0}:{}}})}}};export{b as eventKey,g as payloadFor,T as peerReceiver};
|
package/dist/core/peer/stubs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var T=Object.defineProperty;var a=(n,e)=>T(n,"name",{value:e,configurable:!0});import{createObject as O,ensureOwner as y,getById as c}from"../graph/objects.js";import{upsertKind as x}from"../graph/custom.js";import{CrtrError as d}from"../errors.js";import{ExitCode as E}from"../../types.js";import{normalizeMachineId as A}from"./names.js";const b=["public","friends","private"],H=a(n=>{const e=n.act.act;return e===void 0?{sub:n.sub,app:null,node:null,node_scopes:null,place:null}:{sub:n.sub,app:e.sub,node:e.node,node_scopes:e.node_scopes,place:e.place}},"identityOfEnvelope");async function _(n,e){const i=typeof e=="string"?await c(n,e):e;if(i===null)return null;const t=await n.prepare("SELECT home_machine, envelope_json FROM peer_stubs WHERE object = ?").get(i.id);return t?{object:i,home_machine:t.home_machine,identity:t.envelope_json===null?null:JSON.parse(t.envelope_json)}:null}a(_,"stubOf");const L=a(async(n,e)=>await n.prepare("SELECT 1 FROM peer_stubs WHERE object = ?").get(e.id)!==void 0,"isStub");async function l(n){return await y(n,"person","local-user","user:local","user")}a(l,"localPerson");async function f(n,e){return e==="user:local"?await l(n):await y(n,"app","app",e,e.replace(/^app:/,""))}a(f,"localApp");async function U(n,e){return e.type==="app"?await f(n,`app:${e.name}`):e.type==="person"?await l(n):null}a(U,"localOwnerActor");async function h(n,e,i){if(e!==null)return e.app===null?await l(n):await f(n,e.app);const t=i?.owner;return t?.type==="app"?await f(n,t.external_id??`app:${t.handle}`):await l(n)}a(h,"ownerFor");async function N(n,e,i,t,m,r){const p=m===void 0?null:H(m),u=r?.privacy??"public";if(!b.includes(u))throw new d("invalid_event",`invalid privacy ${JSON.stringify(u)}`,E.GENERAL,{id:e});const o=await c(n,e);if(o!==null){const s=await _(n,o);if(s===null)throw new d("conflict",`${e} is a local ${o.type}, not a stub of ${t}`,E.GENERAL,{id:e});if(s.home_machine!==t)throw new d("conflict",`${e} is already a stub of ${s.home_machine}, not ${t}`,E.GENERAL,{id:e,home_machine:s.home_machine});return p!==null&&(await n.prepare("UPDATE peer_stubs SET envelope_json = ? WHERE object = ?").run(JSON.stringify(p),o.id),await n.prepare("UPDATE objects SET reception = 2 WHERE id = ?").run(o.id)),r!==void 0&&(await v(n,i,r),r.privacy!==void 0&&o.privacy!==u)?(await n.prepare("UPDATE objects SET privacy = ? WHERE id = ?").run(u,o.id),await c(n,o.id)):o}const R=await h(n,p,r);await v(n,i,r);const w=await O(n,{id:e,type:i,kind:r?.kind??null,owner:R.id,privacy:u,name:r?.name??e,preview:r?.preview??"",home_machine:t});return await n.prepare("INSERT INTO peer_stubs (object, home_machine, envelope_json, created_at) VALUES (?, ?, ?, ?)").run(w.id,t,p===null?null:JSON.stringify(p),new Date().toISOString()),p!==null&&await n.prepare("UPDATE objects SET reception = 2 WHERE id = ?").run(w.id),await c(n,w.id)}a(N,"ensureStub");async function v(n,e,i){const t=i?.kind_decl;t===void 0||t.name!==e||await x(n,{name:t.name,owner:await h(n,null,{...i,owner:t.owner}),description:t.description,events:t.events,read:null,source:"peer"})}a(v,"holdKind");async function C(n,e,i){const t=await N(n,e,"node",A(i));return await n.prepare("UPDATE objects SET reception = 2 WHERE id = ?").run(t.id),await c(n,t.id)}a(C,"ensureNodeStub");async function I(n,e,i){const t=await _(n,e);t===null||t.home_machine===i||(await n.prepare("UPDATE peer_stubs SET home_machine = ? WHERE object = ?").run(i,t.object.id),await n.prepare("UPDATE objects SET home_machine = ? WHERE id = ?").run(i,t.object.id))}a(I,"rehomeStub");async function F(n,e){const i=await S(n,e.owner===null?null:await c(n,e.owner)),t=await j(n,e.type);return{id:e.id,type:e.type,kind:e.kind,name:e.name,preview:e.preview,owner:i,privacy:e.privacy,...t===null?{}:{kind_decl:t}}}a(F,"describeObject");async function S(n,e){if(e===null||e.type!=="person"&&e.type!=="app"&&e.type!=="repo"&&e.type!=="profile")return null;const i=await n.prepare("SELECT scheme, external_id FROM identities WHERE object = ?").get(e.id);return{id:e.id,type:e.type,scheme:i?.scheme??null,external_id:i?.external_id??null,handle:e.name}}a(S,"ownerRefOf");async function j(n,e){const i=await n.prepare("SELECT owner, description, events_json FROM object_kinds WHERE name = ?").get(e),t=i===void 0?null:await S(n,await c(n,i.owner));return i===void 0||t===null?null:{name:e,description:i.description,events:JSON.parse(i.events_json),owner:t}}a(j,"kindDeclarationOf");async function J(n,e,i){const t=await j(n,e.type);return t===null?i:{...i,kind_decl:t}}a(J,"withKindDecl");export{F as describeObject,C as ensureNodeStub,N as ensureStub,H as identityOfEnvelope,L as isStub,j as kindDeclarationOf,U as localOwnerActor,I as rehomeStub,_ as stubOf,J as withKindDecl};
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
var p=Object.defineProperty;var a=(t,r)=>p(t,"name",{value:r,configurable:!0});import{withCanvasWrite as _}from"../canvas/db.js";import{addUsage as f}from"../usage/ledger.js";const g=8,y=65536;function c(t,r){if(!t||typeof t!="object"||Array.isArray(t))return!1;const e=t;return typeof e.receipt_id=="string"&&!!e.receipt_id&&e.receipt_id.length<=256&&e.provider===`app:${r.provider}`&&e.tool===r.tool&&e.request_id===r.request_id&&e.sub===r.sub&&e.grantee===r.grantee&&e.payer===r.payer&&(e.run_id??null)===r.run_id&&typeof e.unit=="string"&&!!e.unit&&typeof e.units=="number"&&Number.isFinite(e.units)&&e.units>=0&&typeof e.time=="string"&&Number.isFinite(Date.parse(e.time))&&typeof e.usd_equivalent=="number"&&Number.isFinite(e.usd_equivalent)&&e.usd_equivalent>=0}a(c,"belongsToCall");async function
|
|
2
|
-
(provider, receipt_id, grantee, run_id, usd_equivalent, received_at) VALUES (?, ?, ?, ?, ?, ?)
|
|
1
|
+
var p=Object.defineProperty;var a=(t,r)=>p(t,"name",{value:r,configurable:!0});import{withCanvasWrite as _}from"../canvas/db.js";import{addUsage as f}from"../usage/ledger.js";const g=8,y=65536;function c(t,r){if(!t||typeof t!="object"||Array.isArray(t))return!1;const e=t;return typeof e.receipt_id=="string"&&!!e.receipt_id&&e.receipt_id.length<=256&&e.provider===`app:${r.provider}`&&e.tool===r.tool&&e.request_id===r.request_id&&e.sub===r.sub&&e.grantee===r.grantee&&e.payer===r.payer&&(e.run_id??null)===r.run_id&&typeof e.unit=="string"&&!!e.unit&&typeof e.units=="number"&&Number.isFinite(e.units)&&e.units>=0&&typeof e.time=="string"&&Number.isFinite(Date.parse(e.time))&&typeof e.usd_equivalent=="number"&&Number.isFinite(e.usd_equivalent)&&e.usd_equivalent>=0}a(c,"belongsToCall");async function N(t,r){const e=Array.isArray(t)?t[0]:t;if(!e||e.length>y)return;let n;try{n=JSON.parse(e)}catch{return}if(Array.isArray(n)&&n.length>g)return;const o=(Array.isArray(n)?n:[n]).filter(i=>c(i,r));if(o.length)return await _(async i=>{for(const s of o){if(!(await i.prepare(`INSERT INTO provider_receipts
|
|
2
|
+
(provider, receipt_id, grantee, run_id, usd_equivalent, received_at) VALUES (?, ?, ?, ?, ?, ?)
|
|
3
|
+
ON CONFLICT DO NOTHING`).run(r.provider,s.receipt_id,r.grantee,r.run_id,s.usd_equivalent,new Date().toISOString())).changes||(await f(i,{grantee:r.ledger_grantee??r.grantee,payer:r.payer.startsWith("app:")?"app":"user",source:`provider:${r.provider}`,served_model:"",input_tokens:0,output_tokens:0,cached_tokens:0,usd_equivalent:s.usd_equivalent}),!r.run_id))continue;const d=await i.prepare("SELECT usage_json FROM nodes WHERE node_id = ? AND run_id = ?").get(r.run_id,r.run_id);if(!d)continue;const u=d.usage_json?JSON.parse(d.usage_json):{};u.cost_usd=(typeof u.cost_usd=="number"?u.cost_usd:0)+s.usd_equivalent,await i.prepare("UPDATE nodes SET usage_json = ? WHERE node_id = ?").run(JSON.stringify(u),r.run_id)}}),o[0].receipt_id}a(N,"acceptProviderReceipt");export{N as acceptProviderReceipt};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
var A=Object.defineProperty;var i=(e,t)=>A(e,"name",{value:t,configurable:!0});import{randomBytes as D}from"node:crypto";import{withCanvasWrite as u,openDb as l}from"../canvas/db.js";import{nowIso as h}from"../fs-utils.js";import{signalReviewActivity as v}from"./signal.js";import{COMMENT_EVENTS_PAGE_DEFAULT as
|
|
1
|
+
var A=Object.defineProperty;var i=(e,t)=>A(e,"name",{value:t,configurable:!0});import{randomBytes as D}from"node:crypto";import{withCanvasWrite as u,openDb as l}from"../canvas/db.js";import{nowIso as h}from"../fs-utils.js";import{signalReviewActivity as v}from"./signal.js";import{COMMENT_EVENTS_PAGE_DEFAULT as U,COMMENT_EVENTS_PAGE_MAX as F,COMMENT_LINE_TEXT_MAX as W,COMMENT_TEXT_MAX as R,LIVE_COMMENTS_MAX as T,ReviewOperationError as m}from"./types.js";function _(e){return{comment_id:e.comment_id,review_id:e.review_id,status:e.status,revision:e.revision,text:e.text,anchor:{line:e.anchor_line,end_line:e.anchor_end_line,...e.anchor_col_start===null?{}:{col_start:e.anchor_col_start},...e.anchor_col_end===null?{}:{col_end:e.anchor_col_end},...e.anchor_quote===null?{}:{quote:e.anchor_quote}},anchor_state:e.anchor_state,anchor_line_text:e.anchor_line_text,anchor_doc_hash:e.anchor_doc_hash,author:{kind:e.author_kind,node_id:e.author_node_id},updated_by:{kind:e.updated_by_kind,node_id:e.updated_by_node_id},created_at:e.created_at,updated_at:e.updated_at,resolved_at:e.resolved_at,deleted_at:e.deleted_at,created_seq:e.created_seq}}i(_,"commentFromRow");function N(e){return{seq:e.seq,review_id:e.review_id,comment_id:e.comment_id,kind:e.kind,state_change:e.state_change===0?0:1,revision_after:e.revision_after,actor:{kind:e.actor_kind,node_id:e.actor_node_id},at:e.at,operation_id:e.operation_id,...e.payload===null?{}:{payload:JSON.parse(e.payload)}}}i(N,"eventFromRow");function k(e){return JSON.stringify(e)}i(k,"json");function q(){let e;do e=D(16).toString("hex");while(/^0+$/.test(e));return e}i(q,"commentId");function C(e){const t=e.trim();if(t==="")throw new Error("comment text must not be empty");const n=Buffer.byteLength(t,"utf8");if(n>R)throw new m("text_too_long","comment text exceeds the maximum length",{limit:R,received:n});return t}i(C,"trimText");function B(e,t){if(Buffer.byteLength(e,"utf8")<=t)return e;const n="\u2026 [truncated]",r=Buffer.byteLength(n,"utf8"),o=Buffer.from(e,"utf8");let a=Math.max(0,t-r);for(;a>0&&(o[a]&192)===128;)a-=1;return`${o.subarray(0,a).toString("utf8")}${n}`}i(B,"truncateUtf8");async function p(e,t){return await e.prepare("SELECT * FROM review_comments WHERE comment_id = ?").get(t)??null}i(p,"getStoredComment");async function E(e,t){const n=await p(e,t);if(n===null)throw new m("unknown_comment","comment was not found",{received:t});return n}i(E,"requireStoredComment");async function L(e,t){if(await e.prepare("SELECT request_id FROM human_requests WHERE request_id = ? AND kind = 'review' AND state = 'open'").get(t)===void 0)throw new m("unknown_review","review was not found",{received:t})}i(L,"assertReviewExists");function S(e,t){if(t!==void 0&&t!==e.revision)throw new m("stale_comment","comment revision is stale",{revision:e.revision,text:e.text})}i(S,"assertRevision");async function w(e,t){const n=await e.prepare(`
|
|
2
2
|
INSERT INTO review_comment_events
|
|
3
3
|
(review_id, comment_id, kind, state_change, revision_after, actor_kind, actor_node_id, at, operation_id, payload)
|
|
4
4
|
VALUES (?, ?, ?, 1, ?, ?, ?, ?, ?, ?)
|
|
5
|
-
|
|
5
|
+
RETURNING seq
|
|
6
|
+
`).get(t.row.review_id,t.row.comment_id,t.kind,t.row.revision,t.actor.kind,t.actor.node_id,t.at,t.operation_id,k(t.payload));return Number(n.seq)}i(w,"appendStateEvent");async function M(e,t,n,r,o){const a=t.revision+1;return await e.prepare(`
|
|
6
7
|
UPDATE review_comments
|
|
7
8
|
SET status = ?, revision = ?, text = ?, updated_by_kind = ?, updated_by_node_id = ?,
|
|
8
9
|
updated_at = ?, resolved_at = ?, deleted_at = ?
|
|
@@ -14,8 +15,8 @@ var A=Object.defineProperty;var i=(e,t)=>A(e,"name",{value:t,configurable:!0});i
|
|
|
14
15
|
author_kind, author_node_id, updated_by_kind, updated_by_node_id, created_at,
|
|
15
16
|
updated_at, resolved_at, deleted_at, created_seq)
|
|
16
17
|
VALUES (?, ?, 'open', 1, ?, ?, ?, ?, ?, ?, ?, ?, 'live', ?, ?, ?, ?, ?, ?, NULL, NULL, 0)
|
|
17
|
-
`).run(c,e.review_id,o,e.anchor.line,e.anchor.end_line,e.anchor.col_start??null,e.anchor.col_end??null,e.anchor.quote??null,a,e.doc_hash,e.actor.kind,e.actor.node_id,e.actor.kind,e.actor.node_id,d,d)).changes!==1)throw new Error("failed to insert review comment");const y=await p(n,c),x=await w(n,{row:y,kind:"created",actor:e.actor,operation_id:e.operation_id,at:d,payload:{text:o,anchor:e.anchor,line_text:a,doc_hash:e.doc_hash}});return await n.prepare("UPDATE review_comments SET created_seq = ? WHERE comment_id = ?").run(x,c),{comment:_({...y,created_seq:x}),changed:!0}});return v(),t}i(P,"createComment");async function
|
|
18
|
+
`).run(c,e.review_id,o,e.anchor.line,e.anchor.end_line,e.anchor.col_start??null,e.anchor.col_end??null,e.anchor.quote??null,a,e.doc_hash,e.actor.kind,e.actor.node_id,e.actor.kind,e.actor.node_id,d,d)).changes!==1)throw new Error("failed to insert review comment");const y=await p(n,c),x=await w(n,{row:y,kind:"created",actor:e.actor,operation_id:e.operation_id,at:d,payload:{text:o,anchor:e.anchor,line_text:a,doc_hash:e.doc_hash}});return await n.prepare("UPDATE review_comments SET created_seq = ? WHERE comment_id = ?").run(x,c),{comment:_({...y,created_seq:x}),changed:!0}});return v(),t}i(P,"createComment");async function G(e,t){const n=await u(async r=>{const o=await E(r,e);if(o.status==="deleted")throw new m("comment_deleted","comment is a deleted tombstone",{comment_id:o.comment_id,deleted_at:o.deleted_at});const a=C(t.text);if(o.text===a)return{comment:_(o),changed:!1};S(o,t.if_revision);const d=h(),c=_(o).anchor,s=await M(r,o,{text:a},t.actor,d);return await w(r,{row:s,kind:"edited",actor:t.actor,operation_id:t.operation_id,at:d,payload:{previous_text:o.text,text:a,previous_anchor:c,anchor:_(s).anchor}}),{comment:_(s),changed:!0}});return O(n)}i(G,"editComment");async function f(e,t,n,r){const o=await u(async a=>{const d=await E(a,e);if(d.status==="deleted"){if(n==="deleted")return{comment:_(d),changed:!1};throw new m("comment_deleted","comment is a deleted tombstone",{comment_id:d.comment_id,deleted_at:d.deleted_at})}if(d.status===n)return{comment:_(d),changed:!1};S(d,t.if_revision);const c=h(),s=await M(a,d,{status:n,resolved_at:n==="resolved"?c:n==="open"?null:void 0,deleted_at:n==="deleted"?c:void 0},t.actor,c);return await w(a,{row:s,kind:r,actor:t.actor,operation_id:t.operation_id,at:c,payload:{previous_status:d.status,status:n,previous_text:d.text,text:s.text,previous_anchor:_(d).anchor,anchor:_(s).anchor}}),{comment:_(s),changed:!0}});return O(o)}i(f,"transitionComment");async function $(e,t){return await f(e,t,"resolved","resolved")}i($,"resolveComment");async function J(e,t){return await f(e,t,"open","reopened")}i(J,"reopenComment");async function j(e,t){return await f(e,t,"deleted","deleted")}i(j,"deleteComment");async function z(e,t){const n=await l(),r=t?.status;return(r===void 0?await n.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status != 'deleted' ORDER BY anchor_line, created_seq").all(e):r==="all"?await n.prepare("SELECT * FROM review_comments WHERE review_id = ? ORDER BY anchor_line, created_seq").all(e):await n.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status = ? ORDER BY anchor_line, created_seq").all(e,r)).map(_)}i(z,"listComments");async function K(e){const t=await p(await l(),e);return t===null?null:_(t)}i(K,"getComment");async function Q(e){return(await(await l()).prepare("SELECT * FROM review_comment_events WHERE comment_id = ? ORDER BY seq").all(e)).map(N)}i(Q,"listCommentEvents");async function Z(e,t){const n=t.since_seq??0,r=Math.min(Math.max(t.limit??U,1),F),a=(await(await l()).prepare("SELECT * FROM review_comment_events WHERE review_id = ? AND seq > ? ORDER BY seq LIMIT ?").all(e,n,r)).map(N);return{events:a,next_since_seq:a.length===0?n:a[a.length-1].seq}}i(Z,"listReviewEvents");async function g(e,t){const n=await e.prepare("SELECT * FROM review_comments WHERE review_id = ? AND status != 'deleted' ORDER BY anchor_line, created_seq").all(t);return{comments:n.map(o=>({id:o.comment_id,line:o.anchor_line,endLine:o.anchor_end_line,...o.anchor_quote===null?{}:{quote:o.anchor_quote},...o.anchor_col_start===null?{}:{colStart:o.anchor_col_start},...o.anchor_col_end===null?{}:{colEnd:o.anchor_col_end},lineText:o.anchor_line_text,comment:o.text,createdAt:o.created_at})),total:n.length,unresolved:n.filter(o=>o.status==="open").length}}i(g,"snapshotCommentsLocked");async function ee(e){await u(async t=>{if(await L(t,e.review_id),(await E(t,e.comment_id)).review_id!==e.review_id)throw new m("unknown_comment","comment was not found",{received:e.comment_id});await t.prepare(`
|
|
18
19
|
INSERT INTO review_comment_events
|
|
19
20
|
(review_id, comment_id, kind, state_change, revision_after, actor_kind, actor_node_id, at, operation_id, payload)
|
|
20
21
|
VALUES (?, ?, ?, 0, NULL, 'system', NULL, ?, ?, ?)
|
|
21
|
-
`).run(e.review_id,e.comment_id,e.kind,h(),e.operation_id,
|
|
22
|
+
`).run(e.review_id,e.comment_id,e.kind,h(),e.operation_id,k(e.payload))}),v()}i(ee,"appendDeliveryEvent");export{ee as appendDeliveryEvent,P as createComment,j as deleteComment,G as editComment,K as getComment,Q as listCommentEvents,z as listComments,Z as listReviewEvents,J as reopenComment,$ as resolveComment,g as snapshotCommentsLocked};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
var d=Object.defineProperty;var
|
|
2
|
-
`)[0].trim();return
|
|
3
|
-
AND type IN ('node.turn.started', 'node.turn.completed') ORDER BY sequence_number DESC LIMIT 1`).get(
|
|
1
|
+
var d=Object.defineProperty;var l=(t,n)=>d(t,"name",{value:n,configurable:!0});import{openDb as _}from"../canvas/db.js";import{openAssistantBlock as f}from"../../daemon/runs/observer.js";import{SUBMIT_RESULT_TOOL as p}from"../runtime/structured-output.js";const m=120;function y(t){if(!t||typeof t!="object")return null;const n=t,s=[n.command,n.file_path,n.path].find(r=>typeof r=="string"&&r.trim()!=="");if(s===void 0)return null;const o=s.trim().split(`
|
|
2
|
+
`)[0].trim();return o.length>m?`${o.slice(0,m-1)}\u2026`:o}l(y,"toolCallSummary");async function g(t,n,s=()=>f(t)){if(n!=="running")return null;const o=await _(),r=await o.prepare(`SELECT type, sequence_number FROM run_events WHERE run_id = ? AND node_id = ?
|
|
3
|
+
AND type IN ('node.turn.started', 'node.turn.completed') ORDER BY sequence_number DESC LIMIT 1`).get(t,t);if(!r)return{phase:"starting"};if(r.type==="node.turn.completed")return{phase:"between_turns"};const i=s();if(i?.kind==="text")return{phase:"writing"};if(i?.kind==="tool_call")return i.name===p?{phase:"submitting_result"}:{phase:"tool",tool:{name:i.name,summary:null}};if(i===null){const a=(await o.prepare(`SELECT type, body_json, sequence_number FROM run_events
|
|
4
4
|
WHERE run_id = ? AND node_id = ? AND type IN ('node.tool_call.started', 'node.tool_call.completed') AND sequence_number > ?
|
|
5
|
-
ORDER BY sequence_number`).all(
|
|
6
|
-
FROM run_events WHERE run_id = ? AND sequence_number = ?`).get(e,c.sequence_number);if(n.name===m)return{phase:"submitting_result"};let a=null;try{a=n.args===null?null:JSON.parse(n.args)}catch{a=null}return{phase:"tool",tool:{name:n.name,summary:y(a)}}}}return{phase:"thinking"}}i(S,"runActivity");export{S as runActivity,y as toolCallSummary};
|
|
5
|
+
ORDER BY sequence_number`).all(t,t,r.sequence_number)).map(e=>({...e,id:JSON.parse(e.body_json).tool_call_id})),c=new Set(a.filter(e=>e.type==="node.tool_call.completed").map(e=>e.id)),u=a.filter(e=>e.type==="node.tool_call.started"&&!c.has(e.id)).at(-1);if(u){const e=JSON.parse(u.body_json);return e.name===p?{phase:"submitting_result"}:{phase:"tool",tool:{name:e.name,summary:y(e.arguments??null)}}}}return{phase:"thinking"}}l(g,"runActivity");export{g as runActivity,y as toolCallSummary};
|
|
@@ -12,7 +12,7 @@ export declare function runPlace(nodeId: string, db?: CanvasDb): Promise<RunPlac
|
|
|
12
12
|
export declare function rememberDeletedIsolated(nodeId: string, db?: CanvasDb): Promise<void>;
|
|
13
13
|
/** The place of the node that registered a custom object, which is where that object
|
|
14
14
|
* reads from; null when the person or the app's server registered it. */
|
|
15
|
-
export declare function objectPlace(
|
|
15
|
+
export declare function objectPlace(objectId: string, db?: CanvasDb): Promise<RunPlace | null>;
|
|
16
16
|
/** The confinement predicate: two places see each other when they are the same
|
|
17
17
|
* run, or when neither run is isolated. */
|
|
18
18
|
export declare function runsSeeEachOther(a: RunPlace, b: RunPlace): boolean;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
2
|
-
LEFT JOIN nodes r ON r.node_id = n.run_id WHERE n.node_id = ?`).get(t);if(!r){const a=await e.prepare("SELECT run_id FROM deleted_isolated_nodes WHERE node_id = ?").get(t);return a?{run:a.run_id,isolated:!0}:null}return{run:r.run_id??t,isolated:r.isolated===1||r.root_isolated===1}}n(u,"runPlace");async function E(t,e){e??=await o();const r=await u(t,e);r?.isolated&&await e.prepare("INSERT
|
|
1
|
+
var s=Object.defineProperty;var n=(t,e)=>s(t,"name",{value:e,configurable:!0});import{openDb as o}from"../canvas/db.js";async function u(t,e){e??=await o();const r=await e.prepare(`SELECT n.run_id, n.isolated, r.isolated AS root_isolated FROM nodes n
|
|
2
|
+
LEFT JOIN nodes r ON r.node_id = n.run_id WHERE n.node_id = ?`).get(t);if(!r){const a=await e.prepare("SELECT run_id FROM deleted_isolated_nodes WHERE node_id = ?").get(t);return a?{run:a.run_id,isolated:!0}:null}return{run:r.run_id??t,isolated:r.isolated===1||r.root_isolated===1}}n(u,"runPlace");async function E(t,e){e??=await o();const r=await u(t,e);r?.isolated&&await e.prepare("INSERT INTO deleted_isolated_nodes (node_id, run_id) VALUES (?, ?) ON CONFLICT (node_id) DO UPDATE SET run_id = excluded.run_id").run(t,r.run)}n(E,"rememberDeletedIsolated");async function w(t,e){e??=await o();const r=await e.prepare("SELECT registered_by FROM custom_objects WHERE object = ?").get(t);return r?.registered_by?await u(r.registered_by,e)??{run:r.registered_by,isolated:!1}:null}n(w,"objectPlace");function l(t,e){return t.run===e.run||!t.isolated&&!e.isolated}n(l,"runsSeeEachOther");async function f(t,e,r,a,i){i??=await o();const d=await u(t,i);return d===null?!0:await c(d,e,r,a,i)}n(f,"nodeMayReach");async function c(t,e,r,a,i){if(i??=await o(),(a??"app:terminal")!==e)return!0;const d=await u(r,i);return d===null?!t.isolated:l(t,d)}n(c,"placeMayReach");async function y(t,e){return e??=await o(),(await e.prepare("SELECT node_id FROM nodes WHERE run_id = ? OR node_id = ?").all(t,t)).map(r=>r.node_id)}n(y,"runNodeIds");export{f as nodeMayReach,w as objectPlace,c as placeMayReach,E as rememberDeletedIsolated,y as runNodeIds,u as runPlace,l as runsSeeEachOther};
|
|
@@ -31,7 +31,7 @@ export declare function expireRunEvents(now: number, limit?: number): Promise<nu
|
|
|
31
31
|
* An open turn's deltas and status/settlement markers are never redacted. Cursor scans
|
|
32
32
|
* avoid re-searching the whole log each tick. Old event payload replay is a
|
|
33
33
|
* deliberate tradeoff; event identities and 30-day sequence gaps survive. */
|
|
34
|
-
export declare function compactRunEvents(now: number,
|
|
34
|
+
export declare function compactRunEvents(now: number, afterSeq?: number, scanLimit?: number, writeLimit?: number): Promise<{
|
|
35
35
|
cursor: number;
|
|
36
36
|
compacted: number;
|
|
37
37
|
}>;
|
package/dist/core/runs/events.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var
|
|
2
|
-
(SELECT
|
|
1
|
+
var y=Object.defineProperty;var a=(e,t)=>y(e,"name",{value:t,configurable:!0});import{afterCommit as S,withCanvasWrite as l,openDb as w}from"../canvas/db.js";import{emitEvent as g}from"../events/emit.js";import{repairRunConversations as O}from"../canvas/sessions.js";const _=new Map;let f;function D(e){f=e}a(D,"onRunEventAppended");async function R(e,t,n,r,s){const o=await e.prepare("SELECT event_cursor, grantee, metadata_json FROM node_rows WHERE node_id = ? AND run_id = ?").get(t,t);if(!o||o.event_cursor===null)throw new Error(`missing run event cursor: ${t}`);const c={type:r,run_id:t,node_id:n,sequence_number:o.event_cursor,ts:new Date().toISOString(),metadata:o.metadata_json?JSON.parse(o.metadata_json):{},...s};return await e.prepare("INSERT INTO run_events (run_id, sequence_number, node_id, type, ts, body_json, grantee) VALUES (?, ?, ?, ?, ?, ?, ?)").run(t,c.sequence_number,n,r,c.ts,JSON.stringify(c),o.grantee),await e.prepare("UPDATE nodes SET event_cursor = event_cursor + 1, last_activity_at = ? WHERE node_id = ?").run(c.ts,t),S(()=>{for(const p of _.get(t)??[])p();const u=a(p=>{g({level:"error",event:"runs.notice_hook_failed",error:p})},"failed");try{Promise.resolve(f?.(t)).catch(u)}catch(p){u(p)}}),c}a(R,"appendRunEvent");async function L(e,t,n,r){return await l(async s=>await R(s,e,t,n,r))}a(L,"emitRunEvent");async function M(e,t,n,r){await l(async s=>{(await s.prepare("SELECT body_json FROM run_events WHERE run_id = ? AND node_id = ? AND type = ?").all(e,t,n)).some(c=>JSON.parse(c.body_json).outcome?.revision===r.outcome.revision)||await R(s,e,t,n,r)})}a(M,"emitRunSettlement");async function C(e,t=0){await O(e);const n=await w(),r=await n.prepare("SELECT event_cursor FROM nodes WHERE node_id = ? AND run_id = ?").get(e,e);if(!r)throw new Error(`run not found: ${e}`);const s=await n.prepare("SELECT MIN(sequence_number) AS sequence FROM run_events WHERE run_id = ?").get(e),o=await n.prepare("SELECT COUNT(*) AS count, COALESCE(SUM(LENGTH(body_json)), 0) AS bytes FROM run_events WHERE run_id = ? AND sequence_number > ?").get(e,t);return{events:(o.count>1e3||o.bytes>32*1024*1024?[]:await n.prepare("SELECT body_json FROM run_events WHERE run_id = ? AND sequence_number > ? ORDER BY sequence_number LIMIT 1000").all(e,t)).map(u=>JSON.parse(u.body_json)),earliest_sequence:s.sequence,latest_sequence:r.event_cursor-1,backlog_count:o.count,backlog_bytes:o.bytes}}a(C,"readRunEvents");async function A(e,t){let n=_.get(e);return n||(n=new Set,_.set(e,n)),n.add(t),()=>{n.delete(t),n.size===0&&_.delete(e)}}a(A,"subscribeRunEvents");function H(e){queueMicrotask(()=>{for(const t of _.get(e)??[])t()})}a(H,"notifyRunDeleted");async function W(e){return Number((await e.prepare("UPDATE run_events SET grantee = 'app:terminal' WHERE grantee = 'user:local'").run()).changes)}a(W,"rewriteLocalRunEventGrantee");async function x(e,t=128){return await l(async n=>{const r=new Date(e-12096e5).toISOString(),s=new Date(e-720*60*6e4).toISOString(),o=Number((await n.prepare(`DELETE FROM run_events WHERE seq IN
|
|
2
|
+
(SELECT seq FROM run_events WHERE ts < ? AND type IN
|
|
3
3
|
('node.tool_call.completed', 'node.tool_call.started', 'node.system_prompt.set',
|
|
4
|
-
'node.thinking.done', 'node.output_text.done') ORDER BY ts LIMIT ?)`).run(r,t)).changes),
|
|
5
|
-
(SELECT
|
|
4
|
+
'node.thinking.done', 'node.output_text.done') ORDER BY ts LIMIT ?)`).run(r,t)).changes),c=Number((await n.prepare(`DELETE FROM run_events WHERE seq IN
|
|
5
|
+
(SELECT seq FROM run_events WHERE ts < ? ORDER BY ts LIMIT ?)`).run(s,t-o)).changes);return o+c})}a(x,"expireRunEvents");async function h(e,t=0,n=256,r=8){return await l(async s=>{const o=await s.prepare(`SELECT e.seq, e.type, e.ts, length(e.body_json) AS bytes,
|
|
6
6
|
n.finalized_at FROM run_events e LEFT JOIN nodes n ON n.node_id = e.node_id
|
|
7
|
-
WHERE e.
|
|
7
|
+
WHERE e.seq > ? ORDER BY e.seq LIMIT ?`).all(t,n);if(!o.length)return{cursor:0,compacted:0};let c=0,u=t;const p=new Date(e-1440*6e4).toISOString(),m=s.prepare("SELECT body_json FROM run_events WHERE seq = ?"),v=s.prepare("UPDATE run_events SET body_json = ? WHERE seq = ?");for(const i of o){if(u=i.seq,!["node.tool_call.completed","node.tool_call.started","node.system_prompt.set","node.thinking.done"].includes(i.type)||i.ts>=p||i.bytes<1024||i.type==="node.tool_call.started"&&!i.finalized_at)continue;const E=JSON.parse((await m.get(i.seq)).body_json);if(E.content_redacted!==!0&&(i.type==="node.tool_call.completed"?delete E.result:i.type==="node.tool_call.started"?delete E.arguments:delete E.text,E.content_redacted=!0,await v.run(JSON.stringify(E),i.seq),++c>=r))break}return{cursor:u,compacted:c}})}a(h,"compactRunEvents");const d=new Map;function j(e,t){let n=d.get(e);return n||(n=new Set,d.set(e,n)),n.add(t),()=>{n.delete(t),n.size===0&&d.delete(e)}}a(j,"registerGrantStream");function F(e){const t=[...d.get(e)??[]];for(const n of t)n();return t.length}a(F,"closeGrantStreams");export{R as appendRunEvent,F as closeGrantStreams,h as compactRunEvents,L as emitRunEvent,M as emitRunSettlement,x as expireRunEvents,H as notifyRunDeleted,D as onRunEventAppended,C as readRunEvents,j as registerGrantStream,W as rewriteLocalRunEventGrantee,A as subscribeRunEvents};
|