@north-light/crouter 0.3.322 → 0.3.324

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/bin/progress-painter.mjs +89 -0
  2. package/bin/runtime-selector.mjs +79 -9
  3. package/dist/api/client.d.ts +6 -2
  4. package/dist/api/client.js +2 -2
  5. package/dist/api/dto/broker-ops.d.ts +9 -0
  6. package/dist/api/dto/canvas.d.ts +23 -1
  7. package/dist/api/dto/nodes.d.ts +8 -0
  8. package/dist/api/node-transport.js +1 -1
  9. package/dist/api/routes.d.ts +2 -0
  10. package/dist/api/routes.js +1 -1
  11. package/dist/clients/attach/chrome/canvas-panels.js +1 -1
  12. package/dist/clients/attach/overlays/graph.d.ts +6 -5
  13. package/dist/clients/attach/overlays/graph.js +1 -1
  14. package/dist/clients/attach/viewer.js +536 -536
  15. package/dist/commands/node/create.js +3 -3
  16. package/dist/commands/sys/panels/plugins-panel.js +1 -1
  17. package/dist/commands/sys/panels/provider-panel.d.ts +4 -0
  18. package/dist/commands/sys/panels/provider-panel.js +1 -1
  19. package/dist/commands/sys/setup-core.js +7 -4
  20. package/dist/commands/sys/setup-wizard.d.ts +1 -1
  21. package/dist/commands/sys/setup-wizard.js +1 -1
  22. package/dist/core/canvas/canvas.d.ts +24 -0
  23. package/dist/core/canvas/canvas.js +29 -15
  24. package/dist/core/canvas/migrations.js +35 -32
  25. package/dist/core/canvas/nav-model.d.ts +1 -1
  26. package/dist/core/canvas/nav-model.js +1 -1
  27. package/dist/core/canvas/nav-render.d.ts +31 -25
  28. package/dist/core/canvas/nav-render.js +1 -1
  29. package/dist/core/canvas/render-source.d.ts +6 -16
  30. package/dist/core/canvas/render-source.js +9 -9
  31. package/dist/core/canvas/types.d.ts +16 -0
  32. package/dist/core/provider-credential.d.ts +6 -0
  33. package/dist/core/provider-credential.js +1 -0
  34. package/dist/core/runtime/boot-root.d.ts +2 -0
  35. package/dist/core/runtime/boot-root.js +5 -1
  36. package/dist/core/runtime/broker/daemon-ops.d.ts +2 -1
  37. package/dist/core/runtime/broker/daemon-ops.js +1 -1
  38. package/dist/core/runtime/front-door-login.d.ts +2 -0
  39. package/dist/core/runtime/front-door-login.js +1 -0
  40. package/dist/core/runtime/front-door.js +7 -5
  41. package/dist/core/runtime/nerd-font.d.ts +19 -1
  42. package/dist/core/runtime/nerd-font.js +2 -2
  43. package/dist/core/runtime/progress-bar.d.ts +13 -0
  44. package/dist/core/runtime/progress-bar.js +2 -0
  45. package/dist/core/runtime/provider-credential-gate.d.ts +4 -0
  46. package/dist/core/runtime/provider-credential-gate.js +2 -0
  47. package/dist/core/runtime/spawn-env.d.ts +7 -0
  48. package/dist/core/runtime/spawn-env.js +1 -1
  49. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  50. package/dist/daemon/api/handlers/canvas.js +4 -4
  51. package/dist/daemon/api/map.d.ts +15 -1
  52. package/dist/daemon/api/map.js +2 -2
  53. package/dist/daemon/fleet.js +1 -1
  54. package/dist/pi-extensions/canvas-stophook.js +1 -1
  55. package/package.json +1 -1
  56. package/runtime.lock.json +5 -5
  57. package/scripts/install-runtime.mjs +7 -3
