@claude-flow/plugin-gastown-bridge 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/bridges.cjs +1 -1
- package/dist/bridges.js +1 -1
- package/dist/{chunk-JU7XR5TR.cjs → chunk-CL5Y5TGX.cjs} +3 -3
- package/dist/{chunk-JU7XR5TR.cjs.map → chunk-CL5Y5TGX.cjs.map} +1 -1
- package/dist/{chunk-HACN5YC7.js → chunk-GTFAMI2F.js} +3 -3
- package/dist/{chunk-HACN5YC7.js.map → chunk-GTFAMI2F.js.map} +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.js +2 -2
- package/dist/wasm-loader.js +1 -1
- package/package.json +3 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {execFile,spawn}from'child_process';import {promisify}from'util';import {z as z$1}from'zod';/**
|
|
2
|
-
* @claude-flow/plugin-gastown-bridge v0.1.
|
|
2
|
+
* @claude-flow/plugin-gastown-bridge v0.1.1
|
|
3
3
|
*
|
|
4
4
|
* WASM-accelerated Gas Town orchestration for Claude Flow V3
|
|
5
5
|
* Bundle optimized: <100KB gzipped total
|
|
@@ -10,5 +10,5 @@ import {execFile,spawn}from'child_process';import {promisify}from'util';import {
|
|
|
10
10
|
var f=class{cache=new Map;head=null;tail=null;currentSize=0;maxSize;maxEntries;ttlMs;onEvict;constructor(e={}){this.maxSize=e.maxSize??50*1024*1024,this.maxEntries=e.maxEntries??1e3,this.ttlMs=e.ttlMs??0,this.onEvict=e.onEvict;}get(e){let t=this.cache.get(e);if(t){if(this.ttlMs>0&&Date.now()-t.createdAt>this.ttlMs){this.delete(e);return}return this.moveToFront(t),t.accessCount++,t.value}}set(e,t,r){let i=r??this.estimateSize(t),s=this.cache.get(e);if(s){this.currentSize-=s.size,s.value=t,s.size=i,s.createdAt=Date.now(),this.currentSize+=i,this.moveToFront(s);return}for(;(this.cache.size>=this.maxEntries||this.currentSize+i>this.maxSize)&&this.tail;)this.evictLRU();let a={key:e,value:t,prev:null,next:this.head,size:i,createdAt:Date.now(),accessCount:1};this.head&&(this.head.prev=a),this.head=a,this.tail||(this.tail=a),this.cache.set(e,a),this.currentSize+=i;}has(e){let t=this.cache.get(e);return t?this.ttlMs>0&&Date.now()-t.createdAt>this.ttlMs?(this.delete(e),false):true:false}delete(e){let t=this.cache.get(e);return t?(this.removeNode(t),this.cache.delete(e),this.currentSize-=t.size,true):false}clear(){if(this.onEvict)for(let[e,t]of this.cache)this.onEvict(e,t.value);this.cache.clear(),this.head=null,this.tail=null,this.currentSize=0;}stats(){let e=0;for(let t of this.cache.values())e+=t.accessCount;return {entries:this.cache.size,sizeBytes:this.currentSize,maxEntries:this.maxEntries,maxSizeBytes:this.maxSize,hitRate:this.cache.size>0?e/this.cache.size:0}}keys(){return this.cache.keys()}get size(){return this.cache.size}moveToFront(e){e!==this.head&&(this.removeNode(e),e.prev=null,e.next=this.head,this.head&&(this.head.prev=e),this.head=e,this.tail||(this.tail=e));}removeNode(e){e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev;}evictLRU(){if(!this.tail)return;let e=this.tail;this.removeNode(e),this.cache.delete(e.key),this.currentSize-=e.size,this.onEvict&&this.onEvict(e.key,e.value);}estimateSize(e){return e==null?8:typeof e=="string"?e.length*2:typeof e=="number"?8:typeof e=="boolean"?4:ArrayBuffer.isView(e)?e.byteLength:Array.isArray(e)?e.reduce((t,r)=>t+this.estimateSize(r),64):typeof e=="object"?JSON.stringify(e).length*2:64}},F=class{astCache;hashCache=new Map;constructor(e=500){this.astCache=new f({maxEntries:e,ttlMs:300*1e3});}get(e){let t=this.hashContent(e);return this.astCache.get(t)}set(e,t){let r=this.hashContent(e);this.astCache.set(r,t);}has(e){let t=this.hashContent(e);return this.astCache.has(t)}clear(){this.astCache.clear(),this.hashCache.clear();}stats(){let e=this.astCache.stats();return {entries:e.entries,sizeBytes:e.sizeBytes}}hashContent(e){let t=this.hashCache.get(e);if(t)return t;let r=2166136261;for(let s=0;s<e.length;s++)r^=e.charCodeAt(s),r=r*16777619>>>0;let i=r.toString(36);if(this.hashCache.set(e,i),this.hashCache.size>1e4){let s=this.hashCache.keys().next().value;s&&this.hashCache.delete(s);}return i}};var b=class{pending=new Map;timeoutMs;constructor(e=3e4){this.timeoutMs=e;}async dedupe(e,t){let r=this.pending.get(e);if(r)return new Promise((d,o)=>{r.resolvers.push({resolve:d,reject:o});});let i=[],s=(async()=>{try{let d=await t();for(let{resolve:o}of i)o(d);return d}catch(d){for(let{reject:o}of i)o(d);throw d}finally{this.pending.delete(e);}})(),a={promise:s,resolvers:i,startedAt:Date.now()};return this.pending.set(e,a),setTimeout(()=>{let d=this.pending.get(e);if(d===a){this.pending.delete(e);for(let{reject:o}of d.resolvers)o(new Error(`Request timed out after ${this.timeoutMs}ms`));}},this.timeoutMs),s}get pendingCount(){return this.pending.size}clear(){for(let[e,t]of this.pending)for(let{reject:r}of t.resolvers)r(new Error("Deduplicator cleared"));this.pending.clear();}},$=class{preloadQueue=[];loaded=new Map;errors=new Map;isPreloading=false;preloadPromise=null;register(e,t,r=0){this.loaded.has(e)||(this.preloadQueue.push({name:e,loader:t,priority:r}),this.preloadQueue.sort((i,s)=>s.priority-i.priority));}async startPreload(){if(!(this.isPreloading||this.preloadQueue.length===0)){this.isPreloading=true,this.preloadPromise=this.runPreload();try{await this.preloadPromise;}finally{this.isPreloading=false,this.preloadPromise=null;}}}get(e){return this.loaded.get(e)}isLoaded(e){return this.loaded.has(e)}getError(e){return this.errors.get(e)}status(){return {queued:this.preloadQueue.length,loaded:this.loaded.size,errors:this.errors.size,isPreloading:this.isPreloading}}async waitForPreload(){this.preloadPromise&&await this.preloadPromise;}async runPreload(){for(;this.preloadQueue.length>0;){let e=this.preloadQueue.shift();if(!e)break;await this.scheduleIdleTask(async()=>{try{let t=await e.loader();this.loaded.set(e.name,t);}catch(t){this.errors.set(e.name,t);}});}}scheduleIdleTask(e){return new Promise(t=>{typeof requestIdleCallback<"u"?requestIdleCallback(async()=>{await e(),t();}):typeof setImmediate<"u"?setImmediate(async()=>{await e(),t();}):setTimeout(async()=>{await e(),t();},0);})}};var V=class{constructor(e,t=100){this.emit=e;this.debounceMs=t;}pending=null;timeoutId=null;lastEmitTime=0;update(e){this.pending=e;let r=Date.now()-this.lastEmitTime;if(r>=this.debounceMs){this.flush();return}this.timeoutId||(this.timeoutId=setTimeout(()=>{this.flush();},this.debounceMs-r));}flush(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.pending!==null&&(this.emit(this.pending),this.pending=null,this.lastEmitTime=Date.now());}cancel(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.pending=null;}};var q=promisify(execFile),N=new f({maxEntries:200,ttlMs:30*1e3}),R=new f({maxEntries:500,ttlMs:300*1e3}),ee=new b,C=new f({maxEntries:500,ttlMs:60*1e3});function K(n){let e=2166136261;for(let t of n){for(let r=0;r<t.length;r++)e^=t.charCodeAt(r),e=e*16777619>>>0;e^=255;}return e.toString(36)}var B=z$1.string().max(1024,"String too long").refine(n=>!/[;&|`$(){}><\n\r\0]/.test(n),"String contains shell metacharacters"),te=z$1.string().min(1,"Identifier cannot be empty").max(64,"Identifier too long").regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/,"Invalid identifier format"),re=z$1.number().positive("Gas price must be positive").max(1e6,"Gas price exceeds maximum"),ie=z$1.number().int("Gas limit must be an integer").positive("Gas limit must be positive").max(3e7,"Gas limit exceeds maximum"),j=z$1.string().regex(/^0x[a-fA-F0-9]{64}$/,"Invalid transaction hash format"),I=z$1.string().regex(/^0x[a-fA-F0-9]{40}$/,"Invalid address format"),se=z$1.enum(["mainnet","goerli","sepolia","polygon","arbitrum","optimism","base","local"]),Q=z$1.string().max(512,"Argument too long").refine(n=>!n.includes("\0"),"Argument contains null byte").refine(n=>!/[;&|`$(){}><]/.test(n),"Argument contains shell metacharacters"),h=class extends Error{constructor(t,r,i,s,a){super(t);this.code=r;this.command=i;this.args=s;this.cause=a;this.name="GtBridgeError";}},ne={debug:(n,e)=>console.debug(`[gt-bridge] ${n}`,e??""),info:(n,e)=>console.info(`[gt-bridge] ${n}`,e??""),warn:(n,e)=>console.warn(`[gt-bridge] ${n}`,e??""),error:(n,e)=>console.error(`[gt-bridge] ${n}`,e??"")},ae=new Set(["estimate","status","network","price","tx","simulate","decode","encode","help","version","config"]),z=class n{config;logger;initialized=false;static CACHEABLE_COMMANDS=new Set(["version","status","price","decode","help","config"]);static STATIC_COMMANDS=new Set(["version","help","decode"]);constructor(e,t){this.config={gtPath:e?.gtPath??"gt",cwd:e?.cwd??process.cwd(),timeout:e?.timeout??3e4,maxBuffer:e?.maxBuffer??10*1024*1024,env:e?.env??process.env,defaultNetwork:e?.defaultNetwork??"mainnet"},this.logger=t??ne;}async initialize(){try{let e=await this.execGt(["version"]);if(!e.success)throw new h("Failed to verify gt installation","COMMAND_NOT_FOUND","gt",["version"]);this.initialized=!0,this.logger.info("Gas Town bridge initialized",{gtPath:this.config.gtPath,version:e.data});}catch(e){throw e instanceof h?e:new h("Failed to initialize Gas Town bridge","COMMAND_NOT_FOUND","gt",["version"],e)}}async execGt(e,t=false){let r=Date.now(),i=this.validateAndSanitizeArgs(e),s=i[0];if(s&&!ae.has(s))throw new h(`Command not allowed: ${s}`,"INVALID_ARGUMENT","gt",i);let a=K(i),d=!t&&s&&n.CACHEABLE_COMMANDS.has(s),o=s&&n.STATIC_COMMANDS.has(s);if(d){let l=o?R.get(a):N.get(a);if(l)return this.logger.debug("Cache hit for gt command",{command:s}),{...l,durationMs:0}}return ee.dedupe(a,async()=>{try{this.logger.debug("Executing gt command",{command:"gt",args:i});let{stdout:l,stderr:u}=await q(this.config.gtPath,i,{cwd:this.config.cwd,env:this.config.env,timeout:this.config.timeout,maxBuffer:this.config.maxBuffer,shell:!1,windowsHide:!0}),c=Date.now()-r;u&&u.trim()&&this.logger.warn("gt stderr output",{stderr:u});let p={success:!0,data:l.trim(),command:"gt",args:i,durationMs:c};return d&&p.success&&(o?R.set(a,p):N.set(a,p)),p}catch(l){let u=Date.now()-r,c=l;if(c.killed)throw new h("Command execution timed out","TIMEOUT","gt",i);if(c.code==="ENOENT")throw new h(`gt executable not found at: ${this.config.gtPath}`,"COMMAND_NOT_FOUND","gt",i);return {success:false,error:c.stderr||c.message,command:"gt",args:i,durationMs:u}}})}parseGtOutput(e){if(!e||e.trim()==="")throw new h("Empty output from gt command","INVALID_OUTPUT");let t=K([e]),r=C.get(t);if(r!==void 0)return r;try{let i=JSON.parse(e);return C.set(t,i),i}catch{let i=e.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(i)try{let s=JSON.parse(i[0]);return C.set(t,s),s}catch{throw new h("Failed to parse gt output as JSON","INVALID_OUTPUT")}throw new h("Output is not valid JSON","INVALID_OUTPUT")}}async estimateGas(e){this.ensureInitialized();let t=I.parse(e.to),r=e.network??this.config.defaultNetwork,i=["estimate","--to",t,"--network",r,"--json"];if(e.data){let a=B.parse(e.data);i.push("--data",a);}if(e.value){let a=B.parse(e.value);i.push("--value",a);}if(e.from){let a=I.parse(e.from);i.push("--from",a);}let s=await this.execGt(i);if(!s.success||!s.data)throw new h(s.error??"Gas estimation failed","EXECUTION_FAILED","gt",i);return this.parseGtOutput(s.data)}async getTxStatus(e,t){this.ensureInitialized();let i=["tx","status",j.parse(e),"--network",t??this.config.defaultNetwork,"--json"],s=await this.execGt(i);if(!s.success||!s.data)throw new h(s.error??"Failed to get transaction status","EXECUTION_FAILED","gt",i);return this.parseGtOutput(s.data)}async getNetworkStatus(e){this.ensureInitialized();let t=["network","status","--network",e??this.config.defaultNetwork,"--json"],r=await this.execGt(t);if(!r.success||!r.data)throw new h(r.error??"Failed to get network status","NETWORK_ERROR","gt",t);return this.parseGtOutput(r.data)}async getGasPrice(e){this.ensureInitialized();let t=["price","--network",e??this.config.defaultNetwork,"--json"],r=await this.execGt(t);if(!r.success||!r.data)throw new h(r.error??"Failed to get gas price","EXECUTION_FAILED","gt",t);return this.parseGtOutput(r.data)}async simulate(e){this.ensureInitialized();let t=I.parse(e.to),r=B.parse(e.data),i=e.network??this.config.defaultNetwork,s=["simulate","--to",t,"--data",r,"--network",i,"--json"];e.value&&s.push("--value",B.parse(e.value)),e.from&&s.push("--from",I.parse(e.from)),e.blockNumber!==void 0&&s.push("--block",String(e.blockNumber));let a=await this.execGt(s);if(!a.success||!a.data)throw new h(a.error??"Transaction simulation failed","EXECUTION_FAILED","gt",s);return this.parseGtOutput(a.data)}async decode(e,t){this.ensureInitialized();let i=["decode",B.parse(e),"--json"];if(t){let a=B.parse(t);i.push("--abi",a);}let s=await this.execGt(i);if(!s.success||!s.data)throw new h(s.error??"Failed to decode transaction data","EXECUTION_FAILED","gt",i);return this.parseGtOutput(s.data)}validateAndSanitizeArgs(e){return e.map((t,r)=>{try{return Q.parse(t)}catch(i){throw new h(`Invalid argument at index ${r}: ${t}`,"VALIDATION_ERROR","gt",e,i)}})}ensureInitialized(){if(!this.initialized)throw new h("Gas Town bridge not initialized. Call initialize() first.","EXECUTION_FAILED")}isInitialized(){return this.initialized}getConfig(){return {...this.config}}getCacheStats(){return {resultCache:N.stats(),staticCache:R.stats(),parsedCache:C.stats()}}clearCaches(){N.clear(),R.clear(),C.clear();}};function oe(n,e){return new z(n,e)}var ue=promisify(execFile),L=new f({maxEntries:100,ttlMs:30*1e3}),T=new f({maxEntries:500,ttlMs:60*1e3}),P=new f({maxEntries:50,ttlMs:300*1e3}),ge=new b,A=new f({maxEntries:100,ttlMs:30*1e3});function J(n){let e=2166136261;for(let t of n){for(let r=0;r<t.length;r++)e^=t.charCodeAt(r),e=e*16777619>>>0;e^=255;}return e.toString(36)}var w=z$1.string().max(4096,"String too long").refine(n=>!/[;&|`$(){}><\n\r\0]/.test(n),"String contains shell metacharacters");z$1.string().min(1,"Identifier cannot be empty").max(128,"Identifier too long").regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/,"Invalid identifier format");var x=z$1.string().min(1,"Bead ID cannot be empty").max(64,"Bead ID too long").regex(/^[a-zA-Z0-9_-]+$/,"Invalid bead ID format"),H=z$1.enum(["prompt","response","code","context","memory","tool-call","tool-result","system","error","metadata"]),_=z$1.object({id:x,type:H,content:z$1.string(),timestamp:z$1.string().datetime().optional(),metadata:z$1.record(z$1.unknown()).optional(),parentId:x.optional(),threadId:z$1.string().optional(),agentId:z$1.string().optional(),tags:z$1.array(z$1.string()).optional(),embedding:z$1.array(z$1.number()).optional(),hash:z$1.string().optional()}),Z=z$1.string().max(1024,"Argument too long").refine(n=>!n.includes("\0"),"Argument contains null byte").refine(n=>!/[;&|`$(){}><]/.test(n),"Argument contains shell metacharacters"),g=class extends Error{constructor(t,r,i,s,a){super(t);this.code=r;this.command=i;this.args=s;this.cause=a;this.name="BdBridgeError";}},he={debug:(n,e)=>console.debug(`[bd-bridge] ${n}`,e??""),info:(n,e)=>console.info(`[bd-bridge] ${n}`,e??""),warn:(n,e)=>console.warn(`[bd-bridge] ${n}`,e??""),error:(n,e)=>console.error(`[bd-bridge] ${n}`,e??"")},X=new Set(["list","get","create","update","delete","search","export","import","thread","stats","help","version","config","sync"]),O=class n{config;logger;initialized=false;static CACHEABLE_COMMANDS=new Set(["list","get","search","stats","version","help","config"]);static STATIC_COMMANDS=new Set(["version","help","stats","config"]);constructor(e,t){this.config={bdPath:e?.bdPath??"bd",cwd:e?.cwd??process.cwd(),timeout:e?.timeout??6e4,maxBuffer:e?.maxBuffer??50*1024*1024,env:e?.env??process.env,storagePath:e?.storagePath??""},this.logger=t??he;}async initialize(){try{let e=await this.execBd(["version"]);if(!e.success)throw new g("Failed to verify bd installation","COMMAND_NOT_FOUND","bd",["version"]);this.initialized=!0,this.logger.info("Beads bridge initialized",{bdPath:this.config.bdPath,version:e.data});}catch(e){throw e instanceof g?e:new g("Failed to initialize Beads bridge","COMMAND_NOT_FOUND","bd",["version"],e)}}async execBd(e,t=false){let r=Date.now(),i=this.validateAndSanitizeArgs(e),s=i[0];if(s&&!X.has(s))throw new g(`Command not allowed: ${s}`,"INVALID_ARGUMENT","bd",i);let a=J(i),d=!t&&s&&n.CACHEABLE_COMMANDS.has(s);s&&n.STATIC_COMMANDS.has(s);if(d){let l=P.get(a);if(l)return this.logger.debug("Cache hit for bd command",{command:s}),{...l,durationMs:0}}return ge.dedupe(a,async()=>{try{this.logger.debug("Executing bd command",{command:"bd",args:i});let{stdout:l,stderr:u}=await ue(this.config.bdPath,i,{cwd:this.config.cwd,env:this.config.env,timeout:this.config.timeout,maxBuffer:this.config.maxBuffer,shell:!1,windowsHide:!0}),c=Date.now()-r;u&&u.trim()&&this.logger.warn("bd stderr output",{stderr:u});let p={success:!0,data:l.trim(),command:"bd",args:i,durationMs:c};return d&&p.success&&P.set(a,p),p}catch(l){let u=Date.now()-r,c=l;if(c.killed)throw new g("Command execution timed out","TIMEOUT","bd",i);if(c.code==="ENOENT")throw new g(`bd executable not found at: ${this.config.bdPath}`,"COMMAND_NOT_FOUND","bd",i);return {success:false,error:c.stderr||c.message,command:"bd",args:i,durationMs:u}}})}execBdStreaming(e){let t=Date.now(),r=this.validateAndSanitizeArgs(e),i=r[0];if(i&&!X.has(i))throw new g(`Command not allowed: ${i}`,"INVALID_ARGUMENT","bd",r);this.logger.debug("Executing bd command (streaming)",{command:"bd",args:r});let s=spawn(this.config.bdPath,r,{cwd:this.config.cwd,env:this.config.env,timeout:this.config.timeout,shell:false,windowsHide:true}),a=new Promise((d,o)=>{let l="",u="";s.stdout?.on("data",c=>{l+=c.toString();}),s.stderr?.on("data",c=>{u+=c.toString();}),s.on("close",c=>{let p=Date.now()-t;d(c===0?{success:true,data:l.trim(),command:"bd",args:r,durationMs:p}:{success:false,error:u||`Process exited with code ${c}`,command:"bd",args:r,durationMs:p});}),s.on("error",c=>{o(new g(c.message,"EXECUTION_FAILED","bd",r));});});return {process:s,stdout:s.stdout,stderr:s.stderr,promise:a}}parseBdOutput(e){if(!e||e.trim()==="")return [];let t=J([e]),r=A.get(t);if(r)return r;let i=e.trim().split(`
|
|
11
11
|
`),s=[],a=[];for(let d=0;d<i.length;d++){let o=i[d]?.trim();if(o)try{let l=JSON.parse(o),u=_.parse(l);s.push(u),T.set(u.id,u);}catch(l){a.push({line:d+1,error:l instanceof Error?l.message:String(l)});}}return a.length>0&&this.logger.warn("Some beads failed to parse",{totalLines:i.length,parsed:s.length,errors:a.length,firstErrors:a.slice(0,3)}),A.set(t,s),s}parseSingleBead(e){if(!e||e.trim()==="")throw new g("Empty output from bd command","INVALID_OUTPUT");try{let t=JSON.parse(e);return _.parse(t)}catch(t){throw new g("Failed to parse bead output","PARSE_ERROR",void 0,void 0,t)}}async listBeads(e){this.ensureInitialized();let t=["list","--format","jsonl"];if(e?.type){let i=Array.isArray(e.type)?e.type:[e.type];for(let s of i)t.push("--type",s);}if(e?.threadId&&t.push("--thread",w.parse(e.threadId)),e?.agentId&&t.push("--agent",w.parse(e.agentId)),e?.tags&&e.tags.length>0)for(let i of e.tags)t.push("--tag",w.parse(i));e?.after&&t.push("--after",e.after),e?.before&&t.push("--before",e.before),e?.limit!==void 0&&t.push("--limit",String(Math.min(e.limit,1e4))),e?.offset!==void 0&&t.push("--offset",String(e.offset)),e?.sortBy&&t.push("--sort",e.sortBy),e?.sortOrder&&t.push("--order",e.sortOrder);let r=await this.execBd(t);if(!r.success)throw new g(r.error??"Failed to list beads","EXECUTION_FAILED","bd",t);return this.parseBdOutput(r.data??"")}async getBead(e){this.ensureInitialized();let t=x.parse(e),r=T.get(t);if(r)return this.logger.debug("Bead cache hit",{beadId:t}),r;let i=["get",t,"--format","json"],s=await this.execBd(i);if(!s.success)throw s.error?.includes("not found")?new g(`Bead not found: ${e}`,"BEAD_NOT_FOUND","bd",i):new g(s.error??"Failed to get bead","EXECUTION_FAILED","bd",i);let a=this.parseSingleBead(s.data??"");return T.set(a.id,a),a}async createBead(e){this.ensureInitialized();let t=["create","--type",e.type,"--content",w.parse(e.content),"--format","json"];if(e.parentId&&t.push("--parent",x.parse(e.parentId)),e.threadId&&t.push("--thread",w.parse(e.threadId)),e.agentId&&t.push("--agent",w.parse(e.agentId)),e.tags&&e.tags.length>0)for(let i of e.tags)t.push("--tag",w.parse(i));e.metadata&&t.push("--metadata",JSON.stringify(e.metadata));let r=await this.execBd(t);if(!r.success)throw new g(r.error??"Failed to create bead","EXECUTION_FAILED","bd",t);return this.parseSingleBead(r.data??"")}async searchBeads(e,t){this.ensureInitialized();let r=["search",w.parse(e),"--format","jsonl"];if(t?.limit!==void 0&&r.push("--limit",String(Math.min(t.limit,1e3))),t?.threshold!==void 0&&r.push("--threshold",String(t.threshold)),t?.type){let s=Array.isArray(t.type)?t.type:[t.type];for(let a of s)r.push("--type",a);}let i=await this.execBd(r);if(!i.success)throw new g(i.error??"Bead search failed","EXECUTION_FAILED","bd",r);return this.parseBdOutput(i.data??"")}async exportBeads(e){this.ensureInitialized();let t=["export","--format","jsonl"];e?.threadId&&t.push("--thread",w.parse(e.threadId)),e?.after&&t.push("--after",e.after),e?.before&&t.push("--before",e.before);let r=await this.execBd(t);if(!r.success)throw new g(r.error??"Export failed","EXECUTION_FAILED","bd",t);return r.data??""}async getStats(){this.ensureInitialized();let e=["stats","--format","json"],t=await this.execBd(e);if(!t.success)throw new g(t.error??"Failed to get stats","EXECUTION_FAILED","bd",e);try{return JSON.parse(t.data??"{}")}catch{throw new g("Failed to parse stats output","PARSE_ERROR","bd",e)}}validateAndSanitizeArgs(e){return e.map((t,r)=>{try{return Z.parse(t)}catch(i){throw new g(`Invalid argument at index ${r}: ${t}`,"VALIDATION_ERROR","bd",e,i)}})}ensureInitialized(){if(!this.initialized)throw new g("Beads bridge not initialized. Call initialize() first.","EXECUTION_FAILED")}isInitialized(){return this.initialized}getConfig(){return {...this.config}}getCacheStats(){return {beadQueryCache:L.stats(),singleBeadCache:T.stats(),staticCache:P.stats(),parsedCache:A.stats()}}clearCaches(){L.clear(),T.clear(),P.clear(),A.clear();}invalidateBeadCache(e){T.delete(e),L.clear(),A.clear();}};function U(n,e){return new O(n,e)}var E=new f({maxEntries:500,ttlMs:30*1e3}),M=new f({maxEntries:200,ttlMs:10*1e3});function G(n){let e=2166136261;for(let t of n){for(let r=0;r<t.length;r++)e^=t.charCodeAt(r),e=e*16777619>>>0;e^=255;}return e.toString(36)}var me=z$1.enum(["beads-wins","agentdb-wins","newest-wins","merge","manual"]),fe=z$1.enum(["to-agentdb","from-agentdb","bidirectional"]),pe=z$1.enum(["pending","in-progress","completed","failed","conflict"]),ye=z$1.object({key:z$1.string(),value:z$1.unknown(),namespace:z$1.string().optional(),metadata:z$1.record(z$1.unknown()).optional(),embedding:z$1.array(z$1.number()).optional(),createdAt:z$1.string().datetime().optional(),updatedAt:z$1.string().datetime().optional(),version:z$1.number().optional()}),v=class extends Error{constructor(t,r,i,s){super(t);this.code=r;this.details=i;this.cause=s;this.name="SyncBridgeError";}},we={debug:(n,e)=>console.debug(`[sync-bridge] ${n}`,e??""),info:(n,e)=>console.info(`[sync-bridge] ${n}`,e??""),warn:(n,e)=>console.warn(`[sync-bridge] ${n}`,e??""),error:(n,e)=>console.error(`[sync-bridge] ${n}`,e??"")},k=class{bdBridge;agentDB;config;logger;initialized=false;syncState;conflicts=new Map;constructor(e,t,r){this.agentDB=e,this.config={beadsBridge:t?.beadsBridge??{},agentdbNamespace:t?.agentdbNamespace??"beads",conflictStrategy:t?.conflictStrategy??"newest-wins",batchSize:t?.batchSize??100,preserveEmbeddings:t?.preserveEmbeddings??true,syncMetadata:t?.syncMetadata??true},this.logger=r??we,this.bdBridge=U(this.config.beadsBridge,{debug:(i,s)=>this.logger.debug(`[bd] ${i}`,s),info:(i,s)=>this.logger.info(`[bd] ${i}`,s),warn:(i,s)=>this.logger.warn(`[bd] ${i}`,s),error:(i,s)=>this.logger.error(`[bd] ${i}`,s)}),this.syncState={lastSyncTime:new Date(0).toISOString(),pendingConflicts:[],version:1};}async initialize(){try{await this.bdBridge.initialize();let e=await this.agentDB.retrieve("_sync_state",this.config.agentdbNamespace);if(e?.value){let t=e.value;this.syncState={lastSyncTime:t.lastSyncTime??new Date(0).toISOString(),lastBeadId:t.lastBeadId,lastAgentDBKey:t.lastAgentDBKey,pendingConflicts:t.pendingConflicts??[],version:(t.version??0)+1};}this.initialized=!0,this.logger.info("Sync bridge initialized",{namespace:this.config.agentdbNamespace,conflictStrategy:this.config.conflictStrategy,syncState:this.syncState});}catch(e){throw new v("Failed to initialize sync bridge","NOT_INITIALIZED",void 0,e)}}async syncToAgentDB(e){this.ensureInitialized();let t=Date.now(),r={success:true,direction:"to-agentdb",synced:0,created:0,updated:0,deleted:0,conflicts:0,errors:[],durationMs:0,timestamp:new Date().toISOString()};this.logger.info(`Starting sync to AgentDB: ${e.length} beads`);for(let i=0;i<e.length;i+=this.config.batchSize){let a=e.slice(i,i+this.config.batchSize).map(async o=>{let l=this.beadToKey(o),u=G([l,this.config.agentdbNamespace]);if(E.has(u))return {bead:o,key:l,existing:E.get(u)};let c=await this.agentDB.retrieve(l,this.config.agentdbNamespace);return E.set(u,c),{bead:o,key:l,existing:c}}),d=await Promise.all(a);for(let{bead:o,key:l,existing:u}of d)try{if(u){let p=G([o.id,o.content,u.key]),D=M.get(p);if(D===void 0&&(D=await this.detectConflict(o,u),M.set(p,D)),D&&!await this.resolveConflict(o,u)){r.conflicts++;continue}r.updated++;}else r.created++;await this.agentDB.store(l,this.beadToAgentDBValue(o),this.config.agentdbNamespace,this.buildMetadata(o));let c=G([l,this.config.agentdbNamespace]);E.delete(c),r.synced++;}catch(c){r.errors.push({id:o.id,error:c instanceof Error?c.message:String(c)}),this.logger.error(`Failed to sync bead ${o.id}`,{error:c});}}return this.syncState.lastSyncTime=r.timestamp,e.length>0&&(this.syncState.lastBeadId=e[e.length-1]?.id),await this.saveSyncState(),r.durationMs=Date.now()-t,r.success=r.errors.length===0&&r.conflicts===0,this.logger.info("Sync to AgentDB complete",{synced:r.synced,created:r.created,updated:r.updated,conflicts:r.conflicts,errors:r.errors.length,durationMs:r.durationMs}),r}async syncFromAgentDB(){this.ensureInitialized();let e=Date.now(),t=[];this.logger.info("Starting sync from AgentDB");try{let r=0,i=!0;for(;i;){let a=await this.agentDB.list(this.config.agentdbNamespace,this.config.batchSize,r);if(a.length===0){i=!1;continue}for(let d of a)if(d.key!=="_sync_state")try{let o=this.agentDBToBead(d);o&&t.push(o);}catch(o){this.logger.warn(`Failed to convert AgentDB entry to bead: ${d.key}`,{error:o instanceof Error?o.message:String(o)});}r+=a.length,i=a.length===this.config.batchSize;}this.syncState.lastSyncTime=new Date().toISOString(),await this.saveSyncState();let s=Date.now()-e;return this.logger.info("Sync from AgentDB complete",{beads:t.length,durationMs:s}),t}catch(r){throw new v("Failed to sync from AgentDB","SYNC_FAILED",void 0,r)}}async syncBidirectional(){this.ensureInitialized(),this.logger.info("Starting bidirectional sync");let e=await this.bdBridge.listBeads({after:this.syncState.lastSyncTime}),t=await this.syncToAgentDB(e),r=await this.syncFromAgentDB();return {toAgentDB:t,fromAgentDB:r}}getPendingConflicts(){return Array.from(this.conflicts.values()).filter(e=>e.resolution==="pending"||!e.resolution)}async resolveConflictManually(e,t,r){let i=this.conflicts.get(e);if(!i)throw new v(`No conflict found for bead: ${e}`,"VALIDATION_ERROR");let s=this.beadToKey(i.beadData);switch(t){case "beads":await this.agentDB.store(s,this.beadToAgentDBValue(i.beadData),this.config.agentdbNamespace,this.buildMetadata(i.beadData));break;case "agentdb":break;case "merged":if(!r)throw new v("Merged data required for merge resolution","VALIDATION_ERROR");let d={...i.beadData,...r};await this.agentDB.store(s,this.beadToAgentDBValue(d),this.config.agentdbNamespace,this.buildMetadata(d));break}i.resolution=t,i.resolvedAt=new Date().toISOString();let a=this.syncState.pendingConflicts.indexOf(e);a!==-1&&(this.syncState.pendingConflicts.splice(a,1),await this.saveSyncState()),this.logger.info(`Conflict resolved for bead ${e}`,{resolution:t});}getSyncState(){return {...this.syncState}}async getSyncStats(){return this.ensureInitialized(),{agentdbCount:(await this.agentDB.getNamespaceStats(this.config.agentdbNamespace)).count,lastSyncTime:this.syncState.lastSyncTime,pendingConflicts:this.syncState.pendingConflicts.length,syncVersion:this.syncState.version}}beadToKey(e){return `bead:${e.id}`}beadToAgentDBValue(e){let t={id:e.id,type:e.type,content:e.content,timestamp:e.timestamp,parentId:e.parentId,threadId:e.threadId,agentId:e.agentId,tags:e.tags,hash:e.hash};return this.config.preserveEmbeddings&&e.embedding&&(t.embedding=e.embedding),this.config.syncMetadata&&e.metadata&&(t.metadata=e.metadata),t}buildMetadata(e){return {beadType:e.type,threadId:e.threadId,agentId:e.agentId,syncedAt:new Date().toISOString(),syncVersion:this.syncState.version}}agentDBToBead(e){if(!e.value||typeof e.value!="object")return null;let t=e.value;return !t.id||!t.type||!t.content?null:{id:String(t.id),type:t.type,content:String(t.content),timestamp:t.timestamp,parentId:t.parentId,threadId:t.threadId,agentId:t.agentId,tags:t.tags,metadata:t.metadata,embedding:t.embedding,hash:t.hash}}async detectConflict(e,t){if(!t.value||typeof t.value!="object")return false;let r=t.value;if(r.content===e.content)return false;let i=e.timestamp?new Date(e.timestamp).getTime():0,s=t.updatedAt?new Date(t.updatedAt).getTime():0;return i>s?false:s>i&&r.content!==e.content}async resolveConflict(e,t){let r={beadId:e.id,beadData:e,agentdbData:t,conflictType:"update"};switch(this.config.conflictStrategy){case "beads-wins":return r.resolution="beads",this.conflicts.set(e.id,r),true;case "agentdb-wins":return r.resolution="agentdb",this.conflicts.set(e.id,r),false;case "newest-wins":{let i=e.timestamp?new Date(e.timestamp).getTime():0,s=t.updatedAt?new Date(t.updatedAt).getTime():0;return i>=s?(r.resolution="beads",this.conflicts.set(e.id,r),true):(r.resolution="agentdb",this.conflicts.set(e.id,r),false)}case "merge":{let i=t.value,s={...e,content:`${e.content}
|
|
12
12
|
---
|
|
13
|
-
${i.content}`,metadata:{...e.metadata,merged:true,mergedAt:new Date().toISOString()}};return r.beadData=s,r.resolution="merged",this.conflicts.set(e.id,r),true}case "manual":return r.resolution="pending",this.conflicts.set(e.id,r),this.syncState.pendingConflicts.push(e.id),false;default:return false}}async saveSyncState(){try{await this.agentDB.store("_sync_state",this.syncState,this.config.agentdbNamespace,{type:"sync-state"});}catch(e){this.logger.error("Failed to save sync state",{error:e instanceof Error?e.message:String(e)});}}ensureInitialized(){if(!this.initialized)throw new v("Sync bridge not initialized. Call initialize() first.","NOT_INITIALIZED")}isInitialized(){return this.initialized}getBeadsBridge(){return this.bdBridge}getCacheStats(){return {agentDBLookupCache:E.stats(),conflictCache:M.stats()}}clearCaches(){E.clear(),M.clear();}};function be(n,e,t){return new k(n,e,t)}export{ye as A,v as B,k as C,be as D,f as a,F as b,b as c,$ as d,V as e,B as f,te as g,re as h,ie as i,j,I as k,se as l,Q as m,h as n,z as o,oe as p,x as q,H as r,_ as s,Z as t,g as u,O as v,U as w,me as x,fe as y,pe as z};//# sourceMappingURL=chunk-
|
|
14
|
-
//# sourceMappingURL=chunk-
|
|
13
|
+
${i.content}`,metadata:{...e.metadata,merged:true,mergedAt:new Date().toISOString()}};return r.beadData=s,r.resolution="merged",this.conflicts.set(e.id,r),true}case "manual":return r.resolution="pending",this.conflicts.set(e.id,r),this.syncState.pendingConflicts.push(e.id),false;default:return false}}async saveSyncState(){try{await this.agentDB.store("_sync_state",this.syncState,this.config.agentdbNamespace,{type:"sync-state"});}catch(e){this.logger.error("Failed to save sync state",{error:e instanceof Error?e.message:String(e)});}}ensureInitialized(){if(!this.initialized)throw new v("Sync bridge not initialized. Call initialize() first.","NOT_INITIALIZED")}isInitialized(){return this.initialized}getBeadsBridge(){return this.bdBridge}getCacheStats(){return {agentDBLookupCache:E.stats(),conflictCache:M.stats()}}clearCaches(){E.clear(),M.clear();}};function be(n,e,t){return new k(n,e,t)}export{ye as A,v as B,k as C,be as D,f as a,F as b,b as c,$ as d,V as e,B as f,te as g,re as h,ie as i,j,I as k,se as l,Q as m,h as n,z as o,oe as p,x as q,H as r,_ as s,Z as t,g as u,O as v,U as w,me as x,fe as y,pe as z};//# sourceMappingURL=chunk-GTFAMI2F.js.map
|
|
14
|
+
//# sourceMappingURL=chunk-GTFAMI2F.js.map
|