@openclaw-cloud/agent-controller 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/agent-controller.js +11 -2
- package/dist/commands/channel-server.d.ts +17 -0
- package/dist/commands/channel-server.js +71 -0
- package/dist/commands/channel-server.js.map +1 -0
- package/dist/config-file.js +6 -0
- package/dist/config-file.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -1
- package/dist/handlers/board-handler.js +56 -20
- package/dist/handlers/board-handler.js.map +1 -1
- package/dist/handlers/chat.d.ts +17 -0
- package/dist/handlers/chat.js +93 -0
- package/dist/handlers/chat.js.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/claude-code/channel-server.d.ts +60 -0
- package/dist/providers/claude-code/channel-server.js +155 -0
- package/dist/providers/claude-code/channel-server.js.map +1 -0
- package/dist/providers/claude-code/index.d.ts +68 -0
- package/dist/providers/claude-code/index.js +276 -0
- package/dist/providers/claude-code/index.js.map +1 -0
- package/dist/providers/claude-code/login-flow.d.ts +26 -0
- package/dist/providers/claude-code/login-flow.js +129 -0
- package/dist/providers/claude-code/login-flow.js.map +1 -0
- package/dist/providers/claude-code/settings-writer.d.ts +29 -0
- package/dist/providers/claude-code/settings-writer.js +79 -0
- package/dist/providers/claude-code/settings-writer.js.map +1 -0
- package/dist/providers/claude-code/socket-bridge.d.ts +88 -0
- package/dist/providers/claude-code/socket-bridge.js +302 -0
- package/dist/providers/claude-code/socket-bridge.js.map +1 -0
- package/dist/providers/claude-code/spawn-claude.d.ts +44 -0
- package/dist/providers/claude-code/spawn-claude.js +108 -0
- package/dist/providers/claude-code/spawn-claude.js.map +1 -0
- package/dist/providers/index.d.ts +3 -1
- package/dist/providers/index.js +12 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,QAAQ,CAC9C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAC1C,CAAC;AAEzB,mEAAmE;AACnE,KAAK,UAAU,0BAA0B;IACvC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO;QAAE,OAAO;IAEnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,oDAAoD,EACpD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,SAAS,qBAAqB;IAC5B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO;QAEvC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAEpE,mCAAmC;QACnC,IAAI,CAAC,UAAU,CAAC,UAAU;YAAE,UAAU,CAAC,UAAU,GAAG,EAAE,CAAC;QAEvD,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG;YACtC,GAAG,EAAE,2BAA2B;YAChC,SAAS,EAAE,iBAAiB;SAC7B,CAAC;QAEF,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,+CAA+C,EAC/C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,UAAU,EAAE,UAAU,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,GAAG;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,2BAA2B,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,cAAc,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,cAAc,EAAE,CAAC;IACjB,0BAA0B,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACzC,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,aAAa,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAE9C,8EAA8E;IAC9E,yEAAyE;IACzE,8EAA8E;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACjE,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,cAAc,GAAwB,IAAI,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,qBAAqB,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,cAAc,GAAG,MAAM,oBAAoB,CAAC,qBAAqB,CAAC,CAAC;QACnE,qBAAqB,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,wCAAwC;IACxC,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAkB,EAAE,EAAE;QACvD,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAChD,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC;QACjD,GAAG;QACH,KAAK;QACL,OAAO;QACP,UAAU;QACV,GAAG;QACH,OAAO,EAAE,kBAAkB;QAC3B,qBAAqB;KACtB,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACzC,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAEzC,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5F,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;SAAM,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5C,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,aAAa,EAAE;YAC7C,YAAY,EAAE,MAAM,CAAC,kBAAkB;YACvC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;YACjD,UAAU;YACV,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5B,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,QAAQ,YAAY,kBAAkB,EAAE,CAAC;YAC3C,4BAA4B,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CACjD,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClD,OAAO,CAAC,KAAK,CACX,qCAAqC,EACrC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxC,OAAO,CAAC,KAAK,CACX,sCAAsC,EACtC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8EAA8E;IAC9E,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;IACnE,IAAI,QAAQ,GAAwB,IAAI,CAAC;IAEzC,wFAAwF;IACxF,wFAAwF;IACxF,oFAAoF;IACpF,wCAAwC;IACxC,YAAY;SACT,UAAU,EAAE;SACZ,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,qDAAqD;QACrD,wEAAwE;QACxE,8DAA8D;QAC9D,MAAM,YAAY,GAAG,SAAS,WAAW,EAAE,CAAC;QAC5C,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE;YAClD,GAAG;YACH,KAAK;YACL,OAAO;YACP,UAAU;YACV,GAAG;YACH,OAAO,EAAE,kBAAkB;SAC5B,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAkB,CAAC;YACrC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,OAAO;YACnC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC7C,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CACT,gCAAgC,YAAY,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,EAAE,CACxH,CAAC;IACJ,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,cAAc,CAAC;QACrC,GAAG;QACH,OAAO;QACP,OAAO,EAAE,kBAAkB;QAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE;KACpD,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,eAAe,CAAC,IAAI,EAAE,CAAC;QACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxB,SAAS,EAAE,UAAU,EAAE,CAAC;QACxB,cAAc,EAAE,EAAE,CAAC;QACnB,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,UAAU,EAAE,CAAC;QAEpB,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SAC1D,CAAC,CAAC;QAEH,gBAAgB;aACb,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aACf,OAAO,CAAC,GAAG,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
export interface ChannelReplyMeta {
|
|
4
|
+
chat_id?: string;
|
|
5
|
+
message_id?: string;
|
|
6
|
+
source?: string;
|
|
7
|
+
user?: string;
|
|
8
|
+
ts?: string;
|
|
9
|
+
[k: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface ChannelReply {
|
|
12
|
+
text: string;
|
|
13
|
+
reply_to?: string;
|
|
14
|
+
files?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ChannelMessageMeta {
|
|
17
|
+
chat_id: string;
|
|
18
|
+
source: string;
|
|
19
|
+
message_id?: string;
|
|
20
|
+
user?: string;
|
|
21
|
+
ts?: string;
|
|
22
|
+
file_path?: string;
|
|
23
|
+
}
|
|
24
|
+
export type ReplyHandler = (reply: ChannelReply, tool: 'reply' | 'edit_message') => void;
|
|
25
|
+
/**
|
|
26
|
+
* MCP channel server — stdio-based, modeled after anthropics/claude-plugins-official
|
|
27
|
+
* `fakechat/server.ts`. When Claude Code is launched with
|
|
28
|
+
* `--channels plugin:<plugin-name>` and a `.mcp.json` entry that spawns this
|
|
29
|
+
* process, it advertises the `claude/channel` experimental capability.
|
|
30
|
+
*
|
|
31
|
+
* Inbound (we → Claude): `pushChatMessage(content, meta)` emits an MCP
|
|
32
|
+
* notification `notifications/claude/channel`.
|
|
33
|
+
*
|
|
34
|
+
* Outbound (Claude → we): Claude calls our `reply` / `edit_message` tool.
|
|
35
|
+
* Listeners registered via `onReply(handler)` receive the call args.
|
|
36
|
+
*/
|
|
37
|
+
export declare class ClaudeChannelServer extends EventEmitter {
|
|
38
|
+
private readonly opts;
|
|
39
|
+
private server;
|
|
40
|
+
private transport;
|
|
41
|
+
private started;
|
|
42
|
+
constructor(opts?: {
|
|
43
|
+
name?: string;
|
|
44
|
+
version?: string;
|
|
45
|
+
instructions?: string;
|
|
46
|
+
});
|
|
47
|
+
private registerHandlers;
|
|
48
|
+
/**
|
|
49
|
+
* Start the MCP server on a given transport (stdio by default).
|
|
50
|
+
* Pass a custom transport for in-process tests.
|
|
51
|
+
*/
|
|
52
|
+
start(transport?: Transport): Promise<void>;
|
|
53
|
+
/** Emit a channel notification to Claude. */
|
|
54
|
+
pushChatMessage(content: string, meta: ChannelMessageMeta): Promise<void>;
|
|
55
|
+
/** Register a callback for incoming reply/edit tool calls from Claude. */
|
|
56
|
+
onReply(handler: ReplyHandler): () => void;
|
|
57
|
+
/** Graceful shutdown. */
|
|
58
|
+
stop(): Promise<void>;
|
|
59
|
+
isStarted(): boolean;
|
|
60
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* MCP channel server — stdio-based, modeled after anthropics/claude-plugins-official
|
|
7
|
+
* `fakechat/server.ts`. When Claude Code is launched with
|
|
8
|
+
* `--channels plugin:<plugin-name>` and a `.mcp.json` entry that spawns this
|
|
9
|
+
* process, it advertises the `claude/channel` experimental capability.
|
|
10
|
+
*
|
|
11
|
+
* Inbound (we → Claude): `pushChatMessage(content, meta)` emits an MCP
|
|
12
|
+
* notification `notifications/claude/channel`.
|
|
13
|
+
*
|
|
14
|
+
* Outbound (Claude → we): Claude calls our `reply` / `edit_message` tool.
|
|
15
|
+
* Listeners registered via `onReply(handler)` receive the call args.
|
|
16
|
+
*/
|
|
17
|
+
export class ClaudeChannelServer extends EventEmitter {
|
|
18
|
+
opts;
|
|
19
|
+
server;
|
|
20
|
+
transport = null;
|
|
21
|
+
started = false;
|
|
22
|
+
constructor(opts = {}) {
|
|
23
|
+
super();
|
|
24
|
+
this.opts = opts;
|
|
25
|
+
this.server = new Server({
|
|
26
|
+
name: opts.name ?? 'agent-controller',
|
|
27
|
+
version: opts.version ?? '1.0.0',
|
|
28
|
+
}, {
|
|
29
|
+
capabilities: {
|
|
30
|
+
tools: {},
|
|
31
|
+
experimental: { 'claude/channel': {} },
|
|
32
|
+
},
|
|
33
|
+
instructions: opts.instructions ??
|
|
34
|
+
'OpenClaw agent-controller channel. Inbound messages arrive as <channel source="..." chat_id="..."> tags. Always reply via the `reply` tool — your transcript output is not forwarded to the user.',
|
|
35
|
+
});
|
|
36
|
+
this.registerHandlers();
|
|
37
|
+
}
|
|
38
|
+
registerHandlers() {
|
|
39
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
40
|
+
tools: [
|
|
41
|
+
{
|
|
42
|
+
name: 'reply',
|
|
43
|
+
description: 'Send a message to the user. Pass `reply_to` for quote-reply, `files` for attachments.',
|
|
44
|
+
inputSchema: {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: {
|
|
47
|
+
text: { type: 'string' },
|
|
48
|
+
reply_to: { type: 'string' },
|
|
49
|
+
files: { type: 'array', items: { type: 'string' } },
|
|
50
|
+
},
|
|
51
|
+
required: ['text'],
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'edit_message',
|
|
56
|
+
description: 'Edit a previously-sent message in place.',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
message_id: { type: 'string' },
|
|
61
|
+
text: { type: 'string' },
|
|
62
|
+
},
|
|
63
|
+
required: ['message_id', 'text'],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
}));
|
|
68
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
69
|
+
const args = (req.params.arguments ?? {});
|
|
70
|
+
try {
|
|
71
|
+
switch (req.params.name) {
|
|
72
|
+
case 'reply': {
|
|
73
|
+
const reply = {
|
|
74
|
+
text: String(args.text ?? ''),
|
|
75
|
+
reply_to: typeof args.reply_to === 'string' ? args.reply_to : undefined,
|
|
76
|
+
files: Array.isArray(args.files) ? args.files : undefined,
|
|
77
|
+
};
|
|
78
|
+
this.emit('reply', reply, 'reply');
|
|
79
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
80
|
+
}
|
|
81
|
+
case 'edit_message': {
|
|
82
|
+
const reply = {
|
|
83
|
+
text: String(args.text ?? ''),
|
|
84
|
+
reply_to: typeof args.message_id === 'string' ? args.message_id : undefined,
|
|
85
|
+
};
|
|
86
|
+
this.emit('reply', reply, 'edit_message');
|
|
87
|
+
return { content: [{ type: 'text', text: 'ok' }] };
|
|
88
|
+
}
|
|
89
|
+
default:
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: 'text', text: `unknown tool: ${req.params.name}` }],
|
|
92
|
+
isError: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
return {
|
|
98
|
+
content: [
|
|
99
|
+
{
|
|
100
|
+
type: 'text',
|
|
101
|
+
text: `${req.params.name} failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
isError: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Start the MCP server on a given transport (stdio by default).
|
|
111
|
+
* Pass a custom transport for in-process tests.
|
|
112
|
+
*/
|
|
113
|
+
async start(transport) {
|
|
114
|
+
if (this.started)
|
|
115
|
+
return;
|
|
116
|
+
this.transport = transport ?? new StdioServerTransport();
|
|
117
|
+
await this.server.connect(this.transport);
|
|
118
|
+
this.started = true;
|
|
119
|
+
}
|
|
120
|
+
/** Emit a channel notification to Claude. */
|
|
121
|
+
async pushChatMessage(content, meta) {
|
|
122
|
+
await this.server.notification({
|
|
123
|
+
method: 'notifications/claude/channel',
|
|
124
|
+
params: {
|
|
125
|
+
content,
|
|
126
|
+
meta: {
|
|
127
|
+
...meta,
|
|
128
|
+
ts: meta.ts ?? new Date().toISOString(),
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/** Register a callback for incoming reply/edit tool calls from Claude. */
|
|
134
|
+
onReply(handler) {
|
|
135
|
+
this.on('reply', handler);
|
|
136
|
+
return () => this.off('reply', handler);
|
|
137
|
+
}
|
|
138
|
+
/** Graceful shutdown. */
|
|
139
|
+
async stop() {
|
|
140
|
+
if (!this.started)
|
|
141
|
+
return;
|
|
142
|
+
try {
|
|
143
|
+
await this.server.close();
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
/* ignore */
|
|
147
|
+
}
|
|
148
|
+
this.started = false;
|
|
149
|
+
this.transport = null;
|
|
150
|
+
}
|
|
151
|
+
isStarted() {
|
|
152
|
+
return this.started;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=channel-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-server.js","sourceRoot":"","sources":["../../../src/providers/claude-code/channel-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { IAgentProvider, AgentHealthStatus, SendMessageParams } from '../types.js';
|
|
2
|
+
import type { ChatSession, ChatMessage } from '../chat-types.js';
|
|
3
|
+
import type { ChannelReply, ChannelReplyMeta, ChannelMessageMeta } from './channel-server.js';
|
|
4
|
+
export interface ClaudeCodeProviderConfig {
|
|
5
|
+
workspaceDir: string;
|
|
6
|
+
anthropicApiKey?: string;
|
|
7
|
+
anthropicAuthToken?: string;
|
|
8
|
+
claudeCodeOauthToken?: string;
|
|
9
|
+
/** Content for CLAUDE.md in the workspace (persona / bootstrap). */
|
|
10
|
+
claudeMdContent?: string;
|
|
11
|
+
/** Backend URL for openclaw-backend MCP entry. */
|
|
12
|
+
backendUrl?: string;
|
|
13
|
+
/** Agent token for openclaw-backend MCP auth. */
|
|
14
|
+
agentToken?: string;
|
|
15
|
+
/** Override socket path (tests). */
|
|
16
|
+
socketPath?: string;
|
|
17
|
+
/** Absolute path to the `agent-controller` executable used to spawn the
|
|
18
|
+
* channel-server worker. Defaults to `agent-controller` on PATH. */
|
|
19
|
+
agentControllerBin?: string;
|
|
20
|
+
}
|
|
21
|
+
export type ReplyPublisher = (reply: ChannelReply, tool: 'reply' | 'edit_message', meta: ChannelReplyMeta) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Claude Code provider — orchestrates a local Claude Code subprocess plus a
|
|
24
|
+
* channel-server worker that bridges Claude's stdio MCP channel into this
|
|
25
|
+
* controller process via a Unix domain socket.
|
|
26
|
+
*
|
|
27
|
+
* Architecture:
|
|
28
|
+
* [Claude Code] ── stdio MCP ──> [agent-controller channel-server worker]
|
|
29
|
+
* ── unix socket ──> [main agent-controller]
|
|
30
|
+
*
|
|
31
|
+
* See `socket-bridge.ts` for the wire protocol.
|
|
32
|
+
*/
|
|
33
|
+
export declare class ClaudeCodeProvider implements IAgentProvider {
|
|
34
|
+
private readonly cfg;
|
|
35
|
+
readonly name = "claude-code";
|
|
36
|
+
private _connected;
|
|
37
|
+
private bridge;
|
|
38
|
+
private claude;
|
|
39
|
+
private lastHeartbeatAt;
|
|
40
|
+
private pendingLoginUrl;
|
|
41
|
+
private pendingCodeResolvers;
|
|
42
|
+
private replyPublisher;
|
|
43
|
+
constructor(cfg: ClaudeCodeProviderConfig);
|
|
44
|
+
/** Register an outbound publisher; called by the chat handler at startup. */
|
|
45
|
+
setReplyPublisher(fn: ReplyPublisher): void;
|
|
46
|
+
/** Used by the chat handler to feed user-submitted codes into the login flow. */
|
|
47
|
+
submitLoginCode(code: string): boolean;
|
|
48
|
+
/** The chat handler checks this to short-circuit the first message with the login URL. */
|
|
49
|
+
getPendingLoginUrl(): string | null;
|
|
50
|
+
/** Push an inbound chat/board message to Claude via the channel worker. */
|
|
51
|
+
pushToChannel(content: string, meta: ChannelMessageMeta): void;
|
|
52
|
+
/** Internal — invoked by the bridge when Claude replies via the tool. */
|
|
53
|
+
handleChannelReply(content: string, meta: ChannelReplyMeta, tool: 'reply' | 'edit_message'): void;
|
|
54
|
+
connect(): Promise<void>;
|
|
55
|
+
disconnect(): void;
|
|
56
|
+
isConnected(): boolean;
|
|
57
|
+
healthCheck(): Promise<AgentHealthStatus>;
|
|
58
|
+
restart(): Promise<void>;
|
|
59
|
+
abort(): Promise<void>;
|
|
60
|
+
sendMessage(params: SendMessageParams): Promise<void>;
|
|
61
|
+
listSessions(): Promise<ChatSession[]>;
|
|
62
|
+
getHistory(sessionKey: string, limit?: number): Promise<ChatMessage[]>;
|
|
63
|
+
private hasCredentials;
|
|
64
|
+
private materializeWorkspace;
|
|
65
|
+
private startBridgeAndClaude;
|
|
66
|
+
private startLoginFlow;
|
|
67
|
+
private projectJsonlDir;
|
|
68
|
+
}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import { logCollector } from '../../connection.js';
|
|
5
|
+
import { toErrorMessage } from '../../utils/response.js';
|
|
6
|
+
import { writeClaudeCodeSettings } from './settings-writer.js';
|
|
7
|
+
import { runSetupTokenFlow } from './login-flow.js';
|
|
8
|
+
import { ChannelBridgeServer, DEFAULT_SOCKET_PATH } from './socket-bridge.js';
|
|
9
|
+
import { ClaudeProcess } from './spawn-claude.js';
|
|
10
|
+
/**
|
|
11
|
+
* Claude Code provider — orchestrates a local Claude Code subprocess plus a
|
|
12
|
+
* channel-server worker that bridges Claude's stdio MCP channel into this
|
|
13
|
+
* controller process via a Unix domain socket.
|
|
14
|
+
*
|
|
15
|
+
* Architecture:
|
|
16
|
+
* [Claude Code] ── stdio MCP ──> [agent-controller channel-server worker]
|
|
17
|
+
* ── unix socket ──> [main agent-controller]
|
|
18
|
+
*
|
|
19
|
+
* See `socket-bridge.ts` for the wire protocol.
|
|
20
|
+
*/
|
|
21
|
+
export class ClaudeCodeProvider {
|
|
22
|
+
cfg;
|
|
23
|
+
name = 'claude-code';
|
|
24
|
+
_connected = false;
|
|
25
|
+
bridge = null;
|
|
26
|
+
claude = null;
|
|
27
|
+
lastHeartbeatAt = 0;
|
|
28
|
+
pendingLoginUrl = null;
|
|
29
|
+
pendingCodeResolvers = [];
|
|
30
|
+
replyPublisher = null;
|
|
31
|
+
constructor(cfg) {
|
|
32
|
+
this.cfg = cfg;
|
|
33
|
+
}
|
|
34
|
+
/** Register an outbound publisher; called by the chat handler at startup. */
|
|
35
|
+
setReplyPublisher(fn) {
|
|
36
|
+
this.replyPublisher = fn;
|
|
37
|
+
}
|
|
38
|
+
/** Used by the chat handler to feed user-submitted codes into the login flow. */
|
|
39
|
+
submitLoginCode(code) {
|
|
40
|
+
const resolver = this.pendingCodeResolvers.shift();
|
|
41
|
+
if (resolver) {
|
|
42
|
+
resolver(code);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
/** The chat handler checks this to short-circuit the first message with the login URL. */
|
|
48
|
+
getPendingLoginUrl() {
|
|
49
|
+
return this.pendingLoginUrl;
|
|
50
|
+
}
|
|
51
|
+
/** Push an inbound chat/board message to Claude via the channel worker. */
|
|
52
|
+
pushToChannel(content, meta) {
|
|
53
|
+
if (!this.bridge) {
|
|
54
|
+
logCollector?.push('claude_push_no_bridge', 'warn', 'pushToChannel called but bridge is not up yet');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.bridge.push(content, meta);
|
|
58
|
+
}
|
|
59
|
+
/** Internal — invoked by the bridge when Claude replies via the tool. */
|
|
60
|
+
handleChannelReply(content, meta, tool) {
|
|
61
|
+
this.lastHeartbeatAt = Date.now();
|
|
62
|
+
const reply = { text: content, reply_to: meta.message_id };
|
|
63
|
+
this.replyPublisher?.(reply, tool, meta);
|
|
64
|
+
}
|
|
65
|
+
// ─── Lifecycle ────────────────────────────────────────────────────────────
|
|
66
|
+
async connect() {
|
|
67
|
+
if (this._connected)
|
|
68
|
+
return;
|
|
69
|
+
try {
|
|
70
|
+
if (!this.hasCredentials()) {
|
|
71
|
+
logCollector?.push('claude_connect_login_needed', 'info', 'No Claude credentials found — waiting for user login via chat');
|
|
72
|
+
void this.startLoginFlow();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await this.materializeWorkspace();
|
|
76
|
+
await this.startBridgeAndClaude();
|
|
77
|
+
this._connected = true;
|
|
78
|
+
logCollector?.push('claude_connect_ok', 'info', 'claude-code provider connected');
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
logCollector?.push('claude_connect_failed', 'error', `claude-code connect failed: ${toErrorMessage(err)}`);
|
|
82
|
+
throw err;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
disconnect() {
|
|
86
|
+
this._connected = false;
|
|
87
|
+
this.claude?.stop();
|
|
88
|
+
this.claude = null;
|
|
89
|
+
void this.bridge?.close();
|
|
90
|
+
this.bridge = null;
|
|
91
|
+
}
|
|
92
|
+
isConnected() {
|
|
93
|
+
return this._connected;
|
|
94
|
+
}
|
|
95
|
+
async healthCheck() {
|
|
96
|
+
const alive = this.claude?.isRunning() ?? false;
|
|
97
|
+
const fresh = this.lastHeartbeatAt === 0 || Date.now() - this.lastHeartbeatAt < 60_000;
|
|
98
|
+
return { ok: this._connected && alive && fresh, rpcOk: alive };
|
|
99
|
+
}
|
|
100
|
+
async restart() {
|
|
101
|
+
this.disconnect();
|
|
102
|
+
await this.connect();
|
|
103
|
+
}
|
|
104
|
+
async abort() {
|
|
105
|
+
this.claude?.interrupt();
|
|
106
|
+
}
|
|
107
|
+
// ─── Messaging ────────────────────────────────────────────────────────────
|
|
108
|
+
async sendMessage(params) {
|
|
109
|
+
try {
|
|
110
|
+
if (this.pendingLoginUrl) {
|
|
111
|
+
params.onDone?.(`To connect, log in at: ${this.pendingLoginUrl}\n\nPaste the verification code in this chat once ready.`);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (!this._connected)
|
|
115
|
+
await this.connect();
|
|
116
|
+
if (!this.bridge) {
|
|
117
|
+
params.onError?.('claude-code channel bridge not running');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
this.bridge.push(params.text, {
|
|
121
|
+
chat_id: params.sessionKey,
|
|
122
|
+
source: 'web',
|
|
123
|
+
message_id: params.idempotencyKey,
|
|
124
|
+
});
|
|
125
|
+
// Reply flows back asynchronously via the reply publisher — no onDone here.
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
params.onError?.(toErrorMessage(err));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async listSessions() {
|
|
132
|
+
const dir = this.projectJsonlDir();
|
|
133
|
+
if (!dir)
|
|
134
|
+
return [];
|
|
135
|
+
try {
|
|
136
|
+
const entries = await fs.promises.readdir(dir);
|
|
137
|
+
const sessions = await Promise.all(entries
|
|
138
|
+
.filter((f) => f.endsWith('.jsonl'))
|
|
139
|
+
.map(async (file) => {
|
|
140
|
+
const full = path.join(dir, file);
|
|
141
|
+
const st = await fs.promises.stat(full);
|
|
142
|
+
const sessionId = file.replace(/\.jsonl$/, '');
|
|
143
|
+
return {
|
|
144
|
+
key: sessionId,
|
|
145
|
+
sessionId,
|
|
146
|
+
kind: 'claude-code',
|
|
147
|
+
label: sessionId,
|
|
148
|
+
updatedAt: st.mtimeMs,
|
|
149
|
+
};
|
|
150
|
+
}));
|
|
151
|
+
return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async getHistory(sessionKey, limit = 200) {
|
|
158
|
+
const dir = this.projectJsonlDir();
|
|
159
|
+
if (!dir)
|
|
160
|
+
return [];
|
|
161
|
+
const file = path.join(dir, `${sessionKey}.jsonl`);
|
|
162
|
+
try {
|
|
163
|
+
const content = await fs.promises.readFile(file, 'utf-8');
|
|
164
|
+
const lines = content.split(/\r?\n/).filter((l) => l.trim());
|
|
165
|
+
const msgs = [];
|
|
166
|
+
for (const line of lines) {
|
|
167
|
+
try {
|
|
168
|
+
const row = JSON.parse(line);
|
|
169
|
+
const role = row.role ??
|
|
170
|
+
row.message?.role ??
|
|
171
|
+
(row.type === 'user' ? 'user' : row.type === 'assistant' ? 'assistant' : undefined);
|
|
172
|
+
if (!role)
|
|
173
|
+
continue;
|
|
174
|
+
const rawContent = row.message?.content ?? '';
|
|
175
|
+
const content = typeof rawContent === 'string' ? rawContent : rawContent;
|
|
176
|
+
msgs.push({
|
|
177
|
+
role,
|
|
178
|
+
content,
|
|
179
|
+
timestamp: row.timestamp ?? new Date().toISOString(),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
/* skip malformed line */
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return msgs.slice(-limit);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// ─── Internals ────────────────────────────────────────────────────────────
|
|
193
|
+
hasCredentials() {
|
|
194
|
+
if (this.cfg.anthropicAuthToken || this.cfg.anthropicApiKey || this.cfg.claudeCodeOauthToken) {
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
return fs.statSync(path.join(os.homedir(), '.claude', '.credentials.json')).isFile();
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async materializeWorkspace() {
|
|
205
|
+
await writeClaudeCodeSettings({
|
|
206
|
+
workspaceDir: this.cfg.workspaceDir,
|
|
207
|
+
anthropicApiKey: this.cfg.anthropicApiKey,
|
|
208
|
+
anthropicAuthToken: this.cfg.anthropicAuthToken,
|
|
209
|
+
backendUrl: this.cfg.backendUrl,
|
|
210
|
+
agentToken: this.cfg.agentToken,
|
|
211
|
+
claudeMdContent: this.cfg.claudeMdContent,
|
|
212
|
+
agentControllerBin: this.cfg.agentControllerBin,
|
|
213
|
+
channelSocketPath: this.cfg.socketPath,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
async startBridgeAndClaude() {
|
|
217
|
+
// 1) Spin up the socket bridge FIRST so the worker can connect as soon as
|
|
218
|
+
// Claude spawns it.
|
|
219
|
+
this.bridge = new ChannelBridgeServer({
|
|
220
|
+
socketPath: this.cfg.socketPath ?? DEFAULT_SOCKET_PATH,
|
|
221
|
+
});
|
|
222
|
+
this.bridge.on('reply', (content, meta, tool) => {
|
|
223
|
+
this.handleChannelReply(content, meta, tool);
|
|
224
|
+
});
|
|
225
|
+
this.bridge.on('connect', () => {
|
|
226
|
+
this.lastHeartbeatAt = Date.now();
|
|
227
|
+
});
|
|
228
|
+
await this.bridge.listen();
|
|
229
|
+
// 2) Spawn Claude — it will exec `agent-controller channel-server` as a
|
|
230
|
+
// stdio MCP server per the workspace's `.mcp.json`.
|
|
231
|
+
this.claude = new ClaudeProcess({
|
|
232
|
+
workspaceDir: this.cfg.workspaceDir,
|
|
233
|
+
channelsFlag: 'mcp:agent-controller-channel',
|
|
234
|
+
});
|
|
235
|
+
this.claude.on('stderr', () => {
|
|
236
|
+
this.lastHeartbeatAt = Date.now();
|
|
237
|
+
});
|
|
238
|
+
this.claude.start();
|
|
239
|
+
}
|
|
240
|
+
async startLoginFlow() {
|
|
241
|
+
try {
|
|
242
|
+
await runSetupTokenFlow({
|
|
243
|
+
publishLoginUrl: (url) => {
|
|
244
|
+
this.pendingLoginUrl = url;
|
|
245
|
+
},
|
|
246
|
+
waitForCode: () => new Promise((resolve) => {
|
|
247
|
+
this.pendingCodeResolvers.push(resolve);
|
|
248
|
+
}),
|
|
249
|
+
});
|
|
250
|
+
this.pendingLoginUrl = null;
|
|
251
|
+
await this.materializeWorkspace();
|
|
252
|
+
await this.startBridgeAndClaude();
|
|
253
|
+
this._connected = true;
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
logCollector?.push('claude_login_flow_error', 'error', `login flow failed: ${toErrorMessage(err)}`);
|
|
257
|
+
this.pendingLoginUrl = null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
projectJsonlDir() {
|
|
261
|
+
const cwd = this.cfg.workspaceDir;
|
|
262
|
+
if (!cwd)
|
|
263
|
+
return null;
|
|
264
|
+
const encoded = cwd.replace(/\//g, '-');
|
|
265
|
+
const dir = path.join(os.homedir(), '.claude', 'projects', encoded);
|
|
266
|
+
try {
|
|
267
|
+
if (fs.statSync(dir).isDirectory())
|
|
268
|
+
return dir;
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
/* ignore */
|
|
272
|
+
}
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/claude-code/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
export interface LoginFlowDeps {
|
|
3
|
+
/** Called with the login URL captured from `claude setup-token` stdout. */
|
|
4
|
+
publishLoginUrl(url: string): void | Promise<void>;
|
|
5
|
+
/** Resolves with the verification code that the user submitted in chat. */
|
|
6
|
+
waitForCode(): Promise<string>;
|
|
7
|
+
/** Override for tests — inject a fake child_process. */
|
|
8
|
+
spawnFn?: typeof spawn;
|
|
9
|
+
/** Override credentials path (tests). Defaults to `~/.claude/.credentials.json`. */
|
|
10
|
+
credentialsPath?: string;
|
|
11
|
+
/** Overall timeout in ms. Defaults to 10 minutes. */
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Drive the `claude setup-token` subscription login flow.
|
|
16
|
+
*
|
|
17
|
+
* Flow:
|
|
18
|
+
* 1. Spawn `claude setup-token` and watch stdout for the `claude.ai/oauth/authorize?...` URL.
|
|
19
|
+
* 2. Push the URL to chat via `deps.publishLoginUrl`.
|
|
20
|
+
* 3. Await `deps.waitForCode()` — resolves with the code the user submitted.
|
|
21
|
+
* 4. Write `code + "\n"` to subprocess stdin, wait for exit.
|
|
22
|
+
* 5. Verify `~/.claude/.credentials.json` was created/updated → success.
|
|
23
|
+
*
|
|
24
|
+
* Emits structured logCollector events at each milestone.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runSetupTokenFlow(deps: LoginFlowDeps): Promise<void>;
|