@@ -1,2 +1,2 @@
1
- var m=Object.defineProperty;var o=(e,t)=>m(e,"name",{value:t,configurable:!0});import{existsSync as h,readFileSync as v}from"node:fs";import{join as g}from"node:path";import{outputResultPath as b}from"../../core/runtime/structured-output.js";import{ReviewOperationError as u}from"../../core/review/types.js";import{cronSinkDisplay as k}from"../../core/canvas/crons.js";import{isProfilePaused as l,sanitizeProfileMetadata as x}from"../../core/profiles/manifest.js";import{contextDir as y,nodeDir as O,nodeMetaPath as D,reportsDir as c,transcriptPath as T,viewSocketPath as S}from"../../core/canvas/paths.js";import{FinalizationError as R}from"../../core/feed/feed.js";import{NodeIdConflictError as A}from"../../core/runtime/nodes.js";import{readContextTokens as E}from"../../core/canvas/telemetry.js";import{CrtrError as s}from"../../core/errors.js";import{WorktreeError as N}from"../../core/worktree.js";import{ApiError as z}from"../../api/errors.js";import{ExitCode as d}from"../../types.js";function se(e,t){const{discovery:i,snapshots:r}=e;return{profiles:e.profiles,stores:i.stores.length,changed:e.changed,applied:e.applied,skipped:e.skipped,blockers:e.blockers.map(n=>({kind:n.kind,message:n.message,...n.storeRoot===void 0?{}:{store:n.storeRoot},...n.targetId===void 0?{}:{target:n.targetId},...n.path===void 0?{}:{path:n.path},...n.name===void 0?{}:{name:n.name},...n.paths===void 0?{}:{paths:n.paths}})),discovery_roots:i.roots.map(n=>({reason:n.reason,root:n.root,boundary:n.boundary,...n.detail===void 0?{}:{detail:n.detail}})),discovered_stores:i.stores.map(n=>({store:n.key,scope:n.descriptor.scope,namespace:n.descriptor.namespace,mount_status:n.descriptor.mountStatus,writable:n.writable,reasons:[...new Set(n.discovery.map(a=>a.reason))],targets:n.targets,docs:r.get(n.key)?.docs.length??0})),discovered_targets:i.targets.map(n=>({id:n.id,kind:n.kind,origin:n.origin,cwd:n.target.cwd,profile_id:n.target.profileId,node_id:n.target.nodeId,stores:n.storeKeys})),repository_namespaces:e.repositories.map(n=>({repository_root:n.repositoryRoot,repository_key:n.repositoryKey,declaration_path:n.declarationPath,namespace:n.namespace,source:n.source,action:n.action})),store_prefixes:e.storePrefixes.map(n=>({store_root:n.storeRoot,owner_dir:n.ownerDir,repository_root:n.repositoryRoot,owner_relative_path:n.ownerRelativePath,old_prefix:n.oldPrefix,old_rule:n.oldRule,effective_prefix:n.effectivePrefix,nested_declaration_action:n.nestedDeclarationAction,front_door_action:n.frontDoorAction})),renames:e.renames.map(n=>({store_root:n.storeRoot,path:n.path,from:n.from,to:n.to})),references:e.references.map(n=>({store_root:n.storeRoot,path:n.path,kind:n.kind,from:n.from,to:n.to})),dryRun:e.dryRun,blocked:e.blocked,corpus_phase:e.corpusPhase,wrote:{profile_manifests:e.wrote.profileManifests,documents:e.wrote.documents,corpus_consumers:e.wrote.corpusConsumers,corpus_identities:e.wrote.corpusIdentities},resumed:t.resumed,...t.resumeError===void 0?{}:{resume_error:t.resumeError}}}o(se,"toMigrateStateDTO");function C(e){const t=b(e);try{return h(t)?JSON.parse(v(t,"utf8")):null}catch{return null}}o(C,"readStructuredResult");function P(e){return e.outcome_at===null||e.outcome_at===void 0||e.outcome_kind===null||e.outcome_kind===void 0||e.outcome_reason===null||e.outcome_reason===void 0?null:{kind:e.outcome_kind,reason:e.outcome_reason,settled_at:e.outcome_at}}o(P,"toNodeOutcomeSummaryDTO");function j(e){if(e.outcome_at===null||e.outcome_at===void 0||e.outcome_kind===null||e.outcome_kind===void 0||e.outcome_reason===null||e.outcome_reason===void 0)return null;let t=null;if(e.outcome_detail_json!==null&&e.outcome_detail_json!==void 0)try{t=JSON.parse(e.outcome_detail_json)}catch{t=null}const i=e.final_report??null,r={node_id:e.node_id,revision:e.outcome_revision??1,settled_at:e.outcome_at,final_report:i,final_report_path:i===null?null:`${c(e.node_id)}/${i}`,structured_result:e.outcome_kind==="result"?C(e.node_id):null,detail:t};return e.outcome_kind==="result"?{...r,kind:"result",reason:e.outcome_reason,declined:null}:e.outcome_reason==="declined"?{...r,kind:"failure",reason:"declined",declined:t?.declined??null}:{...r,kind:"failure",reason:e.outcome_reason,declined:null}}o(j,"toNodeOutcomeDTO");function _e(e){const t=e.lastFailure;return{node_id:e.nodeId,state:e.state,action:e.actionName,attempt:e.attempt,next_attempt_at:e.nextAttemptAt===0?null:new Date(e.nextAttemptAt).toISOString(),accepted_at:e.acceptedAt===null?null:new Date(e.acceptedAt).toISOString(),permanent_failed_at:e.permanentFailedAt===null?null:new Date(e.permanentFailedAt).toISOString(),last_failure:t===null?null:{kind:t.kind,...t.exitCode===void 0?{}:{exit_code:t.exitCode},...t.signal===void 0?{}:{signal:t.signal},...t.message===void 0?{}:{message:t.message}},created_at:new Date(e.createdAt).toISOString(),updated_at:new Date(e.updatedAt).toISOString()}}o(_e,"toOutcomeDeliveryDTO");function ue(e){return{node_id:e.node_id,name:e.name,description:e.description,cycles:e.cycles,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind,profile_id:e.profile_id,profile_paused:l(e.profile_id),parent:e.parent,created:e.created,intent:e.intent,waiting_for:e.waiting_for,frozen_at:e.frozen_at??null,terminal_reason:e.terminal_reason??null,pi_pid:e.pi_pid,pi_pid_identity:e.pi_pid_identity,window:e.window,tmux_session:e.tmux_session,pane:e.pane,final_report:e.final_report??null,finalized_at:e.finalized_at??null,deadline_at:e.deadline_at??null,outcome:P(e),fault:e.fault&&e.fault.link!=="broker\u2194crtrd"?{...e.fault,link:e.fault.link}:null,streaming:e.streaming??!1}}o(ue,"toNodeSummaryDTO");function I(e,t){return{parent:e.parent??null,spawned_by:e.spawned_by??null,subscribes_to:t.subscribesTo.map(i=>i.node_id),subscribers:t.subscribers.map(i=>i.node_id),children:[...t.children]}}o(I,"toNodeEdgesDTO");function q(e){return{node_dir:O(e),context_dir:y(e),reports_dir:c(e),meta_path:D(e),transcript_path:T(e),view_socket:S(e)}}o(q,"toNodePathsDTO");function F(e){const t={state:e.state,path:e.path,branch:e.branch,repo_root:e.repo_root,base_ref:e.base_ref,base_sha:e.base_sha,created:e.created};return e.cleanup!==void 0&&(t.cleanup=e.cleanup),e.closed!==void 0&&(t.closed=e.closed),e.abandoned!==void 0&&(t.abandoned={...e.abandoned}),t}o(F,"toNodeWorktreeDTO");function le(e,t){const i={node_id:e.node_id,name:e.name,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind??null,profile_id:e.profile_id??null,profile_paused:l(e.profile_id),parent:e.parent??null,created:e.created,intent:e.intent??null,waiting_for:e.waiting_for??null,frozen_at:e.frozen_at??null,terminal_reason:e.terminal_reason??null,pi_pid:e.pi_pid??null,pi_pid_identity:e.pi_pid_identity??null,window:e.window??null,tmux_session:e.tmux_session??null,pane:e.pane??null,final_report:e.final_report??null,finalized_at:e.finalized_at??null,deadline_at:e.deadline_at??null,outcome:j(e),fault:e.fault&&e.fault.link!=="broker\u2194crtrd"?{...e.fault,link:e.fault.link}:null,streaming:e.streaming??!1,creator:e.creator??null,edges:I(e,t),paths:q(e.node_id)};return e.description!==void 0&&(i.description=e.description),e.title!==void 0&&(i.title=e.title),e.icon!==void 0&&(i.icon=e.icon),e.cycles!==void 0&&(i.cycles=e.cycles),i.context_tokens=E(e.node_id),e.pi_session_id!==void 0&&(i.pi_session_id=e.pi_session_id??null),i.model_override=e.model_override??null,e.pi_session_file!==void 0&&(i.pi_session_file=e.pi_session_file??null),e.review_binding!==void 0&&(i.review_binding=e.review_binding===null?null:{...e.review_binding.kind===void 0?{}:{kind:e.review_binding.kind},review_id:e.review_binding.review_id,origin_node_id:e.review_binding.origin_node_id,branch_file:e.review_binding.branch_file,target_file:e.review_binding.target_file}),e.managed_worktree!=null&&(i.worktree=F(e.managed_worktree)),i}o(le,"toNodeDetailDTO");function ce(e,t,i){return{node_id:e,revived:t.launch!==void 0,resumed:t.resumed,status:i,outcome:t.outcome}}o(ce,"toReviveResultDTO");function pe(e){return{root:e.root,closed:[...e.closed],spared:[...e.spared]}}o(pe,"toCloseResultDTO");function fe(e,t,i){const r={report_path:e.reportPath,notified:[...e.deliveredTo]};return t!==void 0&&(r.transitioned=t),i!==void 0&&(r.worktree_auto_dropped=!0,r.worktree_auto_dropped_path=i),r}o(fe,"toReportResultDTO");function me(e){return{node_id:e.node_id,active:e.active,created:e.created}}o(me,"toSubscriptionDTO");function M(e){if(e===null||e==="")return[];try{const t=JSON.parse(e);return typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t):[]}catch{return[]}}o(M,"envKeys");function he(e,t){return{cron_id:e.cron_id,name:e.name,created_by:e.created_by,command:e.command,fire_at:e.fire_at,recur:e.recur,tz:e.tz,expires_at:e.expires_at,anchor_node:e.anchor_node,cancel_on_wake:e.cancel_on_wake,cwd:e.cwd,profile:e.profile,scope:e.scope,env_keys:M(e.env_json),run_timeout_s:e.run_timeout_s,overlap:e.overlap,on_output:e.on_output,sink:k(e.sink),tier:e.tier,state:e.state,held:e.held,run_state:e.run_state,last_run:t==null?null:{finished:t.finished,exit_code:t.exit_code,delivered:t.delivered},created:e.created,updated:e.updated}}o(he,"toCronDTO");function ve(e){return{run_id:e.run_id,started:e.started,finished:e.finished,duration_ms:e.duration_ms,exit_code:e.exit_code,stdout_head:e.stdout_head,stderr_head:e.stderr_head,delivered:e.delivered}}o(ve,"toCronRunDTO");function ge(e){return{id:e.profileId,name:e.manifest.name,projects:e.manifest.projects.map(t=>({...t})),home:e.manifest.home,paused_at:e.manifest.paused_at,default_kind:e.manifest.default_kind??"general",metadata:x(e.manifest.metadata),default_dir:null}}o(ge,"toProfileDTO");function p(e,t={}){const i={review_id:e.review_id,origin_kind:e.origin_kind,origin_node_id:e.origin_node_id,review_dir:e.review_dir,companion_node_id:e.companion_node_id,file:e.file,state:e.state,created:e.created,source_missing:e.source_missing,anchor_base_sha256:e.anchor_base_sha256};return e.opened_at!==null&&(i.opened_at=e.opened_at),e.submit_requested_at!==null&&(i.submit_requested_at=e.submit_requested_at),e.approved_at!==null&&(i.approved_at=e.approved_at),e.changed!==null&&(i.changed=e.changed),e.comments_total!==null&&(i.comments_total=e.comments_total),e.comments_unresolved!==null&&(i.comments_unresolved=e.comments_unresolved),e.canceled_at!==null&&(i.canceled_at=e.canceled_at),e.cancel_reason!==null&&(i.cancel_reason=e.cancel_reason),e.cancel_actor!==null&&(i.cancel_actor=e.cancel_actor),t.result_path!==void 0&&(i.result_path=t.result_path),e.delivery_error!==null&&(i.delivery_error=e.delivery_error),e.projection_error!==null&&(i.projection_error=e.projection_error),i}o(p,"toReviewDTO");function be(e){return{comment_id:e.comment_id,review_id:e.review_id,status:e.status,revision:e.revision,text:e.text,anchor:{...e.anchor},anchor_state:e.anchor_state,anchor_line_text:e.anchor_line_text,anchor_doc_hash:e.anchor_doc_hash,author:{kind:e.author.kind,...e.author.node_id===null?{}:{node_id:e.author.node_id}},updated_by:{kind:e.updated_by.kind,...e.updated_by.node_id===null?{}:{node_id:e.updated_by.node_id}},created_at:e.created_at,updated_at:e.updated_at,...e.resolved_at===null?{}:{resolved_at:e.resolved_at},...e.deleted_at===null?{}:{deleted_at:e.deleted_at},created_seq:e.created_seq}}o(be,"toReviewCommentDTO");function U(e){return{id:e.id,quote:e.quote,...e.context===void 0?{}:{context:e.context},note:e.note,status:e.status,created_at:e.createdAt,...e.resolvedAt===void 0?{}:{resolved_at:e.resolvedAt}}}o(U,"toPageFeedbackCommentDTO");function ke(e){return{companion_node_id:e.companionNodeId??null,open_count:e.comments.filter(t=>t.status==="open").length,comments:e.comments.map(U)}}o(ke,"toPageFeedbackDTO");function xe(e){return{seq:e.seq,review_id:e.review_id,comment_id:e.comment_id,kind:e.kind,state_change:e.state_change===1,revision_after:e.revision_after,actor:{kind:e.actor.kind,...e.actor.node_id===null?{}:{node_id:e.actor.node_id}},at:e.at,operation_id:e.operation_id,...e.payload===void 0?{}:{payload:e.payload}}}o(xe,"toReviewCommentEventDTO");function ye(e){return{file:e.file,submitted:e.submitted,approved:e.approved,comments:e.comments.map(i=>({...i})),submittedAt:e.submittedAt,savedAt:e.savedAt,reviewId:e.review_id,changed:e.changed,baselineSha256:e.baseline_sha256,approvedSha256:e.approved_sha256,companionNodeId:e.companion_node_id,commentsTotal:e.comments_total,commentsUnresolved:e.comments_unresolved}}o(ye,"toFeedbackResultDTO");const G=!0,K=Object.freeze({review_origin_missing:{status:400,code:"review_origin_unavailable"},review_origin_unforkable:{status:400,code:"review_origin_unavailable"},review_origin_unstable:{status:409,code:"review_origin_unstable"},review_branch_unavailable:{status:409,code:"review_branch_unavailable"},branch_lost:{status:409,code:"review_branch_unavailable"},review_companion_unbound:{status:409,code:"review_companion_unbound"},review_bridge_unsubscribed:{status:409,code:"review_bridge_unavailable"},review_target_unreviewable:{status:400,code:"review_file_unreadable"},source_unreadable:{status:409,code:"review_source_unreadable"},delivery_unroutable:{status:409,code:"review_delivery_unroutable"},unknown_review:{status:404,code:"unknown_review"},review_terminal:{status:409,code:"review_terminal_conflict"},review_required:{status:400,code:"review_required"},stale_document:{status:409,code:"stale_document"},unknown_comment:{status:404,code:"unknown_comment"},comment_deleted:{status:409,code:"comment_deleted"},invalid_anchor:{status:400,code:"invalid_anchor"},anchor_out_of_range:{status:400,code:"anchor_out_of_range"},text_too_long:{status:400,code:"text_too_long"},comment_limit_reached:{status:409,code:"comment_limit_reached"},stale_comment:{status:409,code:"stale_comment"},range_batch_incomplete:{status:409,code:"range_batch_incomplete"},range_batch_stale:{status:409,code:"range_batch_stale"}});function w(e){const t=f(e);if(typeof t=="object"&&t!==null&&typeof t.status=="number"&&typeof t.code=="string")return{status:t.status,code:t.code};if(t instanceof R)return t.code==="unknown_node"?{status:404,code:"node_not_found"}:t.code==="already_finalized"?{status:409,code:"already_finalized"}:{status:409,code:"finalization_forbidden"};if(t instanceof A)return{status:409,code:"node_id_exists"};if(t instanceof u)return K[t.code];if(t instanceof s)return{status:$(t.exitCode),code:t.code};if(t instanceof Error){const i=t.message;if(/unknown node/i.test(i))return{status:404,code:"node_not_found"};if(/finalization latch/i.test(i))return{status:409,code:"already_finalized"};if(/illegal lifecycle transition/i.test(i))return{status:409,code:"illegal_transition"}}return{status:500,code:"internal"}}o(w,"errorToStatus");function f(e){if(!(e instanceof N))return e;const t=e.code==="unknown_node"?d.NOT_FOUND:d.GENERAL,i={error:e.code,message:e.message,next:e.next};return e.detail!==void 0&&(i.received=e.detail),new s(e.code,e.message,t,i)}o(f,"normalizeThrow");function L(e){if(e.code!=="review_terminal")return e.detail;const{review:t,...i}=e.detail;return{...i,review:W(t)}}o(L,"reviewErrorDetails");function W(e){return e.state!=="approved"?p(e):p(e,{result_path:g(e.review_dir,"result.json")})}o(W,"terminalConflictReviewDTO");function $(e){switch(e){case d.NOT_FOUND:return 404;case d.USAGE:return 400;case d.AMBIGUOUS:return 400;case d.NETWORK:return 503;case d.GENERAL:return 400;default:return 500}}o($,"statusForExitCode");function B(e){const i=(e instanceof Error?e.message:String(e)).split(`
2
- `,1)[0].trim();return i===""?"internal error":i.length>500?`${i.slice(0,497)}\u2026`:i}o(B,"boundedCause");function Oe(e){const t=f(e),{status:i,code:r}=w(t);if(i>=500)return{status:i,body:{error:{code:r,message:B(t)}}};const n=t instanceof Error?t.message:String(t),a=t instanceof u?L(t):(t instanceof s||t instanceof z)&&t.details!==void 0?t.details:void 0,_={error:{code:r,message:n}};return a!==void 0&&(_.error.details=a),{status:i,body:_}}o(Oe,"toErrorBody");export{K as REVIEW_ERROR_MAP,w as errorToStatus,pe as toCloseResultDTO,he as toCronDTO,ve as toCronRunDTO,Oe as toErrorBody,ye as toFeedbackResultDTO,se as toMigrateStateDTO,le as toNodeDetailDTO,I as toNodeEdgesDTO,j as toNodeOutcomeDTO,P as toNodeOutcomeSummaryDTO,q as toNodePathsDTO,ue as toNodeSummaryDTO,F as toNodeWorktreeDTO,_e as toOutcomeDeliveryDTO,U as toPageFeedbackCommentDTO,ke as toPageFeedbackDTO,ge as toProfileDTO,fe as toReportResultDTO,be as toReviewCommentDTO,xe as toReviewCommentEventDTO,p as toReviewDTO,ce as toReviveResultDTO,me as toSubscriptionDTO};
1
+ var m=Object.defineProperty;var o=(e,t)=>m(e,"name",{value:t,configurable:!0});import{existsSync as h,readFileSync as v}from"node:fs";import{join as g}from"node:path";import{outputResultPath as y}from"../../core/runtime/structured-output.js";import{ReviewOperationError as l}from"../../core/review/types.js";import{cronSinkDisplay as k}from"../../core/canvas/crons.js";import{isProfilePaused as u,sanitizeProfileMetadata as b}from"../../core/profiles/manifest.js";import{contextDir as x,nodeDir as O,nodeMetaPath as D,reportsDir as c,transcriptPath as T,viewSocketPath as S}from"../../core/canvas/paths.js";import{FinalizationError as R}from"../../core/feed/feed.js";import{NodeIdConflictError as A}from"../../core/runtime/nodes.js";import{CrtrError as s}from"../../core/errors.js";import{WorktreeError as E}from"../../core/worktree.js";import{ApiError as N}from"../../api/errors.js";import{ExitCode as d}from"../../types.js";function de(e,t){const{discovery:i,snapshots:r}=e;return{profiles:e.profiles,stores:i.stores.length,changed:e.changed,applied:e.applied,skipped:e.skipped,blockers:e.blockers.map(n=>({kind:n.kind,message:n.message,...n.storeRoot===void 0?{}:{store:n.storeRoot},...n.targetId===void 0?{}:{target:n.targetId},...n.path===void 0?{}:{path:n.path},...n.name===void 0?{}:{name:n.name},...n.paths===void 0?{}:{paths:n.paths}})),discovery_roots:i.roots.map(n=>({reason:n.reason,root:n.root,boundary:n.boundary,...n.detail===void 0?{}:{detail:n.detail}})),discovered_stores:i.stores.map(n=>({store:n.key,scope:n.descriptor.scope,namespace:n.descriptor.namespace,mount_status:n.descriptor.mountStatus,writable:n.writable,reasons:[...new Set(n.discovery.map(a=>a.reason))],targets:n.targets,docs:r.get(n.key)?.docs.length??0})),discovered_targets:i.targets.map(n=>({id:n.id,kind:n.kind,origin:n.origin,cwd:n.target.cwd,profile_id:n.target.profileId,node_id:n.target.nodeId,stores:n.storeKeys})),repository_namespaces:e.repositories.map(n=>({repository_root:n.repositoryRoot,repository_key:n.repositoryKey,declaration_path:n.declarationPath,namespace:n.namespace,source:n.source,action:n.action})),store_prefixes:e.storePrefixes.map(n=>({store_root:n.storeRoot,owner_dir:n.ownerDir,repository_root:n.repositoryRoot,owner_relative_path:n.ownerRelativePath,old_prefix:n.oldPrefix,old_rule:n.oldRule,effective_prefix:n.effectivePrefix,nested_declaration_action:n.nestedDeclarationAction,front_door_action:n.frontDoorAction})),renames:e.renames.map(n=>({store_root:n.storeRoot,path:n.path,from:n.from,to:n.to})),references:e.references.map(n=>({store_root:n.storeRoot,path:n.path,kind:n.kind,from:n.from,to:n.to})),dryRun:e.dryRun,blocked:e.blocked,corpus_phase:e.corpusPhase,wrote:{profile_manifests:e.wrote.profileManifests,documents:e.wrote.documents,corpus_consumers:e.wrote.corpusConsumers,corpus_identities:e.wrote.corpusIdentities},resumed:t.resumed,...t.resumeError===void 0?{}:{resume_error:t.resumeError}}}o(de,"toMigrateStateDTO");function z(e){const t=y(e);try{return h(t)?JSON.parse(v(t,"utf8")):null}catch{return null}}o(z,"readStructuredResult");function P(e){return e.outcome_at===null||e.outcome_at===void 0||e.outcome_kind===null||e.outcome_kind===void 0||e.outcome_reason===null||e.outcome_reason===void 0?null:{kind:e.outcome_kind,reason:e.outcome_reason,settled_at:e.outcome_at}}o(P,"toNodeOutcomeSummaryDTO");function C(e){if(e.outcome_at===null||e.outcome_at===void 0||e.outcome_kind===null||e.outcome_kind===void 0||e.outcome_reason===null||e.outcome_reason===void 0)return null;let t=null;if(e.outcome_detail_json!==null&&e.outcome_detail_json!==void 0)try{t=JSON.parse(e.outcome_detail_json)}catch{t=null}const i=e.final_report??null,r={node_id:e.node_id,revision:e.outcome_revision??1,settled_at:e.outcome_at,final_report:i,final_report_path:i===null?null:`${c(e.node_id)}/${i}`,structured_result:e.outcome_kind==="result"?z(e.node_id):null,detail:t};return e.outcome_kind==="result"?{...r,kind:"result",reason:e.outcome_reason,declined:null}:e.outcome_reason==="declined"?{...r,kind:"failure",reason:"declined",declined:t?.declined??null}:{...r,kind:"failure",reason:e.outcome_reason,declined:null}}o(C,"toNodeOutcomeDTO");function ae(e){const t=e.lastFailure;return{node_id:e.nodeId,state:e.state,action:e.actionName,attempt:e.attempt,next_attempt_at:e.nextAttemptAt===0?null:new Date(e.nextAttemptAt).toISOString(),accepted_at:e.acceptedAt===null?null:new Date(e.acceptedAt).toISOString(),permanent_failed_at:e.permanentFailedAt===null?null:new Date(e.permanentFailedAt).toISOString(),last_failure:t===null?null:{kind:t.kind,...t.exitCode===void 0?{}:{exit_code:t.exitCode},...t.signal===void 0?{}:{signal:t.signal},...t.message===void 0?{}:{message:t.message}},created_at:new Date(e.createdAt).toISOString(),updated_at:new Date(e.updatedAt).toISOString()}}o(ae,"toOutcomeDeliveryDTO");function se(e){return{node_id:e.node_id,name:e.name,description:e.description,cycles:e.cycles,kind:e.kind,status:e.status,frozen_at:e.frozen_at,pi_pid:e.pi_pid,telemetry_context_tokens:e.telemetry_context_tokens,telemetry_last_activity:e.telemetry_last_activity,fault:e.fault&&e.fault.link!=="broker\u2194crtrd"?{...e.fault,link:e.fault.link}:null,streaming:e.streaming}}o(se,"toGraphNodeDTO");function _e(e){return{node_id:e.node_id,name:e.name,description:e.description,cycles:e.cycles,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind,profile_id:e.profile_id,profile_paused:u(e.profile_id),parent:e.parent,created:e.created,intent:e.intent,waiting_for:e.waiting_for,frozen_at:e.frozen_at??null,terminal_reason:e.terminal_reason??null,pi_pid:e.pi_pid,pi_pid_identity:e.pi_pid_identity,window:e.window,tmux_session:e.tmux_session,pane:e.pane,final_report:e.final_report??null,finalized_at:e.finalized_at??null,deadline_at:e.deadline_at??null,telemetry_tokens_in:e.telemetry_tokens_in??null,telemetry_context_tokens:e.telemetry_context_tokens??null,telemetry_last_activity:e.telemetry_last_activity??null,telemetry_updated_at:e.telemetry_updated_at??null,outcome:P(e),fault:e.fault&&e.fault.link!=="broker\u2194crtrd"?{...e.fault,link:e.fault.link}:null,streaming:e.streaming??!1}}o(_e,"toNodeSummaryDTO");function j(e,t){return{parent:e.parent??null,spawned_by:e.spawned_by??null,subscribes_to:t.subscribesTo.map(i=>i.node_id),subscribers:t.subscribers.map(i=>i.node_id),children:[...t.children]}}o(j,"toNodeEdgesDTO");function I(e){return{node_dir:O(e),context_dir:x(e),reports_dir:c(e),meta_path:D(e),transcript_path:T(e),view_socket:S(e)}}o(I,"toNodePathsDTO");function q(e){const t={state:e.state,path:e.path,branch:e.branch,repo_root:e.repo_root,base_ref:e.base_ref,base_sha:e.base_sha,created:e.created};return e.cleanup!==void 0&&(t.cleanup=e.cleanup),e.closed!==void 0&&(t.closed=e.closed),e.abandoned!==void 0&&(t.abandoned={...e.abandoned}),t}o(q,"toNodeWorktreeDTO");function le(e,t){const i={node_id:e.node_id,name:e.name,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind??null,profile_id:e.profile_id??null,profile_paused:u(e.profile_id),parent:e.parent??null,created:e.created,intent:e.intent??null,waiting_for:e.waiting_for??null,frozen_at:e.frozen_at??null,terminal_reason:e.terminal_reason??null,pi_pid:e.pi_pid??null,pi_pid_identity:e.pi_pid_identity??null,window:e.window??null,tmux_session:e.tmux_session??null,pane:e.pane??null,final_report:e.final_report??null,finalized_at:e.finalized_at??null,deadline_at:e.deadline_at??null,telemetry_tokens_in:e.telemetry_tokens_in??null,telemetry_context_tokens:e.telemetry_context_tokens??null,telemetry_last_activity:e.telemetry_last_activity??null,telemetry_updated_at:e.telemetry_updated_at??null,outcome:C(e),fault:e.fault&&e.fault.link!=="broker\u2194crtrd"?{...e.fault,link:e.fault.link}:null,streaming:e.streaming??!1,creator:e.creator??null,edges:j(e,t),paths:I(e.node_id)};return e.description!==void 0&&(i.description=e.description),e.title!==void 0&&(i.title=e.title),e.icon!==void 0&&(i.icon=e.icon),e.cycles!==void 0&&(i.cycles=e.cycles),i.context_tokens=e.telemetry_context_tokens??e.telemetry_tokens_in??null,e.pi_session_id!==void 0&&(i.pi_session_id=e.pi_session_id??null),i.model_override=e.model_override??null,e.pi_session_file!==void 0&&(i.pi_session_file=e.pi_session_file??null),e.review_binding!==void 0&&(i.review_binding=e.review_binding===null?null:{...e.review_binding.kind===void 0?{}:{kind:e.review_binding.kind},review_id:e.review_binding.review_id,origin_node_id:e.review_binding.origin_node_id,branch_file:e.review_binding.branch_file,target_file:e.review_binding.target_file}),e.managed_worktree!=null&&(i.worktree=q(e.managed_worktree)),i}o(le,"toNodeDetailDTO");function ue(e,t,i){return{node_id:e,revived:t.launch!==void 0,resumed:t.resumed,status:i,outcome:t.outcome}}o(ue,"toReviveResultDTO");function ce(e){return{root:e.root,closed:[...e.closed],spared:[...e.spared]}}o(ce,"toCloseResultDTO");function pe(e,t,i){const r={report_path:e.reportPath,notified:[...e.deliveredTo]};return t!==void 0&&(r.transitioned=t),i!==void 0&&(r.worktree_auto_dropped=!0,r.worktree_auto_dropped_path=i),r}o(pe,"toReportResultDTO");function fe(e){return{node_id:e.node_id,active:e.active,created:e.created}}o(fe,"toSubscriptionDTO");function F(e){if(e===null||e==="")return[];try{const t=JSON.parse(e);return typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t):[]}catch{return[]}}o(F,"envKeys");function me(e,t){return{cron_id:e.cron_id,name:e.name,created_by:e.created_by,command:e.command,fire_at:e.fire_at,recur:e.recur,tz:e.tz,expires_at:e.expires_at,anchor_node:e.anchor_node,cancel_on_wake:e.cancel_on_wake,cwd:e.cwd,profile:e.profile,scope:e.scope,env_keys:F(e.env_json),run_timeout_s:e.run_timeout_s,overlap:e.overlap,on_output:e.on_output,sink:k(e.sink),tier:e.tier,state:e.state,held:e.held,run_state:e.run_state,last_run:t==null?null:{finished:t.finished,exit_code:t.exit_code,delivered:t.delivered},created:e.created,updated:e.updated}}o(me,"toCronDTO");function he(e){return{run_id:e.run_id,started:e.started,finished:e.finished,duration_ms:e.duration_ms,exit_code:e.exit_code,stdout_head:e.stdout_head,stderr_head:e.stderr_head,delivered:e.delivered}}o(he,"toCronRunDTO");function ve(e){return{id:e.profileId,name:e.manifest.name,projects:e.manifest.projects.map(t=>({...t})),home:e.manifest.home,paused_at:e.manifest.paused_at,default_kind:e.manifest.default_kind??"general",metadata:b(e.manifest.metadata),default_dir:null}}o(ve,"toProfileDTO");function p(e,t={}){const i={review_id:e.review_id,origin_kind:e.origin_kind,origin_node_id:e.origin_node_id,review_dir:e.review_dir,companion_node_id:e.companion_node_id,file:e.file,state:e.state,created:e.created,source_missing:e.source_missing,anchor_base_sha256:e.anchor_base_sha256};return e.opened_at!==null&&(i.opened_at=e.opened_at),e.submit_requested_at!==null&&(i.submit_requested_at=e.submit_requested_at),e.approved_at!==null&&(i.approved_at=e.approved_at),e.changed!==null&&(i.changed=e.changed),e.comments_total!==null&&(i.comments_total=e.comments_total),e.comments_unresolved!==null&&(i.comments_unresolved=e.comments_unresolved),e.canceled_at!==null&&(i.canceled_at=e.canceled_at),e.cancel_reason!==null&&(i.cancel_reason=e.cancel_reason),e.cancel_actor!==null&&(i.cancel_actor=e.cancel_actor),t.result_path!==void 0&&(i.result_path=t.result_path),e.delivery_error!==null&&(i.delivery_error=e.delivery_error),e.projection_error!==null&&(i.projection_error=e.projection_error),i}o(p,"toReviewDTO");function ge(e){return{comment_id:e.comment_id,review_id:e.review_id,status:e.status,revision:e.revision,text:e.text,anchor:{...e.anchor},anchor_state:e.anchor_state,anchor_line_text:e.anchor_line_text,anchor_doc_hash:e.anchor_doc_hash,author:{kind:e.author.kind,...e.author.node_id===null?{}:{node_id:e.author.node_id}},updated_by:{kind:e.updated_by.kind,...e.updated_by.node_id===null?{}:{node_id:e.updated_by.node_id}},created_at:e.created_at,updated_at:e.updated_at,...e.resolved_at===null?{}:{resolved_at:e.resolved_at},...e.deleted_at===null?{}:{deleted_at:e.deleted_at},created_seq:e.created_seq}}o(ge,"toReviewCommentDTO");function M(e){return{id:e.id,quote:e.quote,...e.context===void 0?{}:{context:e.context},note:e.note,status:e.status,created_at:e.createdAt,...e.resolvedAt===void 0?{}:{resolved_at:e.resolvedAt}}}o(M,"toPageFeedbackCommentDTO");function ye(e){return{companion_node_id:e.companionNodeId??null,open_count:e.comments.filter(t=>t.status==="open").length,comments:e.comments.map(M)}}o(ye,"toPageFeedbackDTO");function ke(e){return{seq:e.seq,review_id:e.review_id,comment_id:e.comment_id,kind:e.kind,state_change:e.state_change===1,revision_after:e.revision_after,actor:{kind:e.actor.kind,...e.actor.node_id===null?{}:{node_id:e.actor.node_id}},at:e.at,operation_id:e.operation_id,...e.payload===void 0?{}:{payload:e.payload}}}o(ke,"toReviewCommentEventDTO");function be(e){return{file:e.file,submitted:e.submitted,approved:e.approved,comments:e.comments.map(i=>({...i})),submittedAt:e.submittedAt,savedAt:e.savedAt,reviewId:e.review_id,changed:e.changed,baselineSha256:e.baseline_sha256,approvedSha256:e.approved_sha256,companionNodeId:e.companion_node_id,commentsTotal:e.comments_total,commentsUnresolved:e.comments_unresolved}}o(be,"toFeedbackResultDTO");const U=!0,G=Object.freeze({review_origin_missing:{status:400,code:"review_origin_unavailable"},review_origin_unforkable:{status:400,code:"review_origin_unavailable"},review_origin_unstable:{status:409,code:"review_origin_unstable"},review_branch_unavailable:{status:409,code:"review_branch_unavailable"},branch_lost:{status:409,code:"review_branch_unavailable"},review_companion_unbound:{status:409,code:"review_companion_unbound"},review_bridge_unsubscribed:{status:409,code:"review_bridge_unavailable"},review_target_unreviewable:{status:400,code:"review_file_unreadable"},source_unreadable:{status:409,code:"review_source_unreadable"},delivery_unroutable:{status:409,code:"review_delivery_unroutable"},unknown_review:{status:404,code:"unknown_review"},review_terminal:{status:409,code:"review_terminal_conflict"},review_required:{status:400,code:"review_required"},stale_document:{status:409,code:"stale_document"},unknown_comment:{status:404,code:"unknown_comment"},comment_deleted:{status:409,code:"comment_deleted"},invalid_anchor:{status:400,code:"invalid_anchor"},anchor_out_of_range:{status:400,code:"anchor_out_of_range"},text_too_long:{status:400,code:"text_too_long"},comment_limit_reached:{status:409,code:"comment_limit_reached"},stale_comment:{status:409,code:"stale_comment"},range_batch_incomplete:{status:409,code:"range_batch_incomplete"},range_batch_stale:{status:409,code:"range_batch_stale"}});function K(e){const t=f(e);if(typeof t=="object"&&t!==null&&typeof t.status=="number"&&typeof t.code=="string")return{status:t.status,code:t.code};if(t instanceof R)return t.code==="unknown_node"?{status:404,code:"node_not_found"}:t.code==="already_finalized"?{status:409,code:"already_finalized"}:{status:409,code:"finalization_forbidden"};if(t instanceof A)return{status:409,code:"node_id_exists"};if(t instanceof l)return G[t.code];if(t instanceof s)return{status:$(t.exitCode),code:t.code};if(t instanceof Error){const i=t.message;if(/unknown node/i.test(i))return{status:404,code:"node_not_found"};if(/finalization latch/i.test(i))return{status:409,code:"already_finalized"};if(/illegal lifecycle transition/i.test(i))return{status:409,code:"illegal_transition"}}return{status:500,code:"internal"}}o(K,"errorToStatus");function f(e){if(!(e instanceof E))return e;const t=e.code==="unknown_node"?d.NOT_FOUND:d.GENERAL,i={error:e.code,message:e.message,next:e.next};return e.detail!==void 0&&(i.received=e.detail),new s(e.code,e.message,t,i)}o(f,"normalizeThrow");function L(e){if(e.code!=="review_terminal")return e.detail;const{review:t,...i}=e.detail;return{...i,review:W(t)}}o(L,"reviewErrorDetails");function W(e){return e.state!=="approved"?p(e):p(e,{result_path:g(e.review_dir,"result.json")})}o(W,"terminalConflictReviewDTO");function $(e){switch(e){case d.NOT_FOUND:return 404;case d.USAGE:return 400;case d.AMBIGUOUS:return 400;case d.NETWORK:return 503;case d.GENERAL:return 400;default:return 500}}o($,"statusForExitCode");function B(e){const i=(e instanceof Error?e.message:String(e)).split(`
2
+ `,1)[0].trim();return i===""?"internal error":i.length>500?`${i.slice(0,497)}\u2026`:i}o(B,"boundedCause");function xe(e){const t=f(e),{status:i,code:r}=K(t);if(i>=500)return{status:i,body:{error:{code:r,message:B(t)}}};const n=t instanceof Error?t.message:String(t),a=t instanceof l?L(t):(t instanceof s||t instanceof N)&&t.details!==void 0?t.details:void 0,_={error:{code:r,message:n}};return a!==void 0&&(_.error.details=a),{status:i,body:_}}o(xe,"toErrorBody");export{G as REVIEW_ERROR_MAP,K as errorToStatus,ce as toCloseResultDTO,me as toCronDTO,he as toCronRunDTO,xe as toErrorBody,be as toFeedbackResultDTO,se as toGraphNodeDTO,de as toMigrateStateDTO,le as toNodeDetailDTO,j as toNodeEdgesDTO,C as toNodeOutcomeDTO,P as toNodeOutcomeSummaryDTO,I as toNodePathsDTO,_e as toNodeSummaryDTO,q as toNodeWorktreeDTO,ae as toOutcomeDeliveryDTO,M as toPageFeedbackCommentDTO,ye as toPageFeedbackDTO,ve as toProfileDTO,pe as toReportResultDTO,ge as toReviewCommentDTO,ke as toReviewCommentEventDTO,p as toReviewDTO,ue as toReviveResultDTO,fe as toSubscriptionDTO};
@@ -14,4 +14,4 @@ Fix the crash cause, then revive the node if the work still needs doing.`;await
14
14
 
15
15
  The daemon refused this recovery before starting a broker: ${r}
16
16
 
17
- The node is now dead. Fix the recorded launch configuration, then revive it if the work still needs doing.`;await v(s.node_id,t,{from:s.node_id})}l(D,"surfaceRecoveryFailure");function B(s){return s?.cycle_pending!==!0}l(B,"retryResumeMode");function L(s,e,r=!0){return s===null||s.status==="done"||s.status==="canceled"||s.status==="dead"?"forget":s.intent==="refresh"?"respawn-fresh":s.intent==="idle-release"?"dormant":s.lifecycle==="resident"&&!e&&!r&&s.pi_session_id!=null?"release-idle":s.pi_session_id!=null?B(s)?"respawn-resume":"respawn-cycle":e||s.fork_from!=null?"respawn-fresh":"boot-failure"}l(L,"classifyDeadNode");const W=3e4;class te{static{l(this,"DaemonFleet")}#n;#o;#s;#l;#e=new Map;#r=new Set;#i=new Set;#t=new Map;#c=Number.NEGATIVE_INFINITY;constructor(e){this.#n=e.epoch,this.#o=e.enqueue,this.#s=e.now??Date.now,this.#l=e.probeOnline??(()=>M())}epoch(){return this.#n}register(e,r){if(this.#e.has(e))throw new Error(`fleet: ${e} already has a live broker entry \u2014 refusing a second launch (programming error)`);if(r.pid===null)throw new Error(`fleet: refusing to register ${e} with no pid`);this.#r.delete(e),this.#t.delete(e),this.#e.set(e,{pid:r.pid,handle:r})}has(e){return this.#e.has(e)}isClaimed(e){return this.#e.has(e)||this.#r.has(e)}get(e){return this.#e.get(e)}size(){return this.#e.size}occupancy(){return this.#e.size+this.#r.size}reserveSlot(e){if(this.#r.has(e)||this.#e.has(e))return!0;const{automaticReviveCap:r}=A();if(this.occupancy()<r)return this.#r.add(e),!0;const t=this.#s();return t-this.#c>=W&&(this.#c=t,c({level:"warn",event:"broker.capacity.revive_deferred",fields:{live_count:this.occupancy(),hard_cap:r}})),!1}releaseReservation(e){this.#r.delete(e)}entries(){return this.#e.entries()}interruptForProfilePause(e,r=this.#e.get(e)?.pid){if(r!==void 0){this.#i.add(e);try{process.kill(r,"SIGTERM")}catch{}}}hasProfilePauseInterruption(e){return this.#i.has(e)}forget(e){this.#e.delete(e),this.#r.delete(e),this.#t.delete(e)}onChildExit(e,r){const t=d(e),n=t?.launched_at==null?Number.NaN:Date.parse(t.launched_at),o=Number.isFinite(n)?Math.max(0,this.#s()-n):null,i=t?.respawn_failures??0;this.#e.delete(e),t?.status==="done"||t?.status==="canceled"||t?.status==="dead"?this.#t.delete(e):this.#t.set(e,r),this.#o(()=>this.#u(e,r,o,i))}deliverExit(e,r){this.onChildExit(e,r)}async applyDeadRowPolicy(e){const r=this.#t.get(e);try{await this.#f(e,r)}finally{this.#t.get(e)===r&&this.#t.delete(e)}}async terminalizeIfStillNonTerminal(e,r,t,n,o){const i=d(e);return i===null||i.status==="done"||i.status==="canceled"||i.status==="dead"?!1:(await this.#a(e,i,{event:r,reason:n,detail:o,wake:`Child crashed \u2014 ${p(i)} (${e}) could not be relaunched and is now dead. It stays dead until you revive it \u2014 \`crtr node lifecycle revive ${e}\`.`,surface:l(()=>D(i,t),"surface")}),!0)}dispose(){}#u(e,r,t,n){c({level:"info",event:"broker.exit.observed",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},code:r.code,signal:r.signal,uptime_ms:t,consecutive_failures:n}})}async#f(e,r){return this.#h(e,r)}async#h(e,r){const t=d(e);if(t!==null&&$(t.profile_id))return h(e),"forget";if(this.#i.delete(e))return h(e),"forget";const n=P(e)?.interrupted===!0,o=L(t,n,E(e));switch(o){case"forget":h(e);break;case"dormant":h(e);break;case"release-idle":h(e),m(e,"release"),c({level:"info",event:"broker.recovery.released",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e}}});break;case"boot-failure":await this.#a(e,t,{event:"broker.boot.failed",reason:"boot_failed",detail:{schema:"crtr.node-outcome-detail/v1",message:w(t,r)},wake:`Child crashed \u2014 ${p(t)} (${e}) exited before its session ever came up and is now dead. It stays dead until you revive it \u2014 \`crtr node lifecycle revive ${e}\`.`,surface:l(()=>y(t,r),"surface")});break;case"respawn-fresh":case"respawn-cycle":case"respawn-resume":await this.#d(e,t,o,n);break}return o}async#d(e,r,t,n){const o=g(e);if(o===null)return;const i=o.respawn_failures??0;if(!await this.#l()){N(e,i,this.#s()),c({level:"info",event:"broker.respawn.offline_deferred",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},action:t,retry_in_ms:C,consecutive_failures:i}});return}const _=o.respawn_not_before==null,f=_?F(o,this.#s()):{failures:i,notBefore:o.respawn_not_before,exhausted:i>=R};if(f.exhausted){const u=`Child crashed \u2014 ${p(r)} (${e}) kept dying without settling a turn (${f.failures} consecutive launches) and is now dead. It stays dead until you revive it \u2014 \`crtr node lifecycle revive ${e}\`.`;await this.#a(e,r,{event:"broker.respawn.exhausted",reason:"crash_looped",detail:{schema:"crtr.node-outcome-detail/v1",message:u,respawn_failures:f.failures},wake:u,...r.pi_session_id!=null?{surface:l(()=>z(r),"surface")}:{}});return}if(_&&f.notBefore!==null){c({level:"info",event:"broker.respawn.deferred",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},action:t,backoff_ms:S(f.failures),consecutive_failures:f.failures}});return}c({level:"info",event:"broker.respawn.started",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},action:t,consecutive_failures:f.failures}});try{await O(e,{capacity:"freeze",resume:t==="respawn-resume",wakeReason:t==="respawn-resume"&&n?"runtime-restart-abort":void 0,recovery:!0})}catch(u){c({level:"error",event:"broker.respawn.failed",...a(e)?{node_id:e}:{},error:u,fields:{...a(e)?{}:{affected_node_id:e},action:t}}),await this.terminalizeIfStillNonTerminal(e,"broker.respawn.refused",u,"launch_failed",{schema:"crtr.node-outcome-detail/v1",message:u instanceof Error?u.message:String(u)})}}async#a(e,r,t){c({level:"error",event:t.event,...a(e)?{node_id:e}:{fields:{affected_node_id:e}}}),m(e,"crash",{reason:t.reason,outcome:{detail:t.detail}});try{await(t.surface??(()=>y(r)))()}catch(n){c({level:"error",event:"broker.boot_failure_surface.failed",...a(e)?{node_id:e}:{fields:{affected_node_id:e}},error:n})}T(e,k(e),t.wake,{reason:"child-crashed",child:e})}}export{te as DaemonFleet,L as classifyDeadNode,B as retryResumeMode,y as surfaceBootFailure};
17
+ The node is now dead. Fix the recorded launch configuration, then revive it if the work still needs doing.`;await v(s.node_id,t,{from:s.node_id})}l(D,"surfaceRecoveryFailure");function B(s){return s?.cycle_pending!==!0}l(B,"retryResumeMode");function L(s,e,r=!0){return s===null||s.status==="done"||s.status==="canceled"||s.status==="dead"?"forget":s.intent==="refresh"?"respawn-fresh":s.intent==="idle-release"?"dormant":s.lifecycle==="resident"&&!e&&!r&&s.pi_session_id!=null?"release-idle":s.pi_session_id!=null?B(s)?"respawn-resume":"respawn-cycle":e||s.fork_from!=null?"respawn-fresh":"boot-failure"}l(L,"classifyDeadNode");const W=3e4;class te{static{l(this,"DaemonFleet")}#n;#o;#s;#l;#e=new Map;#r=new Set;#i=new Set;#t=new Map;#c=Number.NEGATIVE_INFINITY;constructor(e){this.#n=e.epoch,this.#o=e.enqueue,this.#s=e.now??Date.now,this.#l=e.probeOnline??(()=>M())}epoch(){return this.#n}register(e,r){if(this.#e.has(e))throw new Error(`fleet: ${e} already has a live broker entry \u2014 refusing a second launch (programming error)`);if(r.pid===null)throw new Error(`fleet: refusing to register ${e} with no pid`);this.#r.delete(e),this.#t.delete(e),this.#e.set(e,{pid:r.pid,handle:r})}has(e){return this.#e.has(e)}isClaimed(e){return this.#e.has(e)||this.#r.has(e)}get(e){return this.#e.get(e)}size(){return this.#e.size}occupancy(){return this.#e.size+this.#r.size}reserveSlot(e){if(this.#r.has(e)||this.#e.has(e))return!0;const{automaticReviveCap:r}=A();if(this.occupancy()<r)return this.#r.add(e),!0;const t=this.#s();return t-this.#c>=W&&(this.#c=t,c({level:"warn",event:"broker.capacity.revive_deferred",fields:{live_count:this.occupancy(),hard_cap:r}})),!1}releaseReservation(e){this.#r.delete(e)}entries(){return this.#e.entries()}interruptForProfilePause(e,r=this.#e.get(e)?.pid){if(r!==void 0){this.#i.add(e);try{process.kill(r,"SIGTERM")}catch{}}}hasProfilePauseInterruption(e){return this.#i.has(e)}forget(e){this.#e.delete(e),this.#r.delete(e),this.#t.delete(e)}onChildExit(e,r){this.#e.delete(e),this.#o(()=>{const t=d(e),n=t?.launched_at==null?Number.NaN:Date.parse(t.launched_at),o=Number.isFinite(n)?Math.max(0,this.#s()-n):null,i=t?.respawn_failures??0;t?.status==="done"||t?.status==="canceled"||t?.status==="dead"?this.#t.delete(e):this.#t.set(e,r),this.#u(e,r,o,i)})}deliverExit(e,r){this.onChildExit(e,r)}async applyDeadRowPolicy(e){const r=this.#t.get(e);try{await this.#f(e,r)}finally{this.#t.get(e)===r&&this.#t.delete(e)}}async terminalizeIfStillNonTerminal(e,r,t,n,o){const i=d(e);return i===null||i.status==="done"||i.status==="canceled"||i.status==="dead"?!1:(await this.#a(e,i,{event:r,reason:n,detail:o,wake:`Child crashed \u2014 ${p(i)} (${e}) could not be relaunched and is now dead. It stays dead until you revive it \u2014 \`crtr node lifecycle revive ${e}\`.`,surface:l(()=>D(i,t),"surface")}),!0)}dispose(){}#u(e,r,t,n){c({level:"info",event:"broker.exit.observed",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},code:r.code,signal:r.signal,uptime_ms:t,consecutive_failures:n}})}async#f(e,r){return this.#h(e,r)}async#h(e,r){const t=d(e);if(t!==null&&$(t.profile_id))return h(e),"forget";if(this.#i.delete(e))return h(e),"forget";const n=P(e)?.interrupted===!0,o=L(t,n,E(e));switch(o){case"forget":h(e);break;case"dormant":h(e);break;case"release-idle":h(e),m(e,"release"),c({level:"info",event:"broker.recovery.released",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e}}});break;case"boot-failure":await this.#a(e,t,{event:"broker.boot.failed",reason:"boot_failed",detail:{schema:"crtr.node-outcome-detail/v1",message:w(t,r)},wake:`Child crashed \u2014 ${p(t)} (${e}) exited before its session ever came up and is now dead. It stays dead until you revive it \u2014 \`crtr node lifecycle revive ${e}\`.`,surface:l(()=>y(t,r),"surface")});break;case"respawn-fresh":case"respawn-cycle":case"respawn-resume":await this.#d(e,t,o,n);break}return o}async#d(e,r,t,n){const o=g(e);if(o===null)return;const i=o.respawn_failures??0;if(!await this.#l()){N(e,i,this.#s()),c({level:"info",event:"broker.respawn.offline_deferred",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},action:t,retry_in_ms:C,consecutive_failures:i}});return}const _=o.respawn_not_before==null,f=_?F(o,this.#s()):{failures:i,notBefore:o.respawn_not_before,exhausted:i>=R};if(f.exhausted){const u=`Child crashed \u2014 ${p(r)} (${e}) kept dying without settling a turn (${f.failures} consecutive launches) and is now dead. It stays dead until you revive it \u2014 \`crtr node lifecycle revive ${e}\`.`;await this.#a(e,r,{event:"broker.respawn.exhausted",reason:"crash_looped",detail:{schema:"crtr.node-outcome-detail/v1",message:u,respawn_failures:f.failures},wake:u,...r.pi_session_id!=null?{surface:l(()=>z(r),"surface")}:{}});return}if(_&&f.notBefore!==null){c({level:"info",event:"broker.respawn.deferred",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},action:t,backoff_ms:S(f.failures),consecutive_failures:f.failures}});return}c({level:"info",event:"broker.respawn.started",...a(e)?{node_id:e}:{},fields:{...a(e)?{}:{affected_node_id:e},action:t,consecutive_failures:f.failures}});try{await O(e,{capacity:"freeze",resume:t==="respawn-resume",wakeReason:t==="respawn-resume"&&n?"runtime-restart-abort":void 0,recovery:!0})}catch(u){c({level:"error",event:"broker.respawn.failed",...a(e)?{node_id:e}:{},error:u,fields:{...a(e)?{}:{affected_node_id:e},action:t}}),await this.terminalizeIfStillNonTerminal(e,"broker.respawn.refused",u,"launch_failed",{schema:"crtr.node-outcome-detail/v1",message:u instanceof Error?u.message:String(u)})}}async#a(e,r,t){c({level:"error",event:t.event,...a(e)?{node_id:e}:{fields:{affected_node_id:e}}}),m(e,"crash",{reason:t.reason,outcome:{detail:t.detail}});try{await(t.surface??(()=>y(r)))()}catch(n){c({level:"error",event:"broker.boot_failure_surface.failed",...a(e)?{node_id:e}:{fields:{affected_node_id:e}},error:n})}T(e,k(e),t.wake,{reason:"child-crashed",child:e})}}export{te as DaemonFleet,L as classifyDeadNode,B as retryResumeMode,y as surfaceBootFailure};
@@ -1 +1 @@
1
- var J=Object.defineProperty;var d=(t,e)=>J(t,"name",{value:e,configurable:!0});import{envNodeId as P}from"../shared/env.js";import{writeFileSync as j,mkdirSync as q,existsSync as E,readFileSync as H}from"node:fs";import{join as W}from"node:path";import{contextDir as Y,jobDir as z}from"../core/canvas/paths.js";import{mutateBrokerFault as A,recordBrokerTurn as b}from"../core/runtime/broker/daemon-ops.js";import{clearStopSignals as G,consumeStopSignals as L}from"../core/runtime/stop-signals.js";import{bindBrokerSession as V,brokerExtensionState as $,relaunchBrokerRoot as X,settleBroker as M}from"../core/runtime/broker/daemon-ops.js";import{emitEvent as T}from"../core/events/emit.js";import{activeBackgroundBashJobs as K}from"../core/bash-jobs.js";import{CONTEXT_NUDGE_CUSTOM_TYPE as Q,formatCard as Z}from"../shared/generated-context.js";import{isReviewBoundary as ee}from"../core/runtime/session-visibility.js";import{clearRefusedTurn as te,isRuntimeTeardownInProgress as ne,refuseTurn as oe,runRefreshAbort as re}from"../core/runtime/broker/extension-abort.js";import{announceMessageOrigin as F}from"../core/runtime/stamp/channel.js";const O=80;function se(t,e){const a=e??{},o=d(f=>typeof f=="string"?f:"","pick"),i=o(a.command)||o(a.path)||o(a.file_path)||o(a.pattern)||o(a.description)||o(a.prompt),l=(i!==""?`${t}: ${i}`:t).replace(/\s+/g," ").trim();return l.length>O?l.slice(0,O):l}d(se,"summarizeActivity");function N(t,e,a,o,i,l){try{E(t)||q(t,{recursive:!0});const f=W(t,"telemetry.json");let h={};if(E(f))try{h=JSON.parse(H(f,"utf8"))}catch{}const _={tokens_in:e,tokens_out:a,context_tokens:i??h.context_tokens,last_activity:l??h.last_activity,model:o!==""?o:h.model??"",updated_at:new Date().toISOString()};j(f,JSON.stringify(_,null,2),"utf8")}catch{}}d(N,"flushTelemetry");function ae(t){for(let e=t.length-1;e>=0;e--)if(t[e]?.role==="assistant")return t[e]}d(ae,"lastAssistantMessage");function ie(t){try{const e=t?.sessionManager?.getBranch();if(!Array.isArray(e))return[];const a=new Set;for(const o of e){if(!ee(o))continue;const i=o.details?.reviewId;typeof i=="string"&&a.add(i)}return[...a]}catch{return[]}}d(ie,"currentReviewBoundaryIds");const D=1e4,v=[13e4,15e4,17e4,185e3,2e5];function ce(t){const e=v[0],a=v[v.length-1];if(t<e)return null;if(t>=a)return a+Math.floor((t-a)/D)*D;let o=e;for(const i of v)t>=i&&(o=i);return o}d(ce,"steerBand");function de(t,e,a){const o=Math.round(t/1e3),i=t>=185e3;if(a==="orchestrator")return t<15e4?`Context ~${o}k and growing. When you reach a good stopping point, consider updating context/roadmap.md and running \`crtr node yield\` to refresh against it \u2014 no rush yet.`:i?`Context ~${o}k \u2014 this is getting long. Stop taking on new work now: checkpoint context/roadmap.md, hand off anything outstanding, and \`crtr node yield\` immediately to refresh before this context overflows.`:`Context ~${o}k. Update context/roadmap.md so a fresh revive can continue, delegate any outstanding work, then \`crtr node yield\` to refresh.`;if(e==="resident"){const l="If substantial work remains, `crtr node yield` to continue fresh against your goal and your note. Add --promote only when worthwhile independent work can run in parallel and coordinating it should become your primary job; `crtr node yield -h` has the boundary.";return t<15e4?`Context ~${o}k and growing. ${l} Otherwise no rush \u2014 wrap up when you reach a good stopping point.`:i?`Context ~${o}k \u2014 this is getting long. Wrap up now before this context overflows: finish what's in hand, or \`crtr node yield\` immediately to continue fresh against your goal and your note if substantial work remains.`:`Context ~${o}k. ${l} If you're near done, just finish here; if there's more open-ended work, \`crtr node yield\` rather than letting this context grow.`}return t<15e4?`Context ~${o}k and growing. If you're near done, finish with \`crtr push final\`. If real work remains, \`crtr node yield\` to continue in a fresh window against your goal and your note \u2014 no rush yet.`:i?`Context ~${o}k \u2014 this is getting long. Wrap up now before this context overflows: \`crtr push final\` if you're close, otherwise \`crtr node yield\` immediately to continue in a fresh window against your goal and your note.`:`Context ~${o}k. If you're close, finish with \`crtr push final\`; otherwise \`crtr node yield\` now to refresh into a clean window and keep going against your goal and your note.`}d(de,"steerNote");function ue(t){const e=P();if(e===void 0||e.trim()==="")return;const a=z(e);let o=0,i=0,l="",f=null,h=null;const _=new Set,C=d(()=>K(Y(e)).length>0,"backgroundJobsRunning"),g=d((n,s)=>{T({event:"broker.daemon.operation.failed",level:"error",node_id:e,error:s,fields:{operation:n}})},"emitDaemonOperationFailure"),I=d((n,s)=>{if(n.action==="reprompt"){F(n.prompt,{type:"runtime",kind:"stop-guard"}),t.sendUserMessage(n.prompt,{deliverAs:"followUp"});return}if(n.action==="shutdown")try{s?.shutdown?.()}catch{}},"enactSettleDirective"),U=3e3;let R=0;const k=d(()=>{const n=Date.now();n-R<U||(R=n,Promise.all([b(e,{event:"progress"}),A(e,{op:"clear",link:"daemon\u2192node"})]).catch(s=>g("turn_progress",s)))},"heartbeat");t.on("session_start",async(n,s)=>{try{const r=s?.sessionManager?.getSessionId?.();if(typeof r!="string"||r==="")return;const y=s?.sessionManager?.getSessionFile?.(),p=typeof y=="string"&&y!==""?y:null,m=typeof n?.reason=="string"?n.reason:null;m==="new"&&(o=0,i=0,_.clear());const c=await V(e,{piSessionId:r,sessionFile:p,pid:process.pid,reason:m,reviewBoundaryIds:ie(s)});if(c.action==="shutdown"){try{s?.shutdown?.()}catch{}return}if(c.action==="relaunch_root"){X(e).catch(u=>{const w=u instanceof Error?u.message:String(u);s?.ui?.notify?.(`/new refused: ${w}`,"error"),T({event:"broker.daemon.operation.failed",level:"error",node_id:e,error:u,fields:{operation:"relaunch_root"}})});return}}catch(r){T({event:"broker.daemon.operation.failed",level:"error",node_id:e,error:r,fields:{operation:"session_bound"}})}}),t.on("agent_start",async(n,s)=>{try{if(!(await b(e,{event:"started"})).applied)throw new Error("daemon refused turn open")}catch(r){g("turn_open",r),s?.ui?.notify?.("Turn refused: the broker no longer owns this node.","error"),oe(()=>s?.abort?.())}}),t.on("input",()=>{te();try{G(e)}catch{}}),t.on("tool_execution_start",n=>{try{h=se(String(n?.toolName??""),n?.args),N(a,o,i,l,f,h),k()}catch{}}),t.on("tool_execution_update",()=>{try{k()}catch{}}),t.on("message_update",()=>{try{k()}catch{}}),t.on("tool_execution_end",async(n,s)=>{try{if(k(),(await $(e)).node.intent==="refresh")try{re(()=>s?.abort?.())}catch{}}catch{}}),t.on("session_shutdown",async(n,s)=>{try{await b(e,{event:"closed",end_reason:"teardown-aborted"})}catch(r){g("turn_close_teardown",r)}if(n?.reason==="quit")try{const r=await M(e,{stopReason:"quit",backgroundJobsRunning:C(),pushedFinal:!1});I(r,s)}catch(r){g("settle_quit",r)}});const B=d(n=>{n?.role!=="assistant"||n.usage==null||(o+=Number(n.usage.input??0)||0,i+=Number(n.usage.output??0)||0,typeof n.model=="string"&&n.model!==""&&(l=n.model))},"accumulate");t.on("turn_end",async(n,s)=>{B(n?.message);let r=null;try{const c=s.getContextUsage()?.tokens;typeof c=="number"&&(r=c)}catch{}r!==null&&(f=r),N(a,o,i,l,r,h),k();try{await Promise.all([A(e,{op:"clear",link:"daemon\u2192node"}),A(e,{op:"clear",link:"pi\u2192provider"})])}catch(c){g("turn_end_fault_clear",c)}const y=Array.isArray(n?.message?.content)?n.message.content:[],p=n?.message?.stopReason??"",m=p!=="error"&&p!=="aborted"&&y.some(c=>c?.type==="toolCall");try{const u=(await $(e)).node,w=r!==null?ce(r):null;if(w!==null&&!_.has(w)){_.add(w);const x=Z("context-nudge",{},de(w,u.lifecycle,u.mode));m?(F(x,{type:"runtime",kind:"context-nudge"}),t.sendUserMessage(x,{deliverAs:"steer"})):t.sendMessage({customType:Q,content:x,display:!0},{deliverAs:"nextTurn"})}}catch(c){g("turn_boundary",c)}});let S=null;t.on("agent_end",n=>{S=n;try{const s=Array.isArray(n?.messages)?n.messages:[];for(const r of s)B(r)}catch{}}),t.on("agent_settled",async(n,s)=>{const r=S;if(S=null,ne())return;try{await b(e,{event:"closed",end_reason:"settled"})}catch(u){g("turn_close",u);return}const y=Array.isArray(r?.messages)?r.messages:[],p=ae(y),m=typeof p?.stopReason=="string"?p.stopReason:"",c=r===null?{pushedFinal:!1}:L(e);try{const u=await M(e,{stopReason:m,backgroundJobsRunning:C(),pushedFinal:c.pushedFinal});I(u,s)}catch(u){g("settle",u)}})}d(ue,"registerCanvasStophook");var Ae=ue;export{Ae as default,ue as registerCanvasStophook,de as steerNote};
1
+ var J=Object.defineProperty;var c=(t,e)=>J(t,"name",{value:e,configurable:!0});import{envNodeId as j}from"../shared/env.js";import{writeFileSync as q,mkdirSync as H,existsSync as M,readFileSync as W}from"node:fs";import{join as Y}from"node:path";import{contextDir as z,jobDir as G}from"../core/canvas/paths.js";import{mutateBrokerFault as T,recordBrokerTelemetry as L,recordBrokerTurn as v}from"../core/runtime/broker/daemon-ops.js";import{clearStopSignals as V,consumeStopSignals as X}from"../core/runtime/stop-signals.js";import{bindBrokerSession as K,brokerExtensionState as F,relaunchBrokerRoot as Q,settleBroker as O}from"../core/runtime/broker/daemon-ops.js";import{emitEvent as C}from"../core/events/emit.js";import{activeBackgroundBashJobs as Z}from"../core/bash-jobs.js";import{CONTEXT_NUDGE_CUSTOM_TYPE as ee,formatCard as te}from"../shared/generated-context.js";import{isReviewBoundary as ne}from"../core/runtime/session-visibility.js";import{clearRefusedTurn as oe,isRuntimeTeardownInProgress as re,refuseTurn as se,runRefreshAbort as ae}from"../core/runtime/broker/extension-abort.js";import{announceMessageOrigin as N}from"../core/runtime/stamp/channel.js";const P=80;function ie(t,e){const a=e??{},o=c(p=>typeof p=="string"?p:"","pick"),i=o(a.command)||o(a.path)||o(a.file_path)||o(a.pattern)||o(a.description)||o(a.prompt),u=(i!==""?`${t}: ${i}`:t).replace(/\s+/g," ").trim();return u.length>P?u.slice(0,P):u}c(ie,"summarizeActivity");function ce(t,e,a,o,i,u,p){try{M(t)||H(t,{recursive:!0});const m=Y(t,"telemetry.json");let g={};if(M(m))try{g=JSON.parse(W(m,"utf8"))}catch{}const b={tokens_in:e,tokens_out:a,context_tokens:i??g.context_tokens,last_activity:u??g.last_activity,model:o!==""?o:g.model??"",updated_at:p};q(m,JSON.stringify(b,null,2),"utf8")}catch{}}c(ce,"flushTelemetry");function le(t){for(let e=t.length-1;e>=0;e--)if(t[e]?.role==="assistant")return t[e]}c(le,"lastAssistantMessage");function de(t){try{const e=t?.sessionManager?.getBranch();if(!Array.isArray(e))return[];const a=new Set;for(const o of e){if(!ne(o))continue;const i=o.details?.reviewId;typeof i=="string"&&a.add(i)}return[...a]}catch{return[]}}c(de,"currentReviewBoundaryIds");const D=1e4,S=[13e4,15e4,17e4,185e3,2e5];function ue(t){const e=S[0],a=S[S.length-1];if(t<e)return null;if(t>=a)return a+Math.floor((t-a)/D)*D;let o=e;for(const i of S)t>=i&&(o=i);return o}c(ue,"steerBand");function fe(t,e,a){const o=Math.round(t/1e3),i=t>=185e3;if(a==="orchestrator")return t<15e4?`Context ~${o}k and growing. When you reach a good stopping point, consider updating context/roadmap.md and running \`crtr node yield\` to refresh against it \u2014 no rush yet.`:i?`Context ~${o}k \u2014 this is getting long. Stop taking on new work now: checkpoint context/roadmap.md, hand off anything outstanding, and \`crtr node yield\` immediately to refresh before this context overflows.`:`Context ~${o}k. Update context/roadmap.md so a fresh revive can continue, delegate any outstanding work, then \`crtr node yield\` to refresh.`;if(e==="resident"){const u="If substantial work remains, `crtr node yield` to continue fresh against your goal and your note. Add --promote only when worthwhile independent work can run in parallel and coordinating it should become your primary job; `crtr node yield -h` has the boundary.";return t<15e4?`Context ~${o}k and growing. ${u} Otherwise no rush \u2014 wrap up when you reach a good stopping point.`:i?`Context ~${o}k \u2014 this is getting long. Wrap up now before this context overflows: finish what's in hand, or \`crtr node yield\` immediately to continue fresh against your goal and your note if substantial work remains.`:`Context ~${o}k. ${u} If you're near done, just finish here; if there's more open-ended work, \`crtr node yield\` rather than letting this context grow.`}return t<15e4?`Context ~${o}k and growing. If you're near done, finish with \`crtr push final\`. If real work remains, \`crtr node yield\` to continue in a fresh window against your goal and your note \u2014 no rush yet.`:i?`Context ~${o}k \u2014 this is getting long. Wrap up now before this context overflows: \`crtr push final\` if you're close, otherwise \`crtr node yield\` immediately to continue in a fresh window against your goal and your note.`:`Context ~${o}k. If you're close, finish with \`crtr push final\`; otherwise \`crtr node yield\` now to refresh into a clean window and keep going against your goal and your note.`}c(fe,"steerNote");function he(t){const e=j();if(e===void 0||e.trim()==="")return;const a=G(e);let o=0,i=0,u="",p=null,m=null;const g=new Set,b=c(()=>Z(z(e)).length>0,"backgroundJobsRunning"),f=c((n,s)=>{C({event:"broker.daemon.operation.failed",level:"error",node_id:e,error:s,fields:{operation:n}})},"emitDaemonOperationFailure"),I=c((n,s)=>{if(n.action==="reprompt"){N(n.prompt,{type:"runtime",kind:"stop-guard"}),t.sendUserMessage(n.prompt,{deliverAs:"followUp"});return}if(n.action==="shutdown")try{s?.shutdown?.()}catch{}},"enactSettleDirective"),U=3e3;let R=0,B=Promise.resolve();const E=c((n,s)=>{const r=new Date().toISOString();ce(a,o,i,u,n,s,r);const h={tokens_in:o,context_tokens:n,last_activity:s,updated_at:r};B=B.then(()=>L(e,h)).catch(y=>f("telemetry",y))},"publishTelemetry"),k=c(()=>{const n=Date.now();n-R<U||(R=n,Promise.all([v(e,{event:"progress"}),T(e,{op:"clear",link:"daemon\u2192node"})]).catch(s=>f("turn_progress",s)))},"heartbeat");t.on("session_start",async(n,s)=>{try{const r=s?.sessionManager?.getSessionId?.();if(typeof r!="string"||r==="")return;const h=s?.sessionManager?.getSessionFile?.(),y=typeof h=="string"&&h!==""?h:null,w=typeof n?.reason=="string"?n.reason:null;w==="new"&&(o=0,i=0,g.clear());const l=await K(e,{piSessionId:r,sessionFile:y,pid:process.pid,reason:w,reviewBoundaryIds:de(s)});if(l.action==="shutdown"){try{s?.shutdown?.()}catch{}return}if(l.action==="relaunch_root"){Q(e).catch(d=>{const _=d instanceof Error?d.message:String(d);s?.ui?.notify?.(`/new refused: ${_}`,"error"),C({event:"broker.daemon.operation.failed",level:"error",node_id:e,error:d,fields:{operation:"relaunch_root"}})});return}}catch(r){C({event:"broker.daemon.operation.failed",level:"error",node_id:e,error:r,fields:{operation:"session_bound"}})}}),t.on("agent_start",async(n,s)=>{try{if(!(await v(e,{event:"started"})).applied)throw new Error("daemon refused turn open")}catch(r){f("turn_open",r),s?.ui?.notify?.("Turn refused: the broker no longer owns this node.","error"),se(()=>s?.abort?.())}}),t.on("input",()=>{oe();try{V(e)}catch{}}),t.on("tool_execution_start",n=>{try{m=ie(String(n?.toolName??""),n?.args),E(p,m),k()}catch{}}),t.on("tool_execution_update",()=>{try{k()}catch{}}),t.on("message_update",()=>{try{k()}catch{}}),t.on("tool_execution_end",async(n,s)=>{try{if(k(),(await F(e)).node.intent==="refresh")try{ae(()=>s?.abort?.())}catch{}}catch{}}),t.on("session_shutdown",async(n,s)=>{try{await v(e,{event:"closed",end_reason:"teardown-aborted"})}catch(r){f("turn_close_teardown",r)}if(n?.reason==="quit")try{const r=await O(e,{stopReason:"quit",backgroundJobsRunning:b(),pushedFinal:!1});I(r,s)}catch(r){f("settle_quit",r)}});const $=c(n=>{n?.role!=="assistant"||n.usage==null||(o+=Number(n.usage.input??0)||0,i+=Number(n.usage.output??0)||0,typeof n.model=="string"&&n.model!==""&&(u=n.model))},"accumulate");t.on("turn_end",async(n,s)=>{$(n?.message);let r=null;try{const l=s.getContextUsage()?.tokens;typeof l=="number"&&(r=l)}catch{}r!==null&&(p=r),E(r,m),k();try{await Promise.all([T(e,{op:"clear",link:"daemon\u2192node"}),T(e,{op:"clear",link:"pi\u2192provider"})])}catch(l){f("turn_end_fault_clear",l)}const h=Array.isArray(n?.message?.content)?n.message.content:[],y=n?.message?.stopReason??"",w=y!=="error"&&y!=="aborted"&&h.some(l=>l?.type==="toolCall");try{const d=(await F(e)).node,_=r!==null?ue(r):null;if(_!==null&&!g.has(_)){g.add(_);const A=te("context-nudge",{},fe(_,d.lifecycle,d.mode));w?(N(A,{type:"runtime",kind:"context-nudge"}),t.sendUserMessage(A,{deliverAs:"steer"})):t.sendMessage({customType:ee,content:A,display:!0},{deliverAs:"nextTurn"})}}catch(l){f("turn_boundary",l)}});let x=null;t.on("agent_end",n=>{x=n;try{const s=Array.isArray(n?.messages)?n.messages:[];for(const r of s)$(r)}catch{}}),t.on("agent_settled",async(n,s)=>{const r=x;if(x=null,re())return;try{await v(e,{event:"closed",end_reason:"settled"})}catch(d){f("turn_close",d);return}const h=Array.isArray(r?.messages)?r.messages:[],y=le(h),w=typeof y?.stopReason=="string"?y.stopReason:"",l=r===null?{pushedFinal:!1}:X(e);try{const d=await O(e,{stopReason:w,backgroundJobsRunning:b(),pushedFinal:l.pushedFinal});I(d,s)}catch(d){f("settle",d)}})}c(he,"registerCanvasStophook");var Ie=he;export{Ie as default,he as registerCanvasStophook,fe as steerNote};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@north-light/crouter",
3
- "version": "0.3.322",
3
+ "version": "0.3.324",
4
4
  "description": "crtr — agent runtime with memory, plugins, and marketplaces",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/runtime.lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@north-light/crouter",
