@claude-flow/plugin-gastown-bridge 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/bd-bridge-C9wTbkhi.d.cts +318 -0
  2. package/dist/bd-bridge-C9wTbkhi.d.ts +318 -0
  3. package/dist/bridges.cjs +1 -1
  4. package/dist/bridges.d.cts +5 -604
  5. package/dist/bridges.d.ts +5 -604
  6. package/dist/bridges.js +1 -1
  7. package/dist/chunk-2KNTWGUX.js +12 -0
  8. package/dist/chunk-2KNTWGUX.js.map +1 -0
  9. package/dist/chunk-46PJFOMY.cjs +11 -0
  10. package/dist/chunk-46PJFOMY.cjs.map +1 -0
  11. package/dist/chunk-7UPWLRZX.js +11 -0
  12. package/dist/chunk-7UPWLRZX.js.map +1 -0
  13. package/dist/chunk-7VD5N6NG.cjs +11 -0
  14. package/dist/chunk-7VD5N6NG.cjs.map +1 -0
  15. package/dist/chunk-EBOVUTYL.js +12 -0
  16. package/dist/chunk-EBOVUTYL.js.map +1 -0
  17. package/dist/chunk-I2TLUPMJ.cjs +12 -0
  18. package/dist/chunk-I2TLUPMJ.cjs.map +1 -0
  19. package/dist/chunk-Q7MLH722.cjs +11 -0
  20. package/dist/chunk-Q7MLH722.cjs.map +1 -0
  21. package/dist/chunk-QFMFM7NE.cjs +13 -0
  22. package/dist/chunk-QFMFM7NE.cjs.map +1 -0
  23. package/dist/chunk-SUKPSMVK.cjs +12 -0
  24. package/dist/chunk-SUKPSMVK.cjs.map +1 -0
  25. package/dist/chunk-TGFYZY3C.js +11 -0
  26. package/dist/chunk-TGFYZY3C.js.map +1 -0
  27. package/dist/chunk-U74VYTRV.js +11 -0
  28. package/dist/chunk-U74VYTRV.js.map +1 -0
  29. package/dist/chunk-UJ56JMNG.js +13 -0
  30. package/dist/chunk-UJ56JMNG.js.map +1 -0
  31. package/dist/convoy.cjs +2 -0
  32. package/dist/convoy.cjs.map +1 -0
  33. package/dist/convoy.d.cts +6 -0
  34. package/dist/convoy.d.ts +6 -0
  35. package/dist/convoy.js +2 -0
  36. package/dist/convoy.js.map +1 -0
  37. package/dist/formula.cjs +2 -0
  38. package/dist/formula.cjs.map +1 -0
  39. package/dist/formula.d.cts +317 -0
  40. package/dist/formula.d.ts +317 -0
  41. package/dist/formula.js +2 -0
  42. package/dist/formula.js.map +1 -0
  43. package/dist/gt-bridge-B7hZz5vC.d.cts +291 -0
  44. package/dist/gt-bridge-B7hZz5vC.d.ts +291 -0
  45. package/dist/index-BzkAx4ho.d.ts +785 -0
  46. package/dist/index-CGJs8eMa.d.cts +785 -0
  47. package/dist/index.cjs +8 -9
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +13 -2237
  50. package/dist/index.d.ts +13 -2237
  51. package/dist/index.js +8 -9
  52. package/dist/index.js.map +1 -1
  53. package/dist/types-CMoOZXrm.d.cts +1146 -0
  54. package/dist/types-CMoOZXrm.d.ts +1146 -0
  55. package/dist/wasm-loader.js +1 -1
  56. package/package.json +16 -20
  57. package/dist/chunk-2QQ3FUZF.cjs +0 -14
  58. package/dist/chunk-2QQ3FUZF.cjs.map +0 -1
  59. package/dist/chunk-GKNIKJVQ.js +0 -14
  60. package/dist/chunk-GKNIKJVQ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/bd-bridge.ts"],"names":["execFileAsync","promisify","execFile","beadQueryCache","LRUCache","singleBeadCache","staticCache","execDedup","BatchDeduplicator","parsedCache","hashArgs","args","hash","arg","i","SafeStringSchema","z","val","BeadIdSchema","BeadTypeSchema","BeadSchema","BdArgumentSchema","BdBridgeError","message","code","command","cause","defaultLogger","msg","meta","ALLOWED_BD_COMMANDS","BdBridge","_BdBridge","config","logger","result","error","skipCache","startTime","validatedArgs","subcommand","cacheKey","isCacheable","cached","stdout","stderr","durationMs","err","childProcess","spawn","promise","resolve","reject","data","output","lines","beads","errors","line","parsed","validated","query","types","type","tag","beadId","validatedId","bead","params","options","index","createBdBridge"],"mappings":";;;;;;;;;AA2BA,IAAMA,CAAAA,CAAgBC,cAAAA,CAAUC,sBAAQ,CAAA,CAOlCC,CAAAA,CAAiB,IAAIC,mBAAAA,CAAyB,CAClD,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,EAAA,CAAK,GACd,CAAC,EAGKC,CAAAA,CAAkB,IAAID,mBAAAA,CAAuB,CACjD,UAAA,CAAY,GAAA,CACZ,KAAA,CAAO,EAAA,CAAK,GACd,CAAC,CAAA,CAGKE,CAAAA,CAAc,IAAIF,mBAAAA,CAA0B,CAChD,UAAA,CAAY,EAAA,CACZ,KAAA,CAAO,GAAA,CAAS,GAClB,CAAC,CAAA,CAGKG,CAAAA,CAAY,IAAIC,mBAAAA,CAGhBC,CAAAA,CAAc,IAAIL,mBAAAA,CAAyB,CAC/C,WAAY,GAAA,CACZ,KAAA,CAAO,EAAA,CAAK,GACd,CAAC,CAAA,CAKD,SAASM,CAAAA,CAASC,CAAAA,CAAwB,CACxC,IAAIC,CAAAA,CAAO,UAAA,CACX,IAAA,IAAWC,KAAOF,CAAAA,CAAM,CACtB,IAAA,IAASG,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAID,CAAAA,CAAI,MAAA,CAAQC,CAAAA,EAAAA,CAC9BF,CAAAA,EAAQC,CAAAA,CAAI,UAAA,CAAWC,CAAC,CAAA,CACxBF,EAAQA,CAAAA,CAAO,QAAA,GAAc,CAAA,CAE/BA,CAAAA,EAAQ,IACV,CACA,OAAOA,CAAAA,CAAK,QAAA,CAAS,EAAE,CACzB,CASA,IAAMG,CAAAA,CAAmBC,KAAAA,CAAE,MAAA,EAAO,CAC/B,GAAA,CAAI,IAAA,CAAM,iBAAiB,CAAA,CAC3B,MAAA,CACEC,CAAAA,EAAQ,CAAC,qBAAA,CAAsB,IAAA,CAAKA,CAAG,CAAA,CACxC,sCACF,CAAA,CAKuBD,KAAAA,CAAE,MAAA,EAAO,CAC/B,GAAA,CAAI,CAAA,CAAG,4BAA4B,CAAA,CACnC,GAAA,CAAI,GAAA,CAAK,qBAAqB,CAAA,CAC9B,KAAA,CAAM,0BAAA,CAA4B,2BAA2B,MAK1DE,CAAAA,CAAeF,KAAAA,CAAE,MAAA,EAAO,CAC3B,GAAA,CAAI,CAAA,CAAG,yBAAyB,CAAA,CAChC,GAAA,CAAI,EAAA,CAAI,kBAAkB,CAAA,CAC1B,KAAA,CAAM,kBAAA,CAAoB,wBAAwB,CAAA,CAK/CG,CAAAA,CAAiBH,KAAAA,CAAE,IAAA,CAAK,CAC5B,QAAA,CACA,UAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,CACA,WAAA,CACA,aAAA,CACA,QAAA,CACA,OAAA,CACA,UACF,CAAC,CAAA,CAKYI,CAAAA,CAAaJ,KAAAA,CAAE,MAAA,CAAO,CACjC,EAAA,CAAIE,CAAAA,CACJ,IAAA,CAAMC,CAAAA,CACN,OAAA,CAASH,KAAAA,CAAE,MAAA,EAAO,CAClB,UAAWA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAC1C,QAAA,CAAUA,KAAAA,CAAE,MAAA,CAAOA,KAAAA,CAAE,OAAA,EAAS,CAAA,CAAE,UAAS,CACzC,QAAA,CAAUE,CAAAA,CAAa,QAAA,EAAS,CAChC,QAAA,CAAUF,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAC9B,OAAA,CAASA,KAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAC7B,IAAA,CAAMA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CACnC,SAAA,CAAWA,KAAAA,CAAE,KAAA,CAAMA,KAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CACxC,IAAA,CAAMA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EACnB,CAAC,CAAA,CAKKK,CAAAA,CAAmBL,KAAAA,CAAE,QAAO,CAC/B,GAAA,CAAI,IAAA,CAAM,mBAAmB,CAAA,CAC7B,MAAA,CACEC,CAAAA,EAAQ,CAACA,CAAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAC3B,6BACF,CAAA,CACC,OACEA,CAAAA,EAAQ,CAAC,eAAA,CAAgB,IAAA,CAAKA,CAAG,CAAA,CAClC,wCACF,CAAA,CAuIWK,CAAAA,CAAN,cAA4B,KAAM,CACvC,WAAA,CACEC,CAAAA,CACgBC,EACAC,CAAAA,CACAd,CAAAA,CACAe,CAAAA,CAChB,CACA,KAAA,CAAMH,CAAO,CAAA,CALG,IAAA,CAAA,IAAA,CAAAC,CAAAA,CACA,IAAA,CAAA,OAAA,CAAAC,CAAAA,CACA,IAAA,CAAA,IAAA,CAAAd,CAAAA,CACA,IAAA,CAAA,KAAA,CAAAe,EAGhB,IAAA,CAAK,IAAA,CAAO,gBACd,CAPkB,IAAA,CACA,OAAA,CACA,IAAA,CACA,KAKpB,CAAA,CAMMC,CAAAA,CAA0B,CAC9B,KAAA,CAAO,CAACC,CAAAA,CAAKC,IAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAeD,CAAG,CAAA,CAAA,CAAIC,CAAAA,EAAQ,EAAE,CAAA,CACpE,IAAA,CAAM,CAACD,CAAAA,CAAKC,CAAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,eAAeD,CAAG,CAAA,CAAA,CAAIC,CAAAA,EAAQ,EAAE,CAAA,CAClE,IAAA,CAAM,CAACD,CAAAA,CAAKC,CAAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,CAAA,YAAA,EAAeD,CAAG,CAAA,CAAA,CAAIC,GAAQ,EAAE,CAAA,CAClE,KAAA,CAAO,CAACD,CAAAA,CAAKC,CAAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAeD,CAAG,CAAA,CAAA,CAAIC,CAAAA,EAAQ,EAAE,CACtE,CAAA,CASMC,CAAAA,CAAsB,IAAI,GAAA,CAAI,CAClC,MAAA,CACA,KAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,QAAA,CACA,OAAA,CACA,MAAA,CACA,UACA,QAAA,CACA,MACF,CAAC,CAAA,CAoBYC,CAAAA,CAAN,MAAMC,CAAS,CACZ,MAAA,CACA,MAAA,CACA,WAAA,CAAc,KAAA,CAGtB,OAAwB,kBAAA,CAAqB,IAAI,GAAA,CAAI,CACnD,MAAA,CACA,KAAA,CACA,QAAA,CACA,OAAA,CACA,SAAA,CACA,MAAA,CACA,QACF,CAAC,CAAA,CAGD,OAAwB,eAAA,CAAkB,IAAI,IAAI,CAChD,SAAA,CACA,MAAA,CACA,OAAA,CACA,QACF,CAAC,CAAA,CAED,WAAA,CAAYC,CAAAA,CAAyBC,CAAAA,CAAmB,CACtD,IAAA,CAAK,MAAA,CAAS,CACZ,MAAA,CAAQD,CAAAA,EAAQ,MAAA,EAAU,IAAA,CAC1B,GAAA,CAAKA,CAAAA,EAAQ,GAAA,EAAO,OAAA,CAAQ,GAAA,EAAI,CAChC,OAAA,CAASA,CAAAA,EAAQ,OAAA,EAAW,GAAA,CAC5B,SAAA,CAAWA,CAAAA,EAAQ,WAAa,EAAA,CAAK,IAAA,CAAO,IAAA,CAC5C,GAAA,CAAKA,CAAAA,EAAQ,GAAA,EAAO,OAAA,CAAQ,GAAA,CAC5B,WAAA,CAAaA,CAAAA,EAAQ,WAAA,EAAe,EACtC,CAAA,CACA,IAAA,CAAK,OAASC,CAAAA,EAAUP,EAC1B,CAKA,MAAM,UAAA,EAA4B,CAChC,GAAI,CACF,IAAMQ,CAAAA,CAAS,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,SAAS,CAAC,CAAA,CAC5C,GAAI,CAACA,CAAAA,CAAO,OAAA,CACV,MAAM,IAAIb,CAAAA,CACR,kCAAA,CACA,mBAAA,CACA,IAAA,CACA,CAAC,SAAS,CACZ,CAAA,CAEF,IAAA,CAAK,WAAA,CAAc,CAAA,CAAA,CACnB,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,0BAAA,CAA4B,CAC3C,MAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CACpB,OAAA,CAASa,CAAAA,CAAO,IAClB,CAAC,EACH,CAAA,MAASC,CAAAA,CAAO,CACd,MAAIA,CAAAA,YAAiBd,CAAAA,CAAqBc,CAAAA,CACpC,IAAId,CAAAA,CACR,mCAAA,CACA,mBAAA,CACA,IAAA,CACA,CAAC,SAAS,CAAA,CACVc,CACF,CACF,CACF,CAQA,MAAM,MAAA,CAAOzB,CAAAA,CAAgB0B,CAAAA,CAAY,KAAA,CAAkC,CACzE,IAAMC,CAAAA,CAAY,KAAK,GAAA,EAAI,CAGrBC,CAAAA,CAAgB,IAAA,CAAK,uBAAA,CAAwB5B,CAAI,CAAA,CAGjD6B,CAAAA,CAAaD,CAAAA,CAAc,CAAC,CAAA,CAClC,GAAIC,CAAAA,EAAc,CAACV,EAAoB,GAAA,CAAIU,CAAU,CAAA,CACnD,MAAM,IAAIlB,CAAAA,CACR,CAAA,qBAAA,EAAwBkB,CAAU,CAAA,CAAA,CAClC,kBAAA,CACA,IAAA,CACAD,CACF,CAAA,CAIF,IAAME,EAAW/B,CAAAA,CAAS6B,CAAa,CAAA,CACjCG,CAAAA,CAAc,CAACL,CAAAA,EAAaG,CAAAA,EAAcR,CAAAA,CAAS,kBAAA,CAAmB,GAAA,CAAIQ,CAAU,CAAA,CACzEA,CAAAA,EAAcR,EAAS,eAAA,CAAgB,GAAA,CAAIQ,CAAU,EAEtE,GAAIE,CAAAA,CAAa,CACf,IAAMC,CAAAA,CAASrC,CAAAA,CAAY,GAAA,CAAImC,CAAQ,CAAA,CACvC,GAAIE,EACF,OAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,0BAAA,CAA4B,CAAE,OAAA,CAASH,CAAW,CAAC,CAAA,CAC9D,CACL,GAAGG,CAAAA,CACH,UAAA,CAAY,CACd,CAEJ,CAGA,OAAOpC,CAAAA,CAAU,MAAA,CAAOkC,CAAAA,CAAU,SAAY,CAC5C,GAAI,CACF,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,sBAAA,CAAwB,CACxC,OAAA,CAAS,KACT,IAAA,CAAMF,CACR,CAAC,CAAA,CAED,GAAM,CAAE,MAAA,CAAAK,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAI,MAAM7C,CAAAA,CAC/B,IAAA,CAAK,OAAO,MAAA,CACZuC,CAAAA,CACA,CACE,GAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CACjB,GAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CACjB,OAAA,CAAS,IAAA,CAAK,MAAA,CAAO,QACrB,SAAA,CAAW,IAAA,CAAK,MAAA,CAAO,SAAA,CACvB,KAAA,CAAO,CAAA,CAAA,CACP,WAAA,CAAa,CAAA,CACf,CACF,CAAA,CAEMO,CAAAA,CAAa,IAAA,CAAK,GAAA,EAAI,CAAIR,CAAAA,CAE5BO,CAAAA,EAAUA,CAAAA,CAAO,IAAA,EAAK,EACxB,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,kBAAA,CAAoB,CAAE,MAAA,CAAAA,CAAO,CAAC,CAAA,CAGjD,IAAMV,CAAAA,CAA2B,CAC/B,OAAA,CAAS,CAAA,CAAA,CACT,IAAA,CAAMS,CAAAA,CAAO,IAAA,EAAK,CAClB,OAAA,CAAS,IAAA,CACT,IAAA,CAAML,CAAAA,CACN,UAAA,CAAAO,CACF,CAAA,CAGA,OAAIJ,GAAeP,CAAAA,CAAO,OAAA,EACxB7B,CAAAA,CAAY,GAAA,CAAImC,CAAAA,CAAUN,CAAM,CAAA,CAG3BA,CACT,CAAA,MAASC,CAAAA,CAAgB,CACvB,IAAMU,CAAAA,CAAa,IAAA,CAAK,KAAI,CAAIR,CAAAA,CAC1BS,CAAAA,CAAMX,CAAAA,CAMZ,GAAIW,CAAAA,CAAI,MAAA,CACN,MAAM,IAAIzB,CAAAA,CACR,6BAAA,CACA,SAAA,CACA,IAAA,CACAiB,CACF,CAAA,CAGF,GAAIQ,CAAAA,CAAI,IAAA,GAAS,QAAA,CACf,MAAM,IAAIzB,CAAAA,CACR,CAAA,4BAAA,EAA+B,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CACjD,mBAAA,CACA,IAAA,CACAiB,CACF,EAGF,OAAO,CACL,OAAA,CAAS,KAAA,CACT,KAAA,CAAOQ,CAAAA,CAAI,MAAA,EAAUA,CAAAA,CAAI,OAAA,CACzB,OAAA,CAAS,IAAA,CACT,IAAA,CAAMR,CAAAA,CACN,UAAA,CAAAO,CACF,CACF,CACF,CAAC,CACH,CAKA,eAAA,CAAgBnC,CAAAA,CAAgC,CAC9C,IAAM2B,CAAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAGrBC,CAAAA,CAAgB,KAAK,uBAAA,CAAwB5B,CAAI,CAAA,CAGjD6B,CAAAA,CAAaD,CAAAA,CAAc,CAAC,CAAA,CAClC,GAAIC,CAAAA,EAAc,CAACV,CAAAA,CAAoB,GAAA,CAAIU,CAAU,CAAA,CACnD,MAAM,IAAIlB,CAAAA,CACR,CAAA,qBAAA,EAAwBkB,CAAU,CAAA,CAAA,CAClC,kBAAA,CACA,IAAA,CACAD,CACF,CAAA,CAGF,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,kCAAA,CAAoC,CACpD,QAAS,IAAA,CACT,IAAA,CAAMA,CACR,CAAC,CAAA,CAED,IAAMS,CAAAA,CAAeC,mBAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAQV,CAAAA,CAAe,CAC5D,GAAA,CAAK,KAAK,MAAA,CAAO,GAAA,CACjB,GAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CACjB,OAAA,CAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CACrB,KAAA,CAAO,KAAA,CACP,WAAA,CAAa,IACf,CAAC,CAAA,CAEKW,CAAAA,CAAU,IAAI,OAAA,CAA0B,CAACC,CAAAA,CAASC,CAAAA,GAAW,CACjE,IAAIR,CAAAA,CAAS,EAAA,CACTC,CAAAA,CAAS,EAAA,CAEbG,CAAAA,CAAa,MAAA,EAAQ,EAAA,CAAG,MAAA,CAASK,CAAAA,EAAiB,CAChDT,CAAAA,EAAUS,CAAAA,CAAK,QAAA,GACjB,CAAC,CAAA,CAEDL,CAAAA,CAAa,MAAA,EAAQ,EAAA,CAAG,MAAA,CAASK,CAAAA,EAAiB,CAChDR,CAAAA,EAAUQ,CAAAA,CAAK,QAAA,GACjB,CAAC,CAAA,CAEDL,CAAAA,CAAa,EAAA,CAAG,OAAA,CAAUxB,CAAAA,EAAS,CACjC,IAAMsB,CAAAA,CAAa,IAAA,CAAK,KAAI,CAAIR,CAAAA,CAE9Ba,CAAAA,CADE3B,CAAAA,GAAS,CAAA,CACH,CACN,OAAA,CAAS,IAAA,CACT,IAAA,CAAMoB,CAAAA,CAAO,IAAA,EAAK,CAClB,OAAA,CAAS,IAAA,CACT,KAAML,CAAAA,CACN,UAAA,CAAAO,CACF,CAAA,CAEQ,CACN,OAAA,CAAS,KAAA,CACT,KAAA,CAAOD,CAAAA,EAAU,CAAA,yBAAA,EAA4BrB,CAAI,CAAA,CAAA,CACjD,OAAA,CAAS,IAAA,CACT,IAAA,CAAMe,CAAAA,CACN,UAAA,CAAAO,CACF,CARC,EAUL,CAAC,CAAA,CAEDE,CAAAA,CAAa,EAAA,CAAG,OAAA,CAAUZ,CAAAA,EAAU,CAClCgB,CAAAA,CAAO,IAAI9B,CAAAA,CACTc,EAAM,OAAA,CACN,kBAAA,CACA,IAAA,CACAG,CACF,CAAC,EACH,CAAC,EACH,CAAC,CAAA,CAED,OAAO,CACL,OAAA,CAASS,CAAAA,CACT,OAAQA,CAAAA,CAAa,MAAA,CACrB,MAAA,CAAQA,CAAAA,CAAa,MAAA,CACrB,OAAA,CAAAE,CACF,CACF,CAQA,aAAA,CAAcI,CAAAA,CAAwB,CACpC,GAAI,CAACA,GAAUA,CAAAA,CAAO,IAAA,EAAK,GAAM,EAAA,CAC/B,OAAO,EAAC,CAIV,IAAMb,CAAAA,CAAW/B,CAAAA,CAAS,CAAC4C,CAAM,CAAC,CAAA,CAC5BX,CAAAA,CAASlC,CAAAA,CAAY,GAAA,CAAIgC,CAAQ,CAAA,CACvC,GAAIE,CAAAA,CACF,OAAOA,CAAAA,CAGT,IAAMY,CAAAA,CAAQD,CAAAA,CAAO,IAAA,EAAK,CAAE,KAAA,CAAM;AAAA,CAAI,CAAA,CAChCE,EAAgB,EAAC,CACjBC,EAAiD,EAAC,CAExD,IAAA,IAAS3C,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIyC,EAAM,MAAA,CAAQzC,CAAAA,EAAAA,CAAK,CACrC,IAAM4C,CAAAA,CAAOH,CAAAA,CAAMzC,CAAC,CAAA,EAAG,IAAA,EAAK,CAC5B,GAAK4C,CAAAA,CAEL,GAAI,CACF,IAAMC,CAAAA,CAAS,KAAK,KAAA,CAAMD,CAAI,EACxBE,CAAAA,CAAYxC,CAAAA,CAAW,KAAA,CAAMuC,CAAM,CAAA,CACzCH,CAAAA,CAAM,KAAKI,CAAS,CAAA,CAGpBvD,CAAAA,CAAgB,GAAA,CAAIuD,CAAAA,CAAU,EAAA,CAAIA,CAAS,EAC7C,CAAA,MAASxB,CAAAA,CAAO,CACdqB,CAAAA,CAAO,IAAA,CAAK,CACV,IAAA,CAAM3C,CAAAA,CAAI,EACV,KAAA,CAAOsB,CAAAA,YAAiB,MAAQA,CAAAA,CAAM,OAAA,CAAU,MAAA,CAAOA,CAAK,CAC9D,CAAC,EACH,CACF,CAEA,OAAIqB,CAAAA,CAAO,MAAA,CAAS,CAAA,EAClB,KAAK,MAAA,CAAO,IAAA,CAAK,4BAAA,CAA8B,CAC7C,UAAA,CAAYF,CAAAA,CAAM,OAClB,MAAA,CAAQC,CAAAA,CAAM,OACd,MAAA,CAAQC,CAAAA,CAAO,OACf,WAAA,CAAaA,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAG,CAAC,CAChC,CAAC,CAAA,CAIHhD,CAAAA,CAAY,GAAA,CAAIgC,CAAAA,CAAUe,CAAK,CAAA,CAExBA,CACT,CAKA,eAAA,CAAgBF,CAAAA,CAAsB,CACpC,GAAI,CAACA,GAAUA,CAAAA,CAAO,IAAA,KAAW,EAAA,CAC/B,MAAM,IAAIhC,CAAAA,CACR,8BAAA,CACA,gBACF,CAAA,CAGF,GAAI,CACF,IAAMqC,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAML,CAAM,CAAA,CAChC,OAAOlC,EAAW,KAAA,CAAMuC,CAAM,CAChC,CAAA,MAASvB,CAAAA,CAAO,CACd,MAAM,IAAId,CAAAA,CACR,8BACA,aAAA,CACA,MAAA,CACA,OACAc,CACF,CACF,CACF,CAKA,MAAM,SAAA,CAAUyB,EAAoC,CAClD,IAAA,CAAK,iBAAA,EAAkB,CAEvB,IAAMlD,CAAAA,CAAO,CAAC,MAAA,CAAQ,UAAA,CAAY,OAAO,CAAA,CAEzC,GAAIkD,CAAAA,EAAO,KAAM,CACf,IAAMC,EAAQ,KAAA,CAAM,OAAA,CAAQD,EAAM,IAAI,CAAA,CAAIA,CAAAA,CAAM,IAAA,CAAO,CAACA,CAAAA,CAAM,IAAI,CAAA,CAClE,IAAA,IAAWE,CAAAA,IAAQD,CAAAA,CACjBnD,CAAAA,CAAK,IAAA,CAAK,SAAUoD,CAAI,EAE5B,CAUA,GARIF,CAAAA,EAAO,QAAA,EACTlD,EAAK,IAAA,CAAK,UAAA,CAAYI,CAAAA,CAAiB,KAAA,CAAM8C,CAAAA,CAAM,QAAQ,CAAC,CAAA,CAG1DA,CAAAA,EAAO,OAAA,EACTlD,CAAAA,CAAK,IAAA,CAAK,SAAA,CAAWI,EAAiB,KAAA,CAAM8C,CAAAA,CAAM,OAAO,CAAC,CAAA,CAGxDA,CAAAA,EAAO,MAAQA,CAAAA,CAAM,IAAA,CAAK,MAAA,CAAS,CAAA,CACrC,IAAA,IAAWG,CAAAA,IAAOH,EAAM,IAAA,CACtBlD,CAAAA,CAAK,KAAK,OAAA,CAASI,CAAAA,CAAiB,MAAMiD,CAAG,CAAC,CAAA,CAI9CH,CAAAA,EAAO,KAAA,EACTlD,CAAAA,CAAK,KAAK,SAAA,CAAWkD,CAAAA,CAAM,KAAK,CAAA,CAG9BA,CAAAA,EAAO,MAAA,EACTlD,EAAK,IAAA,CAAK,UAAA,CAAYkD,CAAAA,CAAM,MAAM,CAAA,CAGhCA,CAAAA,EAAO,QAAU,MAAA,EACnBlD,CAAAA,CAAK,KAAK,SAAA,CAAW,MAAA,CAAO,KAAK,GAAA,CAAIkD,CAAAA,CAAM,KAAA,CAAO,GAAK,CAAC,CAAC,EAGvDA,CAAAA,EAAO,MAAA,GAAW,MAAA,EACpBlD,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAY,OAAOkD,CAAAA,CAAM,MAAM,CAAC,CAAA,CAGxCA,CAAAA,EAAO,MAAA,EACTlD,EAAK,IAAA,CAAK,QAAA,CAAUkD,EAAM,MAAM,CAAA,CAG9BA,GAAO,SAAA,EACTlD,CAAAA,CAAK,IAAA,CAAK,SAAA,CAAWkD,CAAAA,CAAM,SAAS,EAGtC,IAAM1B,CAAAA,CAAS,MAAM,IAAA,CAAK,MAAA,CAAOxB,CAAI,EACrC,GAAI,CAACwB,CAAAA,CAAO,OAAA,CACV,MAAM,IAAIb,EACRa,CAAAA,CAAO,KAAA,EAAS,uBAChB,kBAAA,CACA,IAAA,CACAxB,CACF,CAAA,CAGF,OAAO,IAAA,CAAK,aAAA,CAAcwB,CAAAA,CAAO,IAAA,EAAQ,EAAE,CAC7C,CAKA,MAAM,OAAA,CAAQ8B,CAAAA,CAA+B,CAC3C,KAAK,iBAAA,EAAkB,CAEvB,IAAMC,CAAAA,CAAchD,CAAAA,CAAa,KAAA,CAAM+C,CAAM,CAAA,CAGvCtB,CAAAA,CAAStC,EAAgB,GAAA,CAAI6D,CAAW,EAC9C,GAAIvB,CAAAA,CACF,OAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,gBAAA,CAAkB,CAAE,MAAA,CAAQuB,CAAY,CAAC,CAAA,CACpDvB,CAAAA,CAGT,IAAMhC,EAAO,CAAC,KAAA,CAAOuD,CAAAA,CAAa,UAAA,CAAY,MAAM,CAAA,CAE9C/B,EAAS,MAAM,IAAA,CAAK,OAAOxB,CAAI,CAAA,CACrC,GAAI,CAACwB,CAAAA,CAAO,OAAA,CACV,MAAIA,CAAAA,CAAO,KAAA,EAAO,SAAS,WAAW,CAAA,CAC9B,IAAIb,CAAAA,CACR,CAAA,gBAAA,EAAmB2C,CAAM,GACzB,gBAAA,CACA,IAAA,CACAtD,CACF,CAAA,CAEI,IAAIW,CAAAA,CACRa,EAAO,KAAA,EAAS,oBAAA,CAChB,mBACA,IAAA,CACAxB,CACF,EAGF,IAAMwD,CAAAA,CAAO,IAAA,CAAK,eAAA,CAAgBhC,CAAAA,CAAO,IAAA,EAAQ,EAAE,CAAA,CAGnD,OAAA9B,CAAAA,CAAgB,GAAA,CAAI8D,CAAAA,CAAK,EAAA,CAAIA,CAAI,CAAA,CAE1BA,CACT,CAKA,MAAM,UAAA,CAAWC,CAAAA,CAAyC,CACxD,IAAA,CAAK,iBAAA,EAAkB,CAEvB,IAAMzD,CAAAA,CAAO,CACX,SACA,QAAA,CAAUyD,CAAAA,CAAO,IAAA,CACjB,WAAA,CAAarD,CAAAA,CAAiB,KAAA,CAAMqD,EAAO,OAAO,CAAA,CAClD,UAAA,CAAY,MACd,CAAA,CAcA,GAZIA,EAAO,QAAA,EACTzD,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAYO,CAAAA,CAAa,KAAA,CAAMkD,EAAO,QAAQ,CAAC,EAGvDA,CAAAA,CAAO,QAAA,EACTzD,EAAK,IAAA,CAAK,UAAA,CAAYI,CAAAA,CAAiB,KAAA,CAAMqD,CAAAA,CAAO,QAAQ,CAAC,CAAA,CAG3DA,CAAAA,CAAO,OAAA,EACTzD,CAAAA,CAAK,IAAA,CAAK,SAAA,CAAWI,EAAiB,KAAA,CAAMqD,CAAAA,CAAO,OAAO,CAAC,CAAA,CAGzDA,CAAAA,CAAO,MAAQA,CAAAA,CAAO,IAAA,CAAK,OAAS,CAAA,CACtC,IAAA,IAAWJ,KAAOI,CAAAA,CAAO,IAAA,CACvBzD,CAAAA,CAAK,IAAA,CAAK,OAAA,CAASI,CAAAA,CAAiB,MAAMiD,CAAG,CAAC,CAAA,CAI9CI,CAAAA,CAAO,QAAA,EACTzD,CAAAA,CAAK,KAAK,YAAA,CAAc,IAAA,CAAK,SAAA,CAAUyD,CAAAA,CAAO,QAAQ,CAAC,EAGzD,IAAMjC,CAAAA,CAAS,MAAM,IAAA,CAAK,MAAA,CAAOxB,CAAI,CAAA,CACrC,GAAI,CAACwB,CAAAA,CAAO,OAAA,CACV,MAAM,IAAIb,CAAAA,CACRa,CAAAA,CAAO,KAAA,EAAS,uBAAA,CAChB,kBAAA,CACA,IAAA,CACAxB,CACF,CAAA,CAGF,OAAO,IAAA,CAAK,eAAA,CAAgBwB,CAAAA,CAAO,IAAA,EAAQ,EAAE,CAC/C,CAKA,MAAM,WAAA,CAAY0B,CAAAA,CAAeQ,EAIb,CAClB,IAAA,CAAK,iBAAA,EAAkB,CAEvB,IAAM1D,CAAAA,CAAO,CACX,QAAA,CACAI,CAAAA,CAAiB,KAAA,CAAM8C,CAAK,CAAA,CAC5B,UAAA,CAAY,OACd,CAAA,CAUA,GARIQ,CAAAA,EAAS,KAAA,GAAU,MAAA,EACrB1D,CAAAA,CAAK,KAAK,SAAA,CAAW,MAAA,CAAO,KAAK,GAAA,CAAI0D,CAAAA,CAAQ,MAAO,GAAI,CAAC,CAAC,CAAA,CAGxDA,CAAAA,EAAS,SAAA,GAAc,QACzB1D,CAAAA,CAAK,IAAA,CAAK,aAAA,CAAe,MAAA,CAAO0D,CAAAA,CAAQ,SAAS,CAAC,CAAA,CAGhDA,CAAAA,EAAS,IAAA,CAAM,CACjB,IAAMP,CAAAA,CAAQ,MAAM,OAAA,CAAQO,CAAAA,CAAQ,IAAI,CAAA,CAAIA,CAAAA,CAAQ,KAAO,CAACA,CAAAA,CAAQ,IAAI,CAAA,CACxE,IAAA,IAAWN,CAAAA,IAAQD,EACjBnD,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAUoD,CAAI,EAE5B,CAEA,IAAM5B,CAAAA,CAAS,MAAM,IAAA,CAAK,MAAA,CAAOxB,CAAI,CAAA,CACrC,GAAI,CAACwB,CAAAA,CAAO,QACV,MAAM,IAAIb,EACRa,CAAAA,CAAO,KAAA,EAAS,oBAAA,CAChB,kBAAA,CACA,IAAA,CACAxB,CACF,EAGF,OAAO,IAAA,CAAK,aAAA,CAAcwB,CAAAA,CAAO,IAAA,EAAQ,EAAE,CAC7C,CAKA,MAAM,WAAA,CAAY0B,CAAAA,CAAoC,CACpD,IAAA,CAAK,mBAAkB,CAEvB,IAAMlD,CAAAA,CAAO,CAAC,QAAA,CAAU,UAAA,CAAY,OAAO,CAAA,CAEvCkD,CAAAA,EAAO,QAAA,EACTlD,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAYI,EAAiB,KAAA,CAAM8C,CAAAA,CAAM,QAAQ,CAAC,CAAA,CAG1DA,CAAAA,EAAO,OACTlD,CAAAA,CAAK,IAAA,CAAK,SAAA,CAAWkD,CAAAA,CAAM,KAAK,CAAA,CAG9BA,GAAO,MAAA,EACTlD,CAAAA,CAAK,KAAK,UAAA,CAAYkD,CAAAA,CAAM,MAAM,CAAA,CAGpC,IAAM1B,CAAAA,CAAS,MAAM,IAAA,CAAK,MAAA,CAAOxB,CAAI,CAAA,CACrC,GAAI,CAACwB,CAAAA,CAAO,OAAA,CACV,MAAM,IAAIb,CAAAA,CACRa,CAAAA,CAAO,KAAA,EAAS,eAAA,CAChB,kBAAA,CACA,IAAA,CACAxB,CACF,CAAA,CAGF,OAAOwB,EAAO,IAAA,EAAQ,EACxB,CAKA,MAAM,QAAA,EAOH,CACD,IAAA,CAAK,iBAAA,EAAkB,CAEvB,IAAMxB,CAAAA,CAAO,CAAC,OAAA,CAAS,UAAA,CAAY,MAAM,CAAA,CAEnCwB,EAAS,MAAM,IAAA,CAAK,MAAA,CAAOxB,CAAI,CAAA,CACrC,GAAI,CAACwB,CAAAA,CAAO,OAAA,CACV,MAAM,IAAIb,CAAAA,CACRa,EAAO,KAAA,EAAS,qBAAA,CAChB,kBAAA,CACA,IAAA,CACAxB,CACF,CAAA,CAGF,GAAI,CACF,OAAO,IAAA,CAAK,KAAA,CAAMwB,CAAAA,CAAO,IAAA,EAAQ,IAAI,CACvC,CAAA,KAAQ,CACN,MAAM,IAAIb,CAAAA,CACR,+BACA,aAAA,CACA,IAAA,CACAX,CACF,CACF,CACF,CAKQ,uBAAA,CAAwBA,CAAAA,CAA0B,CACxD,OAAOA,CAAAA,CAAK,GAAA,CAAI,CAACE,CAAAA,CAAKyD,CAAAA,GAAU,CAC9B,GAAI,CACF,OAAOjD,EAAiB,KAAA,CAAMR,CAAG,CACnC,CAAA,MAASuB,CAAAA,CAAO,CACd,MAAM,IAAId,CAAAA,CACR,6BAA6BgD,CAAK,CAAA,EAAA,EAAKzD,CAAG,CAAA,CAAA,CAC1C,kBAAA,CACA,IAAA,CACAF,CAAAA,CACAyB,CACF,CACF,CACF,CAAC,CACH,CAKQ,iBAAA,EAA0B,CAChC,GAAI,CAAC,IAAA,CAAK,WAAA,CACR,MAAM,IAAId,CAAAA,CACR,wDAAA,CACA,kBACF,CAEJ,CAKA,eAAyB,CACvB,OAAO,KAAK,WACd,CAKA,SAAA,EAAgD,CAC9C,OAAO,CAAE,GAAG,IAAA,CAAK,MAAO,CAC1B,CAKA,aAAA,EAKE,CACA,OAAO,CACL,cAAA,CAAgBnB,CAAAA,CAAe,KAAA,EAAM,CACrC,eAAA,CAAiBE,EAAgB,KAAA,EAAM,CACvC,YAAaC,CAAAA,CAAY,KAAA,GACzB,WAAA,CAAaG,CAAAA,CAAY,KAAA,EAC3B,CACF,CAKA,aAAoB,CAClBN,CAAAA,CAAe,KAAA,EAAM,CACrBE,CAAAA,CAAgB,KAAA,GAChBC,CAAAA,CAAY,KAAA,EAAM,CAClBG,CAAAA,CAAY,KAAA,GACd,CAKA,mBAAA,CAAoBwD,CAAAA,CAAsB,CACxC5D,CAAAA,CAAgB,MAAA,CAAO4D,CAAM,EAE7B9D,CAAAA,CAAe,KAAA,EAAM,CACrBM,CAAAA,CAAY,KAAA,GACd,CACF,EAKO,SAAS8D,CAAAA,CAAetC,CAAAA,CAAyBC,CAAAA,CAA6B,CACnF,OAAO,IAAIH,CAAAA,CAASE,CAAAA,CAAQC,CAAM,CACpC","file":"chunk-I2TLUPMJ.cjs","sourcesContent":["/**\n * Beads CLI Bridge\n *\n * Provides a secure wrapper around the `bd` (Beads) CLI tool.\n * Implements command execution with proper input sanitization,\n * argument validation, JSONL parsing, and error handling.\n *\n * Security Features:\n * - All inputs validated with Zod schemas\n * - No shell execution (uses execFile)\n * - Command allowlist enforcement\n * - Argument sanitization\n * - JSONL streaming support\n *\n * @module v3/plugins/gastown-bridge/bridges/bd-bridge\n */\n\nimport { execFile, spawn, ChildProcess } from 'child_process';\nimport { promisify } from 'util';\nimport { z } from 'zod';\n\nimport {\n LRUCache,\n BatchDeduplicator,\n Lazy,\n} from '../cache.js';\n\nconst execFileAsync = promisify(execFile);\n\n// ============================================================================\n// Performance Caches\n// ============================================================================\n\n/** Result cache for memoizing bead queries */\nconst beadQueryCache = new LRUCache<string, Bead[]>({\n maxEntries: 100,\n ttlMs: 30 * 1000, // 30 sec TTL (beads may change)\n});\n\n/** Single bead cache */\nconst singleBeadCache = new LRUCache<string, Bead>({\n maxEntries: 500,\n ttlMs: 60 * 1000, // 1 min TTL\n});\n\n/** Static data cache (version, stats) */\nconst staticCache = new LRUCache<string, unknown>({\n maxEntries: 50,\n ttlMs: 5 * 60 * 1000, // 5 min TTL\n});\n\n/** Deduplicator for concurrent CLI calls */\nconst execDedup = new BatchDeduplicator<BdResult<string>>();\n\n/** Parsed JSONL cache */\nconst parsedCache = new LRUCache<string, Bead[]>({\n maxEntries: 100,\n ttlMs: 30 * 1000,\n});\n\n/**\n * FNV-1a hash for cache keys\n */\nfunction hashArgs(args: string[]): string {\n let hash = 2166136261;\n for (const arg of args) {\n for (let i = 0; i < arg.length; i++) {\n hash ^= arg.charCodeAt(i);\n hash = (hash * 16777619) >>> 0;\n }\n hash ^= 0xff; // separator\n }\n return hash.toString(36);\n}\n\n// ============================================================================\n// Zod Validation Schemas\n// ============================================================================\n\n/**\n * Safe string pattern - no shell metacharacters\n */\nconst SafeStringSchema = z.string()\n .max(4096, 'String too long')\n .refine(\n (val) => !/[;&|`$(){}><\\n\\r\\0]/.test(val),\n 'String contains shell metacharacters'\n );\n\n/**\n * Safe identifier pattern\n */\nconst IdentifierSchema = z.string()\n .min(1, 'Identifier cannot be empty')\n .max(128, 'Identifier too long')\n .regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/, 'Invalid identifier format');\n\n/**\n * Bead ID schema (UUID or custom format)\n */\nconst BeadIdSchema = z.string()\n .min(1, 'Bead ID cannot be empty')\n .max(64, 'Bead ID too long')\n .regex(/^[a-zA-Z0-9_-]+$/, 'Invalid bead ID format');\n\n/**\n * Bead type schema\n */\nconst BeadTypeSchema = z.enum([\n 'prompt',\n 'response',\n 'code',\n 'context',\n 'memory',\n 'tool-call',\n 'tool-result',\n 'system',\n 'error',\n 'metadata',\n]);\n\n/**\n * Bead schema\n */\nexport const BeadSchema = z.object({\n id: BeadIdSchema,\n type: BeadTypeSchema,\n content: z.string(),\n timestamp: z.string().datetime().optional(),\n metadata: z.record(z.unknown()).optional(),\n parentId: BeadIdSchema.optional(),\n threadId: z.string().optional(),\n agentId: z.string().optional(),\n tags: z.array(z.string()).optional(),\n embedding: z.array(z.number()).optional(),\n hash: z.string().optional(),\n});\n\n/**\n * BD command argument schema\n */\nconst BdArgumentSchema = z.string()\n .max(1024, 'Argument too long')\n .refine(\n (val) => !val.includes('\\0'),\n 'Argument contains null byte'\n )\n .refine(\n (val) => !/[;&|`$(){}><]/.test(val),\n 'Argument contains shell metacharacters'\n );\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Bead type (inferred from schema)\n */\nexport type Bead = z.infer<typeof BeadSchema>;\n\n/**\n * Bead type enum\n */\nexport type BeadType = z.infer<typeof BeadTypeSchema>;\n\n/**\n * Beads bridge configuration\n */\nexport interface BdBridgeConfig {\n /**\n * Path to bd executable\n * Default: 'bd' (assumes in PATH)\n */\n bdPath?: string;\n\n /**\n * Working directory for execution\n */\n cwd?: string;\n\n /**\n * Execution timeout in milliseconds\n * Default: 60000 (60 seconds)\n */\n timeout?: number;\n\n /**\n * Maximum buffer size for output\n * Default: 50MB (beads can be large)\n */\n maxBuffer?: number;\n\n /**\n * Environment variables\n */\n env?: NodeJS.ProcessEnv;\n\n /**\n * Default storage path\n */\n storagePath?: string;\n}\n\n/**\n * Bead query parameters\n */\nexport interface BeadQuery {\n type?: BeadType | BeadType[];\n threadId?: string;\n agentId?: string;\n tags?: string[];\n after?: string; // ISO timestamp\n before?: string; // ISO timestamp\n limit?: number;\n offset?: number;\n sortBy?: 'timestamp' | 'id' | 'type';\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Bead creation parameters\n */\nexport interface CreateBeadParams {\n type: BeadType;\n content: string;\n parentId?: string;\n threadId?: string;\n agentId?: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * BD execution result\n */\nexport interface BdResult<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n command: string;\n args: string[];\n durationMs: number;\n}\n\n/**\n * Streaming execution result\n */\nexport interface BdStreamResult {\n process: ChildProcess;\n stdout: NodeJS.ReadableStream | null;\n stderr: NodeJS.ReadableStream | null;\n promise: Promise<BdResult<string>>;\n}\n\n/**\n * Logger interface\n */\nexport interface BdLogger {\n debug: (msg: string, meta?: Record<string, unknown>) => void;\n info: (msg: string, meta?: Record<string, unknown>) => void;\n warn: (msg: string, meta?: Record<string, unknown>) => void;\n error: (msg: string, meta?: Record<string, unknown>) => void;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/**\n * Beads bridge error codes\n */\nexport type BdErrorCode =\n | 'COMMAND_NOT_FOUND'\n | 'EXECUTION_FAILED'\n | 'TIMEOUT'\n | 'INVALID_ARGUMENT'\n | 'INVALID_OUTPUT'\n | 'PARSE_ERROR'\n | 'VALIDATION_ERROR'\n | 'BEAD_NOT_FOUND';\n\n/**\n * Beads bridge error\n */\nexport class BdBridgeError extends Error {\n constructor(\n message: string,\n public readonly code: BdErrorCode,\n public readonly command?: string,\n public readonly args?: string[],\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'BdBridgeError';\n }\n}\n\n// ============================================================================\n// Default Logger\n// ============================================================================\n\nconst defaultLogger: BdLogger = {\n debug: (msg, meta) => console.debug(`[bd-bridge] ${msg}`, meta ?? ''),\n info: (msg, meta) => console.info(`[bd-bridge] ${msg}`, meta ?? ''),\n warn: (msg, meta) => console.warn(`[bd-bridge] ${msg}`, meta ?? ''),\n error: (msg, meta) => console.error(`[bd-bridge] ${msg}`, meta ?? ''),\n};\n\n// ============================================================================\n// Allowed Commands\n// ============================================================================\n\n/**\n * Allowed bd subcommands (allowlist)\n */\nconst ALLOWED_BD_COMMANDS = new Set([\n 'list',\n 'get',\n 'create',\n 'update',\n 'delete',\n 'search',\n 'export',\n 'import',\n 'thread',\n 'stats',\n 'help',\n 'version',\n 'config',\n 'sync',\n]);\n\n// ============================================================================\n// Beads Bridge Implementation\n// ============================================================================\n\n/**\n * Beads CLI Bridge\n *\n * Secure wrapper around the `bd` CLI tool for bead management.\n * Supports JSONL output parsing for streaming large datasets.\n *\n * @example\n * ```typescript\n * const bdBridge = new BdBridge({ bdPath: '/usr/local/bin/bd' });\n * await bdBridge.initialize();\n *\n * const beads = await bdBridge.listBeads({ type: 'prompt', limit: 100 });\n * ```\n */\nexport class BdBridge {\n private config: Required<BdBridgeConfig>;\n private logger: BdLogger;\n private initialized = false;\n\n /** Commands that can be cached (read-only, no side effects) */\n private static readonly CACHEABLE_COMMANDS = new Set([\n 'list',\n 'get',\n 'search',\n 'stats',\n 'version',\n 'help',\n 'config',\n ]);\n\n /** Commands that should use longer cache (static data) */\n private static readonly STATIC_COMMANDS = new Set([\n 'version',\n 'help',\n 'stats',\n 'config',\n ]);\n\n constructor(config?: BdBridgeConfig, logger?: BdLogger) {\n this.config = {\n bdPath: config?.bdPath ?? 'bd',\n cwd: config?.cwd ?? process.cwd(),\n timeout: config?.timeout ?? 60000,\n maxBuffer: config?.maxBuffer ?? 50 * 1024 * 1024,\n env: config?.env ?? process.env,\n storagePath: config?.storagePath ?? '',\n };\n this.logger = logger ?? defaultLogger;\n }\n\n /**\n * Initialize the bridge and verify bd is available\n */\n async initialize(): Promise<void> {\n try {\n const result = await this.execBd(['version']);\n if (!result.success) {\n throw new BdBridgeError(\n 'Failed to verify bd installation',\n 'COMMAND_NOT_FOUND',\n 'bd',\n ['version']\n );\n }\n this.initialized = true;\n this.logger.info('Beads bridge initialized', {\n bdPath: this.config.bdPath,\n version: result.data,\n });\n } catch (error) {\n if (error instanceof BdBridgeError) throw error;\n throw new BdBridgeError(\n 'Failed to initialize Beads bridge',\n 'COMMAND_NOT_FOUND',\n 'bd',\n ['version'],\n error as Error\n );\n }\n }\n\n /**\n * Execute a bd command with validated arguments\n *\n * @param args - Command arguments (validated and sanitized)\n * @returns Command output\n */\n async execBd(args: string[], skipCache = false): Promise<BdResult<string>> {\n const startTime = Date.now();\n\n // Validate all arguments\n const validatedArgs = this.validateAndSanitizeArgs(args);\n\n // Validate subcommand is allowed\n const subcommand = validatedArgs[0];\n if (subcommand && !ALLOWED_BD_COMMANDS.has(subcommand)) {\n throw new BdBridgeError(\n `Command not allowed: ${subcommand}`,\n 'INVALID_ARGUMENT',\n 'bd',\n validatedArgs\n );\n }\n\n // Check cache for cacheable commands\n const cacheKey = hashArgs(validatedArgs);\n const isCacheable = !skipCache && subcommand && BdBridge.CACHEABLE_COMMANDS.has(subcommand);\n const isStatic = subcommand && BdBridge.STATIC_COMMANDS.has(subcommand);\n\n if (isCacheable) {\n const cached = staticCache.get(cacheKey) as BdResult<string> | undefined;\n if (cached) {\n this.logger.debug('Cache hit for bd command', { command: subcommand });\n return {\n ...cached,\n durationMs: 0, // Cached result\n };\n }\n }\n\n // Use deduplication for concurrent identical calls\n return execDedup.dedupe(cacheKey, async () => {\n try {\n this.logger.debug('Executing bd command', {\n command: 'bd',\n args: validatedArgs,\n });\n\n const { stdout, stderr } = await execFileAsync(\n this.config.bdPath,\n validatedArgs,\n {\n cwd: this.config.cwd,\n env: this.config.env,\n timeout: this.config.timeout,\n maxBuffer: this.config.maxBuffer,\n shell: false, // CRITICAL: Never use shell\n windowsHide: true,\n }\n );\n\n const durationMs = Date.now() - startTime;\n\n if (stderr && stderr.trim()) {\n this.logger.warn('bd stderr output', { stderr });\n }\n\n const result: BdResult<string> = {\n success: true,\n data: stdout.trim(),\n command: 'bd',\n args: validatedArgs,\n durationMs,\n };\n\n // Cache successful results\n if (isCacheable && result.success) {\n staticCache.set(cacheKey, result);\n }\n\n return result;\n } catch (error: unknown) {\n const durationMs = Date.now() - startTime;\n const err = error as NodeJS.ErrnoException & {\n killed?: boolean;\n stdout?: string;\n stderr?: string;\n };\n\n if (err.killed) {\n throw new BdBridgeError(\n 'Command execution timed out',\n 'TIMEOUT',\n 'bd',\n validatedArgs\n );\n }\n\n if (err.code === 'ENOENT') {\n throw new BdBridgeError(\n `bd executable not found at: ${this.config.bdPath}`,\n 'COMMAND_NOT_FOUND',\n 'bd',\n validatedArgs\n );\n }\n\n return {\n success: false,\n error: err.stderr || err.message,\n command: 'bd',\n args: validatedArgs,\n durationMs,\n };\n }\n });\n }\n\n /**\n * Execute bd command with streaming output\n */\n execBdStreaming(args: string[]): BdStreamResult {\n const startTime = Date.now();\n\n // Validate all arguments\n const validatedArgs = this.validateAndSanitizeArgs(args);\n\n // Validate subcommand is allowed\n const subcommand = validatedArgs[0];\n if (subcommand && !ALLOWED_BD_COMMANDS.has(subcommand)) {\n throw new BdBridgeError(\n `Command not allowed: ${subcommand}`,\n 'INVALID_ARGUMENT',\n 'bd',\n validatedArgs\n );\n }\n\n this.logger.debug('Executing bd command (streaming)', {\n command: 'bd',\n args: validatedArgs,\n });\n\n const childProcess = spawn(this.config.bdPath, validatedArgs, {\n cwd: this.config.cwd,\n env: this.config.env,\n timeout: this.config.timeout,\n shell: false, // CRITICAL: Never use shell\n windowsHide: true,\n });\n\n const promise = new Promise<BdResult<string>>((resolve, reject) => {\n let stdout = '';\n let stderr = '';\n\n childProcess.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n childProcess.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n childProcess.on('close', (code) => {\n const durationMs = Date.now() - startTime;\n if (code === 0) {\n resolve({\n success: true,\n data: stdout.trim(),\n command: 'bd',\n args: validatedArgs,\n durationMs,\n });\n } else {\n resolve({\n success: false,\n error: stderr || `Process exited with code ${code}`,\n command: 'bd',\n args: validatedArgs,\n durationMs,\n });\n }\n });\n\n childProcess.on('error', (error) => {\n reject(new BdBridgeError(\n error.message,\n 'EXECUTION_FAILED',\n 'bd',\n validatedArgs\n ));\n });\n });\n\n return {\n process: childProcess,\n stdout: childProcess.stdout,\n stderr: childProcess.stderr,\n promise,\n };\n }\n\n /**\n * Parse JSONL output from bd command into Bead array\n *\n * @param output - JSONL formatted output\n * @returns Array of parsed and validated beads\n */\n parseBdOutput(output: string): Bead[] {\n if (!output || output.trim() === '') {\n return [];\n }\n\n // Check parsed cache first\n const cacheKey = hashArgs([output]);\n const cached = parsedCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const lines = output.trim().split('\\n');\n const beads: Bead[] = [];\n const errors: Array<{ line: number; error: string }> = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]?.trim();\n if (!line) continue;\n\n try {\n const parsed = JSON.parse(line);\n const validated = BeadSchema.parse(parsed);\n beads.push(validated);\n\n // Also cache individual beads\n singleBeadCache.set(validated.id, validated);\n } catch (error) {\n errors.push({\n line: i + 1,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n if (errors.length > 0) {\n this.logger.warn('Some beads failed to parse', {\n totalLines: lines.length,\n parsed: beads.length,\n errors: errors.length,\n firstErrors: errors.slice(0, 3),\n });\n }\n\n // Cache the parsed result\n parsedCache.set(cacheKey, beads);\n\n return beads;\n }\n\n /**\n * Parse single bead from JSON output\n */\n parseSingleBead(output: string): Bead {\n if (!output || output.trim() === '') {\n throw new BdBridgeError(\n 'Empty output from bd command',\n 'INVALID_OUTPUT'\n );\n }\n\n try {\n const parsed = JSON.parse(output);\n return BeadSchema.parse(parsed);\n } catch (error) {\n throw new BdBridgeError(\n 'Failed to parse bead output',\n 'PARSE_ERROR',\n undefined,\n undefined,\n error as Error\n );\n }\n }\n\n /**\n * List beads with optional query parameters\n */\n async listBeads(query?: BeadQuery): Promise<Bead[]> {\n this.ensureInitialized();\n\n const args = ['list', '--format', 'jsonl'];\n\n if (query?.type) {\n const types = Array.isArray(query.type) ? query.type : [query.type];\n for (const type of types) {\n args.push('--type', type);\n }\n }\n\n if (query?.threadId) {\n args.push('--thread', SafeStringSchema.parse(query.threadId));\n }\n\n if (query?.agentId) {\n args.push('--agent', SafeStringSchema.parse(query.agentId));\n }\n\n if (query?.tags && query.tags.length > 0) {\n for (const tag of query.tags) {\n args.push('--tag', SafeStringSchema.parse(tag));\n }\n }\n\n if (query?.after) {\n args.push('--after', query.after);\n }\n\n if (query?.before) {\n args.push('--before', query.before);\n }\n\n if (query?.limit !== undefined) {\n args.push('--limit', String(Math.min(query.limit, 10000)));\n }\n\n if (query?.offset !== undefined) {\n args.push('--offset', String(query.offset));\n }\n\n if (query?.sortBy) {\n args.push('--sort', query.sortBy);\n }\n\n if (query?.sortOrder) {\n args.push('--order', query.sortOrder);\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Failed to list beads',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return this.parseBdOutput(result.data ?? '');\n }\n\n /**\n * Get a single bead by ID\n */\n async getBead(beadId: string): Promise<Bead> {\n this.ensureInitialized();\n\n const validatedId = BeadIdSchema.parse(beadId);\n\n // Check single bead cache first\n const cached = singleBeadCache.get(validatedId);\n if (cached) {\n this.logger.debug('Bead cache hit', { beadId: validatedId });\n return cached;\n }\n\n const args = ['get', validatedId, '--format', 'json'];\n\n const result = await this.execBd(args);\n if (!result.success) {\n if (result.error?.includes('not found')) {\n throw new BdBridgeError(\n `Bead not found: ${beadId}`,\n 'BEAD_NOT_FOUND',\n 'bd',\n args\n );\n }\n throw new BdBridgeError(\n result.error ?? 'Failed to get bead',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n const bead = this.parseSingleBead(result.data ?? '');\n\n // Cache the result\n singleBeadCache.set(bead.id, bead);\n\n return bead;\n }\n\n /**\n * Create a new bead\n */\n async createBead(params: CreateBeadParams): Promise<Bead> {\n this.ensureInitialized();\n\n const args = [\n 'create',\n '--type', params.type,\n '--content', SafeStringSchema.parse(params.content),\n '--format', 'json',\n ];\n\n if (params.parentId) {\n args.push('--parent', BeadIdSchema.parse(params.parentId));\n }\n\n if (params.threadId) {\n args.push('--thread', SafeStringSchema.parse(params.threadId));\n }\n\n if (params.agentId) {\n args.push('--agent', SafeStringSchema.parse(params.agentId));\n }\n\n if (params.tags && params.tags.length > 0) {\n for (const tag of params.tags) {\n args.push('--tag', SafeStringSchema.parse(tag));\n }\n }\n\n if (params.metadata) {\n args.push('--metadata', JSON.stringify(params.metadata));\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Failed to create bead',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return this.parseSingleBead(result.data ?? '');\n }\n\n /**\n * Search beads with semantic query\n */\n async searchBeads(query: string, options?: {\n limit?: number;\n threshold?: number;\n type?: BeadType | BeadType[];\n }): Promise<Bead[]> {\n this.ensureInitialized();\n\n const args = [\n 'search',\n SafeStringSchema.parse(query),\n '--format', 'jsonl',\n ];\n\n if (options?.limit !== undefined) {\n args.push('--limit', String(Math.min(options.limit, 1000)));\n }\n\n if (options?.threshold !== undefined) {\n args.push('--threshold', String(options.threshold));\n }\n\n if (options?.type) {\n const types = Array.isArray(options.type) ? options.type : [options.type];\n for (const type of types) {\n args.push('--type', type);\n }\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Bead search failed',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return this.parseBdOutput(result.data ?? '');\n }\n\n /**\n * Export beads to JSONL format\n */\n async exportBeads(query?: BeadQuery): Promise<string> {\n this.ensureInitialized();\n\n const args = ['export', '--format', 'jsonl'];\n\n if (query?.threadId) {\n args.push('--thread', SafeStringSchema.parse(query.threadId));\n }\n\n if (query?.after) {\n args.push('--after', query.after);\n }\n\n if (query?.before) {\n args.push('--before', query.before);\n }\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Export failed',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n return result.data ?? '';\n }\n\n /**\n * Get bead statistics\n */\n async getStats(): Promise<{\n totalBeads: number;\n beadsByType: Record<string, number>;\n totalThreads: number;\n oldestBead?: string;\n newestBead?: string;\n storageSize?: number;\n }> {\n this.ensureInitialized();\n\n const args = ['stats', '--format', 'json'];\n\n const result = await this.execBd(args);\n if (!result.success) {\n throw new BdBridgeError(\n result.error ?? 'Failed to get stats',\n 'EXECUTION_FAILED',\n 'bd',\n args\n );\n }\n\n try {\n return JSON.parse(result.data ?? '{}');\n } catch {\n throw new BdBridgeError(\n 'Failed to parse stats output',\n 'PARSE_ERROR',\n 'bd',\n args\n );\n }\n }\n\n /**\n * Validate and sanitize command arguments\n */\n private validateAndSanitizeArgs(args: string[]): string[] {\n return args.map((arg, index) => {\n try {\n return BdArgumentSchema.parse(arg);\n } catch (error) {\n throw new BdBridgeError(\n `Invalid argument at index ${index}: ${arg}`,\n 'VALIDATION_ERROR',\n 'bd',\n args,\n error as Error\n );\n }\n });\n }\n\n /**\n * Ensure bridge is initialized\n */\n private ensureInitialized(): void {\n if (!this.initialized) {\n throw new BdBridgeError(\n 'Beads bridge not initialized. Call initialize() first.',\n 'EXECUTION_FAILED'\n );\n }\n }\n\n /**\n * Check if bridge is initialized\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<Required<BdBridgeConfig>> {\n return { ...this.config };\n }\n\n /**\n * Get cache statistics for performance monitoring\n */\n getCacheStats(): {\n beadQueryCache: { entries: number; sizeBytes: number };\n singleBeadCache: { entries: number; sizeBytes: number };\n staticCache: { entries: number; sizeBytes: number };\n parsedCache: { entries: number; sizeBytes: number };\n } {\n return {\n beadQueryCache: beadQueryCache.stats(),\n singleBeadCache: singleBeadCache.stats(),\n staticCache: staticCache.stats(),\n parsedCache: parsedCache.stats(),\n };\n }\n\n /**\n * Clear all caches (useful for testing or memory pressure)\n */\n clearCaches(): void {\n beadQueryCache.clear();\n singleBeadCache.clear();\n staticCache.clear();\n parsedCache.clear();\n }\n\n /**\n * Invalidate cache for a specific bead (after create/update/delete)\n */\n invalidateBeadCache(beadId: string): void {\n singleBeadCache.delete(beadId);\n // Also clear query caches since they may contain stale data\n beadQueryCache.clear();\n parsedCache.clear();\n }\n}\n\n/**\n * Create a new Beads bridge instance\n */\nexport function createBdBridge(config?: BdBridgeConfig, logger?: BdLogger): BdBridge {\n return new BdBridge(config, logger);\n}\n\n// Export schemas for external use\nexport {\n SafeStringSchema,\n IdentifierSchema,\n BeadIdSchema,\n BeadTypeSchema,\n BdArgumentSchema,\n};\n\nexport default BdBridge;\n"]}
