@north-light/cli 0.3.576 → 0.3.577
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/contract.d.ts +1 -1
- package/dist/api/contract.js +1 -1
- package/dist/builtin-memory/crouter-sdk/release-notes.md +4 -0
- package/dist/clients/attach/viewer.js +207 -207
- package/dist/core/io.js +4 -4
- package/dist/core/llm/run.js +1 -1
- package/dist/core/model-routes.d.ts +11 -0
- package/dist/core/model-routes.js +1 -1
- package/dist/core/peer/envelope.d.ts +2 -0
- package/dist/core/peer/envelope.js +1 -1
- package/dist/core/providers/call.js +1 -1
- package/dist/core/runtime/broker/daemon-ops.d.ts +4 -0
- package/dist/core/runtime/broker/daemon-ops.js +1 -1
- package/dist/core/runtime/broker.js +1 -1
- package/dist/core/runtime/revive.d.ts +6 -0
- package/dist/core/runtime/revive.js +2 -2
- package/dist/core/runtime/run-command.js +1 -1
- package/dist/core/runtime/spawn.js +2 -2
- package/dist/daemon/api/handlers/messages.js +2 -2
- package/dist/daemon/api/handlers/nodes.js +1 -1
- package/dist/daemon/peer/forward.js +1 -1
- package/dist/pi-extensions/canvas-inbox-watcher.js +2 -2
- package/dist/pi-extensions/canvas-stophook.js +1 -1
- package/docs/sdk/release-notes.md +4 -0
- package/package.json +2 -2
- package/packages/crouter-identity/package.json +1 -1
- package/runtime.lock.json +13 -13
package/dist/core/io.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var _=Object.defineProperty;var i=(e,t)=>_(e,"name",{value:t,configurable:!0});import{appendFileSync as b,statSync as w}from"node:fs";import{CrtrError as c}from"./errors.js";import{ExitCode as
|
|
2
|
-
`;try{if((w(t,{throwIfNoEntry:!1})?.size??0)+Buffer.byteLength(s,"utf8")>v)return;b(t,s,"utf8")}catch{}}i(y,"publishPreview");function B(e){f!==void 0&&(e!=null?y({result:e}):(f.jsonl.length>0||f.error!==void 0)&&y({...f.jsonl.length>0?{jsonl:f.jsonl}:{},...f.error===void 0?{}:{error:f.error}}))}i(B,"publishPreviewResult");function g(e){f?.jsonl.push(e)}i(g,"recordPreviewLine");function G(e){try{const t=JSON.parse(e);t!==null&&typeof t=="object"&&!Array.isArray(t)&&g(t)}catch{}}i(G,"recordPreviewJsonLine");function F(e){f!==void 0&&(f.error=e)}i(F,"recordPreviewError");function K(e){p=e}i(K,"setJsonOutput");function z(){return p}i(z,"isJsonOutput");class m extends c{static{i(this,"InputError")}payload;constructor(t,s=
|
|
1
|
+
var _=Object.defineProperty;var i=(e,t)=>_(e,"name",{value:t,configurable:!0});import{appendFileSync as b,statSync as w}from"node:fs";import{CrtrError as c}from"./errors.js";import{ExitCode as u}from"../types.js";import{PREVIEW_RESULT_PATH_ENV as h}from"./preview-result-path.js";import{renderError as A}from"./render.js";import{ApiError as E}from"../api/index.js";let p=!1,f;const v=256*1024;function q(e){const t=process.env[h];f=t===void 0||t===""?void 0:{path:e,jsonl:[]}}i(q,"beginPreview");function y(e){const t=process.env[h];if(t===void 0||t==="")return;const s=`${JSON.stringify({path:f?.path??"",...e})}
|
|
2
|
+
`;try{if((w(t,{throwIfNoEntry:!1})?.size??0)+Buffer.byteLength(s,"utf8")>v)return;b(t,s,"utf8")}catch{}}i(y,"publishPreview");function B(e){f!==void 0&&(e!=null?y({result:e}):(f.jsonl.length>0||f.error!==void 0)&&y({...f.jsonl.length>0?{jsonl:f.jsonl}:{},...f.error===void 0?{}:{error:f.error}}))}i(B,"publishPreviewResult");function g(e){f?.jsonl.push(e)}i(g,"recordPreviewLine");function G(e){try{const t=JSON.parse(e);t!==null&&typeof t=="object"&&!Array.isArray(t)&&g(t)}catch{}}i(G,"recordPreviewJsonLine");function F(e){f!==void 0&&(f.error=e)}i(F,"recordPreviewError");function K(e){p=e}i(K,"setJsonOutput");function z(){return p}i(z,"isJsonOutput");class m extends c{static{i(this,"InputError")}payload;constructor(t,s=u.USAGE){super(t.error,t.message,s,{...t}),this.name="InputError",this.payload=t}}async function D(){if(process.stdin.isTTY)return"";const e=[];for await(const t of process.stdin)e.push(t);return Buffer.concat(e).toString("utf8")}i(D,"readStdinRaw");async function V(e=200){return process.stdin.isTTY?"":await new Promise(t=>{const s=[];let n=!1;const r=i(()=>{n||(n=!0,clearTimeout(a),process.stdin.removeListener("data",o),process.stdin.removeListener("end",l),process.stdin.removeListener("error",d),process.stdin.pause(),t(Buffer.concat(s).toString("utf8")))},"finish"),o=i(x=>s.push(x),"onData"),l=i(()=>r(),"onEnd"),d=i(()=>r(),"onError"),a=setTimeout(r,e);process.stdin.on("data",o),process.stdin.on("end",l),process.stdin.on("error",d),process.stdin.resume()})}i(V,"peekStdinRaw");function Y(e){process.stdout.write(JSON.stringify(e,null,2)+`
|
|
3
3
|
`)}i(Y,"emit");function H(e){g(e),process.stdout.write(JSON.stringify(e)+`
|
|
4
4
|
`)}i(H,"emitLine");function M(e){return new Promise(t=>{let s=!1;const n=i(o=>{o.code==="EPIPE"&&r(!1)},"onErr"),r=i(o=>{s||(s=!0,process.stdout.off("error",n),t(o))},"finish");process.stdout.on("error",n);try{process.stdout.write(e,o=>r(o==null))}catch{r(!1)}})}i(M,"writeStdout");function X(e){process.stderr.write(e+`
|
|
5
|
-
`)}i(X,"diag");function S(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}i(S,"isRecord");function T(e){if(e instanceof m)return e.payload;const t=e.details!==void 0?e.details:{},s=t.primaryCompleted===!0&&t.result!==null&&typeof t.result=="object"&&!Array.isArray(t.result)?O(t.result):void 0,n=t.next!==void 0?t.next:"Inspect the error and adjust the call. See -h for the schema.",r={error:e.code,message:e.message,received:t.received,field:t.field,...typeof t.http_status=="number"?{http_status:t.http_status}:{},...typeof t.retry_after_s=="number"?{retry_after_s:t.retry_after_s}:{},...S(t.details)?{details:t.details}:{}};return s===void 0?{...r,next:n}:{...r,primaryCompleted:!0,result:s,next:n}}i(T,"payloadOf");function O(e){const t=new WeakSet;try{const s=JSON.stringify(e,(n,r)=>{if(typeof r=="bigint")return{$crtrType:"bigint",value:r.toString()};if(typeof r=="number"&&!Number.isFinite(r))return{$crtrType:"number",value:String(r)};if(typeof r>"u"||typeof r=="function"||typeof r=="symbol")return{$crtrType:typeof r};if(r!==null&&typeof r=="object"){if(t.has(r))return{$crtrType:"circular"};t.add(r)}return r});if(s!==void 0){const n=JSON.parse(s);if(n!==null&&typeof n=="object"&&!Array.isArray(n))return n}}catch{}return{$crtrType:"unavailable",message:"The completed primary result could not be represented as JSON."}}i(O,"jsonSafeResult");const N={400:"invalid_request",404:"not_found",409:"conflict",422:"unprocessable"};function R(e,t,s={}){if(e.code==="daemon_restarting")return new c("daemon_restarting",e.message,
|
|
5
|
+
`)}i(X,"diag");function S(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}i(S,"isRecord");function T(e){if(e instanceof m)return e.payload;const t=e.details!==void 0?e.details:{},s=t.primaryCompleted===!0&&t.result!==null&&typeof t.result=="object"&&!Array.isArray(t.result)?O(t.result):void 0,n=t.next!==void 0?t.next:"Inspect the error and adjust the call. See -h for the schema.",r={error:e.code,message:e.message,received:t.received,field:t.field,...typeof t.http_status=="number"?{http_status:t.http_status}:{},...typeof t.retry_after_s=="number"?{retry_after_s:t.retry_after_s}:{},...S(t.details)?{details:t.details}:{}};return s===void 0?{...r,next:n}:{...r,primaryCompleted:!0,result:s,next:n}}i(T,"payloadOf");function O(e){const t=new WeakSet;try{const s=JSON.stringify(e,(n,r)=>{if(typeof r=="bigint")return{$crtrType:"bigint",value:r.toString()};if(typeof r=="number"&&!Number.isFinite(r))return{$crtrType:"number",value:String(r)};if(typeof r>"u"||typeof r=="function"||typeof r=="symbol")return{$crtrType:typeof r};if(r!==null&&typeof r=="object"){if(t.has(r))return{$crtrType:"circular"};t.add(r)}return r});if(s!==void 0){const n=JSON.parse(s);if(n!==null&&typeof n=="object"&&!Array.isArray(n))return n}}catch{}return{$crtrType:"unavailable",message:"The completed primary result could not be represented as JSON."}}i(O,"jsonSafeResult");const N={400:"invalid_request",404:"not_found",409:"conflict",422:"unprocessable"};function R(e,t,s={}){if(e.code==="daemon_restarting")return new c("daemon_restarting",e.message,u.NETWORK,{next:"crtrd is now on the new generation \u2014 retry the command."});if(e.code==="layout_migration_required")return new c("layout_migration_required",e.message,u.NETWORK,{next:"Run `crtr sys migrate` while the runtime is offline, then restart it."});if(e.code==="daemon_unavailable")return new c("daemon_unavailable",e.message,u.NETWORK,{next:"Start it with `crtr sys daemon start`, then retry."});if(e.code==="model_sign_in_required"){const d=e.details?.url;return new m({error:e.code,message:e.message,next:typeof d=="string"?`Ask the person to sign in at ${d}, then retry.`:"Ask the person to sign in to an AI subscription on their Northlight account, then retry.",...typeof d=="string"?{details:{url:d}}:{}},u.USAGE)}const n=e.details,r=$(e,n,s.providerCall===!0);if(e.status===503||s.providerCall===!0&&e.status===504&&r.code!==void 0){const d=r.code??e.code,a={next:r.next??t??"Retry the command; if it persists, inspect the unavailable service named in the error."};return r.details!==void 0&&(a.details=r.details),r.code!==void 0&&(r.field!==void 0&&(a.field=r.field),r.received!==void 0&&(a.received=r.received),r.retryAfterS!==void 0&&(a.retry_after_s=r.retryAfterS)),new c(d,e.message,u.NETWORK,a)}const o=Array.isArray(n?.violations)?n.violations.map(d=>`${String(d.field)} ${String(d.problem)}${d.received!==void 0?` (received ${JSON.stringify(d.received)})`:""}`):[],l=n&&typeof n.error=="string"&&typeof n.message=="string"&&typeof n.next=="string"?n:{error:r.code??N[e.status]??e.code,...r.field!==void 0?{field:r.field}:{},...r.received!==void 0?{received:r.received}:{},...r.retryAfterS!==void 0?{retry_after_s:r.retryAfterS}:{},...r.details!==void 0?{details:r.details}:{},message:o.length>0?`${e.message}: ${o.join("; ")}`:e.message.trim()!==""?e.message:`request refused (HTTP ${e.status}, ${e.code}) with no message`,next:r.next??t??(r.retryAfterS!==void 0?`Wait ${r.retryAfterS}s, then retry; do not retry sooner.`:e.status>=500?"This is a crtr bug, not a bad call. Retry; if it persists, report it (the daemon log holds the full cause).":e.status===404&&r.code===void 0?"List nodes with `crtr node inspect list`.":"Inspect the error and adjust the call. See -h for the schema.")};return new m(l,j(l.error,e.status))}i(R,"apiErrorToCliError");function $(e,t,s){const n=i(o=>typeof o=="string"&&/^[a-z][a-z0-9_]*$/.test(o),"snake");if(s&&e.origin!==void 0&&e.origin!=="provider"&&n(e.code)){const o={code:e.code};return(e.status===503||e.status===504)&&(o.next=e.retryable===!0?"Retry the command; if it persists, the machine or service named in the error is unavailable.":"Read the error before retrying: the action may already have run."),S(e.details)&&(o.details=e.details),e.param!==void 0&&(o.field=e.param),typeof e.retryAfterS=="number"&&(o.retryAfterS=e.retryAfterS),o}if(e.origin!=="provider"||t===void 0||t===null||typeof t!="object")return{};const r={};return typeof t.status=="number"&&n(t.code)&&(r.code=t.code),typeof t.next=="string"&&t.next.trim()!==""&&(r.next=t.next),typeof t.field=="string"&&t.field!==""?r.field=t.field:e.param!==void 0&&(r.field=e.param),t.received!==void 0&&t.received!==null&&(r.received=t.received),typeof e.retryAfterS=="number"&&(r.retryAfterS=e.retryAfterS),r}i($,"providerSupplied");function j(e,t){return e==="not_found"||t===404?u.NOT_FOUND:e==="ambiguous"?u.AMBIGUOUS:u.USAGE}i(j,"exitForCliCode");function P(e){if(e instanceof E){P(R(e));return}if(e instanceof c){const n=T(e);f!==void 0&&y({error:n});const r=p?JSON.stringify(n,null,2):A(n);process.stdout.write(r+`
|
|
6
6
|
`),process.exitCode=e.exitCode;return}const t=e,s=t!=null&&typeof t.message=="string"?t.message:String(e);process.stderr.write(JSON.stringify({error:"internal",message:s,next:"This is a crtr bug, not a bad call. Retry; if it persists, report it."},null,2)+`
|
|
7
|
-
`),process.exitCode=
|
|
7
|
+
`),process.exitCode=u.GENERAL}i(P,"handle");export{m as InputError,v as PREVIEW_RESULT_MAX_BYTES,R as apiErrorToCliError,q as beginPreview,X as diag,Y as emit,H as emitLine,P as handle,z as isJsonOutput,V as peekStdinRaw,B as publishPreviewResult,D as readStdinRaw,F as recordPreviewError,G as recordPreviewJsonLine,g as recordPreviewLine,K as setJsonOutput,M as writeStdout};
|
package/dist/core/llm/run.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
var Oe=Object.defineProperty;var c=(e,t)=>Oe(e,"name",{value:t,configurable:!0});import{randomUUID as Se}from"node:crypto";import{streamSimple as Le}from"@earendil-works/pi-ai/compat";import{probeRouteAvailability as Ee}from"../model-routes-pool.js";import{APP_FAMILY as Fe,expandModelCandidates as _e,parseModelSpec as ye}from"../model-routes.js";import{readMergedLaunchConfig as ge}from"../config.js";import{openModelRegistry as Ne}from"../runtime/model-registry.js";import{MAX_RATE_LIMIT_COOLDOWN_MS as we,coolingUntilFor as be,isManagedProvider as Y,markSubscriptionRateLimited as De,markSubscriptionSuccess as Pe,readSubscriptionPool as Te,retryAfterMsFromHeaders as Z,retryAfterMsFromError as Je,refreshSubscriptionCredential as Ke,subscriptionNeedsSuccessWrite as We,RefreshBusyError as Ue,RefreshTimeoutError as Be}from"../subscription-state.js";import{classifyRateLimit as He,describeRateLimitScope as ve,rateLimitHeaders as ze}from"../rate-limit-scope.js";import{RunError as s}from"../runs/operations.js";import{recognizeProviderError as le}from"../provider-error-recognition.js";import{isSafetyRefusal as Xe}from"./refusal.js";import{findRefusal as Ge,payerOf as ke,refusalError as Ye,refusedMark as Ze,writeCharge as xe}from"../ledger/index.js";import{storedApiKey as Qe}from"../auth-file.js";import{personIdAsync as Ve}from"../canvas/person.js";import{getNode as qe}from"../canvas/canvas.js";import{outboundToken as et}from"../providers/mint.js";import{discardFile as tt}from"../providers/token-cache.js";import{ProviderError as nt}from"../providers/errors.js";import{appCandidates as ot}from"./app-rungs.js";function rt(e){return typeof e=="string"||e===null||Array.isArray(e)&&e.every(t=>t&&typeof t=="object"&&(t.type==="text"&&typeof t.text=="string"||t.type==="image_url"&&typeof t.image_url?.url=="string"&&/^data:image\/(png|jpeg|gif|webp);base64,[A-Za-z0-9+/]+={0,2}$/.test(t.image_url.url)))}c(rt,"validContent");function Ae(e){return Array.isArray(e)?e.map(t=>{if(t.type==="text")return t;const[,o,i]=/^data:(image\/(?:png|jpeg|gif|webp));base64,(.*)$/.exec(t.image_url.url);return{type:"image",mimeType:o,data:i}}):e??""}c(Ae,"imageContent");function it(e,t){const o=(e instanceof Error?e.message:String(e)).split("; stack=",1)[0],i=le({message:o}).kind;return i!=="connection"&&i!=="connection-only"?e:new s(503,"upstream_model_unavailable",o.slice(0,500),void 0,{served_model:t})}c(it,"refreshFailure");function Lt(e){if(!e||typeof e!="object"||Array.isArray(e))throw new s(400,"invalid_request","body must be an object");const t=e;if(!Array.isArray(t.messages)||!t.messages.every(o=>o&&typeof o=="object"&&["system","user","assistant","tool"].includes(o.role)&&rt(o.content)))throw new s(400,"invalid_request","messages must be chat messages","messages");if(t.messages.some(o=>["system","assistant"].includes(o.role)&&typeof o.content!="string"&&o.content!==null))throw new s(400,"invalid_request","system and assistant content must be text","messages");if(t.model!==void 0&&typeof t.model!="string")throw new s(400,"invalid_request","model must be a string","model");if(t.model_policy!==void 0&&!["exact","substitute"].includes(t.model_policy))throw new s(400,"invalid_request","invalid model_policy","model_policy");if(t.payer!==void 0&&!["user","app"].includes(t.payer))throw new s(400,"invalid_request","invalid payer","payer");if(t.reasoning_effort!==void 0&&!["minimal","low","medium","high","xhigh","max"].includes(t.reasoning_effort))throw new s(400,"invalid_request","invalid reasoning_effort","reasoning_effort");if(t.stream!==void 0&&typeof t.stream!="boolean")throw new s(400,"invalid_request","stream must be boolean","stream");if(t.tools!==void 0&&(!Array.isArray(t.tools)||!t.tools.every(o=>o?.type==="function"&&typeof o.function?.name=="string"&&o.function.name.length>0&&(o.function.description===void 0||typeof o.function.description=="string")&&(o.function.parameters===void 0||o.function.parameters!==null&&typeof o.function.parameters=="object"&&!Array.isArray(o.function.parameters)&&o.function.parameters.type==="object"))))throw new s(400,"invalid_request","invalid tools","tools");if(t.tool_choice!==void 0&&t.tool_choice!=="auto"&&t.tool_choice!=="none"&&t.tool_choice!=="required"&&(typeof t.tool_choice!="object"||t.tool_choice===null||t.tool_choice.type!=="function"||typeof t.tool_choice.function?.name!="string"))throw new s(400,"invalid_request","invalid tool_choice","tool_choice");if(t.messages.some(o=>o.role==="assistant"&&o.tool_calls!==void 0&&(!Array.isArray(o.tool_calls)||!o.tool_calls.every(i=>i&&typeof i.id=="string"&&typeof i.function?.name=="string"&&typeof i.function.arguments=="string"&&st(i.function.arguments)))))throw new s(400,"invalid_request","invalid assistant tool_calls","messages");if(t.stop!==void 0&&!(typeof t.stop=="string"||Array.isArray(t.stop)&&t.stop.every(o=>typeof o=="string")))throw new s(400,"invalid_request","invalid stop","stop");if(t.seed!==void 0&&!Number.isSafeInteger(t.seed))throw new s(400,"invalid_request","invalid seed","seed");for(const[o,i]of[["temperature",t.temperature],["top_p",t.top_p],["max_tokens",t.max_tokens]])if(i!==void 0&&(typeof i!="number"||!Number.isFinite(i)||o==="temperature"&&(i<0||i>2)||o==="top_p"&&(i<0||i>1)||o==="max_tokens"&&(!Number.isSafeInteger(i)||i<1)))throw new s(400,"invalid_request",`invalid ${o}`,o);if(t.response_format!==void 0){const o=t.response_format;if(!o||typeof o!="object"||Array.isArray(o)||!["text","json_object","json_schema"].includes(o.type)||o.type==="json_schema"&&(typeof o.json_schema?.name!="string"||!o.json_schema.name||!o.json_schema.schema||typeof o.json_schema.schema!="object"||Array.isArray(o.json_schema.schema)))throw new s(400,"invalid_request","invalid response_format","response_format")}if(t.metadata!==void 0&&Buffer.byteLength(JSON.stringify(t.metadata)??"")>4096)throw new s(400,"invalid_request","metadata exceeds 4 KB","metadata");return t}c(Lt,"parseLlmRequest");function st(e){try{const t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)}catch{return!1}}c(st,"isJsonObject");function at(e){const t=Date.now(),o=e.messages.map(r=>r.role==="system"?{role:"system",content:r.content??"",timestamp:t}:r.role==="tool"?{role:"toolResult",toolCallId:r.tool_call_id??"",toolName:"",content:typeof r.content=="string"||r.content===null?[{type:"text",text:r.content??""}]:Ae(r.content),isError:!1,timestamp:t}:r.role==="assistant"?{role:"assistant",content:[...r.content?[{type:"text",text:r.content}]:[],...(r.tool_calls??[]).map(_=>({type:"toolCall",id:_.id,name:_.function.name,arguments:JSON.parse(_.function.arguments)}))],api:"openai-completions",provider:"openai",model:e.model??"",usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"stop",timestamp:t}:{role:"user",content:Ae(r.content),timestamp:t}),i=o.findIndex(r=>r.role!=="system"),l=o.slice(0,i<0?o.length:i).map(r=>r.content),w=l.join(`
|
|
2
2
|
|
|
3
|
-
`),h=e.tools?.map(({function:r})=>({name:r.name,description:r.description??"",parameters:r.parameters??{type:"object",properties:{}}}));return{...w?{systemPrompt:w}:{},messages:o.slice(l.length),...h?{tools:h}:{}}}c(at,"contextOf");function Me(e,t,o,i){const l=c(()=>{const h=ge(o,i),r=Object.values({...h.modelRoutes??{},...h.legacyModelRoutes??{}});return r.length?[h.modelLadders.defaultProvider,...h.modelRouting?.familyOrder??[],...r.map(_=>_.family)].find(_=>r.some($=>$.family===_)):h.modelLadders.defaultProvider??"anthropic"},"ownerFamily");if(!e){const h=l();return{kind:"logical",family:h,strength:"strong",spec:`${h}/strong`}}const w=/^([^/]+)\/(ultra|strong|medium|light)$/.exec(e);if(w){if(w[1]===Fe){const h=l();return{kind:"logical",family:h,strength:w[2],spec:`${h}/${w[2]}`}}return{kind:"logical",family:w[1],strength:w[2],spec:e}}return{kind:t==="exact"?"exact":"concrete",spec:e}}c(Me,"requestFor");function dt(e,t){const{input:o,output:i,cacheRead:l,cacheWrite:w}=e.cost;return o===0&&i===0&&l===0&&w===0?null:Number.isFinite(t)&&t>=0?t:null}c(dt,"usdEquivalent");function lt(e,t){return e.compat?.allowedFallbackModels?.find(i=>i.provider===e.provider&&i.model===t)}c(lt,"allowedFallback");function Et(e){return e?{payer:e.payer??"user",sub:e.sub,grantee:e.grantee,inference_endpoint:e.inference_endpoint??null}:void 0}c(Et,"llmCallerOf");function ct(e){return e instanceof nt?e.code==="server_error"?new s(503,"upstream_model_unavailable",e.message):new s(404,"model_unavailable",e.message):e}c(ct,"mintFailure");const ut=/\bmodel is not supported when using Codex with a ChatGPT account\b/i;function ft(e,t,o){if(!(e!=="openai-codex"||t===void 0||!ut.test(t)))return new s(404,"model_unavailable",t,void 0,{served_model:o})}c(ft,"codexAccountModelRejection");function mt(e){return e.get("request-id")??e.get("x-request-id")}c(mt,"vendorRequestId");async function Ft(e,t,o,i,l,w,h){const r=w?.payer==="app"?w:void 0;if(e.payer==="app"&&!r)throw new s(403,"payer_not_app","this grant is not app-paid");if(e.payer==="user"&&r)throw new s(400,"invalid_request","this grant is app-paid; payer cannot be user","payer");if(r&&!r.inference_endpoint)throw new s(404,"model_unavailable",`${r.grantee} is app-paid but its grant carries no inference endpoint`);const _=r?.inference_endpoint??void 0,$=l===void 0?null:r?.sub??l.sub??await Ve(),N=await Ne(),ce=c(u=>u.routeId!=="concrete"&&u.routeId!=="exact","configured"),ue=c(u=>{const y=N.find(u.providerId,u.modelId);return y!==void 0&&(!e.reasoning_effort||y.reasoning)&&(e.seed===void 0&&e.response_format===void 0||y.api==="openai-completions")&&(e.stop===void 0||["openai-completions","anthropic-messages"].includes(y.api))},"matchesFeatures"),je=c(async()=>{const u=Me(e.model,e.model_policy,i?.cwd,i?.profileId),y=(await _e(u.kind==="exact"?{kind:"concrete",spec:u.spec}:u,i?.cwd,i?.profileId)).filter(ce);let a;if(u.kind==="logical")a=e.model_policy==="exact"?y.filter(f=>f.family===u.family&&f.strength===u.strength).slice(0,1):y;else{const f=ye(u.spec),L=y.filter(k=>k.providerId===f?.providerId&&k.modelId===f.modelId&&(e.model_policy!=="exact"||k.thinkingLevel===f.thinkingLevel)&&ue(k));if(e.model_policy==="exact")a=L.slice(0,1);else if(L.length)a=L;else{const k=ge(i?.cwd,i?.profileId),M=[...Object.values(k.modelRoutes??{}).flatMap(x=>Object.entries(x.models)),...[k.modelLadders.anthropic,k.modelLadders.openai].flatMap(x=>Object.entries(x))].find(([,x])=>x===u.spec)?.[0],D=Me(void 0,"substitute",i?.cwd,i?.profileId);a=M&&D.kind==="logical"?(await _e({...D,strength:M,spec:u.spec},i?.cwd,i?.profileId)).filter(x=>ce(x)&&x.strength===M):[]}}return a},"ownerCandidates");let O;if(_?O=ot(_,e.model,e.model_policy==="exact").flatMap((u,y)=>{const a=ye(u.model);return a?[{routeId:"app",credentialSource:"app",family:"app",strength:u.strength,...a,rank:y}]:[]}):O=await je(),O=O.filter(ue),O.length===0)throw e.model_policy==="exact"?new s(400,"substitution_refused","no eligible model route is configured"):new s(404,"model_unavailable","no eligible model route is configured");const J=`chatcmpl-${Se()}`;let S=1/0,v,Q,V;const fe=c(async()=>h??(l?.node?(await qe(l.node))?.caused_by??null:null)??(l?.run?(await qe(l.run))?.caused_by??null:null),"causeOf");for(const u of O){if(!r&&!(await Ee(u,N)).authenticated)continue;const y=N.find(u.providerId,u.modelId);if(!y)continue;const a=_?{...y,baseUrl:`${_.base_url}/${y.provider}`}:y,f=u.providerId,L=!r&&Y(f)?await Te(f):[],k=L.filter(j=>!j.authFailure),ee=k.filter(j=>be(j,a.id)<=Date.now()),M=L.length?await Qe(f):void 0;if(k.length&&!ee.length&&M===void 0){const j=Math.min(...k.map(I=>be(I,a.id)));j<S&&(S=j,Q=`${a.provider}/${a.id}`);continue}const D=r?[void 0,void 0]:k.length||M!==void 0?[...ee,...M!==void 0?["key"]:[]]:[void 0];let x=!1;for(const[j,I]of D.entries()){if(x&&I!=="key")continue;const g=I==="key"?void 0:I,me=I==="key",K=Date.now();let pe=g?.access;if(g&&g.expires<=Date.now()&&Y(f)){const n=N.getProvider(f)?.auth.oauth;if(!n)throw new s(503,"upstream_model_unavailable",`no OAuth refresh for ${f}`,void 0,{served_model:`${a.provider}/${a.id}`});pe=(await Ke(f,g.label,async(m,he)=>{const G=await n.refresh({type:"oauth",refresh:m,access:"",expires:0,...he?{clientId:he}:{}},t??new AbortController().signal).catch(Ce=>{throw it(Ce,`${a.provider}/${a.id}`)}),de=G.clientId;return{refresh:G.refresh,access:G.access,expires:G.expires,...typeof de=="string"&&de?{clientId:de}:{}}}).catch(m=>{throw m instanceof Ue||m instanceof Be?new s(503,"upstream_model_unavailable",m.message,void 0,{served_model:`${a.provider}/${a.id}`}):m})).access}const Re=at(e),E=g||r||me?void 0:await N.getApiKeyAndHeaders(a);if(E&&!E.ok)continue;const p=`${a.provider}/${a.id}`,F=e.model??p,R=r?ke({call:"model",route:"endpoint",grantee:r.grantee}):$===null?null:ke({call:"model",route:g?"subscription":"key",sub:$});if(l!==void 0&&R!==null){const n=await Ge({scope:"call",payer:R.payer,funding:R.funding,sub:$,grantee:l.grantee,provider:f});if(n!==null){if(await xe({request:l.request??J,kind:"model",what:p,usd:null,payer:R.payer,funding:R.funding,sub:$,grantee:l.grantee,node:l.node??null,run:l.run??null,provider:f,causedBy:await fe(),refused:Ze(n)}),V??=n,I!=="key"&&D.includes("key")){x=!0;continue}break}}let W;if(r&&_)try{W=await et({audience:_.base_url,sub:r.sub,grantee:r.grantee,initiating_app:r.grantee,scope:["crtr:llm"]},{signal:t})}catch(n){throw ct(n)}let A=!1,P,te=null,q=3e4,C;const ne=[],oe=[],U=[];let d,B;const H=c((n,b=null)=>({id:J,object:"chat.completion.chunk",created:Math.floor(K/1e3),model:p,served_model:p,requested_model:F,substituted:F!==p&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(F),choices:[{index:0,delta:n,finish_reason:b}]}),"chunk"),z=c(n=>{ne.push(n),o?.(n)},"emit"),$e=Le(a,Re,{apiKey:W?.access_token??pe??(me?M:void 0)??(E?.ok?E.apiKey:void 0),...E?.ok?{headers:E.headers}:{},signal:t,reasoning:e.reasoning_effort??u.thinkingLevel,...e.temperature!==void 0?{temperature:e.temperature}:{},...e.max_tokens!==void 0?{maxTokens:e.max_tokens}:{},...e.top_p!==void 0?{samplingParams:{top_p:e.top_p}}:{},...e.tool_choice==="none"?{toolChoice:"none"}:{},onPayload:c(n=>{if(!n||typeof n!="object")return;const b=e.tool_choice,m=b==="required"?a.api==="anthropic-messages"?{type:"any"}:"required":typeof b=="object"&&b!==null?a.api==="anthropic-messages"?{type:"tool",name:b.function.name}:b:void 0;return{...n,...m?{tool_choice:m}:{},...e.stop!==void 0?{[a.api==="anthropic-messages"?"stop_sequences":"stop"]:typeof e.stop=="string"?[e.stop]:e.stop}:{},...e.seed!==void 0?{seed:e.seed}:{},...e.response_format!==void 0?{response_format:e.response_format}:{}}},"onPayload"),fetch:c(async(n,b)=>{const m=await fetch(n,b);return P=m.status,te=mt(m.headers)??te,m.status===429&&(A=!0,C=m.headers,q=Z(m.headers)??15e3),m},"fetch"),onResponse:c(n=>{n.status===429&&(A=!0,C=n.headers,q=Z(n.headers)??15e3)},"onResponse")});try{for await(const n of $e)n.type==="text_delta"&&(oe.push(n.delta),z(H({content:n.delta}))),n.type==="thinking_delta"&&(U.push(n.delta),z(H({reasoning_content:n.delta}))),n.type==="done"&&(d=n.message),n.type==="error"&&(d=n.error)}catch(n){const b=Je(n);C===void 0&&n&&typeof n=="object"&&"headers"in n&&Object.keys(ze(n.headers)).length&&(C=n.headers);const m=le({status:n&&typeof n=="object"&&"status"in n?n.status:void 0,message:n instanceof Error?n.message:String(n)});if(r)B=n;else{if(!A&&m.kind!=="rate-limit")throw ne.length?new s(503,"upstream_model_unavailable",n instanceof Error?n.message:String(n),void 0,{served_model:p}):n;A=!0,q=b??q}}if(r){if(P===401){if(W&&tt(W.key),j===0)continue;throw new s(404,"model_unavailable",`${_.base_url} refuses this runtime's tokens`,void 0,{served_model:p})}if(A&&Z(C)===void 0)throw new s(503,"upstream_model_unavailable",`${p} was rate-limited without a retry-after`,void 0,{served_model:p});if(!A&&(B!==void 0||P!==void 0&&P>=500))throw new s(503,"upstream_model_unavailable",B instanceof Error?B.message:d?.errorMessage??"inference endpoint failed",void 0,{served_model:p})}if(!A&&d?.stopReason==="error"&&le({message:d.errorMessage}).kind==="rate-limit"&&(A=!0,q=15e3),A){const n=He(C,a.id);if(Z(C)===void 0&&n.resetAt!==void 0&&(q=Math.max(q,n.resetAt-Date.now())),v={provider:f,model:a.id,...g?{account:g.label}:{},observation:n},console.error(`[llm] 429 from ${p}${g?` account "${g.label}"`:""}: scope=${ve(n.scope)} retry_after_ms=${q} headers=${JSON.stringify(n.headers)}`),g&&Y(f)&&await De(f,g.label,q,K,Date.now(),n.scope),Date.now()+Math.min(q,we)<S&&(S=Date.now()+Math.min(q,we),Q=p),oe.length||U.length)throw new s(503,"service_unavailable","vendor rate limit after output began",void 0,{served_model:p});if(r)break;continue}const X=Xe(d);if(P===400&&e.tool_choice!==void 0&&e.tool_choice!=="auto"&&e.tool_choice!=="none"&&/\btool[_ ]choice\b/i.test(d?.errorMessage??"")&&/not supported|does not support|unsupported|cannot|must be auto/i.test(d?.errorMessage??""))throw new s(400,"invalid_request",d.errorMessage,"tool_choice",{served_model:p});if(d?.stopReason==="error"){const n=ft(a.provider,d.errorMessage,p);if(n)throw n}if(!d||d.stopReason==="error"&&!X||d.stopReason==="aborted")throw new s(503,"upstream_model_unavailable",d?.errorMessage??"model request failed",void 0,{served_model:p});g&&Y(f)&&We(g,a.id)&&await Pe(f,g.label,K,a.id);const re=d.content.filter(n=>n.type==="toolCall").map(n=>({id:n.id,type:"function",function:{name:n.name,arguments:JSON.stringify(n.arguments)}})),ie=X?"content_filter":d.stopReason==="toolUse"?"tool_calls":d.stopReason==="length"?"length":"stop",se=d.responseModel?lt(a,d.responseModel):void 0,T=se?`${a.provider}/${se.model}`:p,ae={prompt_tokens:d.usage.input,completion_tokens:d.usage.output,total_tokens:d.usage.totalTokens,cache_read_tokens:d.usage.cacheRead,cache_write_tokens:d.usage.cacheWrite,usd_equivalent:dt(se??a,d.usage.cost.total),served_model:T};l!==void 0&&R!==null&&await xe({request:l.request??J,kind:"model",what:T,units:{input:d.usage.input,output:d.usage.output,cache_read:d.usage.cacheRead,cache_write:d.usage.cacheWrite},usd:ae.usd_equivalent,payer:R.payer,funding:R.funding,sub:$,grantee:l.grantee,node:l.node??null,run:l.run??null,provider:f,causedBy:await fe(),vendorRef:te});const Ie={id:J,object:"chat.completion",created:Math.floor(K/1e3),model:T,served_model:T,requested_model:F,substituted:F!==T&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(F),choices:[{index:0,message:{role:"assistant",content:oe.join("")||null,...U.length?{reasoning_content:U.join("")}:{},...re.length?{tool_calls:re}:{},...X?{refusal:d.errorMessage??"Content filtered"}:{}},finish_reason:ie}],usage:ae,...e.metadata!==void 0?{metadata:e.metadata}:{}};for(const[n,b]of re.entries())z(H({tool_calls:[{index:n,...b}]}));return z({...H({},ie),...X?{choices:[{index:0,delta:{},finish_reason:ie,message:{refusal:d.errorMessage??"Content filtered"}}]}:{},usage:ae}),{completion:Ie,chunks:ne}}}throw V!==void 0?Ye(V):S!==1/0?new s(429,"all_routes_exhausted","all eligible model routes are rate-limited",void 0,{retry_after_s:Math.max(1,Math.ceil((S-Date.now())/1e3)),served_model:v?`${v.provider}/${v.model}`:Q,...v?{rate_limit:{provider:v.provider,model:v.model,...v.account?{account:v.account}:{},scope:ve(v.observation.scope),...v.observation.claim?{claim:v.observation.claim}:{},headers:v.observation.headers}}:{}},void 0,!0):e.model_policy==="exact"?new s(400,"substitution_refused","the requested model is unavailable"):new s(404,"model_unavailable","no usable model route is available")}c(Ft,"runLlm");export{Et as llmCallerOf,Lt as parseLlmRequest,Ft as runLlm};
|
|
3
|
+
`),h=e.tools?.map(({function:r})=>({name:r.name,description:r.description??"",parameters:r.parameters??{type:"object",properties:{}}}));return{...w?{systemPrompt:w}:{},messages:o.slice(l.length),...h?{tools:h}:{}}}c(at,"contextOf");function Me(e,t,o,i){const l=c(()=>{const h=ge(o,i),r=Object.values({...h.modelRoutes??{},...h.legacyModelRoutes??{}});return r.length?[h.modelLadders.defaultProvider,...h.modelRouting?.familyOrder??[],...r.map(_=>_.family)].find(_=>r.some($=>$.family===_)):h.modelLadders.defaultProvider??"anthropic"},"ownerFamily");if(!e){const h=l();return{kind:"logical",family:h,strength:"strong",spec:`${h}/strong`}}const w=/^([^/]+)\/(ultra|strong|medium|light)$/.exec(e);if(w){if(w[1]===Fe){const h=l();return{kind:"logical",family:h,strength:w[2],spec:`${h}/${w[2]}`}}return{kind:"logical",family:w[1],strength:w[2],spec:e}}return{kind:t==="exact"?"exact":"concrete",spec:e}}c(Me,"requestFor");function dt(e,t){const{input:o,output:i,cacheRead:l,cacheWrite:w}=e.cost;return o===0&&i===0&&l===0&&w===0?null:Number.isFinite(t)&&t>=0?t:null}c(dt,"usdEquivalent");function lt(e,t){return e.compat?.allowedFallbackModels?.find(i=>i.provider===e.provider&&i.model===t)}c(lt,"allowedFallback");function Et(e){return e?{payer:e.payer??"user",sub:e.sub,grantee:e.grantee,inference_endpoint:e.inference_endpoint??null}:void 0}c(Et,"llmCallerOf");function ct(e){return e instanceof nt?e.code==="server_error"?new s(503,"upstream_model_unavailable",e.message):new s(404,"model_unavailable",e.message):e}c(ct,"mintFailure");const ut=/\bmodel is not supported when using Codex with a ChatGPT account\b/i;function ft(e,t,o){if(!(e!=="openai-codex"||t===void 0||!ut.test(t)))return new s(404,"model_unavailable",t,void 0,{served_model:o})}c(ft,"codexAccountModelRejection");function mt(e){return e.get("request-id")??e.get("x-request-id")}c(mt,"vendorRequestId");async function Ft(e,t,o,i,l,w,h){const r=w?.payer==="app"?w:void 0;if(e.payer==="app"&&!r)throw new s(403,"payer_not_app","this grant is not app-paid");if(e.payer==="user"&&r)throw new s(400,"invalid_request","this grant is app-paid; payer cannot be user","payer");if(r&&!r.inference_endpoint)throw new s(404,"model_unavailable",`${r.grantee} is app-paid but its grant carries no inference endpoint`);const _=r?.inference_endpoint??void 0,$=l===void 0?null:r?.sub??l.sub??await Ve(),N=await Ne(),ce=c(u=>u.unrouted!==!0,"configured"),ue=c(u=>{const y=N.find(u.providerId,u.modelId);return y!==void 0&&(!e.reasoning_effort||y.reasoning)&&(e.seed===void 0&&e.response_format===void 0||y.api==="openai-completions")&&(e.stop===void 0||["openai-completions","anthropic-messages"].includes(y.api))},"matchesFeatures"),je=c(async()=>{const u=Me(e.model,e.model_policy,i?.cwd,i?.profileId),y=(await _e(u.kind==="exact"?{kind:"concrete",spec:u.spec}:u,i?.cwd,i?.profileId)).filter(ce);let a;if(u.kind==="logical")a=e.model_policy==="exact"?y.filter(f=>f.family===u.family&&f.strength===u.strength).slice(0,1):y;else{const f=ye(u.spec),L=y.filter(k=>k.providerId===f?.providerId&&k.modelId===f.modelId&&(e.model_policy!=="exact"||k.thinkingLevel===f.thinkingLevel)&&ue(k));if(e.model_policy==="exact")a=L.slice(0,1);else if(L.length)a=L;else{const k=ge(i?.cwd,i?.profileId),M=[...Object.values(k.modelRoutes??{}).flatMap(x=>Object.entries(x.models)),...[k.modelLadders.anthropic,k.modelLadders.openai].flatMap(x=>Object.entries(x))].find(([,x])=>x===u.spec)?.[0],D=Me(void 0,"substitute",i?.cwd,i?.profileId);a=M&&D.kind==="logical"?(await _e({...D,strength:M,spec:u.spec},i?.cwd,i?.profileId)).filter(x=>ce(x)&&x.strength===M):[]}}return a},"ownerCandidates");let O;if(_?O=ot(_,e.model,e.model_policy==="exact").flatMap((u,y)=>{const a=ye(u.model);return a?[{routeId:"app",credentialSource:"app",family:"app",strength:u.strength,...a,rank:y}]:[]}):O=await je(),O=O.filter(ue),O.length===0)throw e.model_policy==="exact"?new s(400,"substitution_refused","no eligible model route is configured"):new s(404,"model_unavailable","no eligible model route is configured");const J=`chatcmpl-${Se()}`;let S=1/0,v,Q,V;const fe=c(async()=>h??(l?.node?(await qe(l.node))?.caused_by??null:null)??(l?.run?(await qe(l.run))?.caused_by??null:null),"causeOf");for(const u of O){if(!r&&!(await Ee(u,N)).authenticated)continue;const y=N.find(u.providerId,u.modelId);if(!y)continue;const a=_?{...y,baseUrl:`${_.base_url}/${y.provider}`}:y,f=u.providerId,L=!r&&Y(f)?await Te(f):[],k=L.filter(j=>!j.authFailure),ee=k.filter(j=>be(j,a.id)<=Date.now()),M=L.length?await Qe(f):void 0;if(k.length&&!ee.length&&M===void 0){const j=Math.min(...k.map(I=>be(I,a.id)));j<S&&(S=j,Q=`${a.provider}/${a.id}`);continue}const D=r?[void 0,void 0]:k.length||M!==void 0?[...ee,...M!==void 0?["key"]:[]]:[void 0];let x=!1;for(const[j,I]of D.entries()){if(x&&I!=="key")continue;const g=I==="key"?void 0:I,me=I==="key",K=Date.now();let pe=g?.access;if(g&&g.expires<=Date.now()&&Y(f)){const n=N.getProvider(f)?.auth.oauth;if(!n)throw new s(503,"upstream_model_unavailable",`no OAuth refresh for ${f}`,void 0,{served_model:`${a.provider}/${a.id}`});pe=(await Ke(f,g.label,async(m,he)=>{const G=await n.refresh({type:"oauth",refresh:m,access:"",expires:0,...he?{clientId:he}:{}},t??new AbortController().signal).catch(Ce=>{throw it(Ce,`${a.provider}/${a.id}`)}),de=G.clientId;return{refresh:G.refresh,access:G.access,expires:G.expires,...typeof de=="string"&&de?{clientId:de}:{}}}).catch(m=>{throw m instanceof Ue||m instanceof Be?new s(503,"upstream_model_unavailable",m.message,void 0,{served_model:`${a.provider}/${a.id}`}):m})).access}const Re=at(e),E=g||r||me?void 0:await N.getApiKeyAndHeaders(a);if(E&&!E.ok)continue;const p=`${a.provider}/${a.id}`,F=e.model??p,R=r?ke({call:"model",route:"endpoint",grantee:r.grantee}):$===null?null:ke({call:"model",route:g?"subscription":"key",sub:$});if(l!==void 0&&R!==null){const n=await Ge({scope:"call",payer:R.payer,funding:R.funding,sub:$,grantee:l.grantee,provider:f});if(n!==null){if(await xe({request:l.request??J,kind:"model",what:p,usd:null,payer:R.payer,funding:R.funding,sub:$,grantee:l.grantee,node:l.node??null,run:l.run??null,provider:f,causedBy:await fe(),refused:Ze(n)}),V??=n,I!=="key"&&D.includes("key")){x=!0;continue}break}}let W;if(r&&_)try{W=await et({audience:_.base_url,sub:r.sub,grantee:r.grantee,initiating_app:r.grantee,scope:["crtr:llm"]},{signal:t})}catch(n){throw ct(n)}let A=!1,P,te=null,q=3e4,C;const ne=[],oe=[],U=[];let d,B;const H=c((n,b=null)=>({id:J,object:"chat.completion.chunk",created:Math.floor(K/1e3),model:p,served_model:p,requested_model:F,substituted:F!==p&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(F),choices:[{index:0,delta:n,finish_reason:b}]}),"chunk"),z=c(n=>{ne.push(n),o?.(n)},"emit"),$e=Le(a,Re,{apiKey:W?.access_token??pe??(me?M:void 0)??(E?.ok?E.apiKey:void 0),...E?.ok?{headers:E.headers}:{},signal:t,reasoning:e.reasoning_effort??u.thinkingLevel,...e.temperature!==void 0?{temperature:e.temperature}:{},...e.max_tokens!==void 0?{maxTokens:e.max_tokens}:{},...e.top_p!==void 0?{samplingParams:{top_p:e.top_p}}:{},...e.tool_choice==="none"?{toolChoice:"none"}:{},onPayload:c(n=>{if(!n||typeof n!="object")return;const b=e.tool_choice,m=b==="required"?a.api==="anthropic-messages"?{type:"any"}:"required":typeof b=="object"&&b!==null?a.api==="anthropic-messages"?{type:"tool",name:b.function.name}:b:void 0;return{...n,...m?{tool_choice:m}:{},...e.stop!==void 0?{[a.api==="anthropic-messages"?"stop_sequences":"stop"]:typeof e.stop=="string"?[e.stop]:e.stop}:{},...e.seed!==void 0?{seed:e.seed}:{},...e.response_format!==void 0?{response_format:e.response_format}:{}}},"onPayload"),fetch:c(async(n,b)=>{const m=await fetch(n,b);return P=m.status,te=mt(m.headers)??te,m.status===429&&(A=!0,C=m.headers,q=Z(m.headers)??15e3),m},"fetch"),onResponse:c(n=>{n.status===429&&(A=!0,C=n.headers,q=Z(n.headers)??15e3)},"onResponse")});try{for await(const n of $e)n.type==="text_delta"&&(oe.push(n.delta),z(H({content:n.delta}))),n.type==="thinking_delta"&&(U.push(n.delta),z(H({reasoning_content:n.delta}))),n.type==="done"&&(d=n.message),n.type==="error"&&(d=n.error)}catch(n){const b=Je(n);C===void 0&&n&&typeof n=="object"&&"headers"in n&&Object.keys(ze(n.headers)).length&&(C=n.headers);const m=le({status:n&&typeof n=="object"&&"status"in n?n.status:void 0,message:n instanceof Error?n.message:String(n)});if(r)B=n;else{if(!A&&m.kind!=="rate-limit")throw ne.length?new s(503,"upstream_model_unavailable",n instanceof Error?n.message:String(n),void 0,{served_model:p}):n;A=!0,q=b??q}}if(r){if(P===401){if(W&&tt(W.key),j===0)continue;throw new s(404,"model_unavailable",`${_.base_url} refuses this runtime's tokens`,void 0,{served_model:p})}if(A&&Z(C)===void 0)throw new s(503,"upstream_model_unavailable",`${p} was rate-limited without a retry-after`,void 0,{served_model:p});if(!A&&(B!==void 0||P!==void 0&&P>=500))throw new s(503,"upstream_model_unavailable",B instanceof Error?B.message:d?.errorMessage??"inference endpoint failed",void 0,{served_model:p})}if(!A&&d?.stopReason==="error"&&le({message:d.errorMessage}).kind==="rate-limit"&&(A=!0,q=15e3),A){const n=He(C,a.id);if(Z(C)===void 0&&n.resetAt!==void 0&&(q=Math.max(q,n.resetAt-Date.now())),v={provider:f,model:a.id,...g?{account:g.label}:{},observation:n},console.error(`[llm] 429 from ${p}${g?` account "${g.label}"`:""}: scope=${ve(n.scope)} retry_after_ms=${q} headers=${JSON.stringify(n.headers)}`),g&&Y(f)&&await De(f,g.label,q,K,Date.now(),n.scope),Date.now()+Math.min(q,we)<S&&(S=Date.now()+Math.min(q,we),Q=p),oe.length||U.length)throw new s(503,"service_unavailable","vendor rate limit after output began",void 0,{served_model:p});if(r)break;continue}const X=Xe(d);if(P===400&&e.tool_choice!==void 0&&e.tool_choice!=="auto"&&e.tool_choice!=="none"&&/\btool[_ ]choice\b/i.test(d?.errorMessage??"")&&/not supported|does not support|unsupported|cannot|must be auto/i.test(d?.errorMessage??""))throw new s(400,"invalid_request",d.errorMessage,"tool_choice",{served_model:p});if(d?.stopReason==="error"){const n=ft(a.provider,d.errorMessage,p);if(n)throw n}if(!d||d.stopReason==="error"&&!X||d.stopReason==="aborted")throw new s(503,"upstream_model_unavailable",d?.errorMessage??"model request failed",void 0,{served_model:p});g&&Y(f)&&We(g,a.id)&&await Pe(f,g.label,K,a.id);const re=d.content.filter(n=>n.type==="toolCall").map(n=>({id:n.id,type:"function",function:{name:n.name,arguments:JSON.stringify(n.arguments)}})),ie=X?"content_filter":d.stopReason==="toolUse"?"tool_calls":d.stopReason==="length"?"length":"stop",se=d.responseModel?lt(a,d.responseModel):void 0,T=se?`${a.provider}/${se.model}`:p,ae={prompt_tokens:d.usage.input,completion_tokens:d.usage.output,total_tokens:d.usage.totalTokens,cache_read_tokens:d.usage.cacheRead,cache_write_tokens:d.usage.cacheWrite,usd_equivalent:dt(se??a,d.usage.cost.total),served_model:T};l!==void 0&&R!==null&&await xe({request:l.request??J,kind:"model",what:T,units:{input:d.usage.input,output:d.usage.output,cache_read:d.usage.cacheRead,cache_write:d.usage.cacheWrite},usd:ae.usd_equivalent,payer:R.payer,funding:R.funding,sub:$,grantee:l.grantee,node:l.node??null,run:l.run??null,provider:f,causedBy:await fe(),vendorRef:te});const Ie={id:J,object:"chat.completion",created:Math.floor(K/1e3),model:T,served_model:T,requested_model:F,substituted:F!==T&&!/^([^/]+)\/(ultra|strong|medium|light)$/.test(F),choices:[{index:0,message:{role:"assistant",content:oe.join("")||null,...U.length?{reasoning_content:U.join("")}:{},...re.length?{tool_calls:re}:{},...X?{refusal:d.errorMessage??"Content filtered"}:{}},finish_reason:ie}],usage:ae,...e.metadata!==void 0?{metadata:e.metadata}:{}};for(const[n,b]of re.entries())z(H({tool_calls:[{index:n,...b}]}));return z({...H({},ie),...X?{choices:[{index:0,delta:{},finish_reason:ie,message:{refusal:d.errorMessage??"Content filtered"}}]}:{},usage:ae}),{completion:Ie,chunks:ne}}}throw V!==void 0?Ye(V):S!==1/0?new s(429,"all_routes_exhausted","all eligible model routes are rate-limited",void 0,{retry_after_s:Math.max(1,Math.ceil((S-Date.now())/1e3)),served_model:v?`${v.provider}/${v.model}`:Q,...v?{rate_limit:{provider:v.provider,model:v.model,...v.account?{account:v.account}:{},scope:ve(v.observation.scope),...v.observation.claim?{claim:v.observation.claim}:{},headers:v.observation.headers}}:{}},void 0,!0):e.model_policy==="exact"?new s(400,"substitution_refused","the requested model is unavailable"):new s(404,"model_unavailable","no usable model route is available")}c(Ft,"runLlm");export{Et as llmCallerOf,Lt as parseLlmRequest,Ft as runLlm};
|
|
@@ -21,6 +21,8 @@ export type RoutedCandidate = {
|
|
|
21
21
|
modelId: string;
|
|
22
22
|
thinkingLevel?: string;
|
|
23
23
|
rank: number;
|
|
24
|
+
/** Set on a candidate no configured route offers: an exact request, or a concrete request's fallback to its own model. */
|
|
25
|
+
unrouted?: true;
|
|
24
26
|
};
|
|
25
27
|
export type RouteAvailability = {
|
|
26
28
|
authenticated: boolean;
|
|
@@ -81,6 +83,15 @@ export declare function unregisteredConcreteModel(request: ModelRequest | undefi
|
|
|
81
83
|
cwd?: string;
|
|
82
84
|
profileId?: string | null;
|
|
83
85
|
}): Promise<UnregisteredConcreteModel | undefined>;
|
|
86
|
+
/** A concrete request whose model is registered but offered by no configured route. The daemon serves a turn only
|
|
87
|
+
* from configured routes, so such a recipe is accepted and then faults every turn with "no eligible model route".
|
|
88
|
+
* An exact request is served without any route, so it is never unroutable. */
|
|
89
|
+
export declare function unroutableConcreteModel(request: ModelRequest | undefined, options?: {
|
|
90
|
+
cwd?: string;
|
|
91
|
+
profileId?: string | null;
|
|
92
|
+
}): Promise<Extract<ModelRequest, {
|
|
93
|
+
kind: 'concrete';
|
|
94
|
+
}> | undefined>;
|
|
84
95
|
/** The availability facts of one route given the managed pool already read for its provider (undefined for a provider that has no pool). */
|
|
85
96
|
export declare function routeAvailability(candidate: RoutedCandidate, registry: ModelRegistryLike, pool: readonly SubscriptionCredential[] | undefined, now?: number): RouteAvailability;
|
|
86
97
|
export declare function modelRequestFromConfig(model: string | undefined, modelIntent: string | undefined, exact: boolean): ModelRequest | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var G=Object.defineProperty;var c=(e,t)=>G(e,"name",{value:t,configurable:!0});import{readMergedLaunchConfig as H}from"./config.js";import{brokerConfigSnapshot as P}from"./config.js";import{coolingUntilFor as M}from"./managed-providers.js";const I="app",v=["ultra","strong","medium","light"],A=new Set(["off","minimal","low","medium","high","xhigh","max"]);function p(e){const t=e.indexOf("/");if(t<=0||t===e.length-1)return;const o=e.slice(0,t),r=e.slice(t+1),d=r.lastIndexOf(":"),a=d>0?r.slice(d+1).toLowerCase():void 0;return{providerId:o,modelId:a!==void 0&&A.has(a)?r.slice(0,d):r,...a!==void 0&&A.has(a)&&a!=="off"?{thinkingLevel:a}:{}}}c(p,"parseModelSpec");function _(e){const t=c(o=>{const r=e[o].strong.slice(0,e[o].strong.indexOf("/"));return{family:o,credentialSource:"default",providerId:r,models:e[o]}},"route");return{anthropic:t("anthropic"),openai:t("openai")}}c(_,"synthesizeRoutes");function N(e,t){return[e,...t.filter(o=>o!==e)]}c(N,"ordered");function z(e,t){return N(e,t).filter((o,r,d)=>d.indexOf(o)===r)}c(z,"strengths");let O;function B(e){O=e}c(B,"registerRotationReader");async function D(){const e=P();return e?e.rotation:O?O():{}}c(D,"rotationConfig");async function T(e,t,o){if(e.kind==="exact"){const n=p(e.spec);return n?[{routeId:"exact",credentialSource:"exact",family:n.providerId,strength:"strong",...n,rank:0,unrouted:!0}]:[]}if(e.kind==="logical"&&e.family===I){const n=p(e.spec);return n?[{routeId:I,credentialSource:I,family:I,strength:e.strength,...n,rank:0}]:[]}const r=H(t,o??null),d={...r.modelRoutes??{},...r.legacyModelRoutes??{}},a=Object.keys(d).length>0?d:_(r.modelLadders),l=Object.entries(a),g=r.modelRouting?.strengthFallback??[(await D()).defaultFallbackStrength??"strong"],j=l.map(([,n])=>n.family).filter((n,i,s)=>s.indexOf(n)===i),R=l.map(([,n])=>n.credentialSource).filter((n,i,s)=>s.indexOf(n)===i),f=e.kind==="concrete"?p(e.spec):void 0,w=e.kind==="logical"?e:void 0,C=c((n,i)=>{const s=p(n);return s!==void 0&&f!==void 0&&s.providerId===f.providerId&&s.modelId===f.modelId&&(!i||s.thinkingLevel===f.thinkingLevel)},"matchesConcrete"),x=f===void 0?void 0:l.find(([,n])=>Object.values(n.models).some(i=>C(i,!1))),k=w?.strength??(()=>{if(!f)return"strong";for(const n of[!0,!1])for(const i of n?v:[...v].reverse())if(l.some(([,s])=>{const m=s.models[i];return m!==void 0&&C(m,n)}))return i;return"strong"})(),S=w?.family??x?.[1].family??f?.providerId??"anthropic",E=f?R:r.modelRouting?.credentialSourceOrder??R,U=f?[S]:r.modelRouting?.familyOrder??j,y=[],b=new Set,F=c((n,i,s,m,h=!1)=>{const u=p(m);if(!u||f&&u.modelId!==f.modelId)return;const L=JSON.stringify([n,u.providerId,u.modelId,u.thinkingLevel]);b.has(L)||(b.add(L),y.push({routeId:n,credentialSource:i.credentialSource,family:i.family,strength:s,...u,rank:y.length,...h?{unrouted:!0}:{}}))},"append");if(f){const[n,i]=x??["concrete",{family:S,credentialSource:"default"}];F(n,i,k,e.spec,x===void 0)}for(const n of E)for(const i of f?[k]:z(k,g))for(const s of N(S,U))for(const[m,h]of l){if(h.credentialSource!==n||h.family!==s)continue;const u=h.models[i];u&&F(m,h,i,u)}return y.map((n,i)=>({...n,rank:i}))}c(T,"expandModelCandidates");async function Q(e,t,o={}){if(e===void 0||e.kind==="logical")return;const r=(await T(e,o.cwd,o.profileId))[0];if(!(r===void 0||t.find(r.providerId,r.modelId)!==void 0))return{request:e,candidate:r,reason:"unregistered"}}c(Q,"unregisteredConcreteModel");async function V(e,t={}){if(e?.kind!=="concrete")return;const o=(await T(e,t.cwd,t.profileId))[0];return o===void 0||o.unrouted?e:void 0}c(V,"unroutableConcreteModel");function W(e,t,o,r=Date.now()){const d=t.find(e.providerId,e.modelId);if(d===void 0)return{registered:!1,authenticated:!1};if(o===void 0)return{registered:!0,authenticated:t.hasConfiguredAuth(d)};const a=o.filter(g=>g.authFailure===void 0),l=a.length>0&&a.every(g=>M(g,e.modelId)>r);return{registered:!0,authenticated:a.length>0||t.hasConfiguredAuth(d),...l?{coolingUntil:Math.min(...a.map(g=>M(g,e.modelId)))}:{}}}c(W,"routeAvailability");function Z(e,t,o){if(e){if(o)return{kind:"exact",spec:e};if(t){const r=t.lastIndexOf("/"),d=r>0?t.slice(r+1):"";if(v.includes(d))return{kind:"logical",family:t.slice(0,r),strength:d,spec:e}}return{kind:"concrete",spec:e}}}c(Z,"modelRequestFromConfig");export{I as APP_FAMILY,T as expandModelCandidates,Z as modelRequestFromConfig,p as parseModelSpec,B as registerRotationReader,W as routeAvailability,Q as unregisteredConcreteModel,V as unroutableConcreteModel};
|
|
@@ -4,6 +4,8 @@ import { type RunPlace } from '../permissions/ceiling.js';
|
|
|
4
4
|
export declare const ENVELOPE_HEADER = "Crtr-Envelope";
|
|
5
5
|
/** A header larger than this is refused unread. */
|
|
6
6
|
export declare const MAX_ENVELOPE_BYTES: number;
|
|
7
|
+
/** The largest header a sender builds. Node's HTTP parser answers 431 once a request's headers together pass 16 KiB, so this leaves 4 KiB for the bearer token and the other headers. */
|
|
8
|
+
export declare const MAX_SENT_ENVELOPE_BYTES: number;
|
|
7
9
|
/** The app (and its node) a call is made for. `node` is null for a cron with no anchor node. */
|
|
8
10
|
export interface EnvelopeApp {
|
|
9
11
|
sub: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var w=Object.defineProperty;var a=(e,o)=>w(e,"name",{value:o,configurable:!0});import{joinedOwner as m}from"../directory/join.js";import{nodePlace as d}from"../permissions/ceiling.js";import{openDb as f}from"../canvas/db.js";import{ownMachineId as p}from"./directory.js";const N="Crtr-Envelope",E=16*1024,h=12*1024;class r extends Error{static{a(this,"EnvelopeError")}constructor(o){super(o),this.name="EnvelopeError"}}async function x(e,o={}){return b(await v(e,o))}a(x,"envelopeFor");async function v(e,o){const n=o.via??p(),t=e.class==="person"?"":e.sub,s=o.owner??(t.startsWith("user:")?t:m());if(s==null)throw new r("this machine has no account owner to make a peer call for");if(e.class==="person")return{sub:s,act:{sub:n}};if(e.class==="broker"){const c=await(o.placeOf??(async u=>await d(await f(),u)))(e.node);return{sub:s,act:{sub:n,act:{sub:e.app,node:e.node,node_scopes:e.scopes===null?null:[...e.scopes],place:c}}}}return{sub:s,act:{sub:n,act:{sub:e.app,node:e.anchor,node_scopes:e.scopes===null?null:[...e.scopes],place:{run:e.origin_run??"",isolated:e.isolated}}}}}a(v,"buildEnvelope");function b(e){const o=y(e).length;if(o>h){const n=e.act.act?.node_scopes?.length;throw new r(`the call's identity is ${o} bytes, over the ${h}-byte limit for a call to another machine${n===void 0?"":` (the node holds ${n} scopes)`}; narrow the node's scopes`)}return e}a(b,"fits");function y(e){return Buffer.from(JSON.stringify(e),"utf8").toString("base64url")}a(y,"encodeEnvelope");const i=a(e=>typeof e=="string"&&e!=="","isString"),l=a(e=>typeof e=="object"&&e!==null&&!Array.isArray(e),"isRecord");function P(e){if(e.length>E)throw new r("the envelope is too large");if(!/^[A-Za-z0-9_-]+$/.test(e))throw new r("the envelope is not base64url");let o;try{o=JSON.parse(Buffer.from(e,"base64url").toString("utf8"))}catch{throw new r("the envelope is not JSON")}if(!l(o)||!i(o.sub)||!o.sub.startsWith("user:"))throw new r("the envelope names no user");const n=o.act;if(!l(n)||!i(n.sub)||!n.sub.startsWith("runtime:"))throw new r("the envelope names no calling machine");const t=n.act;if(t===void 0)return{sub:o.sub,act:{sub:n.sub}};if(!l(t)||!i(t.sub)||!t.sub.startsWith("app:"))throw new r("the envelope names no calling app");const{node:s,node_scopes:c,place:u}=t;if(s!==null&&!i(s))throw new r("the envelope node is not a node id");if(c!==null&&!(Array.isArray(c)&&c.every(i)))throw new r("the envelope node_scopes is not a list of scopes");if(u!==null&&!(l(u)&&typeof u.run=="string"&&typeof u.isolated=="boolean"))throw new r("the envelope place is malformed");return{sub:o.sub,act:{sub:n.sub,act:{sub:t.sub,node:s,node_scopes:c,place:u===null?null:{run:u.run,isolated:u.isolated}}}}}a(P,"decodeEnvelope");async function $(e,o,n={}){const t=n.via??p();if(e.class==="person"||e.grantee===null)return{sub:o,act:{sub:t}};const s=e.node_id===null?null:await(n.placeOf??(async c=>await d(await f(),c)))(e.node_id);return b({sub:o,act:{sub:t,act:{sub:e.grantee,node:e.node_id,node_scopes:e.nodeScopes===null?null:[...e.nodeScopes],place:s}}})}a($,"envelopeForProviderCaller");export{N as ENVELOPE_HEADER,r as EnvelopeError,E as MAX_ENVELOPE_BYTES,h as MAX_SENT_ENVELOPE_BYTES,P as decodeEnvelope,y as encodeEnvelope,x as envelopeFor,$ as envelopeForProviderCaller};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var de=Object.defineProperty;var m=(e,r)=>de(e,"name",{value:r,configurable:!0});import{validateDeclaredResult as x}from"../../api/command-manifest/result.js";import{callerAllows as ue,requireGroup as le}from"../../daemon/api/handlers/providers.js";import{callerTerminalGrant as pe}from"../grants/terminal.js";import{findRefusal as ce,payerOf as fe,refusalError as me,refusedMark as ve,writeCharge as ge}from"../ledger/index.js";import{listInstalledPlugins as he}from"../resolver.js";import{ProviderError as l}from"./errors.js";import{resolveProviderRef as we}from"./roots.js";import{providerToolPath as ye}from"../plugin-objects-manifest.js";import{ensureProviderBundle as be,refreshProviderBundle as X,resolveProviderBundle as O,unavailableProviderError as _e}from"./bundles.js";import{prepareFileCall as Ae,resignForRetry as Y,resolveFileResult as Z}from"./files.js";import{consumeApproval as je,requireProviderApproval as ke}from"./approval.js";import{outboundToken as Pe}from"./mint.js";import{discardFile as $e}from"./token-cache.js";import{registerProviderCall as qe}from"./inflight.js";import{buildRequestPlan as Ce}from"../command-plugins/transport/http-plan.js";import{newTraceId as Ee}from"../../shared/traceparent.js";import{sendProviderRequest as Re,ProviderTransportError as Te}from"./request.js";import{acceptProviderReceipt as Ie}from"./receipts.js";import{writeProviderAudit as Me}from"./audit.js";import{selectDevice as Se,sendDeviceCall as Be,deviceFailure as Ne,deviceUnreachable as ee,DEFAULT_DEVICE_REQUEST_MS as Oe}from"./device.js";import{isLibsSearch as re,wantsBundling as Fe,callLibsSearch as De,bundleExec as Ue,mapLibOutcome as Le,reportLibCalls as Je}from"./device-libs.js";import{ownMachineId as He}from"../peer/directory.js";import{directoryIssuer as xe}from"../directory/issuer.js";import{formatCrtrCaller as te}from"../command-plugins/caller-header.js";import{getNode as Ge}from"../canvas/canvas.js";import{envelopeForProviderCaller as ze}from"../peer/envelope.js";const Qe="app:terminal";function oe(e){const r=[],n=m((c,t,i)=>{const s=[...t,c.name],d=i||c.tier==="hidden";if(c.kind==="branch"){for(const v of c.children)n(v,s,d);return}const j=ye(e.roots.length,s);r.push({tool:j,leaf:c,hidden:d})},"walk");for(const c of e.roots)n(c,[],!1);return r}m(oe,"providerLeaves");function ie(e){if(e.kind!=="branch")return null;const r=[];for(const g of e.children)if(g.kind==="branch"){const b=ie(g);b&&r.push(b)}else if("group"in g&&g.group){const{kind:b,name:u,description:_,whenToUse:h,tier:w,summary:k,params:P,output:o,effects:p,group:A}=g;r.push({kind:b,name:u,description:_,whenToUse:h,...w===void 0?{}:{tier:w},summary:k,params:P,output:o,effects:p,group:A})}if(r.length===0)return null;const{kind:n,name:c,description:t,whenToUse:i,tier:s,summary:d,model:j,rootEntry:v}=e;return{kind:n,name:c,description:t,whenToUse:i,...s===void 0?{}:{tier:s},summary:d,...j===void 0?{}:{model:j},...v===void 0?{}:{rootEntry:v},children:r}}m(ie,"providerHelpBranch");async function Cr(e,r){const n=await O(r),c=oe(n.commands),t=he("user").find(i=>i.name===r)?.manifest.description??r;return{provider:r,status:"available",major:n.major,display_name:t,transport:n.transport.kind,groups:n.provider.groups.filter(i=>ue(e,`${r}:${i.group}`)).map(i=>({group:i.group,leaves:c.filter(({leaf:s,hidden:d})=>!d&&s.group===i.group).map(({tool:s,leaf:d})=>({tool:s,description:d.description,summary:d.summary,params:d.params,output:d.output}))})),commands:n.commands.roots.flatMap(i=>{const s=ie(i);return s?[s]:[]})}}m(Cr,"providerTools");async function Ve(e){return await Ie(e.headers["crtr-receipt"],e)}m(Ve,"onProviderResponse");async function Ke(e){if(e.class==="person"){const r=(await pe())?.sub;if(!r)throw new l("grant_revoked","This machine has no active Northlight grant for your terminal. Run `crtr sys join` again from /account/machines.");return{sub:r,grantee:r}}if(!e.sub||!e.grantee)throw new l("grant_revoked","the caller has no active grant");return{sub:e.sub,grantee:e.grantee}}m(Ke,"identity");function We(e,r){return[`${e.id}:${r.group}`]}m(We,"callScope");function Xe(e,r){const n=oe(e.commands).find(c=>c.tool===r);if(!n)throw new l("not_found",`tool "${r}" is not in provider "${e.id}"`,{param:"tool"});if(!n.leaf.group)throw new l("not_found",`tool "${r}" has no group`,{param:"tool"});return n.leaf}m(Xe,"leafFor");function G(e){if(!e||typeof e!="object"||Array.isArray(e))return{};const r=e.error;return!r||typeof r!="object"||Array.isArray(r)?{}:r}m(G,"errorBody");function Ye(e){const r=Array.isArray(e)?e[0]:e;if(!r)return;const n=Number(r);if(Number.isFinite(n)&&n>=0)return n;const c=Date.parse(r);return Number.isFinite(c)?Math.max(0,Math.ceil((c-Date.now())/1e3)):void 0}m(Ye,"retryAfter");function F(e,r,n,c=!1){const t=G(r),i=typeof t.code=="string"?t.code:void 0,s=typeof t.message=="string"?t.message:`provider answered HTTP ${e}`,d=typeof t.field=="string"?t.field:void 0,v={origin:"provider",details:{code:i??null,message:s,...d?{field:d}:{},...typeof t.next=="string"?{next:t.next}:{},...t.received!==void 0?{received:t.received}:{},status:e},...d?{param:d}:{}};return e===429?new l("provider_rate_limited",s,{...v,retry_after_s:Ye(n["retry-after"])}):e===401||e>=500?new l("provider_unavailable",s,v):e===403&&i==="provider_refused"?new l("provider_refused",s,v):e===403&&i==="approval_required"?new l("provider_error",c?"provider asked for approval again":"provider approval question is invalid",{...v,status:e}):new l("provider_error",s,{...v,status:e})}m(F,"mapProviderResponse");function ne(e,r){return JSON.stringify({major:e.major,endpoint:e.transport.kind==="http"?e.transport.endpoint:null,baseUrl:e.commands.baseUrl??null,rest:r.rest,params:r.params,output:r.output})}m(ne,"approvalShape");async function Ze(e){const r=e.origin!==void 0?te({node:e.origin.node??void 0,run:e.origin.run??void 0,machine:e.origin.machine}):te({node:e.node_id??void 0,run:e.run_id??void 0,profile:e.node_id?(await Ge(e.node_id))?.profile_id??void 0:void 0,machine:xe()!==null?He():void 0});return r===""?{}:{"Crtr-Caller":r}}m(Ze,"crtrCallerHeader");async function Er(e,r,n){const c=we(r.provider);if(c===null)throw new l("not_found",`provider "${r.provider}" is not available`,{param:"provider"});const t={...r,provider:c},i=new AbortController,s=m(()=>i.abort(n.signal.reason),"abort");n.signal.aborted?s():n.signal.addEventListener("abort",s,{once:!0});let d=n.requestId;const j=n.traceId??Ee(),v=qe({request_id:d,run_id:e.run_id,node_id:e.node_id,controller:i});let g,b,u,_,h,w,k,P="allowed";try{try{await be(t.provider)}catch{throw _e(t.provider)}let o=await O(t.provider,t.version),p=!1,A=!1,$,D,C,z=!1,Q=!1,U,V=0;for(;;){const y=Xe(o,t.tool);if(u=`${o.id}:${y.group}`,le(e,o.id,y.group),o.transport.kind!=="machine"&&t.machine!==void 0)throw new l("invalid_argument",`provider "${o.id}" is not served by a device, so it takes no machine`,{param:"machine"});o.transport.kind==="machine"&&U===void 0&&(U=await Se(t.machine,void 0,{newest:re(o.major,t.tool)}),V=Date.now()+(o.commands.timeouts?.requestMs??Oe));let L=null;if(t.approval&&!z){const a=await je(e,t,ne(o,y));C=a.option,L=a.prepared,k=t.approval,d=a.requestId,z=!0}const M={params:y.params.filter(a=>"type"in a&&a.type==="file").map(a=>a.name),output:y.output.find(a=>a.type==="file")?.name??null},K=JSON.stringify(M);if(D!==void 0&&D!==K)throw new l("provider_bad_response","the refreshed manifest changed the tool file contract",{origin:"provider",details:{status:409,message:"manifest_stale changed the tool file contract"}});D=K,L&&($=await Y(e,M,t.arguments,L,{signal:i.signal})),$??=await Ae(e,M,t.arguments,{signal:i.signal});const{sub:R,grantee:S}=await Ke(e);if(o.transport.kind==="machine"){const a=await er(e,o,t,y,$,{sub:R,requestId:d,deadlineAt:V,signal:i.signal,machine:U});return w=a.responder,g=a.cleanup,{status:200,body:a.result}}const W=o.transport.endpoint;let E;try{E=await Pe({audience:W,sub:R,grantee:S,initiating_app:S,scope:We(o,y)},{signal:i.signal})}catch(a){if(!(a instanceof l)||a.details?.directory_error!=="invalid_target"||A)throw a;A=!0,await X(o.id,{conditional:!1,...t.version===void 0?{}:{version:t.version}});const q=await O(o.id,t.version);if(q.transport.kind==="machine"||q.transport.endpoint===W)throw a;o=q;continue}_=E.jti;const J=e.class==="person"?Qe:S,T=fe({call:"tool",tokenPayer:E.payer,sub:R}),H=await ce({scope:"call",payer:T.payer,funding:T.funding,sub:R,grantee:J,provider:`app:${o.id}`});if(H!==null)throw await ge({request:d,kind:"tool",what:`${o.id}:${t.tool}`,usd:0,payer:T.payer,funding:T.funding,sub:R,grantee:J,node:e.node_id,run:e.run_id,provider:`app:${o.id}`,causedBy:n.causedBy??null,refused:ve(H)}),me(H);const ae={registration:{name:o.id,endpoint:o.transport.endpoint},...o.commands.baseUrl?{baseUrl:o.commands.baseUrl}:{},...o.commands.timeouts?{timeouts:o.commands.timeouts}:{},params:y.params,rest:y.rest,output:y.output,commandPath:[o.id,...t.tool.split(" ")]},se=Ce(ae,$.arguments,void 0,{authorization:`Bearer ${E.access_token}`,requestId:d,traceId:j,fileMode:"pass-through",extraHeaders:{...n.causedBy?{"Crtr-Caused-By":n.causedBy}:{},...e.run_id?{"Crtr-Run-Id":e.run_id}:{},...await Ze(e),...C?{"Crtr-Approval":C}:{},...$.headers}});b??=Date.now()+(o.commands.timeouts?.requestMs??3e4);let f;try{if(f=await Re(se,{connectMs:o.commands.timeouts?.connectMs,requestMs:o.commands.timeouts?.requestMs,deadlineAt:b,signal:i.signal}),i.signal.aborted)throw i.signal.reason??new Error("provider call aborted")}catch(a){throw i.signal.aborted?i.signal.reason??a:a instanceof Te?new l("provider_unavailable",a.message,{origin:"provider",details:{status:null,code:a.kind}}):a}if(h??=await Ve({provider:o.id,tool:t.tool,request_id:d,run_id:e.run_id,sub:R,grantee:S,payer:E.payer,ledger_grantee:J,funding:T.funding,node_id:e.node_id,caused_by:n.causedBy??null,jti:E.jti,status:f.status,headers:f.headers}),w=f.headers["crtr-responder"],f.status===401&&$e(E.key),f.status>=200&&f.status<300){const a=f.body;if(!a||typeof a!="object"||Array.isArray(a))throw new l("provider_bad_response","provider result is not a JSON object",{origin:"provider",details:{status:f.status,message:"provider result is not a JSON object"}});let q;try{q=await Z(e,$,a,{signal:i.signal})}catch(I){throw I instanceof l&&I.code==="provider_error"?new l("provider_bad_response",I.message,{origin:"provider",details:{status:f.status,message:I.message}}):I}g=q.cleanup;const N=x(y.output,q.result);if(N)throw new l("provider_bad_response",`provider result has an invalid output field "${N.field}"`,{origin:"provider",param:N.field,details:{status:f.status,...N}});if(i.signal.aborted)throw i.signal.reason??new Error("provider call aborted");return{status:200,body:q.result}}const B=G(f.body);if(f.status===403&&B.code==="approval_required"&&!C&&!Q){Q=!0;const a=await ke(e,t,d,B.question,i.signal,ne(o,y),$);if(k=a.questionId,C=a.option,$=await Y(e,M,t.arguments,$,{signal:i.signal}),b=void 0,i.signal.aborted)throw new l("user_denied","the approval wait was canceled");continue}if(f.status===403&&B.code==="approval_required"&&C)throw F(f.status,f.body,f.headers,!0);if(f.status!==401&&B.manifest_stale===!0&&!p){p=!0,await X(o.id,{conditional:!1,...t.version===void 0?{}:{version:t.version}}),o=await O(o.id,t.version);continue}throw F(f.status,f.body,f.headers,!!C)}}catch(o){throw o instanceof l&&o.question_id&&(k=o.question_id),w===void 0&&o instanceof l&&typeof o.responder=="string"&&(w=o.responder),P=`refused:${o instanceof l?o.code:"server_error"}`,await g?.(),o}finally{try{await Me({request_id:d,caller:e,provider:t.provider,tool:t.tool,scope_checked:u,outcome:P,jti:_,receipt_id:h,responder:w,question_id:k})}finally{v()}n.signal.removeEventListener("abort",s)}}m(Er,"callProvider");async function er(e,r,n,c,t,i){const{machine:s}=i,d=await ze(e,i.sub),j={machine:s,envelope:d,signal:i.signal,deadlineAt:i.deadlineAt,mapFailure:F};if(re(r.major,n.tool)){const p=await De(j,t.arguments,r.major),A=x(c.output,p);if(A)throw new l("provider_bad_response",`the libraries result has an invalid output field "${A.field}"`,{origin:"provider",param:A.field,details:{status:200,...A}});return{result:p,responder:void 0,cleanup:void 0}}let v=t.arguments,g=null,b="";if(Fe(r.major,n.tool,t.arguments)){const p=await Ue(j,t.arguments,r.major);if(i.deadlineAt-Date.now()<=0)throw ee(s,"timeout","");p!==null&&(v=p.arguments,g=p.services,b=p.release)}const u=await Be(s,{tool:n.tool,arguments:v,version:r.major,requestId:i.requestId,runId:e.run_id,deadlineAt:i.deadlineAt,upload:t.upload===null?null:{id:t.upload.upload_id,link:t.upload.upload_link}},d,i.signal);if(i.signal.aborted)throw i.signal.reason??new Error("provider call aborted");if("unreachable"in u)throw ee(s,u.unreachable.reason,u.unreachable.message);const _=u.headers["crtr-responder"],h=G(u.body);if(u.status<200||u.status>=300){const p=Ne(s,u.status,typeof h.code=="string"?h.code:void 0,typeof h.message=="string"?h.message:void 0,u.body),A=p===null&&u.status>=500&&typeof h.code=="string"?new l("provider_error",typeof h.message=="string"?h.message:`the device answered HTTP ${u.status}`,{origin:"runtime",status:u.status,details:{code:h.code,status:u.status}}):null;throw Object.assign(p??A??F(u.status,u.body,u.headers),{responder:_})}const w=u.body&&typeof u.body=="object"&&!Array.isArray(u.body)?u.body.result:void 0;if(!w||typeof w!="object"||Array.isArray(w))throw Object.assign(new l("provider_bad_response","the device result is not a JSON object",{origin:"provider",details:{status:u.status,message:"the device result is not a JSON object"}}),{responder:_});let k=w;if(g!==null){const p=Le(k,g);if(Je(s,d,b,p.calls),"error"in p)throw Object.assign(p.error,{responder:_});k=p.result}let P;try{P=await Z(e,t,k,{signal:i.signal})}catch(p){throw p instanceof l&&p.code==="provider_error"?Object.assign(new l("provider_bad_response",p.message,{origin:"provider",details:{status:u.status,message:p.message}}),{responder:_}):p}const o=x(c.output,P.result);if(o)throw await P.cleanup?.(),Object.assign(new l("provider_bad_response",`the device result has an invalid output field "${o.field}"`,{origin:"provider",param:o.field,details:{status:u.status,...o}}),{responder:_});return{result:P.result,responder:_,cleanup:P.cleanup}}m(er,"callDevice");export{Er as callProvider,Ze as crtrCallerHeader,Ke as identity,F as mapProviderResponse,Ve as onProviderResponse,oe as providerLeaves,Cr as providerTools};
|
|
1
|
+
var de=Object.defineProperty;var m=(e,r)=>de(e,"name",{value:r,configurable:!0});import{validateDeclaredResult as x}from"../../api/command-manifest/result.js";import{callerAllows as ue,requireGroup as le}from"../../daemon/api/handlers/providers.js";import{callerTerminalGrant as pe}from"../grants/terminal.js";import{findRefusal as ce,payerOf as fe,refusalError as me,refusedMark as ve,writeCharge as ge}from"../ledger/index.js";import{listInstalledPlugins as he}from"../resolver.js";import{ProviderError as l}from"./errors.js";import{resolveProviderRef as we}from"./roots.js";import{providerToolPath as ye}from"../plugin-objects-manifest.js";import{ensureProviderBundle as be,refreshProviderBundle as X,resolveProviderBundle as O,unavailableProviderError as _e}from"./bundles.js";import{prepareFileCall as Ae,resignForRetry as Y,resolveFileResult as Z}from"./files.js";import{consumeApproval as je,requireProviderApproval as ke}from"./approval.js";import{outboundToken as Pe}from"./mint.js";import{discardFile as $e}from"./token-cache.js";import{registerProviderCall as Ee}from"./inflight.js";import{buildRequestPlan as qe}from"../command-plugins/transport/http-plan.js";import{newTraceId as Ce}from"../../shared/traceparent.js";import{sendProviderRequest as Re,ProviderTransportError as Te}from"./request.js";import{acceptProviderReceipt as Ie}from"./receipts.js";import{writeProviderAudit as Me}from"./audit.js";import{selectDevice as Se,sendDeviceCall as Be,deviceFailure as Ne,deviceUnreachable as ee,DEFAULT_DEVICE_REQUEST_MS as Oe}from"./device.js";import{isLibsSearch as re,wantsBundling as Fe,callLibsSearch as De,bundleExec as Ue,mapLibOutcome as Le,reportLibCalls as Je}from"./device-libs.js";import{ownMachineId as He}from"../peer/directory.js";import{directoryIssuer as xe}from"../directory/issuer.js";import{formatCrtrCaller as te}from"../command-plugins/caller-header.js";import{getNode as Ge}from"../canvas/canvas.js";import{envelopeForProviderCaller as ze,EnvelopeError as Qe}from"../peer/envelope.js";const Ve="app:terminal";function oe(e){const r=[],n=m((c,t,i)=>{const u=[...t,c.name],s=i||c.tier==="hidden";if(c.kind==="branch"){for(const v of c.children)n(v,u,s);return}const j=ye(e.roots.length,u);r.push({tool:j,leaf:c,hidden:s})},"walk");for(const c of e.roots)n(c,[],!1);return r}m(oe,"providerLeaves");function ie(e){if(e.kind!=="branch")return null;const r=[];for(const g of e.children)if(g.kind==="branch"){const b=ie(g);b&&r.push(b)}else if("group"in g&&g.group){const{kind:b,name:p,description:_,whenToUse:h,tier:w,summary:k,params:P,output:o,effects:d,group:A}=g;r.push({kind:b,name:p,description:_,whenToUse:h,...w===void 0?{}:{tier:w},summary:k,params:P,output:o,effects:d,group:A})}if(r.length===0)return null;const{kind:n,name:c,description:t,whenToUse:i,tier:u,summary:s,model:j,rootEntry:v}=e;return{kind:n,name:c,description:t,whenToUse:i,...u===void 0?{}:{tier:u},summary:s,...j===void 0?{}:{model:j},...v===void 0?{}:{rootEntry:v},children:r}}m(ie,"providerHelpBranch");async function Cr(e,r){const n=await O(r),c=oe(n.commands),t=he("user").find(i=>i.name===r)?.manifest.description??r;return{provider:r,status:"available",major:n.major,display_name:t,transport:n.transport.kind,groups:n.provider.groups.filter(i=>ue(e,`${r}:${i.group}`)).map(i=>({group:i.group,leaves:c.filter(({leaf:u,hidden:s})=>!s&&u.group===i.group).map(({tool:u,leaf:s})=>({tool:u,description:s.description,summary:s.summary,params:s.params,output:s.output}))})),commands:n.commands.roots.flatMap(i=>{const u=ie(i);return u?[u]:[]})}}m(Cr,"providerTools");async function Ke(e){return await Ie(e.headers["crtr-receipt"],e)}m(Ke,"onProviderResponse");async function We(e){if(e.class==="person"){const r=(await pe())?.sub;if(!r)throw new l("grant_revoked","This machine has no active Northlight grant for your terminal. Run `crtr sys join` again from /account/machines.");return{sub:r,grantee:r}}if(!e.sub||!e.grantee)throw new l("grant_revoked","the caller has no active grant");return{sub:e.sub,grantee:e.grantee}}m(We,"identity");function Xe(e,r){return[`${e.id}:${r.group}`]}m(Xe,"callScope");function Ye(e,r){const n=oe(e.commands).find(c=>c.tool===r);if(!n)throw new l("not_found",`tool "${r}" is not in provider "${e.id}"`,{param:"tool"});if(!n.leaf.group)throw new l("not_found",`tool "${r}" has no group`,{param:"tool"});return n.leaf}m(Ye,"leafFor");function G(e){if(!e||typeof e!="object"||Array.isArray(e))return{};const r=e.error;return!r||typeof r!="object"||Array.isArray(r)?{}:r}m(G,"errorBody");function Ze(e){const r=Array.isArray(e)?e[0]:e;if(!r)return;const n=Number(r);if(Number.isFinite(n)&&n>=0)return n;const c=Date.parse(r);return Number.isFinite(c)?Math.max(0,Math.ceil((c-Date.now())/1e3)):void 0}m(Ze,"retryAfter");function F(e,r,n,c=!1){const t=G(r),i=typeof t.code=="string"?t.code:void 0,u=typeof t.message=="string"?t.message:`provider answered HTTP ${e}`,s=typeof t.field=="string"?t.field:void 0,v={origin:"provider",details:{code:i??null,message:u,...s?{field:s}:{},...typeof t.next=="string"?{next:t.next}:{},...t.received!==void 0?{received:t.received}:{},status:e},...s?{param:s}:{}};return e===429?new l("provider_rate_limited",u,{...v,retry_after_s:Ze(n["retry-after"])}):e===401||e>=500?new l("provider_unavailable",u,v):e===403&&i==="provider_refused"?new l("provider_refused",u,v):e===403&&i==="approval_required"?new l("provider_error",c?"provider asked for approval again":"provider approval question is invalid",{...v,status:e}):new l("provider_error",u,{...v,status:e})}m(F,"mapProviderResponse");function ne(e,r){return JSON.stringify({major:e.major,endpoint:e.transport.kind==="http"?e.transport.endpoint:null,baseUrl:e.commands.baseUrl??null,rest:r.rest,params:r.params,output:r.output})}m(ne,"approvalShape");async function er(e){const r=e.origin!==void 0?te({node:e.origin.node??void 0,run:e.origin.run??void 0,machine:e.origin.machine}):te({node:e.node_id??void 0,run:e.run_id??void 0,profile:e.node_id?(await Ge(e.node_id))?.profile_id??void 0:void 0,machine:xe()!==null?He():void 0});return r===""?{}:{"Crtr-Caller":r}}m(er,"crtrCallerHeader");async function Rr(e,r,n){const c=we(r.provider);if(c===null)throw new l("not_found",`provider "${r.provider}" is not available`,{param:"provider"});const t={...r,provider:c},i=new AbortController,u=m(()=>i.abort(n.signal.reason),"abort");n.signal.aborted?u():n.signal.addEventListener("abort",u,{once:!0});let s=n.requestId;const j=n.traceId??Ce(),v=Ee({request_id:s,run_id:e.run_id,node_id:e.node_id,controller:i});let g,b,p,_,h,w,k,P="allowed";try{try{await be(t.provider)}catch{throw _e(t.provider)}let o=await O(t.provider,t.version),d=!1,A=!1,$,D,q,z=!1,Q=!1,U,V=0;for(;;){const y=Ye(o,t.tool);if(p=`${o.id}:${y.group}`,le(e,o.id,y.group),o.transport.kind!=="machine"&&t.machine!==void 0)throw new l("invalid_argument",`provider "${o.id}" is not served by a device, so it takes no machine`,{param:"machine"});o.transport.kind==="machine"&&U===void 0&&(U=await Se(t.machine,void 0,{newest:re(o.major,t.tool)}),V=Date.now()+(o.commands.timeouts?.requestMs??Oe));let L=null;if(t.approval&&!z){const a=await je(e,t,ne(o,y));q=a.option,L=a.prepared,k=t.approval,s=a.requestId,z=!0}const M={params:y.params.filter(a=>"type"in a&&a.type==="file").map(a=>a.name),output:y.output.find(a=>a.type==="file")?.name??null},K=JSON.stringify(M);if(D!==void 0&&D!==K)throw new l("provider_bad_response","the refreshed manifest changed the tool file contract",{origin:"provider",details:{status:409,message:"manifest_stale changed the tool file contract"}});D=K,L&&($=await Y(e,M,t.arguments,L,{signal:i.signal})),$??=await Ae(e,M,t.arguments,{signal:i.signal});const{sub:R,grantee:S}=await We(e);if(o.transport.kind==="machine"){const a=await rr(e,o,t,y,$,{sub:R,requestId:s,deadlineAt:V,signal:i.signal,machine:U});return w=a.responder,g=a.cleanup,{status:200,body:a.result}}const W=o.transport.endpoint;let C;try{C=await Pe({audience:W,sub:R,grantee:S,initiating_app:S,scope:Xe(o,y)},{signal:i.signal})}catch(a){if(!(a instanceof l)||a.details?.directory_error!=="invalid_target"||A)throw a;A=!0,await X(o.id,{conditional:!1,...t.version===void 0?{}:{version:t.version}});const E=await O(o.id,t.version);if(E.transport.kind==="machine"||E.transport.endpoint===W)throw a;o=E;continue}_=C.jti;const J=e.class==="person"?Ve:S,T=fe({call:"tool",tokenPayer:C.payer,sub:R}),H=await ce({scope:"call",payer:T.payer,funding:T.funding,sub:R,grantee:J,provider:`app:${o.id}`});if(H!==null)throw await ge({request:s,kind:"tool",what:`${o.id}:${t.tool}`,usd:0,payer:T.payer,funding:T.funding,sub:R,grantee:J,node:e.node_id,run:e.run_id,provider:`app:${o.id}`,causedBy:n.causedBy??null,refused:ve(H)}),me(H);const ae={registration:{name:o.id,endpoint:o.transport.endpoint},...o.commands.baseUrl?{baseUrl:o.commands.baseUrl}:{},...o.commands.timeouts?{timeouts:o.commands.timeouts}:{},params:y.params,rest:y.rest,output:y.output,commandPath:[o.id,...t.tool.split(" ")]},se=qe(ae,$.arguments,void 0,{authorization:`Bearer ${C.access_token}`,requestId:s,traceId:j,fileMode:"pass-through",extraHeaders:{...n.causedBy?{"Crtr-Caused-By":n.causedBy}:{},...e.run_id?{"Crtr-Run-Id":e.run_id}:{},...await er(e),...q?{"Crtr-Approval":q}:{},...$.headers}});b??=Date.now()+(o.commands.timeouts?.requestMs??3e4);let f;try{if(f=await Re(se,{connectMs:o.commands.timeouts?.connectMs,requestMs:o.commands.timeouts?.requestMs,deadlineAt:b,signal:i.signal}),i.signal.aborted)throw i.signal.reason??new Error("provider call aborted")}catch(a){throw i.signal.aborted?i.signal.reason??a:a instanceof Te?new l("provider_unavailable",a.message,{origin:"provider",details:{status:null,code:a.kind}}):a}if(h??=await Ke({provider:o.id,tool:t.tool,request_id:s,run_id:e.run_id,sub:R,grantee:S,payer:C.payer,ledger_grantee:J,funding:T.funding,node_id:e.node_id,caused_by:n.causedBy??null,jti:C.jti,status:f.status,headers:f.headers}),w=f.headers["crtr-responder"],f.status===401&&$e(C.key),f.status>=200&&f.status<300){const a=f.body;if(!a||typeof a!="object"||Array.isArray(a))throw new l("provider_bad_response","provider result is not a JSON object",{origin:"provider",details:{status:f.status,message:"provider result is not a JSON object"}});let E;try{E=await Z(e,$,a,{signal:i.signal})}catch(I){throw I instanceof l&&I.code==="provider_error"?new l("provider_bad_response",I.message,{origin:"provider",details:{status:f.status,message:I.message}}):I}g=E.cleanup;const N=x(y.output,E.result);if(N)throw new l("provider_bad_response",`provider result has an invalid output field "${N.field}"`,{origin:"provider",param:N.field,details:{status:f.status,...N}});if(i.signal.aborted)throw i.signal.reason??new Error("provider call aborted");return{status:200,body:E.result}}const B=G(f.body);if(f.status===403&&B.code==="approval_required"&&!q&&!Q){Q=!0;const a=await ke(e,t,s,B.question,i.signal,ne(o,y),$);if(k=a.questionId,q=a.option,$=await Y(e,M,t.arguments,$,{signal:i.signal}),b=void 0,i.signal.aborted)throw new l("user_denied","the approval wait was canceled");continue}if(f.status===403&&B.code==="approval_required"&&q)throw F(f.status,f.body,f.headers,!0);if(f.status!==401&&B.manifest_stale===!0&&!d){d=!0,await X(o.id,{conditional:!1,...t.version===void 0?{}:{version:t.version}}),o=await O(o.id,t.version);continue}throw F(f.status,f.body,f.headers,!!q)}}catch(o){throw o instanceof l&&o.question_id&&(k=o.question_id),w===void 0&&o instanceof l&&typeof o.responder=="string"&&(w=o.responder),P=`refused:${o instanceof l?o.code:"server_error"}`,await g?.(),o}finally{try{await Me({request_id:s,caller:e,provider:t.provider,tool:t.tool,scope_checked:p,outcome:P,jti:_,receipt_id:h,responder:w,question_id:k})}finally{v()}n.signal.removeEventListener("abort",u)}}m(Rr,"callProvider");async function rr(e,r,n,c,t,i){const{machine:u}=i;let s;try{s=await ze(e,i.sub)}catch(d){throw d instanceof Qe?new l("invalid_request",d.message,{origin:"runtime"}):d}const j={machine:u,envelope:s,signal:i.signal,deadlineAt:i.deadlineAt,mapFailure:F};if(re(r.major,n.tool)){const d=await De(j,t.arguments,r.major),A=x(c.output,d);if(A)throw new l("provider_bad_response",`the libraries result has an invalid output field "${A.field}"`,{origin:"provider",param:A.field,details:{status:200,...A}});return{result:d,responder:void 0,cleanup:void 0}}let v=t.arguments,g=null,b="";if(Fe(r.major,n.tool,t.arguments)){const d=await Ue(j,t.arguments,r.major);if(i.deadlineAt-Date.now()<=0)throw ee(u,"timeout","");d!==null&&(v=d.arguments,g=d.services,b=d.release)}const p=await Be(u,{tool:n.tool,arguments:v,version:r.major,requestId:i.requestId,runId:e.run_id,deadlineAt:i.deadlineAt,upload:t.upload===null?null:{id:t.upload.upload_id,link:t.upload.upload_link}},s,i.signal);if(i.signal.aborted)throw i.signal.reason??new Error("provider call aborted");if("unreachable"in p)throw ee(u,p.unreachable.reason,p.unreachable.message);const _=p.headers["crtr-responder"],h=G(p.body);if(p.status<200||p.status>=300){const d=Ne(u,p.status,typeof h.code=="string"?h.code:void 0,typeof h.message=="string"?h.message:void 0,p.body),A=d===null&&p.status>=500&&typeof h.code=="string"?new l("provider_error",typeof h.message=="string"?h.message:`the device answered HTTP ${p.status}`,{origin:"runtime",status:p.status,details:{code:h.code,status:p.status}}):null;throw Object.assign(d??A??F(p.status,p.body,p.headers),{responder:_})}const w=p.body&&typeof p.body=="object"&&!Array.isArray(p.body)?p.body.result:void 0;if(!w||typeof w!="object"||Array.isArray(w))throw Object.assign(new l("provider_bad_response","the device result is not a JSON object",{origin:"provider",details:{status:p.status,message:"the device result is not a JSON object"}}),{responder:_});let k=w;if(g!==null){const d=Le(k,g);if(Je(u,s,b,d.calls),"error"in d)throw Object.assign(d.error,{responder:_});k=d.result}let P;try{P=await Z(e,t,k,{signal:i.signal})}catch(d){throw d instanceof l&&d.code==="provider_error"?Object.assign(new l("provider_bad_response",d.message,{origin:"provider",details:{status:p.status,message:d.message}}),{responder:_}):d}const o=x(c.output,P.result);if(o)throw await P.cleanup?.(),Object.assign(new l("provider_bad_response",`the device result has an invalid output field "${o.field}"`,{origin:"provider",param:o.field,details:{status:p.status,...o}}),{responder:_});return{result:P.result,responder:_,cleanup:P.cleanup}}m(rr,"callDevice");export{Rr as callProvider,er as crtrCallerHeader,We as identity,F as mapProviderResponse,Ke as onProviderResponse,oe as providerLeaves,Cr as providerTools};
|
|
@@ -44,6 +44,10 @@ export declare function acknowledgeBrokerMail(nodeId: string, deliveries: MailRe
|
|
|
44
44
|
export declare function recordBrokerTurn(nodeId: string, request: Omit<BrokerTurnRequest, 'expected_execution_id'>): Promise<BrokerTurnResultDTO>;
|
|
45
45
|
export declare function mutateBrokerProviderRetry(nodeId: string, request: Omit<BrokerProviderRetryRequest, 'expected_execution_id'>): Promise<BrokerProviderRetryResultDTO>;
|
|
46
46
|
export declare function mutateBrokerFault(nodeId: string, request: Omit<BrokerFaultRequest, 'expected_execution_id'>): Promise<BrokerFaultResultDTO>;
|
|
47
|
+
/** A conversation store that refused writes past its deadline: the node's durable fault, written (execution-fenced) before the broker
|
|
48
|
+
* exits so the control plane and a harness read the cause. The record is capped at 5 s: a failed or slow record is logged and the
|
|
49
|
+
* exit proceeds. */
|
|
50
|
+
export declare function recordConversationWriteFault(nodeId: string, error: unknown): Promise<void>;
|
|
47
51
|
export declare function brokerRecovery(nodeId: string): Promise<RecoveryStateDTO>;
|
|
48
52
|
/** Node-scoped fault writes are for non-broker clients such as attach transport.
|
|
49
53
|
* Broker-owned recovery mutations use the execution-fenced wrappers above. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var h=Object.defineProperty;var t=(e,r)=>h(e,"name",{value:r,configurable:!0});import{CrtrClient as
|
|
1
|
+
var h=Object.defineProperty;var t=(e,r)=>h(e,"name",{value:r,configurable:!0});import{CrtrClient as y}from"../../../api/client.js";import{currentNodeToken as R}from"./node-token.js";import{localClient as w}from"../../../api/node-transport.js";import{ApiError as x}from"../../../api/errors.js";import{envExecutionId as b}from"../../../shared/env.js";import{brokerSignalClient as v}from"./signal-stream.js";import{emitEvent as P}from"../../events/emit.js";import{cachedBrokerNodeFields as k}from"../../../daemon/broker-signals/bus.js";import{fetchRunAttachments as N}from"./attachments-fetch.js";import{reportRefNodeId as g}from"../../../shared/inbox-entry-body.js";function E(){const e=process.env.CRTR_API_URL;if(!(e===void 0||e==="")){if(!/^https?:\/\//.test(e))throw new Error(`CRTR_API_URL must be an http(s) URL: ${e}`);return e}}t(E,"brokerApiUrl");function o(){const e=E();if(e===void 0)return w({autostart:!1});const r=R();if(r===void 0)throw new Error("broker has no node token for CRTR_API_URL");return new y({baseUrl:e,headers:{authorization:`Bearer ${r}`}})}t(o,"daemonClient");function z(e,r){return o().appendNodeLog(e,{record:r,expected_execution_id:n()})}t(z,"appendBrokerLog");function G(e,r){return o().putNodeTelemetry(e,{...r,expected_execution_id:n()})}t(G,"putBrokerTelemetry");function O(e,r){return o().putNodeRecap(e,{briefing:r,expected_execution_id:n()})}t(O,"putBrokerRecap");function q(e,r){return o().readNodePassiveMessage(e,r)}t(q,"readBrokerPassiveMessage");function W(e){return o().nodePushedFinal(e,{action:"clear",expected_execution_id:n()})}t(W,"clearBrokerPushedFinal");function X(e){return o().nodePushedFinal(e,{action:"consume",expected_execution_id:n()})}t(X,"consumeBrokerPushedFinal");function H(e,r){return o().request("POST",`/v1/nodes/${encodeURIComponent(e)}/jobs/start`,{...r,expected_execution_id:n()})}t(H,"startBrokerBashJob");function K(e,r,i){return o().recordBackgroundedJob(e,r,i)}t(K,"recordBackgroundedJob");function Q(e,r,i){return o().reportBashJob(e,r,{...i,expected_execution_id:n()})}t(Q,"reportBrokerJob");function V(e,r){return o().request("DELETE",`/v1/nodes/${encodeURIComponent(e)}/jobs/${encodeURIComponent(r)}?foreground=1`,{expected_execution_id:n()})}t(V,"stopBrokerBashJob");function n(){const e=b();if(e===void 0||e==="")throw new Error("broker launch is missing CRTR_EXECUTION_ID");return e}t(n,"brokerExecutionId");function Y(e,r){return o().bindBrokerSession(e,{...r,executionId:n()})}t(Y,"bindBrokerSession");function Z(e,r){return o().settleBroker(e,{...r,expected_execution_id:n()})}t(Z,"settleBroker");function ee(e){return o().postBrokerIdle(e,{expected_execution_id:n()})}t(ee,"postBrokerIdle");function re(e,r){return o().completeBrokerPark(e,{...r,expected_execution_id:n()})}t(re,"completeBrokerPark");function te(e){return o().recordBrokerParkActivity(e,{expected_execution_id:n()})}t(te,"recordBrokerParkActivity");function oe(e,r){return o().recordBrokerTelemetry(e,{...r,expected_execution_id:n()})}t(oe,"recordBrokerTelemetry");const m=new Set;async function ne(e,r,i){const a=o(),p=n(),s=await a.claimNodeMail(e,{execution_id:p,channel:r});if(s.action==="hold")return s;const l=s.deliveries.filter(d=>!m.has(d.entry.entry_id));if(l.length>0){await N(e);for(const d of l)m.add(d.entry.entry_id)}const f=await Promise.all(s.deliveries.map(async d=>{const c=d.entry.ref;if(c===void 0||g(c)===void 0)return d;try{let u=i.get(c);u===void 0&&(u=a.readNodeInboxReport(e,c,p).then(({content:B})=>B),i.set(c,u));const _=await u;return{...d,entry:{...d.entry,data:{...d.entry.data,report_body:_}}}}catch(u){if(i.delete(c),u instanceof x&&u.status===404)return d;throw u}}));if(f.length>0){const d=new Set(f.map(({entry:c})=>c.ref).filter(c=>c!==void 0));for(const c of i.keys())d.has(c)||i.delete(c)}return{...s,deliveries:f}}t(ne,"claimBrokerMail");async function ie(e,r){return await(await import("../../conversation-store/index.js")).flushConversation(),o().acknowledgeNodeMail(e,{execution_id:n(),deliveries:r})}t(ie,"acknowledgeBrokerMail");function ce(e,r){return o().recordBrokerTurn(e,{...r,expected_execution_id:n()})}t(ce,"recordBrokerTurn");function de(e,r){return o().mutateBrokerProviderRetry(e,{...r,expected_execution_id:n()})}t(de,"mutateBrokerProviderRetry");function C(e,r){return o().mutateBrokerFault(e,{...r,expected_execution_id:n()})}t(C,"mutateBrokerFault");async function ue(e,r){const i=C(e,{op:"record",input:{link:"daemon\u2192node",op:"conversation_write_failed",kind:"other",retry:{disposition:"manual"},message:r instanceof Error?r.message:String(r)}});await Promise.race([i,new Promise((a,p)=>setTimeout(()=>p(new Error("conversation_write_failed fault record timed out")),5e3).unref())]).catch(a=>P({level:"error",event:"broker.daemon.operation.failed",node_id:e,error:a,fields:{operation:"conversation_write_fault_record"}}))}t(ue,"recordConversationWriteFault");function ae(e){return o().getBrokerRecovery(e,n())}t(ae,"brokerRecovery");async function se(e,r){return o().recordNodeFault(e,r)}t(se,"recordNodeFault");async function pe(e,r={}){return o().clearNodeFault(e,{...r.link===void 0?{}:{link:r.link},...r.preserveEpisode===void 0?{}:{preserve_episode:r.preserveEpisode}}).then(i=>i.cleared)}t(pe,"clearNodeFault");function fe(e,r){return o().commitBrokerModel(e,{...r,expected_execution_id:n()})}t(fe,"commitBrokerModel");function T(e){return o().brokerExtensionState(e)}t(T,"brokerExtensionState");async function le(e){const r=v();return r.state==="connected"&&r.latestNode!==void 0?k(r.latestNode):k((await T(e)).node)}t(le,"cachedBrokerNode");function xe(e,r){return o().nodeDelivery(e,{...r,expected_execution_id:n()})}t(xe,"brokerDelivery");function ke(e,r){return o().commitBrokerGeneratedName(e,{...r,expected_execution_id:n()})}t(ke,"commitBrokerGeneratedName");function me(e,r){return o().commitBrokerPersonaAck(e,{...r,expected_execution_id:n()})}t(me,"commitBrokerPersonaAck");async function _e(e,r){try{await o().pushReport(e,r)}catch(i){if(r.tier==="final"&&i instanceof x&&i.code==="already_finalized")return;throw i}}t(_e,"publishBrokerReport");function Be(e){return o().relaunchRoot(e)}t(Be,"relaunchBrokerRoot");export{ie as acknowledgeBrokerMail,z as appendBrokerLog,Y as bindBrokerSession,E as brokerApiUrl,xe as brokerDelivery,n as brokerExecutionId,T as brokerExtensionState,ae as brokerRecovery,le as cachedBrokerNode,ne as claimBrokerMail,W as clearBrokerPushedFinal,pe as clearNodeFault,ke as commitBrokerGeneratedName,fe as commitBrokerModel,me as commitBrokerPersonaAck,re as completeBrokerPark,X as consumeBrokerPushedFinal,o as daemonClient,C as mutateBrokerFault,de as mutateBrokerProviderRetry,ee as postBrokerIdle,_e as publishBrokerReport,O as putBrokerRecap,G as putBrokerTelemetry,q as readBrokerPassiveMessage,K as recordBackgroundedJob,te as recordBrokerParkActivity,oe as recordBrokerTelemetry,ce as recordBrokerTurn,ue as recordConversationWriteFault,se as recordNodeFault,Be as relaunchBrokerRoot,Q as reportBrokerJob,Z as settleBroker,H as startBrokerBashJob,V as stopBrokerBashJob};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var De=Object.defineProperty;var n=(t,o)=>De(t,"name",{value:o,configurable:!0});import{envInboxBetweenTurns as Ne,envModelIntent as Fe,envNodeCwd as Le,envNodeId as Be,envProfileId as Ue,envScopes as $e,scopeAllowed as Ke}from"../../shared/env.js";import{createServer as We}from"node:net";import{WebSocketServer as Ge,createWebSocketStream as je}from"ws";import{BROKER_VIEW_PORT as qe}from"./view-socket.js";import{existsSync as Re,readFileSync as Ve,unlinkSync as Te}from"node:fs";import{join as Ee}from"node:path";import{randomUUID as M}from"node:crypto";import{mark as Xe}from"../timing.js";import{SUBMIT_RESULT_TOOL as He}from"./structured-output.js";import{flushConversation as ke,installSessionManagerStorePatch as Ye}from"../conversation-store/index.js";import{getAgentDir as J,ModelRegistry as ze,ModelRuntime as Je}from"@earendil-works/pi-coding-agent";import{nodeRunDir as Qe,viewSocketPath as Ze}from"../canvas/paths.js";import{bindBrokerEventSource as en}from"../events/source.js";import{emitEvent as b,flushBrokerLog as nn}from"../events/emit.js";import{operationIdContext as tn}from"../events/operation-id.js";import{findMissingPackagePaths as rn}from"./package-health.js";import{installBrokerConfigSnapshot as on}from"../config.js";import{FRONT_DOOR_ENV as sn}from"./front-door.js";import{CANVAS_EXTENSIONS as oe,piInvocationToSdkConfig as an}from"./launch.js";import{assertEngineVersion as dn,loadBrokerEngine as ln}from"./broker-sdk.js";import{initCrtrTheme as cn}from"./crtr-theme.js";import{resolveBundledPiPackageDir as mn}from"./pi-cli.js";import{captureSessionChatCapabilities as un}from"./command-surface.js";import{InMemoryCredentialStore as fn}from"@earendil-works/pi-ai";import{configureBrokerModelRuntime as pn}from"./broker/model-adapter.js";import{brokerApiUrl as gn,mutateBrokerFault as Q,recordBrokerTurn as Ce}from"./broker/daemon-ops.js";import{fetchRunAttachments as vn}from"./broker/attachments-fetch.js";import{modelRequestFromConfig as _n,expandModelCandidates as hn,parseModelSpec as wn,unregisteredConcreteModel as Sn}from"../model-routes.js";import{KNOWN_STREAM_WAIT_UI as bn}from"./stream-watchdog.js";import{probeOnline as yn}from"./connectivity.js";import{CRTR_CYCLE_CUSTOM_TYPE as Rn,cycleAwareMessages as Tn,endedByAbort as En}from"./session-cycles.js";import{turnErrorOf as kn}from"../llm/refusal.js";import{projectTranscript as Cn}from"./session-visibility.js";import{currentTurnVisibility as xn}from"./turn-visibility.js";import{isUnknownModel as ie}from"./model-selection.js";import{BrokerClientRegistry as Mn}from"./broker/client-registry.js";import{ToolGroupTracker as An}from"./broker/tool-groups.js";import{TurnReplyTracker as Pn}from"./broker/turn-replies.js";import{onNodeNamed as On}from"./broker/node-named.js";import{FaultRetry as In,willDaemonRetry as Dn}from"./broker/fault-retry.js";import{RunTurnEnds as Nn}from"./broker/run-turn-end.js";import{createTurnAdmissionGate as Fn}from"./broker/turn-admission.js";import{BROKER_DISPOSE_AND_EXIT as Ln,BROKER_IDLE_TURN_START as Bn,BROKER_RUN_TURN_BUSY as Un}from"./broker/held-deferred-inbox.js";import{prependRunDeferredMail as $n,settleRunDeferredMail as Kn}from"./broker/run-deferred-mail.js";import{createRunTurnQueue as Wn}from"./broker/run-turn-queue.js";import{EventProjection as Gn}from"./broker/event-projection.js";import{createFrameDispatchContext as jn,handleFrame as qn}from"./broker/frame-dispatch.js";import{hydratePersistedAdvertisedCommandMessages as Vn,installAdvertisedCommandInvocationContract as Xn}from"./advertised-command-invocation.js";import{RebindDriver as Hn}from"./broker/rebind.js";import{beginRuntimeTeardown as Yn}from"./broker/extension-abort.js";import{receiveNodeToken as zn}from"./broker/node-token.js";import{serveCliRelay as Jn}from"./broker/cli-relay.js";import{recordBrokerRelease as Qn}from"./lifecycle.js";import{setTurnCauseSource as Zn}from"./broker/turn-cause.js";import{decodeKickoffOrigin as et,KICKOFF_ORIGIN_ENV as nt}from"./stamp/protocol.js";import{announceMessageOrigin as tt}from"./stamp/channel.js";import{commitBrokerModel as rt}from"./broker/daemon-ops.js";import{bootExtensionState as ot}from"./broker/boot-state.js";import{composerNames as it}from"./broker/frame-memory-refs.js";import{BROKER_READ_CAPS as st,FrameOverflowError as at,normalizeSnapshotTail as dt}from"./broker-protocol.js";import{ReviewBoundaryNavigationError as Mr,REVIEW_BOUNDARY_NAVIGATION_CODE as Ar}from"./broker/frame-replies.js";function se(t){return new ze(t.modelRuntime)}n(se,"registryOf");function $(t,o){if(t==null||ie(t))return null;const s=o!==void 0&&o!==""&&o!=="off"?`:${o}`:"";return`${t.provider}/${t.id}${s}`}n($,"formatModelSpec");function lt(t,o){const s=$(t,void 0);return s===null?null:`${s}:${o===void 0||o===""?"off":o}`}n(lt,"formatExactModelSpec");const ct=12e4;let Z=null;import{brokerSignalClient as K}from"./broker/signal-stream.js";function mt(){K().stop();const t=Z;if(Z=null,t!==null)try{t.dispose()}catch{}}n(mt,"disposeActiveSession");function ut(t,o){const s=Ke(o,"crtr:act")?void 0:["bash"],u=t!==void 0&&t.length>0?[...new Set([...t,He])]:t===void 0?void 0:[...t];return{...u!==void 0?{tools:u}:{},...s!==void 0?{excludeTools:s}:{}}}n(ut,"brokerToolOptions");async function kr(t,o=process.hrtime.bigint(),s=new Date().toISOString()){en(t);const u=await zn(),i=await Jn(t,u);process.env.CRTR_API_SOCKET=i.path,tn.fresh(()=>{b({level:"info",event:"broker.startup.cli_entry",ts:s,duration_ms:0,fields:{runtime_version:process.version,engine_version:null,model:null}}),b({level:"info",event:"broker.startup.module_loaded",duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{runtime_version:process.version,engine_version:null,model:null}})});const a=new Set;let c=null;const d=n((e,r=null)=>{a.has(e)||(a.add(e),Xe(e,{duration_ms:Number(process.hrtime.bigint()-o)/1e6}),b({level:"info",event:e,duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{runtime_version:process.version,engine_version:c,model:r}}))},"emitStartupMilestone");process.env[sn]="1",process.env.CRTR_BROKER_PID=String(process.pid),delete process.env.TMUX_PANE,delete process.env.TMUX,Ye(t);const v=await ln();dn(v.VERSION),c=v.VERSION;const w=Qe(t),E=Ee(w,"broker-launch.json"),S=JSON.parse(Ve(E,"utf8"));if(!S.configSnapshot)throw new Error("broker launch is missing its config snapshot");on(S.configSnapshot);const g=an(S);g.modelExact===!0?process.env.CRTR_MODEL_EXACT="1":delete process.env.CRTR_MODEL_EXACT;const y=await it(t);let R,A;const X=n(e=>{R!==void 0?R(e):A??=e},"onSignal");process.on("SIGTERM",()=>X("SIGTERM")),process.on("SIGINT",()=>X("SIGINT")),process.on("SIGUSR1",()=>{const e=process.env.CRTR_EXECUTION_ID;e!==void 0&&e!==""&&K().start(t,e)});let{session:W,services:P,resuming:de,runtime:G}=await vt(v,g);d("broker.startup.session_built");const k=(await ot(t)).node.review_binding?.review_id,T=Ne();Z=W;const F=yn;try{process.env.PI_PACKAGE_DIR=mn(),cn(P.settingsManager.getTheme(),J(),!1)}catch(e){b({level:"error",event:"broker.theme.initialization_failed",error:e})}try{for(const e of rn(J()))b({level:"warn",event:"broker.startup.warning",fields:{stage:"package_health",source:e.source,resolved_path:e.resolved}})}catch{}const j=Ze(t),_=new Mn(t),H=new Map,I=new An(t,e=>_.broadcast(e)),q=new Pn(t,e=>_.broadcast(e));On(e=>_.broadcast({type:"node_named",...e}));let D=!1,le=!1,Y,z,ce,m,V;const ee=new Nn;let L,me=n(()=>{},"notifyTurnAccepted"),ue=n(()=>{},"resetFrameState");const ne=Fn();let fe=n(()=>0,"pendingPromptDispatches"),pe;const B=Wn({runNode:T,session:n(()=>m.session(),"session"),isReplacing:n(()=>m.isReplacing(),"isReplacing"),pendingRebind:n(()=>m.pendingRebind(),"pendingRebind"),isAgentRunActive:n(()=>m.isAgentRunActive(),"isAgentRunActive"),pendingDispatches:n(()=>fe(),"pendingDispatches"),turnAdmission:ne,prependDeferred:n(e=>$n(t,e),"prependDeferred"),onError:n(e=>b({level:"error",event:"broker.inbox.idle_prompt_failed",error:e}),"onError")});Zn(()=>m.session());const ge=B.drain;g.firstPrompt!==void 0&&g.firstPrompt!==""&&B.holdForKickoff(),globalThis[Bn]=B.start,globalThis[Un]=B.busy,m=new Hn({nodeId:t,cfg:g,session:W,services:P,runtime:G,registry:_,toolGroups:I,turnReplies:q,transcriptMessages:n(e=>ae(e,k)?.map(({message:r})=>r)??e.sessionManager.buildSessionContext().messages,"transcriptMessages"),uiContext:n(()=>ce,"uiContext"),faultRetry:n(()=>V,"faultRetry"),projection:n(()=>L,"projection"),setActiveSession:n(e=>{if(Z=e,pe?.(),T||process.env.CRTR_RUN_ID){let r="stop",l,f=!1;pe=e.subscribe(h=>{if(h.type==="agent_start"&&(r="stop",l=void 0,f=!1,ee.started()),h.type==="agent_end"){const p=[...h.messages??[]].reverse().find(U=>U.role==="assistant");p&&(r=p.stopReason,l=En(p)?void 0:kn(p),f=p.role==="assistant"&&Dn(p,e.model?.contextWindow))}h.type==="agent_settled"&&(ee.settled(e.sessionManager,{stop_reason:r,...l?{error:l}:{}},f),T&&(ke().then(()=>Kn(t,e)).catch(p=>{if(String(p?.message).startsWith("conversation_write_failed")){b({level:"error",event:"broker.exited",node_id:t,error:p,fields:{fault:"conversation_write_failed"}}),C("conversation_write_failed",1);return}b({level:"error",event:"broker.run_deferred_mail.settle_failed",error:p})}),queueMicrotask(()=>{m.session()===e&&ge()})))})}},"setActiveSession"),disposeAndExit:n((e,r)=>C(e,r),"disposeAndExit"),onSessionRebind:n(()=>{ue()},"onSessionRebind"),onReplacementIdle:n(()=>{T&&ge()},"onReplacementIdle"),reWelcomeAll:n(()=>te(),"reWelcomeAll")});const ve=n(async(e,r=!1)=>{const l=m.session(),f=$(l.model,l.thinkingLevel);if(f===null)return null;const h=await rt(t,{spec:f,...e!==void 0?{intent:e}:{},userSelected:r});return r&&(g.model=h.modelOverride,e!==void 0?(process.env.CRTR_MODEL_INTENT=`${e.family}/${e.strength}`,delete process.env.CRTR_MODEL_EXACT,g.modelExact=void 0):(delete process.env.CRTR_MODEL_INTENT,process.env.CRTR_MODEL_EXACT="1",g.modelExact=!0)),h.modelOverride},"persistModelChoice"),_e=n(async(e=!0,r,l=!1)=>{const f=m.session(),h=$(f.model,f.thinkingLevel),p=e?await ve(r,l):h;_.broadcast({type:"model_changed",model:ie(f.model)?void 0:f.model,spec:p})},"broadcastModelChanged");V=new In({nodeId:t,cfg:g,retryProbe:F,currentSession:n(()=>m.session(),"currentSession"),currentServices:n(()=>m.services(),"currentServices"),installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),registryOf:se,formatModelSpec:$,broadcastModelChanged:_e,turnAdmission:ne,reWelcomeAll:n(()=>te(),"reWelcomeAll"),...T?{turnEnds:ee}:{}});const he=n(()=>{V.rearmIfStranded().catch(e=>{b({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`fault retry re-arm failed: ${e instanceof Error?e.message:String(e)}`}})})},"rearmStrandedRetry");K().subscribe("resync",he),K().subscribe("fault-retry",he),L=new Gn({registry:_,faultRetry:V,installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),currentSession:n(()=>m.session(),"currentSession"),notifyTurnAccepted:n(()=>me(),"notifyTurnAccepted"),emitStartupMilestone:d,formatModelSpec:$});const Me=n(e=>{const r=m.session(),l=ae(r,k),f=dt(e.snapshotTail),h=l===void 0||f===void 0?l:l.slice(-f),p=h?.map(({message:N})=>N)??r.sessionManager.buildSessionContext().messages,U=I.summaries(),ye=h!==void 0&&f!==void 0?ft(p):void 0,Ie=ye===void 0?U:Object.fromEntries(Object.entries(U).filter(([N])=>ye.has(N)));return{messages:p,...h===void 0?{}:{messageIds:h.map(({id:N})=>N)},messageVisibility:h?.map(({visibility:N})=>N)??p.map(()=>"visible"),turnVisibility:xn(),stats:r.getSessionStats(),state:{model:ie(r.model)?void 0:r.model,thinkingLevel:r.thinkingLevel,isStreaming:r.isStreaming,isCompacting:r.isCompacting,steeringMode:r.steeringMode,followUpMode:r.followUpMode,sessionFile:r.sessionFile,sessionId:r.sessionId,sessionName:r.sessionName,autoCompactionEnabled:r.autoCompactionEnabled,messageCount:r.messages.length,pendingMessageCount:r.pendingMessageCount},display:{..._.displaySnapshot()},toolGroupSummaries:Ie,turnReplies:q.snapshot(),workingActivity:L.currentWorkingActivity(),queued:{steering:[...r.getSteeringMessages()],followUp:[...r.getFollowUpMessages()]}}},"buildSnapshot"),we=n(e=>{const r=e.role==="controller"?H.values().next().value:void 0;_.sendFrame(e,{type:"welcome",snapshot:Me(e),role:e.role,pending_dialog:r!==void 0?r.request:null,agentDir:J()},!0)},"sendWelcome"),Ae=n(e=>{const r=[...H.values()];for(let l=1;l<r.length;l++)_.sendFrame(e,r[l].request)},"replayExtraPendingDialogsTo"),te=n(()=>{try{const e=m.session();q.seed(ae(e,k)?.map(({message:r})=>r)??e.sessionManager.buildSessionContext().messages)}catch(e){b({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`turn reply reseed failed: ${String(e)}`}})}_.forEachHelloed(we)},"reWelcomeAll"),Se=n(async e=>{if(D)return;D=!0;const r=K().latestNode;r!==void 0&&(r.intent==="idle-release"||r.status==="done")&&Qn(t,process.env.CRTR_EXECUTION_ID??null),K().stop(),e===0&&await ke().catch(l=>{e=1,b({level:"error",event:"broker.exited",node_id:t,error:l,fields:{fault:"conversation_write_failed"}})}),I.persistPendingSummary(),L.dispose(),mt();try{Y?.close(),z?.close()}catch{}i.close(),_.dispose();try{Re(j)&&Te(j)}catch{}_.clearAttachState(),await nn(),process.exit(e)},"completeExit"),C=n((e,r=0)=>{if(D)return;const l=e==="shutdown-hook"||e==="shutdown-after-settle";if(l&&I.finishOpenToolGroup(!0),l&&(I.hasSummaryTasks()||q.hasTasks())){if(le)return;le=!0,Promise.allSettled([I.waitForSummaryTasks(),q.waitForTasks()]).finally(()=>Se(r));return}Se(r)},"disposeAndExit");globalThis[Ln]=C,ce=_t({writable:n(()=>_.writableClients(),"writable"),forward:n((e,r)=>_.sendFrame(e,r),"forward"),pending:H,broadcast:n(e=>_.broadcastUi(e),"broadcast"),onKnownStreamWait:n(e=>L.knownStreamWait(e),"onKnownStreamWait")}),m.setRebindSession(),await m.enqueueRebind(W,P),d("broker.startup.extensions_bound");const x=jn({nodeId:t,registry:_,toolGroups:I,projection:L,rebind:m,boundaryReviewId:k,pendingDialogs:H,sendWelcome:we,replayExtraPendingDialogsTo:Ae,reWelcomeAll:te,disposeAndExit:C,persistModelChoice:ve,broadcastModelChanged:_e,registryOf:se,formatModelSpec:$,formatExactModelSpec:lt,turnAdmission:ne,memoryInventory:y,runNode:T,onKickoffAdmitted:B.releaseKickoff});me=x.notifyTurnAccepted,ue=x.resetForSession,fe=x.pendingPromptDispatches;const Pe=2500;let re=!1;const Oe=n(async e=>{if(D||re)return;if(re=!0,m.isAgentRunActive()||m.session().isStreaming||x.pendingPromptDispatches()>0){const l=Date.now()+Pe;for(;x.pendingPromptDispatches()>0&&!m.session().isStreaming&&Date.now()<l;)await new Promise(f=>setTimeout(f,25));if(m.session().isStreaming){const f=l-Date.now();if(f>0){let h;try{Yn(),await Promise.race([m.session().abort().then(()=>!0,()=>!1),new Promise(U=>{h=setTimeout(()=>U(!1),f)})])&&await Ce(t,{event:"closed",end_reason:"teardown-aborted"})}finally{h!==void 0&&clearTimeout(h)}}}else(x.pendingPromptDispatches()>0||m.isAgentRunActive())&&await Ce(t,{event:"interrupted"})}C(e)},"abortAndExit");if(R=n(e=>{Oe(e)},"signalTeardown"),A!==void 0){R(A);return}try{Re(j)&&Te(j)}catch{}const be=n(e=>{const r=_.create(e);e.on("data",f=>{let h;try{h=r.decoder.push(f)}catch(p){p instanceof at?(_.sendFrame(r,{type:"error",code:"frame_overflow",message:p.message}),_.dropClient(r,`frame overflow: ${p.message}`)):_.dropClient(r,`decoder error: ${String(p)}`);return}for(const p of h)try{qn(x,r,p)}catch{}});const l=n(()=>{_.removeClient(r)},"drop");e.on("close",l),e.on("error",()=>{})},"serveViewer");Y=We(be),gn()!==void 0&&(z=new Ge({host:"::",port:qe,path:"/view",maxPayload:st.maxLineBytes}),z.on("connection",e=>be(je(e))),z.on("error",e=>{D||(b({level:"error",event:"broker.socket.failed",error:e}),C("socket-error",1))})),Y.on("error",e=>{D||(b({level:"error",event:"broker.socket.failed",error:e}),C("socket-error",1))}),Y.listen(j,async()=>{Promise.all([Q(t,{op:"clear",link:"viewer\u2194broker"}),Q(t,{op:"clear",link:"relay\u2194broker"})]).catch(r=>b({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:r,fields:{operation:"broker_socket_bound_fault_clear"}}));let e;try{e=await V.recoverOnStartup()}catch(r){b({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:r,fields:{operation:"recovery_startup"}}),C("recovery-startup-failed",1);return}if(!(D||re))if(e==="none"&&g.firstPrompt!==void 0&&g.firstPrompt!==""){const r=et(process.env[nt]);r!==null&&tt(g.firstPrompt,r);try{await vn(t)}catch(f){b({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:f,fields:{operation:"attachments_fetch"}}),C("attachments-fetch-failed",1);return}const l=process.env.CRTR_KICKOFF_MESSAGE_IDS;x.kickoff(g.firstPrompt,l?JSON.parse(l):[])}else B.releaseKickoff()}),_.persistAttachState()}n(kr,"runBroker");function ft(t){const o=new Set;for(const s of t)if(!(s.role!=="assistant"||!Array.isArray(s.content)))for(const u of s.content)u!==null&&typeof u=="object"&&u.type==="toolCall"&&typeof u.id=="string"&&o.add(u.id);return o}n(ft,"toolCallIds");function ae(t,o){const s=t.sessionManager,u=Tn(s);return u!==void 0&&Vn(u.map(({message:i})=>i)),u===void 0?void 0:Cn(u,{boundaryReviewId:o,sessionEntries:s.getEntries?.()})}n(ae,"snapshotMessages");function xe(){const t=Be();if(t===void 0||t==="")throw new Error("broker launch is missing CRTR_NODE_ID");return t}n(xe,"currentBrokerNodeId");async function pt(t,o){const s=_n(o.model,Fe(),o.modelExact===!0);if(s===void 0)return;const u=se(t),i={cwd:Le()??o.cwd,profileId:Ue()},a=await Sn(s,u,i);if(a!==void 0)throw await Q(xe(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`model '${a.request.spec}' is not registered in the serving model registry`}}),new Error(`[broker] FATAL: model '${a.request.spec}' is not registered in the serving model registry`);const c=await hn(s,i.cwd,i.profileId),d=wn(s.spec);for(const v of c){const w=u.find(v.providerId,v.modelId);if(w===void 0)continue;const S=d?.providerId===v.providerId&&d.modelId===v.modelId?d.thinkingLevel??(v.thinkingLevel===void 0?void 0:"off"):v.thinkingLevel;return{model:w,thinkingLevel:S}}if(o.modelExact===!0){const v=c.map(w=>`'${w.providerId}/${w.modelId}' unregistered`).join("; ");throw await Q(xe(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`exact-consult model '${o.model}' is unavailable \u2014 refusing to substitute (${v})`}}),new Error(`[broker] FATAL: exact-consult model '${o.model}' is unavailable`)}b({level:"warn",event:"broker.model.none_viable",fields:{rejected_candidates:c.map(v=>({provider:v.providerId,model:v.modelId,reason:"unregistered"})).slice(0,16)}})}n(pt,"resolveLaunchModel");function gt(t){let o=!0;return{runtime:new Proxy(t,{get(u,i,a){return o&&i==="getAvailableSnapshot"?()=>[]:o&&i==="getAvailable"?async()=>[]:o&&i==="getModel"?()=>{}:Reflect.get(u,i,a)}}),reveal:n(()=>{o=!1},"reveal")}}n(gt,"modelLessRegistry");async function vt(t,o){const s=J(),u=n(async S=>{const g=await Je.create({credentials:new fn,modelsPath:Ee(S.agentDir,"models.json")});pn(g);const y=await t.createAgentSessionServices({cwd:S.cwd,agentDir:S.agentDir,modelRuntime:g,resourceLoaderOptions:{additionalExtensionPaths:o.extensionPaths,appendSystemPrompt:o.appendSystemPromptPath!==void 0?[o.appendSystemPromptPath]:void 0,noContextFiles:!0,extensionsOverride:n(O=>({...O,extensions:O.extensions.filter(k=>!/[/\\]provider-rotation\.(?:ts|js)$/.test(k.path))}),"extensionsOverride")}}),R=y.resourceLoader.getExtensions();if(o.extensionPaths.some(O=>oe.includes(O))){const O=new Set(R.extensions.map(T=>T.path)),k=oe.filter(T=>!O.has(T));if(k.length>0){const T=R.errors.filter(F=>oe.includes(F.path)).map(F=>`${F.path}: ${F.error}`).join("; ");throw new Error(`[broker] FATAL: mandatory canvas extensions failed to load: ${k.join(", ")}${T===""?"":` (${T})`}`)}}y.settingsManager.getRetryEnabled=()=>!1;const A=await pt(y,o),X=A?.model,W=A?.thinkingLevel,P=A===void 0?gt(y.modelRuntime):void 0,de=P!==void 0?{...y,modelRuntime:P.runtime}:y,G=await t.createAgentSessionFromServices({services:de,sessionManager:S.sessionManager,model:X,thinkingLevel:W,...ut(o.tools,$e()),sessionStartEvent:S.sessionStartEvent});return Xn(G.session),un(G.session),P?.reveal(),{...G,services:y}},"buildForManager"),i=o.resumeSessionPath,a=o.forkFrom!==void 0&&o.forkFrom!=="";if(!a&&(i===void 0||i==="")&&o.resumeSessionId!==void 0&&o.resumeSessionId!=="")throw new Error(`[broker] resume requires a session .jsonl PATH; got only a bare id '${o.resumeSessionId}' (pi_session_file was never captured for this node)`);const c=!a&&i!==void 0&&i!=="",d=c&&o.newCycle===!0,v=c&&!d;let w;if(a)w=await t.SessionManager.forkFrom(o.forkFrom,o.cwd);else if(v||d){if(w=await t.SessionManager.open(i),d){const S=w.getLeafId();w.resetLeaf(),w.appendCustomEntry(Rn,{cycle:Number(process.env.CRTR_CYCLES),fromLeaf:S})}}else w=await t.SessionManager.create(o.cwd);if(t.createAgentSessionRuntime!==void 0){const S=n(async y=>{const R=await u({cwd:y.cwd,agentDir:y.agentDir,sessionManager:y.sessionManager,sessionStartEvent:y.sessionStartEvent});return{...R,diagnostics:R.services.diagnostics??[]}},"factory"),g=await t.createAgentSessionRuntime(S,{cwd:o.cwd,agentDir:s,sessionManager:w});return{session:g.session,services:g.services,resuming:v,runtime:g}}const E=await u({cwd:o.cwd,agentDir:s,sessionManager:w});return{session:E.session,services:E.services,resuming:v,runtime:void 0}}n(vt,"buildBrokerSession");function _t(t){const o=n((i,a,c,d)=>{if(d?.signal?.aborted)return Promise.resolve(i);const v=t.writable();return v.length===0?Promise.resolve(i):new Promise(w=>{let E;const S=n(()=>{E!==void 0&&clearTimeout(E),d?.signal?.removeEventListener("abort",g),t.pending.delete(a.id)},"cleanup"),g=n(()=>{S(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),w(i)},"onAbort");d?.signal?.addEventListener("abort",g,{once:!0});const y=d?.timeout!==void 0?d.timeout:ct;E=setTimeout(()=>{S(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),w(i)},y),typeof E.unref=="function"&&E.unref(),t.pending.set(a.id,{request:a,resolve:n(R=>{S(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),w(c(R))},"resolve")});for(const R of v)t.forward(R,a)})},"dialogPromise"),s=n(()=>{},"noop");return{[bn]:t.onKnownStreamWait??(i=>()=>{}),get theme(){const i=globalThis[Symbol.for("@earendil-works/pi-coding-agent:theme")];if(i==null)throw new Error("Theme not initialized. Call initTheme() first.");return i},select:n((i,a,c)=>o(void 0,{type:"extension_ui_request",id:M(),method:"select",title:i,options:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,c),"select"),confirm:n((i,a,c)=>o(!1,{type:"extension_ui_request",id:M(),method:"confirm",title:i,message:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?!1:"confirmed"in d?d.confirmed:!1,c),"confirm"),input:n((i,a,c)=>o(void 0,{type:"extension_ui_request",id:M(),method:"input",title:i,placeholder:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,c),"input"),editor:n((i,a)=>o(void 0,{type:"extension_ui_request",id:M(),method:"editor",title:i,prefill:a},c=>"cancelled"in c&&c.cancelled?void 0:"value"in c?c.value:void 0),"editor"),setStatus:n((i,a)=>t.broadcast({type:"extension_ui_request",id:M(),method:"setStatus",statusKey:i,statusText:a}),"setStatus"),setWidget:n((i,a,c)=>{typeof a!="function"&&t.broadcast({type:"extension_ui_request",id:M(),method:"setWidget",widgetKey:i,widgetLines:a,widgetPlacement:c?.placement})},"setWidget"),setTitle:n(i=>t.broadcast({type:"extension_ui_request",id:M(),method:"setTitle",title:i}),"setTitle"),notify:n((i,a)=>{const c=a==="warn"?"warning":a;t.broadcast({type:"extension_ui_request",id:M(),method:"notify",message:i,notifyType:c})},"notify"),onTerminalInput:n(()=>s,"onTerminalInput"),setWorkingMessage:s,setWorkingVisible:s,setWorkingIndicator:s,setHiddenThinkingLabel:s,setFooter:s,setHeader:s,custom:n(()=>Promise.resolve(void 0),"custom"),pasteToEditor:s,setEditorText:s,getEditorText:n(()=>"","getEditorText"),addAutocompleteProvider:s,setEditorComponent:s,getEditorComponent:n(()=>{},"getEditorComponent"),getAllThemes:n(()=>[],"getAllThemes"),getTheme:n(()=>{},"getTheme"),setTheme:s,getToolsExpanded:n(()=>!1,"getToolsExpanded"),setToolsExpanded:s}}n(_t,"makeBrokerUiContext");export{Ar as REVIEW_BOUNDARY_NAVIGATION_CODE,Mr as ReviewBoundaryNavigationError,ut as brokerToolOptions,vt as buildBrokerSession,mt as disposeActiveSession,_t as makeBrokerUiContext,kr as runBroker,ae as snapshotMessages};
|
|
1
|
+
var Ne=Object.defineProperty;var t=(n,o)=>Ne(n,"name",{value:o,configurable:!0});import{envInboxBetweenTurns as Fe,envModelIntent as Le,envNodeCwd as Be,envNodeId as Ue,envProfileId as $e,envScopes as We,scopeAllowed as Ke}from"../../shared/env.js";import{createServer as Ge}from"node:net";import{WebSocketServer as je,createWebSocketStream as qe}from"ws";import{BROKER_VIEW_PORT as Ve}from"./view-socket.js";import{existsSync as Re,readFileSync as Xe,unlinkSync as Te}from"node:fs";import{join as Ee}from"node:path";import{randomUUID as M}from"node:crypto";import{mark as He}from"../timing.js";import{SUBMIT_RESULT_TOOL as Ye}from"./structured-output.js";import{flushConversation as ke,installSessionManagerStorePatch as ze}from"../conversation-store/index.js";import{getAgentDir as J,ModelRegistry as Je,ModelRuntime as Qe}from"@earendil-works/pi-coding-agent";import{nodeRunDir as Ze,viewSocketPath as en}from"../canvas/paths.js";import{bindBrokerEventSource as nn}from"../events/source.js";import{emitEvent as b,flushBrokerLog as tn}from"../events/emit.js";import{operationIdContext as rn}from"../events/operation-id.js";import{findMissingPackagePaths as on}from"./package-health.js";import{installBrokerConfigSnapshot as sn}from"../config.js";import{FRONT_DOOR_ENV as an}from"./front-door.js";import{CANVAS_EXTENSIONS as oe,piInvocationToSdkConfig as dn}from"./launch.js";import{assertEngineVersion as ln,loadBrokerEngine as cn}from"./broker-sdk.js";import{initCrtrTheme as mn}from"./crtr-theme.js";import{resolveBundledPiPackageDir as un}from"./pi-cli.js";import{captureSessionChatCapabilities as fn}from"./command-surface.js";import{InMemoryCredentialStore as pn}from"@earendil-works/pi-ai";import{configureBrokerModelRuntime as gn}from"./broker/model-adapter.js";import{brokerApiUrl as vn,mutateBrokerFault as Q,recordBrokerTurn as Ce}from"./broker/daemon-ops.js";import{fetchRunAttachments as _n}from"./broker/attachments-fetch.js";import{modelRequestFromConfig as hn,expandModelCandidates as wn,parseModelSpec as Sn,unregisteredConcreteModel as bn}from"../model-routes.js";import{KNOWN_STREAM_WAIT_UI as yn}from"./stream-watchdog.js";import{probeOnline as Rn}from"./connectivity.js";import{CRTR_CYCLE_CUSTOM_TYPE as Tn,cycleAwareMessages as En,endedByAbort as kn}from"./session-cycles.js";import{turnErrorOf as Cn}from"../llm/refusal.js";import{projectTranscript as xn}from"./session-visibility.js";import{currentTurnVisibility as Mn}from"./turn-visibility.js";import{isUnknownModel as ie}from"./model-selection.js";import{BrokerClientRegistry as An}from"./broker/client-registry.js";import{ToolGroupTracker as Pn}from"./broker/tool-groups.js";import{TurnReplyTracker as On}from"./broker/turn-replies.js";import{onNodeNamed as Dn}from"./broker/node-named.js";import{FaultRetry as In,willDaemonRetry as Nn}from"./broker/fault-retry.js";import{RunTurnEnds as Fn}from"./broker/run-turn-end.js";import{createTurnAdmissionGate as Ln}from"./broker/turn-admission.js";import{BROKER_DISPOSE_AND_EXIT as Bn,BROKER_IDLE_TURN_START as Un,BROKER_RUN_TURN_BUSY as $n}from"./broker/held-deferred-inbox.js";import{prependRunDeferredMail as Wn,settleRunDeferredMail as Kn}from"./broker/run-deferred-mail.js";import{createRunTurnQueue as Gn}from"./broker/run-turn-queue.js";import{EventProjection as jn}from"./broker/event-projection.js";import{createFrameDispatchContext as qn,handleFrame as Vn}from"./broker/frame-dispatch.js";import{hydratePersistedAdvertisedCommandMessages as Xn,installAdvertisedCommandInvocationContract as Hn}from"./advertised-command-invocation.js";import{RebindDriver as Yn}from"./broker/rebind.js";import{beginRuntimeTeardown as zn}from"./broker/extension-abort.js";import{receiveNodeToken as Jn}from"./broker/node-token.js";import{serveCliRelay as Qn}from"./broker/cli-relay.js";import{recordBrokerRelease as Zn}from"./lifecycle.js";import{setTurnCauseSource as et}from"./broker/turn-cause.js";import{decodeKickoffOrigin as nt,KICKOFF_ORIGIN_ENV as tt}from"./stamp/protocol.js";import{announceMessageOrigin as rt}from"./stamp/channel.js";import{commitBrokerModel as ot,recordConversationWriteFault as xe}from"./broker/daemon-ops.js";import{bootExtensionState as it}from"./broker/boot-state.js";import{composerNames as st}from"./broker/frame-memory-refs.js";import{BROKER_READ_CAPS as at,FrameOverflowError as dt,normalizeSnapshotTail as lt}from"./broker-protocol.js";import{ReviewBoundaryNavigationError as Ar,REVIEW_BOUNDARY_NAVIGATION_CODE as Pr}from"./broker/frame-replies.js";function se(n){return new Je(n.modelRuntime)}t(se,"registryOf");function $(n,o){if(n==null||ie(n))return null;const s=o!==void 0&&o!==""&&o!=="off"?`:${o}`:"";return`${n.provider}/${n.id}${s}`}t($,"formatModelSpec");function ct(n,o){const s=$(n,void 0);return s===null?null:`${s}:${o===void 0||o===""?"off":o}`}t(ct,"formatExactModelSpec");const mt=12e4;let Z=null;import{brokerSignalClient as W}from"./broker/signal-stream.js";function ut(){W().stop();const n=Z;if(Z=null,n!==null)try{n.dispose()}catch{}}t(ut,"disposeActiveSession");function ft(n,o){const s=Ke(o,"crtr:act")?void 0:["bash"],f=n!==void 0&&n.length>0?[...new Set([...n,Ye])]:n===void 0?void 0:[...n];return{...f!==void 0?{tools:f}:{},...s!==void 0?{excludeTools:s}:{}}}t(ft,"brokerToolOptions");async function Cr(n,o=process.hrtime.bigint(),s=new Date().toISOString()){nn(n);const f=await Jn(),i=await Qn(n,f);process.env.CRTR_API_SOCKET=i.path,rn.fresh(()=>{b({level:"info",event:"broker.startup.cli_entry",ts:s,duration_ms:0,fields:{runtime_version:process.version,engine_version:null,model:null}}),b({level:"info",event:"broker.startup.module_loaded",duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{runtime_version:process.version,engine_version:null,model:null}})});const a=new Set;let c=null;const d=t((e,r=null)=>{a.has(e)||(a.add(e),He(e,{duration_ms:Number(process.hrtime.bigint()-o)/1e6}),b({level:"info",event:e,duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{runtime_version:process.version,engine_version:c,model:r}}))},"emitStartupMilestone");process.env[an]="1",process.env.CRTR_BROKER_PID=String(process.pid),delete process.env.TMUX_PANE,delete process.env.TMUX,ze(n);const v=await cn();ln(v.VERSION),c=v.VERSION;const w=Ze(n),E=Ee(w,"broker-launch.json"),S=JSON.parse(Xe(E,"utf8"));if(!S.configSnapshot)throw new Error("broker launch is missing its config snapshot");sn(S.configSnapshot);const g=dn(S);g.modelExact===!0?process.env.CRTR_MODEL_EXACT="1":delete process.env.CRTR_MODEL_EXACT;const y=await st(n);let R,A;const X=t(e=>{R!==void 0?R(e):A??=e},"onSignal");process.on("SIGTERM",()=>X("SIGTERM")),process.on("SIGINT",()=>X("SIGINT")),process.on("SIGUSR1",()=>{const e=process.env.CRTR_EXECUTION_ID;e!==void 0&&e!==""&&W().start(n,e)});let{session:K,services:P,resuming:de,runtime:G}=await _t(v,g);d("broker.startup.session_built");const k=(await it(n)).node.review_binding?.review_id,T=Fe();Z=K;const F=Rn;try{process.env.PI_PACKAGE_DIR=un(),mn(P.settingsManager.getTheme(),J(),!1)}catch(e){b({level:"error",event:"broker.theme.initialization_failed",error:e})}try{for(const e of on(J()))b({level:"warn",event:"broker.startup.warning",fields:{stage:"package_health",source:e.source,resolved_path:e.resolved}})}catch{}const j=en(n),_=new An(n),H=new Map,D=new Pn(n,e=>_.broadcast(e)),q=new On(n,e=>_.broadcast(e));Dn(e=>_.broadcast({type:"node_named",...e}));let I=!1,le=!1,Y,z,ce,m,V;const ee=new Fn;let L,me=t(()=>{},"notifyTurnAccepted"),ue=t(()=>{},"resetFrameState");const ne=Ln();let fe=t(()=>0,"pendingPromptDispatches"),pe;const B=Gn({runNode:T,session:t(()=>m.session(),"session"),isReplacing:t(()=>m.isReplacing(),"isReplacing"),pendingRebind:t(()=>m.pendingRebind(),"pendingRebind"),isAgentRunActive:t(()=>m.isAgentRunActive(),"isAgentRunActive"),pendingDispatches:t(()=>fe(),"pendingDispatches"),turnAdmission:ne,prependDeferred:t(e=>Wn(n,e),"prependDeferred"),onError:t(e=>b({level:"error",event:"broker.inbox.idle_prompt_failed",error:e}),"onError")});et(()=>m.session());const ge=B.drain;g.firstPrompt!==void 0&&g.firstPrompt!==""&&B.holdForKickoff(),globalThis[Un]=B.start,globalThis[$n]=B.busy,m=new Yn({nodeId:n,cfg:g,session:K,services:P,runtime:G,registry:_,toolGroups:D,turnReplies:q,transcriptMessages:t(e=>ae(e,k)?.map(({message:r})=>r)??e.sessionManager.buildSessionContext().messages,"transcriptMessages"),uiContext:t(()=>ce,"uiContext"),faultRetry:t(()=>V,"faultRetry"),projection:t(()=>L,"projection"),setActiveSession:t(e=>{if(Z=e,pe?.(),T||process.env.CRTR_RUN_ID){let r="stop",l,p=!1;pe=e.subscribe(h=>{if(h.type==="agent_start"&&(r="stop",l=void 0,p=!1,ee.started()),h.type==="agent_end"){const u=[...h.messages??[]].reverse().find(U=>U.role==="assistant");u&&(r=u.stopReason,l=kn(u)?void 0:Cn(u),p=u.role==="assistant"&&Nn(u,e.model?.contextWindow))}h.type==="agent_settled"&&(ee.settled(e.sessionManager,{stop_reason:r,...l?{error:l}:{}},p),T&&(ke().then(()=>Kn(n,e)).catch(async u=>{if(String(u?.message).startsWith("conversation_write_failed")){b({level:"error",event:"broker.exited",node_id:n,error:u,fields:{fault:"conversation_write_failed"}}),await xe(n,u),C("conversation_write_failed",1);return}b({level:"error",event:"broker.run_deferred_mail.settle_failed",error:u})}),queueMicrotask(()=>{m.session()===e&&ge()})))})}},"setActiveSession"),disposeAndExit:t((e,r)=>C(e,r),"disposeAndExit"),onSessionRebind:t(()=>{ue()},"onSessionRebind"),onReplacementIdle:t(()=>{T&&ge()},"onReplacementIdle"),reWelcomeAll:t(()=>te(),"reWelcomeAll")});const ve=t(async(e,r=!1)=>{const l=m.session(),p=$(l.model,l.thinkingLevel);if(p===null)return null;const h=await ot(n,{spec:p,...e!==void 0?{intent:e}:{},userSelected:r});return r&&(g.model=h.modelOverride,e!==void 0?(process.env.CRTR_MODEL_INTENT=`${e.family}/${e.strength}`,delete process.env.CRTR_MODEL_EXACT,g.modelExact=void 0):(delete process.env.CRTR_MODEL_INTENT,process.env.CRTR_MODEL_EXACT="1",g.modelExact=!0)),h.modelOverride},"persistModelChoice"),_e=t(async(e=!0,r,l=!1)=>{const p=m.session(),h=$(p.model,p.thinkingLevel),u=e?await ve(r,l):h;_.broadcast({type:"model_changed",model:ie(p.model)?void 0:p.model,spec:u})},"broadcastModelChanged");V=new In({nodeId:n,cfg:g,retryProbe:F,currentSession:t(()=>m.session(),"currentSession"),currentServices:t(()=>m.services(),"currentServices"),installedGeneration:t(()=>m.installedGeneration(),"installedGeneration"),registryOf:se,formatModelSpec:$,broadcastModelChanged:_e,turnAdmission:ne,reWelcomeAll:t(()=>te(),"reWelcomeAll"),...T?{turnEnds:ee}:{}});const he=t(()=>{V.rearmIfStranded().catch(e=>{b({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`fault retry re-arm failed: ${e instanceof Error?e.message:String(e)}`}})})},"rearmStrandedRetry");W().subscribe("resync",he),W().subscribe("fault-retry",he),L=new jn({registry:_,faultRetry:V,installedGeneration:t(()=>m.installedGeneration(),"installedGeneration"),currentSession:t(()=>m.session(),"currentSession"),notifyTurnAccepted:t(()=>me(),"notifyTurnAccepted"),emitStartupMilestone:d,formatModelSpec:$});const Ae=t(e=>{const r=m.session(),l=ae(r,k),p=lt(e.snapshotTail),h=l===void 0||p===void 0?l:l.slice(-p),u=h?.map(({message:N})=>N)??r.sessionManager.buildSessionContext().messages,U=D.summaries(),ye=h!==void 0&&p!==void 0?pt(u):void 0,Ie=ye===void 0?U:Object.fromEntries(Object.entries(U).filter(([N])=>ye.has(N)));return{messages:u,...h===void 0?{}:{messageIds:h.map(({id:N})=>N)},messageVisibility:h?.map(({visibility:N})=>N)??u.map(()=>"visible"),turnVisibility:Mn(),stats:r.getSessionStats(),state:{model:ie(r.model)?void 0:r.model,thinkingLevel:r.thinkingLevel,isStreaming:r.isStreaming,isCompacting:r.isCompacting,steeringMode:r.steeringMode,followUpMode:r.followUpMode,sessionFile:r.sessionFile,sessionId:r.sessionId,sessionName:r.sessionName,autoCompactionEnabled:r.autoCompactionEnabled,messageCount:r.messages.length,pendingMessageCount:r.pendingMessageCount},display:{..._.displaySnapshot()},toolGroupSummaries:Ie,turnReplies:q.snapshot(),workingActivity:L.currentWorkingActivity(),queued:{steering:[...r.getSteeringMessages()],followUp:[...r.getFollowUpMessages()]}}},"buildSnapshot"),we=t(e=>{const r=e.role==="controller"?H.values().next().value:void 0;_.sendFrame(e,{type:"welcome",snapshot:Ae(e),role:e.role,pending_dialog:r!==void 0?r.request:null,agentDir:J()},!0)},"sendWelcome"),Pe=t(e=>{const r=[...H.values()];for(let l=1;l<r.length;l++)_.sendFrame(e,r[l].request)},"replayExtraPendingDialogsTo"),te=t(()=>{try{const e=m.session();q.seed(ae(e,k)?.map(({message:r})=>r)??e.sessionManager.buildSessionContext().messages)}catch(e){b({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`turn reply reseed failed: ${String(e)}`}})}_.forEachHelloed(we)},"reWelcomeAll"),Se=t(async e=>{if(I)return;I=!0;const r=W().latestNode;r!==void 0&&(r.intent==="idle-release"||r.status==="done")&&Zn(n,process.env.CRTR_EXECUTION_ID??null),W().stop(),e===0&&await ke().catch(async l=>{e=1,b({level:"error",event:"broker.exited",node_id:n,error:l,fields:{fault:"conversation_write_failed"}}),await xe(n,l)}),D.persistPendingSummary(),L.dispose(),ut();try{Y?.close(),z?.close()}catch{}i.close(),_.dispose();try{Re(j)&&Te(j)}catch{}_.clearAttachState(),await tn(),process.exit(e)},"completeExit"),C=t((e,r=0)=>{if(I)return;const l=e==="shutdown-hook"||e==="shutdown-after-settle";if(l&&D.finishOpenToolGroup(!0),l&&(D.hasSummaryTasks()||q.hasTasks())){if(le)return;le=!0,Promise.allSettled([D.waitForSummaryTasks(),q.waitForTasks()]).finally(()=>Se(r));return}Se(r)},"disposeAndExit");globalThis[Bn]=C,ce=ht({writable:t(()=>_.writableClients(),"writable"),forward:t((e,r)=>_.sendFrame(e,r),"forward"),pending:H,broadcast:t(e=>_.broadcastUi(e),"broadcast"),onKnownStreamWait:t(e=>L.knownStreamWait(e),"onKnownStreamWait")}),m.setRebindSession(),await m.enqueueRebind(K,P),d("broker.startup.extensions_bound");const x=qn({nodeId:n,registry:_,toolGroups:D,projection:L,rebind:m,boundaryReviewId:k,pendingDialogs:H,sendWelcome:we,replayExtraPendingDialogsTo:Pe,reWelcomeAll:te,disposeAndExit:C,persistModelChoice:ve,broadcastModelChanged:_e,registryOf:se,formatModelSpec:$,formatExactModelSpec:ct,turnAdmission:ne,memoryInventory:y,runNode:T,onKickoffAdmitted:B.releaseKickoff});me=x.notifyTurnAccepted,ue=x.resetForSession,fe=x.pendingPromptDispatches;const Oe=2500;let re=!1;const De=t(async e=>{if(I||re)return;if(re=!0,m.isAgentRunActive()||m.session().isStreaming||x.pendingPromptDispatches()>0){const l=Date.now()+Oe;for(;x.pendingPromptDispatches()>0&&!m.session().isStreaming&&Date.now()<l;)await new Promise(p=>setTimeout(p,25));if(m.session().isStreaming){const p=l-Date.now();if(p>0){let h;try{zn(),await Promise.race([m.session().abort().then(()=>!0,()=>!1),new Promise(U=>{h=setTimeout(()=>U(!1),p)})])&&await Ce(n,{event:"closed",end_reason:"teardown-aborted"})}finally{h!==void 0&&clearTimeout(h)}}}else(x.pendingPromptDispatches()>0||m.isAgentRunActive())&&await Ce(n,{event:"interrupted"})}C(e)},"abortAndExit");if(R=t(e=>{De(e)},"signalTeardown"),A!==void 0){R(A);return}try{Re(j)&&Te(j)}catch{}const be=t(e=>{const r=_.create(e);e.on("data",p=>{let h;try{h=r.decoder.push(p)}catch(u){u instanceof dt?(_.sendFrame(r,{type:"error",code:"frame_overflow",message:u.message}),_.dropClient(r,`frame overflow: ${u.message}`)):_.dropClient(r,`decoder error: ${String(u)}`);return}for(const u of h)try{Vn(x,r,u)}catch{}});const l=t(()=>{_.removeClient(r)},"drop");e.on("close",l),e.on("error",()=>{})},"serveViewer");Y=Ge(be),vn()!==void 0&&(z=new je({host:"::",port:Ve,path:"/view",maxPayload:at.maxLineBytes}),z.on("connection",e=>be(qe(e))),z.on("error",e=>{I||(b({level:"error",event:"broker.socket.failed",error:e}),C("socket-error",1))})),Y.on("error",e=>{I||(b({level:"error",event:"broker.socket.failed",error:e}),C("socket-error",1))}),Y.listen(j,async()=>{Promise.all([Q(n,{op:"clear",link:"viewer\u2194broker"}),Q(n,{op:"clear",link:"relay\u2194broker"})]).catch(r=>b({level:"error",event:"broker.daemon.operation.failed",node_id:n,error:r,fields:{operation:"broker_socket_bound_fault_clear"}}));let e;try{e=await V.recoverOnStartup()}catch(r){b({level:"error",event:"broker.daemon.operation.failed",node_id:n,error:r,fields:{operation:"recovery_startup"}}),C("recovery-startup-failed",1);return}if(!(I||re))if(e==="none"&&g.firstPrompt!==void 0&&g.firstPrompt!==""){const r=nt(process.env[tt]);r!==null&&rt(g.firstPrompt,r);try{await _n(n)}catch(p){b({level:"error",event:"broker.daemon.operation.failed",node_id:n,error:p,fields:{operation:"attachments_fetch"}}),C("attachments-fetch-failed",1);return}const l=process.env.CRTR_KICKOFF_MESSAGE_IDS;x.kickoff(g.firstPrompt,l?JSON.parse(l):[])}else B.releaseKickoff()}),_.persistAttachState()}t(Cr,"runBroker");function pt(n){const o=new Set;for(const s of n)if(!(s.role!=="assistant"||!Array.isArray(s.content)))for(const f of s.content)f!==null&&typeof f=="object"&&f.type==="toolCall"&&typeof f.id=="string"&&o.add(f.id);return o}t(pt,"toolCallIds");function ae(n,o){const s=n.sessionManager,f=En(s);return f!==void 0&&Xn(f.map(({message:i})=>i)),f===void 0?void 0:xn(f,{boundaryReviewId:o,sessionEntries:s.getEntries?.()})}t(ae,"snapshotMessages");function Me(){const n=Ue();if(n===void 0||n==="")throw new Error("broker launch is missing CRTR_NODE_ID");return n}t(Me,"currentBrokerNodeId");async function gt(n,o){const s=hn(o.model,Le(),o.modelExact===!0);if(s===void 0)return;const f=se(n),i={cwd:Be()??o.cwd,profileId:$e()},a=await bn(s,f,i);if(a!==void 0)throw await Q(Me(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`model '${a.request.spec}' is not registered in the serving model registry`}}),new Error(`[broker] FATAL: model '${a.request.spec}' is not registered in the serving model registry`);const c=await wn(s,i.cwd,i.profileId),d=Sn(s.spec);for(const v of c){const w=f.find(v.providerId,v.modelId);if(w===void 0)continue;const S=d?.providerId===v.providerId&&d.modelId===v.modelId?d.thinkingLevel??(v.thinkingLevel===void 0?void 0:"off"):v.thinkingLevel;return{model:w,thinkingLevel:S}}if(o.modelExact===!0){const v=c.map(w=>`'${w.providerId}/${w.modelId}' unregistered`).join("; ");throw await Q(Me(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`exact-consult model '${o.model}' is unavailable \u2014 refusing to substitute (${v})`}}),new Error(`[broker] FATAL: exact-consult model '${o.model}' is unavailable`)}b({level:"warn",event:"broker.model.none_viable",fields:{rejected_candidates:c.map(v=>({provider:v.providerId,model:v.modelId,reason:"unregistered"})).slice(0,16)}})}t(gt,"resolveLaunchModel");function vt(n){let o=!0;return{runtime:new Proxy(n,{get(f,i,a){return o&&i==="getAvailableSnapshot"?()=>[]:o&&i==="getAvailable"?async()=>[]:o&&i==="getModel"?()=>{}:Reflect.get(f,i,a)}}),reveal:t(()=>{o=!1},"reveal")}}t(vt,"modelLessRegistry");async function _t(n,o){const s=J(),f=t(async S=>{const g=await Qe.create({credentials:new pn,modelsPath:Ee(S.agentDir,"models.json")});gn(g);const y=await n.createAgentSessionServices({cwd:S.cwd,agentDir:S.agentDir,modelRuntime:g,resourceLoaderOptions:{additionalExtensionPaths:o.extensionPaths,appendSystemPrompt:o.appendSystemPromptPath!==void 0?[o.appendSystemPromptPath]:void 0,noContextFiles:!0,extensionsOverride:t(O=>({...O,extensions:O.extensions.filter(k=>!/[/\\]provider-rotation\.(?:ts|js)$/.test(k.path))}),"extensionsOverride")}}),R=y.resourceLoader.getExtensions();if(o.extensionPaths.some(O=>oe.includes(O))){const O=new Set(R.extensions.map(T=>T.path)),k=oe.filter(T=>!O.has(T));if(k.length>0){const T=R.errors.filter(F=>oe.includes(F.path)).map(F=>`${F.path}: ${F.error}`).join("; ");throw new Error(`[broker] FATAL: mandatory canvas extensions failed to load: ${k.join(", ")}${T===""?"":` (${T})`}`)}}y.settingsManager.getRetryEnabled=()=>!1;const A=await gt(y,o),X=A?.model,K=A?.thinkingLevel,P=A===void 0?vt(y.modelRuntime):void 0,de=P!==void 0?{...y,modelRuntime:P.runtime}:y,G=await n.createAgentSessionFromServices({services:de,sessionManager:S.sessionManager,model:X,thinkingLevel:K,...ft(o.tools,We()),sessionStartEvent:S.sessionStartEvent});return Hn(G.session),fn(G.session),P?.reveal(),{...G,services:y}},"buildForManager"),i=o.resumeSessionPath,a=o.forkFrom!==void 0&&o.forkFrom!=="";if(!a&&(i===void 0||i==="")&&o.resumeSessionId!==void 0&&o.resumeSessionId!=="")throw new Error(`[broker] resume requires a session .jsonl PATH; got only a bare id '${o.resumeSessionId}' (pi_session_file was never captured for this node)`);const c=!a&&i!==void 0&&i!=="",d=c&&o.newCycle===!0,v=c&&!d;let w;if(a)w=await n.SessionManager.forkFrom(o.forkFrom,o.cwd);else if(v||d){if(w=await n.SessionManager.open(i),d){const S=w.getLeafId();w.resetLeaf(),w.appendCustomEntry(Tn,{cycle:Number(process.env.CRTR_CYCLES),fromLeaf:S})}}else w=await n.SessionManager.create(o.cwd);if(n.createAgentSessionRuntime!==void 0){const S=t(async y=>{const R=await f({cwd:y.cwd,agentDir:y.agentDir,sessionManager:y.sessionManager,sessionStartEvent:y.sessionStartEvent});return{...R,diagnostics:R.services.diagnostics??[]}},"factory"),g=await n.createAgentSessionRuntime(S,{cwd:o.cwd,agentDir:s,sessionManager:w});return{session:g.session,services:g.services,resuming:v,runtime:g}}const E=await f({cwd:o.cwd,agentDir:s,sessionManager:w});return{session:E.session,services:E.services,resuming:v,runtime:void 0}}t(_t,"buildBrokerSession");function ht(n){const o=t((i,a,c,d)=>{if(d?.signal?.aborted)return Promise.resolve(i);const v=n.writable();return v.length===0?Promise.resolve(i):new Promise(w=>{let E;const S=t(()=>{E!==void 0&&clearTimeout(E),d?.signal?.removeEventListener("abort",g),n.pending.delete(a.id)},"cleanup"),g=t(()=>{S(),n.broadcast({type:"extension_ui_dismiss",id:a.id}),w(i)},"onAbort");d?.signal?.addEventListener("abort",g,{once:!0});const y=d?.timeout!==void 0?d.timeout:mt;E=setTimeout(()=>{S(),n.broadcast({type:"extension_ui_dismiss",id:a.id}),w(i)},y),typeof E.unref=="function"&&E.unref(),n.pending.set(a.id,{request:a,resolve:t(R=>{S(),n.broadcast({type:"extension_ui_dismiss",id:a.id}),w(c(R))},"resolve")});for(const R of v)n.forward(R,a)})},"dialogPromise"),s=t(()=>{},"noop");return{[yn]:n.onKnownStreamWait??(i=>()=>{}),get theme(){const i=globalThis[Symbol.for("@earendil-works/pi-coding-agent:theme")];if(i==null)throw new Error("Theme not initialized. Call initTheme() first.");return i},select:t((i,a,c)=>o(void 0,{type:"extension_ui_request",id:M(),method:"select",title:i,options:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,c),"select"),confirm:t((i,a,c)=>o(!1,{type:"extension_ui_request",id:M(),method:"confirm",title:i,message:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?!1:"confirmed"in d?d.confirmed:!1,c),"confirm"),input:t((i,a,c)=>o(void 0,{type:"extension_ui_request",id:M(),method:"input",title:i,placeholder:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,c),"input"),editor:t((i,a)=>o(void 0,{type:"extension_ui_request",id:M(),method:"editor",title:i,prefill:a},c=>"cancelled"in c&&c.cancelled?void 0:"value"in c?c.value:void 0),"editor"),setStatus:t((i,a)=>n.broadcast({type:"extension_ui_request",id:M(),method:"setStatus",statusKey:i,statusText:a}),"setStatus"),setWidget:t((i,a,c)=>{typeof a!="function"&&n.broadcast({type:"extension_ui_request",id:M(),method:"setWidget",widgetKey:i,widgetLines:a,widgetPlacement:c?.placement})},"setWidget"),setTitle:t(i=>n.broadcast({type:"extension_ui_request",id:M(),method:"setTitle",title:i}),"setTitle"),notify:t((i,a)=>{const c=a==="warn"?"warning":a;n.broadcast({type:"extension_ui_request",id:M(),method:"notify",message:i,notifyType:c})},"notify"),onTerminalInput:t(()=>s,"onTerminalInput"),setWorkingMessage:s,setWorkingVisible:s,setWorkingIndicator:s,setHiddenThinkingLabel:s,setFooter:s,setHeader:s,custom:t(()=>Promise.resolve(void 0),"custom"),pasteToEditor:s,setEditorText:s,getEditorText:t(()=>"","getEditorText"),addAutocompleteProvider:s,setEditorComponent:s,getEditorComponent:t(()=>{},"getEditorComponent"),getAllThemes:t(()=>[],"getAllThemes"),getTheme:t(()=>{},"getTheme"),setTheme:s,getToolsExpanded:t(()=>!1,"getToolsExpanded"),setToolsExpanded:s}}t(ht,"makeBrokerUiContext");export{Pr as REVIEW_BOUNDARY_NAVIGATION_CODE,Ar as ReviewBoundaryNavigationError,ft as brokerToolOptions,_t as buildBrokerSession,ut as disposeActiveSession,ht as makeBrokerUiContext,Cr as runBroker,ae as snapshotMessages};
|
|
@@ -102,4 +102,10 @@ export declare function reviveNode(nodeId: string, opts: ReviveOptions): Promise
|
|
|
102
102
|
* cron in place. Anything the person types reaches the node as a message, and
|
|
103
103
|
* that delivery is the wake that consumes the deadline. */
|
|
104
104
|
export declare function decideAttachRevive(nodeId: string, opts: Omit<ReviveOptions, 'viewerAttach'>, wakeParked: boolean): Promise<AttachReviveDecision>;
|
|
105
|
+
/** A recorded cwd that no longer exists (e.g. a closed managed worktree whose tombstone dir was later
|
|
106
|
+
* reaped) can never host a launch. Fail loud with a typed, user-visible error naming the path instead
|
|
107
|
+
* of letting `headlessBrokerHost.launch` fail deep inside the crash/doctrine-wake catch, where it would
|
|
108
|
+
* surface as an opaque `internal error` (toErrorBody masks every 5xx). Callers admit work to a node
|
|
109
|
+
* with this before changing any state. Returns the node's Blaxel environment (null on a machine). */
|
|
110
|
+
export declare function assertRecordedCwdExists(nodeId: string, meta: NodeMeta): Promise<string | null>;
|
|
105
111
|
export {};
|