@oxgeneral/orch 1.0.25 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App-B4VWJWWG.js +23 -0
- package/dist/{agent-6PI3NNZ5.js → agent-6ADS3VE2.js} +2 -2
- package/dist/agent-factory-XLLE3SJQ.js +2 -0
- package/dist/antigravity-LGKZHZL7.js +2 -0
- package/dist/antigravity-W43JJLR2.js +105 -0
- package/dist/antigravity-W43JJLR2.js.map +1 -0
- package/dist/chunk-AOJZCMUE.js +2 -0
- package/dist/chunk-DZK72HOZ.js +2 -0
- package/dist/chunk-HYQXUJYV.js +4 -0
- package/dist/{chunk-JDG6ZKIM.js → chunk-SLMXPTXV.js} +1 -1
- package/dist/{chunk-FGQJYB6G.js → chunk-TKGW23QJ.js} +43 -6
- package/dist/chunk-TKGW23QJ.js.map +1 -0
- package/dist/chunk-YKUO5PD4.js +3 -0
- package/dist/cli.js +1 -1
- package/dist/container-WJJQSUHB.js +4 -0
- package/dist/doctor-X2D67Q6Q.js +2 -0
- package/dist/grok-GIH3ESBQ.js +179 -0
- package/dist/grok-GIH3ESBQ.js.map +1 -0
- package/dist/grok-YX757Y3M.js +2 -0
- package/dist/index.d.ts +13 -1
- package/dist/index.js +29 -4
- package/dist/index.js.map +1 -1
- package/dist/{init-4D6QMPQL.js → init-CPL6DJ7W.js} +7 -7
- package/dist/orchestrator-QIRX6DKR.js +6 -0
- package/dist/{orchestrator-KV3VVGZR.js.map → orchestrator-QIRX6DKR.js.map} +1 -1
- package/dist/orchestrator-TY5HYXUH.js +17 -0
- package/dist/{org-RL6SBZI4.js → org-T5DCYQI6.js} +1 -1
- package/dist/{task-YMPSU6YE.js → task-V72DFC6L.js} +1 -1
- package/dist/tui-GFT7LF67.js +2 -0
- package/package.json +3 -1
- package/readme.md +3 -3
- package/dist/App-IC2HLH6T.js +0 -23
- package/dist/agent-factory-T6WZIQPM.js +0 -2
- package/dist/chunk-4O4L3Y2U.js +0 -2
- package/dist/chunk-FGQJYB6G.js.map +0 -1
- package/dist/container-KJNQCG2C.js +0 -4
- package/dist/doctor-DEGM2HCD.js +0 -2
- package/dist/orchestrator-AVJ23Q5T.js +0 -17
- package/dist/orchestrator-KV3VVGZR.js +0 -6
- package/dist/tui-NZ55TCHU.js +0 -2
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a as a$2}from'./chunk-N4OXN2HW.js';import {c as c$1,b as b$3}from'./chunk-HXOMNULD.js';import {b as b$2,a as a$1}from'./chunk-KR7VDF23.js';import {a}from'./chunk-CHRW4CLD.js';import {b}from'./chunk-6E6DC7OE.js';import {b as b$1,c,j as j$1,d,e,l as l$1,f as f$1,h,i as i$1,g as g$1,k as k$1}from'./chunk-ZMLF5HI5.js';import {c as c$2,l,j as j$2,k,g,f,i}from'./chunk-LRYVT4D4.js';import tt from'path';import Z,{mkdir}from'fs/promises';import {createReadStream}from'fs';import {homedir}from'os';import {nanoid}from'nanoid';var P={tui:{activity_filter:"all",notifications:{toast:true,bell:false}}};var w=class{indexPath;dir;ext;itemPath;fileFilter;readItemFn;mutex=Promise.resolve();insideMutex=false;constructor(t){this.dir=t.dir,this.ext=t.ext,this.itemPath=t.itemPath,this.indexPath=tt.join(t.dir,"_index.json"),this.fileFilter=t.fileFilter??(()=>true),t.readItem?this.readItemFn=t.readItem:t.ext===".yml"?this.readItemFn=e=>b$1(e):this.readItemFn=e=>d(e);}async readIndex(){try{let t=await d(this.indexPath);if(Array.isArray(t))return t}catch{}return this.rebuildIndex()}async rebuildIndex(){await j$1(this.dir);let t=await l$1(this.dir,this.ext),e=await Promise.all(t.filter(this.fileFilter).map(s=>{let a=s.replace(this.ext,"");return this.readItemFn(this.itemPath(a))})),r=[];for(let s of e)s!=null&&r.push(s);return this.insideMutex?await this.writeIndexUnsafe(r):await this.withMutex(()=>this.writeIndexUnsafe(r)),r}async writeIndex(t){return this.withMutex(()=>this.writeIndexUnsafe(t))}async updateIndex(t){return this.withMutex(async()=>{let e=await this.readIndex(),r=t(e);await this.writeIndexUnsafe(r);})}async writeIndexUnsafe(t){await j$1(this.dir),await e(this.indexPath,t);}withMutex(t){let e,r=new Promise(a=>{e=a;}),s=this.mutex;return this.mutex=r,s.then(async()=>{this.insideMutex=true;try{return await t()}finally{this.insideMutex=false,e();}})}};var C=class{constructor(t){this.paths=t;this.index=new w({dir:t.tasksDir,ext:".yml",itemPath:e=>t.taskPath(e)});}index;async list(t){return (await this.index.readIndex()).filter(s=>s!==null&&(!t?.status||s.status===t.status)&&(!t?.goalId||s.goalId===t.goalId)).sort((s,a)=>{let n=wt(s.status)-wt(a.status);if(n!==0)return n;let i=a.updated_at??"",o=s.updated_at??"";return i<o?-1:i>o?1:0})}async get(t){return b$1(this.paths.taskPath(t))}async save(t){await j$1(this.paths.tasksDir),await c(this.paths.taskPath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async delete(t){try{await Z.unlink(this.paths.taskPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}};function wt(m){return {in_progress:0,retrying:1,review:2,todo:3,done:4,failed:5,cancelled:6}[m]}var j=class{constructor(t){this.paths=t;this.index=new w({dir:t.agentsDir,ext:".yml",itemPath:e=>t.agentPath(e)});}index;async list(){return this.index.readIndex()}async get(t){return b$1(this.paths.agentPath(t))}async getByName(t){return (await this.list()).find(r=>r.name===t)??null}async save(t){await j$1(this.paths.agentsDir),await c(this.paths.agentPath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async delete(t){try{await Z.unlink(this.paths.agentPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}};var M=class{constructor(t){this.paths=t;}async save(t){await j$1(this.paths.runsDir),await e(this.paths.runPath(t.id),t);}async get(t){return d(this.paths.runPath(t))}async listAll(){return this.listFiltered(()=>true)}async listForTask(t){return this.listFiltered(e=>e.task_id===t)}async listForAgent(t){return this.listFiltered(e=>e.agent_id===t)}async appendEvent(t,e){await j$1(this.paths.runsDir),await f$1(this.paths.runEventsPath(t),e);}async readEvents(t){return h(this.paths.runEventsPath(t))}async readEventsTail(t,e){return i$1(this.paths.runEventsPath(t),e)}closeRunEvents(t){g$1(this.paths.runEventsPath(t));}async*streamEvents(t,e){let r=this.paths.runEventsPath(t),s=Date.now()+3e4;for(;!e?.aborted&&Date.now()<s&&!await k$1(r);)await new Promise(i=>setTimeout(i,100));if(e?.aborted||Date.now()>=s)return;let a=createReadStream(r),{readLines:n}=await import('./process-manager-33H27MQF.js');try{for await(let i of n(a)){if(e?.aborted)break;if(i.trim())try{yield JSON.parse(i);}catch{process.stderr.write(`[RunStore] skipping corrupt JSONL line: ${i.slice(0,200)}
|
|
3
|
+
`);}}}finally{a.destroy();}}async listFiltered(t){await j$1(this.paths.runsDir);let e=await l$1(this.paths.runsDir,".json"),r=64,s=[];for(let a=0;a<e.length;a+=r){let n=e.slice(a,a+r),i=await Promise.all(n.map(o=>{let c=o.endsWith(".json")?o.slice(0,-5):o;return d(this.paths.runPath(c))}));for(let o of i)o!==null&&t(o)&&s.push(o);}return s.sort((a,n)=>new Date(n.started_at).getTime()-new Date(a.started_at).getTime())}};var Q={version:1,onboardingCompleted:false,running:{},claimed:new Set,retry_queue:[],stats:{total_runs:0,total_tasks_completed:0,total_tasks_failed:0,total_tokens:{input:0,output:0,reasoning:0,total:0,cache_read:0,cache_write:0},total_runtime_ms:0}};var D=class{constructor(t){this.paths=t;}async read(){let t=await d(this.paths.statePath);if(!t)return structuredClone(Q);let e=structuredClone(Q);return {version:t.version??e.version,pid:t.pid,started_at:t.started_at,onboardingCompleted:typeof t.onboardingCompleted=="boolean"?t.onboardingCompleted:false,running:t.running&&typeof t.running=="object"?t.running:e.running,claimed:Array.isArray(t.claimed)?new Set(t.claimed):new Set(e.claimed),retry_queue:Array.isArray(t.retry_queue)?t.retry_queue:e.retry_queue,stats:{total_runs:t.stats?.total_runs??e.stats.total_runs,total_tasks_completed:t.stats?.total_tasks_completed??e.stats.total_tasks_completed,total_tasks_failed:t.stats?.total_tasks_failed??e.stats.total_tasks_failed,total_tokens:{...e.stats.total_tokens,...t.stats?.total_tokens??{}},total_runtime_ms:t.stats?.total_runtime_ms??e.stats.total_runtime_ms}}}async write(t){let e$1={...t,claimed:Array.from(t.claimed)};await e(this.paths.statePath,e$1);}};var R=class{constructor(t){this.paths=t;}async read(){let t=await b$1(this.paths.configPath);return yt(a$2,t??{})}async write(t){await c(this.paths.configPath,t);}async get(t){let e=await this.read();return Dt(e,t)}async set(t,e){let r=await this.read();Rt(r,t,e),await this.write(r);}};function Dt(m,t){let e=t.split("."),r=m;for(let s of e){if(r==null||typeof r!="object")return;r=r[s];}return r}function Rt(m,t,e){let r=t.split("."),s=m;for(let n=0;n<r.length-1;n++){let i=r[n];(typeof s[i]!="object"||s[i]===null)&&(s[i]={}),s=s[i];}let a=r[r.length-1];s[a]=e;}function yt(m,t){let e={...m};for(let r of Object.keys(t)){let s=t[r],a=e[r];s!=null&&typeof s=="object"&&!Array.isArray(s)&&typeof a=="object"&&a!==null&&!Array.isArray(a)?e[r]=yt(a,s):e[r]=s;}return e}var _t=tt.join(homedir(),".orchestry"),St=tt.join(_t,"global.yml"),O=class{async read(){let t=await b$1(St);if(!t)return {...P,tui:{...P.tui,notifications:{...P.tui.notifications}}};let e=t.tui,r=e?.notifications;return {tui:{activity_filter:e?.activity_filter??P.tui.activity_filter,notifications:{toast:typeof r?.toast=="boolean"?r.toast:P.tui.notifications.toast,bell:typeof r?.bell=="boolean"?r.bell:P.tui.notifications.bell}}}}async write(t){await mkdir(_t,{recursive:true}),await c(St,t);}async set(t,e){let r=await this.read();r.tui[t]=e,await this.write(r);}};var G=class m{constructor(t){this.paths=t;this.index=new w({dir:t.contextDir,ext:".json",itemPath:e=>t.contextPath(e),fileFilter:e=>e!=="_index.json"});}index;async get(t){let e=await d(this.paths.contextPath(t));return e?kt(e)?(await this.delete(t),null):e:null}static MAX_TTL_MS=720*60*60*1e3;async set(t,e$1,r){if(r!==void 0&&(!Number.isFinite(r)||r<=0||r>m.MAX_TTL_MS))throw new Error(`TTL must be a positive number up to ${m.MAX_TTL_MS}ms (30 days)`);await j$1(this.paths.contextDir);let s=new Date().toISOString(),a=await d(this.paths.contextPath(t)),n={key:t,value:e$1,created_at:a?.created_at??s,updated_at:s,ttl_ms:r,expires_at:r?new Date(Date.now()+r).toISOString():void 0};await e(this.paths.contextPath(t),n),await this.index.updateIndex(i=>{let o=i.filter(c=>c.key!==t);return o.push(n),o});}async delete(t){try{await Z.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.key!==t));}async list(){let t=await this.index.readIndex(),e=[],r=[];for(let s of t)kt(s)?e.push(s):r.push(s);return e.length>0&&(await Promise.all(e.map(s=>this.deleteFile(s.key))),await this.index.writeIndex(r)),r.sort((s,a)=>s.key.localeCompare(a.key))}async getAll(){let t=await this.list(),e={};for(let r of t)e[r.key]=r.value;return e}async deleteFile(t){try{await Z.unlink(this.paths.contextPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};function kt(m){return m.expires_at?new Date(m.expires_at).getTime()<Date.now():false}var L=class{constructor(t){this.paths=t;this.index=new w({dir:t.messagesDir,ext:".json",itemPath:e=>t.messagePath(e),fileFilter:e=>e!=="_index.json"});}index;async save(t){await j$1(this.paths.messagesDir),await e(this.paths.messagePath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async get(t){return d(this.paths.messagePath(t))}async list(){return (await this.index.readIndex()).filter(e=>e!==null).sort((e,r)=>e.created_at.localeCompare(r.created_at))}async listPending(t){let e=await this.list(),r=Date.now();return e.filter(s=>s.status!=="pending"||s.expires_at&&new Date(s.expires_at).getTime()<r?false:s.to_agent_id===t)}async markDelivered(t){let e$1=await this.get(t);e$1&&(e$1.status="delivered",e$1.delivered_at=new Date().toISOString(),await e(this.paths.messagePath(t),e$1),await this.index.updateIndex(r=>{let s=r.filter(a=>a.id!==t);return s.push(e$1),s}));}async delete(t){try{await Z.unlink(this.paths.messagePath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}async purgeExpired(){let t=await this.list(),e=Date.now(),r=t.filter(a=>{let n=a.expires_at&&new Date(a.expires_at).getTime()<e,i=a.delivered_at&&e-new Date(a.delivered_at).getTime()>36e5;return n||i}),s=new Set(r.map(a=>a.id));return await Promise.all(r.map(async a=>{try{await Z.unlink(this.paths.messagePath(a.id));}catch(n){if(n.code!=="ENOENT")throw n}})),await this.index.updateIndex(a=>a.filter(n=>!s.has(n.id))),r.length}};var B=class{constructor(t){this.paths=t;this.index=new w({dir:t.goalsDir,ext:".yml",itemPath:e=>t.goalPath(e)});}index;async list(t){return (await this.index.readIndex()).filter(s=>s!==null&&(!t?.status||s.status===t.status)).sort((s,a)=>{let n=c$1[s.status]-c$1[a.status];if(n!==0)return n;let i=a.updated_at??"",o=s.updated_at??"";return i<o?-1:i>o?1:0})}async get(t){return b$1(this.paths.goalPath(t))}async save(t){await j$1(this.paths.goalsDir),await c(this.paths.goalPath(t.id),t),await this.index.updateIndex(e=>{let r=e.filter(s=>s.id!==t.id);return r.push(t),r});}async delete(t){try{await Z.unlink(this.paths.goalPath(t));}catch(e){if(e.code!=="ENOENT")throw e}await this.index.updateIndex(e=>e.filter(r=>r.id!==t));}};var F=class{constructor(t){this.paths=t;}async save(t){await j$1(this.paths.teamsDir),await c(this.paths.teamPath(t.id),t);}async get(t){return b$1(this.paths.teamPath(t))}async getByName(t){return (await this.list()).find(r=>r.name===t)??null}async list(){await j$1(this.paths.teamsDir);let t=await l$1(this.paths.teamsDir,".yml");return (await Promise.all(t.map(r=>b$1(this.paths.teamPath(r.replace(".yml","")))))).filter(r=>r!==null)}async delete(t){try{await Z.unlink(this.paths.teamPath(t));}catch(e){if(e.code!=="ENOENT")throw e}}};var N=class{handlers=new Map;wildcardHandlers=new Set;maxListeners=10;warnedTypes=new Set;setMaxListeners(t){this.maxListeners=t;}getMaxListeners(){return this.maxListeners}listenerCount(t){return this.handlers.get(t)?.size??0}on(t,e){this.handlers.has(t)||this.handlers.set(t,new Set);let r=this.handlers.get(t);return r.add(e),this.maxListeners>0&&r.size>this.maxListeners&&!this.warnedTypes.has(t)&&(this.warnedTypes.add(t),console.warn(`EventBus: possible memory leak detected. ${r.size} listeners added for "${t}". Use setMaxListeners() to increase limit if this is intentional.`)),()=>this.off(t,e)}once(t,e){let r=s=>{this.off(t,r),e(s);};return this.on(t,r)}off(t,e){this.handlers.get(t)?.delete(e);}emit(t){let e=this.handlers.get(t.type);e&&this.dispatchToSet(e,t,"handler"),this.dispatchToSet(this.wildcardHandlers,t,"wildcard handler");}dispatchToSet(t,e,r){for(let s of t)try{s(e);}catch(a){console.error(`EventBus ${r} error for "${e.type}":`,a);}}onAny(t){return this.wildcardHandlers.add(t),this.maxListeners>0&&this.wildcardHandlers.size>this.maxListeners&&!this.warnedTypes.has("*")&&(this.warnedTypes.add("*"),console.warn(`EventBus: possible memory leak detected. ${this.wildcardHandlers.size} wildcard listeners added. Use setMaxListeners() to increase limit if this is intentional.`)),()=>{this.wildcardHandlers.delete(t);}}clear(){this.handlers.clear(),this.wildcardHandlers.clear(),this.warnedTypes.clear();}};var $=class{constructor(t,e,r,s,a){this.taskStore=t;this.eventBus=e;this.config=r;this.paths=s;this.agentStore=a;}async create(t){if(!t.title.trim())throw new c$2("Task title is required");let e=t.priority??this.config.defaults.task.priority;if(!Number.isInteger(e)||e<1||e>4)throw new c$2("Priority must be an integer between 1 and 4");if(t.depends_on?.length){let i=(await Promise.all(t.depends_on.map(async o=>({depId:o,exists:!!await this.taskStore.get(o)})))).filter(o=>!o.exists).map(o=>o.depId);if(i.length>0)throw new c$2(`Unknown depends_on task ID(s): ${i.join(", ")}`)}let r=await this.resolveAssignee(t.assignee),s=new Date().toISOString(),a={id:`tsk_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"todo",priority:e,assignee:r,labels:t.labels??[],depends_on:t.depends_on??[],created_at:s,updated_at:s,attempts:0,max_attempts:t.max_attempts??this.config.defaults.task.max_attempts,workspace_mode:t.workspace_mode,review_criteria:t.review_criteria,scope:t.scope,goalId:t.goalId};if(t.attachments?.length&&this.paths){let n=await this.copyAttachments(a.id,t.attachments);a.attachments=n;}return await this.taskStore.save(a),this.eventBus.emit({type:"task:created",task:a}),a}async list(t){return this.taskStore.list(t)}async get(t){let e=await this.taskStore.get(t);if(!e)throw new f(t);return e}async updateStatus(t,e){let r=await this.get(t),s=r.status;if(!a$1(s,e))throw new i(t,s,e);return r.status=e,r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:e}),r}async assign(t,e){let r=await this.get(t);return r.assignee=await this.resolveAssignee(e),r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:assigned",taskId:t,agentId:e}),r}async cancel(t){let e=await this.get(t);if(b$2(e.status))throw new i(t,e.status,"cancelled");return this.updateStatus(t,"cancelled")}async retry(t){let e=await this.get(t);if(e.status!=="failed"&&e.status!=="cancelled")throw new i(t,e.status,"todo");let r=e.status;return e.status="todo",e.attempts=0,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),this.eventBus.emit({type:"task:status_changed",taskId:t,from:r,to:"todo"}),e}async reject(t,e){let r=await this.get(t);if(r.status!=="review")throw new i(t,r.status,"todo");let s=r.status;return r.status="todo",r.attempts=0,r.feedback=e,r.updated_at=new Date().toISOString(),await this.taskStore.save(r),this.eventBus.emit({type:"task:status_changed",taskId:t,from:s,to:"todo"}),r}async update(t,e){let r=await this.get(t);if(e.title!==void 0){if(!e.title.trim())throw new c$2("Task title cannot be empty");r.title=e.title.trim();}if(e.description!==void 0&&(r.description=e.description.trim()),e.priority!==void 0){if(!Number.isInteger(e.priority)||e.priority<1||e.priority>4)throw new c$2("Priority must be an integer between 1 and 4");r.priority=e.priority;}if(e.labels!==void 0&&(r.labels=e.labels),e.attachments?.length&&this.paths){let s=await this.copyAttachments(t,e.attachments);r.attachments=[...r.attachments??[],...s];}return r.updated_at=new Date().toISOString(),await this.taskStore.save(r),r}async delete(t){if((await this.get(t)).status==="in_progress")throw new c$2("Cannot delete a running task. Cancel it first.");if(await this.taskStore.delete(t),this.paths){let r=this.paths.taskAttachmentsDir(t);await Z.rm(r,{recursive:true,force:true});}}getAttachmentPath(t,e){if(!this.paths)throw new c$2("Paths not configured");return tt.join(this.paths.taskAttachmentsDir(t),e)}async copyAttachments(t,e){if(!this.paths)return [];let r=this.paths.taskAttachmentsDir(t);return await j$1(r),await Promise.all(e.map(async a=>{try{await Z.access(a);}catch{throw new c$2(`Attachment file not found: ${a}`)}})),await Promise.all(e.map(async a=>{let n=tt.basename(a);return await Z.copyFile(a,tt.join(r,n)),n}))}async incrementAttempts(t){let e=await this.get(t);return e.attempts+=1,e.updated_at=new Date().toISOString(),await this.taskStore.save(e),e}async resolveAssignee(t){if(!t)return;if(!this.agentStore)return t;if(t.startsWith("agt_")){let r=await this.agentStore.get(t);if(r)return r.id;throw new c$2(`Unknown agent ID: "${t}". No agent with this ID exists.`)}let e=await this.agentStore.getByName(t);if(e)return e.id;throw new c$2(`Unknown agent: "${t}". Use an agent ID (agt_xxx) or an exact agent name.`)}};var U=class{constructor(t,e,r,s){this.agentStore=t;this.stateStore=e;this.eventBus=r;this.config=s;}async create(t){if(!t.name.trim())throw new c$2("Agent name is required");if(await this.agentStore.getByName(t.name))throw new c$2(`Agent "${t.name}" already exists`);let r={id:`agt_${nanoid(7)}`,name:t.name.trim(),adapter:t.adapter||this.config.defaults.agent.adapter,role:t.role,config:{command:t.command,model:t.model,effort:t.effort,approval_policy:t.approval_policy??this.config.defaults.agent.approval_policy,max_turns:t.max_turns??this.config.defaults.agent.max_turns,timeout_ms:t.timeout_ms??this.config.defaults.agent.timeout_ms,stall_timeout_ms:t.stall_timeout_ms??this.config.defaults.agent.stall_timeout_ms,env:t.env,system_prompt:t.system_prompt,workspace_mode:t.workspace_mode,skills:t.skills},status:"idle",stats:{tasks_completed:0,tasks_failed:0,total_runs:0,total_runtime_ms:0}};return await this.agentStore.save(r),r}async list(){return this.agentStore.list()}async get(t){let e=await this.agentStore.get(t);if(!e)throw new g(t);return e}async remove(t){let e=await this.get(t);if(e.status==="running"){let r=await this.stateStore.read();if(Object.values(r.running).some(a=>a.agent_id===t))throw new c$2("Cannot remove a running agent. Stop it first.");e.status="idle",await this.agentStore.save(e);}await this.agentStore.delete(t);}async update(t,e){let r=await this.get(t);if(e.name!==void 0){if(!e.name.trim())throw new c$2("Agent name cannot be empty");let s=await this.agentStore.getByName(e.name.trim());if(s&&s.id!==t)throw new c$2(`Agent "${e.name}" already exists`);r.name=e.name.trim();}return e.role!==void 0&&(r.role=e.role||void 0),e.model!==void 0&&(r.config.model=e.model||void 0),e.effort!==void 0&&(r.config.effort=e.effort||void 0),e.approval_policy!==void 0&&(r.config.approval_policy=e.approval_policy),await this.agentStore.save(r),r}async disable(t){return this.setStatus(t,"disabled")}async enable(t){return this.setStatus(t,"idle")}async setAutonomous(t,e){let r=await this.get(t);return r.autonomous=e,await this.agentStore.save(r),this.eventBus.emit({type:"agent:autonomous_toggled",agentId:t,autonomous:e}),r}async setStatus(t,e){let r=await this.get(t);return r.status=e,await this.agentStore.save(r),r}async updateStats(t,e){let r=await this.get(t);return Object.assign(r.stats,e),await this.agentStore.save(r),r}async findBestAgent(t){let e=await this.agentStore.list(),r=e.filter(n=>n.status==="idle");if(r.length===0)return null;if(t.assignee){let n=e.find(i=>i.id===t.assignee||i.name===t.assignee);return n&&n.status==="idle"?n:null}let s=t.labels?.length?t.labels.map(n=>n.toLowerCase()):void 0,a=r.map(n=>{let i=0;if(s&&n.config.skills?.length){let c=new Set(n.config.skills.map(d=>d.toLowerCase()));for(let d of s)c.has(d)&&(i+=50);}if(s&&n.role){let c=n.role.toLowerCase();s.some(d=>c.includes(d))&&(i+=30);}n.status==="idle"&&(i+=20);let o=n.stats.tasks_completed+n.stats.tasks_failed;return o>0&&(i+=Math.round(n.stats.tasks_completed/o*10)),{agent:n,score:i}});return a.sort((n,i)=>i.score-n.score),a[0]?.agent??null}};var J=class{constructor(t,e){this.runStore=t;this.eventBus=e;}async create(t){let e={id:`run_${nanoid(7)}`,task_id:t.taskId,agent_id:t.agentId,attempt:t.attempt,status:"preparing",started_at:new Date().toISOString(),workspace_path:t.workspacePath,prompt:t.prompt};return await this.runStore.save(e),e}async get(t){return this.runStore.get(t)}async start(t,e){let r=await this.runStore.get(t);if(!r)throw new Error(`Run not found: ${t}`);return r.status="running",r.pid=e,await this.runStore.save(r),this.eventBus.emit({type:"agent:started",agentId:r.agent_id,taskId:r.task_id,runId:t}),r}async finish(t,e,r,s){let a=await this.runStore.get(t);if(!a)throw new Error(`Run not found: ${t}`);return a.status=e,a.finished_at=new Date().toISOString(),a.tokens=r,a.error=s,await this.runStore.save(a),this.eventBus.emit({type:"agent:completed",runId:t,agentId:a.agent_id,success:e==="succeeded"}),a}async appendEvent(t,e){await this.runStore.appendEvent(t,e);}async listAll(){return this.runStore.listAll()}async listForTask(t){return this.runStore.listForTask(t)}async listForAgent(t){return this.runStore.listForAgent(t)}async readEvents(t){return this.runStore.readEvents(t)}async readEventsTail(t,e){return this.runStore.readEventsTail(t,e)}async getLastFailedRunContext(t){let r=(await this.runStore.listForTask(t)).filter(n=>n.status==="failed").sort((n,i)=>(i.finished_at??"").localeCompare(n.finished_at??""))[0];if(!r)return null;let s=r.error??"Unknown error",a="";try{a=(await this.runStore.readEventsTail(r.id,50)).filter(i=>i.type==="agent_output"||i.type==="error").map(i=>typeof i.data=="string"?i.data:JSON.stringify(i.data)).join(`
|
|
4
|
+
`);}catch{}return {error:s,output:a}}};var H=class{constructor(t,e,r,s){this.messageStore=t;this.agentStore=e;this.teamStore=r;this.eventBus=s;}async send(t){if(!t.body.trim())throw new c$2("Message body is required");let e=t.ttl_ms??864e5;if(e<=0||e>6048e5)throw new c$2(`TTL must be between 1ms and ${6048e5}ms`);if(!await this.agentStore.get(t.from_agent_id)&&t.from_agent_id!=="cli")throw new c$2(`Sender agent not found: ${t.from_agent_id}`);let s=new Date,a={channel:t.channel,from_agent_id:t.from_agent_id,subject:(t.subject||"(no subject)").slice(0,200),body:t.body.slice(0,4e3),created_at:s.toISOString(),expires_at:new Date(s.getTime()+e).toISOString(),status:"pending",team_id:t.team_id,reply_to:t.reply_to},n=[];if(t.channel==="broadcast"){let i=await this.agentStore.list();if(t.team_id){let d=await this.teamStore.get(t.team_id);if(d){let k=new Set(d.members.map(v=>v.agent_id));i=i.filter(v=>k.has(v.id));}}let c=i.filter(d=>d.id!==t.from_agent_id&&d.status!=="disabled").map(d=>({...a,id:`msg_${nanoid(7)}`,to_agent_id:d.id}));await Promise.all(c.map(d=>this.messageStore.save(d)));for(let d of c)n.push(d),this.emitSent(d);}else if(t.channel==="lead"){if(!t.team_id)throw new c$2("team_id is required for lead channel");let i=await this.teamStore.get(t.team_id);if(!i)throw new c$2(`Team not found: ${t.team_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:i.lead_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}else {if(!t.to_agent_id)throw new c$2("to_agent_id is required for direct messages");if(!await this.agentStore.get(t.to_agent_id))throw new c$2(`Recipient agent not found: ${t.to_agent_id}`);let o={...a,id:`msg_${nanoid(7)}`,to_agent_id:t.to_agent_id};await this.messageStore.save(o),n.push(o),this.emitSent(o);}return n}async drainMailbox(t,e){let r=await this.messageStore.listPending(t);await Promise.all(r.map(s=>this.messageStore.markDelivered(s.id)));for(let s of r)this.eventBus.emit({type:"message:delivered",messageId:s.id,toAgentId:t,taskId:e});return r}async listAll(){return this.messageStore.list()}async listPendingForAgent(t){return this.messageStore.listPending(t)}async listForAgent(t){return (await this.messageStore.list()).filter(r=>r.to_agent_id===t||r.from_agent_id===t)}async purgeExpired(){return this.messageStore.purgeExpired()}emitSent(t){this.eventBus.emit({type:"message:sent",messageId:t.id,fromAgentId:t.from_agent_id,toAgentId:t.to_agent_id,channel:t.channel});}};var Ht={active:["paused","achieved","abandoned"],paused:["active","achieved","abandoned"],achieved:[],abandoned:[]},q=class{constructor(t,e,r,s,a){this.goalStore=t;this.eventBus=e;this.agentService=r;this.taskService=s;this.contextStore=a;}async create(t){if(!t.title.trim())throw new c$2("Goal title is required");let e=new Date().toISOString(),r={id:`goal_${nanoid(7)}`,title:t.title.trim(),description:t.description?.trim()??"",status:"active",assignee:t.assignee,created_at:e,updated_at:e};return await this.goalStore.save(r),this.eventBus.emit({type:"goal:created",goalId:r.id,title:r.title}),r.assignee&&await this.enableAutonomous(r.assignee),r}async list(t){return this.goalStore.list(t)}async get(t){let e=await this.goalStore.get(t);if(!e)throw new j$2(t);return e}async updateStatus(t,e,r){let s=await this.get(t),a$1=s.status;if(!Ht[a$1].includes(e))throw new c$2(`Cannot transition goal from '${a$1}' to '${e}'`);if(e==="achieved"&&this.taskService){let i=(await this.taskService.list({goalId:t})).filter(o=>!b$2(o.status)&&!o.labels?.includes(a));if(i.length>0)if(r?.force){let o=i.filter(d=>d.status!=="in_progress"),c=i.filter(d=>d.status==="in_progress");if(await Promise.all(o.map(d=>this.taskService.cancel(d.id).catch(()=>{}))),c.length>0){let d=c.map(k=>`${k.id} (in_progress)`).join(", ");throw new k(t,c.length,d)}}else {let o=i.map(c=>`${c.id} (${c.status})`).join(", ");throw new k(t,i.length,o)}}return s.status=e,s.updated_at=new Date().toISOString(),await this.goalStore.save(s),this.eventBus.emit({type:"goal:status_changed",goalId:t,from:a$1,to:e}),s.assignee&&(e==="paused"?(await this.maybeDisableAutonomous(s.assignee),await this.cancelPendingAutonomousTasks(s.assignee)):e==="active"&&a$1==="paused"?await this.enableAutonomous(s.assignee):b$3(e)&&await this.maybeDisableAutonomous(s.assignee)),s}async update(t,e){let r=await this.get(t),s=r.assignee;if(e.title!==void 0){if(!e.title.trim())throw new c$2("Goal title cannot be empty");r.title=e.title.trim();}e.description!==void 0&&(r.description=e.description.trim()),e.assignee!==void 0&&(r.assignee=e.assignee||void 0),r.updated_at=new Date().toISOString(),await this.goalStore.save(r),this.eventBus.emit({type:"goal:updated",goalId:t});let a=r.assignee;if(a!==s){let n=[];a&&n.push(this.enableAutonomous(a)),s&&n.push(this.maybeDisableAutonomous(s)),await Promise.all(n);}return r}async delete(t){let e=await this.get(t),{assignee:r}=e;await this.goalStore.delete(t),this.eventBus.emit({type:"goal:deleted",goalId:t}),r&&await this.maybeDisableAutonomous(r);}async listTasksForGoal(t){return this.taskService?.list({goalId:t})??[]}async getProgressReport(t){return this.contextStore?(await this.contextStore.get(`${t}-progress`))?.value:void 0}async enableAutonomous(t){if(this.agentService)try{await this.agentService.setAutonomous(t,!0);}catch{}}async hasActiveGoalsForAgent(t){return (await this.goalStore.list({status:"active"})).some(r=>r.assignee===t)}async cancelPendingAutonomousTasks(t){if(this.taskService)try{let[e,r]=await Promise.all([this.taskService.list({status:"todo"}),this.taskService.list({status:"retrying"})]),s=[...e,...r].filter(a$1=>a$1.assignee===t&&a$1.labels?.includes(a));await Promise.all(s.map(a=>this.taskService.cancel(a.id).catch(()=>{})));}catch{}}async maybeDisableAutonomous(t){if(this.agentService)try{await this.hasActiveGoalsForAgent(t)||await this.agentService.setAutonomous(t,!1);}catch{}}};var bt={auto_claim:true,message_ttl_ms:864e5};var Y=class{constructor(t,e,r,s){this.teamStore=t;this.agentStore=e;this.taskStore=r;this.eventBus=s;}async create(t){if(!t.name.trim())throw new c$2("Team name is required");if(!await this.agentStore.get(t.lead_agent_id))throw new c$2(`Lead agent not found: ${t.lead_agent_id}`);if(await this.teamStore.getByName(t.name.trim()))throw new c$2(`Team "${t.name}" already exists`);let s=new Date().toISOString(),a={agent_id:t.lead_agent_id,role:"lead",joined_at:s},n=[];for(let o of t.member_agent_ids??[]){if(o===t.lead_agent_id)continue;if(!await this.agentStore.get(o))throw new c$2(`Member agent not found: ${o}`);n.push({agent_id:o,role:"member",joined_at:s});}let i={id:`team_${nanoid(7)}`,name:t.name.trim(),description:t.description,status:"active",members:[a,...n],task_pool:[],lead_agent_id:t.lead_agent_id,created_at:s,updated_at:s,config:{...bt,...t.config??{}}};await this.teamStore.save(i),this.eventBus.emit({type:"team:created",teamId:i.id,name:i.name,leadAgentId:i.lead_agent_id});for(let o of n)this.eventBus.emit({type:"team:member_joined",teamId:i.id,agentId:o.agent_id});return i}async get(t){let e=await this.teamStore.get(t);if(!e)throw new l(t);return e}async list(){return this.teamStore.list()}async join(t,e){let r=await this.get(t);if(r.members.some(a=>a.agent_id===e))throw new c$2(`Agent ${e} is already a member of team ${t}`);if(!await this.agentStore.get(e))throw new c$2(`Agent not found: ${e}`);return r.members.push({agent_id:e,role:"member",joined_at:new Date().toISOString()}),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:member_joined",teamId:t,agentId:e}),r}async leave(t,e){let r=await this.get(t);if(e===r.lead_agent_id)throw new c$2("Lead cannot leave team. Disband the team or transfer lead first.");return r.members=r.members.filter(s=>s.agent_id!==e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:member_left",teamId:t,agentId:e}),r}async addTask(t,e){let r=await this.get(t);if(!await this.taskStore.get(e))throw new c$2(`Task not found: ${e}`);return r.task_pool.includes(e)||(r.task_pool.push(e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),this.eventBus.emit({type:"team:task_added",teamId:t,taskId:e})),r}async removeTask(t,e){let r=await this.get(t);return r.task_pool=r.task_pool.filter(s=>s!==e),r.updated_at=new Date().toISOString(),await this.teamStore.save(r),r}async setLead(t,e){let r=await this.get(t),s=r.members.find(n=>n.agent_id===e);if(!s)throw new c$2(`Agent ${e} is not a member of team ${t}`);let a=r.members.find(n=>n.agent_id===r.lead_agent_id);return a&&(a.role="member"),s.role="lead",r.lead_agent_id=e,r.updated_at=new Date().toISOString(),await this.teamStore.save(r),r}async disband(t){let e=await this.get(t);e.status="disbanded",e.updated_at=new Date().toISOString(),await this.teamStore.save(e),this.eventBus.emit({type:"team:disbanded",teamId:t});}async findTeamForAgent(t){return (await this.teamStore.list()).find(r=>r.status==="active"&&r.members.some(s=>s.agent_id===t))??null}};async function Yt(m){let t=new b(m.projectRoot),e=new R(t),r=new O,[,s]=await Promise.all([t.requireInit(),e.read()]),a=new C(t),n=new j(t),i=new M(t),o=new D(t),c=new G(t),d=new L(t),k=new B(t),v=new F(t),_=new N,b$1=new $(a,_,s,t,n),I=new U(n,o,_,s),z=new J(i,_),W=new H(d,n,v,_),p=new q(k,_,I,b$1,c),A=new Y(v,n,a,_);return {context:m,paths:t,config:s,taskStore:a,agentStore:n,runStore:i,stateStore:o,configStore:e,globalConfigStore:r,globalConfig:P,contextStore:c,messageStore:d,goalStore:k,teamStore:v,eventBus:_,taskService:b$1,agentService:I,runService:z,messageService:W,goalService:p,teamService:A}}async function zt(m){let t=await Yt(m),e=await t.globalConfigStore.read();t.globalConfig=e;let[{ProcessManager:r},{AdapterRegistry:s},{ClaudeAdapter:a},{CodexAdapter:n},{CursorAdapter:i},{ShellAdapter:o},{OpenCodeAdapter:c},{PiAdapter:d},{GrokAdapter:k},{AntigravityAdapter:v},{WorkspaceManager:_},{LiquidTemplateEngine:b},{SkillLoader:I},{Orchestrator:z},{DoctorService:W}]=await Promise.all([import('./process-manager-33H27MQF.js'),import('./registry-BO2PPRNG.js'),import('./claude-PH7LT3OH.js'),import('./codex-URQN4JLZ.js'),import('./cursor-EMX3ECDY.js'),import('./shell-NPNTWDMU.js'),import('./opencode-K22RCQ5C.js'),import('./pi-XEINSHUN.js'),import('./grok-YX757Y3M.js'),import('./antigravity-LGKZHZL7.js'),import('./workspace-manager-ZI5SVXJU.js'),import('./template-engine-VLIOJ3WX.js'),import('./skill-loader-IGRIELEM.js'),import('./orchestrator-TY5HYXUH.js'),import('./doctor-service-PB7YBH3F.js')]),p=new r,A=new b,rt=new I,st=new _(m.projectRoot,t.paths.root,p),y=new s;y.register(new a(p)),y.register(new n(p)),y.register(new i(p)),y.register(new o(p)),y.register(new c(p)),y.register(new d(p)),y.register(new k(p)),y.register(new v(p));let It=new W(y,p,m.projectRoot),At=new z({taskStore:t.taskStore,agentStore:t.agentStore,runStore:t.runStore,stateStore:t.stateStore,adapterRegistry:y,workspaceManager:st,templateEngine:A,processManager:p,eventBus:t.eventBus,taskService:t.taskService,agentService:t.agentService,runService:t.runService,contextStore:t.contextStore,messageService:t.messageService,goalStore:t.goalStore,skillLoader:rt,config:t.config,projectRoot:m.projectRoot,lockPath:t.paths.lockPath});return {...t,processManager:p,adapterRegistry:y,workspaceManager:st,templateEngine:A,skillLoader:rt,doctorService:It,orchestrator:At}}async function Mr(m){return zt(m)}export{Mr as buildContainer,zt as buildFullContainer,Yt as buildLightContainer};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a as a$7}from'./chunk-HMMPM7MF.js';import {a as a$4}from'./chunk-SJG3HXO5.js';import {a as a$5}from'./chunk-AOJZCMUE.js';import {a as a$6}from'./chunk-YKUO5PD4.js';import {p,c,q}from'./chunk-64WUDYEM.js';import {b}from'./chunk-6E6DC7OE.js';import'./chunk-ZMLF5HI5.js';import {a as a$1}from'./chunk-CDFA4IIQ.js';import {a as a$2}from'./chunk-DEHFYICU.js';import {a as a$3}from'./chunk-ITMAWW3J.js';import'./chunk-C7C7Q7XO.js';import'./chunk-P4JTJBWO.js';import'./chunk-LRYVT4D4.js';import {a}from'./chunk-6MJ7V6VY.js';import a$8 from'chalk';function E(v,t){v.command("doctor").description("Check adapters and dependencies").action(async()=>{let c$1,n,d=false;if(t)c$1=t.doctorService,n=t.paths,d=true;else {let e=new a,o=new a$1;o.register(new a$2(e)),o.register(new a$3(e)),o.register(new a$4(e)),o.register(new a$5(e)),o.register(new a$6(e)),c$1=new a$7(o,e,process.cwd()),n=new b(process.cwd());}console.log(),console.log(` ${p("orch doctor")} \xB7 checking adapters and dependencies`),console.log();let i=await c$1.runAll();if(t?.context.json){console.log(JSON.stringify(i,null,2));return}for(let e of i.checks){let o=e.status==="ok"?a$8.ansi256(72)(c("done")):e.status==="fail"?a$8.ansi256(167)(c("failed")):q("\u2014"),l=e.detail?q(` ${e.detail}`):"";console.log(` ${o} ${e.name.padEnd(12)}${l}`);}if(n){let e=await n.isInitialized();if(e&&d){let o=await t.agentService.list(),l=await t.taskService.list();console.log(),console.log(` ${a$8.ansi256(72)(c("done"))} .orchestry/ ${q(`exists \xB7 ${o.length} agents \xB7 ${l.length} tasks`)}`);}else e||(console.log(),console.log(` ${a$8.ansi256(167)(c("failed"))} .orchestry/ ${q("not found \u2014 run: orch init")}`));}console.log(),console.log(` ${i.adaptersReady} of ${i.adaptersTotal} adapters ready`),console.log();});}export{E as registerDoctorCommand};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { classifyAdapterError } from './chunk-IESAV453.js';
|
|
2
|
+
import { readLines } from './chunk-O2MSGW3V.js';
|
|
3
|
+
import { execFile } from 'child_process';
|
|
4
|
+
import { promisify } from 'util';
|
|
5
|
+
|
|
6
|
+
var execFileAsync = promisify(execFile);
|
|
7
|
+
var OUTPUT_CHUNK_LEN = 240;
|
|
8
|
+
var GrokAdapter = class {
|
|
9
|
+
constructor(processManager) {
|
|
10
|
+
this.processManager = processManager;
|
|
11
|
+
}
|
|
12
|
+
kind = "grok";
|
|
13
|
+
async test() {
|
|
14
|
+
try {
|
|
15
|
+
const { stdout } = await execFileAsync("grok", ["--version"]);
|
|
16
|
+
return { ok: true, version: stdout.trim() };
|
|
17
|
+
} catch (err) {
|
|
18
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
error: "Grok CLI not found. Install and authenticate the grok CLI, then ensure `grok` is on PATH.",
|
|
22
|
+
errorKind: classifyAdapterError(msg)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
execute(params) {
|
|
27
|
+
const args = [
|
|
28
|
+
"-p",
|
|
29
|
+
params.prompt,
|
|
30
|
+
"--output-format",
|
|
31
|
+
"streaming-json",
|
|
32
|
+
"--permission-mode",
|
|
33
|
+
"bypassPermissions",
|
|
34
|
+
"--always-approve",
|
|
35
|
+
"--cwd",
|
|
36
|
+
params.workspace
|
|
37
|
+
];
|
|
38
|
+
if (params.config.model) {
|
|
39
|
+
args.push("--model", params.config.model);
|
|
40
|
+
}
|
|
41
|
+
if (params.config.effort) {
|
|
42
|
+
args.push("--effort", params.config.effort);
|
|
43
|
+
}
|
|
44
|
+
if (params.config.max_turns) {
|
|
45
|
+
args.push("--max-turns", String(params.config.max_turns));
|
|
46
|
+
}
|
|
47
|
+
const effectiveSystemPrompt = params.systemPrompt ?? params.config.system_prompt;
|
|
48
|
+
if (effectiveSystemPrompt) {
|
|
49
|
+
args.push("--system-prompt-override", effectiveSystemPrompt);
|
|
50
|
+
}
|
|
51
|
+
const { process: proc, pid } = this.processManager.spawn("grok", args, {
|
|
52
|
+
cwd: params.workspace,
|
|
53
|
+
env: { ...process.env, ...params.env },
|
|
54
|
+
signal: params.signal
|
|
55
|
+
});
|
|
56
|
+
const events = createGrokEvents(proc, params.signal);
|
|
57
|
+
return { pid, events };
|
|
58
|
+
}
|
|
59
|
+
async stop(pid) {
|
|
60
|
+
await this.processManager.killWithGrace(pid);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
function createGrokEvents(proc, signal) {
|
|
64
|
+
async function* generate() {
|
|
65
|
+
let gotDoneEvent = false;
|
|
66
|
+
let textBuffer = "";
|
|
67
|
+
let finalText = "";
|
|
68
|
+
let exitCode = null;
|
|
69
|
+
let exitError = null;
|
|
70
|
+
const exitPromise = new Promise((resolve) => {
|
|
71
|
+
proc.on("close", (code) => {
|
|
72
|
+
exitCode = code;
|
|
73
|
+
resolve();
|
|
74
|
+
});
|
|
75
|
+
proc.on("error", (err) => {
|
|
76
|
+
exitError = err;
|
|
77
|
+
resolve();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
const flushOutput = function* () {
|
|
81
|
+
if (!textBuffer) return;
|
|
82
|
+
const chunk = textBuffer;
|
|
83
|
+
textBuffer = "";
|
|
84
|
+
yield {
|
|
85
|
+
type: "output",
|
|
86
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
87
|
+
data: { text: chunk }
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
if (proc.stdout) {
|
|
91
|
+
try {
|
|
92
|
+
for await (const line of readLines(proc.stdout)) {
|
|
93
|
+
if (signal?.aborted) break;
|
|
94
|
+
const event = parseGrokEvent(line, {
|
|
95
|
+
appendText: (text) => {
|
|
96
|
+
textBuffer += text;
|
|
97
|
+
finalText += text;
|
|
98
|
+
},
|
|
99
|
+
finalText: () => finalText
|
|
100
|
+
});
|
|
101
|
+
if (!event) {
|
|
102
|
+
if (textBuffer.length >= OUTPUT_CHUNK_LEN) {
|
|
103
|
+
yield* flushOutput();
|
|
104
|
+
}
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (event.type === "done") {
|
|
108
|
+
yield* flushOutput();
|
|
109
|
+
gotDoneEvent = true;
|
|
110
|
+
}
|
|
111
|
+
yield event;
|
|
112
|
+
}
|
|
113
|
+
} finally {
|
|
114
|
+
proc.stdout.destroy();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
await exitPromise;
|
|
118
|
+
if (!gotDoneEvent && !signal?.aborted) {
|
|
119
|
+
yield* flushOutput();
|
|
120
|
+
}
|
|
121
|
+
if (exitError && !signal?.aborted && !gotDoneEvent) {
|
|
122
|
+
const spawnErr = exitError;
|
|
123
|
+
throw Object.assign(new Error(spawnErr.message), {
|
|
124
|
+
errorKind: classifyAdapterError(spawnErr.message, exitCode ?? void 0)
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (exitCode !== 0 && exitCode !== null && !signal?.aborted && !gotDoneEvent) {
|
|
128
|
+
const msg = `Grok process exited with code ${exitCode}`;
|
|
129
|
+
throw Object.assign(new Error(msg), {
|
|
130
|
+
errorKind: classifyAdapterError(msg, exitCode)
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (!gotDoneEvent && !signal?.aborted && exitCode === 0) {
|
|
134
|
+
yield {
|
|
135
|
+
type: "done",
|
|
136
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
137
|
+
data: { result: finalText }
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return generate();
|
|
142
|
+
}
|
|
143
|
+
function parseGrokEvent(line, state) {
|
|
144
|
+
if (!line.trim()) return null;
|
|
145
|
+
let parsed;
|
|
146
|
+
try {
|
|
147
|
+
parsed = JSON.parse(line);
|
|
148
|
+
} catch {
|
|
149
|
+
return { type: "output", timestamp: (/* @__PURE__ */ new Date()).toISOString(), data: { text: line } };
|
|
150
|
+
}
|
|
151
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
152
|
+
const type = typeof parsed.type === "string" ? parsed.type : "";
|
|
153
|
+
switch (type) {
|
|
154
|
+
case "thought":
|
|
155
|
+
return null;
|
|
156
|
+
case "text":
|
|
157
|
+
if (typeof parsed.data === "string") {
|
|
158
|
+
state.appendText(parsed.data);
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
case "tool_call":
|
|
162
|
+
case "tool_use":
|
|
163
|
+
return { type: "tool_call", timestamp, data: parsed };
|
|
164
|
+
case "tool_result":
|
|
165
|
+
return { type: "output", timestamp, data: parsed };
|
|
166
|
+
case "error": {
|
|
167
|
+
const message = typeof parsed.data === "string" ? parsed.data : JSON.stringify(parsed);
|
|
168
|
+
return { type: "error", timestamp, data: parsed, errorKind: classifyAdapterError(message) };
|
|
169
|
+
}
|
|
170
|
+
case "end":
|
|
171
|
+
return { type: "done", timestamp, data: { result: state.finalText(), raw: parsed } };
|
|
172
|
+
default:
|
|
173
|
+
return { type: "output", timestamp, data: parsed };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export { GrokAdapter };
|
|
178
|
+
//# sourceMappingURL=grok-GIH3ESBQ.js.map
|
|
179
|
+
//# sourceMappingURL=grok-GIH3ESBQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/adapters/grok.ts"],"names":[],"mappings":"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","file":"grok-GIH3ESBQ.js","sourcesContent":["/**\n * Grok CLI adapter.\n *\n * Spawns `grok -p ... --output-format streaming-json` in headless mode.\n * Grok streams text/thought deltas; this adapter aggregates text deltas into\n * bounded output chunks and emits a terminal `done` event at session end.\n */\n\nimport type { ChildProcess } from 'node:child_process';\nimport type { IAgentAdapter, AdapterTestResult, ExecuteParams, AgentEvent, ExecuteHandle } from './interface.js';\nimport type { IProcessManager } from '../process/process-manager.js';\nimport { readLines } from '../process/process-manager.js';\nimport { classifyAdapterError } from '../../domain/errors.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\nconst OUTPUT_CHUNK_LEN = 240;\n\nexport class GrokAdapter implements IAgentAdapter {\n readonly kind = 'grok';\n\n constructor(private readonly processManager: IProcessManager) {}\n\n async test(): Promise<AdapterTestResult> {\n try {\n const { stdout } = await execFileAsync('grok', ['--version']);\n return { ok: true, version: stdout.trim() };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n ok: false,\n error: 'Grok CLI not found. Install and authenticate the grok CLI, then ensure `grok` is on PATH.',\n errorKind: classifyAdapterError(msg),\n };\n }\n }\n\n execute(params: ExecuteParams): ExecuteHandle {\n const args = [\n '-p', params.prompt,\n '--output-format', 'streaming-json',\n '--permission-mode', 'bypassPermissions',\n '--always-approve',\n '--cwd', params.workspace,\n ];\n\n if (params.config.model) {\n args.push('--model', params.config.model);\n }\n if (params.config.effort) {\n args.push('--effort', params.config.effort);\n }\n if (params.config.max_turns) {\n args.push('--max-turns', String(params.config.max_turns));\n }\n\n const effectiveSystemPrompt = params.systemPrompt ?? params.config.system_prompt;\n if (effectiveSystemPrompt) {\n args.push('--system-prompt-override', effectiveSystemPrompt);\n }\n\n const { process: proc, pid } = this.processManager.spawn('grok', args, {\n cwd: params.workspace,\n env: { ...process.env, ...params.env },\n signal: params.signal,\n });\n\n const events = createGrokEvents(proc, params.signal);\n return { pid, events };\n }\n\n async stop(pid: number): Promise<void> {\n await this.processManager.killWithGrace(pid);\n }\n}\n\nfunction createGrokEvents(proc: ChildProcess, signal?: AbortSignal): AsyncGenerator<AgentEvent> {\n async function* generate(): AsyncGenerator<AgentEvent> {\n let gotDoneEvent = false;\n let textBuffer = '';\n let finalText = '';\n\n let exitCode: number | null = null;\n let exitError: Error | null = null;\n const exitPromise = new Promise<void>((resolve) => {\n proc.on('close', (code) => { exitCode = code; resolve(); });\n proc.on('error', (err) => { exitError = err; resolve(); });\n });\n\n const flushOutput = function* (): Generator<AgentEvent> {\n if (!textBuffer) return;\n const chunk = textBuffer;\n textBuffer = '';\n yield {\n type: 'output',\n timestamp: new Date().toISOString(),\n data: { text: chunk },\n };\n };\n\n if (proc.stdout) {\n try {\n for await (const line of readLines(proc.stdout)) {\n if (signal?.aborted) break;\n const event = parseGrokEvent(line, {\n appendText: (text) => {\n textBuffer += text;\n finalText += text;\n },\n finalText: () => finalText,\n });\n if (!event) {\n if (textBuffer.length >= OUTPUT_CHUNK_LEN) {\n yield* flushOutput();\n }\n continue;\n }\n if (event.type === 'done') {\n yield* flushOutput();\n gotDoneEvent = true;\n }\n yield event;\n }\n } finally {\n proc.stdout.destroy();\n }\n }\n\n await exitPromise;\n\n if (!gotDoneEvent && !signal?.aborted) {\n yield* flushOutput();\n }\n\n if (exitError && !signal?.aborted && !gotDoneEvent) {\n const spawnErr = exitError as Error;\n throw Object.assign(new Error(spawnErr.message), {\n errorKind: classifyAdapterError(spawnErr.message, exitCode ?? undefined),\n });\n }\n if (exitCode !== 0 && exitCode !== null && !signal?.aborted && !gotDoneEvent) {\n const msg = `Grok process exited with code ${exitCode}`;\n throw Object.assign(new Error(msg), {\n errorKind: classifyAdapterError(msg, exitCode),\n });\n }\n if (!gotDoneEvent && !signal?.aborted && exitCode === 0) {\n yield {\n type: 'done',\n timestamp: new Date().toISOString(),\n data: { result: finalText },\n };\n }\n }\n\n return generate();\n}\n\nfunction parseGrokEvent(\n line: string,\n state: { appendText: (text: string) => void; finalText: () => string },\n): AgentEvent | null {\n if (!line.trim()) return null;\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(line) as Record<string, unknown>;\n } catch {\n return { type: 'output', timestamp: new Date().toISOString(), data: { text: line } };\n }\n\n const timestamp = new Date().toISOString();\n const type = typeof parsed.type === 'string' ? parsed.type : '';\n\n switch (type) {\n case 'thought':\n return null;\n\n case 'text':\n if (typeof parsed.data === 'string') {\n state.appendText(parsed.data);\n }\n return null;\n\n case 'tool_call':\n case 'tool_use':\n return { type: 'tool_call', timestamp, data: parsed };\n\n case 'tool_result':\n return { type: 'output', timestamp, data: parsed };\n\n case 'error': {\n const message = typeof parsed.data === 'string' ? parsed.data : JSON.stringify(parsed);\n return { type: 'error', timestamp, data: parsed, errorKind: classifyAdapterError(message) };\n }\n\n case 'end':\n return { type: 'done', timestamp, data: { result: state.finalText(), raw: parsed } };\n\n default:\n return { type: 'output', timestamp, data: parsed };\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -559,7 +559,7 @@ declare function resolveFailureStatus(task: Task): TaskStatus;
|
|
|
559
559
|
* is resolved based on the user's chosen adapter.
|
|
560
560
|
*/
|
|
561
561
|
/** The supported adapter kinds. */
|
|
562
|
-
type AdapterKind = 'claude' | 'opencode' | 'codex' | 'cursor' | 'pi' | 'shell';
|
|
562
|
+
type AdapterKind = 'claude' | 'opencode' | 'codex' | 'cursor' | 'pi' | 'grok' | 'antigravity' | 'shell';
|
|
563
563
|
/**
|
|
564
564
|
* Semantic capability tiers — adapter-agnostic.
|
|
565
565
|
* capable — most powerful / highest quality (opus, gpt-5.4)
|
|
@@ -574,6 +574,7 @@ type ModelTier = 'capable' | 'balanced' | 'fast';
|
|
|
574
574
|
* - shell: '' for all tiers (model irrelevant)
|
|
575
575
|
* - opencode: '' for balanced (delegate to opencode's own config)
|
|
576
576
|
* - cursor: 'auto' for all tiers (Cursor handles selection)
|
|
577
|
+
* - antigravity: '' for balanced (delegate to Antigravity's configured default)
|
|
577
578
|
*/
|
|
578
579
|
declare const MODEL_TIER_MAP: Record<AdapterKind, Record<ModelTier, string>>;
|
|
579
580
|
/**
|
|
@@ -1267,6 +1268,8 @@ declare class Orchestrator {
|
|
|
1267
1268
|
private readonly activeCollectors;
|
|
1268
1269
|
/** When true, `tick()` skips `seedAutonomousTasks()`. Set via `startWatch()` options. */
|
|
1269
1270
|
private skipAutonomousSeeding;
|
|
1271
|
+
/** Task IDs started via runTask; these must not trigger reactive dispatch of other tasks. */
|
|
1272
|
+
private readonly singleTaskRunIds;
|
|
1270
1273
|
/** Cooldown: track last auto-seed time per agent to prevent re-seed spam. */
|
|
1271
1274
|
private readonly lastAutoSeedAt;
|
|
1272
1275
|
/** Minimum interval between auto-seed tasks for the same agent (30 seconds). */
|
|
@@ -1370,6 +1373,15 @@ declare class Orchestrator {
|
|
|
1370
1373
|
* Dispatch all dispatchable tasks up to max_concurrent_agents.
|
|
1371
1374
|
*/
|
|
1372
1375
|
private dispatchAll;
|
|
1376
|
+
/**
|
|
1377
|
+
* Dispatch exactly one requested task.
|
|
1378
|
+
*
|
|
1379
|
+
* A single-shot CLI command (`orch run <task-id>`) should not opportunistically
|
|
1380
|
+
* consume other ready tasks while the requested run is being collected.
|
|
1381
|
+
* Temporarily claiming other dispatchable tasks keeps the shared dispatch path
|
|
1382
|
+
* focused without changing watch/run-all semantics.
|
|
1383
|
+
*/
|
|
1384
|
+
private dispatchOnlyTask;
|
|
1373
1385
|
/** Dedup + bounded push onto the retry queue. */
|
|
1374
1386
|
private enqueueRetry;
|
|
1375
1387
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Paths } from './chunk-6JQDY3PP.js';
|
|
2
|
-
import { canTransition, isTerminal } from './chunk-
|
|
3
|
-
export { Orchestrator, canTransition, isBlocked, isDispatchable, isTerminal, resolveFailureStatus } from './chunk-
|
|
2
|
+
import { canTransition, isTerminal } from './chunk-TKGW23QJ.js';
|
|
3
|
+
export { Orchestrator, canTransition, isBlocked, isDispatchable, isTerminal, resolveFailureStatus } from './chunk-TKGW23QJ.js';
|
|
4
4
|
import { AUTONOMOUS_LABEL } from './chunk-XUZZJCKG.js';
|
|
5
5
|
export { AdapterRegistry } from './chunk-6DWHQPTE.js';
|
|
6
6
|
export { SkillLoader } from './chunk-U2JVMD2G.js';
|
|
@@ -43,6 +43,16 @@ var MODEL_TIER_MAP = {
|
|
|
43
43
|
balanced: "openai-codex/gpt-5.5",
|
|
44
44
|
fast: "openai-codex/gpt-5.5"
|
|
45
45
|
},
|
|
46
|
+
grok: {
|
|
47
|
+
capable: "grok-build",
|
|
48
|
+
balanced: "grok-composer-2.5-fast",
|
|
49
|
+
fast: "grok-composer-2.5-fast"
|
|
50
|
+
},
|
|
51
|
+
antigravity: {
|
|
52
|
+
capable: "gemini-3-pro",
|
|
53
|
+
balanced: "",
|
|
54
|
+
fast: "gemini-3-flash"
|
|
55
|
+
},
|
|
46
56
|
shell: {
|
|
47
57
|
capable: "",
|
|
48
58
|
balanced: "",
|
|
@@ -63,7 +73,16 @@ function isAdapterKind(value) {
|
|
|
63
73
|
function isModelTier(value) {
|
|
64
74
|
return value === "capable" || value === "balanced" || value === "fast";
|
|
65
75
|
}
|
|
66
|
-
var SUPPORTED_ADAPTERS = [
|
|
76
|
+
var SUPPORTED_ADAPTERS = [
|
|
77
|
+
"claude",
|
|
78
|
+
"opencode",
|
|
79
|
+
"codex",
|
|
80
|
+
"cursor",
|
|
81
|
+
"pi",
|
|
82
|
+
"grok",
|
|
83
|
+
"antigravity",
|
|
84
|
+
"shell"
|
|
85
|
+
];
|
|
67
86
|
|
|
68
87
|
// src/domain/agent-shop.ts
|
|
69
88
|
var BACKEND_DEV_ROLE = `Backend engineer \u2014 builds APIs, services, database layers, and server-side business logic.
|
|
@@ -2544,6 +2563,8 @@ async function buildFullContainer(context) {
|
|
|
2544
2563
|
{ ShellAdapter },
|
|
2545
2564
|
{ OpenCodeAdapter },
|
|
2546
2565
|
{ PiAdapter },
|
|
2566
|
+
{ GrokAdapter },
|
|
2567
|
+
{ AntigravityAdapter },
|
|
2547
2568
|
{ WorkspaceManager },
|
|
2548
2569
|
{ LiquidTemplateEngine },
|
|
2549
2570
|
{ SkillLoader: SkillLoader2 },
|
|
@@ -2558,10 +2579,12 @@ async function buildFullContainer(context) {
|
|
|
2558
2579
|
import('./shell-C2J4AIAV.js'),
|
|
2559
2580
|
import('./opencode-HOX5TCMD.js'),
|
|
2560
2581
|
import('./pi-GFJCLRZJ.js'),
|
|
2582
|
+
import('./grok-GIH3ESBQ.js'),
|
|
2583
|
+
import('./antigravity-W43JJLR2.js'),
|
|
2561
2584
|
import('./workspace-manager-QH27FF55.js'),
|
|
2562
2585
|
import('./template-engine-XOH3FZPU.js'),
|
|
2563
2586
|
import('./skill-loader-RHCFIK74.js'),
|
|
2564
|
-
import('./orchestrator-
|
|
2587
|
+
import('./orchestrator-QIRX6DKR.js'),
|
|
2565
2588
|
import('./doctor-service-F2SXDWHS.js')
|
|
2566
2589
|
]);
|
|
2567
2590
|
const processManager = new ProcessManager();
|
|
@@ -2579,6 +2602,8 @@ async function buildFullContainer(context) {
|
|
|
2579
2602
|
adapterRegistry.register(new ShellAdapter(processManager));
|
|
2580
2603
|
adapterRegistry.register(new OpenCodeAdapter(processManager));
|
|
2581
2604
|
adapterRegistry.register(new PiAdapter(processManager));
|
|
2605
|
+
adapterRegistry.register(new GrokAdapter(processManager));
|
|
2606
|
+
adapterRegistry.register(new AntigravityAdapter(processManager));
|
|
2582
2607
|
const doctorService = new DoctorService(adapterRegistry, processManager, context.projectRoot);
|
|
2583
2608
|
const orchestrator = new Orchestrator2({
|
|
2584
2609
|
taskStore: light.taskStore,
|