botmux 3.9.0 → 3.9.2
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/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +7 -0
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +20 -0
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +12 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +40 -7
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +87 -87
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/cli/deferred-topic-send.d.ts +11 -0
- package/dist/cli/deferred-topic-send.d.ts.map +1 -1
- package/dist/cli/deferred-topic-send.js +21 -4
- package/dist/cli/deferred-topic-send.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +177 -38
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +40 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dispatch.d.ts +43 -5
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +104 -6
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/daemon.d.ts +11 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +32 -3
- package/dist/daemon.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +2 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +2 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +9 -0
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/issue-card.d.ts +223 -0
- package/dist/im/lark/issue-card.d.ts.map +1 -0
- package/dist/im/lark/issue-card.js +542 -0
- package/dist/im/lark/issue-card.js.map +1 -0
- package/dist/im/lark/issue-command-deps.d.ts +41 -0
- package/dist/im/lark/issue-command-deps.d.ts.map +1 -0
- package/dist/im/lark/issue-command-deps.js +195 -0
- package/dist/im/lark/issue-command-deps.js.map +1 -0
- package/dist/im/lark/issue-command.d.ts +137 -0
- package/dist/im/lark/issue-command.d.ts.map +1 -0
- package/dist/im/lark/issue-command.js +335 -0
- package/dist/im/lark/issue-command.js.map +1 -0
- package/dist/platform/issue-client.d.ts +201 -0
- package/dist/platform/issue-client.d.ts.map +1 -0
- package/dist/platform/issue-client.js +142 -0
- package/dist/platform/issue-client.js.map +1 -0
- package/dist/platform/platform-http.d.ts +4 -0
- package/dist/platform/platform-http.d.ts.map +1 -1
- package/dist/platform/platform-http.js +38 -2
- package/dist/platform/platform-http.js.map +1 -1
- package/dist/services/codex-composer-state.d.ts +27 -0
- package/dist/services/codex-composer-state.d.ts.map +1 -0
- package/dist/services/codex-composer-state.js +53 -0
- package/dist/services/codex-composer-state.js.map +1 -0
- package/dist/services/codex-transcript.d.ts +33 -12
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +82 -20
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/issue-board-store.d.ts +214 -0
- package/dist/services/issue-board-store.d.ts.map +1 -0
- package/dist/services/issue-board-store.js +472 -0
- package/dist/services/issue-board-store.js.map +1 -0
- package/dist/services/issue-claim-flow.d.ts +160 -0
- package/dist/services/issue-claim-flow.d.ts.map +1 -0
- package/dist/services/issue-claim-flow.js +222 -0
- package/dist/services/issue-claim-flow.js.map +1 -0
- package/dist/services/issue-outbox-pump.d.ts +25 -0
- package/dist/services/issue-outbox-pump.d.ts.map +1 -0
- package/dist/services/issue-outbox-pump.js +102 -0
- package/dist/services/issue-outbox-pump.js.map +1 -0
- package/dist/services/issue-release.d.ts +78 -0
- package/dist/services/issue-release.d.ts.map +1 -0
- package/dist/services/issue-release.js +89 -0
- package/dist/services/issue-release.js.map +1 -0
- package/dist/services/issue-report.d.ts +72 -0
- package/dist/services/issue-report.d.ts.map +1 -0
- package/dist/services/issue-report.js +84 -0
- package/dist/services/issue-report.js.map +1 -0
- package/dist/services/issue-status-view.d.ts +52 -0
- package/dist/services/issue-status-view.d.ts.map +1 -0
- package/dist/services/issue-status-view.js +42 -0
- package/dist/services/issue-status-view.js.map +1 -0
- package/dist/services/issue-status-writer.d.ts +98 -0
- package/dist/services/issue-status-writer.d.ts.map +1 -0
- package/dist/services/issue-status-writer.js +123 -0
- package/dist/services/issue-status-writer.js.map +1 -0
- package/dist/services/traex-paths.d.ts +14 -2
- package/dist/services/traex-paths.d.ts.map +1 -1
- package/dist/services/traex-paths.js +16 -2
- package/dist/services/traex-paths.js.map +1 -1
- package/dist/services/traex-transcript.d.ts +33 -0
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +135 -28
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/setup/lark-scopes.json +0 -2
- package/dist/worker.js +269 -7
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traex.js","sourceRoot":"","sources":["../../../src/adapters/cli/traex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"traex.js","sourceRoot":"","sources":["../../../src/adapters/cli/traex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACnG,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AA4B9C,IAAI,YAAY,GAAoE,IAAI,CAAC;AACzF,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC,SAAS,UAAU;IACjB,IAAI,mBAAmB;QAAE,OAAO,YAAY,CAAC;IAC7C,mBAAmB,GAAG,IAAI,CAAC;IAC3B,uEAAuE;IACvE,oEAAoE;IACpE,4EAA4E;IAC5E,yDAAyD;IACzD,sDAAsD;IACtD,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,YAAY,GAAG,GAAG,CAAC,aAAa,CAAwB,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,MAAM,CAAI,EAA+B;IAChD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,EAAgC,CAAC;IACrC,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;gEAKgE;AAGhE;;;kBAGkB;AAClB,SAAS,iCAAiC,CAAC,eAAuB;IAChE,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,+FAA+F,CAChG,CAAC,GAAG,EAA6C,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,OAAO,CAAC,CAAC,EAAE,CAAC;QAC9E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,IAAI,SAAS,CAAC;AAClB,CAAC;AAED,4EAA4E;AAE5E;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG;IAC1B,kBAAkB;IAClB,yBAAyB;IACzB,wBAAwB;IACxB,2BAA2B;IAC3B,yBAAyB;IACzB,gBAAgB;CACR,CAAC;AAEX,SAAS,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gCAAgC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,iCAAiC;IACjC,wBAAwB;CAChB,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,YAAqB;IACtD,MAAM,MAAM,GAAG,YAAY,IAAI,OAAO,CAAC;IACvC,IAAI,SAA6B,CAAC;IAClC,OAAO;QACL,EAAE,EAAE,OAAO;QACX,8EAA8E;QAC9E,4EAA4E;QAC5E,6EAA6E;QAC7E,8EAA8E;QAC9E,2EAA2E;QAC3E,uEAAuE;QACvE,wEAAwE;QACxE,8EAA8E;QAC9E,2EAA2E;QAC3E,4EAA4E;QAC5E,SAAS,EAAE,CAAC,aAAa,CAAC;QAC1B,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,2BAA2B,CAAC;QAC5D,IAAI,WAAW,KAAa,OAAO,CAAC,SAAS,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE;YACjI,2EAA2E;YAC3E,8EAA8E;YAC9E,yEAAyE;YACzE,6DAA6D;YAC7D,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;gBAClC,6EAA6E;gBAC7E,wEAAwE;gBACxE,0EAA0E;gBAC1E,OAAO,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,mCAAmC,EAAE,cAAc,CAAC,CAAC;YAC3H,CAAC;YACD,MAAM,QAAQ,GAAG;gBACf,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;oBACtB,4CAA4C;oBAC5C,6DAA6D;oBAC7D,2BAA2B;oBAC3B,oEAAoE;oBACpE,oEAAoE;oBACpE,kEAAkE;oBAClE,wEAAwE;oBACxE,uEAAuE;oBACvE,sEAAsE;oBACtE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACP,iBAAiB;gBACjB,GAAG,iBAAiB,EAAE;aACvB,CAAC;YACF,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;gBAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAClE,IAAI,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC;YAE7B,MAAM,aAAa,GAAG,eAAe,IAAI,iCAAiC,CAAC,SAAS,CAAC,CAAC;YACtF,IAAI,CAAC,aAAa;gBAAE,OAAO,QAAQ,CAAC;YACpC,OAAO,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE,aAAa,CAAC,CAAC;QAChD,CAAC;QAED,kBAAkB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE;YAC5C,MAAM,GAAG,GAAG,YAAY,IAAI,iCAAiC,CAAC,SAAS,CAAC,CAAC;YACzE,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,OAAO,gBAAgB,GAAG,EAAE,CAAC;QAC/B,CAAC;QAED;0CACkC;QAClC,qBAAqB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;YACtC,OAAO,uBAAuB,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAc,EAAE,OAAe;YAC9C,sEAAsE;YACtE,iEAAiE;YACjE,MAAM,YAAY,GAAG,GAAY,EAAE;gBACjC,IAAI,CAAC;oBACH,IAAI,GAAG,CAAC,eAAe;wBAAE,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;;wBACjD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrB,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC,CAAC;YAEF,yEAAyE;YACzE,0EAA0E;YAC1E,oEAAoE;YACpE,mEAAmE;YACnE,0EAA0E;YAC1E,oEAAoE;YACpE,sEAAsE;YACtE,2EAA2E;YAC3E,oEAAoE;YACpE,yEAAyE;YACzE,qEAAqE;YACrE,yEAAyE;YACzE,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAE/C,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAC7F,CAAC,CAAC,GAAG,CAAC,MAAM;gBACZ,CAAC,CAAC,SAAS,CAAC;YAEd,yDAAyD;YACzD,2EAA2E;YAC3E,2EAA2E;YAC3E,0EAA0E;YAC1E,wCAAwC;YACxC,sEAAsE;YACtE,wEAAwE;YACxE,kEAAkE;YAClE,EAAE;YACF,sEAAsE;YACtE,0EAA0E;YAC1E,uEAAuE;YACvE,2EAA2E;YAC3E,0EAA0E;YAC1E,0EAA0E;YAC1E,yEAAyE;YACzE,2EAA2E;YAC3E,qEAAqE;YACrE,2EAA2E;YAC3E,MAAM,UAAU,GAAG,CAAC,KAA8B,EAAE,EAAE,CACpD,sBAAsB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5G,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,sBAAsB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE9E,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,SAAS;oBAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;;oBACrC,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC9B,CAAC;YACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,IAAI,CAAC,YAAY,EAAE;gBAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAEjD,qEAAqE;YACrE,sEAAsE;YACtE,4EAA4E;YAC5E,0CAA0C;YAC1C,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,uEAAuE;YACvE,qEAAqE;YACrE,0EAA0E;YAC1E,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE;gBACjC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY;wBAAE,OAAO,EAAE,SAAS,EAAE,IAAa,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;oBACjG,oEAAoE;oBACpE,8DAA8D;oBAC9D,IAAI,QAAQ,EAAE,CAAC,KAAK;wBAAE,UAAU,GAAG,IAAI,CAAC;oBACxC,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACnE,CAAC;gBACD,yEAAyE;gBACzE,iEAAiE;gBACjE,IAAI,QAAQ,EAAE,CAAC,KAAK;oBAAE,OAAO,EAAE,SAAS,EAAE,IAAa,EAAE,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;YAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjC,IAAI,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAChC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,qEAAqE;gBACrE,uEAAuE;gBACvE,8DAA8D;gBAC9D,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE;oBAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAClE,CAAC;YACD,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,cAAc;gBAAE,OAAO,cAAc,CAAC;YAC1C,yEAAyE;YACzE,yEAAyE;YACzE,8DAA8D;YAC9D,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;YAC7C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACvC,CAAC;QAED,iBAAiB,EAAE,SAAS;QAC5B,wEAAwE;QACxE,sEAAsE;QACtE,yEAAyE;QACzE,4EAA4E;QAC5E,qDAAqD;QACrD,YAAY,EAAE,2CAA2C;QACzD,WAAW,EAAE,kBAAkB;QAC/B,yEAAyE;QACzE,+DAA+D;QAC/D,iBAAiB,EAAE,IAAI;QACvB,uEAAuE;QACvE,wEAAwE;QACxE,oBAAoB,EAAE,IAAI;QAC1B,yEAAyE;QACzE,uEAAuE;QACvE,0EAA0E;QAC1E,iCAAiC,EAAE,IAAI;QACvC,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,gBAAgB;QAC3B,0EAA0E;QAC1E,oEAAoE;QACpE,+CAA+C;QAC/C,YAAY,EAAE;YACZ,qBAAqB;YACrB,sBAAsB;YACtB,SAAS;YACT,OAAO;YACP,IAAI;YACJ,YAAY;YACZ,iBAAiB;YACjB,WAAW;SACZ;QACD,oEAAoE;QACpE,sEAAsE;QACtE,sEAAsE;QACtE,yBAAyB;QACzB,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DeferredTopicBinding } from '../core/deferred-topic-binding.js';
|
|
1
2
|
export interface DeferredScheduleRunData {
|
|
2
3
|
taskId: string;
|
|
3
4
|
turnId: string;
|
|
@@ -17,6 +18,16 @@ export interface DeferredTopicSendResult {
|
|
|
17
18
|
rootMessageId?: string;
|
|
18
19
|
materializedNow?: boolean;
|
|
19
20
|
}
|
|
21
|
+
export declare function deferredTopicBindingMatches(session: DeferredTopicSendSession, binding: DeferredTopicBinding): boolean;
|
|
22
|
+
/** Existing deferred runs reply into their materialized topic before the
|
|
23
|
+
* nominal send target is considered. Mirror that precedence for advisory
|
|
24
|
+
* reachability without materializing a new topic. */
|
|
25
|
+
export declare function reusableDeferredTopicRoot(input: {
|
|
26
|
+
session: DeferredTopicSendSession;
|
|
27
|
+
binding: DeferredTopicBinding | undefined;
|
|
28
|
+
explicitTopLevel: boolean;
|
|
29
|
+
reuseBoundRootWhenTopLevel?: boolean;
|
|
30
|
+
}): string | undefined;
|
|
20
31
|
/** Route one `botmux send` effect for a lazily-materialized schedule topic.
|
|
21
32
|
* The per-session file lock spans the provider request so two concurrent CLI
|
|
22
33
|
* processes cannot both create a root. A stable provider UUID (sessionId)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred-topic-send.d.ts","sourceRoot":"","sources":["../../src/cli/deferred-topic-send.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deferred-topic-send.d.ts","sourceRoot":"","sources":["../../src/cli/deferred-topic-send.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,mCAAmC,CAAC;AAE3C,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;CAC/C;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,wBAAwB,EACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAQT;AAED;;qDAEqD;AACrD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC1C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC,GAAG,MAAM,GAAG,SAAS,CAKrB;AAED;;;8EAG8E;AAC9E,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,wBAAwB,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,SAAS,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxG,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA0DnC"}
|
|
@@ -1,4 +1,24 @@
|
|
|
1
1
|
import { readDeferredTopicBinding, withDeferredTopicBindingLock, writeDeferredTopicBinding, } from '../core/deferred-topic-binding.js';
|
|
2
|
+
export function deferredTopicBindingMatches(session, binding) {
|
|
3
|
+
const run = session.deferredScheduleRun;
|
|
4
|
+
return !!run
|
|
5
|
+
&& binding.sessionId === session.sessionId
|
|
6
|
+
&& binding.turnId === run.turnId
|
|
7
|
+
&& binding.chatId === session.chatId
|
|
8
|
+
&& binding.larkAppId === session.larkAppId
|
|
9
|
+
&& binding.routingAnchor === run.routingAnchor;
|
|
10
|
+
}
|
|
11
|
+
/** Existing deferred runs reply into their materialized topic before the
|
|
12
|
+
* nominal send target is considered. Mirror that precedence for advisory
|
|
13
|
+
* reachability without materializing a new topic. */
|
|
14
|
+
export function reusableDeferredTopicRoot(input) {
|
|
15
|
+
const { binding } = input;
|
|
16
|
+
if (!binding || !deferredTopicBindingMatches(input.session, binding))
|
|
17
|
+
return undefined;
|
|
18
|
+
if (input.explicitTopLevel && !input.reuseBoundRootWhenTopLevel)
|
|
19
|
+
return undefined;
|
|
20
|
+
return binding.rootMessageId;
|
|
21
|
+
}
|
|
2
22
|
/** Route one `botmux send` effect for a lazily-materialized schedule topic.
|
|
3
23
|
* The per-session file lock spans the provider request so two concurrent CLI
|
|
4
24
|
* processes cannot both create a root. A stable provider UUID (sessionId)
|
|
@@ -10,10 +30,7 @@ export async function dispatchDeferredTopicSend(opts) {
|
|
|
10
30
|
return withDeferredTopicBindingLock(opts.dataDir, opts.session.sessionId, async () => {
|
|
11
31
|
const existing = readDeferredTopicBinding(opts.dataDir, opts.session.sessionId);
|
|
12
32
|
if (existing) {
|
|
13
|
-
if (
|
|
14
|
-
|| existing.chatId !== opts.session.chatId
|
|
15
|
-
|| existing.larkAppId !== opts.session.larkAppId
|
|
16
|
-
|| existing.routingAnchor !== run.routingAnchor) {
|
|
33
|
+
if (!deferredTopicBindingMatches(opts.session, existing)) {
|
|
17
34
|
throw new Error('deferred topic binding identity mismatch');
|
|
18
35
|
}
|
|
19
36
|
if (opts.explicitTopLevel && !opts.reuseBoundRootWhenTopLevel)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred-topic-send.js","sourceRoot":"","sources":["../../src/cli/deferred-topic-send.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,GAE1B,MAAM,mCAAmC,CAAC;AAwB3C;;;8EAG8E;AAC9E,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAY/C;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEpC,OAAO,4BAA4B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,QAAQ,EAAE,CAAC;YACb,
|
|
1
|
+
{"version":3,"file":"deferred-topic-send.js","sourceRoot":"","sources":["../../src/cli/deferred-topic-send.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAonFA,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnG,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,iBAAiB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAukNtE;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,qBAAqB,EAAE,SAAS,CAAC,EAC9F,KAAK,EAAE,MAAM,EACb,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,2BAA2B,EAAE,UAAU,GAAG,IAAI,CAAC,GACzF,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA8F7B"}
|
package/dist/cli.js
CHANGED
|
@@ -34,7 +34,7 @@ import { validateWorkingDir } from './core/working-dir.js';
|
|
|
34
34
|
import { resolveSessionContext } from './core/session-marker.js';
|
|
35
35
|
import { resolveBotmuxDataDir } from './core/data-dir.js';
|
|
36
36
|
import { dashboardSecretPath } from './core/dashboard-secret.js';
|
|
37
|
-
import { acceptedDispatchBotAppIds, appendDispatchReportProtocol, appendLegacyDispatchReportProtocol, parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, findDispatchRegistryEntry, offTopicSubBotTopic, resolveReportTarget, resolveSendTarget } from './core/dispatch.js';
|
|
37
|
+
import { acceptedDispatchBotAppIds, activeConversationBotOpenIds, appendDispatchReportProtocol, appendLegacyDispatchReportProtocol, parseDispatchBotSpec, buildDispatchMessages, buildRepoPrimeText, buildReportContent, eligibleAutoMentionAliases, findDispatchRegistryEntry, foldableChatSessionAppIds, offTopicSubBotTopic, resolveReportTarget, resolveSendTarget, threadRootForReachability } from './core/dispatch.js';
|
|
38
38
|
import { pickTurnReplyTarget } from './core/reply-target.js';
|
|
39
39
|
import { recordDispatchRegistryEntry } from './core/dispatch-registry.js';
|
|
40
40
|
import { enableAutostart, disableAutostart, autostartStatus, refreshAutostart } from './autostart.js';
|
|
@@ -56,7 +56,8 @@ import { firstPositional } from './cli/arg-utils.js';
|
|
|
56
56
|
import { isColdResumeDormant, isRealManagedSession, sessionListDisposition } from './cli/session-list-liveness.js';
|
|
57
57
|
import { attachFrozenManagedZmxSession, freezeManagedZmxAttachTarget, } from './cli/zmx-managed-attach.js';
|
|
58
58
|
import { dispatchPrimaryMessage, findStdinAliasAttachment, normalizeInteractiveCardInput, sendFileAttachments, sendVideoAttachments, shouldSendAsPureVideo, validateVideoAttachments } from './cli/send-dispatch.js';
|
|
59
|
-
import { dispatchDeferredTopicSend } from './cli/deferred-topic-send.js';
|
|
59
|
+
import { dispatchDeferredTopicSend, reusableDeferredTopicRoot } from './cli/deferred-topic-send.js';
|
|
60
|
+
import { readDeferredTopicBinding } from './core/deferred-topic-binding.js';
|
|
60
61
|
import { resolveDaemonEnv } from './cli/daemon-lifecycle-env.js';
|
|
61
62
|
import { buildPm2SpawnCommand } from './cli/pm2-command.js';
|
|
62
63
|
import { callDashboard } from './cli/dashboard-endpoint.js';
|
|
@@ -7105,7 +7106,8 @@ async function cmdSend(rest) {
|
|
|
7105
7106
|
// is idempotent, so the downstream send path reuses these same clients.
|
|
7106
7107
|
// envPinnedRiffBot is re-registered LAST so a remote env credential is never
|
|
7107
7108
|
// clobbered by a stale bots.json entry for the same app.
|
|
7108
|
-
const { registerBot, loadBotConfigs, findOncallChatForAnyBot } = await import('./bot-registry.js');
|
|
7109
|
+
const { registerBot, loadBotConfigs, findOncallChatForAnyBot, getBot } = await import('./bot-registry.js');
|
|
7110
|
+
const { resolveRegularGroupMode } = await import('./services/chat-reply-mode-store.js');
|
|
7109
7111
|
try {
|
|
7110
7112
|
for (const cfg of loadBotConfigs())
|
|
7111
7113
|
registerBot(cfg);
|
|
@@ -7163,7 +7165,7 @@ async function cmdSend(rest) {
|
|
|
7163
7165
|
process.exit(1);
|
|
7164
7166
|
}
|
|
7165
7167
|
}
|
|
7166
|
-
const { sendMessage, replyMessage, uploadImage, uploadFile, MessageWithdrawnError } = await import('./im/lark/client.js');
|
|
7168
|
+
const { sendMessage, replyMessage, uploadImage, uploadFile, MessageWithdrawnError, getChatModeStrict } = await import('./im/lark/client.js');
|
|
7167
7169
|
const appId = s.larkAppId;
|
|
7168
7170
|
// Effective target chat for top-level mode (defaults to session's chat)
|
|
7169
7171
|
const targetChatId = overrideChatId ?? s.chatId;
|
|
@@ -7171,6 +7173,48 @@ async function cmdSend(rest) {
|
|
|
7171
7173
|
// reply_in_thread, otherwise Lark would force every reply into a fresh
|
|
7172
7174
|
// topic — defeating the whole point of chat-scope routing.
|
|
7173
7175
|
const isChatScope = s.scope === 'chat';
|
|
7176
|
+
// Compute the actual outbound anchor before the advisory guard. A chat-scope
|
|
7177
|
+
// sender can still reply into a per-turn topic, so sender scope alone does
|
|
7178
|
+
// not describe which peer sessions are reachable.
|
|
7179
|
+
const sendTarget = resolveSendTarget({ into: sendInto, topLevel: sendTopLevel, chatScope: isChatScope, chatId: targetChatId, rootMessageId: s.rootMessageId, replyTargetRootId: turnReplyTarget?.rootMessageId, replyTargetTurnId: turnReplyTarget?.turnId, replyTargetQuoteOnly: turnReplyTarget?.quoteOnly, currentTurnId });
|
|
7180
|
+
const dataDir = resolveDataDir();
|
|
7181
|
+
const deferredBinding = !sendInto && (!overrideChatId || overrideChatId === s.chatId)
|
|
7182
|
+
? readDeferredTopicBinding(dataDir, s.sessionId)
|
|
7183
|
+
: undefined;
|
|
7184
|
+
const deferredRoot = reusableDeferredTopicRoot({
|
|
7185
|
+
session: s,
|
|
7186
|
+
binding: deferredBinding,
|
|
7187
|
+
explicitTopLevel: sendTopLevel,
|
|
7188
|
+
reuseBoundRootWhenTopLevel: deferredMaterializedByThisCommand,
|
|
7189
|
+
});
|
|
7190
|
+
const reachabilityTarget = deferredRoot
|
|
7191
|
+
? { mode: 'thread', rootMessageId: deferredRoot }
|
|
7192
|
+
: sendTarget;
|
|
7193
|
+
// Load the sender-scoped bot identity map once. Besides prose @Name
|
|
7194
|
+
// injection below, it lets the sub-bot hint recognize peers that already
|
|
7195
|
+
// have an active session in THIS conversation.
|
|
7196
|
+
let botEntries = [];
|
|
7197
|
+
let crossRef = {};
|
|
7198
|
+
try {
|
|
7199
|
+
const botInfoPath = join(dataDir, 'bots-info.json');
|
|
7200
|
+
const parsedBotEntries = existsSync(botInfoPath)
|
|
7201
|
+
? JSON.parse(readFileSync(botInfoPath, 'utf-8'))
|
|
7202
|
+
: [];
|
|
7203
|
+
botEntries = Array.isArray(parsedBotEntries)
|
|
7204
|
+
? parsedBotEntries.filter((entry) => !!entry
|
|
7205
|
+
&& typeof entry === 'object'
|
|
7206
|
+
&& typeof entry.larkAppId === 'string'
|
|
7207
|
+
&& (entry.botName === null || typeof entry.botName === 'string'))
|
|
7208
|
+
: [];
|
|
7209
|
+
const crossRefPath = join(dataDir, `bot-openids-${appId}.json`);
|
|
7210
|
+
const parsedCrossRef = existsSync(crossRefPath)
|
|
7211
|
+
? JSON.parse(readFileSync(crossRefPath, 'utf-8'))
|
|
7212
|
+
: {};
|
|
7213
|
+
crossRef = parsedCrossRef && typeof parsedCrossRef === 'object' && !Array.isArray(parsedCrossRef)
|
|
7214
|
+
? parsedCrossRef
|
|
7215
|
+
: {};
|
|
7216
|
+
}
|
|
7217
|
+
catch { /* best-effort identity map */ }
|
|
7174
7218
|
// ── Footgun guard: orchestrator → sub-bot ──
|
|
7175
7219
|
// A dispatched sub-bot's session lives in its sub-topic; @-ing it from the main
|
|
7176
7220
|
// chat spawns a fresh, context-less one. The check is computed ONCE and applied
|
|
@@ -7179,23 +7223,49 @@ async function cmdSend(rest) {
|
|
|
7179
7223
|
// `@OtherSubBot` can't slip past after this explicit guard already ran.
|
|
7180
7224
|
let dispatchReg = {};
|
|
7181
7225
|
try {
|
|
7182
|
-
const regPath = join(
|
|
7226
|
+
const regPath = join(dataDir, 'orchestrate-dispatch.json');
|
|
7183
7227
|
if (existsSync(regPath))
|
|
7184
7228
|
dispatchReg = JSON.parse(readFileSync(regPath, 'utf-8'));
|
|
7185
7229
|
}
|
|
7186
7230
|
catch { /* no/!corrupt registry → no guard */ }
|
|
7187
7231
|
const dispatchActiveSeeds = new Set();
|
|
7232
|
+
let allSessions = [];
|
|
7188
7233
|
if (Object.keys(dispatchReg).length > 0) {
|
|
7189
|
-
|
|
7190
|
-
|
|
7234
|
+
allSessions = [...loadSessions().values()];
|
|
7235
|
+
for (const sess of allSessions) {
|
|
7236
|
+
if (sess.status !== 'active')
|
|
7237
|
+
continue;
|
|
7238
|
+
if (sess.scope !== 'chat' && sess.rootMessageId) {
|
|
7191
7239
|
dispatchActiveSeeds.add(sess.rootMessageId);
|
|
7192
7240
|
}
|
|
7193
7241
|
}
|
|
7194
7242
|
}
|
|
7243
|
+
// An active chat-scope session can outlive a /reply-mode switch. Verify the
|
|
7244
|
+
// target bot's current effective mode before assuming mentions still fold
|
|
7245
|
+
// back into that old session.
|
|
7246
|
+
const foldableChatAppIds = await foldableChatSessionAppIds({
|
|
7247
|
+
sessions: allSessions,
|
|
7248
|
+
targetChatId,
|
|
7249
|
+
outboundMode: reachabilityTarget.mode,
|
|
7250
|
+
resolveMode: (larkAppId, chatId) => {
|
|
7251
|
+
getBot(larkAppId); // unknown target bot must fail closed
|
|
7252
|
+
return resolveRegularGroupMode(larkAppId, chatId);
|
|
7253
|
+
},
|
|
7254
|
+
resolveChatMode: chatId => getChatModeStrict(appId, chatId),
|
|
7255
|
+
});
|
|
7256
|
+
const reachableOpenIds = activeConversationBotOpenIds({
|
|
7257
|
+
sessions: allSessions,
|
|
7258
|
+
targetChatId,
|
|
7259
|
+
outboundRootMessageId: threadRootForReachability(reachabilityTarget),
|
|
7260
|
+
foldableChatAppIds,
|
|
7261
|
+
botEntries,
|
|
7262
|
+
crossRef,
|
|
7263
|
+
});
|
|
7195
7264
|
// Sub-topic seed if `openId` is a dispatched sub-bot in an active topic that is
|
|
7196
|
-
// NOT reachable in the current conversation; else null.
|
|
7197
|
-
//
|
|
7198
|
-
|
|
7265
|
+
// NOT reachable in the current conversation; else null. Both the bot I'm
|
|
7266
|
+
// replying to and any peer with an active session at this conversation anchor
|
|
7267
|
+
// are reachable, so an unrelated old dispatch topic must not be recommended.
|
|
7268
|
+
const offTopicSubBotSeed = (openId) => offTopicSubBotTopic({ mentionOpenId: openId, quoteTargetSenderOpenId: replyTargetSenderOpenId, reachableOpenIds, chatId: targetChatId, registry: dispatchReg, activeSeeds: dispatchActiveSeeds });
|
|
7199
7269
|
// Explicit --mention / --mention-back of an off-topic sub-bot → block + point to
|
|
7200
7270
|
// the right command (--anyway overrides). Prose @Name injection is filtered
|
|
7201
7271
|
// (dropped, not blocked) at its own site below.
|
|
@@ -7223,9 +7293,9 @@ async function cmdSend(rest) {
|
|
|
7223
7293
|
rootMessageId: s.rootMessageId,
|
|
7224
7294
|
title: s.title,
|
|
7225
7295
|
};
|
|
7226
|
-
//
|
|
7227
|
-
//
|
|
7228
|
-
|
|
7296
|
+
// Ordinary delivery uses the nominal target. Deferred delivery gets first
|
|
7297
|
+
// refusal below; the advisory mirrors its existing binding in
|
|
7298
|
+
// `reachabilityTarget` above so both paths agree about the effective root.
|
|
7229
7299
|
const dispatch = async (content, msgType, uuid, suppressHook) => {
|
|
7230
7300
|
// This closure also carries attachments, so every Lark call re-checks the
|
|
7231
7301
|
// exact durable attempt/member instead of inheriting the early cmd gate.
|
|
@@ -7399,16 +7469,7 @@ async function cmdSend(rest) {
|
|
|
7399
7469
|
// "获取群组中其他机器人和用户@当前机器人的消息"权限),不再走任何本地
|
|
7400
7470
|
// 转发——botmux 历史上为绕过 Lark 不投递跨 bot 事件搞过 signal-file,
|
|
7401
7471
|
// 那套已经在该权限上线后整体下线。
|
|
7402
|
-
let botEntries = [];
|
|
7403
|
-
let crossRef = {};
|
|
7404
7472
|
try {
|
|
7405
|
-
const dataDir = resolveDataDir();
|
|
7406
|
-
const botInfoPath = join(dataDir, 'bots-info.json');
|
|
7407
|
-
botEntries = existsSync(botInfoPath) ? JSON.parse(readFileSync(botInfoPath, 'utf-8')) : [];
|
|
7408
|
-
const crossRefPath = join(dataDir, `bot-openids-${appId}.json`);
|
|
7409
|
-
crossRef = existsSync(crossRefPath)
|
|
7410
|
-
? JSON.parse(readFileSync(crossRefPath, 'utf-8'))
|
|
7411
|
-
: {};
|
|
7412
7473
|
// --no-mention 显式不 @ 任何人:跳过正文 @BotName 的自动注入,否则正文里
|
|
7413
7474
|
// 出现的 @名字 仍会被注入成 <at>,破坏 --no-mention 语义、还可能误触发对方
|
|
7414
7475
|
// bot(正是要避免的循环 @)。botEntries/crossRef 仍需加载供 footer 寻址用。
|
|
@@ -8091,22 +8152,19 @@ async function cmdDispatch(rest) {
|
|
|
8091
8152
|
}
|
|
8092
8153
|
}
|
|
8093
8154
|
/**
|
|
8094
|
-
* `botmux report` —
|
|
8095
|
-
* orchestrator that dispatched it.
|
|
8096
|
-
*
|
|
8097
|
-
* In 多话题协作模式 the sub-bot lives in its own sub-topic, where the orchestrator
|
|
8098
|
-
* has no session; @-ing the orchestrator there would spawn a fresh, context-less
|
|
8099
|
-
* one (the reported #1 bug). Instead this routes the report INTO the orchestrator's own
|
|
8100
|
-
* thread (recorded by `botmux dispatch` in orchestrate-dispatch.json) and @-s the
|
|
8101
|
-
* orchestrator there, so its existing, context-rich session is the one that wakes.
|
|
8155
|
+
* `botmux report` — delivery / progress report.
|
|
8102
8156
|
*
|
|
8103
|
-
*
|
|
8104
|
-
*
|
|
8105
|
-
*
|
|
8157
|
+
* Two paths:
|
|
8158
|
+
* 1) Platform Issue 领取群:session 有活跃 issue binding → enqueue+write `in_review`
|
|
8159
|
+
* (待验收). This is what kickoff means by 「完成后执行 botmux report」.
|
|
8160
|
+
* 2) 多话题协作:dispatched sub-bot reports back to the orchestrator session.
|
|
8161
|
+
* The sub-bot lives in its own sub-topic where the orchestrator has no session;
|
|
8162
|
+
* @-ing the orchestrator there would spawn a fresh context-less one. Instead this
|
|
8163
|
+
* routes INTO the orchestrator's thread (orchestrate-dispatch.json) and @-s it there.
|
|
8106
8164
|
*/
|
|
8107
8165
|
async function cmdReport(rest) {
|
|
8108
8166
|
if (rest.includes('--help') || rest.includes('-h')) {
|
|
8109
|
-
console.log(`botmux report —
|
|
8167
|
+
console.log(`botmux report — 交付回报(issue 待验收 / 多话题协作回主编排)
|
|
8110
8168
|
|
|
8111
8169
|
用法:
|
|
8112
8170
|
botmux report "子项目X 完成,产出在 …"
|
|
@@ -8114,9 +8172,10 @@ async function cmdReport(rest) {
|
|
|
8114
8172
|
botmux report --content-file <path>
|
|
8115
8173
|
|
|
8116
8174
|
说明:
|
|
8117
|
-
|
|
8118
|
-
|
|
8119
|
-
|
|
8175
|
+
1) 平台 Issue 领取群:本会话绑定了平台 issue 时,把 issue 推到「待验收」(in_review)。
|
|
8176
|
+
kickoff 里「完成后执行 botmux report」指的就是这条路径。
|
|
8177
|
+
2) 多话题协作:被 botmux dispatch 派活的子话题里,把回报发回主编排会话并 @ 主 bot
|
|
8178
|
+
(不要在子话题里 @ 主 bot——会另起无上下文会话)。
|
|
8120
8179
|
|
|
8121
8180
|
选项:
|
|
8122
8181
|
--content-file <path> 从文件读取回报内容
|
|
@@ -8156,7 +8215,7 @@ async function cmdReport(rest) {
|
|
|
8156
8215
|
}
|
|
8157
8216
|
const sid = sessionIdArg ?? findAncestorSessionId();
|
|
8158
8217
|
if (!sid) {
|
|
8159
|
-
console.error('无法推断 session-id
|
|
8218
|
+
console.error('无法推断 session-id。请在 issue 领取群 / 被 dispatch 派活的会话里运行,或传 --session-id <id>。');
|
|
8160
8219
|
process.exit(1);
|
|
8161
8220
|
}
|
|
8162
8221
|
const sessions = loadSessions();
|
|
@@ -8169,6 +8228,86 @@ async function cmdReport(rest) {
|
|
|
8169
8228
|
console.error(`session ${sid} 缺少 larkAppId`);
|
|
8170
8229
|
process.exit(1);
|
|
8171
8230
|
}
|
|
8231
|
+
// ── Issue Board 交付:绑定了平台 issue 的领取群 → 推 in_review(待验收)────────
|
|
8232
|
+
// 优先于 dispatch 路径:领取群没有 creatorOpenId,走 dispatch 会硬失败。
|
|
8233
|
+
// 显式 --dispatch-root 时仍走协作回报(避免 issue 群里误 dispatch 被静默改道)。
|
|
8234
|
+
if (!explicitDispatchRoot) {
|
|
8235
|
+
try {
|
|
8236
|
+
const dataDir = resolveDataDir();
|
|
8237
|
+
const { findActiveBindingForSession, reportIssueInReview } = await import('./services/issue-report.js');
|
|
8238
|
+
const binding = findActiveBindingForSession(dataDir, {
|
|
8239
|
+
chatId: s.chatId,
|
|
8240
|
+
rootMessageId: s.rootMessageId,
|
|
8241
|
+
});
|
|
8242
|
+
if (binding) {
|
|
8243
|
+
const { writeIssueStatus, findIssueById } = await import('./platform/issue-client.js');
|
|
8244
|
+
const result = await reportIssueInReview({
|
|
8245
|
+
dataDir,
|
|
8246
|
+
writeStatus: (issueId, args) => writeIssueStatus(issueId, args),
|
|
8247
|
+
fetchIssue: (teamId, issueId) => findIssueById(teamId, issueId),
|
|
8248
|
+
}, binding.anchorId);
|
|
8249
|
+
if (!result.ok) {
|
|
8250
|
+
if (result.reason === 'platform') {
|
|
8251
|
+
console.error(result.permanent
|
|
8252
|
+
? `issue 交付失败(${result.detail})。平台明确拒绝,重试不会好转——去平台看看这条任务还在不在、领取有没有被收回。`
|
|
8253
|
+
: `issue 交付失败(${result.detail})。可稍后重试同一 botmux report。`);
|
|
8254
|
+
}
|
|
8255
|
+
else if (result.reason === 'detached') {
|
|
8256
|
+
// 重试没有意义:平台上这条 claim 已经不是本机的了。
|
|
8257
|
+
console.error(`issue 交付失败:平台上这个任务的领取已不属于本机(被回收、租约过期或已被别人领走),`
|
|
8258
|
+
+ `交付没有落地。去平台看看任务 ${binding.issueId} 的状态。`);
|
|
8259
|
+
}
|
|
8260
|
+
else {
|
|
8261
|
+
console.error(`issue 交付失败:${result.reason}`);
|
|
8262
|
+
}
|
|
8263
|
+
process.exit(1);
|
|
8264
|
+
}
|
|
8265
|
+
// 交付说明必须发回群里:平台的 /status 只收状态、不收正文(没有 note 字段),
|
|
8266
|
+
// 这段文字在平台上无处可放。不发的话验收的人只看到状态变成「待验收」,完全不知道
|
|
8267
|
+
// 交付了什么,而 stdout 只有 agent 自己看得到。
|
|
8268
|
+
let delivered = false;
|
|
8269
|
+
try {
|
|
8270
|
+
const { registerBot, loadBotConfigs } = await import('./bot-registry.js');
|
|
8271
|
+
await registerSelfFromCredFile();
|
|
8272
|
+
try {
|
|
8273
|
+
for (const cfg of loadBotConfigs())
|
|
8274
|
+
registerBot(cfg);
|
|
8275
|
+
}
|
|
8276
|
+
catch { /* 已注册/读不到 */ }
|
|
8277
|
+
const { buildIssueDeliveryCard } = await import('./im/lark/issue-card.js');
|
|
8278
|
+
const { issueDetailUrl } = await import('./services/issue-claim-flow.js');
|
|
8279
|
+
const { sendMessage: larkSend } = await import('./im/lark/client.js');
|
|
8280
|
+
const url = issueDetailUrl(binding.platformBaseUrl, result.issueId);
|
|
8281
|
+
await larkSend(s.larkAppId, binding.chatId ?? binding.anchorId, buildIssueDeliveryCard({
|
|
8282
|
+
issueId: result.issueId,
|
|
8283
|
+
report: content,
|
|
8284
|
+
alreadyInReview: result.alreadyInReview,
|
|
8285
|
+
...(url ? { issueUrl: url } : {}),
|
|
8286
|
+
}), 'interactive');
|
|
8287
|
+
delivered = true;
|
|
8288
|
+
}
|
|
8289
|
+
catch (e) {
|
|
8290
|
+
// 状态已经写成功了,播报失败不该让整条命令失败——但要如实说出来,
|
|
8291
|
+
// 否则 agent 以为交付说明已经送达。
|
|
8292
|
+
console.error(`交付说明未能发回群里(状态已是待验收):${e?.message ?? e}`);
|
|
8293
|
+
}
|
|
8294
|
+
console.log(JSON.stringify({
|
|
8295
|
+
success: true,
|
|
8296
|
+
delivery: 'issue-in-review',
|
|
8297
|
+
issueId: result.issueId,
|
|
8298
|
+
anchorId: binding.anchorId,
|
|
8299
|
+
alreadyInReview: result.alreadyInReview,
|
|
8300
|
+
reportPostedToChat: delivered,
|
|
8301
|
+
reportPreview: content.trim().slice(0, 200),
|
|
8302
|
+
}));
|
|
8303
|
+
return;
|
|
8304
|
+
}
|
|
8305
|
+
}
|
|
8306
|
+
catch (err) {
|
|
8307
|
+
console.error(`issue 交付异常: ${err?.message ?? err}`);
|
|
8308
|
+
process.exit(1);
|
|
8309
|
+
}
|
|
8310
|
+
}
|
|
8172
8311
|
// Resolve where the report goes + who to @. Same-machine: the dispatch registry
|
|
8173
8312
|
// (keyed by this sub-bot's thread root) carries the orchestrator's exact coords.
|
|
8174
8313
|
// CROSS-MACHINE: the orchestrator is on another machine, so its registry isn't
|