@skaile/workspaces 0.10.1 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/dist/asset-manager/index.js +2 -2
  3. package/dist/asset-manager/scaffold.js +1 -1
  4. package/dist/base-assets/connectors/deploy.js +2 -2
  5. package/dist/base-assets/connectors/devserver.js +2 -2
  6. package/dist/base-assets/connectors/flow/adapter.js +2 -2
  7. package/dist/base-assets/connectors/flow/run-flow.js +3 -3
  8. package/dist/base-assets/connectors/flow.js +2 -2
  9. package/dist/base-assets/connectors/git.js +2 -2
  10. package/dist/base-assets/connectors/gmail.js +2 -2
  11. package/dist/base-assets/connectors/local.js +2 -2
  12. package/dist/base-assets/connectors/mattermost.js +2 -2
  13. package/dist/base-assets/connectors/memory.js +2 -2
  14. package/dist/base-assets/connectors/minio.js +2 -2
  15. package/dist/base-assets/connectors/postgres.js +2 -2
  16. package/dist/base-assets/connectors/redis.js +2 -2
  17. package/dist/base-assets/connectors/s3.js +2 -2
  18. package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +1 -1
  19. package/dist/base-assets/connectors/sharepoint.js +2 -2
  20. package/dist/base-assets/connectors/sqlite.js +2 -2
  21. package/dist/base-assets/connectors/static-server.js +2 -2
  22. package/dist/base-assets/connectors/tunnel.js +2 -2
  23. package/dist/base-assets/connectors/webdav/driver.d.ts.map +1 -1
  24. package/dist/base-assets/connectors/webdav.js +2 -2
  25. package/dist/base-assets/connectors/xstate-store.js +2 -2
  26. package/dist/base-assets/connectors/xstate.js +2 -2
  27. package/dist/base-assets/connectors/yjs.js +2 -2
  28. package/dist/bridge/drivers/claude-sdk.js +42 -1
  29. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  30. package/dist/bridge/drivers/codex.js +1 -1
  31. package/dist/bridge/drivers/echo.js +1 -1
  32. package/dist/bridge/drivers/omp.js +1 -1
  33. package/dist/bridge/index.js +2 -2
  34. package/dist/bridge/src/drivers/claude-sdk.d.ts +22 -0
  35. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  36. package/dist/{chunk-OVM36NYF.js → chunk-34333Z5H.js} +199 -85
  37. package/dist/chunk-34333Z5H.js.map +1 -0
  38. package/dist/{chunk-EBMFCF4P.js → chunk-6MB7CRME.js} +17 -6
  39. package/dist/chunk-6MB7CRME.js.map +1 -0
  40. package/dist/{chunk-UHSC75L7.js → chunk-EAJKY27M.js} +9 -9
  41. package/dist/chunk-EAJKY27M.js.map +1 -0
  42. package/dist/{chunk-FEBLE7QX.js → chunk-EARKGKKB.js} +2 -2
  43. package/dist/{chunk-FEBLE7QX.js.map → chunk-EARKGKKB.js.map} +1 -1
  44. package/dist/{chunk-OSJH4SPO.js → chunk-VMU2WEN7.js} +3 -3
  45. package/dist/{chunk-OSJH4SPO.js.map → chunk-VMU2WEN7.js.map} +1 -1
  46. package/dist/{chunk-IFRUVHOQ.js → chunk-XYEFV7XN.js} +3 -3
  47. package/dist/{chunk-IFRUVHOQ.js.map → chunk-XYEFV7XN.js.map} +1 -1
  48. package/dist/{chunk-OQIBHB4F.js → chunk-YHXBQLXX.js} +2 -2
  49. package/dist/{chunk-OQIBHB4F.js.map → chunk-YHXBQLXX.js.map} +1 -1
  50. package/dist/{chunk-S7RACIZI.js → chunk-YOFKTALB.js} +2 -2
  51. package/dist/{chunk-S7RACIZI.js.map → chunk-YOFKTALB.js.map} +1 -1
  52. package/dist/{chunk-BTKNSMLK.js → chunk-Z5PO7ZVP.js} +2 -2
  53. package/dist/{chunk-BTKNSMLK.js.map → chunk-Z5PO7ZVP.js.map} +1 -1
  54. package/dist/cli/index.js +10 -10
  55. package/dist/connectors/index.js +2 -2
  56. package/dist/connectors/rclone.js +1 -1
  57. package/dist/connectors/src/fs-utils.d.ts +33 -0
  58. package/dist/connectors/src/fs-utils.d.ts.map +1 -0
  59. package/dist/connectors/src/index.d.ts +1 -0
  60. package/dist/connectors/src/index.d.ts.map +1 -1
  61. package/dist/connectors/src/rclone-process-manager.d.ts.map +1 -1
  62. package/dist/runner/index.js +6 -6
  63. package/dist/runner/src/ai-credential-refresh.d.ts +74 -0
  64. package/dist/runner/src/ai-credential-refresh.d.ts.map +1 -0
  65. package/dist/runner/src/serve-credentials.d.ts +21 -0
  66. package/dist/runner/src/serve-credentials.d.ts.map +1 -1
  67. package/dist/runner/src/serve.d.ts +2 -2
  68. package/dist/runner/src/serve.d.ts.map +1 -1
  69. package/dist/sdk/asset-manager.js +2 -2
  70. package/dist/sdk/bridge.js +2 -2
  71. package/dist/sdk/index.js +6 -6
  72. package/dist/sdk/runner.js +6 -6
  73. package/dist/{setup-QIEPIYH2.js → setup-QAOUBECX.js} +4 -4
  74. package/dist/{setup-QIEPIYH2.js.map → setup-QAOUBECX.js.map} +1 -1
  75. package/dist/tui/index.js +6 -6
  76. package/dist/workspace-plugin/index.js +1 -1
  77. package/package.json +1 -1
  78. package/dist/chunk-EBMFCF4P.js.map +0 -1
  79. package/dist/chunk-OVM36NYF.js.map +0 -1
  80. package/dist/chunk-UHSC75L7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../asset-manager/src/scaffold/layers/base.ts","../asset-manager/src/scaffold/layers/container.ts","../asset-manager/src/scaffold/layers/driver-target.ts","../asset-manager/src/scaffold/layers/hooks.ts","../asset-manager/src/scaffold/layers/connectors.ts","../asset-manager/src/scaffold/layers/skills.ts","../asset-manager/src/scaffold/layers/template.ts","../asset-manager/src/scaffold/scaffolder.ts"],"names":["basename","join","existsSync","writeFileSync","mkdirSync","dirname","readFileSync","readdirSync"],"mappings":";;;;;;;;;;AAoBO,SAAS,cAAA,CACd,IAAA,EACA,WAAA,EACA,gBAAA,EACA,WACA,IAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAG3B,EAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG;AACrB,IAAA,SAAA,CAAU,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACnC,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAClB;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,UAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxC,IAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,EACzB;AAGA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,SAAA,CAAU,WAAA,EAAa,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1C,IAAA,OAAA,CAAQ,KAAK,mBAAmB,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AACpD,EAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,GAAI,oBAAoB,EAAC;AAAA,MACzB,GAAI,IAAA,CAAK,QAAA,IAAY;AAAC,KACxB;AACA,IAAA,aAAA,CAAc,cAAc,CAAA,EAAG,IAAA,CAAK,UAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AACpE,IAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AAAA,EACtC;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,IAAa,WAAA,EAAa,aAAa,EAAC;AAC7D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,WAAA,EAAa,YAAY,EAAC;AAE5D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AAC7C,EAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,IAAI,CAAA;AAG9C,IAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC9C,MAAA,MAAM,QAAiC,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,EAAE,IAAA,EAAK;AACpE,MAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,CAAE,MAAA;AAC/B,MAAA,IAAI,MAAM,CAAA,IAAK,QAAA,CAAS,MAAA,GAAS,CAAA,QAAS,YAAA,GAAe,QAAA;AACzD,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,QAAA,GAAoC;AAAA,MACxC,IAAA,EAAM,WAAA;AAAA,MACN,WAAA,EAAa,GAAG,WAAW,CAAA,sBAAA,CAAA;AAAA,MAC3B,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS;AAAA,UACP,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO,mBAAA;AAAA,UACP,MAAA,EAAQ,YAAA;AAAA,UACR,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AACA,IAAA,aAAA,CAAc,YAAA,EAAc,SAAA,CAAU,QAAQ,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,OAAA;AACT;AC7EO,SAAS,mBAAA,CACd,IAAA,EACA,MAAA,EACA,WAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,OAAA;AAE7B,EAAA,MAAM,IAAA,GAAO,WAAA,IAAeA,QAAAA,CAAS,IAAI,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,gBAAA;AACtC,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,IAAA;AAGhC,EAAA,MAAM,cAAA,GAAiBC,IAAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAC9C,EAAA,IAAI,CAACC,UAAAA,CAAW,cAAc,CAAA,EAAG;AAC/B,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAC/D,IAAAC,aAAAA,CAAc,gBAAgB,UAAU,CAAA;AACxC,IAAA,OAAA,CAAQ,KAAK,YAAY,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,WAAA,GAAcF,IAAAA,CAAK,IAAA,EAAM,oBAAoB,CAAA;AACnD,EAAA,IAAI,CAACC,UAAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AACpD,IAAAC,aAAAA,CAAc,aAAa,OAAO,CAAA;AAClC,IAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,gBAAA,GAAmBF,IAAAA,CAAK,IAAA,EAAM,eAAe,CAAA;AACnD,EAAA,IAAI,CAACC,UAAAA,CAAW,gBAAgB,CAAA,EAAG;AACjC,IAAAC,aAAAA;AAAA,MACE,gBAAA;AAAA,MACA,CAAC,gBAAgB,MAAA,EAAQ,kBAAA,EAAoB,SAAS,YAAA,EAAc,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI;AAAA,KACnF;AACA,IAAA,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,kBAAA,CACP,SAAA,EACA,MAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAkB,CAAC,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,IAAI,mBAAmB,CAAA;AAGrE,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAO,MAAA,EAAQ,GAAI,MAAA,CAAO,QAAA,IAAY,EAAG,CAAA;AAC3D,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,IAAA,KAAA,CAAM,KAAK,CAAA,uBAAA,EAA0B,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,yCAAA,EAA4C,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,+BAAA;AAAA,KAChE;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAE,CAAA;AAAA,IAC1C;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,gCAAgC,CAAA;AAC3C,EAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AACrC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,CAAO,MAAM,GAAG,GAAI,MAAA,CAAO,KAAA,IAAS,EAAG,CAAA;AACtD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7B;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,GAAA,EAAK;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5B;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,KAAK,+DAA0D,CAAA;AACrE,EAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,EAAA,KAAA,CAAM,KAAK,+CAA+C,CAAA;AAC1D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,eAAA,CAAgB,IAAA,EAAc,MAAA,EAA8B,MAAA,EAAwB;AAC3F,EAAA,MAAM,cAAc,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,GAAG,EAAE,WAAA,EAAY;AAClE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE,CAAC,CAAA;AAErF,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,WAAA;AAAA,IACA,KAAK,WAAW,CAAA,CAAA,CAAA;AAAA,IAChB,cAAA;AAAA,IACA,uBAAuB,WAAW,CAAA;AAAA,GACpC;AAGA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAChC;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AAC7C,IAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,GAAA,EAAK;AAC/B,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AACxC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;ACnJO,SAAS,sBAAA,CACd,IAAA,EACA,MAAA,EACA,oBAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,YAAA,GAAgB,oBAAA,IACpB,MAAA,GAAS,gBAAgB,CAAA,IACzB,aAAA;AAEF,EAAA,MAAM,SAAA,GAAY,eAAe,YAAY,CAAA;AAC7C,EAAA,IAAI,CAAC,WAAW,OAAO,OAAA;AAGvB,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAChD,IAAA,YAAA,CAAa,IAAI,GAAG,CAAA;AAAA,EACtB;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,YAAA,CAAa,IAAI,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,QAAA,GAAWF,IAAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AAC/B,IAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAAE,SAAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AC7BO,SAAS,eAAA,CACd,IAAA,EACA,MAAA,EACA,GAAA,EACa;AACb,EAAA,MAAM,SAAsB,EAAE,OAAA,EAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AACxD,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AAGpB,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,MAAA,GAASH,IAAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAChC,IAAA,IAAI,CAACC,UAAAA,CAAW,MAAM,CAAA,EAAG;AACvB,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,YAAY,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AACjD,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC3B,QAAA,GAAA,GAAM,4BAA4B,CAAA;AAAA,MACpC,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAE,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA,EAAG;AACnD,IAAA,MAAM,aAAA,GAAgBD,IAAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAC7C,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAIC,UAAAA,CAAW,aAAa,CAAA,EAAG;AAC7B,MAAA,QAAA,GAAW,YAAA,CAAa,eAAe,OAAO,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACvE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,CAAC,MAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AAEvE,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,MAAA,GAAS,CAAA,EAAA,CAAI,QAAA,IAAY,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA,GAAO,EAAA,IAAM,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAC5F,MAAAC,aAAAA,CAAc,aAAA,EAAe,QAAA,GAAW,MAAM,CAAA;AAC9C,MAAA,IAAI,CAAC,cAAc,IAAA,EAAM;AACvB,QAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,YAAY,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,YAAA,EAAc;AACxC,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC5C,QAAA,MAAM,MAAM,MAAA,CAAO,GAAA,GAAMF,KAAK,IAAA,EAAM,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA;AAClD,QAAA,IAAI,CAACC,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,UAAAE,SAAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,QACpC;AACA,QAAA,QAAA,CAAS,OAAO,GAAA,EAAK;AAAA,UACnB,GAAA;AAAA,UACA,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,GAAA;AAAA,UACT,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,eAAe,IAAA;AAAK,SAC5C,CAAA;AACD,QAAA,GAAA,GAAM,CAAA,cAAA,EAAiB,MAAA,CAAO,IAAI,CAAA,WAAA,CAAa,CAAA;AAAA,MACjD,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,MAAA,CAAO,SAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAO,IAAI,CAAA,UAAA,EAAa,GAAG,CAAA,CAAE,CAAA;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;ACxEO,SAAS,oBAAA,CACd,IAAA,EACA,UAAA,EACA,GAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,UAA4B,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,aAAa,EAAC;AAC5E,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,OAAA;AAG5B,EAAA,MAAM,QAAA,GAAWH,IAAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AACzC,EAAA,IAAIC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AAChD,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAA,CAAO,YAAA,CAAa;AAAA,QAClB,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,MAAA,EAAQ,EAAE,MAAA,IAAU,WAAA;AAAA,QACpB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,SAAS,CAAA,CAAE;AAAA,OACZ,CAAA;AAAA,IACH;AACA,IAAA,MAAA,CAAO,IAAA,EAAK;AACZ,IAAA,GAAA,GAAM,CAAA,MAAA,EAAS,OAAA,CAAQ,MAAM,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC7D,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,qFAAqF,CAAA;AAAA,EAC7F;AAGA,EAAA,KAAA,MAAW,aAAa,OAAA,EAAS;AAC/B,IAAA,IAAI,SAAA,CAAU,cAAc,KAAA,EAAO;AACnC,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,SAAA,IAAa,CAAA,YAAA,EAAe,UAAU,EAAE,CAAA,CAAA;AACpE,IAAA,MAAM,QAAA,GAAWD,IAAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AACrC,IAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAAE,SAAAA,CAAU,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,CAAA,CAAG,CAAA;AAC5B,MAAA,GAAA,GAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;ACnCA,eAAe,gBAAA,GAAwC;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,OAAO,0BAAgB,CAAA;AACzC,IAAA,OAAO,IAAI,YAAA,IAAgB,IAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAaA,eAAsB,gBAAA,CACpB,IAAA,EACA,MAAA,EACA,GAAA,EAC8B;AAC9B,EAAA,MAAM,SAA8B,EAAE,SAAA,EAAW,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAClE,EAAA,IAAI,CAAC,MAAA,EAAQ,WAAA,EAAa,OAAO,MAAA;AAEjC,EAAA,MAAM,YAAA,GAAeH,IAAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AAC7C,EAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,QAAA,CAAS,KAAK,+CAA+C,CAAA;AACpE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,MAAM,gBAAA,EAAiB;AAC5C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA;AAAA,MACd;AAAA,KACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,4BAA4B,CAAA;AAElC,IAAA,MAAM,KAAK,IAAI,YAAA,CAAa,EAAE,UAAA,EAAY,MAAM,CAAA;AAChD,IAAA,MAAM,aAAA,GAAgB,MAAM,EAAA,CAAG,OAAA,EAAQ;AAEvC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AAChC,MAAA,MAAA,CAAO,SAAA,GAAY,aAAA;AAAA,IACrB,CAAA,MAAA,IAAW,eAAe,QAAA,EAAU;AAClC,MAAA,MAAA,CAAO,YAAY,aAAA,CAAc,QAAA;AAAA,IACnC;AAEA,IAAA,GAAA,GAAM,CAAA,UAAA,EAAa,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,EACvD,SAAS,GAAA,EAAc;AACrB,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,MAAA;AACT;AC9EA,SAAS,mBAAA,CAAoB,GAAA,EAAa,IAAA,EAAc,OAAA,EAAmB,QAAA,EAAwB;AACjG,EAAA,IAAI,CAACA,UAAAA,CAAW,IAAI,CAAA,EAAGE,UAAU,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1D,EAAA,KAAA,MAAW,SAAS,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AAC7D,IAAA,MAAM,OAAA,GAAUH,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACpC,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AACtC,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,mBAAA,CAAoB,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC1D,CAAA,MAAA,IAAW,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,MAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;AAWO,SAAS,kBAAA,CACd,IAAA,EACA,MAAA,EACA,WAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AAGpB,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,IAAA,IAAIF,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAExB,MAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,SAAA,EAAW,UAAA,EAAY,WAAW,CAAA,EAAG;AACvD,QAAA,MAAM,GAAA,GAAMD,IAAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,IAAI,CAAA;AACpD,QAAA,IAAIC,WAAW,GAAG,CAAA,IAAK,CAACA,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAC5C,UAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,UAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAC1B,UAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,QACvC;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAAeH,IAAAA,CAAK,QAAA,EAAU,WAAW,CAAA;AAC/C,MAAA,IAAIC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,QAAA,MAAM,aAAA,GAAgBD,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,WAAW,CAAA;AAChE,QAAA,mBAAA,CAAoB,YAAA,EAAc,aAAA,EAAe,OAAA,EAAS,IAAI,CAAA;AAAA,MAChE;AAGA,MAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AACzC,MAAA,IAAIC,UAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,MAAM,UAAA,GAAaD,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,QAAQ,CAAA;AAC1D,QAAA,mBAAA,CAAoB,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,IAAI,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,SAAS,CAAA;AACzD,IAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAAD,aAAAA,CAAc,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA;AACnC,MAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AAAA,IACtC;AAAA,EACF;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAM,SAAA,GAAYF,IAAAA,CAAK,IAAA,EAAM,SAAA,EAAW,SAAS,UAAU,CAAA;AAC3D,IAAA,IAAI,CAACC,UAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAAE,UAAU,OAAA,CAAQ,SAAS,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACjD,MAAAD,aAAAA,CAAc,SAAA,EAAW,MAAA,CAAO,KAAK,CAAA;AACrC,MAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,WAAA,EAAa;AAC/B,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,MAAM,OAAA,GAAUF,IAAAA,CAAK,WAAA,EAAa,IAAA,CAAK,GAAG,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AACrC,MAAA,IAAI,CAACC,UAAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,IAAIA,UAAAA,CAAW,QAAQ,CAAA,EAAG;AAE1B,MAAA,IAAI,QAAA,CAAS,OAAO,CAAA,CAAE,WAAA,EAAY,EAAG;AACnC,QAAA,mBAAA,CAAoB,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAAA,MACtD,CAAA,MAAO;AACL,QAAAE,UAAU,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,QAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AAC9B,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;ACxFA,IAAI,oBAAA,GAAsC,IAAA;AAO1C,SAAS,sBAAA,GAAiC;AACxC,EAAA,IAAI,sBAAsB,OAAO,oBAAA;AACjC,EAAA,OAAOH,IAAAA,CAAKI,OAAAA,CAAQ,IAAI,GAAA,CAAI,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA,CAAE,QAAQ,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,WAAW,CAAA;AACjF;AAUO,SAAS,gBAAgB,GAAA,EAAmB;AACjD,EAAA,oBAAA,GAAuB,QAAQ,GAAG,CAAA;AACpC;AAgBO,SAAS,oBAAoB,QAAA,EAAiC;AAEnE,EAAA,IAAI,SAAS,QAAA,CAAS,OAAO,KAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3D,IAAA,MAAM,GAAA,GAAM,QAAQ,QAAQ,CAAA;AAC5B,IAAA,OAAOH,UAAAA,CAAW,GAAG,CAAA,GAAI,GAAA,GAAM,IAAA;AAAA,EACjC;AAGA,EAAA,MAAM,OAAA,GAAU,QAAQ,QAAQ,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQD,IAAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AAC5C,EAAA,IAAIC,UAAAA,CAAW,KAAK,CAAA,EAAG,OAAO,KAAA;AAG9B,EAAA,MAAM,OAAA,GAAUD,IAAAA,CAAK,sBAAA,EAAuB,EAAG,UAAU,gBAAgB,CAAA;AACzE,EAAA,IAAIC,UAAAA,CAAW,OAAO,CAAA,EAAG,OAAO,OAAA;AAEhC,EAAA,OAAO,IAAA;AACT;AASO,SAAS,aAAa,YAAA,EAAmE;AAC9F,EAAA,MAAM,GAAA,GAAMI,YAAAA,CAAa,YAAA,EAAc,OAAO,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,MAAM,GAAG,CAAA;AAC1B,EAAA,MAAM,GAAA,GAAMD,QAAQ,YAAY,CAAA;AAEhC,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,UAAA,GACJ,mBAAA,CAAoB,QAAA,CAAS,OAAO,CAAA,IAAK,oBAAoBJ,IAAAA,CAAK,GAAA,EAAK,QAAA,CAAS,OAAO,CAAC,CAAA;AAC1F,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,MAAA,GAAS,aAAa,UAAU,CAAA;AAEtC,MAAA,MAAM,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,aAAa,OAAA,EAAS,GAAG,eAAc,GAAI,QAAA;AACxE,MAAA,MAAA,CAAO,OAAO,QAAA,EAAU;AAAA,QACtB,GAAG,MAAA,CAAO,QAAA;AAAA,QACV,IAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,GAAG;AAAA,OACJ,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAU,GAAA,EAAI;AACzB;AAQO,SAAS,aAAA,GAA4E;AAC1F,EAAA,MAAM,YAAwE,EAAC;AAC/E,EAAA,MAAM,eAAe,sBAAA,EAAuB;AAC5C,EAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG,OAAO,SAAA;AAEtC,EAAA,MAAM,EAAE,WAAA,EAAAK,YAAAA,EAAY,GAAI,UAAQ,IAAS,CAAA;AACzC,EAAA,KAAA,MAAW,SAASA,YAAAA,CAAY,YAAA,EAAc,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AACtE,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAC1B,IAAA,MAAM,MAAA,GAASN,IAAAA,CAAK,YAAA,EAAc,KAAA,CAAM,MAAM,gBAAgB,CAAA;AAC9D,IAAA,IAAI,CAACC,UAAAA,CAAW,MAAM,CAAA,EAAG;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMI,YAAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,MAAM,GAAG,CAAA;AAC1B,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,QAAA,CAAS,IAAA,IAAQ,KAAA,CAAM,IAAA;AAAA,QAC7B,WAAA,EAAa,SAAS,WAAA,IAAe,EAAA;AAAA,QACrC,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AA8BA,eAAsB,kBAAkB,IAAA,EAAgD;AACtF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,KAAQ,MAAM;AAAA,EAAC,CAAA,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,IAAA;AAAA,IACN,SAAS,EAAC;AAAA,IACV,WAAW,EAAC;AAAA,IACZ,UAAU;AAAC,GACb;AAGA,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AACtD,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAC3D,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,WAAA,EAAY,GAAI,aAAa,YAAY,CAAA;AAChE,EAAA,GAAA,CAAI,CAAA,qCAAA,EAAwC,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AAK3D,EAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,EAAA,MAAM,eAAgB,IAAA,CAAK,YAAA,IACzB,QAAA,CAAS,SAAA,GAAY,gBAAgB,CAAA,IACrC,aAAA;AACF,EAAA,MAAM,WAAA,GAAc,cAAA;AAAA,IAClB,IAAA;AAAA,IACA,SAAS,WAAW,CAAA;AAAA,IACpB,QAAA,CAAS,QAAA;AAAA,IACT,YAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAGlC,EAAA,MAAM,mBAAmB,QAAA,CAAS,UAAA;AAClC,EAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC5B,IAAA,GAAA,CAAI,8BAA8B,CAAA;AAClC,IAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,IAAA,EAAM,gBAAA,EAAkB,GAAG,CAAA;AACnE,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,EACnC;AAGA,EAAA,GAAA,CAAI,iCAAiC,CAAA;AACrC,EAAA,MAAM,YAAY,sBAAA,CAAuB,IAAA,EAAM,QAAA,CAAS,SAAA,EAAW,KAAK,YAAY,CAAA;AACpF,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,SAAS,CAAA;AAGhC,EAAA,GAAA,CAAI,4BAA4B,CAAA;AAEhC,EAAA,MAAM,iBAAiB,QAAA,CAAS,QAAA;AAChC,EAAA,IAAI,gBAAgB,QAAA,IAAY,CAAC,eAAe,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,EAAG;AACxE,IAAA,cAAA,CAAe,QAAA,GAAWL,IAAAA,CAAK,WAAA,EAAa,cAAA,CAAe,QAAQ,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,IAAA,EAAM,cAAA,EAAgB,WAAW,CAAA;AACxE,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAW,CAAA;AAGlC,EAAA,GAAA,CAAI,0BAA0B,CAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,GAAe,EAAE,SAAS,IAAA,CAAK,YAAA,KAAiB,QAAA,CAAS,MAAA;AACnF,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAI,CAAA,EAAG,MAAA;AAC9C,EAAA,MAAM,eAAe,MAAM,gBAAA;AAAA,IACzB,IAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,YAAA,CAAa,OAAO,CAAA;AAC3C,EAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AAG7C,EAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,IAAA,GAAA,CAAI,0BAA0B,CAAA;AAC9B,IAAA,MAAM,eAAe,MAAM,gBAAA,CAAiB,IAAA,EAAM,QAAA,CAAS,QAAQ,GAAG,CAAA;AACtE,IAAA,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,GAAG,YAAA,CAAa,SAAS,CAAA;AAC/C,IAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,GAAG,YAAA,CAAa,QAAQ,CAAA;AAAA,EAC/C;AAGA,EAAA,GAAA,CAAI,yBAAyB,CAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,IAAA,EAAM,QAAA,CAAS,OAAO,GAAG,CAAA;AAC7D,EAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,WAAA,CAAY,OAAO,CAAA;AAC1C,EAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,GAAG,WAAA,CAAY,QAAQ,CAAA;AAG5C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,WAAW,OAAA,IAAW,KAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,GAAA,CAAI,6BAA6B,CAAA;AACjC,IAAA,MAAM,gBAAA,GAAmB,mBAAA;AAAA,MACvB,IAAA;AAAA,MACA,EAAE,GAAG,QAAA,CAAS,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,MACvC,IAAA,CAAK;AAAA,KACP;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAAA,EACzC;AAEA,EAAA,GAAA,CAAI,CAAA,sBAAA,EAAyB,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,mBAAA,CAAqB,CAAA;AACvE,EAAA,OAAO,MAAA;AACT","file":"chunk-OQIBHB4F.js","sourcesContent":["/**\n * Base layer — creates .skaile/ directory, settings.json, and skaile.yaml.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport type { AiResourcesLayerConfig, ScaffoldOptions } from \"../types.js\";\n\n/**\n * Apply the base scaffold layer — creates `.skaile/`, `settings.json`, and `skaile.yaml`.\n *\n * @param dest - Absolute path to the workspace root to create.\n * @param aiResources - AI resource config from the template manifest (sources, requires).\n * @param templateSettings - Template-default settings merged under user overrides.\n * @param framework - Default agent framework written to `skaile.yaml` `agent-config`.\n * @param opts - Full scaffold options (provides name, settings, resources, requires overrides).\n * @returns Array of created file/directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyBaseLayer(\n dest: string,\n aiResources: AiResourcesLayerConfig | undefined,\n templateSettings: Record<string, unknown> | undefined,\n framework: string,\n opts: ScaffoldOptions,\n): string[] {\n const created: string[] = [];\n\n // Create workspace root\n if (!existsSync(dest)) {\n mkdirSync(dest, { recursive: true });\n created.push(\".\");\n }\n\n // Create .skaile/ directory\n const skaileDir = join(dest, \".skaile\");\n if (!existsSync(skaileDir)) {\n mkdirSync(skaileDir, { recursive: true });\n created.push(\".skaile/\");\n }\n\n // Create .skaile/sessions/ directory\n const sessionsDir = join(skaileDir, \"sessions\");\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true });\n created.push(\".skaile/sessions/\");\n }\n\n // Write settings.json (merge template defaults + user overrides)\n const settingsPath = join(skaileDir, \"settings.json\");\n if (!existsSync(settingsPath)) {\n const settings = {\n ...(templateSettings ?? {}),\n ...(opts.settings ?? {}),\n };\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n created.push(\".skaile/settings.json\");\n }\n\n // Write skaile.yaml (unified workspace config)\n const sources = opts.resources ?? aiResources?.resources ?? [];\n const requires = opts.requires ?? aiResources?.requires ?? [];\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n const projectName = opts.name ?? basename(dest);\n\n // Build ai_resources as array with dependencies on first source\n const aiResourceEntries = sources.map((r, i) => {\n const entry: Record<string, unknown> = { name: r.name, path: r.path };\n if (r.branch) entry.branch = r.branch;\n if (i === 0 && requires.length > 0) entry.dependencies = requires;\n return entry;\n });\n\n const wsConfig: Record<string, unknown> = {\n name: projectName,\n description: `${projectName} AI skill dependencies`,\n \"agent-config\": {\n default: {\n agent: framework,\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n driver: \"claude-sdk\",\n max_turns: 200,\n },\n },\n ai_resources: aiResourceEntries,\n };\n writeFileSync(wsConfigPath, stringify(wsConfig));\n created.push(\"skaile.yaml\");\n }\n\n return created;\n}\n","/**\n * Container layer — generates Dockerfile and docker-compose.yml for\n * containerized agent workspaces.\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { ContainerLayerConfig } from \"../types.js\";\n\n/**\n * Apply the container scaffold layer — generates `Dockerfile`, `docker-compose.yml`, and `.dockerignore`.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Container layer configuration from the template manifest or `ScaffoldOptions.docker`.\n * @param projectName - Project name used as the docker-compose service name.\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyContainerLayer(\n dest: string,\n config: ContainerLayerConfig | undefined,\n projectName?: string,\n): string[] {\n const created: string[] = [];\n if (!config?.enabled) return created;\n\n const name = projectName ?? basename(dest);\n const baseImage = config.baseImage ?? \"node:22-alpine\";\n const wsPort = config.wsPort ?? 3100;\n\n // Generate Dockerfile\n const dockerfilePath = join(dest, \"Dockerfile\");\n if (!existsSync(dockerfilePath)) {\n const dockerfile = generateDockerfile(baseImage, config, wsPort);\n writeFileSync(dockerfilePath, dockerfile);\n created.push(\"Dockerfile\");\n }\n\n // Generate docker-compose.yml\n const composePath = join(dest, \"docker-compose.yml\");\n if (!existsSync(composePath)) {\n const compose = generateCompose(name, config, wsPort);\n writeFileSync(composePath, compose);\n created.push(\"docker-compose.yml\");\n }\n\n // Generate .dockerignore\n const dockerignorePath = join(dest, \".dockerignore\");\n if (!existsSync(dockerignorePath)) {\n writeFileSync(\n dockerignorePath,\n [\"node_modules\", \".git\", \".skaile/sessions\", \"*.log\", \".env.local\", \"\"].join(\"\\n\"),\n );\n created.push(\".dockerignore\");\n }\n\n return created;\n}\n\nfunction generateDockerfile(\n baseImage: string,\n config: ContainerLayerConfig,\n wsPort: number,\n): string {\n const lines: string[] = [`FROM ${baseImage}`, \"\", \"# System packages\"];\n\n // System packages\n const packages = [\"git\", \"curl\", ...(config.packages ?? [])];\n if (baseImage.includes(\"alpine\")) {\n lines.push(`RUN apk add --no-cache ${packages.join(\" \")}`);\n } else {\n lines.push(\n `RUN apt-get update && apt-get install -y ${packages.join(\" \")} && rm -rf /var/lib/apt/lists/*`,\n );\n }\n lines.push(\"\");\n\n // Agent CLIs\n if (config.agents && config.agents.length > 0) {\n lines.push(\"# Agent CLIs\");\n for (const agent of config.agents) {\n lines.push(`RUN npm install -g ${agent}`);\n }\n lines.push(\"\");\n }\n\n // Working directory\n lines.push(\"WORKDIR /workspace\");\n lines.push(\"\");\n\n // Copy workspace files\n lines.push(\"# Copy workspace configuration\");\n lines.push(\"COPY skaile.yaml ./\");\n lines.push(\"COPY .skaile/ ./.skaile/\");\n lines.push(\"\");\n\n // Ports\n const ports = [String(wsPort), ...(config.ports ?? [])];\n for (const port of ports) {\n lines.push(`EXPOSE ${port}`);\n }\n lines.push(\"\");\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\"# Environment\");\n for (const envVar of config.env) {\n lines.push(`ENV ${envVar}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"# Default entrypoint — override in compose or at runtime\");\n lines.push('ENTRYPOINT [\"sh\", \"-c\"]');\n lines.push('CMD [\"echo Agent workspace ready && exec sh\"]');\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction generateCompose(name: string, config: ContainerLayerConfig, wsPort: number): string {\n const serviceName = name.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase();\n const ports = [`${wsPort}:${wsPort}`, ...(config.ports ?? []).map((p) => `${p}:${p}`)];\n\n const lines: string[] = [\n \"services:\",\n ` ${serviceName}:`,\n \" build: .\",\n ` container_name: ${serviceName}`,\n ];\n\n // Ports\n if (ports.length > 0) {\n lines.push(\" ports:\");\n for (const port of ports) {\n lines.push(` - \"${port}\"`);\n }\n }\n\n // Volumes / mounts\n if (config.mounts && config.mounts.length > 0) {\n lines.push(\" volumes:\");\n for (const mount of config.mounts) {\n if (mount.type === \"bind\") {\n lines.push(` - ${mount.source}:${mount.target}`);\n } else {\n lines.push(` - ${mount.source}:${mount.target}`);\n }\n }\n }\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\" environment:\");\n for (const envVar of config.env) {\n if (envVar.includes(\"=\")) {\n lines.push(` - ${envVar}`);\n } else {\n lines.push(` - ${envVar}`);\n }\n }\n }\n\n lines.push(\" restart: unless-stopped\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Driver target layer — creates agent-specific directories (.claude/, .omp/, etc.)\n * based on the DRIVER_TARGETS configuration.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DRIVER_TARGETS } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { DriverTargetLayerConfig } from \"../types.js\";\n\n/**\n * Apply the driver-target scaffold layer — creates framework-specific directories (`.claude/`, `.omp/`, etc.).\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Driver target layer configuration from the template manifest.\n * @param driverTargetOverride - Overrides `config[\"default-target\"]` when provided.\n * @returns Array of created directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyDriverTargetLayer(\n dest: string,\n config: DriverTargetLayerConfig | undefined,\n driverTargetOverride?: DriverTarget,\n): string[] {\n const created: string[] = [];\n const driverTarget = (driverTargetOverride ??\n config?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n\n const targetMap = DRIVER_TARGETS[driverTarget];\n if (!targetMap) return created;\n\n // Create all local deploy target directories\n const dirsToCreate = new Set<string>();\n for (const dir of Object.values(targetMap.local)) {\n dirsToCreate.add(dir);\n }\n\n // Add extras from template\n if (config?.extras) {\n for (const extra of config.extras) {\n dirsToCreate.add(extra);\n }\n }\n\n for (const dir of dirsToCreate) {\n const fullPath = join(dest, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n created.push(`${dir}/`);\n }\n }\n\n return created;\n}\n","/**\n * Hooks layer — git init, .gitignore generation, and post-scaffold setup scripts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { HooksLayerConfig } from \"../types.js\";\n\n/** Result of the hooks scaffold layer. */\nexport interface HooksResult {\n /** Paths to files and directories created by this layer, relative to the workspace root. */\n created: string[];\n /** Non-fatal warnings collected during hook execution (e.g. failed setup scripts). */\n warnings: string[];\n}\n\n/**\n * Apply the hooks scaffold layer — runs `git init`, appends `.gitignore` entries, and executes setup scripts.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Hooks layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link HooksResult} with created file paths and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyHooksLayer(\n dest: string,\n config: HooksLayerConfig | undefined,\n log?: (msg: string) => void,\n): HooksResult {\n const result: HooksResult = { created: [], warnings: [] };\n if (!config) return result;\n\n // Git init\n if (config.gitInit) {\n const gitDir = join(dest, \".git\");\n if (!existsSync(gitDir)) {\n try {\n execSync(\"git init\", { cwd: dest, stdio: \"pipe\" });\n result.created.push(\".git/\");\n log?.(\"Initialized git repository\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`git init failed: ${msg}`);\n }\n }\n }\n\n // .gitignore\n if (config.gitignore && config.gitignore.length > 0) {\n const gitignorePath = join(dest, \".gitignore\");\n let existing = \"\";\n if (existsSync(gitignorePath)) {\n existing = readFileSync(gitignorePath, \"utf-8\");\n }\n\n const existingLines = new Set(existing.split(\"\\n\").map((l) => l.trim()));\n const newEntries = config.gitignore.filter((e) => !existingLines.has(e));\n\n if (newEntries.length > 0) {\n const append = `${(existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\") + newEntries.join(\"\\n\")}\\n`;\n writeFileSync(gitignorePath, existing + append);\n if (!existingLines.size) {\n result.created.push(\".gitignore\");\n }\n }\n }\n\n // Setup scripts\n if (config.setupScripts) {\n for (const script of config.setupScripts) {\n try {\n log?.(`Running setup script: ${script.name}`);\n const cwd = script.cwd ? join(dest, script.cwd) : dest;\n if (!existsSync(cwd)) {\n mkdirSync(cwd, { recursive: true });\n }\n execSync(script.run, {\n cwd,\n stdio: \"pipe\",\n timeout: 60_000,\n env: { ...process.env, WORKSPACE_DIR: dest },\n });\n log?.(`Setup script \"${script.name}\" completed`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Setup script \"${script.name}\" failed: ${msg}`);\n }\n }\n }\n\n return result;\n}\n","/**\n * Connectors layer — writes connector declarations to skaile.yaml\n * and creates mount directories for mountable connectors.\n *\n * Actual sync/connect happens at runtime (in the runner), not at scaffold time.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { WorkspaceYamlEditor } from \"@skaile/workspaces/core\";\nimport type { ConnectorEntry } from \"../types.js\";\n\n/**\n * Apply the connectors scaffold layer — writes connector declarations to `skaile.yaml` and creates mount directories.\n *\n * @param dest - Absolute path to the workspace root.\n * @param connectors - Connector entries from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns Array of created mount directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyConnectorsLayer(\n dest: string,\n connectors: ConnectorEntry[] | undefined | null,\n log?: (msg: string) => void,\n): string[] {\n const created: string[] = [];\n const entries: ConnectorEntry[] = Array.isArray(connectors) ? connectors : [];\n if (!entries.length) return created;\n\n // Write connectors to skaile.yaml\n const yamlPath = join(dest, \"skaile.yaml\");\n if (existsSync(yamlPath)) {\n const editor = WorkspaceYamlEditor.load(yamlPath);\n for (const r of entries) {\n editor.setConnector({\n id: r.id,\n driver: r.driver,\n access: r.access ?? \"read-only\",\n auth: r.auth,\n options: r.options,\n });\n }\n editor.save();\n log?.(`Wrote ${entries.length} connector(s) to skaile.yaml`);\n } else {\n log?.(\"Skipping connector write: skaile.yaml not found (base layer should create it first)\");\n }\n\n // Create mount directories for connectors that have autoMount or mountPath\n for (const connector of entries) {\n if (connector.autoMount === false) continue;\n const mountPath = connector.mountPath ?? `.connectors/${connector.id}`;\n const absMount = join(dest, mountPath);\n if (!existsSync(absMount)) {\n mkdirSync(absMount, { recursive: true });\n created.push(`${mountPath}/`);\n log?.(`Created mount dir: ${mountPath}`);\n }\n }\n\n return created;\n}\n","/**\n * Skills layer — installs AI resources into the workspace using the asset manager.\n *\n * Now that this layer lives inside @skaile/asset-manager, the AssetManager class\n * is loaded via a lazy import from the parent package index (no more dynamic\n * external dependency hack).\n *\n * When a scopeDir is specified, the asset manager operates against that directory\n * instead of the default project directory.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SkillsLayerConfig } from \"../types.js\";\n\n/** Result of the skills scaffold layer. */\nexport interface SkillsInstallResult {\n /** Asset refs (`kind:name`) installed by `skaile install` during scaffolding. */\n installed: string[];\n /** Non-fatal warnings (e.g. `skaile.yaml` not found, install failure). */\n warnings: string[];\n}\n\n/**\n * Lazy-load AssetManager from the parent package index.\n * Returns null if not available (should not happen in normal operation).\n */\nasync function loadAssetManager(): Promise<any | null> {\n try {\n const mod = await import(\"../../index.js\");\n return mod.AssetManager ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply the skills scaffold layer — runs `skaile install` to deploy all declared asset dependencies.\n *\n * Only runs when `config.autoInstall` is `true`. Skips silently when `skaile.yaml` is absent.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Skills layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link SkillsInstallResult} with installed refs and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport async function applySkillsLayer(\n dest: string,\n config: SkillsLayerConfig | undefined,\n log?: (msg: string) => void,\n): Promise<SkillsInstallResult> {\n const result: SkillsInstallResult = { installed: [], warnings: [] };\n if (!config?.autoInstall) return result;\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n result.warnings.push(\"Skipping skill install: skaile.yaml not found\");\n return result;\n }\n\n const AssetManager = await loadAssetManager();\n if (!AssetManager) {\n result.warnings.push(\n \"Skipping skill install: AssetManager could not be loaded. Run `skaile install` manually.\",\n );\n return result;\n }\n\n try {\n log?.(\"Installing AI resources...\");\n\n const am = new AssetManager({ projectDir: dest });\n const installResult = await am.install();\n\n if (Array.isArray(installResult)) {\n result.installed = installResult;\n } else if (installResult?.deployed) {\n result.installed = installResult.deployed;\n }\n\n log?.(`Installed ${result.installed.length} skill(s)`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Skill install failed: ${msg}`);\n }\n\n return result;\n}\n","/**\n * Template layer — applies agent definition files (SOUL.md, RULES.md, knowledge/)\n * and any additional template files.\n */\n\nimport { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { TemplateLayerConfig } from \"../types.js\";\n\n/** Recursively copy a directory, skipping files that already exist at dest. */\nfunction copyDirSkipExisting(src: string, dest: string, created: string[], baseDest: string): void {\n if (!existsSync(dest)) mkdirSync(dest, { recursive: true });\n for (const entry of readdirSync(src, { withFileTypes: true })) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (entry.isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, baseDest);\n } else if (!existsSync(destPath)) {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(relative(baseDest, destPath));\n }\n }\n}\n\n/**\n * Apply the template overlay layer — copies agent definition files (`SOUL.md`, `RULES.md`, `knowledge/`) and additional static template files into the workspace.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Template layer configuration from the template manifest.\n * @param templateDir - Absolute path to the template directory (used to resolve relative `files[].src` paths).\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyTemplateLayer(\n dest: string,\n config: TemplateLayerConfig | undefined,\n templateDir?: string,\n): string[] {\n const created: string[] = [];\n if (!config) return created;\n\n // Apply agent definition from agentDir\n if (config.agentDir) {\n const agentDir = config.agentDir;\n if (existsSync(agentDir)) {\n // Copy SOUL.md, RULES.md, DUTIES.md\n for (const file of [\"SOUL.md\", \"RULES.md\", \"DUTIES.md\"]) {\n const src = join(agentDir, file);\n const destFile = join(dest, \".skaile\", \"agent\", file);\n if (existsSync(src) && !existsSync(destFile)) {\n mkdirSync(dirname(destFile), { recursive: true });\n copyFileSync(src, destFile);\n created.push(relative(dest, destFile));\n }\n }\n\n // Copy knowledge/ directory\n const knowledgeSrc = join(agentDir, \"knowledge\");\n if (existsSync(knowledgeSrc)) {\n const knowledgeDest = join(dest, \".skaile\", \"agent\", \"knowledge\");\n copyDirSkipExisting(knowledgeSrc, knowledgeDest, created, dest);\n }\n\n // Copy skills/ directory from agent def\n const skillsSrc = join(agentDir, \"skills\");\n if (existsSync(skillsSrc)) {\n const skillsDest = join(dest, \".skaile\", \"agent\", \"skills\");\n copyDirSkipExisting(skillsSrc, skillsDest, created, dest);\n }\n }\n }\n\n // Write inline soul/rules content\n if (config.soul) {\n const soulPath = join(dest, \".skaile\", \"agent\", \"SOUL.md\");\n if (!existsSync(soulPath)) {\n mkdirSync(dirname(soulPath), { recursive: true });\n writeFileSync(soulPath, config.soul);\n created.push(\".skaile/agent/SOUL.md\");\n }\n }\n if (config.rules) {\n const rulesPath = join(dest, \".skaile\", \"agent\", \"RULES.md\");\n if (!existsSync(rulesPath)) {\n mkdirSync(dirname(rulesPath), { recursive: true });\n writeFileSync(rulesPath, config.rules);\n created.push(\".skaile/agent/RULES.md\");\n }\n }\n\n // Copy additional template files\n if (config.files && templateDir) {\n for (const file of config.files) {\n const srcPath = join(templateDir, file.src);\n const destPath = join(dest, file.dest);\n if (!existsSync(srcPath)) continue;\n if (existsSync(destPath)) continue;\n\n if (statSync(srcPath).isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, dest);\n } else {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(file.dest);\n }\n }\n }\n\n return created;\n}\n","/**\n * Main scaffolder — loads a workspace template (workspace.yaml) and applies\n * all configured layers in order: base → framework → template → skills → hooks → container.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { applyAgentsLayer } from \"./layers/agents.js\";\nimport { applyBaseLayer } from \"./layers/base.js\";\nimport { applyContainerLayer } from \"./layers/container.js\";\nimport { applyDriverTargetLayer } from \"./layers/driver-target.js\";\nimport { applyHooksLayer } from \"./layers/hooks.js\";\nimport { applyConnectorsLayer } from \"./layers/connectors.js\";\nimport { applySkillsLayer } from \"./layers/skills.js\";\nimport { applyTemplateLayer } from \"./layers/template.js\";\nimport { loadSkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { ScaffoldOptions, ScaffoldResult, TemplateManifest } from \"./types.js\";\n\n// ── Built-in template directory ────────────────────────────────────────────\n\nlet _builtinTemplatesDir: string | null = null;\n\n/**\n * Get the built-in templates directory. Uses import.meta.url by default,\n * but can be overridden via setTemplatesDir() for bundled environments\n * (e.g. Nitro) where import.meta.url resolves to the bundle output.\n */\nfunction getBuiltinTemplatesDir(): string {\n if (_builtinTemplatesDir) return _builtinTemplatesDir;\n return join(dirname(new URL(import.meta.url).pathname), \"..\", \"..\", \"templates\");\n}\n\n/**\n * Override the built-in templates directory. Call this from apps that bundle\n * skaile-agent-workspace (e.g. Nitro/Nuxt) where `import.meta.url` doesn't\n * resolve to the source package.\n *\n * @param dir - Absolute path to the custom templates directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function setTemplatesDir(dir: string): void {\n _builtinTemplatesDir = resolve(dir);\n}\n\n// ── Template loading ───────────────────────────────────────────────────────\n\n/**\n * Resolve a template name or path to an absolute path to `workspace.yaml`.\n *\n * Lookup order:\n * 1. Absolute or relative path to a `workspace.yaml` file.\n * 2. Directory containing `workspace.yaml`.\n * 3. Built-in template name matching `templates/<name>/workspace.yaml`.\n *\n * @param template - Template name (e.g. `\"minimal\"`) or path to a `workspace.yaml` / directory.\n * @returns Absolute path to `workspace.yaml`, or `null` when the template cannot be found.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function resolveTemplatePath(template: string): string | null {\n // Direct path to a file\n if (template.endsWith(\".yaml\") || template.endsWith(\".yml\")) {\n const abs = resolve(template);\n return existsSync(abs) ? abs : null;\n }\n\n // Directory containing workspace.yaml\n const dirPath = resolve(template);\n const inDir = join(dirPath, \"workspace.yaml\");\n if (existsSync(inDir)) return inDir;\n\n // Built-in template name\n const builtin = join(getBuiltinTemplatesDir(), template, \"workspace.yaml\");\n if (existsSync(builtin)) return builtin;\n\n return null;\n}\n\n/**\n * Load and merge a template manifest, following `extends` chains.\n *\n * @param templatePath - Absolute path to a `workspace.yaml` template file.\n * @returns Merged `TemplateManifest` with parent sections folded in, and the template directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function loadTemplate(templatePath: string): { manifest: TemplateManifest; dir: string } {\n const raw = readFileSync(templatePath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n const dir = dirname(templatePath);\n\n if (manifest.extends) {\n const parentPath =\n resolveTemplatePath(manifest.extends) ?? resolveTemplatePath(join(dir, manifest.extends));\n if (parentPath) {\n const parent = loadTemplate(parentPath);\n // Shallow merge: child sections override parent sections per-key\n const { extends: _ext, name, description, version, ...childSections } = manifest;\n Object.assign(manifest, {\n ...parent.manifest,\n name,\n description,\n version,\n extends: _ext,\n ...childSections,\n });\n }\n }\n\n return { manifest, dir };\n}\n\n/**\n * List all available built-in templates.\n *\n * @returns Array of objects with `name`, `description`, and `path` for each available template.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function listTemplates(): Array<{ name: string; description: string; path: string }> {\n const templates: Array<{ name: string; description: string; path: string }> = [];\n const templatesDir = getBuiltinTemplatesDir();\n if (!existsSync(templatesDir)) return templates;\n\n const { readdirSync } = require(\"node:fs\");\n for (const entry of readdirSync(templatesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const wsPath = join(templatesDir, entry.name, \"workspace.yaml\");\n if (!existsSync(wsPath)) continue;\n try {\n const raw = readFileSync(wsPath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n templates.push({\n name: manifest.name ?? entry.name,\n description: manifest.description ?? \"\",\n path: wsPath,\n });\n } catch {\n // Skip unparseable templates\n }\n }\n\n return templates;\n}\n\n// ── Main scaffold function ────────────────────────────────────────────────\n\n/**\n * Scaffold a new Skaile workspace from a template, applying layers in order.\n *\n * Layer application order:\n * 1. **Base** — creates `.skaile/`, `settings.json`, and `skaile.yaml`\n * 2. **Connectors** — writes connector declarations to `skaile.yaml`\n * 3. **Driver target** — creates framework-specific directories (`.claude/`, `.omp/`, etc.)\n * 4. **Template** — copies agent definition files and static template overlays\n * 5. **Agents** — renders and installs GitAgent packages\n * 6. **Skills** — runs `skaile install` (unless `opts.skipInstall` is `true`)\n * 7. **Hooks** — runs `git init`, writes `.gitignore`, executes setup scripts\n * 8. **Container** — generates `Dockerfile` and `docker-compose.yml` (when enabled)\n *\n * @param opts - Scaffold options including destination, template, and layer overrides.\n * @returns {@link ScaffoldResult} with created paths, installed skills, and warnings.\n * @example\n * ```ts\n * const result = await scaffoldWorkspace({\n * dest: \"./my-workspace\",\n * template: \"minimal\",\n * driverTarget: \"claude-code\",\n * });\n * console.log(`Created ${result.created.length} files`);\n * ```\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport async function scaffoldWorkspace(opts: ScaffoldOptions): Promise<ScaffoldResult> {\n const log = opts.log ?? (() => {});\n const dest = resolve(opts.dest);\n const result: ScaffoldResult = {\n path: dest,\n created: [],\n installed: [],\n warnings: [],\n };\n\n // 1. Load template\n const templatePath = resolveTemplatePath(opts.template);\n if (!templatePath) {\n result.warnings.push(`Template not found: ${opts.template}`);\n return result;\n }\n\n const { manifest, dir: templateDir } = loadTemplate(templatePath);\n log(`Scaffolding workspace from template: ${manifest.name}`);\n\n // 2. Apply layers in order\n\n // Base layer: .skaile/, settings.json, skaile.yaml\n log(\"Applying base layer...\");\n const driverTarget = (opts.driverTarget ??\n manifest.framework?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n const baseCreated = applyBaseLayer(\n dest,\n manifest[\"ai-assets\"],\n manifest.settings,\n driverTarget,\n opts,\n );\n result.created.push(...baseCreated);\n\n // Connectors layer: connector declarations → skaile.yaml + mount directories\n const connectorEntries = manifest.connectors;\n if (connectorEntries?.length) {\n log(\"Applying connectors layer...\");\n const resCreated = applyConnectorsLayer(dest, connectorEntries, log);\n result.created.push(...resCreated);\n }\n\n // Driver target layer: agent-specific directories\n log(\"Applying driver target layer...\");\n const fwCreated = applyDriverTargetLayer(dest, manifest.framework, opts.driverTarget);\n result.created.push(...fwCreated);\n\n // Template layer: agent definition, template files\n log(\"Applying template layer...\");\n // Resolve agentDir relative to template directory\n const templateConfig = manifest.template;\n if (templateConfig?.agentDir && !templateConfig.agentDir.startsWith(\"/\")) {\n templateConfig.agentDir = join(templateDir, templateConfig.agentDir);\n }\n const tmplCreated = applyTemplateLayer(dest, templateConfig, templateDir);\n result.created.push(...tmplCreated);\n\n // Agents layer: install GitAgent packages into framework deploy target\n log(\"Applying agents layer...\");\n const agentsConfig = opts.agentInstall ? { install: opts.agentInstall } : manifest.agents;\n const wsConfig = loadSkWorkspaceConfig(dest)?.config;\n const agentsResult = await applyAgentsLayer(\n dest,\n agentsConfig,\n driverTarget,\n templateDir,\n wsConfig,\n log,\n );\n result.created.push(...agentsResult.created);\n result.warnings.push(...agentsResult.warnings);\n\n // Skills layer: asset manager-based resource installation\n if (!opts.skipInstall) {\n log(\"Applying skills layer...\");\n const skillsResult = await applySkillsLayer(dest, manifest.skills, log);\n result.installed.push(...skillsResult.installed);\n result.warnings.push(...skillsResult.warnings);\n }\n\n // Hooks layer: git init, .gitignore, setup scripts\n log(\"Applying hooks layer...\");\n const hooksResult = applyHooksLayer(dest, manifest.hooks, log);\n result.created.push(...hooksResult.created);\n result.warnings.push(...hooksResult.warnings);\n\n // Container layer: Dockerfile, docker-compose.yml\n const enableDocker = opts.docker ?? manifest.container?.enabled ?? false;\n if (enableDocker) {\n log(\"Applying container layer...\");\n const containerCreated = applyContainerLayer(\n dest,\n { ...manifest.container, enabled: true },\n opts.name,\n );\n result.created.push(...containerCreated);\n }\n\n log(`Workspace scaffolded: ${result.created.length} files/dirs created`);\n return result;\n}\n"]}
1
+ {"version":3,"sources":["../asset-manager/src/scaffold/layers/base.ts","../asset-manager/src/scaffold/layers/container.ts","../asset-manager/src/scaffold/layers/driver-target.ts","../asset-manager/src/scaffold/layers/hooks.ts","../asset-manager/src/scaffold/layers/connectors.ts","../asset-manager/src/scaffold/layers/skills.ts","../asset-manager/src/scaffold/layers/template.ts","../asset-manager/src/scaffold/scaffolder.ts"],"names":["basename","join","existsSync","writeFileSync","mkdirSync","dirname","readFileSync","readdirSync"],"mappings":"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","file":"chunk-YHXBQLXX.js","sourcesContent":["/**\n * Base layer — creates .skaile/ directory, settings.json, and skaile.yaml.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport type { AiResourcesLayerConfig, ScaffoldOptions } from \"../types.js\";\n\n/**\n * Apply the base scaffold layer — creates `.skaile/`, `settings.json`, and `skaile.yaml`.\n *\n * @param dest - Absolute path to the workspace root to create.\n * @param aiResources - AI resource config from the template manifest (sources, requires).\n * @param templateSettings - Template-default settings merged under user overrides.\n * @param framework - Default agent framework written to `skaile.yaml` `agent-config`.\n * @param opts - Full scaffold options (provides name, settings, resources, requires overrides).\n * @returns Array of created file/directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyBaseLayer(\n dest: string,\n aiResources: AiResourcesLayerConfig | undefined,\n templateSettings: Record<string, unknown> | undefined,\n framework: string,\n opts: ScaffoldOptions,\n): string[] {\n const created: string[] = [];\n\n // Create workspace root\n if (!existsSync(dest)) {\n mkdirSync(dest, { recursive: true });\n created.push(\".\");\n }\n\n // Create .skaile/ directory\n const skaileDir = join(dest, \".skaile\");\n if (!existsSync(skaileDir)) {\n mkdirSync(skaileDir, { recursive: true });\n created.push(\".skaile/\");\n }\n\n // Create .skaile/sessions/ directory\n const sessionsDir = join(skaileDir, \"sessions\");\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true });\n created.push(\".skaile/sessions/\");\n }\n\n // Write settings.json (merge template defaults + user overrides)\n const settingsPath = join(skaileDir, \"settings.json\");\n if (!existsSync(settingsPath)) {\n const settings = {\n ...(templateSettings ?? {}),\n ...(opts.settings ?? {}),\n };\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n created.push(\".skaile/settings.json\");\n }\n\n // Write skaile.yaml (unified workspace config)\n const sources = opts.resources ?? aiResources?.resources ?? [];\n const requires = opts.requires ?? aiResources?.requires ?? [];\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n const projectName = opts.name ?? basename(dest);\n\n // Build ai_resources as array with dependencies on first source\n const aiResourceEntries = sources.map((r, i) => {\n const entry: Record<string, unknown> = { name: r.name, path: r.path };\n if (r.branch) entry.branch = r.branch;\n if (i === 0 && requires.length > 0) entry.dependencies = requires;\n return entry;\n });\n\n const wsConfig: Record<string, unknown> = {\n name: projectName,\n description: `${projectName} AI skill dependencies`,\n \"agent-config\": {\n default: {\n agent: framework,\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n driver: \"claude-sdk\",\n max_turns: 200,\n },\n },\n ai_resources: aiResourceEntries,\n };\n writeFileSync(wsConfigPath, stringify(wsConfig));\n created.push(\"skaile.yaml\");\n }\n\n return created;\n}\n","/**\n * Container layer — generates Dockerfile and docker-compose.yml for\n * containerized agent workspaces.\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { ContainerLayerConfig } from \"../types.js\";\n\n/**\n * Apply the container scaffold layer — generates `Dockerfile`, `docker-compose.yml`, and `.dockerignore`.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Container layer configuration from the template manifest or `ScaffoldOptions.docker`.\n * @param projectName - Project name used as the docker-compose service name.\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyContainerLayer(\n dest: string,\n config: ContainerLayerConfig | undefined,\n projectName?: string,\n): string[] {\n const created: string[] = [];\n if (!config?.enabled) return created;\n\n const name = projectName ?? basename(dest);\n const baseImage = config.baseImage ?? \"node:22-alpine\";\n const wsPort = config.wsPort ?? 3100;\n\n // Generate Dockerfile\n const dockerfilePath = join(dest, \"Dockerfile\");\n if (!existsSync(dockerfilePath)) {\n const dockerfile = generateDockerfile(baseImage, config, wsPort);\n writeFileSync(dockerfilePath, dockerfile);\n created.push(\"Dockerfile\");\n }\n\n // Generate docker-compose.yml\n const composePath = join(dest, \"docker-compose.yml\");\n if (!existsSync(composePath)) {\n const compose = generateCompose(name, config, wsPort);\n writeFileSync(composePath, compose);\n created.push(\"docker-compose.yml\");\n }\n\n // Generate .dockerignore\n const dockerignorePath = join(dest, \".dockerignore\");\n if (!existsSync(dockerignorePath)) {\n writeFileSync(\n dockerignorePath,\n [\"node_modules\", \".git\", \".skaile/sessions\", \"*.log\", \".env.local\", \"\"].join(\"\\n\"),\n );\n created.push(\".dockerignore\");\n }\n\n return created;\n}\n\nfunction generateDockerfile(\n baseImage: string,\n config: ContainerLayerConfig,\n wsPort: number,\n): string {\n const lines: string[] = [`FROM ${baseImage}`, \"\", \"# System packages\"];\n\n // System packages\n const packages = [\"git\", \"curl\", ...(config.packages ?? [])];\n if (baseImage.includes(\"alpine\")) {\n lines.push(`RUN apk add --no-cache ${packages.join(\" \")}`);\n } else {\n lines.push(\n `RUN apt-get update && apt-get install -y ${packages.join(\" \")} && rm -rf /var/lib/apt/lists/*`,\n );\n }\n lines.push(\"\");\n\n // Agent CLIs\n if (config.agents && config.agents.length > 0) {\n lines.push(\"# Agent CLIs\");\n for (const agent of config.agents) {\n lines.push(`RUN npm install -g ${agent}`);\n }\n lines.push(\"\");\n }\n\n // Working directory\n lines.push(\"WORKDIR /workspace\");\n lines.push(\"\");\n\n // Copy workspace files\n lines.push(\"# Copy workspace configuration\");\n lines.push(\"COPY skaile.yaml ./\");\n lines.push(\"COPY .skaile/ ./.skaile/\");\n lines.push(\"\");\n\n // Ports\n const ports = [String(wsPort), ...(config.ports ?? [])];\n for (const port of ports) {\n lines.push(`EXPOSE ${port}`);\n }\n lines.push(\"\");\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\"# Environment\");\n for (const envVar of config.env) {\n lines.push(`ENV ${envVar}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"# Default entrypoint — override in compose or at runtime\");\n lines.push('ENTRYPOINT [\"sh\", \"-c\"]');\n lines.push('CMD [\"echo Agent workspace ready && exec sh\"]');\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction generateCompose(name: string, config: ContainerLayerConfig, wsPort: number): string {\n const serviceName = name.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase();\n const ports = [`${wsPort}:${wsPort}`, ...(config.ports ?? []).map((p) => `${p}:${p}`)];\n\n const lines: string[] = [\n \"services:\",\n ` ${serviceName}:`,\n \" build: .\",\n ` container_name: ${serviceName}`,\n ];\n\n // Ports\n if (ports.length > 0) {\n lines.push(\" ports:\");\n for (const port of ports) {\n lines.push(` - \"${port}\"`);\n }\n }\n\n // Volumes / mounts\n if (config.mounts && config.mounts.length > 0) {\n lines.push(\" volumes:\");\n for (const mount of config.mounts) {\n if (mount.type === \"bind\") {\n lines.push(` - ${mount.source}:${mount.target}`);\n } else {\n lines.push(` - ${mount.source}:${mount.target}`);\n }\n }\n }\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\" environment:\");\n for (const envVar of config.env) {\n if (envVar.includes(\"=\")) {\n lines.push(` - ${envVar}`);\n } else {\n lines.push(` - ${envVar}`);\n }\n }\n }\n\n lines.push(\" restart: unless-stopped\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Driver target layer — creates agent-specific directories (.claude/, .omp/, etc.)\n * based on the DRIVER_TARGETS configuration.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DRIVER_TARGETS } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { DriverTargetLayerConfig } from \"../types.js\";\n\n/**\n * Apply the driver-target scaffold layer — creates framework-specific directories (`.claude/`, `.omp/`, etc.).\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Driver target layer configuration from the template manifest.\n * @param driverTargetOverride - Overrides `config[\"default-target\"]` when provided.\n * @returns Array of created directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyDriverTargetLayer(\n dest: string,\n config: DriverTargetLayerConfig | undefined,\n driverTargetOverride?: DriverTarget,\n): string[] {\n const created: string[] = [];\n const driverTarget = (driverTargetOverride ??\n config?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n\n const targetMap = DRIVER_TARGETS[driverTarget];\n if (!targetMap) return created;\n\n // Create all local deploy target directories\n const dirsToCreate = new Set<string>();\n for (const dir of Object.values(targetMap.local)) {\n dirsToCreate.add(dir);\n }\n\n // Add extras from template\n if (config?.extras) {\n for (const extra of config.extras) {\n dirsToCreate.add(extra);\n }\n }\n\n for (const dir of dirsToCreate) {\n const fullPath = join(dest, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n created.push(`${dir}/`);\n }\n }\n\n return created;\n}\n","/**\n * Hooks layer — git init, .gitignore generation, and post-scaffold setup scripts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { HooksLayerConfig } from \"../types.js\";\n\n/** Result of the hooks scaffold layer. */\nexport interface HooksResult {\n /** Paths to files and directories created by this layer, relative to the workspace root. */\n created: string[];\n /** Non-fatal warnings collected during hook execution (e.g. failed setup scripts). */\n warnings: string[];\n}\n\n/**\n * Apply the hooks scaffold layer — runs `git init`, appends `.gitignore` entries, and executes setup scripts.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Hooks layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link HooksResult} with created file paths and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyHooksLayer(\n dest: string,\n config: HooksLayerConfig | undefined,\n log?: (msg: string) => void,\n): HooksResult {\n const result: HooksResult = { created: [], warnings: [] };\n if (!config) return result;\n\n // Git init\n if (config.gitInit) {\n const gitDir = join(dest, \".git\");\n if (!existsSync(gitDir)) {\n try {\n execSync(\"git init\", { cwd: dest, stdio: \"pipe\" });\n result.created.push(\".git/\");\n log?.(\"Initialized git repository\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`git init failed: ${msg}`);\n }\n }\n }\n\n // .gitignore\n if (config.gitignore && config.gitignore.length > 0) {\n const gitignorePath = join(dest, \".gitignore\");\n let existing = \"\";\n if (existsSync(gitignorePath)) {\n existing = readFileSync(gitignorePath, \"utf-8\");\n }\n\n const existingLines = new Set(existing.split(\"\\n\").map((l) => l.trim()));\n const newEntries = config.gitignore.filter((e) => !existingLines.has(e));\n\n if (newEntries.length > 0) {\n const append = `${(existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\") + newEntries.join(\"\\n\")}\\n`;\n writeFileSync(gitignorePath, existing + append);\n if (!existingLines.size) {\n result.created.push(\".gitignore\");\n }\n }\n }\n\n // Setup scripts\n if (config.setupScripts) {\n for (const script of config.setupScripts) {\n try {\n log?.(`Running setup script: ${script.name}`);\n const cwd = script.cwd ? join(dest, script.cwd) : dest;\n if (!existsSync(cwd)) {\n mkdirSync(cwd, { recursive: true });\n }\n execSync(script.run, {\n cwd,\n stdio: \"pipe\",\n timeout: 60_000,\n env: { ...process.env, WORKSPACE_DIR: dest },\n });\n log?.(`Setup script \"${script.name}\" completed`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Setup script \"${script.name}\" failed: ${msg}`);\n }\n }\n }\n\n return result;\n}\n","/**\n * Connectors layer — writes connector declarations to skaile.yaml\n * and creates mount directories for mountable connectors.\n *\n * Actual sync/connect happens at runtime (in the runner), not at scaffold time.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { WorkspaceYamlEditor } from \"@skaile/workspaces/core\";\nimport type { ConnectorEntry } from \"../types.js\";\n\n/**\n * Apply the connectors scaffold layer — writes connector declarations to `skaile.yaml` and creates mount directories.\n *\n * @param dest - Absolute path to the workspace root.\n * @param connectors - Connector entries from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns Array of created mount directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyConnectorsLayer(\n dest: string,\n connectors: ConnectorEntry[] | undefined | null,\n log?: (msg: string) => void,\n): string[] {\n const created: string[] = [];\n const entries: ConnectorEntry[] = Array.isArray(connectors) ? connectors : [];\n if (!entries.length) return created;\n\n // Write connectors to skaile.yaml\n const yamlPath = join(dest, \"skaile.yaml\");\n if (existsSync(yamlPath)) {\n const editor = WorkspaceYamlEditor.load(yamlPath);\n for (const r of entries) {\n editor.setConnector({\n id: r.id,\n driver: r.driver,\n access: r.access ?? \"read-only\",\n auth: r.auth,\n options: r.options,\n });\n }\n editor.save();\n log?.(`Wrote ${entries.length} connector(s) to skaile.yaml`);\n } else {\n log?.(\"Skipping connector write: skaile.yaml not found (base layer should create it first)\");\n }\n\n // Create mount directories for connectors that have autoMount or mountPath\n for (const connector of entries) {\n if (connector.autoMount === false) continue;\n const mountPath = connector.mountPath ?? `.connectors/${connector.id}`;\n const absMount = join(dest, mountPath);\n if (!existsSync(absMount)) {\n mkdirSync(absMount, { recursive: true });\n created.push(`${mountPath}/`);\n log?.(`Created mount dir: ${mountPath}`);\n }\n }\n\n return created;\n}\n","/**\n * Skills layer — installs AI resources into the workspace using the asset manager.\n *\n * Now that this layer lives inside @skaile/asset-manager, the AssetManager class\n * is loaded via a lazy import from the parent package index (no more dynamic\n * external dependency hack).\n *\n * When a scopeDir is specified, the asset manager operates against that directory\n * instead of the default project directory.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SkillsLayerConfig } from \"../types.js\";\n\n/** Result of the skills scaffold layer. */\nexport interface SkillsInstallResult {\n /** Asset refs (`kind:name`) installed by `skaile install` during scaffolding. */\n installed: string[];\n /** Non-fatal warnings (e.g. `skaile.yaml` not found, install failure). */\n warnings: string[];\n}\n\n/**\n * Lazy-load AssetManager from the parent package index.\n * Returns null if not available (should not happen in normal operation).\n */\nasync function loadAssetManager(): Promise<any | null> {\n try {\n const mod = await import(\"../../index.js\");\n return mod.AssetManager ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply the skills scaffold layer — runs `skaile install` to deploy all declared asset dependencies.\n *\n * Only runs when `config.autoInstall` is `true`. Skips silently when `skaile.yaml` is absent.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Skills layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link SkillsInstallResult} with installed refs and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport async function applySkillsLayer(\n dest: string,\n config: SkillsLayerConfig | undefined,\n log?: (msg: string) => void,\n): Promise<SkillsInstallResult> {\n const result: SkillsInstallResult = { installed: [], warnings: [] };\n if (!config?.autoInstall) return result;\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n result.warnings.push(\"Skipping skill install: skaile.yaml not found\");\n return result;\n }\n\n const AssetManager = await loadAssetManager();\n if (!AssetManager) {\n result.warnings.push(\n \"Skipping skill install: AssetManager could not be loaded. Run `skaile install` manually.\",\n );\n return result;\n }\n\n try {\n log?.(\"Installing AI resources...\");\n\n const am = new AssetManager({ projectDir: dest });\n const installResult = await am.install();\n\n if (Array.isArray(installResult)) {\n result.installed = installResult;\n } else if (installResult?.deployed) {\n result.installed = installResult.deployed;\n }\n\n log?.(`Installed ${result.installed.length} skill(s)`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Skill install failed: ${msg}`);\n }\n\n return result;\n}\n","/**\n * Template layer — applies agent definition files (SOUL.md, RULES.md, knowledge/)\n * and any additional template files.\n */\n\nimport { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { TemplateLayerConfig } from \"../types.js\";\n\n/** Recursively copy a directory, skipping files that already exist at dest. */\nfunction copyDirSkipExisting(src: string, dest: string, created: string[], baseDest: string): void {\n if (!existsSync(dest)) mkdirSync(dest, { recursive: true });\n for (const entry of readdirSync(src, { withFileTypes: true })) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (entry.isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, baseDest);\n } else if (!existsSync(destPath)) {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(relative(baseDest, destPath));\n }\n }\n}\n\n/**\n * Apply the template overlay layer — copies agent definition files (`SOUL.md`, `RULES.md`, `knowledge/`) and additional static template files into the workspace.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Template layer configuration from the template manifest.\n * @param templateDir - Absolute path to the template directory (used to resolve relative `files[].src` paths).\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyTemplateLayer(\n dest: string,\n config: TemplateLayerConfig | undefined,\n templateDir?: string,\n): string[] {\n const created: string[] = [];\n if (!config) return created;\n\n // Apply agent definition from agentDir\n if (config.agentDir) {\n const agentDir = config.agentDir;\n if (existsSync(agentDir)) {\n // Copy SOUL.md, RULES.md, DUTIES.md\n for (const file of [\"SOUL.md\", \"RULES.md\", \"DUTIES.md\"]) {\n const src = join(agentDir, file);\n const destFile = join(dest, \".skaile\", \"agent\", file);\n if (existsSync(src) && !existsSync(destFile)) {\n mkdirSync(dirname(destFile), { recursive: true });\n copyFileSync(src, destFile);\n created.push(relative(dest, destFile));\n }\n }\n\n // Copy knowledge/ directory\n const knowledgeSrc = join(agentDir, \"knowledge\");\n if (existsSync(knowledgeSrc)) {\n const knowledgeDest = join(dest, \".skaile\", \"agent\", \"knowledge\");\n copyDirSkipExisting(knowledgeSrc, knowledgeDest, created, dest);\n }\n\n // Copy skills/ directory from agent def\n const skillsSrc = join(agentDir, \"skills\");\n if (existsSync(skillsSrc)) {\n const skillsDest = join(dest, \".skaile\", \"agent\", \"skills\");\n copyDirSkipExisting(skillsSrc, skillsDest, created, dest);\n }\n }\n }\n\n // Write inline soul/rules content\n if (config.soul) {\n const soulPath = join(dest, \".skaile\", \"agent\", \"SOUL.md\");\n if (!existsSync(soulPath)) {\n mkdirSync(dirname(soulPath), { recursive: true });\n writeFileSync(soulPath, config.soul);\n created.push(\".skaile/agent/SOUL.md\");\n }\n }\n if (config.rules) {\n const rulesPath = join(dest, \".skaile\", \"agent\", \"RULES.md\");\n if (!existsSync(rulesPath)) {\n mkdirSync(dirname(rulesPath), { recursive: true });\n writeFileSync(rulesPath, config.rules);\n created.push(\".skaile/agent/RULES.md\");\n }\n }\n\n // Copy additional template files\n if (config.files && templateDir) {\n for (const file of config.files) {\n const srcPath = join(templateDir, file.src);\n const destPath = join(dest, file.dest);\n if (!existsSync(srcPath)) continue;\n if (existsSync(destPath)) continue;\n\n if (statSync(srcPath).isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, dest);\n } else {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(file.dest);\n }\n }\n }\n\n return created;\n}\n","/**\n * Main scaffolder — loads a workspace template (workspace.yaml) and applies\n * all configured layers in order: base → framework → template → skills → hooks → container.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { applyAgentsLayer } from \"./layers/agents.js\";\nimport { applyBaseLayer } from \"./layers/base.js\";\nimport { applyContainerLayer } from \"./layers/container.js\";\nimport { applyDriverTargetLayer } from \"./layers/driver-target.js\";\nimport { applyHooksLayer } from \"./layers/hooks.js\";\nimport { applyConnectorsLayer } from \"./layers/connectors.js\";\nimport { applySkillsLayer } from \"./layers/skills.js\";\nimport { applyTemplateLayer } from \"./layers/template.js\";\nimport { loadSkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { ScaffoldOptions, ScaffoldResult, TemplateManifest } from \"./types.js\";\n\n// ── Built-in template directory ────────────────────────────────────────────\n\nlet _builtinTemplatesDir: string | null = null;\n\n/**\n * Get the built-in templates directory. Uses import.meta.url by default,\n * but can be overridden via setTemplatesDir() for bundled environments\n * (e.g. Nitro) where import.meta.url resolves to the bundle output.\n */\nfunction getBuiltinTemplatesDir(): string {\n if (_builtinTemplatesDir) return _builtinTemplatesDir;\n return join(dirname(new URL(import.meta.url).pathname), \"..\", \"..\", \"templates\");\n}\n\n/**\n * Override the built-in templates directory. Call this from apps that bundle\n * skaile-agent-workspace (e.g. Nitro/Nuxt) where `import.meta.url` doesn't\n * resolve to the source package.\n *\n * @param dir - Absolute path to the custom templates directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function setTemplatesDir(dir: string): void {\n _builtinTemplatesDir = resolve(dir);\n}\n\n// ── Template loading ───────────────────────────────────────────────────────\n\n/**\n * Resolve a template name or path to an absolute path to `workspace.yaml`.\n *\n * Lookup order:\n * 1. Absolute or relative path to a `workspace.yaml` file.\n * 2. Directory containing `workspace.yaml`.\n * 3. Built-in template name matching `templates/<name>/workspace.yaml`.\n *\n * @param template - Template name (e.g. `\"minimal\"`) or path to a `workspace.yaml` / directory.\n * @returns Absolute path to `workspace.yaml`, or `null` when the template cannot be found.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function resolveTemplatePath(template: string): string | null {\n // Direct path to a file\n if (template.endsWith(\".yaml\") || template.endsWith(\".yml\")) {\n const abs = resolve(template);\n return existsSync(abs) ? abs : null;\n }\n\n // Directory containing workspace.yaml\n const dirPath = resolve(template);\n const inDir = join(dirPath, \"workspace.yaml\");\n if (existsSync(inDir)) return inDir;\n\n // Built-in template name\n const builtin = join(getBuiltinTemplatesDir(), template, \"workspace.yaml\");\n if (existsSync(builtin)) return builtin;\n\n return null;\n}\n\n/**\n * Load and merge a template manifest, following `extends` chains.\n *\n * @param templatePath - Absolute path to a `workspace.yaml` template file.\n * @returns Merged `TemplateManifest` with parent sections folded in, and the template directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function loadTemplate(templatePath: string): { manifest: TemplateManifest; dir: string } {\n const raw = readFileSync(templatePath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n const dir = dirname(templatePath);\n\n if (manifest.extends) {\n const parentPath =\n resolveTemplatePath(manifest.extends) ?? resolveTemplatePath(join(dir, manifest.extends));\n if (parentPath) {\n const parent = loadTemplate(parentPath);\n // Shallow merge: child sections override parent sections per-key\n const { extends: _ext, name, description, version, ...childSections } = manifest;\n Object.assign(manifest, {\n ...parent.manifest,\n name,\n description,\n version,\n extends: _ext,\n ...childSections,\n });\n }\n }\n\n return { manifest, dir };\n}\n\n/**\n * List all available built-in templates.\n *\n * @returns Array of objects with `name`, `description`, and `path` for each available template.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function listTemplates(): Array<{ name: string; description: string; path: string }> {\n const templates: Array<{ name: string; description: string; path: string }> = [];\n const templatesDir = getBuiltinTemplatesDir();\n if (!existsSync(templatesDir)) return templates;\n\n const { readdirSync } = require(\"node:fs\");\n for (const entry of readdirSync(templatesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const wsPath = join(templatesDir, entry.name, \"workspace.yaml\");\n if (!existsSync(wsPath)) continue;\n try {\n const raw = readFileSync(wsPath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n templates.push({\n name: manifest.name ?? entry.name,\n description: manifest.description ?? \"\",\n path: wsPath,\n });\n } catch {\n // Skip unparseable templates\n }\n }\n\n return templates;\n}\n\n// ── Main scaffold function ────────────────────────────────────────────────\n\n/**\n * Scaffold a new Skaile workspace from a template, applying layers in order.\n *\n * Layer application order:\n * 1. **Base** — creates `.skaile/`, `settings.json`, and `skaile.yaml`\n * 2. **Connectors** — writes connector declarations to `skaile.yaml`\n * 3. **Driver target** — creates framework-specific directories (`.claude/`, `.omp/`, etc.)\n * 4. **Template** — copies agent definition files and static template overlays\n * 5. **Agents** — renders and installs GitAgent packages\n * 6. **Skills** — runs `skaile install` (unless `opts.skipInstall` is `true`)\n * 7. **Hooks** — runs `git init`, writes `.gitignore`, executes setup scripts\n * 8. **Container** — generates `Dockerfile` and `docker-compose.yml` (when enabled)\n *\n * @param opts - Scaffold options including destination, template, and layer overrides.\n * @returns {@link ScaffoldResult} with created paths, installed skills, and warnings.\n * @example\n * ```ts\n * const result = await scaffoldWorkspace({\n * dest: \"./my-workspace\",\n * template: \"minimal\",\n * driverTarget: \"claude-code\",\n * });\n * console.log(`Created ${result.created.length} files`);\n * ```\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport async function scaffoldWorkspace(opts: ScaffoldOptions): Promise<ScaffoldResult> {\n const log = opts.log ?? (() => {});\n const dest = resolve(opts.dest);\n const result: ScaffoldResult = {\n path: dest,\n created: [],\n installed: [],\n warnings: [],\n };\n\n // 1. Load template\n const templatePath = resolveTemplatePath(opts.template);\n if (!templatePath) {\n result.warnings.push(`Template not found: ${opts.template}`);\n return result;\n }\n\n const { manifest, dir: templateDir } = loadTemplate(templatePath);\n log(`Scaffolding workspace from template: ${manifest.name}`);\n\n // 2. Apply layers in order\n\n // Base layer: .skaile/, settings.json, skaile.yaml\n log(\"Applying base layer...\");\n const driverTarget = (opts.driverTarget ??\n manifest.framework?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n const baseCreated = applyBaseLayer(\n dest,\n manifest[\"ai-assets\"],\n manifest.settings,\n driverTarget,\n opts,\n );\n result.created.push(...baseCreated);\n\n // Connectors layer: connector declarations → skaile.yaml + mount directories\n const connectorEntries = manifest.connectors;\n if (connectorEntries?.length) {\n log(\"Applying connectors layer...\");\n const resCreated = applyConnectorsLayer(dest, connectorEntries, log);\n result.created.push(...resCreated);\n }\n\n // Driver target layer: agent-specific directories\n log(\"Applying driver target layer...\");\n const fwCreated = applyDriverTargetLayer(dest, manifest.framework, opts.driverTarget);\n result.created.push(...fwCreated);\n\n // Template layer: agent definition, template files\n log(\"Applying template layer...\");\n // Resolve agentDir relative to template directory\n const templateConfig = manifest.template;\n if (templateConfig?.agentDir && !templateConfig.agentDir.startsWith(\"/\")) {\n templateConfig.agentDir = join(templateDir, templateConfig.agentDir);\n }\n const tmplCreated = applyTemplateLayer(dest, templateConfig, templateDir);\n result.created.push(...tmplCreated);\n\n // Agents layer: install GitAgent packages into framework deploy target\n log(\"Applying agents layer...\");\n const agentsConfig = opts.agentInstall ? { install: opts.agentInstall } : manifest.agents;\n const wsConfig = loadSkWorkspaceConfig(dest)?.config;\n const agentsResult = await applyAgentsLayer(\n dest,\n agentsConfig,\n driverTarget,\n templateDir,\n wsConfig,\n log,\n );\n result.created.push(...agentsResult.created);\n result.warnings.push(...agentsResult.warnings);\n\n // Skills layer: asset manager-based resource installation\n if (!opts.skipInstall) {\n log(\"Applying skills layer...\");\n const skillsResult = await applySkillsLayer(dest, manifest.skills, log);\n result.installed.push(...skillsResult.installed);\n result.warnings.push(...skillsResult.warnings);\n }\n\n // Hooks layer: git init, .gitignore, setup scripts\n log(\"Applying hooks layer...\");\n const hooksResult = applyHooksLayer(dest, manifest.hooks, log);\n result.created.push(...hooksResult.created);\n result.warnings.push(...hooksResult.warnings);\n\n // Container layer: Dockerfile, docker-compose.yml\n const enableDocker = opts.docker ?? manifest.container?.enabled ?? false;\n if (enableDocker) {\n log(\"Applying container layer...\");\n const containerCreated = applyContainerLayer(\n dest,\n { ...manifest.container, enabled: true },\n opts.name,\n );\n result.created.push(...containerCreated);\n }\n\n log(`Workspace scaffolded: ${result.created.length} files/dirs created`);\n return result;\n}\n"]}
@@ -197,5 +197,5 @@ async function listModelsForDriver(driverId, apiKeys) {
197
197
  }
198
198
 
199
199
  export { AgentDriver, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, loadDriver, registerDriver };
200
- //# sourceMappingURL=chunk-S7RACIZI.js.map
201
- //# sourceMappingURL=chunk-S7RACIZI.js.map
200
+ //# sourceMappingURL=chunk-YOFKTALB.js.map
201
+ //# sourceMappingURL=chunk-YOFKTALB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/logger.ts","../bridge/src/types.ts","../bridge/src/registry.ts"],"names":[],"mappings":";;;;AAuBO,SAAS,gBAAgB,OAAA,EAAyB;AACvD,EAAA,OAAO,YAAA,CAAa,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AACjD;AC4ZO,IAAe,WAAA,GAAf,cAAmC,YAAA,CAAa;AAAA;AAAA,EA0CrD,IAAI,gBAAA,GAAuC;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAA,GAAuC;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,KAAA,EAA0E;AAE/E,EACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAA+B;AAC7B,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,aAAA,GAAmC;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,GAAoC;AACxC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA;AAAA,EAWU,UAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACF,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR,YAAA,CAAa,UAA6B,KAAA,EAAoB;AAC5D,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,CACE,QACA,KAAA,EACkB;AAClB,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,IAAA,CAAK,cAAc,OAAO,MAAA;AACnD,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,MAAA,IAAU,KAAK,YAAA,EAAc;AAAA,MAC5E,IAAA,EAAM,gBAAA;AAAA,MACN,IAAA,EAAM,gBAAA;AAAA,MACN,UAAA,EAAY;AAAA,KACb,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,MAAA,EAOH;AACP,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAC,KAAK,eAAA,EAAiB;AAC/C,IAAA,MAAM,aAAa,IAAA,CAAK,cAAA,GAAiB,KAAK,GAAA,EAAI,GAAI,KAAK,cAAA,GAAiB,CAAA;AAE5E,IAAA,IAAI,MAAA,EAAQ,WAAA,KAAgB,MAAA,IAAa,MAAA,EAAQ,iBAAiB,MAAA,EAAW;AAC3E,MAAA,IAAA,CAAK,UAAA,CAAW,aAAA,CAAc,IAAA,CAAK,eAAA,EAAiB;AAAA,QAClD,KAAA,EAAO,QAAQ,KAAA,IAAS,SAAA;AAAA,QACxB,QAAA,EAAU,QAAQ,QAAA,IAAY,SAAA;AAAA,QAC9B,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,UAAA;AAAA,QACA,YAAY,MAAA,CAAO;AAAA,OACpB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,eAAA,EAAiB;AAAA,MAC5C,MAAA,EAAQ,MAAA,EAAQ,KAAA,GAAQ,OAAA,GAAU,IAAA;AAAA,MAClC,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,UAAA,EAAY,EAAE,yBAAA,EAA2B,UAAA;AAAW,KACrD,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,EACxB;AACF;;;ACnmBA,IAAM,kBAAA,GACJ,OAAO,sBAAA,KAA2B,WAAA,GAAc,IAAA,GAAO,sBAAA;AACzD,IAAM,aAAA,GAAgB,OAAO,iBAAA,KAAsB,WAAA,GAAc,IAAA,GAAO,iBAAA;AAExE,IAAM,cAAA,uBAAqB,GAAA,EAA0D;AAa9E,IAAM,cAAA,GAA6C;AAAA,EACxD,GAAA,EAAK;AAAA,IACH,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,aAAA,EAAe,IAAA;AAAA,IACf,mBAAA,EAAqB;AAAA,GACvB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,mBAAA,EAAqB;AAAA,GACvB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,mBAAA,EAAqB;AAAA,GACvB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,aAAA,EAAe,IAAA;AAAA,IACf,mBAAA,EAAqB;AAAA;AAEzB;AAgBO,SAAS,cAAA,CAAe,EAAA,EAAY,OAAA,EAAwB,IAAA,EAAwB;AACzF,EAAA,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAM,CAAA;AAC1C;AAmBA,eAAsB,WAAW,EAAA,EAA2B;AAC1D,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,KAAA;AACH,MAAA,MAAM,OAAO,yBAAgC,CAAA;AAC7C,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,MAAM,OAAO,0BAAiC,CAAA;AAC9C,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,IAAI,kBAAA,EAAoB,MAAM,OAAO,gCAAuC,CAAA;AAC5E,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,IAAI,aAAA,EAAe,MAAM,OAAO,2BAAkC,CAAA;AAClE,MAAA;AAAA;AAGN;AAgBA,eAAsB,YAAA,CAAa,IAAY,MAAA,EAA2C;AACxF,EAAA,MAAM,WAAW,EAAE,CAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,EAAE,CAAA,+BAAA,CAAiC,CAAA;AAAA,IACtE;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uBAAA,EAA0B,EAAE,CAAA,cAAA,EAAiB,WAAA,EAAY,CACtD,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CACf,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,QAAQ,MAAM,CAAA;AAC7B;AAaO,SAAS,WAAA,GAA4B;AAC1C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAwB;AAC3C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA,EAAG;AAChD,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,KAAA,MAAW,EAAE,IAAA,EAAK,IAAK,cAAA,CAAe,QAAO,EAAG;AAC9C,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,CAAA;AAC5B;AAgBA,eAAsB,mBAAA,CACpB,UACA,OAAA,EACuB;AACvB,EAAA,MAAM,WAAW,QAAQ,CAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACzC,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAGpB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,SAAA,EAAW,YAAA,EAAc,OAAA,EAAS,CAAA;AACrF,EAAA,OAAO,OAAO,UAAA,EAAW;AAC3B","file":"chunk-S7RACIZI.js","sourcesContent":["/**\n * Bridge-layer logger factory.\n *\n * Each driver creates its own Logger via `getBridgeLogger(subkind)` at\n * construction time. Falls back to an off-mode Logger (stdout only) when\n * no LogStore is registered — see @skaile/workspaces/core/logging for details.\n */\n\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\n\n/**\n * Construct a bridge-scoped Logger for a given driver subkind.\n *\n * Creates a `Logger` with `kind: \"bridge\"` and the specified `subkind`. Falls back to\n * an off-mode Logger (stdout only) when no `LogStore` is registered — see\n * `@skaile/workspaces/core/logging` for details. Each driver calls this once at construction\n * time; never re-construct per call.\n *\n * @param subkind - Driver id, e.g. `\"claude-sdk\"`, `\"omp\"`, `\"echo\"`, `\"codex\"`.\n * @returns A `Logger` scoped to `bridge:<subkind>`.\n * @docLink packages/bridge/api-reference#logger\n */\nexport function getBridgeLogger(subkind: string): Logger {\n return createLogger({ kind: \"bridge\", subkind });\n}\n","import { EventEmitter } from \"node:events\";\nimport type { Span, TelemetryProvider, Trace } from \"@skaile/workspaces/telemetry\";\nimport type {\n Capability,\n CredentialMint,\n RenderInvokedEvent,\n TokenUsage,\n} from \"@skaile/workspaces/types\";\nimport type { ModelEntry } from \"./models.js\";\n\n/**\n * Minimal LLM tool descriptor used by the capability dispatch path. Mirrors\n * the runner's `LLMTool` shape so drivers can consume registry output without\n * importing `@skaile/workspaces/runner` (which would create a circular dep).\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-capability-tool\n */\nexport interface BridgeCapabilityTool {\n /** Capability name; used as the LLM-visible tool name. */\n name: string;\n /** Human/LLM-readable description. */\n description: string;\n /** JSON Schema for the tool's input parameters. */\n parameters: Record<string, unknown>;\n}\n\n/**\n * Render-cap event emission callback used by the bridge when the LLM invokes\n * a capability that carries a `render` spec. The runner provides the actual\n * sink (transport.send / sendEvent); the bridge only emits.\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-render-emit\n */\nexport type BridgeRenderEmit = (event: RenderInvokedEvent) => void;\n\n/**\n * Text-event emission callback for render-capability fallbacks. When a\n * `RenderCapability` carries `render.fallback` and the LLM invokes it, the\n * bridge substitutes `{{prop}}` placeholders (top-level keys of `props`,\n * optional dotted-path traversal `{{user.name}}`) and pushes the rendered\n * string through this callback so clients without a render layer still see\n * a textual representation. No-op when `fallback` is absent.\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-text-emit\n */\nexport type BridgeTextEmit = (text: string) => void;\n\n/**\n * Bundle of capability dispatch hooks. Registered into the driver via\n * `AgentConfig.capabilities`; the driver routes registered LLM tool calls\n * back into `invoke()` instead of using its native dispatch path.\n *\n * The runner constructs this from a `CapabilityRegistry` instance and threads\n * it through `createAgentSession()`. Drivers that don't yet implement\n * capability dispatch ignore the field — legacy v1 paths stay intact.\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-capability-hooks\n */\nexport interface BridgeCapabilityHooks {\n /** Build the LLM tool descriptor list from the registry. Called per turn so registration changes take effect. */\n composeTools(): BridgeCapabilityTool[];\n /** Resolve a wire-format Capability descriptor by name. Used by the bridge to inspect `fireAndForget` / `render`. */\n resolve(name: string): Capability | null;\n /** Validate input + dispatch through the registry. Logging is wired by the registry. */\n invoke(name: string, input: unknown): Promise<unknown>;\n /** Emit a render-invoked event. The runner forwards via the WebSocket transport. */\n emitRender?: BridgeRenderEmit;\n /** Emit a text fallback for render capabilities with `render.fallback`. */\n emitText?: BridgeTextEmit;\n /** Session id passed through to the runner's per-handler logger. */\n sessionId: string;\n}\n\n/**\n * Static metadata for a registered agent driver backend.\n *\n * Returned by {@link listDrivers} and exposed on every {@link AgentDriver} instance\n * via `driverInfo`.\n *\n * @docLink packages/bridge/concepts#driver-info\n */\nexport interface DriverInfo {\n /** Stable machine identifier used to look up the driver in the registry (e.g. `\"omp\"`, `\"claude-sdk\"`). */\n id: string;\n /** Human-readable display name shown in UIs and logs. */\n name: string;\n /** `true` when the driver can target any LLM provider; `false` for Anthropic-only drivers. */\n modelAgnostic: boolean;\n /**\n * `true` when the driver supports mid-stream abort via `abort()` without killing the process.\n * Drivers that return `false` can only be stopped via `kill()`.\n */\n supportsInBandAbort: boolean;\n}\n\n/**\n * Codex-specific tuning options passed through `DriverOptions.codex`.\n *\n * @remarks These are forwarded verbatim to the Codex driver and have no effect on other drivers.\n * @docLink packages/bridge/concepts#codex-driver-options\n */\nexport interface CodexDriverOptions {\n /** Controls whether Codex may auto-apply edits without user approval. */\n approvalPolicy?: \"never\" | \"on-request\" | \"on-failure\" | \"untrusted\";\n /** Filesystem sandbox level for the Codex process. */\n sandboxMode?: \"read-only\" | \"workspace-write\" | \"danger-full-access\";\n /** Reasoning budget passed to the model. */\n reasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n /** When `true`, the Codex sandbox is allowed to make outbound network requests. */\n networkAccessEnabled?: boolean;\n /** Extra directories made accessible to the Codex sandbox in addition to `cwd`. */\n additionalDirectories?: string[];\n}\n\n/**\n * Driver-specific configuration bag.\n *\n * Fields are keyed by driver ID so that callers can pass driver-specific options\n * through the common {@link AgentConfig} without breaking other drivers.\n *\n * @docLink packages/bridge/concepts#driver-options\n */\nexport interface DriverOptions {\n /** Codex-specific options. Ignored by all other drivers. */\n codex?: CodexDriverOptions;\n}\n\n/**\n * Configuration passed to a driver when it is created via {@link createDriver}.\n *\n * All fields are shared across drivers; driver-specific behaviour is documented\n * per field. Fields that are silently ignored by a driver are marked accordingly.\n *\n * @docLink packages/bridge/concepts#agent-config\n */\nexport interface AgentConfig {\n /** Absolute path to the working directory the agent operates in. */\n cwd: string;\n /**\n * LLM provider name (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * Combined with `model` as `provider/model` for omp's `--model` flag.\n * Ignored by claude-sdk (always Anthropic).\n */\n provider?: string;\n /**\n * LLM model identifier (e.g. `\"claude-sonnet-4-5\"`, `\"gpt-4o\"`).\n * For omp: passed as `--model [provider/]model`.\n * For claude-sdk: passed as the `model` query option.\n */\n model?: string;\n /**\n * Provider API keys keyed by provider name (e.g. `{ anthropic: \"sk-...\" }`).\n * Drivers inject the relevant key into the environment or SDK options.\n */\n apiKeys?: Record<string, string>;\n /**\n * Additional environment variables merged into the child process environment.\n * For omp: merged with `process.env` before spawn. For claude-sdk: accessed\n * via `env.ANTHROPIC_API_KEY` as an alternative to `apiKeys.anthropic`.\n */\n env?: Record<string, string>;\n /** Inline system prompt — written to .omp/system.md and passed via --append-system-prompt (omp driver) */\n systemPrompt?: string;\n /** Path to project .omp/ directory (PI_CODING_AGENT_DIR for omp driver) */\n agentDir?: string;\n /** SSH key path — injected as GIT_SSH_COMMAND */\n sshKeyPath?: string;\n /** Pre-assign a UUID as the session ID for a new session (claude-sdk: passed as sessionId option) */\n sessionId?: string;\n /** Resume this specific past session by UUID instead of starting fresh (claude-sdk: passed as resume option) */\n resumeSessionId?: string;\n /** Maximum agentic turns per query (claude-sdk: passed as maxTurns option) */\n maxTurns?: number;\n /** Agent name — selects a deployed sub-agent definition as the main agent identity.\n * claude-sdk: passed as `agent` option to query() → reads .claude/agents/<name>.md natively.\n * omp: ignored (omp uses agentDir/PI_CODING_AGENT_DIR instead). */\n agentName?: string;\n /** In-process SDK MCP servers for custom tool injection (Claude SDK only, ignored by other drivers) */\n mcpServers?: Record<string, unknown>;\n /** Tool restrictions from agent.yaml — applied to the main agent session */\n tools?: {\n /** Tool names that the agent is allowed to invoke. An empty array means no restriction. */\n allowed?: string[];\n /** Tool names that the agent is explicitly forbidden from invoking. */\n denied?: string[];\n };\n /** Thinking mode for Claude models: adaptive (Claude decides), enabled (always think), disabled (no thinking). */\n thinking?: \"adaptive\" | \"enabled\" | \"disabled\";\n /** Reasoning effort level for Claude models. */\n effort?: \"low\" | \"medium\" | \"high\" | \"max\";\n /** Driver-specific configuration bag. */\n driverOptions?: DriverOptions;\n /**\n * Protocol v2 capability dispatch hooks. When present, the driver uses the\n * registry as the source of LLM tool definitions and routes invocations\n * through `capabilities.invoke()`. Absent → legacy v1 path (existing\n * mcpServers / native dispatch).\n *\n * @since 2.0.0\n */\n capabilities?: BridgeCapabilityHooks;\n /**\n * The platform's `AIProviderConfig.id` for the AI credential currently\n * provisioned into this driver. The runner reads this off `AgentConfig`\n * during 401 mediation and passes it as `configId` in\n * `request_access_token { kind: 'ai-credentials' }`. The driver itself\n * does not consume this field — only the runner uses it.\n *\n * Set by the platform agent-gateway in `ConfigureCommandV2` for mediated\n * sessions. Standalone runners (CLI / forge / Claude plugin) leave it\n * undefined; the runner falls back to surfacing the auth error to the\n * user without mediating.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md`\n * § \"Wire `aiProviderConfigId` end-to-end\".\n *\n * @since 3.3.0\n */\n aiProviderConfigId?: string;\n /**\n * Optional callback invoked by the driver when the underlying agent\n * surfaces an `authentication_error`. In Protocol v3 the runner mediates\n * the refresh via the `host.refresh_credential` capability and returns a\n * typed {@link CredentialMint}. The driver inspects the discriminator:\n *\n * - `mint.ok === true`: a fresh credential is now provisioned. The\n * driver re-attempts the in-flight prompt once.\n * - `mint.ok === false`: refresh failed (`code` carries a stable reason\n * such as `revoked`, `not-configured`, `provider-error`,\n * `backend-error`). The driver surfaces the original `AuthError` to\n * the caller.\n *\n * `args.configId` carries the platform `AIProviderConfig.id` the driver\n * was provisioned with (mirrors {@link AgentConfig.aiProviderConfigId}).\n * The runner uses it to scope the refresh to the correct AI credential.\n *\n * When omitted, the driver throws `AuthError` immediately as before\n * (standalone CLI / forge mode — there is no platform mediator to ask).\n *\n * Centralising auth-retry inside the driver means every consumer of\n * `driver.prompt(...)` (serve handler, compaction orchestrator, flow\n * orchestrator, …) gets self-healing for free — there is no per-call-site\n * wrapping.\n *\n * Spec: `_devlog/specs/2026-05-10-deterministic-session-bootstrap.md`\n * § \"host.refresh_credential capability\".\n *\n * @since 3.4.0\n */\n onAuthError?: (args: { configId: string }) => Promise<CredentialMint>;\n}\n\n/**\n * A single message in an agent conversation.\n *\n * Emitted as part of {@link AgentEvent} variants (`message_start`, `message_update`, `message_end`).\n *\n * @docLink packages/bridge/concepts#agent-message\n */\nexport interface AgentMessage {\n /** Originator of the message. */\n role: \"user\" | \"assistant\" | \"tool\";\n /** Message body — either a plain string or a list of typed content blocks. */\n content: string | ContentBlock[];\n /** Tool invocations made by the assistant in this message. */\n toolCalls?: ToolCall[];\n /** For `role === \"tool\"`: the name of the tool whose result this message carries. */\n toolName?: string;\n /** For `role === \"tool\"`: `true` when the tool returned an error. */\n isError?: boolean;\n /** Optional structured payload for tool results. */\n data?: unknown;\n}\n\n/**\n * A typed block within an {@link AgentMessage}'s content array.\n *\n * Mirrors the Anthropic content block schema but is driver-agnostic.\n *\n * @docLink packages/bridge/concepts#content-block\n */\nexport interface ContentBlock {\n /** Block discriminant. */\n type: \"text\" | \"tool_use\" | \"tool_result\" | \"thinking\";\n /** Present for `text` and `thinking` blocks. */\n text?: string;\n /** Tool use / tool result correlation ID. */\n id?: string;\n /** Tool name (present on `tool_use` blocks). */\n name?: string;\n /** Tool input arguments (present on `tool_use` blocks). */\n input?: any;\n /** Serialised tool result content (present on `tool_result` blocks). */\n content?: string;\n}\n\n/**\n * A single tool invocation made by the agent within a message.\n *\n * @docLink packages/bridge/concepts#tool-call\n */\nexport interface ToolCall {\n /** Correlation ID used to match the call with its result. */\n id: string;\n /** Name of the tool being invoked. */\n name: string;\n /** Arguments passed to the tool. */\n input: any;\n}\n\n/**\n * Error classification for agent failures.\n *\n * Used to determine whether a failure is retryable and to surface actionable\n * hints to the user. See `bridge/CLAUDE.md` for the full category-to-behaviour matrix.\n *\n * @see AgentError\n * @docLink packages/bridge/concepts#error-category\n */\nexport type ErrorCategory =\n | \"auth\"\n | \"rate_limit\"\n | \"model\"\n | \"network\"\n | \"config\"\n | \"process\"\n | \"validation\"\n | \"unknown\";\n\n/**\n * Structured error payload emitted inside the `error` {@link AgentEvent}.\n *\n * Consumers should inspect `retryable` before deciding to surface a retry button,\n * and `hint` to provide an actionable message to the user.\n *\n * @docLink packages/bridge/concepts#agent-error\n */\nexport interface AgentError {\n /** Human-readable error description. */\n message: string;\n /** Coarse failure classification used for retry logic and telemetry. */\n category: ErrorCategory;\n /** HTTP status code if the error originated from an API response. */\n statusCode?: number;\n /** `true` when the caller may safely retry the same operation. */\n retryable: boolean;\n /** Short actionable advice suitable for display in the UI. */\n hint?: string;\n}\n\n/**\n * Metadata for a slash command exposed by the active agent runtime.\n *\n * @docLink packages/bridge/concepts#slash-command-info\n */\nexport interface SlashCommandInfo {\n /** Command name without the leading slash (e.g. `\"compact\"`). */\n name: string;\n /** One-line description shown in command pickers. */\n description: string;\n /** Placeholder text describing what argument the command expects. */\n argumentHint?: string;\n}\n\n/**\n * Discriminated union of all events emitted by a driver on the `'agent-event'` channel.\n *\n * @remarks\n * Consumers listen via `driver.on('agent-event', (event: AgentEvent) => ...)`.\n * The `[k: string]: any` index signature on most variants allows drivers to attach\n * driver-specific fields (e.g. `_textDelta`) without breaking the union.\n *\n * @docLink packages/bridge/concepts#agent-event\n */\nexport type AgentEvent =\n | { type: \"message_start\"; message: AgentMessage; [k: string]: any }\n | { type: \"message_update\"; message: AgentMessage; [k: string]: any }\n | { type: \"message_end\"; message: AgentMessage; [k: string]: any }\n | { type: \"turn_end\"; toolResults?: AgentMessage[]; [k: string]: any }\n | { type: \"agent_end\"; [k: string]: any }\n | {\n type: \"result\";\n subtype: string;\n summary?: string;\n costUsd?: number;\n /** Per-turn token usage when the driver tracks it. Added in 3.1.0. */\n tokens?: TokenUsage;\n errors?: string[];\n [k: string]: any;\n }\n | { type: \"error\"; error: string; detail?: AgentError; fatal?: boolean; [k: string]: any }\n | { type: \"tool_call\"; name?: string; tool?: { name: string }; [k: string]: any }\n | { type: \"tool_execution_end\"; toolName?: string; [k: string]: any }\n | { type: \"commands_available\"; commands: SlashCommandInfo[] }\n | { type: \"session_info\"; driverSessionId: string; sessionFile?: string }\n | { type: \"ui_render\"; [k: string]: any }\n | { type: \"ui_render_update\"; [k: string]: any }\n | { type: \"ui_clear\"; [k: string]: any }\n // Phase 3 (resume cascade) — driver-emitted resume outcome.\n | {\n type: \"resume_failed\";\n resumeSessionId: string;\n reason: \"signature_mismatch\" | \"model_mismatch\" | \"jsonl_lost\" | \"jsonl_poisoned\";\n [k: string]: any;\n };\n\n/**\n * Abstract base class for agent driver backends.\n *\n * Wraps an LLM coding agent behind a single `prompt()` interface.\n * All drivers emit `'agent-event'` with {@link AgentEvent} payloads.\n *\n * @remarks\n * Subclasses must implement `start`, `prompt`, `abort`, `kill`, and `isRunning`.\n * Implementations should never emit an event name other than `'agent-event'` as\n * the public streaming channel — internal events (`'ready'`, `'exit'`, etc.) are\n * driver-private.\n *\n * @example\n * ```ts\n * const driver = createDriver('omp', config);\n * driver.on('agent-event', (event) => console.log(event.type));\n * await driver.start();\n * await driver.prompt('Refactor the auth module');\n * driver.kill();\n * ```\n *\n * @docLink packages/bridge/concepts#agent-driver\n */\nexport abstract class AgentDriver extends EventEmitter {\n /** Static metadata describing this driver's capabilities. */\n abstract readonly driverInfo: DriverInfo;\n\n /**\n * Initialises the driver backend — spawns the child process (omp) or loads\n * the SDK module (claude-sdk). Resolves when the backend is ready to accept\n * prompts. Idempotent: calling `start()` on an already-running driver is a no-op.\n *\n * @throws {Error} When the backend binary is missing or the SDK cannot be loaded.\n */\n abstract start(): Promise<void>;\n\n /**\n * Sends a user message to the agent and resolves when the agent's turn completes\n * (i.e. after the `agent_end` event has been emitted).\n *\n * @param message - Plain-text user prompt to send to the agent.\n * @throws {Error} When the driver is not running or the underlying backend reports a fatal error.\n */\n abstract prompt(message: string): Promise<void>;\n\n /**\n * Sends an in-band abort signal to the agent, requesting it to stop the current\n * turn without terminating the process. The driver remains usable after `abort()`.\n *\n * @remarks Only meaningful when `driverInfo.supportsInBandAbort` is `true`.\n * For other drivers, prefer `kill()` followed by creating a new driver instance.\n */\n abstract abort(): Promise<void>;\n\n /**\n * Terminates the agent backend immediately (SIGTERM for subprocess drivers,\n * `close()` for in-process drivers). The driver instance must not be reused\n * after `kill()`.\n */\n abstract kill(): void;\n\n /** `true` when the backend is alive and able to accept new prompts. */\n abstract get isRunning(): boolean;\n\n /** Optional provider-native session/thread identifier for resume support. */\n get runtimeSessionId(): string | undefined {\n return undefined;\n }\n\n /** Slash commands discovered from the agent runtime. Override in drivers that support introspection. */\n getSlashCommands(): SlashCommandInfo[] {\n return [];\n }\n\n // ── Live reconfiguration ────────────────────────────────────────────────\n\n /**\n * Live-update driver configuration. The new values take effect on the next\n * prompt() call. Only model/thinking/effort are reconfigurable mid-session.\n *\n * Subclasses that store config locally should override this to apply the\n * patch to their own config field. The base implementation is a no-op.\n */\n reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n // No-op — subclasses override to apply to their own config.\n void patch;\n }\n\n /**\n * Returns the model identifier currently configured on this driver.\n * Subclasses that store config locally should override this.\n */\n getModel(): string | undefined {\n return undefined;\n }\n\n // ── Compaction support ──────────────────────────────────────────────────\n\n /**\n * Returns the token usage from the most recent completed turn.\n * Returns `null` if usage data is unavailable (e.g. driver doesn't track it).\n *\n * Widened in 3.1.0 to return the full `TokenUsage` shape (input / output /\n * cache-read / cache-creation / reasoning). All fields are optional so\n * drivers can populate just what their provider reports. Existing callers\n * that read only `inputTokens` / `outputTokens` keep working — those fields\n * are still present and carry the same semantics as before.\n */\n getTokenUsage(): TokenUsage | null {\n return null;\n }\n\n /**\n * Returns the model's context window size in tokens.\n * Returns `null` if unknown.\n */\n getContextWindow(): number | null {\n return null;\n }\n\n /**\n * Returns the list of models available to this driver without starting a session.\n * Drivers that can enumerate their own models override this method.\n * Returns an empty array by default.\n */\n async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n\n /**\n * Closes the current conversation session and prepares for a fresh start.\n * The next `prompt()` call will begin a new session without prior history.\n * The driver remains usable after `resetSession()`.\n */\n abstract resetSession(): Promise<void>;\n\n // ── Telemetry ─────────────────────────────────────────────────────────────\n\n protected _telemetry?: TelemetryProvider;\n protected _activeTrace?: Trace;\n protected _activeTurnSpan?: Span;\n private _turnStartTime?: number;\n\n /**\n * Attach a telemetry provider and active trace to this driver.\n * Called by the runner after creating the driver but before start().\n */\n setTelemetry(provider: TelemetryProvider, trace: Trace): void {\n this._telemetry = provider;\n this._activeTrace = trace;\n }\n\n /**\n * Begin a turn span. Called by the runner before prompt().\n * Pass a parent span (e.g. the turn span from the orchestrator) for nesting.\n * Returns the span so the runner can annotate it further.\n */\n beginTurnSpan(\n parent?: Trace | Span,\n attrs?: Record<string, string | number | boolean>,\n ): Span | undefined {\n if (!this._telemetry || !this._activeTrace) return undefined;\n this._turnStartTime = Date.now();\n this._activeTurnSpan = this._telemetry.startSpan(parent ?? this._activeTrace, {\n name: \"llm_generation\",\n kind: \"llm_generation\",\n attributes: attrs,\n });\n return this._activeTurnSpan;\n }\n\n /**\n * End the current turn span with generation data.\n * Called by the runner after agent_end. Model and provider are passed\n * explicitly — the driver base class does not access config directly.\n */\n endTurnSpan(result?: {\n model?: string;\n provider?: string;\n inputTokens?: number;\n outputTokens?: number;\n stopReason?: string;\n error?: string;\n }): void {\n if (!this._telemetry || !this._activeTurnSpan) return;\n const durationMs = this._turnStartTime ? Date.now() - this._turnStartTime : 0;\n\n if (result?.inputTokens !== undefined || result?.outputTokens !== undefined) {\n this._telemetry.logGeneration(this._activeTurnSpan, {\n model: result?.model ?? \"unknown\",\n provider: result?.provider ?? \"unknown\",\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n durationMs,\n stopReason: result.stopReason,\n });\n }\n\n this._telemetry.endSpan(this._activeTurnSpan, {\n status: result?.error ? \"error\" : \"ok\",\n error: result?.error,\n attributes: { \"skaile.turn.duration_ms\": durationMs },\n });\n\n this._activeTurnSpan = undefined;\n this._turnStartTime = undefined;\n }\n}\n\n/**\n * Factory function signature registered in the driver registry.\n *\n * @param config - Configuration for the new driver instance.\n * @returns A freshly constructed (not yet started) {@link AgentDriver}.\n * @docLink packages/bridge/concepts#driver-factory\n */\nexport type DriverFactory = (config: AgentConfig) => AgentDriver;\n","import type { ModelEntry } from \"./models.js\";\nimport type { AgentConfig, AgentDriver, DriverFactory, DriverInfo } from \"./types.js\";\n\n// Build-time backend gating. `bun build --compile --define:__INCLUDE_*__=...`\n// folds these to literal booleans so an excluded backend's driver module and\n// its SDK are dead-code-stripped from the binary. Under tsup / vitest / bun\n// run-on-source no `--define` runs and the `typeof` guard defaults to `true` —\n// every backend is available (the SDKs stay optional peers).\ndeclare const __INCLUDE_CLAUDE_SDK__: boolean;\ndeclare const __INCLUDE_CODEX__: boolean;\nconst INCLUDE_CLAUDE_SDK =\n typeof __INCLUDE_CLAUDE_SDK__ === \"undefined\" ? true : __INCLUDE_CLAUDE_SDK__;\nconst INCLUDE_CODEX = typeof __INCLUDE_CODEX__ === \"undefined\" ? true : __INCLUDE_CODEX__;\n\nconst driverRegistry = new Map<string, { factory: DriverFactory; info: DriverInfo }>();\n\n/**\n * Static capability metadata for every built-in backend.\n *\n * Pure data — this object imports no driver module and references no backend\n * SDK. {@link listDrivers} returns it (merged with any third-party drivers)\n * so selection UIs can enumerate every backend without loading a single\n * driver module. The matching driver module self-registers its factory via\n * {@link registerDriver} when {@link loadDriver} imports it.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const DRIVER_CATALOG: Record<string, DriverInfo> = {\n omp: {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n },\n \"claude-sdk\": {\n id: \"claude-sdk\",\n name: \"Claude Agent SDK\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n },\n codex: {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n },\n echo: {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n },\n};\n\n/**\n * Registers a driver factory under a stable string identifier.\n *\n * Built-in drivers (`omp`, `claude-sdk`, `codex`, `echo`) self-register when\n * their driver module is imported by {@link loadDriver} — `createDriver` and\n * `listModelsForDriver` trigger that load for the requested id. Third-party\n * drivers can call `registerDriver` directly at any time before the first\n * `createDriver` call that uses their id.\n *\n * @param id - Stable identifier used to look up the driver (e.g. `\"omp\"`).\n * @param factory - Function that constructs a new driver instance for the given config.\n * @param info - Static capability metadata returned by {@link listDrivers}.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function registerDriver(id: string, factory: DriverFactory, info: DriverInfo): void {\n driverRegistry.set(id, { factory, info });\n}\n\n/**\n * Imports the driver module for the given built-in backend id, which\n * self-registers its factory via {@link registerDriver} on import.\n *\n * This is the single id → module map in bridge core. Every specifier is a\n * literal string so `bun --compile` can statically bundle the driver module\n * (and, transitively, its SDK). The in-process-SDK backends (`claude-sdk`,\n * `codex`) are wrapped in build-constant guards so an excluded backend's\n * `await import` folds to dead code in the compiled binary. `omp` and `echo`\n * carry no SDK weight and are always available.\n *\n * Unknown ids are a no-op — {@link createDriver} surfaces the clear error.\n * Idempotent: a second call re-imports an already-cached module.\n *\n * @param id - Built-in driver identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function loadDriver(id: string): Promise<void> {\n switch (id) {\n case \"omp\":\n await import(\"@skaile/workspaces/drivers/omp\");\n break;\n case \"echo\":\n await import(\"@skaile/workspaces/drivers/echo\");\n break;\n case \"claude-sdk\":\n if (INCLUDE_CLAUDE_SDK) await import(\"@skaile/workspaces/drivers/claude-sdk\");\n break;\n case \"codex\":\n if (INCLUDE_CODEX) await import(\"@skaile/workspaces/drivers/codex\");\n break;\n // unknown id: no-op — createDriver throws its existing clear error\n }\n}\n\n/**\n * Creates a new driver instance for the given backend id.\n *\n * Lazily loads the driver module via {@link loadDriver} first, so callers\n * never have to register built-ins themselves. The returned driver has not\n * been started yet — call `driver.start()` before sending prompts.\n *\n * @param id - Registered driver identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @param config - Configuration forwarded to the driver constructor.\n * @returns A freshly constructed (not yet started) {@link AgentDriver}.\n * @throws {Error} When `id` is a known backend excluded from this build, or\n * when `id` does not match any registered driver at all.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function createDriver(id: string, config: AgentConfig): Promise<AgentDriver> {\n await loadDriver(id);\n const entry = driverRegistry.get(id);\n if (!entry) {\n if (id in DRIVER_CATALOG) {\n throw new Error(`Agent driver \"${id}\" is not bundled in this build.`);\n }\n throw new Error(\n `Unknown agent driver: \"${id}\". Available: ${listDrivers()\n .map((d) => d.id)\n .join(\", \")}`,\n );\n }\n return entry.factory(config);\n}\n\n/**\n * Returns the capability metadata for every available driver.\n *\n * Enumerates every built-in backend from {@link DRIVER_CATALOG} without\n * loading a single driver module or backend SDK, then merges in any\n * third-party drivers registered via {@link registerDriver} that are not\n * already in the catalog. Use this to populate driver selection UIs.\n *\n * @returns Array of {@link DriverInfo} objects, one per available driver.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function listDrivers(): DriverInfo[] {\n const merged = new Map<string, DriverInfo>();\n for (const info of Object.values(DRIVER_CATALOG)) {\n merged.set(info.id, info);\n }\n for (const { info } of driverRegistry.values()) {\n if (!merged.has(info.id)) merged.set(info.id, info);\n }\n return [...merged.values()];\n}\n\n/**\n * List models available to a specific driver without starting a full agent session.\n *\n * Lazily loads the driver module via {@link loadDriver}, creates a minimal\n * driver instance (no subprocess spawned, no `start()` call), delegates to\n * its `listModels()` method, and returns the result. API keys are forwarded\n * so drivers can authenticate against provider REST APIs if needed. Returns\n * `[]` when `driverId` is not registered.\n *\n * @param driverId - Registered driver id (e.g. `\"omp\"`, `\"claude-sdk\"`, `\"codex\"`).\n * @param apiKeys - Provider API keys keyed by provider name (e.g. `{ anthropic: \"sk-...\" }`).\n * Pass `settings.apiKeys ?? {}` from forge-assistant's resolved settings.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function listModelsForDriver(\n driverId: string,\n apiKeys: Record<string, string>,\n): Promise<ModelEntry[]> {\n await loadDriver(driverId);\n const entry = driverRegistry.get(driverId);\n if (!entry) return [];\n // cwd and sessionId are required by AgentConfig but none of the listModels()\n // implementations use them — they only need apiKeys / env for authentication.\n const driver = entry.factory({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys });\n return driver.listModels();\n}\n"]}
1
+ {"version":3,"sources":["../bridge/src/logger.ts","../bridge/src/types.ts","../bridge/src/registry.ts"],"names":[],"mappings":"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","file":"chunk-YOFKTALB.js","sourcesContent":["/**\n * Bridge-layer logger factory.\n *\n * Each driver creates its own Logger via `getBridgeLogger(subkind)` at\n * construction time. Falls back to an off-mode Logger (stdout only) when\n * no LogStore is registered — see @skaile/workspaces/core/logging for details.\n */\n\nimport { createLogger } from \"@skaile/workspaces/core/logging\";\nimport type { Logger } from \"@skaile/workspaces/types\";\n\n/**\n * Construct a bridge-scoped Logger for a given driver subkind.\n *\n * Creates a `Logger` with `kind: \"bridge\"` and the specified `subkind`. Falls back to\n * an off-mode Logger (stdout only) when no `LogStore` is registered — see\n * `@skaile/workspaces/core/logging` for details. Each driver calls this once at construction\n * time; never re-construct per call.\n *\n * @param subkind - Driver id, e.g. `\"claude-sdk\"`, `\"omp\"`, `\"echo\"`, `\"codex\"`.\n * @returns A `Logger` scoped to `bridge:<subkind>`.\n * @docLink packages/bridge/api-reference#logger\n */\nexport function getBridgeLogger(subkind: string): Logger {\n return createLogger({ kind: \"bridge\", subkind });\n}\n","import { EventEmitter } from \"node:events\";\nimport type { Span, TelemetryProvider, Trace } from \"@skaile/workspaces/telemetry\";\nimport type {\n Capability,\n CredentialMint,\n RenderInvokedEvent,\n TokenUsage,\n} from \"@skaile/workspaces/types\";\nimport type { ModelEntry } from \"./models.js\";\n\n/**\n * Minimal LLM tool descriptor used by the capability dispatch path. Mirrors\n * the runner's `LLMTool` shape so drivers can consume registry output without\n * importing `@skaile/workspaces/runner` (which would create a circular dep).\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-capability-tool\n */\nexport interface BridgeCapabilityTool {\n /** Capability name; used as the LLM-visible tool name. */\n name: string;\n /** Human/LLM-readable description. */\n description: string;\n /** JSON Schema for the tool's input parameters. */\n parameters: Record<string, unknown>;\n}\n\n/**\n * Render-cap event emission callback used by the bridge when the LLM invokes\n * a capability that carries a `render` spec. The runner provides the actual\n * sink (transport.send / sendEvent); the bridge only emits.\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-render-emit\n */\nexport type BridgeRenderEmit = (event: RenderInvokedEvent) => void;\n\n/**\n * Text-event emission callback for render-capability fallbacks. When a\n * `RenderCapability` carries `render.fallback` and the LLM invokes it, the\n * bridge substitutes `{{prop}}` placeholders (top-level keys of `props`,\n * optional dotted-path traversal `{{user.name}}`) and pushes the rendered\n * string through this callback so clients without a render layer still see\n * a textual representation. No-op when `fallback` is absent.\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-text-emit\n */\nexport type BridgeTextEmit = (text: string) => void;\n\n/**\n * Bundle of capability dispatch hooks. Registered into the driver via\n * `AgentConfig.capabilities`; the driver routes registered LLM tool calls\n * back into `invoke()` instead of using its native dispatch path.\n *\n * The runner constructs this from a `CapabilityRegistry` instance and threads\n * it through `createAgentSession()`. Drivers that don't yet implement\n * capability dispatch ignore the field — legacy v1 paths stay intact.\n *\n * @category Capabilities\n * @since 2.0.0\n * @docLink packages/bridge/concepts#bridge-capability-hooks\n */\nexport interface BridgeCapabilityHooks {\n /** Build the LLM tool descriptor list from the registry. Called per turn so registration changes take effect. */\n composeTools(): BridgeCapabilityTool[];\n /** Resolve a wire-format Capability descriptor by name. Used by the bridge to inspect `fireAndForget` / `render`. */\n resolve(name: string): Capability | null;\n /** Validate input + dispatch through the registry. Logging is wired by the registry. */\n invoke(name: string, input: unknown): Promise<unknown>;\n /** Emit a render-invoked event. The runner forwards via the WebSocket transport. */\n emitRender?: BridgeRenderEmit;\n /** Emit a text fallback for render capabilities with `render.fallback`. */\n emitText?: BridgeTextEmit;\n /** Session id passed through to the runner's per-handler logger. */\n sessionId: string;\n}\n\n/**\n * Static metadata for a registered agent driver backend.\n *\n * Returned by {@link listDrivers} and exposed on every {@link AgentDriver} instance\n * via `driverInfo`.\n *\n * @docLink packages/bridge/concepts#driver-info\n */\nexport interface DriverInfo {\n /** Stable machine identifier used to look up the driver in the registry (e.g. `\"omp\"`, `\"claude-sdk\"`). */\n id: string;\n /** Human-readable display name shown in UIs and logs. */\n name: string;\n /** `true` when the driver can target any LLM provider; `false` for Anthropic-only drivers. */\n modelAgnostic: boolean;\n /**\n * `true` when the driver supports mid-stream abort via `abort()` without killing the process.\n * Drivers that return `false` can only be stopped via `kill()`.\n */\n supportsInBandAbort: boolean;\n}\n\n/**\n * Codex-specific tuning options passed through `DriverOptions.codex`.\n *\n * @remarks These are forwarded verbatim to the Codex driver and have no effect on other drivers.\n * @docLink packages/bridge/concepts#codex-driver-options\n */\nexport interface CodexDriverOptions {\n /** Controls whether Codex may auto-apply edits without user approval. */\n approvalPolicy?: \"never\" | \"on-request\" | \"on-failure\" | \"untrusted\";\n /** Filesystem sandbox level for the Codex process. */\n sandboxMode?: \"read-only\" | \"workspace-write\" | \"danger-full-access\";\n /** Reasoning budget passed to the model. */\n reasoningEffort?: \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n /** When `true`, the Codex sandbox is allowed to make outbound network requests. */\n networkAccessEnabled?: boolean;\n /** Extra directories made accessible to the Codex sandbox in addition to `cwd`. */\n additionalDirectories?: string[];\n}\n\n/**\n * Driver-specific configuration bag.\n *\n * Fields are keyed by driver ID so that callers can pass driver-specific options\n * through the common {@link AgentConfig} without breaking other drivers.\n *\n * @docLink packages/bridge/concepts#driver-options\n */\nexport interface DriverOptions {\n /** Codex-specific options. Ignored by all other drivers. */\n codex?: CodexDriverOptions;\n}\n\n/**\n * Configuration passed to a driver when it is created via {@link createDriver}.\n *\n * All fields are shared across drivers; driver-specific behaviour is documented\n * per field. Fields that are silently ignored by a driver are marked accordingly.\n *\n * @docLink packages/bridge/concepts#agent-config\n */\nexport interface AgentConfig {\n /** Absolute path to the working directory the agent operates in. */\n cwd: string;\n /**\n * LLM provider name (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * Combined with `model` as `provider/model` for omp's `--model` flag.\n * Ignored by claude-sdk (always Anthropic).\n */\n provider?: string;\n /**\n * LLM model identifier (e.g. `\"claude-sonnet-4-5\"`, `\"gpt-4o\"`).\n * For omp: passed as `--model [provider/]model`.\n * For claude-sdk: passed as the `model` query option.\n */\n model?: string;\n /**\n * Provider API keys keyed by provider name (e.g. `{ anthropic: \"sk-...\" }`).\n * Drivers inject the relevant key into the environment or SDK options.\n */\n apiKeys?: Record<string, string>;\n /**\n * Additional environment variables merged into the child process environment.\n * For omp: merged with `process.env` before spawn. For claude-sdk: accessed\n * via `env.ANTHROPIC_API_KEY` as an alternative to `apiKeys.anthropic`.\n */\n env?: Record<string, string>;\n /** Inline system prompt — written to .omp/system.md and passed via --append-system-prompt (omp driver) */\n systemPrompt?: string;\n /** Path to project .omp/ directory (PI_CODING_AGENT_DIR for omp driver) */\n agentDir?: string;\n /** SSH key path — injected as GIT_SSH_COMMAND */\n sshKeyPath?: string;\n /** Pre-assign a UUID as the session ID for a new session (claude-sdk: passed as sessionId option) */\n sessionId?: string;\n /** Resume this specific past session by UUID instead of starting fresh (claude-sdk: passed as resume option) */\n resumeSessionId?: string;\n /** Maximum agentic turns per query (claude-sdk: passed as maxTurns option) */\n maxTurns?: number;\n /** Agent name — selects a deployed sub-agent definition as the main agent identity.\n * claude-sdk: passed as `agent` option to query() → reads .claude/agents/<name>.md natively.\n * omp: ignored (omp uses agentDir/PI_CODING_AGENT_DIR instead). */\n agentName?: string;\n /** In-process SDK MCP servers for custom tool injection (Claude SDK only, ignored by other drivers) */\n mcpServers?: Record<string, unknown>;\n /** Tool restrictions from agent.yaml — applied to the main agent session */\n tools?: {\n /** Tool names that the agent is allowed to invoke. An empty array means no restriction. */\n allowed?: string[];\n /** Tool names that the agent is explicitly forbidden from invoking. */\n denied?: string[];\n };\n /** Thinking mode for Claude models: adaptive (Claude decides), enabled (always think), disabled (no thinking). */\n thinking?: \"adaptive\" | \"enabled\" | \"disabled\";\n /** Reasoning effort level for Claude models. */\n effort?: \"low\" | \"medium\" | \"high\" | \"max\";\n /** Driver-specific configuration bag. */\n driverOptions?: DriverOptions;\n /**\n * Protocol v2 capability dispatch hooks. When present, the driver uses the\n * registry as the source of LLM tool definitions and routes invocations\n * through `capabilities.invoke()`. Absent → legacy v1 path (existing\n * mcpServers / native dispatch).\n *\n * @since 2.0.0\n */\n capabilities?: BridgeCapabilityHooks;\n /**\n * The platform's `AIProviderConfig.id` for the AI credential currently\n * provisioned into this driver. The runner reads this off `AgentConfig`\n * during 401 mediation and passes it as `configId` in\n * `request_access_token { kind: 'ai-credentials' }`. The driver itself\n * does not consume this field — only the runner uses it.\n *\n * Set by the platform agent-gateway in `ConfigureCommandV2` for mediated\n * sessions. Standalone runners (CLI / forge / Claude plugin) leave it\n * undefined; the runner falls back to surfacing the auth error to the\n * user without mediating.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md`\n * § \"Wire `aiProviderConfigId` end-to-end\".\n *\n * @since 3.3.0\n */\n aiProviderConfigId?: string;\n /**\n * Optional callback invoked by the driver when the underlying agent\n * surfaces an `authentication_error`. In Protocol v3 the runner mediates\n * the refresh via the `host.refresh_credential` capability and returns a\n * typed {@link CredentialMint}. The driver inspects the discriminator:\n *\n * - `mint.ok === true`: a fresh credential is now provisioned. The\n * driver re-attempts the in-flight prompt once.\n * - `mint.ok === false`: refresh failed (`code` carries a stable reason\n * such as `revoked`, `not-configured`, `provider-error`,\n * `backend-error`). The driver surfaces the original `AuthError` to\n * the caller.\n *\n * `args.configId` carries the platform `AIProviderConfig.id` the driver\n * was provisioned with (mirrors {@link AgentConfig.aiProviderConfigId}).\n * The runner uses it to scope the refresh to the correct AI credential.\n *\n * When omitted, the driver throws `AuthError` immediately as before\n * (standalone CLI / forge mode — there is no platform mediator to ask).\n *\n * Centralising auth-retry inside the driver means every consumer of\n * `driver.prompt(...)` (serve handler, compaction orchestrator, flow\n * orchestrator, …) gets self-healing for free — there is no per-call-site\n * wrapping.\n *\n * Spec: `_devlog/specs/2026-05-10-deterministic-session-bootstrap.md`\n * § \"host.refresh_credential capability\".\n *\n * @since 3.4.0\n */\n onAuthError?: (args: { configId: string }) => Promise<CredentialMint>;\n}\n\n/**\n * A single message in an agent conversation.\n *\n * Emitted as part of {@link AgentEvent} variants (`message_start`, `message_update`, `message_end`).\n *\n * @docLink packages/bridge/concepts#agent-message\n */\nexport interface AgentMessage {\n /** Originator of the message. */\n role: \"user\" | \"assistant\" | \"tool\";\n /** Message body — either a plain string or a list of typed content blocks. */\n content: string | ContentBlock[];\n /** Tool invocations made by the assistant in this message. */\n toolCalls?: ToolCall[];\n /** For `role === \"tool\"`: the name of the tool whose result this message carries. */\n toolName?: string;\n /** For `role === \"tool\"`: `true` when the tool returned an error. */\n isError?: boolean;\n /** Optional structured payload for tool results. */\n data?: unknown;\n}\n\n/**\n * A typed block within an {@link AgentMessage}'s content array.\n *\n * Mirrors the Anthropic content block schema but is driver-agnostic.\n *\n * @docLink packages/bridge/concepts#content-block\n */\nexport interface ContentBlock {\n /** Block discriminant. */\n type: \"text\" | \"tool_use\" | \"tool_result\" | \"thinking\";\n /** Present for `text` and `thinking` blocks. */\n text?: string;\n /** Tool use / tool result correlation ID. */\n id?: string;\n /** Tool name (present on `tool_use` blocks). */\n name?: string;\n /** Tool input arguments (present on `tool_use` blocks). */\n input?: any;\n /** Serialised tool result content (present on `tool_result` blocks). */\n content?: string;\n}\n\n/**\n * A single tool invocation made by the agent within a message.\n *\n * @docLink packages/bridge/concepts#tool-call\n */\nexport interface ToolCall {\n /** Correlation ID used to match the call with its result. */\n id: string;\n /** Name of the tool being invoked. */\n name: string;\n /** Arguments passed to the tool. */\n input: any;\n}\n\n/**\n * Error classification for agent failures.\n *\n * Used to determine whether a failure is retryable and to surface actionable\n * hints to the user. See `bridge/CLAUDE.md` for the full category-to-behaviour matrix.\n *\n * @see AgentError\n * @docLink packages/bridge/concepts#error-category\n */\nexport type ErrorCategory =\n | \"auth\"\n | \"rate_limit\"\n | \"model\"\n | \"network\"\n | \"config\"\n | \"process\"\n | \"validation\"\n | \"unknown\";\n\n/**\n * Structured error payload emitted inside the `error` {@link AgentEvent}.\n *\n * Consumers should inspect `retryable` before deciding to surface a retry button,\n * and `hint` to provide an actionable message to the user.\n *\n * @docLink packages/bridge/concepts#agent-error\n */\nexport interface AgentError {\n /** Human-readable error description. */\n message: string;\n /** Coarse failure classification used for retry logic and telemetry. */\n category: ErrorCategory;\n /** HTTP status code if the error originated from an API response. */\n statusCode?: number;\n /** `true` when the caller may safely retry the same operation. */\n retryable: boolean;\n /** Short actionable advice suitable for display in the UI. */\n hint?: string;\n}\n\n/**\n * Metadata for a slash command exposed by the active agent runtime.\n *\n * @docLink packages/bridge/concepts#slash-command-info\n */\nexport interface SlashCommandInfo {\n /** Command name without the leading slash (e.g. `\"compact\"`). */\n name: string;\n /** One-line description shown in command pickers. */\n description: string;\n /** Placeholder text describing what argument the command expects. */\n argumentHint?: string;\n}\n\n/**\n * Discriminated union of all events emitted by a driver on the `'agent-event'` channel.\n *\n * @remarks\n * Consumers listen via `driver.on('agent-event', (event: AgentEvent) => ...)`.\n * The `[k: string]: any` index signature on most variants allows drivers to attach\n * driver-specific fields (e.g. `_textDelta`) without breaking the union.\n *\n * @docLink packages/bridge/concepts#agent-event\n */\nexport type AgentEvent =\n | { type: \"message_start\"; message: AgentMessage; [k: string]: any }\n | { type: \"message_update\"; message: AgentMessage; [k: string]: any }\n | { type: \"message_end\"; message: AgentMessage; [k: string]: any }\n | { type: \"turn_end\"; toolResults?: AgentMessage[]; [k: string]: any }\n | { type: \"agent_end\"; [k: string]: any }\n | {\n type: \"result\";\n subtype: string;\n summary?: string;\n costUsd?: number;\n /** Per-turn token usage when the driver tracks it. Added in 3.1.0. */\n tokens?: TokenUsage;\n errors?: string[];\n [k: string]: any;\n }\n | { type: \"error\"; error: string; detail?: AgentError; fatal?: boolean; [k: string]: any }\n | { type: \"tool_call\"; name?: string; tool?: { name: string }; [k: string]: any }\n | { type: \"tool_execution_end\"; toolName?: string; [k: string]: any }\n | { type: \"commands_available\"; commands: SlashCommandInfo[] }\n | { type: \"session_info\"; driverSessionId: string; sessionFile?: string }\n | { type: \"ui_render\"; [k: string]: any }\n | { type: \"ui_render_update\"; [k: string]: any }\n | { type: \"ui_clear\"; [k: string]: any }\n // Phase 3 (resume cascade) — driver-emitted resume outcome.\n | {\n type: \"resume_failed\";\n resumeSessionId: string;\n reason: \"signature_mismatch\" | \"model_mismatch\" | \"jsonl_lost\" | \"jsonl_poisoned\";\n [k: string]: any;\n };\n\n/**\n * Abstract base class for agent driver backends.\n *\n * Wraps an LLM coding agent behind a single `prompt()` interface.\n * All drivers emit `'agent-event'` with {@link AgentEvent} payloads.\n *\n * @remarks\n * Subclasses must implement `start`, `prompt`, `abort`, `kill`, and `isRunning`.\n * Implementations should never emit an event name other than `'agent-event'` as\n * the public streaming channel — internal events (`'ready'`, `'exit'`, etc.) are\n * driver-private.\n *\n * @example\n * ```ts\n * const driver = createDriver('omp', config);\n * driver.on('agent-event', (event) => console.log(event.type));\n * await driver.start();\n * await driver.prompt('Refactor the auth module');\n * driver.kill();\n * ```\n *\n * @docLink packages/bridge/concepts#agent-driver\n */\nexport abstract class AgentDriver extends EventEmitter {\n /** Static metadata describing this driver's capabilities. */\n abstract readonly driverInfo: DriverInfo;\n\n /**\n * Initialises the driver backend — spawns the child process (omp) or loads\n * the SDK module (claude-sdk). Resolves when the backend is ready to accept\n * prompts. Idempotent: calling `start()` on an already-running driver is a no-op.\n *\n * @throws {Error} When the backend binary is missing or the SDK cannot be loaded.\n */\n abstract start(): Promise<void>;\n\n /**\n * Sends a user message to the agent and resolves when the agent's turn completes\n * (i.e. after the `agent_end` event has been emitted).\n *\n * @param message - Plain-text user prompt to send to the agent.\n * @throws {Error} When the driver is not running or the underlying backend reports a fatal error.\n */\n abstract prompt(message: string): Promise<void>;\n\n /**\n * Sends an in-band abort signal to the agent, requesting it to stop the current\n * turn without terminating the process. The driver remains usable after `abort()`.\n *\n * @remarks Only meaningful when `driverInfo.supportsInBandAbort` is `true`.\n * For other drivers, prefer `kill()` followed by creating a new driver instance.\n */\n abstract abort(): Promise<void>;\n\n /**\n * Terminates the agent backend immediately (SIGTERM for subprocess drivers,\n * `close()` for in-process drivers). The driver instance must not be reused\n * after `kill()`.\n */\n abstract kill(): void;\n\n /** `true` when the backend is alive and able to accept new prompts. */\n abstract get isRunning(): boolean;\n\n /** Optional provider-native session/thread identifier for resume support. */\n get runtimeSessionId(): string | undefined {\n return undefined;\n }\n\n /** Slash commands discovered from the agent runtime. Override in drivers that support introspection. */\n getSlashCommands(): SlashCommandInfo[] {\n return [];\n }\n\n // ── Live reconfiguration ────────────────────────────────────────────────\n\n /**\n * Live-update driver configuration. The new values take effect on the next\n * prompt() call. Only model/thinking/effort are reconfigurable mid-session.\n *\n * Subclasses that store config locally should override this to apply the\n * patch to their own config field. The base implementation is a no-op.\n */\n reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n // No-op — subclasses override to apply to their own config.\n void patch;\n }\n\n /**\n * Returns the model identifier currently configured on this driver.\n * Subclasses that store config locally should override this.\n */\n getModel(): string | undefined {\n return undefined;\n }\n\n // ── Compaction support ──────────────────────────────────────────────────\n\n /**\n * Returns the token usage from the most recent completed turn.\n * Returns `null` if usage data is unavailable (e.g. driver doesn't track it).\n *\n * Widened in 3.1.0 to return the full `TokenUsage` shape (input / output /\n * cache-read / cache-creation / reasoning). All fields are optional so\n * drivers can populate just what their provider reports. Existing callers\n * that read only `inputTokens` / `outputTokens` keep working — those fields\n * are still present and carry the same semantics as before.\n */\n getTokenUsage(): TokenUsage | null {\n return null;\n }\n\n /**\n * Returns the model's context window size in tokens.\n * Returns `null` if unknown.\n */\n getContextWindow(): number | null {\n return null;\n }\n\n /**\n * Returns the list of models available to this driver without starting a session.\n * Drivers that can enumerate their own models override this method.\n * Returns an empty array by default.\n */\n async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n\n /**\n * Closes the current conversation session and prepares for a fresh start.\n * The next `prompt()` call will begin a new session without prior history.\n * The driver remains usable after `resetSession()`.\n */\n abstract resetSession(): Promise<void>;\n\n // ── Telemetry ─────────────────────────────────────────────────────────────\n\n protected _telemetry?: TelemetryProvider;\n protected _activeTrace?: Trace;\n protected _activeTurnSpan?: Span;\n private _turnStartTime?: number;\n\n /**\n * Attach a telemetry provider and active trace to this driver.\n * Called by the runner after creating the driver but before start().\n */\n setTelemetry(provider: TelemetryProvider, trace: Trace): void {\n this._telemetry = provider;\n this._activeTrace = trace;\n }\n\n /**\n * Begin a turn span. Called by the runner before prompt().\n * Pass a parent span (e.g. the turn span from the orchestrator) for nesting.\n * Returns the span so the runner can annotate it further.\n */\n beginTurnSpan(\n parent?: Trace | Span,\n attrs?: Record<string, string | number | boolean>,\n ): Span | undefined {\n if (!this._telemetry || !this._activeTrace) return undefined;\n this._turnStartTime = Date.now();\n this._activeTurnSpan = this._telemetry.startSpan(parent ?? this._activeTrace, {\n name: \"llm_generation\",\n kind: \"llm_generation\",\n attributes: attrs,\n });\n return this._activeTurnSpan;\n }\n\n /**\n * End the current turn span with generation data.\n * Called by the runner after agent_end. Model and provider are passed\n * explicitly — the driver base class does not access config directly.\n */\n endTurnSpan(result?: {\n model?: string;\n provider?: string;\n inputTokens?: number;\n outputTokens?: number;\n stopReason?: string;\n error?: string;\n }): void {\n if (!this._telemetry || !this._activeTurnSpan) return;\n const durationMs = this._turnStartTime ? Date.now() - this._turnStartTime : 0;\n\n if (result?.inputTokens !== undefined || result?.outputTokens !== undefined) {\n this._telemetry.logGeneration(this._activeTurnSpan, {\n model: result?.model ?? \"unknown\",\n provider: result?.provider ?? \"unknown\",\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n durationMs,\n stopReason: result.stopReason,\n });\n }\n\n this._telemetry.endSpan(this._activeTurnSpan, {\n status: result?.error ? \"error\" : \"ok\",\n error: result?.error,\n attributes: { \"skaile.turn.duration_ms\": durationMs },\n });\n\n this._activeTurnSpan = undefined;\n this._turnStartTime = undefined;\n }\n}\n\n/**\n * Factory function signature registered in the driver registry.\n *\n * @param config - Configuration for the new driver instance.\n * @returns A freshly constructed (not yet started) {@link AgentDriver}.\n * @docLink packages/bridge/concepts#driver-factory\n */\nexport type DriverFactory = (config: AgentConfig) => AgentDriver;\n","import type { ModelEntry } from \"./models.js\";\nimport type { AgentConfig, AgentDriver, DriverFactory, DriverInfo } from \"./types.js\";\n\n// Build-time backend gating. `bun build --compile --define:__INCLUDE_*__=...`\n// folds these to literal booleans so an excluded backend's driver module and\n// its SDK are dead-code-stripped from the binary. Under tsup / vitest / bun\n// run-on-source no `--define` runs and the `typeof` guard defaults to `true` —\n// every backend is available (the SDKs stay optional peers).\ndeclare const __INCLUDE_CLAUDE_SDK__: boolean;\ndeclare const __INCLUDE_CODEX__: boolean;\nconst INCLUDE_CLAUDE_SDK =\n typeof __INCLUDE_CLAUDE_SDK__ === \"undefined\" ? true : __INCLUDE_CLAUDE_SDK__;\nconst INCLUDE_CODEX = typeof __INCLUDE_CODEX__ === \"undefined\" ? true : __INCLUDE_CODEX__;\n\nconst driverRegistry = new Map<string, { factory: DriverFactory; info: DriverInfo }>();\n\n/**\n * Static capability metadata for every built-in backend.\n *\n * Pure data — this object imports no driver module and references no backend\n * SDK. {@link listDrivers} returns it (merged with any third-party drivers)\n * so selection UIs can enumerate every backend without loading a single\n * driver module. The matching driver module self-registers its factory via\n * {@link registerDriver} when {@link loadDriver} imports it.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const DRIVER_CATALOG: Record<string, DriverInfo> = {\n omp: {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n },\n \"claude-sdk\": {\n id: \"claude-sdk\",\n name: \"Claude Agent SDK\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n },\n codex: {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n },\n echo: {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n },\n};\n\n/**\n * Registers a driver factory under a stable string identifier.\n *\n * Built-in drivers (`omp`, `claude-sdk`, `codex`, `echo`) self-register when\n * their driver module is imported by {@link loadDriver} — `createDriver` and\n * `listModelsForDriver` trigger that load for the requested id. Third-party\n * drivers can call `registerDriver` directly at any time before the first\n * `createDriver` call that uses their id.\n *\n * @param id - Stable identifier used to look up the driver (e.g. `\"omp\"`).\n * @param factory - Function that constructs a new driver instance for the given config.\n * @param info - Static capability metadata returned by {@link listDrivers}.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function registerDriver(id: string, factory: DriverFactory, info: DriverInfo): void {\n driverRegistry.set(id, { factory, info });\n}\n\n/**\n * Imports the driver module for the given built-in backend id, which\n * self-registers its factory via {@link registerDriver} on import.\n *\n * This is the single id → module map in bridge core. Every specifier is a\n * literal string so `bun --compile` can statically bundle the driver module\n * (and, transitively, its SDK). The in-process-SDK backends (`claude-sdk`,\n * `codex`) are wrapped in build-constant guards so an excluded backend's\n * `await import` folds to dead code in the compiled binary. `omp` and `echo`\n * carry no SDK weight and are always available.\n *\n * Unknown ids are a no-op — {@link createDriver} surfaces the clear error.\n * Idempotent: a second call re-imports an already-cached module.\n *\n * @param id - Built-in driver identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function loadDriver(id: string): Promise<void> {\n switch (id) {\n case \"omp\":\n await import(\"@skaile/workspaces/drivers/omp\");\n break;\n case \"echo\":\n await import(\"@skaile/workspaces/drivers/echo\");\n break;\n case \"claude-sdk\":\n if (INCLUDE_CLAUDE_SDK) await import(\"@skaile/workspaces/drivers/claude-sdk\");\n break;\n case \"codex\":\n if (INCLUDE_CODEX) await import(\"@skaile/workspaces/drivers/codex\");\n break;\n // unknown id: no-op — createDriver throws its existing clear error\n }\n}\n\n/**\n * Creates a new driver instance for the given backend id.\n *\n * Lazily loads the driver module via {@link loadDriver} first, so callers\n * never have to register built-ins themselves. The returned driver has not\n * been started yet — call `driver.start()` before sending prompts.\n *\n * @param id - Registered driver identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @param config - Configuration forwarded to the driver constructor.\n * @returns A freshly constructed (not yet started) {@link AgentDriver}.\n * @throws {Error} When `id` is a known backend excluded from this build, or\n * when `id` does not match any registered driver at all.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function createDriver(id: string, config: AgentConfig): Promise<AgentDriver> {\n await loadDriver(id);\n const entry = driverRegistry.get(id);\n if (!entry) {\n if (id in DRIVER_CATALOG) {\n throw new Error(`Agent driver \"${id}\" is not bundled in this build.`);\n }\n throw new Error(\n `Unknown agent driver: \"${id}\". Available: ${listDrivers()\n .map((d) => d.id)\n .join(\", \")}`,\n );\n }\n return entry.factory(config);\n}\n\n/**\n * Returns the capability metadata for every available driver.\n *\n * Enumerates every built-in backend from {@link DRIVER_CATALOG} without\n * loading a single driver module or backend SDK, then merges in any\n * third-party drivers registered via {@link registerDriver} that are not\n * already in the catalog. Use this to populate driver selection UIs.\n *\n * @returns Array of {@link DriverInfo} objects, one per available driver.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function listDrivers(): DriverInfo[] {\n const merged = new Map<string, DriverInfo>();\n for (const info of Object.values(DRIVER_CATALOG)) {\n merged.set(info.id, info);\n }\n for (const { info } of driverRegistry.values()) {\n if (!merged.has(info.id)) merged.set(info.id, info);\n }\n return [...merged.values()];\n}\n\n/**\n * List models available to a specific driver without starting a full agent session.\n *\n * Lazily loads the driver module via {@link loadDriver}, creates a minimal\n * driver instance (no subprocess spawned, no `start()` call), delegates to\n * its `listModels()` method, and returns the result. API keys are forwarded\n * so drivers can authenticate against provider REST APIs if needed. Returns\n * `[]` when `driverId` is not registered.\n *\n * @param driverId - Registered driver id (e.g. `\"omp\"`, `\"claude-sdk\"`, `\"codex\"`).\n * @param apiKeys - Provider API keys keyed by provider name (e.g. `{ anthropic: \"sk-...\" }`).\n * Pass `settings.apiKeys ?? {}` from forge-assistant's resolved settings.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function listModelsForDriver(\n driverId: string,\n apiKeys: Record<string, string>,\n): Promise<ModelEntry[]> {\n await loadDriver(driverId);\n const entry = driverRegistry.get(driverId);\n if (!entry) return [];\n // cwd and sessionId are required by AgentConfig but none of the listModels()\n // implementations use them — they only need apiKeys / env for authentication.\n const driver = entry.factory({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys });\n return driver.listModels();\n}\n"]}
@@ -303,5 +303,5 @@ function resolveProjectDir(additionalEnvVars) {
303
303
  }
304
304
 
305
305
  export { PluginStore, WorkspacePlugin, buildClaudePluginFiles, resolveProjectDir };
306
- //# sourceMappingURL=chunk-BTKNSMLK.js.map
307
- //# sourceMappingURL=chunk-BTKNSMLK.js.map
306
+ //# sourceMappingURL=chunk-Z5PO7ZVP.js.map
307
+ //# sourceMappingURL=chunk-Z5PO7ZVP.js.map