@kontourai/station-cli 0.6.0-nightly.2464.36783703696 → 0.7.0

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 (2) hide show
  1. package/dist/station.mjs +2 -2
  2. package/package.json +8 -9
package/dist/station.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __stationCreateRequire } from 'node:module';
3
3
  const require = __stationCreateRequire(import.meta.url);
4
- globalThis.__STATION_CLI_BUNDLE__ = {"version":"0.6.0-nightly.2464.36783703696","sourceSha":"4dbf9acbcab04c4695c8ca9799bc1422526cd382","builtAt":"2026-09-30T23:00:43.462Z","channel":"nightly"};
4
+ globalThis.__STATION_CLI_BUNDLE__ = {"version":"0.7.0","sourceSha":"2468c17fc038f278799cf1b9bddc606347170750","builtAt":"2026-10-01T00:37:32.968Z","channel":"stable"};
5
5
  var ooe=Object.create;var _y=Object.defineProperty;var ioe=Object.getOwnPropertyDescriptor;var soe=Object.getOwnPropertyNames;var aoe=Object.getPrototypeOf,coe=Object.prototype.hasOwnProperty;var a=(e,t)=>_y(e,"name",{value:t,configurable:!0}),bt=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var x=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(o){throw n=[o],o}};var ve=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(n){throw t=0,n}},Br=(e,t)=>{for(var n in t)_y(e,n,{get:t[n],enumerable:!0})},loe=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of soe(t))!coe.call(e,r)&&r!==n&&_y(e,r,{get:()=>t[r],enumerable:!(o=ioe(t,r))||o.enumerable});return e};var j1=(e,t,n)=>(n=e!=null?ooe(aoe(e)):{},loe(t||!e||!e.__esModule?_y(n,"default",{value:e,enumerable:!0}):n,e));function UR(e){let t=doe[e];return!(t.length===1&&t[0]==="default-grant")}function xy(e){if(typeof e!="string"||e.length===0||e.length>256)return null;let t=new Set(ll),n=new Set;for(let o of e.split(" ")){if(!o||!t.has(o)||n.has(o))return null;n.add(o)}return[...n]}function U1(e,t){return`${uoe}
6
6
  1
7
7
  ${e}
@@ -289,7 +289,7 @@ Respond: ${c.respondCommand}`),process.exit(gg);return}}catch(c){let l=c instanc
289
289
  `)}
290
290
  `)}a(d,"repaint");function p(){c||(c=!0,r.abort(),u&&clearInterval(u),t.removeListener("keypress",I),typeof t.setRawMode=="function"&&t.isTTY&&t.setRawMode(!1),t.pause(),n.write("\x1B[?25h"),process.removeListener("SIGINT",k),process.removeListener("SIGTERM",_))}a(p,"teardown");function f(){l||(l=!0,p(),i())}a(f,"finishOk");function m(E){l||(l=!0,p(),s(E))}a(m,"finishErr");function g(E){o=LZ(o,E)}a(g,"applyAction");function h(){if(!o.focusedThreadId&&o.board.length>0){let E=o.board[0].threadId;g({type:"focus-change",threadId:E}),S(E)}}a(h,"maybeAutoFocusFirstRow");function y(E){if(c)return;g(E),h();let A=o.pendingIntent;A&&g({type:"clear-intent"}),d(),A&&w(A)}a(y,"dispatch");function v(E){try{y(E)}catch(A){m(A)}}a(v,"safeDispatch");async function b(){let E;try{E={type:"fleet-routing-snapshot",fleetRouting:{page:await UV(e.apiBase)}}}catch(A){E={type:"fleet-routing-snapshot",fleetRouting:{page:null,error:md(A)}}}try{g(E)}catch(A){m(A)}}a(b,"pullFleetRouting");async function S(E){let A=[];try{A=(await ku(e.apiBase,E)).events??[]}catch(j){(!(j instanceof Error)||j.message!=="Session not found")&&Gw(`could not seed history for session ${E}: ${md(j)}`)}try{for(let j of A)g({type:"event",event:j})}catch(j){m(j);return}let D;try{let j=await rW(e.apiBase,E);D=__e(j)}catch(j){Gw(`could not pull Flow run status for session ${E}: ${md(j)}`)}if(D!==void 0)try{g({type:"flow-run-snapshot",threadId:E,snapshot:D})}catch(j){m(j);return}let T;try{T=R_e(await oW(e.apiBase,E))}catch(j){Gw(`could not pull Builder run status for session ${E}: ${md(j)}`)}if(T!==void 0)try{g({type:"builder-run-snapshot",threadId:E,builderRun:T})}catch(j){m(j);return}await b(),c||d()}a(S,"seedFocus");async function w(E){switch(E.type){case"respond-approval":try{await hS(e.apiBase,{threadId:E.threadId,requestId:E.requestId,decision:E.decision})}catch(A){Gw(`could not resolve approval ${E.requestId} (${E.decision}): ${md(A)}`)}return;case"refresh-focus":await S(E.threadId);return;case"move-focus":o.focusedThreadId&&await S(o.focusedThreadId);return;case"move-selection":return;case"quit":f();return;default:return}}a(w,"handleIntent");function I(E,A){v({type:"keypress",key:{name:A?.name,ctrl:!!A?.ctrl,shift:!!A?.shift,sequence:A?.sequence??E??""}})}a(I,"onKeypress");function k(){f()}a(k,"onSigint");function _(){f()}a(_,"onSigterm"),d(),MZ.emitKeypressEvents(t),typeof t.setRawMode=="function"&&t.isTTY&&t.setRawMode(!0),t.on("keypress",I),t.resume(),process.on("SIGINT",k),process.on("SIGTERM",_),u=setInterval(()=>{v({type:"tick",now:Date.now()})},1e3),u.unref?.(),e.focusedThreadId&&S(e.focusedThreadId),(async()=>{try{let E=await fetch(`${e.apiBase}/api/orchestration/events`,{signal:r.signal});if(!E.ok)throw new Error(`Orchestration event stream failed with HTTP ${E.status}`);if(y({type:"connection-status",status:"connected"}),await bg({response:E,signal:r.signal,onSnapshot:a(A=>y({type:"snapshot",sessions:A}),"onSnapshot"),onFrame:a(A=>{y({type:"event",event:A})},"onFrame")}),r.signal.aborted)return;m(new Error("Orchestration event stream ended unexpectedly"))}catch(E){if(r.signal.aborted)return;y({type:"connection-status",status:"error",error:md(E)}),m(E)}})()})}a(zZ,"runOperateShell");async function qZ(e,t){if(!process.stdout.isTTY)throw new Error("station operate requires an interactive terminal (TTY); use station sessions/approvals/chat for scripting.");let n=typeof t.flags.session=="string"?t.flags.session:void 0;await zZ({apiBase:e,focusedThreadId:n})}a(qZ,"runOperateCommand");yS();import{open as E_e}from"node:fs/promises";import{resolve as P_e}from"node:path";yS();kt();FO();function Jw(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(Jw,"identityObject");function GD(e){let t="Invalid or unsupported portable Project identity.";if(!Jw(e)||Object.keys(e).some(d=>!Object.keys(fW).includes(d)))throw new Error(t);let o=bW({...e,name:"Portable Project",slug:"portable-project",knowledge:[],agents:[],integrations:[],layouts:[]});if(!o.ok)throw new Error(t);for(let d of o.manifest.repos){let p=d.kind==="git"?mW:gW;if(Object.keys(d).some(f=>!Object.keys(p).includes(f)))throw new Error(t);if(d.kind==="git"&&[d.canonicalRemote,...d.aliases??[]].some(f=>/[?#@\s\\]/.test(f)))throw new Error(t)}let{schemaVersion:r,id:i,repos:s,executionRoot:c,createdAt:l,updatedAt:u}=o.manifest;return{schemaVersion:r,id:i,repos:s,...c===void 0?{}:{executionRoot:c},createdAt:l,updatedAt:u}}a(GD,"parseProjectPortableIdentity");function Zw(e,t){let n="This client cannot validate the Project identity returned by this Station.";if(!Jw(e)||!Jw(e.association))throw new Error(n);let o=e.association,r;try{r=GD(e.identity)}catch{throw new Error(n)}if(o.localProjectSlug!==t||typeof o.localProjectId!="string"||!o.localProjectId.trim()||o.portableProjectId!==r.id)throw new Error(n);return{identity:r,association:{portableProjectId:r.id,localProjectId:o.localProjectId,localProjectSlug:t}}}a(Zw,"readProjectIdentityView");async function JD(e,t,n){let o=await Ee(`${e}/api/projects/${encodeURIComponent(t)}/identity`,n);return Zw(await tr(o),t)}a(JD,"getProjectIdentity");async function UZ(e,t,n){let o=await Ae(`${e}/api/projects/${encodeURIComponent(t)}/identity/prepare`,"POST",{...n,readOnly:!1});return Zw(await tr(o),t)}a(UZ,"prepareProjectIdentity");async function FZ(e,t,n,o){let r=await Ae(`${e}/api/projects/${encodeURIComponent(t)}/identity/execution-root`,"PUT",{...o,readOnly:!1},structuredClone(n)),i=Zw(await tr(r),t),s=n.executionRoot,c=i.identity.executionRoot;if(i.identity.id!==n.expectedIdentity.id||i.association.localProjectId!==n.expectedLocalProjectId||(s===null?c!==void 0:c?.repoId!==s.repoId||c.path!==s.path))throw new Error("This Station did not confirm the requested Project execution root mutation.");return i}a(FZ,"updateProjectExecutionRoot");async function BZ(e,t,n){let o=structuredClone(t),r=await Ae(`${e}/api/projects/attach`,"POST",{...n,readOnly:!1},o),i=await tr(r),s=Zw(i,o.slug);if(!Jw(i)||i.outcome!=="created"&&i.outcome!=="existing"||s.identity.id!==o.identity.id)throw new Error("This client cannot validate the Project attachment returned by this Station.");return{...s,outcome:i.outcome}}a(BZ,"attachProject");Lt();async function A_e(e){let t=await E_e(P_e(e),"r");try{if(!(await t.stat()).isFile())throw new Error("The identity snapshot must be a regular JSON file.");let n=Buffer.alloc(64*1024+1),o=0;for(;o<n.length;){let{bytesRead:r}=await t.read(n,o,n.length-o,null);if(!r)break;o+=r}if(o>64*1024)throw new Error("The identity snapshot exceeds 64 KiB.");return JSON.parse(n.subarray(0,o).toString("utf8"))}finally{await t.close()}}a(A_e,"readIdentityFile");async function kg(e,t){let n=t.positionals[0],o=U(t,1,"Project slug");if(t.positionals.length!==2)throw new Error("Supply exactly one Project slug.");let r=new Set(["api-base","station","credential","json",...n==="attach"?["identity-file","name","target-workspace"]:n==="execution-root"?["repo-id","path","clear"]:[]]);for(let d of Object.keys(t.flags))if(!r.has(d))throw new Error(`Unsupported Project identity flag: --${d}`);let i={authentication:"required"};if(n==="execution-root"){let d=t.flags.clear===!0,p=t.flags["repo-id"],f=t.flags.path;if(t.flags.clear!==void 0&&t.flags.clear!==!0)throw new Error("--clear does not accept a value.");if(d&&(p!==void 0||f!==void 0))throw new Error("Choose --clear or --repo-id with --path, not both.");if(!d&&(typeof p!="string"||!p.trim()||typeof f!="string"||!f.trim()))throw new Error("Setting an execution root requires --repo-id=<id> and --path=<relative-path>.");if(!d&&!yW(f))throw new Error("Execution root --path must stay relative to its repo.");Dm();let m=await JD(e,o,i);if(!d&&!m.identity.repos.some(g=>g.id===p))throw new Error(`Project '${o}' does not declare resource '${String(p)}'.`);_e(await FZ(e,o,{expectedIdentity:m.identity,expectedLocalProjectId:m.association.localProjectId,executionRoot:d?null:{repoId:String(p),path:String(f)}},i));return}if(n==="identity"||n==="prepare-identity"){n==="prepare-identity"&&Dm();let d=n==="identity"?await JD(e,o,i):await UZ(e,o,i);_e(d.identity);return}if(n!=="attach")throw new Error("Unsupported Project identity action.");let s=a(d=>{let p=t.flags[d];if(typeof p!="string"||!p.trim())throw new Error(`Project attachment requires --${d}=<value>.`);return p},"required");if(t.flags.station===void 0&&t.flags["api-base"]===void 0)throw new Error("Select the destination explicitly with --station or --api-base.");t.flags.station!==void 0&&s("station"),t.flags["api-base"]!==void 0&&s("api-base");let c=s("name"),l=GD(await A_e(s("identity-file"))),u=t.flags["target-workspace"]===void 0?void 0:s("target-workspace");Dm(),_e(await BZ(e,{slug:o,name:c,identity:l,...u===void 0?{}:{workingDirectory:u}},i))}a(kg,"runProjectIdentityCommand");function HZ(e){let t=vc(e);return!t||t.length===0?`Run \`station ${e} --help\` for the supported actions.`:`Use ${t.map(n=>`'${n}'`).join(", ")}.`}a(HZ,"describeValidActions");var B_e={tasks:{collectionPath:"/api/tasks",createPath:"/api/tasks",getPath:a(e=>`/api/tasks/${encodeURIComponent(e)}`,"getPath"),customActions:{"attach-turn":a(async(e,t)=>{await H_e(e,t)},"attach-turn"),"attach-input":a(async(e,t)=>{await K_e(e,t)},"attach-input"),"attach-result":a(async(e,t)=>{await Z_e(e,t)},"attach-result"),"show-results":a(async(e,t)=>{await Y_e(e,t)},"show-results"),"show-turn":a(async(e,t)=>{await G_e(e,t)},"show-turn"),"show-inputs":a(async(e,t)=>{await J_e(e,t)},"show-inputs"),"list-outputs":a(async(e,t)=>{await oRe(e,t)},"list-outputs"),"keep-output":a(async(e,t)=>{await iRe(e,t)},"keep-output"),"get-output":a(async(e,t)=>{await sRe(e,t)},"get-output"),"download-output":a(async(e,t)=>{await aRe(e,t)},"download-output"),"delete-output":a(async(e,t)=>{await cRe(e,t)},"delete-output"),"show-support":a(async(e,t)=>{await X_e(e,t)},"show-support"),basis:a(async(e,t)=>{let n=U(t,1,"task id"),o=rt(t,"answer-reference"),r=rt(t,"format")??"summary";if(r!=="summary"&&r!=="json")throw new Error("basis --format must be summary or json.");let i=await oV(e,n,{...o?{answerReferenceId:o}:{}});if(t.flags.json===!0||r==="json"){$s(i,!0);return}W_e(i)},"basis"),"list-support-bundles":a(async(e,t)=>{await Q_e(e,t)},"list-support-bundles"),"list-support-claims":a(async(e,t)=>{await eRe(e,t)},"list-support-claims"),"attach-support":a(async(e,t)=>{await tRe(e,t)},"attach-support"),"replace-support":a(async(e,t)=>{await nRe(e,t)},"replace-support"),"remove-support":a(async(e,t)=>{await rRe(e,t)},"remove-support")}},agents:{collectionPath:"/api/agents",createPath:"/agents",getPath:a(e=>`/api/agents/${encodeURIComponent(e)}`,"getPath"),updatePath:a(e=>`/agents/${encodeURIComponent(e)}`,"updatePath"),deletePath:a(e=>`/agents/${encodeURIComponent(e)}`,"deletePath"),list:a(e=>qe(e,"/api/agents"),"list"),get:a((e,t)=>Yz(e,t),"get"),create:a((e,t)=>Xz(e,t),"create"),update:a((e,t,n)=>Qz(e,t,n),"update"),delete:a((e,t)=>eq(e,t),"delete"),customActions:{chat:a(async(e,t)=>{await QZ(t,e,1)},"chat"),conversations:a(async(e,t)=>{let n=U(t,1,"agent"),o=await kV(e,n);_e(o)},"conversations"),messages:a(async(e,t)=>{let n=U(t,1,"agent"),o=U(t,2,"conversationId"),r=await IV(e,n,o);_e(r)},"messages"),workflows:a(async(e,t)=>{await uRe(e,t)},"workflows")}},projects:{collectionPath:"/api/projects",createPath:"/api/projects",getPath:a(e=>`/api/projects/${encodeURIComponent(e)}`,"getPath"),updatePath:a(e=>`/api/projects/${encodeURIComponent(e)}`,"updatePath"),deletePath:a(e=>`/api/projects/${encodeURIComponent(e)}`,"deletePath"),list:a(e=>qe(e,"/api/projects"),"list"),get:a((e,t)=>gm(e,t),"get"),create:a((e,t)=>vS(e,t),"create"),update:a((e,t,n)=>_W(e,t,n),"update"),delete:a((e,t)=>RW(e,t),"delete"),customActions:{identity:kg,"prepare-identity":kg,"execution-root":kg,attach:kg,layouts:a(async(e,t)=>{await dRe(e,t)},"layouts")}},skills:{collectionPath:"/api/skills",getPath:a(e=>`/api/skills/${encodeURIComponent(e)}`,"getPath"),updatePath:a(e=>`/api/skills/${encodeURIComponent(e)}`,"updatePath"),deletePath:a(e=>`/api/skills/${encodeURIComponent(e)}`,"deletePath"),list:a(e=>yH(e),"list"),customActions:{create:a(async(e,t)=>{let n=await He(t),o=await qe(e,"/api/skills/local",{method:"POST",body:JSON.stringify(n)});Ge(o)},"create"),install:a(async(e,t)=>{let n=U(t,1,"skill name"),o=await qe(e,"/api/skills",{method:"POST",body:JSON.stringify({name:n})});Ge(o)},"install")}},"secret-bindings":{collectionPath:"/api/secret-bindings",createPath:"/api/secret-bindings",getPath:a(e=>`/api/secret-bindings/${encodeURIComponent(e)}`,"getPath"),customActions:{replace:a(async(e,t)=>{let n=U(t,1,"binding id"),o=await qe(e,`/api/secret-bindings/${encodeURIComponent(n)}`,{method:"PUT",body:JSON.stringify(await He(t))});_e(o)},"replace"),revoke:a(async(e,t)=>{let n=U(t,1,"binding id"),o=await qe(e,`/api/secret-bindings/${encodeURIComponent(n)}/revoke`,{method:"POST",body:JSON.stringify(await He(t))});_e(o)},"revoke"),bind:a(async(e,t)=>{let n=U(t,1,"binding id"),o=await qe(e,`/api/secret-bindings/${encodeURIComponent(n)}/bind`,{method:"POST",body:JSON.stringify(await He(t))});_e(o)},"bind"),unbind:a(async(e,t)=>{let n=U(t,1,"binding id"),o=await qe(e,`/api/secret-bindings/${encodeURIComponent(n)}/unbind`,{method:"POST",body:JSON.stringify(await He(t))});_e(o)},"unbind"),"migrate-stored-env":a(async(e,t)=>{let n=U(t,1,"integration id"),o=await qe(e,`/api/secret-bindings/integrations/${encodeURIComponent(n)}/migrate-stored-env`,{method:"POST",body:JSON.stringify(await He(t))});_e(o)},"migrate-stored-env")}}};function V_e(e,t){if(e!=="tasks"||t[0]!=="create")return t;let n=t.findIndex(i=>i.startsWith("--json="));if(n!==-1){let i=[...t];return i[n]=`--data=${t[n].slice(7)}`,i}let o=t.indexOf("--json"),r=t[o+1];return o===-1||!r||r.startsWith("--")?t:t.flatMap((i,s)=>s===o?`--data=${r}`:s===o+1?[]:i)}a(V_e,"normalizeTaskCreateArgs");function Yw(e,t){if(typeof e!="object"||e===null)return 0;let n=e.regions;if(typeof n!="object"||n===null)return 0;let o=n[t];return Array.isArray(o)?o.length:0}a(Yw,"basisItemCount");function W_e(e){let t=typeof e=="object"&&e!==null?e:{};if(t.version===sm){let o=Array.isArray(t.answers)?t.answers.length:0,r=Array.isArray(t.unassociated)?t.unassociated.length:0,i=Array.isArray(t.keptToolResults)?t.keptToolResults.length:0,s=Array.isArray(t.keptGateEvaluations)?t.keptGateEvaluations.length:0;console.log(`scope=task collection answers=${o} unassociated=${r} kept-tool-results=${i} kept-gate-evaluations=${s}`);return}let n=typeof t.standing=="string"?t.standing:"unresolved";console.log(`scope=answer standing=${n} inputs=${Yw(t,"inputs")} execution=${Yw(t,"execution")} outcomes=${Yw(t,"outcomes")} support=${Yw(t,"support")}`)}a(W_e,"printTaskBasisSummary");async function H_e(e,t){let n=U(t,1,"task id"),o=rt(t,"session"),r=rt(t,"turn");if(!o)throw new Error("attach-turn requires --session=<sessionId>.");if(!r)throw new Error("attach-turn requires --turn=<turnId>.");let i=await qe(e,`/api/tasks/${encodeURIComponent(n)}/references`,{method:"POST",body:JSON.stringify({kind:"turn",sessionId:o,turnId:r,sourceSurface:"cli"})});_e(i)}a(H_e,"runTaskAttachTurn");async function K_e(e,t){let n=U(t,1,"task id"),o=rt(t,"session"),r=rt(t,"event");if(!o)throw new Error("attach-input requires --session=<sessionId>.");if(!r)throw new Error("attach-input requires --event=<eventId>.");let i=hu({kind:"user-input",sessionId:o,eventId:r,sourceSurface:"cli"});if(i.length>0)throw new Error(`attach-input has invalid reference: ${i.join("; ")}`);_e(await rK(e,n,{sessionId:o,eventId:r,sourceSurface:"cli"}))}a(K_e,"runTaskAttachInput");async function G_e(e,t){let n=U(t,1,"task id"),o=await qe(e,`/api/tasks/${encodeURIComponent(n)}/turn-references`);_e(o)}a(G_e,"runTaskShowTurn");async function J_e(e,t){let n=U(t,1,"task id");$s(await oK(e,n),t.flags.json===!0)}a(J_e,"runTaskShowInputs");async function Z_e(e,t){let n=U(t,1,"task id"),o=rt(t,"session"),r=rt(t,"event");if(!o)throw new Error("attach-result requires --session=<sessionId>.");if(!r)throw new Error("attach-result requires --event=<eventId>.");let i=hu({kind:"tool-result",sessionId:o,eventId:r,sourceSurface:"cli"});if(i.length)throw new Error(`attach-result has invalid reference: ${i.join("; ")}`);_e(await X6(e,n,{sessionId:o,eventId:r,sourceSurface:"cli"}))}a(Z_e,"runTaskAttachResult");async function Y_e(e,t){$s(await Q6(e,U(t,1,"task id")),t.flags.json===!0)}a(Y_e,"runTaskShowResults");async function X_e(e,t){let n=U(t,1,"task id");_e(await cV(e,n))}a(X_e,"runTaskShowSupport");function li(e,t,n){let o=rt(e,n);if(!o)throw new Error(`${t} requires --${n}=<${n}Id>.`);return o}a(li,"requiredTaskSupportFlag");function XZ(e,t){let n=rt(e,"revision");if(!n)throw new Error(`${t} requires --revision=<revision>.`);let o=Number(n);if(!Number.isInteger(o)||o<=0)throw new Error(`${t} requires --revision=<positive integer>.`);return o}a(XZ,"requiredExpectedRevision");async function Q_e(e,t){let n=U(t,1,"task id"),o=li(t,"list-support-bundles","reference");_e(await lV(e,n,o))}a(Q_e,"runTaskListSupportBundles");async function eRe(e,t){let n=U(t,1,"task id"),o=li(t,"list-support-claims","reference"),r=li(t,"list-support-claims","bundle");_e(await uV(e,n,o,r))}a(eRe,"runTaskListSupportClaims");async function tRe(e,t){let n=U(t,1,"task id"),o=li(t,"attach-support","reference"),r=li(t,"attach-support","bundle"),i=li(t,"attach-support","claim");_e(await dV(e,n,o,{bundleId:r,claimId:i}))}a(tRe,"runTaskAttachSupport");async function nRe(e,t){let n=U(t,1,"task id"),o=li(t,"replace-support","reference"),r=li(t,"replace-support","bundle"),i=li(t,"replace-support","claim"),s=XZ(t,"replace-support");_e(await pV(e,n,o,{bundleId:r,claimId:i,expectedRevision:s}))}a(nRe,"runTaskReplaceSupport");async function rRe(e,t){let n=U(t,1,"task id"),o=li(t,"remove-support","reference"),r=XZ(t,"remove-support");await fV(e,n,o,{expectedRevision:r}),_e(void 0)}a(rRe,"runTaskRemoveSupport");async function oRe(e,t){let n=U(t,1,"task id");_e(await qe(e,`/api/tasks/${encodeURIComponent(n)}/outputs`))}a(oRe,"runTaskListOutputs");async function iRe(e,t){let n=U(t,1,"task id"),o=t.flags.path,r=t.flags.title,i=t.flags.operation;if(!o||!r||!i)throw new Error("keep-output requires --path=<relativePath> --title=<title> --operation=<operationId>.");_e(await qe(e,`/api/tasks/${encodeURIComponent(n)}/outputs`,{method:"POST",body:JSON.stringify({operationId:i,relativePath:o,title:r,...t.flags.media?{declaredMediaType:t.flags.media}:{}})}))}a(iRe,"runTaskKeepOutput");async function sRe(e,t){let n=U(t,1,"task id"),o=U(t,2,"output id");_e(await qe(e,`/api/tasks/${encodeURIComponent(n)}/outputs/${encodeURIComponent(o)}`))}a(sRe,"runTaskGetOutput");async function aRe(e,t){let n=U(t,1,"task id"),o=U(t,2,"output id"),r=t.flags.out;if(!r||r===!0)throw new Error("download-output requires --out=<destination>.");if(!q_e(r))throw new Error("download-output destination must be an absolute path.");let i=YZ(r);if(GZ(i))throw Sc(i).isSymbolicLink()?new Error("download-output refuses a symlink destination."):new Error("download-output refuses to overwrite an existing destination.");let s=z_e(i),c=Ig(s),l=await wH(e,n,o),u=Ig(s);if(c.dev!==u.dev||c.ino!==u.ino)throw new Error("download-output destination parent changed during download.");let d=ZZ(c.canonicalPath,`.${M_e(i)}.${process.pid}.${Ms()}.tmp`);try{L_e(d,l.bytes,{flag:"wx",mode:384});let p=N_e(d,"r");try{$_e(p)}finally{C_e(p)}let f=Ig(s);if(!Xw(c,f))throw new Error("download-output destination parent changed during publication.");try{O_e(d,i)}catch(h){throw h.code==="EEXIST"?new Error("download-output refuses to overwrite an existing destination."):h}let m=Sc(d),g;try{g=Ig(s)}catch{throw KZ(i,m),new Error("download-output publication is uncertain.")}if(!Xw(c,g))throw KZ(i,m),new Error("download-output publication is uncertain.");try{ot(s)}catch{let h=D_e(i),y=Sc(i),v=Ig(s);if(!(y.isFile()&&y.dev===m.dev&&y.ino===m.ino&&h.equals(Buffer.from(l.bytes))&&Xw(v,c)))throw new Error("download-output publication is uncertain.")}}finally{try{JZ(d)}catch{}}Ge({destination:i,byteLength:l.bytes.byteLength,mediaType:l.mediaType,etag:l.etag})}a(aRe,"runTaskDownloadOutput");function Ig(e){if(!GZ(e))throw new Error("download-output destination parent is unavailable.");let t=YZ(e),n=U_e(t).root,o=t.slice(n.length).split(F_e).filter(Boolean),r=n;for(let[s,c]of o.entries()){let l=ZZ(r,c),u=Sc(l);if(u.isSymbolicLink()){if(!(s===0&&process.platform==="darwin"&&["/var","/tmp","/etc"].includes(l)))throw new Error("download-output destination parent is unavailable.");if(r=j_e(l),!Sc(r).isDirectory())throw new Error("download-output destination parent is unavailable.");continue}if(!u.isDirectory())throw new Error("download-output destination parent is unavailable.");r=l}let i=Sc(r);if(!i.isDirectory()||i.isSymbolicLink())throw new Error("download-output destination parent is unavailable.");return{canonicalPath:r,dev:i.dev,ino:i.ino}}a(Ig,"assertSafeOutputParent");function Xw(e,t){return e.dev===t.dev&&e.ino===t.ino}a(Xw,"sameFileIdentity");function KZ(e,t){try{let n=Sc(e);Xw(n,t)&&JZ(e)}catch{}}a(KZ,"containUnstablePublication");async function cRe(e,t){let n=U(t,1,"task id"),o=U(t,2,"output id");_e(await qe(e,`/api/tasks/${encodeURIComponent(n)}/outputs/${encodeURIComponent(o)}`,{method:"DELETE"}))}a(cRe,"runTaskDeleteOutput");async function lRe(e,t,n){switch(t.positionals[0]){case"list":{let r=n.list?await n.list(e):await qe(e,n.collectionPath);return _e(r),!0}case"get":{if(!n.getPath&&!n.get)throw new Error("Get is not supported for this resource.");let r=U(t,1,"id"),i=n.get?await n.get(e,r):await qe(e,n.getPath(r));return _e(i),!0}case"create":{if(!n.createPath&&!n.create)throw new Error("Create is not supported for this resource.");let r=await He(t),i=n.create?await n.create(e,r):await qe(e,n.createPath,{method:"POST",body:JSON.stringify(r)});return _e(i),!0}case"update":{if(!n.updatePath&&!n.update)throw new Error("Update is not supported for this resource.");let r=U(t,1,"id"),i=await He(t),s=n.update?await n.update(e,r,i):await qe(e,n.updatePath(r),{method:"PUT",body:JSON.stringify(i)});return _e(s),!0}case"delete":{if(!n.deletePath&&!n.delete)throw new Error("Delete is not supported for this resource.");let r=U(t,1,"id"),i=n.delete?await n.delete(e,r):await qe(e,n.deletePath(r),{method:"DELETE"});return _e(i),!0}default:return!1}}a(lRe,"runStandardCrud");async function uRe(e,t){let n=U(t,1,"workflow action");if(n==="list"){let o=U(t,2,"agent"),r=await qe(e,`/agents/${encodeURIComponent(o)}/workflows/files`);Ge(r);return}if(n==="get"){let o=U(t,2,"agent"),r=U(t,3,"workflowId"),i=await qe(e,`/agents/${encodeURIComponent(o)}/workflows/${encodeURIComponent(r)}`);Ge(i);return}if(n==="create"){let o=U(t,2,"agent"),r=await He(t),i=await qe(e,`/agents/${encodeURIComponent(o)}/workflows`,{method:"POST",body:JSON.stringify(r)});Ge(i);return}if(n==="update"){let o=U(t,2,"agent"),r=U(t,3,"workflowId"),i=await He(t),s=await qe(e,`/agents/${encodeURIComponent(o)}/workflows/${encodeURIComponent(r)}`,{method:"PUT",body:JSON.stringify(i)});Ge(s);return}if(n==="delete"){let o=U(t,2,"agent"),r=U(t,3,"workflowId"),i=await qe(e,`/agents/${encodeURIComponent(o)}/workflows/${encodeURIComponent(r)}`,{method:"DELETE"});Ge(i);return}throw new Error("Unknown workflow action. Use 'list', 'get', 'create', 'update', or 'delete'.")}a(uRe,"runAgentWorkflowCommand");async function dRe(e,t){let n=U(t,1,"layout action");if(n==="available"){let o=await qe(e,"/api/projects/layouts/available");Ge(o);return}if(n==="list"){let o=U(t,2,"project"),r=await kW(e,o);_e(r);return}if(n==="get"){let o=U(t,2,"project"),r=U(t,3,"layout"),i=await IW(e,o,r);_e(i);return}if(n==="create"){let o=U(t,2,"project"),r=await He(t),i=await EW(e,o,r);_e(i);return}if(n==="update"){let o=U(t,2,"project"),r=U(t,3,"layout"),i=await He(t),s=await PW(e,o,r,i);_e(s);return}if(n==="delete"){let o=U(t,2,"project"),r=U(t,3,"layout");await AW(e,o,r),_e(void 0);return}if(n==="from-plugin"){let o=U(t,2,"project"),r=U(t,3,"plugin"),i=await xW(e,o,r);_e(i);return}throw new Error("Unknown layout action. Use 'available', 'list', 'get', 'create', 'update', 'delete', or 'from-plugin'.")}a(dRe,"runProjectLayoutCommand");async function QZ(e,t,n=0){Sg(e);let o=Ci(U(e,n,"agent")),r=await jm(e,n+1),i=rt(e,"session"),s=typeof e.flags.conversation=="string"?e.flags.conversation:void 0;if(i&&s&&i!==s)throw new Error("--session and --conversation must identify the same session.");let{modelOptions:c,cwd:l}=yg(e),u=typeof e.flags.project=="string"?e.flags.project:void 0;if(l&&u)throw new Error("Use --project or --cwd, not both.");let d=hg(e);if(e.flags.title!==void 0)throw new Error("--title is not supported by canonical foreground execution yet.");let p=rt(e,"model");await sZ(t,{environment:To(e),agent:o,...p||c?{model:{...p?{override:p}:{},...c?{options:c}:{}}}:{},...!i&&!s?u?{workspace:{kind:"project",projectSlug:u,cwd:process.cwd()}}:{workspace:{kind:"directory",cwd:l??process.cwd()}}:{}},{message:r,conversationId:i??s,jsonMode:e.flags.json===!0,onRequest:d})}a(QZ,"runChat");async function pRe(e,t){Sg(t);let n=U(t,0,"session action"),o=Ci(U(t,1,"agent"));if(n==="inspect"){let i=U(t,2,"session id"),s=U(t,3,"tool result event id"),c=hu({kind:"tool-result",sessionId:i,eventId:s,sourceSurface:"cli"});if(c.length>0)throw new Error(`inspect has invalid tool result reference: ${c.join("; ")}`);$s(await Y6(e,i,s),t.flags.json===!0);return}let r=await iZ(e,{agentSlug:o});if(n==="list"){Ge(await r.listSessions());return}if(n==="read"){let i=U(t,2,"session id");Ge(await r.readSession(i));return}if(n==="interrupt"){let i=U(t,2,"session id"),s=typeof t.flags.turn=="string"?t.flags.turn:void 0;await r.interruptSession(i,s),Ge({success:!0,interrupted:i});return}throw new Error("Unknown sessions action. Use 'list', 'read', 'inspect', or 'interrupt'.")}a(pRe,"runSessionsCommand");async function e8(e,t){let n=Le(V_e(e,t)),o=rr(n);if(Yt(n,o),e==="chat"){await QZ(n,o);return}if(e==="sessions"){await pRe(o,n);return}if(e==="conversation"){let{runConversationCommand:c}=await Promise.resolve().then(()=>(WZ(),VZ));await c(o,n);return}if(e==="approvals"){await uZ(o,n);return}if(e==="operate"){await qZ(o,n);return}if(e==="delegate"){await RZ(o,n);return}let r=B_e[e];if(!r)throw new Error(`Unknown core command: ${e}`);let i=n.positionals[0];if(!i)throw new Error(`Missing action for ${e}. ${HZ(e)}`);if(r.customActions?.[i]){await r.customActions[i](o,n);return}if(!await lRe(o,n,r))throw new Error(`Unknown ${e} action: ${i}. ${bc(i,vc(e)??[])}${HZ(e)}`)}a(e8,"runCoreCommand");Lt();Qt();import{chmodSync as $Ae,lstatSync as A7,mkdirSync as x7}from"node:fs";import{createServer as OAe}from"node:net";import{dirname as NAe}from"node:path";US();Qt();import{readFileSync as fRe,statSync as mRe}from"node:fs";import{basename as gRe,dirname as hRe,join as ZD,normalize as yRe,resolve as i8}from"node:path";var t8=k0("development").serverPort,n8=k0("development").uiPort,_g=500,vRe=new Set([0,1,7,9,11,13,15,17,19,20,21,22,23,25,37,42,43,53,69,77,79,87,95,101,102,103,104,109,110,111,113,115,117,119,123,135,137,139,143,161,179,389,427,465,512,513,514,515,526,530,531,532,540,548,554,556,563,587,601,636,989,990,993,995,1719,1720,1723,2049,3659,4045,4190,5060,5061,6e3,6566,6665,6666,6667,6668,6669,6679,6697,10080]);function YD(e){let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return t>>>0}a(YD,"fnv1a32");function r8(e,t){if(!Number.isInteger(e)||e<0)throw new Error(`${t} must be a non-negative integer; received ${e}.`);if(e>_g)throw new Error(`${t} must be at most ${_g} to stay within the reserved dev port band; received ${e}.`)}a(r8,"assertOffsetInRange");function s8(e){if(e.portOffset!==void 0)return r8(e.portOffset,"Port offset"),{offset:e.portOffset,source:`port offset ${e.portOffset}`};let t=e.devInstance?.trim();if(t){if(/^\d+$/.test(t)){let r=Number(t);return r8(r,`STATION_DEV_INSTANCE=${t}`),{offset:r,source:`numeric STATION_DEV_INSTANCE=${t}`}}return{offset:YD(t)%_g+1,source:`hashed STATION_DEV_INSTANCE=${t}`}}let n=e.worktreePath?.trim();return n?{offset:YD(n)%_g+1,source:`worktree ${n}`}:{offset:0,source:"default (base ports)"}}a(s8,"resolveDevOffset");var bRe={statType(e){try{return mRe(e).isDirectory()?"dir":"file"}catch{return}},readText(e){try{return fRe(e,"utf-8")}catch{return""}}};function SRe(e){let t=e.split(/\r?\n/).map(o=>o.trim()).find(o=>o.startsWith("gitdir:"))?.slice(7).trim();if(t===void 0||t.length===0)return!1;let n=yRe(t.replaceAll("\\","/")).split(/[/\\]/).filter(o=>o.length>0);return n.length>=3&&n.at(-2)==="worktrees"}a(SRe,"pointsAtLinkedWorktree");function a8(e,t=bRe){let n=i8(e);for(;;){let o=ZD(n,".git"),r=t.statType(o);if(r!==void 0)return r!=="file"?void 0:SRe(t.readText(o))?n:void 0;let i=hRe(n);if(i===n)return;n=i}}a(a8,"resolveWorktreePath");function o8(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/-+$/,"")||"instance"}a(o8,"sanitizeSegment");function c8(e){let t=e.homeRoot??ZD(e.stationRoot??dr(),"instances","dev"),n=e.devInstance?.trim(),o;if(n&&n.length>0)o=`dev-${o8(n)}`;else{let r=i8(e.worktreePath??e.cwd),i=YD(r).toString(16).padStart(8,"0");o=`dev-${o8(gRe(r))}-${i}`}return{instance:o,home:ZD(t,o)}}a(c8,"deriveDevInstanceAndHome");function wRe(e,t){return[e,e+1,e+2,e+3,t]}a(wRe,"offsetPortsToProbe");async function l8(e,t){let n=_g+1;for(let o=0;o<n;o+=1){let r=(e+o)%n,i=t8+r,s=n8+r,c=wRe(i,s);if(c.some(u=>vRe.has(u)))continue;let l=!0;for(let u of c)if(!await t(u)){l=!1;break}if(l)return{offset:r,serverPort:i,uiPort:s,moved:r!==e}}throw new Error(`No free Station dev port pair found scanning all ${n} offsets from ${e} (server base ${t8}, ui base ${n8}).`)}a(l8,"allocateDevPorts");a0();import{execFileSync as GY,execSync as Zi,spawn as OY,spawnSync as CPe}from"node:child_process";import{randomBytes as NY,randomUUID as qg}from"node:crypto";import{chmodSync as $Pe,closeSync as fi,existsSync as xt,fchmodSync as JY,constants as sr,fstatSync as Ug,fsyncSync as ZY,linkSync as OPe,lstatSync as mi,mkdirSync as Ck,mkdtempSync as NPe,openSync as Ad,readdirSync as Hg,readFileSync as jr,realpathSync as Pd,renameSync as io,rmSync as Dr,statSync as Fg,unlinkSync as YY,writeFileSync as XY,writeSync as DPe}from"node:fs";import{request as jPe}from"node:http";import{createConnection as QY,isIP as e7}from"node:net";import{basename as t7,dirname as Bg,isAbsolute as Mg,join as Je,relative as Kj,resolve as pi}from"node:path";import{execFileSync as kRe,execSync as IRe}from"node:child_process";import{dirname as _Re,resolve as RRe}from"node:path";function u8(){let e={...process.env};return delete e.GIT_DIR,delete e.GIT_WORK_TREE,e}a(u8,"gitEnv");function Qw(e,t){return IRe(`git ${e}`,{cwd:t,encoding:"utf-8",stdio:["pipe","pipe","pipe"],windowsHide:!0,env:u8()}).trim()}a(Qw,"git");function XD(e,t=5e3){let n=kRe("git",["rev-parse","--verify","HEAD"],{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","pipe"],windowsHide:!0,env:u8(),timeout:t}).trim();if(!/^[0-9a-f]{40,64}$/i.test(n))throw new Error(`git rev-parse HEAD returned ${JSON.stringify(n)}`);return n}a(XD,"readGitHeadSha");function QD(e){let t=[e,process.cwd()].filter(Boolean),n=process.argv.find(c=>c.includes("src-server")||c.includes("dist-server"));n&&t.splice(1,0,_Re(RRe(n)));let o;for(let c of t)try{o=Qw("rev-parse --show-toplevel",c);break}catch{}if(!o)throw new Error("Not a git repository");let r=Qw("rev-parse --abbrev-ref HEAD",o),i=Qw("rev-parse HEAD",o).substring(0,7),s;try{s=Qw("remote get-url origin",o)}catch{}return{gitRoot:o,branch:r,hash:i,remote:s}}a(QD,"resolveGitInfo");go();import{existsSync as ERe,readFileSync as PRe}from"node:fs";import{join as d8}from"node:path";var ek="dependencies:install";function ARe(e){return e instanceof Error?e.message:String(e)}a(ARe,"describeThrown");function p8(e,t=ARe){let n=d8(e,"package.json"),o;try{o=JSON.parse(PRe(n,"utf-8")).scripts?.[ek]}catch(i){return`${n} could not be read as JSON (${t(i)})`}if(typeof o!="string")return`${n} does not define the "${ek}" script`;let r=d8(e,"scripts","dependency-lifecycle.mjs");return ERe(r)?null:`${r} is missing`}a(p8,"ownedDependencyInstallerUnavailable");US();Tm();Si();Qt();import{randomUUID as xRe}from"node:crypto";import{existsSync as Xot,linkSync as Qot,mkdirSync as eit,readFileSync as TRe,renameSync as CRe,rmSync as tit,writeFileSync as $Re}from"node:fs";import{join as Rg}from"node:path";var wc="STATION_SERVICE_LAUNCHER",f8=1;function nj(e=process.env){let t=e[wc];if(!t)return null;try{let n=JSON.parse(t);return n.protocol!==f8||typeof n.installRoot!="string"||typeof n.version!="string"||n.role!=="active"&&n.role!=="trial"||n.updateId!==void 0&&typeof n.updateId!="string"?null:n}catch{return null}}a(nj,"readServiceLauncherContext");function rk(e){let t=Rg(e,"runtime");return{runtime:t,request:Rg(t,"update-request.json"),processing:Rg(t,"update-request.processing.json"),result:Rg(t,"update-request-result.json"),state:Rg(t,"service-state.json")}}a(rk,"serviceUpdatePaths");var nk=/^[0-9a-f-]{36}$/,m8=/^[0-9A-Za-z][0-9A-Za-z.+-]*$/;function ORe(e){return`${e}.${process.pid}.${xRe()}.tmp`}a(ORe,"temporaryPath");function rj(e,t){let n=ORe(e);$Re(n,`${JSON.stringify(t)}
291
291
  `,{mode:384,flag:"wx"}),CRe(n,e)}a(rj,"writeJsonAtomically");function ok(e){try{let t=JSON.parse(e);return typeof t.id!="string"||!nk.test(t.id)||typeof t.requestedAt!="string"||t.targetVersion!==void 0&&(typeof t.targetVersion!="string"||!m8.test(t.targetVersion))?null:t}catch{return null}}a(ok,"parseServiceUpdateRequest");function ej(e){let t;try{t=TRe(e,"utf8")}catch(n){return n.code==="ENOENT"?{kind:"absent"}:{kind:"invalid"}}try{return{kind:"ok",value:JSON.parse(t)}}catch{return{kind:"invalid"}}}a(ej,"readJson");function tj(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}a(tj,"record");var NRe=["stopping","backing-up","trial","restoring"];function tk(e){return typeof e=="string"&&m8.test(e)}a(tk,"isVersion");function g8(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}a(g8,"isTimestamp");function DRe(e){let t=tj(e);return!t||typeof t.requestId!="string"||!nk.test(t.requestId)||!g8(t.at)?null:t.status==="up-to-date"&&tk(t.version)?{state:"up-to-date",requestId:t.requestId,version:t.version,finishedAt:t.at}:(t.status==="failed"||t.status==="rejected")&&typeof t.reason=="string"?{state:t.status==="failed"?"staging-failed":"rejected",requestId:t.requestId,reason:t.reason,finishedAt:t.at}:null}a(DRe,"requestResultProgress");function jRe(e){let t=tj(e);if(!t||t.protocol!==f8||!tk(t.activeVersion))return null;if(t.update===void 0)return;let n=tj(t.update);if(!n||typeof n.id!="string"||!nk.test(n.id)||!tk(n.fromVersion)||!tk(n.targetVersion)||!Number.isSafeInteger(n.attempts))return null;let r={requestId:typeof n.requestId=="string"&&nk.test(n.requestId)?n.requestId:null,fromVersion:n.fromVersion,targetVersion:n.targetVersion};return n.status==="pending"?NRe.includes(n.phase)?{state:"updating",...r,phase:n.phase,attempts:n.attempts}:null:g8(n.finishedAt)?n.status==="committed"?{state:"committed",...r,finishedAt:n.finishedAt}:n.status==="needs-operator"?typeof n.reason!="string"||!Number.isSafeInteger(n.restoreAttempts)?null:{state:"needs-operator",...r,reason:n.reason,restoreAttempts:n.restoreAttempts,finishedAt:n.finishedAt}:(n.status==="rolled-back"||n.status==="failed")&&typeof n.reason=="string"?{state:n.status,...r,reason:n.reason,finishedAt:n.finishedAt}:null:null}a(jRe,"launcherUpdateProgress");function h8(e){let t=rk(e);for(let[c,l]of[[t.request,"queued"],[t.processing,"staging"]]){let u=ej(c);if(u.kind==="absent")continue;let d=u.kind==="ok"?ok(JSON.stringify(u.value)):null;return d?{state:l,requestId:d.id}:{state:"unavailable"}}let n=ej(t.state),o;if(n.kind==="invalid")return{state:"unavailable"};if(n.kind==="ok"){if(o=jRe(n.value),o===null)return{state:"unavailable"};if(o?.state==="updating")return o}let r=ej(t.result),i=r.kind==="ok"?DRe(r.value):null,s=a(c=>c&&"finishedAt"in c?Date.parse(c.finishedAt):-1,"finished");return o?.state==="needs-operator"||o&&s(o)>=s(i)?o:i??o??{state:"idle"}}a(h8,"readServiceUpdateProgress");import{lstatSync as LRe,statSync as MRe}from"node:fs";import{join as b8}from"node:path";import{DatabaseSync as zRe}from"node:sqlite";function oj(e){let t=typeof e=="object"&&e!==null?e:{};if(t.errcode===11||t.errcode===26)return!0;let n="code"in t?String(t.code):"",o=typeof t.errstr=="string"?t.errstr:"",r=e instanceof Error?e.message:"";return/SQLITE_(?:CORRUPT|NOTADB)/i.test(n)||/database disk image is malformed|file is not a database/i.test(`${r}
292
- ${o}`)}a(oj,"explicitCorruption");function y8(e,t={}){try{if(t.checkpoint){let o=e.prepare("PRAGMA wal_checkpoint(TRUNCATE)").all(),r=o.length===1?o[0]:void 0;if(!r||typeof r!="object"||Array.isArray(r)||r.busy!==0||!Number.isSafeInteger(r.log)||!Number.isSafeInteger(r.checkpointed)||r.log!==r.checkpointed)return{kind:"unavailable",cause:new Error("SQLite checkpoint did not fully drain WAL")}}let n=e.prepare("PRAGMA quick_check").all();return n.length!==1||typeof n[0]!="object"||n[0]===null||Array.isArray(n[0])||Object.values(n[0]).length!==1||Object.values(n[0])[0]!=="ok"?{kind:"corrupt"}:{kind:"ok"}}catch(n){return oj(n)?{kind:"corrupt"}:{kind:"unavailable",cause:n}}}a(y8,"checkSqliteIntegrity");var qRe=["data","orchestration.sqlite"],URe=["scheduler","scheduler.sqlite"];function FRe(e){return b8(e,...qRe)}a(FRe,"orchestrationStorePath");function BRe(e){return b8(e,...URe)}a(BRe,"schedulerStorePath");function S8(e){return[FRe(e),BRe(e)]}a(S8,"stationHomeStorePaths");var dit=Object.freeze(["ok","corrupt","unavailable","absent"]),ik=Object.freeze({ok:0,corrupt:1,unavailable:2,usage:3});function VRe(e){let t,n,o=a(r=>{try{return r()}catch(i){throw t=i,i}},"remember");return{handle:{exec:a(r=>o(()=>e.exec(r)),"exec"),prepare:a(r=>{let i=o(()=>e.prepare(r));return{all:a(()=>(n=o(()=>i.all()),n),"all")}},"prepare")},lastError:a(()=>t,"lastError"),lastRows:a(()=>n,"lastRows")}}a(VRe,"recordingHandle");var w8=500;function WRe(e){let t=e?.[0];if(typeof t!="object"||t===null||Array.isArray(t))return;let n=Object.values(t)[0];if(!(typeof n!="string"||n==="ok"))return n.slice(0,w8)}a(WRe,"quickCheckReport");function HRe(e){let t=e;return typeof t?.errcode=="number"?t.errcode:void 0}a(HRe,"errcodeOf");function v8(e){let t=HRe(e);return{...t===void 0?{}:{errcode:t},...e instanceof Error?{detail:e.message.slice(0,w8)}:{}}}a(v8,"diagnostics");function k8(e,t){let n;try{n=new zRe(e,{timeout:5e3,readOnly:!t});let o=VRe(n),r=y8(o.handle,{checkpoint:t}),i=WRe(o.lastRows());return{outcome:r,lastError:o.lastError(),...i===void 0?{}:{report:i}}}catch(o){return{outcome:oj(o)?{kind:"corrupt"}:{kind:"unavailable",cause:o},lastError:o}}finally{try{n?.close()}catch{}}}a(k8,"probeStore");function I8(e,t={}){return k8(e,t.checkpoint===!0).outcome}a(I8,"openAndCheckSqliteIntegrity");function _8(e){let t=performance.now();try{MRe(e)}catch(s){if(s?.code==="ENOENT"){let c=!1;try{c=LRe(e).isSymbolicLink()}catch{}return c?{databasePath:e,verdict:"unavailable",durationMs:0,detail:"store path is a symbolic link to a missing target"}:{databasePath:e,verdict:"absent",durationMs:0}}}let{outcome:n,lastError:o,report:r}=k8(e,!1),i=Math.round(performance.now()-t);return n.kind==="ok"?{databasePath:e,verdict:"ok",durationMs:i}:n.kind==="corrupt"?{databasePath:e,verdict:"corrupt",durationMs:i,...v8(o),...r===void 0?{}:{detail:r}}:{databasePath:e,verdict:"unavailable",durationMs:i,...v8(n.cause)}}a(_8,"verifySqliteStore");function R8(e){return e.length===0||e.every(t=>t.verdict==="absent")?ik.usage:e.some(t=>t.verdict==="corrupt")?ik.corrupt:e.some(t=>t.verdict==="unavailable")?ik.unavailable:ik.ok}a(R8,"storeIntegrityExitCode");_r();import{createHash as j8,randomUUID as ck}from"node:crypto";import{chmodSync as fj,closeSync as L8,constants as Ic,copyFileSync as mj,existsSync as hd,fstatSync as uEe,fsyncSync as dEe,lstatSync as ro,mkdirSync as kc,openSync as M8,readdirSync as gj,readFileSync as D8,readlinkSync as pEe,readSync as fEe,realpathSync as z8,renameSync as gd,rmSync as xg,statfsSync as mEe,statSync as gEe,symlinkSync as hEe,writeFileSync as q8}from"node:fs";import{basename as uj,dirname as yd,isAbsolute as hj,join as Nr,relative as U8,resolve as vd}from"node:path";var E8=".corruption-observed.json";import{createHash as KRe,randomUUID as wit}from"node:crypto";import{existsSync as A8,lstatSync as x8,mkdirSync as GRe,readdirSync as JRe,readFileSync as ZRe,realpathSync as YRe,rmSync as XRe}from"node:fs";import{tmpdir as QRe}from"node:os";import{basename as eEe,dirname as T8,join as Eg,resolve as P8}from"node:path";_r();go();Si();var tEe=1,ui=class extends Error{static{a(this,"StationHomeLifecycleUnavailableError")}code="STATION_HOME_LIFECYCLE_UNAVAILABLE";constructor(t,n){super(`STATION_HOME_LIFECYCLE_UNAVAILABLE: ${t}`,n),this.name="StationHomeLifecycleUnavailableError"}},sk=class extends Error{static{a(this,"StationHomeActiveError")}code="STATION_HOME_ACTIVE";constructor(){super("STATION_HOME_ACTIVE: Station home has a live runtime"),this.name="StationHomeActiveError"}};function nEe(e){let t=P8(e),n=[];for(;!A8(t);){let c=T8(t);if(c===t)throw new ui("Station home has no canonical existing ancestor");n.unshift(eEe(t)),t=c}let o=P8(YRe(t),...n),r=process.platform==="win32"?o.toLowerCase():o,i=Eg(QRe(),"kontourai-station-home-lifecycle"),s=Eg(i,KRe("sha256").update(r).digest("hex"));return{base:i,root:s,leases:Eg(s,"runtime-leases"),lock:Eg(s,"mutation.lock")}}a(nEe,"coordinationPaths");function ij(e){if(!A8(e))try{GRe(e,{mode:448})}catch(n){if(!n||typeof n!="object"||!("code"in n)||n.code!=="EEXIST")throw n}let t=x8(e);if(!t.isDirectory()||t.isSymbolicLink())throw new ui("Station home lifecycle coordination path is unsafe")}a(ij,"ensureCoordinationDirectory");function rEe(e){ij(e.base),ij(e.root),ij(e.leases)}a(rEe,"prepareCoordination");function oEe(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===tEe&&typeof t.ownerId=="string"&&/^[0-9a-f-]{36}$/i.test(t.ownerId)&&Number.isInteger(t.pid)&&(t.pid??0)>0&&typeof t.birth=="string"&&t.birth.length>0}a(oEe,"isRuntimeLeaseRecord");function iEe(e){let t=x8(e);if(!t.isFile()||t.isSymbolicLink())throw new ui("Station home runtime lease is unsafe");let n;try{n=JSON.parse(ZRe(e,"utf8"))}catch(o){throw new ui("Station home runtime lease is unreadable",{cause:o})}if(!oEe(n))throw new ui("Station home runtime lease is malformed");return n}a(iEe,"readLease");function sEe(e){XRe(e,{force:!0}),ot(T8(e))}a(sEe,"removeLease");function aEe(e,t){let n=[];for(let o of JRe(e,{withFileTypes:!0})){if(!o.isFile()||o.isSymbolicLink()||!o.name.endsWith(".json"))throw new ui("Station home runtime lease directory contains an unsafe entry");let r=Eg(e,o.name),i=iEe(r),s=cz(i.pid,t);if(s.state==="dead"||s.state==="exact"&&s.identity.start!==i.birth){sEe(r);continue}n.push(i)}return n}a(aEe,"listLiveLeases");function Pg(e,t={}){let n=nEe(e);rEe(n);let o=(t.acquireMutationLock??On)(n.lock);try{if(aEe(n.leases,t.processIdentity).length>0)throw new sk;t.afterMaintenanceAcquired?.();let r=!1;return{release:a(()=>{r||(r=!0,o())},"release")}}catch(r){throw o(),r instanceof ui||r instanceof sk?r:new ui("Maintenance ownership could not be established",{cause:r})}}a(Pg,"acquireStationHomeMaintenanceLease");var Cit=256*1024,$it=4*1024*1024;var sj=Object.freeze({".station-home-schema.json":"state",".station-portable-data-root":"state",".review-evidence-coordination":"state",".storage-transactions":"state","action-operations.json":"state","agent-plugin-data":"state",agents:"state",analytics:"state","app-homes":"state",authentication:"state",browser:"state","checkpoint-restores.json":"state","checkpoint-retention.json":"state",config:"state","connection-smoke.json":"state","conversation-acknowledgements.json":"state","conversation-intent-summaries":"state","conversation-pull-request-links.json":"state",coordination:"state",data:"state","delegation-attempt-claims.json":"state",devices:"state",environments:"state",feedback:"state",imports:"state",integrations:"state",kits:"state",knowledge:"state","knowledge-index":"state","knowledge-stores":"state",layouts:"state","mcp-ui-render-grants.json":"state","notifications.json":"state","plugin-grants.json":"state","plugin-install-publication.mutation":"state",plugins:"state",pricing:"state","project-resource-shadow.json":"state",projects:"state",prompts:"state","proposed-changes.json":"state",runtime:"state","runtime-auth-health.json":"state",scheduler:"state",security:"state","session-summaries":"state","setup-imports.json":"state",skills:"state","station-home-recovery.json":"state","task-graph.json":"state","task-outputs":"state","terminal-history":"state","turn-checkpoints":"state","turn-checkpoints-evicted":"state",vectordb:"state",workflows:"state","workspace-home-role.json":"state",workspaces:"external","instances.json":"live",logs:"live",monitoring:"live",quarantine:"live",service:"live",tmp:"live"}),cEe=[".previous",".mutation"];function lEe(e){let t=sj[e];if(t)return t;for(let n of cEe)if(e.endsWith(n)){let o=sj[e.slice(0,-n.length)];if(o)return o}}a(lEe,"classifyStationHomeRoot");function aj(e){return lEe(e)==="live"}a(aj,"isLiveStationHomeRoot");var C8=Object.freeze([...Object.entries(sj).filter(([,e])=>e==="external").map(([e])=>Object.freeze([e])),Object.freeze(["browser","chromium"]),Object.freeze(["browser","profiles"])]);function $8(e,t){return t.length<=e.length&&t.every((n,o)=>e[o]===n)}a($8,"startsWith");function ak(e){return C8.some(t=>$8(e,t))}a(ak,"isExternalStationHomePath");function O8(e){return C8.some(t=>t.length>e.length&&$8(t,e))}a(O8,"containsExternalStationHomePath");var N8=Object.freeze([["data","orchestration.sqlite"],["scheduler","scheduler.sqlite"],["authentication","application-sessions.sqlite"],["authentication","local-accounts.sqlite"],["authentication","local-account-authority.sqlite"],["authentication","relay-enrollment.sqlite"],["security","project-membership.sqlite"],["knowledge-index","index.db"]]);var dj="station.home-backup/v1",pj="station.home-update-backup/v1",F8="station-home-backup.json",yEe="station-home-recovery.json";var vEe=1e5,bEe=20*1024*1024*1024,SEe=2*1024*1024*1024,wEe=25e4,kEe=1024*1024*1024*1024,IEe=256*1024*1024,_Ee=256*1024*1024,REe=4096,EEe=["-journal","-shm","-wal"],PEe=64*1024,AEe=64*1024*1024,Js=class extends Error{static{a(this,"StationHomeArchiveError")}code="STATION_HOME_ARCHIVE_UNAVAILABLE";constructor(t,n){super(`STATION_HOME_ARCHIVE_UNAVAILABLE: ${t}`,n),this.name="StationHomeArchiveError"}};function Te(e,t){throw new Js(e,{cause:t})}a(Te,"fail");function cj(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(cj,"isPlainRecord");function uk(e,t="home"){let n=t==="update",o=e.maxFiles??(n?wEe:vEe),r=e.maxBytes??(n?kEe:bEe),i=e.maxFileBytes??(n?r:SEe);return(!Number.isSafeInteger(o)||o<1||!Number.isSafeInteger(r)||r<1||!Number.isSafeInteger(i)||i<1||i>r)&&Te("archive limits are invalid"),{maxFiles:o,maxBytes:r,maxFileBytes:i}}a(uk,"canonicalLimits");function B8(e){if(e.length===0)return!1;if(aj(e[0]))return!0;let t=e.at(-1)??"";return t===E8||t.endsWith(".lock")||t.endsWith(".tmp")||EEe.some(n=>t.endsWith(n))}a(B8,"isTransient");function lk(e){(typeof e!="string"||e.length===0||e==="."||e===".."||e.includes("/")||e.includes("\0"))&&Te("backup manifest contains an unsafe path segment"),process.platform==="win32"&&e.includes("\\")&&Te("backup manifest contains an unsafe Windows path segment")}a(lk,"assertSegment");function Gs(e,t){for(let r of t)lk(r);let n=vd(e,...t),o=U8(e,n);return(o===""||o.startsWith("..")||hj(o))&&Te("backup manifest path escapes its root"),n}a(Gs,"pathFor");function V8(e){let t=ro(e);(!t.isFile()||t.isSymbolicLink())&&Te("archive file changed before hashing");let n=M8(e,Ic.O_RDONLY|(Ic.O_NOFOLLOW??0)),o=j8("sha256"),r=Buffer.allocUnsafe(PEe);try{let i=uEe(n);for((!i.isFile()||i.dev!==t.dev||i.ino!==t.ino||i.size!==t.size)&&Te("archive file changed while opening");;){let l=fEe(n,r,0,r.length,null);if(l===0)break;o.update(r.subarray(0,l))}let s=o.digest("hex"),c=ro(e);return(c.dev!==t.dev||c.ino!==t.ino||c.size!==t.size||c.mtimeMs!==t.mtimeMs||c.ctimeMs!==t.ctimeMs)&&Te("archive file changed while hashing"),s}finally{L8(n)}}a(V8,"hashFile");function dk(e,t,n=[]){for(let o of gj(e,{withFileTypes:!0})){if(!o.isDirectory())continue;o.isSymbolicLink()&&Te("archive staging contains a symlink");let r=[...n,o.name];t?.(r)||dk(Nr(e,o.name),t,r)}ot(e)}a(dk,"syncDirectoryTree");function Tg(e){let t=M8(e,Ic.O_RDONLY|(Ic.O_NOFOLLOW??0));try{dEe(t)}finally{L8(t)}}a(Tg,"syncFile");function xEe(e,t){return I8(e,{checkpoint:t}).kind==="ok"}a(xEe,"sqliteIsHealthy");var TEe=new Set(N8.map(e=>JSON.stringify(e)));function CEe(e,t){return(t.at(-1)??"").endsWith(".sqlite")||TEe.has(JSON.stringify(t))||hd(`${e}-wal`)}a(CEe,"isSqliteStoreEntry");function W8(e){(typeof e!="string"||e.length===0||e.length>REe||e.includes("\0"))&&Te("backup contains an unusable symbolic link target")}a(W8,"assertSymlinkTarget");function H8(e,t,n=!1){return yj(e,t,{checkpointSqlite:n,kind:"home"}).files}a(H8,"collectFiles");function yj(e,t,n){let o=n.checkpointSqlite??!1,r=n.kind==="update",i=[],s=[],c=0,l=a((u,d)=>{for(let p of gj(u,{withFileTypes:!0}).sort((f,m)=>f.name.localeCompare(m.name))){let f=[...d,p.name];if(B8(f)||r&&ak(f))continue;lk(p.name);let m=Nr(u,p.name),g=ro(m);if(g.isSymbolicLink()){r||Te(`Station home contains a symbolic link at ${f.join("/")}`);let h=pEe(m);W8(h),i.length+s.length>=t.maxFiles&&Te("Station home exceeds the archive file-count limit");let y=!1;try{y=gEe(m).isDirectory()}catch{}s.push({path:f,target:h,directory:y});continue}if(g.isDirectory()){l(m,f);continue}g.isFile()||Te(`Station home contains a non-regular entry at ${f.join("/")}`),CEe(m,f)&&(xEe(m,o)||Te(`SQLite integrity check failed at ${f.join("/")}`),g=ro(m),(!g.isFile()||g.isSymbolicLink())&&Te(`SQLite store changed type during check at ${f.join("/")}`)),g.size>t.maxFileBytes&&Te(`Station home file exceeds the archive limit at ${f.join("/")}`),c+=g.size,c>t.maxBytes&&Te("Station home exceeds the archive byte limit"),i.length+s.length>=t.maxFiles&&Te("Station home exceeds the archive file-count limit"),i.push({path:f,size:g.size,sha256:V8(m),mode:g.mode&511})}},"visit");return l(e,[]),{files:i,symlinks:s}}a(yj,"collectEntries");function $Ee(e,t,n="home"){cj(e)||Te("backup manifest must be an object");let o=n==="update";Object.keys(e).sort().join(",")!==["createdAt","files","homeSchemaVersion","schemaVersion","totalBytes",...o?["symlinks"]:[]].sort().join(",")&&Te("backup manifest contains unknown or missing fields"),(e.schemaVersion!==(o?pj:dj)||o&&!Array.isArray(e.symlinks)||!Number.isSafeInteger(e.homeSchemaVersion)||e.homeSchemaVersion<1||e.homeSchemaVersion>fn||typeof e.createdAt!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(e.createdAt)||new Date(e.createdAt).toISOString()!==e.createdAt||!Array.isArray(e.files)||!Number.isSafeInteger(e.totalBytes)||e.totalBytes<0)&&Te("backup manifest has an unsupported shape"),e.files.length>t.maxFiles&&Te("backup manifest exceeds the file-count limit");let r=new Set,i=0,s=e.files.map(f=>{(!cj(f)||Object.keys(f).sort().join(",")!==["mode","path","sha256","size"].sort().join(",")||!Array.isArray(f.path)||!Number.isSafeInteger(f.size)||f.size<0||f.size>t.maxFileBytes||typeof f.sha256!="string"||!/^[0-9a-f]{64}$/.test(f.sha256)||!Number.isSafeInteger(f.mode)||f.mode<0||f.mode>511)&&Te("backup manifest contains an invalid file entry");let m=f.path.map(h=>(lk(h),h)),g=JSON.stringify(m);return r.has(g)&&Te("backup manifest contains a duplicate path"),r.add(g),i+=f.size,i>t.maxBytes&&Te("backup manifest exceeds the byte limit"),{path:m,size:f.size,sha256:f.sha256,mode:f.mode}});if(i!==e.totalBytes&&Te("backup manifest total does not match its files"),!o)return{schemaVersion:dj,homeSchemaVersion:e.homeSchemaVersion,createdAt:e.createdAt,files:s,totalBytes:i};let c=e.symlinks;s.length+c.length>t.maxFiles&&Te("backup manifest exceeds the file-count limit");let l=c.map(f=>{(!cj(f)||Object.keys(f).sort().join(",")!=="directory,path,target"||!Array.isArray(f.path)||typeof f.directory!="boolean")&&Te("backup manifest contains an invalid symbolic link entry"),W8(f.target);let m=f.path.map(h=>(lk(h),h)),g=JSON.stringify(m);return r.has(g)&&Te("backup manifest contains a duplicate path"),r.add(g),{path:m,target:f.target,directory:f.directory}}),u=a(f=>f.normalize("NFC").toLowerCase(),"fold"),d=l.map(f=>f.path.map(u)),p=a((f,m)=>f.length>m.length&&m.every((g,h)=>u(f[h]??"")===g),"below");for(let f of[...s,...l])d.some(m=>p(f.path,m))&&Te("backup manifest places a path below a symbolic link");return{schemaVersion:pj,homeSchemaVersion:e.homeSchemaVersion,createdAt:e.createdAt,files:s,symlinks:l,totalBytes:i}}a($Ee,"strictManifest");function vj(e,t,n="home"){let o=vd(e),r=ro(o);(!r.isDirectory()||r.isSymbolicLink())&&Te("backup root must be a regular directory");let i=Nr(o,F8),s=ro(i);(!s.isFile()||s.isSymbolicLink()||s.size>(n==="update"?IEe:AEe))&&Te("backup manifest must be a regular file");let c;try{c=$Ee(JSON.parse(D8(i,"utf8")),t,n)}catch(f){if(f instanceof Js)throw f;Te("backup manifest is not valid JSON",f)}let l=Nr(o,"home"),u=H8(l,t,!1);u.length!==c.files.length&&Te("backup contents do not match the manifest");for(let f=0;f<u.length;f+=1){let m=c.files[f],g=u[f];(JSON.stringify(m.path)!==JSON.stringify(g.path)||m.size!==g.size||m.sha256!==g.sha256)&&Te("backup content hash does not match the manifest")}let d=c.files.find(f=>f.path.length===1&&f.path[0]===Qr);return d||Te("backup does not contain a Station home schema marker"),JSON.parse(D8(Gs(l,d.path),"utf8")).version!==c.homeSchemaVersion&&Te("backup schema marker does not match the manifest"),c}a(vj,"validateBackupDirectory");function bj(e,t){let n=U8(e,t);(n===""||!n.startsWith("..")&&!hj(n))&&Te("backup and staging paths must remain outside STATION_HOME")}a(bj,"assertExternalPath");function Ag(e,t){try{t?.()}catch(n){Te(`Station home must be inactive before ${e}; stop every instance and retry`,n)}}a(Ag,"assertInactive");function K8(e){return G8(e,"home")}a(K8,"createStationHomeBackup");function OEe(e,t,n=o=>mEe(o)){let o,r;try{let c=n(e);o=c.bavail*c.bsize,r=c.bsize>0?c.bsize:1}catch{return}let s=t.reduce((c,l)=>c+Math.ceil(l/r)*r,0)+_Ee;o<s&&Te(`not enough free space for the update backup: it needs ${s} bytes and ${o} are free`)}a(OEe,"assertFreeSpace");function G8(e,t){let n=uk(e,t),o=ri(e.homeDir);hd(o)||Te("Station home does not exist");let r=vd(e.outputDir);bj(o,r),hd(r)&&Te("backup output already exists");let i=yd(r),s=ro(i);(!s.isDirectory()||s.isSymbolicLink())&&Te("backup output parent must be a regular directory");let c=Nr(i,`.${uj(r)}.${process.pid}.${ck()}.tmp`),l;try{l=Pg(o,e.lifecycleHooks).release}catch(u){Te("Station home must be inactive before backup; stop every instance and retry",u)}try{Ag("backup",e.assertInactive);let u=Qu(o);u>fn&&Te("Station home schema is newer than this Station");let{files:d,symlinks:p}=yj(o,n,{checkpointSqlite:!0,kind:t});Ag("backup",e.assertInactive),t==="update"&&OEe(i,d.map(b=>b.size),e.statfs),kc(c,{mode:448});let f=ro(c);(!f.isDirectory()||f.isSymbolicLink())&&Te("backup staging root is unsafe");let m=Nr(c,"home");kc(m,{mode:448});for(let b of d){let S=Gs(o,b.path),w=Gs(m,b.path);kc(yd(w),{recursive:!0,mode:448}),(e.copyFile??((k,_)=>mj(k,_,Ic.COPYFILE_EXCL)))(S,w),process.platform!=="win32"&&fj(w,b.mode);let I=ro(w);(!I.isFile()||I.isSymbolicLink()||I.size!==b.size||V8(w)!==b.sha256)&&Te(`Station home changed during backup at ${b.path.join("/")}`),Tg(w)}let g=(e.now??(()=>new Date().toISOString()))();Number.isNaN(Date.parse(g))&&Te("backup clock is invalid");let h=d.reduce((b,S)=>b+S.size,0),y=t==="update"?{schemaVersion:pj,homeSchemaVersion:u,createdAt:g,files:d,symlinks:p,totalBytes:h}:{schemaVersion:dj,homeSchemaVersion:u,createdAt:g,files:d,totalBytes:h},v=Nr(c,F8);q8(v,`${JSON.stringify(y,null,2)}
292
+ ${o}`)}a(oj,"explicitCorruption");function y8(e,t={}){try{if(t.checkpoint){let o=e.prepare("PRAGMA wal_checkpoint(TRUNCATE)").all(),r=o.length===1?o[0]:void 0;if(!r||typeof r!="object"||Array.isArray(r)||r.busy!==0||!Number.isSafeInteger(r.log)||!Number.isSafeInteger(r.checkpointed)||r.log!==r.checkpointed)return{kind:"unavailable",cause:new Error("SQLite checkpoint did not fully drain WAL")}}let n=e.prepare("PRAGMA quick_check").all();return n.length!==1||typeof n[0]!="object"||n[0]===null||Array.isArray(n[0])||Object.values(n[0]).length!==1||Object.values(n[0])[0]!=="ok"?{kind:"corrupt"}:{kind:"ok"}}catch(n){return oj(n)?{kind:"corrupt"}:{kind:"unavailable",cause:n}}}a(y8,"checkSqliteIntegrity");var qRe=["data","orchestration.sqlite"],URe=["scheduler","scheduler.sqlite"];function FRe(e){return b8(e,...qRe)}a(FRe,"orchestrationStorePath");function BRe(e){return b8(e,...URe)}a(BRe,"schedulerStorePath");function S8(e){return[FRe(e),BRe(e)]}a(S8,"stationHomeStorePaths");var dit=Object.freeze(["ok","corrupt","unavailable","absent"]),ik=Object.freeze({ok:0,corrupt:1,unavailable:2,usage:3});function VRe(e){let t,n,o=a(r=>{try{return r()}catch(i){throw t=i,i}},"remember");return{handle:{exec:a(r=>o(()=>e.exec(r)),"exec"),prepare:a(r=>{let i=o(()=>e.prepare(r));return{all:a(()=>(n=o(()=>i.all()),n),"all")}},"prepare")},lastError:a(()=>t,"lastError"),lastRows:a(()=>n,"lastRows")}}a(VRe,"recordingHandle");var w8=500;function WRe(e){let t=e?.[0];if(typeof t!="object"||t===null||Array.isArray(t))return;let n=Object.values(t)[0];if(!(typeof n!="string"||n==="ok"))return n.slice(0,w8)}a(WRe,"quickCheckReport");function HRe(e){let t=e;return typeof t?.errcode=="number"?t.errcode:void 0}a(HRe,"errcodeOf");function v8(e){let t=HRe(e);return{...t===void 0?{}:{errcode:t},...e instanceof Error?{detail:e.message.slice(0,w8)}:{}}}a(v8,"diagnostics");function k8(e,t){let n;try{n=new zRe(e,{timeout:5e3,readOnly:!t});let o=VRe(n),r=y8(o.handle,{checkpoint:t}),i=WRe(o.lastRows());return{outcome:r,lastError:o.lastError(),...i===void 0?{}:{report:i}}}catch(o){return{outcome:oj(o)?{kind:"corrupt"}:{kind:"unavailable",cause:o},lastError:o}}finally{try{n?.close()}catch{}}}a(k8,"probeStore");function I8(e,t={}){return k8(e,t.checkpoint===!0).outcome}a(I8,"openAndCheckSqliteIntegrity");function _8(e){let t=performance.now();try{MRe(e)}catch(s){if(s?.code==="ENOENT"){let c=!1;try{c=LRe(e).isSymbolicLink()}catch{}return c?{databasePath:e,verdict:"unavailable",durationMs:0,detail:"store path is a symbolic link to a missing target"}:{databasePath:e,verdict:"absent",durationMs:0}}}let{outcome:n,lastError:o,report:r}=k8(e,!1),i=Math.round(performance.now()-t);return n.kind==="ok"?{databasePath:e,verdict:"ok",durationMs:i}:n.kind==="corrupt"?{databasePath:e,verdict:"corrupt",durationMs:i,...v8(o),...r===void 0?{}:{detail:r}}:{databasePath:e,verdict:"unavailable",durationMs:i,...v8(n.cause)}}a(_8,"verifySqliteStore");function R8(e){return e.length===0||e.every(t=>t.verdict==="absent")?ik.usage:e.some(t=>t.verdict==="corrupt")?ik.corrupt:e.some(t=>t.verdict==="unavailable")?ik.unavailable:ik.ok}a(R8,"storeIntegrityExitCode");_r();import{createHash as j8,randomUUID as ck}from"node:crypto";import{chmodSync as fj,closeSync as L8,constants as Ic,copyFileSync as mj,existsSync as hd,fstatSync as uEe,fsyncSync as dEe,lstatSync as ro,mkdirSync as kc,openSync as M8,readdirSync as gj,readFileSync as D8,readlinkSync as pEe,readSync as fEe,realpathSync as z8,renameSync as gd,rmSync as xg,statfsSync as mEe,statSync as gEe,symlinkSync as hEe,writeFileSync as q8}from"node:fs";import{basename as uj,dirname as yd,isAbsolute as hj,join as Nr,relative as U8,resolve as vd}from"node:path";var E8=".corruption-observed.json";import{createHash as KRe,randomUUID as wit}from"node:crypto";import{existsSync as A8,lstatSync as x8,mkdirSync as GRe,readdirSync as JRe,readFileSync as ZRe,realpathSync as YRe,rmSync as XRe}from"node:fs";import{tmpdir as QRe}from"node:os";import{basename as eEe,dirname as T8,join as Eg,resolve as P8}from"node:path";_r();go();Si();var tEe=1,ui=class extends Error{static{a(this,"StationHomeLifecycleUnavailableError")}code="STATION_HOME_LIFECYCLE_UNAVAILABLE";constructor(t,n){super(`STATION_HOME_LIFECYCLE_UNAVAILABLE: ${t}`,n),this.name="StationHomeLifecycleUnavailableError"}},sk=class extends Error{static{a(this,"StationHomeActiveError")}code="STATION_HOME_ACTIVE";constructor(){super("STATION_HOME_ACTIVE: Station home has a live runtime"),this.name="StationHomeActiveError"}};function nEe(e){let t=P8(e),n=[];for(;!A8(t);){let c=T8(t);if(c===t)throw new ui("Station home has no canonical existing ancestor");n.unshift(eEe(t)),t=c}let o=P8(YRe(t),...n),r=process.platform==="win32"?o.toLowerCase():o,i=Eg(QRe(),"kontourai-station-home-lifecycle"),s=Eg(i,KRe("sha256").update(r).digest("hex"));return{base:i,root:s,leases:Eg(s,"runtime-leases"),lock:Eg(s,"mutation.lock")}}a(nEe,"coordinationPaths");function ij(e){if(!A8(e))try{GRe(e,{mode:448})}catch(n){if(!n||typeof n!="object"||!("code"in n)||n.code!=="EEXIST")throw n}let t=x8(e);if(!t.isDirectory()||t.isSymbolicLink())throw new ui("Station home lifecycle coordination path is unsafe")}a(ij,"ensureCoordinationDirectory");function rEe(e){ij(e.base),ij(e.root),ij(e.leases)}a(rEe,"prepareCoordination");function oEe(e){if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e;return t.version===tEe&&typeof t.ownerId=="string"&&/^[0-9a-f-]{36}$/i.test(t.ownerId)&&Number.isInteger(t.pid)&&(t.pid??0)>0&&typeof t.birth=="string"&&t.birth.length>0}a(oEe,"isRuntimeLeaseRecord");function iEe(e){let t=x8(e);if(!t.isFile()||t.isSymbolicLink())throw new ui("Station home runtime lease is unsafe");let n;try{n=JSON.parse(ZRe(e,"utf8"))}catch(o){throw new ui("Station home runtime lease is unreadable",{cause:o})}if(!oEe(n))throw new ui("Station home runtime lease is malformed");return n}a(iEe,"readLease");function sEe(e){XRe(e,{force:!0}),ot(T8(e))}a(sEe,"removeLease");function aEe(e,t){let n=[];for(let o of JRe(e,{withFileTypes:!0})){if(!o.isFile()||o.isSymbolicLink()||!o.name.endsWith(".json"))throw new ui("Station home runtime lease directory contains an unsafe entry");let r=Eg(e,o.name),i=iEe(r),s=cz(i.pid,t);if(s.state==="dead"||s.state==="exact"&&s.identity.start!==i.birth){sEe(r);continue}n.push(i)}return n}a(aEe,"listLiveLeases");function Pg(e,t={}){let n=nEe(e);rEe(n);let o=(t.acquireMutationLock??On)(n.lock);try{if(aEe(n.leases,t.processIdentity).length>0)throw new sk;t.afterMaintenanceAcquired?.();let r=!1;return{release:a(()=>{r||(r=!0,o())},"release")}}catch(r){throw o(),r instanceof ui||r instanceof sk?r:new ui("Maintenance ownership could not be established",{cause:r})}}a(Pg,"acquireStationHomeMaintenanceLease");var Cit=256*1024,$it=4*1024*1024;var sj=Object.freeze({".station-home-schema.json":"state",".station-portable-data-root":"state",".review-evidence-coordination":"state",".storage-transactions":"state","action-operations.json":"state","agent-plugin-data":"state",agents:"state",analytics:"state","app-homes":"state",authentication:"state",browser:"state","checkpoint-restores.json":"state","checkpoint-retention.json":"state",config:"state","connection-smoke.json":"state","conversation-acknowledgements.json":"state","conversation-intent-summaries":"state","conversation-pull-request-links.json":"state",coordination:"state",data:"state","delegation-attempt-claims.json":"state",devices:"state",environments:"state",feedback:"state",imports:"state",integrations:"state",kits:"state",knowledge:"state","knowledge-index":"state","knowledge-stores":"state",layouts:"state","mcp-ui-render-grants.json":"state","notifications.json":"state","plugin-grants.json":"state","plugin-install-publication.mutation":"state",plugins:"state",pricing:"state","project-resource-shadow.json":"state",projects:"state",prompts:"state","proposed-changes.json":"state",runtime:"state","runtime-auth-health.json":"state",scheduler:"state",security:"state","session-summaries":"state","setup-imports.json":"state",skills:"state","station-home-recovery.json":"state","task-graph.json":"state","task-outputs":"state","terminal-history":"state","turn-checkpoints":"state","turn-checkpoints-evicted":"state",vectordb:"state",workflows:"state","workspace-home-role.json":"state",workspaces:"external","instances.json":"live",logs:"live",monitoring:"live",quarantine:"live",service:"live",tmp:"live"}),cEe=[".previous",".mutation"];function lEe(e){let t=sj[e];if(t)return t;for(let n of cEe)if(e.endsWith(n)){let o=sj[e.slice(0,-n.length)];if(o)return o}}a(lEe,"classifyStationHomeRoot");function aj(e){return lEe(e)==="live"}a(aj,"isLiveStationHomeRoot");var C8=Object.freeze([...Object.entries(sj).filter(([,e])=>e==="external").map(([e])=>Object.freeze([e])),Object.freeze(["browser","chromium"]),Object.freeze(["browser","profiles"])]);function $8(e,t){return t.length<=e.length&&t.every((n,o)=>e[o]===n)}a($8,"startsWith");function ak(e){return C8.some(t=>$8(e,t))}a(ak,"isExternalStationHomePath");function O8(e){return C8.some(t=>t.length>e.length&&$8(t,e))}a(O8,"containsExternalStationHomePath");var N8=Object.freeze([["data","orchestration.sqlite"],["scheduler","scheduler.sqlite"],["authentication","application-sessions.sqlite"],["authentication","local-accounts.sqlite"],["authentication","local-account-authority.sqlite"],["authentication","relay-enrollment.sqlite"],["security","project-membership.sqlite"],["security","native-device-proof-replay.sqlite"],["knowledge-index","index.db"]]);var dj="station.home-backup/v1",pj="station.home-update-backup/v1",F8="station-home-backup.json",yEe="station-home-recovery.json";var vEe=1e5,bEe=20*1024*1024*1024,SEe=2*1024*1024*1024,wEe=25e4,kEe=1024*1024*1024*1024,IEe=256*1024*1024,_Ee=256*1024*1024,REe=4096,EEe=["-journal","-shm","-wal"],PEe=64*1024,AEe=64*1024*1024,Js=class extends Error{static{a(this,"StationHomeArchiveError")}code="STATION_HOME_ARCHIVE_UNAVAILABLE";constructor(t,n){super(`STATION_HOME_ARCHIVE_UNAVAILABLE: ${t}`,n),this.name="StationHomeArchiveError"}};function Te(e,t){throw new Js(e,{cause:t})}a(Te,"fail");function cj(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(cj,"isPlainRecord");function uk(e,t="home"){let n=t==="update",o=e.maxFiles??(n?wEe:vEe),r=e.maxBytes??(n?kEe:bEe),i=e.maxFileBytes??(n?r:SEe);return(!Number.isSafeInteger(o)||o<1||!Number.isSafeInteger(r)||r<1||!Number.isSafeInteger(i)||i<1||i>r)&&Te("archive limits are invalid"),{maxFiles:o,maxBytes:r,maxFileBytes:i}}a(uk,"canonicalLimits");function B8(e){if(e.length===0)return!1;if(aj(e[0]))return!0;let t=e.at(-1)??"";return t===E8||t.endsWith(".lock")||t.endsWith(".tmp")||EEe.some(n=>t.endsWith(n))}a(B8,"isTransient");function lk(e){(typeof e!="string"||e.length===0||e==="."||e===".."||e.includes("/")||e.includes("\0"))&&Te("backup manifest contains an unsafe path segment"),process.platform==="win32"&&e.includes("\\")&&Te("backup manifest contains an unsafe Windows path segment")}a(lk,"assertSegment");function Gs(e,t){for(let r of t)lk(r);let n=vd(e,...t),o=U8(e,n);return(o===""||o.startsWith("..")||hj(o))&&Te("backup manifest path escapes its root"),n}a(Gs,"pathFor");function V8(e){let t=ro(e);(!t.isFile()||t.isSymbolicLink())&&Te("archive file changed before hashing");let n=M8(e,Ic.O_RDONLY|(Ic.O_NOFOLLOW??0)),o=j8("sha256"),r=Buffer.allocUnsafe(PEe);try{let i=uEe(n);for((!i.isFile()||i.dev!==t.dev||i.ino!==t.ino||i.size!==t.size)&&Te("archive file changed while opening");;){let l=fEe(n,r,0,r.length,null);if(l===0)break;o.update(r.subarray(0,l))}let s=o.digest("hex"),c=ro(e);return(c.dev!==t.dev||c.ino!==t.ino||c.size!==t.size||c.mtimeMs!==t.mtimeMs||c.ctimeMs!==t.ctimeMs)&&Te("archive file changed while hashing"),s}finally{L8(n)}}a(V8,"hashFile");function dk(e,t,n=[]){for(let o of gj(e,{withFileTypes:!0})){if(!o.isDirectory())continue;o.isSymbolicLink()&&Te("archive staging contains a symlink");let r=[...n,o.name];t?.(r)||dk(Nr(e,o.name),t,r)}ot(e)}a(dk,"syncDirectoryTree");function Tg(e){let t=M8(e,Ic.O_RDONLY|(Ic.O_NOFOLLOW??0));try{dEe(t)}finally{L8(t)}}a(Tg,"syncFile");function xEe(e,t){return I8(e,{checkpoint:t}).kind==="ok"}a(xEe,"sqliteIsHealthy");var TEe=new Set(N8.map(e=>JSON.stringify(e)));function CEe(e,t){return(t.at(-1)??"").endsWith(".sqlite")||TEe.has(JSON.stringify(t))||hd(`${e}-wal`)}a(CEe,"isSqliteStoreEntry");function W8(e){(typeof e!="string"||e.length===0||e.length>REe||e.includes("\0"))&&Te("backup contains an unusable symbolic link target")}a(W8,"assertSymlinkTarget");function H8(e,t,n=!1){return yj(e,t,{checkpointSqlite:n,kind:"home"}).files}a(H8,"collectFiles");function yj(e,t,n){let o=n.checkpointSqlite??!1,r=n.kind==="update",i=[],s=[],c=0,l=a((u,d)=>{for(let p of gj(u,{withFileTypes:!0}).sort((f,m)=>f.name.localeCompare(m.name))){let f=[...d,p.name];if(B8(f)||r&&ak(f))continue;lk(p.name);let m=Nr(u,p.name),g=ro(m);if(g.isSymbolicLink()){r||Te(`Station home contains a symbolic link at ${f.join("/")}`);let h=pEe(m);W8(h),i.length+s.length>=t.maxFiles&&Te("Station home exceeds the archive file-count limit");let y=!1;try{y=gEe(m).isDirectory()}catch{}s.push({path:f,target:h,directory:y});continue}if(g.isDirectory()){l(m,f);continue}g.isFile()||Te(`Station home contains a non-regular entry at ${f.join("/")}`),CEe(m,f)&&(xEe(m,o)||Te(`SQLite integrity check failed at ${f.join("/")}`),g=ro(m),(!g.isFile()||g.isSymbolicLink())&&Te(`SQLite store changed type during check at ${f.join("/")}`)),g.size>t.maxFileBytes&&Te(`Station home file exceeds the archive limit at ${f.join("/")}`),c+=g.size,c>t.maxBytes&&Te("Station home exceeds the archive byte limit"),i.length+s.length>=t.maxFiles&&Te("Station home exceeds the archive file-count limit"),i.push({path:f,size:g.size,sha256:V8(m),mode:g.mode&511})}},"visit");return l(e,[]),{files:i,symlinks:s}}a(yj,"collectEntries");function $Ee(e,t,n="home"){cj(e)||Te("backup manifest must be an object");let o=n==="update";Object.keys(e).sort().join(",")!==["createdAt","files","homeSchemaVersion","schemaVersion","totalBytes",...o?["symlinks"]:[]].sort().join(",")&&Te("backup manifest contains unknown or missing fields"),(e.schemaVersion!==(o?pj:dj)||o&&!Array.isArray(e.symlinks)||!Number.isSafeInteger(e.homeSchemaVersion)||e.homeSchemaVersion<1||e.homeSchemaVersion>fn||typeof e.createdAt!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(e.createdAt)||new Date(e.createdAt).toISOString()!==e.createdAt||!Array.isArray(e.files)||!Number.isSafeInteger(e.totalBytes)||e.totalBytes<0)&&Te("backup manifest has an unsupported shape"),e.files.length>t.maxFiles&&Te("backup manifest exceeds the file-count limit");let r=new Set,i=0,s=e.files.map(f=>{(!cj(f)||Object.keys(f).sort().join(",")!==["mode","path","sha256","size"].sort().join(",")||!Array.isArray(f.path)||!Number.isSafeInteger(f.size)||f.size<0||f.size>t.maxFileBytes||typeof f.sha256!="string"||!/^[0-9a-f]{64}$/.test(f.sha256)||!Number.isSafeInteger(f.mode)||f.mode<0||f.mode>511)&&Te("backup manifest contains an invalid file entry");let m=f.path.map(h=>(lk(h),h)),g=JSON.stringify(m);return r.has(g)&&Te("backup manifest contains a duplicate path"),r.add(g),i+=f.size,i>t.maxBytes&&Te("backup manifest exceeds the byte limit"),{path:m,size:f.size,sha256:f.sha256,mode:f.mode}});if(i!==e.totalBytes&&Te("backup manifest total does not match its files"),!o)return{schemaVersion:dj,homeSchemaVersion:e.homeSchemaVersion,createdAt:e.createdAt,files:s,totalBytes:i};let c=e.symlinks;s.length+c.length>t.maxFiles&&Te("backup manifest exceeds the file-count limit");let l=c.map(f=>{(!cj(f)||Object.keys(f).sort().join(",")!=="directory,path,target"||!Array.isArray(f.path)||typeof f.directory!="boolean")&&Te("backup manifest contains an invalid symbolic link entry"),W8(f.target);let m=f.path.map(h=>(lk(h),h)),g=JSON.stringify(m);return r.has(g)&&Te("backup manifest contains a duplicate path"),r.add(g),{path:m,target:f.target,directory:f.directory}}),u=a(f=>f.normalize("NFC").toLowerCase(),"fold"),d=l.map(f=>f.path.map(u)),p=a((f,m)=>f.length>m.length&&m.every((g,h)=>u(f[h]??"")===g),"below");for(let f of[...s,...l])d.some(m=>p(f.path,m))&&Te("backup manifest places a path below a symbolic link");return{schemaVersion:pj,homeSchemaVersion:e.homeSchemaVersion,createdAt:e.createdAt,files:s,symlinks:l,totalBytes:i}}a($Ee,"strictManifest");function vj(e,t,n="home"){let o=vd(e),r=ro(o);(!r.isDirectory()||r.isSymbolicLink())&&Te("backup root must be a regular directory");let i=Nr(o,F8),s=ro(i);(!s.isFile()||s.isSymbolicLink()||s.size>(n==="update"?IEe:AEe))&&Te("backup manifest must be a regular file");let c;try{c=$Ee(JSON.parse(D8(i,"utf8")),t,n)}catch(f){if(f instanceof Js)throw f;Te("backup manifest is not valid JSON",f)}let l=Nr(o,"home"),u=H8(l,t,!1);u.length!==c.files.length&&Te("backup contents do not match the manifest");for(let f=0;f<u.length;f+=1){let m=c.files[f],g=u[f];(JSON.stringify(m.path)!==JSON.stringify(g.path)||m.size!==g.size||m.sha256!==g.sha256)&&Te("backup content hash does not match the manifest")}let d=c.files.find(f=>f.path.length===1&&f.path[0]===Qr);return d||Te("backup does not contain a Station home schema marker"),JSON.parse(D8(Gs(l,d.path),"utf8")).version!==c.homeSchemaVersion&&Te("backup schema marker does not match the manifest"),c}a(vj,"validateBackupDirectory");function bj(e,t){let n=U8(e,t);(n===""||!n.startsWith("..")&&!hj(n))&&Te("backup and staging paths must remain outside STATION_HOME")}a(bj,"assertExternalPath");function Ag(e,t){try{t?.()}catch(n){Te(`Station home must be inactive before ${e}; stop every instance and retry`,n)}}a(Ag,"assertInactive");function K8(e){return G8(e,"home")}a(K8,"createStationHomeBackup");function OEe(e,t,n=o=>mEe(o)){let o,r;try{let c=n(e);o=c.bavail*c.bsize,r=c.bsize>0?c.bsize:1}catch{return}let s=t.reduce((c,l)=>c+Math.ceil(l/r)*r,0)+_Ee;o<s&&Te(`not enough free space for the update backup: it needs ${s} bytes and ${o} are free`)}a(OEe,"assertFreeSpace");function G8(e,t){let n=uk(e,t),o=ri(e.homeDir);hd(o)||Te("Station home does not exist");let r=vd(e.outputDir);bj(o,r),hd(r)&&Te("backup output already exists");let i=yd(r),s=ro(i);(!s.isDirectory()||s.isSymbolicLink())&&Te("backup output parent must be a regular directory");let c=Nr(i,`.${uj(r)}.${process.pid}.${ck()}.tmp`),l;try{l=Pg(o,e.lifecycleHooks).release}catch(u){Te("Station home must be inactive before backup; stop every instance and retry",u)}try{Ag("backup",e.assertInactive);let u=Qu(o);u>fn&&Te("Station home schema is newer than this Station");let{files:d,symlinks:p}=yj(o,n,{checkpointSqlite:!0,kind:t});Ag("backup",e.assertInactive),t==="update"&&OEe(i,d.map(b=>b.size),e.statfs),kc(c,{mode:448});let f=ro(c);(!f.isDirectory()||f.isSymbolicLink())&&Te("backup staging root is unsafe");let m=Nr(c,"home");kc(m,{mode:448});for(let b of d){let S=Gs(o,b.path),w=Gs(m,b.path);kc(yd(w),{recursive:!0,mode:448}),(e.copyFile??((k,_)=>mj(k,_,Ic.COPYFILE_EXCL)))(S,w),process.platform!=="win32"&&fj(w,b.mode);let I=ro(w);(!I.isFile()||I.isSymbolicLink()||I.size!==b.size||V8(w)!==b.sha256)&&Te(`Station home changed during backup at ${b.path.join("/")}`),Tg(w)}let g=(e.now??(()=>new Date().toISOString()))();Number.isNaN(Date.parse(g))&&Te("backup clock is invalid");let h=d.reduce((b,S)=>b+S.size,0),y=t==="update"?{schemaVersion:pj,homeSchemaVersion:u,createdAt:g,files:d,symlinks:p,totalBytes:h}:{schemaVersion:dj,homeSchemaVersion:u,createdAt:g,files:d,totalBytes:h},v=Nr(c,F8);q8(v,`${JSON.stringify(y,null,2)}
293
293
  `,{encoding:"utf8",mode:384,flag:"wx"}),Tg(v),dk(c),Ag("backup",e.assertInactive),gd(c,r);try{e.afterPublish?.(),ot(i)}catch(b){try{xg(r,{recursive:!0,force:!0}),ot(i)}catch(S){throw new AggregateError([b,S],"Backup publication and rollback both failed.")}throw b}return{backupDir:r,manifest:y}}catch(u){if(u instanceof Js)throw u;Te("backup could not be created",u)}finally{xg(c,{recursive:!0,force:!0}),l()}}a(G8,"createBackup");function J8(e){e.confirm||Te("restore requires explicit confirmation");let t=uk(e),n=ri(e.homeDir),o=z8(vd(e.backupDir));bj(n,o);let r=vj(o,t),i=yd(n),s=Nr(i,`.${uj(n)}.${process.pid}.${ck()}.restore.tmp`),c=Nr(i,`.${uj(n)}.pre-restore.${new Date().toISOString().replace(/[:.]/g,"-")}`),l;try{l=Pg(n,e.lifecycleHooks).release}catch(p){Te("Station home must be inactive before restore; stop every instance and retry",p)}let u={schemaVersion:"station.home-recovery/v1",kind:"recovered-from-copy",recoveryId:ck(),recoveredAt:new Date().toISOString(),snapshotCreatedAt:r.createdAt,backupManifestSha256:j8("sha256").update(JSON.stringify(r)).digest("hex"),authorityTransferred:!1},d=!1;try{Ag("restore",e.assertInactive);let p=Nr(o,"home");kc(s,{mode:448});let f=ro(s);(!f.isDirectory()||f.isSymbolicLink())&&Te("restore staging root is unsafe");for(let y of r.files){let v=Gs(p,y.path),b=Gs(s,y.path);kc(yd(b),{recursive:!0,mode:448}),mj(v,b,Ic.COPYFILE_EXCL),process.platform!=="win32"&&fj(b,y.mode),Tg(b)}let m=H8(s,t,!1);(m.length!==r.files.length||m.some((y,v)=>{let b=r.files[v];return!b||JSON.stringify(y.path)!==JSON.stringify(b.path)||y.sha256!==b.sha256}))&&Te("staged restore does not match the validated backup");let g=Nr(s,yEe),h=`${g}.${ck()}.tmp`;q8(h,`${JSON.stringify(u)}
294
294
  `,{flag:"wx",mode:384}),Tg(h),gd(h,g),dk(s),e.beforePublish?.(),Ag("restore",e.assertInactive),hd(n)&&(hd(c)&&Te("restore recovery path already exists"),gd(n,c),d=!0);try{gd(s,n)}catch(y){throw d&&gd(c,n),d=!1,y}try{e.afterPublish?.(),oi(n),ot(i)}catch(y){try{xg(n,{recursive:!0,force:!0}),d&&gd(c,n),ot(i),d=!1}catch(v){throw new AggregateError([y,v],"Home restore and rollback both failed.")}throw y}return{recovery:u,homeDir:n,...d?{previousHome:c}:{},manifest:r}}catch(p){if(p instanceof Js)throw p;Te("backup could not be restored",p)}finally{xg(s,{recursive:!0,force:!0}),l()}}a(J8,"restoreStationHomeBackup");function Z8(e){let t=vd(e.backupDir);if(hd(t)){let n=ri(e.homeDir),o;try{o=Pg(n,e.lifecycleHooks).release}catch(r){Te("Station home must be inactive before backup; stop every instance and retry",r)}try{return{backupDir:t,manifest:vj(t,uk(e,"update"),"update"),reused:!0}}catch(r){if(r instanceof Js)throw r;Te("update backup could not be validated",r)}finally{o()}}return{...G8({...e,outputDir:t},"update"),reused:!1}}a(Z8,"createStationHomeUpdateBackup");function lj(e){return B8(e)||ak(e)}a(lj,"outsideUpdate");function Y8(e,t){for(let n of gj(e)){let o=[...t,n];if(t.length===0&&aj(n)||ak(o))continue;let r=Nr(e,n);if(O8(o)){let i=ro(r);if(i.isDirectory()&&!i.isSymbolicLink()){Y8(r,o);continue}}xg(r,{recursive:!0,force:!0})}}a(Y8,"removeUpdateState");function NEe(e){if(process.platform==="win32")return e.directory?hj(e.target)?"junction":"dir":"file"}a(NEe,"symlinkType");function X8(e){let t=uk(e,"update"),n=ri(e.homeDir),o=z8(vd(e.backupDir));bj(n,o);let r=vj(o,t,"update"),i=r.files.filter(l=>!lj(l.path)),s=(r.symlinks??[]).filter(l=>!lj(l.path)),c;try{c=Pg(n,e.lifecycleHooks).release}catch(l){Te("Station home must be inactive before restore; stop every instance and retry",l)}try{let l=ro(n);(!l.isDirectory()||l.isSymbolicLink())&&Te("Station home must be a regular directory"),Y8(n,[]),ot(n),e.afterRemove?.();let u=Nr(o,"home");for(let p of i){let f=Gs(u,p.path),m=Gs(n,p.path);kc(yd(m),{recursive:!0,mode:448}),mj(f,m,Ic.COPYFILE_EXCL),process.platform!=="win32"&&fj(m,p.mode),Tg(m)}for(let p of s){let f=Gs(n,p.path);kc(yd(f),{recursive:!0,mode:448}),hEe(p.target,f,NEe(p))}let d=yj(n,t,{kind:"update"});return(d.files.length!==i.length||d.files.some((p,f)=>{let m=i[f];return!m||JSON.stringify(p.path)!==JSON.stringify(m.path)||p.sha256!==m.sha256})||JSON.stringify(d.symlinks.map(p=>[p.path,p.target]))!==JSON.stringify(s.map(p=>[p.path,p.target])))&&Te("restored home does not match the validated backup"),dk(n,lj),{manifest:r}}catch(l){if(l instanceof Js)throw l;Te("update backup could not be restored",l)}finally{c()}}a(X8,"restoreStationHomeUpdateBackup");$i();import{createHash as DEe}from"node:crypto";import{constants as Sj,lstatSync as wj,opendirSync as jEe}from"node:fs";import{dirname as Q8,join as LEe,parse as eY,resolve as MEe}from"node:path";var tY={schema:{disposition:"schema-observation",fields:["version"]},app:{disposition:"identity-review",fields:["agentConnections (keys only)","builtinAgentEngineConnectionId"]},registry:{disposition:"identity-review",fields:["version","revision","engineConnections","defaultAgents","declinedEngineConnections"]},agents:{disposition:"identity-review",fields:["execution.agentConnectionId","execution.credentialProfileRef"]},history:{disposition:"history-not-resume-authority",fields:[]},projects:{disposition:"bindings-require-review",fields:[]},layouts:{disposition:"bindings-require-review",fields:[]},grants:{disposition:"consent-requires-revalidation",fields:[]},credentials:{disposition:"opaque-account-storage",fields:[]},scheduler:{disposition:"do-not-reactivate-jobs",fields:[]},runtime:{disposition:"not-portable-ownership",fields:["instances.pid (existence only)"]},evidence:{disposition:"retain-original-evidence",fields:[]},plugins:{disposition:"do-not-load-code",fields:[]},unknown:{disposition:"unclassified",fields:[]}},kj={entries:4096,fileBytes:256*1024,totalReadBytes:4*1024*1024,depth:6},bd=class extends Error{constructor(n){super(n);this.code=n}code;static{a(this,"Refusal")}};function Kt(e){throw new bd(e)}a(Kt,"fail");function Gi(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}a(Gi,"record");function Zs(e){return xH(e)!==void 0}a(Zs,"clean");function zEe(e,t){return e.dev===t.dev&&e.ino===t.ino&&e.mode===t.mode&&e.nlink===t.nlink&&e.size===t.size&&e.mtimeMs===t.mtimeMs&&e.ctimeMs===t.ctimeMs}a(zEe,"same");function nY(e){return DEe("sha256").update(e).digest("hex")}a(nY,"digest");function rY(e){let t={schema:"station.home-recovery-plan/v1",sourceSchemaVersion:null,targetSchemaVersion:fn,inspection:"observed",applyAllowed:!1,migration:"not-implemented",snapshot:"non-atomic-observation",codes:[],stores:Object.keys(tY).map(d=>({store:d,disposition:tY[d].disposition,entries:0,inspectedRecords:0})),identities:{builtinSelection:"not-inspected",connections:0,exactReferences:0,unresolvedReferences:0,differingRuntimeSelectors:0,agentCredentialReferences:0},owners:{recordedInstances:0,pidPresent:0,pidAbsent:0,unknown:0,exclusion:"not-proven",modernLeases:"not-inspected",legacyProfiles:"not-inspected"},requiredDecisions:["Confirm exact Engine, Agent and account mappings; never infer aliases.","Keep history separate from session resume and scheduled execution authority.","Revalidate exact principal and content bindings before carrying consent.","Retain original evidence; approve a separately reviewed backup and recovery transaction.","Prove modern and legacy owner exclusion again before any future mutation."]},n=new Set,o=[],r=new Set,i=new Map,s=!1,c,l=a(d=>{n.add(d)},"add"),u=a(d=>t.stores.find(p=>p.store===d),"storeRow");try{let d={...kj,...e.limits};for(let A of Object.keys(kj))(!Number.isSafeInteger(d[A])||d[A]<1||d[A]>kj[A])&&Kt("limit-exceeded");(typeof e.homeDir!="string"||!e.homeDir.trim()||e.homeDir.length>4096)&&Kt("unsafe-path");let p=MEe(e.homeDir),f=new Map,m=[];for(let A=p;A!==eY(A).root;A=Q8(A))m.unshift(A);for(let A of m){let D;try{D=wj(A)}catch(T){T.code==="ENOENT"&&Kt("missing-home"),Kt("unavailable")}(D.isSymbolicLink()||!D.isDirectory())&&Kt("unsafe-path"),f.set(A,D)}let g;try{g=ri(p)}catch{Kt("unsafe-path")}g!==p&&Kt("unsafe-path");let h=Sj.O_RDONLY|(Sj.O_NOFOLLOW??0)|(Sj.O_NONBLOCK??0),y=new Map,v=a(A=>{let D=[];if(A)for(let T=A;T!==eY(T).root;T=Q8(T))D.push(T);else D.push(...f.keys());for(let T of D){let j=f.get(T);j||Kt("changed-during-inspection");let V;try{V=wj(T)}catch{Kt("changed-during-inspection")}let W=T===g||T.startsWith(`${g}/`)||T.startsWith(`${g}\\`);(V.isSymbolicLink()||(W?!zEe(j,V):j.dev!==V.dev||j.ino!==V.ino||!V.isDirectory()))&&Kt("changed-during-inspection")}if(!A)for(let[T,j]of y){let V;try{V=sc(g,T,{maxBytes:d.fileBytes,openFlags:h,beforeOpen:a(()=>v(T),"beforeOpen")})}catch(W){if(W instanceof bd)throw W;Kt("changed-during-inspection")}nY(V)!==j&&Kt("changed-during-inspection")}},"check"),b=0,S=0,w=a((A,D)=>{v(A);let T=f.get(A),j=Math.min(d.fileBytes,d.totalReadBytes-S);T.size>j&&Kt("limit-exceeded");let V;try{V=sc(g,A,{maxBytes:j,openFlags:h,beforeOpen:a(()=>{e.hooks?.beforeRead?.(D.join("/")),v(A)},"beforeOpen")})}catch(W){if(W instanceof bd)throw W;v(A),Kt("unavailable")}S+=Buffer.byteLength(V),y.set(A,nY(V)),v(A);try{return JSON.parse(V)}catch{Kt("invalid-json")}},"read"),I=a(A=>{A||Kt("invalid-shape")},"shape"),k=a((A,D)=>{I(Gi(D));let T=D;if(A==="schema")I(Object.keys(T).length===1&&Number.isSafeInteger(T.version)&&T.version>=0),t.sourceSchemaVersion=T.version,T.version!==1&&T.version!==fn&&l("unsupported-schema");else if(A==="app"){if(t.identities.builtinSelection="not-recorded","builtinAgentEngineConnectionId"in T&&(I(T.builtinAgentEngineConnectionId===null||Zs(T.builtinAgentEngineConnectionId)),t.identities.builtinSelection=T.builtinAgentEngineConnectionId===null?"explicit-station":"explicit-engine",typeof T.builtinAgentEngineConnectionId=="string"&&o.push(T.builtinAgentEngineConnectionId)),"agentConnections"in T){I(Gi(T.agentConnections));for(let[j,V]of Object.entries(T.agentConnections))I(Zs(j)&&Gi(V)),o.push(j)}l("additional-fields-not-inspected")}else if(A==="registry"){s=!0;let j=a((de,Z)=>{Object.keys(de).some(ce=>!Z.includes(ce))&&l("additional-fields-not-inspected")},"noteUninspectedFields");I((T.version===1||T.version===2)&&Number.isSafeInteger(T.revision)&&T.revision>=0&&Array.isArray(T.engineConnections)&&Array.isArray(T.defaultAgents)),c=T.version;for(let de of T.engineConnections){I(Gi(de));let Z=de;I(Zs(Z.id)&&Z.id!=="station");let ce=Z.id;if(r.has(ce)&&l("identity-conflict"),r.add(ce),"runtimeConnectionId"in Z){I(T.version===1&&Zs(Z.runtimeConnectionId));let Y=Z.runtimeConnectionId;i.has(Y)&&i.get(Y)!==ce&&l("identity-conflict"),i.set(Y,ce),Y!==ce&&(t.identities.differingRuntimeSelectors++,l("owner-mapping-required"))}if(Z.source!==void 0){I(Gi(Z.source));let Y=Z.source;I(Y.kind==="native"||Y.kind==="user-acp"||Y.kind==="plugin-acp"&&typeof Y.plugin=="string"&&Y.plugin.length>0),j(Y,Y.kind==="plugin-acp"?["kind","plugin"]:["kind"])}j(Z,["id","runtimeConnectionId","source"])}let V=new Set,W=new Set,ie=0;for(let de of T.defaultAgents){I(Gi(de));let Z=de;I(Zs(Z.id)),V.has(Z.id)&&l("identity-conflict"),V.add(Z.id),Z.kind==="station"?(I(Z.id==="station"),ie++,j(Z,["id","kind"])):(I(Z.kind==="engine-connection"&&Zs(Z.engineConnectionId)),Z.id!==Z.engineConnectionId&&l("identity-conflict"),W.has(Z.engineConnectionId)&&l("identity-conflict"),W.add(Z.engineConnectionId),o.push(Z.engineConnectionId),j(Z,["id","kind","engineConnectionId"]))}ie!==1&&l("identity-conflict");for(let de of r)W.has(de)||l("identity-conflict");if(T.declinedEngineConnections!==void 0){I(Array.isArray(T.declinedEngineConnections)&&T.declinedEngineConnections.every(Zs));for(let de of T.declinedEngineConnections)r.has(de)&&l("identity-conflict")}j(T,["version","revision","engineConnections","defaultAgents","declinedEngineConnections"])}else if(A==="agents"){if(T.execution!==void 0){I(Gi(T.execution));let j=T.execution;"agentConnectionId"in j&&(I(Zs(j.agentConnectionId)),o.push(j.agentConnectionId)),j.credentialProfileRef!==void 0&&j.credentialProfileRef!==null&&(I(typeof j.credentialProfileRef=="string"&&j.credentialProfileRef.length>0),t.identities.agentCredentialReferences++)}l("additional-fields-not-inspected")}else if(A==="runtime"){I(T.version===1&&Gi(T.instances));for(let j of Object.values(T.instances)){I(Gi(j));let V=j;if(I(typeof V.port=="number"&&Number.isFinite(V.port)&&["service","sidecar","worktree","inline"].includes(V.type)),t.owners.recordedInstances++,V.pid===void 0){t.owners.unknown++;continue}I(Number.isSafeInteger(V.pid)&&V.pid>0);try{process.kill(V.pid,0),t.owners.pidPresent++}catch(W){W.code==="ESRCH"?t.owners.pidAbsent++:t.owners.unknown++}}}},"inspect"),_=a(A=>{let[D,T,j]=A;if(A.length===1){if(D===Qr)return"schema";if(D==="instances.json")return"runtime";if(D==="plugin-grants.json"||D==="mcp-ui-render-grants.json")return"grants";if(["config","agents","projects","data","scheduler","security"].includes(D))return"directory";if(D==="app-homes")return"credentials";if(D==="quarantine")return"evidence";if(D==="service")return"runtime";if(D==="plugins")return"plugins"}if(D==="config"&&A.length===2){if(T==="app.json")return"app";if(T==="agent-registry.json")return"registry";if(["providers.json","hosts.json","host-credentials.json"].includes(T))return"credentials"}if(D==="agents"){if(A.length===2)return"directory";if(A.length===3&&j==="agent.json")return"agents"}if(D==="projects"){if(A.length===2)return"directory";if(A.length===3&&j==="conversations.json")return"history";if(A.length===3&&["project.json","layouts","documents"].includes(j))return"projects"}return D==="layouts"&&A.length===1?"layouts":D==="data"&&A.length===2&&["orchestration.sqlite","orchestration.sqlite-wal","orchestration.sqlite-shm","attachments"].includes(T)?"history":D==="scheduler"&&A.length===2?"scheduler":D==="security"&&A.length===2?T==="unattended-tool-grants.json"?"grants":"credentials":"unknown"},"classify"),E=a((A,D)=>{v(A),D.length>=d.depth&&Kt("limit-exceeded");let T=jEe(A),j=[];try{for(let V=T.readSync();V;V=T.readSync())++b>d.entries&&Kt("limit-exceeded"),j.push(V.name)}finally{T.closeSync()}for(let V of j.sort()){v(A);let W=LEe(A,V),ie=[...D,V],de=wj(W);(de.isSymbolicLink()||!de.isDirectory()&&!de.isFile()||de.isFile()&&de.nlink!==1)&&Kt("unsafe-path"),f.set(W,de);let Z=_(ie);if(Z==="directory"){de.isDirectory()||Kt("invalid-shape"),E(W,ie);continue}let ce=u(Z);ce.entries++,["schema","app","registry","agents"].includes(Z)||Z==="runtime"&&ie.length===1&&ie[0]==="instances.json"?(de.isFile()||Kt("invalid-shape"),k(Z,w(W,ie)),ce.inspectedRecords++):l(Z==="unknown"?"unknown-store":"payload-not-inspected")}},"walk");E(g,[]),e.hooks?.afterInventory?.(),v(),t.sourceSchemaVersion===null&&l("missing-schema"),s||l("missing-registry"),c!==void 0&&t.sourceSchemaVersion!==null&&c!==t.sourceSchemaVersion&&l("store-schema-conflict"),t.identities.connections=r.size;for(let A of o)r.has(A)?t.identities.exactReferences++:(t.identities.unresolvedReferences++,l("unresolved-binding"));for(let[A,D]of i)r.has(A)&&A!==D&&l("identity-conflict");n.size&&(t.inspection="partial")}catch(d){l(d instanceof bd?d.code:"unavailable"),t.inspection="refused"}return t.codes=[...n].sort(),t}a(rY,"inspectStationHomeRecovery");MS();qn();Tu();Si();Qt();import{execFileSync as Sd,execSync as qEe}from"node:child_process";import{createHash as Ij}from"node:crypto";import{existsSync as UEe,mkdirSync as fk,readFileSync as FEe,writeFileSync as Cg}from"node:fs";import{homedir as $g}from"node:os";import{join as cn}from"node:path";import{performance as oY}from"node:perf_hooks";import{createInterface as BEe}from"node:readline/promises";var _j=process.platform==="win32",VEe=process.platform==="darwin",WEe=/^([A-Z][a-z]{2} [A-Z][a-z]{2} [ \d]\d \d{2}:\d{2}:\d{2} \d{4})\s+([\s\S]+)$/;function mk(e,t={}){return!Number.isInteger(e)||e<1?null:(t.platform??process.platform)==="linux"?KEe(e,t):iY(e,t)}a(mk,"inspectProcessFingerprint");function HEe(e,t){try{return String(e("ps",["-o","command=","-p",String(t)],{encoding:"utf8",env:{...process.env,LC_ALL:"C",TZ:"UTC"},stdio:["ignore","pipe","ignore"],windowsHide:!0})).trim()}catch{return""}}a(HEe,"readPsCommand");function KEe(e,t){let n=t.exec??Sd,o=t.readFile??FEe,r=t.birth??(c=>$n(c,{platform:"linux"})),i=r(e);if(!i)return null;let s;try{s=HEe(n,e),s||(s=o(`/proc/${e}/cmdline`,"utf8").split("\0").filter(c=>c.length>0).join(" "))}catch{return null}return!s||r(e)!==i?null:{pid:e,startToken:i,commandDigest:Ij("sha256").update(s).digest("hex")}}a(KEe,"inspectLinuxProcessFingerprint");function iY(e,t={}){if(!Number.isInteger(e)||e<1)return null;let n=t.exec??Sd;try{let o=n("ps",["-o","lstart=","-o","command=","-p",String(e)],{encoding:"utf8",env:{...process.env,LC_ALL:"C",TZ:"UTC"},stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim();if(!o)return null;let r=o.match(WEe);return r?{pid:e,startToken:r[1],commandDigest:Ij("sha256").update(r[2].trim()).digest("hex")}:null}catch{return null}}a(iY,"inspectLstartProcessFingerprint");function GEe(e,t={}){if(!Number.isInteger(e)||e<1)return null;let n=t.exec??Sd;try{let o=n("ps",["-o","lstart=","-o","command=","-p",String(e)],{encoding:"utf8",stdio:["ignore","pipe","ignore"],windowsHide:!0}).trim();if(!o)return null;let r=o.match(/^(.{24})\s+([\s\S]+)$/);return r?{pid:e,startToken:r[1].trim(),commandDigest:Ij("sha256").update(r[2].trim()).digest("hex")}:null}catch{return null}}a(GEe,"inspectProcessFingerprintLegacyEnv");function pk(e,t){return e!==null&&t!==null&&e.pid===t.pid&&e.startToken===t.startToken&&e.commandDigest===t.commandDigest}a(pk,"sameProcessFingerprint");function Rj(e,t,n={}){if(pk(e,t))return!0;if(e===null||t===null)return!1;let o=n.pinnedLstartInspect??iY;if(e.startToken!==t.startToken&&!t.startToken.startsWith("linux:")&&e.startToken.startsWith("linux:")&&pk(o(e.pid),t))return!0;let r=n.legacyInspect??GEe;return pk(r(e.pid),t)}a(Rj,"fingerprintMatchesRecorded");function Ej(e,t={}){let n=t.inspect??mk,o=t.now??Date.now,r=t.sleep??gk,i=Math.max(1,t.intervalMs??20),s=Math.max(i,t.stableMs??100),c=Math.max(s,t.timeoutMs??2e3),l=o()+c,u=Math.ceil(c/i)+2,d=null,p=0;for(let f=0;f<u;f++){let m=o(),g=n(e);if(!pk(d,g))d=g,p=m;else if(g&&m-p>=s)return g;let h=l-m;if(h<=0)return null;r(Math.min(i,h))}return null}a(Ej,"captureStableProcessFingerprint");function gk(e){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}catch{let t=oY.now()+e;for(;oY.now()<t;);}}a(gk,"sleepSync");function Pj(e){if(_j){try{Sd("taskkill",["/F","/T","/PID",String(e)],{stdio:"ignore",windowsHide:!0})}catch{}return}let t=!1;try{process.kill(-e,"SIGTERM"),t=!0}catch{try{process.kill(e,"SIGTERM"),t=!0}catch{console.error(` \u26A0 killProcessTree(${e}): could not send SIGTERM (process may already be gone)`)}}if(!t)return;let n=Date.now()+5e3;for(;Date.now()<n;){try{process.kill(e,0)}catch{return}gk(200)}try{process.kill(-e,"SIGKILL")}catch{}try{process.kill(e,"SIGKILL")}catch{}}a(Pj,"killProcessTree");async function wd(e){let t=BEe({input:process.stdin,output:process.stdout}),n=await t.question(`${e} [y/N] `);return t.close(),n.trim().toLowerCase()==="y"}a(wd,"promptYN");function sY(e){if(_j){let i=cn(e,"packages","cli","src","cli.ts"),s=cn(process.env.APPDATA??cn($g(),"AppData","Roaming"),"npm");fk(s,{recursive:!0}),Cg(cn(s,"station.cmd"),`@echo off
295
295
  npx tsx "${i}" %*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontourai/station-cli",
3
- "version": "0.6.0-nightly.2464.36783703696",
3
+ "version": "0.7.0",
4
4
  "description": "Command-line client for Station hosts: chat, agents, sessions, and fleet management",
5
5
  "type": "module",
6
6
  "engines": {
@@ -14,10 +14,6 @@
14
14
  "README.md",
15
15
  "LICENSE"
16
16
  ],
17
- "scripts": {
18
- "build": "node esbuild.config.mjs && node ../../scripts/write-dist-stamp.mjs",
19
- "prepack": "node esbuild.config.mjs"
20
- },
21
17
  "author": "Station",
22
18
  "license": "Apache-2.0",
23
19
  "publishConfig": {
@@ -38,9 +34,9 @@
38
34
  },
39
35
  "devDependencies": {
40
36
  "@kontourai/station-connect": "^0.5.1",
41
- "@kontourai/station-contracts": "^0.7.0",
42
- "@kontourai/station-sdk": "^0.7.0",
43
- "@kontourai/station-shared": "^0.7.0",
37
+ "@kontourai/station-contracts": "^0.8.0",
38
+ "@kontourai/station-sdk": "^0.8.0",
39
+ "@kontourai/station-shared": "^0.8.0",
44
40
  "commander": "^15.0.0",
45
41
  "esbuild": "^0.28.2",
46
42
  "tsx": "^4.23.15"
@@ -48,5 +44,8 @@
48
44
  "dependencies": {
49
45
  "@napi-rs/keyring": "2.1.0",
50
46
  "qrcode": "^1.5.4"
47
+ },
48
+ "scripts": {
49
+ "build": "node esbuild.config.mjs && node ../../scripts/write-dist-stamp.mjs"
51
50
  }
52
- }
51
+ }