@xgjktech/xg_cwork_im 1.19.41 → 1.19.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +488 -488
- package/dist/src/account-connection.d.ts +37 -0
- package/dist/src/account-connection.d.ts.map +1 -0
- package/dist/src/account-connection.js +437 -0
- package/dist/src/account-connection.js.map +1 -0
- package/dist/src/account-reconciler.d.ts +55 -0
- package/dist/src/account-reconciler.d.ts.map +1 -0
- package/dist/src/account-reconciler.js +294 -0
- package/dist/src/account-reconciler.js.map +1 -0
- package/dist/src/account-reconciler.test.d.ts +2 -0
- package/dist/src/account-reconciler.test.d.ts.map +1 -0
- package/dist/src/account-reconciler.test.js +148 -0
- package/dist/src/account-reconciler.test.js.map +1 -0
- package/dist/src/action-run-event.d.ts +20 -0
- package/dist/src/action-run-event.d.ts.map +1 -0
- package/dist/src/action-run-event.js +62 -0
- package/dist/src/action-run-event.js.map +1 -0
- package/dist/src/action-run-event.test.d.ts +2 -0
- package/dist/src/action-run-event.test.d.ts.map +1 -0
- package/dist/src/action-run-event.test.js +83 -0
- package/dist/src/action-run-event.test.js.map +1 -0
- package/dist/src/action-store-access.d.ts +27 -0
- package/dist/src/action-store-access.d.ts.map +1 -0
- package/dist/src/action-store-access.js +74 -0
- package/dist/src/action-store-access.js.map +1 -0
- package/dist/src/active-round-registry.d.ts +29 -0
- package/dist/src/active-round-registry.d.ts.map +1 -0
- package/dist/src/active-round-registry.js +60 -0
- package/dist/src/active-round-registry.js.map +1 -0
- package/dist/src/active-round-registry.test.d.ts +2 -0
- package/dist/src/active-round-registry.test.d.ts.map +1 -0
- package/dist/src/active-round-registry.test.js +62 -0
- package/dist/src/active-round-registry.test.js.map +1 -0
- package/dist/src/agent-context-types.d.ts +205 -0
- package/dist/src/agent-context-types.d.ts.map +1 -0
- package/dist/src/agent-context-types.js +132 -0
- package/dist/src/agent-context-types.js.map +1 -0
- package/dist/src/agent-context-types.test.d.ts +2 -0
- package/dist/src/agent-context-types.test.d.ts.map +1 -0
- package/dist/src/agent-context-types.test.js +123 -0
- package/dist/src/agent-context-types.test.js.map +1 -0
- package/dist/src/agent-stream-client-registry.d.ts +6 -0
- package/dist/src/agent-stream-client-registry.d.ts.map +1 -0
- package/dist/src/agent-stream-client-registry.js +14 -0
- package/dist/src/agent-stream-client-registry.js.map +1 -0
- package/dist/src/apply-sync-mapping.d.ts +15 -0
- package/dist/src/apply-sync-mapping.d.ts.map +1 -0
- package/dist/src/apply-sync-mapping.js +98 -0
- package/dist/src/apply-sync-mapping.js.map +1 -0
- package/dist/src/auth.d.ts +30 -0
- package/dist/src/auth.d.ts.map +1 -0
- package/dist/src/auth.js +66 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/auto-model-router.d.ts +36 -0
- package/dist/src/auto-model-router.d.ts.map +1 -0
- package/dist/src/auto-model-router.js +60 -0
- package/dist/src/auto-model-router.js.map +1 -0
- package/dist/src/auto-model-router.test.d.ts +2 -0
- package/dist/src/auto-model-router.test.d.ts.map +1 -0
- package/dist/src/auto-model-router.test.js +99 -0
- package/dist/src/auto-model-router.test.js.map +1 -0
- package/dist/src/block-streaming-config.test.d.ts +2 -0
- package/dist/src/block-streaming-config.test.d.ts.map +1 -0
- package/dist/src/block-streaming-config.test.js +85 -0
- package/dist/src/block-streaming-config.test.js.map +1 -0
- package/dist/src/build-project-prompt.d.ts +40 -0
- package/dist/src/build-project-prompt.d.ts.map +1 -0
- package/dist/src/build-project-prompt.js +183 -0
- package/dist/src/build-project-prompt.js.map +1 -0
- package/dist/src/build-project-prompt.test.d.ts +2 -0
- package/dist/src/build-project-prompt.test.d.ts.map +1 -0
- package/dist/src/build-project-prompt.test.js +100 -0
- package/dist/src/build-project-prompt.test.js.map +1 -0
- package/dist/src/channel-config.d.ts +650 -0
- package/dist/src/channel-config.d.ts.map +1 -0
- package/dist/src/channel-config.js +372 -0
- package/dist/src/channel-config.js.map +1 -0
- package/dist/src/channel-config.test.d.ts +2 -0
- package/dist/src/channel-config.test.d.ts.map +1 -0
- package/dist/src/channel-config.test.js +56 -0
- package/dist/src/channel-config.test.js.map +1 -0
- package/dist/src/channel-disabled-account.test.d.ts +2 -0
- package/dist/src/channel-disabled-account.test.d.ts.map +1 -0
- package/dist/src/channel-disabled-account.test.js +44 -0
- package/dist/src/channel-disabled-account.test.js.map +1 -0
- package/dist/src/channel-log.d.ts +17 -0
- package/dist/src/channel-log.d.ts.map +1 -0
- package/dist/src/channel-log.js +45 -0
- package/dist/src/channel-log.js.map +1 -0
- package/dist/src/channel.d.ts +16 -0
- package/dist/src/channel.d.ts.map +1 -0
- package/dist/src/channel.js +149 -0
- package/dist/src/channel.js.map +1 -0
- package/dist/src/connection.d.ts +82 -0
- package/dist/src/connection.d.ts.map +1 -0
- package/dist/src/connection.js +386 -0
- package/dist/src/connection.js.map +1 -0
- package/dist/src/deliver-text.d.ts +30 -0
- package/dist/src/deliver-text.d.ts.map +1 -0
- package/dist/src/deliver-text.js +88 -0
- package/dist/src/deliver-text.js.map +1 -0
- package/dist/src/deliver-text.test.d.ts +2 -0
- package/dist/src/deliver-text.test.d.ts.map +1 -0
- package/dist/src/deliver-text.test.js +117 -0
- package/dist/src/deliver-text.test.js.map +1 -0
- package/dist/src/delivery/deliver-text.test.js +22 -22
- package/dist/src/delivery/turn-deliver-buffer.test.js +25 -25
- package/dist/src/delivery/user-facing-errors.d.ts +1 -0
- package/dist/src/delivery/user-facing-errors.d.ts.map +1 -1
- package/dist/src/delivery/user-facing-errors.js +7 -0
- package/dist/src/delivery/user-facing-errors.js.map +1 -1
- package/dist/src/delivery/user-facing-errors.test.js +12 -1
- package/dist/src/delivery/user-facing-errors.test.js.map +1 -1
- package/dist/src/dispatch-mentioned-reply.d.ts +42 -0
- package/dist/src/dispatch-mentioned-reply.d.ts.map +1 -0
- package/dist/src/dispatch-mentioned-reply.js +822 -0
- package/dist/src/dispatch-mentioned-reply.js.map +1 -0
- package/dist/src/gateway-session-queue.d.ts +41 -0
- package/dist/src/gateway-session-queue.d.ts.map +1 -0
- package/dist/src/gateway-session-queue.js +29 -0
- package/dist/src/gateway-session-queue.js.map +1 -0
- package/dist/src/group-history-tool.d.ts +31 -0
- package/dist/src/group-history-tool.d.ts.map +1 -0
- package/dist/src/group-history-tool.js +177 -0
- package/dist/src/group-history-tool.js.map +1 -0
- package/dist/src/im-tool-progress.d.ts +4 -0
- package/dist/src/im-tool-progress.d.ts.map +1 -0
- package/dist/src/im-tool-progress.js +87 -0
- package/dist/src/im-tool-progress.js.map +1 -0
- package/dist/src/inbound-archive.d.ts +4 -0
- package/dist/src/inbound-archive.d.ts.map +1 -0
- package/dist/src/inbound-archive.js +105 -0
- package/dist/src/inbound-archive.js.map +1 -0
- package/dist/src/inbound-attachment-meta.d.ts +13 -0
- package/dist/src/inbound-attachment-meta.d.ts.map +1 -0
- package/dist/src/inbound-attachment-meta.js +39 -0
- package/dist/src/inbound-attachment-meta.js.map +1 -0
- package/dist/src/inbound-chat-type.d.ts +33 -0
- package/dist/src/inbound-chat-type.d.ts.map +1 -0
- package/dist/src/inbound-chat-type.js +52 -0
- package/dist/src/inbound-chat-type.js.map +1 -0
- package/dist/src/inbound-display.d.ts +41 -0
- package/dist/src/inbound-display.d.ts.map +1 -0
- package/dist/src/inbound-display.js +169 -0
- package/dist/src/inbound-display.js.map +1 -0
- package/dist/src/inbound-file-download.d.ts +15 -0
- package/dist/src/inbound-file-download.d.ts.map +1 -0
- package/dist/src/inbound-file-download.js +48 -0
- package/dist/src/inbound-file-download.js.map +1 -0
- package/dist/src/inbound-input-media.d.ts +43 -0
- package/dist/src/inbound-input-media.d.ts.map +1 -0
- package/dist/src/inbound-input-media.js +230 -0
- package/dist/src/inbound-input-media.js.map +1 -0
- package/dist/src/inbound-media-local.d.ts +49 -0
- package/dist/src/inbound-media-local.d.ts.map +1 -0
- package/dist/src/inbound-media-local.js +194 -0
- package/dist/src/inbound-media-local.js.map +1 -0
- package/dist/src/inbound-model.d.ts +30 -0
- package/dist/src/inbound-model.d.ts.map +1 -0
- package/dist/src/inbound-model.js +40 -0
- package/dist/src/inbound-model.js.map +1 -0
- package/dist/src/inbound-model.test.d.ts +2 -0
- package/dist/src/inbound-model.test.d.ts.map +1 -0
- package/dist/src/inbound-model.test.js +66 -0
- package/dist/src/inbound-model.test.js.map +1 -0
- package/dist/src/inbound-terminal-delivery.d.ts +77 -0
- package/dist/src/inbound-terminal-delivery.d.ts.map +1 -0
- package/dist/src/inbound-terminal-delivery.js +251 -0
- package/dist/src/inbound-terminal-delivery.js.map +1 -0
- package/dist/src/inbound-terminal-state.d.ts +66 -0
- package/dist/src/inbound-terminal-state.d.ts.map +1 -0
- package/dist/src/inbound-terminal-state.js +180 -0
- package/dist/src/inbound-terminal-state.js.map +1 -0
- package/dist/src/inbound-terminal-state.test.d.ts +2 -0
- package/dist/src/inbound-terminal-state.test.d.ts.map +1 -0
- package/dist/src/inbound-terminal-state.test.js +224 -0
- package/dist/src/inbound-terminal-state.test.js.map +1 -0
- package/dist/src/interrupt-round.d.ts +9 -0
- package/dist/src/interrupt-round.d.ts.map +1 -0
- package/dist/src/interrupt-round.js +44 -0
- package/dist/src/interrupt-round.js.map +1 -0
- package/dist/src/interrupt-round.test.d.ts +2 -0
- package/dist/src/interrupt-round.test.d.ts.map +1 -0
- package/dist/src/interrupt-round.test.js +133 -0
- package/dist/src/interrupt-round.test.js.map +1 -0
- package/dist/src/item-event-guard.d.ts +28 -0
- package/dist/src/item-event-guard.d.ts.map +1 -0
- package/dist/src/item-event-guard.js +22 -0
- package/dist/src/item-event-guard.js.map +1 -0
- package/dist/src/item-event-guard.test.d.ts +2 -0
- package/dist/src/item-event-guard.test.d.ts.map +1 -0
- package/dist/src/item-event-guard.test.js +55 -0
- package/dist/src/item-event-guard.test.js.map +1 -0
- package/dist/src/modified-file-push-tracker.d.ts +24 -0
- package/dist/src/modified-file-push-tracker.d.ts.map +1 -0
- package/dist/src/modified-file-push-tracker.js +125 -0
- package/dist/src/modified-file-push-tracker.js.map +1 -0
- package/dist/src/nas-volumes.d.ts +43 -0
- package/dist/src/nas-volumes.d.ts.map +1 -0
- package/dist/src/nas-volumes.js +307 -0
- package/dist/src/nas-volumes.js.map +1 -0
- package/dist/src/nas-volumes.test.d.ts +2 -0
- package/dist/src/nas-volumes.test.d.ts.map +1 -0
- package/dist/src/nas-volumes.test.js +229 -0
- package/dist/src/nas-volumes.test.js.map +1 -0
- package/dist/src/per-message-fallback-notice.d.ts +43 -0
- package/dist/src/per-message-fallback-notice.d.ts.map +1 -0
- package/dist/src/per-message-fallback-notice.js +93 -0
- package/dist/src/per-message-fallback-notice.js.map +1 -0
- package/dist/src/per-message-fallback-notice.test.d.ts +2 -0
- package/dist/src/per-message-fallback-notice.test.d.ts.map +1 -0
- package/dist/src/per-message-fallback-notice.test.js +47 -0
- package/dist/src/per-message-fallback-notice.test.js.map +1 -0
- package/dist/src/per-message-model-pending.d.ts +17 -0
- package/dist/src/per-message-model-pending.d.ts.map +1 -0
- package/dist/src/per-message-model-pending.js +45 -0
- package/dist/src/per-message-model-pending.js.map +1 -0
- package/dist/src/plan/action-dispatch-event-compat.test.d.ts +2 -0
- package/dist/src/plan/action-dispatch-event-compat.test.d.ts.map +1 -0
- package/dist/src/plan/action-dispatch-event-compat.test.js +81 -0
- package/dist/src/plan/action-dispatch-event-compat.test.js.map +1 -0
- package/dist/src/plan/action-store-lifecycle.test.js +5 -5
- package/dist/src/plan/plan-core-db.test.js +9 -9
- package/dist/src/plan/plan-core-snapshot.test.js +9 -9
- package/dist/src/plan-blocked-notice.d.ts +14 -0
- package/dist/src/plan-blocked-notice.d.ts.map +1 -0
- package/dist/src/plan-blocked-notice.js +41 -0
- package/dist/src/plan-blocked-notice.js.map +1 -0
- package/dist/src/plan-blocked-notice.test.d.ts +2 -0
- package/dist/src/plan-blocked-notice.test.d.ts.map +1 -0
- package/dist/src/plan-blocked-notice.test.js +96 -0
- package/dist/src/plan-blocked-notice.test.js.map +1 -0
- package/dist/src/plan-event-subscription.d.ts +36 -0
- package/dist/src/plan-event-subscription.d.ts.map +1 -0
- package/dist/src/plan-event-subscription.js +57 -0
- package/dist/src/plan-event-subscription.js.map +1 -0
- package/dist/src/plan-event-subscription.test.d.ts +2 -0
- package/dist/src/plan-event-subscription.test.d.ts.map +1 -0
- package/dist/src/plan-event-subscription.test.js +167 -0
- package/dist/src/plan-event-subscription.test.js.map +1 -0
- package/dist/src/plan-stat-event.d.ts +28 -0
- package/dist/src/plan-stat-event.d.ts.map +1 -0
- package/dist/src/plan-stat-event.js +74 -0
- package/dist/src/plan-stat-event.js.map +1 -0
- package/dist/src/plan-stat-event.test.d.ts +2 -0
- package/dist/src/plan-stat-event.test.d.ts.map +1 -0
- package/dist/src/plan-stat-event.test.js +248 -0
- package/dist/src/plan-stat-event.test.js.map +1 -0
- package/dist/src/plan-store-access.d.ts +23 -0
- package/dist/src/plan-store-access.d.ts.map +1 -0
- package/dist/src/plan-store-access.js +96 -0
- package/dist/src/plan-store-access.js.map +1 -0
- package/dist/src/plan-store-access.test.d.ts +2 -0
- package/dist/src/plan-store-access.test.d.ts.map +1 -0
- package/dist/src/plan-store-access.test.js +207 -0
- package/dist/src/plan-store-access.test.js.map +1 -0
- package/dist/src/plan-tool-middleware.d.ts +27 -0
- package/dist/src/plan-tool-middleware.d.ts.map +1 -0
- package/dist/src/plan-tool-middleware.js +112 -0
- package/dist/src/plan-tool-middleware.js.map +1 -0
- package/dist/src/plan-tool-middleware.test.d.ts +2 -0
- package/dist/src/plan-tool-middleware.test.d.ts.map +1 -0
- package/dist/src/plan-tool-middleware.test.js +623 -0
- package/dist/src/plan-tool-middleware.test.js.map +1 -0
- package/dist/src/plan-tool-result.d.ts +18 -0
- package/dist/src/plan-tool-result.d.ts.map +1 -0
- package/dist/src/plan-tool-result.js +77 -0
- package/dist/src/plan-tool-result.js.map +1 -0
- package/dist/src/plan-tool-result.test.d.ts +2 -0
- package/dist/src/plan-tool-result.test.d.ts.map +1 -0
- package/dist/src/plan-tool-result.test.js +129 -0
- package/dist/src/plan-tool-result.test.js.map +1 -0
- package/dist/src/plan-ws-registry.d.ts +11 -0
- package/dist/src/plan-ws-registry.d.ts.map +1 -0
- package/dist/src/plan-ws-registry.js +27 -0
- package/dist/src/plan-ws-registry.js.map +1 -0
- package/dist/src/plan-ws-registry.test.d.ts +2 -0
- package/dist/src/plan-ws-registry.test.d.ts.map +1 -0
- package/dist/src/plan-ws-registry.test.js +43 -0
- package/dist/src/plan-ws-registry.test.js.map +1 -0
- package/dist/src/progress-display.d.ts +77 -0
- package/dist/src/progress-display.d.ts.map +1 -0
- package/dist/src/progress-display.js +420 -0
- package/dist/src/progress-display.js.map +1 -0
- package/dist/src/project-path-normalize.d.ts +30 -0
- package/dist/src/project-path-normalize.d.ts.map +1 -0
- package/dist/src/project-path-normalize.js +101 -0
- package/dist/src/project-path-normalize.js.map +1 -0
- package/dist/src/recommended-system-prompt.d.ts +3 -0
- package/dist/src/recommended-system-prompt.d.ts.map +1 -0
- package/dist/src/recommended-system-prompt.js +8 -0
- package/dist/src/recommended-system-prompt.js.map +1 -0
- package/dist/src/register-per-message-model-hook.d.ts +6 -0
- package/dist/src/register-per-message-model-hook.d.ts.map +1 -0
- package/dist/src/register-per-message-model-hook.js +22 -0
- package/dist/src/register-per-message-model-hook.js.map +1 -0
- package/dist/src/resolve-inbound-group-prompt.d.ts +21 -0
- package/dist/src/resolve-inbound-group-prompt.d.ts.map +1 -0
- package/dist/src/resolve-inbound-group-prompt.js +43 -0
- package/dist/src/resolve-inbound-group-prompt.js.map +1 -0
- package/dist/src/resource-file.d.ts +119 -0
- package/dist/src/resource-file.d.ts.map +1 -0
- package/dist/src/resource-file.js +533 -0
- package/dist/src/resource-file.js.map +1 -0
- package/dist/src/resource-file.test.d.ts +2 -0
- package/dist/src/resource-file.test.d.ts.map +1 -0
- package/dist/src/resource-file.test.js +64 -0
- package/dist/src/resource-file.test.js.map +1 -0
- package/dist/src/run-usage-session.d.ts +10 -0
- package/dist/src/run-usage-session.d.ts.map +1 -0
- package/dist/src/run-usage-session.js +29 -0
- package/dist/src/run-usage-session.js.map +1 -0
- package/dist/src/run-usage.d.ts +52 -0
- package/dist/src/run-usage.d.ts.map +1 -0
- package/dist/src/run-usage.js +93 -0
- package/dist/src/run-usage.js.map +1 -0
- package/dist/src/run-usage.test.d.ts +2 -0
- package/dist/src/run-usage.test.d.ts.map +1 -0
- package/dist/src/run-usage.test.js +90 -0
- package/dist/src/run-usage.test.js.map +1 -0
- package/dist/src/send-file-event.d.ts +26 -0
- package/dist/src/send-file-event.d.ts.map +1 -0
- package/dist/src/send-file-event.js +33 -0
- package/dist/src/send-file-event.js.map +1 -0
- package/dist/src/send-file-event.test.d.ts +2 -0
- package/dist/src/send-file-event.test.d.ts.map +1 -0
- package/dist/src/send-file-event.test.js +86 -0
- package/dist/src/send-file-event.test.js.map +1 -0
- package/dist/src/send-file-tool.d.ts +81 -0
- package/dist/src/send-file-tool.d.ts.map +1 -0
- package/dist/src/send-file-tool.js +363 -0
- package/dist/src/send-file-tool.js.map +1 -0
- package/dist/src/send-file-tool.test.d.ts +2 -0
- package/dist/src/send-file-tool.test.d.ts.map +1 -0
- package/dist/src/send-file-tool.test.js +176 -0
- package/dist/src/send-file-tool.test.js.map +1 -0
- package/dist/src/send-group-message-tool.d.ts +17 -0
- package/dist/src/send-group-message-tool.d.ts.map +1 -0
- package/dist/src/send-group-message-tool.js +82 -0
- package/dist/src/send-group-message-tool.js.map +1 -0
- package/dist/src/send-service.d.ts +83 -0
- package/dist/src/send-service.d.ts.map +1 -0
- package/dist/src/send-service.js +324 -0
- package/dist/src/send-service.js.map +1 -0
- package/dist/src/send-service.test.d.ts +2 -0
- package/dist/src/send-service.test.d.ts.map +1 -0
- package/dist/src/send-service.test.js +40 -0
- package/dist/src/send-service.test.js.map +1 -0
- package/dist/src/session/build-project-prompt.test.js +18 -18
- package/dist/src/session-im-context.d.ts +13 -0
- package/dist/src/session-im-context.d.ts.map +1 -0
- package/dist/src/session-im-context.js +45 -0
- package/dist/src/session-im-context.js.map +1 -0
- package/dist/src/subagent-delivery-phase.d.ts +10 -0
- package/dist/src/subagent-delivery-phase.d.ts.map +1 -0
- package/dist/src/subagent-delivery-phase.js +4 -0
- package/dist/src/subagent-delivery-phase.js.map +1 -0
- package/dist/src/subagent-delivery-phase.test.d.ts +2 -0
- package/dist/src/subagent-delivery-phase.test.d.ts.map +1 -0
- package/dist/src/subagent-delivery-phase.test.js +12 -0
- package/dist/src/subagent-delivery-phase.test.js.map +1 -0
- package/dist/src/subagent-monitor.d.ts +32 -0
- package/dist/src/subagent-monitor.d.ts.map +1 -0
- package/dist/src/subagent-monitor.js +370 -0
- package/dist/src/subagent-monitor.js.map +1 -0
- package/dist/src/subagent-monitor.test.d.ts +2 -0
- package/dist/src/subagent-monitor.test.d.ts.map +1 -0
- package/dist/src/subagent-monitor.test.js +214 -0
- package/dist/src/subagent-monitor.test.js.map +1 -0
- package/dist/src/sync-mapping-types.d.ts +220 -0
- package/dist/src/sync-mapping-types.d.ts.map +1 -0
- package/dist/src/sync-mapping-types.js +55 -0
- package/dist/src/sync-mapping-types.js.map +1 -0
- package/dist/src/sync-service-client.d.ts +29 -0
- package/dist/src/sync-service-client.d.ts.map +1 -0
- package/dist/src/sync-service-client.js +72 -0
- package/dist/src/sync-service-client.js.map +1 -0
- package/dist/src/thinking-ws-progress.d.ts +24 -0
- package/dist/src/thinking-ws-progress.d.ts.map +1 -0
- package/dist/src/thinking-ws-progress.js +45 -0
- package/dist/src/thinking-ws-progress.js.map +1 -0
- package/dist/src/thinking-ws-progress.test.d.ts +2 -0
- package/dist/src/thinking-ws-progress.test.d.ts.map +1 -0
- package/dist/src/thinking-ws-progress.test.js +38 -0
- package/dist/src/thinking-ws-progress.test.js.map +1 -0
- package/dist/src/tool-json-result.d.ts +14 -0
- package/dist/src/tool-json-result.d.ts.map +1 -0
- package/dist/src/tool-json-result.js +20 -0
- package/dist/src/tool-json-result.js.map +1 -0
- package/dist/src/turn/turn-agent-event-subscription.d.ts.map +1 -1
- package/dist/src/turn/turn-agent-event-subscription.js +14 -0
- package/dist/src/turn/turn-agent-event-subscription.js.map +1 -1
- package/dist/src/turn-deliver-buffer.d.ts +60 -0
- package/dist/src/turn-deliver-buffer.d.ts.map +1 -0
- package/dist/src/turn-deliver-buffer.js +133 -0
- package/dist/src/turn-deliver-buffer.js.map +1 -0
- package/dist/src/turn-deliver-buffer.test.d.ts +2 -0
- package/dist/src/turn-deliver-buffer.test.d.ts.map +1 -0
- package/dist/src/turn-deliver-buffer.test.js +184 -0
- package/dist/src/turn-deliver-buffer.test.js.map +1 -0
- package/dist/src/types.d.ts +386 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +32 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/user-facing-errors.d.ts +32 -0
- package/dist/src/user-facing-errors.d.ts.map +1 -0
- package/dist/src/user-facing-errors.js +120 -0
- package/dist/src/user-facing-errors.js.map +1 -0
- package/dist/src/user-facing-errors.test.d.ts +2 -0
- package/dist/src/user-facing-errors.test.d.ts.map +1 -0
- package/dist/src/user-facing-errors.test.js +102 -0
- package/dist/src/user-facing-errors.test.js.map +1 -0
- package/dist/src/workspace/nas-volumes.test.js +3 -2
- package/dist/src/workspace/nas-volumes.test.js.map +1 -1
- package/dist/src/ws-inbound-schema.d.ts +14 -0
- package/dist/src/ws-inbound-schema.d.ts.map +1 -0
- package/dist/src/ws-inbound-schema.js +67 -0
- package/dist/src/ws-inbound-schema.js.map +1 -0
- package/dist/src/ws-run-event-unmapped.d.ts +10 -0
- package/dist/src/ws-run-event-unmapped.d.ts.map +1 -0
- package/dist/src/ws-run-event-unmapped.js +16 -0
- package/dist/src/ws-run-event-unmapped.js.map +1 -0
- package/dist/src/ws-run-event-unmapped.test.d.ts +2 -0
- package/dist/src/ws-run-event-unmapped.test.d.ts.map +1 -0
- package/dist/src/ws-run-event-unmapped.test.js +15 -0
- package/dist/src/ws-run-event-unmapped.test.js.map +1 -0
- package/openclaw.plugin.json +30 -30
- package/package.json +83 -83
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XG-IM Channel Plugin — 组装层
|
|
3
|
+
*
|
|
4
|
+
* 配置与解析见 channel-config.ts;入站正文见 inbound-display.ts;
|
|
5
|
+
* @ 后派发见 dispatch-mentioned-reply.ts(入站消息直投 OpenClaw,
|
|
6
|
+
* 忙碌排队/插话由 OpenClaw 原生 messages.queue 处理,见 docs/插件实现逻辑说明.md)。
|
|
7
|
+
* 单账号 WebSocket 连接运行见 account-connection.ts。
|
|
8
|
+
*
|
|
9
|
+
* 账号生命周期由 account-reconciler 管理:Gateway 对 channels.xg_cwork_im 变更不再
|
|
10
|
+
* 重启整通道(index.ts 注册 hotPrefixes,仅提交运行时快照),由 Reconciler 轮询
|
|
11
|
+
* diff 并按账号启停,避免 1 个账号变更导致全部账号 Abort 重连。
|
|
12
|
+
*/
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/core";
|
|
15
|
+
import { getToken } from "./auth.js";
|
|
16
|
+
import { getXgImConfig, isConfigured, XgImConfigSchema } from "./channel-config.js";
|
|
17
|
+
import { toLogger } from "./channel-log.js";
|
|
18
|
+
import { sendReplyDeliverBlock, sendTextMessage } from "./send-service.js";
|
|
19
|
+
import { accountReconciler } from "./account-reconciler.js";
|
|
20
|
+
// ─── 全局 Runtime(在 index.ts 的 register 中注入)────────────────────────────
|
|
21
|
+
let xgImRuntime = null;
|
|
22
|
+
export function setXgImRuntime(rt) {
|
|
23
|
+
xgImRuntime = rt;
|
|
24
|
+
}
|
|
25
|
+
// ─── Channel Plugin 定义 ─────────────────────────────────────────────────────
|
|
26
|
+
export const xgCworkImChannelPlugin = {
|
|
27
|
+
id: "xg_cwork_im",
|
|
28
|
+
meta: {
|
|
29
|
+
id: "xg_cwork_im",
|
|
30
|
+
label: "XG CWork IM",
|
|
31
|
+
selectionLabel: "XG CWork IM (工作说说)",
|
|
32
|
+
docsPath: "/channels/xg_cwork_im",
|
|
33
|
+
blurb: "工作说说 IM 机器人,通过 WebSocket 长连接接收 @ 消息。",
|
|
34
|
+
aliases: ["xg_cwork_im", "im"],
|
|
35
|
+
},
|
|
36
|
+
configSchema: buildChannelConfigSchema(XgImConfigSchema),
|
|
37
|
+
capabilities: {
|
|
38
|
+
chatTypes: ["direct", "group"],
|
|
39
|
+
reactions: false,
|
|
40
|
+
threads: false,
|
|
41
|
+
media: true,
|
|
42
|
+
nativeCommands: false,
|
|
43
|
+
blockStreaming: true,
|
|
44
|
+
},
|
|
45
|
+
config: {
|
|
46
|
+
listAccountIds: (cfg) => {
|
|
47
|
+
try {
|
|
48
|
+
const config = getXgImConfig(cfg);
|
|
49
|
+
const accounts = config.accounts;
|
|
50
|
+
if (accounts) {
|
|
51
|
+
if (!Array.isArray(accounts) && typeof accounts === "object") {
|
|
52
|
+
const keys = Object.keys(accounts).filter((k) => k !== "default");
|
|
53
|
+
return keys;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return isConfigured(cfg) ? ["default"] : [];
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
resolveAccount: (cfg, accountId) => {
|
|
63
|
+
const id = accountId || "default";
|
|
64
|
+
try {
|
|
65
|
+
const config = getXgImConfig(cfg, id);
|
|
66
|
+
return {
|
|
67
|
+
accountId: id,
|
|
68
|
+
config,
|
|
69
|
+
enabled: config.enabled !== false,
|
|
70
|
+
configured: Boolean((config.robotKey ?? config.appKey) && config.baseUrl),
|
|
71
|
+
name: config.name ?? null,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return {
|
|
76
|
+
accountId: id,
|
|
77
|
+
config: {},
|
|
78
|
+
enabled: false,
|
|
79
|
+
configured: false,
|
|
80
|
+
name: null,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
defaultAccountId: () => "default",
|
|
85
|
+
isConfigured: (account) => account.configured,
|
|
86
|
+
describeAccount: (account) => ({
|
|
87
|
+
accountId: account.accountId,
|
|
88
|
+
name: account.config?.name ?? "xg_cwork_im",
|
|
89
|
+
enabled: account.enabled,
|
|
90
|
+
configured: account.configured,
|
|
91
|
+
}),
|
|
92
|
+
},
|
|
93
|
+
groups: {
|
|
94
|
+
resolveRequireMention: (params) => {
|
|
95
|
+
try {
|
|
96
|
+
const config = getXgImConfig(params.cfg, params.accountId);
|
|
97
|
+
return config?.groupPolicy !== "open";
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
outbound: {
|
|
105
|
+
deliveryMode: "direct",
|
|
106
|
+
resolveTarget: (params) => {
|
|
107
|
+
const trimmed = params.to?.trim();
|
|
108
|
+
if (!trimmed) {
|
|
109
|
+
return {
|
|
110
|
+
ok: false,
|
|
111
|
+
error: new Error("XG-IM message requires --to <groupId>"),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return { ok: true, to: trimmed };
|
|
115
|
+
},
|
|
116
|
+
sendText: async (ctx) => {
|
|
117
|
+
const { cfg, to, text, accountId, log: ctxLog } = ctx;
|
|
118
|
+
const log = toLogger(ctxLog);
|
|
119
|
+
const config = getXgImConfig(cfg, accountId);
|
|
120
|
+
const identity = await getToken(config, log);
|
|
121
|
+
await sendTextMessage(config, identity.token, to, text, [], log);
|
|
122
|
+
return {
|
|
123
|
+
channel: "xg_cwork_im",
|
|
124
|
+
messageId: randomUUID(),
|
|
125
|
+
};
|
|
126
|
+
},
|
|
127
|
+
sendMedia: async (ctx) => {
|
|
128
|
+
const { cfg, to, text, mediaUrl, accountId, log: ctxLog } = ctx;
|
|
129
|
+
const log = toLogger(ctxLog);
|
|
130
|
+
const config = getXgImConfig(cfg, accountId);
|
|
131
|
+
const identity = await getToken(config, log);
|
|
132
|
+
if (!mediaUrl?.trim()) {
|
|
133
|
+
await sendTextMessage(config, identity.token, to, text || "", [], log);
|
|
134
|
+
return { channel: "xg_cwork_im", messageId: randomUUID() };
|
|
135
|
+
}
|
|
136
|
+
await sendReplyDeliverBlock(config, identity.token, to, { text: text || "", mediaUrl: mediaUrl.trim() }, [], log, undefined, undefined);
|
|
137
|
+
return {
|
|
138
|
+
channel: "xg_cwork_im",
|
|
139
|
+
messageId: randomUUID(),
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
gateway: {
|
|
144
|
+
startAccount: async (ctx) => {
|
|
145
|
+
await accountReconciler.startAccountLifecycle(ctx);
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XG-IM WebSocket 连接管理模块
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - 建立 wss://<baseUrl>/ws-notify/websocket?accessToken=<token> 长连接
|
|
6
|
+
* - 接收 robotMention / groupMessage 并回调
|
|
7
|
+
* - 流式推送:BEGIN → 进度事件 →(可选 RUN_USAGE)→ FINISHED(无占位 ack;正文走 HTTP)
|
|
8
|
+
* - 指数退避 + 抖动的自动重连机制
|
|
9
|
+
* - 主动发送 WebSocket ping 保活,超时自动重连
|
|
10
|
+
*/
|
|
11
|
+
import type { Log } from "./auth.js";
|
|
12
|
+
import type { ImStreamRunUsageData } from "./run-usage.js";
|
|
13
|
+
import type { WsMessage, XgImConfig } from "./types.js";
|
|
14
|
+
export type OnMessageCallback = (msg: WsMessage) => void;
|
|
15
|
+
/** IM 下发的目录同步映射信令(与聊天消息分流) */
|
|
16
|
+
export type OnSyncMappingCallback = (params: Record<string, unknown>) => void | Promise<void>;
|
|
17
|
+
export declare const OPENCLAW_APPLY_SYNC_MAPPING_CMD = "openclawApplySyncMapping";
|
|
18
|
+
export interface StartWebSocketHooks {
|
|
19
|
+
onSyncMapping?: OnSyncMappingCallback;
|
|
20
|
+
/** 重连次数耗尽且未 stop 时回调(整机不再收 WS 入站) */
|
|
21
|
+
onReconnectExhausted?: (info: {
|
|
22
|
+
maxAttempts: number;
|
|
23
|
+
lastCloseCode?: number;
|
|
24
|
+
lastCloseReason?: string;
|
|
25
|
+
}) => void;
|
|
26
|
+
}
|
|
27
|
+
/** {@link ImStreamClient.start} 参数 */
|
|
28
|
+
export interface ImStreamStartOpts {
|
|
29
|
+
groupId?: string;
|
|
30
|
+
toUserId?: string | null;
|
|
31
|
+
/** 触发本轮的用户入站消息 id(`robotMention.params.msgId`),用于 BEGIN 的 replyToMsgId。 */
|
|
32
|
+
replyToMsgId?: string;
|
|
33
|
+
}
|
|
34
|
+
/** {@link ImStreamClient.end} 参数 */
|
|
35
|
+
export interface ImStreamEndContext {
|
|
36
|
+
groupId?: string;
|
|
37
|
+
replyToMsgId?: string;
|
|
38
|
+
}
|
|
39
|
+
/** 进度类 `params.event`(不经占位 ack;助手正文走 HTTP) */
|
|
40
|
+
export type ImStreamProgressEventName = "TOOL_PHASE" | "PLAN_UPDATE" | "ITEM_UPDATE" | "RUN_EVENT" | "SUBAGENT_STAT" | "PLAN_STAT";
|
|
41
|
+
export interface ImStreamProgressOpts {
|
|
42
|
+
groupId: string;
|
|
43
|
+
replyToMsgId: string;
|
|
44
|
+
event: ImStreamProgressEventName;
|
|
45
|
+
/** 主展示一行 */
|
|
46
|
+
displayText: string;
|
|
47
|
+
/** 可选:命令/路径等细节或输出摘要,默认最长 200 字 */
|
|
48
|
+
summary?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ImStreamSendEventOpts {
|
|
51
|
+
groupId: string;
|
|
52
|
+
replyToMsgId: string;
|
|
53
|
+
event: string;
|
|
54
|
+
data: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 基于 WebSocket 的流式消息客户端(无占位 ack)。
|
|
58
|
+
*
|
|
59
|
+
* - start(): 发送 BEGIN
|
|
60
|
+
* - streamProgress(): 发送 TOOL_PHASE / PLAN_UPDATE / RUN_EVENT 等
|
|
61
|
+
* - streamUsage(): 发送 RUN_USAGE(一轮可选;在 FINISHED 之前)
|
|
62
|
+
* - sendEvent(): 发送自定义事件(如 SUBAGENT_STAT)
|
|
63
|
+
* - end(): 发送 FINISHED
|
|
64
|
+
*/
|
|
65
|
+
export interface ImStreamClient {
|
|
66
|
+
start: (opts: ImStreamStartOpts) => Promise<void>;
|
|
67
|
+
streamProgress: (opts: ImStreamProgressOpts) => Promise<void>;
|
|
68
|
+
streamUsage: (data: ImStreamRunUsageData) => Promise<void>;
|
|
69
|
+
sendEvent: (opts: ImStreamSendEventOpts) => Promise<void>;
|
|
70
|
+
end: (reason: string, ctx?: ImStreamEndContext) => Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 启动 WebSocket 连接并监听消息。
|
|
74
|
+
*
|
|
75
|
+
* @returns 一个 `stop()` 函数,调用后永久断开连接,不再重连。
|
|
76
|
+
*/
|
|
77
|
+
export declare function startWebSocket(config: XgImConfig, token: string, onMessage: OnMessageCallback, log: Log, hooks?: StartWebSocketHooks): {
|
|
78
|
+
stop: () => void;
|
|
79
|
+
streamClient: ImStreamClient;
|
|
80
|
+
isReconnectExhausted: () => boolean;
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGxD,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;AAEzD,8BAA8B;AAC9B,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9F,eAAO,MAAM,+BAA+B,6BAA6B,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAChC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,qCAAqC;IACrC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC5B,KAAK,IAAI,CAAC;CACd;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oCAAoC;AACpC,MAAM,WAAW,kBAAkB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8CAA8C;AAC9C,MAAM,MAAM,yBAAyB,GAAG,YAAY,GAAG,aAAa,GAAG,aAAa,GAAG,WAAW,GAAG,eAAe,GAAG,WAAW,CAAC;AAEnI,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,yBAAyB,CAAC;IACjC,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,cAAc,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,WAAW,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,SAAS,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAuBD;;;;GAIG;AACH,wBAAgB,cAAc,CAC1B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,iBAAiB,EAC5B,GAAG,EAAE,GAAG,EACR,KAAK,CAAC,EAAE,mBAAmB,GAC5B;IAAE,IAAI,EAAE,MAAM,IAAI,CAAC;IAAC,YAAY,EAAE,cAAc,CAAC;IAAC,oBAAoB,EAAE,MAAM,OAAO,CAAA;CAAE,CAyYzF"}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XG-IM WebSocket 连接管理模块
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* - 建立 wss://<baseUrl>/ws-notify/websocket?accessToken=<token> 长连接
|
|
6
|
+
* - 接收 robotMention / groupMessage 并回调
|
|
7
|
+
* - 流式推送:BEGIN → 进度事件 →(可选 RUN_USAGE)→ FINISHED(无占位 ack;正文走 HTTP)
|
|
8
|
+
* - 指数退避 + 抖动的自动重连机制
|
|
9
|
+
* - 主动发送 WebSocket ping 保活,超时自动重连
|
|
10
|
+
*/
|
|
11
|
+
import WebSocket from "ws";
|
|
12
|
+
import { parseWsInboundMessage } from "./ws-inbound-schema.js";
|
|
13
|
+
export const OPENCLAW_APPLY_SYNC_MAPPING_CMD = "openclawApplySyncMapping";
|
|
14
|
+
/** 心跳间隔(ms):每 5 秒发一次 ping,防止连接被后台剔除(ws-notify 空闲超时约 10 秒) */
|
|
15
|
+
const PING_INTERVAL_MS = 5_000;
|
|
16
|
+
/** 心跳日志间隔(ms):每 10 分钟输出一次 info 日志,避免刷屏 */
|
|
17
|
+
const PING_LOG_INTERVAL_MS = 600_000;
|
|
18
|
+
/** 计算指数退避延迟(带随机抖动) */
|
|
19
|
+
function calcDelay(attempt, initial, max, jitter) {
|
|
20
|
+
const base = Math.min(initial * 2 ** attempt, max);
|
|
21
|
+
const jitterMs = base * jitter * Math.random();
|
|
22
|
+
return Math.round(base + jitterMs);
|
|
23
|
+
}
|
|
24
|
+
/** 进度 `data.summary` 最大长度(与产品约定一致) */
|
|
25
|
+
const WS_PROGRESS_SUMMARY_MAX = 200;
|
|
26
|
+
/**
|
|
27
|
+
* 启动 WebSocket 连接并监听消息。
|
|
28
|
+
*
|
|
29
|
+
* @returns 一个 `stop()` 函数,调用后永久断开连接,不再重连。
|
|
30
|
+
*/
|
|
31
|
+
export function startWebSocket(config, token, onMessage, log, hooks) {
|
|
32
|
+
const maxAttempts = config.maxConnectionAttempts ?? 200;
|
|
33
|
+
const initialDelay = config.initialReconnectDelay ?? 1_000;
|
|
34
|
+
const maxDelay = config.maxReconnectDelay ?? 60_000;
|
|
35
|
+
const jitter = config.reconnectJitter ?? 0.3;
|
|
36
|
+
const logPrefix = `[cwork_im:${config.agentId || "main"}]`;
|
|
37
|
+
// 将 baseUrl 的 http/https 协议替换为 ws/wss,并根据业务规则处理独立域名
|
|
38
|
+
let wsBase = config.wsBaseUrl;
|
|
39
|
+
if (!wsBase) {
|
|
40
|
+
// 自动映射逻辑:
|
|
41
|
+
// https://test.xgjktech.com.cn -> wss://websocket.xgjktech.com.cn
|
|
42
|
+
// https://xg.mediportal.com.cn -> wss://websocket.mediportal.com.cn
|
|
43
|
+
wsBase = config.baseUrl
|
|
44
|
+
.replace(/^http/, "ws");
|
|
45
|
+
}
|
|
46
|
+
const wsUrl = `${wsBase}/ws-notify/websocket?accessToken=${encodeURIComponent(token)}`;
|
|
47
|
+
let stopped = false;
|
|
48
|
+
let ws = null;
|
|
49
|
+
let reconnectExhausted = false;
|
|
50
|
+
let lastCloseCode;
|
|
51
|
+
let lastCloseReason;
|
|
52
|
+
let reconnectTimer = null;
|
|
53
|
+
let pingTimer = null;
|
|
54
|
+
let attempt = 0;
|
|
55
|
+
/** 清除心跳定时器 */
|
|
56
|
+
function clearHeartbeat() {
|
|
57
|
+
if (pingTimer !== null) {
|
|
58
|
+
clearInterval(pingTimer);
|
|
59
|
+
pingTimer = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** 启动心跳:每 20s 发一次 ping,info 日志每 10 分钟输出一次 */
|
|
63
|
+
function startHeartbeat(socket) {
|
|
64
|
+
clearHeartbeat();
|
|
65
|
+
let lastLogTime = 0;
|
|
66
|
+
pingTimer = setInterval(() => {
|
|
67
|
+
if (socket.readyState !== WebSocket.OPEN) {
|
|
68
|
+
clearHeartbeat();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
const shouldLog = now - lastLogTime >= PING_LOG_INTERVAL_MS;
|
|
73
|
+
if (shouldLog) {
|
|
74
|
+
lastLogTime = now;
|
|
75
|
+
log.info(`${logPrefix} ♥ Ping sent at ${new Date().toISOString()}`);
|
|
76
|
+
}
|
|
77
|
+
// 发送标准 WebSocket ping 帧
|
|
78
|
+
socket.ping((err) => {
|
|
79
|
+
if (err) {
|
|
80
|
+
log.error(`${logPrefix} Ping frame error: ${err.message}`);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// 发送业务层文本 ping(更新服务端活跃时间)
|
|
84
|
+
socket.send("ping");
|
|
85
|
+
}, PING_INTERVAL_MS);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 确保当前存在可用的 WebSocket 连接。
|
|
89
|
+
* 若不存在或未处于 OPEN 状态,则抛出错误,由上层决定是否回退为非流式模式。
|
|
90
|
+
*/
|
|
91
|
+
function ensureSocketReady() {
|
|
92
|
+
if (!ws || ws.readyState !== WebSocket.OPEN) {
|
|
93
|
+
throw new Error(`${logPrefix} WebSocket is not ready for sending stream message`);
|
|
94
|
+
}
|
|
95
|
+
return ws;
|
|
96
|
+
}
|
|
97
|
+
function connect() {
|
|
98
|
+
if (stopped)
|
|
99
|
+
return;
|
|
100
|
+
log.info(`${logPrefix} Connecting to WebSocket (attempt ${attempt + 1})...`);
|
|
101
|
+
ws = new WebSocket(wsUrl);
|
|
102
|
+
ws.on("open", () => {
|
|
103
|
+
attempt = 0; // 连接成功后重置重试计数
|
|
104
|
+
log.info(`${logPrefix} WebSocket connected successfully.`);
|
|
105
|
+
startHeartbeat(ws);
|
|
106
|
+
});
|
|
107
|
+
// 处理消息
|
|
108
|
+
ws.on("message", (raw) => {
|
|
109
|
+
const rawString = raw.toString();
|
|
110
|
+
if (rawString === "pong" || rawString === "ping") {
|
|
111
|
+
if (config.debug)
|
|
112
|
+
log.debug?.(`${logPrefix} Ignored plain text ${rawString}`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
let parsed;
|
|
116
|
+
try {
|
|
117
|
+
parsed = JSON.parse(rawString);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// 如果不是 JSON,说明是心跳或者其他内容,忽略即可
|
|
121
|
+
// 如果开启 debug 还是可以打印日志
|
|
122
|
+
if (config.debug) {
|
|
123
|
+
log.debug?.(`${logPrefix} Received non-JSON message: ${rawString.slice(0, 50)}`);
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
log.info(`${logPrefix} ⇐ WS message received: cmd=${parsed.cmd}`);
|
|
128
|
+
// 历史占位协议的 ack;当前插件已不发 START,收到也忽略
|
|
129
|
+
if (parsed.cmd === "im_stream_msg_ack") {
|
|
130
|
+
if (config.debug) {
|
|
131
|
+
log.debug?.(`${logPrefix} ⇐ im_stream_msg_ack (ignored)`);
|
|
132
|
+
}
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (parsed.cmd === OPENCLAW_APPLY_SYNC_MAPPING_CMD &&
|
|
136
|
+
parsed.params &&
|
|
137
|
+
typeof parsed.params === "object") {
|
|
138
|
+
log.info(`${logPrefix} ⇐ ${OPENCLAW_APPLY_SYNC_MAPPING_CMD} mappingId=${parsed.params.mappingId ?? "?"}`);
|
|
139
|
+
if (hooks?.onSyncMapping) {
|
|
140
|
+
Promise.resolve(hooks.onSyncMapping(parsed.params)).catch((err) => {
|
|
141
|
+
log.error(`${logPrefix} onSyncMapping error: ${String(err)}`);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
else if (config.debug) {
|
|
145
|
+
log.debug?.(`${logPrefix} ${OPENCLAW_APPLY_SYNC_MAPPING_CMD} ignored (no handler)`);
|
|
146
|
+
}
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// 处理 robotMention / groupMessage(入站结构校验后再派发)
|
|
150
|
+
if (parsed.cmd === "robotMention" || parsed.cmd === "groupMessage") {
|
|
151
|
+
const inbound = parseWsInboundMessage(parsed);
|
|
152
|
+
if (!inbound.ok) {
|
|
153
|
+
log.warn?.(`${logPrefix} Ignored invalid inbound WS message (${parsed.cmd}): ${inbound.error}`);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const msg = inbound.message;
|
|
157
|
+
if (msg.cmd === "robotMention") {
|
|
158
|
+
const chatType = typeof msg.params.chatType === "string" ? msg.params.chatType : "(unset)";
|
|
159
|
+
log.info(`${logPrefix} 📨 robotMention received: groupId=${msg.params.groupId} msgId=${msg.params.msgId} chatType=${chatType}`);
|
|
160
|
+
}
|
|
161
|
+
Promise.resolve(onMessage(msg)).catch((err) => {
|
|
162
|
+
log.error(`${logPrefix} onMessage async error: ${String(err)}`);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
ws.on("close", (code, reason) => {
|
|
167
|
+
clearHeartbeat();
|
|
168
|
+
if (stopped) {
|
|
169
|
+
log.info(`${logPrefix} WebSocket closed (intentional stop).`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const reasonStr = (reason && reason.length > 0) ? reason.toString() : "(none)";
|
|
173
|
+
lastCloseCode = code;
|
|
174
|
+
lastCloseReason = reasonStr;
|
|
175
|
+
// 置 null 确保 ensureSocketReady 能正确感知连接已断
|
|
176
|
+
ws = null;
|
|
177
|
+
log.info(`${logPrefix} [WARN] WebSocket closed unexpectedly: code=${code}, reason=${reasonStr}. Scheduling reconnect...`);
|
|
178
|
+
scheduleReconnect();
|
|
179
|
+
});
|
|
180
|
+
ws.on("error", (err) => {
|
|
181
|
+
if (stopped)
|
|
182
|
+
return;
|
|
183
|
+
log.error(`${logPrefix} WebSocket error: ${err.message}`);
|
|
184
|
+
// 关闭后会触发 close 事件,由 close 处理重连
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function scheduleReconnect() {
|
|
188
|
+
if (stopped)
|
|
189
|
+
return;
|
|
190
|
+
if (attempt >= maxAttempts) {
|
|
191
|
+
reconnectExhausted = true;
|
|
192
|
+
log.error(`${logPrefix} [cwork_im:ws] reconnect_exhausted=true max_attempts=${maxAttempts} ` +
|
|
193
|
+
`last_close_code=${lastCloseCode ?? "unknown"} ` +
|
|
194
|
+
`last_close_reason=${JSON.stringify(lastCloseReason ?? "(none)")} ` +
|
|
195
|
+
`(WebSocket inbound stopped until gateway restart or manual reconnect)`);
|
|
196
|
+
hooks?.onReconnectExhausted?.({
|
|
197
|
+
maxAttempts,
|
|
198
|
+
lastCloseCode,
|
|
199
|
+
lastCloseReason,
|
|
200
|
+
});
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const delay = calcDelay(attempt, initialDelay, maxDelay, jitter);
|
|
204
|
+
attempt += 1;
|
|
205
|
+
log.info(`${logPrefix} Reconnecting in ${delay}ms (attempt ${attempt}/${maxAttempts})...`);
|
|
206
|
+
reconnectTimer = setTimeout(() => {
|
|
207
|
+
reconnectTimer = null;
|
|
208
|
+
connect();
|
|
209
|
+
}, delay);
|
|
210
|
+
}
|
|
211
|
+
// 首次连接
|
|
212
|
+
connect();
|
|
213
|
+
const streamClient = {
|
|
214
|
+
async start(opts) {
|
|
215
|
+
const gid = opts.groupId?.trim();
|
|
216
|
+
const anchor = opts.replyToMsgId?.trim();
|
|
217
|
+
if (!gid || !anchor)
|
|
218
|
+
return;
|
|
219
|
+
const socket = ensureSocketReady();
|
|
220
|
+
const payload = {
|
|
221
|
+
cmd: "im_stream_msg",
|
|
222
|
+
params: {
|
|
223
|
+
event: "BEGIN",
|
|
224
|
+
data: {
|
|
225
|
+
groupId: gid,
|
|
226
|
+
replyToMsgId: anchor,
|
|
227
|
+
toUserId: opts.toUserId ?? null,
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
log.info(`${logPrefix} ⇒ WS BEGIN stream: groupId=${gid} replyToMsgId=${anchor.length <= 40 ? anchor : `${anchor.slice(0, 20)}…(len=${anchor.length})`}`);
|
|
232
|
+
await new Promise((resolve, reject) => {
|
|
233
|
+
socket.send(JSON.stringify(payload), (err) => {
|
|
234
|
+
if (err)
|
|
235
|
+
reject(err);
|
|
236
|
+
else
|
|
237
|
+
resolve();
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
async streamProgress(opts) {
|
|
242
|
+
const gid = opts.groupId?.trim();
|
|
243
|
+
const anchor = opts.replyToMsgId?.trim();
|
|
244
|
+
const displayText = opts.displayText?.trim();
|
|
245
|
+
if (!gid || !anchor || !displayText)
|
|
246
|
+
return;
|
|
247
|
+
const data = { groupId: gid, replyToMsgId: anchor, displayText };
|
|
248
|
+
const rawSum = opts.summary?.trim();
|
|
249
|
+
if (rawSum) {
|
|
250
|
+
data.summary =
|
|
251
|
+
rawSum.length > WS_PROGRESS_SUMMARY_MAX
|
|
252
|
+
? `${rawSum.slice(0, WS_PROGRESS_SUMMARY_MAX - 1)}…`
|
|
253
|
+
: rawSum;
|
|
254
|
+
}
|
|
255
|
+
const payload = {
|
|
256
|
+
cmd: "im_stream_msg",
|
|
257
|
+
params: {
|
|
258
|
+
event: opts.event,
|
|
259
|
+
data,
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
const socket = ensureSocketReady();
|
|
263
|
+
if (config.debug) {
|
|
264
|
+
log.debug?.(`${logPrefix} ⇒ WS ${opts.event}: ${displayText.length > 96 ? `${displayText.slice(0, 93)}…` : displayText}`);
|
|
265
|
+
}
|
|
266
|
+
else if (opts.event === "TOOL_PHASE") {
|
|
267
|
+
log.info(`${logPrefix} ⇒ WS TOOL_PHASE: ${displayText.length > 80 ? `${displayText.slice(0, 77)}…` : displayText}`);
|
|
268
|
+
}
|
|
269
|
+
await new Promise((resolve, reject) => {
|
|
270
|
+
socket.send(JSON.stringify(payload), (err) => {
|
|
271
|
+
if (err)
|
|
272
|
+
reject(err);
|
|
273
|
+
else
|
|
274
|
+
resolve();
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
},
|
|
278
|
+
async streamUsage(data) {
|
|
279
|
+
const gid = data.groupId?.trim();
|
|
280
|
+
const anchor = data.replyToMsgId?.trim();
|
|
281
|
+
if (!gid || !anchor)
|
|
282
|
+
return;
|
|
283
|
+
const socket = ensureSocketReady();
|
|
284
|
+
const usage = data.usage;
|
|
285
|
+
const payload = {
|
|
286
|
+
cmd: "im_stream_msg",
|
|
287
|
+
params: {
|
|
288
|
+
event: "RUN_USAGE",
|
|
289
|
+
data: {
|
|
290
|
+
groupId: gid,
|
|
291
|
+
replyToMsgId: anchor,
|
|
292
|
+
usage,
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
};
|
|
296
|
+
log.info(`${logPrefix} ⇒ WS RUN_USAGE: groupId=${gid} ` +
|
|
297
|
+
`modelRef=${usage.modelRef ?? "(none)"} ` +
|
|
298
|
+
`in=${usage.inputTokens ?? "?"} out=${usage.outputTokens ?? "?"} ` +
|
|
299
|
+
`source=${usage.source}`);
|
|
300
|
+
await new Promise((resolve, reject) => {
|
|
301
|
+
socket.send(JSON.stringify(payload), (err) => {
|
|
302
|
+
if (err)
|
|
303
|
+
reject(err);
|
|
304
|
+
else
|
|
305
|
+
resolve();
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
},
|
|
309
|
+
async sendEvent(opts) {
|
|
310
|
+
const gid = opts.groupId?.trim();
|
|
311
|
+
const anchor = opts.replyToMsgId?.trim();
|
|
312
|
+
if (!gid || !anchor)
|
|
313
|
+
return;
|
|
314
|
+
const socket = ensureSocketReady();
|
|
315
|
+
const payload = {
|
|
316
|
+
cmd: "im_stream_msg",
|
|
317
|
+
params: {
|
|
318
|
+
event: opts.event,
|
|
319
|
+
data: {
|
|
320
|
+
groupId: gid,
|
|
321
|
+
replyToMsgId: anchor,
|
|
322
|
+
...opts.data,
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
if (config.debug) {
|
|
327
|
+
log.debug?.(`${logPrefix} ⇒ WS ${opts.event} event sent`);
|
|
328
|
+
}
|
|
329
|
+
await new Promise((resolve, reject) => {
|
|
330
|
+
socket.send(JSON.stringify(payload), (err) => {
|
|
331
|
+
if (err)
|
|
332
|
+
reject(err);
|
|
333
|
+
else
|
|
334
|
+
resolve();
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
},
|
|
338
|
+
async end(reason, ctx) {
|
|
339
|
+
const gid = ctx?.groupId?.trim();
|
|
340
|
+
const anchor = ctx?.replyToMsgId?.trim();
|
|
341
|
+
if (!gid || !anchor)
|
|
342
|
+
return;
|
|
343
|
+
const socket = ensureSocketReady();
|
|
344
|
+
const payload = {
|
|
345
|
+
cmd: "im_stream_msg",
|
|
346
|
+
params: {
|
|
347
|
+
event: "FINISHED",
|
|
348
|
+
data: {
|
|
349
|
+
groupId: gid,
|
|
350
|
+
replyToMsgId: anchor,
|
|
351
|
+
reason,
|
|
352
|
+
},
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
log.info(`${logPrefix} ⇒ WS FINISHED stream: groupId=${gid} replyToMsgId=${anchor.length <= 40 ? anchor : `${anchor.slice(0, 20)}…(len=${anchor.length})`} reason=${reason}`);
|
|
356
|
+
await new Promise((resolve, reject) => {
|
|
357
|
+
socket.send(JSON.stringify(payload), (err) => {
|
|
358
|
+
if (err)
|
|
359
|
+
reject(err);
|
|
360
|
+
else
|
|
361
|
+
resolve();
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
},
|
|
365
|
+
};
|
|
366
|
+
return {
|
|
367
|
+
stop() {
|
|
368
|
+
if (stopped)
|
|
369
|
+
return;
|
|
370
|
+
stopped = true;
|
|
371
|
+
log.info(`${logPrefix} Stopping WebSocket connection...`);
|
|
372
|
+
clearHeartbeat();
|
|
373
|
+
if (reconnectTimer !== null) {
|
|
374
|
+
clearTimeout(reconnectTimer);
|
|
375
|
+
reconnectTimer = null;
|
|
376
|
+
}
|
|
377
|
+
if (ws && ws.readyState !== WebSocket.CLOSED) {
|
|
378
|
+
ws.close(1000, "Plugin stopped");
|
|
379
|
+
}
|
|
380
|
+
ws = null;
|
|
381
|
+
},
|
|
382
|
+
streamClient,
|
|
383
|
+
isReconnectExhausted: () => reconnectExhausted,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/connection.ts"],"names":[],"mappings":"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"}
|