@@ -0,0 +1,11 @@
1
+ 'use strict';var chunk7VD5N6NG_cjs=require('./chunk-7VD5N6NG.cjs'),chunk46PJFOMY_cjs=require('./chunk-46PJFOMY.cjs'),events=require('events'),zod=require('zod'),uuid=require('uuid');/**
2
+ * @claude-flow/plugin-gastown-bridge v0.1.4
3
+ *
4
+ * WASM-accelerated Gas Town orchestration for Claude Flow V3
5
+ * Bundle optimized: <100KB gzipped total
6
+ *
7
+ * @license MIT
8
+ * @copyright 2024 rUv
9
+ */
10
+ var de={townRoot:"~/gt",enableBeadsSync:true,syncInterval:6e4,nativeFormulas:true,enableConvoys:true,autoCreateBeads:false,enableGUPP:false,guppCheckInterval:5e3,cliTimeout:3e4},pe={CLI_NOT_FOUND:"GT_CLI_NOT_FOUND",CLI_TIMEOUT:"GT_CLI_TIMEOUT",CLI_ERROR:"GT_CLI_ERROR",BEAD_NOT_FOUND:"GT_BEAD_NOT_FOUND",CONVOY_NOT_FOUND:"GT_CONVOY_NOT_FOUND",FORMULA_NOT_FOUND:"GT_FORMULA_NOT_FOUND",FORMULA_PARSE_ERROR:"GT_FORMULA_PARSE_ERROR",WASM_NOT_INITIALIZED:"GT_WASM_NOT_INITIALIZED",SYNC_ERROR:"GT_SYNC_ERROR",DEPENDENCY_CYCLE:"GT_DEPENDENCY_CYCLE",INVALID_SLING_TARGET:"GT_INVALID_SLING_TARGET"},N=zod.z.enum(["open","in_progress","closed"]),F=zod.z.object({id:zod.z.string().min(1),title:zod.z.string().min(1),description:zod.z.string(),status:N,priority:zod.z.number().int().min(0),labels:zod.z.array(zod.z.string()),parentId:zod.z.string().optional(),createdAt:zod.z.coerce.date(),updatedAt:zod.z.coerce.date(),assignee:zod.z.string().optional(),rig:zod.z.string().optional(),blockedBy:zod.z.array(zod.z.string()).optional(),blocks:zod.z.array(zod.z.string()).optional()}),L=zod.z.object({title:zod.z.string().min(1),description:zod.z.string().optional(),priority:zod.z.number().int().min(0).optional(),labels:zod.z.array(zod.z.string()).optional(),parent:zod.z.string().optional(),rig:zod.z.string().optional(),assignee:zod.z.string().optional()}),G=zod.z.enum(["convoy","workflow","expansion","aspect"]),W=zod.z.object({id:zod.z.string().min(1),title:zod.z.string().min(1),description:zod.z.string(),needs:zod.z.array(zod.z.string()).optional(),duration:zod.z.number().optional(),requires:zod.z.array(zod.z.string()).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),U=zod.z.object({id:zod.z.string().min(1),title:zod.z.string().min(1),focus:zod.z.string(),description:zod.z.string(),agent:zod.z.string().optional(),order:zod.z.number().optional()}),J=zod.z.object({name:zod.z.string().min(1),description:zod.z.string().optional(),default:zod.z.string().optional(),required:zod.z.boolean().optional(),pattern:zod.z.string().optional(),enum:zod.z.array(zod.z.string()).optional()}),z=zod.z.object({strategy:zod.z.enum(["merge","sequential","parallel"]),format:zod.z.string().optional(),description:zod.z.string().optional()}),j=zod.z.object({name:zod.z.string().min(1),content:zod.z.string(),outputPath:zod.z.string().optional()}),Y=zod.z.object({name:zod.z.string().min(1),pointcut:zod.z.string(),advice:zod.z.string(),type:zod.z.enum(["before","after","around"])}),q=zod.z.object({name:zod.z.string().min(1),description:zod.z.string(),type:G,version:zod.z.number().int().min(1),legs:zod.z.array(U).optional(),synthesis:z.optional(),steps:zod.z.array(W).optional(),vars:zod.z.record(J).optional(),templates:zod.z.array(j).optional(),aspects:zod.z.array(Y).optional(),metadata:zod.z.record(zod.z.unknown()).optional()}),V=zod.z.enum(["active","landed","failed","paused"]),$=zod.z.object({total:zod.z.number().int().min(0),closed:zod.z.number().int().min(0),inProgress:zod.z.number().int().min(0),blocked:zod.z.number().int().min(0)}),H=zod.z.object({id:zod.z.string().min(1),name:zod.z.string().min(1),trackedIssues:zod.z.array(zod.z.string()),status:V,startedAt:zod.z.coerce.date(),completedAt:zod.z.coerce.date().optional(),progress:$,formula:zod.z.string().optional(),description:zod.z.string().optional()}),P=zod.z.object({name:zod.z.string().min(1),issues:zod.z.array(zod.z.string()).min(1),description:zod.z.string().optional(),formula:zod.z.string().optional()}),ue=zod.z.enum(["mayor","polecat","refinery","witness","deacon","dog","crew"]),Z=zod.z.enum(["polecat","crew","mayor"]),K=zod.z.object({beadId:zod.z.string().min(1),target:Z,formula:zod.z.string().optional(),priority:zod.z.number().int().min(0).optional()}),ge=zod.z.enum(["pull","push","both"]),Q=zod.z.object({townRoot:zod.z.string().default("~/gt"),enableBeadsSync:zod.z.boolean().default(true),syncInterval:zod.z.number().int().positive().default(6e4),nativeFormulas:zod.z.boolean().default(true),enableConvoys:zod.z.boolean().default(true),autoCreateBeads:zod.z.boolean().default(false),enableGUPP:zod.z.boolean().default(false),guppCheckInterval:zod.z.number().int().positive().default(5e3),cliTimeout:zod.z.number().int().positive().default(3e4)});function ye(l){return F.parse(l)}function me(l){return L.parse(l)}function he(l){return q.parse(l)}function ve(l){return H.parse(l)}function fe(l){return P.parse(l)}function be(l){return K.parse(l)}function Ce(l){return Q.parse(l)}var te={debug:(l,e)=>console.debug(`[convoy-tracker] ${l}`,e??""),info:(l,e)=>console.info(`[convoy-tracker] ${l}`,e??""),warn:(l,e)=>console.warn(`[convoy-tracker] ${l}`,e??""),error:(l,e)=>console.error(`[convoy-tracker] ${l}`,e??"")},b=zod.z.string().uuid("Invalid convoy ID format"),D=zod.z.array(zod.z.string().min(1)).min(1,"At least one issue ID required"),I=class extends events.EventEmitter{bdBridge;convoys=new Map;logger;config;progressTimers=new Map;constructor(e,t){super(),this.bdBridge=e.bdBridge,this.logger=t??te,this.config={autoUpdateProgress:e.autoUpdateProgress??true,progressUpdateInterval:e.progressUpdateInterval??3e4,persistConvoys:e.persistConvoys??false,storagePath:e.storagePath??"./data/convoys"};}async create(e,t,r){let s=P.parse({name:e,issues:t,description:r}),n=await this.verifyIssues(s.issues);if(n.length===0)throw chunk7VD5N6NG_cjs.g.createFailed("No valid issues found");let a=await this.calculateProgress(n),i=uuid.v4(),c=new Date,g={id:i,name:s.name,trackedIssues:n,status:"active",startedAt:c,progress:a,description:s.description};return this.convoys.set(i,{convoy:g,createdAt:c,updatedAt:c,metadata:{}}),this.emitConvoyEvent("convoy:created",g),this.config.autoUpdateProgress&&this.startProgressTracking(i),this.logger.info("Convoy created",{convoyId:i,name:e,issueCount:n.length}),g}async addIssues(e,t){b.parse(e),D.parse(t);let r=this.convoys.get(e);if(!r)throw chunk7VD5N6NG_cjs.g.notFound(e);let s=await this.verifyIssues(t);if(s.length===0)throw new chunk7VD5N6NG_cjs.g("No valid issues to add",chunk7VD5N6NG_cjs.a.CONVOY_CREATE_FAILED,{convoyId:e,issues:t});let n=new Set(r.convoy.trackedIssues),a=s.filter(d=>!n.has(d));if(a.length===0)return r.convoy;let i=[...r.convoy.trackedIssues,...a],c=await this.calculateProgress(i),g={...r.convoy,trackedIssues:i,progress:c};return r.convoy=g,r.updatedAt=new Date,this.emitConvoyEvent("convoy:issue:added",g,{issues:a}),this.logger.info("Issues added to convoy",{convoyId:e,addedCount:a.length,totalCount:i.length}),g}async removeIssues(e,t){b.parse(e),D.parse(t);let r=this.convoys.get(e);if(!r)throw chunk7VD5N6NG_cjs.g.notFound(e);let s=new Set(t),n=r.convoy.trackedIssues.filter(g=>!s.has(g));if(n.length===r.convoy.trackedIssues.length)return r.convoy;let a=n.length>0?await this.calculateProgress(n):{total:0,closed:0,inProgress:0,blocked:0},i={...r.convoy,trackedIssues:n,progress:a};r.convoy=i,r.updatedAt=new Date;let c=t.filter(g=>r.convoy.trackedIssues.includes(g)&&!n.includes(g));return this.emitConvoyEvent("convoy:issue:removed",i,{issues:c}),this.logger.info("Issues removed from convoy",{convoyId:e,removedCount:c.length,remainingCount:n.length}),i}async getStatus(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw chunk7VD5N6NG_cjs.g.notFound(e);let r=await this.calculateProgress(t.convoy.trackedIssues),s=t.convoy.progress;if(r.closed!==s.closed||r.inProgress!==s.inProgress||r.blocked!==s.blocked){let n={...t.convoy,progress:r};t.convoy=n,t.updatedAt=new Date,this.emitConvoyEvent("convoy:progressed",n);}return t.convoy}async complete(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw chunk7VD5N6NG_cjs.g.notFound(e);if(t.convoy.status==="landed")return t.convoy;let r=t.convoy.status,s=new Date,n={...t.convoy,status:"landed",completedAt:s};return t.convoy=n,t.updatedAt=s,this.stopProgressTracking(e),this.emitConvoyEvent("convoy:completed",n,{previousStatus:r}),this.logger.info("Convoy completed",{convoyId:e,name:n.name,duration:s.getTime()-n.startedAt.getTime()}),n}async cancel(e,t){b.parse(e);let r=this.convoys.get(e);if(!r)throw chunk7VD5N6NG_cjs.g.notFound(e);if(r.convoy.status==="failed"||r.convoy.status==="landed")return r.convoy;let s=r.convoy.status,n=new Date,a={...r.convoy,status:"failed",completedAt:n};return r.convoy=a,r.updatedAt=n,r.metadata.cancellationReason=t,this.stopProgressTracking(e),this.emitConvoyEvent("convoy:cancelled",a,{previousStatus:s,reason:t}),this.logger.info("Convoy cancelled",{convoyId:e,name:a.name,reason:t}),a}async pause(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw chunk7VD5N6NG_cjs.g.notFound(e);if(t.convoy.status!=="active")return t.convoy;let r=t.convoy.status,s={...t.convoy,status:"paused"};return t.convoy=s,t.updatedAt=new Date,this.stopProgressTracking(e),this.emitConvoyEvent("convoy:paused",s,{previousStatus:r}),this.logger.info("Convoy paused",{convoyId:e,name:s.name}),s}async resume(e){b.parse(e);let t=this.convoys.get(e);if(!t)throw chunk7VD5N6NG_cjs.g.notFound(e);if(t.convoy.status!=="paused")return t.convoy;let r=t.convoy.status,s={...t.convoy,status:"active"};return t.convoy=s,t.updatedAt=new Date,this.config.autoUpdateProgress&&this.startProgressTracking(e),this.emitConvoyEvent("convoy:resumed",s,{previousStatus:r}),this.logger.info("Convoy resumed",{convoyId:e,name:s.name}),s}listConvoys(e){let t=Array.from(this.convoys.values()).map(r=>r.convoy);return e?t.filter(r=>r.status===e):t}getConvoy(e){return this.convoys.get(e)?.convoy}deleteConvoy(e){return this.stopProgressTracking(e),this.convoys.delete(e)}async calculateProgress(e){if(e.length===0)return {total:0,closed:0,inProgress:0,blocked:0};try{let t=await this.fetchBeads(e),r=new Map(t.map(i=>[i.id,i])),s=0,n=0,a=0;for(let i of e){let c=r.get(i);c&&(c.status==="closed"?s++:c.status==="in_progress"&&n++,c.blockedBy&&c.blockedBy.length>0&&c.blockedBy.some(d=>{let y=r.get(d);return y&&y.status!=="closed"})&&a++);}return {total:e.length,closed:s,inProgress:n,blocked:a}}catch(t){return this.logger.warn("Failed to calculate progress",{issueIds:e,error:t instanceof Error?t.message:String(t)}),{total:e.length,closed:0,inProgress:0,blocked:0}}}async verifyIssues(e){let t=[];for(let r of e)try{await this.bdBridge.getBead(r),t.push(r);}catch{this.logger.warn("Issue not found",{issueId:r});}return t}async fetchBeads(e){let t=[];for(let r of e)try{let s=await this.bdBridge.getBead(r);t.push({id:s.id,title:s.content.slice(0,100),description:s.content,status:this.mapBeadStatus(s.type),priority:0,labels:s.tags??[],createdAt:s.timestamp?new Date(s.timestamp):new Date,updatedAt:new Date,blockedBy:s.parentId?[s.parentId]:[]});}catch{}return t}mapBeadStatus(e){switch(e){case "closed":return "closed";case "in_progress":case "response":case "code":return "in_progress";default:return "open"}}startProgressTracking(e){if(this.progressTimers.has(e))return;let t=setInterval(async()=>{try{await this.getStatus(e);}catch(r){this.logger.warn("Progress tracking error",{convoyId:e,error:r instanceof Error?r.message:String(r)});}},this.config.progressUpdateInterval);this.progressTimers.set(e,t);}stopProgressTracking(e){let t=this.progressTimers.get(e);t&&(clearInterval(t),this.progressTimers.delete(e));}emitConvoyEvent(e,t,r){let s={type:e,convoyId:t.id,convoyName:t.name,timestamp:new Date,status:t.status,progress:t.progress,...r};this.emit(e,s),this.emit("convoy:*",s);}dispose(){for(let[e,t]of this.progressTimers)clearInterval(t);this.progressTimers.clear(),this.removeAllListeners();}};function oe(l,e){return new I(l,e)}var ne={debug:(l,e)=>console.debug(`[convoy-observer] ${l}`,e??""),info:(l,e)=>console.info(`[convoy-observer] ${l}`,e??""),warn:(l,e)=>console.warn(`[convoy-observer] ${l}`,e??""),error:(l,e)=>console.error(`[convoy-observer] ${l}`,e??"")},O=zod.z.string().uuid("Invalid convoy ID format"),S=class extends events.EventEmitter{bdBridge;tracker;wasmModule;logger;config;watchers=new Map;beadCache;completionCache;fetchDedup;progressEmitters;pendingSubscriptions=new Map;subscriptionFlushTimer=null;constructor(e,t){super(),this.bdBridge=e.bdBridge,this.tracker=e.tracker,this.wasmModule=e.wasmModule,this.logger=t??ne,this.config={pollInterval:e.pollInterval??1e4,maxPollAttempts:e.maxPollAttempts??0,useWasm:e.useWasm??true,useExponentialBackoff:e.useExponentialBackoff??true,maxBackoffInterval:e.maxBackoffInterval??6e4,backoffMultiplier:e.backoffMultiplier??1.5,deltaUpdatesOnly:e.deltaUpdatesOnly??true,progressDebounceMs:e.progressDebounceMs??500},this.beadCache=new chunk46PJFOMY_cjs.a({maxEntries:1e3,ttlMs:30*1e3}),this.completionCache=new chunk46PJFOMY_cjs.a({maxEntries:100,ttlMs:5*1e3}),this.fetchDedup=new chunk46PJFOMY_cjs.c(3e4),this.progressEmitters=new Map;}watch(e,t){O.parse(e),this.stopWatching(e);let r=this.config.pollInterval,n=(a=>setTimeout(async()=>{await this.pollConvoyWithBackoff(e,t);},a))(r);return this.watchers.set(e,{timer:n,callback:t,attempts:0,currentInterval:r,lastState:null}),this.progressEmitters.set(e,new chunk46PJFOMY_cjs.e(a=>this.emit("progress",e,a),this.config.progressDebounceMs)),this.pollConvoyWithBackoff(e,t),this.logger.info("Started watching convoy",{convoyId:e,interval:r}),{convoyId:e,stop:()=>this.stopWatching(e),isActive:()=>this.watchers.has(e)}}batchSubscribe(e,t){this.pendingSubscriptions.has(e)||this.pendingSubscriptions.set(e,new Set),this.pendingSubscriptions.get(e).add(t),this.subscriptionFlushTimer||(this.subscriptionFlushTimer=setTimeout(()=>{this.flushSubscriptions();},50));}flushSubscriptions(){this.subscriptionFlushTimer=null;for(let[e,t]of this.pendingSubscriptions){let r=(s,n)=>{for(let a of t)try{a(s,n);}catch(i){this.logger.error("Subscription callback error",{convoyId:e,error:i instanceof Error?i.message:String(i)});}};this.watch(e,r);}this.pendingSubscriptions.clear(),this.logger.debug("Flushed subscription batch",{convoys:this.pendingSubscriptions.size});}async checkCompletion(e){O.parse(e);let t=this.tracker.getConvoy(e);if(!t)throw chunk7VD5N6NG_cjs.g.notFound(e);let r=await this.fetchBeads(t.trackedIssues),s=new Map(r.map(u=>[u.id,u])),n=[],a=[],i=0;for(let u of t.trackedIssues){let v=s.get(u);v&&(v.status==="closed"?i++:v.status==="in_progress"?a.push(u):n.push(u));}let c=false,g=[],d=[],y=[];if(this.config.useWasm&&this.wasmModule)try{let u=this.analyzeWithWasm(r);c=u.hasCycles,g=u.cycleIssues,d=u.readyIssues,y=u.blockedIssues;}catch(u){this.logger.warn("WASM analysis failed, falling back to JS",{error:u instanceof Error?u.message:String(u)});let v=this.analyzeWithJS(r,t.trackedIssues);c=v.hasCycles,g=v.cycleIssues,d=v.readyIssues,y=v.blockedIssues;}else {let u=this.analyzeWithJS(r,t.trackedIssues);c=u.hasCycles,g=u.cycleIssues,d=u.readyIssues,y=u.blockedIssues;}let p={total:t.trackedIssues.length,closed:i,inProgress:a.length,blocked:y.length};return {allComplete:i===t.trackedIssues.length,progress:p,openIssues:n,inProgressIssues:a,blockedIssues:y,readyIssues:d,hasCycles:c,cycleIssues:g}}async getBlockers(e){return (await this.checkCompletion(e)).blockedIssues}async getReadyIssues(e){return (await this.checkCompletion(e)).readyIssues}async getExecutionOrder(e){O.parse(e);let t=this.tracker.getConvoy(e);if(!t)throw chunk7VD5N6NG_cjs.g.notFound(e);let r=await this.fetchBeads(t.trackedIssues);if(this.config.useWasm&&this.wasmModule)try{let s=this.beadsToWasmNodes(r),n=this.wasmModule.topo_sort(JSON.stringify(s)),a=JSON.parse(n);if(a.hasCycle)throw new chunk7VD5N6NG_cjs.b("Cannot compute execution order: dependency cycle detected",chunk7VD5N6NG_cjs.a.DEPENDENCY_CYCLE,{cycleNodes:a.cycleNodes});return a.sorted}catch(s){if(s instanceof chunk7VD5N6NG_cjs.b)throw s;this.logger.warn("WASM topo sort failed, falling back to JS",{error:s instanceof Error?s.message:String(s)});}return this.topoSortJS(r)}stopWatching(e){let t=this.watchers.get(e);if(t){clearTimeout(t.timer),this.watchers.delete(e);let r=this.progressEmitters.get(e);r&&(r.flush(),this.progressEmitters.delete(e)),this.completionCache.delete(e),this.logger.info("Stopped watching convoy",{convoyId:e});}}stopAll(){for(let[e,t]of this.watchers)clearTimeout(t.timer);this.watchers.clear();for(let e of this.progressEmitters.values())e.flush();this.progressEmitters.clear(),this.beadCache.clear(),this.completionCache.clear(),this.fetchDedup.clear(),this.subscriptionFlushTimer&&(clearTimeout(this.subscriptionFlushTimer),this.subscriptionFlushTimer=null),this.pendingSubscriptions.clear(),this.logger.info("Stopped all convoy watchers");}setWasmModule(e){this.wasmModule=e,this.logger.info("WASM module set");}isWasmAvailable(){return !!this.wasmModule}async pollConvoyWithBackoff(e,t){let r=this.watchers.get(e);if(r)try{let s=this.tracker.getConvoy(e);if(!s){this.stopWatching(e);return}if(s.status==="landed"||s.status==="failed"){t(s,s.status==="landed"),this.stopWatching(e);return}let n=await this.checkCompletion(e),a=JSON.stringify({allComplete:n.allComplete,progress:n.progress,openIssues:n.openIssues.length,inProgress:n.inProgressIssues.length,blocked:n.blockedIssues.length}),i=r.lastState!==a;if(r.lastState=a,this.config.deltaUpdatesOnly&&!i)this.config.useExponentialBackoff&&(r.currentInterval=Math.min(r.currentInterval*this.config.backoffMultiplier,this.config.maxBackoffInterval));else {r.currentInterval=this.config.pollInterval,t(s,n.allComplete);let c=this.progressEmitters.get(e);c&&c.update(n.progress);}if(r.attempts++,this.config.maxPollAttempts>0&&r.attempts>=this.config.maxPollAttempts){this.logger.warn("Max poll attempts reached",{convoyId:e,attempts:r.attempts}),this.stopWatching(e);return}clearTimeout(r.timer),r.timer=setTimeout(async()=>{await this.pollConvoyWithBackoff(e,t);},r.currentInterval);}catch(s){this.logger.error("Poll error",{convoyId:e,error:s instanceof Error?s.message:String(s)}),this.config.useExponentialBackoff&&(r.currentInterval=Math.min(r.currentInterval*(this.config.backoffMultiplier*1.5),this.config.maxBackoffInterval)),clearTimeout(r.timer),r.timer=setTimeout(async()=>{await this.pollConvoyWithBackoff(e,t);},r.currentInterval);}}async pollConvoy(e,t){return this.pollConvoyWithBackoff(e,t)}async fetchBeads(e){let t=e.sort().join(",");return this.fetchDedup.dedupe(t,async()=>{let r=[],s=[];for(let a of e){let i=this.beadCache.get(a);i?r.push(i):s.push(a);}let n=10;for(let a=0;a<s.length;a+=n){let c=s.slice(a,a+n).map(async d=>{try{let y=await this.bdBridge.getBead(d),p=chunk7VD5N6NG_cjs.t.acquire();p.id=y.id,p.title=y.content.slice(0,100),p.description=y.content,p.status=this.mapBeadStatus(y.type),p.priority=0,p.labels=y.tags??[],p.createdAt=y.timestamp?new Date(y.timestamp):new Date,p.updatedAt=new Date,p.blockedBy=y.parentId?[y.parentId]:[],p.blocks=[];let u={id:p.id,title:p.title,description:p.description,status:p.status,priority:p.priority,labels:p.labels,createdAt:p.createdAt,updatedAt:p.updatedAt,blockedBy:p.blockedBy,blocks:p.blocks};return chunk7VD5N6NG_cjs.t.release(p),this.beadCache.set(d,u),u}catch{return null}}),g=await Promise.all(c);r.push(...g.filter(d=>d!==null));}return r})}mapBeadStatus(e){switch(e){case "closed":return "closed";case "in_progress":case "response":case "code":return "in_progress";default:return "open"}}beadsToWasmNodes(e){return e.map(t=>({id:t.id,title:t.title,status:t.status,priority:t.priority,blocked_by:t.blockedBy??[],blocks:t.blocks??[],duration:void 0}))}analyzeWithWasm(e){if(!this.wasmModule)throw new Error("WASM module not available");let t=this.beadsToWasmNodes(e),r=JSON.stringify(t),s=this.wasmModule.has_cycle(r),n=[];if(s){let m=this.wasmModule.find_cycle_nodes(r);n=JSON.parse(m);}let a=this.wasmModule.get_ready_beads(r),i=JSON.parse(a),c=this.wasmModule.compute_levels(r),g=JSON.parse(c),d=new Map;for(let[m,f]of Object.entries(g)){let C=parseInt(m,10);for(let k of f)d.set(k,C);}let y=new Map(e.map(m=>[m.id,m])),p=i.map(m=>{let f=y.get(m);return {id:m,title:f.title,priority:f.priority,level:d.get(m)??0}}),u=new Set(e.filter(m=>m.status==="closed").map(m=>m.id)),v=new Set(e.map(m=>m.id)),_=e.filter(m=>m.status==="closed"?false:(m.blockedBy??[]).some(C=>!u.has(C))).map(m=>{let f=(m.blockedBy??[]).filter(k=>!u.has(k)),C=f.every(k=>v.has(k));return {blockedIssue:m.id,blockers:f,internalBlockers:C}});return {hasCycles:s,cycleIssues:n,readyIssues:p,blockedIssues:_}}analyzeWithJS(e,t){new Map(e.map(d=>[d.id,d]));let s=new Set(t),n=new Set(e.filter(d=>d.status==="closed").map(d=>d.id)),a=this.detectCyclesJS(e),i=a?this.findCycleNodesJS(e):[],c=e.filter(d=>d.status==="closed"?false:(d.blockedBy??[]).every(p=>n.has(p))).map((d,y)=>({id:d.id,title:d.title,priority:d.priority,level:0})),g=e.filter(d=>d.status==="closed"?false:(d.blockedBy??[]).some(p=>!n.has(p))).map(d=>{let y=(d.blockedBy??[]).filter(u=>!n.has(u)),p=y.every(u=>s.has(u));return {blockedIssue:d.id,blockers:y,internalBlockers:p}});return {hasCycles:a,cycleIssues:i,readyIssues:c,blockedIssues:g}}detectCyclesJS(e){let t=new Set,r=new Set,s=new Map(e.map(a=>[a.id,a])),n=a=>{t.add(a),r.add(a);let i=s.get(a);if(i){for(let c of i.blockedBy??[])if(t.has(c)){if(r.has(c))return true}else if(n(c))return true}return r.delete(a),false};for(let a of e)if(!t.has(a.id)&&n(a.id))return true;return false}findCycleNodesJS(e){let t=new Map;new Map(e.map(n=>[n.id,n]));for(let n of e)t.set(n.id,(n.blockedBy??[]).length);let s=true;for(;s;){s=false;for(let[n,a]of t)if(a===0){t.delete(n);for(let i of e)if(i.blockedBy?.includes(n)){let c=t.get(i.id)??0;c>0&&(t.set(i.id,c-1),s=true);}s=true;}}return Array.from(t.keys())}topoSortJS(e){new Map(e.map(a=>[a.id,a]));let r=new Map,s=[];for(let a of e)r.set(a.id,(a.blockedBy??[]).length);let n=[];for(let[a,i]of r)i===0&&n.push(a);for(;n.length>0;){let a=n.shift();s.push(a);for(let i of e)if(i.blockedBy?.includes(a)){let g=(r.get(i.id)??0)-1;r.set(i.id,g),g===0&&n.push(i.id);}}if(s.length!==e.length)throw new chunk7VD5N6NG_cjs.b("Cannot compute execution order: dependency cycle detected",chunk7VD5N6NG_cjs.a.DEPENDENCY_CYCLE);return s}dispose(){this.stopAll(),this.removeAllListeners();}};function ae(l,e){return new S(l,e)}function ie(l,e){return new chunk7VD5N6NG_cjs.Y(()=>new S(l,e),{name:"convoy-observer",cleanup:t=>{t.dispose();}})}function le(l){return {isActive:l.isActive(),watchCount:l.getWatchCount()}}exports.A=fe;exports.B=be;exports.C=Ce;exports.D=I;exports.E=oe;exports.F=S;exports.G=ae;exports.H=ie;exports.I=le;exports.a=de;exports.b=pe;exports.c=N;exports.d=F;exports.e=L;exports.f=G;exports.g=W;exports.h=U;exports.i=J;exports.j=z;exports.k=j;exports.l=Y;exports.m=q;exports.n=V;exports.o=$;exports.p=H;exports.q=P;exports.r=ue;exports.s=Z;exports.t=K;exports.u=ge;exports.v=Q;exports.w=ye;exports.x=me;exports.y=he;exports.z=ve;//# sourceMappingURL=chunk-Q7MLH722.cjs.map
11
+ //# sourceMappingURL=chunk-Q7MLH722.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/convoy/tracker.ts","../src/convoy/observer.ts"],"names":["DEFAULT_CONFIG","GasTownErrorCodes","BeadStatusSchema","z","BeadSchema","CreateBeadOptionsSchema","FormulaTypeSchema","StepSchema","LegSchema","VarSchema","SynthesisSchema","TemplateSchema","AspectSchema","FormulaSchema","ConvoyStatusSchema","ConvoyProgressSchema","ConvoySchema","CreateConvoyOptionsSchema","GasTownAgentRoleSchema","SlingTargetSchema","SlingOptionsSchema","SyncDirectionSchema","GasTownConfigSchema","validateBead","input","validateCreateBeadOptions","validateFormula","validateConvoy","validateCreateConvoyOptions","validateSlingOptions","validateConfig","defaultLogger","msg","meta","ConvoyIdSchema","IssueIdsSchema","ConvoyTracker","EventEmitter","config","logger","name","issues","description","validatedOptions","verifiedIssues","ConvoyError","progress","convoyId","uuidv4","now","convoy","store","GasTownErrorCode","existingSet","newIssues","id","updatedIssues","updatedConvoy","removeSet","remainingIssues","removedIssues","previousProgress","previousStatus","completedConvoy","reason","cancelledConvoy","pausedConvoy","resumedConvoy","status","convoys","issueIds","beads","beadMap","b","closed","inProgress","blocked","issueId","bead","blockerId","blocker","error","verified","cliBead","type","timer","extra","event","createConvoyTracker","ConvoyObserver","LRUCache","BatchDeduplicator","callback","initialInterval","interval","DebouncedEmitter","callbacks","mergedCallback","allComplete","cb","openIssues","inProgressIssues","hasCycles","cycleIssues","readyIssues","blockedIssues","wasmResult","jsResult","wasmNodes","resultJson","result","GasTownError","watcher","emitter","module","currentState","stateChanged","batchKey","uncachedIds","cached","batchSize","i","fetchPromises","pooledBead","beadPool","results","beadsJson","cycleJson","readyJson","readyIds","levelsJson","levels","levelMap","levelStr","ids","level","closedSet","convoySet","blockers","internalBlockers","convoyIssues","index","visited","recStack","dfs","inDegree","changed","degree","current","queue","newDegree","createConvoyObserver","createLazyConvoyObserver","LazyObserver","observer","getLazyObserverStats","lazyObserver"],"mappings":"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","file":"chunk-Q7MLH722.cjs","sourcesContent":["/**\n * Gas Town Bridge Plugin - Type Definitions\n *\n * Core types for Gas Town integration including:\n * - Beads: Git-backed issue tracking with graph semantics\n * - Formulas: TOML-defined workflows (convoy, workflow, expansion, aspect)\n * - Convoys: Work-order tracking for slung work\n * - Steps/Legs: Workflow components\n * - Variables: Template substitution\n *\n * @module gastown-bridge/types\n * @version 0.1.0\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Bead Types (matching Gas Town's beads.db schema)\n// ============================================================================\n\n/**\n * Bead status enumeration\n */\nexport type BeadStatus = 'open' | 'in_progress' | 'closed';\n\n/**\n * Bead - Git-backed issue with graph semantics\n */\nexport interface Bead {\n /** Unique identifier (e.g., \"gt-abc12\") */\n readonly id: string;\n /** Issue title */\n readonly title: string;\n /** Issue description */\n readonly description: string;\n /** Current status */\n readonly status: BeadStatus;\n /** Priority (0 = highest) */\n readonly priority: number;\n /** Issue labels */\n readonly labels: string[];\n /** Parent bead ID (for epics) */\n readonly parentId?: string;\n /** Creation timestamp */\n readonly createdAt: Date;\n /** Last update timestamp */\n readonly updatedAt: Date;\n /** Assigned agent/user */\n readonly assignee?: string;\n /** Gas Town rig name */\n readonly rig?: string;\n /** Blocking beads (dependencies) */\n readonly blockedBy?: string[];\n /** Beads this blocks */\n readonly blocks?: string[];\n}\n\n/**\n * Options for creating a new bead\n */\nexport interface CreateBeadOptions {\n readonly title: string;\n readonly description?: string;\n readonly priority?: number;\n readonly labels?: string[];\n readonly parent?: string;\n readonly rig?: string;\n readonly assignee?: string;\n}\n\n/**\n * Bead dependency relationship\n */\nexport interface BeadDependency {\n readonly child: string;\n readonly parent: string;\n readonly type: 'blocks' | 'relates' | 'duplicates';\n}\n\n// ============================================================================\n// Formula Types (matching Gas Town's formula/types.go)\n// ============================================================================\n\n/**\n * Formula type enumeration\n */\nexport type FormulaType = 'convoy' | 'workflow' | 'expansion' | 'aspect';\n\n/**\n * Workflow step definition\n */\nexport interface Step {\n /** Step identifier */\n readonly id: string;\n /** Step title */\n readonly title: string;\n /** Step description */\n readonly description: string;\n /** Dependencies - step IDs that must complete first */\n readonly needs?: string[];\n /** Estimated duration in minutes */\n readonly duration?: number;\n /** Required capabilities */\n readonly requires?: string[];\n /** Step metadata */\n readonly metadata?: Record<string, unknown>;\n}\n\n/**\n * Convoy leg definition\n */\nexport interface Leg {\n /** Leg identifier */\n readonly id: string;\n /** Leg title */\n readonly title: string;\n /** Focus area */\n readonly focus: string;\n /** Leg description */\n readonly description: string;\n /** Assigned agent type */\n readonly agent?: string;\n /** Leg sequence order */\n readonly order?: number;\n}\n\n/**\n * Formula variable definition\n */\nexport interface Var {\n /** Variable name */\n readonly name: string;\n /** Variable description */\n readonly description?: string;\n /** Default value */\n readonly default?: string;\n /** Whether the variable is required */\n readonly required?: boolean;\n /** Validation pattern (regex) */\n readonly pattern?: string;\n /** Allowed values */\n readonly enum?: string[];\n}\n\n/**\n * Synthesis definition (convoy result combination)\n */\nexport interface Synthesis {\n /** Synthesis strategy */\n readonly strategy: 'merge' | 'sequential' | 'parallel';\n /** Output format */\n readonly format?: string;\n /** Synthesis description */\n readonly description?: string;\n}\n\n/**\n * Template for expansion formulas\n */\nexport interface Template {\n /** Template name */\n readonly name: string;\n /** Template content with variable placeholders */\n readonly content: string;\n /** Output path pattern */\n readonly outputPath?: string;\n}\n\n/**\n * Aspect definition for cross-cutting concerns\n */\nexport interface Aspect {\n /** Aspect name */\n readonly name: string;\n /** Pointcut expression */\n readonly pointcut: string;\n /** Advice to apply */\n readonly advice: string;\n /** Aspect type */\n readonly type: 'before' | 'after' | 'around';\n}\n\n/**\n * Formula - TOML-defined workflow specification\n */\nexport interface Formula {\n /** Formula name */\n readonly name: string;\n /** Formula description */\n readonly description: string;\n /** Formula type */\n readonly type: FormulaType;\n /** Formula version */\n readonly version: number;\n\n // Convoy-specific fields\n /** Convoy legs */\n readonly legs?: Leg[];\n /** Synthesis configuration */\n readonly synthesis?: Synthesis;\n\n // Workflow-specific fields\n /** Workflow steps */\n readonly steps?: Step[];\n /** Variable definitions */\n readonly vars?: Record<string, Var>;\n\n // Expansion-specific fields\n /** Expansion templates */\n readonly templates?: Template[];\n\n // Aspect-specific fields\n /** Cross-cutting aspects */\n readonly aspects?: Aspect[];\n\n /** Formula metadata */\n readonly metadata?: Record<string, unknown>;\n}\n\n/**\n * Cooked formula with variables substituted\n */\nexport interface CookedFormula extends Formula {\n /** When the formula was cooked */\n readonly cookedAt: Date;\n /** Variables used for cooking */\n readonly cookedVars: Record<string, string>;\n /** Original (uncooked) formula name */\n readonly originalName: string;\n}\n\n// ============================================================================\n// Convoy Types\n// ============================================================================\n\n/**\n * Convoy status enumeration\n */\nexport type ConvoyStatus = 'active' | 'landed' | 'failed' | 'paused';\n\n/**\n * Convoy progress tracking\n */\nexport interface ConvoyProgress {\n /** Total issues tracked */\n readonly total: number;\n /** Closed issues */\n readonly closed: number;\n /** In-progress issues */\n readonly inProgress: number;\n /** Blocked issues */\n readonly blocked: number;\n}\n\n/**\n * Convoy - Work order tracking for slung work\n */\nexport interface Convoy {\n /** Convoy identifier */\n readonly id: string;\n /** Convoy name */\n readonly name: string;\n /** Tracked issue IDs */\n readonly trackedIssues: string[];\n /** Convoy status */\n readonly status: ConvoyStatus;\n /** Start timestamp */\n readonly startedAt: Date;\n /** Completion timestamp */\n readonly completedAt?: Date;\n /** Progress tracking */\n readonly progress: ConvoyProgress;\n /** Formula used to create convoy */\n readonly formula?: string;\n /** Description */\n readonly description?: string;\n}\n\n/**\n * Options for creating a convoy\n */\nexport interface CreateConvoyOptions {\n readonly name: string;\n readonly issues: string[];\n readonly description?: string;\n readonly formula?: string;\n}\n\n// ============================================================================\n// Agent Types (Gas Town specific)\n// ============================================================================\n\n/**\n * Gas Town agent role\n */\nexport type GasTownAgentRole =\n | 'mayor'\n | 'polecat'\n | 'refinery'\n | 'witness'\n | 'deacon'\n | 'dog'\n | 'crew';\n\n/**\n * Gas Town agent\n */\nexport interface GasTownAgent {\n /** Agent name */\n readonly name: string;\n /** Agent role */\n readonly role: GasTownAgentRole;\n /** Rig assignment */\n readonly rig?: string;\n /** Current status */\n readonly status: 'active' | 'idle' | 'busy';\n /** Agent capabilities */\n readonly capabilities?: string[];\n}\n\n// ============================================================================\n// Sling Types\n// ============================================================================\n\n/**\n * Sling target type\n */\nexport type SlingTarget = 'polecat' | 'crew' | 'mayor';\n\n/**\n * Sling operation options\n */\nexport interface SlingOptions {\n readonly beadId: string;\n readonly target: SlingTarget;\n readonly formula?: string;\n readonly priority?: number;\n}\n\n// ============================================================================\n// Mail Types\n// ============================================================================\n\n/**\n * Gas Town mail message\n */\nexport interface GasTownMail {\n readonly id: string;\n readonly from: string;\n readonly to: string;\n readonly subject: string;\n readonly body: string;\n readonly sentAt: Date;\n readonly read: boolean;\n}\n\n// ============================================================================\n// Sync Types\n// ============================================================================\n\n/**\n * Sync direction\n */\nexport type SyncDirection = 'pull' | 'push' | 'both';\n\n/**\n * Sync result\n */\nexport interface SyncResult {\n readonly direction: SyncDirection;\n readonly pulled: number;\n readonly pushed: number;\n readonly errors: string[];\n readonly timestamp: Date;\n}\n\n// ============================================================================\n// Graph Types (for dependency resolution)\n// ============================================================================\n\n/**\n * Dependency graph for beads\n */\nexport interface BeadGraph {\n readonly nodes: string[];\n readonly edges: Array<[string, string]>;\n}\n\n/**\n * Topological sort result\n */\nexport interface TopoSortResult {\n readonly sorted: string[];\n readonly hasCycle: boolean;\n readonly cycleNodes?: string[];\n}\n\n/**\n * Critical path result\n */\nexport interface CriticalPathResult {\n readonly path: string[];\n readonly totalDuration: number;\n readonly slack: Map<string, number>;\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Gas Town Bridge plugin configuration\n */\nexport interface GasTownConfig {\n /** Path to Gas Town installation */\n readonly townRoot: string;\n\n /** Enable Beads sync with AgentDB */\n readonly enableBeadsSync: boolean;\n /** Sync interval in milliseconds */\n readonly syncInterval: number;\n\n /** Enable native formula parsing (WASM) */\n readonly nativeFormulas: boolean;\n\n /** Enable convoy tracking */\n readonly enableConvoys: boolean;\n\n /** Auto-create beads from Claude Flow tasks */\n readonly autoCreateBeads: boolean;\n\n /** Enable GUPP integration */\n readonly enableGUPP: boolean;\n /** GUPP check interval in milliseconds */\n readonly guppCheckInterval: number;\n\n /** CLI timeout in milliseconds */\n readonly cliTimeout: number;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: GasTownConfig = {\n townRoot: '~/gt',\n enableBeadsSync: true,\n syncInterval: 60000,\n nativeFormulas: true,\n enableConvoys: true,\n autoCreateBeads: false,\n enableGUPP: false,\n guppCheckInterval: 5000,\n cliTimeout: 30000,\n};\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Gas Town Bridge error codes\n */\nexport const GasTownErrorCodes = {\n CLI_NOT_FOUND: 'GT_CLI_NOT_FOUND',\n CLI_TIMEOUT: 'GT_CLI_TIMEOUT',\n CLI_ERROR: 'GT_CLI_ERROR',\n BEAD_NOT_FOUND: 'GT_BEAD_NOT_FOUND',\n CONVOY_NOT_FOUND: 'GT_CONVOY_NOT_FOUND',\n FORMULA_NOT_FOUND: 'GT_FORMULA_NOT_FOUND',\n FORMULA_PARSE_ERROR: 'GT_FORMULA_PARSE_ERROR',\n WASM_NOT_INITIALIZED: 'GT_WASM_NOT_INITIALIZED',\n SYNC_ERROR: 'GT_SYNC_ERROR',\n DEPENDENCY_CYCLE: 'GT_DEPENDENCY_CYCLE',\n INVALID_SLING_TARGET: 'GT_INVALID_SLING_TARGET',\n} as const;\n\nexport type GasTownErrorCode = (typeof GasTownErrorCodes)[keyof typeof GasTownErrorCodes];\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Bead status schema\n */\nexport const BeadStatusSchema = z.enum(['open', 'in_progress', 'closed']);\n\n/**\n * Bead schema\n */\nexport const BeadSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string(),\n status: BeadStatusSchema,\n priority: z.number().int().min(0),\n labels: z.array(z.string()),\n parentId: z.string().optional(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n assignee: z.string().optional(),\n rig: z.string().optional(),\n blockedBy: z.array(z.string()).optional(),\n blocks: z.array(z.string()).optional(),\n});\n\n/**\n * Create bead options schema\n */\nexport const CreateBeadOptionsSchema = z.object({\n title: z.string().min(1),\n description: z.string().optional(),\n priority: z.number().int().min(0).optional(),\n labels: z.array(z.string()).optional(),\n parent: z.string().optional(),\n rig: z.string().optional(),\n assignee: z.string().optional(),\n});\n\n/**\n * Formula type schema\n */\nexport const FormulaTypeSchema = z.enum(['convoy', 'workflow', 'expansion', 'aspect']);\n\n/**\n * Step schema\n */\nexport const StepSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n description: z.string(),\n needs: z.array(z.string()).optional(),\n duration: z.number().optional(),\n requires: z.array(z.string()).optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Leg schema\n */\nexport const LegSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1),\n focus: z.string(),\n description: z.string(),\n agent: z.string().optional(),\n order: z.number().optional(),\n});\n\n/**\n * Variable schema\n */\nexport const VarSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n default: z.string().optional(),\n required: z.boolean().optional(),\n pattern: z.string().optional(),\n enum: z.array(z.string()).optional(),\n});\n\n/**\n * Synthesis schema\n */\nexport const SynthesisSchema = z.object({\n strategy: z.enum(['merge', 'sequential', 'parallel']),\n format: z.string().optional(),\n description: z.string().optional(),\n});\n\n/**\n * Template schema\n */\nexport const TemplateSchema = z.object({\n name: z.string().min(1),\n content: z.string(),\n outputPath: z.string().optional(),\n});\n\n/**\n * Aspect schema\n */\nexport const AspectSchema = z.object({\n name: z.string().min(1),\n pointcut: z.string(),\n advice: z.string(),\n type: z.enum(['before', 'after', 'around']),\n});\n\n/**\n * Formula schema\n */\nexport const FormulaSchema = z.object({\n name: z.string().min(1),\n description: z.string(),\n type: FormulaTypeSchema,\n version: z.number().int().min(1),\n legs: z.array(LegSchema).optional(),\n synthesis: SynthesisSchema.optional(),\n steps: z.array(StepSchema).optional(),\n vars: z.record(VarSchema).optional(),\n templates: z.array(TemplateSchema).optional(),\n aspects: z.array(AspectSchema).optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Convoy status schema\n */\nexport const ConvoyStatusSchema = z.enum(['active', 'landed', 'failed', 'paused']);\n\n/**\n * Convoy progress schema\n */\nexport const ConvoyProgressSchema = z.object({\n total: z.number().int().min(0),\n closed: z.number().int().min(0),\n inProgress: z.number().int().min(0),\n blocked: z.number().int().min(0),\n});\n\n/**\n * Convoy schema\n */\nexport const ConvoySchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n trackedIssues: z.array(z.string()),\n status: ConvoyStatusSchema,\n startedAt: z.coerce.date(),\n completedAt: z.coerce.date().optional(),\n progress: ConvoyProgressSchema,\n formula: z.string().optional(),\n description: z.string().optional(),\n});\n\n/**\n * Create convoy options schema\n */\nexport const CreateConvoyOptionsSchema = z.object({\n name: z.string().min(1),\n issues: z.array(z.string()).min(1),\n description: z.string().optional(),\n formula: z.string().optional(),\n});\n\n/**\n * Gas Town agent role schema\n */\nexport const GasTownAgentRoleSchema = z.enum([\n 'mayor',\n 'polecat',\n 'refinery',\n 'witness',\n 'deacon',\n 'dog',\n 'crew',\n]);\n\n/**\n * Sling target schema\n */\nexport const SlingTargetSchema = z.enum(['polecat', 'crew', 'mayor']);\n\n/**\n * Sling options schema\n */\nexport const SlingOptionsSchema = z.object({\n beadId: z.string().min(1),\n target: SlingTargetSchema,\n formula: z.string().optional(),\n priority: z.number().int().min(0).optional(),\n});\n\n/**\n * Sync direction schema\n */\nexport const SyncDirectionSchema = z.enum(['pull', 'push', 'both']);\n\n/**\n * Configuration schema\n */\nexport const GasTownConfigSchema = z.object({\n townRoot: z.string().default('~/gt'),\n enableBeadsSync: z.boolean().default(true),\n syncInterval: z.number().int().positive().default(60000),\n nativeFormulas: z.boolean().default(true),\n enableConvoys: z.boolean().default(true),\n autoCreateBeads: z.boolean().default(false),\n enableGUPP: z.boolean().default(false),\n guppCheckInterval: z.number().int().positive().default(5000),\n cliTimeout: z.number().int().positive().default(30000),\n});\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Validate bead\n */\nexport function validateBead(input: unknown): Bead {\n return BeadSchema.parse(input) as Bead;\n}\n\n/**\n * Validate create bead options\n */\nexport function validateCreateBeadOptions(input: unknown): CreateBeadOptions {\n return CreateBeadOptionsSchema.parse(input);\n}\n\n/**\n * Validate formula\n */\nexport function validateFormula(input: unknown): Formula {\n return FormulaSchema.parse(input) as Formula;\n}\n\n/**\n * Validate convoy\n */\nexport function validateConvoy(input: unknown): Convoy {\n return ConvoySchema.parse(input) as Convoy;\n}\n\n/**\n * Validate create convoy options\n */\nexport function validateCreateConvoyOptions(input: unknown): CreateConvoyOptions {\n return CreateConvoyOptionsSchema.parse(input);\n}\n\n/**\n * Validate sling options\n */\nexport function validateSlingOptions(input: unknown): SlingOptions {\n return SlingOptionsSchema.parse(input);\n}\n\n/**\n * Validate configuration\n */\nexport function validateConfig(input: unknown): GasTownConfig {\n return GasTownConfigSchema.parse(input);\n}\n\n// ============================================================================\n// Additional Types for MCP Tools\n// ============================================================================\n\n/**\n * Dependency action type\n */\nexport type DepAction = 'add' | 'remove';\n\n/**\n * Convoy action type\n */\nexport type ConvoyAction = 'create' | 'track' | 'land' | 'pause' | 'resume';\n\n/**\n * Mail action type\n */\nexport type MailAction = 'send' | 'read' | 'list';\n\n/**\n * Agent role type (alias for GasTownAgentRole)\n */\nexport type AgentRole = GasTownAgentRole;\n\n/**\n * Target agent type (alias for SlingTarget)\n */\nexport type TargetAgent = SlingTarget;\n\n/**\n * Convoy strategy type\n */\nexport type ConvoyStrategy = 'parallel' | 'serial' | 'hybrid' | 'fastest' | 'balanced' | 'throughput' | 'minimal_context_switches';\n\n/**\n * Dependency action type (for graph operations)\n */\nexport type DependencyAction = 'topo_sort' | 'cycle_detect' | 'critical_path';\n\n/**\n * Formula AST (Abstract Syntax Tree) - alias for Formula\n */\nexport type FormulaAST = Formula;\n\n/**\n * Dependency resolution result\n */\nexport interface DependencyResolution {\n readonly action: DependencyAction;\n readonly sorted?: string[];\n readonly hasCycle?: boolean;\n readonly cycleNodes?: string[];\n readonly criticalPath?: string[];\n readonly totalDuration?: number;\n}\n\n/**\n * Pattern match result\n */\nexport interface PatternMatch {\n readonly index: number;\n readonly candidate: string;\n readonly similarity: number;\n}\n\n/**\n * Convoy optimization result\n */\nexport interface ConvoyOptimization {\n readonly convoyId: string;\n readonly strategy: string;\n readonly executionOrder: string[];\n readonly parallelGroups: string[][];\n readonly estimatedDuration: number;\n}\n\n// ============================================================================\n// Interface Types for MCP Tools\n// ============================================================================\n\n/**\n * Gas Town Bridge interface\n */\nexport interface IGasTownBridge {\n createBead(opts: CreateBeadOptions): Promise<Bead>;\n getReady(limit?: number, rig?: string, labels?: string[]): Promise<Bead[]>;\n showBead(beadId: string): Promise<{ bead: Bead; dependencies: string[]; dependents: string[] }>;\n manageDependency(action: DepAction, child: string, parent: string): Promise<void>;\n createConvoy(opts: CreateConvoyOptions): Promise<Convoy>;\n getConvoyStatus(convoyId?: string, detailed?: boolean): Promise<Convoy[]>;\n trackConvoy(convoyId: string, action: 'add' | 'remove', issues: string[]): Promise<void>;\n listFormulas(type?: FormulaType, includeBuiltin?: boolean): Promise<Array<{ name: string; type: FormulaType; description: string; builtin: boolean }>>;\n cookFormula(formula: Formula | string, vars: Record<string, string>): Promise<CookedFormula>;\n executeFormula(formula: Formula | string, vars: Record<string, string>, targetAgent?: string, dryRun?: boolean): Promise<{ beads_created: string[] }>;\n createFormula(opts: { name: string; type: FormulaType; steps?: Step[]; vars?: Record<string, unknown>; description?: string }): Promise<{ path: string }>;\n sling(beadId: string, target: SlingTarget, formula?: string, priority?: number): Promise<void>;\n listAgents(rig?: string, role?: AgentRole, includeInactive?: boolean): Promise<GasTownAgent[]>;\n sendMail(to: string, subject: string, body: string): Promise<string>;\n readMail(mailId: string): Promise<GasTownMail>;\n listMail(limit?: number): Promise<GasTownMail[]>;\n}\n\n/**\n * Beads sync service interface\n */\nexport interface IBeadsSyncService {\n pullBeads(rig?: string, namespace?: string): Promise<{ synced: number; conflicts: number }>;\n pushTasks(namespace?: string): Promise<{ pushed: number; conflicts: number }>;\n}\n\n/**\n * Formula WASM interface\n */\nexport interface IFormulaWasm {\n isInitialized(): boolean;\n initialize(): Promise<void>;\n parseFormula(content: string, validate?: boolean): Promise<Formula>;\n cookFormula(formula: Formula | string, vars: Record<string, string>, isContent?: boolean): Promise<CookedFormula>;\n cookBatch(formulas: Array<{ name: string; content: string }>, vars: Record<string, string>[], continueOnError?: boolean): Promise<{ cooked: CookedFormula[]; errors: Array<{ index: number; error: string }> }>;\n}\n\n/**\n * Dependency WASM interface\n */\nexport interface IDependencyWasm {\n isInitialized(): boolean;\n initialize(): Promise<void>;\n resolveDependencies(beads: Array<{ id: string; dependencies?: string[] }>, action: DependencyAction): Promise<DependencyResolution>;\n matchPatterns(query: string, candidates: string[], k: number, threshold: number): Promise<PatternMatch[]>;\n optimizeConvoy(convoy: { id: string; trackedIssues: string[] }, strategy: ConvoyStrategy, constraints?: unknown): Promise<ConvoyOptimization>;\n}\n","/**\n * Convoy Tracker\n *\n * Manages convoy lifecycle including creation, modification, progress\n * tracking, and completion. Convoys are work-order groups that track\n * related beads (issues) through their lifecycle.\n *\n * Features:\n * - Create and manage convoy groups\n * - Add/remove beads to convoys\n * - Track progress and status changes\n * - Event emission for status transitions\n * - Integration with bd-bridge for bead operations\n *\n * @module gastown-bridge/convoy/tracker\n */\n\nimport { EventEmitter } from 'events';\nimport { z } from 'zod';\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n Convoy,\n ConvoyStatus,\n ConvoyProgress,\n CreateConvoyOptions,\n Bead,\n BeadStatus,\n} from '../types.js';\nimport {\n ConvoySchema,\n CreateConvoyOptionsSchema,\n} from '../types.js';\nimport { BdBridge, type BeadQuery } from '../bridges/bd-bridge.js';\nimport { ConvoyError, GasTownErrorCode, wrapError } from '../errors.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Convoy event types\n */\nexport type ConvoyEventType =\n | 'convoy:created'\n | 'convoy:started'\n | 'convoy:progressed'\n | 'convoy:completed'\n | 'convoy:cancelled'\n | 'convoy:paused'\n | 'convoy:resumed'\n | 'convoy:issue:added'\n | 'convoy:issue:removed'\n | 'convoy:issue:updated';\n\n/**\n * Convoy event payload\n */\nexport interface ConvoyEvent {\n /** Event type */\n type: ConvoyEventType;\n /** Convoy ID */\n convoyId: string;\n /** Convoy name */\n convoyName: string;\n /** Event timestamp */\n timestamp: Date;\n /** Previous status (for status change events) */\n previousStatus?: ConvoyStatus;\n /** Current status */\n status: ConvoyStatus;\n /** Progress at time of event */\n progress: ConvoyProgress;\n /** Issue IDs affected (for issue events) */\n issues?: string[];\n /** Cancellation reason (for cancelled events) */\n reason?: string;\n /** Additional metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Convoy tracker configuration\n */\nexport interface ConvoyTrackerConfig {\n /** BD bridge instance for bead operations */\n bdBridge: BdBridge;\n /** Auto-update progress on issue changes */\n autoUpdateProgress?: boolean;\n /** Progress update interval in milliseconds */\n progressUpdateInterval?: number;\n /** Enable persistent storage */\n persistConvoys?: boolean;\n /** Storage path for convoy data */\n storagePath?: string;\n}\n\n/**\n * Internal convoy storage\n */\ninterface ConvoyStore {\n convoy: Convoy;\n createdAt: Date;\n updatedAt: Date;\n metadata: Record<string, unknown>;\n}\n\n/**\n * Logger interface\n */\nexport interface ConvoyLogger {\n debug: (msg: string, meta?: Record<string, unknown>) => void;\n info: (msg: string, meta?: Record<string, unknown>) => void;\n warn: (msg: string, meta?: Record<string, unknown>) => void;\n error: (msg: string, meta?: Record<string, unknown>) => void;\n}\n\n// ============================================================================\n// Default Logger\n// ============================================================================\n\nconst defaultLogger: ConvoyLogger = {\n debug: (msg, meta) => console.debug(`[convoy-tracker] ${msg}`, meta ?? ''),\n info: (msg, meta) => console.info(`[convoy-tracker] ${msg}`, meta ?? ''),\n warn: (msg, meta) => console.warn(`[convoy-tracker] ${msg}`, meta ?? ''),\n error: (msg, meta) => console.error(`[convoy-tracker] ${msg}`, meta ?? ''),\n};\n\n// ============================================================================\n// Validation Schemas\n// ============================================================================\n\n/**\n * Convoy ID schema\n */\nconst ConvoyIdSchema = z.string()\n .uuid('Invalid convoy ID format');\n\n/**\n * Issue ID array schema\n */\nconst IssueIdsSchema = z.array(z.string().min(1))\n .min(1, 'At least one issue ID required');\n\n// ============================================================================\n// Convoy Tracker Implementation\n// ============================================================================\n\n/**\n * Convoy Tracker\n *\n * Manages convoy lifecycle and tracks progress of grouped work.\n *\n * @example\n * ```typescript\n * const tracker = new ConvoyTracker({\n * bdBridge: await createBdBridge().initialize(),\n * });\n *\n * // Create a convoy\n * const convoy = await tracker.create(\n * 'Sprint 1',\n * ['gt-abc12', 'gt-def34', 'gt-ghi56'],\n * 'First sprint tasks'\n * );\n *\n * // Monitor progress\n * tracker.on('convoy:progressed', (event) => {\n * console.log(`Progress: ${event.progress.closed}/${event.progress.total}`);\n * });\n *\n * // Check status\n * const status = await tracker.getStatus(convoy.id);\n * ```\n */\nexport class ConvoyTracker extends EventEmitter {\n private bdBridge: BdBridge;\n private convoys: Map<string, ConvoyStore> = new Map();\n private logger: ConvoyLogger;\n private config: Required<Omit<ConvoyTrackerConfig, 'bdBridge'>>;\n private progressTimers: Map<string, NodeJS.Timeout> = new Map();\n\n constructor(config: ConvoyTrackerConfig, logger?: ConvoyLogger) {\n super();\n this.bdBridge = config.bdBridge;\n this.logger = logger ?? defaultLogger;\n this.config = {\n autoUpdateProgress: config.autoUpdateProgress ?? true,\n progressUpdateInterval: config.progressUpdateInterval ?? 30000,\n persistConvoys: config.persistConvoys ?? false,\n storagePath: config.storagePath ?? './data/convoys',\n };\n }\n\n /**\n * Create a new convoy\n *\n * @param name - Convoy name\n * @param issues - Issue IDs to include\n * @param description - Optional description\n * @returns Created convoy\n */\n async create(\n name: string,\n issues: string[],\n description?: string\n ): Promise<Convoy> {\n // Validate inputs\n const validatedOptions = CreateConvoyOptionsSchema.parse({\n name,\n issues,\n description,\n });\n\n // Verify issues exist\n const verifiedIssues = await this.verifyIssues(validatedOptions.issues);\n if (verifiedIssues.length === 0) {\n throw ConvoyError.createFailed('No valid issues found');\n }\n\n // Calculate initial progress\n const progress = await this.calculateProgress(verifiedIssues);\n\n // Create convoy\n const convoyId = uuidv4();\n const now = new Date();\n\n const convoy: Convoy = {\n id: convoyId,\n name: validatedOptions.name,\n trackedIssues: verifiedIssues,\n status: 'active',\n startedAt: now,\n progress,\n description: validatedOptions.description,\n };\n\n // Store convoy\n this.convoys.set(convoyId, {\n convoy,\n createdAt: now,\n updatedAt: now,\n metadata: {},\n });\n\n // Emit creation event\n this.emitConvoyEvent('convoy:created', convoy);\n\n // Start progress tracking if enabled\n if (this.config.autoUpdateProgress) {\n this.startProgressTracking(convoyId);\n }\n\n this.logger.info('Convoy created', {\n convoyId,\n name,\n issueCount: verifiedIssues.length,\n });\n\n return convoy;\n }\n\n /**\n * Add issues to an existing convoy\n *\n * @param convoyId - Convoy ID\n * @param issues - Issue IDs to add\n * @returns Updated convoy\n */\n async addIssues(convoyId: string, issues: string[]): Promise<Convoy> {\n // Validate inputs\n ConvoyIdSchema.parse(convoyId);\n IssueIdsSchema.parse(issues);\n\n const store = this.convoys.get(convoyId);\n if (!store) {\n throw ConvoyError.notFound(convoyId);\n }\n\n // Verify issues\n const verifiedIssues = await this.verifyIssues(issues);\n if (verifiedIssues.length === 0) {\n throw new ConvoyError(\n 'No valid issues to add',\n GasTownErrorCode.CONVOY_CREATE_FAILED,\n { convoyId, issues }\n );\n }\n\n // Add new issues (avoid duplicates)\n const existingSet = new Set(store.convoy.trackedIssues);\n const newIssues = verifiedIssues.filter(id => !existingSet.has(id));\n\n if (newIssues.length === 0) {\n return store.convoy;\n }\n\n // Update convoy\n const updatedIssues = [...store.convoy.trackedIssues, ...newIssues];\n const progress = await this.calculateProgress(updatedIssues);\n\n const updatedConvoy: Convoy = {\n ...store.convoy,\n trackedIssues: updatedIssues,\n progress,\n };\n\n store.convoy = updatedConvoy;\n store.updatedAt = new Date();\n\n // Emit event\n this.emitConvoyEvent('convoy:issue:added', updatedConvoy, {\n issues: newIssues,\n });\n\n this.logger.info('Issues added to convoy', {\n convoyId,\n addedCount: newIssues.length,\n totalCount: updatedIssues.length,\n });\n\n return updatedConvoy;\n }\n\n /**\n * Remove issues from a convoy\n *\n * @param convoyId - Convoy ID\n * @param issues - Issue IDs to remove\n * @returns Updated convoy\n */\n async removeIssues(convoyId: string, issues: string[]): Promise<Convoy> {\n // Validate inputs\n ConvoyIdSchema.parse(convoyId);\n IssueIdsSchema.parse(issues);\n\n const store = this.convoys.get(convoyId);\n if (!store) {\n throw ConvoyError.notFound(convoyId);\n }\n\n // Remove issues\n const removeSet = new Set(issues);\n const remainingIssues = store.convoy.trackedIssues.filter(\n id => !removeSet.has(id)\n );\n\n if (remainingIssues.length === store.convoy.trackedIssues.length) {\n return store.convoy;\n }\n\n // Recalculate progress\n const progress = remainingIssues.length > 0\n ? await this.calculateProgress(remainingIssues)\n : { total: 0, closed: 0, inProgress: 0, blocked: 0 };\n\n const updatedConvoy: Convoy = {\n ...store.convoy,\n trackedIssues: remainingIssues,\n progress,\n };\n\n store.convoy = updatedConvoy;\n store.updatedAt = new Date();\n\n // Emit event\n const removedIssues = issues.filter(id =>\n store.convoy.trackedIssues.includes(id) && !remainingIssues.includes(id)\n );\n\n this.emitConvoyEvent('convoy:issue:removed', updatedConvoy, {\n issues: removedIssues,\n });\n\n this.logger.info('Issues removed from convoy', {\n convoyId,\n removedCount: removedIssues.length,\n remainingCount: remainingIssues.length,\n });\n\n return updatedConvoy;\n }\n\n /**\n * Get convoy status\n *\n * @param convoyId - Convoy ID\n * @returns Convoy with updated progress\n */\n async getStatus(convoyId: string): Promise<Convoy> {\n ConvoyIdSchema.parse(convoyId);\n\n const store = this.convoys.get(convoyId);\n if (!store) {\n throw ConvoyError.notFound(convoyId);\n }\n\n // Refresh progress\n const progress = await this.calculateProgress(store.convoy.trackedIssues);\n const previousProgress = store.convoy.progress;\n\n // Check if progress changed\n if (\n progress.closed !== previousProgress.closed ||\n progress.inProgress !== previousProgress.inProgress ||\n progress.blocked !== previousProgress.blocked\n ) {\n const updatedConvoy: Convoy = {\n ...store.convoy,\n progress,\n };\n\n store.convoy = updatedConvoy;\n store.updatedAt = new Date();\n\n this.emitConvoyEvent('convoy:progressed', updatedConvoy);\n }\n\n return store.convoy;\n }\n\n /**\n * Mark convoy as complete\n *\n * @param convoyId - Convoy ID\n * @returns Completed convoy\n */\n async complete(convoyId: string): Promise<Convoy> {\n ConvoyIdSchema.parse(convoyId);\n\n const store = this.convoys.get(convoyId);\n if (!store) {\n throw ConvoyError.notFound(convoyId);\n }\n\n if (store.convoy.status === 'landed') {\n return store.convoy;\n }\n\n const previousStatus = store.convoy.status;\n const now = new Date();\n\n const completedConvoy: Convoy = {\n ...store.convoy,\n status: 'landed',\n completedAt: now,\n };\n\n store.convoy = completedConvoy;\n store.updatedAt = now;\n\n // Stop progress tracking\n this.stopProgressTracking(convoyId);\n\n // Emit event\n this.emitConvoyEvent('convoy:completed', completedConvoy, {\n previousStatus,\n });\n\n this.logger.info('Convoy completed', {\n convoyId,\n name: completedConvoy.name,\n duration: now.getTime() - completedConvoy.startedAt.getTime(),\n });\n\n return completedConvoy;\n }\n\n /**\n * Cancel a convoy\n *\n * @param convoyId - Convoy ID\n * @param reason - Cancellation reason\n * @returns Cancelled convoy\n */\n async cancel(convoyId: string, reason?: string): Promise<Convoy> {\n ConvoyIdSchema.parse(convoyId);\n\n const store = this.convoys.get(convoyId);\n if (!store) {\n throw ConvoyError.notFound(convoyId);\n }\n\n if (store.convoy.status === 'failed' || store.convoy.status === 'landed') {\n return store.convoy;\n }\n\n const previousStatus = store.convoy.status;\n const now = new Date();\n\n const cancelledConvoy: Convoy = {\n ...store.convoy,\n status: 'failed',\n completedAt: now,\n };\n\n store.convoy = cancelledConvoy;\n store.updatedAt = now;\n store.metadata.cancellationReason = reason;\n\n // Stop progress tracking\n this.stopProgressTracking(convoyId);\n\n // Emit event\n this.emitConvoyEvent('convoy:cancelled', cancelledConvoy, {\n previousStatus,\n reason,\n });\n\n this.logger.info('Convoy cancelled', {\n convoyId,\n name: cancelledConvoy.name,\n reason,\n });\n\n return cancelledConvoy;\n }\n\n /**\n * Pause a convoy\n *\n * @param convoyId - Convoy ID\n * @returns Paused convoy\n */\n async pause(convoyId: string): Promise<Convoy> {\n ConvoyIdSchema.parse(convoyId);\n\n const store = this.convoys.get(convoyId);\n if (!store) {\n throw ConvoyError.notFound(convoyId);\n }\n\n if (store.convoy.status !== 'active') {\n return store.convoy;\n }\n\n const previousStatus = store.convoy.status;\n\n const pausedConvoy: Convoy = {\n ...store.convoy,\n status: 'paused',\n };\n\n store.convoy = pausedConvoy;\n store.updatedAt = new Date();\n\n // Stop progress tracking while paused\n this.stopProgressTracking(convoyId);\n\n // Emit event\n this.emitConvoyEvent('convoy:paused', pausedConvoy, {\n previousStatus,\n });\n\n this.logger.info('Convoy paused', {\n convoyId,\n name: pausedConvoy.name,\n });\n\n return pausedConvoy;\n }\n\n /**\n * Resume a paused convoy\n *\n * @param convoyId - Convoy ID\n * @returns Resumed convoy\n */\n async resume(convoyId: string): Promise<Convoy> {\n ConvoyIdSchema.parse(convoyId);\n\n const store = this.convoys.get(convoyId);\n if (!store) {\n throw ConvoyError.notFound(convoyId);\n }\n\n if (store.convoy.status !== 'paused') {\n return store.convoy;\n }\n\n const previousStatus = store.convoy.status;\n\n const resumedConvoy: Convoy = {\n ...store.convoy,\n status: 'active',\n };\n\n store.convoy = resumedConvoy;\n store.updatedAt = new Date();\n\n // Resume progress tracking\n if (this.config.autoUpdateProgress) {\n this.startProgressTracking(convoyId);\n }\n\n // Emit event\n this.emitConvoyEvent('convoy:resumed', resumedConvoy, {\n previousStatus,\n });\n\n this.logger.info('Convoy resumed', {\n convoyId,\n name: resumedConvoy.name,\n });\n\n return resumedConvoy;\n }\n\n /**\n * List all convoys\n *\n * @param status - Optional status filter\n * @returns Array of convoys\n */\n listConvoys(status?: ConvoyStatus): Convoy[] {\n const convoys = Array.from(this.convoys.values())\n .map(store => store.convoy);\n\n if (status) {\n return convoys.filter(convoy => convoy.status === status);\n }\n\n return convoys;\n }\n\n /**\n * Get convoy by ID\n *\n * @param convoyId - Convoy ID\n * @returns Convoy or undefined\n */\n getConvoy(convoyId: string): Convoy | undefined {\n return this.convoys.get(convoyId)?.convoy;\n }\n\n /**\n * Delete a convoy\n *\n * @param convoyId - Convoy ID\n * @returns True if deleted\n */\n deleteConvoy(convoyId: string): boolean {\n this.stopProgressTracking(convoyId);\n return this.convoys.delete(convoyId);\n }\n\n /**\n * Calculate progress for a set of issues\n */\n private async calculateProgress(issueIds: string[]): Promise<ConvoyProgress> {\n if (issueIds.length === 0) {\n return { total: 0, closed: 0, inProgress: 0, blocked: 0 };\n }\n\n try {\n // Fetch beads\n const beads = await this.fetchBeads(issueIds);\n const beadMap = new Map(beads.map(b => [b.id, b]));\n\n let closed = 0;\n let inProgress = 0;\n let blocked = 0;\n\n for (const issueId of issueIds) {\n const bead = beadMap.get(issueId);\n if (!bead) continue;\n\n if (bead.status === 'closed') {\n closed++;\n } else if (bead.status === 'in_progress') {\n inProgress++;\n }\n\n // Check if blocked\n if (bead.blockedBy && bead.blockedBy.length > 0) {\n const hasOpenBlocker = bead.blockedBy.some(blockerId => {\n const blocker = beadMap.get(blockerId);\n return blocker && blocker.status !== 'closed';\n });\n if (hasOpenBlocker) {\n blocked++;\n }\n }\n }\n\n return {\n total: issueIds.length,\n closed,\n inProgress,\n blocked,\n };\n } catch (error) {\n this.logger.warn('Failed to calculate progress', {\n issueIds,\n error: error instanceof Error ? error.message : String(error),\n });\n\n return {\n total: issueIds.length,\n closed: 0,\n inProgress: 0,\n blocked: 0,\n };\n }\n }\n\n /**\n * Verify issues exist\n */\n private async verifyIssues(issueIds: string[]): Promise<string[]> {\n const verified: string[] = [];\n\n for (const id of issueIds) {\n try {\n await this.bdBridge.getBead(id);\n verified.push(id);\n } catch {\n this.logger.warn('Issue not found', { issueId: id });\n }\n }\n\n return verified;\n }\n\n /**\n * Fetch beads by IDs\n */\n private async fetchBeads(issueIds: string[]): Promise<Bead[]> {\n const beads: Bead[] = [];\n\n for (const id of issueIds) {\n try {\n const cliBead = await this.bdBridge.getBead(id);\n // Convert CLI bead to Gas Town bead\n beads.push({\n id: cliBead.id,\n title: cliBead.content.slice(0, 100),\n description: cliBead.content,\n status: this.mapBeadStatus(cliBead.type),\n priority: 0,\n labels: cliBead.tags ?? [],\n createdAt: cliBead.timestamp ? new Date(cliBead.timestamp) : new Date(),\n updatedAt: new Date(),\n blockedBy: cliBead.parentId ? [cliBead.parentId] : [],\n });\n } catch {\n // Skip invalid beads\n }\n }\n\n return beads;\n }\n\n /**\n * Map CLI bead type to Gas Town status\n */\n private mapBeadStatus(type: string): BeadStatus {\n switch (type) {\n case 'closed':\n return 'closed';\n case 'in_progress':\n case 'response':\n case 'code':\n return 'in_progress';\n default:\n return 'open';\n }\n }\n\n /**\n * Start progress tracking timer\n */\n private startProgressTracking(convoyId: string): void {\n if (this.progressTimers.has(convoyId)) {\n return;\n }\n\n const timer = setInterval(async () => {\n try {\n await this.getStatus(convoyId);\n } catch (error) {\n this.logger.warn('Progress tracking error', {\n convoyId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }, this.config.progressUpdateInterval);\n\n this.progressTimers.set(convoyId, timer);\n }\n\n /**\n * Stop progress tracking timer\n */\n private stopProgressTracking(convoyId: string): void {\n const timer = this.progressTimers.get(convoyId);\n if (timer) {\n clearInterval(timer);\n this.progressTimers.delete(convoyId);\n }\n }\n\n /**\n * Emit convoy event\n */\n private emitConvoyEvent(\n type: ConvoyEventType,\n convoy: Convoy,\n extra?: Partial<ConvoyEvent>\n ): void {\n const event: ConvoyEvent = {\n type,\n convoyId: convoy.id,\n convoyName: convoy.name,\n timestamp: new Date(),\n status: convoy.status,\n progress: convoy.progress,\n ...extra,\n };\n\n this.emit(type, event);\n this.emit('convoy:*', event);\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n for (const [convoyId, timer] of this.progressTimers) {\n clearInterval(timer);\n }\n this.progressTimers.clear();\n this.removeAllListeners();\n }\n}\n\n/**\n * Create a new convoy tracker instance\n */\nexport function createConvoyTracker(\n config: ConvoyTrackerConfig,\n logger?: ConvoyLogger\n): ConvoyTracker {\n return new ConvoyTracker(config, logger);\n}\n\nexport default ConvoyTracker;\n","/**\n * Convoy Observer\n *\n * Monitors convoy completion by observing issue state changes\n * and detecting when all tracked issues are complete. Uses\n * WASM-accelerated graph analysis for dependency resolution.\n *\n * Features:\n * - Watch convoys for completion\n * - Detect blocking issues\n * - Identify ready-to-work issues\n * - WASM-accelerated dependency graph analysis\n * - Configurable polling intervals\n *\n * @module gastown-bridge/convoy/observer\n */\n\nimport { EventEmitter } from 'events';\nimport { z } from 'zod';\nimport type {\n Convoy,\n ConvoyProgress,\n Bead,\n BeadStatus,\n BeadGraph,\n TopoSortResult,\n} from '../types.js';\nimport { BdBridge } from '../bridges/bd-bridge.js';\nimport { ConvoyTracker } from './tracker.js';\nimport { ConvoyError, GasTownErrorCode, GasTownError } from '../errors.js';\nimport { LRUCache, DebouncedEmitter, BatchDeduplicator } from '../cache.js';\nimport {\n beadPool,\n PooledBead,\n LazyObserver,\n type LazyStats,\n} from '../memory/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * WASM graph module interface\n */\nexport interface WasmGraphModule {\n /** Check if dependency graph has cycles */\n has_cycle(beadsJson: string): boolean;\n /** Find nodes participating in cycles */\n find_cycle_nodes(beadsJson: string): string;\n /** Get beads with no unresolved dependencies */\n get_ready_beads(beadsJson: string): string;\n /** Compute execution levels for parallel processing */\n compute_levels(beadsJson: string): string;\n /** Topological sort of beads */\n topo_sort(beadsJson: string): string;\n /** Critical path analysis */\n critical_path(beadsJson: string): string;\n}\n\n/**\n * Bead node for WASM operations\n */\ninterface WasmBeadNode {\n id: string;\n title: string;\n status: string;\n priority: number;\n blocked_by: string[];\n blocks: string[];\n duration?: number;\n}\n\n/**\n * Completion callback signature\n */\nexport type CompletionCallback = (convoy: Convoy, allComplete: boolean) => void;\n\n/**\n * Observer watch handle\n */\nexport interface WatchHandle {\n /** Convoy ID being watched */\n convoyId: string;\n /** Stop watching */\n stop(): void;\n /** Check if still watching */\n isActive(): boolean;\n}\n\n/**\n * Observer configuration\n */\nexport interface ConvoyObserverConfig {\n /** BD bridge instance */\n bdBridge: BdBridge;\n /** Convoy tracker instance */\n tracker: ConvoyTracker;\n /** Optional WASM graph module */\n wasmModule?: WasmGraphModule;\n /** Initial polling interval in milliseconds */\n pollInterval?: number;\n /** Maximum poll attempts before giving up */\n maxPollAttempts?: number;\n /** Enable WASM acceleration (falls back to JS if unavailable) */\n useWasm?: boolean;\n /** Enable exponential backoff for polling */\n useExponentialBackoff?: boolean;\n /** Maximum backoff interval in milliseconds */\n maxBackoffInterval?: number;\n /** Backoff multiplier (default: 1.5) */\n backoffMultiplier?: number;\n /** Enable delta-based updates (only emit on changes) */\n deltaUpdatesOnly?: boolean;\n /** Debounce interval for progress updates in milliseconds */\n progressDebounceMs?: number;\n}\n\n/**\n * Blocker information\n */\nexport interface BlockerInfo {\n /** Issue ID that is blocked */\n blockedIssue: string;\n /** Issue IDs that are blocking */\n blockers: string[];\n /** True if blockers are from within the convoy */\n internalBlockers: boolean;\n}\n\n/**\n * Ready issue information\n */\nexport interface ReadyIssueInfo {\n /** Issue ID */\n id: string;\n /** Issue title */\n title: string;\n /** Priority */\n priority: number;\n /** Execution level (for parallel processing) */\n level: number;\n}\n\n/**\n * Completion check result\n */\nexport interface CompletionCheckResult {\n /** True if all issues are complete */\n allComplete: boolean;\n /** Progress statistics */\n progress: ConvoyProgress;\n /** Issues that are still open */\n openIssues: string[];\n /** Issues that are in progress */\n inProgressIssues: string[];\n /** Issues that are blocked */\n blockedIssues: BlockerInfo[];\n /** Issues ready to work on */\n readyIssues: ReadyIssueInfo[];\n /** True if there are dependency cycles */\n hasCycles: boolean;\n /** Issues involved in cycles */\n cycleIssues: string[];\n}\n\n/**\n * Logger interface\n */\nexport interface ObserverLogger {\n debug: (msg: string, meta?: Record<string, unknown>) => void;\n info: (msg: string, meta?: Record<string, unknown>) => void;\n warn: (msg: string, meta?: Record<string, unknown>) => void;\n error: (msg: string, meta?: Record<string, unknown>) => void;\n}\n\n// ============================================================================\n// Default Logger\n// ============================================================================\n\nconst defaultLogger: ObserverLogger = {\n debug: (msg, meta) => console.debug(`[convoy-observer] ${msg}`, meta ?? ''),\n info: (msg, meta) => console.info(`[convoy-observer] ${msg}`, meta ?? ''),\n warn: (msg, meta) => console.warn(`[convoy-observer] ${msg}`, meta ?? ''),\n error: (msg, meta) => console.error(`[convoy-observer] ${msg}`, meta ?? ''),\n};\n\n// ============================================================================\n// Validation Schemas\n// ============================================================================\n\nconst ConvoyIdSchema = z.string().uuid('Invalid convoy ID format');\n\n// ============================================================================\n// Convoy Observer Implementation\n// ============================================================================\n\n/**\n * Convoy Observer\n *\n * Monitors convoys for completion and provides dependency analysis.\n *\n * @example\n * ```typescript\n * const observer = new ConvoyObserver({\n * bdBridge,\n * tracker,\n * pollInterval: 5000,\n * useWasm: true,\n * });\n *\n * // Watch for completion\n * const handle = observer.watch(convoyId, (convoy, complete) => {\n * if (complete) {\n * console.log('Convoy complete!');\n * }\n * });\n *\n * // Check blockers\n * const blockers = await observer.getBlockers(convoyId);\n *\n * // Get ready issues\n * const ready = await observer.getReadyIssues(convoyId);\n *\n * // Stop watching\n * handle.stop();\n * ```\n */\nexport class ConvoyObserver extends EventEmitter {\n private bdBridge: BdBridge;\n private tracker: ConvoyTracker;\n private wasmModule?: WasmGraphModule;\n private logger: ObserverLogger;\n private config: Required<Omit<ConvoyObserverConfig, 'bdBridge' | 'tracker' | 'wasmModule'>>;\n private watchers: Map<string, {\n timer: NodeJS.Timeout;\n callback: CompletionCallback;\n attempts: number;\n currentInterval: number;\n lastState: string | null;\n }> = new Map();\n\n // Performance optimization caches\n private readonly beadCache: LRUCache<string, Bead>;\n private readonly completionCache: LRUCache<string, CompletionCheckResult>;\n private readonly fetchDedup: BatchDeduplicator<Bead[]>;\n private readonly progressEmitters: Map<string, DebouncedEmitter<ConvoyProgress>>;\n\n // Subscription batching\n private pendingSubscriptions: Map<string, Set<CompletionCallback>> = new Map();\n private subscriptionFlushTimer: NodeJS.Timeout | null = null;\n\n constructor(config: ConvoyObserverConfig, logger?: ObserverLogger) {\n super();\n this.bdBridge = config.bdBridge;\n this.tracker = config.tracker;\n this.wasmModule = config.wasmModule;\n this.logger = logger ?? defaultLogger;\n this.config = {\n pollInterval: config.pollInterval ?? 10000,\n maxPollAttempts: config.maxPollAttempts ?? 0, // 0 = unlimited\n useWasm: config.useWasm ?? true,\n useExponentialBackoff: config.useExponentialBackoff ?? true,\n maxBackoffInterval: config.maxBackoffInterval ?? 60000, // 1 minute max\n backoffMultiplier: config.backoffMultiplier ?? 1.5,\n deltaUpdatesOnly: config.deltaUpdatesOnly ?? true,\n progressDebounceMs: config.progressDebounceMs ?? 500,\n };\n\n // Initialize performance caches\n this.beadCache = new LRUCache<string, Bead>({\n maxEntries: 1000,\n ttlMs: 30 * 1000, // 30 seconds (beads change frequently)\n });\n\n this.completionCache = new LRUCache<string, CompletionCheckResult>({\n maxEntries: 100,\n ttlMs: 5 * 1000, // 5 seconds (completion state changes)\n });\n\n this.fetchDedup = new BatchDeduplicator<Bead[]>(30000);\n this.progressEmitters = new Map();\n }\n\n /**\n * Watch a convoy for completion\n *\n * @param convoyId - Convoy ID to watch\n * @param callback - Called on each check with completion status\n * @returns Watch handle to stop watching\n */\n watch(convoyId: string, callback: CompletionCallback): WatchHandle {\n ConvoyIdSchema.parse(convoyId);\n\n // Stop existing watcher if any\n this.stopWatching(convoyId);\n\n const initialInterval = this.config.pollInterval;\n\n // Create initial polling timer (will be rescheduled with backoff)\n const scheduleNextPoll = (interval: number): NodeJS.Timeout => {\n return setTimeout(async () => {\n await this.pollConvoyWithBackoff(convoyId, callback);\n }, interval);\n };\n\n const timer = scheduleNextPoll(initialInterval);\n\n this.watchers.set(convoyId, {\n timer,\n callback,\n attempts: 0,\n currentInterval: initialInterval,\n lastState: null,\n });\n\n // Create debounced progress emitter for this convoy\n this.progressEmitters.set(\n convoyId,\n new DebouncedEmitter<ConvoyProgress>(\n (progress) => this.emit('progress', convoyId, progress),\n this.config.progressDebounceMs\n )\n );\n\n // Immediate first check\n this.pollConvoyWithBackoff(convoyId, callback);\n\n this.logger.info('Started watching convoy', { convoyId, interval: initialInterval });\n\n return {\n convoyId,\n stop: () => this.stopWatching(convoyId),\n isActive: () => this.watchers.has(convoyId),\n };\n }\n\n /**\n * Batch subscribe to multiple convoys\n * Subscriptions are batched and flushed together for efficiency\n *\n * @param convoyId - Convoy ID to watch\n * @param callback - Callback for completion status\n */\n batchSubscribe(convoyId: string, callback: CompletionCallback): void {\n if (!this.pendingSubscriptions.has(convoyId)) {\n this.pendingSubscriptions.set(convoyId, new Set());\n }\n this.pendingSubscriptions.get(convoyId)!.add(callback);\n\n // Flush after a short delay to batch multiple subscriptions\n if (!this.subscriptionFlushTimer) {\n this.subscriptionFlushTimer = setTimeout(() => {\n this.flushSubscriptions();\n }, 50); // 50ms batching window\n }\n }\n\n /**\n * Flush pending subscriptions\n */\n private flushSubscriptions(): void {\n this.subscriptionFlushTimer = null;\n\n for (const [convoyId, callbacks] of this.pendingSubscriptions) {\n // Create a merged callback that calls all registered callbacks\n const mergedCallback: CompletionCallback = (convoy, allComplete) => {\n for (const cb of callbacks) {\n try {\n cb(convoy, allComplete);\n } catch (error) {\n this.logger.error('Subscription callback error', {\n convoyId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n };\n\n this.watch(convoyId, mergedCallback);\n }\n\n this.pendingSubscriptions.clear();\n this.logger.debug('Flushed subscription batch', {\n convoys: this.pendingSubscriptions.size,\n });\n }\n\n /**\n * Check if all issues in a convoy are complete\n *\n * @param convoyId - Convoy ID\n * @returns Completion check result with detailed status\n */\n async checkCompletion(convoyId: string): Promise<CompletionCheckResult> {\n ConvoyIdSchema.parse(convoyId);\n\n const convoy = this.tracker.getConvoy(convoyId);\n if (!convoy) {\n throw ConvoyError.notFound(convoyId);\n }\n\n // Fetch all beads\n const beads = await this.fetchBeads(convoy.trackedIssues);\n const beadMap = new Map(beads.map(b => [b.id, b]));\n\n // Calculate progress\n const openIssues: string[] = [];\n const inProgressIssues: string[] = [];\n let closed = 0;\n\n for (const issueId of convoy.trackedIssues) {\n const bead = beadMap.get(issueId);\n if (!bead) continue;\n\n if (bead.status === 'closed') {\n closed++;\n } else if (bead.status === 'in_progress') {\n inProgressIssues.push(issueId);\n } else {\n openIssues.push(issueId);\n }\n }\n\n // Use WASM for graph analysis if available\n let hasCycles = false;\n let cycleIssues: string[] = [];\n let readyIssues: ReadyIssueInfo[] = [];\n let blockedIssues: BlockerInfo[] = [];\n\n if (this.config.useWasm && this.wasmModule) {\n try {\n const wasmResult = this.analyzeWithWasm(beads);\n hasCycles = wasmResult.hasCycles;\n cycleIssues = wasmResult.cycleIssues;\n readyIssues = wasmResult.readyIssues;\n blockedIssues = wasmResult.blockedIssues;\n } catch (error) {\n this.logger.warn('WASM analysis failed, falling back to JS', {\n error: error instanceof Error ? error.message : String(error),\n });\n const jsResult = this.analyzeWithJS(beads, convoy.trackedIssues);\n hasCycles = jsResult.hasCycles;\n cycleIssues = jsResult.cycleIssues;\n readyIssues = jsResult.readyIssues;\n blockedIssues = jsResult.blockedIssues;\n }\n } else {\n const jsResult = this.analyzeWithJS(beads, convoy.trackedIssues);\n hasCycles = jsResult.hasCycles;\n cycleIssues = jsResult.cycleIssues;\n readyIssues = jsResult.readyIssues;\n blockedIssues = jsResult.blockedIssues;\n }\n\n const progress: ConvoyProgress = {\n total: convoy.trackedIssues.length,\n closed,\n inProgress: inProgressIssues.length,\n blocked: blockedIssues.length,\n };\n\n return {\n allComplete: closed === convoy.trackedIssues.length,\n progress,\n openIssues,\n inProgressIssues,\n blockedIssues,\n readyIssues,\n hasCycles,\n cycleIssues,\n };\n }\n\n /**\n * Get blockers for all issues in a convoy\n *\n * @param convoyId - Convoy ID\n * @returns Array of blocker information\n */\n async getBlockers(convoyId: string): Promise<BlockerInfo[]> {\n const result = await this.checkCompletion(convoyId);\n return result.blockedIssues;\n }\n\n /**\n * Get issues ready to work on (no unresolved dependencies)\n *\n * @param convoyId - Convoy ID\n * @returns Array of ready issue information\n */\n async getReadyIssues(convoyId: string): Promise<ReadyIssueInfo[]> {\n const result = await this.checkCompletion(convoyId);\n return result.readyIssues;\n }\n\n /**\n * Get execution order for convoy issues\n *\n * @param convoyId - Convoy ID\n * @returns Ordered array of issue IDs\n */\n async getExecutionOrder(convoyId: string): Promise<string[]> {\n ConvoyIdSchema.parse(convoyId);\n\n const convoy = this.tracker.getConvoy(convoyId);\n if (!convoy) {\n throw ConvoyError.notFound(convoyId);\n }\n\n const beads = await this.fetchBeads(convoy.trackedIssues);\n\n if (this.config.useWasm && this.wasmModule) {\n try {\n const wasmNodes = this.beadsToWasmNodes(beads);\n const resultJson = this.wasmModule.topo_sort(JSON.stringify(wasmNodes));\n const result: TopoSortResult = JSON.parse(resultJson);\n\n if (result.hasCycle) {\n throw new GasTownError(\n 'Cannot compute execution order: dependency cycle detected',\n GasTownErrorCode.DEPENDENCY_CYCLE,\n { cycleNodes: result.cycleNodes }\n );\n }\n\n return result.sorted;\n } catch (error) {\n if (error instanceof GasTownError) throw error;\n this.logger.warn('WASM topo sort failed, falling back to JS', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // JavaScript fallback using Kahn's algorithm\n return this.topoSortJS(beads);\n }\n\n /**\n * Stop watching a convoy\n */\n stopWatching(convoyId: string): void {\n const watcher = this.watchers.get(convoyId);\n if (watcher) {\n clearTimeout(watcher.timer);\n this.watchers.delete(convoyId);\n\n // Clean up progress emitter\n const emitter = this.progressEmitters.get(convoyId);\n if (emitter) {\n emitter.flush(); // Emit any pending updates\n this.progressEmitters.delete(convoyId);\n }\n\n // Invalidate completion cache for this convoy\n this.completionCache.delete(convoyId);\n\n this.logger.info('Stopped watching convoy', { convoyId });\n }\n }\n\n /**\n * Stop all watchers\n */\n stopAll(): void {\n for (const [convoyId, watcher] of this.watchers) {\n clearTimeout(watcher.timer);\n }\n this.watchers.clear();\n\n // Clean up all progress emitters\n for (const emitter of this.progressEmitters.values()) {\n emitter.flush();\n }\n this.progressEmitters.clear();\n\n // Clear all caches\n this.beadCache.clear();\n this.completionCache.clear();\n this.fetchDedup.clear();\n\n // Clear pending subscriptions\n if (this.subscriptionFlushTimer) {\n clearTimeout(this.subscriptionFlushTimer);\n this.subscriptionFlushTimer = null;\n }\n this.pendingSubscriptions.clear();\n\n this.logger.info('Stopped all convoy watchers');\n }\n\n /**\n * Set WASM module\n */\n setWasmModule(module: WasmGraphModule): void {\n this.wasmModule = module;\n this.logger.info('WASM module set');\n }\n\n /**\n * Check if WASM is available\n */\n isWasmAvailable(): boolean {\n return !!this.wasmModule;\n }\n\n // =========================================================================\n // Private Methods\n // =========================================================================\n\n /**\n * Poll convoy for completion with exponential backoff\n */\n private async pollConvoyWithBackoff(\n convoyId: string,\n callback: CompletionCallback\n ): Promise<void> {\n const watcher = this.watchers.get(convoyId);\n if (!watcher) return;\n\n try {\n const convoy = this.tracker.getConvoy(convoyId);\n if (!convoy) {\n this.stopWatching(convoyId);\n return;\n }\n\n // Skip if already complete\n if (convoy.status === 'landed' || convoy.status === 'failed') {\n callback(convoy, convoy.status === 'landed');\n this.stopWatching(convoyId);\n return;\n }\n\n const result = await this.checkCompletion(convoyId);\n\n // Delta-based updates: only emit if state changed\n const currentState = JSON.stringify({\n allComplete: result.allComplete,\n progress: result.progress,\n openIssues: result.openIssues.length,\n inProgress: result.inProgressIssues.length,\n blocked: result.blockedIssues.length,\n });\n\n const stateChanged = watcher.lastState !== currentState;\n watcher.lastState = currentState;\n\n if (this.config.deltaUpdatesOnly && !stateChanged) {\n // No state change - increase backoff interval\n if (this.config.useExponentialBackoff) {\n watcher.currentInterval = Math.min(\n watcher.currentInterval * this.config.backoffMultiplier,\n this.config.maxBackoffInterval\n );\n }\n } else {\n // State changed - reset to initial interval and call callback\n watcher.currentInterval = this.config.pollInterval;\n callback(convoy, result.allComplete);\n\n // Emit debounced progress update\n const emitter = this.progressEmitters.get(convoyId);\n if (emitter) {\n emitter.update(result.progress);\n }\n }\n\n watcher.attempts++;\n\n // Check max attempts\n if (\n this.config.maxPollAttempts > 0 &&\n watcher.attempts >= this.config.maxPollAttempts\n ) {\n this.logger.warn('Max poll attempts reached', {\n convoyId,\n attempts: watcher.attempts,\n });\n this.stopWatching(convoyId);\n return;\n }\n\n // Schedule next poll with current interval (possibly backed off)\n clearTimeout(watcher.timer);\n watcher.timer = setTimeout(async () => {\n await this.pollConvoyWithBackoff(convoyId, callback);\n }, watcher.currentInterval);\n\n } catch (error) {\n this.logger.error('Poll error', {\n convoyId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // On error, increase backoff more aggressively\n if (this.config.useExponentialBackoff) {\n watcher.currentInterval = Math.min(\n watcher.currentInterval * (this.config.backoffMultiplier * 1.5),\n this.config.maxBackoffInterval\n );\n }\n\n // Schedule retry with backed-off interval\n clearTimeout(watcher.timer);\n watcher.timer = setTimeout(async () => {\n await this.pollConvoyWithBackoff(convoyId, callback);\n }, watcher.currentInterval);\n }\n }\n\n /**\n * Legacy poll convoy method (without backoff)\n * @deprecated Use pollConvoyWithBackoff instead\n */\n private async pollConvoy(\n convoyId: string,\n callback: CompletionCallback\n ): Promise<void> {\n return this.pollConvoyWithBackoff(convoyId, callback);\n }\n\n /**\n * Fetch beads by IDs with caching, batch deduplication, and object pooling.\n * Uses PooledBead from memory module for reduced allocations.\n */\n private async fetchBeads(issueIds: string[]): Promise<Bead[]> {\n // Create a batch key for deduplication\n const batchKey = issueIds.sort().join(',');\n\n return this.fetchDedup.dedupe(batchKey, async () => {\n const beads: Bead[] = [];\n const uncachedIds: string[] = [];\n\n // Check cache first for each bead\n for (const id of issueIds) {\n const cached = this.beadCache.get(id);\n if (cached) {\n beads.push(cached);\n } else {\n uncachedIds.push(id);\n }\n }\n\n // Fetch uncached beads in parallel (batch of 10)\n const batchSize = 10;\n for (let i = 0; i < uncachedIds.length; i += batchSize) {\n const batch = uncachedIds.slice(i, i + batchSize);\n const fetchPromises = batch.map(async (id) => {\n try {\n const cliBead = await this.bdBridge.getBead(id);\n\n // Use pooled bead for reduced allocations\n const pooledBead = beadPool.acquire() as PooledBead;\n pooledBead.id = cliBead.id;\n pooledBead.title = cliBead.content.slice(0, 100);\n pooledBead.description = cliBead.content;\n pooledBead.status = this.mapBeadStatus(cliBead.type);\n pooledBead.priority = 0;\n pooledBead.labels = cliBead.tags ?? [];\n pooledBead.createdAt = cliBead.timestamp ? new Date(cliBead.timestamp) : new Date();\n pooledBead.updatedAt = new Date();\n pooledBead.blockedBy = cliBead.parentId ? [cliBead.parentId] : [];\n pooledBead.blocks = [];\n\n // Convert to plain Bead object for caching (avoid pool reference issues)\n const bead: Bead = {\n id: pooledBead.id,\n title: pooledBead.title,\n description: pooledBead.description,\n status: pooledBead.status,\n priority: pooledBead.priority,\n labels: pooledBead.labels,\n createdAt: pooledBead.createdAt,\n updatedAt: pooledBead.updatedAt,\n blockedBy: pooledBead.blockedBy,\n blocks: pooledBead.blocks,\n };\n\n // Release pooled bead back to pool\n beadPool.release(pooledBead);\n\n // Cache the bead\n this.beadCache.set(id, bead);\n return bead;\n } catch {\n // Skip invalid beads\n return null;\n }\n });\n\n const results = await Promise.all(fetchPromises);\n beads.push(...results.filter((b): b is Bead => b !== null));\n }\n\n return beads;\n });\n }\n\n /**\n * Map CLI bead type to Gas Town status\n */\n private mapBeadStatus(type: string): BeadStatus {\n switch (type) {\n case 'closed':\n return 'closed';\n case 'in_progress':\n case 'response':\n case 'code':\n return 'in_progress';\n default:\n return 'open';\n }\n }\n\n /**\n * Convert beads to WASM node format\n */\n private beadsToWasmNodes(beads: Bead[]): WasmBeadNode[] {\n return beads.map(bead => ({\n id: bead.id,\n title: bead.title,\n status: bead.status,\n priority: bead.priority,\n blocked_by: bead.blockedBy ?? [],\n blocks: bead.blocks ?? [],\n duration: undefined,\n }));\n }\n\n /**\n * Analyze dependencies with WASM\n */\n private analyzeWithWasm(beads: Bead[]): {\n hasCycles: boolean;\n cycleIssues: string[];\n readyIssues: ReadyIssueInfo[];\n blockedIssues: BlockerInfo[];\n } {\n if (!this.wasmModule) {\n throw new Error('WASM module not available');\n }\n\n const wasmNodes = this.beadsToWasmNodes(beads);\n const beadsJson = JSON.stringify(wasmNodes);\n\n // Check for cycles\n const hasCycles = this.wasmModule.has_cycle(beadsJson);\n let cycleIssues: string[] = [];\n if (hasCycles) {\n const cycleJson = this.wasmModule.find_cycle_nodes(beadsJson);\n cycleIssues = JSON.parse(cycleJson);\n }\n\n // Get ready beads\n const readyJson = this.wasmModule.get_ready_beads(beadsJson);\n const readyIds: string[] = JSON.parse(readyJson);\n\n // Get execution levels\n const levelsJson = this.wasmModule.compute_levels(beadsJson);\n const levels: Record<string, string[]> = JSON.parse(levelsJson);\n\n // Build level map\n const levelMap = new Map<string, number>();\n for (const [levelStr, ids] of Object.entries(levels)) {\n const level = parseInt(levelStr, 10);\n for (const id of ids) {\n levelMap.set(id, level);\n }\n }\n\n // Build ready issues with level info\n const beadMap = new Map(beads.map(b => [b.id, b]));\n const readyIssues: ReadyIssueInfo[] = readyIds.map(id => {\n const bead = beadMap.get(id)!;\n return {\n id,\n title: bead.title,\n priority: bead.priority,\n level: levelMap.get(id) ?? 0,\n };\n });\n\n // Find blocked issues\n const closedSet = new Set(\n beads.filter(b => b.status === 'closed').map(b => b.id)\n );\n const convoySet = new Set(beads.map(b => b.id));\n\n const blockedIssues: BlockerInfo[] = beads\n .filter(bead => {\n if (bead.status === 'closed') return false;\n const blockers = bead.blockedBy ?? [];\n return blockers.some(blockerId => !closedSet.has(blockerId));\n })\n .map(bead => {\n const blockers = (bead.blockedBy ?? []).filter(\n id => !closedSet.has(id)\n );\n const internalBlockers = blockers.every(id => convoySet.has(id));\n return {\n blockedIssue: bead.id,\n blockers,\n internalBlockers,\n };\n });\n\n return { hasCycles, cycleIssues, readyIssues, blockedIssues };\n }\n\n /**\n * Analyze dependencies with JavaScript (fallback)\n */\n private analyzeWithJS(beads: Bead[], convoyIssues: string[]): {\n hasCycles: boolean;\n cycleIssues: string[];\n readyIssues: ReadyIssueInfo[];\n blockedIssues: BlockerInfo[];\n } {\n const beadMap = new Map(beads.map(b => [b.id, b]));\n const convoySet = new Set(convoyIssues);\n const closedSet = new Set(\n beads.filter(b => b.status === 'closed').map(b => b.id)\n );\n\n // Simple cycle detection using DFS\n const hasCycles = this.detectCyclesJS(beads);\n const cycleIssues: string[] = hasCycles\n ? this.findCycleNodesJS(beads)\n : [];\n\n // Find ready issues (no unresolved blockers)\n const readyIssues: ReadyIssueInfo[] = beads\n .filter(bead => {\n if (bead.status === 'closed') return false;\n const blockers = bead.blockedBy ?? [];\n return blockers.every(id => closedSet.has(id));\n })\n .map((bead, index) => ({\n id: bead.id,\n title: bead.title,\n priority: bead.priority,\n level: 0, // Simplified - no level computation in JS fallback\n }));\n\n // Find blocked issues\n const blockedIssues: BlockerInfo[] = beads\n .filter(bead => {\n if (bead.status === 'closed') return false;\n const blockers = bead.blockedBy ?? [];\n return blockers.some(id => !closedSet.has(id));\n })\n .map(bead => {\n const blockers = (bead.blockedBy ?? []).filter(\n id => !closedSet.has(id)\n );\n const internalBlockers = blockers.every(id => convoySet.has(id));\n return {\n blockedIssue: bead.id,\n blockers,\n internalBlockers,\n };\n });\n\n return { hasCycles, cycleIssues, readyIssues, blockedIssues };\n }\n\n /**\n * Detect cycles using DFS (JavaScript)\n */\n private detectCyclesJS(beads: Bead[]): boolean {\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const beadMap = new Map(beads.map(b => [b.id, b]));\n\n const dfs = (id: string): boolean => {\n visited.add(id);\n recStack.add(id);\n\n const bead = beadMap.get(id);\n if (bead) {\n for (const blockerId of bead.blockedBy ?? []) {\n if (!visited.has(blockerId)) {\n if (dfs(blockerId)) return true;\n } else if (recStack.has(blockerId)) {\n return true;\n }\n }\n }\n\n recStack.delete(id);\n return false;\n };\n\n for (const bead of beads) {\n if (!visited.has(bead.id)) {\n if (dfs(bead.id)) return true;\n }\n }\n\n return false;\n }\n\n /**\n * Find nodes in cycles (JavaScript)\n */\n private findCycleNodesJS(beads: Bead[]): string[] {\n // Simplified - just return all nodes that might be in cycles\n const inDegree = new Map<string, number>();\n const beadMap = new Map(beads.map(b => [b.id, b]));\n\n for (const bead of beads) {\n inDegree.set(bead.id, (bead.blockedBy ?? []).length);\n }\n\n // Remove nodes with no incoming edges iteratively\n let changed = true;\n while (changed) {\n changed = false;\n for (const [id, degree] of inDegree) {\n if (degree === 0) {\n inDegree.delete(id);\n // Decrease degree of nodes blocked by this one\n for (const bead of beads) {\n if (bead.blockedBy?.includes(id)) {\n const current = inDegree.get(bead.id) ?? 0;\n if (current > 0) {\n inDegree.set(bead.id, current - 1);\n changed = true;\n }\n }\n }\n changed = true;\n }\n }\n }\n\n // Remaining nodes are in cycles\n return Array.from(inDegree.keys());\n }\n\n /**\n * Topological sort using Kahn's algorithm (JavaScript)\n */\n private topoSortJS(beads: Bead[]): string[] {\n const beadMap = new Map(beads.map(b => [b.id, b]));\n const inDegree = new Map<string, number>();\n const result: string[] = [];\n\n // Initialize in-degrees\n for (const bead of beads) {\n inDegree.set(bead.id, (bead.blockedBy ?? []).length);\n }\n\n // Queue nodes with no dependencies\n const queue: string[] = [];\n for (const [id, degree] of inDegree) {\n if (degree === 0) {\n queue.push(id);\n }\n }\n\n while (queue.length > 0) {\n const id = queue.shift()!;\n result.push(id);\n\n // Find nodes blocked by this one and decrease their in-degree\n for (const bead of beads) {\n if (bead.blockedBy?.includes(id)) {\n const current = inDegree.get(bead.id) ?? 0;\n const newDegree = current - 1;\n inDegree.set(bead.id, newDegree);\n if (newDegree === 0) {\n queue.push(bead.id);\n }\n }\n }\n }\n\n // If we couldn't process all nodes, there's a cycle\n if (result.length !== beads.length) {\n throw new GasTownError(\n 'Cannot compute execution order: dependency cycle detected',\n GasTownErrorCode.DEPENDENCY_CYCLE\n );\n }\n\n return result;\n }\n\n /**\n * Clean up resources\n */\n dispose(): void {\n this.stopAll();\n this.removeAllListeners();\n }\n}\n\n/**\n * Create a new convoy observer instance\n */\nexport function createConvoyObserver(\n config: ConvoyObserverConfig,\n logger?: ObserverLogger\n): ConvoyObserver {\n return new ConvoyObserver(config, logger);\n}\n\n/**\n * Create a lazy-initialized convoy observer.\n * The observer is only created when first accessed (via watch() or checkCompletion()).\n * Useful for deferring initialization until convoy monitoring is actually needed.\n *\n * @example\n * ```typescript\n * const lazyObserver = createLazyConvoyObserver(config);\n *\n * // Observer is NOT created yet\n * console.log(lazyObserver.getWatchCount()); // 0\n *\n * // First watch triggers observer creation\n * const observer = await lazyObserver.watch();\n * const handle = observer.watch(convoyId, callback);\n *\n * // When done, unwatch to potentially dispose\n * await lazyObserver.unwatch();\n * ```\n */\nexport function createLazyConvoyObserver(\n config: ConvoyObserverConfig,\n logger?: ObserverLogger\n): LazyObserver<ConvoyObserver> {\n return new LazyObserver<ConvoyObserver>(\n () => new ConvoyObserver(config, logger),\n {\n name: 'convoy-observer',\n cleanup: (observer) => {\n observer.dispose();\n },\n }\n );\n}\n\n/**\n * Get lazy observer statistics\n */\nexport function getLazyObserverStats(\n lazyObserver: LazyObserver<ConvoyObserver>\n): {\n isActive: boolean;\n watchCount: number;\n} {\n return {\n isActive: lazyObserver.isActive(),\n watchCount: lazyObserver.getWatchCount(),\n };\n}\n\nexport default ConvoyObserver;\n"]}
@@ -0,0 +1,13 @@
1
+ 'use strict';var chunkI2TLUPMJ_cjs=require('./chunk-I2TLUPMJ.cjs'),chunk46PJFOMY_cjs=require('./chunk-46PJFOMY.cjs'),child_process=require('child_process'),util=require('util'),zod=require('zod');/**
2
+ * @claude-flow/plugin-gastown-bridge v0.1.4
3
+ *
4
+ * WASM-accelerated Gas Town orchestration for Claude Flow V3
5
+ * Bundle optimized: <100KB gzipped total
6
+ *
7
+ * @license MIT
8
+ * @copyright 2024 rUv
9
+ */
10
+ var L=util.promisify(child_process.execFile),A=new chunk46PJFOMY_cjs.a({maxEntries:200,ttlMs:30*1e3}),C=new chunk46PJFOMY_cjs.a({maxEntries:500,ttlMs:300*1e3}),P=new chunk46PJFOMY_cjs.c,b=new chunk46PJFOMY_cjs.a({maxEntries:500,ttlMs:60*1e3});function k(s){let e=2166136261;for(let t of s){for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=e*16777619>>>0;e^=255;}return e.toString(36)}var S=zod.z.string().max(1024,"String too long").refine(s=>!/[;&|`$(){}><\n\r\0]/.test(s),"String contains shell metacharacters"),_=zod.z.string().min(1,"Identifier cannot be empty").max(64,"Identifier too long").regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/,"Invalid identifier format"),M=zod.z.number().positive("Gas price must be positive").max(1e6,"Gas price exceeds maximum"),F=zod.z.number().int("Gas limit must be an integer").positive("Gas limit must be positive").max(3e7,"Gas limit exceeds maximum"),R=zod.z.string().regex(/^0x[a-fA-F0-9]{64}$/,"Invalid transaction hash format"),B=zod.z.string().regex(/^0x[a-fA-F0-9]{40}$/,"Invalid address format"),U=zod.z.enum(["mainnet","goerli","sepolia","polygon","arbitrum","optimism","base","local"]),O=zod.z.string().max(512,"Argument too long").refine(s=>!s.includes("\0"),"Argument contains null byte").refine(s=>!/[;&|`$(){}><]/.test(s),"Argument contains shell metacharacters"),c=class extends Error{constructor(t,n,i,r,a){super(t);this.code=n;this.command=i;this.args=r;this.cause=a;this.name="GtBridgeError";}code;command;args;cause},$={debug:(s,e)=>console.debug(`[gt-bridge] ${s}`,e??""),info:(s,e)=>console.info(`[gt-bridge] ${s}`,e??""),warn:(s,e)=>console.warn(`[gt-bridge] ${s}`,e??""),error:(s,e)=>console.error(`[gt-bridge] ${s}`,e??"")},V=new Set(["estimate","status","network","price","tx","simulate","decode","encode","help","version","config"]),I=class s{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??$;}async initialize(){try{let e=await this.execGt(["version"]);if(!e.success)throw new c("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 c?e:new c("Failed to initialize Gas Town bridge","COMMAND_NOT_FOUND","gt",["version"],e)}}async execGt(e,t=false){let n=Date.now(),i=this.validateAndSanitizeArgs(e),r=i[0];if(r&&!V.has(r))throw new c(`Command not allowed: ${r}`,"INVALID_ARGUMENT","gt",i);let a=k(i),m=!t&&r&&s.CACHEABLE_COMMANDS.has(r),o=r&&s.STATIC_COMMANDS.has(r);if(m){let g=o?C.get(a):A.get(a);if(g)return this.logger.debug("Cache hit for gt command",{command:r}),{...g,durationMs:0}}return P.dedupe(a,async()=>{try{this.logger.debug("Executing gt command",{command:"gt",args:i});let{stdout:g,stderr:l}=await L(this.config.gtPath,i,{cwd:this.config.cwd,env:this.config.env,timeout:this.config.timeout,maxBuffer:this.config.maxBuffer,shell:!1,windowsHide:!0}),d=Date.now()-n;l&&l.trim()&&this.logger.warn("gt stderr output",{stderr:l});let y={success:!0,data:g.trim(),command:"gt",args:i,durationMs:d};return m&&y.success&&(o?C.set(a,y):A.set(a,y)),y}catch(g){let l=Date.now()-n,d=g;if(d.killed)throw new c("Command execution timed out","TIMEOUT","gt",i);if(d.code==="ENOENT")throw new c(`gt executable not found at: ${this.config.gtPath}`,"COMMAND_NOT_FOUND","gt",i);return {success:false,error:d.stderr||d.message,command:"gt",args:i,durationMs:l}}})}parseGtOutput(e){if(!e||e.trim()==="")throw new c("Empty output from gt command","INVALID_OUTPUT");let t=k([e]),n=b.get(t);if(n!==void 0)return n;try{let i=JSON.parse(e);return b.set(t,i),i}catch{let i=e.match(/\{[\s\S]*\}|\[[\s\S]*\]/);if(i)try{let r=JSON.parse(i[0]);return b.set(t,r),r}catch{throw new c("Failed to parse gt output as JSON","INVALID_OUTPUT")}throw new c("Output is not valid JSON","INVALID_OUTPUT")}}async estimateGas(e){this.ensureInitialized();let t=B.parse(e.to),n=e.network??this.config.defaultNetwork,i=["estimate","--to",t,"--network",n,"--json"];if(e.data){let a=S.parse(e.data);i.push("--data",a);}if(e.value){let a=S.parse(e.value);i.push("--value",a);}if(e.from){let a=B.parse(e.from);i.push("--from",a);}let r=await this.execGt(i);if(!r.success||!r.data)throw new c(r.error??"Gas estimation failed","EXECUTION_FAILED","gt",i);return this.parseGtOutput(r.data)}async getTxStatus(e,t){this.ensureInitialized();let i=["tx","status",R.parse(e),"--network",t??this.config.defaultNetwork,"--json"],r=await this.execGt(i);if(!r.success||!r.data)throw new c(r.error??"Failed to get transaction status","EXECUTION_FAILED","gt",i);return this.parseGtOutput(r.data)}async getNetworkStatus(e){this.ensureInitialized();let t=["network","status","--network",e??this.config.defaultNetwork,"--json"],n=await this.execGt(t);if(!n.success||!n.data)throw new c(n.error??"Failed to get network status","NETWORK_ERROR","gt",t);return this.parseGtOutput(n.data)}async getGasPrice(e){this.ensureInitialized();let t=["price","--network",e??this.config.defaultNetwork,"--json"],n=await this.execGt(t);if(!n.success||!n.data)throw new c(n.error??"Failed to get gas price","EXECUTION_FAILED","gt",t);return this.parseGtOutput(n.data)}async simulate(e){this.ensureInitialized();let t=B.parse(e.to),n=S.parse(e.data),i=e.network??this.config.defaultNetwork,r=["simulate","--to",t,"--data",n,"--network",i,"--json"];e.value&&r.push("--value",S.parse(e.value)),e.from&&r.push("--from",B.parse(e.from)),e.blockNumber!==void 0&&r.push("--block",String(e.blockNumber));let a=await this.execGt(r);if(!a.success||!a.data)throw new c(a.error??"Transaction simulation failed","EXECUTION_FAILED","gt",r);return this.parseGtOutput(a.data)}async decode(e,t){this.ensureInitialized();let i=["decode",S.parse(e),"--json"];if(t){let a=S.parse(t);i.push("--abi",a);}let r=await this.execGt(i);if(!r.success||!r.data)throw new c(r.error??"Failed to decode transaction data","EXECUTION_FAILED","gt",i);return this.parseGtOutput(r.data)}validateAndSanitizeArgs(e){return e.map((t,n)=>{try{return O.parse(t)}catch(i){throw new c(`Invalid argument at index ${n}: ${t}`,"VALIDATION_ERROR","gt",e,i)}})}ensureInitialized(){if(!this.initialized)throw new c("Gas Town bridge not initialized. Call initialize() first.","EXECUTION_FAILED")}isInitialized(){return this.initialized}getConfig(){return {...this.config}}getCacheStats(){return {resultCache:A.stats(),staticCache:C.stats(),parsedCache:b.stats()}}clearCaches(){A.clear(),C.clear(),b.clear();}};function K(s,e){return new I(s,e)}var w=new chunk46PJFOMY_cjs.a({maxEntries:500,ttlMs:30*1e3}),T=new chunk46PJFOMY_cjs.a({maxEntries:200,ttlMs:10*1e3});new chunk46PJFOMY_cjs.c;function x(s){let e=2166136261;for(let t of s){for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=e*16777619>>>0;e^=255;}return e.toString(36)}var j=zod.z.enum(["beads-wins","agentdb-wins","newest-wins","merge","manual"]),H=zod.z.enum(["to-agentdb","from-agentdb","bidirectional"]),X=zod.z.enum(["pending","in-progress","completed","failed","conflict"]),J=zod.z.object({key:zod.z.string(),value:zod.z.unknown(),namespace:zod.z.string().optional(),metadata:zod.z.record(zod.z.unknown()).optional(),embedding:zod.z.array(zod.z.number()).optional(),createdAt:zod.z.string().datetime().optional(),updatedAt:zod.z.string().datetime().optional(),version:zod.z.number().optional()}),h=class extends Error{constructor(t,n,i,r){super(t);this.code=n;this.details=i;this.cause=r;this.name="SyncBridgeError";}code;details;cause},q={debug:(s,e)=>console.debug(`[sync-bridge] ${s}`,e??""),info:(s,e)=>console.info(`[sync-bridge] ${s}`,e??""),warn:(s,e)=>console.warn(`[sync-bridge] ${s}`,e??""),error:(s,e)=>console.error(`[sync-bridge] ${s}`,e??"")},E=class{bdBridge;agentDB;config;logger;initialized=false;syncState;conflicts=new Map;constructor(e,t,n){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=n??q,this.bdBridge=chunkI2TLUPMJ_cjs.g(this.config.beadsBridge,{debug:(i,r)=>this.logger.debug(`[bd] ${i}`,r),info:(i,r)=>this.logger.info(`[bd] ${i}`,r),warn:(i,r)=>this.logger.warn(`[bd] ${i}`,r),error:(i,r)=>this.logger.error(`[bd] ${i}`,r)}),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 h("Failed to initialize sync bridge","NOT_INITIALIZED",void 0,e)}}async syncToAgentDB(e){this.ensureInitialized();let t=Date.now(),n={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 g=this.beadToKey(o),l=x([g,this.config.agentdbNamespace]);if(w.has(l))return {bead:o,key:g,existing:w.get(l)};let d=await this.agentDB.retrieve(g,this.config.agentdbNamespace);return w.set(l,d),{bead:o,key:g,existing:d}}),m=await Promise.all(a);for(let{bead:o,key:g,existing:l}of m)try{if(l){let y=x([o.id,o.content,l.key]),D=T.get(y);if(D===void 0&&(D=await this.detectConflict(o,l),T.set(y,D)),D&&!await this.resolveConflict(o,l)){n.conflicts++;continue}n.updated++;}else n.created++;await this.agentDB.store(g,this.beadToAgentDBValue(o),this.config.agentdbNamespace,this.buildMetadata(o));let d=x([g,this.config.agentdbNamespace]);w.delete(d),n.synced++;}catch(d){n.errors.push({id:o.id,error:d instanceof Error?d.message:String(d)}),this.logger.error(`Failed to sync bead ${o.id}`,{error:d});}}return this.syncState.lastSyncTime=n.timestamp,e.length>0&&(this.syncState.lastBeadId=e[e.length-1]?.id),await this.saveSyncState(),n.durationMs=Date.now()-t,n.success=n.errors.length===0&&n.conflicts===0,this.logger.info("Sync to AgentDB complete",{synced:n.synced,created:n.created,updated:n.updated,conflicts:n.conflicts,errors:n.errors.length,durationMs:n.durationMs}),n}async syncFromAgentDB(){this.ensureInitialized();let e=Date.now(),t=[];this.logger.info("Starting sync from AgentDB");try{let n=0,i=!0;for(;i;){let a=await this.agentDB.list(this.config.agentdbNamespace,this.config.batchSize,n);if(a.length===0){i=!1;continue}for(let m of a)if(m.key!=="_sync_state")try{let o=this.agentDBToBead(m);o&&t.push(o);}catch(o){this.logger.warn(`Failed to convert AgentDB entry to bead: ${m.key}`,{error:o instanceof Error?o.message:String(o)});}n+=a.length,i=a.length===this.config.batchSize;}this.syncState.lastSyncTime=new Date().toISOString(),await this.saveSyncState();let r=Date.now()-e;return this.logger.info("Sync from AgentDB complete",{beads:t.length,durationMs:r}),t}catch(n){throw new h("Failed to sync from AgentDB","SYNC_FAILED",void 0,n)}}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),n=await this.syncFromAgentDB();return {toAgentDB:t,fromAgentDB:n}}getPendingConflicts(){return Array.from(this.conflicts.values()).filter(e=>e.resolution==="pending"||!e.resolution)}async resolveConflictManually(e,t,n){let i=this.conflicts.get(e);if(!i)throw new h(`No conflict found for bead: ${e}`,"VALIDATION_ERROR");let r=this.beadToKey(i.beadData);switch(t){case "beads":await this.agentDB.store(r,this.beadToAgentDBValue(i.beadData),this.config.agentdbNamespace,this.buildMetadata(i.beadData));break;case "agentdb":break;case "merged":if(!n)throw new h("Merged data required for merge resolution","VALIDATION_ERROR");let m={...i.beadData,...n};await this.agentDB.store(r,this.beadToAgentDBValue(m),this.config.agentdbNamespace,this.buildMetadata(m));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 n=t.value;if(n.content===e.content)return false;let i=e.timestamp?new Date(e.timestamp).getTime():0,r=t.updatedAt?new Date(t.updatedAt).getTime():0;return i>r?false:r>i&&n.content!==e.content}async resolveConflict(e,t){let n={beadId:e.id,beadData:e,agentdbData:t,conflictType:"update"};switch(this.config.conflictStrategy){case "beads-wins":return n.resolution="beads",this.conflicts.set(e.id,n),true;case "agentdb-wins":return n.resolution="agentdb",this.conflicts.set(e.id,n),false;case "newest-wins":{let i=e.timestamp?new Date(e.timestamp).getTime():0,r=t.updatedAt?new Date(t.updatedAt).getTime():0;return i>=r?(n.resolution="beads",this.conflicts.set(e.id,n),true):(n.resolution="agentdb",this.conflicts.set(e.id,n),false)}case "merge":{let i=t.value,r={...e,content:`${e.content}
11
+ ---
12
+ ${i.content}`,metadata:{...e.metadata,merged:true,mergedAt:new Date().toISOString()}};return n.beadData=r,n.resolution="merged",this.conflicts.set(e.id,n),true}case "manual":return n.resolution="pending",this.conflicts.set(e.id,n),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 h("Sync bridge not initialized. Call initialize() first.","NOT_INITIALIZED")}isInitialized(){return this.initialized}getBeadsBridge(){return this.bdBridge}getCacheStats(){return {agentDBLookupCache:w.stats(),conflictCache:T.stats()}}clearCaches(){w.clear(),T.clear();}};function Z(s,e,t){return new E(s,e,t)}exports.a=S;exports.b=_;exports.c=M;exports.d=F;exports.e=R;exports.f=B;exports.g=U;exports.h=O;exports.i=c;exports.j=I;exports.k=K;exports.l=j;exports.m=H;exports.n=X;exports.o=J;exports.p=h;exports.q=E;exports.r=Z;//# sourceMappingURL=chunk-QFMFM7NE.cjs.map
13
+ //# sourceMappingURL=chunk-QFMFM7NE.cjs.map