@hlix/cli 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -8
- package/THIRD_PARTY_NOTICES +588 -13
- package/dist/app-njwmny66.js +5 -0
- package/dist/cli-cy5xk6z6.js +2 -0
- package/dist/github-link-zjx3855h.js +2 -0
- package/dist/hlix-file-7kwe2ppc.js +2 -0
- package/dist/import-cpywf45x.js +2 -0
- package/dist/index-2b2mh91d.js +39 -0
- package/dist/index-nv1fntbt.js +423 -0
- package/dist/index-sn0bes3n.js +3 -0
- package/dist/index.js +2 -2
- package/dist/main-dm0g4h2e.js +175 -0
- package/dist/main-jfwez07t.js +11 -0
- package/dist/package-kttrhq89.js +2 -0
- package/package.json +15 -15
- package/dist/index-c5avvnm2.js +0 -410
- package/dist/main-z66m02gb.js +0 -211
- package/dist/package-6n7j36nb.js +0 -2
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{A,h,x,t}from"./index-nv1fntbt.js";var f=300,g=64000,a=(e)=>t(typeof e==="string"?e:e===void 0?"":JSON.stringify(e)).slice(0,g);class L{projectId;selected="leader";board=null;boardStatus="loading";connection="Connecting";server;skills=[];skillsStatus="loading";notice="";sessions=new Map;seen=new Set;constructor(e){this.projectId=e}focus(e){this.selected=e}session(e=this.selected){let i=this.sessions.get(e);if(!i)i={entries:[],busy:!1,settledTurns:new Set,stored:new Set,completedRuns:new Set,raw:new Map},this.sessions.set(e,i);if(this.sessions.size>16){let o=[...this.sessions.keys()].find((r)=>r!==this.selected&&r!==e);if(o)this.sessions.delete(o)}return i}title(e=this.selected){if(e==="leader")return"Project manager";return t(this.board?.cycles.find((i)=>`cycle:${i.id}`===e)?.title??e.slice(6))}acknowledge(e,i,o,r){let s=this.session(e),d=s.entries.find((l)=>l.id===i);if(d&&(d.delivery==="sent"||d.delivery==="canceled"||s.stored.has(i)||s.settledTurns.has(i)))return;if(this.put(s,{id:i,kind:"user",text:a(o),title:"You",delivery:r?.queued?"queued":"sent"}),r?.delivered==="agent"){let l=r.queued?s.activeTurnId??r.activeTurnId:r.turnId;s.activeTurnId=l&&!s.settledTurns.has(l)?l:void 0,s.busy=Boolean(s.activeTurnId)}}beginMessage(e,i,o){this.put(this.session(e),{id:i,kind:"user",text:a(o),title:"You",delivery:"pending"})}failMessage(e,i){let o=this.session(e),r=o.entries.find((s)=>s.id===i);if(r&&!["queued","sent","canceled"].includes(r.delivery??"")&&!o.stored.has(i)&&!o.settledTurns.has(i))r.delivery="failed"}hydrate(e,i){let o=this.session(e),r=new Set(i.map((n)=>n.id)),s=new Set(i.filter((n)=>n.role==="user"||n.status!==void 0).map((n)=>n.id)),d=new Set(i.filter((n)=>n.role==="assistant"&&n.status!==void 0&&n.metadata?.runId).map((n)=>n.metadata.runId)),l=i.filter((n)=>n.role==="user"||n.role==="assistant").map((n)=>({id:n.id,kind:n.role==="user"?"user":"assistant",text:a(n.content),...n.delivery?{delivery:n.delivery}:{},title:a(n.author?.name??(n.role==="user"?"Teammate":this.title(e)))}));o.entries=[...l,...o.entries.filter((n)=>!r.has(n.id)&&(!n.runId||!d.has(n.runId)))].slice(-f),o.stored=s,o.completedRuns=d;for(let n of i)o.raw.set(n.id,{start:Math.max(0,n.content.length-g),value:n.content.slice(-g)});this.prune(o)}accept(e){let i=`${e.epoch??"legacy"}:${e.cursor}`;if(this.seen.has(i))return;if(this.seen.add(i),this.seen.size>4096)this.seen.delete(this.seen.values().next().value);let o=e.cycleId?`cycle:${e.cycleId}`:e.target?.startsWith("cycle:")?e.target:"leader",r=this.session(o);if(e.message)this.put(r,{id:e.message.id,kind:"user",text:a(e.message.content),title:"Teammate",...e.message.delivery?{delivery:e.message.delivery}:{}});for(let s of e.frames??[]){let d=typeof s.nativeRunId==="string"?s.nativeRunId:e.runId,l=typeof s.messageId==="string"?s.messageId:`${d??o}:answer`;if(d&&r.completedRuns.has(d))continue;if(s.type==="turn_started")r.activeTurnId=typeof s.turnId==="string"?s.turnId:void 0,r.busy=!0;else if(s.type==="on_chat_model_stream"){if(r.stored.has(l))continue;if(typeof s.turnId==="string")r.activeTurnId=s.turnId;let n=r.raw.get(l)??{start:0,value:""},c=typeof s.delta==="string"?s.delta:"",u=typeof s.textOffset==="number"&&Number.isSafeInteger(s.textOffset)&&s.textOffset>=0?s.textOffset:n.start+n.value.length;if(u>n.start+n.value.length){this.notice="Some streamed output is no longer retained. The stored conversation will catch up when the turn finishes.";continue}let p=c.slice(Math.max(0,n.start-u)),m=Math.max(0,u-n.start),y=n.value.slice(0,m)+p+n.value.slice(m+p.length),I={start:n.start+Math.max(0,y.length-g),value:y.slice(-g)};r.raw.set(l,I),this.put(r,{id:l,kind:"assistant",runId:d,title:this.title(o),text:a(I.value),streaming:!0}),r.busy=!0}else if(s.type==="on_tool_start"){if(typeof s.turnId==="string")r.activeTurnId=s.turnId;let n=typeof s.toolCallId==="string"?s.toolCallId:`${i}:tool`;this.put(r,{id:n,kind:"tool",runId:d,text:"",tool:{name:a(s.name),args:a(s.input),state:"running"}}),r.busy=!0}else if(s.type==="on_tool_end"||s.type==="on_tool_error"){let n=typeof s.toolCallId==="string"?s.toolCallId:`${i}:tool`,c=r.entries.find((u)=>u.id===n);this.put(r,{id:n,kind:"tool",runId:c?.runId??d,text:"",tool:{name:c?.tool?.name??"Tool",args:c?.tool?.args,state:s.type==="on_tool_error"?"error":"done",result:a(s.output??s.error)}})}else if(["done","idle","error","turn_saved"].includes(s.type)){if(typeof s.turnId==="string"){if(r.settledTurns.add(s.turnId),r.settledTurns.size>f)r.settledTurns.delete(r.settledTurns.values().next().value)}if(r.activeTurnId&&s.turnId!==r.activeTurnId)continue;r.busy=!1,r.activeTurnId=void 0;for(let n of r.entries)n.streaming=!1;if(s.type==="error")this.put(r,{id:`${i}:error`,kind:"notice",text:a(s.error??s.message??"The cloud run failed"),error:!0})}}}put(e,i){let o=e.entries.findIndex((r)=>r.id===i.id);if(o<0)e.entries.push(i);else e.entries[o]=i;if(e.entries.length>f)e.entries.splice(0,e.entries.length-f);this.prune(e)}prune(e){let i=new Set(e.entries.map((o)=>o.id));for(let o of e.raw.keys())if(!i.has(o))e.raw.delete(o)}}var v=x.filter((e)=>e!=="aider"&&e!=="openai-agents");class P{client;projectId;model;controller=new AbortController;feedListeners=new Set;listeners=new Set;tasks=[];loading=new Map;pending;constructor(e,i,o){this.client=e;this.projectId=i;if(o&&(o.client!==e||o.projectId!==i))throw Error("Reconnect to the same project and client");this.model=o?.model??new L(i),this.pending=o?.pending??new Map,this.model.server=e.origin}reconnect(){if(!this.controller.signal.aborted)throw Error("Disconnect the project before reconnecting");let e=new P(this.client,this.projectId,this);return e.model.connection="Connecting",e}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}subscribeFeed(e){return this.feedListeners.add(e),()=>{this.feedListeners.delete(e)}}changed(){for(let e of this.listeners)e()}async start(){this.tasks=[this.followOutput(),this.followBoard(),this.loadSkills()],await this.hydrate(),this.changed()}async close(){this.controller.abort(),await Promise.allSettled([...this.tasks,...this.loading.values()]),this.listeners.clear(),this.feedListeners.clear()}async focus(e){if(e!=="leader"&&!this.model.board?.cycles.some((i)=>`cycle:${i.id}`===e))throw Error("Choose a cycle from this project's cycle list");this.model.focus(e),this.changed(),await this.hydrate(e)}async hydrate(e=this.model.selected,i=!1){let o=this.loading.get(e);if(o)return i?o.then(()=>this.hydrate(e)):o;let r=(async()=>{if(e==="leader"){let s=await this.client.projects.messages(this.projectId,{limit:100},{signal:this.controller.signal});this.model.hydrate(e,s.messages);for(let d of s.messages)this.confirmMessage(d.id);if("activeTurnId"in s)this.model.session(e).activeTurnId=s.activeTurnId??void 0,this.model.session(e).busy=Boolean(s.activeTurnId)}else{let s=await this.client.cycles.messages(e.slice(6),{limit:100},{signal:this.controller.signal});this.model.hydrate(e,s);for(let d of s)this.confirmMessage(d.id)}this.changed()})().finally(()=>{this.loading.delete(e)});return this.loading.set(e,r),r}async send(e,i="queue"){let o=this.model.selected,s=[...this.pending].find(([,l])=>l.failed&&l.target===o&&l.content===e&&l.mode===i)?.[0]??crypto.randomUUID();this.pending.set(s,{target:o,content:e,mode:i,failed:!1,confirmed:!1}),this.model.beginMessage(o,s,e),this.changed();let d=AbortSignal.any([this.controller.signal,AbortSignal.timeout(30000)]);try{let l=o==="leader"?await this.client.chat.send({projectId:this.projectId,message:e,messageId:s,delivery:i},{signal:d}):await this.client.cycles.message(o.slice(6),{content:e,messageId:s,...i==="interrupt"?{urgent:!0}:{}},{signal:d});return this.model.acknowledge(o,s,e,"turnId"in l?l:void 0),this.pending.delete(s),this.changed(),{target:o,messageId:s,..."turnId"in l?{turnId:l.turnId}:{}}}catch(l){let n=this.model.session(o).entries.find((u)=>u.id===s);if(this.pending.get(s)?.confirmed||n&&["queued","sent","canceled"].includes(n.delivery??""))return this.pending.delete(s),{target:o,messageId:s,...o==="leader"?{turnId:s}:{}};let c=this.pending.get(s);if(c)c.failed=!0;throw this.model.failMessage(o,s),this.changed(),l}}async interrupt(e=!1,i=this.model.selected){let o=AbortSignal.any([this.controller.signal,AbortSignal.timeout(30000)]);if(i!=="leader")return await this.client.cycles.stop(i.slice(6),{signal:o}),"Cycle work stopped";let r=this.model.session(i),s=r.activeTurnId??r.entries.find((n)=>n.delivery==="queued")?.id;if(!s)return"No active or queued turn to stop";let d=await this.client.chat.stop({projectId:this.projectId,turnId:s,cancelQueued:e},{signal:o}),l=d.queuedCanceled??0;return d.cancelRequested?`Interrupt requested${l?` · ${l} queued messages canceled`:""}`:l?`${l} queued messages canceled`:"No turn was canceled"}async stopProject(){await this.hydrate("leader");let e=await this.interrupt(!0,"leader");return await this.client.projects.stop(this.projectId,{signal:AbortSignal.any([this.controller.signal,AbortSignal.timeout(30000)])}),`Project work stopped · ${e}`}async launch(e,i){let o=this.model.selected,r=AbortSignal.any([this.controller.signal,AbortSignal.timeout(30000)]),s=await this.client.tasks.create({projectId:this.projectId,title:i.slice(0,200),description:i,taskConfig:{agent:e}},{signal:r});if(!s.cycleId)throw Error("The server created a task but did not start a cloud cycle. Update the server before launching again.");if(this.model.selected===o)this.model.focus(`cycle:${s.cycleId}`);return this.model.notice=`${e==="claude-code"?"Claude Code":e==="codex"?"Codex":"Hlix"} requested on a Cloud Machine`,this.changed(),{taskId:s.id,cycleId:s.cycleId}}fail(e){if(this.controller.signal.aborted)return;this.model.notice=t(e instanceof Error?e.message:String(e)),this.changed()}confirmMessage(e){let i=this.pending.get(e);if(!i)return;if(i.failed)this.pending.delete(e);else i.confirmed=!0}async loadSkills(){try{let e=AbortSignal.any([this.controller.signal,AbortSignal.timeout(1e4)]),[i,o,r,s]=await Promise.all([this.client.packs.list(this.projectId,{signal:e}),this.client.skills.list({signal:e}),this.client.environments.list(this.projectId,{signal:e}),this.client.repos.protectedFiles(this.projectId,{signal:e}).catch((l)=>{if(l instanceof A||l instanceof h)return{files:[]};throw l})]),d=new Map;for(let l of i)if(l.isActive)for(let n of l.skillSlugs)d.set(n,{slug:n,name:n,description:`Skill from ${l.name}`});for(let l of o){if(!l.enabled)continue;let n=l.projectIds??[];if(n.length&&!n.includes(this.projectId))continue;d.set(l.slug,{slug:l.slug,name:l.name,description:l.description??""})}for(let l of[...s.files.filter((n)=>n.kind==="skill"),...r.find((n)=>n.isActive)?.config.files??[]]){let n=/^\.(?:claude|agents|hlix)\/skills\/([a-z0-9-]+)\/SKILL\.md$/.exec(l.path);if(n)d.set(n[1],{slug:n[1],name:n[1],description:"Imported project skill"})}this.model.skills=[...d.values()].sort((l,n)=>l.slug.localeCompare(n.slug)),this.model.skillsStatus="ready"}catch{if(this.controller.signal.aborted)return;this.model.skillsStatus="error"}this.changed()}async followOutput(){try{for await(let e of this.client.projects.feed(this.projectId,{signal:this.controller.signal,onConnect:()=>{this.model.connection="Connected",this.changed()},onReconnect:async()=>{this.model.connection="Reconnecting",this.changed(),await this.hydrate(),this.model.connection="Connected",this.changed()}})){if(this.model.accept(e),e.message&&e.message.delivery)this.confirmMessage(e.message.id);for(let i of e.frames??[])if(i.type==="turn_saved"&&typeof i.turnId==="string")this.confirmMessage(i.turnId);for(let i of this.feedListeners)i(e);if(this.model.connection="Connected",this.changed(),e.frames?.some((i)=>i.type==="done"||i.type==="error"||i.type==="turn_saved")){let i=e.cycleId?`cycle:${e.cycleId}`:"leader";this.hydrate(i,e.frames.some((o)=>o.type==="turn_saved")).catch((o)=>this.fail(o))}}}catch(e){if(!this.controller.signal.aborted)this.model.connection="Disconnected";this.fail(e)}}async followBoard(){try{for await(let e of this.client.live.project(this.projectId,{signal:this.controller.signal}))this.model.board=e.state,this.model.boardStatus="ready",this.changed()}catch(e){if(!this.controller.signal.aborted)this.model.boardStatus="error";this.fail(e)}}}
|
|
3
|
+
export{L,v,P};
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
3
|
-
`)}catch{}let
|
|
2
|
+
import{n,_,dt,r,m,Ye,E,Xe,J,Ze}from"./index-nv1fntbt.js";import{createRequire as p}from"node:module";var i=p(import.meta.url);import{readFileSync as a,realpathSync as s}from"node:fs";import{fileURLToPath as f}from"node:url";function d(){if(i.main==i.module===!0)return!0;let t=process.argv[1];if(!t)return!1;try{return s(t)===s(f(import.meta.url))}catch{return!1}}var c={"-h":"--help","-v":"--version"};function l(t){return t.map((e)=>c[e]??e)}function u(t){let e=t[0];if(e===void 0)return!1;if(e in c||e==="--help"||e==="--version")return!0;if(e==="code"||e==="acp")return!1;return!e.startsWith("-")}function C(t,e){if(u(t))return e.cli(l(t));return e.code(t[0]==="code"?t.slice(1):t)}if(d()){if(process.stderr.isTTY)try{let e=Ye(process.env);if(e)process.stderr.write(`hlix: ${e}
|
|
3
|
+
`)}catch{}let t=await C(process.argv.slice(2),{cli:(e)=>m(E,e,{stdout:(o)=>process.stdout.write(o),stderr:(o)=>process.stderr.write(o),env:process.env,readSecret:Xe,confirm:Ze,...process.stdin.isTTY&&process.stderr.isTTY?{promptChoice:J}:{},readStdin:async()=>a(0,"utf8"),openUrl:_}),code:async(e)=>(await import("./main-dm0g4h2e.js")).runHlixCode(e)});process.exit(t)}export{E as COMMANDS,dt as JSON_SCHEMA_VERSION,r as clientFor,C as dispatch,n as findProjectBinding,u as isCliInvocation,l as normalizeCliArgv,m as runCli};
|