3
- "version": "0.3.322",
3
+ "version": "0.3.324",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@north-light/crouter",
9
- "version": "0.3.322",
9
+ "version": "0.3.324",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "workspaces": [
@@ -5206,17 +5206,17 @@
5206
5206
  },
5207
5207
  "packages/crouter-api": {
5208
5208
  "name": "@north-light/crouter-api",
5209
- "version": "0.3.322",
5209
+ "version": "0.3.324",
5210
5210
  "license": "UNLICENSED"
5211
5211
  },
5212
5212
  "packages/crouter-env-docker": {
5213
5213
  "name": "@north-light/crouter-env-docker",
5214
- "version": "0.3.322",
5214
+ "version": "0.3.324",
5215
5215
  "license": "UNLICENSED"
5216
5216
  },
5217
5217
  "packages/crouter-sdk": {
5218
5218
  "name": "@north-light/crouter-sdk",
5219
- "version": "0.3.322",
5219
+ "version": "0.3.324",
5220
5220
  "license": "UNLICENSED",
5221
5221
  "dependencies": {
5222
5222
  "@north-light/crouter-api": "^0.3.321"
@@ -166,7 +166,9 @@ async function validatePublished(root, id) {
166
166
  }
167
167
 
168
168
  async function pack(archiveDir) {
169
- const output = await run('npm', ['pack', '--json', '--pack-destination', archiveDir], PACKAGE_ROOT, true);
169
+ // Errors still print; the prepack/postpack banners and notices do not, because
170
+ // on a fresh install this runs inside the user's first `crtr` command.
171
+ const output = await run('npm', ['pack', '--json', '--loglevel=error', '--foreground-scripts=false', '--pack-destination', archiveDir], PACKAGE_ROOT, true);
170
172
  const packed = JSON.parse(output);
171
173
  if (!Array.isArray(packed) || typeof packed[0]?.filename !== 'string') throw new Error('npm pack did not report an archive');
172
174
  return join(archiveDir, packed[0].filename);
@@ -416,7 +418,8 @@ async function install() {
416
418
  // Humanloop's postinstall only prewarms its external termrender cache; runtime rendering retries lazily with a plaintext fallback.
417
419
  const installEnv = { ...process.env };
418
420
  delete installEnv.npm_config_allow_scripts;
419
- await run('npm', ['ci', '--omit=dev', '--ignore-scripts'], stage, false, installEnv);
421
+ // stdout is captured and dropped (npm's "added N packages" summary); errors keep stderr.
422
+ await run('npm', ['ci', '--omit=dev', '--ignore-scripts', '--no-audit', '--no-fund', '--loglevel=error'], stage, true, installEnv);
420
423
  await patchPiTreeRootOrdering(stage);
421
424
  await smokeValidate(stage);
422
425
  const pkg = JSON.parse(await readFile(join(stage, 'package.json'), 'utf8'));
@@ -473,7 +476,8 @@ async function install() {
473
476
  } catch (error) {
474
477
  process.stderr.write(`runtime generation GC skipped: ${error.message}\n`);
475
478
  }
476
- process.stdout.write(`Installed immutable crouter runtime generation ${id}\n`);
479
+ // stderr, not stdout: on a fresh install this runs inside the user's first `crtr` command, which may be `--json`.
480
+ process.stderr.write(`Installed immutable crouter runtime generation ${id}\n`);
477
481
  return { generation: id, version: pkg.version, selected };
478
482
  } finally {
479
483
  if (temporary) await rm(temporary, { force: true });