@a1hvdy/cc-openclaw 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +207 -0
- package/configs/.gitkeep +0 -0
- package/configs/council-reviewer-prompt.md +82 -0
- package/configs/council-system-prompt.md +141 -0
- package/dist/scripts/bench/ab-harness.d.ts +58 -0
- package/dist/scripts/bench/ab-harness.d.ts.map +1 -0
- package/dist/scripts/bench/ab-harness.js +78 -0
- package/dist/scripts/bench/ab-harness.js.map +1 -0
- package/dist/src/channels/adapter.d.ts +103 -0
- package/dist/src/channels/adapter.d.ts.map +1 -0
- package/dist/src/channels/adapter.js +38 -0
- package/dist/src/channels/adapter.js.map +1 -0
- package/dist/src/channels/telegram/completion-summary.d.ts +22 -0
- package/dist/src/channels/telegram/completion-summary.d.ts.map +1 -0
- package/dist/src/channels/telegram/completion-summary.js +186 -0
- package/dist/src/channels/telegram/completion-summary.js.map +1 -0
- package/dist/src/channels/telegram/error-renderer.d.ts +30 -0
- package/dist/src/channels/telegram/error-renderer.d.ts.map +1 -0
- package/dist/src/channels/telegram/error-renderer.js +133 -0
- package/dist/src/channels/telegram/error-renderer.js.map +1 -0
- package/dist/src/channels/telegram/event-reducer.d.ts +34 -0
- package/dist/src/channels/telegram/event-reducer.d.ts.map +1 -0
- package/dist/src/channels/telegram/event-reducer.js +579 -0
- package/dist/src/channels/telegram/event-reducer.js.map +1 -0
- package/dist/src/channels/telegram/index.d.ts +14 -0
- package/dist/src/channels/telegram/index.d.ts.map +1 -0
- package/dist/src/channels/telegram/index.js +14 -0
- package/dist/src/channels/telegram/index.js.map +1 -0
- package/dist/src/channels/telegram/injector.d.ts +54 -0
- package/dist/src/channels/telegram/injector.d.ts.map +1 -0
- package/dist/src/channels/telegram/injector.js +200 -0
- package/dist/src/channels/telegram/injector.js.map +1 -0
- package/dist/src/channels/telegram/live-card.d.ts +230 -0
- package/dist/src/channels/telegram/live-card.d.ts.map +1 -0
- package/dist/src/channels/telegram/live-card.js +916 -0
- package/dist/src/channels/telegram/live-card.js.map +1 -0
- package/dist/src/channels/telegram/state-machine.d.ts +23 -0
- package/dist/src/channels/telegram/state-machine.d.ts.map +1 -0
- package/dist/src/channels/telegram/state-machine.js +72 -0
- package/dist/src/channels/telegram/state-machine.js.map +1 -0
- package/dist/src/channels/telegram/tool-tracker.d.ts +147 -0
- package/dist/src/channels/telegram/tool-tracker.d.ts.map +1 -0
- package/dist/src/channels/telegram/tool-tracker.js +520 -0
- package/dist/src/channels/telegram/tool-tracker.js.map +1 -0
- package/dist/src/circuit-breaker.d.ts +22 -0
- package/dist/src/circuit-breaker.d.ts.map +1 -0
- package/dist/src/circuit-breaker.js +47 -0
- package/dist/src/circuit-breaker.js.map +1 -0
- package/dist/src/command-router/cc-handler.d.ts +67 -0
- package/dist/src/command-router/cc-handler.d.ts.map +1 -0
- package/dist/src/command-router/cc-handler.js +980 -0
- package/dist/src/command-router/cc-handler.js.map +1 -0
- package/dist/src/command-router/index.d.ts +3 -0
- package/dist/src/command-router/index.d.ts.map +1 -0
- package/dist/src/command-router/index.js +2 -0
- package/dist/src/command-router/index.js.map +1 -0
- package/dist/src/constants.d.ts +132 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +140 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/council/consensus.d.ts +21 -0
- package/dist/src/council/consensus.d.ts.map +1 -0
- package/dist/src/council/consensus.js +52 -0
- package/dist/src/council/consensus.js.map +1 -0
- package/dist/src/council/council.d.ts +68 -0
- package/dist/src/council/council.d.ts.map +1 -0
- package/dist/src/council/council.js +914 -0
- package/dist/src/council/council.js.map +1 -0
- package/dist/src/council/index.d.ts +3 -0
- package/dist/src/council/index.d.ts.map +1 -0
- package/dist/src/council/index.js +3 -0
- package/dist/src/council/index.js.map +1 -0
- package/dist/src/engines/base-oneshot-session.d.ts +88 -0
- package/dist/src/engines/base-oneshot-session.d.ts.map +1 -0
- package/dist/src/engines/base-oneshot-session.js +228 -0
- package/dist/src/engines/base-oneshot-session.js.map +1 -0
- package/dist/src/engines/index.d.ts +7 -0
- package/dist/src/engines/index.d.ts.map +1 -0
- package/dist/src/engines/index.js +7 -0
- package/dist/src/engines/index.js.map +1 -0
- package/dist/src/engines/persistent-codex-session.d.ts +17 -0
- package/dist/src/engines/persistent-codex-session.d.ts.map +1 -0
- package/dist/src/engines/persistent-codex-session.js +106 -0
- package/dist/src/engines/persistent-codex-session.js.map +1 -0
- package/dist/src/engines/persistent-cursor-session.d.ts +22 -0
- package/dist/src/engines/persistent-cursor-session.d.ts.map +1 -0
- package/dist/src/engines/persistent-cursor-session.js +242 -0
- package/dist/src/engines/persistent-cursor-session.js.map +1 -0
- package/dist/src/engines/persistent-custom-session.d.ts +79 -0
- package/dist/src/engines/persistent-custom-session.d.ts.map +1 -0
- package/dist/src/engines/persistent-custom-session.js +939 -0
- package/dist/src/engines/persistent-custom-session.js.map +1 -0
- package/dist/src/engines/persistent-gemini-session.d.ts +22 -0
- package/dist/src/engines/persistent-gemini-session.d.ts.map +1 -0
- package/dist/src/engines/persistent-gemini-session.js +217 -0
- package/dist/src/engines/persistent-gemini-session.js.map +1 -0
- package/dist/src/engines/persistent-session.d.ts +77 -0
- package/dist/src/engines/persistent-session.d.ts.map +1 -0
- package/dist/src/engines/persistent-session.js +730 -0
- package/dist/src/engines/persistent-session.js.map +1 -0
- package/dist/src/health/handler.d.ts +40 -0
- package/dist/src/health/handler.d.ts.map +1 -0
- package/dist/src/health/handler.js +70 -0
- package/dist/src/health/handler.js.map +1 -0
- package/dist/src/health/index.d.ts +2 -0
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +2 -0
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/index.d.ts +49 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +84 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/auto-recovery.d.ts +45 -0
- package/dist/src/lib/auto-recovery.d.ts.map +1 -0
- package/dist/src/lib/auto-recovery.js +217 -0
- package/dist/src/lib/auto-recovery.js.map +1 -0
- package/dist/src/lib/cache-parity.d.ts +39 -0
- package/dist/src/lib/cache-parity.d.ts.map +1 -0
- package/dist/src/lib/cache-parity.js +92 -0
- package/dist/src/lib/cache-parity.js.map +1 -0
- package/dist/src/lib/circuit-breaker.d.ts +22 -0
- package/dist/src/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/src/lib/circuit-breaker.js +47 -0
- package/dist/src/lib/circuit-breaker.js.map +1 -0
- package/dist/src/lib/config.d.ts +74 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +244 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/drift-detector.d.ts +47 -0
- package/dist/src/lib/drift-detector.d.ts.map +1 -0
- package/dist/src/lib/drift-detector.js +192 -0
- package/dist/src/lib/drift-detector.js.map +1 -0
- package/dist/src/lib/error-formatter.d.ts +78 -0
- package/dist/src/lib/error-formatter.d.ts.map +1 -0
- package/dist/src/lib/error-formatter.js +149 -0
- package/dist/src/lib/error-formatter.js.map +1 -0
- package/dist/src/lib/heartbeat-workaround.d.ts +45 -0
- package/dist/src/lib/heartbeat-workaround.d.ts.map +1 -0
- package/dist/src/lib/heartbeat-workaround.js +61 -0
- package/dist/src/lib/heartbeat-workaround.js.map +1 -0
- package/dist/src/lib/index.d.ts +8 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +8 -0
- package/dist/src/lib/index.js.map +1 -0
- package/dist/src/lib/register-guard.d.ts +49 -0
- package/dist/src/lib/register-guard.d.ts.map +1 -0
- package/dist/src/lib/register-guard.js +73 -0
- package/dist/src/lib/register-guard.js.map +1 -0
- package/dist/src/lib/route-flag.d.ts +50 -0
- package/dist/src/lib/route-flag.d.ts.map +1 -0
- package/dist/src/lib/route-flag.js +52 -0
- package/dist/src/lib/route-flag.js.map +1 -0
- package/dist/src/lib/sysprompt-strip.d.ts +54 -0
- package/dist/src/lib/sysprompt-strip.d.ts.map +1 -0
- package/dist/src/lib/sysprompt-strip.js +75 -0
- package/dist/src/lib/sysprompt-strip.js.map +1 -0
- package/dist/src/lib/telemetry.d.ts +39 -0
- package/dist/src/lib/telemetry.d.ts.map +1 -0
- package/dist/src/lib/telemetry.js +73 -0
- package/dist/src/lib/telemetry.js.map +1 -0
- package/dist/src/lib/test-mode.d.ts +27 -0
- package/dist/src/lib/test-mode.d.ts.map +1 -0
- package/dist/src/lib/test-mode.js +38 -0
- package/dist/src/lib/test-mode.js.map +1 -0
- package/dist/src/lib/vendor-paths.d.ts +15 -0
- package/dist/src/lib/vendor-paths.d.ts.map +1 -0
- package/dist/src/lib/vendor-paths.js +32 -0
- package/dist/src/lib/vendor-paths.js.map +1 -0
- package/dist/src/logger.d.ts +17 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +46 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/mcp/bridge.d.ts +22 -0
- package/dist/src/mcp/bridge.d.ts.map +1 -0
- package/dist/src/mcp/bridge.js +78 -0
- package/dist/src/mcp/bridge.js.map +1 -0
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +2 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/models.d.ts +70 -0
- package/dist/src/models.d.ts.map +1 -0
- package/dist/src/models.js +289 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/openai-compat/cli-stream-parser.d.ts +135 -0
- package/dist/src/openai-compat/cli-stream-parser.d.ts.map +1 -0
- package/dist/src/openai-compat/cli-stream-parser.js +195 -0
- package/dist/src/openai-compat/cli-stream-parser.js.map +1 -0
- package/dist/src/openai-compat/index.d.ts +2 -0
- package/dist/src/openai-compat/index.d.ts.map +1 -0
- package/dist/src/openai-compat/index.js +2 -0
- package/dist/src/openai-compat/index.js.map +1 -0
- package/dist/src/openai-compat/openai-compat.d.ts +281 -0
- package/dist/src/openai-compat/openai-compat.d.ts.map +1 -0
- package/dist/src/openai-compat/openai-compat.js +939 -0
- package/dist/src/openai-compat/openai-compat.js.map +1 -0
- package/dist/src/openai-compat/skill-resolver.d.ts +36 -0
- package/dist/src/openai-compat/skill-resolver.d.ts.map +1 -0
- package/dist/src/openai-compat/skill-resolver.js +134 -0
- package/dist/src/openai-compat/skill-resolver.js.map +1 -0
- package/dist/src/openai-compat/sse-translator.d.ts +32 -0
- package/dist/src/openai-compat/sse-translator.d.ts.map +1 -0
- package/dist/src/openai-compat/sse-translator.js +155 -0
- package/dist/src/openai-compat/sse-translator.js.map +1 -0
- package/dist/src/proxy/anthropic-adapter.d.ts +137 -0
- package/dist/src/proxy/anthropic-adapter.d.ts.map +1 -0
- package/dist/src/proxy/anthropic-adapter.js +392 -0
- package/dist/src/proxy/anthropic-adapter.js.map +1 -0
- package/dist/src/proxy/handler.d.ts +40 -0
- package/dist/src/proxy/handler.d.ts.map +1 -0
- package/dist/src/proxy/handler.js +378 -0
- package/dist/src/proxy/handler.js.map +1 -0
- package/dist/src/proxy/index.d.ts +5 -0
- package/dist/src/proxy/index.d.ts.map +1 -0
- package/dist/src/proxy/index.js +5 -0
- package/dist/src/proxy/index.js.map +1 -0
- package/dist/src/proxy/schema-cleaner.d.ts +12 -0
- package/dist/src/proxy/schema-cleaner.d.ts.map +1 -0
- package/dist/src/proxy/schema-cleaner.js +34 -0
- package/dist/src/proxy/schema-cleaner.js.map +1 -0
- package/dist/src/proxy/thought-cache.d.ts +20 -0
- package/dist/src/proxy/thought-cache.d.ts.map +1 -0
- package/dist/src/proxy/thought-cache.js +53 -0
- package/dist/src/proxy/thought-cache.js.map +1 -0
- package/dist/src/session/embedded-server.d.ts +26 -0
- package/dist/src/session/embedded-server.d.ts.map +1 -0
- package/dist/src/session/embedded-server.js +367 -0
- package/dist/src/session/embedded-server.js.map +1 -0
- package/dist/src/session/inbox-manager.d.ts +39 -0
- package/dist/src/session/inbox-manager.d.ts.map +1 -0
- package/dist/src/session/inbox-manager.js +111 -0
- package/dist/src/session/inbox-manager.js.map +1 -0
- package/dist/src/session/index.d.ts +4 -0
- package/dist/src/session/index.d.ts.map +1 -0
- package/dist/src/session/index.js +4 -0
- package/dist/src/session/index.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +212 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +1351 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session-bootstrap/cwd-patch.d.ts +51 -0
- package/dist/src/session-bootstrap/cwd-patch.d.ts.map +1 -0
- package/dist/src/session-bootstrap/cwd-patch.js +955 -0
- package/dist/src/session-bootstrap/cwd-patch.js.map +1 -0
- package/dist/src/session-bootstrap/index.d.ts +4 -0
- package/dist/src/session-bootstrap/index.d.ts.map +1 -0
- package/dist/src/session-bootstrap/index.js +4 -0
- package/dist/src/session-bootstrap/index.js.map +1 -0
- package/dist/src/session-bootstrap/sysprompt-strip.d.ts +26 -0
- package/dist/src/session-bootstrap/sysprompt-strip.d.ts.map +1 -0
- package/dist/src/session-bootstrap/sysprompt-strip.js +57 -0
- package/dist/src/session-bootstrap/sysprompt-strip.js.map +1 -0
- package/dist/src/session-bootstrap/think-conflict-resolver.d.ts +33 -0
- package/dist/src/session-bootstrap/think-conflict-resolver.d.ts.map +1 -0
- package/dist/src/session-bootstrap/think-conflict-resolver.js +234 -0
- package/dist/src/session-bootstrap/think-conflict-resolver.js.map +1 -0
- package/dist/src/types.d.ts +489 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/validation.d.ts +32 -0
- package/dist/src/validation.d.ts.map +1 -0
- package/dist/src/validation.js +104 -0
- package/dist/src/validation.js.map +1 -0
- package/dist/tests/_helpers/subprocess-mock.d.ts +35 -0
- package/dist/tests/_helpers/subprocess-mock.d.ts.map +1 -0
- package/dist/tests/_helpers/subprocess-mock.js +136 -0
- package/dist/tests/_helpers/subprocess-mock.js.map +1 -0
- package/dist/tests/auto-recovery.test.d.ts +2 -0
- package/dist/tests/auto-recovery.test.d.ts.map +1 -0
- package/dist/tests/auto-recovery.test.js +189 -0
- package/dist/tests/auto-recovery.test.js.map +1 -0
- package/dist/tests/bench-harness.test.d.ts +2 -0
- package/dist/tests/bench-harness.test.d.ts.map +1 -0
- package/dist/tests/bench-harness.test.js +21 -0
- package/dist/tests/bench-harness.test.js.map +1 -0
- package/dist/tests/cache-parity.test.d.ts +2 -0
- package/dist/tests/cache-parity.test.d.ts.map +1 -0
- package/dist/tests/cache-parity.test.js +401 -0
- package/dist/tests/cache-parity.test.js.map +1 -0
- package/dist/tests/command-router.test.d.ts +2 -0
- package/dist/tests/command-router.test.d.ts.map +1 -0
- package/dist/tests/command-router.test.js +60 -0
- package/dist/tests/command-router.test.js.map +1 -0
- package/dist/tests/council.test.d.ts +2 -0
- package/dist/tests/council.test.d.ts.map +1 -0
- package/dist/tests/council.test.js +20 -0
- package/dist/tests/council.test.js.map +1 -0
- package/dist/tests/drift-detector.test.d.ts +2 -0
- package/dist/tests/drift-detector.test.d.ts.map +1 -0
- package/dist/tests/drift-detector.test.js +268 -0
- package/dist/tests/drift-detector.test.js.map +1 -0
- package/dist/tests/eager-bootstrap-gating.test.d.ts +9 -0
- package/dist/tests/eager-bootstrap-gating.test.d.ts.map +1 -0
- package/dist/tests/eager-bootstrap-gating.test.js +97 -0
- package/dist/tests/eager-bootstrap-gating.test.js.map +1 -0
- package/dist/tests/engines.test.d.ts +2 -0
- package/dist/tests/engines.test.d.ts.map +1 -0
- package/dist/tests/engines.test.js +8 -0
- package/dist/tests/engines.test.js.map +1 -0
- package/dist/tests/error-formatter.test.d.ts +2 -0
- package/dist/tests/error-formatter.test.d.ts.map +1 -0
- package/dist/tests/error-formatter.test.js +220 -0
- package/dist/tests/error-formatter.test.js.map +1 -0
- package/dist/tests/health.test.d.ts +2 -0
- package/dist/tests/health.test.d.ts.map +1 -0
- package/dist/tests/health.test.js +110 -0
- package/dist/tests/health.test.js.map +1 -0
- package/dist/tests/heartbeat-workaround.test.d.ts +2 -0
- package/dist/tests/heartbeat-workaround.test.d.ts.map +1 -0
- package/dist/tests/heartbeat-workaround.test.js +90 -0
- package/dist/tests/heartbeat-workaround.test.js.map +1 -0
- package/dist/tests/index.test.d.ts +2 -0
- package/dist/tests/index.test.d.ts.map +1 -0
- package/dist/tests/index.test.js +7 -0
- package/dist/tests/index.test.js.map +1 -0
- package/dist/tests/lib-sysprompt-strip.test.d.ts +2 -0
- package/dist/tests/lib-sysprompt-strip.test.d.ts.map +1 -0
- package/dist/tests/lib-sysprompt-strip.test.js +145 -0
- package/dist/tests/lib-sysprompt-strip.test.js.map +1 -0
- package/dist/tests/listener-activation.test.d.ts +2 -0
- package/dist/tests/listener-activation.test.d.ts.map +1 -0
- package/dist/tests/listener-activation.test.js +87 -0
- package/dist/tests/listener-activation.test.js.map +1 -0
- package/dist/tests/mcp-bridge.test.d.ts +2 -0
- package/dist/tests/mcp-bridge.test.d.ts.map +1 -0
- package/dist/tests/mcp-bridge.test.js +137 -0
- package/dist/tests/mcp-bridge.test.js.map +1 -0
- package/dist/tests/openai-compat.test.d.ts +2 -0
- package/dist/tests/openai-compat.test.d.ts.map +1 -0
- package/dist/tests/openai-compat.test.js +8 -0
- package/dist/tests/openai-compat.test.js.map +1 -0
- package/dist/tests/proxy-heartbeat-integration.test.d.ts +15 -0
- package/dist/tests/proxy-heartbeat-integration.test.d.ts.map +1 -0
- package/dist/tests/proxy-heartbeat-integration.test.js +122 -0
- package/dist/tests/proxy-heartbeat-integration.test.js.map +1 -0
- package/dist/tests/proxy.test.d.ts +2 -0
- package/dist/tests/proxy.test.d.ts.map +1 -0
- package/dist/tests/proxy.test.js +8 -0
- package/dist/tests/proxy.test.js.map +1 -0
- package/dist/tests/register-guard-stacking.test.d.ts +2 -0
- package/dist/tests/register-guard-stacking.test.d.ts.map +1 -0
- package/dist/tests/register-guard-stacking.test.js +61 -0
- package/dist/tests/register-guard-stacking.test.js.map +1 -0
- package/dist/tests/register-guard.test.d.ts +2 -0
- package/dist/tests/register-guard.test.d.ts.map +1 -0
- package/dist/tests/register-guard.test.js +129 -0
- package/dist/tests/register-guard.test.js.map +1 -0
- package/dist/tests/route-flag-rollback.test.d.ts +2 -0
- package/dist/tests/route-flag-rollback.test.d.ts.map +1 -0
- package/dist/tests/route-flag-rollback.test.js +70 -0
- package/dist/tests/route-flag-rollback.test.js.map +1 -0
- package/dist/tests/route-flag.test.d.ts +2 -0
- package/dist/tests/route-flag.test.d.ts.map +1 -0
- package/dist/tests/route-flag.test.js +101 -0
- package/dist/tests/route-flag.test.js.map +1 -0
- package/dist/tests/session-bootstrap.test.d.ts +2 -0
- package/dist/tests/session-bootstrap.test.d.ts.map +1 -0
- package/dist/tests/session-bootstrap.test.js +183 -0
- package/dist/tests/session-bootstrap.test.js.map +1 -0
- package/dist/tests/session.test.d.ts +2 -0
- package/dist/tests/session.test.d.ts.map +1 -0
- package/dist/tests/session.test.js +17 -0
- package/dist/tests/session.test.js.map +1 -0
- package/dist/tests/state-machine.test.d.ts +2 -0
- package/dist/tests/state-machine.test.d.ts.map +1 -0
- package/dist/tests/state-machine.test.js +133 -0
- package/dist/tests/state-machine.test.js.map +1 -0
- package/dist/tests/streaming/cli-stream-parser.test.d.ts +2 -0
- package/dist/tests/streaming/cli-stream-parser.test.d.ts.map +1 -0
- package/dist/tests/streaming/cli-stream-parser.test.js +233 -0
- package/dist/tests/streaming/cli-stream-parser.test.js.map +1 -0
- package/dist/tests/streaming/feature-flag.test.d.ts +14 -0
- package/dist/tests/streaming/feature-flag.test.d.ts.map +1 -0
- package/dist/tests/streaming/feature-flag.test.js +163 -0
- package/dist/tests/streaming/feature-flag.test.js.map +1 -0
- package/dist/tests/streaming/no-tools-prompt.test.d.ts +17 -0
- package/dist/tests/streaming/no-tools-prompt.test.d.ts.map +1 -0
- package/dist/tests/streaming/no-tools-prompt.test.js +229 -0
- package/dist/tests/streaming/no-tools-prompt.test.js.map +1 -0
- package/dist/tests/streaming/skill-plus-tools.test.d.ts +14 -0
- package/dist/tests/streaming/skill-plus-tools.test.d.ts.map +1 -0
- package/dist/tests/streaming/skill-plus-tools.test.js +234 -0
- package/dist/tests/streaming/skill-plus-tools.test.js.map +1 -0
- package/dist/tests/streaming/sse-translator.test.d.ts +2 -0
- package/dist/tests/streaming/sse-translator.test.d.ts.map +1 -0
- package/dist/tests/streaming/sse-translator.test.js +227 -0
- package/dist/tests/streaming/sse-translator.test.js.map +1 -0
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts +11 -0
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts.map +1 -0
- package/dist/tests/streaming/tool-result-roundtrip.test.js +215 -0
- package/dist/tests/streaming/tool-result-roundtrip.test.js.map +1 -0
- package/dist/tests/streaming/tool-use-translation.test.d.ts +10 -0
- package/dist/tests/streaming/tool-use-translation.test.d.ts.map +1 -0
- package/dist/tests/streaming/tool-use-translation.test.js +251 -0
- package/dist/tests/streaming/tool-use-translation.test.js.map +1 -0
- package/dist/tests/telegram-bridge.test.d.ts +2 -0
- package/dist/tests/telegram-bridge.test.d.ts.map +1 -0
- package/dist/tests/telegram-bridge.test.js +17 -0
- package/dist/tests/telegram-bridge.test.js.map +1 -0
- package/dist/tests/telegram-injector.test.d.ts +2 -0
- package/dist/tests/telegram-injector.test.d.ts.map +1 -0
- package/dist/tests/telegram-injector.test.js +74 -0
- package/dist/tests/telegram-injector.test.js.map +1 -0
- package/dist/tests/telemetry.test.d.ts +2 -0
- package/dist/tests/telemetry.test.d.ts.map +1 -0
- package/dist/tests/telemetry.test.js +405 -0
- package/dist/tests/telemetry.test.js.map +1 -0
- package/dist/tests/test-mode.test.d.ts +2 -0
- package/dist/tests/test-mode.test.d.ts.map +1 -0
- package/dist/tests/test-mode.test.js +39 -0
- package/dist/tests/test-mode.test.js.map +1 -0
- package/mcp-config.template.json +13 -0
- package/mcp-tools.json +1 -0
- package/openclaw-mcp-bridge.cjs +152 -0
- package/openclaw.plugin.json +30 -0
- package/package.json +45 -0
- package/skills/.gitkeep +0 -0
- package/stubs/commands-status-deps.runtime.js +10 -0
- package/stubs/status.runtime.js +149 -0
- package/vendor/base-oneshot-session.d.ts +87 -0
- package/vendor/base-oneshot-session.js +227 -0
- package/vendor/base-oneshot-session.js.map +1 -0
- package/vendor/circuit-breaker.d.ts +21 -0
- package/vendor/circuit-breaker.js +47 -0
- package/vendor/circuit-breaker.js.map +1 -0
- package/vendor/consensus.d.ts +20 -0
- package/vendor/consensus.js +52 -0
- package/vendor/consensus.js.map +1 -0
- package/vendor/constants.d.ts +130 -0
- package/vendor/constants.js +139 -0
- package/vendor/constants.js.map +1 -0
- package/vendor/council.d.ts +67 -0
- package/vendor/council.js +913 -0
- package/vendor/council.js.map +1 -0
- package/vendor/embedded-server.d.ts +25 -0
- package/vendor/embedded-server.js +360 -0
- package/vendor/embedded-server.js.map +1 -0
- package/vendor/inbox-manager.d.ts +38 -0
- package/vendor/inbox-manager.js +111 -0
- package/vendor/inbox-manager.js.map +1 -0
- package/vendor/index.d.ts +63 -0
- package/vendor/index.js +705 -0
- package/vendor/index.js.map +1 -0
- package/vendor/logger.d.ts +16 -0
- package/vendor/logger.js +44 -0
- package/vendor/logger.js.map +1 -0
- package/vendor/models.d.ts +69 -0
- package/vendor/models.js +289 -0
- package/vendor/models.js.map +1 -0
- package/vendor/openai-compat.d.ts +197 -0
- package/vendor/openai-compat.js +721 -0
- package/vendor/openai-compat.js.map +1 -0
- package/vendor/persistent-codex-session.d.ts +16 -0
- package/vendor/persistent-codex-session.js +105 -0
- package/vendor/persistent-codex-session.js.map +1 -0
- package/vendor/persistent-cursor-session.d.ts +21 -0
- package/vendor/persistent-cursor-session.js +241 -0
- package/vendor/persistent-cursor-session.js.map +1 -0
- package/vendor/persistent-custom-session.d.ts +78 -0
- package/vendor/persistent-custom-session.js +937 -0
- package/vendor/persistent-custom-session.js.map +1 -0
- package/vendor/persistent-gemini-session.d.ts +21 -0
- package/vendor/persistent-gemini-session.js +216 -0
- package/vendor/persistent-gemini-session.js.map +1 -0
- package/vendor/persistent-session.d.ts +74 -0
- package/vendor/persistent-session.js +684 -0
- package/vendor/persistent-session.js.map +1 -0
- package/vendor/proxy/anthropic-adapter.d.ts +136 -0
- package/vendor/proxy/anthropic-adapter.js +392 -0
- package/vendor/proxy/anthropic-adapter.js.map +1 -0
- package/vendor/proxy/handler.d.ts +39 -0
- package/vendor/proxy/handler.js +323 -0
- package/vendor/proxy/handler.js.map +1 -0
- package/vendor/proxy/schema-cleaner.d.ts +11 -0
- package/vendor/proxy/schema-cleaner.js +34 -0
- package/vendor/proxy/schema-cleaner.js.map +1 -0
- package/vendor/proxy/thought-cache.d.ts +19 -0
- package/vendor/proxy/thought-cache.js +53 -0
- package/vendor/proxy/thought-cache.js.map +1 -0
- package/vendor/session-manager.d.ts +211 -0
- package/vendor/session-manager.js +1345 -0
- package/vendor/session-manager.js.map +1 -0
- package/vendor/skill-resolver.js +107 -0
- package/vendor/types.d.ts +466 -0
- package/vendor/types.js +8 -0
- package/vendor/types.js.map +1 -0
- package/vendor/validation.d.ts +31 -0
- package/vendor/validation.js +104 -0
- package/vendor/validation.js.map +1 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI streaming output parser.
|
|
3
|
+
*
|
|
4
|
+
* Reads NDJSON from `claude --output-format=stream-json --include-partial-messages`
|
|
5
|
+
* and emits typed events. The CLI's stream-json wraps Anthropic Messages API
|
|
6
|
+
* stream events inside an envelope:
|
|
7
|
+
*
|
|
8
|
+
* {"type":"stream_event","event":{<anthropic_event>},...}
|
|
9
|
+
*
|
|
10
|
+
* Other envelope types include `system`, `assistant`, `rate_limit_event`,
|
|
11
|
+
* `result`, plus hook lifecycle events.
|
|
12
|
+
*
|
|
13
|
+
* This module unwraps `stream_event` envelopes and emits the inner Anthropic
|
|
14
|
+
* Messages API events directly. Other envelope types pass through with their
|
|
15
|
+
* own ParsedEvent variants so downstream consumers can react (e.g. the budget
|
|
16
|
+
* guard listens to `rate_limit_event` and `result`).
|
|
17
|
+
*
|
|
18
|
+
* Captured against Claude CLI v2.1.119. Fixture corpus lives at
|
|
19
|
+
* tests/streaming/fixtures/*.ndjson.
|
|
20
|
+
*/
|
|
21
|
+
export type AnthropicEvent = {
|
|
22
|
+
type: 'message_start';
|
|
23
|
+
message: AnthropicMessage;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'content_block_start';
|
|
26
|
+
index: number;
|
|
27
|
+
content_block: ContentBlockStart;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'content_block_delta';
|
|
30
|
+
index: number;
|
|
31
|
+
delta: ContentBlockDelta;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'content_block_stop';
|
|
34
|
+
index: number;
|
|
35
|
+
} | {
|
|
36
|
+
type: 'message_delta';
|
|
37
|
+
delta: MessageDeltaBody;
|
|
38
|
+
usage?: MessageUsage;
|
|
39
|
+
} | {
|
|
40
|
+
type: 'message_stop';
|
|
41
|
+
} | {
|
|
42
|
+
type: 'error';
|
|
43
|
+
error: {
|
|
44
|
+
type: string;
|
|
45
|
+
message: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export interface AnthropicMessage {
|
|
49
|
+
id: string;
|
|
50
|
+
model: string;
|
|
51
|
+
role?: string;
|
|
52
|
+
content?: unknown[];
|
|
53
|
+
stop_reason?: string | null;
|
|
54
|
+
stop_sequence?: string | null;
|
|
55
|
+
usage?: MessageUsage;
|
|
56
|
+
}
|
|
57
|
+
export interface MessageUsage {
|
|
58
|
+
input_tokens?: number;
|
|
59
|
+
output_tokens?: number;
|
|
60
|
+
cache_creation_input_tokens?: number;
|
|
61
|
+
cache_read_input_tokens?: number;
|
|
62
|
+
}
|
|
63
|
+
export interface MessageDeltaBody {
|
|
64
|
+
stop_reason?: string;
|
|
65
|
+
stop_sequence?: string | null;
|
|
66
|
+
stop_details?: unknown;
|
|
67
|
+
}
|
|
68
|
+
export type ContentBlockStart = {
|
|
69
|
+
type: 'text';
|
|
70
|
+
text: string;
|
|
71
|
+
} | {
|
|
72
|
+
type: 'tool_use';
|
|
73
|
+
id: string;
|
|
74
|
+
name: string;
|
|
75
|
+
input: Record<string, unknown>;
|
|
76
|
+
caller?: unknown;
|
|
77
|
+
} | {
|
|
78
|
+
type: 'thinking';
|
|
79
|
+
thinking: string;
|
|
80
|
+
signature: string;
|
|
81
|
+
};
|
|
82
|
+
export type ContentBlockDelta = {
|
|
83
|
+
type: 'text_delta';
|
|
84
|
+
text: string;
|
|
85
|
+
} | {
|
|
86
|
+
type: 'input_json_delta';
|
|
87
|
+
partial_json: string;
|
|
88
|
+
} | {
|
|
89
|
+
type: 'thinking_delta';
|
|
90
|
+
thinking: string;
|
|
91
|
+
} | {
|
|
92
|
+
type: 'signature_delta';
|
|
93
|
+
signature: string;
|
|
94
|
+
};
|
|
95
|
+
export type ParsedEvent = AnthropicEvent | {
|
|
96
|
+
type: 'system';
|
|
97
|
+
subtype: string;
|
|
98
|
+
raw: Record<string, unknown>;
|
|
99
|
+
} | {
|
|
100
|
+
type: 'assistant';
|
|
101
|
+
message: AnthropicMessage;
|
|
102
|
+
sessionId?: string;
|
|
103
|
+
parentToolUseId?: string | null;
|
|
104
|
+
} | {
|
|
105
|
+
type: 'rate_limit_event';
|
|
106
|
+
rateLimitInfo: Record<string, unknown>;
|
|
107
|
+
} | {
|
|
108
|
+
type: 'result';
|
|
109
|
+
subtype: string;
|
|
110
|
+
isError: boolean;
|
|
111
|
+
result?: string;
|
|
112
|
+
durationMs?: number;
|
|
113
|
+
usage?: MessageUsage;
|
|
114
|
+
totalCostUsd?: number;
|
|
115
|
+
raw: Record<string, unknown>;
|
|
116
|
+
} | {
|
|
117
|
+
type: 'unknown';
|
|
118
|
+
raw: unknown;
|
|
119
|
+
} | {
|
|
120
|
+
type: 'parse_error';
|
|
121
|
+
error: {
|
|
122
|
+
type: string;
|
|
123
|
+
message: string;
|
|
124
|
+
};
|
|
125
|
+
rawLine?: string;
|
|
126
|
+
};
|
|
127
|
+
export interface CliStreamParser {
|
|
128
|
+
/** Push a chunk of stdout. Returns events derivable from any complete lines.
|
|
129
|
+
* Incomplete trailing line stays in the buffer for the next call. */
|
|
130
|
+
push(chunk: string): ParsedEvent[];
|
|
131
|
+
/** Flush any remaining buffered partial line. Returns final events (or empty). */
|
|
132
|
+
flush(): ParsedEvent[];
|
|
133
|
+
}
|
|
134
|
+
export declare function createCliStreamParser(): CliStreamParser;
|
|
135
|
+
//# sourceMappingURL=cli-stream-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-stream-parser.d.ts","sourceRoot":"","sources":["../../../src/openai-compat/cli-stream-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude CLI streaming output parser.
|
|
3
|
+
*
|
|
4
|
+
* Reads NDJSON from `claude --output-format=stream-json --include-partial-messages`
|
|
5
|
+
* and emits typed events. The CLI's stream-json wraps Anthropic Messages API
|
|
6
|
+
* stream events inside an envelope:
|
|
7
|
+
*
|
|
8
|
+
* {"type":"stream_event","event":{<anthropic_event>},...}
|
|
9
|
+
*
|
|
10
|
+
* Other envelope types include `system`, `assistant`, `rate_limit_event`,
|
|
11
|
+
* `result`, plus hook lifecycle events.
|
|
12
|
+
*
|
|
13
|
+
* This module unwraps `stream_event` envelopes and emits the inner Anthropic
|
|
14
|
+
* Messages API events directly. Other envelope types pass through with their
|
|
15
|
+
* own ParsedEvent variants so downstream consumers can react (e.g. the budget
|
|
16
|
+
* guard listens to `rate_limit_event` and `result`).
|
|
17
|
+
*
|
|
18
|
+
* Captured against Claude CLI v2.1.119. Fixture corpus lives at
|
|
19
|
+
* tests/streaming/fixtures/*.ndjson.
|
|
20
|
+
*/
|
|
21
|
+
const MAX_LINE_BYTES = 64 * 1024; // 64KB per line cap
|
|
22
|
+
const MAX_BUFFER_BYTES = 1024 * 1024; // 1MB total buffer cap
|
|
23
|
+
export function createCliStreamParser() {
|
|
24
|
+
let buffer = '';
|
|
25
|
+
function parseLine(line) {
|
|
26
|
+
const trimmed = line.trim();
|
|
27
|
+
if (!trimmed)
|
|
28
|
+
return null;
|
|
29
|
+
if (trimmed.length > MAX_LINE_BYTES) {
|
|
30
|
+
return {
|
|
31
|
+
type: 'parse_error',
|
|
32
|
+
error: { type: 'line_too_large', message: `line exceeds ${MAX_LINE_BYTES} bytes (${trimmed.length})` },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
let value;
|
|
36
|
+
try {
|
|
37
|
+
value = JSON.parse(trimmed);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return {
|
|
41
|
+
type: 'parse_error',
|
|
42
|
+
error: { type: 'json_parse', message: err.message },
|
|
43
|
+
rawLine: trimmed.slice(0, 200),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return classify(value);
|
|
47
|
+
}
|
|
48
|
+
function classify(value) {
|
|
49
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
50
|
+
return { type: 'unknown', raw: value };
|
|
51
|
+
}
|
|
52
|
+
const obj = value;
|
|
53
|
+
const outerType = typeof obj.type === 'string' ? obj.type : '';
|
|
54
|
+
switch (outerType) {
|
|
55
|
+
case 'stream_event': {
|
|
56
|
+
const inner = obj.event;
|
|
57
|
+
if (!inner || typeof inner !== 'object') {
|
|
58
|
+
return { type: 'unknown', raw: value };
|
|
59
|
+
}
|
|
60
|
+
return classifyAnthropicEvent(inner) ?? { type: 'unknown', raw: value };
|
|
61
|
+
}
|
|
62
|
+
case 'system': {
|
|
63
|
+
const subtype = typeof obj.subtype === 'string' ? obj.subtype : 'unknown';
|
|
64
|
+
return { type: 'system', subtype, raw: obj };
|
|
65
|
+
}
|
|
66
|
+
case 'assistant': {
|
|
67
|
+
const message = obj.message;
|
|
68
|
+
if (!message || typeof message !== 'object') {
|
|
69
|
+
return { type: 'unknown', raw: value };
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
type: 'assistant',
|
|
73
|
+
message: message,
|
|
74
|
+
sessionId: typeof obj.session_id === 'string' ? obj.session_id : undefined,
|
|
75
|
+
parentToolUseId: (obj.parent_tool_use_id ?? null),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
case 'user':
|
|
79
|
+
case 'tool_use_start':
|
|
80
|
+
case 'tool_use_result':
|
|
81
|
+
// These envelope types may appear in piped-input mode; treat as unknown for now
|
|
82
|
+
return { type: 'unknown', raw: value };
|
|
83
|
+
case 'rate_limit_event': {
|
|
84
|
+
const rateLimitInfo = (obj.rate_limit_info ?? {});
|
|
85
|
+
return { type: 'rate_limit_event', rateLimitInfo };
|
|
86
|
+
}
|
|
87
|
+
case 'result': {
|
|
88
|
+
const subtype = typeof obj.subtype === 'string' ? obj.subtype : 'unknown';
|
|
89
|
+
const isError = obj.is_error === true;
|
|
90
|
+
return {
|
|
91
|
+
type: 'result',
|
|
92
|
+
subtype,
|
|
93
|
+
isError,
|
|
94
|
+
result: typeof obj.result === 'string' ? obj.result : undefined,
|
|
95
|
+
durationMs: typeof obj.duration_ms === 'number' ? obj.duration_ms : undefined,
|
|
96
|
+
usage: (obj.usage ?? undefined),
|
|
97
|
+
totalCostUsd: typeof obj.total_cost_usd === 'number' ? obj.total_cost_usd : undefined,
|
|
98
|
+
raw: obj,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
default:
|
|
102
|
+
return { type: 'unknown', raw: value };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function classifyAnthropicEvent(event) {
|
|
106
|
+
const t = typeof event.type === 'string' ? event.type : '';
|
|
107
|
+
switch (t) {
|
|
108
|
+
case 'message_start': {
|
|
109
|
+
const message = event.message;
|
|
110
|
+
if (!message || typeof message !== 'object')
|
|
111
|
+
return null;
|
|
112
|
+
return { type: 'message_start', message: message };
|
|
113
|
+
}
|
|
114
|
+
case 'content_block_start': {
|
|
115
|
+
if (typeof event.index !== 'number' || !event.content_block) {
|
|
116
|
+
return { type: 'parse_error', error: { type: 'malformed_content_block_start', message: 'missing index or content_block' } };
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
type: 'content_block_start',
|
|
120
|
+
index: event.index,
|
|
121
|
+
content_block: event.content_block,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
case 'content_block_delta': {
|
|
125
|
+
if (typeof event.index !== 'number' || !event.delta) {
|
|
126
|
+
return { type: 'parse_error', error: { type: 'malformed_content_block_delta', message: 'missing index or delta' } };
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
type: 'content_block_delta',
|
|
130
|
+
index: event.index,
|
|
131
|
+
delta: event.delta,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
case 'content_block_stop': {
|
|
135
|
+
if (typeof event.index !== 'number') {
|
|
136
|
+
return { type: 'parse_error', error: { type: 'malformed_content_block_stop', message: 'missing index' } };
|
|
137
|
+
}
|
|
138
|
+
return { type: 'content_block_stop', index: event.index };
|
|
139
|
+
}
|
|
140
|
+
case 'message_delta': {
|
|
141
|
+
const delta = (event.delta ?? {});
|
|
142
|
+
const usage = (event.usage ?? undefined);
|
|
143
|
+
return { type: 'message_delta', delta, usage };
|
|
144
|
+
}
|
|
145
|
+
case 'message_stop':
|
|
146
|
+
return { type: 'message_stop' };
|
|
147
|
+
case 'error': {
|
|
148
|
+
const err = (event.error ?? {});
|
|
149
|
+
return {
|
|
150
|
+
type: 'error',
|
|
151
|
+
error: { type: err.type ?? 'unknown', message: err.message ?? '' },
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
default:
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
push(chunk) {
|
|
160
|
+
buffer += chunk;
|
|
161
|
+
if (buffer.length > MAX_BUFFER_BYTES) {
|
|
162
|
+
// Reset buffer to avoid OOM; emit error
|
|
163
|
+
buffer = '';
|
|
164
|
+
return [
|
|
165
|
+
{
|
|
166
|
+
type: 'parse_error',
|
|
167
|
+
error: { type: 'buffer_overflow', message: `buffer exceeded ${MAX_BUFFER_BYTES} bytes; resetting` },
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
const events = [];
|
|
172
|
+
let nlIdx = buffer.indexOf('\n');
|
|
173
|
+
while (nlIdx !== -1) {
|
|
174
|
+
const line = buffer.slice(0, nlIdx);
|
|
175
|
+
buffer = buffer.slice(nlIdx + 1);
|
|
176
|
+
const parsed = parseLine(line);
|
|
177
|
+
if (parsed)
|
|
178
|
+
events.push(parsed);
|
|
179
|
+
nlIdx = buffer.indexOf('\n');
|
|
180
|
+
}
|
|
181
|
+
return events;
|
|
182
|
+
},
|
|
183
|
+
flush() {
|
|
184
|
+
const events = [];
|
|
185
|
+
if (buffer.trim()) {
|
|
186
|
+
const parsed = parseLine(buffer);
|
|
187
|
+
if (parsed)
|
|
188
|
+
events.push(parsed);
|
|
189
|
+
}
|
|
190
|
+
buffer = '';
|
|
191
|
+
return events;
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=cli-stream-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-stream-parser.js","sourceRoot":"","sources":["../../../src/openai-compat/cli-stream-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/openai-compat/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/openai-compat/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible /v1/chat/completions endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Bridges OpenAI API format to persistent Claude Code sessions, enabling
|
|
5
|
+
* webchat frontends (ChatGPT-Next-Web, Open WebUI, etc.) to use the plugin
|
|
6
|
+
* as a drop-in backend. Stateful sessions maximize Anthropic prompt caching.
|
|
7
|
+
*/
|
|
8
|
+
import * as http from 'node:http';
|
|
9
|
+
export interface OpenAIChatMessage {
|
|
10
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
11
|
+
content: string | Array<{
|
|
12
|
+
type?: string;
|
|
13
|
+
text?: string;
|
|
14
|
+
}> | null;
|
|
15
|
+
tool_calls?: Array<{
|
|
16
|
+
id: string;
|
|
17
|
+
type: 'function';
|
|
18
|
+
function: {
|
|
19
|
+
name: string;
|
|
20
|
+
arguments: string;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
tool_call_id?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface OpenAIChatCompletionRequest {
|
|
26
|
+
model?: string;
|
|
27
|
+
messages: OpenAIChatMessage[];
|
|
28
|
+
stream?: boolean;
|
|
29
|
+
temperature?: number;
|
|
30
|
+
max_tokens?: number;
|
|
31
|
+
max_completion_tokens?: number;
|
|
32
|
+
user?: string;
|
|
33
|
+
tools?: Array<{
|
|
34
|
+
type: 'function';
|
|
35
|
+
function: {
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
parameters: unknown;
|
|
39
|
+
};
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
export interface OpenAIToolCall {
|
|
43
|
+
id: string;
|
|
44
|
+
type: 'function';
|
|
45
|
+
function: {
|
|
46
|
+
name: string;
|
|
47
|
+
arguments: string;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export interface OpenAIChatCompletionResponse {
|
|
51
|
+
id: string;
|
|
52
|
+
object: 'chat.completion';
|
|
53
|
+
created: number;
|
|
54
|
+
model: string;
|
|
55
|
+
choices: Array<{
|
|
56
|
+
index: number;
|
|
57
|
+
message: {
|
|
58
|
+
role: 'assistant';
|
|
59
|
+
content: string | null;
|
|
60
|
+
tool_calls?: OpenAIToolCall[];
|
|
61
|
+
};
|
|
62
|
+
finish_reason: 'stop' | 'length' | 'tool_calls';
|
|
63
|
+
}>;
|
|
64
|
+
usage: {
|
|
65
|
+
prompt_tokens: number;
|
|
66
|
+
completion_tokens: number;
|
|
67
|
+
total_tokens: number;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export interface OpenAIChatCompletionChunk {
|
|
71
|
+
id: string;
|
|
72
|
+
object: 'chat.completion.chunk';
|
|
73
|
+
created: number;
|
|
74
|
+
model: string;
|
|
75
|
+
choices: Array<{
|
|
76
|
+
index: number;
|
|
77
|
+
delta: {
|
|
78
|
+
role?: string;
|
|
79
|
+
content?: string | null;
|
|
80
|
+
tool_calls?: Array<{
|
|
81
|
+
index: number;
|
|
82
|
+
id?: string;
|
|
83
|
+
type?: 'function';
|
|
84
|
+
function?: {
|
|
85
|
+
name?: string;
|
|
86
|
+
arguments?: string;
|
|
87
|
+
};
|
|
88
|
+
}>;
|
|
89
|
+
};
|
|
90
|
+
finish_reason: string | null;
|
|
91
|
+
}>;
|
|
92
|
+
usage?: {
|
|
93
|
+
prompt_tokens: number;
|
|
94
|
+
completion_tokens: number;
|
|
95
|
+
total_tokens: number;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Derive a session key from the request.
|
|
100
|
+
* Priority: X-Session-Id header > user field > sha1(model + systemPrompt) > "default"
|
|
101
|
+
*
|
|
102
|
+
* The system-prompt-hash fallback prevents the bug where every caller without
|
|
103
|
+
* X-Session-Id or `user` collapses onto a single shared "openai-default"
|
|
104
|
+
* plugin session. In multi-caller setups (OpenClaw routing the main agent,
|
|
105
|
+
* cron jobs, and subagents through the same gateway) that previously meant
|
|
106
|
+
* every request serialized against every other and frequently picked up the
|
|
107
|
+
* wrong session's appendSystemPrompt — also a privacy leak across callers.
|
|
108
|
+
*
|
|
109
|
+
* The model is mixed into the hash so that two callers with the same system
|
|
110
|
+
* prompt but different requested models don't collide and silently get
|
|
111
|
+
* responses from the wrong model. Originally diagnosed in PR #40 by
|
|
112
|
+
* @megayounus786.
|
|
113
|
+
*/
|
|
114
|
+
/**
|
|
115
|
+
* When set (to '1', 'true', 'yes'), the proxy preserves the pre-fix behavior:
|
|
116
|
+
* - tools injected into every user message
|
|
117
|
+
* - session key NOT fingerprinted by tools (same session across tool changes)
|
|
118
|
+
* Default (unset) is the new behavior: tools embedded in session system prompt
|
|
119
|
+
* at create time + session key fingerprinted by tools. The new behavior
|
|
120
|
+
* eliminates periodic latency spikes but does not support mutating the tool
|
|
121
|
+
* list within a single session (a new session is created when tools change).
|
|
122
|
+
*/
|
|
123
|
+
export declare function isToolsPerMessageModeEnabled(): boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Phase 2 R5: tool-stream mode flag. When `CC_OPENCLAW_TOOL_STREAM=1` AND the
|
|
126
|
+
* caller provides `tools[]`, cc-openclaw skips the defensive "no tools"
|
|
127
|
+
* system prompt and does NOT clear `sessionConfig.tools`, allowing Claude
|
|
128
|
+
* CLI's native tool_use events to flow through the new parser+translator
|
|
129
|
+
* pipeline (Phase 4 Pillar 0.5). Default off; opt-in for the new path.
|
|
130
|
+
*/
|
|
131
|
+
export declare function isToolStreamMode(): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Generate the "no built-in tools" system prompt preamble.
|
|
134
|
+
* The `toolLocation` parameter controls how the model is told where to find
|
|
135
|
+
* tool definitions — 'system' means "in the <available_tools> block below"
|
|
136
|
+
* (tools baked into system prompt), 'user' means "in <available_tools> tags
|
|
137
|
+
* in the user message" (legacy per-turn injection).
|
|
138
|
+
*/
|
|
139
|
+
export declare function noToolsSystemPrompt(toolLocation: 'system' | 'user'): string;
|
|
140
|
+
/**
|
|
141
|
+
* Build the full session system prompt for a Claude Code session with tools.
|
|
142
|
+
* Exported for testability — called from `handleChatCompletion`.
|
|
143
|
+
*
|
|
144
|
+
* - Default mode: tools are embedded in the system prompt (cacheable by Anthropic).
|
|
145
|
+
* - Legacy mode (OPENAI_COMPAT_TOOLS_PER_MESSAGE=1): tools are NOT embedded;
|
|
146
|
+
* they'll be injected per-turn in the user message instead.
|
|
147
|
+
*/
|
|
148
|
+
export declare function buildSessionSystemPrompt(tools: OpenAIChatCompletionRequest['tools'], callerSystemPrompt: string | undefined): string;
|
|
149
|
+
export declare function resolveSessionKey(body: OpenAIChatCompletionRequest, headers: http.IncomingHttpHeaders): string;
|
|
150
|
+
/** Build the full session name from a key */
|
|
151
|
+
export declare function sessionNameFromKey(key: string): string;
|
|
152
|
+
/**
|
|
153
|
+
* Convert OpenAI tool definitions into a structured prompt block.
|
|
154
|
+
* Injected into the user message so the CLI model sees tool definitions
|
|
155
|
+
* and responds with <tool_calls> tags when it wants to invoke a function.
|
|
156
|
+
*/
|
|
157
|
+
export declare function buildToolPromptBlock(tools: OpenAIChatCompletionRequest['tools']): string;
|
|
158
|
+
export interface ParsedToolCalls {
|
|
159
|
+
textContent: string | null;
|
|
160
|
+
toolCalls: OpenAIToolCall[];
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Parse tool_calls from CLI text output.
|
|
164
|
+
*
|
|
165
|
+
* Looks for <tool_calls>[...]</tool_calls> tags in the response text.
|
|
166
|
+
* Returns both the extracted text content (before/after tags) and any tool calls found.
|
|
167
|
+
*/
|
|
168
|
+
export declare function parseToolCallsFromText(text: string): ParsedToolCalls;
|
|
169
|
+
/**
|
|
170
|
+
* Serialize tool result messages into a text block for the CLI model.
|
|
171
|
+
* Converts OpenAI `tool` role messages into <tool_result> tags.
|
|
172
|
+
*
|
|
173
|
+
* Legacy path (CC_OPENCLAW_TOOL_STREAM=0). Used when the model receives
|
|
174
|
+
* tool definitions via the system prompt's <available_tools> XML block
|
|
175
|
+
* and emits <tool_calls> XML in response. Tool-stream mode (R4) uses
|
|
176
|
+
* `serializeToolResultsAsBlocks()` instead, returning native Anthropic
|
|
177
|
+
* `tool_result` content blocks that Claude CLI parses directly.
|
|
178
|
+
*/
|
|
179
|
+
export declare function serializeToolResults(messages: OpenAIChatMessage[]): string;
|
|
180
|
+
/**
|
|
181
|
+
* Phase 2 R4: native Anthropic `tool_result` content blocks.
|
|
182
|
+
*
|
|
183
|
+
* In tool-stream mode (CC_OPENCLAW_TOOL_STREAM=1), this replaces
|
|
184
|
+
* `serializeToolResults()` XML wrapping. Returns blocks shaped like:
|
|
185
|
+
*
|
|
186
|
+
* { type: 'tool_result', tool_use_id: 'toolu_X', content: '...' }
|
|
187
|
+
*
|
|
188
|
+
* Claude CLI's stream-json input format accepts these as user-message
|
|
189
|
+
* content arrays. The model then continues generation with the tool
|
|
190
|
+
* result in context, emitting either more `tool_use` events or final
|
|
191
|
+
* text — no XML round-tripping required.
|
|
192
|
+
*
|
|
193
|
+
* Wiring into the live request path lands with Phase 4 Pillar 0.5
|
|
194
|
+
* tasks R1+R2 (parser+translator response-side integration), where
|
|
195
|
+
* `extractUserMessage` produces structured content arrays in
|
|
196
|
+
* tool-stream mode.
|
|
197
|
+
*/
|
|
198
|
+
export interface AnthropicToolResultBlock {
|
|
199
|
+
type: 'tool_result';
|
|
200
|
+
tool_use_id: string;
|
|
201
|
+
content: string;
|
|
202
|
+
}
|
|
203
|
+
export declare function serializeToolResultsAsBlocks(messages: OpenAIChatMessage[]): AnthropicToolResultBlock[];
|
|
204
|
+
/**
|
|
205
|
+
* Phase 2 R4 wire-up: optional structured content for tool-stream mode.
|
|
206
|
+
* When set, consumers should send this array to the subprocess instead of
|
|
207
|
+
* the legacy XML-wrapped `userMessage` string. Each element is either a
|
|
208
|
+
* native Anthropic `tool_result` block (for prior tool outputs) or a
|
|
209
|
+
* `text` block (for the user's follow-up message).
|
|
210
|
+
*/
|
|
211
|
+
export type UserMessageBlock = AnthropicToolResultBlock | {
|
|
212
|
+
type: 'text';
|
|
213
|
+
text: string;
|
|
214
|
+
};
|
|
215
|
+
export interface ExtractedMessage {
|
|
216
|
+
systemPrompt: string | undefined;
|
|
217
|
+
userMessage: string;
|
|
218
|
+
/**
|
|
219
|
+
* Populated only in tool-stream mode when the last non-system message
|
|
220
|
+
* is a tool-role result. Carries native Anthropic tool_result blocks
|
|
221
|
+
* + optional follow-up text. When undefined, consumers fall back to
|
|
222
|
+
* the string `userMessage` (legacy XML-wrapped path).
|
|
223
|
+
*/
|
|
224
|
+
userMessageBlocks?: UserMessageBlock[];
|
|
225
|
+
isNewConversation: boolean;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Extract the relevant parts from an OpenAI messages array.
|
|
229
|
+
*
|
|
230
|
+
* Sessions are stateful — we only need the last user message. The tricky
|
|
231
|
+
* question is whether to start a fresh session or append to the existing one.
|
|
232
|
+
*
|
|
233
|
+
* Default mode (no env var): only honor an explicit `X-Session-Reset: 1`
|
|
234
|
+
* header. This is correct for clients that maintain their own conversation
|
|
235
|
+
* transcript and forward only the latest user turn (OpenClaw main agent
|
|
236
|
+
* loop, cron jobs, subagents). The previous heuristic
|
|
237
|
+
* (`nonSystemMessages.length <= 1`) fired on every such request, killing the
|
|
238
|
+
* persistent CLI every turn and preventing Anthropic prompt caching from
|
|
239
|
+
* ever warming. Originally diagnosed in PR #40 by @megayounus786.
|
|
240
|
+
*
|
|
241
|
+
* Legacy mode (`OPENAI_COMPAT_NEW_CONVO_HEURISTIC=1`): restore the old
|
|
242
|
+
* `system + single user ⇒ new conversation` rule, for clients that re-send
|
|
243
|
+
* the full transcript on every turn (ChatGPT-Next-Web, Open WebUI, data
|
|
244
|
+
* labeling tools, etc). They use the transcript shape itself as their only
|
|
245
|
+
* "start a new conversation" signal.
|
|
246
|
+
*
|
|
247
|
+
* The env var is read on every call so ops can flip it via launchctl setenv
|
|
248
|
+
* without restarting the server.
|
|
249
|
+
*/
|
|
250
|
+
export declare function extractUserMessage(messages: OpenAIChatMessage[], headers?: Record<string, string | string[] | undefined>): ExtractedMessage;
|
|
251
|
+
export declare function formatCompletionResponse(id: string, model: string, text: string, tokensIn: number, tokensOut: number, toolCalls?: OpenAIToolCall[]): OpenAIChatCompletionResponse;
|
|
252
|
+
export declare function formatCompletionChunk(id: string, model: string, delta: {
|
|
253
|
+
role?: string;
|
|
254
|
+
content?: string;
|
|
255
|
+
}, finishReason: string | null): OpenAIChatCompletionChunk;
|
|
256
|
+
/** SessionManager-like interface to avoid circular imports */
|
|
257
|
+
interface SessionManagerLike {
|
|
258
|
+
startSession(config: Record<string, unknown>): Promise<{
|
|
259
|
+
name: string;
|
|
260
|
+
}>;
|
|
261
|
+
sendMessage(name: string, message: string | UserMessageBlock[], options?: Record<string, unknown>): Promise<{
|
|
262
|
+
output: string;
|
|
263
|
+
sessionId?: string;
|
|
264
|
+
events: unknown[];
|
|
265
|
+
}>;
|
|
266
|
+
stopSession(name: string): Promise<void>;
|
|
267
|
+
listSessions(): Array<{
|
|
268
|
+
name: string;
|
|
269
|
+
}>;
|
|
270
|
+
getStatus(name: string): {
|
|
271
|
+
stats: {
|
|
272
|
+
tokensIn: number;
|
|
273
|
+
tokensOut: number;
|
|
274
|
+
contextPercent: number;
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
compactSession(name: string): Promise<unknown>;
|
|
278
|
+
}
|
|
279
|
+
export declare function handleChatCompletion(manager: SessionManagerLike, body: Record<string, unknown>, headers: http.IncomingHttpHeaders, res: http.ServerResponse): Promise<void>;
|
|
280
|
+
export {};
|
|
281
|
+
//# sourceMappingURL=openai-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-compat.d.ts","sourceRoot":"","sources":["../../../src/openai-compat/openai-compat.ts"],"names":[],"mappings":"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"}
|