@automagik/genie 4.260409.1 → 4.260409.3
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/.claude-plugin/marketplace.json +1 -1
- package/dist/genie.js +6 -6
- package/knip.json +2 -1
- package/package.json +1 -1
- package/plugins/genie/.claude-plugin/plugin.json +1 -1
- package/plugins/genie/package.json +1 -1
- package/src/__tests__/discovery.test.ts +19 -9
- package/src/__tests__/migrate.test.ts +498 -0
- package/src/lib/discovery.ts +23 -8
- package/src/lib/migrate.ts +488 -0
- package/src/lib/omni-approval-handler.ts +1 -1
- package/src/term-commands/approval.ts +4 -2
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "genie",
|
|
13
|
-
"version": "4.260409.
|
|
13
|
+
"version": "4.260409.3",
|
|
14
14
|
"source": "./plugins/genie",
|
|
15
15
|
"description": "Human-AI partnership for Claude Code. Share a terminal, orchestrate workers, evolve together. Brainstorm ideas, wish them into plans, make with parallel agents, ship as one team. A coding genie that grows with your project."
|
|
16
16
|
}
|
package/dist/genie.js
CHANGED
|
@@ -1736,7 +1736,7 @@ ${errCtx.stack}`;sub.unsubscribe(),d.reject(err)}else if(err=(0,msg_1.isRequestE
|
|
|
1736
1736
|
|
|
1737
1737
|
${errCtx.stack}`;d.reject(err)}else d.resolve(msg)}});return sub.requestSubject=subject,this.protocol.publish(subject,data,{reply:inbox2,headers:opts.headers}),d}else{let r=new request_1.RequestOne(this.protocol.muxSubscriptions,subject,opts,asyncTraces);this.protocol.request(r);try{this.publish(subject,data,{reply:`${this.protocol.muxSubscriptions.baseInbox}${r.token}`,headers:opts.headers})}catch(err){r.cancel(err)}let p=Promise.race([r.timer,r.deferred]);return p.catch(()=>{r.cancel()}),p}}flush(){if(this.isClosed())return Promise.reject(types_1.NatsError.errorForCode(core_1.ErrorCode.ConnectionClosed));return this.protocol.flush()}drain(){if(this.isClosed())return Promise.reject(types_1.NatsError.errorForCode(core_1.ErrorCode.ConnectionClosed));if(this.isDraining())return Promise.reject(types_1.NatsError.errorForCode(core_1.ErrorCode.ConnectionDraining));return this.draining=!0,this.protocol.drain()}isClosed(){return this.protocol.isClosed()}isDraining(){return this.draining}getServer(){let srv=this.protocol.getServer();return srv?srv.listen:""}status(){let iter=new queued_iterator_1.QueuedIteratorImpl;return iter.iterClosed.then(()=>{let idx=this.listeners.indexOf(iter);this.listeners.splice(idx,1)}),this.listeners.push(iter),iter}get info(){return this.protocol.isClosed()?void 0:this.protocol.info}context(){return __awaiter(this,void 0,void 0,function*(){return(yield this.request("$SYS.REQ.USER.INFO")).json((key,value)=>{if(key==="time")return new Date(Date.parse(value));return value})})}stats(){return{inBytes:this.protocol.inBytes,outBytes:this.protocol.outBytes,inMsgs:this.protocol.inMsgs,outMsgs:this.protocol.outMsgs}}jetstreamManager(){return __awaiter(this,arguments,void 0,function*(opts={}){let adm=new jsm_1.JetStreamManagerImpl(this,opts);if(opts.checkAPI!==!1)try{yield adm.getAccountInfo()}catch(err){let ne=err;if(ne.code===core_1.ErrorCode.NoResponders)ne.code=core_1.ErrorCode.JetStreamNotEnabled;throw ne}return adm})}jetstream(opts={}){return new jsclient_1.JetStreamClientImpl(this,opts)}getServerVersion(){let info=this.info;return info?(0,semver_1.parseSemVer)(info.version):void 0}rtt(){return __awaiter(this,void 0,void 0,function*(){if(!this.protocol._closed&&!this.protocol.connected)throw types_1.NatsError.errorForCode(core_1.ErrorCode.Disconnect);let start=Date.now();return yield this.flush(),Date.now()-start})}get features(){return this.protocol.features}get services(){if(!this._services)this._services=new ServicesFactory(this);return this._services}reconnect(){if(this.isClosed())return Promise.reject(types_1.NatsError.errorForCode(core_1.ErrorCode.ConnectionClosed));if(this.isDraining())return Promise.reject(types_1.NatsError.errorForCode(core_1.ErrorCode.ConnectionDraining));return this.protocol.reconnect()}}exports.NatsConnectionImpl=NatsConnectionImpl;class ServicesFactory{constructor(nc){this.nc=nc}add(config){try{return new service_1.ServiceImpl(this.nc,config).start()}catch(err){return Promise.reject(err)}}client(opts,prefix){return new serviceclient_1.ServiceClientImpl(this.nc,opts,prefix)}}exports.ServicesFactory=ServicesFactory});var require_bench=__commonJS((exports)=>{var __awaiter=exports&&exports.__awaiter||function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve5){resolve5(value)})}return new(P||(P=Promise))(function(resolve5,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result2){result2.done?resolve5(result2.value):adopt(result2.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})},__asyncValues=exports&&exports.__asyncValues||function(o){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var m=o[Symbol.asyncIterator],i2;return m?m.call(o):(o=typeof __values==="function"?__values(o):o[Symbol.iterator](),i2={},verb("next"),verb("throw"),verb("return"),i2[Symbol.asyncIterator]=function(){return this},i2);function verb(n){i2[n]=o[n]&&function(v){return new Promise(function(resolve5,reject){v=o[n](v),settle(resolve5,reject,v.done,v.value)})}}function settle(resolve5,reject,d,v){Promise.resolve(v).then(function(v2){resolve5({value:v2,done:d})},reject)}};Object.defineProperty(exports,"__esModule",{value:!0});exports.Bench=exports.Metric=void 0;exports.throughput=throughput;exports.msgThroughput=msgThroughput;exports.humanizeBytes=humanizeBytes;var types_1=require_types(),nuid_1=require_nuid(),util_1=require_util(),core_1=require_core();class Metric{constructor(name,duration){this.name=name,this.duration=duration,this.date=Date.now(),this.payload=0,this.msgs=0,this.bytes=0}toString(){let sec=this.duration/1000,mps=Math.round(this.msgs/sec),label=this.asyncRequests?"asyncRequests":"",minmax="";if(this.max)minmax=`${this.min}/${this.max}`;return`${this.name}${label?" [asyncRequests]":""} ${humanizeNumber(mps)} msgs/sec - [${sec.toFixed(2)} secs] ~ ${throughput(this.bytes,sec)} ${minmax}`}toCsv(){return`"${this.name}",${new Date(this.date).toISOString()},${this.lang},${this.version},${this.msgs},${this.payload},${this.bytes},${this.duration},${this.asyncRequests?this.asyncRequests:!1}
|
|
1738
1738
|
`}static header(){return`Test,Date,Lang,Version,Count,MsgPayload,Bytes,Millis,Async
|
|
1739
|
-
`}}exports.Metric=Metric;class Bench{constructor(nc,opts={msgs:1e5,size:128,subject:"",asyncRequests:!1,pub:!1,sub:!1,req:!1,rep:!1}){if(this.nc=nc,this.callbacks=opts.callbacks||!1,this.msgs=opts.msgs||0,this.size=opts.size||0,this.subject=opts.subject||nuid_1.nuid.next(),this.asyncRequests=opts.asyncRequests||!1,this.pub=opts.pub||!1,this.sub=opts.sub||!1,this.req=opts.req||!1,this.rep=opts.rep||!1,this.perf=new util_1.Perf,this.payload=this.size?new Uint8Array(this.size):types_1.Empty,!this.pub&&!this.sub&&!this.req&&!this.rep)throw Error("no bench option selected")}run(){return __awaiter(this,void 0,void 0,function*(){if(this.nc.closed().then((err)=>{if(err)throw new core_1.NatsError(`bench closed with an error: ${err.message}`,core_1.ErrorCode.Unknown,err)}),this.callbacks)yield this.runCallbacks();else yield this.runAsync();return this.processMetrics()})}processMetrics(){let nc=this.nc,{lang,version}=nc.protocol.transport;if(this.pub&&this.sub)this.perf.measure("pubsub","pubStart","subStop");if(this.req&&this.rep)this.perf.measure("reqrep","reqStart","reqStop");let measures=this.perf.getEntries(),pubsub=measures.find((m)=>m.name==="pubsub"),reqrep=measures.find((m)=>m.name==="reqrep"),req=measures.find((m)=>m.name==="req"),rep=measures.find((m)=>m.name==="rep"),pub=measures.find((m)=>m.name==="pub"),sub=measures.find((m)=>m.name==="sub"),stats=this.nc.stats(),metrics=[];if(pubsub){let{name,duration}=pubsub,m=new Metric(name,duration);m.msgs=this.msgs*2,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(reqrep){let{name,duration}=reqrep,m=new Metric(name,duration);m.msgs=this.msgs*2,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(pub){let{name,duration}=pub,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(sub){let{name,duration}=sub,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.inBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(rep){let{name,duration}=rep,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(req){let{name,duration}=req,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}return metrics}runCallbacks(){return __awaiter(this,void 0,void 0,function*(){let jobs=[];if(this.sub){let d=(0,util_1.deferred)();jobs.push(d);let i2=0;this.nc.subscribe(this.subject,{max:this.msgs,callback:()=>{if(i2++,i2===1)this.perf.mark("subStart");if(i2===this.msgs)this.perf.mark("subStop"),this.perf.measure("sub","subStart","subStop"),d.resolve()}})}if(this.rep){let d=(0,util_1.deferred)();jobs.push(d);let i2=0;this.nc.subscribe(this.subject,{max:this.msgs,callback:(_,m)=>{if(m.respond(this.payload),i2++,i2===1)this.perf.mark("repStart");if(i2===this.msgs)this.perf.mark("repStop"),this.perf.measure("rep","repStart","repStop"),d.resolve()}})}if(this.pub){let job=(()=>__awaiter(this,void 0,void 0,function*(){this.perf.mark("pubStart");for(let i2=0;i2<this.msgs;i2++)this.nc.publish(this.subject,this.payload);yield this.nc.flush(),this.perf.mark("pubStop"),this.perf.measure("pub","pubStart","pubStop")}))();jobs.push(job)}if(this.req){let job=(()=>__awaiter(this,void 0,void 0,function*(){if(this.asyncRequests){this.perf.mark("reqStart");let a=[];for(let i2=0;i2<this.msgs;i2++)a.push(this.nc.request(this.subject,this.payload,{timeout:20000}));yield Promise.all(a),this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}else{this.perf.mark("reqStart");for(let i2=0;i2<this.msgs;i2++)yield this.nc.request(this.subject);this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}}))();jobs.push(job)}yield Promise.all(jobs)})}runAsync(){return __awaiter(this,void 0,void 0,function*(){let jobs=[];if(this.rep){let first=!1,sub=this.nc.subscribe(this.subject,{max:this.msgs}),job=(()=>__awaiter(this,void 0,void 0,function*(){var _a,e_1,_b,_c;try{for(var _d=!0,sub_1=__asyncValues(sub),sub_1_1;sub_1_1=yield sub_1.next(),_a=sub_1_1.done,!_a;_d=!0){_c=sub_1_1.value,_d=!1;let m=_c;if(!first)this.perf.mark("repStart"),first=!0;m.respond(this.payload)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{if(!_d&&!_a&&(_b=sub_1.return))yield _b.call(sub_1)}finally{if(e_1)throw e_1.error}}yield this.nc.flush(),this.perf.mark("repStop"),this.perf.measure("rep","repStart","repStop")}))();jobs.push(job)}if(this.sub){let first=!1,sub=this.nc.subscribe(this.subject,{max:this.msgs}),job=(()=>__awaiter(this,void 0,void 0,function*(){var _a,e_2,_b,_c;try{for(var _d=!0,sub_2=__asyncValues(sub),sub_2_1;sub_2_1=yield sub_2.next(),_a=sub_2_1.done,!_a;_d=!0){_c=sub_2_1.value,_d=!1;let _m=_c;if(!first)this.perf.mark("subStart"),first=!0}}catch(e_2_1){e_2={error:e_2_1}}finally{try{if(!_d&&!_a&&(_b=sub_2.return))yield _b.call(sub_2)}finally{if(e_2)throw e_2.error}}this.perf.mark("subStop"),this.perf.measure("sub","subStart","subStop")}))();jobs.push(job)}if(this.pub){let job=(()=>__awaiter(this,void 0,void 0,function*(){this.perf.mark("pubStart");for(let i2=0;i2<this.msgs;i2++)this.nc.publish(this.subject,this.payload);yield this.nc.flush(),this.perf.mark("pubStop"),this.perf.measure("pub","pubStart","pubStop")}))();jobs.push(job)}if(this.req){let job=(()=>__awaiter(this,void 0,void 0,function*(){if(this.asyncRequests){this.perf.mark("reqStart");let a=[];for(let i2=0;i2<this.msgs;i2++)a.push(this.nc.request(this.subject,this.payload,{timeout:20000}));yield Promise.all(a),this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}else{this.perf.mark("reqStart");for(let i2=0;i2<this.msgs;i2++)yield this.nc.request(this.subject);this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}}))();jobs.push(job)}yield Promise.all(jobs)})}}exports.Bench=Bench;function throughput(bytes,seconds){return`${humanizeBytes(bytes/seconds)}/sec`}function msgThroughput(msgs,seconds){return`${Math.floor(msgs/seconds)} msgs/sec`}function humanizeBytes(bytes,si=!1){let base=si?1000:1024,pre=si?["k","M","G","T","P","E"]:["K","M","G","T","P","E"],post=si?"iB":"B";if(bytes<base)return`${bytes.toFixed(2)} ${post}`;let exp=parseInt(Math.log(bytes)/Math.log(base)+""),index=parseInt(exp-1+"");return`${(bytes/Math.pow(base,exp)).toFixed(2)} ${pre[index]}${post}`}function humanizeNumber(n){return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}});var require_internal_mod=__commonJS((exports)=>{var __createBinding=exports&&exports.__createBinding||(Object.create?function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable))desc={enumerable:!0,get:function(){return m[k]}};Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports2,p))__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});exports.parseIP=exports.isIP=exports.TE=exports.TD=exports.Metric=exports.Bench=exports.writeAll=exports.readAll=exports.MAX_SIZE=exports.DenoBuffer=exports.State=exports.Parser=exports.Kind=exports.QueuedIteratorImpl=exports.StringCodec=exports.JSONCodec=exports.usernamePasswordAuthenticator=exports.tokenAuthenticator=exports.nkeyAuthenticator=exports.jwtAuthenticator=exports.credsAuthenticator=exports.RequestOne=exports.checkUnsupportedOption=exports.checkOptions=exports.buildAuthenticator=exports.DataBuffer=exports.MuxSubscription=exports.Heartbeat=exports.MsgHdrsImpl=exports.headers=exports.canonicalMIMEHeaderKey=exports.timeout=exports.render=exports.nanos=exports.millis=exports.extend=exports.delay=exports.deferred=exports.deadline=exports.collect=exports.backoff=exports.ProtocolHandler=exports.INFO=exports.Connect=exports.setTransportFactory=exports.getResolveFn=exports.MsgImpl=exports.nuid=exports.Nuid=exports.NatsConnectionImpl=void 0;exports.Subscriptions=exports.SubscriptionImpl=exports.syncIterator=exports.ServiceVerb=exports.ServiceResponseType=exports.ServiceErrorHeader=exports.ServiceErrorCodeHeader=exports.ServiceError=exports.RequestStrategy=exports.NatsError=exports.Match=exports.isNatsError=exports.Events=exports.ErrorCode=exports.DebugEvents=exports.createInbox=exports.extractProtocolMessage=exports.Empty=exports.parseSemVer=exports.compare=exports.NoopKvCodecs=exports.defaultBucketOpts=exports.Bucket=exports.Base64KeyCodec=exports.TypedSubscription=void 0;var nats_1=require_nats();Object.defineProperty(exports,"NatsConnectionImpl",{enumerable:!0,get:function(){return nats_1.NatsConnectionImpl}});var nuid_1=require_nuid();Object.defineProperty(exports,"Nuid",{enumerable:!0,get:function(){return nuid_1.Nuid}});Object.defineProperty(exports,"nuid",{enumerable:!0,get:function(){return nuid_1.nuid}});var msg_1=require_msg();Object.defineProperty(exports,"MsgImpl",{enumerable:!0,get:function(){return msg_1.MsgImpl}});var transport_1=require_transport();Object.defineProperty(exports,"getResolveFn",{enumerable:!0,get:function(){return transport_1.getResolveFn}});Object.defineProperty(exports,"setTransportFactory",{enumerable:!0,get:function(){return transport_1.setTransportFactory}});var protocol_1=require_protocol();Object.defineProperty(exports,"Connect",{enumerable:!0,get:function(){return protocol_1.Connect}});Object.defineProperty(exports,"INFO",{enumerable:!0,get:function(){return protocol_1.INFO}});Object.defineProperty(exports,"ProtocolHandler",{enumerable:!0,get:function(){return protocol_1.ProtocolHandler}});var util_1=require_util();Object.defineProperty(exports,"backoff",{enumerable:!0,get:function(){return util_1.backoff}});Object.defineProperty(exports,"collect",{enumerable:!0,get:function(){return util_1.collect}});Object.defineProperty(exports,"deadline",{enumerable:!0,get:function(){return util_1.deadline}});Object.defineProperty(exports,"deferred",{enumerable:!0,get:function(){return util_1.deferred}});Object.defineProperty(exports,"delay",{enumerable:!0,get:function(){return util_1.delay}});Object.defineProperty(exports,"extend",{enumerable:!0,get:function(){return util_1.extend}});Object.defineProperty(exports,"millis",{enumerable:!0,get:function(){return util_1.millis}});Object.defineProperty(exports,"nanos",{enumerable:!0,get:function(){return util_1.nanos}});Object.defineProperty(exports,"render",{enumerable:!0,get:function(){return util_1.render}});Object.defineProperty(exports,"timeout",{enumerable:!0,get:function(){return util_1.timeout}});var headers_1=require_headers();Object.defineProperty(exports,"canonicalMIMEHeaderKey",{enumerable:!0,get:function(){return headers_1.canonicalMIMEHeaderKey}});Object.defineProperty(exports,"headers",{enumerable:!0,get:function(){return headers_1.headers}});Object.defineProperty(exports,"MsgHdrsImpl",{enumerable:!0,get:function(){return headers_1.MsgHdrsImpl}});var heartbeats_1=require_heartbeats();Object.defineProperty(exports,"Heartbeat",{enumerable:!0,get:function(){return heartbeats_1.Heartbeat}});var muxsubscription_1=require_muxsubscription();Object.defineProperty(exports,"MuxSubscription",{enumerable:!0,get:function(){return muxsubscription_1.MuxSubscription}});var databuffer_1=require_databuffer();Object.defineProperty(exports,"DataBuffer",{enumerable:!0,get:function(){return databuffer_1.DataBuffer}});var options_1=require_options();Object.defineProperty(exports,"buildAuthenticator",{enumerable:!0,get:function(){return options_1.buildAuthenticator}});Object.defineProperty(exports,"checkOptions",{enumerable:!0,get:function(){return options_1.checkOptions}});Object.defineProperty(exports,"checkUnsupportedOption",{enumerable:!0,get:function(){return options_1.checkUnsupportedOption}});var request_1=require_request();Object.defineProperty(exports,"RequestOne",{enumerable:!0,get:function(){return request_1.RequestOne}});var authenticator_1=require_authenticator();Object.defineProperty(exports,"credsAuthenticator",{enumerable:!0,get:function(){return authenticator_1.credsAuthenticator}});Object.defineProperty(exports,"jwtAuthenticator",{enumerable:!0,get:function(){return authenticator_1.jwtAuthenticator}});Object.defineProperty(exports,"nkeyAuthenticator",{enumerable:!0,get:function(){return authenticator_1.nkeyAuthenticator}});Object.defineProperty(exports,"tokenAuthenticator",{enumerable:!0,get:function(){return authenticator_1.tokenAuthenticator}});Object.defineProperty(exports,"usernamePasswordAuthenticator",{enumerable:!0,get:function(){return authenticator_1.usernamePasswordAuthenticator}});var codec_1=require_codec();Object.defineProperty(exports,"JSONCodec",{enumerable:!0,get:function(){return codec_1.JSONCodec}});Object.defineProperty(exports,"StringCodec",{enumerable:!0,get:function(){return codec_1.StringCodec}});__exportStar(require_nkeys2(),exports);var queued_iterator_1=require_queued_iterator();Object.defineProperty(exports,"QueuedIteratorImpl",{enumerable:!0,get:function(){return queued_iterator_1.QueuedIteratorImpl}});var parser_1=require_parser();Object.defineProperty(exports,"Kind",{enumerable:!0,get:function(){return parser_1.Kind}});Object.defineProperty(exports,"Parser",{enumerable:!0,get:function(){return parser_1.Parser}});Object.defineProperty(exports,"State",{enumerable:!0,get:function(){return parser_1.State}});var denobuffer_1=require_denobuffer();Object.defineProperty(exports,"DenoBuffer",{enumerable:!0,get:function(){return denobuffer_1.DenoBuffer}});Object.defineProperty(exports,"MAX_SIZE",{enumerable:!0,get:function(){return denobuffer_1.MAX_SIZE}});Object.defineProperty(exports,"readAll",{enumerable:!0,get:function(){return denobuffer_1.readAll}});Object.defineProperty(exports,"writeAll",{enumerable:!0,get:function(){return denobuffer_1.writeAll}});var bench_1=require_bench();Object.defineProperty(exports,"Bench",{enumerable:!0,get:function(){return bench_1.Bench}});Object.defineProperty(exports,"Metric",{enumerable:!0,get:function(){return bench_1.Metric}});var encoders_1=require_encoders();Object.defineProperty(exports,"TD",{enumerable:!0,get:function(){return encoders_1.TD}});Object.defineProperty(exports,"TE",{enumerable:!0,get:function(){return encoders_1.TE}});var ipparser_1=require_ipparser();Object.defineProperty(exports,"isIP",{enumerable:!0,get:function(){return ipparser_1.isIP}});Object.defineProperty(exports,"parseIP",{enumerable:!0,get:function(){return ipparser_1.parseIP}});var typedsub_1=require_typedsub();Object.defineProperty(exports,"TypedSubscription",{enumerable:!0,get:function(){return typedsub_1.TypedSubscription}});var kv_1=require_kv();Object.defineProperty(exports,"Base64KeyCodec",{enumerable:!0,get:function(){return kv_1.Base64KeyCodec}});Object.defineProperty(exports,"Bucket",{enumerable:!0,get:function(){return kv_1.Bucket}});Object.defineProperty(exports,"defaultBucketOpts",{enumerable:!0,get:function(){return kv_1.defaultBucketOpts}});Object.defineProperty(exports,"NoopKvCodecs",{enumerable:!0,get:function(){return kv_1.NoopKvCodecs}});var semver_1=require_semver();Object.defineProperty(exports,"compare",{enumerable:!0,get:function(){return semver_1.compare}});Object.defineProperty(exports,"parseSemVer",{enumerable:!0,get:function(){return semver_1.parseSemVer}});var types_1=require_types();Object.defineProperty(exports,"Empty",{enumerable:!0,get:function(){return types_1.Empty}});var transport_2=require_transport();Object.defineProperty(exports,"extractProtocolMessage",{enumerable:!0,get:function(){return transport_2.extractProtocolMessage}});var core_1=require_core();Object.defineProperty(exports,"createInbox",{enumerable:!0,get:function(){return core_1.createInbox}});Object.defineProperty(exports,"DebugEvents",{enumerable:!0,get:function(){return core_1.DebugEvents}});Object.defineProperty(exports,"ErrorCode",{enumerable:!0,get:function(){return core_1.ErrorCode}});Object.defineProperty(exports,"Events",{enumerable:!0,get:function(){return core_1.Events}});Object.defineProperty(exports,"isNatsError",{enumerable:!0,get:function(){return core_1.isNatsError}});Object.defineProperty(exports,"Match",{enumerable:!0,get:function(){return core_1.Match}});Object.defineProperty(exports,"NatsError",{enumerable:!0,get:function(){return core_1.NatsError}});Object.defineProperty(exports,"RequestStrategy",{enumerable:!0,get:function(){return core_1.RequestStrategy}});Object.defineProperty(exports,"ServiceError",{enumerable:!0,get:function(){return core_1.ServiceError}});Object.defineProperty(exports,"ServiceErrorCodeHeader",{enumerable:!0,get:function(){return core_1.ServiceErrorCodeHeader}});Object.defineProperty(exports,"ServiceErrorHeader",{enumerable:!0,get:function(){return core_1.ServiceErrorHeader}});Object.defineProperty(exports,"ServiceResponseType",{enumerable:!0,get:function(){return core_1.ServiceResponseType}});Object.defineProperty(exports,"ServiceVerb",{enumerable:!0,get:function(){return core_1.ServiceVerb}});Object.defineProperty(exports,"syncIterator",{enumerable:!0,get:function(){return core_1.syncIterator}});var protocol_2=require_protocol();Object.defineProperty(exports,"SubscriptionImpl",{enumerable:!0,get:function(){return protocol_2.SubscriptionImpl}});Object.defineProperty(exports,"Subscriptions",{enumerable:!0,get:function(){return protocol_2.Subscriptions}})});var require_internal_mod2=__commonJS((exports)=>{Object.defineProperty(exports,"__esModule",{value:!0});exports.ConsumerEvents=exports.ConsumerDebugEvents=exports.StoreCompression=exports.StorageType=exports.RetentionPolicy=exports.ReplayPolicy=exports.DiscardPolicy=exports.DeliverPolicy=exports.AckPolicy=exports.RepublishHeaders=exports.KvWatchInclude=exports.JsHeaders=exports.isConsumerOptsBuilder=exports.DirectMsgHeaders=exports.consumerOpts=exports.AdvisoryKind=exports.isHeartbeatMsg=exports.isFlowControlMsg=exports.checkJsError=void 0;var jsutil_1=require_jsutil();Object.defineProperty(exports,"checkJsError",{enumerable:!0,get:function(){return jsutil_1.checkJsError}});Object.defineProperty(exports,"isFlowControlMsg",{enumerable:!0,get:function(){return jsutil_1.isFlowControlMsg}});Object.defineProperty(exports,"isHeartbeatMsg",{enumerable:!0,get:function(){return jsutil_1.isHeartbeatMsg}});var types_1=require_types2();Object.defineProperty(exports,"AdvisoryKind",{enumerable:!0,get:function(){return types_1.AdvisoryKind}});Object.defineProperty(exports,"consumerOpts",{enumerable:!0,get:function(){return types_1.consumerOpts}});Object.defineProperty(exports,"DirectMsgHeaders",{enumerable:!0,get:function(){return types_1.DirectMsgHeaders}});Object.defineProperty(exports,"isConsumerOptsBuilder",{enumerable:!0,get:function(){return types_1.isConsumerOptsBuilder}});Object.defineProperty(exports,"JsHeaders",{enumerable:!0,get:function(){return types_1.JsHeaders}});Object.defineProperty(exports,"KvWatchInclude",{enumerable:!0,get:function(){return types_1.KvWatchInclude}});Object.defineProperty(exports,"RepublishHeaders",{enumerable:!0,get:function(){return types_1.RepublishHeaders}});var jsapi_types_1=require_jsapi_types();Object.defineProperty(exports,"AckPolicy",{enumerable:!0,get:function(){return jsapi_types_1.AckPolicy}});Object.defineProperty(exports,"DeliverPolicy",{enumerable:!0,get:function(){return jsapi_types_1.DeliverPolicy}});Object.defineProperty(exports,"DiscardPolicy",{enumerable:!0,get:function(){return jsapi_types_1.DiscardPolicy}});Object.defineProperty(exports,"ReplayPolicy",{enumerable:!0,get:function(){return jsapi_types_1.ReplayPolicy}});Object.defineProperty(exports,"RetentionPolicy",{enumerable:!0,get:function(){return jsapi_types_1.RetentionPolicy}});Object.defineProperty(exports,"StorageType",{enumerable:!0,get:function(){return jsapi_types_1.StorageType}});Object.defineProperty(exports,"StoreCompression",{enumerable:!0,get:function(){return jsapi_types_1.StoreCompression}});var consumer_1=require_consumer();Object.defineProperty(exports,"ConsumerDebugEvents",{enumerable:!0,get:function(){return consumer_1.ConsumerDebugEvents}});Object.defineProperty(exports,"ConsumerEvents",{enumerable:!0,get:function(){return consumer_1.ConsumerEvents}})});var require_nats_base_client=__commonJS((exports)=>{var __createBinding=exports&&exports.__createBinding||(Object.create?function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable))desc={enumerable:!0,get:function(){return m[k]}};Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports2,p))__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});__exportStar(require_internal_mod(),exports);__exportStar(require_internal_mod2(),exports)});var require_node_transport=__commonJS((exports)=>{var __awaiter=exports&&exports.__awaiter||function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve6){resolve6(value)})}return new(P||(P=Promise))(function(resolve6,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result2){result2.done?resolve6(result2.value):adopt(result2.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})},__await=exports&&exports.__await||function(v){return this instanceof __await?(this.v=v,this):new __await(v)},__asyncGenerator=exports&&exports.__asyncGenerator||function(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var g=generator.apply(thisArg,_arguments||[]),i2,q=[];return i2=Object.create((typeof AsyncIterator==="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i2[Symbol.asyncIterator]=function(){return this},i2;function awaitReturn(f){return function(v){return Promise.resolve(v).then(f,reject)}}function verb(n,f){if(g[n]){if(i2[n]=function(v){return new Promise(function(a,b2){q.push([n,v,a,b2])>1||resume(n,v)})},f)i2[n]=f(i2[n])}}function resume(n,v){try{step(g[n](v))}catch(e){settle(q[0][3],e)}}function step(r){r.value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(q[0][2],r)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f,v){if(f(v),q.shift(),q.length)resume(q[0][0],q[0][1])}};Object.defineProperty(exports,"__esModule",{value:!0});exports.NodeTransport=void 0;exports.nodeResolveHost=nodeResolveHost;var nats_base_client_1=require_nats_base_client(),net_1=__require("net"),util_1=require_util(),tls_1=__require("tls"),{resolve:resolve5}=__require("path"),{readFile:readFile8,existsSync:existsSync26}=__require("fs"),dns=__require("dns"),VERSION2="2.29.3",LANG="nats.js";class NodeTransport{constructor(){this.yields=[],this.signal=(0,nats_base_client_1.deferred)(),this.closedNotification=(0,nats_base_client_1.deferred)(),this.connected=!1,this.tlsName="",this.done=!1,this.lang=LANG,this.version=VERSION2}connect(hp,options){return __awaiter(this,void 0,void 0,function*(){this.tlsName=hp.tlsName,this.options=options;let{tls:tls2}=this.options,{handshakeFirst}=tls2||{};try{if(handshakeFirst===!0)this.socket=yield this.tlsFirst(hp);else this.socket=yield this.dial(hp);let info=yield this.peekInfo();(0,nats_base_client_1.checkOptions)(info,options);let{tls_required:tlsRequired,tls_available:tlsAvailable}=info,desired=tlsAvailable===!0&&options.tls!==null;if(!handshakeFirst&&(tlsRequired||desired))this.socket=yield this.startTLS();if(tlsRequired&&this.socket.encrypted!==!0)throw new nats_base_client_1.NatsError("tls",nats_base_client_1.ErrorCode.ServerOptionNotAvailable);return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(err){if(!err)err=nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.ConnectionRefused,Error("node provided an undefined error!"));let{code}=err,perr=code==="ECONNREFUSED"?nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.ConnectionRefused,err):err;if(this.socket)this.socket.destroy();throw perr}})}dial(hp){let d=(0,nats_base_client_1.deferred)(),dialError,socket=(0,net_1.createConnection)(hp.port,hp.hostname,()=>{d.resolve(socket),socket.removeAllListeners()});return socket.on("error",(err)=>{dialError=err}),socket.on("close",()=>{socket.removeAllListeners(),d.reject(dialError)}),socket.setNoDelay(!0),d}get isClosed(){return this.done}close(err){return this._closed(err,!1)}peekInfo(){let d=(0,nats_base_client_1.deferred)(),peekError;return this.socket.on("data",(frame)=>{this.yields.push(frame);let t=nats_base_client_1.DataBuffer.concat(...this.yields),pm=(0,nats_base_client_1.extractProtocolMessage)(t);if(pm!=="")try{let m=nats_base_client_1.INFO.exec(pm);if(!m)throw Error("unexpected response from server");let info=JSON.parse(m[1]);d.resolve(info)}catch(err){d.reject(err)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(err)=>{peekError=err}),this.socket.on("close",()=>{this.socket.removeAllListeners(),d.reject(peekError)}),d}loadFile(fn){if(!fn)return Promise.resolve();let d=(0,nats_base_client_1.deferred)();try{if(fn=resolve5(fn),!existsSync26(fn))d.reject(Error(`${fn} doesn't exist`));readFile8(fn,(err,data)=>{if(err)return d.reject(err);d.resolve(data)})}catch(err){d.reject(err)}return d}loadClientCerts(){return __awaiter(this,void 0,void 0,function*(){let tlsOpts={},{certFile,cert,caFile,ca,keyFile,key}=this.options.tls;try{if(certFile){let data=yield this.loadFile(certFile);if(data)tlsOpts.cert=data}else if(cert)tlsOpts.cert=cert;if(keyFile){let data=yield this.loadFile(keyFile);if(data)tlsOpts.key=data}else if(key)tlsOpts.key=key;if(caFile){let data=yield this.loadFile(caFile);if(data)tlsOpts.ca=[data]}else if(ca)tlsOpts.ca=ca;return Promise.resolve(tlsOpts)}catch(err){return Promise.reject(err)}})}tlsFirst(hp){return __awaiter(this,void 0,void 0,function*(){let tlsError,tlsOpts={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)tlsOpts.socket=this.socket;if(typeof this.options.tls==="object")try{let certOpts=(yield this.loadClientCerts())||{};tlsOpts=(0,util_1.extend)(tlsOpts,this.options.tls,certOpts)}catch(err){return Promise.reject(new nats_base_client_1.NatsError(err.message,nats_base_client_1.ErrorCode.Tls,err))}let d=(0,nats_base_client_1.deferred)();try{let tlsSocket=(0,tls_1.connect)(hp.port,hp.hostname,tlsOpts,()=>{tlsSocket.removeAllListeners(),d.resolve(tlsSocket)});tlsSocket.on("error",(err)=>{tlsError=err}),tlsSocket.on("secureConnect",()=>{if(tlsOpts.rejectUnauthorized===!1)return;if(!tlsSocket.authorized)throw tlsSocket.authorizationError}),tlsSocket.on("close",()=>{d.reject(tlsError),tlsSocket.removeAllListeners()}),tlsSocket.setNoDelay(!0)}catch(err){d.reject(nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.Tls,err))}return d})}startTLS(){return __awaiter(this,void 0,void 0,function*(){let tlsError,tlsOpts={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let certOpts=(yield this.loadClientCerts())||{};tlsOpts=(0,util_1.extend)(tlsOpts,this.options.tls,certOpts)}catch(err){return Promise.reject(new nats_base_client_1.NatsError(err.message,nats_base_client_1.ErrorCode.Tls,err))}let d=(0,nats_base_client_1.deferred)();try{let tlsSocket=(0,tls_1.connect)(tlsOpts,()=>{tlsSocket.removeAllListeners(),d.resolve(tlsSocket)});tlsSocket.on("error",(err)=>{tlsError=err}),tlsSocket.on("secureConnect",()=>{if(tlsOpts.rejectUnauthorized===!1)return;if(!tlsSocket.authorized)throw tlsSocket.authorizationError}),tlsSocket.on("close",()=>{d.reject(tlsError),tlsSocket.removeAllListeners()})}catch(err){d.reject(nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.Tls,err))}return d})}setupHandlers(){let connError;this.socket.on("data",(frame)=>{return this.yields.push(frame),this.signal.resolve()}),this.socket.on("error",(err)=>{connError=err}),this.socket.on("end",()=>{var _a,_b;if((_a=this.socket)===null||_a===void 0?void 0:_a.destroyed)return;(_b=this.socket)===null||_b===void 0||_b.write(new Uint8Array(0),()=>{var _a2;(_a2=this.socket)===null||_a2===void 0||_a2.end()})}),this.socket.on("close",()=>{this._closed(connError,!1)})}[Symbol.asyncIterator](){return this.iterate()}iterate(){return __asyncGenerator(this,arguments,function*(){let debug2=this.options.debug;while(!0){if(this.yields.length===0)yield __await(this.signal);let yields=this.yields;this.yields=[];for(let i2=0;i2<yields.length;i2++){if(debug2)console.info(`> ${(0,nats_base_client_1.render)(yields[i2])}`);yield yield __await(yields[i2])}if(this.done)break;else if(this.yields.length===0)yields.length=0,this.yields=yields,this.signal=(0,nats_base_client_1.deferred)()}})}discard(){}disconnect(){this._closed(void 0,!0).then().catch()}isEncrypted(){return this.socket instanceof tls_1.TLSSocket}_send(frame){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,nats_base_client_1.render)(frame)}`);let d=(0,nats_base_client_1.deferred)();try{this.socket.write(frame,(err)=>{if(err){if(this.options.debug)console.error(`!!! ${(0,nats_base_client_1.render)(frame)}: ${err}`);return d.reject(err)}return d.resolve()})}catch(err){if(this.options.debug)console.error(`!!! ${(0,nats_base_client_1.render)(frame)}: ${err}`);d.reject(err)}return d}send(frame){this._send(frame).catch((_err)=>{})}_closed(err_1){return __awaiter(this,arguments,void 0,function*(err,internal=!0){if(!this.connected)return;if(this.done)return;if(this.closeError=err,!err&&this.socket&&internal)try{yield this._send(new TextEncoder().encode(""))}catch(err2){if(this.options.debug)console.log("transport close terminated with an error",err2)}try{if(this.socket)this.socket.removeAllListeners(),this.socket.destroy(),this.socket=void 0}catch(err2){console.log(err2)}this.done=!0,this.closedNotification.resolve(this.closeError)})}closed(){return this.closedNotification}}exports.NodeTransport=NodeTransport;function nodeResolveHost(s){return __awaiter(this,void 0,void 0,function*(){let a=(0,nats_base_client_1.deferred)(),aaaa=(0,nats_base_client_1.deferred)();dns.resolve4(s,(err,records)=>{if(err)a.resolve(err);else a.resolve(records)}),dns.resolve6(s,(err,records)=>{if(err)aaaa.resolve(err);else aaaa.resolve(records)});let ips=[],da=yield a;if(Array.isArray(da))ips.push(...da);let daaaa=yield aaaa;if(Array.isArray(daaaa))ips.push(...daaaa);if(ips.length===0)ips.push(s);return ips})}});var require_connect=__commonJS((exports)=>{Object.defineProperty(exports,"__esModule",{value:!0});exports.connect=connect;var node_transport_1=require_node_transport(),nats_base_client_1=require_nats_base_client();function connect(opts={}){return(0,nats_base_client_1.setTransportFactory)({factory:()=>{return new node_transport_1.NodeTransport},dnsResolveFn:node_transport_1.nodeResolveHost}),nats_base_client_1.NatsConnectionImpl.connect(opts)}});var require_mod3=__commonJS((exports)=>{Object.defineProperty(exports,"__esModule",{value:!0});exports.consumerOpts=exports.StoreCompression=exports.StorageType=exports.RetentionPolicy=exports.RepublishHeaders=exports.ReplayPolicy=exports.KvWatchInclude=exports.JsHeaders=exports.DiscardPolicy=exports.DirectMsgHeaders=exports.DeliverPolicy=exports.ConsumerEvents=exports.ConsumerDebugEvents=exports.AdvisoryKind=exports.AckPolicy=exports.isHeartbeatMsg=exports.isFlowControlMsg=exports.checkJsError=void 0;var internal_mod_1=require_internal_mod2();Object.defineProperty(exports,"checkJsError",{enumerable:!0,get:function(){return internal_mod_1.checkJsError}});Object.defineProperty(exports,"isFlowControlMsg",{enumerable:!0,get:function(){return internal_mod_1.isFlowControlMsg}});Object.defineProperty(exports,"isHeartbeatMsg",{enumerable:!0,get:function(){return internal_mod_1.isHeartbeatMsg}});var internal_mod_2=require_internal_mod2();Object.defineProperty(exports,"AckPolicy",{enumerable:!0,get:function(){return internal_mod_2.AckPolicy}});Object.defineProperty(exports,"AdvisoryKind",{enumerable:!0,get:function(){return internal_mod_2.AdvisoryKind}});Object.defineProperty(exports,"ConsumerDebugEvents",{enumerable:!0,get:function(){return internal_mod_2.ConsumerDebugEvents}});Object.defineProperty(exports,"ConsumerEvents",{enumerable:!0,get:function(){return internal_mod_2.ConsumerEvents}});Object.defineProperty(exports,"DeliverPolicy",{enumerable:!0,get:function(){return internal_mod_2.DeliverPolicy}});Object.defineProperty(exports,"DirectMsgHeaders",{enumerable:!0,get:function(){return internal_mod_2.DirectMsgHeaders}});Object.defineProperty(exports,"DiscardPolicy",{enumerable:!0,get:function(){return internal_mod_2.DiscardPolicy}});Object.defineProperty(exports,"JsHeaders",{enumerable:!0,get:function(){return internal_mod_2.JsHeaders}});Object.defineProperty(exports,"KvWatchInclude",{enumerable:!0,get:function(){return internal_mod_2.KvWatchInclude}});Object.defineProperty(exports,"ReplayPolicy",{enumerable:!0,get:function(){return internal_mod_2.ReplayPolicy}});Object.defineProperty(exports,"RepublishHeaders",{enumerable:!0,get:function(){return internal_mod_2.RepublishHeaders}});Object.defineProperty(exports,"RetentionPolicy",{enumerable:!0,get:function(){return internal_mod_2.RetentionPolicy}});Object.defineProperty(exports,"StorageType",{enumerable:!0,get:function(){return internal_mod_2.StorageType}});Object.defineProperty(exports,"StoreCompression",{enumerable:!0,get:function(){return internal_mod_2.StoreCompression}});var types_1=require_types2();Object.defineProperty(exports,"consumerOpts",{enumerable:!0,get:function(){return types_1.consumerOpts}})});var require_mod4=__commonJS((exports)=>{var __createBinding=exports&&exports.__createBinding||(Object.create?function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable))desc={enumerable:!0,get:function(){return m[k]}};Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports2,p))__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});exports.connect=void 0;if(typeof TextEncoder>"u"){let{TextEncoder:TextEncoder2,TextDecoder:TextDecoder2}=__require("util");global.TextEncoder=TextEncoder2,global.TextDecoder=TextDecoder2}if(typeof globalThis.crypto>"u"){let c=__require("crypto");global.crypto=c.webcrypto}if(typeof globalThis.ReadableStream>"u"){let chunks=process.versions.node.split(".");if(parseInt(chunks[0])>=16){let streams=__require("stream/web");global.ReadableStream=streams.ReadableStream}}var connect_1=require_connect();Object.defineProperty(exports,"connect",{enumerable:!0,get:function(){return connect_1.connect}});__exportStar(require_mod2(),exports);__exportStar(require_mod3(),exports)});var exports_omni_approval_handler={};__export(exports_omni_approval_handler,{startOmniApprovalHandler:()=>startOmniApprovalHandler});class OmniApprovalHandler{nc=null;subs=[];sc=import_nats.StringCodec();permissions;natsUrl;approveTokens;denyTokens;constructor(config){this.permissions=config.permissions,this.natsUrl=config.natsUrl??"localhost:4222",this.approveTokens=(config.permissions.approveTokens??DEFAULT_APPROVE_TOKENS).map((t)=>t.toLowerCase()),this.denyTokens=(config.permissions.denyTokens??DEFAULT_DENY_TOKENS).map((t)=>t.toLowerCase())}async start(){let{omniChat,omniInstance}=this.permissions;if(!omniChat||!omniInstance)return;this.nc=await import_nats.connect({servers:this.natsUrl});let messageTopic=`omni.message.${omniInstance}.>`,msgSub=this.nc.subscribe(messageTopic);this.subs.push(msgSub),this.processMessages(msgSub);let eventSub=this.nc.subscribe("omni.event.>");this.subs.push(eventSub),this.processEvents(eventSub),handlerInstance=this,console.log(`[omni-approval] Listening for approval replies on ${messageTopic}`)}async stop(){for(let sub of this.subs)sub.unsubscribe();if(this.subs=[],this.nc)await this.nc.close(),this.nc=null;if(handlerInstance===this)handlerInstance=null}async processMessages(sub){for await(let msg of sub)try{let data=JSON.parse(this.sc.decode(msg.data));if((data.chatId??this.extractChatIdFromSubject(msg.subject))!==this.permissions.omniChat)continue;if(data.content)await this.handleTextReply(data.content,data.sender??"whatsapp-user")}catch{}}async processEvents(sub){for await(let msg of sub)try{let data=JSON.parse(this.sc.decode(msg.data));if(data.type!=="reaction")continue;if(data.chatId!==this.permissions.omniChat&&data.instanceId!==this.permissions.omniInstance)continue;if(data.emoji&&data.messageId)await this.handleReaction(data.emoji,data.messageId,data.sender??"whatsapp-user")}catch{}}extractChatIdFromSubject(subject){let parts=subject.split(".");if(parts.length>=4)return parts.slice(3).join(".");return}async handleTextReply(content,sender){let normalized=content.trim().toLowerCase();if(!normalized)return!1;let decision=null;if(this.approveTokens.includes(normalized))decision="allow";else if(this.denyTokens.includes(normalized))decision="deny";if(!decision)return!1;let pending=await listPendingApprovals();if(pending.length===0)return!1;let oldest=pending[0],resolved=await resolveApproval(oldest.id,decision,sender);if(resolved)console.log(`[omni-approval] Resolved ${oldest.id} as ${decision} by ${sender} (text: "${normalized}")`);return resolved}async handleReaction(emoji,messageId,sender){let decision=null;if(DEFAULT_APPROVE_REACTIONS.includes(emoji))decision="allow";else if(DEFAULT_DENY_REACTIONS.includes(emoji))decision="deny";if(!decision)return!1;try{let sql=await getConnection(),[approval]=await sql`
|
|
1739
|
+
`}}exports.Metric=Metric;class Bench{constructor(nc,opts={msgs:1e5,size:128,subject:"",asyncRequests:!1,pub:!1,sub:!1,req:!1,rep:!1}){if(this.nc=nc,this.callbacks=opts.callbacks||!1,this.msgs=opts.msgs||0,this.size=opts.size||0,this.subject=opts.subject||nuid_1.nuid.next(),this.asyncRequests=opts.asyncRequests||!1,this.pub=opts.pub||!1,this.sub=opts.sub||!1,this.req=opts.req||!1,this.rep=opts.rep||!1,this.perf=new util_1.Perf,this.payload=this.size?new Uint8Array(this.size):types_1.Empty,!this.pub&&!this.sub&&!this.req&&!this.rep)throw Error("no bench option selected")}run(){return __awaiter(this,void 0,void 0,function*(){if(this.nc.closed().then((err)=>{if(err)throw new core_1.NatsError(`bench closed with an error: ${err.message}`,core_1.ErrorCode.Unknown,err)}),this.callbacks)yield this.runCallbacks();else yield this.runAsync();return this.processMetrics()})}processMetrics(){let nc=this.nc,{lang,version}=nc.protocol.transport;if(this.pub&&this.sub)this.perf.measure("pubsub","pubStart","subStop");if(this.req&&this.rep)this.perf.measure("reqrep","reqStart","reqStop");let measures=this.perf.getEntries(),pubsub=measures.find((m)=>m.name==="pubsub"),reqrep=measures.find((m)=>m.name==="reqrep"),req=measures.find((m)=>m.name==="req"),rep=measures.find((m)=>m.name==="rep"),pub=measures.find((m)=>m.name==="pub"),sub=measures.find((m)=>m.name==="sub"),stats=this.nc.stats(),metrics=[];if(pubsub){let{name,duration}=pubsub,m=new Metric(name,duration);m.msgs=this.msgs*2,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(reqrep){let{name,duration}=reqrep,m=new Metric(name,duration);m.msgs=this.msgs*2,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(pub){let{name,duration}=pub,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(sub){let{name,duration}=sub,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.inBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(rep){let{name,duration}=rep,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}if(req){let{name,duration}=req,m=new Metric(name,duration);m.msgs=this.msgs,m.bytes=stats.inBytes+stats.outBytes,m.lang=lang,m.version=version,m.payload=this.payload.length,metrics.push(m)}return metrics}runCallbacks(){return __awaiter(this,void 0,void 0,function*(){let jobs=[];if(this.sub){let d=(0,util_1.deferred)();jobs.push(d);let i2=0;this.nc.subscribe(this.subject,{max:this.msgs,callback:()=>{if(i2++,i2===1)this.perf.mark("subStart");if(i2===this.msgs)this.perf.mark("subStop"),this.perf.measure("sub","subStart","subStop"),d.resolve()}})}if(this.rep){let d=(0,util_1.deferred)();jobs.push(d);let i2=0;this.nc.subscribe(this.subject,{max:this.msgs,callback:(_,m)=>{if(m.respond(this.payload),i2++,i2===1)this.perf.mark("repStart");if(i2===this.msgs)this.perf.mark("repStop"),this.perf.measure("rep","repStart","repStop"),d.resolve()}})}if(this.pub){let job=(()=>__awaiter(this,void 0,void 0,function*(){this.perf.mark("pubStart");for(let i2=0;i2<this.msgs;i2++)this.nc.publish(this.subject,this.payload);yield this.nc.flush(),this.perf.mark("pubStop"),this.perf.measure("pub","pubStart","pubStop")}))();jobs.push(job)}if(this.req){let job=(()=>__awaiter(this,void 0,void 0,function*(){if(this.asyncRequests){this.perf.mark("reqStart");let a=[];for(let i2=0;i2<this.msgs;i2++)a.push(this.nc.request(this.subject,this.payload,{timeout:20000}));yield Promise.all(a),this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}else{this.perf.mark("reqStart");for(let i2=0;i2<this.msgs;i2++)yield this.nc.request(this.subject);this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}}))();jobs.push(job)}yield Promise.all(jobs)})}runAsync(){return __awaiter(this,void 0,void 0,function*(){let jobs=[];if(this.rep){let first=!1,sub=this.nc.subscribe(this.subject,{max:this.msgs}),job=(()=>__awaiter(this,void 0,void 0,function*(){var _a,e_1,_b,_c;try{for(var _d=!0,sub_1=__asyncValues(sub),sub_1_1;sub_1_1=yield sub_1.next(),_a=sub_1_1.done,!_a;_d=!0){_c=sub_1_1.value,_d=!1;let m=_c;if(!first)this.perf.mark("repStart"),first=!0;m.respond(this.payload)}}catch(e_1_1){e_1={error:e_1_1}}finally{try{if(!_d&&!_a&&(_b=sub_1.return))yield _b.call(sub_1)}finally{if(e_1)throw e_1.error}}yield this.nc.flush(),this.perf.mark("repStop"),this.perf.measure("rep","repStart","repStop")}))();jobs.push(job)}if(this.sub){let first=!1,sub=this.nc.subscribe(this.subject,{max:this.msgs}),job=(()=>__awaiter(this,void 0,void 0,function*(){var _a,e_2,_b,_c;try{for(var _d=!0,sub_2=__asyncValues(sub),sub_2_1;sub_2_1=yield sub_2.next(),_a=sub_2_1.done,!_a;_d=!0){_c=sub_2_1.value,_d=!1;let _m=_c;if(!first)this.perf.mark("subStart"),first=!0}}catch(e_2_1){e_2={error:e_2_1}}finally{try{if(!_d&&!_a&&(_b=sub_2.return))yield _b.call(sub_2)}finally{if(e_2)throw e_2.error}}this.perf.mark("subStop"),this.perf.measure("sub","subStart","subStop")}))();jobs.push(job)}if(this.pub){let job=(()=>__awaiter(this,void 0,void 0,function*(){this.perf.mark("pubStart");for(let i2=0;i2<this.msgs;i2++)this.nc.publish(this.subject,this.payload);yield this.nc.flush(),this.perf.mark("pubStop"),this.perf.measure("pub","pubStart","pubStop")}))();jobs.push(job)}if(this.req){let job=(()=>__awaiter(this,void 0,void 0,function*(){if(this.asyncRequests){this.perf.mark("reqStart");let a=[];for(let i2=0;i2<this.msgs;i2++)a.push(this.nc.request(this.subject,this.payload,{timeout:20000}));yield Promise.all(a),this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}else{this.perf.mark("reqStart");for(let i2=0;i2<this.msgs;i2++)yield this.nc.request(this.subject);this.perf.mark("reqStop"),this.perf.measure("req","reqStart","reqStop")}}))();jobs.push(job)}yield Promise.all(jobs)})}}exports.Bench=Bench;function throughput(bytes,seconds){return`${humanizeBytes(bytes/seconds)}/sec`}function msgThroughput(msgs,seconds){return`${Math.floor(msgs/seconds)} msgs/sec`}function humanizeBytes(bytes,si=!1){let base=si?1000:1024,pre=si?["k","M","G","T","P","E"]:["K","M","G","T","P","E"],post=si?"iB":"B";if(bytes<base)return`${bytes.toFixed(2)} ${post}`;let exp=parseInt(Math.log(bytes)/Math.log(base)+""),index=parseInt(exp-1+"");return`${(bytes/Math.pow(base,exp)).toFixed(2)} ${pre[index]}${post}`}function humanizeNumber(n){return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}});var require_internal_mod=__commonJS((exports)=>{var __createBinding=exports&&exports.__createBinding||(Object.create?function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable))desc={enumerable:!0,get:function(){return m[k]}};Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports2,p))__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});exports.parseIP=exports.isIP=exports.TE=exports.TD=exports.Metric=exports.Bench=exports.writeAll=exports.readAll=exports.MAX_SIZE=exports.DenoBuffer=exports.State=exports.Parser=exports.Kind=exports.QueuedIteratorImpl=exports.StringCodec=exports.JSONCodec=exports.usernamePasswordAuthenticator=exports.tokenAuthenticator=exports.nkeyAuthenticator=exports.jwtAuthenticator=exports.credsAuthenticator=exports.RequestOne=exports.checkUnsupportedOption=exports.checkOptions=exports.buildAuthenticator=exports.DataBuffer=exports.MuxSubscription=exports.Heartbeat=exports.MsgHdrsImpl=exports.headers=exports.canonicalMIMEHeaderKey=exports.timeout=exports.render=exports.nanos=exports.millis=exports.extend=exports.delay=exports.deferred=exports.deadline=exports.collect=exports.backoff=exports.ProtocolHandler=exports.INFO=exports.Connect=exports.setTransportFactory=exports.getResolveFn=exports.MsgImpl=exports.nuid=exports.Nuid=exports.NatsConnectionImpl=void 0;exports.Subscriptions=exports.SubscriptionImpl=exports.syncIterator=exports.ServiceVerb=exports.ServiceResponseType=exports.ServiceErrorHeader=exports.ServiceErrorCodeHeader=exports.ServiceError=exports.RequestStrategy=exports.NatsError=exports.Match=exports.isNatsError=exports.Events=exports.ErrorCode=exports.DebugEvents=exports.createInbox=exports.extractProtocolMessage=exports.Empty=exports.parseSemVer=exports.compare=exports.NoopKvCodecs=exports.defaultBucketOpts=exports.Bucket=exports.Base64KeyCodec=exports.TypedSubscription=void 0;var nats_1=require_nats();Object.defineProperty(exports,"NatsConnectionImpl",{enumerable:!0,get:function(){return nats_1.NatsConnectionImpl}});var nuid_1=require_nuid();Object.defineProperty(exports,"Nuid",{enumerable:!0,get:function(){return nuid_1.Nuid}});Object.defineProperty(exports,"nuid",{enumerable:!0,get:function(){return nuid_1.nuid}});var msg_1=require_msg();Object.defineProperty(exports,"MsgImpl",{enumerable:!0,get:function(){return msg_1.MsgImpl}});var transport_1=require_transport();Object.defineProperty(exports,"getResolveFn",{enumerable:!0,get:function(){return transport_1.getResolveFn}});Object.defineProperty(exports,"setTransportFactory",{enumerable:!0,get:function(){return transport_1.setTransportFactory}});var protocol_1=require_protocol();Object.defineProperty(exports,"Connect",{enumerable:!0,get:function(){return protocol_1.Connect}});Object.defineProperty(exports,"INFO",{enumerable:!0,get:function(){return protocol_1.INFO}});Object.defineProperty(exports,"ProtocolHandler",{enumerable:!0,get:function(){return protocol_1.ProtocolHandler}});var util_1=require_util();Object.defineProperty(exports,"backoff",{enumerable:!0,get:function(){return util_1.backoff}});Object.defineProperty(exports,"collect",{enumerable:!0,get:function(){return util_1.collect}});Object.defineProperty(exports,"deadline",{enumerable:!0,get:function(){return util_1.deadline}});Object.defineProperty(exports,"deferred",{enumerable:!0,get:function(){return util_1.deferred}});Object.defineProperty(exports,"delay",{enumerable:!0,get:function(){return util_1.delay}});Object.defineProperty(exports,"extend",{enumerable:!0,get:function(){return util_1.extend}});Object.defineProperty(exports,"millis",{enumerable:!0,get:function(){return util_1.millis}});Object.defineProperty(exports,"nanos",{enumerable:!0,get:function(){return util_1.nanos}});Object.defineProperty(exports,"render",{enumerable:!0,get:function(){return util_1.render}});Object.defineProperty(exports,"timeout",{enumerable:!0,get:function(){return util_1.timeout}});var headers_1=require_headers();Object.defineProperty(exports,"canonicalMIMEHeaderKey",{enumerable:!0,get:function(){return headers_1.canonicalMIMEHeaderKey}});Object.defineProperty(exports,"headers",{enumerable:!0,get:function(){return headers_1.headers}});Object.defineProperty(exports,"MsgHdrsImpl",{enumerable:!0,get:function(){return headers_1.MsgHdrsImpl}});var heartbeats_1=require_heartbeats();Object.defineProperty(exports,"Heartbeat",{enumerable:!0,get:function(){return heartbeats_1.Heartbeat}});var muxsubscription_1=require_muxsubscription();Object.defineProperty(exports,"MuxSubscription",{enumerable:!0,get:function(){return muxsubscription_1.MuxSubscription}});var databuffer_1=require_databuffer();Object.defineProperty(exports,"DataBuffer",{enumerable:!0,get:function(){return databuffer_1.DataBuffer}});var options_1=require_options();Object.defineProperty(exports,"buildAuthenticator",{enumerable:!0,get:function(){return options_1.buildAuthenticator}});Object.defineProperty(exports,"checkOptions",{enumerable:!0,get:function(){return options_1.checkOptions}});Object.defineProperty(exports,"checkUnsupportedOption",{enumerable:!0,get:function(){return options_1.checkUnsupportedOption}});var request_1=require_request();Object.defineProperty(exports,"RequestOne",{enumerable:!0,get:function(){return request_1.RequestOne}});var authenticator_1=require_authenticator();Object.defineProperty(exports,"credsAuthenticator",{enumerable:!0,get:function(){return authenticator_1.credsAuthenticator}});Object.defineProperty(exports,"jwtAuthenticator",{enumerable:!0,get:function(){return authenticator_1.jwtAuthenticator}});Object.defineProperty(exports,"nkeyAuthenticator",{enumerable:!0,get:function(){return authenticator_1.nkeyAuthenticator}});Object.defineProperty(exports,"tokenAuthenticator",{enumerable:!0,get:function(){return authenticator_1.tokenAuthenticator}});Object.defineProperty(exports,"usernamePasswordAuthenticator",{enumerable:!0,get:function(){return authenticator_1.usernamePasswordAuthenticator}});var codec_1=require_codec();Object.defineProperty(exports,"JSONCodec",{enumerable:!0,get:function(){return codec_1.JSONCodec}});Object.defineProperty(exports,"StringCodec",{enumerable:!0,get:function(){return codec_1.StringCodec}});__exportStar(require_nkeys2(),exports);var queued_iterator_1=require_queued_iterator();Object.defineProperty(exports,"QueuedIteratorImpl",{enumerable:!0,get:function(){return queued_iterator_1.QueuedIteratorImpl}});var parser_1=require_parser();Object.defineProperty(exports,"Kind",{enumerable:!0,get:function(){return parser_1.Kind}});Object.defineProperty(exports,"Parser",{enumerable:!0,get:function(){return parser_1.Parser}});Object.defineProperty(exports,"State",{enumerable:!0,get:function(){return parser_1.State}});var denobuffer_1=require_denobuffer();Object.defineProperty(exports,"DenoBuffer",{enumerable:!0,get:function(){return denobuffer_1.DenoBuffer}});Object.defineProperty(exports,"MAX_SIZE",{enumerable:!0,get:function(){return denobuffer_1.MAX_SIZE}});Object.defineProperty(exports,"readAll",{enumerable:!0,get:function(){return denobuffer_1.readAll}});Object.defineProperty(exports,"writeAll",{enumerable:!0,get:function(){return denobuffer_1.writeAll}});var bench_1=require_bench();Object.defineProperty(exports,"Bench",{enumerable:!0,get:function(){return bench_1.Bench}});Object.defineProperty(exports,"Metric",{enumerable:!0,get:function(){return bench_1.Metric}});var encoders_1=require_encoders();Object.defineProperty(exports,"TD",{enumerable:!0,get:function(){return encoders_1.TD}});Object.defineProperty(exports,"TE",{enumerable:!0,get:function(){return encoders_1.TE}});var ipparser_1=require_ipparser();Object.defineProperty(exports,"isIP",{enumerable:!0,get:function(){return ipparser_1.isIP}});Object.defineProperty(exports,"parseIP",{enumerable:!0,get:function(){return ipparser_1.parseIP}});var typedsub_1=require_typedsub();Object.defineProperty(exports,"TypedSubscription",{enumerable:!0,get:function(){return typedsub_1.TypedSubscription}});var kv_1=require_kv();Object.defineProperty(exports,"Base64KeyCodec",{enumerable:!0,get:function(){return kv_1.Base64KeyCodec}});Object.defineProperty(exports,"Bucket",{enumerable:!0,get:function(){return kv_1.Bucket}});Object.defineProperty(exports,"defaultBucketOpts",{enumerable:!0,get:function(){return kv_1.defaultBucketOpts}});Object.defineProperty(exports,"NoopKvCodecs",{enumerable:!0,get:function(){return kv_1.NoopKvCodecs}});var semver_1=require_semver();Object.defineProperty(exports,"compare",{enumerable:!0,get:function(){return semver_1.compare}});Object.defineProperty(exports,"parseSemVer",{enumerable:!0,get:function(){return semver_1.parseSemVer}});var types_1=require_types();Object.defineProperty(exports,"Empty",{enumerable:!0,get:function(){return types_1.Empty}});var transport_2=require_transport();Object.defineProperty(exports,"extractProtocolMessage",{enumerable:!0,get:function(){return transport_2.extractProtocolMessage}});var core_1=require_core();Object.defineProperty(exports,"createInbox",{enumerable:!0,get:function(){return core_1.createInbox}});Object.defineProperty(exports,"DebugEvents",{enumerable:!0,get:function(){return core_1.DebugEvents}});Object.defineProperty(exports,"ErrorCode",{enumerable:!0,get:function(){return core_1.ErrorCode}});Object.defineProperty(exports,"Events",{enumerable:!0,get:function(){return core_1.Events}});Object.defineProperty(exports,"isNatsError",{enumerable:!0,get:function(){return core_1.isNatsError}});Object.defineProperty(exports,"Match",{enumerable:!0,get:function(){return core_1.Match}});Object.defineProperty(exports,"NatsError",{enumerable:!0,get:function(){return core_1.NatsError}});Object.defineProperty(exports,"RequestStrategy",{enumerable:!0,get:function(){return core_1.RequestStrategy}});Object.defineProperty(exports,"ServiceError",{enumerable:!0,get:function(){return core_1.ServiceError}});Object.defineProperty(exports,"ServiceErrorCodeHeader",{enumerable:!0,get:function(){return core_1.ServiceErrorCodeHeader}});Object.defineProperty(exports,"ServiceErrorHeader",{enumerable:!0,get:function(){return core_1.ServiceErrorHeader}});Object.defineProperty(exports,"ServiceResponseType",{enumerable:!0,get:function(){return core_1.ServiceResponseType}});Object.defineProperty(exports,"ServiceVerb",{enumerable:!0,get:function(){return core_1.ServiceVerb}});Object.defineProperty(exports,"syncIterator",{enumerable:!0,get:function(){return core_1.syncIterator}});var protocol_2=require_protocol();Object.defineProperty(exports,"SubscriptionImpl",{enumerable:!0,get:function(){return protocol_2.SubscriptionImpl}});Object.defineProperty(exports,"Subscriptions",{enumerable:!0,get:function(){return protocol_2.Subscriptions}})});var require_internal_mod2=__commonJS((exports)=>{Object.defineProperty(exports,"__esModule",{value:!0});exports.ConsumerEvents=exports.ConsumerDebugEvents=exports.StoreCompression=exports.StorageType=exports.RetentionPolicy=exports.ReplayPolicy=exports.DiscardPolicy=exports.DeliverPolicy=exports.AckPolicy=exports.RepublishHeaders=exports.KvWatchInclude=exports.JsHeaders=exports.isConsumerOptsBuilder=exports.DirectMsgHeaders=exports.consumerOpts=exports.AdvisoryKind=exports.isHeartbeatMsg=exports.isFlowControlMsg=exports.checkJsError=void 0;var jsutil_1=require_jsutil();Object.defineProperty(exports,"checkJsError",{enumerable:!0,get:function(){return jsutil_1.checkJsError}});Object.defineProperty(exports,"isFlowControlMsg",{enumerable:!0,get:function(){return jsutil_1.isFlowControlMsg}});Object.defineProperty(exports,"isHeartbeatMsg",{enumerable:!0,get:function(){return jsutil_1.isHeartbeatMsg}});var types_1=require_types2();Object.defineProperty(exports,"AdvisoryKind",{enumerable:!0,get:function(){return types_1.AdvisoryKind}});Object.defineProperty(exports,"consumerOpts",{enumerable:!0,get:function(){return types_1.consumerOpts}});Object.defineProperty(exports,"DirectMsgHeaders",{enumerable:!0,get:function(){return types_1.DirectMsgHeaders}});Object.defineProperty(exports,"isConsumerOptsBuilder",{enumerable:!0,get:function(){return types_1.isConsumerOptsBuilder}});Object.defineProperty(exports,"JsHeaders",{enumerable:!0,get:function(){return types_1.JsHeaders}});Object.defineProperty(exports,"KvWatchInclude",{enumerable:!0,get:function(){return types_1.KvWatchInclude}});Object.defineProperty(exports,"RepublishHeaders",{enumerable:!0,get:function(){return types_1.RepublishHeaders}});var jsapi_types_1=require_jsapi_types();Object.defineProperty(exports,"AckPolicy",{enumerable:!0,get:function(){return jsapi_types_1.AckPolicy}});Object.defineProperty(exports,"DeliverPolicy",{enumerable:!0,get:function(){return jsapi_types_1.DeliverPolicy}});Object.defineProperty(exports,"DiscardPolicy",{enumerable:!0,get:function(){return jsapi_types_1.DiscardPolicy}});Object.defineProperty(exports,"ReplayPolicy",{enumerable:!0,get:function(){return jsapi_types_1.ReplayPolicy}});Object.defineProperty(exports,"RetentionPolicy",{enumerable:!0,get:function(){return jsapi_types_1.RetentionPolicy}});Object.defineProperty(exports,"StorageType",{enumerable:!0,get:function(){return jsapi_types_1.StorageType}});Object.defineProperty(exports,"StoreCompression",{enumerable:!0,get:function(){return jsapi_types_1.StoreCompression}});var consumer_1=require_consumer();Object.defineProperty(exports,"ConsumerDebugEvents",{enumerable:!0,get:function(){return consumer_1.ConsumerDebugEvents}});Object.defineProperty(exports,"ConsumerEvents",{enumerable:!0,get:function(){return consumer_1.ConsumerEvents}})});var require_nats_base_client=__commonJS((exports)=>{var __createBinding=exports&&exports.__createBinding||(Object.create?function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable))desc={enumerable:!0,get:function(){return m[k]}};Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports2,p))__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});__exportStar(require_internal_mod(),exports);__exportStar(require_internal_mod2(),exports)});var require_node_transport=__commonJS((exports)=>{var __awaiter=exports&&exports.__awaiter||function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve6){resolve6(value)})}return new(P||(P=Promise))(function(resolve6,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result2){result2.done?resolve6(result2.value):adopt(result2.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})},__await=exports&&exports.__await||function(v){return this instanceof __await?(this.v=v,this):new __await(v)},__asyncGenerator=exports&&exports.__asyncGenerator||function(thisArg,_arguments,generator){if(!Symbol.asyncIterator)throw TypeError("Symbol.asyncIterator is not defined.");var g=generator.apply(thisArg,_arguments||[]),i2,q=[];return i2=Object.create((typeof AsyncIterator==="function"?AsyncIterator:Object).prototype),verb("next"),verb("throw"),verb("return",awaitReturn),i2[Symbol.asyncIterator]=function(){return this},i2;function awaitReturn(f){return function(v){return Promise.resolve(v).then(f,reject)}}function verb(n,f){if(g[n]){if(i2[n]=function(v){return new Promise(function(a,b2){q.push([n,v,a,b2])>1||resume(n,v)})},f)i2[n]=f(i2[n])}}function resume(n,v){try{step(g[n](v))}catch(e){settle(q[0][3],e)}}function step(r){r.value instanceof __await?Promise.resolve(r.value.v).then(fulfill,reject):settle(q[0][2],r)}function fulfill(value){resume("next",value)}function reject(value){resume("throw",value)}function settle(f,v){if(f(v),q.shift(),q.length)resume(q[0][0],q[0][1])}};Object.defineProperty(exports,"__esModule",{value:!0});exports.NodeTransport=void 0;exports.nodeResolveHost=nodeResolveHost;var nats_base_client_1=require_nats_base_client(),net_1=__require("net"),util_1=require_util(),tls_1=__require("tls"),{resolve:resolve5}=__require("path"),{readFile:readFile8,existsSync:existsSync26}=__require("fs"),dns=__require("dns"),VERSION2="2.29.3",LANG="nats.js";class NodeTransport{constructor(){this.yields=[],this.signal=(0,nats_base_client_1.deferred)(),this.closedNotification=(0,nats_base_client_1.deferred)(),this.connected=!1,this.tlsName="",this.done=!1,this.lang=LANG,this.version=VERSION2}connect(hp,options){return __awaiter(this,void 0,void 0,function*(){this.tlsName=hp.tlsName,this.options=options;let{tls:tls2}=this.options,{handshakeFirst}=tls2||{};try{if(handshakeFirst===!0)this.socket=yield this.tlsFirst(hp);else this.socket=yield this.dial(hp);let info=yield this.peekInfo();(0,nats_base_client_1.checkOptions)(info,options);let{tls_required:tlsRequired,tls_available:tlsAvailable}=info,desired=tlsAvailable===!0&&options.tls!==null;if(!handshakeFirst&&(tlsRequired||desired))this.socket=yield this.startTLS();if(tlsRequired&&this.socket.encrypted!==!0)throw new nats_base_client_1.NatsError("tls",nats_base_client_1.ErrorCode.ServerOptionNotAvailable);return this.connected=!0,this.setupHandlers(),this.signal.resolve(),Promise.resolve()}catch(err){if(!err)err=nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.ConnectionRefused,Error("node provided an undefined error!"));let{code}=err,perr=code==="ECONNREFUSED"?nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.ConnectionRefused,err):err;if(this.socket)this.socket.destroy();throw perr}})}dial(hp){let d=(0,nats_base_client_1.deferred)(),dialError,socket=(0,net_1.createConnection)(hp.port,hp.hostname,()=>{d.resolve(socket),socket.removeAllListeners()});return socket.on("error",(err)=>{dialError=err}),socket.on("close",()=>{socket.removeAllListeners(),d.reject(dialError)}),socket.setNoDelay(!0),d}get isClosed(){return this.done}close(err){return this._closed(err,!1)}peekInfo(){let d=(0,nats_base_client_1.deferred)(),peekError;return this.socket.on("data",(frame)=>{this.yields.push(frame);let t=nats_base_client_1.DataBuffer.concat(...this.yields),pm=(0,nats_base_client_1.extractProtocolMessage)(t);if(pm!=="")try{let m=nats_base_client_1.INFO.exec(pm);if(!m)throw Error("unexpected response from server");let info=JSON.parse(m[1]);d.resolve(info)}catch(err){d.reject(err)}finally{this.socket.removeAllListeners()}}),this.socket.on("error",(err)=>{peekError=err}),this.socket.on("close",()=>{this.socket.removeAllListeners(),d.reject(peekError)}),d}loadFile(fn){if(!fn)return Promise.resolve();let d=(0,nats_base_client_1.deferred)();try{if(fn=resolve5(fn),!existsSync26(fn))d.reject(Error(`${fn} doesn't exist`));readFile8(fn,(err,data)=>{if(err)return d.reject(err);d.resolve(data)})}catch(err){d.reject(err)}return d}loadClientCerts(){return __awaiter(this,void 0,void 0,function*(){let tlsOpts={},{certFile,cert,caFile,ca,keyFile,key}=this.options.tls;try{if(certFile){let data=yield this.loadFile(certFile);if(data)tlsOpts.cert=data}else if(cert)tlsOpts.cert=cert;if(keyFile){let data=yield this.loadFile(keyFile);if(data)tlsOpts.key=data}else if(key)tlsOpts.key=key;if(caFile){let data=yield this.loadFile(caFile);if(data)tlsOpts.ca=[data]}else if(ca)tlsOpts.ca=ca;return Promise.resolve(tlsOpts)}catch(err){return Promise.reject(err)}})}tlsFirst(hp){return __awaiter(this,void 0,void 0,function*(){let tlsError,tlsOpts={servername:this.tlsName,rejectUnauthorized:!0};if(this.socket)tlsOpts.socket=this.socket;if(typeof this.options.tls==="object")try{let certOpts=(yield this.loadClientCerts())||{};tlsOpts=(0,util_1.extend)(tlsOpts,this.options.tls,certOpts)}catch(err){return Promise.reject(new nats_base_client_1.NatsError(err.message,nats_base_client_1.ErrorCode.Tls,err))}let d=(0,nats_base_client_1.deferred)();try{let tlsSocket=(0,tls_1.connect)(hp.port,hp.hostname,tlsOpts,()=>{tlsSocket.removeAllListeners(),d.resolve(tlsSocket)});tlsSocket.on("error",(err)=>{tlsError=err}),tlsSocket.on("secureConnect",()=>{if(tlsOpts.rejectUnauthorized===!1)return;if(!tlsSocket.authorized)throw tlsSocket.authorizationError}),tlsSocket.on("close",()=>{d.reject(tlsError),tlsSocket.removeAllListeners()}),tlsSocket.setNoDelay(!0)}catch(err){d.reject(nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.Tls,err))}return d})}startTLS(){return __awaiter(this,void 0,void 0,function*(){let tlsError,tlsOpts={socket:this.socket,servername:this.tlsName,rejectUnauthorized:!0};if(typeof this.options.tls==="object")try{let certOpts=(yield this.loadClientCerts())||{};tlsOpts=(0,util_1.extend)(tlsOpts,this.options.tls,certOpts)}catch(err){return Promise.reject(new nats_base_client_1.NatsError(err.message,nats_base_client_1.ErrorCode.Tls,err))}let d=(0,nats_base_client_1.deferred)();try{let tlsSocket=(0,tls_1.connect)(tlsOpts,()=>{tlsSocket.removeAllListeners(),d.resolve(tlsSocket)});tlsSocket.on("error",(err)=>{tlsError=err}),tlsSocket.on("secureConnect",()=>{if(tlsOpts.rejectUnauthorized===!1)return;if(!tlsSocket.authorized)throw tlsSocket.authorizationError}),tlsSocket.on("close",()=>{d.reject(tlsError),tlsSocket.removeAllListeners()})}catch(err){d.reject(nats_base_client_1.NatsError.errorForCode(nats_base_client_1.ErrorCode.Tls,err))}return d})}setupHandlers(){let connError;this.socket.on("data",(frame)=>{return this.yields.push(frame),this.signal.resolve()}),this.socket.on("error",(err)=>{connError=err}),this.socket.on("end",()=>{var _a,_b;if((_a=this.socket)===null||_a===void 0?void 0:_a.destroyed)return;(_b=this.socket)===null||_b===void 0||_b.write(new Uint8Array(0),()=>{var _a2;(_a2=this.socket)===null||_a2===void 0||_a2.end()})}),this.socket.on("close",()=>{this._closed(connError,!1)})}[Symbol.asyncIterator](){return this.iterate()}iterate(){return __asyncGenerator(this,arguments,function*(){let debug2=this.options.debug;while(!0){if(this.yields.length===0)yield __await(this.signal);let yields=this.yields;this.yields=[];for(let i2=0;i2<yields.length;i2++){if(debug2)console.info(`> ${(0,nats_base_client_1.render)(yields[i2])}`);yield yield __await(yields[i2])}if(this.done)break;else if(this.yields.length===0)yields.length=0,this.yields=yields,this.signal=(0,nats_base_client_1.deferred)()}})}discard(){}disconnect(){this._closed(void 0,!0).then().catch()}isEncrypted(){return this.socket instanceof tls_1.TLSSocket}_send(frame){if(this.isClosed||this.socket===void 0)return Promise.resolve();if(this.options.debug)console.info(`< ${(0,nats_base_client_1.render)(frame)}`);let d=(0,nats_base_client_1.deferred)();try{this.socket.write(frame,(err)=>{if(err){if(this.options.debug)console.error(`!!! ${(0,nats_base_client_1.render)(frame)}: ${err}`);return d.reject(err)}return d.resolve()})}catch(err){if(this.options.debug)console.error(`!!! ${(0,nats_base_client_1.render)(frame)}: ${err}`);d.reject(err)}return d}send(frame){this._send(frame).catch((_err)=>{})}_closed(err_1){return __awaiter(this,arguments,void 0,function*(err,internal=!0){if(!this.connected)return;if(this.done)return;if(this.closeError=err,!err&&this.socket&&internal)try{yield this._send(new TextEncoder().encode(""))}catch(err2){if(this.options.debug)console.log("transport close terminated with an error",err2)}try{if(this.socket)this.socket.removeAllListeners(),this.socket.destroy(),this.socket=void 0}catch(err2){console.log(err2)}this.done=!0,this.closedNotification.resolve(this.closeError)})}closed(){return this.closedNotification}}exports.NodeTransport=NodeTransport;function nodeResolveHost(s){return __awaiter(this,void 0,void 0,function*(){let a=(0,nats_base_client_1.deferred)(),aaaa=(0,nats_base_client_1.deferred)();dns.resolve4(s,(err,records)=>{if(err)a.resolve(err);else a.resolve(records)}),dns.resolve6(s,(err,records)=>{if(err)aaaa.resolve(err);else aaaa.resolve(records)});let ips=[],da=yield a;if(Array.isArray(da))ips.push(...da);let daaaa=yield aaaa;if(Array.isArray(daaaa))ips.push(...daaaa);if(ips.length===0)ips.push(s);return ips})}});var require_connect=__commonJS((exports)=>{Object.defineProperty(exports,"__esModule",{value:!0});exports.connect=connect;var node_transport_1=require_node_transport(),nats_base_client_1=require_nats_base_client();function connect(opts={}){return(0,nats_base_client_1.setTransportFactory)({factory:()=>{return new node_transport_1.NodeTransport},dnsResolveFn:node_transport_1.nodeResolveHost}),nats_base_client_1.NatsConnectionImpl.connect(opts)}});var require_mod3=__commonJS((exports)=>{Object.defineProperty(exports,"__esModule",{value:!0});exports.consumerOpts=exports.StoreCompression=exports.StorageType=exports.RetentionPolicy=exports.RepublishHeaders=exports.ReplayPolicy=exports.KvWatchInclude=exports.JsHeaders=exports.DiscardPolicy=exports.DirectMsgHeaders=exports.DeliverPolicy=exports.ConsumerEvents=exports.ConsumerDebugEvents=exports.AdvisoryKind=exports.AckPolicy=exports.isHeartbeatMsg=exports.isFlowControlMsg=exports.checkJsError=void 0;var internal_mod_1=require_internal_mod2();Object.defineProperty(exports,"checkJsError",{enumerable:!0,get:function(){return internal_mod_1.checkJsError}});Object.defineProperty(exports,"isFlowControlMsg",{enumerable:!0,get:function(){return internal_mod_1.isFlowControlMsg}});Object.defineProperty(exports,"isHeartbeatMsg",{enumerable:!0,get:function(){return internal_mod_1.isHeartbeatMsg}});var internal_mod_2=require_internal_mod2();Object.defineProperty(exports,"AckPolicy",{enumerable:!0,get:function(){return internal_mod_2.AckPolicy}});Object.defineProperty(exports,"AdvisoryKind",{enumerable:!0,get:function(){return internal_mod_2.AdvisoryKind}});Object.defineProperty(exports,"ConsumerDebugEvents",{enumerable:!0,get:function(){return internal_mod_2.ConsumerDebugEvents}});Object.defineProperty(exports,"ConsumerEvents",{enumerable:!0,get:function(){return internal_mod_2.ConsumerEvents}});Object.defineProperty(exports,"DeliverPolicy",{enumerable:!0,get:function(){return internal_mod_2.DeliverPolicy}});Object.defineProperty(exports,"DirectMsgHeaders",{enumerable:!0,get:function(){return internal_mod_2.DirectMsgHeaders}});Object.defineProperty(exports,"DiscardPolicy",{enumerable:!0,get:function(){return internal_mod_2.DiscardPolicy}});Object.defineProperty(exports,"JsHeaders",{enumerable:!0,get:function(){return internal_mod_2.JsHeaders}});Object.defineProperty(exports,"KvWatchInclude",{enumerable:!0,get:function(){return internal_mod_2.KvWatchInclude}});Object.defineProperty(exports,"ReplayPolicy",{enumerable:!0,get:function(){return internal_mod_2.ReplayPolicy}});Object.defineProperty(exports,"RepublishHeaders",{enumerable:!0,get:function(){return internal_mod_2.RepublishHeaders}});Object.defineProperty(exports,"RetentionPolicy",{enumerable:!0,get:function(){return internal_mod_2.RetentionPolicy}});Object.defineProperty(exports,"StorageType",{enumerable:!0,get:function(){return internal_mod_2.StorageType}});Object.defineProperty(exports,"StoreCompression",{enumerable:!0,get:function(){return internal_mod_2.StoreCompression}});var types_1=require_types2();Object.defineProperty(exports,"consumerOpts",{enumerable:!0,get:function(){return types_1.consumerOpts}})});var require_mod4=__commonJS((exports)=>{var __createBinding=exports&&exports.__createBinding||(Object.create?function(o,m,k,k2){if(k2===void 0)k2=k;var desc=Object.getOwnPropertyDescriptor(m,k);if(!desc||("get"in desc?!m.__esModule:desc.writable||desc.configurable))desc={enumerable:!0,get:function(){return m[k]}};Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){if(k2===void 0)k2=k;o[k2]=m[k]}),__exportStar=exports&&exports.__exportStar||function(m,exports2){for(var p in m)if(p!=="default"&&!Object.prototype.hasOwnProperty.call(exports2,p))__createBinding(exports2,m,p)};Object.defineProperty(exports,"__esModule",{value:!0});exports.connect=void 0;if(typeof TextEncoder>"u"){let{TextEncoder:TextEncoder2,TextDecoder:TextDecoder2}=__require("util");global.TextEncoder=TextEncoder2,global.TextDecoder=TextDecoder2}if(typeof globalThis.crypto>"u"){let c=__require("crypto");global.crypto=c.webcrypto}if(typeof globalThis.ReadableStream>"u"){let chunks=process.versions.node.split(".");if(parseInt(chunks[0])>=16){let streams=__require("stream/web");global.ReadableStream=streams.ReadableStream}}var connect_1=require_connect();Object.defineProperty(exports,"connect",{enumerable:!0,get:function(){return connect_1.connect}});__exportStar(require_mod2(),exports);__exportStar(require_mod3(),exports)});var exports_omni_approval_handler={};__export(exports_omni_approval_handler,{startOmniApprovalHandler:()=>startOmniApprovalHandler});class OmniApprovalHandler{nc=null;subs=[];sc=import_nats.StringCodec();permissions;natsUrl;approveTokens;denyTokens;constructor(config){this.permissions=config.permissions,this.natsUrl=config.natsUrl??"localhost:4222",this.approveTokens=(config.permissions.approveTokens??DEFAULT_APPROVE_TOKENS).map((t)=>t.toLowerCase()),this.denyTokens=(config.permissions.denyTokens??DEFAULT_DENY_TOKENS).map((t)=>t.toLowerCase())}async start(){let{omniChat,omniInstance}=this.permissions;if(!omniChat||!omniInstance)return;this.nc=await import_nats.connect({servers:this.natsUrl});let messageTopic=`omni.message.${omniInstance}.>`,msgSub=this.nc.subscribe(messageTopic);this.subs.push(msgSub),this.processMessages(msgSub);let eventSub=this.nc.subscribe("omni.event.>");this.subs.push(eventSub),this.processEvents(eventSub),handlerInstance=this,console.log(`[omni-approval] Listening for approval replies on ${messageTopic}`)}async stop(){for(let sub of this.subs)sub.unsubscribe();if(this.subs=[],this.nc)await this.nc.close(),this.nc=null;if(handlerInstance===this)handlerInstance=null}async processMessages(sub){for await(let msg of sub)try{let data=JSON.parse(this.sc.decode(msg.data));if((data.chatId??this.extractChatIdFromSubject(msg.subject))!==this.permissions.omniChat)continue;if(data.content)await this.handleTextReply(data.content,data.sender??"whatsapp-user")}catch{}}async processEvents(sub){for await(let msg of sub)try{let data=JSON.parse(this.sc.decode(msg.data));if(data.type!=="reaction")continue;if(data.chatId!==this.permissions.omniChat||data.instanceId!==this.permissions.omniInstance)continue;if(data.emoji&&data.messageId)await this.handleReaction(data.emoji,data.messageId,data.sender??"whatsapp-user")}catch{}}extractChatIdFromSubject(subject){let parts=subject.split(".");if(parts.length>=4)return parts.slice(3).join(".");return}async handleTextReply(content,sender){let normalized=content.trim().toLowerCase();if(!normalized)return!1;let decision=null;if(this.approveTokens.includes(normalized))decision="allow";else if(this.denyTokens.includes(normalized))decision="deny";if(!decision)return!1;let pending=await listPendingApprovals();if(pending.length===0)return!1;let oldest=pending[0],resolved=await resolveApproval(oldest.id,decision,sender);if(resolved)console.log(`[omni-approval] Resolved ${oldest.id} as ${decision} by ${sender} (text: "${normalized}")`);return resolved}async handleReaction(emoji,messageId,sender){let decision=null;if(DEFAULT_APPROVE_REACTIONS.includes(emoji))decision="allow";else if(DEFAULT_DENY_REACTIONS.includes(emoji))decision="deny";if(!decision)return!1;try{let sql=await getConnection(),[approval]=await sql`
|
|
1740
1740
|
SELECT id FROM approvals
|
|
1741
1741
|
WHERE omni_message_id = ${messageId} AND decision = 'pending'
|
|
1742
1742
|
`;if(approval){let resolved2=await resolveApproval(approval.id,decision,sender);if(resolved2)console.log(`[omni-approval] Resolved ${approval.id} via reaction ${emoji} by ${sender}`);return resolved2}}catch{}let pending=await listPendingApprovals();if(pending.length===0)return!1;let resolved=await resolveApproval(pending[0].id,decision,sender);if(resolved)console.log(`[omni-approval] Resolved ${pending[0].id} via reaction ${emoji} by ${sender} (fallback)`);return resolved}}async function startOmniApprovalHandler(natsUrl){let ws=findWorkspace();if(!ws)return null;let config=getWorkspaceConfig(ws.root);if(!config.permissions?.omniChat||!config.permissions?.omniInstance)return null;let handler=new OmniApprovalHandler({natsUrl,permissions:config.permissions});return await handler.start(),handler}var import_nats,DEFAULT_APPROVE_TOKENS,DEFAULT_DENY_TOKENS,DEFAULT_APPROVE_REACTIONS,DEFAULT_DENY_REACTIONS,handlerInstance=null;var init_omni_approval_handler=__esm(()=>{init_db();init_claude_sdk_remote_approval();init_workspace();import_nats=__toESM(require_mod4(),1),DEFAULT_APPROVE_TOKENS=["y","yes","approve","sim"],DEFAULT_DENY_TOKENS=["n","no","deny","nao"],DEFAULT_APPROVE_REACTIONS=["\uD83D\uDC4D","\u2705","\uD83D\uDC4C"],DEFAULT_DENY_REACTIONS=["\uD83D\uDC4E","\u274C","\uD83D\uDEAB"]});var exports_serve={};__export(exports_serve,{registerServeCommands:()=>registerServeCommands,isTuiSessionReady:()=>isTuiSessionReady,isServeRunning:()=>isServeRunning,getTuiQuitBindingArgs:()=>getTuiQuitBindingArgs,getTuiKeybindings:()=>getTuiKeybindings,ensureTuiSession:()=>ensureTuiSession,autoStartServe:()=>autoStartServe});import{execSync as execSync9,spawn as spawn4,spawnSync as spawnSync3}from"child_process";import{existsSync as existsSync26,mkdirSync as mkdirSync11,readFileSync as readFileSync16,unlinkSync as unlinkSync7,writeFileSync as writeFileSync13}from"fs";import{homedir as homedir23}from"os";import{join as join35}from"path";function genieHome3(){return process.env.GENIE_HOME??join35(homedir23(),".genie")}function servePidPath(){return join35(genieHome3(),"serve.pid")}function readServePid(){let path3=servePidPath();if(!existsSync26(path3))return null;let raw=readFileSync16(path3,"utf-8").trim(),pid=Number.parseInt(raw,10);if(Number.isNaN(pid)||pid<=0)return null;return pid}function writeServePid(pid){mkdirSync11(genieHome3(),{recursive:!0}),writeFileSync13(servePidPath(),String(pid),"utf-8")}function removeServePid(){let path3=servePidPath();if(existsSync26(path3))try{unlinkSync7(path3)}catch{}}function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch{return!1}}function tuiTmuxConf(){return[join35(genieHome3(),"tui-tmux.conf")].find((p)=>existsSync26(p))??"/dev/null"}function tuiTmux(subcmd){return`${tmuxBin()} -L genie-tui -f ${tuiTmuxConf()} ${subcmd}`}function isGenieTmuxRunning(){try{return execSync9(genieTmuxCmd("list-sessions"),{stdio:"ignore"}),!0}catch{return!1}}function getTuiKeybindings(sessionName=TUI_SESSION){return[`bind-key -T root Tab if-shell "[ '#{pane_index}' = '0' ]" "select-pane -t ${sessionName}:0.1" "select-pane -t ${sessionName}:0.0"`,`bind-key -T root C-1 select-pane -t ${sessionName}:0.0`,`bind-key -T root C-2 select-pane -t ${sessionName}:0.1`,`bind-key -T root C-b if-shell "[ $(tmux display-message -p '#\\{pane_width\\}' -t ${sessionName}:0.0) -gt 5 ]" "resize-pane -t ${sessionName}:0.0 -x 0" "resize-pane -t ${sessionName}:0.0 -x ${NAV_WIDTH}"`,`bind-key -T root C-t select-pane -t ${sessionName}:0.0 \\; send-keys -t ${sessionName}:0.0 C-t`,"bind-key -T root C-d detach-client",`bind-key -T root C-q select-pane -t ${sessionName}:0.0 \\; send-keys -t ${sessionName}:0.0 C-q`]}function getTuiQuitBindingArgs(sessionName=TUI_SESSION){return["bind-key","-T","root","C-q","select-pane","-t",`${sessionName}:0.0`,"\\;","send-keys","-t",`${sessionName}:0.0`,"C-q"]}function applyTuiStyle(){let cmds=[`set-option -t ${TUI_SESSION} pane-border-style 'fg=${TUI_STYLE.inactiveBorder}'`,`set-option -t ${TUI_SESSION} pane-active-border-style 'fg=${TUI_STYLE.activeBorder}'`,...process.env.GENIE_TMUX_MOUSE!=="off"?[`set-option -t ${TUI_SESSION} mouse on`]:[],`set-option -t ${TUI_SESSION} status off`,`set-option -t ${TUI_SESSION} pane-border-status off`];for(let cmd of cmds)try{execSync9(tuiTmux(cmd),{stdio:"ignore"})}catch{}}function setupTuiKeybindings(){for(let cmd of getTuiKeybindings())try{if(cmd.startsWith("bind-key -T root C-q "))spawnSync3(tmuxBin(),["-L","genie-tui","-f",tuiTmuxConf(),...getTuiQuitBindingArgs()],{stdio:"ignore"});else execSync9(tuiTmux(cmd),{stdio:"ignore"})}catch{}}function startTuiTmuxServer(){try{execSync9(tuiTmux(`has-session -t ${TUI_SESSION}`),{stdio:"ignore"});let panes2=execSync9(tuiTmux(`list-panes -t ${TUI_SESSION}:0 -F '#{pane_id}'`),{encoding:"utf-8"}).trim().split(`
|
|
@@ -3101,8 +3101,8 @@ No agents registered. Add one with: genie dir add <name> --dir <path>`),console.
|
|
|
3101
3101
|
`,CHUNK=4096;for(let i2=0;i2<data.length;i2+=CHUNK)writeSync(1,data.slice(i2,i2+CHUNK))}function registerSdkFlags(cmd){cmd.option("--sdk-permission-mode <mode>","SDK permission mode: default|acceptEdits|bypassPermissions|plan|dontAsk|auto").option("--sdk-tools <list>","SDK tools: comma-separated tool names").option("--sdk-allowed-tools <list>","SDK auto-approved tools: comma-separated").option("--sdk-disallowed-tools <list>","SDK blacklisted tools: comma-separated").option("--sdk-max-turns <n>","SDK max conversation turns").option("--sdk-max-budget <usd>","SDK max budget in USD").option("--sdk-effort <level>","SDK effort: low|medium|high|max").option("--sdk-thinking <config>","SDK thinking: adaptive|disabled|enabled[:budgetTokens]").option("--sdk-persist-session","SDK: enable session persistence").option("--no-sdk-persist-session","SDK: disable session persistence").option("--sdk-file-checkpointing","SDK: enable file checkpointing").option("--sdk-output-format <path>","SDK: path to JSON schema file for output format").option("--sdk-stream-partial","SDK: include partial messages in stream").option("--sdk-hook-events","SDK: include hook events in stream").option("--sdk-prompt-suggestions","SDK: enable prompt suggestions").option("--sdk-progress-summaries","SDK: enable agent progress summaries").option("--sdk-sandbox","SDK: enable sandbox").option("--sdk-betas <list>","SDK beta flags: comma-separated").option("--sdk-system-prompt <string>","SDK system prompt text").option("--sdk-mcp-server <spec>","SDK MCP server: name:command:args (repeatable)",collectRepeat,[]).option("--sdk-plugin <path>","SDK plugin path (repeatable)",collectRepeat,[]).option("--sdk-agent <name>","SDK main agent name").option("--sdk-subagent <spec>","SDK subagent: name:json (repeatable)",collectRepeat,[])}function collectRepeat(value,previous){return previous.concat([value])}function buildSdkConfig(options){let config={};return applyScalarSdkOptions(config,options),applyBooleanSdkOptions(config,options),applyRepeatableSdkOptions(config,options),Object.keys(config).length>0?config:void 0}function toSafeNumber(value,flagName){let n=Number(value);if(Number.isNaN(n))throw Error(`${flagName} must be a number, got: ${value}`);return n}function applyScalarSdkOptions(config,options){if(options.sdkPermissionMode!==void 0)config.permissionMode=options.sdkPermissionMode;if(options.sdkTools!==void 0)config.tools=splitComma(options.sdkTools);if(options.sdkAllowedTools!==void 0)config.allowedTools=splitComma(options.sdkAllowedTools);if(options.sdkDisallowedTools!==void 0)config.disallowedTools=splitComma(options.sdkDisallowedTools);if(options.sdkMaxTurns!==void 0)config.maxTurns=toSafeNumber(options.sdkMaxTurns,"--sdk-max-turns");if(options.sdkMaxBudget!==void 0)config.maxBudgetUsd=toSafeNumber(options.sdkMaxBudget,"--sdk-max-budget");if(options.sdkEffort!==void 0)config.effort=options.sdkEffort;if(options.sdkThinking!==void 0)config.thinking=parseThinkingConfig(options.sdkThinking);if(options.sdkBetas!==void 0)config.betas=splitComma(options.sdkBetas);if(options.sdkSystemPrompt!==void 0)config.systemPrompt=options.sdkSystemPrompt;if(options.sdkAgent!==void 0)config.agent=options.sdkAgent;if(options.sdkOutputFormat!==void 0)config.outputFormat={type:"json_schema",schema:{$ref:options.sdkOutputFormat}}}function applyBooleanSdkOptions(config,options){if(options.sdkPersistSession!==void 0)config.persistSession=options.sdkPersistSession;if(options.sdkFileCheckpointing===!0)config.enableFileCheckpointing=!0;if(options.sdkStreamPartial===!0)config.includePartialMessages=!0;if(options.sdkHookEvents===!0)config.includeHookEvents=!0;if(options.sdkPromptSuggestions===!0)config.promptSuggestions=!0;if(options.sdkProgressSummaries===!0)config.agentProgressSummaries=!0;if(options.sdkSandbox===!0)config.sandbox={enabled:!0}}function applyRepeatableSdkOptions(config,options){if(options.sdkMcpServer&&options.sdkMcpServer.length>0){config.mcpServers={};for(let spec of options.sdkMcpServer){let parsed=parseMcpServer(spec);config.mcpServers[parsed.name]=parsed.config}}if(options.sdkPlugin&&options.sdkPlugin.length>0)config.plugins=options.sdkPlugin.map((p)=>({type:"local",path:p}));if(options.sdkSubagent&&options.sdkSubagent.length>0)config.agents=parseSubagents(options.sdkSubagent)}function parseSubagents(specs){let agents={};for(let spec of specs){let colonIdx=spec.indexOf(":");if(colonIdx===-1)throw Error(`Invalid --sdk-subagent format: "${spec}". Expected "name:json".`);let agentName=spec.slice(0,colonIdx),jsonStr=spec.slice(colonIdx+1);try{agents[agentName]=JSON.parse(jsonStr)}catch{throw Error(`Invalid JSON in --sdk-subagent "${agentName}": ${jsonStr}`)}}return agents}function parseThinkingConfig(value){if(value==="adaptive")return{type:"adaptive"};if(value==="disabled")return{type:"disabled"};if(value==="enabled")return{type:"enabled"};if(value.startsWith("enabled:"))return{type:"enabled",budgetTokens:toSafeNumber(value.slice(8),"--sdk-thinking budgetTokens")};throw Error(`Invalid --sdk-thinking value: "${value}". Expected adaptive|disabled|enabled[:budgetTokens].`)}function parseMcpServer(spec){let firstColon=spec.indexOf(":");if(firstColon===-1)throw Error(`Invalid --sdk-mcp-server format: "${spec}". Expected "name:command:args".`);let name=spec.slice(0,firstColon),rest=spec.slice(firstColon+1),secondColon=rest.indexOf(":");if(secondColon===-1)throw Error(`Invalid --sdk-mcp-server format: "${spec}". Expected "name:command:args".`);let command=rest.slice(0,secondColon),argsStr=rest.slice(secondColon+1),args=argsStr?argsStr.split(",").map((s)=>s.trim()).filter(Boolean):[];return{name,config:{type:"stdio",command,args}}}function splitComma(value){return value.split(",").map((s)=>s.trim()).filter(Boolean)}function printSdkConfig(sdk){console.log(" SDK Config:");let lines=collectSdkDisplayLines(sdk);for(let line of lines)console.log(` ${line}`)}function collectSdkDisplayLines(sdk){let lines=[];if(sdk.permissionMode)lines.push(`Permission Mode: ${sdk.permissionMode}`);if(sdk.tools)lines.push(`Tools: ${Array.isArray(sdk.tools)?sdk.tools.join(", "):`preset:${sdk.tools.preset}`}`);if(sdk.allowedTools?.length)lines.push(`Allowed Tools: ${sdk.allowedTools.join(", ")}`);if(sdk.disallowedTools?.length)lines.push(`Disallowed Tools: ${sdk.disallowedTools.join(", ")}`);if(sdk.maxTurns!==void 0)lines.push(`Max Turns: ${sdk.maxTurns}`);if(sdk.maxBudgetUsd!==void 0)lines.push(`Max Budget: $${sdk.maxBudgetUsd.toFixed(2)}`);if(sdk.effort)lines.push(`Effort: ${sdk.effort}`);if(sdk.thinking)lines.push(`Thinking: ${formatThinking(sdk.thinking)}`);if(sdk.agent)lines.push(`Agent: ${sdk.agent}`);if(sdk.persistSession!==void 0)lines.push(`Persist Session: ${sdk.persistSession}`);if(sdk.enableFileCheckpointing)lines.push("File Checkpointing: enabled");if(sdk.outputFormat)lines.push(`Output Format: ${JSON.stringify(sdk.outputFormat.schema)}`);return collectSdkBooleanLines(sdk,lines),collectSdkComplexLines(sdk,lines),lines}function collectSdkBooleanLines(sdk,lines){if(sdk.includePartialMessages)lines.push("Stream Partial: enabled");if(sdk.includeHookEvents)lines.push("Hook Events: enabled");if(sdk.promptSuggestions)lines.push("Prompt Suggestions: enabled");if(sdk.agentProgressSummaries)lines.push("Progress Summaries: enabled");if(sdk.sandbox?.enabled)lines.push("Sandbox: enabled");if(sdk.betas?.length)lines.push(`Betas: ${sdk.betas.join(", ")}`)}function collectSdkComplexLines(sdk,lines){if(sdk.systemPrompt){let prompt2=typeof sdk.systemPrompt==="string"?sdk.systemPrompt:`preset:${sdk.systemPrompt.preset}`;lines.push(`System Prompt: ${prompt2.length>60?`${prompt2.slice(0,60)}...`:prompt2}`)}if(sdk.mcpServers)lines.push(`MCP Servers: ${Object.keys(sdk.mcpServers).join(", ")}`);if(sdk.plugins?.length)lines.push(`Plugins: ${sdk.plugins.map((p)=>p.path).join(", ")}`);if(sdk.agents)lines.push(`Subagents: ${Object.keys(sdk.agents).join(", ")}`)}function formatThinking(thinking){if(thinking.type==="enabled"&&thinking.budgetTokens)return`enabled:${thinking.budgetTokens}`;return thinking.type}function buildPermissions(permissionPreset,allow,bashAllow){if(!permissionPreset&&!allow&&!bashAllow)return;if(permissionPreset)return{preset:permissionPreset};return{...allow&&{allow:allow.split(",").map((s)=>s.trim()).filter(Boolean)},...bashAllow&&{bashAllowPatterns:bashAllow.split(",").map((s)=>s.trim()).filter(Boolean)}}}function normalizeRoles(roles){if(!roles)return;return roles.flatMap((r)=>r.split(",")).map((r)=>r.trim()).filter(Boolean)}function printRegisteredTable(entries){let repoValues=[],roleValues=[];for(let entry of entries)repoValues.push(entry.repo?contractPath(entry.repo):contractPath(entry.dir)),roleValues.push(entry.roles?.join(", ")||"-");let termW=process.stdout.columns||120,fixedW=54,maxRepoLen=Math.max(4,...repoValues.map((v)=>v.length)),repoW=Math.min(maxRepoLen+2,Math.max(30,termW-fixedW-20)),totalW=fixedW+repoW+20;console.log(""),console.log("REGISTERED AGENTS"),console.log("-".repeat(Math.max(90,totalW))),console.log(` ${"NAME".padEnd(22)}${"SCOPE".padEnd(10)}${"REPO".padEnd(repoW)}${"MODEL".padEnd(10)}${"PROVIDER".padEnd(10)}ROLES`),console.log(` ${"-".repeat(20)} ${"-".repeat(8)} ${"-".repeat(repoW-2)} ${"-".repeat(8)} ${"-".repeat(8)} ${"-".repeat(20)}`);for(let i2=0;i2<entries.length;i2++){let entry=entries[i2],repo=repoValues[i2],roles=roleValues[i2];console.log(` ${entry.name.padEnd(22)}${entry.scope.padEnd(10)}${repo.padEnd(repoW)}${(entry.model||"-").padEnd(10)}${(entry.provider||"-").padEnd(10)}${roles}`)}console.log("")}function printResolvedTable(entries){if(entries.length===0)return;let nameW=22,declW=14,resolvedW=14;console.log("RESOLVED DEFAULTS"),console.log("-".repeat(70));for(let field of RESOLVED_FIELDS){let fieldUpper=field.toUpperCase();console.log(` ${"AGENT".padEnd(nameW)}${`${fieldUpper} (declared)`.padEnd(declW)}${`${fieldUpper} (resolved)`.padEnd(resolvedW)}SOURCE`),console.log(` ${"-".repeat(nameW-2)} ${"-".repeat(declW-2)} ${"-".repeat(resolvedW-2)} ${"-".repeat(16)}`);for(let entry of entries){let ctx=buildDirResolveContext(entry.name),result2=resolveFieldWithSource(entry,field,ctx),declared=entry[field]||"-";console.log(` ${entry.name.padEnd(nameW)}${declared.padEnd(declW)}${result2.value.padEnd(resolvedW)}${result2.source}`)}}console.log("")}function printBuiltinsTable(){console.log("BUILT-IN AGENTS"),console.log("-".repeat(80)),console.log(` ${"NAME".padEnd(22)}${"TYPE".padEnd(10)}${"MODEL".padEnd(8)}DESCRIPTION`),console.log(` ${"-".repeat(20)} ${"-".repeat(8)} ${"-".repeat(6)} ${"-".repeat(30)}`);for(let agent of ALL_BUILTINS)console.log(` ${agent.name.padEnd(22)}${agent.category.padEnd(10)}${(agent.model||"-").padEnd(8)}${agent.description}`);console.log("")}function validatePromptMode2(mode){if(mode!=="system"&&mode!=="append")throw Error(`Invalid prompt mode "${mode}". Must be "append" or "system".`);return mode}function normalizeRoles2(roles){if(!roles)return;return roles.flatMap((r)=>r.split(",")).map((r)=>r.trim()).filter(Boolean)}function printEntry2(entry){if(console.log(` Name: ${entry.name}`),console.log(` Dir: ${contractPath(entry.dir)}`),entry.repo)console.log(` Repo: ${contractPath(entry.repo)}`);if(console.log(` Prompt mode: ${entry.promptMode}`),entry.model)console.log(` Model: ${entry.model}`);if(entry.roles?.length)console.log(` Roles: ${entry.roles.join(", ")}`);console.log(` Registered: ${entry.registeredAt}`)}async function handleOmniRegistration(name,options){let omniUrl=await resolveOmniApiUrl();if(!omniUrl)return;console.log(`
|
|
3102
3102
|
Registering in Omni (${omniUrl})...`);let existingId=await findOmniAgent(name);if(existingId){console.log(` Agent already exists in Omni: ${existingId}`),await edit(name,{omniAgentId:existingId},{global:options.global}),console.log(" Linked existing Omni agent to directory entry.");return}let omniAgentId=await registerAgentInOmni(name,{model:options.model,roles:options.roles});if(omniAgentId)await edit(name,{omniAgentId},{global:options.global}),console.log(` Omni agent created: ${omniAgentId}`),console.log(" Session isolation: per-person + per-channel")}async function handleAgentRegister(name,options){let promptMode=validatePromptMode2(options.promptMode);if(options.repo)validateRepoPath(options.repo);let roles=normalizeRoles2(options.roles),entry=await add({name,dir:resolvePath2(options.dir),repo:options.repo?resolvePath2(options.repo):void 0,promptMode,model:options.model,roles},{global:options.global}),scope=options.global?"global":"project";if(console.log(`Agent "${entry.name}" registered (${scope}).`),printEntry2(entry),!options.skipOmni)await handleOmniRegistration(name,{...options,roles})}function registerAgentRegister(parent){parent.command("register <name>").description("Register an agent locally and auto-register in Omni when configured").requiredOption("--dir <path>","Agent folder (CWD + AGENTS.md)").option("--repo <path>","Default git repo (overridden by team)").option("--prompt-mode <mode>","Prompt mode: append or system","append").option("--model <model>","Default model (sonnet, opus, codex)").option("--roles <roles...>","Built-in roles this agent can orchestrate").option("--global","Write to global directory instead of project").option("--skip-omni","Skip Omni auto-registration").action(async(name,options)=>{try{await handleAgentRegister(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function registerAgentResume(parent){parent.command("resume [name]").description("Resume a suspended/failed agent with its Claude session").option("--all","Resume all eligible agents").action(async(name,options)=>{try{await handleWorkerResume(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_msg();function registerAgentSend(parent){parent.command("send <body>").description("Send a direct message to an agent (hierarchy-enforced)").option("--to <agent>","Recipient agent name (default: team leader)","team-lead").option("--from <sender>","Sender ID (auto-detected from context)").option("--team <name>","Explicit team context for sender/recipient resolution").option("--broadcast","Send to all direct reports").action(async(body,options)=>{try{let from=options.from??await detectSenderIdentity(options.team);if(options.broadcast){await handleBroadcast(from,body,options.team);return}await handleDirectMessage(from,options.to,body,options.team)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}async function isTeamLeader(agentName,teamName){try{let{resolveLeaderName:resolveLeaderName2}=await Promise.resolve().then(() => (init_team_manager(),exports_team_manager)),leaderName=await resolveLeaderName2(teamName);return agentName===leaderName}catch{return!1}}async function checkHierarchy(from,to){if(from==="cli")return{allowed:!0};if(from===to)return{allowed:!0};try{let agents=await(await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry))).listAgents({}),sender=agents.find((a)=>a.customName===from||a.role===from||a.id===from),recipient=agents.find((a)=>a.customName===to||a.role===to||a.id===to);if(!sender||!recipient)return{allowed:!0};if(recipient.reportsTo===from||recipient.reportsTo===sender.id)return{allowed:!0};if(sender.reportsTo===to||sender.reportsTo===recipient.id)return{allowed:!0};if(sender.reportsTo&&sender.reportsTo===recipient.reportsTo)return{allowed:!0};if(sender.team&&sender.team===recipient.team&&await isTeamLeader(from,sender.team))return{allowed:!0};let manager=sender.reportsTo??"your manager";return{allowed:!1,reason:`Cannot reach "${to}". Escalate to ${manager}.`}}catch{return{allowed:!0}}}async function handleDirectMessage(from,to,body,team){let{allowed,reason}=await checkHierarchy(from,to);if(!allowed)console.error(`Error: ${reason}`),process.exit(1);let{checkSendScope:checkSendScope2}=await Promise.resolve().then(() => (init_msg(),exports_msg)),repoPath=process.cwd(),scopeError=await checkSendScope2(repoPath,from,to);if(scopeError)console.error(`Error: ${scopeError}`),process.exit(1);let taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service)),mailbox=await Promise.resolve().then(() => (init_mailbox(),exports_mailbox)),senderActor={actorType:"local",actorId:from},recipientActor={actorType:"local",actorId:to},conv=await taskService.findOrCreateConversation({type:"dm",members:[senderActor,recipientActor],createdBy:senderActor});await taskService.addMember(conv.id,senderActor),await taskService.addMember(conv.id,recipientActor),await mailbox.send(repoPath,from,to,body);let msg=await taskService.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,`genie.msg.${to}`,{kind:"message",agent:from,direction:"out",peer:to,text:body,data:{messageId:msg.id,conversationId:conv.id,from,to},source:"mailbox"})}catch{}try{let nativeTeams=await Promise.resolve().then(() => (init_claude_native_teams(),exports_claude_native_teams)),nativeMsg={from,text:body,summary:body.length>50?`${body.substring(0,50)}...`:body,timestamp:new Date().toISOString(),color:"blue",read:!1},currentTeam=team??process.env.GENIE_TEAM;if(currentTeam){let nativeName=await nativeTeams.resolveNativeMemberName(currentTeam,to);if(nativeName)await nativeTeams.writeNativeInbox(currentTeam,nativeName,nativeMsg)}}catch{}console.log(`Message sent to "${to}".`),console.log(` ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}async function handleBroadcast(from,body,team){let taskService=await Promise.resolve().then(() => (init_task_service(),exports_task_service)),repoPath=process.cwd(),teamName=team??process.env.GENIE_TEAM;if(!teamName)console.error("Error: Could not detect team. Use --team <name>."),process.exit(1);let senderActor={actorType:"local",actorId:from},conv=await taskService.findOrCreateConversation({type:"group",name:`Team: ${teamName}`,linkedEntity:"team",linkedEntityId:teamName,createdBy:senderActor,members:[senderActor]});await taskService.addMember(conv.id,senderActor);let msg=await taskService.sendMessage(conv.id,senderActor,body);try{let{publishSubjectEvent:publishSubjectEvent2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events));await publishSubjectEvent2(repoPath,"genie.msg.broadcast",{kind:"message",agent:from,direction:"out",peer:teamName,text:body,data:{messageId:msg.id,conversationId:conv.id,from,team:teamName},source:"mailbox"})}catch{}console.log(`Broadcast sent to team "${teamName}".`),console.log(` Message ID: ${msg.id}`),console.log(` Conversation: ${conv.id}`)}init_term_format();function printAgentFields(agent){if(console.log(""),console.log(`AGENT: ${agent.customName??agent.role??agent.id}`),console.log("\u2500".repeat(60)),console.log(` ${padRight("ID:",20)} ${agent.id}`),agent.role)console.log(` ${padRight("Role:",20)} ${agent.role}`);if(agent.customName)console.log(` ${padRight("Name:",20)} ${agent.customName}`);if(agent.team)console.log(` ${padRight("Team:",20)} ${agent.team}`);console.log(` ${padRight("Started:",20)} ${agent.startedAt}`)}function printExecutorFields(executor){if(console.log(""),console.log("Current Executor:"),console.log("\u2500".repeat(60)),console.log(` ${padRight("Executor ID:",20)} ${executor.id}`),console.log(` ${padRight("Provider:",20)} ${executor.provider}`),console.log(` ${padRight("Transport:",20)} ${executor.transport}`),console.log(` ${padRight("State:",20)} ${executor.state}`),executor.pid)console.log(` ${padRight("PID:",20)} ${executor.pid}`);if(executor.tmuxSession)console.log(` ${padRight("Tmux Session:",20)} ${executor.tmuxSession}`);if(executor.tmuxPaneId)console.log(` ${padRight("Tmux Pane:",20)} ${executor.tmuxPaneId}`);if(executor.worktree)console.log(` ${padRight("Worktree:",20)} ${executor.worktree}`);if(console.log(` ${padRight("Started:",20)} ${executor.startedAt}`),executor.endedAt)console.log(` ${padRight("Ended:",20)} ${executor.endedAt}`)}async function showAgent(name,json2){let registry=await Promise.resolve().then(() => (init_agent_registry(),exports_agent_registry)),executorRegistry=await Promise.resolve().then(() => (init_executor_registry(),exports_executor_registry)),agent=(await registry.listAgents({team:process.env.GENIE_TEAM})).find((a)=>a.customName===name||a.role===name||a.id===name);if(!agent)console.error(`Agent "${name}" not found.`),process.exit(1);if(json2){let executor=agent.currentExecutorId?await executorRegistry.getExecutor(agent.currentExecutorId):null;console.log(JSON.stringify({agent,executor},null,2));return}if(printAgentFields(agent),agent.currentExecutorId){let executor=await executorRegistry.getExecutor(agent.currentExecutorId);if(executor)printExecutorFields(executor)}else console.log(`
|
|
3103
3103
|
No active executor.`);console.log("")}function registerAgentShow(parent){parent.command("show <name>").description("Show agent identity and current executor detail").option("--json","Output as JSON").action(async(name,options)=>{try{await showAgent(name,options.json)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function parseNumericFlag(flagName){return(value)=>{let n=Number(value);if(Number.isNaN(n))throw Error(`${flagName} must be a number, got: ${value}`);return n}}function registerAgentSpawn(parent){parent.command("spawn <name>").description("Spawn a new agent by name (resolves from directory or built-ins)").option("--provider <provider>","Provider: claude, codex, or claude-sdk").option("--team <team>","Team name",process.env.GENIE_TEAM??"genie").option("--model <model>","Model override (e.g., sonnet, opus)").option("--skill <skill>","Skill to load (optional)").option("--layout <layout>","Layout mode: mosaic (default) or vertical").option("--color <color>","Teammate pane border color").option("--plan-mode","Start teammate in plan mode").option("--permission-mode <mode>","Permission mode (e.g., acceptEdits)").option("--extra-args <args...>","Extra CLI args forwarded to provider").option("--cwd <path>","Working directory for the agent (overrides directory entry)").option("--session <session>","Tmux session name to spawn into").option("--role <role>","Override role name for registration (avoids duplicate guard)").option("--new-window","Create a new tmux window instead of splitting").option("--window <target>","Tmux window to split into (e.g., genie:3)").option("--no-auto-resume","Disable auto-resume on pane death").option("--prompt <prompt>","Initial prompt (first user message)").option("--sdk-max-turns <n>","SDK: max conversation turns",parseNumericFlag("--sdk-max-turns")).option("--sdk-max-budget <usd>","SDK: max budget in USD",parseNumericFlag("--sdk-max-budget")).option("--sdk-stream","SDK: enable streaming output (shortcut for --stream)").option("--sdk-effort <level>","SDK: reasoning effort level (low, medium, high, max)").option("--sdk-resume <session-id>","SDK: resume a previous session by ID").action(async(name,options)=>{if(options.prompt)options.initialPrompt=options.prompt;try{await handleWorkerSpawn(name,options)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}init_agents();function registerAgentStop(parent){parent.command("stop <name>").description("Stop an agent (preserves session for resume)").action(async(name)=>{try{await handleWorkerStop(name)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}})}function registerAgentCommands(program2){let agent=program2.command("agent").description("Agent lifecycle management");registerAgentSpawn(agent),registerAgentStop(agent),registerAgentResume(agent),registerAgentKill(agent),registerAgentList(agent),registerAgentShow(agent),registerAgentAnswer(agent),registerAgentRegister(agent),registerAgentDirectory(agent),registerAgentInbox(agent),registerAgentBrief(agent),registerAgentLog(agent),registerAgentSend(agent),agent.on("command:*",(operands)=>{let cmd=operands[0],available=agent.commands.map((c)=>c.name()).join(", ");agent.error(`Unknown agent command '${cmd}'. Available: ${available}`)})}init_agents();async function handleTuiMode(){let{isServeRunning:isServeRunning2,autoStartServe:autoStartServe2}=await Promise.resolve().then(() => (init_serve(),exports_serve));if(!isServeRunning2())console.log("Starting genie serve..."),await autoStartServe2();let{attachTuiSession:attachTuiSession2}=await Promise.resolve().then(() => (init_tmux2(),exports_tmux2));attachTuiSession2()}async function findTauriBinary(){let{existsSync:existsSync28}=await import("fs"),{join:join37,dirname:dirname6}=await import("path"),{execSync:execSync10}=await import("child_process"),appName="genie-desktop",rootDir=join37(dirname6(new URL(import.meta.url).pathname),"..",".."),localBin=[join37(rootDir,"packages","genie-app","src-tauri","target","release","genie-desktop"),join37(rootDir,"packages","genie-app","src-tauri","target","debug","genie-desktop"),join37(rootDir,"dist","app","genie-desktop"),"/usr/local/bin/genie-desktop"].find((p)=>existsSync28(p));if(localBin)return localBin;try{return execSync10("which genie-desktop",{stdio:"ignore"}),"genie-desktop"}catch{return}}function registerAppCommand(program2){program2.command("app").description("Launch Genie desktop app (backend sidecar + views)").option("--backend-only","Start only the backend sidecar (IPC on stdin/stdout)").option("--tui","Fall back to terminal UI mode").option("--dev","Development mode").action(async(options)=>{if(options.tui){await handleTuiMode();return}if(options.backendOnly){await Promise.resolve().then(() => (init_src_backend(),exports_src_backend));return}let tauriBin=await findTauriBinary();if(tauriBin){console.log("\x1B[35m\u25C6 Genie App\x1B[0m Launching desktop...");let{execFileSync}=await import("child_process");try{execFileSync(tauriBin,[],{stdio:"inherit"})}catch{}return}console.log("\x1B[35m\u25C6 Genie App\x1B[0m Starting backend sidecar..."),console.log("\x1B[2mDesktop binary not found \u2014 running in sidecar mode.\x1B[0m"),console.log("\x1B[2mPG bridge + PTY manager + IPC on stdin/stdout\x1B[0m"),console.log(`\x1B[2mUse --tui for terminal UI, or pipe to a frontend shell.\x1B[0m
|
|
3104
|
-
`),await Promise.resolve().then(() => (init_src_backend(),exports_src_backend))})}init_claude_sdk_remote_approval();init_workspace();async function handleRequest(options){let ws=findWorkspace(),permissions=ws?getWorkspaceConfig(ws.root).permissions:void 0,timeoutSec=options.timeout?Number(options.timeout):permissions?.timeout??300,defaultAction=permissions?.defaultAction??"deny",timeoutAt=new Date(Date.now()+timeoutSec*1000),approvalId=await insertApproval(`cli-${process.pid}`,options.agent,options.tool,options.input,timeoutAt);if(console.log(`Approval created: ${approvalId}`),options.wait){console.log(`Waiting for resolution (timeout: ${timeoutSec}s, default: ${defaultAction})...`);let decision=await waitForResolution(approvalId,timeoutAt,defaultAction);if(console.log(`Decision: ${decision}`),decision==="deny")process.exit(1)}}async function handleResolve(id,options){if(options.decision!=="allow"&&options.decision!=="deny")console.error('Error: --decision must be "allow" or "deny"'),process.exit(1);if(await resolveApproval(id,options.decision,
|
|
3105
|
-
${rows.length} pending approval${rows.length===1?"":"s"}`)}function registerApprovalCommands(program2){let approval=program2.command("approval").description("Remote approval queue management");approval.command("request").description("Create an approval request (for tmux-path agents)").requiredOption("--tool <name>","Tool name requiring approval").requiredOption("--input <preview>","Tool input preview text").requiredOption("--agent <name>","Agent name requesting approval").option("--wait","Block until the approval is resolved").option("--timeout <seconds>","Timeout in seconds (overrides workspace config)").action(async(options)=>{try{await handleRequest(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),approval.command("resolve <id>").description("Resolve a pending approval").requiredOption("--decision <decision>","Decision: allow or deny").
|
|
3104
|
+
`),await Promise.resolve().then(() => (init_src_backend(),exports_src_backend))})}init_claude_sdk_remote_approval();init_workspace();async function handleRequest(options){let ws=findWorkspace(),permissions=ws?getWorkspaceConfig(ws.root).permissions:void 0,timeoutSec=options.timeout?Number(options.timeout):permissions?.timeout??300,defaultAction=permissions?.defaultAction??"deny",timeoutAt=new Date(Date.now()+timeoutSec*1000),approvalId=await insertApproval(`cli-${process.pid}`,options.agent,options.tool,options.input,timeoutAt);if(console.log(`Approval created: ${approvalId}`),options.wait){console.log(`Waiting for resolution (timeout: ${timeoutSec}s, default: ${defaultAction})...`);let decision=await waitForResolution(approvalId,timeoutAt,defaultAction);if(console.log(`Decision: ${decision}`),decision==="deny")process.exit(1)}}async function handleResolve(id,options){if(options.decision!=="allow"&&options.decision!=="deny")console.error('Error: --decision must be "allow" or "deny"'),process.exit(1);let actor=process.env.GENIE_AGENT_NAME||options.by;if(await resolveApproval(id,options.decision,actor))console.log(`Approval ${id} resolved: ${options.decision} by ${options.by}`);else console.error(`Error: Approval ${id} not found or already resolved`),process.exit(1)}async function handleList(options){let rows=await listPendingApprovals(options.agent);if(options.json){console.log(JSON.stringify(rows,null,2));return}if(rows.length===0){console.log("No pending approvals.");return}console.log(` ${"ID".padEnd(38)} ${"AGENT".padEnd(20)} ${"TOOL".padEnd(15)} TIMEOUT`),console.log(` ${"\u2500".repeat(85)}`);for(let row of rows){let timeout=new Date(row.timeout_at).toLocaleTimeString();console.log(` ${String(row.id).padEnd(38)} ${String(row.agent_name).padEnd(20)} ${String(row.tool_name).padEnd(15)} ${timeout}`)}console.log(`
|
|
3105
|
+
${rows.length} pending approval${rows.length===1?"":"s"}`)}function registerApprovalCommands(program2){let approval=program2.command("approval").description("Remote approval queue management");approval.command("request").description("Create an approval request (for tmux-path agents)").requiredOption("--tool <name>","Tool name requiring approval").requiredOption("--input <preview>","Tool input preview text").requiredOption("--agent <name>","Agent name requesting approval").option("--wait","Block until the approval is resolved").option("--timeout <seconds>","Timeout in seconds (overrides workspace config)").action(async(options)=>{try{await handleRequest(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),approval.command("resolve <id>").description("Resolve a pending approval").requiredOption("--decision <decision>","Decision: allow or deny").option("--by <actor>",'Display label for decision maker (defaults to GENIE_AGENT_NAME or "cli")',"cli").action(async(id,options)=>{try{await handleResolve(id,options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),approval.command("list").description("List pending approvals").option("--agent <name>","Filter by agent name").option("--json","Output as JSON").action(async(options)=>{try{await handleList(options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_audit();init_term_format();function printEventsTable(rows){if(rows.length===0){console.log("No audit events found.");return}let sorted=[...rows].reverse(),headers=["Time","Type","Entity","Event","Actor","Details"],data=sorted.map((r)=>[formatRelativeTimestamp(r.created_at),r.entity_type,r.entity_id,r.event_type,r.actor??"-",summarizeDetails(r.details)]),widths=headers.map((h,i2)=>{let colVals=data.map((row)=>row[i2]);return Math.min(40,Math.max(h.length,...colVals.map((v)=>v.length)))}),header=headers.map((h,i2)=>padRight(h,widths[i2])).join(" | ");console.log(header),console.log(widths.map((w)=>"-".repeat(w)).join("-+-"));for(let row of data){let line=row.map((v,i2)=>padRight(v.slice(0,widths[i2]),widths[i2])).join(" | ");console.log(line)}console.log(`
|
|
3106
3106
|
(${rows.length} event${rows.length===1?"":"s"})`)}function summarizeDetails(details){if(!details)return"";if(typeof details==="string")try{return summarizeDetails(JSON.parse(details))}catch{return details.slice(0,40)}if(Object.keys(details).length===0)return"";let keys=Object.keys(details);if(keys.length===1){let val=details[keys[0]];if(typeof val==="string")return val.slice(0,40);return JSON.stringify(val).slice(0,40)}if(details.error)return`error: ${String(details.error).slice(0,35)}`;if(details.duration_ms)return`${details.duration_ms}ms`;return JSON.stringify(details).slice(0,40)}function printErrorsTable(patterns2){if(patterns2.length===0){console.log("No error patterns found.");return}let headers=["Count","Event","Command","Error","Last Seen"],data=patterns2.map((p)=>[String(p.count),p.event_type,p.entity_id,p.error_message.slice(0,50),formatRelativeTimestamp(p.last_seen)]),widths=headers.map((h,i2)=>{let colVals=data.map((row)=>row[i2]);return Math.min(50,Math.max(h.length,...colVals.map((v)=>v.length)))}),header=headers.map((h,i2)=>padRight(h,widths[i2])).join(" | ");console.log(header),console.log(widths.map((w)=>"-".repeat(w)).join("-+-"));for(let row of data){let line=row.map((v,i2)=>padRight(v.slice(0,widths[i2]),widths[i2])).join(" | ");console.log(line)}console.log(`
|
|
3107
3107
|
(${patterns2.length} pattern${patterns2.length===1?"":"s"})`)}async function eventsListCommand(options){try{let queryOpts={type:options.type,entity:options.entity,since:options.since??"1h",errorsOnly:options.errorsOnly,limit:options.limit?Number.parseInt(options.limit,10):50};if(options.follow){let{followAuditEvents:followAuditEvents2}=await Promise.resolve().then(() => (init_audit(),exports_audit));console.log("Following audit events (Ctrl+C to stop)...");let handle=await followAuditEvents2(queryOpts,(row)=>{if(options.json)console.log(JSON.stringify(row));else{let time=formatRelativeTimestamp(row.created_at),entity=`${row.entity_type}:${row.entity_id}`.slice(0,40),event=row.event_type.padEnd(24),details=summarizeDetails(row.details).slice(0,60);console.log(`${time} ${event} ${entity} ${details}`)}}),shutdown3=()=>{handle.stop(),process.exit(0)};process.on("SIGINT",shutdown3),process.on("SIGTERM",shutdown3),await new Promise(()=>{});return}let rows=await queryAuditEvents(queryOpts);if(options.json)console.log(JSON.stringify(rows,null,2));else printEventsTable(rows)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying events: ${msg}`),process.exit(1)}}var DEFAULT_HIDDEN_EVENT_TYPES=new Set(["command_success","sdk.hook.started"]);async function eventsStreamCommand(options){let{followAuditEvents:followAuditEvents2}=await Promise.resolve().then(() => (init_audit(),exports_audit)),{followRuntimeEvents:followRuntimeEvents2}=await Promise.resolve().then(() => (init_runtime_events(),exports_runtime_events)),{color:color2}=await Promise.resolve().then(() => (init_term_format(),exports_term_format)),{renderAuditEvent:renderAuditEvent2,renderRuntimeEvent:renderRuntimeEvent2,formatEventLine:formatEventLine2}=await Promise.resolve().then(() => (init_event_renderer(),exports_event_renderer)),handles2=[],clockTime=(iso)=>{return(iso instanceof Date?iso:new Date(iso)).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})};if(!options.json){let sources=options.auditOnly?"audit":options.runtimeOnly?"runtime":"audit + runtime";console.log(color2("dim",`Streaming ${sources} events (Ctrl+C to stop)...`))}if(!options.runtimeOnly){let auditHandle=await followAuditEvents2({type:options.type,entity:options.entity,errorsOnly:options.errorsOnly},(row)=>{if(!options.all&&!options.type&&DEFAULT_HIDDEN_EVENT_TYPES.has(row.event_type))return;if(options.json){console.log(JSON.stringify({stream:"audit",...row}));return}console.log(formatEventLine2(clockTime(row.created_at),renderAuditEvent2({entity_type:row.entity_type,entity_id:row.entity_id,event_type:row.event_type,details:row.details})))});handles2.push(auditHandle)}if(!options.auditOnly){let validKinds=["user","assistant","message","state","tool_call","tool_result","system","qa"],kinds=options.kind&&validKinds.includes(options.kind)?[options.kind]:void 0,agentIds=options.agent?[options.agent]:void 0,runtimeHandle=await followRuntimeEvents2({kinds,agentIds,scopeMode:"any"},(event)=>{if(options.json){console.log(JSON.stringify({stream:"runtime",...event}));return}console.log(formatEventLine2(clockTime(event.timestamp),renderRuntimeEvent2({kind:event.kind,agent:event.agent,team:event.team,text:event.text})))},{pollIntervalMs:2000});handles2.push(runtimeHandle)}let shutdown3=async()=>{for(let h of handles2)await h.stop();process.exit(0)};process.on("SIGINT",shutdown3),process.on("SIGTERM",shutdown3),await new Promise(()=>{})}async function eventsErrorsCommand(options){try{let patterns2=await queryErrorPatterns(options.since);if(options.json)console.log(JSON.stringify(patterns2,null,2));else printErrorsTable(patterns2)}catch(err){let msg=err instanceof Error?err.message:String(err);console.error(`Error querying error patterns: ${msg}`),process.exit(1)}}function resolveCostsGroupBy(options){if(options.byWish)return"wish";if(options.byModel)return"model";return"agent"}function printCostsTable(rows,groupBy){if(rows.length===0){console.log("No cost data found.");return}let headers=[groupBy==="agent"?"Agent":groupBy==="wish"?"Wish":"Model","Total Cost","Requests","Avg Cost"],data=rows.map((r)=>[r.group_key,`$${r.total_cost.toFixed(4)}`,String(r.request_count),`$${r.avg_cost.toFixed(4)}`]),widths=headers.map((h,i2)=>{let colVals=data.map((row)=>row[i2]);return Math.min(40,Math.max(h.length,...colVals.map((v)=>v.length)))});console.log(headers.map((h,i2)=>padRight(h,widths[i2])).join(" | ")),console.log(widths.map((w)=>"-".repeat(w)).join("-+-"));for(let row of data)console.log(row.map((v,i2)=>padRight(v.slice(0,widths[i2]),widths[i2])).join(" | "));let totalCost=rows.reduce((sum,r)=>sum+r.total_cost,0),totalReqs=rows.reduce((sum,r)=>sum+r.request_count,0);console.log(`
|
|
3108
3108
|
Total: $${totalCost.toFixed(4)} across ${totalReqs} requests`)}async function eventsCostsCommand(options){try{let since=options.today?"24h":options.since??"24h",groupBy=resolveCostsGroupBy(options),rows=await queryCostBreakdown(since,groupBy);if(options.json)console.log(JSON.stringify(rows,null,2));else printCostsTable(rows,groupBy),console.log(`
|
|
@@ -3193,7 +3193,7 @@ ${diff}
|
|
|
3193
3193
|
|
|
3194
3194
|
When done, report your verdict:
|
|
3195
3195
|
Run: genie send '<SHIP|FIX-FIRST|BLOCKED> \u2014 <summary>' --to ${reviewLeaderTarget}`;await handleWorkerSpawn(agentName,{provider:"claude",team:process.env.GENIE_TEAM??"genie",extraArgs:["--append-system-prompt-file",contextFile],initialPrompt:reviewPrompt});let repoPath=process.cwd(),result2=await sendMessage2(repoPath,"cli",agentName,reviewPrompt);if(!result2.delivered)console.warn(`\u26A0 Backup delivery to ${agentName} failed: ${result2.reason??"unknown"}`)}function registerDispatchCommands(program2){program2.command("brainstorm <agent> <slug>").description("Spawn agent with brainstorm DRAFT.md context").action(async(agent,slug)=>{await brainstormCommand(agent,slug)}),program2.command("wish <agent> <slug>").description("Spawn agent with wish DESIGN.md context").action(async(agent,slug)=>{await wishCommand(agent,slug)}),program2.command("work <ref> [agent]").description("Auto-orchestrate a wish, or dispatch work on a specific group").action(async(ref,agent)=>{try{let work=detectWorkMode(ref,agent);if(work.mode==="auto")await autoOrchestrateCommand(work.slug);else await workDispatchCommand(work.agent,work.ref)}catch(error2){console.error(`\u274C ${error2 instanceof Error?error2.message:error2}`),process.exit(1)}}),program2.command("review <agent> <ref>").description("Spawn agent with review scope for a wish group (format: <slug>#<group>)").action(async(agent,ref)=>{await reviewCommand(agent,ref)})}init_export_format();import{existsSync as existsSync38,mkdirSync as mkdirSync16,writeFileSync as writeFileSync19}from"fs";import{dirname as dirname9}from"path";async function getSql(){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return getConnection2()}async function getVersion(){let{VERSION:VERSION2}=await Promise.resolve().then(() => (init_version(),exports_version));return VERSION2}async function getActorName(){let{getActor:getActor2}=await Promise.resolve().then(() => (init_audit(),exports_audit));return getActor2()}async function detectTables(sql,tables){let{filterAvailableTables:filterAvailableTables2}=await Promise.resolve().then(() => exports_table_detect);return filterAvailableTables2(sql,tables)}function outputDocument(doc,options){let json2=options.pretty?JSON.stringify(doc,null,2):JSON.stringify(doc);if(options.output){let dir=dirname9(options.output);if(!existsSync38(dir))mkdirSync16(dir,{recursive:!0});writeFileSync19(options.output,`${json2}
|
|
3196
|
-
`);let tables=Object.keys(doc.data),rows=Object.values(doc.data).reduce((sum,arr)=>sum+arr.length,0);if(console.log(`Exported ${tables.length} tables (${rows} rows) to ${options.output}`),doc.skippedTables.length>0)console.log(`Skipped tables (not found): ${doc.skippedTables.join(", ")}`)}else console.log(json2)}function autoOutputName(){let d=new Date;return`genie-backup-${`${d.getFullYear()}${String(d.getMonth()+1).padStart(2,"0")}${String(d.getDate()).padStart(2,"0")}`}.json`}async function exportGroup(sql,group,filter){let tables=GROUP_TABLES[group],{available,skipped}=await detectTables(sql,tables),data={};for(let table of available)if(filter)data[table]=[...await sql.unsafe(`SELECT * FROM ${table} WHERE ${filter.column} = $1`,[filter.value])];else data[table]=[...await sql.unsafe(`SELECT * FROM ${table}`)];return{data,skipped}}async function exportBoards(sql,name){let tables=GROUP_TABLES.boards,{available,skipped}=await detectTables(sql,tables),data={};for(let table of available)if(name&&table==="boards")data[table]=[...await sql`SELECT * FROM boards WHERE name = ${name}`];else if(table==="task_types")data[table]=[...await sql`SELECT * FROM task_types WHERE is_builtin = false`];else data[table]=[...await sql.unsafe(`SELECT * FROM ${table}`)];return{data,skipped}}var TASK_JOIN_ALIASES={task_tags:"tt",task_actors:"ta",task_dependencies:"td",task_stage_log:"tsl"};async function resolveProjectId2(sql,projectName){let projects=await sql`SELECT id FROM projects WHERE name = ${projectName}`;if(projects.length===0)throw Error(`Project not found: ${projectName}`);return projects[0].id}function stripEphemeralFields(rows){return rows.map((r)=>{let{checkout_run_id,execution_locked_at,session_id,pane_id,...rest}=r;return rest})}async function exportTaskTable(sql,table,projectId){let alias=TASK_JOIN_ALIASES[table];if(table==="tasks"){let rows=projectId?[...await sql.unsafe("SELECT * FROM tasks WHERE project_id = $1",[projectId])]:[...await sql`SELECT * FROM tasks`];return stripEphemeralFields(rows)}if(alias&&projectId)return[...await sql.unsafe(`SELECT ${alias}.* FROM ${table} ${alias} JOIN tasks t ON ${alias}.task_id = t.id WHERE t.project_id = $1`,[projectId])];return[...await sql.unsafe(`SELECT * FROM ${table}`)]}async function exportTasks(sql,projectName){let tables=GROUP_TABLES.tasks,{available,skipped}=await detectTables(sql,tables),data={},projectId=projectName?await resolveProjectId2(sql,projectName):null;for(let table of available)data[table]=await exportTaskTable(sql,table,projectId);return{data,skipped}}async function exportSchedules(sql,name){let{available,skipped}=await detectTables(sql,["schedules"]),data={};if(available.includes("schedules"))if(name)data.schedules=[...await sql`SELECT * FROM schedules WHERE name = ${name}`];else data.schedules=[...await sql`SELECT * FROM schedules`];return{data,skipped}}async function exportTags(sql){let{available,skipped}=await detectTables(sql,["tags"]),data={};if(available.includes("tags"))data.tags=[...await sql`SELECT * FROM tags WHERE name NOT LIKE 'test-%'`];return{data,skipped}}async function exportAll(sql){let allSkipped=[],allData={};for(let group of ALL_GROUPS){let result2;switch(group){case"boards":result2=await exportBoards(sql);break;case"tasks":result2=await exportTasks(sql);break;case"tags":result2=await exportTags(sql);break;case"schedules":result2=await exportSchedules(sql);break;default:result2=await exportGroup(sql,group);break}Object.assign(allData,result2.data),allSkipped.push(...result2.skipped)}return{data:allData,skipped:allSkipped}}async function runExport(groups,type2,exportFn,options){let sql=await getSql(),[version,actor]=await Promise.all([getVersion(),getActorName()]),doc=createExportDocument(type2,groups,version,actor),{data,skipped}=await exportFn(sql);doc.data=data,doc.skippedTables=skipped,outputDocument(doc,options)}function registerExportCommands(program2){let exp=program2.command("export").description("Export genie data as JSON").option("--output <file>","Write to file instead of stdout").option("-o <file>","Alias for --output").option("--pretty","Pretty-print JSON").action(async(options)=>{try{if(!options.output)options.output=autoOutputName();await runExport([...ALL_GROUPS],"full",(sql)=>exportAll(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts=(cmd)=>cmd.option("--output <file>","Write to file instead of stdout").option("--pretty","Pretty-print JSON");sharedOpts(exp.command("all").description("Full backup (all present tables)")).action(async(options)=>{try{if(!options.output)options.output=autoOutputName();await runExport([...ALL_GROUPS],"full",(sql)=>exportAll(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("boards [name]").description("Export boards, templates, and task types")).action(async(name,options)=>{try{await runExport(["boards"],"partial",(sql)=>exportBoards(sql,name),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("tasks").description("Export tasks with deps, actors, and stage log").option("--project <name>","Filter by project name")).action(async(options)=>{try{await runExport(["tasks"],"partial",(sql)=>exportTasks(sql,options.project),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("tags").description("Export tags")).action(async(options)=>{try{await runExport(["tags"],"partial",(sql)=>exportTags(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("projects").description("Export projects")).action(async(options)=>{try{await runExport(["projects"],"partial",(sql)=>exportGroup(sql,"projects"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("schedules [name]").description("Export schedules with run_spec")).action(async(name,options)=>{try{await runExport(["schedules"],"partial",(sql)=>exportSchedules(sql,name),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("agents").description("Export agents, templates, and checkpoints")).action(async(options)=>{try{await runExport(["agents"],"partial",(sql)=>exportGroup(sql,"agents"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("comms").description("Export conversations, messages, mailbox")).action(async(options)=>{try{await runExport(["comms"],"partial",(sql)=>exportGroup(sql,"comms"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("config").description("Export OS config (graceful skip if missing)")).action(async(options)=>{try{await runExport(["config"],"partial",(sql)=>exportGroup(sql,"config"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_history();init_export_format();import{readFileSync as readFileSync23}from"fs";var IMPORT_LEVELS=[["schedules","sessions","projects","agent_templates","agent_checkpoints","tags","task_types","notification_preferences","os_config","golden_images","warm_pool","instances"],["triggers","boards","board_templates","agents","conversations"],["tasks","runs","messages","conversation_members","mailbox","team_chat"],["task_tags","task_actors","task_dependencies","task_stage_log","heartbeats","machine_snapshots"]],SELF_REFERENTIAL_COLUMNS={tasks:"parent_id",messages:"reply_to_id",conversations:"parent_message_id"};function getTableLevel(table){for(let i2=0;i2<IMPORT_LEVELS.length;i2++)if(IMPORT_LEVELS[i2].includes(table))return i2;return-1}function sortByImportOrder(tables){return[...tables].sort((a,b2)=>{let la=getTableLevel(a),lb=getTableLevel(b2);return(la===-1?999:la)-(lb===-1?999:lb)})}function getPrimaryKey(table){return{task_tags:["task_id","tag_id"],task_actors:["task_id","actor_type","actor_id","role"],task_dependencies:["task_id","depends_on_id"],conversation_members:["conversation_id","actor_type","actor_id"],notification_preferences:["actor_type","actor_id","channel"]}[table]??["id"]}var VALID_TABLES=new Set(Object.values(GROUP_TABLES).flat());function assertValidTable(name){if(!VALID_TABLES.has(name))throw Error(`Invalid table name: "${name}" is not in the schema whitelist`)}var VALID_COLUMN_RE=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function assertValidColumnName(name){if(!VALID_COLUMN_RE.test(name))throw Error(`Invalid column name: "${name.slice(0,60)}" contains disallowed characters. Column names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/.`)}async function getSql2(){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return getConnection2()}async function getActorName2(){let{getActor:getActor2}=await Promise.resolve().then(() => (init_audit(),exports_audit));return getActor2()}async function detectTables2(sql,tables){let{filterAvailableTables:filterAvailableTables2}=await Promise.resolve().then(() => exports_table_detect);return filterAvailableTables2(sql,tables)}async function detectConflicts(sql,table,rows){if(rows.length===0)return[];assertValidTable(table);let pk=getPrimaryKey(table);if(pk.length===1){let key=pk[0],ids=rows.map((r)=>r[key]),existing=await sql.unsafe(`SELECT ${key} FROM ${table} WHERE ${key} = ANY($1)`,[ids]),existingSet=new Set(existing.map((r)=>String(r[key])));return rows.filter((r)=>existingSet.has(String(r[key])))}let conflicts=[];for(let row of rows){let conditions=pk.map((col,i2)=>`${col} = $${i2+1}`).join(" AND "),values2=pk.map((col)=>row[col]);if((await sql.unsafe(`SELECT 1 FROM ${table} WHERE ${conditions} LIMIT 1`,values2)).length>0)conflicts.push(row)}return conflicts}function prepareRow(row,table,selfRefUpdates){let selfRefCol=SELF_REFERENTIAL_COLUMNS[table],entries=Object.entries(row),columns=entries.map(([k])=>k),values2=entries.map(([,v])=>v);for(let col of columns)assertValidColumnName(col);if(selfRefCol&&row[selfRefCol]!=null){let idx=columns.indexOf(selfRefCol);if(idx!==-1){let originalSelfRef=values2[idx];values2[idx]=null;let pk=getPrimaryKey(table);selfRefUpdates.push({pk:pk.length===1?row[pk[0]]:pk.map((k)=>row[k]),value:originalSelfRef})}}return{columns,values:values2,quotedCols:columns.map((c)=>`"${c}"`).join(", "),placeholders:values2.map((_,i2)=>`$${i2+1}`).join(", ")}}async function insertOneRow(tx,table,row,prepared,mode){assertValidTable(table);let{quotedCols,placeholders,values:values2}=prepared,pk=getPrimaryKey(table);if(mode==="overwrite"){let pkCondition=pk.map((col,i2)=>`"${col}" = $${values2.length+i2+1}`).join(" AND "),pkValues=pk.map((col)=>row[col]);await tx.unsafe(`DELETE FROM ${table} WHERE ${pkCondition}`,pkValues),await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders})`,values2)}else if(mode==="merge"){let onConflict=pk.map((c)=>`"${c}"`).join(", ");await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders}) ON CONFLICT (${onConflict}) DO NOTHING`,values2)}else await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders})`,values2)}async function updateSelfRefs(tx,table,updates){assertValidTable(table);let selfRefCol=SELF_REFERENTIAL_COLUMNS[table],pk=getPrimaryKey(table);if(pk.length!==1)return;for(let{pk:pkVal,value}of updates)await tx.unsafe(`UPDATE ${table} SET "${selfRefCol}" = $1 WHERE "${pk[0]}" = $2`,[value,pkVal])}async function insertRows(tx,table,rows,mode){if(rows.length===0)return 0;let selfRefUpdates=[];for(let row of rows){let prepared=prepareRow(row,table,selfRefUpdates);await insertOneRow(tx,table,row,prepared,mode)}if(selfRefUpdates.length>0)await updateSelfRefs(tx,table,selfRefUpdates);return rows.length}function parseExportFile(filePath){let raw=readFileSync23(filePath,"utf-8"),parsed;try{parsed=JSON.parse(raw)}catch{throw Error(`Invalid JSON in ${filePath}`)}let validation=validateExportDocument(parsed);if(!validation.valid)throw Error(`Invalid export document: ${validation.error}`);return validation.doc}async function filterTablesByGroup(allTables,groupFilter){if(!groupFilter||groupFilter.length===0)return allTables;let{GROUP_TABLES:GROUP_TABLES2}=await Promise.resolve().then(() => (init_export_format(),exports_export_format)),allowedTables=new Set;for(let group of groupFilter){let tables=GROUP_TABLES2[group];if(tables)for(let t of tables)allowedTables.add(t);else console.warn(`Warning: Unknown group "${group}", skipping`)}return allTables.filter((t)=>allowedTables.has(t))}async function checkConflicts(sql,tables,data){for(let table of tables){let rows=data[table];if(!rows||rows.length===0)continue;let conflicts=await detectConflicts(sql,table,rows);if(conflicts.length>0){let pk=getPrimaryKey(table),ids=conflicts.slice(0,5).map((r)=>pk.map((k)=>r[k]).join(",")).join("; ");throw Error(`Conflict in table "${table}": ${conflicts.length} existing row(s) (e.g., ${ids}). Use --merge or --overwrite to resolve.`)}}}async function runImport(filePath,mode,groupFilter){let doc=parseExportFile(filePath),tablesToImport=await filterTablesByGroup(Object.keys(doc.data),groupFilter);if(tablesToImport.length===0){console.log("No tables to import.");return}tablesToImport=sortByImportOrder(tablesToImport);let sql=await getSql2(),{available}=await detectTables2(sql,tablesToImport),skippedTables=tablesToImport.filter((t)=>!available.includes(t));if(tablesToImport=available,skippedTables.length>0)console.log(`Skipping tables not in database: ${skippedTables.join(", ")}`);if(mode==="fail")await checkConflicts(sql,tablesToImport,doc.data);let totalInserted=0,tableStats={};await sql.begin(async(tx)=>{for(let table of tablesToImport){let rows=doc.data[table];if(!rows||rows.length===0)continue;let count=await insertRows(tx,table,rows,mode);tableStats[table]=count,totalInserted+=count}});let actor=await getActorName2(),{recordAuditEvent:recordAuditEvent2}=await Promise.resolve().then(() => (init_audit(),exports_audit));await recordAuditEvent2("import",filePath,"import_complete",actor,{mode,tables:tableStats,totalRows:totalInserted,skippedTables,sourceVersion:doc.version,sourceDate:doc.exportedAt}),console.log(`Import complete: ${totalInserted} rows across ${Object.keys(tableStats).length} tables`);for(let[table,count]of Object.entries(tableStats))if(count>0)console.log(` ${table}: ${count} rows`);if(skippedTables.length>0)console.log(`Skipped (not in DB): ${skippedTables.join(", ")}`)}function registerImportCommands(program2){program2.command("import <file>").description("Import genie data from JSON export").option("--fail","Abort on any conflict (default)").option("--merge","Skip existing rows, import new ones").option("--overwrite","Replace existing rows with imported data").option("--groups <list>","Comma-separated groups to import (e.g., boards,tags)").action(async(file,options)=>{try{let mode="fail";if(options.overwrite)mode="overwrite";else if(options.merge)mode="merge";let groupFilter=options.groups?.split(",").map((g)=>g.trim());await runImport(file,mode,groupFilter)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_esm14();import{existsSync as existsSync42,mkdirSync as mkdirSync19,symlinkSync as symlinkSync2,writeFileSync as writeFileSync22}from"fs";import{basename as basename9,join as join51,relative as relative3,resolve as resolve8,sep as sep2}from"path";import{existsSync as existsSync40,mkdirSync as mkdirSync17,symlinkSync}from"fs";import{join as join48,relative as relative2}from"path";var import_ignore=__toESM(require_ignore(),1);import{existsSync as existsSync39,readFileSync as readFileSync24,readdirSync as readdirSync9,statSync as statSync3}from"fs";import{join as join47,relative}from"path";var GENIEIGNORE_DEFAULTS=`node_modules
|
|
3196
|
+
`);let tables=Object.keys(doc.data),rows=Object.values(doc.data).reduce((sum,arr)=>sum+arr.length,0);if(console.log(`Exported ${tables.length} tables (${rows} rows) to ${options.output}`),doc.skippedTables.length>0)console.log(`Skipped tables (not found): ${doc.skippedTables.join(", ")}`)}else console.log(json2)}function autoOutputName(){let d=new Date;return`genie-backup-${`${d.getFullYear()}${String(d.getMonth()+1).padStart(2,"0")}${String(d.getDate()).padStart(2,"0")}`}.json`}async function exportGroup(sql,group,filter){let tables=GROUP_TABLES[group],{available,skipped}=await detectTables(sql,tables),data={};for(let table of available)if(filter)data[table]=[...await sql.unsafe(`SELECT * FROM ${table} WHERE ${filter.column} = $1`,[filter.value])];else data[table]=[...await sql.unsafe(`SELECT * FROM ${table}`)];return{data,skipped}}async function exportBoards(sql,name){let tables=GROUP_TABLES.boards,{available,skipped}=await detectTables(sql,tables),data={};for(let table of available)if(name&&table==="boards")data[table]=[...await sql`SELECT * FROM boards WHERE name = ${name}`];else if(table==="task_types")data[table]=[...await sql`SELECT * FROM task_types WHERE is_builtin = false`];else data[table]=[...await sql.unsafe(`SELECT * FROM ${table}`)];return{data,skipped}}var TASK_JOIN_ALIASES={task_tags:"tt",task_actors:"ta",task_dependencies:"td",task_stage_log:"tsl"};async function resolveProjectId2(sql,projectName){let projects=await sql`SELECT id FROM projects WHERE name = ${projectName}`;if(projects.length===0)throw Error(`Project not found: ${projectName}`);return projects[0].id}function stripEphemeralFields(rows){return rows.map((r)=>{let{checkout_run_id,execution_locked_at,session_id,pane_id,...rest}=r;return rest})}async function exportTaskTable(sql,table,projectId){let alias=TASK_JOIN_ALIASES[table];if(table==="tasks"){let rows=projectId?[...await sql.unsafe("SELECT * FROM tasks WHERE project_id = $1",[projectId])]:[...await sql`SELECT * FROM tasks`];return stripEphemeralFields(rows)}if(alias&&projectId)return[...await sql.unsafe(`SELECT ${alias}.* FROM ${table} ${alias} JOIN tasks t ON ${alias}.task_id = t.id WHERE t.project_id = $1`,[projectId])];return[...await sql.unsafe(`SELECT * FROM ${table}`)]}async function exportTasks(sql,projectName){let tables=GROUP_TABLES.tasks,{available,skipped}=await detectTables(sql,tables),data={},projectId=projectName?await resolveProjectId2(sql,projectName):null;for(let table of available)data[table]=await exportTaskTable(sql,table,projectId);return{data,skipped}}async function exportSchedules(sql,name){let{available,skipped}=await detectTables(sql,["schedules"]),data={};if(available.includes("schedules"))if(name)data.schedules=[...await sql`SELECT * FROM schedules WHERE name = ${name}`];else data.schedules=[...await sql`SELECT * FROM schedules`];return{data,skipped}}async function exportTags(sql){let{available,skipped}=await detectTables(sql,["tags"]),data={};if(available.includes("tags"))data.tags=[...await sql`SELECT * FROM tags WHERE name NOT LIKE 'test-%'`];return{data,skipped}}async function exportAll(sql){let allSkipped=[],allData={};for(let group of ALL_GROUPS){let result2;switch(group){case"boards":result2=await exportBoards(sql);break;case"tasks":result2=await exportTasks(sql);break;case"tags":result2=await exportTags(sql);break;case"schedules":result2=await exportSchedules(sql);break;default:result2=await exportGroup(sql,group);break}Object.assign(allData,result2.data),allSkipped.push(...result2.skipped)}return{data:allData,skipped:allSkipped}}async function runExport(groups,type2,exportFn,options){let sql=await getSql(),[version,actor]=await Promise.all([getVersion(),getActorName()]),doc=createExportDocument(type2,groups,version,actor),{data,skipped}=await exportFn(sql);doc.data=data,doc.skippedTables=skipped,outputDocument(doc,options)}function registerExportCommands(program2){let exp=program2.command("export").description("Export genie data as JSON").option("--output <file>","Write to file instead of stdout").option("-o <file>","Alias for --output").option("--pretty","Pretty-print JSON").action(async(options)=>{try{if(!options.output)options.output=autoOutputName();await runExport([...ALL_GROUPS],"full",(sql)=>exportAll(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts=(cmd)=>cmd.option("--output <file>","Write to file instead of stdout").option("--pretty","Pretty-print JSON");sharedOpts(exp.command("all").description("Full backup (all present tables)")).action(async(options)=>{try{if(!options.output)options.output=autoOutputName();await runExport([...ALL_GROUPS],"full",(sql)=>exportAll(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("boards [name]").description("Export boards, templates, and task types")).action(async(name,options)=>{try{await runExport(["boards"],"partial",(sql)=>exportBoards(sql,name),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("tasks").description("Export tasks with deps, actors, and stage log").option("--project <name>","Filter by project name")).action(async(options)=>{try{await runExport(["tasks"],"partial",(sql)=>exportTasks(sql,options.project),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("tags").description("Export tags")).action(async(options)=>{try{await runExport(["tags"],"partial",(sql)=>exportTags(sql),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("projects").description("Export projects")).action(async(options)=>{try{await runExport(["projects"],"partial",(sql)=>exportGroup(sql,"projects"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("schedules [name]").description("Export schedules with run_spec")).action(async(name,options)=>{try{await runExport(["schedules"],"partial",(sql)=>exportSchedules(sql,name),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("agents").description("Export agents, templates, and checkpoints")).action(async(options)=>{try{await runExport(["agents"],"partial",(sql)=>exportGroup(sql,"agents"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("comms").description("Export conversations, messages, mailbox")).action(async(options)=>{try{await runExport(["comms"],"partial",(sql)=>exportGroup(sql,"comms"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}}),sharedOpts(exp.command("config").description("Export OS config (graceful skip if missing)")).action(async(options)=>{try{await runExport(["config"],"partial",(sql)=>exportGroup(sql,"config"),options)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_history();init_export_format();import{readFileSync as readFileSync23}from"fs";var IMPORT_LEVELS=[["schedules","sessions","projects","agent_templates","agent_checkpoints","tags","task_types","notification_preferences","os_config","golden_images","warm_pool","instances"],["triggers","boards","board_templates","agents","conversations"],["tasks","runs","messages","conversation_members","mailbox","team_chat"],["task_tags","task_actors","task_dependencies","task_stage_log","heartbeats","machine_snapshots"]],SELF_REFERENTIAL_COLUMNS={tasks:"parent_id",messages:"reply_to_id",conversations:"parent_message_id"};function getTableLevel(table){for(let i2=0;i2<IMPORT_LEVELS.length;i2++)if(IMPORT_LEVELS[i2].includes(table))return i2;return-1}function sortByImportOrder(tables){return[...tables].sort((a,b2)=>{let la=getTableLevel(a),lb=getTableLevel(b2);return(la===-1?999:la)-(lb===-1?999:lb)})}function getPrimaryKey(table){return{task_tags:["task_id","tag_id"],task_actors:["task_id","actor_type","actor_id","role"],task_dependencies:["task_id","depends_on_id"],conversation_members:["conversation_id","actor_type","actor_id"],notification_preferences:["actor_type","actor_id","channel"]}[table]??["id"]}var VALID_TABLES=new Set(Object.values(GROUP_TABLES).flat());function assertValidTable(name){if(!VALID_TABLES.has(name))throw Error(`Invalid table name: "${name}" is not in the schema whitelist`)}var VALID_COLUMN_RE=/^[a-zA-Z_][a-zA-Z0-9_]*$/;function assertValidColumnName(name){if(!VALID_COLUMN_RE.test(name))throw Error(`Invalid column name: "${name.slice(0,60)}" contains disallowed characters. Column names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/.`)}async function getSql2(){let{getConnection:getConnection2}=await Promise.resolve().then(() => (init_db(),exports_db));return getConnection2()}async function getActorName2(){let{getActor:getActor2}=await Promise.resolve().then(() => (init_audit(),exports_audit));return getActor2()}async function detectTables2(sql,tables){let{filterAvailableTables:filterAvailableTables2}=await Promise.resolve().then(() => exports_table_detect);return filterAvailableTables2(sql,tables)}async function detectConflicts(sql,table,rows){if(rows.length===0)return[];assertValidTable(table);let pk=getPrimaryKey(table);if(pk.length===1){let key=pk[0],ids=rows.map((r)=>r[key]),existing=await sql.unsafe(`SELECT ${key} FROM ${table} WHERE ${key} = ANY($1)`,[ids]),existingSet=new Set(existing.map((r)=>String(r[key])));return rows.filter((r)=>existingSet.has(String(r[key])))}let conflicts=[];for(let row of rows){let conditions=pk.map((col,i2)=>`${col} = $${i2+1}`).join(" AND "),values2=pk.map((col)=>row[col]);if((await sql.unsafe(`SELECT 1 FROM ${table} WHERE ${conditions} LIMIT 1`,values2)).length>0)conflicts.push(row)}return conflicts}function prepareRow(row,table,selfRefUpdates){let selfRefCol=SELF_REFERENTIAL_COLUMNS[table],entries=Object.entries(row),columns=entries.map(([k])=>k),values2=entries.map(([,v])=>v);for(let col of columns)assertValidColumnName(col);if(selfRefCol&&row[selfRefCol]!=null){let idx=columns.indexOf(selfRefCol);if(idx!==-1){let originalSelfRef=values2[idx];values2[idx]=null;let pk=getPrimaryKey(table);selfRefUpdates.push({pk:pk.length===1?row[pk[0]]:pk.map((k)=>row[k]),value:originalSelfRef})}}return{columns,values:values2,quotedCols:columns.map((c)=>`"${c}"`).join(", "),placeholders:values2.map((_,i2)=>`$${i2+1}`).join(", ")}}async function insertOneRow(tx,table,row,prepared,mode){assertValidTable(table);let{quotedCols,placeholders,values:values2}=prepared,pk=getPrimaryKey(table);if(mode==="overwrite"){let pkCondition=pk.map((col,i2)=>`"${col}" = $${values2.length+i2+1}`).join(" AND "),pkValues=pk.map((col)=>row[col]);await tx.unsafe(`DELETE FROM ${table} WHERE ${pkCondition}`,pkValues),await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders})`,values2)}else if(mode==="merge"){let onConflict=pk.map((c)=>`"${c}"`).join(", ");await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders}) ON CONFLICT (${onConflict}) DO NOTHING`,values2)}else await tx.unsafe(`INSERT INTO ${table} (${quotedCols}) VALUES (${placeholders})`,values2)}async function updateSelfRefs(tx,table,updates){assertValidTable(table);let selfRefCol=SELF_REFERENTIAL_COLUMNS[table],pk=getPrimaryKey(table);if(pk.length!==1)return;for(let{pk:pkVal,value}of updates)await tx.unsafe(`UPDATE ${table} SET "${selfRefCol}" = $1 WHERE "${pk[0]}" = $2`,[value,pkVal])}async function insertRows(tx,table,rows,mode){if(rows.length===0)return 0;let selfRefUpdates=[];for(let row of rows){let prepared=prepareRow(row,table,selfRefUpdates);await insertOneRow(tx,table,row,prepared,mode)}if(selfRefUpdates.length>0)await updateSelfRefs(tx,table,selfRefUpdates);return rows.length}function parseExportFile(filePath){let raw=readFileSync23(filePath,"utf-8"),parsed;try{parsed=JSON.parse(raw)}catch{throw Error(`Invalid JSON in ${filePath}`)}let validation=validateExportDocument(parsed);if(!validation.valid)throw Error(`Invalid export document: ${validation.error}`);return validation.doc}async function filterTablesByGroup(allTables,groupFilter){if(!groupFilter||groupFilter.length===0)return allTables;let{GROUP_TABLES:GROUP_TABLES2}=await Promise.resolve().then(() => (init_export_format(),exports_export_format)),allowedTables=new Set;for(let group of groupFilter){let tables=GROUP_TABLES2[group];if(tables)for(let t of tables)allowedTables.add(t);else console.warn(`Warning: Unknown group "${group}", skipping`)}return allTables.filter((t)=>allowedTables.has(t))}async function checkConflicts(sql,tables,data){for(let table of tables){let rows=data[table];if(!rows||rows.length===0)continue;let conflicts=await detectConflicts(sql,table,rows);if(conflicts.length>0){let pk=getPrimaryKey(table),ids=conflicts.slice(0,5).map((r)=>pk.map((k)=>r[k]).join(",")).join("; ");throw Error(`Conflict in table "${table}": ${conflicts.length} existing row(s) (e.g., ${ids}). Use --merge or --overwrite to resolve.`)}}}async function runImport(filePath,mode,groupFilter){let doc=parseExportFile(filePath),tablesToImport=await filterTablesByGroup(Object.keys(doc.data),groupFilter);if(tablesToImport.length===0){console.log("No tables to import.");return}tablesToImport=sortByImportOrder(tablesToImport);let sql=await getSql2(),{available}=await detectTables2(sql,tablesToImport),skippedTables=tablesToImport.filter((t)=>!available.includes(t));if(tablesToImport=available,skippedTables.length>0)console.log(`Skipping tables not in database: ${skippedTables.join(", ")}`);if(mode==="fail")await checkConflicts(sql,tablesToImport,doc.data);let totalInserted=0,tableStats={};await sql.begin(async(tx)=>{for(let table of tablesToImport){let rows=doc.data[table];if(!rows||rows.length===0)continue;let count=await insertRows(tx,table,rows,mode);tableStats[table]=count,totalInserted+=count}});let actor=await getActorName2(),{recordAuditEvent:recordAuditEvent2}=await Promise.resolve().then(() => (init_audit(),exports_audit));await recordAuditEvent2("import",filePath,"import_complete",actor,{mode,tables:tableStats,totalRows:totalInserted,skippedTables,sourceVersion:doc.version,sourceDate:doc.exportedAt}),console.log(`Import complete: ${totalInserted} rows across ${Object.keys(tableStats).length} tables`);for(let[table,count]of Object.entries(tableStats))if(count>0)console.log(` ${table}: ${count} rows`);if(skippedTables.length>0)console.log(`Skipped (not in DB): ${skippedTables.join(", ")}`)}function registerImportCommands(program2){program2.command("import <file>").description("Import genie data from JSON export").option("--fail","Abort on any conflict (default)").option("--merge","Skip existing rows, import new ones").option("--overwrite","Replace existing rows with imported data").option("--groups <list>","Comma-separated groups to import (e.g., boards,tags)").action(async(file,options)=>{try{let mode="fail";if(options.overwrite)mode="overwrite";else if(options.merge)mode="merge";let groupFilter=options.groups?.split(",").map((g)=>g.trim());await runImport(file,mode,groupFilter)}catch(error2){console.error(`Error: ${error2 instanceof Error?error2.message:String(error2)}`),process.exit(1)}})}init_esm14();import{existsSync as existsSync42,mkdirSync as mkdirSync19,symlinkSync,writeFileSync as writeFileSync22}from"fs";import{basename as basename9,join as join51,relative as relative3,resolve as resolve8,sep as sep2}from"path";import{cpSync,existsSync as existsSync40,mkdirSync as mkdirSync17,renameSync as renameSync3,rmSync as rmSync4}from"fs";import{join as join48,relative as relative2}from"path";var import_ignore=__toESM(require_ignore(),1);import{existsSync as existsSync39,readFileSync as readFileSync24,readdirSync as readdirSync9,statSync as statSync3}from"fs";import{join as join47,relative}from"path";var GENIEIGNORE_DEFAULTS=`node_modules
|
|
3197
3197
|
.git
|
|
3198
3198
|
.genie/worktrees
|
|
3199
3199
|
dist
|
|
@@ -3206,14 +3206,14 @@ __pycache__
|
|
|
3206
3206
|
target
|
|
3207
3207
|
coverage
|
|
3208
3208
|
.cache
|
|
3209
|
-
`;function loadIgnoreRules(ignoreFilePath){let ig=import_ignore.default();if(existsSync39(ignoreFilePath)){let content=readFileSync24(ignoreFilePath,"utf-8");ig.add(content)}return ig}async function*scanForAgents(root,ignoreFilePath){let ig=loadIgnoreRules(ignoreFilePath??join47(root,".genieignore"));ig.add("agents"),yield*walkDir(root,root,ig)}function*walkDir(dir,root,ig){let names;try{names=readdirSync9(dir)}catch{return}for(let name of names){let fullPath=join47(dir,name);try{if(!statSync3(fullPath).isDirectory())continue}catch{continue}let relPath=`${relative(root,fullPath)}/`;if(ig.ignores(relPath))continue;let agentsMdPath=join47(fullPath,"AGENTS.md");if(existsSync39(agentsMdPath)){let hasSubAgents=hasSubAgentDirs(fullPath);if(yield{path:fullPath,dirName:name,hasSubAgents,isSubAgent:!1},hasSubAgents)yield*scanSubAgents2(fullPath,name)}yield*walkDir(fullPath,root,ig)}}function hasSubAgentDirs(agentDir){let subAgentsDir=join47(agentDir,".genie","agents");if(!existsSync39(subAgentsDir))return!1;try{return readdirSync9(subAgentsDir).some((name)=>{let subPath=join47(subAgentsDir,name);try{return statSync3(subPath).isDirectory()&&existsSync39(join47(subPath,"AGENTS.md"))}catch{return!1}})}catch{return!1}}function*scanSubAgents2(parentDir,parentName){let subAgentsDir=join47(parentDir,".genie","agents");if(!existsSync39(subAgentsDir))return;let names;try{names=readdirSync9(subAgentsDir)}catch{return}for(let name of names){let subDir=join47(subAgentsDir,name);try{if(!statSync3(subDir).isDirectory())continue}catch{continue}if(!existsSync39(join47(subDir,"AGENTS.md")))continue;yield{path:subDir,dirName:name,hasSubAgents:!1,isSubAgent:!0,parentName}}}async function scanForAgentsAll(root,ignoreFilePath){let results=[];for await(let agent of scanForAgents(root,ignoreFilePath))results.push(agent);return results}init_workspace();async function discoverExternalAgents(workspaceRoot){let allScanned=await scanForAgentsAll(workspaceRoot),canonicalNames=new Set(scanAgents2(workspaceRoot)),agentsDir=join48(workspaceRoot,"agents"),external2=[];for(let scanned of allScanned){if(scanned.path.startsWith(agentsDir))continue;if(canonicalNames.has(scanned.dirName))continue;external2.push({name:scanned.dirName,path:scanned.path,relativePath:relative2(workspaceRoot,scanned.path),isSubAgent:scanned.isSubAgent,parentName:scanned.parentName})}return external2}function importAgents(workspaceRoot,agents){let agentsDir=join48(workspaceRoot,"agents");mkdirSync17(agentsDir,{recursive:!0});let result2={imported:[],skipped:[],errors:[]};for(let agent of agents){let
|
|
3209
|
+
`;function loadIgnoreRules(ignoreFilePath){let ig=import_ignore.default();if(existsSync39(ignoreFilePath)){let content=readFileSync24(ignoreFilePath,"utf-8");ig.add(content)}return ig}async function*scanForAgents(root,ignoreFilePath){let ig=loadIgnoreRules(ignoreFilePath??join47(root,".genieignore"));ig.add("agents"),yield*walkDir(root,root,ig)}function*walkDir(dir,root,ig){let names;try{names=readdirSync9(dir)}catch{return}for(let name of names){let fullPath=join47(dir,name);try{if(!statSync3(fullPath).isDirectory())continue}catch{continue}let relPath=`${relative(root,fullPath)}/`;if(ig.ignores(relPath))continue;let agentsMdPath=join47(fullPath,"AGENTS.md");if(existsSync39(agentsMdPath)){let hasSubAgents=hasSubAgentDirs(fullPath);if(yield{path:fullPath,dirName:name,hasSubAgents,isSubAgent:!1},hasSubAgents)yield*scanSubAgents2(fullPath,name)}yield*walkDir(fullPath,root,ig)}}function hasSubAgentDirs(agentDir){let subAgentsDir=join47(agentDir,".genie","agents");if(!existsSync39(subAgentsDir))return!1;try{return readdirSync9(subAgentsDir).some((name)=>{let subPath=join47(subAgentsDir,name);try{return statSync3(subPath).isDirectory()&&existsSync39(join47(subPath,"AGENTS.md"))}catch{return!1}})}catch{return!1}}function*scanSubAgents2(parentDir,parentName){let subAgentsDir=join47(parentDir,".genie","agents");if(!existsSync39(subAgentsDir))return;let names;try{names=readdirSync9(subAgentsDir)}catch{return}for(let name of names){let subDir=join47(subAgentsDir,name);try{if(!statSync3(subDir).isDirectory())continue}catch{continue}if(!existsSync39(join47(subDir,"AGENTS.md")))continue;yield{path:subDir,dirName:name,hasSubAgents:!1,isSubAgent:!0,parentName}}}async function scanForAgentsAll(root,ignoreFilePath){let results=[];for await(let agent of scanForAgents(root,ignoreFilePath))results.push(agent);return results}init_workspace();async function discoverExternalAgents(workspaceRoot){let allScanned=await scanForAgentsAll(workspaceRoot),canonicalNames=new Set(scanAgents2(workspaceRoot)),agentsDir=join48(workspaceRoot,"agents"),external2=[];for(let scanned of allScanned){if(scanned.path.startsWith(agentsDir))continue;if(canonicalNames.has(scanned.dirName))continue;external2.push({name:scanned.dirName,path:scanned.path,relativePath:relative2(workspaceRoot,scanned.path),isSubAgent:scanned.isSubAgent,parentName:scanned.parentName})}return external2}function importAgents(workspaceRoot,agents){let agentsDir=join48(workspaceRoot,"agents");mkdirSync17(agentsDir,{recursive:!0});let result2={imported:[],skipped:[],errors:[]};for(let agent of agents){let destName=resolveUniqueName(agentsDir,agent.name),destPath=join48(agentsDir,destName);if(existsSync40(destPath)){result2.skipped.push(agent.name);continue}try{moveDirectory(agent.path,destPath),result2.imported.push(destName)}catch(err){result2.errors.push({name:agent.name,error:err instanceof Error?err.message:String(err)})}}return result2}function moveDirectory(src,dest){try{renameSync3(src,dest)}catch{cpSync(src,dest,{recursive:!0}),rmSync4(src,{recursive:!0,force:!0})}}function resolveUniqueName(agentsDir,name){if(!existsSync40(join48(agentsDir,name)))return name;let suffix=2;while(existsSync40(join48(agentsDir,`${name}-${suffix}`)))suffix++;return`${name}-${suffix}`}init_interactivity();init_defaults();import{readFileSync as readFileSync25,writeFileSync as writeFileSync20}from"fs";import{join as join49}from"path";function formatDefaults(workspaceDefaults){let effective=computeEffectiveDefaults(workspaceDefaults),lines=[];for(let key of Object.keys(BUILTIN_DEFAULTS)){let value=effective[key],source=workspaceDefaults?.[key]!==void 0?"workspace":"built-in";lines.push(` ${key}: ${value} (${source})`)}return lines.join(`
|
|
3210
3210
|
`)}function formatWelcome(ctx){let lines=["",` Workspace: ${ctx.workspaceName}`,` Agents: ${ctx.canonicalAgentCount} registered`];if(ctx.discovered.length>0)lines.push(` Discovered: ${ctx.discovered.length} external agent(s) found`);return lines.push(""),lines.push(" Effective defaults:"),lines.push(formatDefaults(ctx.config.agents?.defaults)),lines.push(""),lines.join(`
|
|
3211
3211
|
`)}function formatNextSteps(ctx){let lines=[""," Next steps:"];if(ctx.canonicalAgentCount===0)lines.push(" genie init agent <name> Scaffold your first agent");return lines.push(" genie spawn <agent> Launch an agent"),lines.push(" genie team create <name> Create a multi-agent team"),lines.push(" /wizard Full guided onboarding"),lines.push(""),lines.join(`
|
|
3212
3212
|
`)}var MODEL_CHOICES=[{name:"opus (most capable)",value:"opus"},{name:"sonnet (balanced)",value:"sonnet"},{name:"haiku (fastest)",value:"haiku"}];async function runMiniWizard(ctx){let{confirm:confirm2}=await Promise.resolve().then(() => (init_esm14(),exports_esm));console.log(formatWelcome(ctx));let wantCustomize=await confirm2({message:"Customize workspace defaults?",default:!1}),result2={customized:!1,importedAgents:[],completed:!0};if(wantCustomize){let newDefaults=await customizeDefaults(ctx.config.agents?.defaults);if(newDefaults)result2.customized=!0,result2.defaults=newDefaults,persistDefaults(ctx.workspaceRoot,newDefaults)}if(ctx.pending.length>0){console.log(`
|
|
3213
3213
|
Found ${ctx.pending.length} agent(s) in your project tree:`);for(let agent of ctx.pending)console.log(` ${agent.name} (${agent.relativePath})`);if(await confirm2({message:"Import discovered agents into workspace?",default:!0}))result2.importedAgents=ctx.pending.map((a)=>a.name)}return console.log(formatNextSteps(ctx)),result2}async function customizeDefaults(currentDefaults){let{select:select2}=await Promise.resolve().then(() => (init_esm14(),exports_esm)),effective=computeEffectiveDefaults(currentDefaults),updates={},changed=!1,model=await select2({message:"Default model:",choices:MODEL_CHOICES,default:effective.model});if(model!==BUILTIN_DEFAULTS.model)updates.model=model,changed=!0;let permissionMode=await select2({message:"Default permission mode:",choices:[{name:"default (ask for risky tools)",value:"default"},{name:"plan (require plan approval)",value:"plan"},{name:"bypassPermissions (auto-approve all)",value:"bypassPermissions"}],default:effective.permissionMode});if(permissionMode!==BUILTIN_DEFAULTS.permissionMode)updates.permissionMode=permissionMode,changed=!0;return changed?updates:null}function persistDefaults(workspaceRoot,newDefaults){let configPath2=join49(workspaceRoot,".genie","workspace.json");try{let raw=readFileSync25(configPath2,"utf-8"),config=JSON.parse(raw);if(!config.agents)config.agents={};if(!config.agents.defaults)config.agents.defaults={};Object.assign(config.agents.defaults,newDefaults),writeFileSync20(configPath2,`${JSON.stringify(config,null,2)}
|
|
3214
3214
|
`,"utf-8"),console.log(" Workspace defaults updated.")}catch(err){console.error(` Failed to update workspace.json: ${err instanceof Error?err.message:String(err)}`)}}import{existsSync as existsSync41,mkdirSync as mkdirSync18,readFileSync as readFileSync26,writeFileSync as writeFileSync21}from"fs";import{join as join50}from"path";function pendingPath(workspaceRoot){return join50(workspaceRoot,".genie","pending-agents.json")}function loadPending(workspaceRoot){let filePath=pendingPath(workspaceRoot);if(!existsSync41(filePath))return{agents:[]};try{let raw=readFileSync26(filePath,"utf-8"),parsed=JSON.parse(raw);return{agents:Array.isArray(parsed.agents)?parsed.agents:[]}}catch{return{agents:[]}}}function savePending(workspaceRoot,store){let filePath=pendingPath(workspaceRoot);mkdirSync18(join50(workspaceRoot,".genie"),{recursive:!0}),writeFileSync21(filePath,`${JSON.stringify(store,null,2)}
|
|
3215
3215
|
`,"utf-8")}function refreshPending(workspaceRoot,discovered){let existing=loadPending(workspaceRoot),dismissedSet=new Set(existing.agents.filter((a)=>a.dismissed).map((a)=>a.path)),now=new Date().toISOString(),store={agents:discovered.map((d)=>({name:d.name,path:d.path,relativePath:d.relativePath,isSubAgent:d.isSubAgent,parentName:d.parentName,discoveredAt:existing.agents.find((a)=>a.path===d.path)?.discoveredAt??now,dismissed:dismissedSet.has(d.path)}))};return savePending(workspaceRoot,store),store}function listPending(workspaceRoot){return loadPending(workspaceRoot).agents.filter((a)=>!a.dismissed)}function removePending(workspaceRoot,agentPath){let store=loadPending(workspaceRoot),idx=store.agents.findIndex((a)=>a.path===agentPath);if(idx===-1)return!1;return store.agents.splice(idx,1),savePending(workspaceRoot,store),!0}init_workspace();init_templates();function detectPgUrl(){if(process.env.DATABASE_URL)return process.env.DATABASE_URL;if(process.env.PG_URL)return process.env.PG_URL;try{let{execSync:execSync15}=__require("child_process"),match=execSync15("pgrep -af pgserve 2>/dev/null",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(/postgres(?:ql)?:\/\/[^\s]+/);if(match)return match[0]}catch{}return}async function ensureSetupCompleteForInit(){let{isSetupComplete:isSetupComplete2}=await Promise.resolve().then(() => (init_genie_config2(),exports_genie_config));if(isSetupComplete2())return;console.log("Genie setup not complete. Running `genie setup` before continuing...");let{setupCommand:setupCommand2}=await Promise.resolve().then(() => (init_setup(),exports_setup));await setupCommand2()}function scaffoldAgentInWorkspace(workspaceRoot,name,agentsDir){let baseDir=agentsDir??join51(workspaceRoot,"agents"),agentDir=join51(baseDir,name);if(existsSync42(agentDir))throw Error(`Agent directory already exists: ${agentDir}`);mkdirSync19(agentDir,{recursive:!0}),mkdirSync19(join51(agentDir,"brain","memory"),{recursive:!0}),mkdirSync19(join51(agentDir,".claude"),{recursive:!0});let workspaceDefaults;try{workspaceDefaults=getWorkspaceConfig(workspaceRoot).agents?.defaults}catch{}scaffoldAgentFiles(agentDir,name,workspaceDefaults),writeFileSync22(join51(agentDir,".claude","settings.local.json"),`${JSON.stringify({agentName:name},null,2)}
|
|
3216
|
-
`);let reposTarget=join51(workspaceRoot,"repos");if(existsSync42(reposTarget))try{
|
|
3216
|
+
`);let reposTarget=join51(workspaceRoot,"repos");if(existsSync42(reposTarget))try{symlinkSync(reposTarget,join51(agentDir,"repos"))}catch{}if(console.log(`Agent scaffolded: agents/${name}/`),console.log(" AGENTS.md, SOUL.md, HEARTBEAT.md"),console.log(" brain/memory/"),console.log(" .claude/settings.local.json"),existsSync42(join51(agentDir,"repos")))console.log(" repos -> ../repos (symlink)")}async function maybeBootstrapDefaultAgent(workspaceRoot){if(scanAgents2(workspaceRoot).length>0)return!1;if(!await esm_default4({message:"No agent found in this workspace. Scaffold the default `genie` agent now?",default:!0}))return console.log(" Skipped default agent bootstrap. Run `genie init agent genie` later."),!1;return scaffoldAgentInWorkspace(workspaceRoot,"genie"),!0}async function syncWorkspaceAgents(workspaceRoot){let agents=scanAgents2(workspaceRoot);if(agents.length===0)return;console.log(` Found ${agents.length} agent(s): ${agents.join(", ")}`);try{let{syncAgentDirectory:syncAgentDirectory2}=await Promise.resolve().then(() => (init_agent_sync(),exports_agent_sync)),result2=await syncAgentDirectory2(workspaceRoot);if(result2.registered.length>0)console.log(` Registered: ${result2.registered.join(", ")}`);if(result2.updated.length>0)console.log(` Updated: ${result2.updated.join(", ")}`)}catch{}}async function initWorkspace(){let cwd=process.cwd(),existing=findWorkspace(cwd);if(existing){if(console.log(`Already inside workspace: ${existing.root}`),await maybeBootstrapDefaultAgent(existing.root))await syncWorkspaceAgents(existing.root);return}let genieDir=join51(cwd,".genie");mkdirSync19(genieDir,{recursive:!0});let pgUrl=detectPgUrl(),config={name:basename9(cwd),pgUrl,agents:{defaults:{}},tmux:{socket:"genie"},sdk:{}};writeFileSync22(join51(genieDir,"workspace.json"),`${JSON.stringify(config,null,2)}
|
|
3217
3217
|
`);let genieignorePath=join51(cwd,".genieignore");if(!existsSync42(genieignorePath))writeFileSync22(genieignorePath,GENIEIGNORE_DEFAULTS,"utf-8"),console.log(" Created .genieignore");if(console.log(`Workspace created: ${cwd}`),pgUrl)console.log(` pgUrl: ${pgUrl}`);await maybeBootstrapDefaultAgent(cwd),await syncWorkspaceAgents(cwd),await runPostInitFlow(cwd,config)}async function runPostInitFlow(workspaceRoot,config){if(!isInteractive())return;let discovered=await discoverExternalAgents(workspaceRoot);refreshPending(workspaceRoot,discovered);let pending=listPending(workspaceRoot),ctx={workspaceRoot,workspaceName:basename9(workspaceRoot),config,discovered,pending,canonicalAgentCount:scanAgents2(workspaceRoot).length},result2=await runMiniWizard(ctx);if(result2.importedAgents.length>0){let toImport=pending.filter((p)=>result2.importedAgents.includes(p.name)),discoveredToImport=toImport.map((p)=>({name:p.name,path:p.path,relativePath:p.relativePath,isSubAgent:p.isSubAgent,parentName:p.parentName})),importResult=importAgents(workspaceRoot,discoveredToImport);for(let name of importResult.imported){let agent=toImport.find((a)=>a.name===name);if(agent)removePending(workspaceRoot,agent.path);console.log(` Imported: ${name}`)}for(let err of importResult.errors)console.error(` Import failed (${err.name}): ${err.error}`);await syncWorkspaceAgents(workspaceRoot)}}function resolveAgentsDir(wsRoot,dirOption){if(dirOption)return resolve8(dirOption);let cwd=process.cwd(),rel=relative3(wsRoot,cwd);if(rel.startsWith(".."))return join51(wsRoot,"agents");let segments=rel===""?[]:rel.split(sep2),idx=segments.indexOf("agents");if(idx===-1)return join51(wsRoot,"agents");return join51(wsRoot,...segments.slice(0,idx+1))}async function initAgent(name,options){if(!name||/[\/\\]/.test(name)||name==="."||name===".."||name.includes(".."))console.error("Error: Agent name must not contain path separators or traversal sequences."),process.exit(1);let cwd=process.cwd(),ws=findWorkspace(cwd);if(!ws)console.error("Error: Not in a genie workspace. Run `genie init` first."),process.exit(1);let agentsDir=resolveAgentsDir(ws.root,options.dir);try{scaffoldAgentInWorkspace(ws.root,name,agentsDir)}catch(error2){let message=error2 instanceof Error?error2.message:String(error2);console.error(`Error: ${message}`),process.exit(1)}}function registerInitCommands(program2){program2.command("init").description("Initialize a genie workspace").action(async()=>{await ensureSetupCompleteForInit(),await initWorkspace()}).command("agent <name>").description("Scaffold a new agent in the workspace").option("--dir <path>","Target directory for agent (default: CWD if inside agents/, else workspace agents/)").action(async(name,options)=>{await ensureSetupCompleteForInit(),await initAgent(name,options)})}init_db();init_runtime_events();init_term_format();function parseSince2(since){let match=since.match(/^(\d+)([smhd])$/);if(!match)return since;let amount=Number.parseInt(match[1],10),unit=match[2],ms={s:1000,m:60000,h:3600000,d:86400000}[unit]??3600000;return new Date(Date.now()-amount*ms).toISOString()}async function metricsNowCommand(options){if(!await isAvailable())console.error("Database not available."),process.exit(1);let sql=await getConnection(),snapshots=await sql`SELECT * FROM machine_snapshots ORDER BY created_at DESC LIMIT 1`,agentCount=await sql`SELECT count(DISTINCT agent_id)::int as cnt FROM executors WHERE state NOT IN ('done', 'error', 'terminated')`,teamCount=await sql`SELECT count(*)::int as cnt FROM teams WHERE status = 'in_progress'`,snapshot=snapshots[0]??{},eventMetrics=getEventMetrics(),data={active_workers:snapshot.active_workers??agentCount[0]?.cnt??0,active_teams:snapshot.active_teams??teamCount[0]?.cnt??0,tmux_sessions:snapshot.tmux_sessions??0,cpu_percent:snapshot.cpu_percent??null,memory_mb:snapshot.memory_mb??null,snapshot_at:snapshot.created_at?new Date(snapshot.created_at).toISOString():null,events_emitted:eventMetrics.eventsEmitted,events_failed:eventMetrics.eventsFailed,last_emit_duration_ms:eventMetrics.lastEmitDuration,circuit_state:eventMetrics.circuitState};if(options.json){console.log(JSON.stringify(data,null,2));return}if(console.log("Machine State:"),console.log(` Workers: ${data.active_workers}`),console.log(` Teams: ${data.active_teams}`),console.log(` Tmux: ${data.tmux_sessions} sessions`),data.cpu_percent!==null)console.log(` CPU: ${data.cpu_percent}%`);if(data.memory_mb!==null)console.log(` Memory: ${data.memory_mb} MB`);if(data.snapshot_at)console.log(` As of: ${formatRelativeTimestamp(data.snapshot_at)}`);console.log(`
|
|
3218
3218
|
Event Throughput:`),console.log(` Emitted: ${data.events_emitted}`),console.log(` Failed: ${data.events_failed}`),console.log(` Last ms: ${data.last_emit_duration_ms}`),console.log(` Circuit: ${data.circuit_state}`)}async function metricsHistoryCommand(options){if(!await isAvailable())console.error("Database not available."),process.exit(1);let sql=await getConnection(),sinceTs=parseSince2(options.since??"1h"),rows=await sql`
|
|
3219
3219
|
SELECT active_workers, active_teams, tmux_sessions, cpu_percent, memory_mb, created_at
|
package/knip.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genie",
|
|
3
|
-
"version": "4.260409.
|
|
3
|
+
"version": "4.260409.3",
|
|
4
4
|
"description": "Human-AI partnership for Claude Code. Share a terminal, orchestrate workers, evolve together. Brainstorm ideas, turn them into wishes, execute with /work, validate with /review, and ship as one team.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Namastex Labs"
|