@north-light/cli 0.3.578 → 0.3.579
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/build-root.js +1 -1
- package/dist/builtin-memory/crouter-sdk/release-notes.md +1 -1
- package/dist/clients/attach/viewer.js +338 -338
- package/dist/core/command.js +5 -5
- package/dist/core/human/feedback-companion.js +1 -1
- package/dist/core/human/page.d.ts +2 -4
- package/dist/core/human/page.js +6 -6
- package/dist/core/human/request-files.d.ts +14 -0
- package/dist/core/human/request-files.js +1 -0
- package/dist/core/human/requests.d.ts +3 -0
- package/dist/core/human/requests.js +18 -17
- package/dist/core/human/tickets.js +1 -1
- package/dist/core/human/visible-paths.d.ts +7 -0
- package/dist/core/human/visible-paths.js +1 -1
- package/dist/core/review/document.d.ts +4 -4
- package/dist/core/review/document.js +2 -2
- package/dist/core/review/project.d.ts +7 -5
- package/dist/core/review/project.js +2 -1
- package/dist/core/review/remap.js +1 -1
- package/dist/core/review/stage.d.ts +2 -0
- package/dist/core/review/stage.js +1 -1
- package/dist/core/review/store.js +1 -1
- package/dist/daemon/api/bridge.d.ts +1 -1
- package/dist/daemon/api/bridge.js +5 -5
- package/dist/daemon/api/handlers/feedback-comments.js +2 -2
- package/dist/daemon/api/handlers/inbox-page.js +1 -1
- package/dist/daemon/api/handlers/inbox.js +1 -1
- package/dist/daemon/api/handlers/reviews.js +1 -1
- package/dist/daemon/profile-delete.js +1 -1
- package/dist/daemon/review/finish.js +1 -1
- package/dist/daemon/review/sweep.js +1 -1
- package/dist/daemon/runs/observer.js +3 -3
- package/dist/shared/env.d.ts +5 -0
- package/dist/shared/env.js +2 -2
- package/docs/sdk/release-notes.md +1 -1
- package/package.json +2 -2
- package/packages/crouter-identity/package.json +1 -1
- package/runtime.lock.json +13 -13
|
@@ -3,7 +3,7 @@ var q=Object.defineProperty;var r=(e,o)=>q(e,"name",{value:o,configurable:!0});i
|
|
|
3
3
|
(review_id, comment_id, kind, state_change, revision_after, actor_kind, actor_node_id, at, operation_id, payload)
|
|
4
4
|
SELECT review_id, ?, 'reanchored', 1, ?, ?, ?, ?, ?, ?
|
|
5
5
|
FROM review_comments WHERE comment_id = ?
|
|
6
|
-
`).run(o.row.comment_id,o.row.revision+1,o.actor.kind,o.actor.node_id,o.at,o.operation_id,JSON.stringify({previous_anchor:o.previous_anchor,anchor:o.anchor,previous_anchor_state:o.previous_anchor_state,anchor_state:o.anchor_state,previous_doc_hash:o.previous_doc_hash,doc_hash:o.doc_hash,line_text:o.line_text}),o.row.comment_id)}r(L,"appendReanchorEvent");async function U(e){const o=await A(async c=>{const i=await c.prepare("SELECT file, anchor_base_sha256 FROM human_requests WHERE request_id = ? AND kind = 'review' AND state = 'open'").get(e.review_id);if(i===void 0)throw new h("unknown_review","review was not found",{received:e.review_id});const a=O(i.file,"comment");a.sha256!==e.to_doc_hash&&p("to_doc_hash",e.to_doc_hash,a.sha256),i.anchor_base_sha256!==e.from_doc_hash&&p("from_doc_hash",i.anchor_base_sha256,e.from_doc_hash);const d=await c.prepare(`
|
|
6
|
+
`).run(o.row.comment_id,o.row.revision+1,o.actor.kind,o.actor.node_id,o.at,o.operation_id,JSON.stringify({previous_anchor:o.previous_anchor,anchor:o.anchor,previous_anchor_state:o.previous_anchor_state,anchor_state:o.anchor_state,previous_doc_hash:o.previous_doc_hash,doc_hash:o.doc_hash,line_text:o.line_text}),o.row.comment_id)}r(L,"appendReanchorEvent");async function U(e){const o=await A(async c=>{const i=await c.prepare("SELECT file, anchor_base_sha256 FROM human_requests WHERE request_id = ? AND kind = 'review' AND state = 'open'").get(e.review_id);if(i===void 0)throw new h("unknown_review","review was not found",{received:e.review_id});const a=await O(i.file,"comment");a.sha256!==e.to_doc_hash&&p("to_doc_hash",e.to_doc_hash,a.sha256),i.anchor_base_sha256!==e.from_doc_hash&&p("from_doc_hash",i.anchor_base_sha256,e.from_doc_hash);const d=await c.prepare(`
|
|
7
7
|
SELECT comment_id, status, revision, text, anchor_line, anchor_end_line,
|
|
8
8
|
anchor_col_start, anchor_col_end, anchor_quote, anchor_line_text,
|
|
9
9
|
anchor_doc_hash, anchor_state
|
|
@@ -31,6 +31,8 @@ export type StagedReview = {
|
|
|
31
31
|
};
|
|
32
32
|
/** Remove only review-directory state that was never committed to a review row. */
|
|
33
33
|
export declare function discardStaging(reviewId: string, branchFile?: string): Promise<void>;
|
|
34
|
+
/** Delete one review's files: its `requests/<id>/` blobs on a cloud role, else its review directory. */
|
|
35
|
+
export declare function deleteReviewFiles(reviewId: string): Promise<void>;
|
|
34
36
|
/**
|
|
35
37
|
* Capture an existing origin and write its immutable branch without creating a
|
|
36
38
|
* canvas node or review row. The caller alone commits or discards this stage.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var F=Object.defineProperty;var n=(e,i)=>F(e,"name",{value:i,configurable:!0});import{createHash as k}from"node:crypto";import{existsSync as B,realpathSync as x,rmSync as E,statSync as I}from"node:fs";import{isAbsolute as O}from"node:path";import{getNode as q}from"../canvas/index.js";import{conversationIdFromPath as D,conversationStore as $,ConversationNotFoundError as z}from"../conversation-store/index.js";import{ensureReviewDir as j,reviewDir as p}from"../canvas/paths.js";import{checkReviewableBytes as N,checkReviewableFile as P}from"../human/visible-paths.js";import{isCloudRole as w}from"../canvas/person.js";import{blobStore as U}from"../blobs/index.js";import{REQUEST_BLOB_PREFIX as A,isBlobRequestPath as h,readRequestFile as v,writeRequestFile as C}from"../human/request-files.js";import{newNodeId as y}from"../runtime/nodes.js";import{captureOrigin as T}from"./companion.js";import{materializeSessionBranch as H}from"../runtime/session-branch.js";import{getRequestByIdempotencyKey as K}from"../human/requests.js";import{ReviewOperationError as r}from"./types.js";function o(e,i){return new r("review_target_unreviewable","review target cannot be staged",{phase:"create",file:e,reason:i})}n(o,"targetError");function d(e){return w()?`${A}${e}`:p(e)}n(d,"stagedReviewDir");function b(e){return e==="file is not UTF-8 text"?"binary":e==="file is too large to review (2 MB limit)"?"too_large":e==="file is too long to review (5,000 line limit)"?"too_many_lines":"not_a_file"}n(b,"unreviewableReason");async function L(e){const i=N(await v(e));if(!i.ok)throw o(e,b(i.reason));return e}n(L,"validateBlobReviewFile");function g(e){if(!O(e))throw o(e,"not_absolute");if(!B(e))throw o(e,"missing");try{if(!I(e).isFile())throw o(e,"not_a_file")}catch(t){throw t instanceof r?t:o(e,"missing")}const i=P(e);if(!i.ok)throw o(e,b(i.reason));try{return x(e)}catch{throw o(e,"missing")}}n(g,"validateReviewFile");function M(e){return new r("review_branch_unavailable","review branch could not be materialized",{reason:"materialize_failed",origin_node_id:e})}n(M,"branchUnavailable");async function Q(e){try{return await T(e)}catch(i){throw i instanceof r&&i.code==="review_origin_missing"?new r("review_origin_missing","review origin was not found",{origin_node_id:e,reason:"origin_missing"}):i}}n(Q,"captureStagedOrigin");async function X(e,i){try{return await H(i)}catch{throw M(e)}}n(X,"materialize");async function G(e,i){if(i!==void 0){const t=D(i);if(t===null)throw new Error(`invalid staged conversation path: ${i}`);try{await $().delete(t)}catch(c){if(!(c instanceof z))throw c}}try{await J(e)}catch{}}n(G,"discardStaging");async function J(e){if(w()){const i=await U();for(const t of await i.list(`${d(e)}/`))await i.delete(t)}else E(p(e),{recursive:!0,force:!0})}n(J,"deleteReviewFiles");async function _e(e){const i=await K(e.idempotency_key);if(i!==null)return{existing:i};if(e.document===void 0&&w())throw o(e.file??"","cloud_unsupported");if(await q(e.origin_node_id)===null)throw new r("review_origin_missing","review origin was not found",{origin_node_id:e.origin_node_id,reason:"origin_missing"});const t=await y(),c=await y();let u,_=e.document===void 0?g(e.file??""):"";try{const l=d(t);if(h(l)||j(t),e.document!==void 0){const s=`${l}/document.md`;await C(s,e.document.body),_=h(s)?await L(s):g(s)}const a=await Q(e.origin_node_id),R=new Date().toISOString(),m=await v(_),f=k("sha256").update(m).digest("hex");u=await X(e.origin_node_id,a);const S=new Date().toISOString();return{row:{review_id:t,idempotency_key:e.idempotency_key,origin_kind:e.origin_kind,origin_node_id:e.origin_node_id,companion_node_id:c,review_dir:d(t),file:_,origin_session_file:a.sourceFile,origin_session_id:a.sourceSessionId,origin_leaf_id:a.leafId,model_spec:a.modelSpec,branch_file:u,baseline_sha256:f,baseline_bytes:m.length,anchor_base_sha256:f,anchor_base_bytes:m,state:"binding",created:S,captured_at:R,opened_at:null,submit_requested_at:null,output_path:e.output_path??null,document_id:e.document?.id??null,document_name:e.document?.name??null,document_base:e.document?.base??null,subtitle:e.subtitle??null,approved_at:null,approved_sha256:null,changed:null,comments_total:null,comments_unresolved:null,result_json:null,canceled_at:null,cancel_reason:null,cancel_actor:null,delivery_entry_id:null,delivered_at:null,delivery_error:null,projected_at:null,projection_error:null},review_dir:d(t)}}catch(l){throw await G(t,u),l}}n(_e,"stageReview");export{J as deleteReviewFiles,G as discardStaging,_e as stageReview};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var u=Object.defineProperty;var r=(e,t)=>u(e,"name",{value:t,configurable:!0});import{requestFileExists as l}from"../human/request-files.js";import{withCanvasWrite as d,openDb as s}from"../canvas/db.js";import{getRequest as _,getRequestByCompanion as p,getRequestByIdempotencyKey as w,listBindingRequests as m,listRequests as c,listSubmitRequestedRequests as v,listUnprojectedReviews as f,markProjected as y,markProjectionError as h,openRequest as R,readAnchorBase as E,replaceAnchorBaseLocked as j,requestSubmit as k}from"../human/requests.js";import{ReviewOperationError as b}from"./types.js";function g(e){try{const t=JSON.parse(e.specification_json);if(typeof t!="object"||t===null)throw new Error("not an object");return t}catch(t){throw new Error(`corrupt review specification: ${e.request_id}`,{cause:t})}}r(g,"specification");function x(e){return e.state!=="settled"?e.state:e.outcome==="approved"?"approved":"canceled"}r(x,"state");function N(e,t){if(e.kind!=="review")throw new Error(`human request is not a review: ${e.request_id}`);const n=g(e),i=x(e),o=e.settled_at;return{review_id:e.request_id,idempotency_key:e.idempotency_key??"",origin_kind:n.origin_kind??(e.inbox_listed?"ticket":"inline"),origin_node_id:e.requester_node_id??"",companion_node_id:e.companion_node_id??"",review_dir:e.request_dir,file:e.file??"",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,anchor_base_sha256:e.anchor_base_sha256??"",state:i,created:e.created_at,captured_at:n.captured_at,opened_at:e.opened_at,submit_requested_at:e.submit_requested_at,output_path:n.output_path??null,document_id:n.document_id??null,document_name:n.document_name??null,document_base:n.document_base??null,subtitle:e.subtitle,approved_at:i==="approved"?o:null,approved_sha256:i==="approved"?(()=>{try{return JSON.parse(e.result_json??"{}").approved_sha256??null}catch{return null}})():null,changed:i==="approved"?(()=>{try{return JSON.parse(e.result_json??"{}").changed??null}catch{return null}})():null,comments_total:i==="approved"?(()=>{try{return JSON.parse(e.result_json??"{}").comments_total??null}catch{return null}})():null,comments_unresolved:i==="approved"?(()=>{try{return JSON.parse(e.result_json??"{}").comments_unresolved??null}catch{return null}})():null,result_json:e.result_json,canceled_at:i==="canceled"?o:null,cancel_reason:i==="canceled"?(()=>{try{return JSON.parse(e.result_json??"{}").reason??null}catch{return null}})():null,cancel_actor:i==="canceled"?(()=>{try{return JSON.parse(e.result_json??"{}").actor??null}catch{return null}})():null,delivery_entry_id:e.settlement_delivery_id,delivered_at:e.settlement_delivery_id===null?null:o,delivery_error:null,projected_at:e.projected_at,projection_error:e.projection_error,source_missing:t}}r(N,"record");async function a(e){return N(e,!await l(e.file??""))}r(a,"recordOf");async function S(e){const t=await _(e);return t?.kind==="review"?t:null}r(S,"requestForReview");async function A(e){const t=await S(e);return t===null?null:await a(t)}r(A,"getReview");async function U(e){const t=await A(e);if(t===null||t.state==="binding")throw new b("unknown_review","review was not found",{received:e});return t}r(U,"requireVisibleReview");async function T(e){const t=await w(e);return t?.kind==="review"?await a(t):null}r(T,"getReviewByIdempotencyKey");async function I(e){const t=await p(e);return t?.kind==="review"?await a(t):null}r(I,"getReviewByCompanion");async function J(e){const t=await c({kind:"review",...e.origin_node_id===void 0?{}:{requester_node_id:e.origin_node_id},...e.file===void 0?{}:{file:e.file}});return(await Promise.all(t.map(a))).filter(n=>n.state!=="binding"&&(e.state===void 0||n.state===e.state))}r(J,"listReviews");async function D(e){const t=new Set(e);return(await c({kind:"review"})).filter(n=>n.requester_node_id!==null&&t.has(n.requester_node_id)).map(n=>n.request_id)}r(D,"reviewIdsByOriginNodes");async function W(e){const t=await D(e);return t.length===0?[]:(await d(async n=>{const i=t.map(()=>"?").join(",");await n.prepareUncached(`DELETE FROM review_comment_events WHERE review_id IN (${i})`).run(...t),await n.prepareUncached(`DELETE FROM review_comments WHERE review_id IN (${i})`).run(...t),await n.prepareUncached(`DELETE FROM human_requests WHERE request_id IN (${i})`).run(...t)}),t)}r(W,"deleteReviewsByOriginNodes");async function H(){return await Promise.all((await m()).map(a))}r(H,"listBindingReviews");async function F(){return await Promise.all((await v()).map(a))}r(F,"listSubmitRequestedReviews");async function $(){return await Promise.all((await f()).map(a))}r($,"listUnprojectedTerminalReviews");async function C(e,t){return await R(e,t)}r(C,"openReviewRow");async function M(e){await(await s()).prepare("UPDATE human_requests SET submit_requested_at = NULL, updated_at = ? WHERE request_id = ? AND kind = 'review' AND state = 'open'").run(new Date().toISOString(),e)}r(M,"clearReviewSubmit");async function K(e,t){return await k(e,t)}r(K,"requestReviewSubmit");async function V(e,t){return(await e.prepare("UPDATE human_requests SET state = 'settled', outcome = 'approved', result_json = ?, settled_at = ?, progress_json = NULL, updated_at = ? WHERE request_id = ? AND kind = 'review' AND state = 'open'").run(t.result_json,t.approved_at,t.approved_at,t.review_id)).changes>0}r(V,"approveReviewLocked");async function z(e,t){return(await(await s()).prepare("UPDATE human_requests SET state = 'settled', outcome = 'canceled', result_json = ?, settled_at = ?, progress_json = NULL, updated_at = ? WHERE request_id = ? AND kind = 'review' AND state = 'open'").run(JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:t.at,...t.reason===""?{}:{reason:t.reason},...t.actor===null?{}:{actor:t.actor}}),t.at,t.at,e)).changes>0}r(z,"cancelReviewRow");async function G(e,t){await y(e,t)}r(G,"markProjected");async function Q(e,t){await h(e,t)}r(Q,"markProjectionError");function X(e,t,n){}r(X,"markDelivered");function Y(e,t){}r(Y,"markDeliveryError");async function Z(e){return await E(e)}r(Z,"readAnchorBase");async function ee(e,t,n,i){await j(e,t,n,i)}r(ee,"replaceAnchorBaseLocked");export{V as approveReviewLocked,z as cancelReviewRow,M as clearReviewSubmit,W as deleteReviewsByOriginNodes,A as getReview,I as getReviewByCompanion,T as getReviewByIdempotencyKey,H as listBindingReviews,J as listReviews,F as listSubmitRequestedReviews,$ as listUnprojectedTerminalReviews,X as markDelivered,Y as markDeliveryError,G as markProjected,Q as markProjectionError,C as openReviewRow,Z as readAnchorBase,ee as replaceAnchorBaseLocked,K as requestReviewSubmit,U as requireVisibleReview,D as reviewIdsByOriginNodes};
|
|
@@ -73,4 +73,4 @@ export declare function isCleanViewerClose(code: number): boolean;
|
|
|
73
73
|
* 3. Revive opted out: a single connect probe. Dormant (socket refuses) →
|
|
74
74
|
* refuse 409 (spec §5.3 asymmetry: a dead broker can't stream over WS).
|
|
75
75
|
* 4. Only then upgrade and hand the live WS to {@link bridgeConnection}. */
|
|
76
|
-
export declare function handleAttachUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer, nodeId: string,
|
|
76
|
+
export declare function handleAttachUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer, nodeId: string, authorizedRole: (role: 'observer' | 'controller') => Promise<boolean>): Promise<void>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var
|
|
1
|
+
var j=Object.defineProperty;var a=(r,e)=>j(r,"name",{value:e,configurable:!0});import{WebSocketServer as K}from"ws";import{isSafeNodeId as P,viewSocketPath as Q}from"../../core/canvas/paths.js";import{getNode as T}from"../../core/canvas/index.js";import{requestPersonId as z,runAsPerson as G}from"../../core/canvas/person-state.js";import{BROKER_READ_CAPS as X,CLIENT_READ_CAPS as Y,FrameDecoder as Z,FrameOverflowError as I}from"../../core/runtime/broker-protocol.js";import{emitEvent as E}from"../../core/events/emit.js";import{classify as $}from"../../core/fault-classifier.js";import{clearFault as g,markNodeRead as ee,recordFault as x}from"../../core/canvas/recovery.js";import{decideAttachRevive as re}from"../../core/runtime/revive.js";import{connectViewSocket as te,connectWssView as ne,probeViewSocket as ae,waitForBrokerViewSocket as oe,waitForWssView as O}from"../../core/runtime/view-socket.js";import{liveExecutionForNode as ie}from"../../core/canvas/executions.js";import{runnerForExecution as ce}from"../../core/runtime/runner/index.js";import{isBeneathRefusal as se}from"../../core/spaces/open-beneath.js";import{attachViewer as V,detachViewer as le,holdViewerForRedial as fe,presentViewer as ue}from"./viewer-presence.js";const me=new K({noServer:!0,maxPayload:X.maxLineBytes}),de=25e3,he=6e4;function ye(r,e=de,s=he){let n=!0,h=!1,u=Date.now();const l=a(()=>{n=!0},"acknowledge"),i=a(()=>{h||(h=!0,clearInterval(o),r.off("pong",l))},"stop");r.on("pong",l);const o=setInterval(()=>{if(Date.now()-u>s){n=!0;return}if(!n){i(),r.terminate();return}n=!1;try{r.ping()}catch{i(),r.terminate()}},e);return o.unref(),{stop:i,noteActivity:a(()=>{u=Date.now()},"noteActivity")}}a(ye,"startRemoteAttachHeartbeat");function C(r){const e=Buffer.from(r,"utf8");return e.byteLength<=123?r:e.subarray(0,123).toString("utf8")}a(C,"clampReason");function w(r,e,s,n,h){const u=JSON.stringify({error:{code:n,message:h,origin:"runtime"}}),l=`HTTP/1.1 ${e} ${s}\r
|
|
2
2
|
content-type: application/json; charset=utf-8\r
|
|
3
|
-
content-length: ${Buffer.byteLength(
|
|
3
|
+
content-length: ${Buffer.byteLength(u)}\r
|
|
4
4
|
connection: close\r
|
|
5
5
|
\r
|
|
6
|
-
`+
|
|
7
|
-
`)?
|
|
8
|
-
`,
|
|
6
|
+
`+u;try{r.end(l)}catch{try{r.destroy()}catch{}}}a(w,"refuseUpgrade");function pe(r){if(new URL(r.url??"/","http://127.0.0.1").searchParams.get("revive")==="0")return!0;const s=r.headers["x-crtr-attach-revive"];return(Array.isArray(s)?s[0]:s)==="0"}a(pe,"reviveOptedOut");function we(r){return new URL(r.url??"/","http://127.0.0.1").searchParams.get("wakeParked")==="1"}a(we,"wakeParkedRequested");function F(r){return r===1e3||r===1001||r===1005}a(F,"isCleanViewerClose");function y(r,e,s){s.catch(n=>E({level:"error",event:e,node_id:r,error:n}))}a(y,"detach");async function D(r){const e=await ie(r);return e===null||e.runner==="process"?{kind:"unix",path:Q(r)}:ce(e.runner).viewerAddress(e)}a(D,"brokerViewAddress");function ve(r,e){return e.kind==="wss"?ne(e.url,e.headers):te(r)}a(ve,"connectBrokerView");function ke(r,e,s){return e.kind==="wss"?O(e.url,e.headers,void 0,s):ae(r,s)}a(ke,"probeBrokerView");async function ge(r,e,s,n){const h=[];let u=a(t=>{h.push(t)},"relayMessage");if(r.on("message",t=>u(t)),!P(e)){try{r.close(1008,C(`invalid node id: ${e}`))}catch{}return}if(await T(e)===null){try{r.close(1011,C(`no node ${e}`))}catch{}return}await g(e,{link:"viewer\u2194crtrd"});const l=ve(e,s),i=new Z(Y);let o=!1,v=!1,d,b=!1,B=!1,A="controller",N=Promise.resolve(),_=!1;const S=[];let R=!1;l.on("connect",()=>{b=!0,!o&&_&&y(e,"daemon.bridge.presence_failed",V(e,r)),y(e,"daemon.bridge.connect_failed",g(e,{link:"relay\u2194broker"}))});const p=a((t,f,c=!1)=>{if(!o){if(o=!0,y(e,"daemon.bridge.presence_failed",c?fe(e,r):le(e,r)),d?.stop(),!l.destroyed)try{l.destroy()}catch{}try{r.close(t,C(f))}catch{}}},"teardown");d=ye(r);const U=a(async t=>{d?.noteActivity();let f;try{f=i.push(t)}catch(c){const m=c instanceof I?`broker sent an oversized frame (${c.message})`:`failed to decode a broker frame for ${e}`;p(1009,m);return}S.push(...f),R||await L()},"onData"),L=a(async()=>{R=!0;try{for(;S.length>0&&!o;){const t=S.splice(0);let f;try{f=await n(A)}catch(m){E({level:"error",event:"daemon.bridge.attach_recheck_failed",node_id:e,error:m}),p(1011,"revoked");return}if(o)return;if(!f){p(1008,"revoked");return}let c=!1;for(const m of t)r.readyState===r.OPEN&&(r.send(JSON.stringify(m)),m?.type==="welcome"&&(c=!0));if(_&&c)try{await ue(e,r)&&await ee(e)}catch(m){E({level:"warn",event:"daemon.bridge.present_failed",node_id:e,error:m})}}}finally{R=!1}},"drainOutbound");l.on("data",t=>y(e,"daemon.bridge.data_failed",U(t)));const W=a(async t=>{const f=$("relay\u2194broker",t);await x(e,{link:"relay\u2194broker",op:"bridge socket",kind:f.kind,retry:{disposition:"manual"},message:t.message});const c=t.code==="ECONNREFUSED"||t.code==="ENOENT"?`no running broker for ${e}`:`view socket error for ${e}: ${t.message}`;p(1011,c,!0)},"onSocketError");l.on("error",t=>y(e,"daemon.bridge.socket_error_failed",W(t)));const H=a(async t=>{o||t||(await g(e,{link:"relay\u2194broker"}),p(1e3,"broker socket closed",!0))},"onSocketClose");l.on("close",t=>y(e,"daemon.bridge.socket_close_failed",H(t)));const M=a(async(t,f)=>{const c=f.toString("utf8");if(o){F(t)&&await g(e,{link:"viewer\u2194crtrd"});return}if(F(t))await g(e,{link:"viewer\u2194crtrd"});else if(!v){v=!0;const m=$("viewer\u2194crtrd",{code:t,reason:c});await x(e,{link:"viewer\u2194crtrd",op:"remote attach websocket",kind:m.kind,retry:{disposition:"auto"},message:c||`remote attach closed (${t})`})}p(t,c||`remote attach closed (${t})`)},"onWsClose");r.on("close",(t,f)=>y(e,"daemon.bridge.ws_close_failed",M(t,f)));const J=a(async()=>{if(!v){v=!0;const t=$("viewer\u2194crtrd",{code:1006,reason:"remote attach websocket error"});await x(e,{link:"viewer\u2194crtrd",op:"remote attach websocket",kind:t.kind,retry:{disposition:"auto"},message:"remote attach websocket error"})}p(1011,"remote attach websocket error")},"onWsError");r.on("error",()=>y(e,"daemon.bridge.ws_error_failed",J())),u=a(t=>{if(o||l.destroyed)return;d?.noteActivity();const c=(Array.isArray(t)?Buffer.concat(t):Buffer.isBuffer(t)?t:Buffer.from(new Uint8Array(t))).toString("utf8");if(!B)try{const k=JSON.parse(c);k?.type==="hello"&&(B=!0,A=k.role==="observer"?"observer":"controller",_=k.attends!==!1,_&&b&&y(e,"daemon.bridge.presence_failed",V(e,r)))}catch{}const m=c.endsWith(`
|
|
7
|
+
`)?c:c+`
|
|
8
|
+
`,q=a(()=>{try{l.write(m)}catch{}},"write");N=N.then(async()=>{o||(await n(A)?q():p(1008,"revoked"))}).catch(k=>{E({level:"error",event:"daemon.bridge.attach_recheck_failed",node_id:e,error:k}),p(1011,"revoked")})},"relayMessage");for(const t of h.splice(0))u(t)}a(ge,"bridgeConnection");async function Fe(r,e,s,n,h){const u=z(),l=u===void 0?h:i=>G(u,()=>h(i));e.on("error",()=>{});try{if(!P(n)){w(e,400,"Bad Request","invalid_node_id",`invalid node id: ${n}`);return}if(await T(n)===null){w(e,404,"Not Found","node_not_found",`no node ${n}`);return}let i;if(pe(r)){if(i=await D(n),!await ke(n,i,250)){w(e,409,"Conflict","node_dormant",`node ${n} is dormant and revive was opted out (?revive=0)`);return}}else{let o;try{const d=await re(n,{resume:!0,capacity:"refuse"},we(r));if(d.parked){w(e,409,"Conflict","node_dormant",`node ${n} is parked; attach with ?wakeParked=1 to wake it`);return}o=d.result.launch?.exited}catch(d){const b=d instanceof Error?d.message:String(d);w(e,409,"Conflict","attach_revive_failed",`attach revive failed: ${b}`);return}if(i=await D(n),!(i.kind==="wss"?await O(i.url,i.headers,o):await oe(n,o))){w(e,409,"Conflict","broker_not_ready",`broker view socket for ${n} did not become listenable after revive`);return}}if(e.destroyed)return;me.handleUpgrade(r,e,s,o=>y(n,"daemon.bridge.connection_failed",ge(o,n,i,l)))}catch(i){const o=i instanceof Error?i.message:String(i);if(se(i)){w(e,400,"Bad Request","invalid_request",o);return}w(e,500,"Internal Server Error","internal",`attach upgrade failed: ${o}`)}}a(Fe,"handleAttachUpgrade");export{de as REMOTE_ATTACH_HEARTBEAT_MS,he as REMOTE_ATTACH_QUIET_MS,Fe as handleAttachUpgrade,F as isCleanViewerClose,w as refuseUpgrade,ye as startRemoteAttachHeartbeat};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var g=Object.defineProperty;var c=(n,t)=>g(n,"name",{value:t,configurable:!0});import{basename as y}from"node:path";import{ApiError as a}from"../../../api/index.js";import{createPageFeedbackComment as I,readPageFeedback as u,resolvePageFeedbackComment as q,PageFeedbackCommentAlreadyResolvedError as C,PageTicketTerminalError as k,UnknownPageFeedbackCommentError as T}from"../../../core/human/feedback.js";import{discardFeedbackCompanion as w,pageDocumentSha256 as P,realizeFeedbackCompanion as N}from"../../../core/human/feedback-companion.js";import{
|
|
1
|
+
var g=Object.defineProperty;var c=(n,t)=>g(n,"name",{value:t,configurable:!0});import{basename as y}from"node:path";import{ApiError as a}from"../../../api/index.js";import{createPageFeedbackComment as I,readPageFeedback as u,resolvePageFeedbackComment as q,PageFeedbackCommentAlreadyResolvedError as C,PageTicketTerminalError as k,UnknownPageFeedbackCommentError as T}from"../../../core/human/feedback.js";import{discardFeedbackCompanion as w,pageDocumentSha256 as P,realizeFeedbackCompanion as N}from"../../../core/human/feedback-companion.js";import{readPageManifest as S}from"../../../core/human/page.js";import{pageTicketState as F,selectedPageDir as E}from"../../../core/human/tickets.js";import{deliverNodeMessage as x}from"../../messaging/node-message.js";import{requireTicketId as D,resolveTicket as M}from"./inbox.js";import{invalidRequest as b,objectBody as p,optionalString as O,requiredString as l}from"./validate.js";import{toPageFeedbackDTO as h,toPageFeedbackCommentDTO as v}from"../map.js";const R=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;async function _(n){const t=D(n.params),e=await M(t);if(e===null)throw new a(404,"ticket_not_found","no matching ticket");if(e.kind==="review")throw new a(409,"ticket_kind_unsupported","review tickets have no feedback comments");const o=await F(e.dir);if(o==="resolved"||o==="canceled")throw new a(409,"ticket_terminal","ticket already has a terminal outcome");return e}c(_,"requireMutablePageTicket");function j(n){const t=n.comment_id;if(t===void 0||!R.test(t))throw new a(400,"invalid_request","invalid feedback comment id");return t}c(j,"requireCommentId");function $(n){return[...n.quote.split(`
|
|
2
2
|
`).map(e=>`> ${e}`),"",n.note].join(`
|
|
3
|
-
`)}c($,"renderCommentTurn");async function z(n){const t=n.mutation.feedback.companionNodeId;if(t===void 0)throw new a(500,"internal","feedback has comments but no companion conversation");try{const e=await x({node_id:t,body:$(n.mutation.comment),label:n.title,from:"human",mode:"interactive",data:{page_id:y(n.dir),comment_id:n.mutation.comment.id,verb:"create"}});return{target_node_id:t,status:"delivered",via:e.via,woke:e.revived,...e.reason===void 0?{}:{reason:e.reason}}}catch(e){return{target_node_id:t,status:"failed",woke:!1,error:e instanceof Error?e.message:String(e)}}}c(z,"deliverCommentTurn");function A(n){const t=[],e=p(n.body,["quote","context","note"],t),o=l(e,"quote",t),i=
|
|
3
|
+
`)}c($,"renderCommentTurn");async function z(n){const t=n.mutation.feedback.companionNodeId;if(t===void 0)throw new a(500,"internal","feedback has comments but no companion conversation");try{const e=await x({node_id:t,body:$(n.mutation.comment),label:n.title,from:"human",mode:"interactive",data:{page_id:y(n.dir),comment_id:n.mutation.comment.id,verb:"create"}});return{target_node_id:t,status:"delivered",via:e.via,woke:e.revived,...e.reason===void 0?{}:{reason:e.reason}}}catch(e){return{target_node_id:t,status:"failed",woke:!1,error:e instanceof Error?e.message:String(e)}}}c(z,"deliverCommentTurn");function A(n){const t=[],e=p(n.body,["quote","context","note"],t),o=l(e,"quote",t),i=O(e,"context",t),d=l(e,"note",t);return(t.length>0||o===void 0||d===void 0)&&b("page feedback comment request",t),{quote:o,...i===void 0?{}:{context:i},note:d}}c(A,"parseCreate");async function B(n){const t=A(n),e=await _(n),o=await S(await E(e.dir));if(o.dialect!=="jsx")throw new a(409,"page_dialect_unsupported","feedback comments exist only on TSX pages");let i=(await u(e.dir)).companionNodeId,d,s=!1;if(i===void 0){const m=o.source?.nodeId;if(m===void 0)throw new a(409,"ticket_has_no_sender","this page carries no sending node to deliver feedback to");d=await P(e.dir);try{i=await N({ticketId:e.ticketId,dir:e.dir,senderNodeId:m,title:o.title})}catch(f){throw new a(409,"fork_failed",`the sending node could not be forked: ${f instanceof Error?f.message:String(f)}`)}s=!0}let r;try{r=await I(e.dir,{...t,companionNodeId:i,firstCommentedSha256:d})}catch(m){throw s&&await w(i),m instanceof k?new a(409,"ticket_terminal","ticket already has a terminal outcome"):m}return s&&r.feedback.companionNodeId!==i&&await w(i),{status:200,body:{comment:v(r.comment),feedback:h(r.feedback),delivery:await z({dir:e.dir,title:o.title,mutation:r})}}}c(B,"handleCreate");function U(n){const t=[],e=p(n.body,["node_id"],t),o=l(e,"node_id",t);return(t.length>0||o===void 0)&&b("feedback resolve request",t),o}c(U,"parseResolve");async function X(n){const t=await _(n),e=j(n.params),o=U(n),i=(await u(t.dir)).companionNodeId;if(i===void 0||o!==i)throw new a(403,"not_companion","only the ticket's bound feedback companion resolves its comments");let d;try{d=await q(t.dir,e)}catch(r){throw r instanceof T?new a(404,"unknown_comment",r.message):r instanceof C?new a(409,"comment_already_resolved",r.message):r instanceof k?new a(409,"ticket_terminal","ticket already has a terminal outcome"):r}return{status:200,body:{comment:v(d.comment),feedback:h(d.feedback)}}}c(X,"handleResolve");const ne=[{method:"POST",pattern:"/v1/human/inbox/:ticket_id/feedback-comments",handler:B},{method:"POST",pattern:"/v1/human/inbox/:ticket_id/feedback-comments/:comment_id/resolve",handler:X}];export{ne as feedbackCommentRoutes};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var c=Object.defineProperty;var r=(e,t)=>c(e,"name",{value:t,configurable:!0});import{readPageFeedback as s}from"../../../core/human/feedback.js";import{pageModulePath as u,pagePath as l}from"../../../core/human/convention.js";import{readPageManifest as p}from"../../../core/human/page.js";import{readRequestText as n}from"../../../core/human/request-files.js";import{presentationDir as f}from"../../../core/human/requests.js";import{readPageProgress as g,readTicketResult as m}from"../../../core/human/tickets.js";import{toPageFeedbackDTO as k}from"../map.js";function b(e){const t={kind:e.kind,step:e.step,config:e.config};return e.id!==void 0&&(t.id=e.id),e.unvalidated===!0&&(t.unvalidated=!0),e.display===!0&&(t.display=!0),t}r(b,"pageSlotToDTO");function w(e){const t={schema:"crtr.page/v2",dialect:e.dialect,title:e.title,delivery:e.delivery,document:e.document,steps:e.steps,slots:e.slots.map(b)};if(e.subtitle!==void 0&&(t.subtitle=e.subtitle),e.source!==void 0){const i={};e.source.sessionName!==void 0&&(i.sessionName=e.source.sessionName),e.source.askedBy!==void 0&&(i.askedBy=e.source.askedBy),e.source.emittedAt!==void 0&&(i.emittedAt=e.source.emittedAt),e.source.profileName!==void 0&&(i.profileName=e.source.profileName),e.source.nodeId!==void 0&&(i.nodeId=e.source.nodeId),Object.keys(i).length>0&&(t.source=i)}return t}r(w,"pageManifestToDTO");function y(e){return e.settleable?e.state!=="settled"?"pending":e.outcome==="canceled"||e.outcome==="dismissed"?"canceled":"resolved":"passive"}r(y,"state");async function _(e){const t=await m(e.request_dir);if(t===null)return null;if(t.kind==="page"||t.kind==="canceled")return t;throw new Error(`page request has an invalid terminal result: ${e.request_id}`)}r(_,"result");async function O(e){if(e.kind!=="page")throw new Error(`request is not a page: ${e.request_id}`);const t=f(e),i=await p(t),o=await n(l(t,i.dialect)),a=i.dialect==="jsx"?await n(u(t)):o,d=e.settleable?await g(e.request_dir):null;return{ticket_id:e.inbox_ticket_id,kind:"page",state:y(e),revision:t,page:w(i),document:a,source_document:o,document_media_type:i.dialect==="jsx"?"text/jsx":"text/html",progress:d===null?null:{responses:d},result:await _(e),feedback:k(await s(e.request_dir))}}r(O,"inboxPageProjection");export{O as inboxPageProjection};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var T=Object.defineProperty;var o=(e,i)=>T(e,"name",{value:i,configurable:!0});import{ApiError as t}from"../../../api/index.js";import{inboxPageProjection as A}from"./inbox-page.js";import{getRequestByInboxTicket as p}from"../../../core/human/requests.js";import{getNode as b}from"../../../core/canvas/canvas.js";import{actsAsPerson as g,canReadNode as y}from"../router.js";import{
|
|
1
|
+
var T=Object.defineProperty;var o=(e,i)=>T(e,"name",{value:i,configurable:!0});import{ApiError as t}from"../../../api/index.js";import{inboxPageProjection as A}from"./inbox-page.js";import{getRequestByInboxTicket as p}from"../../../core/human/requests.js";import{getNode as b}from"../../../core/canvas/canvas.js";import{actsAsPerson as g,canReadNode as y}from"../router.js";import{readPageManifest as I}from"../../../core/human/page.js";import{scanInbox as P,scanPageHistory as E}from"../../../core/human/scan.js";import{readPageTicket as h,readTicketResult as k,selectedPageDir as x,validatePageTicketResponses as R,writePageProgress as S}from"../../../core/human/tickets.js";import{describePageAnswer as O}from"../../../core/human/answer.js";import{cancelHumanTicket as N,resolvePageTicket as C}from"../../human/finish.js";import{filterAsync as v}from"../../../core/async-array.js";const D="Canceled from the inbox.",j=1e3,G=/^[a-f0-9]{64}$/;async function c(e){const i=await p(e);return i===null?null:{ticketId:i.request_id,dir:i.request_dir,kind:i.kind}}o(c,"resolveTicket");function l(e){const i=e.ticket_id;if(i===void 0||!G.test(i))throw new t(400,"invalid_request","invalid ticket id");return i}o(l,"requireTicketId");function u(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}o(u,"isPlainObject");function f(e,i){for(const n of Object.keys(e))if(!i.includes(n))throw new t(400,"invalid_request",`unexpected field: ${n}`)}o(f,"requireNoExtraKeys");function L(e){if(!u(e))throw new t(400,"invalid_request","respond body is required");if(f(e,["responses"]),!u(e.responses))throw new t(400,"invalid_request","`responses` must be an object");return{responses:e.responses}}o(L,"validateRespondRequest");function H(e){if(!u(e))throw new t(400,"invalid_request","progress body is required");if(f(e,["responses"]),!u(e.responses))throw new t(400,"invalid_request","`responses` must be an object");return{responses:e.responses}}o(H,"validateProgressRequest");function K(e){if(e===void 0)return{};if(!u(e))throw new t(400,"invalid_request","cancel body must be an object");if(f(e,["reason"]),e.reason===void 0)return{};const i=e.reason;if(typeof i!="string")throw new t(400,"invalid_request","`reason` must be a string");if(i.trim()===""||i.length>j)throw new t(400,"invalid_request","`reason` must be nonempty after trim and at most 1000 characters");return{reason:i}}o(K,"validateCancelRequest");const $=[/^slot ".*?" /,/^response names unknown or non-response-bearing slot id/,/^final page response is missing response-bearing slot id/];function _(e){return e instanceof Error&&$.some(i=>i.test(e.message))}o(_,"isSlotValidationError");function q(e){const i={request_id:e.id,request_dir:e.dir,ticket_id:e.inboxTicketId,kind:"page",title:e.title,placement:e.placement,dialect:e.dialect,steps:e.steps,emitted_at:e.emittedAt,source:e.source,slot_kinds:e.slotKinds,inbox:e.inbox,awaits_response:e.awaitsResponse,state:e.state};return e.subtitle!==""&&(i.subtitle=e.subtitle),e.answerDigest!==void 0&&(i.answer_digest=e.answerDigest),e.recommendedOptions.length>0&&(i.recommended_options=e.recommendedOptions.map(n=>({slot_id:n.slotId,option_id:n.optionId,label:n.label}))),e.fastAction!==void 0&&(i.fast_action={kind:e.fastAction.kind,responses:e.fastAction.responses}),i}o(q,"pageSummaryToDTO");async function M(e){return{status:200,body:{tickets:(await v(await P(),async n=>{if(g(e.principal))return!0;const s=await p(n.inboxTicketId),r=s?.requester_node_id?await b(s.requester_node_id):null;return r!==null&&await y(e.principal,r.grantee??"app:terminal",r.node_id)})).map(n=>{if(n.kind==="page")return q(n);if(n.kind==="review")return{request_id:n.id,request_dir:n.dir,ticket_id:n.inboxTicketId,kind:"review",title:n.title,subtitle:n.subtitle,blocked_since:n.blockedSince,source:n.source};throw new Error(`unknown ticket kind: ${n.kind}`)}).sort((n,s)=>{const r=o(d=>d.kind==="page"?d.emitted_at:d.blocked_since,"pageTime"),a=Date.parse(r(s))-Date.parse(r(n));return a!==0?a:n.ticket_id.localeCompare(s.ticket_id)})}}}o(M,"handleList");const V=new Set(["pending","resolved","canceled","passive"]);async function z(e){const i=e.query.get("node_id");if(i==="")throw new t(400,"invalid_request","node_id must be nonempty when present");const n=e.query.get("state");if(n!==null&&!V.has(n))throw new t(400,"invalid_request","state must be one of pending, resolved, canceled, passive");const s=(await E(i??void 0)).filter(d=>n===null||d.state===n);return{status:200,body:{tickets:(await v(s,async d=>{if(g(e.principal))return!0;const m=await p(d.inboxTicketId),w=m?.requester_node_id?await b(m.requester_node_id):null;return w!==null&&await y(e.principal,w.grantee??"app:terminal",w.node_id)})).map(q)}}}o(z,"handleHistory");async function B(e){const i=l(e.params),n=await c(i);if(n===null)throw new t(404,"ticket_not_found","no matching ticket");if(n.kind==="review")throw new t(409,"ticket_kind_unsupported","review tickets have no page read operation");const s=await p(i);if(s===null||s.kind!=="page")throw new t(404,"ticket_not_found","no matching ticket");try{return{status:200,body:await A(s)}}catch{throw new t(500,"internal","the ticket could not be read")}}o(B,"handleGetPage");async function F(e){const i=l(e.params),n=L(e.body),s=await c(i);if(s===null)throw new t(404,"ticket_not_found","no matching ticket");if(s.kind==="review")throw new t(409,"ticket_kind_unsupported","review tickets submit through their own path");if((await h(s.dir)).state==="passive")throw new t(409,"page_has_no_response_lifecycle","this page has no response lifecycle");const r=await k(s.dir);if(r!==null&&r.kind!=="canceled")throw new t(409,"ticket_already_resolved","ticket was already resolved");if(r?.kind==="canceled")throw new t(409,"ticket_canceled","canceled tickets cannot be answered");try{await R(s.dir,n.responses)}catch(a){throw _(a)?new t(400,"invalid_ticket_response",a.message):new t(500,"internal","validation failed")}try{const a=await C(s.ticketId,n.responses);if(a.kind!=="page")throw new t(409,"ticket_kind_mismatch","unexpected result kind");return{status:200,body:a}}catch(a){throw a instanceof t?a:_(a)?new t(400,"invalid_ticket_response",a.message):new t(500,"internal","the ticket could not be finalized")}}o(F,"handleRespond");async function U(e){const i=l(e.params),n=H(e.body),s=await c(i);if(s===null)throw new t(404,"ticket_not_found","no matching ticket");if(s.kind==="review")throw new t(409,"ticket_kind_unsupported","review tickets do not support progress autosave");if((await h(s.dir)).state==="passive")throw new t(409,"page_has_no_response_lifecycle","this page has no response lifecycle");const r=await k(s.dir);if(r!==null&&r.kind!=="canceled")throw new t(409,"ticket_already_resolved","ticket was already resolved");try{return await S(s.dir,n.responses),{status:200,body:{}}}catch(a){throw _(a)?new t(400,"invalid_ticket_response",a.message):new t(500,"internal","progress could not be saved")}}o(U,"handleProgress");async function X(e){const i=l(e.params),n=K(e.body),s=await c(i);if(s===null)throw new t(404,"ticket_not_found","no matching ticket");if(s.kind==="review")throw new t(409,"ticket_kind_unsupported","review tickets have their own cancel path");if((await h(s.dir)).state==="passive")throw new t(409,"page_has_no_response_lifecycle","this page has no response lifecycle");try{const r=await N(s.ticketId,{reason:n.reason??D,actor:"human",disposition:"dismissed"});if(r.outcome==="already_settled"||r.result.kind!=="canceled")throw new t(409,"ticket_already_resolved","ticket was already resolved");return{status:200,body:r.result}}catch(r){throw r instanceof t?r:new t(500,"internal","the ticket could not be canceled")}}o(X,"handleCancel");async function J(e){const i=l(e.params),n=await c(i);if(n===null)throw new t(404,"ticket_not_found","no matching ticket");if(n.kind==="review")throw new t(409,"ticket_kind_unsupported","review tickets fetch responses through their own path");const s=await k(n.dir);if(s===null)throw new t(404,"ticket_pending","ticket has no response yet");if(s.kind==="canceled")throw new t(404,"ticket_canceled","canceled tickets have no response");if(s.kind!=="page")throw new t(409,"ticket_kind_mismatch","unexpected result kind");try{const r=await I(await x(n.dir));return{status:200,body:{...s,answer:O(r,s.responses,{completedAt:s.completedAt})}}}catch{throw new t(500,"internal","the ticket answer could not be read")}}o(J,"handleGetResponse");const de=[{method:"GET",pattern:"/v1/human/inbox",handler:M},{method:"GET",pattern:"/v1/human/inbox/history",handler:z},{method:"GET",pattern:"/v1/human/inbox/:ticket_id",handler:B},{method:"GET",pattern:"/v1/human/inbox/:ticket_id/response",handler:J},{method:"POST",pattern:"/v1/human/inbox/:ticket_id/respond",handler:F},{method:"POST",pattern:"/v1/human/inbox/:ticket_id/progress",handler:U},{method:"POST",pattern:"/v1/human/inbox/:ticket_id/cancel",handler:X}];export{de as inboxRoutes,l as requireTicketId,c as resolveTicket};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var R=Object.defineProperty;var s=(
|
|
1
|
+
var R=Object.defineProperty;var s=(n,e)=>R(n,"name",{value:e,configurable:!0});import{ApiError as p}from"../../../api/index.js";import{isCloudRole as k}from"../../../core/canvas/person.js";import{withCanvasWrite as q}from"../../../core/canvas/db.js";import{isSafeNodeId as w}from"../../../core/canvas/paths.js";import{readDocument as E}from"../../../core/graph/documents.js";import{getById as S}from"../../../core/graph/objects.js";import{checkoutsForCwd as T}from"../../../core/graph/repo-sync/repos.js";import{getNode as b}from"../../../core/canvas/canvas.js";import{assertScope as C}from"../../../core/scopes.js";import{createReview as $}from"../../../core/review/birth.js";import{readAnchorBase as I,listReviews as A,requireVisibleReview as y}from"../../../core/review/store.js";import{cancelReview as D,submitReviewApproval as O}from"../../review/finish.js";import{toFeedbackResultDTO as F,toReviewDTO as L}from"../map.js";import{readerFor as P,resolveRef as j,warmReaderRepos as B}from"../reader.js";import{actsAsPerson as N,canReadNode as G}from"../router.js";import{invalidRequest as V,objectBody as _,optionalString as c,requireParam as W,requiredString as g}from"./validate.js";import{filterAsync as K}from"../../../core/async-array.js";const M=new Set(["open","approved","canceled"]),z=["origin_kind","origin_node_id","document","file","idempotency_key","subtitle","output_path"],H=["reason","actor","disposition"];function l(n){V("review request",n)}s(l,"invalidRequest");function h(n,e){return W(n,"review_id","must be a safe review id",w,e)}s(h,"requireReviewId");function f(n){return{...L(n,n.state==="approved"?{result_path:`${n.review_dir}/result.json`}:{}),review_dir:n.review_dir}}s(f,"toReviewResponseDTO");function J(n){const e=[],t=_(n.body,z,e),o=t.origin_kind,i=o==="ticket"||o==="inline"?o:void 0;i===void 0&&e.push({field:"origin_kind",problem:"must be ticket or inline",...o===void 0?{}:{received:o}});const r=g(t,"origin_node_id",e);r!==void 0&&!w(r)&&e.push({field:"origin_node_id",problem:"must be a safe node id",received:r});const d=c(t,"document",e),u=c(t,"file",e);i==="ticket"&&(d===void 0||u!==void 0)&&e.push({field:"document",problem:"is required for ticket reviews, and file is not allowed"}),i==="inline"&&u===void 0==(d===void 0)&&e.push({field:"file",problem:"inline reviews take exactly one of file or document"});const a=g(t,"idempotency_key",e);a!==void 0&&a.length>128&&e.push({field:"idempotency_key",problem:"must be at most 128 characters",received:a});const v=c(t,"subtitle",e),m=c(t,"output_path",e);return i==="ticket"&&v===void 0&&t.subtitle===void 0&&e.push({field:"subtitle",problem:"is required for ticket reviews"}),i==="inline"&&t.subtitle!==void 0&&e.push({field:"subtitle",problem:"is only allowed for ticket reviews",received:t.subtitle}),i==="inline"&&t.output_path!==void 0&&e.push({field:"output_path",problem:"is only allowed for ticket reviews",received:t.output_path}),m!==void 0&&k()&&e.push({field:"output_path",problem:"is not supported on the cloud: a review result is projected only to its own request files",received:m}),(e.length>0||i===void 0||r===void 0||!w(r)||a===void 0||a.length>128)&&l(e),{origin_kind:i,origin_node_id:r,...d===void 0?{}:{document:d},...u===void 0?{}:{file:u},idempotency_key:a,...v===void 0?{}:{subtitle:v},...m===void 0?{}:{output_path:m}}}s(J,"parseCreate");function Q(n){const e=[],t={},o=new Set(["state","origin_node_id","file"]);for(const[i,r]of n.query.entries())o.has(i)||e.push({field:i,problem:"is not allowed",received:r});for(const i of o){const r=n.query.getAll(i);if(r.length>1){e.push({field:i,problem:"must appear at most once",received:r});continue}const d=r[0];d!==void 0&&(i==="state"?M.has(d)?t.state=d:e.push({field:i,problem:"must be open, approved, or canceled",received:d}):i==="origin_node_id"?w(d)?t.origin_node_id=d:e.push({field:i,problem:"must be a safe node id",received:d}):d===""?e.push({field:i,problem:"must be a non-empty string",received:d}):t.file=d)}return e.length>0&&l(e),t}s(Q,"parseList");function U(n,e){const t=n.body===void 0?{}:_(n.body,H,e),o=c(t,"reason",e),i=c(t,"actor",e),r=c(t,"disposition",e);return r!==void 0&&r!=="canceled"&&r!=="dismissed"&&e.push({field:"disposition",problem:'must be "canceled" or "dismissed"',received:r}),{...o===void 0?{}:{reason:o},...i===void 0?{}:{actor:i},...r==="canceled"||r==="dismissed"?{disposition:r}:{}}}s(U,"parseCancel");function X(n,e){_(n.body,[],e)}s(X,"requireEmptyBody");async function Y(n){const e=J(n),t=await b(e.origin_node_id);t!==null&&C(t,"crtr:act");const{document:o,file:i,...r}=e,d=await $({...r,...o===void 0?{file:i??""}:{document:await Z(n,o)}});return{status:200,body:f(d)}}s(Y,"handleCreate");async function Z(n,e){return await B(n.principal),await q(async t=>{const o=await P(t,n),i=await j(t,o,e);if("remote"in i)throw new p(404,"not_found",`no document named ${i.remote} on this runtime`,{next:"Check the name with `crtr canvas search`."});if("deleted"in i)throw new p(404,"not_found",`${i.deleted.name} is deleted`,{id:i.deleted.id,deleted:!0});if(i.type!=="document")throw new p(400,"invalid_request",`${e} is a ${i.type}, not a document`);const r=await E(t,o,i,async a=>await T(t,a));if(r.needsMerge)throw new p(409,"needs_merge",`${i.name} has ${r.heads.length} heads; merge them before a review`,{id:i.id,next:`Read it with \`crtr canvas read ${i.id}\` and write the merged body with \`crtr doc edit\`.`});const d=i.owner===null?null:await S(t,i.owner),u=d===null?"":d.type==="node"?d.id:d.name;return{id:i.id,name:u===""?i.name:`${u}/${i.name}`,base:r.record.heads_key,body:r.heads[0].body}})}s(Z,"reviewedDocument");async function x(n){const e=Q(n);return{status:200,body:{reviews:(await K(await A(e),async o=>{if(N(n.principal))return!0;const i=await b(o.origin_node_id);return i!==null&&await G(n.principal,i.grantee??"app:terminal",i.node_id)})).map(f)}}}s(x,"handleList");async function ee(n){const e=[],t=h(n,e);return(e.length>0||t===void 0)&&l(e),{status:200,body:f(await y(t))}}s(ee,"handleRead");async function ie(n){const e=[],t=h(n,e);X(n,e),(e.length>0||t===void 0)&&l(e);const o=await O(t);return{status:200,body:o.outcome==="awaiting_companion"?{review:f(o.record),outcome:o.outcome}:{review:f(o.record),result:F(o.result),outcome:o.outcome}}}s(ie,"handleSubmit");async function te(n){const e=[],t=h(n,e),o=U(n,e);(e.length>0||t===void 0)&&l(e);const i=await D(t,o);return{status:200,body:{review:f(i.record),outcome:i.outcome}}}s(te,"handleCancel");async function ne(n){const e=[],t=h(n,e);(e.length>0||t===void 0)&&l(e);const o=await y(t),i=await I(o.review_id);if(i===null)throw new Error(`review anchor base is missing: ${o.review_id}`);return{status:200,body:{review_id:o.review_id,anchor_base_sha256:i.sha256,anchor_base_text:new TextDecoder("utf-8",{fatal:!0}).decode(i.bytes),file:o.file}}}s(ne,"handleDocument");const Re=[{method:"POST",pattern:"/v1/human/reviews",scope:"crtr:act",handler:Y},{method:"GET",pattern:"/v1/human/reviews",handler:x},{method:"GET",pattern:"/v1/human/reviews/:review_id",handler:ee},{method:"POST",pattern:"/v1/human/reviews/:review_id/submit",handler:ie},{method:"POST",pattern:"/v1/human/reviews/:review_id/cancel",handler:te},{method:"GET",pattern:"/v1/human/reviews/:review_id/document",handler:ne}];export{J as parseCreate,Re as reviewRoutes};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var q=Object.defineProperty;var d=(e,t)=>q(e,"name",{value:t,configurable:!0});import{existsSync as w,readFileSync as E,readdirSync as
|
|
1
|
+
var q=Object.defineProperty;var d=(e,t)=>q(e,"name",{value:t,configurable:!0});import{existsSync as w,readFileSync as E,readdirSync as I,rmSync as g}from"node:fs";import{join as u}from"node:path";import{cronIdsForProfileDeletion as R,cronIdsForProfileDetach as C,deleteCronsForProfile as T,deleteNodes as O,getNode as m,getRow as W,globalizeCronsForProfile as A,listNodesByProfile as M,nodesRoot as B}from"../core/canvas/index.js";import{deleteReviewFiles as $}from"../core/review/stage.js";import{withCanvasWrite as v}from"../core/canvas/db.js";import{deleteProfileWithOwned as _}from"../core/graph/deletion.js";import{usage as f}from"../core/errors.js";import{emitEvent as z}from"../core/events/emit.js";import{clearDefaultProfileId as k,defaultProfileDirs as L}from"../core/profiles/default-binding.js";import{reserveProfileDeletion as J}from"../core/profiles/deletion-reservation.js";import{deleteProfile as D,loadProfileManifest as G}from"../core/profiles/manifest.js";import{deleteReviewsByOriginNodes as H,reviewIdsByOriginNodes as K}from"../core/review/store.js";import{boundFleet as U}from"../core/runtime/fleet.js";import{headlessBrokerHost as b}from"../core/runtime/host.js";import{transition as Q}from"../core/runtime/lifecycle.js";import{tearDownNode as V}from"../core/runtime/placement.js";import{reshapeNode as X}from"../core/runtime/promote.js";import{reviveNode as Y}from"../core/runtime/revive.js";import{filterAsync as Z,flatMapAsync as ee}from"../core/async-array.js";const P=1e3,N=new Set(["page.json","page.tsx","page.html","page.js","review.json","response.json","progress.json","claim.json","reply-route.json","feedback-comments.json","feedback.json",".ticket-lock"]),p=new Map;function te(e){if(typeof e!="object"||e===null||Array.isArray(e))throw f("profile deletion requires a JSON request body",{error:"force_required",message:"profile deletion requires --force",next:"Re-run `crtr profile delete <profile> --force` after reviewing its effects."});return e}d(te,"requestObject");function re(e){const t=te(e);if(t.force!==!0)throw f("profile deletion requires --force",{error:"force_required",message:"profile deletion requires --force",next:"Re-run `crtr profile delete <profile> --force` after reviewing its effects."});if(t.detach!==void 0&&typeof t.detach!="boolean")throw f("detach must be a boolean",{error:"invalid_detach",message:"detach must be a boolean",next:"Use --detach as a presence-only flag, or omit it."});const r=t.caller_node_id;if(r!=null&&(typeof r!="string"||r===""))throw f("caller_node_id must be a nonempty string or null");return{force:!0,...t.detach===!0?{detach:!0}:{},...r===void 0?{}:{caller_node_id:r}}}d(re,"validateRequest");function j(e){if(!w(e))return null;try{const t=JSON.parse(E(e,"utf8"));return typeof t.source?.nodeId=="string"&&t.source.nodeId!==""?t.source.nodeId:null}catch{return null}}d(j,"manifestSourceNodeId");async function oe(e){const t=new Set(e),r=B();if(t.size===0||!w(r))return[];const o=[];for(const n of I(r,{withFileTypes:!0})){if(!n.isDirectory())continue;const s=u(r,n.name);[j(u(s,"page.json")),j(u(s,"review.json"))].some(c=>c!==null&&t.has(c))&&o.push({dir:s,wholeDirectory:t.has(n.name)||await W(n.name)===null})}return o.sort((n,s)=>n.dir.localeCompare(s.dir))}d(oe,"ticketCleanupForNodes");function ne(e){if(N.has(e))return!0;for(const t of N)if(e.startsWith(`${t}.`)&&(e.endsWith(".tmp")||e.endsWith(".lock")))return!0;return!1}d(ne,"isTicketOwnedResidue");function ie(e){let t=0;for(const r of e)if(w(r.dir)){if(r.wholeDirectory){g(r.dir,{recursive:!0,force:!0}),t+=1;continue}for(const o of I(r.dir,{withFileTypes:!0}))ne(o.name)&&g(u(r.dir,o.name),{recursive:!0,force:!0});t+=1}return t}d(ie,"cleanTickets");function S(e){const t=e.filter(o=>o.managed_worktree?.state==="open").map(o=>({node_id:o.node_id,path:o.managed_worktree.path}));if(t.length===0)return null;const r=`profile deletion is blocked by ${t.length} open managed worktree${t.length===1?"":"s"}`;return f(r,{error:"open_managed_worktree",message:r,nodes:t,next:`Close ${t.map(({node_id:o})=>o).join(", ")} with \`crtr node worktree close <node>\`, then retry.`})}d(S,"openWorktreeError");async function se(e,t){const r=await M(e.profileId),o=S(r);if(o!==null)throw o;const n=r.map(({node_id:a})=>a),s=t.detach===!0?"detached":"deleted";return{entry:e,mode:s,nodes:r,nodeIds:n,tickets:s==="deleted"?await oe(n):[],cronIds:s==="deleted"?await R(e.profileId,n):await C(e.profileId),reviewIds:s==="deleted"?await K(n):[],defaultDirs:L(e.profileId)}}d(se,"prepareDeletion");async function F(e){const t=await ee(e.nodeIds,async o=>{const n=await m(o);return n===null?[]:[n]}),r=S(t);if(r!==null)throw r}d(F,"assertDeletionPlanPreconditions");function h(e){return{profile_id:e.entry.profileId,name:e.entry.manifest.name,mode:e.mode,nodes:e.nodeIds.length,crons:e.cronIds.length,tickets:e.tickets.length,reviews:e.reviewIds.length,default_pins:e.defaultDirs.length}}d(h,"resultForPlan");async function de(e){await F(e);const t=await Z(e.nodeIds,async i=>await m(i)!==null),r=U(),o=t.flatMap(i=>{const l=r.get(i);return l===void 0?[]:[{nodeId:i,exited:l.handle.exited}]}),n=[];for(const{nodeId:i}of o){const l=await m(i);(l?.status==="active"||l?.status==="idle")&&(await Q(i,"release"),n.push(i)),b.teardown(i)}await Promise.all(o.map(({exited:i})=>i));const s=[];for(const i of t)await m(i)!==null&&(await X(i,{profileId:null}),s.push(i));const a=await A(e.entry.profileId),c=await k(e.entry.profileId);await v(async i=>await _(i,e.entry.profileId)),await D(e.entry.profileId);const y=new Set(s);for(const i of n)y.has(i)&&await Y(i,{resume:!0,recovery:!0,capacity:"freeze"});return{...h(e),nodes:s.length,crons:a.length,default_pins:c.length}}d(de,"detachProfile");async function ae(e){await F(e);const t=await T(e.entry.profileId,e.nodeIds);for(const a of e.nodeIds)b.teardown(a),await V(a);const r=await H(e.nodeIds);for(const a of r)await $(a);const o=ie(e.tickets),n=await O(e.nodeIds),s=await k(e.entry.profileId);return await v(async a=>await _(a,e.entry.profileId)),await D(e.entry.profileId),{...h(e),nodes:n.length,crons:t.length,tickets:o,reviews:r.length,default_pins:s.length}}d(ae,"hardDeleteProfile");async function x(e){return e.mode==="detached"?de(e):await ae(e)}d(x,"executePlan");function ce(e,t){const r={...h(e),accepted:!0,grace_ms:P};return p.set(e.entry.profileId,{result:r}),setTimeout(()=>{(async()=>{try{await x(e)}catch(o){z({level:"error",event:"profile.delete.deferred_failed",error:o instanceof Error?o:new Error(String(o)),fields:{profile_id:e.entry.profileId,mode:e.mode}})}finally{p.delete(e.entry.profileId),t()}})()},P),r}d(ce,"scheduleSelfDeletion");async function xe(e,t){const r=re(t),o=G(e),n=p.get(o.profileId);if(n!==void 0)return{status:202,body:n.result};const s=J(o.profileId);let a=!1;try{const c=await se(o,r);if(r.caller_node_id!=null&&c.nodeIds.includes(r.caller_node_id)){const i=ce(c,s);return a=!0,{status:202,body:i}}return{status:200,body:await x(c)}}finally{a||s()}}d(xe,"requestProfileDeletion");export{xe as requestProfileDeletion};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var g=Object.defineProperty;var n=(e,t)=>g(e,"name",{value:t,configurable:!0});import{withCanvasWrite as j}from"../../core/canvas/db.js";import{get as S}from"../../core/graph/bodies.js";import{documentById as q,editDocument as C,heads as $}from"../../core/graph/documents.js";import{readerFor as k}from"../../core/graph/reader.js";import{warmDocumentWatchers as J}from"../api/reader.js";import{checkoutsForCwd as x}from"../../core/graph/repo-sync/repos.js";import{snapshotCommentsLocked as N}from"../../core/review/comments.js";import{readReviewSource as O}from"../../core/review/document.js";import{projectReviewCancellation as T,projectReviewResult as D,buildReviewResult as A}from"../../core/review/project.js";import{signalReviewActivity as p}from"../../core/review/signal.js";import{clearReviewSubmit as E,getReview as W,getReviewByCompanion as B,requestReviewSubmit as F,requireVisibleReview as u}from"../../core/review/store.js";import{ReviewOperationError as w}from"../../core/review/types.js";import{settleHumanRequest as v}from"../human/settle.js";import{retireCompanion as h}from"../companion-retire.js";import{companionHasQueuedWork as H,companionMidTurn as M,companionStillWorking as L}from"./companion.js";import{renderApprovalMessage as P}from"./deliver.js";function f(){return new Date().toISOString()}n(f,"now");function l(e,t){throw new w("review_terminal","review already has a terminal outcome",{state:e.state,requested:t,review:e})}n(l,"terminalConflict");function _(e){if(e.result_json===null)throw new Error(`approved review lacks its immutable result: ${e.review_id}`);return JSON.parse(e.result_json)}n(_,"approvedResult");function y(e){return`${e.review_dir}/result.json`}n(y,"resultPath");function Q(e){return{project:n(async t=>{D(await u(t.request_id),e)},"project"),retire:n(async(t,o)=>{await h(t,o)},"retire")}}n(Q,"effects");function V(e){return{label:"review approved by the user",disposition:null,body_json:{review_id:e.review_id,result_path:y(e),body:P(e,y(e))}}}n(V,"approvalNotification");function z(e,t,o){const
|
|
1
|
+
var g=Object.defineProperty;var n=(e,t)=>g(e,"name",{value:t,configurable:!0});import{withCanvasWrite as j}from"../../core/canvas/db.js";import{get as S}from"../../core/graph/bodies.js";import{documentById as q,editDocument as C,heads as $}from"../../core/graph/documents.js";import{readerFor as k}from"../../core/graph/reader.js";import{warmDocumentWatchers as J}from"../api/reader.js";import{checkoutsForCwd as x}from"../../core/graph/repo-sync/repos.js";import{snapshotCommentsLocked as N}from"../../core/review/comments.js";import{readReviewSource as O}from"../../core/review/document.js";import{projectReviewCancellation as T,projectReviewResult as D,buildReviewResult as A}from"../../core/review/project.js";import{signalReviewActivity as p}from"../../core/review/signal.js";import{clearReviewSubmit as E,getReview as W,getReviewByCompanion as B,requestReviewSubmit as F,requireVisibleReview as u}from"../../core/review/store.js";import{ReviewOperationError as w}from"../../core/review/types.js";import{settleHumanRequest as v}from"../human/settle.js";import{retireCompanion as h}from"../companion-retire.js";import{companionHasQueuedWork as H,companionMidTurn as M,companionStillWorking as L}from"./companion.js";import{renderApprovalMessage as P}from"./deliver.js";function f(){return new Date().toISOString()}n(f,"now");function l(e,t){throw new w("review_terminal","review already has a terminal outcome",{state:e.state,requested:t,review:e})}n(l,"terminalConflict");function _(e){if(e.result_json===null)throw new Error(`approved review lacks its immutable result: ${e.review_id}`);return JSON.parse(e.result_json)}n(_,"approvedResult");function y(e){return`${e.review_dir}/result.json`}n(y,"resultPath");function Q(e){return{project:n(async t=>{await D(await u(t.request_id),e)},"project"),retire:n(async(t,o)=>{await h(t,o)},"retire")}}n(Q,"effects");function V(e){return{label:"review approved by the user",disposition:null,body_json:{review_id:e.review_id,result_path:y(e),body:P(e,y(e))}}}n(V,"approvalNotification");function z(e,t,o){const i=o==="dismissed";return{label:i?"review dismissed":"review canceled",disposition:"human-canceled",body_json:{review_id:e.review_id,disposition:o,body:i?`The review of \`${e.document_name??e.file}\` was dismissed without approval.`:`The review of \`${e.document_name??e.file}\` was canceled${t===""?"":` \u2014 ${t}`}.`}}}n(z,"cancellationNotification");async function G(e,t,o){if(t.document_id===null||t.document_base===null)return;const i=n(async d=>await x(e,d),"reposFn"),a=await q(e,t.document_id),s=await k(e,{class:"person"},i),c=await C(e,s,a,{body:o},`edited in review ${t.review_id}`,t.document_base,{},i);if(!("stale"in c))return;const r=await $(e,a);if(!(r.length===1&&S(r[0].body_hash)===o))throw new w("stale_revision",`${t.document_name??a.name} changed since the review began; the reviewed text was not saved`,{review_id:t.review_id,document:t.document_name??a.name,base:t.document_base,heads_key:c.stale.heads_key,revision:c.stale.revision,next:`Read the current revision with \`crtr canvas read ${a.id}\`, then start a new review of it.`})}n(G,"saveReviewedDocument");async function b(e){if(e.state==="canceled")return l(e,"submit");if(e.state==="approved")return{outcome:"already_settled",record:e,result:_(e)};const t=await O(e.file,"submit");e.document_id!==null&&await J(e.document_id);const{result:o,resultJson:i}=await j(async c=>{const r=await u(e.review_id);if(r.state==="canceled")return l(r,"submit");if(r.state==="approved")return{result:_(r),resultJson:r.result_json};const d=await N(c,r.review_id),m=A(r,d,t.sha256,f());return m.changed&&await G(c,r,new TextDecoder("utf-8").decode(t.bytes)),{result:m,resultJson:JSON.stringify(m)}}),a=await v({request_id:e.review_id,outcome:"approved",result_json:i,notification:V({...e,changed:o.changed}),post_commit:Q(o)});a.outcome==="settled"&&p();const s=await u(e.review_id);return a.outcome==="already_settled"&&s.state!=="approved"?l(s,"submit"):{outcome:a.outcome,record:s,result:a.outcome==="settled"?o:_(s)}}n(b,"approveReview");async function le(e){const t=await u(e);return t.state==="canceled"?l(t,"submit"):t.state==="open"&&await L(t.companion_node_id)?(await F(e,f())&&p(),{outcome:"awaiting_companion",record:await u(e)}):b(t)}n(le,"submitReviewApproval");async function K(e,t){const o=await W(e);if(o===null||o.state!=="open"||o.submit_requested_at===null||await H(o.companion_node_id)||!t.atCompanionTurnEnd&&await M(o.companion_node_id))return null;try{return await b(o)}catch(i){throw i instanceof w&&i.code==="stale_revision"&&(await E(e),p()),i}}n(K,"completeRequestedSubmit");async function pe(e){const t=await B(e);return t===null?null:K(t.review_id,{atCompanionTurnEnd:!0})}n(pe,"completeCompanionRequestedSubmit");async function we(e,t={}){const o=await u(e);if(o.state==="approved")return l(o,"cancel");const i=f(),a=t.reason??"",s=t.disposition??"canceled",c=JSON.stringify({schema:"humanloop.cancel/v1",kind:"canceled",canceledAt:i,...a===""?{}:{reason:a},...t.actor===void 0?{}:{actor:t.actor},...s==="dismissed"?{disposition:s}:{}}),r=await v({request_id:e,outcome:s==="dismissed"?"dismissed":"canceled",result_json:c,notification:z(o,a,s),post_commit:{project:n(async m=>{await T(await u(m.request_id),JSON.parse(c))},"project"),retire:n(async(m,R)=>{await h(m,R)},"retire")}});r.outcome==="settled"&&p();const d=await u(e);return r.outcome==="already_settled"&&d.state==="approved"?l(d,"cancel"):{outcome:r.outcome,record:d}}n(we,"cancelReview");export{we as cancelReview,pe as completeCompanionRequestedSubmit,K as completeRequestedSubmit,le as submitReviewApproval};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var t=Object.defineProperty;var i=(r,e)=>t(r,"name",{value:e,configurable:!0});import{requireVisibleReview as o}from"../../core/review/store.js";import{projectReviewResult as s}from"../../core/review/project.js";import{realizeReview as a}from"../../core/review/realize.js";import{retireCompanion as n}from"../companion-retire.js";import{sweepHumanRequests as m}from"../human/sweep.js";async function f(){return m({realizeReview:a,projectReview:i(async r=>{const e=await o(r.request_id);if(e.result_json===null)throw new Error(`approved review lacks its immutable result: ${e.review_id}`);await s(e,JSON.parse(e.result_json))},"projectReview"),retireCompanion:i(async(r,e)=>{await n(r,e)},"retireCompanion")})}i(f,"sweepReviews");export{f as sweepReviews};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var
|
|
2
|
-
WHERE node_id = ? AND EXISTS (SELECT 1 FROM reconciler_leases WHERE lane = ? AND key = ? AND owner = ? AND expires_at > ?)`).run(...e===null||
|
|
1
|
+
var b=Object.defineProperty;var l=(t,e)=>b(t,"name",{value:e,configurable:!0});import{randomUUID as y}from"node:crypto";import{openDb as d,withCanvasWrite as C}from"../../core/canvas/db.js";import{claimReconcilerLease as F,releaseReconcilerLease as O,renewReconcilerLease as M}from"../../core/canvas/reconciler-leases.js";import{getNode as R}from"../../core/canvas/canvas.js";import{BrokerClient as x,SocketTransport as D}from"../../core/broker-client/client.js";import{liveExecutionForNode as N}from"../../core/canvas/executions.js";import{runnerForExecution as H}from"../../core/runtime/runner/index.js";import{connectWssView as W}from"../../core/runtime/view-socket.js";import{ViewLinkTransport as q}from"./view-transport.js";import{emitRunEvent as g,emitRunSettlement as A,emitRunStatus as U}from"../../core/runs/events.js";import{cancelOpenQuestions as j}from"../../core/runs/questions.js";import{emitEvent as c}from"../../core/events/emit.js";import{toRunOutcomeDTO as J}from"../api/map.js";import{readOutputResult as P}from"../../core/runtime/output-result.js";const V=JSON.stringify({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}),p=new Map,h="run-observer",E=1e4,B=250;async function w(t,e,i){return await C(async s=>await s.prepare("SELECT 1 AS held FROM reconciler_leases WHERE lane = ? AND key = ? AND owner = ? AND expires_at > ? FOR SHARE").get(h,t,e,new Date().toISOString())===void 0?{held:!1}:{held:!0,value:await i()})}l(w,"whileHoldingLease");class v{static{l(this,"RunObserver")}nodeId;runId;owner;client;timer;status;piPid=null;outcomeRevision;openAssistant=!1;assistantStartSequence=0;block=null;thinking="";output="";pendingThinking="";pendingOutput="";flushTimer;closed=!1;lastRenewAt=Date.now();released=Promise.resolve();polling;frames=Promise.resolve();constructor(e,i,s,n,r){this.nodeId=e,this.runId=i,this.owner=s,this.status=n,this.outcomeRevision=r,this.timer=setInterval(()=>{this.pollOrClose()},250),this.timer.unref(),p.set(e,this)}static async start(e,i,s){const n=await d(),r=await n.prepare("SELECT body_json FROM run_events WHERE node_id = ? AND type = ? ORDER BY sequence_number DESC LIMIT 1").get(e,e===i?"node.settled":"child.settled"),a=await n.prepare("SELECT body_json FROM run_events WHERE node_id = ? AND type = 'node.status.changed' ORDER BY sequence_number DESC LIMIT 1").get(e),o=new v(e,i,s,a?JSON.parse(a.body_json).status:void 0,r?JSON.parse(r.body_json).outcome.revision:void 0);return await o.writeStream(null,null),await o.poll(),o}async pollOrClose(){try{await this.poll()}catch(e){this.close(),c({level:"error",event:"daemon.runs.observer_failed",node_id:this.nodeId,error:e})}}poll(){return this.polling===void 0&&(this.polling=this.pollOnce().finally(()=>{this.polling=void 0})),this.polling}async holdLease(){return Date.now()-this.lastRenewAt<E/3?!0:await M(h,this.nodeId,this.owner,E)?(this.lastRenewAt=Date.now(),!0):!1}async writeStream(e,i,s=!1){return(await(await d()).prepare(`UPDATE nodes SET ${s?"":`stream_message_seq = ${e===null?"NULL":"(SELECT event_cursor FROM nodes WHERE node_id = ?)"},`} stream_block = ?
|
|
2
|
+
WHERE node_id = ? AND EXISTS (SELECT 1 FROM reconciler_leases WHERE lane = ? AND key = ? AND owner = ? AND expires_at > ?)`).run(...e===null||s?[]:[this.runId],i===null?null:JSON.stringify(i),this.nodeId,h,this.nodeId,this.owner,new Date().toISOString())).changes===1}async pollOnce(){if(this.closed)return;if(!await this.holdLease()){this.close();return}const e=await R(this.nodeId);if(!e||e.run_id!==this.runId||!await T(this.runId)){this.close();return}this.piPid=e.pi_pid??null;const i=e.pi_pid===null?"dormant":e.status;if(this.status!==i){if(!(await w(this.nodeId,this.owner,()=>U(this.runId,this.nodeId,i,e.intent??null))).held){this.close();return}this.status=i}const s=await J(e);if(s&&s.revision!==this.outcomeRevision&&Date.now()-Date.parse(s.settled_at)<720*60*6e4){if(this.nodeId===this.runId){const a=await(await d()).prepare("SELECT node_id FROM nodes WHERE run_id = ? AND node_id != ? ORDER BY created DESC").all(this.runId,this.runId);for(const o of a)await I(o.node_id,this.runId),await p.get(o.node_id)?.poll()}this.outcomeRevision=s.revision;const n=this.nodeId===this.runId&&s.kind==="result"?await P(this.nodeId):void 0;if(!(await w(this.nodeId,this.owner,()=>this.nodeId===this.runId?A(this.runId,this.nodeId,"node.settled",{outcome:s,usage:JSON.parse(e.usage_json??V),...n===void 0?{}:{result:n}}):A(this.runId,this.nodeId,"child.settled",{child_node_id:this.nodeId,outcome:s}))).held){this.close();return}if(e.grantee&&e.grantee!=="app:terminal"){const a=this.nodeId===this.runId?{run_id:this.runId}:{node_id:this.nodeId};j(a,this.nodeId===this.runId?"the run settled":"the asking node was closed").catch(o=>c({level:"error",event:"daemon.runs.question_cancel_failed",node_id:this.nodeId,error:o}))}}e.pi_pid===null?this.close():await this.connect()}async settlePoll(){await this.polling?.catch(()=>{}),await this.frames,await this.released}async viewAdmitted(){const e=await N(this.nodeId);return!(e?.runner==="blaxel"&&e.idleAt!==null)}async dropView(){const e=this.client;e&&(this.client=void 0,await this.frames,await this.flushDeltas(),this.discardDeltas(),this.openAssistant=!1,this.block=null,await this.writeStream(null,null),e.close())}async connect(){if(this.closed)return;if(!await this.viewAdmitted()){await this.dropView();return}if(this.client)return;const e=await Y(this.nodeId),i=await this.viewAdmitted();if(this.client||this.closed||!i){e.destroy();return}const s=new x(this.nodeId,{transport:e});this.client=s,s.on("connect",()=>s.send({type:"hello",role:"observer",client_id:y(),attends:!1}));const n=l(async r=>{if(!(this.closed||this.client!==s)){if(r.type==="message_start"&&r.message.role==="assistant"){if(this.discardDeltas(),this.openAssistant=!0,this.block=null,this.thinking="",this.output="",!await this.writeStream("run-cursor",null)){this.close();return}this.assistantStartSequence=Number((await(await d()).prepare("SELECT stream_message_seq FROM nodes WHERE node_id = ?").get(this.nodeId)).stream_message_seq)}if(r.type==="message_update"&&r.message.role==="assistant"&&this.openAssistant){const a=r.message.content;if(!Array.isArray(a))return;const o=a.at(-1);if(o&&typeof o=="object"&&"type"in o&&(o.type==="toolCall"?this.block={kind:"tool_call",name:"name"in o&&typeof o.name=="string"?o.name:""}:(o.type==="text"||o.type==="thinking")&&(this.block={kind:o.type})),!await this.writeStream(null,this.block,!0)){this.close();return}const f=a.filter(u=>u?.type==="thinking").map(u=>u.thinking).join(""),_=a.filter(u=>u?.type==="text").map(u=>u.text).join(""),k=f.startsWith(this.thinking)?f.slice(this.thinking.length):f,L=_.startsWith(this.output)?_.slice(this.output.length):_;this.thinking=f,this.output=_,this.pendingThinking+=k,this.pendingOutput+=L,(this.pendingThinking||this.pendingOutput)&&!this.flushTimer&&(this.flushTimer=setTimeout(()=>{this.flushDeltas().catch(u=>c({level:"error",event:"daemon.runs.observer_failed",node_id:this.nodeId,error:u}))},B),this.flushTimer.unref())}r.type==="message_end"&&r.message.role==="assistant"&&(await this.flushDeltas(),this.openAssistant=!1,this.block=null,await this.writeStream(null,null))}},"handleFrame");s.on("frame",r=>{this.frames=this.frames.then(()=>n(r)).catch(a=>{this.close(),c({level:"error",event:"daemon.runs.observer_failed",node_id:this.nodeId,error:a})})}),s.on("error",()=>{}),s.on("close",()=>{this.client===s&&(this.client=void 0,this.discardDeltas(),this.openAssistant=!1,this.block=null,this.released=this.released.then(async()=>{await this.writeStream(null,null)}).catch(()=>{}))}),s.connect()}async flushDeltas(){this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=void 0;const e=this.pendingThinking,i=this.pendingOutput;if(this.pendingThinking="",this.pendingOutput="",!this.openAssistant||!e&&!i)return;(await w(this.nodeId,this.owner,async()=>{if(await(await d()).prepare("SELECT 1 FROM run_events WHERE run_id = ? AND node_id = ? AND sequence_number >= ? AND type IN ('node.output_text.done', 'node.thinking.done', 'usage') LIMIT 1").get(this.runId,this.nodeId,this.assistantStartSequence)){this.openAssistant=!1;return}e&&await g(this.runId,this.nodeId,"node.thinking.delta",{delta:e}),i&&await g(this.runId,this.nodeId,"node.output_text.delta",{delta:i})})).held||this.close()}discardDeltas(){this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=void 0,this.pendingThinking="",this.pendingOutput=""}close(){if(this.closed)return;this.closed=!0,this.discardDeltas(),clearInterval(this.timer),p.delete(this.nodeId),this.released=this.released.then(async()=>{await this.writeStream(null,null),await O(h,this.nodeId,this.owner)}).then(()=>{}).catch(i=>{c({level:"error",event:"daemon.runs.observer_release_failed",node_id:this.nodeId,error:i})});const e=this.client;this.client=void 0,e?.close()}}async function Y(t){const e=await N(t);if(e===null)return new D(t,{recordsViewerFaults:!1});const i=await H(e.runner).viewerAddress(e);return i.kind==="unix"?new D(t,{recordsViewerFaults:!1}):new q(t,()=>W(i.url,i.headers))}l(Y,"viewTransport");async function ue(t){const e=await(await d()).prepare("SELECT stream_message_seq FROM node_rows WHERE node_id = ? AND pi_pid IS NOT NULL").get(t);return e?.stream_message_seq==null?null:Number(e.stream_message_seq)}l(ue,"openAssistantMessageStartSequence");async function ce(t){const e=await(await d()).prepare("SELECT stream_message_seq, stream_block FROM node_rows WHERE node_id = ? AND pi_pid IS NOT NULL").get(t);return e?.stream_message_seq==null||e.stream_block===null?null:JSON.parse(e.stream_block)}l(ce,"openAssistantBlock");async function he(){const t=[...p.values()];for(const e of t)e.close();await Promise.all(t.map(e=>e.settlePoll())),await Promise.all([...m.values()].map(e=>e.catch(()=>{})))}l(he,"closeRunObserversForTests");async function T(t){return await(await d()).prepare("SELECT 1 FROM nodes WHERE node_id = ? AND run_id = ? AND event_cursor IS NOT NULL").get(t,t)!==void 0}l(T,"runRootExists");const m=new Map;async function I(t,e){const i=m.get(t);if(i)return i;if(p.has(t))return;const s=$(t,e).finally(()=>m.delete(t));return m.set(t,s),s}l(I,"ensureRunObserver");async function $(t,e){if(!await T(e))return;const i=y();if(await F(h,t,i,E)!==void 0)try{if(t!==e){const s=await R(t);if(!await(await d()).prepare("SELECT 1 FROM run_events WHERE run_id = ? AND node_id = ? AND type = 'child.started' LIMIT 1").get(e,t)&&s&&Date.now()-Date.parse(s.created)<720*60*6e4&&!(await w(t,i,()=>g(e,t,"child.started",{child_node_id:t,kind:s.kind}))).held)return}await v.start(t,e,i)}catch(s){throw await O(h,t,i).catch(()=>{}),s}}l($,"startRunObserver");async function pe(){const t=new Date(Date.now()-2592e6).toISOString(),e=await(await d()).prepare(`SELECT n.node_id, n.run_id, n.pi_pid, COALESCE(n.outcome_revision, 1) AS revision, e.body_json
|
|
3
3
|
FROM node_rows n
|
|
4
4
|
LEFT JOIN run_events e ON n.pi_pid IS NULL AND e.run_id = n.run_id AND e.node_id = n.node_id
|
|
5
5
|
AND e.type = CASE WHEN n.node_id = n.run_id THEN 'node.settled' ELSE 'child.settled' END
|
|
6
|
-
WHERE n.run_id IS NOT NULL AND (n.pi_pid IS NOT NULL OR (n.outcome_at IS NOT NULL AND n.outcome_at > ? AND n.outcome_reason != 'parked'))`).all(
|
|
6
|
+
WHERE n.run_id IS NOT NULL AND (n.pi_pid IS NOT NULL OR (n.outcome_at IS NOT NULL AND n.outcome_at > ? AND n.outcome_reason != 'parked'))`).all(t),i=new Map;for(const n of e){const r=i.get(n.node_id)??{node_id:n.node_id,run_id:n.run_id,reported:!1};n.body_json!==null&&JSON.parse(n.body_json).outcome?.revision===n.revision&&(r.reported=!0),i.set(n.node_id,r)}const s=[...i.values()].filter(n=>!n.reported);for(const n of s)try{await I(n.node_id,n.run_id),S.delete(n.node_id)}catch(r){G(n.node_id,r)}}l(pe,"pollRunObservers");const S=new Map;function G(t,e){const i=e instanceof Error?e.message:String(e);S.get(t)!==i&&(S.set(t,i),c({level:"error",event:"daemon.runs.observer_failed",node_id:t,error:e}))}l(G,"reportObserverFailure");export{he as closeRunObserversForTests,I as ensureRunObserver,ce as openAssistantBlock,ue as openAssistantMessageStartSequence,pe as pollRunObservers};
|
package/dist/shared/env.d.ts
CHANGED
|
@@ -11,6 +11,11 @@ export declare function launchSnapshotFile(dir: string): string | undefined;
|
|
|
11
11
|
export declare function sandboxCliNodeId(): string | undefined;
|
|
12
12
|
/** A Linux app command uses its mounted launch snapshot, not host user stores. */
|
|
13
13
|
export declare function isSandboxedNode(): boolean;
|
|
14
|
+
/** True when this CLI reaches `/v1` through its broker's CLI relay to a remote control plane: the broker exports `CRTR_API_URL` (an
|
|
15
|
+
* http(s) URL, the fleet launcher's) and `CRTR_API_SOCKET` (the relay it serves). It chooses only where this process gets provider command
|
|
16
|
+
* descriptions (`GET /v1/providers/tools` through that relay); the relay's node token stays the authority. It is not `isSandboxedNode()`,
|
|
17
|
+
* which gates owner-only commands and launch-snapshot reads on a Linux launcher mount. */
|
|
18
|
+
export declare function providerProjectionOverBrokerRelay(): boolean;
|
|
14
19
|
/** The app that owns the current node, supplied in its broker launch identity. */
|
|
15
20
|
export declare function envGrantee(): string | undefined;
|
|
16
21
|
/** Set to '1' by `nodeEnv` for an app-started run's brokers, which admit inbox
|
package/dist/shared/env.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var p=Object.defineProperty;var
|
|
2
|
-
`).map(o=>o.split(" ")[4])),t=
|
|
1
|
+
var p=Object.defineProperty;var e=(n,r)=>p(n,"name",{value:r,configurable:!0});import{lstatSync as T,readFileSync as c,readdirSync as f}from"node:fs";import{join as i}from"node:path";import{covers as _}from"@north-light/identity";function W(){return process.env.CRTR_NODE_ID}e(W,"envNodeId");function d(n){for(const r of["broker-launch.json","cron-launch.json"]){const t=i(n,r);if(T(t,{throwIfNoEntry:!1})?.isFile())return t}}e(d,"launchSnapshotFile");function E(){if(process.platform==="linux")try{const n="/run/crtr/nodes",r=new Set(c("/proc/self/mountinfo","utf8").split(`
|
|
2
|
+
`).map(o=>o.split(" ")[4])),t=f(n,{withFileTypes:!0}).filter(o=>o.isDirectory()&&/^[a-zA-Z0-9][a-zA-Z0-9-]{0,127}$/.test(o.name)&&r.has(i(n,o.name))&&d(i(n,o.name))!==void 0);return t.length===1?t[0].name:void 0}catch{return}}e(E,"sandboxCliNodeId");function F(){return E()!==void 0}e(F,"isSandboxedNode");function h(){return/^https?:\/\//.test(process.env.CRTR_API_URL??"")&&(process.env.CRTR_API_SOCKET??"")!==""}e(h,"providerProjectionOverBrokerRelay");function H(){return process.env.CRTR_GRANTEE}e(H,"envGrantee");const v="CRTR_INBOX_BETWEEN_TURNS";function K(){return process.env[v]==="1"}e(K,"envInboxBetweenTurns");const C="CRTR_SCOPES_FILE";function k(){const n=process.env[C];if(n!==void 0&&n!==""){const t=JSON.parse(c(n,"utf8"));if(!Array.isArray(t)||t.some(o=>typeof o!="string"))throw new Error(`invalid scopes file ${n}`);return t}const r=process.env.CRTR_SCOPES;return r===void 0?null:r===""?[]:r.split(",")}e(k,"envScopes");function y(n,r){return n==null?!0:a(n,r)}e(y,"scopeAllowed");function a(n,r){return n.includes(r)?(_(r,r),!0):n.some(t=>_(t,r))}e(a,"coveredByAny");function G(){return process.env.CRTR_EXECUTION_ID}e(G,"envExecutionId");function b(){return process.env.CRTR_PROFILE_ID}e(b,"envProfileId");function w(){return process.env.CRTR_NODE_CWD}e(w,"envNodeCwd");function g(){return process.env.CRTR_MODEL_INTENT}e(g,"envModelIntent");function V(){return process.env.CRTR_MODEL_EXACT==="1"}e(V,"envModelExact");function X(){return process.env.CRTR_HOME}e(X,"envHomeOverride");function j(){return process.env.CRTR_RUNTIME_HOME}e(j,"envRuntimeHomeOverride");function s(n,r){if(n===void 0)return r;const t=Number(n);return Number.isFinite(t)&&t>0?t:r}e(s,"parsePositiveMs");const A=5*6e4;function Y(){return s(process.env.CRTR_STREAM_WATCHDOG_MS,A)}e(Y,"envStreamWatchdogMs");const S=800;function $(){return s(process.env.CRTR_WATCHER_TICK_MS,S)}e($,"envWatcherTickMs");const M=6e4;function z(){return s(process.env.CRTR_WATCHER_BACKSTOP_MS,M)}e(z,"envWatcherBackstopMs");const N=1e3;function Z(){return s(process.env.CRTR_WATCHER_DEBOUNCE_MS,N)}e(Z,"envWatcherDebounceMs");const x=6e4;function J(){return s(process.env.CRTR_RECAP_IDLE_MS,x)}e(J,"envRecapIdleMs");function q(){const n=process.env.CRTR_RECAP_MODEL;return n!==void 0&&n.trim()!==""?n.trim():void 0}e(q,"envRecapModelOverride");const D=300*1e3;function Q(){return s(process.env.CRTR_BASH_VALVE_MS,D)}e(Q,"envBashValveMs");const O=60*1e3;function ee(){return s(process.env.CRTR_BASH_AUTO_BG_DEADLINE_MS,O)}e(ee,"envBashAutoBgDeadlineMs");function ne(){const n=process.env.CRTR_PIDFILE;return n!==void 0&&n!==""?n:void 0}e(ne,"envPidfileOverride");const I="@earendil-works/pi-coding-agent";function re(){return process.env.CRTR_BROKER_ENGINE??I}e(re,"envBrokerEngine");function te(){return process.env.CRTR_PI_BINARY}e(te,"envPiBinaryOverride");function oe(){return process.env.CRTR_NO_DAEMON_AUTOSTART==="1"}e(oe,"envNoDaemonAutostart");function se(){const n=process.env.CRTR_DOCUMENT_PORT;if(n===void 0||!/^\d+$/.test(n))return;const r=Number(n);return r<=65535?r:void 0}e(se,"envDocumentPort");function ue(){return process.env.CRTRD_TCP}e(ue,"envCrtrdTcp");function ie(){const n=process.env.CRTRD_TOKEN;return n!==void 0&&n!==""?n:void 0}e(ie,"envCrtrdToken");function ce(){return process.env.CRTR_NO_EXPORTS==="1"}e(ce,"envNoExports");function _e(){return process.env.CRTR_DEBUG==="1"}e(_e,"envDebug");function R(n){if(n===void 0||n==="")return;const r=Number(n);return Number.isSafeInteger(r)&&r>=1?r:void 0}e(R,"parsePositiveInteger");function Re(){return R(process.env.CRTR_MAX_LIVE_BROKERS)}e(Re,"envMaxLiveBrokers");function pe(){return R(process.env.CRTR_WARN_LIVE_BROKERS)}e(pe,"envWarnLiveBrokers");function u(n){if(n===void 0)return;const r=Number(n);return Number.isFinite(r)&&r>0?r:void 0}e(u,"parsePositiveMsNoDefault");function Te(){return u(process.env.CRTR_TEST_NODE_SOCKET_WINDOW_MS)}e(Te,"envTestNodeSocketWindowMs");function fe(){return u(process.env.CRTR_TEST_UNATTENDED_PARK_MS)}e(fe,"envTestUnattendedParkMs");function de(){return u(process.env.CRTR_UNATTENDED_PARK_MS)}e(de,"envUnattendedParkMs");function Ee(){return u(process.env.CRTR_BASH_SILENCE_MS)??15*6e4}e(Ee,"envBashSilenceMs");function l(){return u(process.env.CRTR_TEST_PARK_SUMMARY_GRACE_MS)}e(l,"envTestParkSummaryGraceMs");const m=5*6e4;function ve(){return l()??m}e(ve,"parkSummaryGraceMs");export{v as INBOX_BETWEEN_TURNS_ENV,C as SCOPES_FILE_ENV,a as coveredByAny,ee as envBashAutoBgDeadlineMs,Ee as envBashSilenceMs,Q as envBashValveMs,re as envBrokerEngine,ue as envCrtrdTcp,ie as envCrtrdToken,_e as envDebug,se as envDocumentPort,G as envExecutionId,H as envGrantee,X as envHomeOverride,K as envInboxBetweenTurns,Re as envMaxLiveBrokers,V as envModelExact,g as envModelIntent,oe as envNoDaemonAutostart,ce as envNoExports,w as envNodeCwd,W as envNodeId,te as envPiBinaryOverride,ne as envPidfileOverride,b as envProfileId,J as envRecapIdleMs,q as envRecapModelOverride,j as envRuntimeHomeOverride,k as envScopes,Y as envStreamWatchdogMs,Te as envTestNodeSocketWindowMs,l as envTestParkSummaryGraceMs,fe as envTestUnattendedParkMs,de as envUnattendedParkMs,pe as envWarnLiveBrokers,z as envWatcherBackstopMs,Z as envWatcherDebounceMs,$ as envWatcherTickMs,F as isSandboxedNode,d as launchSnapshotFile,ve as parkSummaryGraceMs,h as providerProjectionOverBrokerRelay,E as sandboxCliNodeId,y as scopeAllowed};
|