@north-light/cli 0.3.584 → 0.3.586

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/api/client.d.ts +3 -1
  2. package/dist/api/client.js +3 -3
  3. package/dist/api/contract.d.ts +1 -1
  4. package/dist/api/contract.js +1 -1
  5. package/dist/api/dto/bash-jobs.d.ts +17 -0
  6. package/dist/api/dto/bash-jobs.js +1 -1
  7. package/dist/api/routes.d.ts +1 -0
  8. package/dist/api/routes.js +1 -1
  9. package/dist/builtin-memory/crouter-sdk/release-notes.md +4 -0
  10. package/dist/clients/attach/command.js +1 -1
  11. package/dist/clients/attach/input/capabilities.d.ts +4 -4
  12. package/dist/clients/attach/input/capabilities.js +1 -1
  13. package/dist/clients/attach/session/connection.d.ts +7 -8
  14. package/dist/clients/attach/session/connection.js +1 -1
  15. package/dist/clients/attach/session/context.d.ts +2 -2
  16. package/dist/clients/attach/session/reconnect.d.ts +2 -0
  17. package/dist/clients/attach/session/reconnect.js +1 -1
  18. package/dist/clients/attach/viewer.js +500 -500
  19. package/dist/commands/node/bash.js +4 -3
  20. package/dist/commands/sys/desktop.js +1 -1
  21. package/dist/core/broker-client/index.d.ts +1 -0
  22. package/dist/core/broker-client/index.js +1 -1
  23. package/dist/core/broker-client/transport-relay.js +1 -1
  24. package/dist/core/broker-client/transport.d.ts +11 -1
  25. package/dist/core/broker-client/transport.js +1 -1
  26. package/dist/core/canvas/export-sqlite.js +2 -2
  27. package/dist/core/canvas/schema-pg/010-package-publications.sql +16 -0
  28. package/dist/core/canvas/schema-version.d.ts +1 -1
  29. package/dist/core/canvas/schema-version.js +1 -1
  30. package/dist/core/events/read.js +1 -1
  31. package/dist/core/graph/kinds/job.js +2 -2
  32. package/dist/core/graph/package-docs.d.ts +11 -0
  33. package/dist/core/graph/package-docs.js +6 -6
  34. package/dist/core/graph/package-publish.d.ts +30 -0
  35. package/dist/core/graph/package-publish.js +3 -0
  36. package/dist/core/log.d.ts +2 -0
  37. package/dist/core/log.js +5 -5
  38. package/dist/core/providers/bundles.js +2 -2
  39. package/dist/core/providers/call.js +1 -1
  40. package/dist/core/providers/device.js +1 -1
  41. package/dist/daemon/api/handlers/bash-jobs.js +3 -1
  42. package/dist/daemon/api/handlers/package-docs.js +1 -1
  43. package/dist/daemon/api/operations.js +1 -1
  44. package/dist/daemon/crtrd.js +18 -17
  45. package/dist/shared/inbox-entry-body.js +7 -7
  46. package/docs/sdk/release-notes.md +4 -0
  47. package/package.json +2 -2
  48. package/packages/crouter-identity/package.json +1 -1
  49. package/runtime.lock.json +13 -13
