@a1hvdy/cc-openclaw 0.26.4 β 0.26.6
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/src/channels/adapter.js +0 -1
- package/dist/src/channels/telegram-mirror/askuser.js +16 -10
- package/dist/src/channels/telegram-mirror/burst-accumulator.js +0 -1
- package/dist/src/channels/telegram-mirror/callback-mapping.js +0 -1
- package/dist/src/channels/telegram-mirror/card-renderer.js +63 -21
- package/dist/src/channels/telegram-mirror/card-state.js +0 -1
- package/dist/src/channels/telegram-mirror/commands.js +0 -1
- package/dist/src/channels/telegram-mirror/compose-buffer.js +0 -1
- package/dist/src/channels/telegram-mirror/cost-views.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/callback-data-overflow.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/gateway-down.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/in-flight-conflict.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/index.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/model-5xx.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/network-blip.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/pool-exhausted-fallback.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/rate-limit.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/returning-after-24h.js +0 -1
- package/dist/src/channels/telegram-mirror/failure/types.js +0 -1
- package/dist/src/channels/telegram-mirror/inbound-handler.js +0 -1
- package/dist/src/channels/telegram-mirror/index.js +0 -1
- package/dist/src/channels/telegram-mirror/plan-attachment.js +0 -1
- package/dist/src/channels/telegram-mirror/quota-reader.js +0 -1
- package/dist/src/channels/telegram-mirror/sessions-keyboard.js +0 -1
- package/dist/src/channels/telegram-mirror/soak-log.js +0 -1
- package/dist/src/channels/telegram-mirror/state-machine.js +21 -2
- package/dist/src/channels/telegram-mirror/status-line.js +0 -1
- package/dist/src/channels/telegram-mirror/sync-commands.js +0 -1
- package/dist/src/channels/telegram-mirror/threshold-watcher.js +0 -1
- package/dist/src/channels/telegram-mirror/turn-bridge.js +21 -2
- package/dist/src/cli/checks/bridge-wiring.js +0 -1
- package/dist/src/cli/checks/config-schema.js +0 -1
- package/dist/src/cli/checks/critical-openclaw-json-keys.js +0 -1
- package/dist/src/cli/checks/install-path.js +0 -1
- package/dist/src/cli/checks/patch-scaffold.js +0 -1
- package/dist/src/cli/doctor.js +0 -1
- package/dist/src/cli/index.js +0 -1
- package/dist/src/cli/migrate.js +0 -1
- package/dist/src/command-router/cc-handler.js +0 -1
- package/dist/src/command-router/index.js +0 -1
- package/dist/src/command-router/launch-policy.js +0 -1
- package/dist/src/command-router/resume-policy.js +0 -1
- package/dist/src/command-router/turn-formatter.js +0 -1
- package/dist/src/config/drift-detector.js +0 -1
- package/dist/src/config/loader.js +0 -1
- package/dist/src/config/schema.js +0 -1
- package/dist/src/constants.js +0 -1
- package/dist/src/council/build-agent-prompt.js +0 -1
- package/dist/src/council/cleanup-worktrees.js +0 -1
- package/dist/src/council/consensus.js +0 -1
- package/dist/src/council/council.js +0 -1
- package/dist/src/council/index.js +0 -1
- package/dist/src/council/system-prompt.js +0 -1
- package/dist/src/council/write-worktree-claude-md.js +0 -1
- package/dist/src/engines/base-oneshot-session.js +0 -1
- package/dist/src/engines/heartbeat-guard.js +0 -1
- package/dist/src/engines/index.js +0 -1
- package/dist/src/engines/persistent-codex-session.js +0 -1
- package/dist/src/engines/persistent-cursor-session.js +0 -1
- package/dist/src/engines/persistent-custom-session.js +0 -1
- package/dist/src/engines/persistent-gemini-session.js +0 -1
- package/dist/src/engines/persistent-session.js +30 -1
- package/dist/src/engines/resolve-bin.js +0 -1
- package/dist/src/engines/subprocess-pool.js +0 -1
- package/dist/src/health/handler.js +0 -1
- package/dist/src/health/index.js +0 -1
- package/dist/src/health/metrics.js +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/lib/auto-recovery.js +0 -1
- package/dist/src/lib/cache-parity.js +0 -1
- package/dist/src/lib/circuit-breaker.js +0 -1
- package/dist/src/lib/config-service.js +0 -1
- package/dist/src/lib/config.js +0 -1
- package/dist/src/lib/cost-rollup.js +0 -1
- package/dist/src/lib/debounce.js +0 -1
- package/dist/src/lib/debug-tap.js +0 -1
- package/dist/src/lib/domain-error.js +0 -1
- package/dist/src/lib/drift-detector.js +0 -1
- package/dist/src/lib/env-overrides.js +0 -1
- package/dist/src/lib/error-formatter.js +0 -1
- package/dist/src/lib/error-renderer.js +0 -1
- package/dist/src/lib/heartbeat-config.js +0 -1
- package/dist/src/lib/heartbeat-workaround.js +0 -1
- package/dist/src/lib/http-agent.js +0 -1
- package/dist/src/lib/index.js +0 -1
- package/dist/src/lib/json-array.js +0 -1
- package/dist/src/lib/markdown-to-mdv2.js +0 -1
- package/dist/src/lib/markdown-v2.js +0 -1
- package/dist/src/lib/perf/async-compact.js +0 -1
- package/dist/src/lib/perf/direct-sdk.js +0 -1
- package/dist/src/lib/perf/haiku-route.js +0 -1
- package/dist/src/lib/perf/predictive-continuation.js +0 -1
- package/dist/src/lib/perf/read-batch.js +0 -1
- package/dist/src/lib/perf/skill-list-collapse.js +0 -1
- package/dist/src/lib/perf/speculative-bubble.js +0 -1
- package/dist/src/lib/perf/typing-prefetch.js +0 -1
- package/dist/src/lib/register-guard.js +0 -1
- package/dist/src/lib/req-shape-log.js +0 -1
- package/dist/src/lib/safe-upstream-probes.js +0 -1
- package/dist/src/lib/session-registry.js +0 -1
- package/dist/src/lib/spawn-async.js +0 -1
- package/dist/src/lib/stale-pid-files.js +0 -1
- package/dist/src/lib/status-tee-reader.js +0 -1
- package/dist/src/lib/sysprompt-strip.js +0 -1
- package/dist/src/lib/telegram-bot-api.js +0 -1
- package/dist/src/lib/telemetry.js +0 -1
- package/dist/src/lib/test-mode.js +0 -1
- package/dist/src/lib/trajectory.js +0 -1
- package/dist/src/lib/vendor-paths.js +0 -1
- package/dist/src/lifecycle/boot.js +0 -1
- package/dist/src/lifecycle/patch-manifest.js +0 -1
- package/dist/src/lifecycle/phase-import-upstream.js +0 -1
- package/dist/src/lifecycle/phase-install-patches.js +0 -1
- package/dist/src/lifecycle/phase-schedule-jobs.js +0 -1
- package/dist/src/lifecycle/phase-start-server.js +0 -1
- package/dist/src/lifecycle/phase-validate-config.js +0 -1
- package/dist/src/lifecycle/phase-validate-upstream.js +0 -1
- package/dist/src/lifecycle/phase-wire-handlers.js +0 -1
- package/dist/src/lifecycle/safe-restart.js +0 -1
- package/dist/src/logger.js +0 -1
- package/dist/src/mcp/bridge.js +0 -1
- package/dist/src/mcp/index.js +0 -1
- package/dist/src/models.js +0 -1
- package/dist/src/observability/event-bus.js +0 -1
- package/dist/src/observability/get-event-bus.js +0 -1
- package/dist/src/observability/observability-service.js +0 -1
- package/dist/src/observability/perf-telemetry.js +0 -1
- package/dist/src/observability/subscribers/metrics.js +0 -1
- package/dist/src/observability/subscribers/session-capture.js +0 -1
- package/dist/src/openai-compat/bridges/allowlist.js +0 -1
- package/dist/src/openai-compat/bridges/factory.js +0 -1
- package/dist/src/openai-compat/bridges/media-bridge.js +0 -1
- package/dist/src/openai-compat/bridges/openclaw-api-shim.js +0 -1
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js +0 -1
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js +0 -1
- package/dist/src/openai-compat/bridges/tts-media-bridge.js +0 -1
- package/dist/src/openai-compat/cli-stream-parser.js +0 -1
- package/dist/src/openai-compat/index.js +0 -1
- package/dist/src/openai-compat/message-extractor.js +0 -1
- package/dist/src/openai-compat/mode-flags.js +0 -1
- package/dist/src/openai-compat/non-streaming-handler.js +4 -2
- package/dist/src/openai-compat/openai-chunk-types.js +0 -1
- package/dist/src/openai-compat/openai-compat.js +0 -1
- package/dist/src/openai-compat/openai-types.js +0 -1
- package/dist/src/openai-compat/parse-route-body.js +0 -1
- package/dist/src/openai-compat/prompts.js +0 -1
- package/dist/src/openai-compat/response-formatter.js +0 -1
- package/dist/src/openai-compat/session-key-resolver.js +0 -1
- package/dist/src/openai-compat/skill-resolver.js +0 -1
- package/dist/src/openai-compat/sse-translator.js +0 -1
- package/dist/src/openai-compat/status-reporter.js +0 -1
- package/dist/src/openai-compat/streaming-handler.js +6 -2
- package/dist/src/openai-compat/tool-calls-parser.js +0 -1
- package/dist/src/openai-compat/tool-results-serializer.js +0 -1
- package/dist/src/openai-compat/tts-rule.js +0 -1
- package/dist/src/openai-compat/voice-recovery.js +0 -1
- package/dist/src/patches/cache-parity-registry.js +0 -1
- package/dist/src/patches/claude-md-injection.js +0 -1
- package/dist/src/patches/cwd-redirect.js +0 -1
- package/dist/src/patches/embedded-server-route.js +0 -1
- package/dist/src/patches/pricing-overrides.js +0 -1
- package/dist/src/patches/resume-registry-restore.js +0 -1
- package/dist/src/patches/session-pid-tracking.js +0 -1
- package/dist/src/patches/sysprompt-strip.js +0 -1
- package/dist/src/patches/tools-restoration.js +0 -1
- package/dist/src/persistence/migration-v0.js +0 -1
- package/dist/src/persistence/session-registry.js +0 -1
- package/dist/src/persistence/snapshot.js +0 -1
- package/dist/src/persistence/wal.js +0 -1
- package/dist/src/proxy/anthropic-adapter.js +0 -1
- package/dist/src/proxy/handler.js +0 -1
- package/dist/src/proxy/index.js +0 -1
- package/dist/src/proxy/schema-cleaner.js +0 -1
- package/dist/src/proxy/thought-cache.js +0 -1
- package/dist/src/session/embedded-server.js +0 -1
- package/dist/src/session/inbox-manager.js +0 -1
- package/dist/src/session/index.js +0 -1
- package/dist/src/session/persisted-sessions.js +0 -1
- package/dist/src/session/session-manager.js +0 -1
- package/dist/src/session/watchdogs.js +0 -1
- package/dist/src/session-bootstrap/boot-self-heal.js +0 -1
- package/dist/src/session-bootstrap/cwd-patch.js +0 -1
- package/dist/src/session-bootstrap/index.js +0 -1
- package/dist/src/session-bootstrap/resume-registry.js +0 -1
- package/dist/src/session-bootstrap/session-hygiene.js +0 -1
- package/dist/src/session-bootstrap/sysprompt-strip.js +0 -1
- package/dist/src/session-bootstrap/think-conflict-resolver.js +0 -1
- package/dist/src/types/index.js +0 -1
- package/dist/src/types/route.js +0 -1
- package/dist/src/types/runtime-config.js +0 -1
- package/dist/src/types/session.js +0 -1
- package/dist/src/types/sse.js +0 -1
- package/dist/src/types/tool-bridge.js +0 -1
- package/dist/src/types/upstream.js +0 -1
- package/dist/src/types.js +0 -1
- package/dist/src/validation.js +0 -1
- package/package.json +1 -1
- package/dist/src/channels/adapter.js.map +0 -1
- package/dist/src/channels/telegram/card-renderer.d.ts +0 -80
- package/dist/src/channels/telegram/card-renderer.js +0 -169
- package/dist/src/channels/telegram/card-renderer.js.map +0 -1
- package/dist/src/channels/telegram/completion-summary.d.ts +0 -21
- package/dist/src/channels/telegram/completion-summary.js +0 -218
- package/dist/src/channels/telegram/completion-summary.js.map +0 -1
- package/dist/src/channels/telegram/edit-cadence.d.ts +0 -37
- package/dist/src/channels/telegram/edit-cadence.js +0 -50
- package/dist/src/channels/telegram/edit-cadence.js.map +0 -1
- package/dist/src/channels/telegram/error-renderer.d.ts +0 -29
- package/dist/src/channels/telegram/error-renderer.js +0 -133
- package/dist/src/channels/telegram/error-renderer.js.map +0 -1
- package/dist/src/channels/telegram/event-reducer.d.ts +0 -33
- package/dist/src/channels/telegram/event-reducer.js +0 -647
- package/dist/src/channels/telegram/event-reducer.js.map +0 -1
- package/dist/src/channels/telegram/format-helpers.d.ts +0 -20
- package/dist/src/channels/telegram/format-helpers.js +0 -34
- package/dist/src/channels/telegram/format-helpers.js.map +0 -1
- package/dist/src/channels/telegram/index.d.ts +0 -13
- package/dist/src/channels/telegram/index.js +0 -14
- package/dist/src/channels/telegram/index.js.map +0 -1
- package/dist/src/channels/telegram/injector.d.ts +0 -53
- package/dist/src/channels/telegram/injector.js +0 -271
- package/dist/src/channels/telegram/injector.js.map +0 -1
- package/dist/src/channels/telegram/insight-formatter.d.ts +0 -36
- package/dist/src/channels/telegram/insight-formatter.js +0 -36
- package/dist/src/channels/telegram/insight-formatter.js.map +0 -1
- package/dist/src/channels/telegram/live-card.d.ts +0 -185
- package/dist/src/channels/telegram/live-card.js +0 -868
- package/dist/src/channels/telegram/live-card.js.map +0 -1
- package/dist/src/channels/telegram/logger.d.ts +0 -10
- package/dist/src/channels/telegram/logger.js +0 -13
- package/dist/src/channels/telegram/logger.js.map +0 -1
- package/dist/src/channels/telegram/result-preview.d.ts +0 -12
- package/dist/src/channels/telegram/result-preview.js +0 -48
- package/dist/src/channels/telegram/result-preview.js.map +0 -1
- package/dist/src/channels/telegram/speculative-bubble.d.ts +0 -33
- package/dist/src/channels/telegram/speculative-bubble.js +0 -42
- package/dist/src/channels/telegram/speculative-bubble.js.map +0 -1
- package/dist/src/channels/telegram/state-machine.d.ts +0 -22
- package/dist/src/channels/telegram/state-machine.js +0 -72
- package/dist/src/channels/telegram/state-machine.js.map +0 -1
- package/dist/src/channels/telegram/throttle-controller.d.ts +0 -88
- package/dist/src/channels/telegram/throttle-controller.js +0 -203
- package/dist/src/channels/telegram/throttle-controller.js.map +0 -1
- package/dist/src/channels/telegram/tool-tracker.d.ts +0 -149
- package/dist/src/channels/telegram/tool-tracker.js +0 -578
- package/dist/src/channels/telegram/tool-tracker.js.map +0 -1
- package/dist/src/channels/telegram-mirror/askuser.js.map +0 -1
- package/dist/src/channels/telegram-mirror/burst-accumulator.js.map +0 -1
- package/dist/src/channels/telegram-mirror/callback-mapping.js.map +0 -1
- package/dist/src/channels/telegram-mirror/card-renderer.js.map +0 -1
- package/dist/src/channels/telegram-mirror/card-state.js.map +0 -1
- package/dist/src/channels/telegram-mirror/commands.js.map +0 -1
- package/dist/src/channels/telegram-mirror/compose-buffer.js.map +0 -1
- package/dist/src/channels/telegram-mirror/cost-views.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/callback-data-overflow.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/gateway-down.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/in-flight-conflict.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/index.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/model-5xx.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/network-blip.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/pool-exhausted-fallback.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/rate-limit.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/returning-after-24h.js.map +0 -1
- package/dist/src/channels/telegram-mirror/failure/types.js.map +0 -1
- package/dist/src/channels/telegram-mirror/inbound-handler.js.map +0 -1
- package/dist/src/channels/telegram-mirror/index.js.map +0 -1
- package/dist/src/channels/telegram-mirror/plan-attachment.js.map +0 -1
- package/dist/src/channels/telegram-mirror/quota-reader.js.map +0 -1
- package/dist/src/channels/telegram-mirror/sessions-keyboard.js.map +0 -1
- package/dist/src/channels/telegram-mirror/soak-log.js.map +0 -1
- package/dist/src/channels/telegram-mirror/state-machine.js.map +0 -1
- package/dist/src/channels/telegram-mirror/status-line.js.map +0 -1
- package/dist/src/channels/telegram-mirror/sync-commands.js.map +0 -1
- package/dist/src/channels/telegram-mirror/threshold-watcher.js.map +0 -1
- package/dist/src/channels/telegram-mirror/turn-bridge.js.map +0 -1
- package/dist/src/cli/checks/bridge-wiring.js.map +0 -1
- package/dist/src/cli/checks/config-schema.js.map +0 -1
- package/dist/src/cli/checks/critical-openclaw-json-keys.js.map +0 -1
- package/dist/src/cli/checks/install-path.js.map +0 -1
- package/dist/src/cli/checks/patch-scaffold.js.map +0 -1
- package/dist/src/cli/doctor.js.map +0 -1
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cli/migrate.js.map +0 -1
- package/dist/src/command-router/cc-handler.js.map +0 -1
- package/dist/src/command-router/index.js.map +0 -1
- package/dist/src/command-router/launch-policy.js.map +0 -1
- package/dist/src/command-router/resume-policy.js.map +0 -1
- package/dist/src/command-router/turn-formatter.js.map +0 -1
- package/dist/src/config/drift-detector.js.map +0 -1
- package/dist/src/config/loader.js.map +0 -1
- package/dist/src/config/schema.js.map +0 -1
- package/dist/src/constants.js.map +0 -1
- package/dist/src/council/build-agent-prompt.js.map +0 -1
- package/dist/src/council/cleanup-worktrees.js.map +0 -1
- package/dist/src/council/consensus.js.map +0 -1
- package/dist/src/council/council.js.map +0 -1
- package/dist/src/council/index.js.map +0 -1
- package/dist/src/council/system-prompt.js.map +0 -1
- package/dist/src/council/write-worktree-claude-md.js.map +0 -1
- package/dist/src/engines/base-oneshot-session.js.map +0 -1
- package/dist/src/engines/heartbeat-guard.js.map +0 -1
- package/dist/src/engines/index.js.map +0 -1
- package/dist/src/engines/persistent-codex-session.js.map +0 -1
- package/dist/src/engines/persistent-cursor-session.js.map +0 -1
- package/dist/src/engines/persistent-custom-session.js.map +0 -1
- package/dist/src/engines/persistent-gemini-session.js.map +0 -1
- package/dist/src/engines/persistent-session.js.map +0 -1
- package/dist/src/engines/resolve-bin.js.map +0 -1
- package/dist/src/engines/subprocess-pool.js.map +0 -1
- package/dist/src/health/handler.js.map +0 -1
- package/dist/src/health/index.js.map +0 -1
- package/dist/src/health/metrics.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/lib/auto-recovery.js.map +0 -1
- package/dist/src/lib/cache-parity.js.map +0 -1
- package/dist/src/lib/circuit-breaker.js.map +0 -1
- package/dist/src/lib/config-service.js.map +0 -1
- package/dist/src/lib/config.js.map +0 -1
- package/dist/src/lib/cost-rollup.js.map +0 -1
- package/dist/src/lib/debounce.js.map +0 -1
- package/dist/src/lib/debug-tap.js.map +0 -1
- package/dist/src/lib/domain-error.js.map +0 -1
- package/dist/src/lib/drift-detector.js.map +0 -1
- package/dist/src/lib/env-overrides.js.map +0 -1
- package/dist/src/lib/error-formatter.js.map +0 -1
- package/dist/src/lib/error-renderer.js.map +0 -1
- package/dist/src/lib/heartbeat-config.js.map +0 -1
- package/dist/src/lib/heartbeat-workaround.js.map +0 -1
- package/dist/src/lib/http-agent.js.map +0 -1
- package/dist/src/lib/index.js.map +0 -1
- package/dist/src/lib/json-array.js.map +0 -1
- package/dist/src/lib/markdown-to-mdv2.js.map +0 -1
- package/dist/src/lib/markdown-v2.js.map +0 -1
- package/dist/src/lib/perf/async-compact.js.map +0 -1
- package/dist/src/lib/perf/direct-sdk.js.map +0 -1
- package/dist/src/lib/perf/haiku-route.js.map +0 -1
- package/dist/src/lib/perf/predictive-continuation.js.map +0 -1
- package/dist/src/lib/perf/read-batch.js.map +0 -1
- package/dist/src/lib/perf/skill-list-collapse.js.map +0 -1
- package/dist/src/lib/perf/speculative-bubble.js.map +0 -1
- package/dist/src/lib/perf/typing-prefetch.js.map +0 -1
- package/dist/src/lib/register-guard.js.map +0 -1
- package/dist/src/lib/req-shape-log.js.map +0 -1
- package/dist/src/lib/safe-upstream-probes.js.map +0 -1
- package/dist/src/lib/session-registry.js.map +0 -1
- package/dist/src/lib/spawn-async.js.map +0 -1
- package/dist/src/lib/stale-pid-files.js.map +0 -1
- package/dist/src/lib/status-tee-reader.js.map +0 -1
- package/dist/src/lib/sysprompt-strip.js.map +0 -1
- package/dist/src/lib/telegram-bot-api.js.map +0 -1
- package/dist/src/lib/telemetry.js.map +0 -1
- package/dist/src/lib/test-mode.js.map +0 -1
- package/dist/src/lib/trajectory.js.map +0 -1
- package/dist/src/lib/vendor-paths.js.map +0 -1
- package/dist/src/lifecycle/boot.js.map +0 -1
- package/dist/src/lifecycle/patch-manifest.js.map +0 -1
- package/dist/src/lifecycle/phase-import-upstream.js.map +0 -1
- package/dist/src/lifecycle/phase-install-patches.js.map +0 -1
- package/dist/src/lifecycle/phase-schedule-jobs.js.map +0 -1
- package/dist/src/lifecycle/phase-start-server.js.map +0 -1
- package/dist/src/lifecycle/phase-validate-config.js.map +0 -1
- package/dist/src/lifecycle/phase-validate-upstream.js.map +0 -1
- package/dist/src/lifecycle/phase-wire-handlers.js.map +0 -1
- package/dist/src/lifecycle/safe-restart.js.map +0 -1
- package/dist/src/logger.js.map +0 -1
- package/dist/src/mcp/bridge.js.map +0 -1
- package/dist/src/mcp/index.js.map +0 -1
- package/dist/src/models.js.map +0 -1
- package/dist/src/observability/event-bus.js.map +0 -1
- package/dist/src/observability/get-event-bus.js.map +0 -1
- package/dist/src/observability/observability-service.js.map +0 -1
- package/dist/src/observability/perf-telemetry.js.map +0 -1
- package/dist/src/observability/subscribers/metrics.js.map +0 -1
- package/dist/src/observability/subscribers/session-capture.js.map +0 -1
- package/dist/src/openai-compat/bridges/allowlist.js.map +0 -1
- package/dist/src/openai-compat/bridges/factory.js.map +0 -1
- package/dist/src/openai-compat/bridges/media-bridge.js.map +0 -1
- package/dist/src/openai-compat/bridges/openclaw-api-shim.js.map +0 -1
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js.map +0 -1
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js.map +0 -1
- package/dist/src/openai-compat/bridges/tts-media-bridge.js.map +0 -1
- package/dist/src/openai-compat/cli-stream-parser.js.map +0 -1
- package/dist/src/openai-compat/index.js.map +0 -1
- package/dist/src/openai-compat/message-extractor.js.map +0 -1
- package/dist/src/openai-compat/mode-flags.js.map +0 -1
- package/dist/src/openai-compat/non-streaming-handler.js.map +0 -1
- package/dist/src/openai-compat/openai-chunk-types.js.map +0 -1
- package/dist/src/openai-compat/openai-compat.js.map +0 -1
- package/dist/src/openai-compat/openai-types.js.map +0 -1
- package/dist/src/openai-compat/parse-route-body.js.map +0 -1
- package/dist/src/openai-compat/prompts.js.map +0 -1
- package/dist/src/openai-compat/response-formatter.js.map +0 -1
- package/dist/src/openai-compat/session-key-resolver.js.map +0 -1
- package/dist/src/openai-compat/skill-resolver.js.map +0 -1
- package/dist/src/openai-compat/sse-translator.js.map +0 -1
- package/dist/src/openai-compat/status-reporter.js.map +0 -1
- package/dist/src/openai-compat/streaming-handler.js.map +0 -1
- package/dist/src/openai-compat/tool-calls-parser.js.map +0 -1
- package/dist/src/openai-compat/tool-results-serializer.js.map +0 -1
- package/dist/src/openai-compat/tts-rule.js.map +0 -1
- package/dist/src/openai-compat/voice-recovery.js.map +0 -1
- package/dist/src/patches/cache-parity-registry.js.map +0 -1
- package/dist/src/patches/claude-md-injection.js.map +0 -1
- package/dist/src/patches/cwd-redirect.js.map +0 -1
- package/dist/src/patches/embedded-server-route.js.map +0 -1
- package/dist/src/patches/pricing-overrides.js.map +0 -1
- package/dist/src/patches/resume-registry-restore.js.map +0 -1
- package/dist/src/patches/session-pid-tracking.js.map +0 -1
- package/dist/src/patches/sysprompt-strip.js.map +0 -1
- package/dist/src/patches/sysprompt-strip.spec.d.ts +0 -33
- package/dist/src/patches/sysprompt-strip.spec.js +0 -53
- package/dist/src/patches/sysprompt-strip.spec.js.map +0 -1
- package/dist/src/patches/tools-restoration.js.map +0 -1
- package/dist/src/persistence/migration-v0.js.map +0 -1
- package/dist/src/persistence/session-registry.js.map +0 -1
- package/dist/src/persistence/snapshot.js.map +0 -1
- package/dist/src/persistence/wal.js.map +0 -1
- package/dist/src/proxy/anthropic-adapter.js.map +0 -1
- package/dist/src/proxy/handler.js.map +0 -1
- package/dist/src/proxy/index.js.map +0 -1
- package/dist/src/proxy/schema-cleaner.js.map +0 -1
- package/dist/src/proxy/thought-cache.js.map +0 -1
- package/dist/src/session/embedded-server.js.map +0 -1
- package/dist/src/session/inbox-manager.js.map +0 -1
- package/dist/src/session/index.js.map +0 -1
- package/dist/src/session/persisted-sessions.js.map +0 -1
- package/dist/src/session/session-manager.js.map +0 -1
- package/dist/src/session/watchdogs.js.map +0 -1
- package/dist/src/session-bootstrap/boot-self-heal.js.map +0 -1
- package/dist/src/session-bootstrap/cwd-patch.js.map +0 -1
- package/dist/src/session-bootstrap/index.js.map +0 -1
- package/dist/src/session-bootstrap/resume-registry.js.map +0 -1
- package/dist/src/session-bootstrap/session-hygiene.js.map +0 -1
- package/dist/src/session-bootstrap/sysprompt-strip.js.map +0 -1
- package/dist/src/session-bootstrap/think-conflict-resolver.js.map +0 -1
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/route.js.map +0 -1
- package/dist/src/types/runtime-config.js.map +0 -1
- package/dist/src/types/session.js.map +0 -1
- package/dist/src/types/sse.js.map +0 -1
- package/dist/src/types/tool-bridge.js.map +0 -1
- package/dist/src/types/upstream.js.map +0 -1
- package/dist/src/types.js.map +0 -1
- package/dist/src/validation.js.map +0 -1
|
@@ -1,647 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* telegram event-reducer β TypeScript port of savvy-claude-code/ux-bridge.js
|
|
3
|
-
*
|
|
4
|
-
* Central register() that wires all remaining api.on() hooks:
|
|
5
|
-
* before_dispatch Γ4 β /quota command, /sessions command, claude-local UX
|
|
6
|
-
* feed, callback_query routing
|
|
7
|
-
* before_model_resolve β per-chat model override (F5)
|
|
8
|
-
* before_tool_call β Stage 4 gateway UX metadata injection
|
|
9
|
-
* MiniMax usage tracking (before_dispatch)
|
|
10
|
-
*
|
|
11
|
-
* Depends on: live-card, tool-tracker, completion-summary, state-machine
|
|
12
|
-
* (all must be registered before or alongside this module).
|
|
13
|
-
*
|
|
14
|
-
* Source lines: 1042β1615 of ux-bridge.js
|
|
15
|
-
*/
|
|
16
|
-
import { createRequire } from 'node:module';
|
|
17
|
-
import { getUxBridgeAllSessions } from '../../lib/config.js';
|
|
18
|
-
import { telegramApi, UX_MODULE_PATH, activeSessions, recentlyFinishedSessions, _logger, buttonHandler, nsCommands, } from './live-card.js';
|
|
19
|
-
import { activeSavvyCards, activeSavvyChatIds, verbosityCtrl, savvyButtons, renderSavvyCard, generateNextSteps, } from './tool-tracker.js';
|
|
20
|
-
import { defaultRegisterGuard } from '../../lib/register-guard.js';
|
|
21
|
-
import { isTestMode } from '../../lib/test-mode.js';
|
|
22
|
-
const __require = createRequire(import.meta.url);
|
|
23
|
-
// ββ Constants βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
24
|
-
const PLUGIN_TAG = '[cc-openclaw/telegram/event-reducer]';
|
|
25
|
-
const MODEL_PREF_STORE_PATH = '/home/a1xai/.openclaw/workspace/config/chat-model-prefs.json';
|
|
26
|
-
let ChatModelPrefs;
|
|
27
|
-
try {
|
|
28
|
-
({ ChatModelPrefs } = __require(`${UX_MODULE_PATH}/chat-model-prefs`));
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
ChatModelPrefs = class {
|
|
32
|
-
load() {
|
|
33
|
-
/* no-op stub */
|
|
34
|
-
}
|
|
35
|
-
cycle(_chatId) {
|
|
36
|
-
return { emoji: 'π€', label: 'default' };
|
|
37
|
-
}
|
|
38
|
-
get(_chatId) {
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
const chatModelPrefs = new ChatModelPrefs(MODEL_PREF_STORE_PATH);
|
|
44
|
-
if (!isTestMode()) {
|
|
45
|
-
chatModelPrefs.load();
|
|
46
|
-
}
|
|
47
|
-
function cycleChatModel(chatId) { return chatModelPrefs.cycle(chatId); }
|
|
48
|
-
function getChatModel(chatId) { return chatModelPrefs.get(chatId); }
|
|
49
|
-
// ββ Helpers βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
50
|
-
// `_fmtReset` and `_pct` extracted to `./format-helpers.ts` 2026-05-13 β
|
|
51
|
-
// first hot-path-adjacent decomposition; pure functions, behavior preserved.
|
|
52
|
-
import { fmtReset as _fmtReset, fmtPct as _pct } from './format-helpers.js';
|
|
53
|
-
// ββ register() ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
54
|
-
/**
|
|
55
|
-
* Register all event-reducer hooks (command dispatch, model override,
|
|
56
|
-
* callback routing, Stage 4 injection).
|
|
57
|
-
* Idempotent β subsequent calls are no-ops.
|
|
58
|
-
*/
|
|
59
|
-
export function register(api) {
|
|
60
|
-
const logger = api.logger || _logger;
|
|
61
|
-
defaultRegisterGuard.guard('channels/telegram/event-reducer', api, () => {
|
|
62
|
-
// ββ /quota command ββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
63
|
-
api.on('before_dispatch', (event) => {
|
|
64
|
-
const ev = event;
|
|
65
|
-
if (ev.channel !== 'telegram')
|
|
66
|
-
return;
|
|
67
|
-
const msg = ev.raw?.message;
|
|
68
|
-
const text = msg?.text;
|
|
69
|
-
if (typeof text !== 'string')
|
|
70
|
-
return;
|
|
71
|
-
const cmd = text.trim().toLowerCase().split(/\s+/)[0];
|
|
72
|
-
if (cmd !== '/quota' && !cmd.startsWith('/quota@'))
|
|
73
|
-
return;
|
|
74
|
-
const tgChatId = String(msg?.chat?.id || '');
|
|
75
|
-
const threadId = msg?.message_thread_id;
|
|
76
|
-
if (!tgChatId)
|
|
77
|
-
return;
|
|
78
|
-
(async () => {
|
|
79
|
-
let body;
|
|
80
|
-
try {
|
|
81
|
-
const { QuotaFetcher } = __require(`${UX_MODULE_PATH}/quota-fetcher`);
|
|
82
|
-
const fetcher = new QuotaFetcher();
|
|
83
|
-
const quota = await fetcher.fetch();
|
|
84
|
-
if (!quota) {
|
|
85
|
-
body = 'β οΈ No quota data available\n(OAuth token missing or endpoint unreachable)';
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
const lines = ['π Plan quota'];
|
|
89
|
-
lines.push(`β‘ Current session ${_pct(quota.fiveHour?.usedPercent)}${_fmtReset(quota.fiveHour?.resetsAt)}`);
|
|
90
|
-
lines.push(`π
Week Β· all ${_pct(quota.sevenDay?.usedPercent)}${_fmtReset(quota.sevenDay?.resetsAt)}`);
|
|
91
|
-
if (quota.sevenDaySonnet?.usedPercent != null) {
|
|
92
|
-
lines.push(`β¨ Week Β· Sonnet ${_pct(quota.sevenDaySonnet.usedPercent)}`);
|
|
93
|
-
}
|
|
94
|
-
if (quota.sevenDayOpus?.usedPercent != null) {
|
|
95
|
-
lines.push(`π« Week Β· Opus ${_pct(quota.sevenDayOpus.usedPercent)}`);
|
|
96
|
-
}
|
|
97
|
-
if (quota.extraUsage) {
|
|
98
|
-
if (quota.extraUsage.isEnabled === false) {
|
|
99
|
-
lines.push('π³ Extra usage: not enabled');
|
|
100
|
-
}
|
|
101
|
-
else if (typeof quota.extraUsage.usedCredits === 'number'
|
|
102
|
-
&& typeof quota.extraUsage.monthlyLimit === 'number') {
|
|
103
|
-
const used = (quota.extraUsage.usedCredits / 100).toFixed(2);
|
|
104
|
-
const cap = (quota.extraUsage.monthlyLimit / 100).toFixed(0);
|
|
105
|
-
const sym = quota.extraUsage.currency === 'USD' ? '$' : '';
|
|
106
|
-
lines.push(`π³ Extra usage: ${sym}${used} / ${sym}${cap}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
lines.push(`\nsource: ${quota.source || 'unknown'}`);
|
|
110
|
-
body = lines.join('\n');
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
catch (err) {
|
|
114
|
-
body = `β οΈ /quota failed: ${err.message}`;
|
|
115
|
-
}
|
|
116
|
-
telegramApi('sendMessage', {
|
|
117
|
-
chat_id: tgChatId,
|
|
118
|
-
text: body,
|
|
119
|
-
...(threadId ? { message_thread_id: Number(threadId) } : {}),
|
|
120
|
-
}).catch((e) => logger.warn(`${PLUGIN_TAG} /quota reply failed: ${e.message}`));
|
|
121
|
-
logger.info(`${PLUGIN_TAG} /quota: chat=${tgChatId}`);
|
|
122
|
-
})();
|
|
123
|
-
return { handled: true };
|
|
124
|
-
});
|
|
125
|
-
// ββ /sessions command βββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
126
|
-
api.on('before_dispatch', (event) => {
|
|
127
|
-
const ev = event;
|
|
128
|
-
if (ev.channel !== 'telegram')
|
|
129
|
-
return;
|
|
130
|
-
const msg = ev.raw?.message;
|
|
131
|
-
const text = msg?.text;
|
|
132
|
-
if (typeof text !== 'string')
|
|
133
|
-
return;
|
|
134
|
-
const cmd = text.trim().toLowerCase().split(/\s+/)[0];
|
|
135
|
-
if (cmd !== '/sessions' && !cmd.startsWith('/sessions@'))
|
|
136
|
-
return;
|
|
137
|
-
const tgChatId = String(msg?.chat?.id || '');
|
|
138
|
-
const threadId = msg?.message_thread_id;
|
|
139
|
-
if (!tgChatId)
|
|
140
|
-
return;
|
|
141
|
-
const rows = [];
|
|
142
|
-
const now = Date.now();
|
|
143
|
-
for (const [sessionName, entry] of activeSessions) {
|
|
144
|
-
const qChat = String(entry.queue?.chatId || '');
|
|
145
|
-
if (qChat !== tgChatId)
|
|
146
|
-
continue;
|
|
147
|
-
const state = entry.pipeline?._cardState?.getState?.();
|
|
148
|
-
const elapsedSec = Math.round((state?.elapsedMs || (now - (state?.startedAt || now))) / 1000);
|
|
149
|
-
const toolCount = state?.toolCount ?? 0;
|
|
150
|
-
const status = state?.status || 'working';
|
|
151
|
-
const pretty = sessionName.startsWith('openai-')
|
|
152
|
-
? `Savvy ${sessionName.slice(7, 17)}β¦`
|
|
153
|
-
: sessionName;
|
|
154
|
-
rows.push(`β’ ${pretty} β ${status} Β· ${toolCount} tools Β· ${elapsedSec}s`);
|
|
155
|
-
}
|
|
156
|
-
const summary = rows.length === 0
|
|
157
|
-
? 'No active sessions in this chat.'
|
|
158
|
-
: `Active sessions (${rows.length}):\n${rows.join('\n')}`;
|
|
159
|
-
telegramApi('sendMessage', {
|
|
160
|
-
chat_id: tgChatId,
|
|
161
|
-
text: summary,
|
|
162
|
-
...(threadId ? { message_thread_id: Number(threadId) } : {}),
|
|
163
|
-
}).catch((e) => logger.warn(`${PLUGIN_TAG} /sessions reply failed: ${e.message}`));
|
|
164
|
-
logger.info(`${PLUGIN_TAG} /sessions: chat=${tgChatId} rows=${rows.length}`);
|
|
165
|
-
return { handled: true };
|
|
166
|
-
});
|
|
167
|
-
// ββ F5: per-chat model override βββββββββββββββββββββββββββββββββββββββ
|
|
168
|
-
api.on('before_model_resolve', (_event, ctx) => {
|
|
169
|
-
const ctxObj = ctx;
|
|
170
|
-
const sk = ctxObj?.sessionKey || '';
|
|
171
|
-
const m = sk.match(/telegram:direct:(-?\d+)/)
|
|
172
|
-
|| sk.match(/telegram:group:(-?\d+)(?::topic:\d+)?/);
|
|
173
|
-
const chatId = m ? m[1] : null;
|
|
174
|
-
if (!chatId)
|
|
175
|
-
return;
|
|
176
|
-
const pref = getChatModel(chatId);
|
|
177
|
-
if (pref?.id) {
|
|
178
|
-
return { modelOverride: pref.id };
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
// ββ MiniMax usage tracking ββββββββββββββββββββββββββββββββββββββββββββ
|
|
182
|
-
try {
|
|
183
|
-
const { MiniMaxUsageTracker } = __require(`${UX_MODULE_PATH}/minimax-usage`);
|
|
184
|
-
// minimaxTracker is a module-level singleton in live-card.ts; we set it via
|
|
185
|
-
// the exported reference. For now store locally β live-card reads it via its
|
|
186
|
-
// own module-level var which is separate. TODO(P2): unify via setter export.
|
|
187
|
-
if (isTestMode()) {
|
|
188
|
-
logger.info(`${PLUGIN_TAG} TEST_MODE=1 β skipping MiniMax usage tracker initialization (I/O)`);
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
const minimaxTrackerLocal = new MiniMaxUsageTracker('/tmp/minimax-usage.json');
|
|
192
|
-
logger.info(`${PLUGIN_TAG} MiniMax usage tracker initialized`);
|
|
193
|
-
api.on('before_dispatch', (event) => {
|
|
194
|
-
const ev = event;
|
|
195
|
-
if (ev.channel !== 'telegram')
|
|
196
|
-
return;
|
|
197
|
-
if (ev.raw?.callback_query)
|
|
198
|
-
return;
|
|
199
|
-
if (['minimax', 'minimax-portal'].includes(ev.provider ?? '')) {
|
|
200
|
-
minimaxTrackerLocal.recordRequest();
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
} // end else (not test mode)
|
|
204
|
-
}
|
|
205
|
-
catch (err) {
|
|
206
|
-
logger.warn(`${PLUGIN_TAG} MiniMax tracker not available: ${err.message}`);
|
|
207
|
-
}
|
|
208
|
-
// ββ claude-local UX feeder ββββββββββββββββββββββββββββββββββββββββββββ
|
|
209
|
-
api.on('before_dispatch', (event, ctx) => {
|
|
210
|
-
const ev = event;
|
|
211
|
-
const ctxObj = ctx;
|
|
212
|
-
if (ev.channel !== 'telegram' && ev.channel !== 'discord')
|
|
213
|
-
return;
|
|
214
|
-
const sk = ev.sessionKey || ctxObj?.sessionKey || '';
|
|
215
|
-
const tgMatch = sk.match(/(?:telegram|discord):[^:]+:(-?\d+)(?::topic:(\d+))?/);
|
|
216
|
-
if (!tgMatch)
|
|
217
|
-
return;
|
|
218
|
-
const chatId = tgMatch[1];
|
|
219
|
-
const threadId = tgMatch[2] || undefined;
|
|
220
|
-
const PENDING_CHAT_QUEUE = Symbol.for('claude-local-ux:pending-chat');
|
|
221
|
-
if (!globalThis[PENDING_CHAT_QUEUE]) {
|
|
222
|
-
globalThis[PENDING_CHAT_QUEUE] = [];
|
|
223
|
-
}
|
|
224
|
-
globalThis[PENDING_CHAT_QUEUE].push({
|
|
225
|
-
chatId,
|
|
226
|
-
threadId,
|
|
227
|
-
origMessageId: undefined,
|
|
228
|
-
ts: Date.now(),
|
|
229
|
-
});
|
|
230
|
-
const cutoff = Date.now() - 30000;
|
|
231
|
-
const queue = globalThis[PENDING_CHAT_QUEUE];
|
|
232
|
-
while (queue.length && queue[0].ts < cutoff) {
|
|
233
|
-
queue.shift();
|
|
234
|
-
}
|
|
235
|
-
logger.info(`${PLUGIN_TAG} [ux-feed] queued chat=${chatId} thread=${threadId || 'none'} channel=${ev.channel}`);
|
|
236
|
-
});
|
|
237
|
-
// ββ Callback query handler (inline keyboard button presses) ββββββββββ
|
|
238
|
-
// Async since v0.19 β the 'diff' branch lazily imports node:child_process
|
|
239
|
-
// (await import) so the typescript build doesn't pull child_process at
|
|
240
|
-
// module load. api.on contract accepts Promise<unknown> returns.
|
|
241
|
-
api.on('before_dispatch', async (event) => {
|
|
242
|
-
const ev = event;
|
|
243
|
-
if (ev.channel !== 'telegram')
|
|
244
|
-
return;
|
|
245
|
-
const cbq = ev.raw?.callback_query;
|
|
246
|
-
if (!cbq)
|
|
247
|
-
return;
|
|
248
|
-
// Re-read buttonHandler from live-card (may be set after register() call)
|
|
249
|
-
const bh = buttonHandler;
|
|
250
|
-
if (!bh)
|
|
251
|
-
return;
|
|
252
|
-
// ββ Try Savvy card button (sv: prefix) ββββββββββββββββββββββββββββ
|
|
253
|
-
const savvyParsed = bh.parseSavvyCallback?.(cbq.data);
|
|
254
|
-
if (savvyParsed) {
|
|
255
|
-
const { action, sessionKey } = savvyParsed;
|
|
256
|
-
const entry = activeSavvyCards?.get(sessionKey);
|
|
257
|
-
const answerId = cbq.id;
|
|
258
|
-
if (!entry) {
|
|
259
|
-
if (answerId) {
|
|
260
|
-
telegramApi('answerCallbackQuery', {
|
|
261
|
-
callback_query_id: answerId,
|
|
262
|
-
text: 'Card expired',
|
|
263
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
264
|
-
}
|
|
265
|
-
return { handled: true };
|
|
266
|
-
}
|
|
267
|
-
logger.info(`${PLUGIN_TAG} Savvy button: ${action} on sessionKey=${sessionKey}`);
|
|
268
|
-
if (action === 'cancel') {
|
|
269
|
-
entry.cancelled = true;
|
|
270
|
-
if (entry._bridgeCleanup) {
|
|
271
|
-
entry._bridgeCleanup();
|
|
272
|
-
entry._bridgeCleanup = null;
|
|
273
|
-
}
|
|
274
|
-
entry.state.markCancelled();
|
|
275
|
-
if (entry._stallTimer)
|
|
276
|
-
clearInterval(entry._stallTimer);
|
|
277
|
-
if (entry._typingInterval) {
|
|
278
|
-
clearInterval(entry._typingInterval);
|
|
279
|
-
entry._typingInterval = null;
|
|
280
|
-
}
|
|
281
|
-
if (entry._pendingEdit?.timer) {
|
|
282
|
-
clearTimeout(entry._pendingEdit.timer);
|
|
283
|
-
entry._pendingEdit = null;
|
|
284
|
-
}
|
|
285
|
-
entry._lastEditAt = 0;
|
|
286
|
-
if (generateNextSteps) {
|
|
287
|
-
const steps = generateNextSteps(entry.state.getState());
|
|
288
|
-
entry.state.setNextSteps(steps);
|
|
289
|
-
}
|
|
290
|
-
const cancelState = entry.state.getState();
|
|
291
|
-
const _render = renderSavvyCard;
|
|
292
|
-
if (_render) {
|
|
293
|
-
const cardText = _render(cancelState);
|
|
294
|
-
const markup = savvyButtons(cancelState, sessionKey, entry.chatId);
|
|
295
|
-
entry.queue.updateCard(cardText, markup);
|
|
296
|
-
}
|
|
297
|
-
activeSavvyChatIds.delete(entry.chatId);
|
|
298
|
-
const cancelQueue = entry.queue;
|
|
299
|
-
setTimeout(() => {
|
|
300
|
-
const elapsedSec = Math.round((cancelState.elapsedMs || 0) / 1000);
|
|
301
|
-
const collapsed = `π *Savvy* β cancelled \\(${cancelState.toolCount ?? 0} tools, ${elapsedSec}s\\)`;
|
|
302
|
-
cancelQueue.updateCard(collapsed, { inline_keyboard: [] });
|
|
303
|
-
}, 20000);
|
|
304
|
-
const cancelChatId = entry.chatId;
|
|
305
|
-
const cancelMsgId = entry.queue._replyToMessageId;
|
|
306
|
-
if (cancelMsgId) {
|
|
307
|
-
setTimeout(() => {
|
|
308
|
-
telegramApi('deleteMessage', {
|
|
309
|
-
chat_id: cancelChatId,
|
|
310
|
-
message_id: cancelMsgId,
|
|
311
|
-
}).catch(() => { });
|
|
312
|
-
}, 5 * 60 * 1000);
|
|
313
|
-
}
|
|
314
|
-
activeSavvyCards.delete(sessionKey);
|
|
315
|
-
}
|
|
316
|
-
if (action === 'quiet') {
|
|
317
|
-
if (verbosityCtrl && entry.chatId) {
|
|
318
|
-
const chatKey = `telegram:${entry.chatId}`;
|
|
319
|
-
const newLevel = verbosityCtrl.cycleLevel(chatKey);
|
|
320
|
-
const emoji = verbosityCtrl.getLevelEmoji(chatKey);
|
|
321
|
-
const label = verbosityCtrl.getLevelLabel(chatKey);
|
|
322
|
-
if (answerId) {
|
|
323
|
-
telegramApi('answerCallbackQuery', {
|
|
324
|
-
callback_query_id: answerId,
|
|
325
|
-
text: `${emoji} Verbosity: ${label}`,
|
|
326
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
327
|
-
}
|
|
328
|
-
logger.info(`${PLUGIN_TAG} Savvy quiet: cycled to ${newLevel} for chat=${entry.chatId}`);
|
|
329
|
-
return { handled: true };
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
if (action === 'nudge') {
|
|
333
|
-
if (entry.state.stalled) {
|
|
334
|
-
entry.state.clearStall();
|
|
335
|
-
entry.state.lastActivityAt = Date.now();
|
|
336
|
-
const _render = renderSavvyCard;
|
|
337
|
-
if (entry._initialSent && _render) {
|
|
338
|
-
const cardText = _render(entry.state.getState());
|
|
339
|
-
const markup = savvyButtons(entry.state.getState(), sessionKey, entry.chatId);
|
|
340
|
-
entry.queue.updateCard(cardText, markup);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
if (answerId) {
|
|
344
|
-
telegramApi('answerCallbackQuery', {
|
|
345
|
-
callback_query_id: answerId,
|
|
346
|
-
text: 'π Nudged β stall cleared',
|
|
347
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
348
|
-
}
|
|
349
|
-
return { handled: true };
|
|
350
|
-
}
|
|
351
|
-
if (action === 'details') {
|
|
352
|
-
const s = entry.state.getState();
|
|
353
|
-
const elapsed = ((s.elapsedMs ?? 0) / 1000).toFixed(1);
|
|
354
|
-
const detailLines = [
|
|
355
|
-
s.model ? `Model: ${s.model}` : null,
|
|
356
|
-
`Tools: ${s.toolCount ?? 0} Β· Errors: ${s.errorCount ?? 0}`,
|
|
357
|
-
`Elapsed: ${elapsed}s`,
|
|
358
|
-
s.stalled ? 'β οΈ Stalled' : null,
|
|
359
|
-
s.qualityScore ? `${s.qualityScore.emoji} ${s.qualityScore.label}` : null,
|
|
360
|
-
s.currentTool ? `Current: ${s.currentTool}` : null,
|
|
361
|
-
].filter((l) => l != null);
|
|
362
|
-
const toolLog = s.toolLog ?? [];
|
|
363
|
-
if (toolLog.length > 0) {
|
|
364
|
-
detailLines.push('');
|
|
365
|
-
toolLog.slice(-5).forEach(t => {
|
|
366
|
-
const dur = (t.durationMs / 1000).toFixed(1);
|
|
367
|
-
const err = t.error ? ' β' : '';
|
|
368
|
-
detailLines.push(` ${t.tool} (${dur}s)${err}`);
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
const filesModified = s.filesModified;
|
|
372
|
-
if (filesModified && filesModified.length > 0) {
|
|
373
|
-
detailLines.push(`Files: ${filesModified.slice(0, 8).join(', ')}`);
|
|
374
|
-
}
|
|
375
|
-
const popupText = detailLines.join('\n').slice(0, 195);
|
|
376
|
-
if (answerId) {
|
|
377
|
-
telegramApi('answerCallbackQuery', {
|
|
378
|
-
callback_query_id: answerId,
|
|
379
|
-
text: popupText,
|
|
380
|
-
show_alert: true,
|
|
381
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
382
|
-
}
|
|
383
|
-
return { handled: true };
|
|
384
|
-
}
|
|
385
|
-
// v0.19 β Diff-on-tap. Reads state.edits, prefers any cached diff,
|
|
386
|
-
// falls back to `git diff --unified=3 -- <files>` capped at ~10 KB,
|
|
387
|
-
// and replies as a follow-up message (avoids re-escaping the card
|
|
388
|
-
// body for MarkdownV2 corruption).
|
|
389
|
-
if (action === 'diff') {
|
|
390
|
-
const s = entry.state.getState();
|
|
391
|
-
const edits = s.edits || [];
|
|
392
|
-
if (answerId) {
|
|
393
|
-
telegramApi('answerCallbackQuery', {
|
|
394
|
-
callback_query_id: answerId,
|
|
395
|
-
text: edits.length === 0 ? 'π No edits recorded' : 'π Generating diffβ¦',
|
|
396
|
-
}).catch(() => { });
|
|
397
|
-
}
|
|
398
|
-
if (edits.length === 0)
|
|
399
|
-
return { handled: true };
|
|
400
|
-
const files = edits.map(e => e.path).filter((p) => !!p);
|
|
401
|
-
let diff = edits.map(e => e.diff).filter((d) => !!d).join('\n');
|
|
402
|
-
if (!diff && files.length > 0) {
|
|
403
|
-
try {
|
|
404
|
-
const cp = await import('node:child_process');
|
|
405
|
-
diff = cp.execFileSync('git', ['diff', '--unified=3', '--', ...files], {
|
|
406
|
-
cwd: process.cwd(),
|
|
407
|
-
encoding: 'utf8',
|
|
408
|
-
timeout: 5000,
|
|
409
|
-
maxBuffer: 1024 * 1024,
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
catch {
|
|
413
|
-
diff = '';
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
if (!diff || diff.trim().length === 0) {
|
|
417
|
-
diff = `(no unified diff available)\n\nfiles touched:\n${files.map(f => ' ' + f).join('\n')}`;
|
|
418
|
-
}
|
|
419
|
-
const LIMIT = 10_000;
|
|
420
|
-
if (diff.length > LIMIT) {
|
|
421
|
-
diff = diff.slice(0, LIMIT - 100) + '\n[β¦truncated]';
|
|
422
|
-
}
|
|
423
|
-
const cardMsgId = entry.queue._replyToMessageId;
|
|
424
|
-
telegramApi('sendMessage', {
|
|
425
|
-
chat_id: entry.chatId,
|
|
426
|
-
text: `π git diff (${files.length} file${files.length === 1 ? '' : 's'})\n\n${diff}`,
|
|
427
|
-
...(cardMsgId ? { reply_to_message_id: cardMsgId, allow_sending_without_reply: true } : {}),
|
|
428
|
-
}).catch((e) => logger.warn(`${PLUGIN_TAG} diff reply failed: ${e.message}`));
|
|
429
|
-
return { handled: true };
|
|
430
|
-
}
|
|
431
|
-
// v0.19 β Steer button stubs. Pause / Plan / Inject answer with a
|
|
432
|
-
// "coming in v0.19.1" toast. cc-openclaw runtime hooks land later.
|
|
433
|
-
if (action === 'pause' || action === 'plan' || action === 'inject') {
|
|
434
|
-
const stubText = action === 'pause'
|
|
435
|
-
? 'βΈ Pause β coming in v0.19.1'
|
|
436
|
-
: action === 'plan'
|
|
437
|
-
? 'π Switch to Plan β coming in v0.19.1'
|
|
438
|
-
: 'π Inject prompt β coming in v0.19.1';
|
|
439
|
-
if (answerId) {
|
|
440
|
-
telegramApi('answerCallbackQuery', {
|
|
441
|
-
callback_query_id: answerId,
|
|
442
|
-
text: stubText,
|
|
443
|
-
show_alert: true,
|
|
444
|
-
}).catch(() => { });
|
|
445
|
-
}
|
|
446
|
-
return { handled: true };
|
|
447
|
-
}
|
|
448
|
-
if (answerId && action !== 'details') {
|
|
449
|
-
telegramApi('answerCallbackQuery', {
|
|
450
|
-
callback_query_id: answerId,
|
|
451
|
-
text: action === 'cancel' ? 'π Cancelled' : 'OK',
|
|
452
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
453
|
-
}
|
|
454
|
-
return { handled: true };
|
|
455
|
-
}
|
|
456
|
-
// ββ Try next-step button (ns: prefix) ββββββββββββββββββββββββββββββ
|
|
457
|
-
const nsCallback = bh.parseNextStepCallback?.(cbq.data);
|
|
458
|
-
if (nsCallback) {
|
|
459
|
-
const nsChatId = cbq.message?.chat;
|
|
460
|
-
const nsChatIdVal = nsChatId?.id;
|
|
461
|
-
const nsThreadId = cbq.message?.message_thread_id;
|
|
462
|
-
const command = nsCommands?.[nsCallback.action];
|
|
463
|
-
if (command && nsChatIdVal) {
|
|
464
|
-
telegramApi('sendMessage', {
|
|
465
|
-
chat_id: nsChatIdVal,
|
|
466
|
-
text: command,
|
|
467
|
-
...(nsThreadId ? { message_thread_id: Number(nsThreadId) } : {}),
|
|
468
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} NS inject error: ${e.message}`));
|
|
469
|
-
}
|
|
470
|
-
if (cbq.id) {
|
|
471
|
-
telegramApi('answerCallbackQuery', {
|
|
472
|
-
callback_query_id: cbq.id,
|
|
473
|
-
text: `Running ${command || nsCallback.action}...`,
|
|
474
|
-
}).catch(() => { });
|
|
475
|
-
}
|
|
476
|
-
return { handled: true };
|
|
477
|
-
}
|
|
478
|
-
// ββ Try CC session button (ux: prefix) ββββββββββββββββββββββββββββ
|
|
479
|
-
const parsed = bh.parseCallback(cbq.data);
|
|
480
|
-
if (!parsed)
|
|
481
|
-
return;
|
|
482
|
-
const { action, sessionId } = parsed;
|
|
483
|
-
const session = activeSessions.get(sessionId) || recentlyFinishedSessions.get(sessionId);
|
|
484
|
-
const answerId = cbq.id;
|
|
485
|
-
if (!session) {
|
|
486
|
-
logger.warn(`${PLUGIN_TAG} callback_query for unknown session: ${sessionId}`);
|
|
487
|
-
if (answerId) {
|
|
488
|
-
telegramApi('answerCallbackQuery', {
|
|
489
|
-
callback_query_id: answerId,
|
|
490
|
-
text: 'Session ended',
|
|
491
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
492
|
-
}
|
|
493
|
-
return { handled: true };
|
|
494
|
-
}
|
|
495
|
-
const result = bh.handleAction(action, {
|
|
496
|
-
sessionId,
|
|
497
|
-
state: session.pipeline?._cardState?.getState?.(),
|
|
498
|
-
pipeline: session.pipeline,
|
|
499
|
-
});
|
|
500
|
-
logger.info(`${PLUGIN_TAG} Button action: ${action} on session ${sessionId}`);
|
|
501
|
-
if (action === 'cancel') {
|
|
502
|
-
try {
|
|
503
|
-
session.pipeline.abort();
|
|
504
|
-
if (session.queue) {
|
|
505
|
-
session.queue.sendMessage('π Session cancelled via button');
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
catch (err) {
|
|
509
|
-
logger.warn(`${PLUGIN_TAG} Cancel action failed: ${err.message}`);
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
if (action === 'quiet') {
|
|
513
|
-
try {
|
|
514
|
-
const newLevel = session.pipeline.cycleVerbosity();
|
|
515
|
-
result.text = `π Verbosity: ${newLevel}`;
|
|
516
|
-
}
|
|
517
|
-
catch (err) {
|
|
518
|
-
logger.warn(`${PLUGIN_TAG} Quiet action failed: ${err.message}`);
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
if (action === 'compact' && session.queue) {
|
|
522
|
-
session.queue.sendMessage('π¦ Context compaction requested');
|
|
523
|
-
}
|
|
524
|
-
if (action === 'transcript' && session.queue) {
|
|
525
|
-
try {
|
|
526
|
-
const state = session.pipeline?._cardState?.getState?.();
|
|
527
|
-
const transcript = bh.formatTranscript(state);
|
|
528
|
-
session.queue.sendMessage(transcript);
|
|
529
|
-
}
|
|
530
|
-
catch (err) {
|
|
531
|
-
logger.warn(`${PLUGIN_TAG} Transcript action failed: ${err.message}`);
|
|
532
|
-
result.text = 'Transcript unavailable';
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
if (action === 'verbose' && verbosityCtrl && session.queue?.chatId) {
|
|
536
|
-
try {
|
|
537
|
-
const chatKey = `telegram:${session.queue.chatId}`;
|
|
538
|
-
verbosityCtrl.cycleLevel(chatKey);
|
|
539
|
-
const emoji = verbosityCtrl.getLevelEmoji(chatKey);
|
|
540
|
-
const label = verbosityCtrl.getLevelLabel(chatKey);
|
|
541
|
-
result.text = `${emoji} Verbosity: ${label} (for this chat)`;
|
|
542
|
-
}
|
|
543
|
-
catch (err) {
|
|
544
|
-
logger.warn(`${PLUGIN_TAG} Verbose toggle failed: ${err.message}`);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
if (action === 'model' && session.queue?.chatId) {
|
|
548
|
-
try {
|
|
549
|
-
const next = cycleChatModel(session.queue.chatId);
|
|
550
|
-
result.text = `${next.emoji} Model: ${next.label} (applies to next turn in this chat)`;
|
|
551
|
-
logger.info(`${PLUGIN_TAG} Model override for chat=${session.queue.chatId} β ${next.id || 'default'}`);
|
|
552
|
-
}
|
|
553
|
-
catch (err) {
|
|
554
|
-
logger.warn(`${PLUGIN_TAG} Model cycle failed: ${err.message}`);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
if (action === 'continue' && session.queue?.chatId) {
|
|
558
|
-
const chatId = String(session.queue.chatId);
|
|
559
|
-
const chatType = cbq.message?.chat;
|
|
560
|
-
const chatTypeVal = chatType?.type;
|
|
561
|
-
const threadIdVal = cbq.message?.message_thread_id;
|
|
562
|
-
let sessionKey;
|
|
563
|
-
if (chatTypeVal === 'group' || chatTypeVal === 'supergroup') {
|
|
564
|
-
sessionKey = threadIdVal != null
|
|
565
|
-
? `agent:main:telegram:group:${chatId}:topic:${threadIdVal}`
|
|
566
|
-
: `agent:main:telegram:group:${chatId}`;
|
|
567
|
-
}
|
|
568
|
-
else {
|
|
569
|
-
sessionKey = `agent:main:telegram:direct:${chatId}`;
|
|
570
|
-
}
|
|
571
|
-
const runSubagent = api?.runtime?.subagent?.run;
|
|
572
|
-
if (typeof runSubagent === 'function') {
|
|
573
|
-
runSubagent({
|
|
574
|
-
sessionKey,
|
|
575
|
-
message: 'keep going',
|
|
576
|
-
deliver: true,
|
|
577
|
-
idempotencyKey: `continue:${sessionId}:${Date.now()}`,
|
|
578
|
-
}).then((r) => {
|
|
579
|
-
logger.info(`${PLUGIN_TAG} Continue: dispatched runId=${r?.runId} for chat=${chatId}`);
|
|
580
|
-
}).catch((err) => {
|
|
581
|
-
logger.warn(`${PLUGIN_TAG} Continue dispatch failed: ${err.message}`);
|
|
582
|
-
telegramApi('sendMessage', {
|
|
583
|
-
chat_id: chatId,
|
|
584
|
-
text: `β οΈ Continue failed: ${err.message?.slice(0, 150) || 'unknown'}`,
|
|
585
|
-
}).catch(() => { });
|
|
586
|
-
});
|
|
587
|
-
result.text = 'π Continuingβ¦ (dispatched)';
|
|
588
|
-
}
|
|
589
|
-
else {
|
|
590
|
-
result.text = 'π Continue unavailable (subagent runtime missing)';
|
|
591
|
-
logger.warn(`${PLUGIN_TAG} Continue: api.runtime.subagent.run not available`);
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
if (answerId) {
|
|
595
|
-
if (action === 'details' && result.text) {
|
|
596
|
-
telegramApi('answerCallbackQuery', {
|
|
597
|
-
callback_query_id: answerId,
|
|
598
|
-
text: result.text,
|
|
599
|
-
show_alert: true,
|
|
600
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
601
|
-
}
|
|
602
|
-
else {
|
|
603
|
-
telegramApi('answerCallbackQuery', {
|
|
604
|
-
callback_query_id: answerId,
|
|
605
|
-
text: result.text || '',
|
|
606
|
-
}).catch((e) => logger.error(`${PLUGIN_TAG} answerCallbackQuery error: ${e.message}`));
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
return { handled: true };
|
|
610
|
-
});
|
|
611
|
-
// ββ Stage 4: Gateway-level UX metadata injection ββββββββββββββββββββββ
|
|
612
|
-
api.on('before_tool_call', (event, ctx) => {
|
|
613
|
-
const ev = event;
|
|
614
|
-
const ctxObj = ctx;
|
|
615
|
-
if (ev.toolName !== 'claude_session_send')
|
|
616
|
-
return;
|
|
617
|
-
if (!getUxBridgeAllSessions())
|
|
618
|
-
return;
|
|
619
|
-
if (ev.params?.telegramChatId)
|
|
620
|
-
return;
|
|
621
|
-
const sk = ctxObj.sessionKey || '';
|
|
622
|
-
const tgMatch = sk.match(/telegram:[^:]+:(-?\d+)(?::topic:(\d+))?/);
|
|
623
|
-
if (!tgMatch)
|
|
624
|
-
return;
|
|
625
|
-
const chatId = tgMatch[1];
|
|
626
|
-
const threadId = tgMatch[2] || undefined;
|
|
627
|
-
const sessionName = ev.params?.name;
|
|
628
|
-
logger.info(`${PLUGIN_TAG} [stage4] injecting UX metadata chatId=${chatId} threadId=${threadId || 'none'} session=${sessionName || '?'}`);
|
|
629
|
-
if (sessionName && typeof sessionName === 'string') {
|
|
630
|
-
const UX_META = Symbol.for('telegram-ux-bridge:metadata');
|
|
631
|
-
if (!globalThis[UX_META]) {
|
|
632
|
-
globalThis[UX_META] = new Map();
|
|
633
|
-
}
|
|
634
|
-
(globalThis[UX_META]).set(sessionName, { chatId, threadId, storedAt: Date.now() });
|
|
635
|
-
}
|
|
636
|
-
return {
|
|
637
|
-
params: {
|
|
638
|
-
...ev.params,
|
|
639
|
-
telegramChatId: chatId,
|
|
640
|
-
telegramThreadId: threadId,
|
|
641
|
-
},
|
|
642
|
-
};
|
|
643
|
-
});
|
|
644
|
-
logger.info(`${PLUGIN_TAG} event-reducer hooks registered (dispatch commands, model override, callbacks, stage4)`);
|
|
645
|
-
}); // end defaultRegisterGuard.guard
|
|
646
|
-
}
|
|
647
|
-
//# sourceMappingURL=event-reducer.js.map
|