@@ -1,2 +1,2 @@
1
- var fe=Object.defineProperty;var o=(e,n)=>fe(e,"name",{value:n,configurable:!0});import{existsSync as b,readdirSync as W,readFileSync as _,rmSync as p,statSync as C}from"node:fs";import{join as d}from"node:path";import{validateCommandManifest as le}from"../../api/command-manifest/manifest.js";import{crtrHome as z}from"../canvas/paths.js";import{isCloudRole as m}from"../canvas/person-state.js";import{withCanvasWrite as pe}from"../canvas/db.js";import{bundleVersion as me,isInstalledGeneration as ve,recordCheckedGeneration as he}from"../command-plugins/bundle.js";import{readState as ge,updateConfig as we,updateState as $e}from"../config.js";import{directoryIssuer as L}from"../directory/issuer.js";import{emitEvent as v}from"../events/emit.js";import{describeOutboundFailure as ye,outboundFetch as be,outboundRefusal as q,OutboundError as _e}from"../events/outbound.js";import{withExclusiveDirectoryLockAsync as Z}from"../exclusive-lock.js";import{atomicWriteText as T,ensureDir as D,pathExists as V}from"../fs-utils.js";import{reconcilePackages as Pe}from"../graph/package-reconcile.js";import{readPluginManifest as k}from"../manifest.js";import{bundleSwapLockPath as J}from"../plugin-swap-lock.js";import{pluginsDir as K,userScopeRoot as Q}from"../scope.js";import{installedProviderPlugins as Se}from"./roots.js";import{allGrants as Ee,localGrants as Me,providerIdsFromGrants as X}from"../grants/mirror.js";import{ProviderError as c}from"./errors.js";const Te="[A-Za-z0-9_-]{1,64}",Y=new RegExp(`^${Te}$`),ke=3e4,ee=3e4;function h(e){return d(K("user"),e)}o(h,"pluginRoot");function P(e){return d(K("user"),`.${e}.etag`)}o(P,"etagFile");function Ie(e){if(!m())return ge("user").plugins[e]?.etag;try{return _(P(e),"utf8")}catch(n){if(n.code==="ENOENT")return;throw n}}o(Ie,"storedEtag");async function ne(e,n){if(!m())return he("user",e,n,{swapped:!1});n===void 0?p(P(e),{force:!0}):T(P(e),n)}o(ne,"recordEtag");async function re(e){if(!m())try{await pe(async n=>await Pe(n))}catch(n){v({level:"error",event:"daemon.providers.docs_reconcile_failed",fields:{provider:e},error:n})}}o(re,"reconcileProviderDocs");function Ae(e,n,r){return m()?k(n)?.version===r&&V(d(n,"commands.json")):ve(e,"user",n,r)}o(Ae,"installedGeneration");function N(){return d(z(),"providers")}o(N,"providersRoot");function te(e,n){return d(N(),e,`v${n}`)}o(te,"majorDir");function R(e){if(!Y.test(e))throw new c("not_found",`"${e}" is not a provider id`,{param:"provider"})}o(R,"assertId");function I(){const e=L();if(!e)throw new c("not_found","provider bundles need a directory-connected runtime");return e}o(I,"directoryBase");async function oe(e,n){const r=`${I()}/providers/${encodeURIComponent(e)}/plugin${n.version!==void 0?`?version=${n.version}`:""}`;let t;try{t=await be("bundle_fetch",r,{headers:{Accept:"application/x-tar",...n.ifNoneMatch!==void 0?{"If-None-Match":n.ifNoneMatch}:{}},signal:AbortSignal.timeout(ke)})}catch(i){return{status:"failed",message:`could not reach ${r}: ${i instanceof Error?i.message:String(i)}`,cause:i}}if(t.status===304){if(n.ifNoneMatch===void 0){const i=`HTTP 304 from ${r} without a conditional request`;return{status:"failed",message:i,cause:q("bundle_fetch",r,i)}}return{status:304}}if(t.status===404||t.status===410)return await t.body?.cancel().catch(()=>{}),{status:t.status===404?404:410,message:`HTTP ${t.status} from ${r}`};if(t.status<200||t.status>=300){await t.body?.cancel().catch(()=>{});{const i=`HTTP ${t.status} from ${r}`;return{status:"failed",message:i,cause:q("bundle_fetch",r,i)}}}let a;try{a=new Uint8Array(await t.arrayBuffer())}catch(i){return{status:"failed",message:`reading ${r} failed: ${i instanceof Error?i.message:String(i)}`,cause:new _e("bundle_fetch",r,i)}}const s=t.headers.get("etag");return{status:200,raw:a,...s!==null?{etag:s}:{}}}o(oe,"fetchProviderBundle");const A=new WeakSet;class x extends Error{static{o(this,"BundleInvalid")}issues;constructor(n,r){super(n),this.issues=r}}function ae(e,n,r){if(r.provider===void 0)return"the archive carries no provider block";if(r.provider.id!==e)return`the archive is provider "${r.provider.id}", not "${e}"`;if(n!==void 0&&r.provider.major!==n)return`the archive is major ${r.provider.major}, not ${n}`;const t=["hooks","kinds","page_components","memory_extensions"].filter(a=>r[a]!==void 0);if(t.length>0)return`a provider bundle may not carry ${t.join(", ")}`}o(ae,"wrongBundle");function B(e,n,r){v({level:"error",event:"daemon.providers.bundle_invalid",fields:{provider:e,...n!==void 0?{major:n}:{},...r instanceof x?{issues:r.issues}:{}},error:r})}o(B,"logInvalid");function ie(e,n,r){v({level:"warn",event:"daemon.providers.bundle_fetch_failed",fields:{provider:e,...n!==void 0?{major:n}:{},message:r instanceof Error?r.message:String(r),...ye(r instanceof Error?r.cause:void 0)}})}o(ie,"logFailure");async function se(){return import("../../commands/pkg/plugin-manage.js")}o(se,"pluginManage");const S=new Map,E=o(e=>`${z()}\0${e}`,"installKey");function xe(e){const n=e,r=n?.code??n?.cause?.code;return typeof r=="string"&&/^[A-Z][A-Z0-9_]{1,30}$/.test(r)?`${r} on provider install directory`:e instanceof c&&e.message.includes("HTTP 404")?"directory returned HTTP 404":e instanceof c&&e.message.includes("HTTP 410")?"directory returned HTTP 410":"provider bundle could not be installed"}o(xe,"publicInstallCause");function je(e){if(g(e)===void 0)return S.get(E(e))??{status:"installing"}}o(je,"providerInstallState");function Ce(e){return new c("provider_unavailable",`provider "${e}" unavailable: ${je(e)?.error??"bundle installation pending"}`)}o(Ce,"unavailableProviderError");function g(e){const n=k(h(e));if(!(n?.provider===void 0||n.transport?.kind!=="http"&&n.transport?.kind!=="machine")&&V(d(h(e),"commands.json"))){try{if(C(d(h(e),"commands.json")).size===0)return}catch{return}return{provider:n.provider,transport:n.transport.kind==="machine"?{kind:"machine"}:{kind:"http",endpoint:n.transport.endpoint}}}}o(g,"installedManifest");async function O(e,n,r=!1){const t=Q();g(e)===void 0&&S.set(E(e),{status:"installing"});try{return D(d(t,"tmp")),await Z(J(t,e),async()=>{const a=h(e),s=k(a);if(s!==null&&s.provider===void 0)throw new c("provider_unavailable",`plugin "${e}" is installed and is not the directory's provider bundle`);const i=g(e)!==void 0;if(i&&r)return"unchanged";const f=i&&n?Ie(e):void 0,u=await oe(e,f!==void 0?{ifNoneMatch:f}:{});if(u.status===304)return"unchanged";if(u.status===404||u.status===410)throw new c("not_found",`the directory serves no provider "${e}" (${u.message})`,{param:"provider"});if(u.status==="failed")throw new c("provider_unavailable",`provider "${e}" bundle fetch failed: ${u.message}`,{cause:u.cause});const l=me(u.raw);if(i&&Ae(e,a,l))return await ne(e,u.etag),"unchanged";const{installPluginArchive:$}=await se();m()&&p(P(e),{force:!0});try{await $(e,u.raw,{scope:"user",scopeRootPath:t,root:a,version:l,etag:u.etag,enable:!i,bundle:{endpoint:`${I()}/providers/${encodeURIComponent(e)}/plugin`},transport:{kind:"http",endpoint:I()},accept:o(y=>ae(e,void 0,y),"accept"),record:!m()})}catch(y){B(e,void 0,y);const U=new c("not_found",`provider "${e}" served an invalid bundle: ${y instanceof Error?y.message:String(y)}`,{param:"provider"});throw A.add(U),U}return m()&&await ne(e,u.etag),await re(e),v({level:"info",event:"daemon.providers.bundle_installed",fields:{provider:e,version:l,replaced:i}}),S.delete(E(e)),i?"updated":"installed"},{timeoutMs:ee,timeoutError:o(()=>new c("provider_unavailable",`timed out waiting for another process replacing plugin "${e}"`),"timeoutError")})}catch(a){throw g(e)===void 0&&S.set(E(e),{status:"install_failed",error:xe(a)}),a instanceof c?a:(v({level:"error",event:"daemon.providers.bundle_install_failed",fields:{provider:e},error:a}),Ce(e))}}o(O,"refreshInstalled");async function fn(e){R(e),g(e)===void 0&&await O(e,!1,!0)}o(fn,"ensureProviderBundle");async function ln(e,n){return R(e),n.version!==void 0&&g(e)?.provider.major!==n.version?H(e,n.version,n.conditional):O(e,n.conditional)}o(ln,"refreshProviderBundle");async function ue(e,n,r){const{validatePluginArchive:t}=await se(),a=await t(r);if(a.bundle===void 0)throw new x(`provider "${e}" major ${n} bundle is invalid: ${a.issues.map(i=>i.message).join("; ")}`,a.issues);const s=ae(e,n,a.bundle);if(s!==void 0)throw new x(`provider "${e}" major ${n} bundle is invalid: ${s}`,[]);if(a.bundle.transport===void 0)throw new x(`provider "${e}" major ${n} bundle declares no transport`,[]);return a.bundle}o(ue,"validateArchive");function De(e){D(e),T(d(e,"retired"),`${new Date().toISOString()}
2
- `),p(d(e,"bundle.tar"),{force:!0}),p(d(e,"etag"),{force:!0})}o(De,"retire");function de(e,n){return new c("provider_version_retired",`provider "${e}" major ${n} is retired`,{param:"version"})}o(de,"retiredError");async function H(e,n,r){const t=te(e,n),a=d(t,"bundle.tar"),s=b(a),i=s&&r&&b(d(t,"etag"))?_(d(t,"etag"),"utf8"):void 0,f=await oe(e,{version:n,...i!==void 0?{ifNoneMatch:i}:{}});if(f.status===304)return"unchanged";if(f.status===410)throw De(t),v({level:"info",event:"daemon.providers.major_retired",fields:{provider:e,major:n}}),de(e,n);if(f.status===404)throw new c("not_found",`provider "${e}" never served major ${n}`,{param:"version"});if(f.status==="failed")throw new c("provider_unavailable",`provider "${e}" major ${n} bundle fetch failed: ${f.message}`,{cause:f.cause});try{await ue(e,n,f.raw)}catch(l){B(e,n,l);const $=new c(s?"provider_unavailable":"not_found",l instanceof Error?l.message:String(l),{param:"version"});throw A.add($),$}D(t),p(d(t,"retired"),{force:!0});const u=s&&Buffer.from(f.raw).equals(_(a));return u||T(a,f.raw),f.etag!==void 0?T(d(t,"etag"),f.etag):p(d(t,"etag"),{force:!0}),u?"unchanged":s?"updated":"installed"}o(H,"refreshPinned");function Ne(){const e=[],n=N();if(!b(n))return e;for(const r of W(n)){if(!Y.test(r))continue;let t;try{t=W(d(n,r))}catch{continue}for(const a of t){const s=/^v([1-9][0-9]*)$/.exec(a);s&&b(d(n,r,a,"bundle.tar"))&&e.push([r,Number(s[1])])}}return e}o(Ne,"cachedMajors");function Re(e){const n=le(e,{transport:"http",reservedCoreNames:new Set});if(n.manifest===void 0)throw new c("not_found","the provider bundle's commands.json no longer validates");return n.manifest}o(Re,"readCommands");const M=new Map,F=new Map;function Be(e,n){const r=C(n),t=`${r.ino}:${r.mtimeMs}:${r.size}`,a=F.get(e);if(a?.stamp===t)return a.commands;const s=Re(JSON.parse(_(n,"utf8")));return F.set(e,{stamp:t,commands:s}),s}o(Be,"installedCommands");async function pn(e,n){R(e);const r=g(e);if(n===void 0||r?.provider.major===n){if(r===void 0)throw new c("not_found",`provider "${e}" has no installed bundle`,{param:"provider"});const l=h(e),$=Be(e,d(l,"commands.json"));return{id:e,major:r.provider.major,provider:r.provider,commands:$,transport:r.transport,source:"installed",root:l}}if(!Number.isInteger(n)||n<1)throw new c("invalid_request","version must be an integer of at least 1",{param:"version"});const t=te(e,n);if(b(d(t,"retired")))throw de(e,n);const a=d(t,"bundle.tar");b(a)||await H(e,n,!1);const s=`${e}/${n}`,i=C(a),f=`${i.mtimeMs}:${i.size}`;let u=M.get(s)?.stamp===f?M.get(s).bundle:void 0;if(u===void 0){try{u=await ue(e,n,new Uint8Array(_(a)))}catch(l){throw B(e,n,l),new c("not_found",`provider "${e}" has no valid bundle for major ${n}`,{param:"version"})}M.set(s,{stamp:f,bundle:u})}return{id:e,major:n,provider:u.provider,commands:u.commands,transport:u.transport.kind==="machine"?{kind:"machine"}:{kind:"http",endpoint:u.transport.endpoint},source:"pinned"}}o(pn,"resolveProviderBundle");let w=null;const Oe=4*6e4;function j(e,n){e.stage=n,e.stageAt=Date.now()}o(j,"enter");function He(e,n){return e?.provider?.id===n&&e.bundle?.endpoint===`${I()}/providers/${encodeURIComponent(n)}/plugin`}o(He,"isDirectoryBundle");async function G(){return m()?Ee():Me()}o(G,"bundleGrants");async function ce(e){return X(await G()).includes(e)}o(ce,"grantNames");async function Fe(e){await Z(J(Q(),e),async()=>{if(!(await ce(e)||!He(k(h(e)),e))){p(h(e),{recursive:!0,force:!0}),m()?p(P(e),{force:!0}):(await we("user",n=>{delete n.plugins[e]}),await $e("user",n=>{delete n.plugins[e]})),p(d(N(),e),{recursive:!0,force:!0}),F.delete(e),S.delete(E(e));for(const n of[...M.keys()])n.startsWith(`${e}/`)&&M.delete(n);await re(e),v({level:"info",event:"daemon.providers.bundle_uninstalled",fields:{provider:e}})}},{timeoutMs:ee,timeoutError:o(()=>new c("provider_unavailable",`timed out waiting for another process replacing plugin "${e}"`),"timeoutError")})}o(Fe,"uninstallProvider");async function Ge(){if(!(await G()).every(e=>e.status!=="active")){for(const e of Se())if(!(e.manifest.provider===void 0||await ce(e.name)))try{await Fe(e.name)}catch(n){v({level:"error",event:"daemon.providers.bundle_uninstall_failed",fields:{provider:e.name},error:n})}}}o(Ge,"uninstallDisconnected");async function Ue(e){if(!L())return;j(e,"reading grants");const n=X(await G());for(const r of n){j(e,`refreshing installed bundle ${r}`);try{await O(r,!0)}catch(t){t instanceof Object&&A.has(t)||ie(r,void 0,t)}}j(e,"uninstalling disconnected bundles"),await Ge();for(const[r,t]of Ne()){j(e,`refreshing pinned bundle ${r} v${t}`);try{await H(r,t,!0)}catch(a){if(a instanceof c&&a.code==="provider_version_retired"||a instanceof Object&&A.has(a))continue;ie(r,t,a)}}}o(Ue,"syncOnce");function mn(){if(w!==null){w.rerun=!0;const n=Date.now()-w.stageAt;return n>=Oe&&v({level:"error",event:"daemon.providers.sync_stalled",fields:{stage:w.stage,stalled_ms:n}}),w.promise}const e={promise:Promise.resolve(),stage:"starting",stageAt:Date.now(),rerun:!1};return w=e,e.promise=(async()=>{try{do e.rerun=!1,await Ue(e);while(e.rerun)}finally{w=null}})(),e.promise}o(mn,"syncProviderBundles");export{fn as ensureProviderBundle,je as providerInstallState,ln as refreshProviderBundle,pn as resolveProviderBundle,mn as syncProviderBundles,Ce as unavailableProviderError};
1
+ var le=Object.defineProperty;var o=(e,n)=>le(e,"name",{value:n,configurable:!0});import{existsSync as b,readdirSync as z,readFileSync as _,rmSync as g,statSync as D}from"node:fs";import{join as d}from"node:path";import{validateCommandManifest as pe}from"../../api/command-manifest/manifest.js";import{crtrHome as L}from"../canvas/paths.js";import{isCloudRole as h}from"../canvas/person-state.js";import{withCanvasWrite as me}from"../canvas/db.js";import{bundleVersion as ve,isInstalledGeneration as ge,recordCheckedGeneration as he}from"../command-plugins/bundle.js";import{readState as we,updateConfig as $e,updateState as ye}from"../config.js";import{directoryIssuer as q}from"../directory/issuer.js";import{emitEvent as p}from"../events/emit.js";import{describeOutboundFailure as be,outboundFetch as _e,outboundRefusal as Z,OutboundError as Pe}from"../events/outbound.js";import{withExclusiveDirectoryLockAsync as V}from"../exclusive-lock.js";import{atomicWriteText as k,ensureDir as N,pathExists as J}from"../fs-utils.js";import{reconcilePackages as Se}from"../graph/package-reconcile.js";import{readPluginManifest as T}from"../manifest.js";import{bundleSwapLockPath as K}from"../plugin-swap-lock.js";import{pluginsDir as Q,userScopeRoot as X}from"../scope.js";import{installedProviderPlugins as Ee}from"./roots.js";import{allGrants as Me,localGrants as ke,providerIdsFromGrants as Y}from"../grants/mirror.js";import{ProviderError as c}from"./errors.js";const Te="[A-Za-z0-9_-]{1,64}",ee=new RegExp(`^${Te}$`),Ie=3e4,ne=3e4;function $(e){return d(Q("user"),e)}o($,"pluginRoot");function P(e){return d(Q("user"),`.${e}.etag`)}o(P,"etagFile");function Ae(e){if(!h())return we("user").plugins[e]?.etag;try{return _(P(e),"utf8")}catch(n){if(n.code==="ENOENT")return;throw n}}o(Ae,"storedEtag");async function re(e,n){if(!h())return he("user",e,n,{swapped:!1});n===void 0?g(P(e),{force:!0}):k(P(e),n)}o(re,"recordEtag");async function te(e){if(!h())try{await me(async n=>await Se(n))}catch(n){p({level:"error",event:"daemon.providers.docs_reconcile_failed",fields:{provider:e},error:n})}}o(te,"reconcileProviderDocs");function xe(e,n,r){return h()?T(n)?.version===r&&J(d(n,"commands.json")):ge(e,"user",n,r)}o(xe,"installedGeneration");function R(){return d(L(),"providers")}o(R,"providersRoot");function oe(e,n){return d(R(),e,`v${n}`)}o(oe,"majorDir");function B(e){if(!ee.test(e))throw new c("not_found",`"${e}" is not a provider id`,{param:"provider"})}o(B,"assertId");function I(){const e=q();if(!e)throw new c("not_found","provider bundles need a directory-connected runtime");return e}o(I,"directoryBase");async function ae(e,n){const r=`${I()}/providers/${encodeURIComponent(e)}/plugin${n.version!==void 0?`?version=${n.version}`:""}`;let t;try{t=await _e("bundle_fetch",r,{headers:{Accept:"application/x-tar",...n.ifNoneMatch!==void 0?{"If-None-Match":n.ifNoneMatch}:{}},signal:AbortSignal.timeout(Ie)})}catch(i){return{status:"failed",message:`could not reach ${r}: ${i instanceof Error?i.message:String(i)}`,cause:i}}if(t.status===304){if(n.ifNoneMatch===void 0){const i=`HTTP 304 from ${r} without a conditional request`;return{status:"failed",message:i,cause:Z("bundle_fetch",r,i)}}return{status:304}}if(t.status===404||t.status===410)return await t.body?.cancel().catch(()=>{}),{status:t.status===404?404:410,message:`HTTP ${t.status} from ${r}`};if(t.status<200||t.status>=300){await t.body?.cancel().catch(()=>{});{const i=`HTTP ${t.status} from ${r}`;return{status:"failed",message:i,cause:Z("bundle_fetch",r,i)}}}let a;try{a=new Uint8Array(await t.arrayBuffer())}catch(i){return{status:"failed",message:`reading ${r} failed: ${i instanceof Error?i.message:String(i)}`,cause:new Pe("bundle_fetch",r,i)}}const u=t.headers.get("etag");return{status:200,raw:a,...u!==null?{etag:u}:{}}}o(ae,"fetchProviderBundle");const A=new WeakSet;class x extends Error{static{o(this,"BundleInvalid")}issues;constructor(n,r){super(n),this.issues=r}}function ie(e,n,r){if(r.provider===void 0)return"the archive carries no provider block";if(r.provider.id!==e)return`the archive is provider "${r.provider.id}", not "${e}"`;if(n!==void 0&&r.provider.major!==n)return`the archive is major ${r.provider.major}, not ${n}`;const t=["hooks","kinds","page_components","memory_extensions"].filter(a=>r[a]!==void 0);if(t.length>0)return`a provider bundle may not carry ${t.join(", ")}`}o(ie,"wrongBundle");function O(e,n,r){p({level:"error",event:"daemon.providers.bundle_invalid",fields:{provider:e,...n!==void 0?{major:n}:{},...r instanceof x?{issues:r.issues}:{}},error:r})}o(O,"logInvalid");function j(e,n,r,t,a){p({level:"info",event:"daemon.providers.bundle_checked",fields:{provider:e,...n!==void 0?{major:n}:{},status:r,...t!==void 0?{etag:t}:{},outcome:a}})}o(j,"logChecked");function se(e,n,r){p({level:"warn",event:"daemon.providers.bundle_fetch_failed",fields:{provider:e,...n!==void 0?{major:n}:{},message:r instanceof Error?r.message:String(r),...be(r instanceof Error?r.cause:void 0)}})}o(se,"logFailure");async function ue(){return import("../../commands/pkg/plugin-manage.js")}o(ue,"pluginManage");const S=new Map,E=o(e=>`${L()}\0${e}`,"installKey");function je(e){const n=e,r=n?.code??n?.cause?.code;return typeof r=="string"&&/^[A-Z][A-Z0-9_]{1,30}$/.test(r)?`${r} on provider install directory`:e instanceof c&&e.message.includes("HTTP 404")?"directory returned HTTP 404":e instanceof c&&e.message.includes("HTTP 410")?"directory returned HTTP 410":"provider bundle could not be installed"}o(je,"publicInstallCause");function Ce(e){if(m(e)===void 0)return S.get(E(e))??{status:"installing"}}o(Ce,"providerInstallState");function De(e){return new c("provider_unavailable",`provider "${e}" unavailable: ${Ce(e)?.error??"bundle installation pending"}`)}o(De,"unavailableProviderError");function m(e){const n=T($(e));if(!(n?.provider===void 0||n.transport?.kind!=="http"&&n.transport?.kind!=="machine")&&J(d($(e),"commands.json"))){try{if(D(d($(e),"commands.json")).size===0)return}catch{return}return{provider:n.provider,transport:n.transport.kind==="machine"?{kind:"machine"}:{kind:"http",endpoint:n.transport.endpoint}}}}o(m,"installedManifest");async function H(e,n,r=!1){const t=X();m(e)===void 0&&S.set(E(e),{status:"installing"});try{return N(d(t,"tmp")),await V(K(t,e),async()=>{const a=$(e),u=T(a);if(u!==null&&u.provider===void 0)throw new c("provider_unavailable",`plugin "${e}" is installed and is not the directory's provider bundle`);const i=m(e)!==void 0;if(i&&r)return"unchanged";const f=i&&n?Ae(e):void 0,s=await ae(e,f!==void 0?{ifNoneMatch:f}:{});if(s.status===304)return j(e,m(e)?.provider.major,304,f,"unchanged"),"unchanged";if(s.status===404||s.status===410)throw new c("not_found",`the directory serves no provider "${e}" (${s.message})`,{param:"provider"});if(s.status==="failed")throw new c("provider_unavailable",`provider "${e}" bundle fetch failed: ${s.message}`,{cause:s.cause});const l=ve(s.raw);if(i&&xe(e,a,l))return await re(e,s.etag),j(e,m(e)?.provider.major,200,s.etag,"unchanged"),"unchanged";const{installPluginArchive:w}=await ue();h()&&g(P(e),{force:!0});try{await w(e,s.raw,{scope:"user",scopeRootPath:t,root:a,version:l,etag:s.etag,enable:!i,bundle:{endpoint:`${I()}/providers/${encodeURIComponent(e)}/plugin`},transport:{kind:"http",endpoint:I()},accept:o(v=>ie(e,void 0,v),"accept"),record:!h()})}catch(v){O(e,void 0,v);const W=new c("not_found",`provider "${e}" served an invalid bundle: ${v instanceof Error?v.message:String(v)}`,{param:"provider"});throw A.add(W),W}return h()&&await re(e,s.etag),await te(e),p({level:"info",event:"daemon.providers.bundle_installed",fields:{provider:e,major:m(e)?.provider.major,version:l,replaced:i,...s.etag!==void 0?{etag:s.etag}:{}}}),S.delete(E(e)),i?"updated":"installed"},{timeoutMs:ne,timeoutError:o(()=>new c("provider_unavailable",`timed out waiting for another process replacing plugin "${e}"`),"timeoutError")})}catch(a){throw m(e)===void 0&&S.set(E(e),{status:"install_failed",error:je(a)}),a instanceof c?a:(p({level:"error",event:"daemon.providers.bundle_install_failed",fields:{provider:e},error:a}),De(e))}}o(H,"refreshInstalled");async function ln(e){B(e),m(e)===void 0&&await H(e,!1,!0)}o(ln,"ensureProviderBundle");async function pn(e,n){return B(e),n.version!==void 0&&m(e)?.provider.major!==n.version?F(e,n.version,n.conditional):H(e,n.conditional)}o(pn,"refreshProviderBundle");async function de(e,n,r){const{validatePluginArchive:t}=await ue(),a=await t(r);if(a.bundle===void 0)throw new x(`provider "${e}" major ${n} bundle is invalid: ${a.issues.map(i=>i.message).join("; ")}`,a.issues);const u=ie(e,n,a.bundle);if(u!==void 0)throw new x(`provider "${e}" major ${n} bundle is invalid: ${u}`,[]);if(a.bundle.transport===void 0)throw new x(`provider "${e}" major ${n} bundle declares no transport`,[]);return a.bundle}o(de,"validateArchive");function Ne(e){N(e),k(d(e,"retired"),`${new Date().toISOString()}
2
+ `),g(d(e,"bundle.tar"),{force:!0}),g(d(e,"etag"),{force:!0})}o(Ne,"retire");function ce(e,n){return new c("provider_version_retired",`provider "${e}" major ${n} is retired`,{param:"version"})}o(ce,"retiredError");async function F(e,n,r){const t=oe(e,n),a=d(t,"bundle.tar"),u=b(a),i=u&&r&&b(d(t,"etag"))?_(d(t,"etag"),"utf8"):void 0,f=await ae(e,{version:n,...i!==void 0?{ifNoneMatch:i}:{}});if(f.status===304)return j(e,n,304,i,"unchanged"),"unchanged";if(f.status===410)throw Ne(t),p({level:"info",event:"daemon.providers.major_retired",fields:{provider:e,major:n}}),ce(e,n);if(f.status===404)throw new c("not_found",`provider "${e}" never served major ${n}`,{param:"version"});if(f.status==="failed")throw new c("provider_unavailable",`provider "${e}" major ${n} bundle fetch failed: ${f.message}`,{cause:f.cause});try{await de(e,n,f.raw)}catch(w){O(e,n,w);const v=new c(u?"provider_unavailable":"not_found",w instanceof Error?w.message:String(w),{param:"version"});throw A.add(v),v}N(t),g(d(t,"retired"),{force:!0});const s=u&&Buffer.from(f.raw).equals(_(a));s||k(a,f.raw),f.etag!==void 0?k(d(t,"etag"),f.etag):g(d(t,"etag"),{force:!0});const l=s?"unchanged":u?"updated":"installed";return j(e,n,200,f.etag,l),l}o(F,"refreshPinned");function Re(){const e=[],n=R();if(!b(n))return e;for(const r of z(n)){if(!ee.test(r))continue;let t;try{t=z(d(n,r))}catch{continue}for(const a of t){const u=/^v([1-9][0-9]*)$/.exec(a);u&&b(d(n,r,a,"bundle.tar"))&&e.push([r,Number(u[1])])}}return e}o(Re,"cachedMajors");function Be(e){const n=pe(e,{transport:"http",reservedCoreNames:new Set});if(n.manifest===void 0)throw new c("not_found","the provider bundle's commands.json no longer validates");return n.manifest}o(Be,"readCommands");const M=new Map,G=new Map;function Oe(e,n){const r=D(n),t=`${r.ino}:${r.mtimeMs}:${r.size}`,a=G.get(e);if(a?.stamp===t)return a.commands;const u=Be(JSON.parse(_(n,"utf8")));return G.set(e,{stamp:t,commands:u}),u}o(Oe,"installedCommands");async function mn(e,n){B(e);const r=m(e);if(n===void 0||r?.provider.major===n){if(r===void 0)throw new c("not_found",`provider "${e}" has no installed bundle`,{param:"provider"});const l=$(e),w=Oe(e,d(l,"commands.json"));return{id:e,major:r.provider.major,provider:r.provider,commands:w,transport:r.transport,source:"installed",root:l}}if(!Number.isInteger(n)||n<1)throw new c("invalid_request","version must be an integer of at least 1",{param:"version"});const t=oe(e,n);if(b(d(t,"retired")))throw ce(e,n);const a=d(t,"bundle.tar");b(a)||await F(e,n,!1);const u=`${e}/${n}`,i=D(a),f=`${i.mtimeMs}:${i.size}`;let s=M.get(u)?.stamp===f?M.get(u).bundle:void 0;if(s===void 0){try{s=await de(e,n,new Uint8Array(_(a)))}catch(l){throw O(e,n,l),new c("not_found",`provider "${e}" has no valid bundle for major ${n}`,{param:"version"})}M.set(u,{stamp:f,bundle:s})}return{id:e,major:n,provider:s.provider,commands:s.commands,transport:s.transport.kind==="machine"?{kind:"machine"}:{kind:"http",endpoint:s.transport.endpoint},source:"pinned"}}o(mn,"resolveProviderBundle");let y=null;const He=4*6e4;function C(e,n){e.stage=n,e.stageAt=Date.now()}o(C,"enter");function Fe(e,n){return e?.provider?.id===n&&e.bundle?.endpoint===`${I()}/providers/${encodeURIComponent(n)}/plugin`}o(Fe,"isDirectoryBundle");async function U(){return h()?Me():ke()}o(U,"bundleGrants");async function fe(e){return Y(await U()).includes(e)}o(fe,"grantNames");async function Ge(e){await V(K(X(),e),async()=>{if(!(await fe(e)||!Fe(T($(e)),e))){g($(e),{recursive:!0,force:!0}),h()?g(P(e),{force:!0}):(await $e("user",n=>{delete n.plugins[e]}),await ye("user",n=>{delete n.plugins[e]})),g(d(R(),e),{recursive:!0,force:!0}),G.delete(e),S.delete(E(e));for(const n of[...M.keys()])n.startsWith(`${e}/`)&&M.delete(n);await te(e),p({level:"info",event:"daemon.providers.bundle_uninstalled",fields:{provider:e}})}},{timeoutMs:ne,timeoutError:o(()=>new c("provider_unavailable",`timed out waiting for another process replacing plugin "${e}"`),"timeoutError")})}o(Ge,"uninstallProvider");async function Ue(){if(!(await U()).every(e=>e.status!=="active")){for(const e of Ee())if(!(e.manifest.provider===void 0||await fe(e.name)))try{await Ge(e.name)}catch(n){p({level:"error",event:"daemon.providers.bundle_uninstall_failed",fields:{provider:e.name},error:n})}}}o(Ue,"uninstallDisconnected");async function We(e){if(!q())return;C(e,"reading grants");const n=Y(await U());for(const r of n){C(e,`refreshing installed bundle ${r}`);try{await H(r,!0)}catch(t){t instanceof Object&&A.has(t)||se(r,void 0,t)}}C(e,"uninstalling disconnected bundles"),await Ue();for(const[r,t]of Re()){C(e,`refreshing pinned bundle ${r} v${t}`);try{await F(r,t,!0)}catch(a){if(a instanceof c&&a.code==="provider_version_retired"||a instanceof Object&&A.has(a))continue;se(r,t,a)}}}o(We,"syncOnce");function vn(){if(y!==null){y.rerun=!0;const n=Date.now()-y.stageAt;return n>=He&&p({level:"error",event:"daemon.providers.sync_stalled",fields:{stage:y.stage,stalled_ms:n}}),y.promise}const e={promise:Promise.resolve(),stage:"starting",stageAt:Date.now(),rerun:!1};return y=e,e.promise=(async()=>{try{do e.rerun=!1,await We(e);while(e.rerun)}finally{y=null}})(),e.promise}o(vn,"syncProviderBundles");export{ln as ensureProviderBundle,Ce as providerInstallState,pn as refreshProviderBundle,mn as resolveProviderBundle,vn as syncProviderBundles,De as unavailableProviderError};
@@ -1 +1 @@
1
- var de=Object.defineProperty;var m=(e,t)=>de(e,"name",{value:t,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,scopeMissing as we}from"./errors.js";import{resolveProviderRef as ye}from"./roots.js";import{providerToolPath as be}from"../plugin-objects-manifest.js";import{ensureProviderBundle as _e,refreshProviderBundle as X,resolveProviderBundle as O,unavailableProviderError as Ae}from"./bundles.js";import{prepareFileCall as je,resignForRetry as Y,resolveFileResult as Z}from"./files.js";import{consumeApproval as ke,requireProviderApproval as $e}from"./approval.js";import{outboundToken as Pe}from"./mint.js";import{discardFile as Ee}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 Re}from"../../shared/traceparent.js";import{sendProviderRequest as Te,ProviderTransportError as Ie}from"./request.js";import{acceptProviderReceipt as Me}from"./receipts.js";import{writeProviderAudit as Se}from"./audit.js";import{selectDevice as Be,sendDeviceCall as Ne,deviceFailure as Oe,deviceUnreachable as ee,DEFAULT_DEVICE_REQUEST_MS as Fe}from"./device.js";import{isLibsSearch as re,wantsBundling as De,callLibsSearch as Ue,bundleExec as Le,mapLibOutcome as Je,reportLibCalls as He}from"./device-libs.js";import{ownMachineId as xe}from"../peer/directory.js";import{directoryIssuer as Ge}from"../directory/issuer.js";import{isCloudRole as ze}from"../canvas/person-state.js";import{formatCrtrCaller as te}from"../command-plugins/caller-header.js";import{getNode as Qe}from"../canvas/canvas.js";import{envelopeForProviderCaller as Ve,EnvelopeError as We}from"../peer/envelope.js";const Ke="app:terminal";function oe(e){const t=[],n=m((c,r,i)=>{const u=[...r,c.name],a=i||c.tier==="hidden";if(c.kind==="branch"){for(const v of c.children)n(v,u,a);return}const j=be(e.roots.length,u);t.push({tool:j,leaf:c,hidden:a})},"walk");for(const c of e.roots)n(c,[],!1);return t}m(oe,"providerLeaves");function ie(e){if(e.kind!=="branch")return null;const t=[];for(const h of e.children)if(h.kind==="branch"){const b=ie(h);b&&t.push(b)}else if("group"in h&&h.group){const{kind:b,name:p,description:_,whenToUse:w,tier:y,summary:k,params:$,output:o,effects:d,group:A}=h;t.push({kind:b,name:p,description:_,whenToUse:w,...y===void 0?{}:{tier:y},summary:k,params:$,output:o,effects:d,group:A})}if(t.length===0)return null;const{kind:n,name:c,description:r,whenToUse:i,tier:u,summary:a,model:j,rootEntry:v}=e;return{kind:n,name:c,description:r,whenToUse:i,...u===void 0?{}:{tier:u},summary:a,...j===void 0?{}:{model:j},...v===void 0?{}:{rootEntry:v},children:t}}m(ie,"providerHelpBranch");async function Ir(e,t){const n=await O(t),c=oe(n.commands),r=he("user").find(i=>i.name===t)?.manifest.description??t;return{provider:t,status:"available",major:n.major,display_name:r,transport:n.transport.kind,groups:n.provider.groups.filter(i=>ue(e,`${t}:${i.group}`)).map(i=>({group:i.group,leaves:c.filter(({leaf:u,hidden:a})=>!a&&u.group===i.group).map(({tool:u,leaf:a})=>({tool:u,description:a.description,summary:a.summary,params:a.params,output:a.output}))})),commands:n.commands.roots.flatMap(i=>{const u=ie(i);return u?[u]:[]})}}m(Ir,"providerTools");async function Xe(e){return await Me(e.headers["crtr-receipt"],e)}m(Xe,"onProviderResponse");async function Ye(e){if(e.class==="person"){const t=(await pe())?.sub;if(!t)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:t,grantee:t}}if(!e.sub||!e.grantee)throw new l("grant_revoked","the caller has no active grant");return{sub:e.sub,grantee:e.grantee}}m(Ye,"identity");function Ze(e,t){return[`${e.id}:${t.group}`]}m(Ze,"callScope");function er(e,t){const n=oe(e.commands).find(c=>c.tool===t);if(!n)throw new l("not_found",`tool "${t}" is not in provider "${e.id}"`,{param:"tool"});if(!n.leaf.group)throw new l("not_found",`tool "${t}" has no group`,{param:"tool"});return n.leaf}m(er,"leafFor");function G(e){if(!e||typeof e!="object"||Array.isArray(e))return{};const t=e.error;return!t||typeof t!="object"||Array.isArray(t)?{}:t}m(G,"errorBody");function rr(e){const t=Array.isArray(e)?e[0]:e;if(!t)return;const n=Number(t);if(Number.isFinite(n)&&n>=0)return n;const c=Date.parse(t);return Number.isFinite(c)?Math.max(0,Math.ceil((c-Date.now())/1e3)):void 0}m(rr,"retryAfter");function F(e,t,n,c=!1){const r=G(t),i=typeof r.code=="string"?r.code:void 0,u=typeof r.message=="string"?r.message:`provider answered HTTP ${e}`,a=typeof r.field=="string"?r.field:void 0,v={origin:"provider",details:{code:i??null,message:u,...a?{field:a}:{},...typeof r.next=="string"?{next:r.next}:{},...r.received!==void 0?{received:r.received}:{},status:e},...a?{param:a}:{}};return e===429?new l("provider_rate_limited",u,{...v,retry_after_s:rr(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,t){return JSON.stringify({major:e.major,endpoint:e.transport.kind==="http"?e.transport.endpoint:null,baseUrl:e.commands.baseUrl??null,rest:t.rest,params:t.params,output:t.output})}m(ne,"approvalShape");async function tr(e){const t=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 Qe(e.node_id))?.profile_id??void 0:void 0,machine:Ge()!==null?xe():void 0});return t===""?{}:{"Crtr-Caller":t}}m(tr,"crtrCallerHeader");async function Mr(e,t,n){const c=ye(t.provider);if(c===null)throw new l("not_found",`provider "${t.provider}" is not available`,{param:"provider"});const r={...t,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 a=n.requestId;const j=n.traceId??Re(),v=qe({request_id:a,run_id:e.run_id,node_id:e.node_id,controller:i});let h,b,p,_,w,y,k,$="allowed";try{if(ze()&&e.class==="person"&&e.resolved!==null&&!e.resolved.some(g=>g.startsWith(`${r.provider}:`)))throw we(`${r.provider}:*`);try{await _e(r.provider)}catch{throw Ae(r.provider)}let o=await O(r.provider,r.version),d=!1,A=!1,P,D,q,z=!1,Q=!1,U,V=0;for(;;){const g=er(o,r.tool);if(p=`${o.id}:${g.group}`,le(e,o.id,g.group),o.transport.kind!=="machine"&&r.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 Be(r.machine,void 0,{newest:re(o.major,r.tool)}),V=Date.now()+(o.commands.timeouts?.requestMs??Fe));let L=null;if(r.approval&&!z){const s=await ke(e,r,ne(o,g));q=s.option,L=s.prepared,k=r.approval,a=s.requestId,z=!0}const M={params:g.params.filter(s=>"type"in s&&s.type==="file").map(s=>s.name),output:g.output.find(s=>s.type==="file")?.name??null},W=JSON.stringify(M);if(D!==void 0&&D!==W)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=W,L&&(P=await Y(e,M,r.arguments,L,{signal:i.signal})),P??=await je(e,M,r.arguments,{signal:i.signal});const{sub:R,grantee:S}=await Ye(e);if(o.transport.kind==="machine"){const s=await or(e,o,r,g,P,{sub:R,requestId:a,deadlineAt:V,signal:i.signal,machine:U});return y=s.responder,h=s.cleanup,{status:200,body:s.result}}const K=o.transport.endpoint;let C;try{C=await Pe({audience:K,sub:R,grantee:S,initiating_app:S,scope:Ze(o,g)},{signal:i.signal})}catch(s){if(!(s instanceof l)||s.details?.directory_error!=="invalid_target"||A)throw s;A=!0,await X(o.id,{conditional:!1,...r.version===void 0?{}:{version:r.version}});const E=await O(o.id,r.version);if(E.transport.kind==="machine"||E.transport.endpoint===K)throw s;o=E;continue}_=C.jti;const J=e.class==="person"?Ke: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:a,kind:"tool",what:`${o.id}:${r.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 se={registration:{name:o.id,endpoint:o.transport.endpoint},...o.commands.baseUrl?{baseUrl:o.commands.baseUrl}:{},...o.commands.timeouts?{timeouts:o.commands.timeouts}:{},params:g.params,rest:g.rest,output:g.output,commandPath:[o.id,...r.tool.split(" ")]},ae=Ce(se,P.arguments,void 0,{authorization:`Bearer ${C.access_token}`,requestId:a,traceId:j,fileMode:"pass-through",extraHeaders:{...n.causedBy?{"Crtr-Caused-By":n.causedBy}:{},...e.run_id?{"Crtr-Run-Id":e.run_id}:{},...await tr(e),...q?{"Crtr-Approval":q}:{},...P.headers}});b??=Date.now()+(o.commands.timeouts?.requestMs??3e4);let f;try{if(f=await Te(ae,{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(s){throw i.signal.aborted?i.signal.reason??s:s instanceof Ie?new l("provider_unavailable",s.message,{origin:"provider",details:{status:null,code:s.kind}}):s}if(w??=await Xe({provider:o.id,tool:r.tool,request_id:a,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}),y=f.headers["crtr-responder"],f.status===401&&Ee(C.key),f.status>=200&&f.status<300){const s=f.body;if(!s||typeof s!="object"||Array.isArray(s))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,P,s,{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}h=E.cleanup;const N=x(g.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 s=await $e(e,r,a,B.question,i.signal,ne(o,g),P);if(k=s.questionId,q=s.option,P=await Y(e,M,r.arguments,P,{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,...r.version===void 0?{}:{version:r.version}}),o=await O(o.id,r.version);continue}throw F(f.status,f.body,f.headers,!!q)}}catch(o){throw o instanceof l&&o.question_id&&(k=o.question_id),y===void 0&&o instanceof l&&typeof o.responder=="string"&&(y=o.responder),$=`refused:${o instanceof l?o.code:"server_error"}`,await h?.(),o}finally{try{await Se({request_id:a,caller:e,provider:r.provider,tool:r.tool,scope_checked:p,outcome:$,jti:_,receipt_id:w,responder:y,question_id:k})}finally{v()}n.signal.removeEventListener("abort",u)}}m(Mr,"callProvider");async function or(e,t,n,c,r,i){const{machine:u}=i;let a;try{a=await Ve(e,i.sub)}catch(d){throw d instanceof We?new l("invalid_request",d.message,{origin:"runtime"}):d}const j={machine:u,envelope:a,signal:i.signal,deadlineAt:i.deadlineAt,mapFailure:F};if(re(t.major,n.tool)){const d=await Ue(j,r.arguments,t.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=r.arguments,h=null,b="";if(De(t.major,n.tool,r.arguments)){const d=await Le(j,r.arguments,t.major);if(i.deadlineAt-Date.now()<=0)throw ee(u,"timeout","");d!==null&&(v=d.arguments,h=d.services,b=d.release)}const p=await Ne(u,{tool:n.tool,arguments:v,version:t.major,requestId:i.requestId,runId:e.run_id,deadlineAt:i.deadlineAt,upload:r.upload===null?null:{id:r.upload.upload_id,link:r.upload.upload_link}},a,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"],w=G(p.body);if(p.status<200||p.status>=300){const d=Oe(u,p.status,typeof w.code=="string"?w.code:void 0,typeof w.message=="string"?w.message:void 0,p.body),A=d===null&&p.status>=500&&typeof w.code=="string"?new l("provider_error",typeof w.message=="string"?w.message:`the device answered HTTP ${p.status}`,{origin:"runtime",status:p.status,details:{code:w.code,status:p.status}}):null;throw Object.assign(d??A??F(p.status,p.body,p.headers),{responder:_})}const y=p.body&&typeof p.body=="object"&&!Array.isArray(p.body)?p.body.result:void 0;if(!y||typeof y!="object"||Array.isArray(y))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=y;if(h!==null){const d=Je(k,h);if(He(u,a,b,d.calls),"error"in d)throw Object.assign(d.error,{responder:_});k=d.result}let $;try{$=await Z(e,r,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,$.result);if(o)throw await $.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:$.result,responder:_,cleanup:$.cleanup}}m(or,"callDevice");export{Mr as callProvider,tr as crtrCallerHeader,Ye as identity,F as mapProviderResponse,Xe as onProviderResponse,oe as providerLeaves,Ir as providerTools};
1
+ var ue=Object.defineProperty;var m=(e,o)=>ue(e,"name",{value:o,configurable:!0});import{validateDeclaredResult as G}from"../../api/command-manifest/result.js";import{callerAllows as le,requireGroup as pe}from"../../daemon/api/handlers/providers.js";import{callerTerminalGrant as ce}from"../grants/terminal.js";import{findRefusal as fe,payerOf as me,refusalError as ve,refusedMark as ge,writeCharge as he}from"../ledger/index.js";import{listInstalledPlugins as we}from"../resolver.js";import{emitEvent as ye}from"../events/emit.js";import{ProviderError as l,scopeMissing as be}from"./errors.js";import{resolveProviderRef as _e}from"./roots.js";import{providerToolPath as je}from"../plugin-objects-manifest.js";import{ensureProviderBundle as Ae,refreshProviderBundle as Y,resolveProviderBundle as O,unavailableProviderError as ke}from"./bundles.js";import{prepareFileCall as $e,resignForRetry as Z,resolveFileResult as ee}from"./files.js";import{consumeApproval as Pe,requireProviderApproval as Ee}from"./approval.js";import{outboundToken as qe}from"./mint.js";import{discardFile as Ce}from"./token-cache.js";import{registerProviderCall as Re}from"./inflight.js";import{buildRequestPlan as Me}from"../command-plugins/transport/http-plan.js";import{newTraceId as Te}from"../../shared/traceparent.js";import{sendProviderRequest as Ie,ProviderTransportError as Be}from"./request.js";import{acceptProviderReceipt as Se}from"./receipts.js";import{writeProviderAudit as Ne}from"./audit.js";import{selectDevice as Oe,sendDeviceCall as Fe,deviceFailure as De,deviceUnreachable as re,DEFAULT_DEVICE_REQUEST_MS as Ue}from"./device.js";import{isLibsSearch as te,wantsBundling as Le,callLibsSearch as Je,bundleExec as He,mapLibOutcome as xe,reportLibCalls as Ge}from"./device-libs.js";import{ownMachineId as ze}from"../peer/directory.js";import{directoryIssuer as Qe}from"../directory/issuer.js";import{isCloudRole as Ve}from"../canvas/person-state.js";import{formatCrtrCaller as oe}from"../command-plugins/caller-header.js";import{getNode as We}from"../canvas/canvas.js";import{envelopeForProviderCaller as Ke,EnvelopeError as Xe}from"../peer/envelope.js";const Ye="app:terminal";function ie(e){const o=[],n=m((c,r,i)=>{const u=[...r,c.name],a=i||c.tier==="hidden";if(c.kind==="branch"){for(const v of c.children)n(v,u,a);return}const A=je(e.roots.length,u);o.push({tool:A,leaf:c,hidden:a})},"walk");for(const c of e.roots)n(c,[],!1);return o}m(ie,"providerLeaves");function ne(e){if(e.kind!=="branch")return null;const o=[];for(const h of e.children)if(h.kind==="branch"){const b=ne(h);b&&o.push(b)}else if("group"in h&&h.group){const{kind:b,name:p,description:_,whenToUse:w,tier:y,summary:k,params:$,output:t,effects:d,group:j}=h;o.push({kind:b,name:p,description:_,whenToUse:w,...y===void 0?{}:{tier:y},summary:k,params:$,output:t,effects:d,group:j})}if(o.length===0)return null;const{kind:n,name:c,description:r,whenToUse:i,tier:u,summary:a,model:A,rootEntry:v}=e;return{kind:n,name:c,description:r,whenToUse:i,...u===void 0?{}:{tier:u},summary:a,...A===void 0?{}:{model:A},...v===void 0?{}:{rootEntry:v},children:o}}m(ne,"providerHelpBranch");async function Sr(e,o){const n=await O(o),c=ie(n.commands),r=we("user").find(i=>i.name===o)?.manifest.description??o;return{provider:o,status:"available",major:n.major,display_name:r,transport:n.transport.kind,groups:n.provider.groups.filter(i=>le(e,`${o}:${i.group}`)).map(i=>({group:i.group,leaves:c.filter(({leaf:u,hidden:a})=>!a&&u.group===i.group).map(({tool:u,leaf:a})=>({tool:u,description:a.description,summary:a.summary,params:a.params,output:a.output}))})),commands:n.commands.roots.flatMap(i=>{const u=ne(i);return u?[u]:[]})}}m(Sr,"providerTools");async function Ze(e){return await Se(e.headers["crtr-receipt"],e)}m(Ze,"onProviderResponse");async function er(e){if(e.class==="person"){const o=(await ce())?.sub;if(!o)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:o,grantee:o}}if(!e.sub||!e.grantee)throw new l("grant_revoked","the caller has no active grant");return{sub:e.sub,grantee:e.grantee}}m(er,"identity");function rr(e,o){return[`${e.id}:${o.group}`]}m(rr,"callScope");function tr(e,o){const n=ie(e.commands).find(c=>c.tool===o);if(!n)throw new l("not_found",`tool "${o}" is not in provider "${e.id}"`,{param:"tool"});if(!n.leaf.group)throw new l("not_found",`tool "${o}" has no group`,{param:"tool"});return n.leaf}m(tr,"leafFor");function z(e){if(!e||typeof e!="object"||Array.isArray(e))return{};const o=e.error;return!o||typeof o!="object"||Array.isArray(o)?{}:o}m(z,"errorBody");function or(e){const o=Array.isArray(e)?e[0]:e;if(!o)return;const n=Number(o);if(Number.isFinite(n)&&n>=0)return n;const c=Date.parse(o);return Number.isFinite(c)?Math.max(0,Math.ceil((c-Date.now())/1e3)):void 0}m(or,"retryAfter");function F(e,o,n,c=!1){const r=z(o),i=typeof r.code=="string"?r.code:void 0,u=typeof r.message=="string"?r.message:`provider answered HTTP ${e}`,a=typeof r.field=="string"?r.field:void 0,v={origin:"provider",details:{code:i??null,message:u,...a?{field:a}:{},...typeof r.next=="string"?{next:r.next}:{},...r.received!==void 0?{received:r.received}:{},status:e},...a?{param:a}:{}};return e===429?new l("provider_rate_limited",u,{...v,retry_after_s:or(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 se(e,o){return JSON.stringify({major:e.major,endpoint:e.transport.kind==="http"?e.transport.endpoint:null,baseUrl:e.commands.baseUrl??null,rest:o.rest,params:o.params,output:o.output})}m(se,"approvalShape");async function ir(e){const o=e.origin!==void 0?oe({node:e.origin.node??void 0,run:e.origin.run??void 0,machine:e.origin.machine}):oe({node:e.node_id??void 0,run:e.run_id??void 0,profile:e.node_id?(await We(e.node_id))?.profile_id??void 0:void 0,machine:Qe()!==null?ze():void 0});return o===""?{}:{"Crtr-Caller":o}}m(ir,"crtrCallerHeader");async function Nr(e,o,n){const c=_e(o.provider);if(c===null)throw new l("not_found",`provider "${o.provider}" is not available`,{param:"provider"});const r={...o,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 a=n.requestId;const A=n.traceId??Te(),v=Re({request_id:a,run_id:e.run_id,node_id:e.node_id,controller:i});let h,b,p,_,w,y,k,$="allowed";try{if(Ve()&&e.class==="person"&&e.resolved!==null&&!e.resolved.some(g=>g.startsWith(`${r.provider}:`)))throw be(`${r.provider}:*`);try{await Ae(r.provider)}catch{throw ke(r.provider)}let t=await O(r.provider,r.version),d=!1,j=!1,P,D,q,Q=!1,V=!1,U,W=0;for(;;){const g=tr(t,r.tool);if(p=`${t.id}:${g.group}`,pe(e,t.id,g.group),t.transport.kind!=="machine"&&r.machine!==void 0)throw new l("invalid_argument",`provider "${t.id}" is not served by a device, so it takes no machine`,{param:"machine"});t.transport.kind==="machine"&&U===void 0&&(U=await Oe(r.machine,void 0,{newest:te(t.major,r.tool)}),W=Date.now()+(t.commands.timeouts?.requestMs??Ue));let L=null;if(r.approval&&!Q){const s=await Pe(e,r,se(t,g));q=s.option,L=s.prepared,k=r.approval,a=s.requestId,Q=!0}const B={params:g.params.filter(s=>"type"in s&&s.type==="file").map(s=>s.name),output:g.output.find(s=>s.type==="file")?.name??null},K=JSON.stringify(B);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&&(P=await Z(e,B,r.arguments,L,{signal:i.signal})),P??=await $e(e,B,r.arguments,{signal:i.signal});const{sub:M,grantee:S}=await er(e);if(t.transport.kind==="machine"){const s=await nr(e,t,r,g,P,{sub:M,requestId:a,deadlineAt:W,signal:i.signal,machine:U});return y=s.responder,h=s.cleanup,{status:200,body:s.result}}const X=t.transport.endpoint;let C;try{C=await qe({audience:X,sub:M,grantee:S,initiating_app:S,scope:rr(t,g)},{signal:i.signal})}catch(s){if(!(s instanceof l)||s.details?.directory_error!=="invalid_target"||j)throw s;j=!0,await Y(t.id,{conditional:!1,...r.version===void 0?{}:{version:r.version}});const E=await O(t.id,r.version);if(E.transport.kind==="machine"||E.transport.endpoint===X)throw s;t=E;continue}_=C.jti;const J=e.class==="person"?Ye:S,T=me({call:"tool",tokenPayer:C.payer,sub:M}),H=await fe({scope:"call",payer:T.payer,funding:T.funding,sub:M,grantee:J,provider:`app:${t.id}`});if(H!==null)throw await he({request:a,kind:"tool",what:`${t.id}:${r.tool}`,usd:0,payer:T.payer,funding:T.funding,sub:M,grantee:J,node:e.node_id,run:e.run_id,provider:`app:${t.id}`,causedBy:n.causedBy??null,refused:ge(H)}),ve(H);const ae={registration:{name:t.id,endpoint:t.transport.endpoint},...t.commands.baseUrl?{baseUrl:t.commands.baseUrl}:{},...t.commands.timeouts?{timeouts:t.commands.timeouts}:{},params:g.params,rest:g.rest,output:g.output,commandPath:[t.id,...r.tool.split(" ")]},de=Me(ae,P.arguments,void 0,{authorization:`Bearer ${C.access_token}`,requestId:a,traceId:A,fileMode:"pass-through",extraHeaders:{...n.causedBy?{"Crtr-Caused-By":n.causedBy}:{},...e.run_id?{"Crtr-Run-Id":e.run_id}:{},...await ir(e),...q?{"Crtr-Approval":q}:{},...P.headers}});b??=Date.now()+(t.commands.timeouts?.requestMs??3e4);let f;try{if(f=await Ie(de,{connectMs:t.commands.timeouts?.connectMs,requestMs:t.commands.timeouts?.requestMs,deadlineAt:b,signal:i.signal}),i.signal.aborted)throw i.signal.reason??new Error("provider call aborted")}catch(s){throw i.signal.aborted?i.signal.reason??s:s instanceof Be?new l("provider_unavailable",s.message,{origin:"provider",details:{status:null,code:s.kind}}):s}if(w??=await Ze({provider:t.id,tool:r.tool,request_id:a,run_id:e.run_id,sub:M,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}),y=f.headers["crtr-responder"],f.status===401&&Ce(C.key),f.status>=200&&f.status<300){const s=f.body;if(!s||typeof s!="object"||Array.isArray(s))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 ee(e,P,s,{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}h=E.cleanup;const N=G(g.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 R=z(f.body);if(f.status===403&&R.code==="approval_required"&&!q&&!V){V=!0;const s=await Ee(e,r,a,R.question,i.signal,se(t,g),P);if(k=s.questionId,q=s.option,P=await Z(e,B,r.arguments,P,{signal:i.signal}),b=void 0,i.signal.aborted)throw new l("user_denied","the approval wait was canceled");continue}if(f.status===403&&R.code==="approval_required"&&q)throw F(f.status,f.body,f.headers,!0);const x=f.status===410&&R.code==="unsupported_major"&&r.version===void 0;if(f.status!==401&&(R.manifest_stale===!0||x)&&!d){d=!0;const s=t.major;await Y(t.id,{conditional:!1,...r.version===void 0?{}:{version:r.version}}),t=await O(t.id,r.version),ye({level:"info",event:"daemon.providers.call_retried",fields:{provider:t.id,tool:r.tool,reason:x?"unsupported_major":"manifest_stale",major_before:s,major_after:t.major,...x&&typeof R.received=="number"?{received:R.received}:{}}});continue}throw F(f.status,f.body,f.headers,!!q)}}catch(t){throw t instanceof l&&t.question_id&&(k=t.question_id),y===void 0&&t instanceof l&&typeof t.responder=="string"&&(y=t.responder),$=`refused:${t instanceof l?t.code:"server_error"}`,await h?.(),t}finally{try{await Ne({request_id:a,caller:e,provider:r.provider,tool:r.tool,scope_checked:p,outcome:$,jti:_,receipt_id:w,responder:y,question_id:k})}finally{v()}n.signal.removeEventListener("abort",u)}}m(Nr,"callProvider");async function nr(e,o,n,c,r,i){const{machine:u}=i;let a;try{a=await Ke(e,i.sub)}catch(d){throw d instanceof Xe?new l("invalid_request",d.message,{origin:"runtime"}):d}const A={machine:u,envelope:a,signal:i.signal,deadlineAt:i.deadlineAt,mapFailure:F};if(te(o.major,n.tool)){const d=await Je(A,r.arguments,o.major),j=G(c.output,d);if(j)throw new l("provider_bad_response",`the libraries result has an invalid output field "${j.field}"`,{origin:"provider",param:j.field,details:{status:200,...j}});return{result:d,responder:void 0,cleanup:void 0}}let v=r.arguments,h=null,b="";if(Le(o.major,n.tool,r.arguments)){const d=await He(A,r.arguments,o.major);if(i.deadlineAt-Date.now()<=0)throw re(u,"timeout","");d!==null&&(v=d.arguments,h=d.services,b=d.release)}const p=await Fe(u,{tool:n.tool,arguments:v,version:o.major,requestId:i.requestId,runId:e.run_id,deadlineAt:i.deadlineAt,upload:r.upload===null?null:{id:r.upload.upload_id,link:r.upload.upload_link}},a,i.signal);if(i.signal.aborted)throw i.signal.reason??new Error("provider call aborted");if("unreachable"in p)throw re(u,p.unreachable.reason,p.unreachable.message);const _=p.headers["crtr-responder"],w=z(p.body);if(p.status<200||p.status>=300){const d=De(u,p.status,typeof w.code=="string"?w.code:void 0,typeof w.message=="string"?w.message:void 0,p.body),j=d===null&&p.status>=500&&typeof w.code=="string"?new l("provider_error",typeof w.message=="string"?w.message:`the device answered HTTP ${p.status}`,{origin:"runtime",status:p.status,details:{code:w.code,status:p.status}}):null;throw Object.assign(d??j??F(p.status,p.body,p.headers),{responder:_})}const y=p.body&&typeof p.body=="object"&&!Array.isArray(p.body)?p.body.result:void 0;if(!y||typeof y!="object"||Array.isArray(y))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=y;if(h!==null){const d=xe(k,h);if(Ge(u,a,b,d.calls),"error"in d)throw Object.assign(d.error,{responder:_});k=d.result}let $;try{$=await ee(e,r,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 t=G(c.output,$.result);if(t)throw await $.cleanup?.(),Object.assign(new l("provider_bad_response",`the device result has an invalid output field "${t.field}"`,{origin:"provider",param:t.field,details:{status:p.status,...t}}),{responder:_});return{result:$.result,responder:_,cleanup:$.cleanup}}m(nr,"callDevice");export{Nr as callProvider,ir as crtrCallerHeader,er as identity,F as mapProviderResponse,Ze as onProviderResponse,ie as providerLeaves,Sr as providerTools};
@@ -1 +1 @@
1
- var p=Object.defineProperty;var a=(e,n)=>p(e,"name",{value:n,configurable:!0});import{directory as c,normalizeMachineId as m}from"../peer/directory.js";import{peerCall as f}from"../peer/client.js";import{ProviderError as s}from"./errors.js";const l={current:{list:a(()=>c.list(),"list"),lastList:a(()=>c.lastList(),"lastList"),call:a((e,n,i)=>f(e,n,i),"call")}},g="/v1/device/call",A=6e4,v=a(e=>({machine_id:e.machine_id,name:e.name,last_seen:e.last_seen}),"candidateView");function u(e,n){const i=e.map(r=>`${r.name} (${r.machine_id})`).join(", ");return new s("machine_required",n===void 0?`This account has ${e.length} devices: ${i}. Pick one with --machine <machine_id>.`:`${n} is not one of this account's devices. Devices: ${i}. Pick one with --machine <machine_id>.`,{param:"machine",details:{candidates:e.map(v)}})}a(u,"machineRequired");const h=a(e=>{const n=e.last_seen===null?NaN:Date.parse(e.last_seen);return Number.isFinite(n)?n:-1/0},"seenAt");async function x(e,n=l.current,i={}){let r;try{r=await n.list()}catch(t){const d=n.lastList();if(d===null)throw new s("provider_unavailable",`The directory could not be reached to find your devices: ${t instanceof Error?t.message:String(t)}`,{origin:"directory"});r=d}const o=r.filter(t=>t.kind==="device");if(o.length===0){const t="This needs the Northlight app on your Mac, and none is paired to this account. Run `crtr sys desktop install`: it downloads Northlight Desktop from Northlight, installs it in Applications, opens it and pairs it to this account.",d="Tell the person in one or two sentences what the Northlight app gives them for this task (their own signed-in browser, Messages, files and shell on this Mac) and ask once whether to install it; on yes run `crtr sys desktop install` yourself. If they already said no to it in this conversation, do not ask again: say it needs the app and carry on without it.";throw new s("provider_not_connected",t,{origin:"provider",details:{code:"provider_not_connected",message:t,next:d,status:403}})}if(e!==void 0){const t=m(e),d=o.find(_=>_.machine_id===t);if(!d)throw u(o,e);return d}if(o.length>1&&i.newest===!0)return o.reduce((t,d)=>h(d)>h(t)?d:t);if(o.length>1)throw u(o,void 0);return o[0]}a(x,"selectDevice");function w(e){return{tool:e.tool,arguments:e.arguments,version:e.version,request_id:e.requestId,...e.runId===null?{}:{run_id:e.runId},deadline_at:e.deadlineAt,...e.upload===null?{}:{upload:e.upload}}}a(w,"deviceBody");async function b(e,n,i,r,o=l.current){const t=Math.max(1,n.deadlineAt-Date.now());return o.call(e.machine_id,{method:"POST",path:g,body:w(n)},{envelope:i,device:!0,signal:AbortSignal.any([r,AbortSignal.timeout(t)])})}a(b,"sendDeviceCall");function E(e,n,i){switch(n){case"timeout":return new s("device_timeout",`${e.name} did not answer in time.`,{origin:"runtime",details:{machine_id:e.machine_id}});case"directory_unreachable":case"no_directory":return new s("provider_unavailable",i,{origin:"directory"});case"unknown_machine":return new s("provider_not_connected",`${e.name} is no longer on this account.`,{origin:"directory"});case"not_a_crtr_peer":return new s("server_error",i);default:return new s("device_offline",i.trim()===""?`${e.name} is offline.`:i,{origin:"runtime",details:{machine_id:e.machine_id}})}}a(E,"deviceUnreachable");function N(e,n,i,r,o){if(n===401)return new s("device_offline",`${e.name}: Desktop is signed out. Sign in to Northlight Desktop again.`,{origin:"runtime",details:{machine_id:e.machine_id}});if(n===426){const t=o?.error?.details?.supported;return new s("peer_version_too_old",r??`${e.name} does not serve this device major. Update Northlight Desktop.`,{origin:"runtime",details:{machine_id:e.machine_id,...Array.isArray(t)?{supported:t}:{}}})}return n===502&&i==="machine_disconnected"?new s("device_disconnected",`${e.name} disconnected during the call; the action may have run.`,{origin:"runtime",details:{machine_id:e.machine_id}}):i==="payload_too_large"||i==="response_too_large"?new s("provider_error",r??"The call or its answer was too large for the relay (16 MiB).",{origin:"runtime",status:413,details:{code:i,message:r??null,status:n}}):null}a(N,"deviceFailure");export{A as DEFAULT_DEVICE_REQUEST_MS,g as DEVICE_CALL_PATH,w as deviceBody,l as deviceDeps,N as deviceFailure,E as deviceUnreachable,x as selectDevice,b as sendDeviceCall};
1
+ var p=Object.defineProperty;var a=(e,n)=>p(e,"name",{value:n,configurable:!0});import{directory as c,normalizeMachineId as m}from"../peer/directory.js";import{peerCall as g}from"../peer/client.js";import{ProviderError as s}from"./errors.js";const l={current:{list:a(()=>c.list(),"list"),lastList:a(()=>c.lastList(),"lastList"),call:a((e,n,t)=>g(e,n,t),"call")}},f="/v1/device/call",A=6e4,w=a(e=>({machine_id:e.machine_id,name:e.name,last_seen:e.last_seen}),"candidateView");function h(e,n){const t=e.map(o=>`${o.name} (${o.machine_id})`).join(", ");return new s("machine_required",n===void 0?`This account has ${e.length} devices: ${t}. Pick one with --machine <machine_id>.`:`${n} is not one of this account's devices. Devices: ${t}. Pick one with --machine <machine_id>.`,{param:"machine",details:{candidates:e.map(w)}})}a(h,"machineRequired");const u=a(e=>{const n=e.last_seen===null?NaN:Date.parse(e.last_seen);return Number.isFinite(n)?n:-1/0},"seenAt");async function M(e,n=l.current,t={}){let o;try{o=await n.list()}catch(i){const d=n.lastList();if(d===null)throw new s("provider_unavailable",`The directory could not be reached to find your devices: ${i instanceof Error?i.message:String(i)}`,{origin:"directory"});o=d}const r=o.filter(i=>i.kind==="device");if(r.length===0){const i="This needs the Northlight app on your Mac, and none is signed in to this account. Install Northlight Desktop on the Mac (on that Mac, `crtr sys desktop install`; otherwise https://account.northlight.ai/desktop), then sign in inside Desktop with the same Northlight account: its window shows a code and one Allow click.",d="Tell the person in one or two sentences what the Northlight app gives them for this task (their own signed-in browser, Messages, files and shell on this Mac) and ask once whether to install it. On yes: if you are running on their Mac, run `crtr sys desktop install` yourself; otherwise give them https://account.northlight.ai/desktop (or the download steps you already have) to install Desktop on their Mac. Then they sign in inside Desktop with the same Northlight account; do not ask them to sign crtr in. If they already said no to it in this conversation, do not ask again: say it needs the app and carry on without it.";throw new s("provider_not_connected",i,{origin:"provider",details:{code:"provider_not_connected",message:i,next:d,status:403}})}if(e!==void 0){const i=m(e),d=r.find(_=>_.machine_id===i);if(!d)throw h(r,e);return d}if(r.length>1&&t.newest===!0)return r.reduce((i,d)=>u(d)>u(i)?d:i);if(r.length>1)throw h(r,void 0);return r[0]}a(M,"selectDevice");function v(e){return{tool:e.tool,arguments:e.arguments,version:e.version,request_id:e.requestId,...e.runId===null?{}:{run_id:e.runId},deadline_at:e.deadlineAt,...e.upload===null?{}:{upload:e.upload}}}a(v,"deviceBody");async function x(e,n,t,o,r=l.current){const i=Math.max(1,n.deadlineAt-Date.now());return r.call(e.machine_id,{method:"POST",path:f,body:v(n)},{envelope:t,device:!0,signal:AbortSignal.any([o,AbortSignal.timeout(i)])})}a(x,"sendDeviceCall");function N(e,n,t){switch(n){case"timeout":return new s("device_timeout",`${e.name} did not answer in time.`,{origin:"runtime",details:{machine_id:e.machine_id}});case"directory_unreachable":case"no_directory":return new s("provider_unavailable",t,{origin:"directory"});case"unknown_machine":return new s("provider_not_connected",`${e.name} is no longer on this account.`,{origin:"directory"});case"not_a_crtr_peer":return new s("server_error",t);default:return new s("device_offline",t.trim()===""?`${e.name} is offline.`:t,{origin:"runtime",details:{machine_id:e.machine_id}})}}a(N,"deviceUnreachable");function T(e,n,t,o,r){if(n===401)return new s("device_offline",`${e.name}: Desktop is signed out. Sign in to Northlight Desktop again.`,{origin:"runtime",details:{machine_id:e.machine_id}});if(n===426){const i=r?.error?.details?.supported;return new s("peer_version_too_old",o??`${e.name} does not serve this device major. Update Northlight Desktop.`,{origin:"runtime",details:{machine_id:e.machine_id,...Array.isArray(i)?{supported:i}:{}}})}return n===502&&t==="machine_disconnected"?new s("device_disconnected",`${e.name} disconnected during the call; the action may have run.`,{origin:"runtime",details:{machine_id:e.machine_id}}):t==="payload_too_large"||t==="response_too_large"?new s("provider_error",o??"The call or its answer was too large for the relay (16 MiB).",{origin:"runtime",status:413,details:{code:t,message:o??null,status:n}}):null}a(T,"deviceFailure");export{A as DEFAULT_DEVICE_REQUEST_MS,f as DEVICE_CALL_PATH,v as deviceBody,l as deviceDeps,T as deviceFailure,N as deviceUnreachable,M as selectDevice,x as sendDeviceCall};
@@ -1 +1,3 @@
1
- var O=Object.defineProperty;var w=(o,e)=>O(o,"name",{value:e,configurable:!0});import{killBashJobObject as P,recordBashJobObject as R}from"../../../core/spaces/stop.js";import{readerFor as T}from"../reader.js";import{join as F}from"node:path";import{createFileBeneath as v,existsBeneath as _,unlinkBeneath as C}from"../../../core/spaces/open-beneath.js";import{launchAppProcess as M,appProcessSandboxed as D}from"../../../core/spaces/process.js";import{BASH_JOB_SUPERVISOR_SCRIPT as L}from"../../../core/bash-job-supervisor.js";import{resolveAdmittedHostCommand as z}from"../../../core/runtime/spawn-env.js";import{requireCurrentExecution as k}from"./broker-recovery.js";import{isSafeNodeId as H}from"../../../core/canvas/paths.js";import{contextDir as I}from"../../../core/canvas/node-agent-paths.js";import{getNode as g}from"../../../core/canvas/canvas.js";import{isBrokerLive as x}from"../../../core/runtime/model-swap.js";import{assertNotFinalized as G}from"../../../core/runtime/reopen.js";import{reviveNode as K}from"../../../core/runtime/revive.js";import{checkStart as W}from"../../../core/runtime/start-check.js";import{bashJobPaths as $,isBashJobProcessGroupAlive as Z,isSafeBashJobId as A,readBashNiceness as Q,signalBashJob as U,stopBackgroundBashJob as V}from"../../../core/bash-jobs.js";import{applyJobReport as X,ownerRunsRemotely as B,runningJobs as j,setJobDeadline as E,markJobQuietOk as Y}from"../../../core/graph/jobs.js";import{withCanvasWrite as S,openDb as m}from"../../../core/canvas/db.js";import{getById as J}from"../../../core/graph/objects.js";import{blobStore as ee}from"../../../core/blobs/index.js";import{ApiError as r}from"../../../api/index.js";import{notFound as te}from"../../../core/errors.js";import{freshChildNodeExecPath as oe}from"../../../core/runtime/branded-host.js";async function y(o){const e=o.params.id;if(e===void 0||!H(e))throw new r(400,"invalid_node_id",`invalid node id: ${JSON.stringify(e)}`);if(await g(e)===null)throw te(`unknown node: ${e}`,{received:e});const i=o.params.jobId;if(i!==void 0){if(!A(i))throw new r(400,"invalid_job_id",`invalid background job id: ${JSON.stringify(i)}`);return{nodeId:e,jobId:i,dir:await I(e)}}return{nodeId:e,dir:await I(e)}}w(y,"requireTarget");async function ne(o){const{nodeId:e,dir:n}=await y(o);if(o.principal.class!=="broker"||o.principal.node!==e)throw new r(403,"permission_error","only this node\u2019s broker may start a job");const i=o.body;if(!i||typeof i!="object"||Array.isArray(i))throw new r(400,"invalid_request","job.start requires a JSON body");const u=i;await k(e,u.expected_execution_id);const t=u.job_id,a=u.cwd,d=u.env;if(typeof t!="string"||!A(t)||typeof a!="string"||!d||typeof d!="object"||Array.isArray(d)||Object.entries(d).some(([p,b])=>!/^[A-Za-z_][A-Za-z0-9_]*$/.test(p)||typeof b!="string"))throw new r(400,"invalid_request","invalid job id, cwd or environment");const c=await g(e);if(await W({grantee:c.grantee??"app:terminal",sub:c.sub,grant_id:c.grant_id}),!D())throw new r(400,"invalid_request","job.start is only used with the root launcher");const s=$(n,t);if(!(_(s.root,s.jobRun)||_(s.root,s.jobBg))||![s.cmdSh,s.jobLog].every(p=>_(s.root,p)))throw new r(404,"job_not_found","job was not prepared by this node");const f=F(s.dir,"job.starting");try{v(s.root,f,"")}catch(p){throw p.code==="EEXIST"?new r(409,"job_already_started","job was already started"):p}let h;try{const p=d,b=z("bash",p,a),q=await g(e),N=await oe();return h=await M({nodeId:e,app:q.grantee??"app:terminal",isolated:q.isolated,cwd:a,env:p,capture:!1,command:[b,"-c",L,"--",s.cmdSh,s.jobLog,s.jobExit,s.jobRun,s.jobDone,b,String(Q(n)),N,s.jobActivity]}),v(s.root,s.jobPgid,String(h.pid),384),v(s.root,s.jobPgidIdentity,`launcher:${h.pid}`,384),{status:201,body:{pid:h.pid}}}catch(p){if(h!==void 0)try{await h.stop()}catch(b){throw new AggregateError([p,b],`job ${t} launched but could not be recorded or stopped`)}try{C(s.root,f)}catch(b){if(b.code!=="ENOENT")throw b}throw p}}w(ne,"handleStart");async function ie(o){const{nodeId:e}=await y(o),n=Date.now(),i=await B(await m(),e);return{status:200,body:(await j(await m(),e)).map(t=>({job_id:t.jobId,command:t.command,purpose:t.purpose,started_at:new Date(t.startedAtMs).toISOString(),elapsed_ms:Math.max(0,n-t.startedAtMs),output_key:t.outputKey,deadline_at:t.deadlineAtMs===null?null:new Date(t.deadlineAtMs).toISOString(),pgid:t.pgid,pgid_alive:!i&&t.pgid!==null&&t.pgidIdentity!==null&&Z(t.pgid,t.pgidIdentity)}))}}w(ie,"handleList");async function re(o){const{nodeId:e,jobId:n,dir:i}=await y(o);if(n===void 0)throw new r(400,"invalid_request","a job id is required");if(o.query.get("foreground")==="1"){if(o.principal.class!=="broker"||o.principal.node!==e)throw new r(403,"permission_error","only this node\u2019s broker may abort its foreground job");await k(e,o.body?.expected_execution_id);const l=await V(i,n,!0,e);if(l.kind==="missing")throw new r(404,"job_not_found",`no job ${n} for ${e}`);if(l.kind==="retired")throw new r(404,"job_not_found",`job ${n} for ${e} is no longer running`);if(l.kind==="not-stoppable")throw new r(409,"job_not_stoppable",`job ${n} recorded no trusted process identity`);return{status:200,body:{node_id:e,job_id:n,signaled:l.signaled}}}const t=(await j(await m(),e)).find(l=>l.jobId===n);if(t===void 0)throw new r(404,"job_not_found",`no running background job ${n} for ${e}`);const a=await B(await m(),e);if(!a&&(t.pgid===null||t.pgidIdentity===null))throw new r(409,"job_not_stoppable",`job ${n} reported no trusted process identity`);await G(e);const d=a?!0:await U(t.pgid,t.pgidIdentity,e);await P(n,async l=>{const f=await T(l,o);return f.class==="person"?f.person:f.class==="app"?f.app:f.node});const c=await g(e);if(c!==null&&!x(c))try{await K(e,{resume:!0,capacity:"freeze"})}catch{}return{status:200,body:{node_id:e,job_id:n,signaled:d}}}w(re,"handleStop");async function ae(o){const{nodeId:e,jobId:n,dir:i}=await y(o);if(n===void 0)throw new r(400,"invalid_request","a job id is required");if(o.principal.class!=="broker"||o.principal.node!==e)throw new r(403,"permission_error","only this node\u2019s broker may record its job");const u=o.body,t=$(i,n),a=u?.purpose,d=u?.deadline_at_ms;if(typeof u?.command!="string"||a!=null&&typeof a!="string"||d!=null&&!Number.isFinite(d))throw new r(400,"invalid_request","job.background requires command, and optionally purpose and deadline_at_ms");if(!_(t.root,t.jobBg))throw new r(404,"job_not_found",`job ${n} of ${e} is not backgrounded`);return{status:201,body:{id:(await R(e,n,{command:u.command,purpose:a??null,deadlineAtMs:d??null})).id}}}w(ae,"handleBackground");async function de(o,e){if(e===void 0)throw new r(400,"invalid_request","a job id is required");const n=await J(await m(),e);if(n===null||n.type!=="job"||n.owner!==o)throw new r(404,"job_not_found",`no job ${e} for ${o}`);if(!(await j(await m(),o)).some(i=>i.jobId===e))throw new r(409,"job_not_running",`job ${e} for ${o} is no longer running`);return e}w(de,"requireRunningJob");async function se(o){const{nodeId:e,jobId:n}=await y(o);if(o.principal.class!=="broker"||o.principal.node!==e)throw new r(403,"permission_error","only this node\u2019s broker may report its job");const i=o.body;if(!i||typeof i!="object"||Array.isArray(i))throw new r(400,"invalid_request","job.report requires a JSON body");await k(e,i.expected_execution_id);const u=await J(await m(),n??"");if(u===null||u.type!=="job"||u.owner!==e)throw new r(404,"job_not_found",`no job ${String(n)} for ${e}`);if(!(await j(await m(),e)).some(d=>d.jobId===n))throw new r(409,"job_not_running",`job ${String(n)} for ${e} is no longer running`);const t=i.output;if(t!==void 0){if(!Number.isSafeInteger(t.seq)||t.seq<0||typeof t.data_base64!="string")throw new r(400,"invalid_request","output requires seq and data_base64");const d=await S(async c=>await c.prepare("SELECT output_key FROM jobs WHERE object = ?").get(n));await(await ee()).put(`${d.output_key}/${String(t.seq).padStart(8,"0")}`,Buffer.from(t.data_base64,"base64"))}const a=i.activity;if(a!==void 0&&(!Number.isFinite(a.last_ms)||!Number.isFinite(a.sampled_ms)||!Array.isArray(a.files)))throw new r(400,"invalid_request","activity requires last_ms, sampled_ms and files");return await S(async d=>X(d,n,{...typeof i.pgid=="number"?{pgid:i.pgid}:{},...typeof i.pgid_identity=="string"?{pgidIdentity:i.pgid_identity}:{},...typeof i.exit_code=="number"?{exitCode:i.exit_code}:{},...i.vanished===!0?{vanished:!0}:{},...a===void 0?{}:{activity:{lastActivityMs:a.last_ms,sampledAtMs:a.sampled_ms,files:a.files}}})),{status:204}}w(se,"handleReport");async function ue(o){const{nodeId:e,jobId:n}=await y(o),i=await de(e,n),u=o.body,t=u?.deadline_at_ms,a=u?.keep===!0;if(u?.quiet_ok!==!0&&!a&&!Number.isFinite(t))throw new r(400,"invalid_request","patch requires quiet_ok, keep or deadline_at_ms");if(a&&t!==void 0)throw new r(400,"invalid_request","keep and deadline_at_ms are exclusive");return await S(async d=>{u?.quiet_ok===!0&&await Y(d,i),a?await E(d,i,null):Number.isFinite(t)&&await E(d,i,t)}),{status:204}}w(ue,"handlePatch");const Pe=[{method:"POST",pattern:"/v1/nodes/:id/jobs/:jobId/background",handler:ae},{method:"POST",pattern:"/v1/nodes/:id/jobs/:jobId/report",handler:se},{method:"PATCH",pattern:"/v1/nodes/:id/jobs/:jobId",handler:ue},{method:"POST",pattern:"/v1/nodes/:id/jobs/start",handler:ne},{method:"GET",pattern:"/v1/nodes/:id/jobs",handler:ie},{method:"DELETE",pattern:"/v1/nodes/:id/jobs/:jobId",handler:re}];export{Pe as bashJobRoutes};
1
+ var M=Object.defineProperty;var m=(o,t)=>M(o,"name",{value:t,configurable:!0});import{killBashJobObject as C,recordBashJobObject as D}from"../../../core/spaces/stop.js";import{readerFor as L}from"../reader.js";import{join as H}from"node:path";import{createFileBeneath as $,existsBeneath as k,unlinkBeneath as U}from"../../../core/spaces/open-beneath.js";import{launchAppProcess as x,appProcessSandboxed as z}from"../../../core/spaces/process.js";import{BASH_JOB_SUPERVISOR_SCRIPT as G}from"../../../core/bash-job-supervisor.js";import{resolveAdmittedHostCommand as X}from"../../../core/runtime/spawn-env.js";import{requireCurrentExecution as q}from"./broker-recovery.js";import{isSafeNodeId as K}from"../../../core/canvas/paths.js";import{contextDir as B}from"../../../core/canvas/node-agent-paths.js";import{getNode as S}from"../../../core/canvas/canvas.js";import{isBrokerLive as Q}from"../../../core/runtime/model-swap.js";import{assertNotFinalized as W}from"../../../core/runtime/reopen.js";import{reviveNode as Y}from"../../../core/runtime/revive.js";import{checkStart as Z}from"../../../core/runtime/start-check.js";import{bashJobPaths as J,isBashJobProcessGroupAlive as V,isSafeBashJobId as N,readBashNiceness as tt,signalBashJob as et,stopBackgroundBashJob as ot}from"../../../core/bash-jobs.js";import{applyJobReport as nt,jobRow as it,ownerRunsRemotely as O,runningJobs as I,setJobDeadline as T,markJobQuietOk as rt}from"../../../core/graph/jobs.js";import{withCanvasWrite as A,openDb as _}from"../../../core/canvas/db.js";import{getById as E}from"../../../core/graph/objects.js";import{blobStore as P}from"../../../core/blobs/index.js";import{ApiError as a}from"../../../api/index.js";import{BASH_JOB_OUTPUT_DEFAULT_BYTES as at,BASH_JOB_OUTPUT_MAX_BYTES as st}from"../../../api/index.js";import{notFound as dt}from"../../../core/errors.js";import{freshChildNodeExecPath as ut}from"../../../core/runtime/branded-host.js";async function g(o){const t=o.params.id;if(t===void 0||!K(t))throw new a(400,"invalid_node_id",`invalid node id: ${JSON.stringify(t)}`);if(await S(t)===null)throw dt(`unknown node: ${t}`,{received:t});const e=o.params.jobId;if(e!==void 0){if(!N(e))throw new a(400,"invalid_job_id",`invalid background job id: ${JSON.stringify(e)}`);return{nodeId:t,jobId:e,dir:await B(t)}}return{nodeId:t,dir:await B(t)}}m(g,"requireTarget");async function pt(o){const{nodeId:t,dir:i}=await g(o);if(o.principal.class!=="broker"||o.principal.node!==t)throw new a(403,"permission_error","only this node\u2019s broker may start a job");const e=o.body;if(!e||typeof e!="object"||Array.isArray(e))throw new a(400,"invalid_request","job.start requires a JSON body");const s=e;await q(t,s.expected_execution_id);const n=s.job_id,r=s.cwd,d=s.env;if(typeof n!="string"||!N(n)||typeof r!="string"||!d||typeof d!="object"||Array.isArray(d)||Object.entries(d).some(([l,p])=>!/^[A-Za-z_][A-Za-z0-9_]*$/.test(l)||typeof p!="string"))throw new a(400,"invalid_request","invalid job id, cwd or environment");const b=await S(t);if(await Z({grantee:b.grantee??"app:terminal",sub:b.sub,grant_id:b.grant_id}),!z())throw new a(400,"invalid_request","job.start is only used with the root launcher");const u=J(i,n);if(!(k(u.root,u.jobRun)||k(u.root,u.jobBg))||![u.cmdSh,u.jobLog].every(l=>k(u.root,l)))throw new a(404,"job_not_found","job was not prepared by this node");const f=H(u.dir,"job.starting");try{$(u.root,f,"")}catch(l){throw l.code==="EEXIST"?new a(409,"job_already_started","job was already started"):l}let h;try{const l=d,p=X("bash",l,r),j=await S(t),v=await ut();return h=await x({nodeId:t,app:j.grantee??"app:terminal",isolated:j.isolated,cwd:r,env:l,capture:!1,command:[p,"-c",G,"--",u.cmdSh,u.jobLog,u.jobExit,u.jobRun,u.jobDone,p,String(tt(i)),v,u.jobActivity]}),$(u.root,u.jobPgid,String(h.pid),384),$(u.root,u.jobPgidIdentity,`launcher:${h.pid}`,384),{status:201,body:{pid:h.pid}}}catch(l){if(h!==void 0)try{await h.stop()}catch(p){throw new AggregateError([l,p],`job ${n} launched but could not be recorded or stopped`)}try{U(u.root,f)}catch(p){if(p.code!=="ENOENT")throw p}throw l}}m(pt,"handleStart");async function lt(o){const{nodeId:t}=await g(o),i=Date.now(),e=await O(await _(),t);return{status:200,body:(await I(await _(),t)).map(n=>({job_id:n.jobId,command:n.command,purpose:n.purpose,started_at:new Date(n.startedAtMs).toISOString(),elapsed_ms:Math.max(0,i-n.startedAtMs),output_key:n.outputKey,deadline_at:n.deadlineAtMs===null?null:new Date(n.deadlineAtMs).toISOString(),pgid:n.pgid,pgid_alive:!e&&n.pgid!==null&&n.pgidIdentity!==null&&V(n.pgid,n.pgidIdentity)}))}}m(lt,"handleList");function R(o,t,i){const e=o.query.get(t);if(e===null)return;const s=Number(e);if(!/^[0-9]+$/.test(e)||!Number.isSafeInteger(s)||s<1||s>i)throw new a(400,"invalid_request",`${t} must be an integer from 1 to ${i}`);return s}m(R,"boundedQueryInt");async function ct(o){const{nodeId:t,jobId:i}=await g(o),e=R(o,"tail_lines",Number.MAX_SAFE_INTEGER),s=R(o,"max_bytes",st)??at,n=await _(),r=await E(n,i??"");if(r===null||r.type!=="job"||r.owner!==t||r.deleted_at!==null)throw new a(404,"job_not_found",`no job ${String(i)} for ${t}`);const d=await it(n,r);if(d===null)throw new Error(`job object ${r.id} has no jobs row`);const b=await P(),u=await b.list(`${d.output_key}/`),w=[];let f=0,h=0,l=u.length;for(;l>0&&f<=s&&(e===void 0||h<=e+1);){const c=u[--l],y=await b.get(c);if(y===null)throw new Error(`job ${r.id} output chunk ${c} is listed but cannot be read`);w.unshift(y),f+=y.length;for(const F of y)F===10&&h++}let p=Buffer.concat(w),j=l>0;if(p.length>s){p=p.subarray(p.length-s);let c=0;for(;c<p.length&&(p[c]&192)===128;)c++;p=p.subarray(c),j=!0}let v=p.toString("utf8");if(e!==void 0){const c=v.split(`
2
+ `),y=c[c.length-1]===""?e+1:e;c.length>y&&(v=c.slice(c.length-y).join(`
3
+ `),j=!0)}return{status:200,body:{job_id:r.id,output:v,truncated:j}}}m(ct,"handleOutput");async function bt(o){const{nodeId:t,jobId:i,dir:e}=await g(o);if(i===void 0)throw new a(400,"invalid_request","a job id is required");if(o.query.get("foreground")==="1"){if(o.principal.class!=="broker"||o.principal.node!==t)throw new a(403,"permission_error","only this node\u2019s broker may abort its foreground job");await q(t,o.body?.expected_execution_id);const w=await ot(e,i,!0,t);if(w.kind==="missing")throw new a(404,"job_not_found",`no job ${i} for ${t}`);if(w.kind==="retired")throw new a(404,"job_not_found",`job ${i} for ${t} is no longer running`);if(w.kind==="not-stoppable")throw new a(409,"job_not_stoppable",`job ${i} recorded no trusted process identity`);return{status:200,body:{node_id:t,job_id:i,signaled:w.signaled}}}const n=(await I(await _(),t)).find(w=>w.jobId===i);if(n===void 0)throw new a(404,"job_not_found",`no running background job ${i} for ${t}`);const r=await O(await _(),t);if(!r&&(n.pgid===null||n.pgidIdentity===null))throw new a(409,"job_not_stoppable",`job ${i} reported no trusted process identity`);await W(t);const d=r?!0:await et(n.pgid,n.pgidIdentity,t);await C(i,async w=>{const f=await L(w,o);return f.class==="person"?f.person:f.class==="app"?f.app:f.node});const b=await S(t);if(b!==null&&!Q(b))try{await Y(t,{resume:!0,capacity:"freeze"})}catch{}return{status:200,body:{node_id:t,job_id:i,signaled:d}}}m(bt,"handleStop");async function wt(o){const{nodeId:t,jobId:i,dir:e}=await g(o);if(i===void 0)throw new a(400,"invalid_request","a job id is required");if(o.principal.class!=="broker"||o.principal.node!==t)throw new a(403,"permission_error","only this node\u2019s broker may record its job");const s=o.body,n=J(e,i),r=s?.purpose,d=s?.deadline_at_ms;if(typeof s?.command!="string"||r!=null&&typeof r!="string"||d!=null&&!Number.isFinite(d))throw new a(400,"invalid_request","job.background requires command, and optionally purpose and deadline_at_ms");if(!k(n.root,n.jobBg))throw new a(404,"job_not_found",`job ${i} of ${t} is not backgrounded`);return{status:201,body:{id:(await D(t,i,{command:s.command,purpose:r??null,deadlineAtMs:d??null})).id}}}m(wt,"handleBackground");async function ft(o,t){if(t===void 0)throw new a(400,"invalid_request","a job id is required");const i=await E(await _(),t);if(i===null||i.type!=="job"||i.owner!==o)throw new a(404,"job_not_found",`no job ${t} for ${o}`);if(!(await I(await _(),o)).some(e=>e.jobId===t))throw new a(409,"job_not_running",`job ${t} for ${o} is no longer running`);return t}m(ft,"requireRunningJob");async function mt(o){const{nodeId:t,jobId:i}=await g(o);if(o.principal.class!=="broker"||o.principal.node!==t)throw new a(403,"permission_error","only this node\u2019s broker may report its job");const e=o.body;if(!e||typeof e!="object"||Array.isArray(e))throw new a(400,"invalid_request","job.report requires a JSON body");await q(t,e.expected_execution_id);const s=await E(await _(),i??"");if(s===null||s.type!=="job"||s.owner!==t)throw new a(404,"job_not_found",`no job ${String(i)} for ${t}`);if(!(await I(await _(),t)).some(d=>d.jobId===i))throw new a(409,"job_not_running",`job ${String(i)} for ${t} is no longer running`);const n=e.output;if(n!==void 0){if(!Number.isSafeInteger(n.seq)||n.seq<0||typeof n.data_base64!="string")throw new a(400,"invalid_request","output requires seq and data_base64");const d=await A(async b=>await b.prepare("SELECT output_key FROM jobs WHERE object = ?").get(i));await(await P()).put(`${d.output_key}/${String(n.seq).padStart(8,"0")}`,Buffer.from(n.data_base64,"base64"))}const r=e.activity;if(r!==void 0&&(!Number.isFinite(r.last_ms)||!Number.isFinite(r.sampled_ms)||!Array.isArray(r.files)))throw new a(400,"invalid_request","activity requires last_ms, sampled_ms and files");return await A(async d=>nt(d,i,{...typeof e.pgid=="number"?{pgid:e.pgid}:{},...typeof e.pgid_identity=="string"?{pgidIdentity:e.pgid_identity}:{},...typeof e.exit_code=="number"?{exitCode:e.exit_code}:{},...e.vanished===!0?{vanished:!0}:{},...r===void 0?{}:{activity:{lastActivityMs:r.last_ms,sampledAtMs:r.sampled_ms,files:r.files}}})),{status:204}}m(mt,"handleReport");async function ht(o){const{nodeId:t,jobId:i}=await g(o),e=await ft(t,i),s=o.body,n=s?.deadline_at_ms,r=s?.keep===!0;if(s?.quiet_ok!==!0&&!r&&!Number.isFinite(n))throw new a(400,"invalid_request","patch requires quiet_ok, keep or deadline_at_ms");if(r&&n!==void 0)throw new a(400,"invalid_request","keep and deadline_at_ms are exclusive");return await A(async d=>{s?.quiet_ok===!0&&await rt(d,e),r?await T(d,e,null):Number.isFinite(n)&&await T(d,e,n)}),{status:204}}m(ht,"handlePatch");const xt=[{method:"POST",pattern:"/v1/nodes/:id/jobs/:jobId/background",handler:wt},{method:"POST",pattern:"/v1/nodes/:id/jobs/:jobId/report",handler:mt},{method:"PATCH",pattern:"/v1/nodes/:id/jobs/:jobId",handler:ht},{method:"POST",pattern:"/v1/nodes/:id/jobs/start",handler:pt},{method:"GET",pattern:"/v1/nodes/:id/jobs",handler:lt},{method:"GET",pattern:"/v1/nodes/:id/jobs/:jobId/output",handler:ct},{method:"DELETE",pattern:"/v1/nodes/:id/jobs/:jobId",handler:bt}];export{xt as bashJobRoutes};
@@ -1 +1 @@
1
- var o=Object.defineProperty;var t=(a,e)=>o(a,"name",{value:e,configurable:!0});import{withCanvasWrite as c}from"../../../core/canvas/db.js";import{reconcilePackages as r}from"../../../core/graph/package-reconcile.js";const m=[{method:"POST",pattern:"/v1/documents/reconcile-packages",handler:t(async()=>({status:200,body:await c(async a=>await r(a))}),"handler")}];export{m as packageDocRoutes};
1
+ var o=Object.defineProperty;var a=(e,t)=>o(e,"name",{value:t,configurable:!0});import{withCanvasWrite as d}from"../../../core/canvas/db.js";import{isCloudRole as i}from"../../../core/canvas/person-state.js";import{reconcilePackages as n}from"../../../core/graph/package-reconcile.js";const r=a(()=>({created:0,updated:0,deleted:0,conflicts:[],invalid:[],quarantined:[],kinds:{applied:[],refused:[],invalid:[]},tokens:{granted:[],revoked:[]}}),"EMPTY_REPORT"),m=[{method:"POST",pattern:"/v1/documents/reconcile-packages",handler:a(async()=>({status:200,body:i()?r():await d(async e=>await n(e))}),"handler")}];export{m as packageDocRoutes};
@@ -1 +1 @@
1
- var a=Object.defineProperty;var r=(e,s)=>a(e,"name",{value:s,configurable:!0});const n=[{name:"conversation.create",method:"POST",path:"/v1/conversations",classes:["broker"],resource:"none"},{name:"conversation.list",method:"GET",path:"/v1/conversations",classes:["broker","person"],resource:"none"},{name:"conversation.append",method:"POST",path:"/v1/conversations/:id/entries",classes:["broker"],resource:"none"},{name:"conversation.commit",method:"POST",path:"/v1/conversations/:id/commit",classes:["broker"],resource:"none"},{name:"conversation.read",method:"GET",path:"/v1/conversations/:id",classes:["broker","person"],resource:"none"},{name:"conversation.header",method:"GET",path:"/v1/conversations/:id/header",classes:["broker","person"],resource:"none"},{name:"conversation.replace",method:"PUT",path:"/v1/conversations/:id",classes:["broker"],resource:"none"},{name:"conversation.fork",method:"POST",path:"/v1/conversations/:id/fork",classes:["broker"],resource:"none"},{name:"conversation.delete",method:"DELETE",path:"/v1/conversations/:id",classes:["broker"],resource:"none"},{name:"health",method:"GET",path:"/v1/health",classes:["anonymous"],resource:"none",stage:"v0.5"},{name:"ready",method:"GET",path:"/v1/ready",classes:["anonymous"],resource:"none",stage:"v0.5"},{name:"chat-inventory.get.1",method:"GET",path:"/v1/nodes/:id/chat-inventory",classes:["person","broker","cron"],resource:"node-read"},{name:"settings.get",method:"GET",path:"/v1/settings",classes:["person","broker"],resource:"none"},{name:"settings.put",method:"PUT",path:"/v1/settings",classes:["person","broker"],resource:"none"},{name:"model-config.put.2",method:"PUT",path:"/v1/model-config",classes:["person","broker"],resource:"none"},{name:"files.get.3",method:"GET",path:"/v1/files/peek",classes:["person","broker"],resource:"none"},{name:"files.post.4",method:"POST",path:"/v1/files/write",classes:["person","broker"],resource:"none"},{name:"files.get.5",method:"GET",path:"/v1/files/list",classes:["person","broker"],resource:"none"},{name:"reviews.post.6",method:"POST",path:"/v1/human/reviews",classes:["person","broker"],resource:"human",scope:"crtr:act"},{name:"reviews.get.7",method:"GET",path:"/v1/human/reviews",classes:["person","broker"],resource:"human"},{name:"reviews.get.8",method:"GET",path:"/v1/human/reviews/:review_id",classes:["person","broker"],resource:"human"},{name:"reviews.post.9",method:"POST",path:"/v1/human/reviews/:review_id/submit",classes:["person","broker"],resource:"human"},{name:"reviews.post.10",method:"POST",path:"/v1/human/reviews/:review_id/cancel",classes:["person","broker"],resource:"human"},{name:"reviews.get.11",method:"GET",path:"/v1/human/reviews/:review_id/document",classes:["person","broker"],resource:"human"},{name:"feedback-comments.post.12",method:"POST",path:"/v1/human/inbox/:ticket_id/feedback-comments",classes:["person","broker"],resource:"human"},{name:"feedback-comments.post.13",method:"POST",path:"/v1/human/inbox/:ticket_id/feedback-comments/:comment_id/resolve",classes:["person","broker"],resource:"human"},{name:"node.log.append",method:"POST",path:"/v1/nodes/:id/records/log",classes:["person","broker"],resource:"node-own"},{name:"node.summaries.put",method:"PUT",path:"/v1/nodes/:id/records/summaries",classes:["person","broker"],resource:"node-own"},{name:"node.attachments.list",method:"GET",path:"/v1/nodes/:id/attachments",classes:["person","broker"],resource:"node-own"},{name:"node.attachments.read",method:"GET",path:"/v1/nodes/:id/attachments/:sha256",classes:["person","broker"],resource:"node-own"},{name:"node.telemetry.put",method:"PUT",path:"/v1/nodes/:id/records/telemetry",classes:["person","broker"],resource:"node-own"},{name:"node.recap.put",method:"PUT",path:"/v1/nodes/:id/records/recap",classes:["person","broker"],resource:"node-own"},{name:"node.inbox.read",method:"GET",path:"/v1/nodes/:id/records/inbox",classes:["person","broker"],resource:"node-own"},{name:"node.passive.read",method:"GET",path:"/v1/nodes/:id/records/passive",classes:["person","broker"],resource:"node-own"},{name:"node.pushed-final",method:"POST",path:"/v1/nodes/:id/records/pushed-final",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.14",method:"POST",path:"/v1/nodes/:id/broker/session-bound",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.15",method:"POST",path:"/v1/nodes/:id/broker/settle",classes:["person","broker"],resource:"node-own"},{name:"broker.idle",method:"POST",path:"/v1/nodes/:id/broker/idle",classes:["broker"],resource:"node-own"},{name:"broker-ops.post.16",method:"POST",path:"/v1/nodes/:id/broker/park-complete",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.17",method:"POST",path:"/v1/nodes/:id/broker/park-activity",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.18",method:"POST",path:"/v1/nodes/:id/broker/telemetry",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.19",method:"POST",path:"/v1/nodes/:id/broker/model",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.get.20",method:"GET",path:"/v1/nodes/:id/broker/extension-state",classes:["person","broker"],resource:"node-own"},{name:"broker.signals",method:"GET",path:"/v1/nodes/:id/broker/signals",classes:["broker"],resource:"node-own",stream:!0},{name:"nodes.broker-structured-request",method:"GET",path:"/v1/nodes/:id/broker/structured-request",classes:["person","broker"],resource:"node-own"},{name:"nodes.broker-goal",method:"POST",path:"/v1/nodes/:id/broker/goal",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.21",method:"POST",path:"/v1/nodes/:id/broker/generated-name",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.22",method:"POST",path:"/v1/nodes/:id/broker/persona-ack",classes:["person","broker"],resource:"node-own"},{name:"objects.read",method:"GET",path:"/v1/objects/:ref",classes:["person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.list",method:"GET",path:"/v1/objects",classes:["person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.search",method:"POST",path:"/v1/objects/search",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"objects.watch",method:"POST",path:"/v1/objects/:ref/watch",classes:["anonymous","person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.unwatch",method:"DELETE",path:"/v1/objects/:ref/watch",classes:["anonymous","person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.shares",method:"GET",path:"/v1/objects/:ref/shares",classes:["person","broker"],resource:"objects",stage:"objects"},{name:"objects.share",method:"POST",path:"/v1/objects/:ref/shares",classes:["person","broker"],resource:"objects",stage:"objects"},{name:"objects.unshare",method:"DELETE",path:"/v1/objects/:ref/shares",classes:["person","broker"],resource:"objects",stage:"objects"},{name:"custom-objects.register",method:"POST",path:"/v1/custom-objects",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"custom-objects.publish",method:"POST",path:"/v1/custom-objects/:ref/events",classes:["anonymous","person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"custom-objects.unregister",method:"DELETE",path:"/v1/custom-objects/:ref",classes:["anonymous","person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"custom-objects.receive",method:"GET",path:"/v1/custom-objects/:ref/deliveries",classes:["anonymous","person","app","broker","cron"],resource:"objects",stream:!0,stage:"objects"},{name:"custom-objects.ack",method:"POST",path:"/v1/custom-objects/:ref/deliveries/ack",classes:["anonymous","person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"objects.edges",method:"GET",path:"/v1/objects/:ref/edges",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.write",method:"POST",path:"/v1/docs",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.edit",method:"PATCH",path:"/v1/docs/:ref",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.move",method:"POST",path:"/v1/docs/:ref/move",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.delete",method:"DELETE",path:"/v1/docs/:ref",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.history",method:"GET",path:"/v1/docs/:ref/history",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"schemas.register",method:"POST",path:"/v1/schemas",classes:["app"],resource:"objects",stage:"objects"},{name:"relations.write",method:"POST",path:"/v1/relations",classes:["app"],resource:"objects",stage:"objects"},{name:"relations.replace",method:"PUT",path:"/v1/relations",classes:["app"],resource:"objects",stage:"objects"},{name:"relations.list",method:"GET",path:"/v1/relations",classes:["app"],resource:"objects",stage:"objects"},{name:"check",method:"POST",path:"/v1/check",classes:["app"],resource:"objects",stage:"objects"},{name:"docs.lint",method:"POST",path:"/v1/docs/lint",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"plugins.app-token",method:"GET",path:"/v1/plugins/:name/app-token",classes:["person","broker"],resource:"none"},{name:"plugins.call-headers",method:"POST",path:"/v1/plugins/:name/call-headers",classes:["person","broker"],resource:"none"},{name:"documents.browser-access",method:"GET",path:"/v1/documents/browser-access",classes:["person"],resource:"none"},{name:"documents.reconcile-packages",method:"POST",path:"/v1/documents/reconcile-packages",classes:["person","broker"],resource:"none"},{name:"nodes.delivery",method:"POST",path:"/v1/nodes/:id/delivery",classes:["person","broker"],resource:"node-own"},{name:"delivery.dry-run",method:"POST",path:"/v1/delivery/dry-run",classes:["person","broker"],resource:"none"},{name:"bash-jobs.background",method:"POST",path:"/v1/nodes/:id/jobs/:jobId/background",classes:["broker"],resource:"node-own",scope:"crtr:act"},{name:"health.get.33",method:"GET",path:"/healthz",classes:["anonymous"],resource:"none"},{name:"health.get.34",method:"GET",path:"/v1/status",classes:["person","broker"],resource:"none"},{name:"daemon.due",method:"GET",path:"/v1/due",classes:["person","broker"],resource:"none"},{name:"bash-jobs.report",method:"POST",path:"/v1/nodes/:id/jobs/:jobId/report",classes:["broker"],resource:"node-own",scope:"crtr:act"},{name:"bash-jobs.patch",method:"PATCH",path:"/v1/nodes/:id/jobs/:jobId",classes:["person","broker"],resource:"node-write"},{name:"bash-jobs.start",method:"POST",path:"/v1/nodes/:id/jobs/start",classes:["broker"],resource:"node-own",scope:"crtr:act"},{name:"hooks.plan",method:"GET",path:"/v1/nodes/:id/hooks/plan",classes:["broker"],resource:"node-own"},{name:"hooks.exec",method:"POST",path:"/v1/nodes/:id/hooks/exec",classes:["broker"],resource:"node-own"},{name:"hooks.exec.person",method:"POST",path:"/v1/hooks/exec",classes:["person","broker"],resource:"none"},{name:"bash-jobs.get.35",method:"GET",path:"/v1/nodes/:id/jobs",classes:["person","broker","cron"],resource:"node-read"},{name:"bash-jobs.delete.36",method:"DELETE",path:"/v1/nodes/:id/jobs/:jobId",classes:["person","broker"],resource:"node-write"},{name:"prospective-chat-inventory.get.37",method:"GET",path:"/v1/prospective-chat-inventory",classes:["person","broker"],resource:"none"},{name:"node-events.get.38",method:"GET",path:"/v1/nodes/:id/events",classes:["person","broker","cron"],resource:"node-read"},{name:"bash.post.39",method:"POST",path:"/v1/bash",classes:["person","broker"],resource:"daemon-bash",scope:"crtr:act"},{name:"subscriptions.post.40",method:"POST",path:"/v1/nodes/:id/subscriptions",classes:["person","broker"],resource:"node-write"},{name:"subscriptions.delete.41",method:"DELETE",path:"/v1/nodes/:id/subscriptions/:target",classes:["person","broker"],resource:"node-write"},{name:"attach.post.42",method:"POST",path:"/v1/nodes/:id/attach",classes:["person","broker"],resource:"node-write"},{name:"review-comments.post.44",method:"POST",path:"/v1/human/reviews/self/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.get.45",method:"GET",path:"/v1/human/reviews/self/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.post.46",method:"POST",path:"/v1/human/reviews/:review_id/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.get.47",method:"GET",path:"/v1/human/reviews/:review_id/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.get.48",method:"GET",path:"/v1/human/reviews/:review_id/comment-events",classes:["person","broker"],resource:"human"},{name:"review-comments.post.49",method:"POST",path:"/v1/human/reviews/:review_id/comment-ranges",classes:["person","broker"],resource:"human"},{name:"review-comments.get.50",method:"GET",path:"/v1/human/comments/:comment_id",classes:["person","broker"],resource:"human"},{name:"review-comments.post.51",method:"POST",path:"/v1/human/comments/:comment_id/edit",classes:["person","broker"],resource:"human"},{name:"review-comments.post.52",method:"POST",path:"/v1/human/comments/:comment_id/resolve",classes:["person","broker"],resource:"human"},{name:"review-comments.post.53",method:"POST",path:"/v1/human/comments/:comment_id/reopen",classes:["person","broker"],resource:"human"},{name:"review-comments.post.54",method:"POST",path:"/v1/human/comments/:comment_id/delete",classes:["person","broker"],resource:"human"},{name:"review-comments.post.55",method:"POST",path:"/v1/human/comments/:comment_id/fork",classes:["person","broker"],resource:"human"},{name:"messages.post.56",method:"POST",path:"/v1/nodes/:id/mail/claim",classes:["person","broker"],resource:"node-own"},{name:"messages.post.57",method:"POST",path:"/v1/nodes/:id/mail/acknowledge",classes:["person","broker"],resource:"node-own"},{name:"messages.post.58",method:"POST",path:"/v1/nodes/:id/messages",classes:["person","broker","cron","forwarded"],resource:"node-write"},{name:"messages.post.59",method:"POST",path:"/v1/nodes/:id/interrupt",classes:["person","broker","cron","forwarded"],resource:"node-write"},{name:"reports.post.60",method:"POST",path:"/v1/nodes/:id/reports",classes:["person","broker"],resource:"node-own"},{name:"reports.get.61",method:"GET",path:"/v1/nodes/:id/reports",classes:["person","broker","cron"],resource:"node-read"},{name:"reports.post.62",method:"POST",path:"/v1/nodes/:id/result",classes:["person","broker"],resource:"node-own"},{name:"inbox.get.63",method:"GET",path:"/v1/human/inbox",classes:["person","broker"],resource:"human"},{name:"inbox.get.64",method:"GET",path:"/v1/human/inbox/history",classes:["person","broker"],resource:"human"},{name:"inbox.get.65",method:"GET",path:"/v1/human/inbox/:ticket_id",classes:["person","broker"],resource:"human"},{name:"inbox.get.66",method:"GET",path:"/v1/human/inbox/:ticket_id/response",classes:["person","broker"],resource:"human"},{name:"inbox.post.67",method:"POST",path:"/v1/human/inbox/:ticket_id/respond",classes:["person","broker"],resource:"human"},{name:"inbox.post.68",method:"POST",path:"/v1/human/inbox/:ticket_id/progress",classes:["person","broker"],resource:"human"},{name:"inbox.post.69",method:"POST",path:"/v1/human/inbox/:ticket_id/cancel",classes:["person","broker"],resource:"human"},{name:"worktree.post.70",method:"POST",path:"/v1/nodes/:id/worktree/close",classes:["person","broker"],resource:"node-write"},{name:"worktree.post.71",method:"POST",path:"/v1/nodes/:id/worktree/abandon",classes:["person","broker"],resource:"node-write"},{name:"worktree.get.72",method:"GET",path:"/v1/worktrees/quarantined",classes:["person","broker"],resource:"none"},{name:"crons.post.73",method:"POST",path:"/v1/crons",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.get.74",method:"GET",path:"/v1/crons",classes:["person","app","broker","cron"],resource:"cron"},{name:"crons.get.75",method:"GET",path:"/v1/crons/:cronId",classes:["person","app","broker","cron"],resource:"cron"},{name:"crons.post.76",method:"POST",path:"/v1/crons/:cronId/pause",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.post.77",method:"POST",path:"/v1/crons/:cronId/resume",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.post.78",method:"POST",path:"/v1/crons/poke",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.post.79",method:"POST",path:"/v1/crons/:cronId/run",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.delete.80",method:"DELETE",path:"/v1/crons/:cronId",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"modelauth.get.81",method:"GET",path:"/v1/model-auth",classes:["person","broker"],resource:"none"},{name:"modelauth.get.82",method:"GET",path:"/v1/model-auth/readiness",classes:["person","broker"],resource:"none"},{name:"modelauth.put.83",method:"PUT",path:"/v1/model-auth/:provider",classes:["person","broker"],resource:"none"},{name:"modelauth.delete.84",method:"DELETE",path:"/v1/model-auth/:provider",classes:["person","broker"],resource:"none"},{name:"modelauth.delete.account",method:"DELETE",path:"/v1/model-auth/:provider/accounts/:label",classes:["person","broker"],resource:"none"},{name:"modelauth.patch.account",method:"PATCH",path:"/v1/model-auth/:provider/accounts/:label",classes:["person","broker"],resource:"none"},{name:"model_auth.start",method:"POST",path:"/v1/model-auth/flows",classes:["person","broker"],resource:"none"},{name:"model_auth.complete",method:"POST",path:"/v1/model-auth/flows/:flow_id/complete",classes:["person","broker"],resource:"none"},{name:"model_auth.cancel",method:"POST",path:"/v1/model-auth/flows/:flow_id/cancel",classes:["person","broker"],resource:"none"},{name:"model_auth.get",method:"GET",path:"/v1/model-auth/flows/:flow_id",classes:["person","broker"],resource:"none"},{name:"nodes.post.85",method:"POST",path:"/v1/nodes",classes:["person","broker","cron"],resource:"node-own",scope:"crtr:act"},{name:"nodes.get.86",method:"GET",path:"/v1/nodes",classes:["person","broker"],resource:"nodes-list"},{name:"nodes.post.87",method:"POST",path:"/v1/nodes/revive-all",classes:["person","broker"],resource:"none"},{name:"nodes.get.88",method:"GET",path:"/v1/nodes/:id",classes:["person","broker","cron","forwarded"],resource:"node-read"},{name:"nodes.get.89",method:"GET",path:"/v1/nodes/:id/snapshot",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.90",method:"GET",path:"/v1/nodes/:id/subject",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.91",method:"GET",path:"/v1/nodes/:id/messages",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.92",method:"GET",path:"/v1/nodes/:id/session",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.93",method:"GET",path:"/v1/nodes/:id/transcript",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.94",method:"GET",path:"/v1/nodes/:id/context",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.post.96",method:"POST",path:"/v1/nodes/:id/fork",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.97",method:"POST",path:"/v1/nodes/:id/revive",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.98",method:"POST",path:"/v1/nodes/:id/relaunch-root",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.99",method:"POST",path:"/v1/nodes/:id/close",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.read",method:"POST",path:"/v1/nodes/:id/read",classes:["person"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.100",method:"POST",path:"/v1/nodes/:id/recycle",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.101",method:"POST",path:"/v1/nodes/:id/demote",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.102",method:"POST",path:"/v1/nodes/:id/promote",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.103",method:"POST",path:"/v1/nodes/:id/yield",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.104",method:"POST",path:"/v1/nodes/:id/wait",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.patch.105",method:"PATCH",path:"/v1/nodes/:id/config",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"broker-recovery.post.106",method:"POST",path:"/v1/broker/:id/turn",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.post.107",method:"POST",path:"/v1/broker/:id/provider-retry",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.post.108",method:"POST",path:"/v1/broker/:id/fault",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.get.109",method:"GET",path:"/v1/broker/:id/recovery",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.post.110",method:"POST",path:"/v1/nodes/:id/fault",classes:["person","broker"],resource:"node-write"},{name:"broker-recovery.delete.111",method:"DELETE",path:"/v1/nodes/:id/fault",classes:["person","broker"],resource:"node-write"},{name:"profiles.put.112",method:"PUT",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"profiles.post.113",method:"POST",path:"/v1/profiles/:name/pause",classes:["person","broker"],resource:"profile"},{name:"profiles.post.114",method:"POST",path:"/v1/profiles/:name/resume",classes:["person","broker"],resource:"profile"},{name:"profiles.patch.115",method:"PATCH",path:"/v1/profiles/:name/metadata",classes:["person","app","broker"],resource:"profile"},{name:"profile.create",method:"POST",path:"/v1/profiles",classes:["person","app","broker"],resource:"profile"},{name:"profile.update",method:"PATCH",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"app.env.list",method:"GET",path:"/v1/apps/self/env",classes:["person","app","broker"],resource:"profile"},{name:"app.env.set",method:"PUT",path:"/v1/apps/self/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"app.env.remove",method:"DELETE",path:"/v1/apps/self/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"profile.env.list",method:"GET",path:"/v1/profiles/:name/env",classes:["person","app","broker"],resource:"profile"},{name:"profile.env.set",method:"PUT",path:"/v1/profiles/:name/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"profile.env.remove",method:"DELETE",path:"/v1/profiles/:name/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"profiles.delete.116",method:"DELETE",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"profile.list",method:"GET",path:"/v1/profiles",classes:["person","app","broker"],resource:"profile",stage:"chat"},{name:"profiles.get.118",method:"GET",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"import.start",method:"POST",path:"/v1/imports",classes:["person","import"],resource:"none"},{name:"import.upload-urls",method:"POST",path:"/v1/imports/:run_id/upload-urls",classes:["person","import"],resource:"none"},{name:"import.store",method:"PUT",path:"/v1/imports/:run_id/stores/:name",classes:["person","import"],resource:"none"},{name:"import.load",method:"POST",path:"/v1/imports/:run_id/load",classes:["person","import"],resource:"none"},{name:"import.get",method:"GET",path:"/v1/imports/:run_id",classes:["person","import"],resource:"none"},{name:"import.rollback",method:"POST",path:"/v1/imports/:run_id/rollback",classes:["person"],resource:"none"},{name:"import.machine-credential",method:"POST",path:"/v1/imports/:run_id/machine-credential",classes:["person"],resource:"none"},{name:"execution.import-unpacked",method:"POST",path:"/v1/executions/:execution_id/import-unpacked",classes:["broker"],resource:"none"},{name:"execution.start",method:"GET",path:"/v1/executions/:execution_id/start",classes:["broker"],resource:"none"},{name:"environment.git-credential",method:"POST",path:"/v1/environments/:environment_id/git-credential",classes:["broker"],resource:"none"},{name:"node-outcomes.get.119",method:"GET",path:"/v1/nodes/:id/outcome",classes:["person","broker","cron"],resource:"node-read"},{name:"node-outcomes.put.120",method:"PUT",path:"/v1/nodes/:id/outcome-delivery",classes:["person","broker"],resource:"node-write"},{name:"node-outcomes.get.121",method:"GET",path:"/v1/nodes/:id/outcome-delivery",classes:["person","broker","cron"],resource:"node-read"},{name:"node-outcomes.delete.122",method:"DELETE",path:"/v1/nodes/:id/outcome-delivery",classes:["person","broker"],resource:"node-write"},{name:"canvas.get.123",method:"GET",path:"/v1/canvas/attention",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.124",method:"POST",path:"/v1/canvas/attention/counts",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.125",method:"POST",path:"/v1/canvas/history/search",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.126",method:"POST",path:"/v1/canvas/history/grep",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.get.127",method:"GET",path:"/v1/canvas/history/read",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.128",method:"POST",path:"/v1/canvas/history/stats",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.get.129",method:"GET",path:"/v1/canvas/snapshot",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.get.130",method:"GET",path:"/v1/canvas/roster",classes:["person","broker"],resource:"canvas-read"},{name:"canvas.get.live-roots",method:"GET",path:"/v1/canvas/live-roots",classes:["person"],resource:"canvas-read"},{name:"canvas.get.browse",method:"GET",path:"/v1/canvas/browse",classes:["person","broker"],resource:"canvas-read"},{name:"canvas.get.analytics",method:"GET",path:"/v1/canvas/analytics",classes:["person","broker"],resource:"canvas-read"},{name:"memory-reads.post",method:"POST",path:"/v1/nodes/:id/memory-reads",classes:["person","broker"],resource:"node-own"},{name:"canvas.get.131",method:"GET",path:"/v1/canvas/graph",classes:["person","broker"],resource:"canvas-read"},{name:"canvas.post.132",method:"POST",path:"/v1/canvas/prune",classes:["person","broker"],resource:"none"},{name:"daemon.post.133",method:"POST",path:"/v1/daemon/restart",classes:["person","broker"],resource:"daemon-control"},{name:"daemon.post.134",method:"POST",path:"/v1/daemon/migrate",classes:["person","broker"],resource:"daemon-control"},{name:"daemon.drain.start",method:"POST",path:"/v1/daemon/drain",classes:["person"],resource:"daemon-control"},{name:"daemon.drain.end",method:"DELETE",path:"/v1/daemon/drain",classes:["person"],resource:"daemon-control"},{name:"daemon.post.135",method:"POST",path:"/v1/daemon/admit",classes:["person","broker"],resource:"daemon-control"},{name:"human.components.list",method:"GET",path:"/v1/human/components",classes:["person","broker"],resource:"none"},{name:"human-requests.post.136",method:"POST",path:"/v1/human/requests",classes:["person","broker"],resource:"human",scope:"crtr:act"},{name:"human-requests.get.137",method:"GET",path:"/v1/human/requests/:request_id",classes:["person","broker"],resource:"human"},{name:"human-requests.post.138",method:"POST",path:"/v1/human/requests/:request_id/replace",classes:["person","broker"],resource:"human"},{name:"human-requests.post.139",method:"POST",path:"/v1/human/requests/:request_id/respond",classes:["person","broker"],resource:"human"},{name:"human-requests.post.140",method:"POST",path:"/v1/human/requests/:request_id/dismiss",classes:["person","broker"],resource:"human"},{name:"human-requests.post.141",method:"POST",path:"/v1/human/requests/:request_id/cancel",classes:["person","broker"],resource:"human"},{name:"focus.get.142",method:"GET",path:"/v1/focuses",classes:["person","broker"],resource:"none"},{name:"focus.post.143",method:"POST",path:"/v1/focuses",classes:["person","broker"],resource:"none"},{name:"focus.get.144",method:"GET",path:"/v1/focuses/by-node",classes:["person","broker"],resource:"none"},{name:"focus.get.145",method:"GET",path:"/v1/focuses/by-pane",classes:["person","broker"],resource:"none"},{name:"focus.patch.146",method:"PATCH",path:"/v1/focuses/:focus_id",classes:["person","broker"],resource:"none"},{name:"focus.delete.147",method:"DELETE",path:"/v1/focuses/:focus_id",classes:["person","broker"],resource:"none"},{name:"delivery.retry",method:"POST",path:"/v1/deliveries/:delivery_id/retry",classes:["person","broker"],resource:"none"},{name:"limits.show",method:"GET",path:"/v1/limits",classes:["person"],resource:"none"},{name:"limits.set",method:"PUT",path:"/v1/limits/apps/:app",classes:["person"],resource:"none"},{name:"limits.remove",method:"DELETE",path:"/v1/limits/apps/:app",classes:["person"],resource:"none"},{name:"charges.list",method:"GET",path:"/v1/charges",classes:["person","app","broker"],resource:"none",stage:"objects"},{name:"spend_limits.list",method:"GET",path:"/v1/spend-limits",classes:["person"],resource:"none"},{name:"spend_limits.set",method:"PUT",path:"/v1/spend-limits/:id",classes:["person"],resource:"none"},{name:"spend_limits.remove",method:"DELETE",path:"/v1/spend-limits/:id",classes:["person"],resource:"none"},{name:"space.list",method:"GET",path:"/v1/spaces",classes:["person","broker"],resource:"none"},{name:"kinds.list",method:"GET",path:"/v1/kinds",classes:["person","app","broker"],resource:"none"},{name:"grant.get",method:"GET",path:"/v1/grant",classes:["app"],resource:"none",stage:"v0.5"},{name:"exec",method:"POST",path:"/v1/exec",classes:["app"],scope:"crtr:act",resource:"none",stage:"v0.5"},{name:"usage.get",method:"GET",path:"/v1/usage",classes:["person","app","broker"],resource:"none",stage:"v1"},{name:"llm",method:"POST",path:"/v1/llm",classes:["app","person","broker"],scope:"crtr:llm",resource:"none",stage:"v1"},{name:"structured-request.create",method:"POST",path:"/v1/structured-requests",classes:["person","app","broker"],scope:"crtr:act",resource:"none"},{name:"structured-request.get",method:"GET",path:"/v1/structured-requests/:request_id",classes:["person","app","broker"],resource:"none"},{name:"structured-request.cancel",method:"POST",path:"/v1/structured-requests/:request_id/cancel",classes:["person","app","broker"],scope:"crtr:act",resource:"none"},{name:"run.start",method:"POST",path:"/v1/runs",classes:["app"],scope:"crtr:act",resource:"none",stage:"v0.5",idempotency:"24h"},{name:"run.list",method:"GET",path:"/v1/runs",classes:["app","person","broker","cron"],resource:"run",stage:"v0.5"},{name:"run.get",method:"GET",path:"/v1/runs/:run_id",classes:["app","person","broker","cron"],resource:"run",stage:"v0.5"},{name:"run.message",method:"POST",path:"/v1/runs/:run_id/messages",classes:["app","person","broker","cron"],scope:"crtr:act",resource:"run",stage:"v0.5",idempotency:"24h"},{name:"run.events",method:"GET",path:"/v1/runs/:run_id/events",classes:["app","person","broker","cron"],resource:"run",stage:"v0.5",stream:!0},{name:"run.interrupt",method:"POST",path:"/v1/runs/:run_id/interrupt",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"run.cancel",method:"POST",path:"/v1/runs/:run_id/cancel",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"run.delete",method:"DELETE",path:"/v1/runs/:run_id",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"run.rename",method:"POST",path:"/v1/runs/:run_id/rename",classes:["app"],resource:"run",stage:"chat"},{name:"question.get",method:"GET",path:"/v1/questions/:question_id",classes:["app"],resource:"none",stage:"chat"},{name:"question.answer",method:"POST",path:"/v1/questions/:question_id/answer",classes:["app"],resource:"none",stage:"chat"},{name:"question.cancel",method:"POST",path:"/v1/questions/:question_id/cancel",classes:["app"],resource:"none",stage:"chat"},{name:"trace.get",method:"GET",path:"/v1/runs/:run_id/trace",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"upload.create",method:"POST",path:"/v1/uploads",classes:["app"],scope:"crtr:act",resource:"none",stage:"file-transfer"},{name:"attachment.link",method:"GET",path:"/v1/attachments/link",classes:["app"],resource:"none",stage:"file-transfer"},{name:"file.download",method:"GET",path:"/v1/files/download",classes:["app"],resource:"none",stage:"file-transfer",stream:"bytes"},{name:"share.create",method:"POST",path:"/v1/shares",classes:["app"],resource:"none",stage:"file-transfer"},{name:"share.list",method:"GET",path:"/v1/shares",classes:["app"],resource:"none",stage:"file-transfer"},{name:"share.delete",method:"DELETE",path:"/v1/shares/:share_id",classes:["app"],resource:"none",stage:"file-transfer"},{name:"memory.list",method:"GET",path:"/v1/memory",classes:["person","app","broker"],resource:"none",stage:"m13"},{name:"memory.get",method:"GET",path:"/v1/memory/document",classes:["person","app","broker"],resource:"none",stage:"m13"},{name:"audit.list",method:"GET",path:"/v1/audit",classes:["person","app"],resource:"none",stage:"v1"},{name:"provider.tools",method:"GET",path:"/v1/providers/tools",classes:["person","app","broker","cron"],resource:"none",stage:"v1"},{name:"provider.tools",method:"GET",path:"/v1/providers/:provider/tools",classes:["person","app","broker","cron"],resource:"none",stage:"v1"},{name:"provider.call",method:"POST",path:"/v1/provider/call",classes:["person","app","broker","cron"],resource:"none",stage:"v1"},{name:"peer.events",method:"POST",path:"/v1/peer/events",classes:["machine"],resource:"none"},{name:"peer.outbox.claim",method:"POST",path:"/v1/peer/outbox/claim",classes:["machine"],resource:"none"},{name:"peer.outbox.ack",method:"POST",path:"/v1/peer/outbox/ack",classes:["machine"],resource:"none"},{name:"peer.locate",method:"POST",path:"/v1/peer/locate",classes:["machine"],resource:"none"},{name:"runtime.sync-notice",method:"POST",path:"/v1/runtime/sync-notice",classes:["directory"],resource:"none",stage:"v1"},{name:"runtime.vendor-status",method:"GET",path:"/v1/runtime/vendor-status",classes:["directory"],resource:"none",stage:"v1"},{name:"runtime.vendor-account-remove",method:"POST",path:"/v1/runtime/vendor-account-remove",classes:["directory"],resource:"none",stage:"v1"}];function c(e,s){return n.find(o=>o.method===e.toUpperCase()&&o.path===s)}r(c,"operationFor");export{n as OPERATIONS,c as operationFor};
1
+ var a=Object.defineProperty;var r=(e,s)=>a(e,"name",{value:s,configurable:!0});const n=[{name:"conversation.create",method:"POST",path:"/v1/conversations",classes:["broker"],resource:"none"},{name:"conversation.list",method:"GET",path:"/v1/conversations",classes:["broker","person"],resource:"none"},{name:"conversation.append",method:"POST",path:"/v1/conversations/:id/entries",classes:["broker"],resource:"none"},{name:"conversation.commit",method:"POST",path:"/v1/conversations/:id/commit",classes:["broker"],resource:"none"},{name:"conversation.read",method:"GET",path:"/v1/conversations/:id",classes:["broker","person"],resource:"none"},{name:"conversation.header",method:"GET",path:"/v1/conversations/:id/header",classes:["broker","person"],resource:"none"},{name:"conversation.replace",method:"PUT",path:"/v1/conversations/:id",classes:["broker"],resource:"none"},{name:"conversation.fork",method:"POST",path:"/v1/conversations/:id/fork",classes:["broker"],resource:"none"},{name:"conversation.delete",method:"DELETE",path:"/v1/conversations/:id",classes:["broker"],resource:"none"},{name:"health",method:"GET",path:"/v1/health",classes:["anonymous"],resource:"none",stage:"v0.5"},{name:"ready",method:"GET",path:"/v1/ready",classes:["anonymous"],resource:"none",stage:"v0.5"},{name:"chat-inventory.get.1",method:"GET",path:"/v1/nodes/:id/chat-inventory",classes:["person","broker","cron"],resource:"node-read"},{name:"settings.get",method:"GET",path:"/v1/settings",classes:["person","broker"],resource:"none"},{name:"settings.put",method:"PUT",path:"/v1/settings",classes:["person","broker"],resource:"none"},{name:"model-config.put.2",method:"PUT",path:"/v1/model-config",classes:["person","broker"],resource:"none"},{name:"files.get.3",method:"GET",path:"/v1/files/peek",classes:["person","broker"],resource:"none"},{name:"files.post.4",method:"POST",path:"/v1/files/write",classes:["person","broker"],resource:"none"},{name:"files.get.5",method:"GET",path:"/v1/files/list",classes:["person","broker"],resource:"none"},{name:"reviews.post.6",method:"POST",path:"/v1/human/reviews",classes:["person","broker"],resource:"human",scope:"crtr:act"},{name:"reviews.get.7",method:"GET",path:"/v1/human/reviews",classes:["person","broker"],resource:"human"},{name:"reviews.get.8",method:"GET",path:"/v1/human/reviews/:review_id",classes:["person","broker"],resource:"human"},{name:"reviews.post.9",method:"POST",path:"/v1/human/reviews/:review_id/submit",classes:["person","broker"],resource:"human"},{name:"reviews.post.10",method:"POST",path:"/v1/human/reviews/:review_id/cancel",classes:["person","broker"],resource:"human"},{name:"reviews.get.11",method:"GET",path:"/v1/human/reviews/:review_id/document",classes:["person","broker"],resource:"human"},{name:"feedback-comments.post.12",method:"POST",path:"/v1/human/inbox/:ticket_id/feedback-comments",classes:["person","broker"],resource:"human"},{name:"feedback-comments.post.13",method:"POST",path:"/v1/human/inbox/:ticket_id/feedback-comments/:comment_id/resolve",classes:["person","broker"],resource:"human"},{name:"node.log.append",method:"POST",path:"/v1/nodes/:id/records/log",classes:["person","broker"],resource:"node-own"},{name:"node.summaries.put",method:"PUT",path:"/v1/nodes/:id/records/summaries",classes:["person","broker"],resource:"node-own"},{name:"node.attachments.list",method:"GET",path:"/v1/nodes/:id/attachments",classes:["person","broker"],resource:"node-own"},{name:"node.attachments.read",method:"GET",path:"/v1/nodes/:id/attachments/:sha256",classes:["person","broker"],resource:"node-own"},{name:"node.telemetry.put",method:"PUT",path:"/v1/nodes/:id/records/telemetry",classes:["person","broker"],resource:"node-own"},{name:"node.recap.put",method:"PUT",path:"/v1/nodes/:id/records/recap",classes:["person","broker"],resource:"node-own"},{name:"node.inbox.read",method:"GET",path:"/v1/nodes/:id/records/inbox",classes:["person","broker"],resource:"node-own"},{name:"node.passive.read",method:"GET",path:"/v1/nodes/:id/records/passive",classes:["person","broker"],resource:"node-own"},{name:"node.pushed-final",method:"POST",path:"/v1/nodes/:id/records/pushed-final",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.14",method:"POST",path:"/v1/nodes/:id/broker/session-bound",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.15",method:"POST",path:"/v1/nodes/:id/broker/settle",classes:["person","broker"],resource:"node-own"},{name:"broker.idle",method:"POST",path:"/v1/nodes/:id/broker/idle",classes:["broker"],resource:"node-own"},{name:"broker-ops.post.16",method:"POST",path:"/v1/nodes/:id/broker/park-complete",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.17",method:"POST",path:"/v1/nodes/:id/broker/park-activity",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.18",method:"POST",path:"/v1/nodes/:id/broker/telemetry",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.19",method:"POST",path:"/v1/nodes/:id/broker/model",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.get.20",method:"GET",path:"/v1/nodes/:id/broker/extension-state",classes:["person","broker"],resource:"node-own"},{name:"broker.signals",method:"GET",path:"/v1/nodes/:id/broker/signals",classes:["broker"],resource:"node-own",stream:!0},{name:"nodes.broker-structured-request",method:"GET",path:"/v1/nodes/:id/broker/structured-request",classes:["person","broker"],resource:"node-own"},{name:"nodes.broker-goal",method:"POST",path:"/v1/nodes/:id/broker/goal",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.21",method:"POST",path:"/v1/nodes/:id/broker/generated-name",classes:["person","broker"],resource:"node-own"},{name:"broker-ops.post.22",method:"POST",path:"/v1/nodes/:id/broker/persona-ack",classes:["person","broker"],resource:"node-own"},{name:"objects.read",method:"GET",path:"/v1/objects/:ref",classes:["person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.list",method:"GET",path:"/v1/objects",classes:["person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.search",method:"POST",path:"/v1/objects/search",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"objects.watch",method:"POST",path:"/v1/objects/:ref/watch",classes:["anonymous","person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.unwatch",method:"DELETE",path:"/v1/objects/:ref/watch",classes:["anonymous","person","app","broker","cron","forwarded"],resource:"objects",stage:"objects"},{name:"objects.shares",method:"GET",path:"/v1/objects/:ref/shares",classes:["person","broker"],resource:"objects",stage:"objects"},{name:"objects.share",method:"POST",path:"/v1/objects/:ref/shares",classes:["person","broker"],resource:"objects",stage:"objects"},{name:"objects.unshare",method:"DELETE",path:"/v1/objects/:ref/shares",classes:["person","broker"],resource:"objects",stage:"objects"},{name:"custom-objects.register",method:"POST",path:"/v1/custom-objects",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"custom-objects.publish",method:"POST",path:"/v1/custom-objects/:ref/events",classes:["anonymous","person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"custom-objects.unregister",method:"DELETE",path:"/v1/custom-objects/:ref",classes:["anonymous","person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"custom-objects.receive",method:"GET",path:"/v1/custom-objects/:ref/deliveries",classes:["anonymous","person","app","broker","cron"],resource:"objects",stream:!0,stage:"objects"},{name:"custom-objects.ack",method:"POST",path:"/v1/custom-objects/:ref/deliveries/ack",classes:["anonymous","person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"objects.edges",method:"GET",path:"/v1/objects/:ref/edges",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.write",method:"POST",path:"/v1/docs",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.edit",method:"PATCH",path:"/v1/docs/:ref",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.move",method:"POST",path:"/v1/docs/:ref/move",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.delete",method:"DELETE",path:"/v1/docs/:ref",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"docs.history",method:"GET",path:"/v1/docs/:ref/history",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"schemas.register",method:"POST",path:"/v1/schemas",classes:["app"],resource:"objects",stage:"objects"},{name:"relations.write",method:"POST",path:"/v1/relations",classes:["app"],resource:"objects",stage:"objects"},{name:"relations.replace",method:"PUT",path:"/v1/relations",classes:["app"],resource:"objects",stage:"objects"},{name:"relations.list",method:"GET",path:"/v1/relations",classes:["app"],resource:"objects",stage:"objects"},{name:"check",method:"POST",path:"/v1/check",classes:["app"],resource:"objects",stage:"objects"},{name:"docs.lint",method:"POST",path:"/v1/docs/lint",classes:["person","app","broker","cron"],resource:"objects",stage:"objects"},{name:"plugins.app-token",method:"GET",path:"/v1/plugins/:name/app-token",classes:["person","broker"],resource:"none"},{name:"plugins.call-headers",method:"POST",path:"/v1/plugins/:name/call-headers",classes:["person","broker"],resource:"none"},{name:"documents.browser-access",method:"GET",path:"/v1/documents/browser-access",classes:["person"],resource:"none"},{name:"documents.reconcile-packages",method:"POST",path:"/v1/documents/reconcile-packages",classes:["person","broker"],resource:"none"},{name:"nodes.delivery",method:"POST",path:"/v1/nodes/:id/delivery",classes:["person","broker"],resource:"node-own"},{name:"delivery.dry-run",method:"POST",path:"/v1/delivery/dry-run",classes:["person","broker"],resource:"none"},{name:"bash-jobs.background",method:"POST",path:"/v1/nodes/:id/jobs/:jobId/background",classes:["broker"],resource:"node-own",scope:"crtr:act"},{name:"health.get.33",method:"GET",path:"/healthz",classes:["anonymous"],resource:"none"},{name:"health.get.34",method:"GET",path:"/v1/status",classes:["person","broker"],resource:"none"},{name:"daemon.due",method:"GET",path:"/v1/due",classes:["person","broker"],resource:"none"},{name:"bash-jobs.report",method:"POST",path:"/v1/nodes/:id/jobs/:jobId/report",classes:["broker"],resource:"node-own",scope:"crtr:act"},{name:"bash-jobs.patch",method:"PATCH",path:"/v1/nodes/:id/jobs/:jobId",classes:["person","broker"],resource:"node-write"},{name:"bash-jobs.start",method:"POST",path:"/v1/nodes/:id/jobs/start",classes:["broker"],resource:"node-own",scope:"crtr:act"},{name:"hooks.plan",method:"GET",path:"/v1/nodes/:id/hooks/plan",classes:["broker"],resource:"node-own"},{name:"hooks.exec",method:"POST",path:"/v1/nodes/:id/hooks/exec",classes:["broker"],resource:"node-own"},{name:"hooks.exec.person",method:"POST",path:"/v1/hooks/exec",classes:["person","broker"],resource:"none"},{name:"bash-jobs.get.35",method:"GET",path:"/v1/nodes/:id/jobs",classes:["person","broker","cron"],resource:"node-read"},{name:"bash-jobs.output",method:"GET",path:"/v1/nodes/:id/jobs/:jobId/output",classes:["person","broker","cron"],resource:"node-read"},{name:"bash-jobs.delete.36",method:"DELETE",path:"/v1/nodes/:id/jobs/:jobId",classes:["person","broker"],resource:"node-write"},{name:"prospective-chat-inventory.get.37",method:"GET",path:"/v1/prospective-chat-inventory",classes:["person","broker"],resource:"none"},{name:"node-events.get.38",method:"GET",path:"/v1/nodes/:id/events",classes:["person","broker","cron"],resource:"node-read"},{name:"bash.post.39",method:"POST",path:"/v1/bash",classes:["person","broker"],resource:"daemon-bash",scope:"crtr:act"},{name:"subscriptions.post.40",method:"POST",path:"/v1/nodes/:id/subscriptions",classes:["person","broker"],resource:"node-write"},{name:"subscriptions.delete.41",method:"DELETE",path:"/v1/nodes/:id/subscriptions/:target",classes:["person","broker"],resource:"node-write"},{name:"attach.post.42",method:"POST",path:"/v1/nodes/:id/attach",classes:["person","broker"],resource:"node-write"},{name:"review-comments.post.44",method:"POST",path:"/v1/human/reviews/self/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.get.45",method:"GET",path:"/v1/human/reviews/self/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.post.46",method:"POST",path:"/v1/human/reviews/:review_id/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.get.47",method:"GET",path:"/v1/human/reviews/:review_id/comments",classes:["person","broker"],resource:"human"},{name:"review-comments.get.48",method:"GET",path:"/v1/human/reviews/:review_id/comment-events",classes:["person","broker"],resource:"human"},{name:"review-comments.post.49",method:"POST",path:"/v1/human/reviews/:review_id/comment-ranges",classes:["person","broker"],resource:"human"},{name:"review-comments.get.50",method:"GET",path:"/v1/human/comments/:comment_id",classes:["person","broker"],resource:"human"},{name:"review-comments.post.51",method:"POST",path:"/v1/human/comments/:comment_id/edit",classes:["person","broker"],resource:"human"},{name:"review-comments.post.52",method:"POST",path:"/v1/human/comments/:comment_id/resolve",classes:["person","broker"],resource:"human"},{name:"review-comments.post.53",method:"POST",path:"/v1/human/comments/:comment_id/reopen",classes:["person","broker"],resource:"human"},{name:"review-comments.post.54",method:"POST",path:"/v1/human/comments/:comment_id/delete",classes:["person","broker"],resource:"human"},{name:"review-comments.post.55",method:"POST",path:"/v1/human/comments/:comment_id/fork",classes:["person","broker"],resource:"human"},{name:"messages.post.56",method:"POST",path:"/v1/nodes/:id/mail/claim",classes:["person","broker"],resource:"node-own"},{name:"messages.post.57",method:"POST",path:"/v1/nodes/:id/mail/acknowledge",classes:["person","broker"],resource:"node-own"},{name:"messages.post.58",method:"POST",path:"/v1/nodes/:id/messages",classes:["person","broker","cron","forwarded"],resource:"node-write"},{name:"messages.post.59",method:"POST",path:"/v1/nodes/:id/interrupt",classes:["person","broker","cron","forwarded"],resource:"node-write"},{name:"reports.post.60",method:"POST",path:"/v1/nodes/:id/reports",classes:["person","broker"],resource:"node-own"},{name:"reports.get.61",method:"GET",path:"/v1/nodes/:id/reports",classes:["person","broker","cron"],resource:"node-read"},{name:"reports.post.62",method:"POST",path:"/v1/nodes/:id/result",classes:["person","broker"],resource:"node-own"},{name:"inbox.get.63",method:"GET",path:"/v1/human/inbox",classes:["person","broker"],resource:"human"},{name:"inbox.get.64",method:"GET",path:"/v1/human/inbox/history",classes:["person","broker"],resource:"human"},{name:"inbox.get.65",method:"GET",path:"/v1/human/inbox/:ticket_id",classes:["person","broker"],resource:"human"},{name:"inbox.get.66",method:"GET",path:"/v1/human/inbox/:ticket_id/response",classes:["person","broker"],resource:"human"},{name:"inbox.post.67",method:"POST",path:"/v1/human/inbox/:ticket_id/respond",classes:["person","broker"],resource:"human"},{name:"inbox.post.68",method:"POST",path:"/v1/human/inbox/:ticket_id/progress",classes:["person","broker"],resource:"human"},{name:"inbox.post.69",method:"POST",path:"/v1/human/inbox/:ticket_id/cancel",classes:["person","broker"],resource:"human"},{name:"worktree.post.70",method:"POST",path:"/v1/nodes/:id/worktree/close",classes:["person","broker"],resource:"node-write"},{name:"worktree.post.71",method:"POST",path:"/v1/nodes/:id/worktree/abandon",classes:["person","broker"],resource:"node-write"},{name:"worktree.get.72",method:"GET",path:"/v1/worktrees/quarantined",classes:["person","broker"],resource:"none"},{name:"crons.post.73",method:"POST",path:"/v1/crons",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.get.74",method:"GET",path:"/v1/crons",classes:["person","app","broker","cron"],resource:"cron"},{name:"crons.get.75",method:"GET",path:"/v1/crons/:cronId",classes:["person","app","broker","cron"],resource:"cron"},{name:"crons.post.76",method:"POST",path:"/v1/crons/:cronId/pause",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.post.77",method:"POST",path:"/v1/crons/:cronId/resume",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.post.78",method:"POST",path:"/v1/crons/poke",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.post.79",method:"POST",path:"/v1/crons/:cronId/run",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"crons.delete.80",method:"DELETE",path:"/v1/crons/:cronId",classes:["person","app","broker","cron"],resource:"cron",scope:"crtr:schedule"},{name:"modelauth.get.81",method:"GET",path:"/v1/model-auth",classes:["person","broker"],resource:"none"},{name:"modelauth.get.82",method:"GET",path:"/v1/model-auth/readiness",classes:["person","broker"],resource:"none"},{name:"modelauth.put.83",method:"PUT",path:"/v1/model-auth/:provider",classes:["person","broker"],resource:"none"},{name:"modelauth.delete.84",method:"DELETE",path:"/v1/model-auth/:provider",classes:["person","broker"],resource:"none"},{name:"modelauth.delete.account",method:"DELETE",path:"/v1/model-auth/:provider/accounts/:label",classes:["person","broker"],resource:"none"},{name:"modelauth.patch.account",method:"PATCH",path:"/v1/model-auth/:provider/accounts/:label",classes:["person","broker"],resource:"none"},{name:"model_auth.start",method:"POST",path:"/v1/model-auth/flows",classes:["person","broker"],resource:"none"},{name:"model_auth.complete",method:"POST",path:"/v1/model-auth/flows/:flow_id/complete",classes:["person","broker"],resource:"none"},{name:"model_auth.cancel",method:"POST",path:"/v1/model-auth/flows/:flow_id/cancel",classes:["person","broker"],resource:"none"},{name:"model_auth.get",method:"GET",path:"/v1/model-auth/flows/:flow_id",classes:["person","broker"],resource:"none"},{name:"nodes.post.85",method:"POST",path:"/v1/nodes",classes:["person","broker","cron"],resource:"node-own",scope:"crtr:act"},{name:"nodes.get.86",method:"GET",path:"/v1/nodes",classes:["person","broker"],resource:"nodes-list"},{name:"nodes.post.87",method:"POST",path:"/v1/nodes/revive-all",classes:["person","broker"],resource:"none"},{name:"nodes.get.88",method:"GET",path:"/v1/nodes/:id",classes:["person","broker","cron","forwarded"],resource:"node-read"},{name:"nodes.get.89",method:"GET",path:"/v1/nodes/:id/snapshot",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.90",method:"GET",path:"/v1/nodes/:id/subject",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.91",method:"GET",path:"/v1/nodes/:id/messages",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.92",method:"GET",path:"/v1/nodes/:id/session",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.93",method:"GET",path:"/v1/nodes/:id/transcript",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.get.94",method:"GET",path:"/v1/nodes/:id/context",classes:["person","broker","cron"],resource:"node-read"},{name:"nodes.post.96",method:"POST",path:"/v1/nodes/:id/fork",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.97",method:"POST",path:"/v1/nodes/:id/revive",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.98",method:"POST",path:"/v1/nodes/:id/relaunch-root",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.99",method:"POST",path:"/v1/nodes/:id/close",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.read",method:"POST",path:"/v1/nodes/:id/read",classes:["person"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.100",method:"POST",path:"/v1/nodes/:id/recycle",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.101",method:"POST",path:"/v1/nodes/:id/demote",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.102",method:"POST",path:"/v1/nodes/:id/promote",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.103",method:"POST",path:"/v1/nodes/:id/yield",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.post.104",method:"POST",path:"/v1/nodes/:id/wait",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"nodes.patch.105",method:"PATCH",path:"/v1/nodes/:id/config",classes:["person","broker"],resource:"node-write",scope:"crtr:act"},{name:"broker-recovery.post.106",method:"POST",path:"/v1/broker/:id/turn",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.post.107",method:"POST",path:"/v1/broker/:id/provider-retry",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.post.108",method:"POST",path:"/v1/broker/:id/fault",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.get.109",method:"GET",path:"/v1/broker/:id/recovery",classes:["person","broker"],resource:"node-own"},{name:"broker-recovery.post.110",method:"POST",path:"/v1/nodes/:id/fault",classes:["person","broker"],resource:"node-write"},{name:"broker-recovery.delete.111",method:"DELETE",path:"/v1/nodes/:id/fault",classes:["person","broker"],resource:"node-write"},{name:"profiles.put.112",method:"PUT",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"profiles.post.113",method:"POST",path:"/v1/profiles/:name/pause",classes:["person","broker"],resource:"profile"},{name:"profiles.post.114",method:"POST",path:"/v1/profiles/:name/resume",classes:["person","broker"],resource:"profile"},{name:"profiles.patch.115",method:"PATCH",path:"/v1/profiles/:name/metadata",classes:["person","app","broker"],resource:"profile"},{name:"profile.create",method:"POST",path:"/v1/profiles",classes:["person","app","broker"],resource:"profile"},{name:"profile.update",method:"PATCH",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"app.env.list",method:"GET",path:"/v1/apps/self/env",classes:["person","app","broker"],resource:"profile"},{name:"app.env.set",method:"PUT",path:"/v1/apps/self/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"app.env.remove",method:"DELETE",path:"/v1/apps/self/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"profile.env.list",method:"GET",path:"/v1/profiles/:name/env",classes:["person","app","broker"],resource:"profile"},{name:"profile.env.set",method:"PUT",path:"/v1/profiles/:name/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"profile.env.remove",method:"DELETE",path:"/v1/profiles/:name/env/:var",classes:["person","app","broker"],resource:"profile"},{name:"profiles.delete.116",method:"DELETE",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"profile.list",method:"GET",path:"/v1/profiles",classes:["person","app","broker"],resource:"profile",stage:"chat"},{name:"profiles.get.118",method:"GET",path:"/v1/profiles/:name",classes:["person","app","broker"],resource:"profile"},{name:"import.start",method:"POST",path:"/v1/imports",classes:["person","import"],resource:"none"},{name:"import.upload-urls",method:"POST",path:"/v1/imports/:run_id/upload-urls",classes:["person","import"],resource:"none"},{name:"import.store",method:"PUT",path:"/v1/imports/:run_id/stores/:name",classes:["person","import"],resource:"none"},{name:"import.load",method:"POST",path:"/v1/imports/:run_id/load",classes:["person","import"],resource:"none"},{name:"import.get",method:"GET",path:"/v1/imports/:run_id",classes:["person","import"],resource:"none"},{name:"import.rollback",method:"POST",path:"/v1/imports/:run_id/rollback",classes:["person"],resource:"none"},{name:"import.machine-credential",method:"POST",path:"/v1/imports/:run_id/machine-credential",classes:["person"],resource:"none"},{name:"execution.import-unpacked",method:"POST",path:"/v1/executions/:execution_id/import-unpacked",classes:["broker"],resource:"none"},{name:"execution.start",method:"GET",path:"/v1/executions/:execution_id/start",classes:["broker"],resource:"none"},{name:"environment.git-credential",method:"POST",path:"/v1/environments/:environment_id/git-credential",classes:["broker"],resource:"none"},{name:"node-outcomes.get.119",method:"GET",path:"/v1/nodes/:id/outcome",classes:["person","broker","cron"],resource:"node-read"},{name:"node-outcomes.put.120",method:"PUT",path:"/v1/nodes/:id/outcome-delivery",classes:["person","broker"],resource:"node-write"},{name:"node-outcomes.get.121",method:"GET",path:"/v1/nodes/:id/outcome-delivery",classes:["person","broker","cron"],resource:"node-read"},{name:"node-outcomes.delete.122",method:"DELETE",path:"/v1/nodes/:id/outcome-delivery",classes:["person","broker"],resource:"node-write"},{name:"canvas.get.123",method:"GET",path:"/v1/canvas/attention",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.124",method:"POST",path:"/v1/canvas/attention/counts",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.125",method:"POST",path:"/v1/canvas/history/search",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.126",method:"POST",path:"/v1/canvas/history/grep",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.get.127",method:"GET",path:"/v1/canvas/history/read",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.post.128",method:"POST",path:"/v1/canvas/history/stats",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.get.129",method:"GET",path:"/v1/canvas/snapshot",classes:["person","broker","forwarded"],resource:"canvas-read"},{name:"canvas.get.130",method:"GET",path:"/v1/canvas/roster",classes:["person","broker"],resource:"canvas-read"},{name:"canvas.get.live-roots",method:"GET",path:"/v1/canvas/live-roots",classes:["person"],resource:"canvas-read"},{name:"canvas.get.browse",method:"GET",path:"/v1/canvas/browse",classes:["person","broker"],resource:"canvas-read"},{name:"canvas.get.analytics",method:"GET",path:"/v1/canvas/analytics",classes:["person","broker"],resource:"canvas-read"},{name:"memory-reads.post",method:"POST",path:"/v1/nodes/:id/memory-reads",classes:["person","broker"],resource:"node-own"},{name:"canvas.get.131",method:"GET",path:"/v1/canvas/graph",classes:["person","broker"],resource:"canvas-read"},{name:"canvas.post.132",method:"POST",path:"/v1/canvas/prune",classes:["person","broker"],resource:"none"},{name:"daemon.post.133",method:"POST",path:"/v1/daemon/restart",classes:["person","broker"],resource:"daemon-control"},{name:"daemon.post.134",method:"POST",path:"/v1/daemon/migrate",classes:["person","broker"],resource:"daemon-control"},{name:"daemon.drain.start",method:"POST",path:"/v1/daemon/drain",classes:["person"],resource:"daemon-control"},{name:"daemon.drain.end",method:"DELETE",path:"/v1/daemon/drain",classes:["person"],resource:"daemon-control"},{name:"daemon.post.135",method:"POST",path:"/v1/daemon/admit",classes:["person","broker"],resource:"daemon-control"},{name:"human.components.list",method:"GET",path:"/v1/human/components",classes:["person","broker"],resource:"none"},{name:"human-requests.post.136",method:"POST",path:"/v1/human/requests",classes:["person","broker"],resource:"human",scope:"crtr:act"},{name:"human-requests.get.137",method:"GET",path:"/v1/human/requests/:request_id",classes:["person","broker"],resource:"human"},{name:"human-requests.post.138",method:"POST",path:"/v1/human/requests/:request_id/replace",classes:["person","broker"],resource:"human"},{name:"human-requests.post.139",method:"POST",path:"/v1/human/requests/:request_id/respond",classes:["person","broker"],resource:"human"},{name:"human-requests.post.140",method:"POST",path:"/v1/human/requests/:request_id/dismiss",classes:["person","broker"],resource:"human"},{name:"human-requests.post.141",method:"POST",path:"/v1/human/requests/:request_id/cancel",classes:["person","broker"],resource:"human"},{name:"focus.get.142",method:"GET",path:"/v1/focuses",classes:["person","broker"],resource:"none"},{name:"focus.post.143",method:"POST",path:"/v1/focuses",classes:["person","broker"],resource:"none"},{name:"focus.get.144",method:"GET",path:"/v1/focuses/by-node",classes:["person","broker"],resource:"none"},{name:"focus.get.145",method:"GET",path:"/v1/focuses/by-pane",classes:["person","broker"],resource:"none"},{name:"focus.patch.146",method:"PATCH",path:"/v1/focuses/:focus_id",classes:["person","broker"],resource:"none"},{name:"focus.delete.147",method:"DELETE",path:"/v1/focuses/:focus_id",classes:["person","broker"],resource:"none"},{name:"delivery.retry",method:"POST",path:"/v1/deliveries/:delivery_id/retry",classes:["person","broker"],resource:"none"},{name:"limits.show",method:"GET",path:"/v1/limits",classes:["person"],resource:"none"},{name:"limits.set",method:"PUT",path:"/v1/limits/apps/:app",classes:["person"],resource:"none"},{name:"limits.remove",method:"DELETE",path:"/v1/limits/apps/:app",classes:["person"],resource:"none"},{name:"charges.list",method:"GET",path:"/v1/charges",classes:["person","app","broker"],resource:"none",stage:"objects"},{name:"spend_limits.list",method:"GET",path:"/v1/spend-limits",classes:["person"],resource:"none"},{name:"spend_limits.set",method:"PUT",path:"/v1/spend-limits/:id",classes:["person"],resource:"none"},{name:"spend_limits.remove",method:"DELETE",path:"/v1/spend-limits/:id",classes:["person"],resource:"none"},{name:"space.list",method:"GET",path:"/v1/spaces",classes:["person","broker"],resource:"none"},{name:"kinds.list",method:"GET",path:"/v1/kinds",classes:["person","app","broker"],resource:"none"},{name:"grant.get",method:"GET",path:"/v1/grant",classes:["app"],resource:"none",stage:"v0.5"},{name:"exec",method:"POST",path:"/v1/exec",classes:["app"],scope:"crtr:act",resource:"none",stage:"v0.5"},{name:"usage.get",method:"GET",path:"/v1/usage",classes:["person","app","broker"],resource:"none",stage:"v1"},{name:"llm",method:"POST",path:"/v1/llm",classes:["app","person","broker"],scope:"crtr:llm",resource:"none",stage:"v1"},{name:"structured-request.create",method:"POST",path:"/v1/structured-requests",classes:["person","app","broker"],scope:"crtr:act",resource:"none"},{name:"structured-request.get",method:"GET",path:"/v1/structured-requests/:request_id",classes:["person","app","broker"],resource:"none"},{name:"structured-request.cancel",method:"POST",path:"/v1/structured-requests/:request_id/cancel",classes:["person","app","broker"],scope:"crtr:act",resource:"none"},{name:"run.start",method:"POST",path:"/v1/runs",classes:["app"],scope:"crtr:act",resource:"none",stage:"v0.5",idempotency:"24h"},{name:"run.list",method:"GET",path:"/v1/runs",classes:["app","person","broker","cron"],resource:"run",stage:"v0.5"},{name:"run.get",method:"GET",path:"/v1/runs/:run_id",classes:["app","person","broker","cron"],resource:"run",stage:"v0.5"},{name:"run.message",method:"POST",path:"/v1/runs/:run_id/messages",classes:["app","person","broker","cron"],scope:"crtr:act",resource:"run",stage:"v0.5",idempotency:"24h"},{name:"run.events",method:"GET",path:"/v1/runs/:run_id/events",classes:["app","person","broker","cron"],resource:"run",stage:"v0.5",stream:!0},{name:"run.interrupt",method:"POST",path:"/v1/runs/:run_id/interrupt",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"run.cancel",method:"POST",path:"/v1/runs/:run_id/cancel",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"run.delete",method:"DELETE",path:"/v1/runs/:run_id",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"run.rename",method:"POST",path:"/v1/runs/:run_id/rename",classes:["app"],resource:"run",stage:"chat"},{name:"question.get",method:"GET",path:"/v1/questions/:question_id",classes:["app"],resource:"none",stage:"chat"},{name:"question.answer",method:"POST",path:"/v1/questions/:question_id/answer",classes:["app"],resource:"none",stage:"chat"},{name:"question.cancel",method:"POST",path:"/v1/questions/:question_id/cancel",classes:["app"],resource:"none",stage:"chat"},{name:"trace.get",method:"GET",path:"/v1/runs/:run_id/trace",classes:["app","person","broker"],resource:"run",stage:"v0.5"},{name:"upload.create",method:"POST",path:"/v1/uploads",classes:["app"],scope:"crtr:act",resource:"none",stage:"file-transfer"},{name:"attachment.link",method:"GET",path:"/v1/attachments/link",classes:["app"],resource:"none",stage:"file-transfer"},{name:"file.download",method:"GET",path:"/v1/files/download",classes:["app"],resource:"none",stage:"file-transfer",stream:"bytes"},{name:"share.create",method:"POST",path:"/v1/shares",classes:["app"],resource:"none",stage:"file-transfer"},{name:"share.list",method:"GET",path:"/v1/shares",classes:["app"],resource:"none",stage:"file-transfer"},{name:"share.delete",method:"DELETE",path:"/v1/shares/:share_id",classes:["app"],resource:"none",stage:"file-transfer"},{name:"memory.list",method:"GET",path:"/v1/memory",classes:["person","app","broker"],resource:"none",stage:"m13"},{name:"memory.get",method:"GET",path:"/v1/memory/document",classes:["person","app","broker"],resource:"none",stage:"m13"},{name:"audit.list",method:"GET",path:"/v1/audit",classes:["person","app"],resource:"none",stage:"v1"},{name:"provider.tools",method:"GET",path:"/v1/providers/tools",classes:["person","app","broker","cron"],resource:"none",stage:"v1"},{name:"provider.tools",method:"GET",path:"/v1/providers/:provider/tools",classes:["person","app","broker","cron"],resource:"none",stage:"v1"},{name:"provider.call",method:"POST",path:"/v1/provider/call",classes:["person","app","broker","cron"],resource:"none",stage:"v1"},{name:"peer.events",method:"POST",path:"/v1/peer/events",classes:["machine"],resource:"none"},{name:"peer.outbox.claim",method:"POST",path:"/v1/peer/outbox/claim",classes:["machine"],resource:"none"},{name:"peer.outbox.ack",method:"POST",path:"/v1/peer/outbox/ack",classes:["machine"],resource:"none"},{name:"peer.locate",method:"POST",path:"/v1/peer/locate",classes:["machine"],resource:"none"},{name:"runtime.sync-notice",method:"POST",path:"/v1/runtime/sync-notice",classes:["directory"],resource:"none",stage:"v1"},{name:"runtime.vendor-status",method:"GET",path:"/v1/runtime/vendor-status",classes:["directory"],resource:"none",stage:"v1"},{name:"runtime.vendor-account-remove",method:"POST",path:"/v1/runtime/vendor-account-remove",classes:["directory"],resource:"none",stage:"v1"}];function c(e,s){return n.find(o=>o.method===e.toUpperCase()&&o.path===s)}r(c,"operationFor");export{n as OPERATIONS,c as operationFor};