@a1hvdy/cc-openclaw 0.10.4 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/channels/telegram/card-renderer.d.ts +63 -0
- package/dist/src/channels/telegram/card-renderer.js +149 -0
- package/dist/src/channels/telegram/card-renderer.js.map +1 -0
- package/dist/src/channels/telegram/insight-formatter.d.ts +36 -0
- package/dist/src/channels/telegram/insight-formatter.js +36 -0
- package/dist/src/channels/telegram/insight-formatter.js.map +1 -0
- package/dist/src/channels/telegram/live-card.d.ts +7 -90
- package/dist/src/channels/telegram/live-card.js +22 -265
- package/dist/src/channels/telegram/live-card.js.map +1 -1
- package/dist/src/channels/telegram/logger.d.ts +10 -0
- package/dist/src/channels/telegram/logger.js +13 -0
- package/dist/src/channels/telegram/logger.js.map +1 -0
- package/dist/src/channels/telegram/throttle-controller.d.ts +54 -0
- package/dist/src/channels/telegram/throttle-controller.js +132 -0
- package/dist/src/channels/telegram/throttle-controller.js.map +1 -0
- package/dist/src/channels/telegram/tool-tracker.js +3 -14
- package/dist/src/channels/telegram/tool-tracker.js.map +1 -1
- package/dist/src/cli/doctor.d.ts +24 -0
- package/dist/src/cli/doctor.js +194 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/cli/index.d.ts +8 -0
- package/dist/src/cli/index.js +39 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/command-router/cc-handler.js +35 -709
- package/dist/src/command-router/cc-handler.js.map +1 -1
- package/dist/src/command-router/launch-policy.d.ts +93 -0
- package/dist/src/command-router/launch-policy.js +323 -0
- package/dist/src/command-router/launch-policy.js.map +1 -0
- package/dist/src/command-router/resume-policy.d.ts +18 -0
- package/dist/src/command-router/resume-policy.js +236 -0
- package/dist/src/command-router/resume-policy.js.map +1 -0
- package/dist/src/command-router/turn-formatter.d.ts +19 -0
- package/dist/src/command-router/turn-formatter.js +144 -0
- package/dist/src/command-router/turn-formatter.js.map +1 -0
- package/dist/src/openai-compat/bridges/allowlist.d.ts +10 -0
- package/dist/src/openai-compat/bridges/allowlist.js +17 -0
- package/dist/src/openai-compat/bridges/allowlist.js.map +1 -0
- package/dist/src/openai-compat/bridges/factory.d.ts +30 -0
- package/dist/src/openai-compat/bridges/factory.js +84 -0
- package/dist/src/openai-compat/bridges/factory.js.map +1 -0
- package/dist/src/openai-compat/bridges/media-bridge.d.ts +34 -0
- package/dist/src/openai-compat/bridges/media-bridge.js +20 -0
- package/dist/src/openai-compat/bridges/media-bridge.js.map +1 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.d.ts +61 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js +171 -0
- package/dist/src/openai-compat/bridges/openclaw-native-tools.js.map +1 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.d.ts +26 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js +38 -0
- package/dist/src/openai-compat/bridges/openclaw-tool-registry.js.map +1 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.d.ts +19 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.js +59 -0
- package/dist/src/openai-compat/bridges/tts-media-bridge.js.map +1 -0
- package/dist/src/openai-compat/openai-compat.js.map +1 -1
- package/dist/src/types/tool-bridge.d.ts +2 -1
- package/dist/src/types/tool-bridge.js +1 -0
- package/dist/src/types/tool-bridge.js.map +1 -1
- package/package.json +1 -1
- package/dist/scripts/bench/ab-harness.d.ts +0 -58
- package/dist/scripts/bench/ab-harness.d.ts.map +0 -1
- package/dist/scripts/bench/ab-harness.js +0 -78
- package/dist/scripts/bench/ab-harness.js.map +0 -1
- package/dist/src/channels/adapter.d.ts.map +0 -1
- package/dist/src/channels/telegram/completion-summary.d.ts.map +0 -1
- package/dist/src/channels/telegram/error-renderer.d.ts.map +0 -1
- package/dist/src/channels/telegram/event-reducer.d.ts.map +0 -1
- package/dist/src/channels/telegram/index.d.ts.map +0 -1
- package/dist/src/channels/telegram/injector.d.ts.map +0 -1
- package/dist/src/channels/telegram/live-card.d.ts.map +0 -1
- package/dist/src/channels/telegram/state-machine.d.ts.map +0 -1
- package/dist/src/channels/telegram/tool-tracker.d.ts.map +0 -1
- package/dist/src/command-router/cc-handler.d.ts.map +0 -1
- package/dist/src/command-router/index.d.ts.map +0 -1
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/council/consensus.d.ts.map +0 -1
- package/dist/src/council/council.d.ts.map +0 -1
- package/dist/src/council/index.d.ts.map +0 -1
- package/dist/src/engines/base-oneshot-session.d.ts.map +0 -1
- package/dist/src/engines/index.d.ts.map +0 -1
- package/dist/src/engines/persistent-codex-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-cursor-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-custom-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-gemini-session.d.ts.map +0 -1
- package/dist/src/engines/persistent-session.d.ts.map +0 -1
- package/dist/src/health/handler.d.ts.map +0 -1
- package/dist/src/health/index.d.ts.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/lib/auto-recovery.d.ts.map +0 -1
- package/dist/src/lib/cache-parity.d.ts.map +0 -1
- package/dist/src/lib/circuit-breaker.d.ts.map +0 -1
- package/dist/src/lib/config.d.ts.map +0 -1
- package/dist/src/lib/drift-detector.d.ts.map +0 -1
- package/dist/src/lib/error-formatter.d.ts.map +0 -1
- package/dist/src/lib/heartbeat-workaround.d.ts.map +0 -1
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/register-guard.d.ts.map +0 -1
- package/dist/src/lib/route-flag.d.ts +0 -49
- package/dist/src/lib/route-flag.d.ts.map +0 -1
- package/dist/src/lib/route-flag.js +0 -52
- package/dist/src/lib/route-flag.js.map +0 -1
- package/dist/src/lib/sysprompt-strip.d.ts.map +0 -1
- package/dist/src/lib/telemetry.d.ts.map +0 -1
- package/dist/src/lib/test-mode.d.ts.map +0 -1
- package/dist/src/lib/vendor-paths.d.ts.map +0 -1
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/mcp/bridge.d.ts.map +0 -1
- package/dist/src/mcp/index.d.ts.map +0 -1
- package/dist/src/models.d.ts.map +0 -1
- package/dist/src/openai-compat/cli-stream-parser.d.ts.map +0 -1
- package/dist/src/openai-compat/index.d.ts.map +0 -1
- package/dist/src/openai-compat/openai-compat.d.ts.map +0 -1
- package/dist/src/openai-compat/skill-resolver.d.ts.map +0 -1
- package/dist/src/openai-compat/sse-translator.d.ts.map +0 -1
- package/dist/src/proxy/anthropic-adapter.d.ts.map +0 -1
- package/dist/src/proxy/handler.d.ts.map +0 -1
- package/dist/src/proxy/index.d.ts.map +0 -1
- package/dist/src/proxy/schema-cleaner.d.ts.map +0 -1
- package/dist/src/proxy/thought-cache.d.ts.map +0 -1
- package/dist/src/session/embedded-server.d.ts.map +0 -1
- package/dist/src/session/inbox-manager.d.ts.map +0 -1
- package/dist/src/session/index.d.ts.map +0 -1
- package/dist/src/session/session-manager.d.ts.map +0 -1
- package/dist/src/session-bootstrap/cwd-patch.d.ts.map +0 -1
- package/dist/src/session-bootstrap/index.d.ts.map +0 -1
- package/dist/src/session-bootstrap/sysprompt-strip.d.ts.map +0 -1
- package/dist/src/session-bootstrap/think-conflict-resolver.d.ts.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/validation.d.ts.map +0 -1
- package/dist/tests/_helpers/subprocess-mock.d.ts +0 -35
- package/dist/tests/_helpers/subprocess-mock.d.ts.map +0 -1
- package/dist/tests/_helpers/subprocess-mock.js +0 -136
- package/dist/tests/_helpers/subprocess-mock.js.map +0 -1
- package/dist/tests/auto-recovery.test.d.ts +0 -2
- package/dist/tests/auto-recovery.test.d.ts.map +0 -1
- package/dist/tests/auto-recovery.test.js +0 -185
- package/dist/tests/auto-recovery.test.js.map +0 -1
- package/dist/tests/bench-harness.test.d.ts +0 -2
- package/dist/tests/bench-harness.test.d.ts.map +0 -1
- package/dist/tests/bench-harness.test.js +0 -21
- package/dist/tests/bench-harness.test.js.map +0 -1
- package/dist/tests/cache-parity.test.d.ts +0 -2
- package/dist/tests/cache-parity.test.d.ts.map +0 -1
- package/dist/tests/cache-parity.test.js +0 -401
- package/dist/tests/cache-parity.test.js.map +0 -1
- package/dist/tests/command-router.test.d.ts +0 -2
- package/dist/tests/command-router.test.d.ts.map +0 -1
- package/dist/tests/command-router.test.js +0 -60
- package/dist/tests/command-router.test.js.map +0 -1
- package/dist/tests/council.test.d.ts +0 -2
- package/dist/tests/council.test.d.ts.map +0 -1
- package/dist/tests/council.test.js +0 -20
- package/dist/tests/council.test.js.map +0 -1
- package/dist/tests/drift-detector.test.d.ts +0 -2
- package/dist/tests/drift-detector.test.d.ts.map +0 -1
- package/dist/tests/drift-detector.test.js +0 -268
- package/dist/tests/drift-detector.test.js.map +0 -1
- package/dist/tests/eager-bootstrap-gating.test.d.ts +0 -9
- package/dist/tests/eager-bootstrap-gating.test.d.ts.map +0 -1
- package/dist/tests/eager-bootstrap-gating.test.js +0 -97
- package/dist/tests/eager-bootstrap-gating.test.js.map +0 -1
- package/dist/tests/engines.test.d.ts +0 -2
- package/dist/tests/engines.test.d.ts.map +0 -1
- package/dist/tests/engines.test.js +0 -8
- package/dist/tests/engines.test.js.map +0 -1
- package/dist/tests/error-formatter.test.d.ts +0 -2
- package/dist/tests/error-formatter.test.d.ts.map +0 -1
- package/dist/tests/error-formatter.test.js +0 -220
- package/dist/tests/error-formatter.test.js.map +0 -1
- package/dist/tests/health.test.d.ts +0 -2
- package/dist/tests/health.test.d.ts.map +0 -1
- package/dist/tests/health.test.js +0 -110
- package/dist/tests/health.test.js.map +0 -1
- package/dist/tests/heartbeat-workaround.test.d.ts +0 -2
- package/dist/tests/heartbeat-workaround.test.d.ts.map +0 -1
- package/dist/tests/heartbeat-workaround.test.js +0 -90
- package/dist/tests/heartbeat-workaround.test.js.map +0 -1
- package/dist/tests/index.test.d.ts +0 -2
- package/dist/tests/index.test.d.ts.map +0 -1
- package/dist/tests/index.test.js +0 -7
- package/dist/tests/index.test.js.map +0 -1
- package/dist/tests/lib-sysprompt-strip.test.d.ts +0 -2
- package/dist/tests/lib-sysprompt-strip.test.d.ts.map +0 -1
- package/dist/tests/lib-sysprompt-strip.test.js +0 -145
- package/dist/tests/lib-sysprompt-strip.test.js.map +0 -1
- package/dist/tests/listener-activation.test.d.ts +0 -2
- package/dist/tests/listener-activation.test.d.ts.map +0 -1
- package/dist/tests/listener-activation.test.js +0 -87
- package/dist/tests/listener-activation.test.js.map +0 -1
- package/dist/tests/mcp-bridge.test.d.ts +0 -2
- package/dist/tests/mcp-bridge.test.d.ts.map +0 -1
- package/dist/tests/mcp-bridge.test.js +0 -137
- package/dist/tests/mcp-bridge.test.js.map +0 -1
- package/dist/tests/openai-compat.test.d.ts +0 -2
- package/dist/tests/openai-compat.test.d.ts.map +0 -1
- package/dist/tests/openai-compat.test.js +0 -8
- package/dist/tests/openai-compat.test.js.map +0 -1
- package/dist/tests/proxy-heartbeat-integration.test.d.ts +0 -15
- package/dist/tests/proxy-heartbeat-integration.test.d.ts.map +0 -1
- package/dist/tests/proxy-heartbeat-integration.test.js +0 -122
- package/dist/tests/proxy-heartbeat-integration.test.js.map +0 -1
- package/dist/tests/proxy.test.d.ts +0 -2
- package/dist/tests/proxy.test.d.ts.map +0 -1
- package/dist/tests/proxy.test.js +0 -8
- package/dist/tests/proxy.test.js.map +0 -1
- package/dist/tests/register-guard-stacking.test.d.ts +0 -2
- package/dist/tests/register-guard-stacking.test.d.ts.map +0 -1
- package/dist/tests/register-guard-stacking.test.js +0 -61
- package/dist/tests/register-guard-stacking.test.js.map +0 -1
- package/dist/tests/register-guard.test.d.ts +0 -2
- package/dist/tests/register-guard.test.d.ts.map +0 -1
- package/dist/tests/register-guard.test.js +0 -129
- package/dist/tests/register-guard.test.js.map +0 -1
- package/dist/tests/route-flag-rollback.test.d.ts +0 -2
- package/dist/tests/route-flag-rollback.test.d.ts.map +0 -1
- package/dist/tests/route-flag-rollback.test.js +0 -70
- package/dist/tests/route-flag-rollback.test.js.map +0 -1
- package/dist/tests/route-flag.test.d.ts +0 -2
- package/dist/tests/route-flag.test.d.ts.map +0 -1
- package/dist/tests/route-flag.test.js +0 -101
- package/dist/tests/route-flag.test.js.map +0 -1
- package/dist/tests/session-bootstrap.test.d.ts +0 -2
- package/dist/tests/session-bootstrap.test.d.ts.map +0 -1
- package/dist/tests/session-bootstrap.test.js +0 -183
- package/dist/tests/session-bootstrap.test.js.map +0 -1
- package/dist/tests/session.test.d.ts +0 -2
- package/dist/tests/session.test.d.ts.map +0 -1
- package/dist/tests/session.test.js +0 -17
- package/dist/tests/session.test.js.map +0 -1
- package/dist/tests/state-machine.test.d.ts +0 -2
- package/dist/tests/state-machine.test.d.ts.map +0 -1
- package/dist/tests/state-machine.test.js +0 -133
- package/dist/tests/state-machine.test.js.map +0 -1
- package/dist/tests/streaming/cli-stream-parser.test.d.ts +0 -2
- package/dist/tests/streaming/cli-stream-parser.test.d.ts.map +0 -1
- package/dist/tests/streaming/cli-stream-parser.test.js +0 -233
- package/dist/tests/streaming/cli-stream-parser.test.js.map +0 -1
- package/dist/tests/streaming/feature-flag.test.d.ts +0 -14
- package/dist/tests/streaming/feature-flag.test.d.ts.map +0 -1
- package/dist/tests/streaming/feature-flag.test.js +0 -163
- package/dist/tests/streaming/feature-flag.test.js.map +0 -1
- package/dist/tests/streaming/no-tools-prompt.test.d.ts +0 -17
- package/dist/tests/streaming/no-tools-prompt.test.d.ts.map +0 -1
- package/dist/tests/streaming/no-tools-prompt.test.js +0 -229
- package/dist/tests/streaming/no-tools-prompt.test.js.map +0 -1
- package/dist/tests/streaming/skill-plus-tools.test.d.ts +0 -14
- package/dist/tests/streaming/skill-plus-tools.test.d.ts.map +0 -1
- package/dist/tests/streaming/skill-plus-tools.test.js +0 -234
- package/dist/tests/streaming/skill-plus-tools.test.js.map +0 -1
- package/dist/tests/streaming/sse-translator.test.d.ts +0 -2
- package/dist/tests/streaming/sse-translator.test.d.ts.map +0 -1
- package/dist/tests/streaming/sse-translator.test.js +0 -227
- package/dist/tests/streaming/sse-translator.test.js.map +0 -1
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts +0 -11
- package/dist/tests/streaming/tool-result-roundtrip.test.d.ts.map +0 -1
- package/dist/tests/streaming/tool-result-roundtrip.test.js +0 -215
- package/dist/tests/streaming/tool-result-roundtrip.test.js.map +0 -1
- package/dist/tests/streaming/tool-use-translation.test.d.ts +0 -10
- package/dist/tests/streaming/tool-use-translation.test.d.ts.map +0 -1
- package/dist/tests/streaming/tool-use-translation.test.js +0 -251
- package/dist/tests/streaming/tool-use-translation.test.js.map +0 -1
- package/dist/tests/telegram-bridge.test.d.ts +0 -2
- package/dist/tests/telegram-bridge.test.d.ts.map +0 -1
- package/dist/tests/telegram-bridge.test.js +0 -17
- package/dist/tests/telegram-bridge.test.js.map +0 -1
- package/dist/tests/telegram-injector.test.d.ts +0 -2
- package/dist/tests/telegram-injector.test.d.ts.map +0 -1
- package/dist/tests/telegram-injector.test.js +0 -74
- package/dist/tests/telegram-injector.test.js.map +0 -1
- package/dist/tests/telemetry.test.d.ts +0 -2
- package/dist/tests/telemetry.test.d.ts.map +0 -1
- package/dist/tests/telemetry.test.js +0 -405
- package/dist/tests/telemetry.test.js.map +0 -1
- package/dist/tests/test-mode.test.d.ts +0 -2
- package/dist/tests/test-mode.test.d.ts.map +0 -1
- package/dist/tests/test-mode.test.js +0 -39
- package/dist/tests/test-mode.test.js.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw-native-tools.ts — IToolBridge impl for ToolMode.OpenClawNative.
|
|
3
|
+
*
|
|
4
|
+
* v0.11.0 investigation result: OpenClaw DOES expose `/tools/invoke` at
|
|
5
|
+
* `http://127.0.0.1:18790` with Bearer token auth (confirmed in
|
|
6
|
+
* extensions/cc-openclaw/openclaw-mcp-bridge.cjs). However, the gateway's
|
|
7
|
+
* `tools.allow` list in openclaw.json only includes `claude_session_*` and
|
|
8
|
+
* council/ultraplan commands — `message.voice` is NOT there. Invoking
|
|
9
|
+
* `/tools/invoke` for voice would 404/401 at runtime.
|
|
10
|
+
*
|
|
11
|
+
* Decision: Path B (internal marker translation) for v0.11.0. `executeNative`
|
|
12
|
+
* routes `message.voice` through TtsMediaBridge → `[[tts:text]]` markers.
|
|
13
|
+
* OpenClaw's existing `maybeApplyTtsToPayload` picks them up downstream.
|
|
14
|
+
* This is identical to the voice-recovery.ts rescue path — the difference is
|
|
15
|
+
* the call site: here the model emits a proper tool_call, not raw text XML.
|
|
16
|
+
*
|
|
17
|
+
* Path A (real HTTP POST to `/tools/invoke`) is fully wired in `executeHttp`
|
|
18
|
+
* and ready to activate in v0.12.0 when A1 adds `message.voice` to
|
|
19
|
+
* `gateway.tools.allow` in openclaw.json.
|
|
20
|
+
*/
|
|
21
|
+
import type { IToolBridge, ToolDefinition, TranslatedToolUseDelta } from '../../types/tool-bridge.js';
|
|
22
|
+
import { ToolMode } from '../../types/tool-bridge.js';
|
|
23
|
+
interface GatewayConfig {
|
|
24
|
+
url: string;
|
|
25
|
+
token: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class OpenClawNativeToolsBridge implements IToolBridge {
|
|
28
|
+
readonly mode = ToolMode.OpenClawNative;
|
|
29
|
+
private readonly _gwConfig;
|
|
30
|
+
constructor(gwConfig?: GatewayConfig);
|
|
31
|
+
/**
|
|
32
|
+
* Build a minimal tool preamble listing only the tools the bridge can
|
|
33
|
+
* actually handle (allowlisted + registered). The full schema is omitted —
|
|
34
|
+
* the caller's system prompt already advertises it. This is a safety marker
|
|
35
|
+
* so Savvy knows the bridge is active.
|
|
36
|
+
*/
|
|
37
|
+
buildToolPreamble(tools: ReadonlyArray<ToolDefinition> | undefined): string;
|
|
38
|
+
/**
|
|
39
|
+
* Translate a tool_use event from the Claude stream into an OpenAI delta.
|
|
40
|
+
* This bridge does NOT intercept mid-stream events — tool execution happens
|
|
41
|
+
* in `executeNative` after the full turn completes. Return null always.
|
|
42
|
+
*/
|
|
43
|
+
translateToolUse(_event: unknown): TranslatedToolUseDelta;
|
|
44
|
+
/** Serialize a tool result back as XML for the next turn's user message. */
|
|
45
|
+
serializeToolResult(call: import('../../types/route.js').OpenAIToolCall, result: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Execute a `message.voice` (or other allowlisted) tool call.
|
|
48
|
+
*
|
|
49
|
+
* v0.11.0: routes through TtsMediaBridge (Path B — marker translation).
|
|
50
|
+
* Returns the TTS marker text to inject into the SSE stream.
|
|
51
|
+
*
|
|
52
|
+
* When `CC_OPENCLAW_NATIVE_TOOLS_HTTP=1` is set, falls through to Path A
|
|
53
|
+
* (real HTTP POST). Reserved for v0.12.0 activation.
|
|
54
|
+
*/
|
|
55
|
+
executeNative(toolName: string, args: Record<string, unknown>): Promise<{
|
|
56
|
+
text: string;
|
|
57
|
+
delivered: boolean;
|
|
58
|
+
via: string;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw-native-tools.ts — IToolBridge impl for ToolMode.OpenClawNative.
|
|
3
|
+
*
|
|
4
|
+
* v0.11.0 investigation result: OpenClaw DOES expose `/tools/invoke` at
|
|
5
|
+
* `http://127.0.0.1:18790` with Bearer token auth (confirmed in
|
|
6
|
+
* extensions/cc-openclaw/openclaw-mcp-bridge.cjs). However, the gateway's
|
|
7
|
+
* `tools.allow` list in openclaw.json only includes `claude_session_*` and
|
|
8
|
+
* council/ultraplan commands — `message.voice` is NOT there. Invoking
|
|
9
|
+
* `/tools/invoke` for voice would 404/401 at runtime.
|
|
10
|
+
*
|
|
11
|
+
* Decision: Path B (internal marker translation) for v0.11.0. `executeNative`
|
|
12
|
+
* routes `message.voice` through TtsMediaBridge → `[[tts:text]]` markers.
|
|
13
|
+
* OpenClaw's existing `maybeApplyTtsToPayload` picks them up downstream.
|
|
14
|
+
* This is identical to the voice-recovery.ts rescue path — the difference is
|
|
15
|
+
* the call site: here the model emits a proper tool_call, not raw text XML.
|
|
16
|
+
*
|
|
17
|
+
* Path A (real HTTP POST to `/tools/invoke`) is fully wired in `executeHttp`
|
|
18
|
+
* and ready to activate in v0.12.0 when A1 adds `message.voice` to
|
|
19
|
+
* `gateway.tools.allow` in openclaw.json.
|
|
20
|
+
*/
|
|
21
|
+
import * as http from 'node:http';
|
|
22
|
+
import * as fs from 'node:fs';
|
|
23
|
+
import * as path from 'node:path';
|
|
24
|
+
import * as os from 'node:os';
|
|
25
|
+
import { ToolMode } from '../../types/tool-bridge.js';
|
|
26
|
+
import { resolveToolBridge, registeredToolNames } from './openclaw-tool-registry.js';
|
|
27
|
+
import { MediaBridgeError } from './media-bridge.js';
|
|
28
|
+
// ── Gateway config ─────────────────────────────────────────────────────────
|
|
29
|
+
const DEFAULT_GATEWAY_URL = 'http://127.0.0.1:18790';
|
|
30
|
+
const REQUEST_TIMEOUT_MS = 15_000;
|
|
31
|
+
function readGatewayConfig() {
|
|
32
|
+
// Env overrides first (matches session-manager.ts priority)
|
|
33
|
+
const envUrl = process.env.GATEWAY_URL;
|
|
34
|
+
const envKey = process.env.GATEWAY_KEY;
|
|
35
|
+
if (envUrl && envKey)
|
|
36
|
+
return { url: envUrl, token: envKey };
|
|
37
|
+
try {
|
|
38
|
+
const configPath = path.join(os.homedir(), '.openclaw', 'openclaw.json');
|
|
39
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
40
|
+
const parsed = JSON.parse(raw);
|
|
41
|
+
const gw = parsed.gateway;
|
|
42
|
+
if (!gw)
|
|
43
|
+
return { url: DEFAULT_GATEWAY_URL, token: '' };
|
|
44
|
+
const port = gw.port || 18790;
|
|
45
|
+
const auth = gw.auth;
|
|
46
|
+
const token = auth?.token || auth?.password || '';
|
|
47
|
+
return { url: `http://127.0.0.1:${port}`, token };
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return { url: DEFAULT_GATEWAY_URL, token: '' };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// ── Path A: real HTTP invoke (ready for v0.12.0) ───────────────────────────
|
|
54
|
+
async function executeHttp(toolName, args, config) {
|
|
55
|
+
return new Promise((resolve) => {
|
|
56
|
+
const body = JSON.stringify({ tool: toolName, args });
|
|
57
|
+
const url = new URL('/tools/invoke', config.url);
|
|
58
|
+
const req = http.request(url, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json',
|
|
62
|
+
Authorization: `Bearer ${config.token}`,
|
|
63
|
+
'Content-Length': Buffer.byteLength(body),
|
|
64
|
+
},
|
|
65
|
+
}, (res) => {
|
|
66
|
+
let data = '';
|
|
67
|
+
res.on('data', (chunk) => { data += chunk.toString(); });
|
|
68
|
+
res.on('end', () => {
|
|
69
|
+
try {
|
|
70
|
+
const parsed = JSON.parse(data);
|
|
71
|
+
if (parsed.ok === false) {
|
|
72
|
+
const err = parsed.error;
|
|
73
|
+
resolve({ ok: false, error: String(err?.message ?? data.slice(0, 200)) });
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const result = typeof parsed.result === 'string'
|
|
77
|
+
? parsed.result
|
|
78
|
+
: JSON.stringify(parsed.result ?? parsed);
|
|
79
|
+
resolve({ ok: true, result });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
resolve({ ok: false, error: data.slice(0, 200) });
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
req.on('error', (err) => resolve({ ok: false, error: err.message }));
|
|
88
|
+
req.setTimeout(REQUEST_TIMEOUT_MS, () => {
|
|
89
|
+
req.destroy();
|
|
90
|
+
resolve({ ok: false, error: `Timeout (${REQUEST_TIMEOUT_MS}ms)` });
|
|
91
|
+
});
|
|
92
|
+
req.write(body);
|
|
93
|
+
req.end();
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// ── IToolBridge impl ───────────────────────────────────────────────────────
|
|
97
|
+
export class OpenClawNativeToolsBridge {
|
|
98
|
+
mode = ToolMode.OpenClawNative;
|
|
99
|
+
_gwConfig;
|
|
100
|
+
constructor(gwConfig) {
|
|
101
|
+
this._gwConfig = gwConfig ?? readGatewayConfig();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build a minimal tool preamble listing only the tools the bridge can
|
|
105
|
+
* actually handle (allowlisted + registered). The full schema is omitted —
|
|
106
|
+
* the caller's system prompt already advertises it. This is a safety marker
|
|
107
|
+
* so Savvy knows the bridge is active.
|
|
108
|
+
*/
|
|
109
|
+
buildToolPreamble(tools) {
|
|
110
|
+
if (!tools?.length)
|
|
111
|
+
return '';
|
|
112
|
+
const bridgeable = tools
|
|
113
|
+
.map((t) => t.function.name)
|
|
114
|
+
.filter((n) => registeredToolNames().has(n));
|
|
115
|
+
if (!bridgeable.length)
|
|
116
|
+
return '';
|
|
117
|
+
return [
|
|
118
|
+
'=== NATIVE TOOL BRIDGE (cc-openclaw v0.11.0) ===',
|
|
119
|
+
`Bridged tools (emit tool_call, NOT XML): ${bridgeable.join(', ')}`,
|
|
120
|
+
'=== END NATIVE TOOL BRIDGE ===',
|
|
121
|
+
].join('\n');
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Translate a tool_use event from the Claude stream into an OpenAI delta.
|
|
125
|
+
* This bridge does NOT intercept mid-stream events — tool execution happens
|
|
126
|
+
* in `executeNative` after the full turn completes. Return null always.
|
|
127
|
+
*/
|
|
128
|
+
translateToolUse(_event) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
/** Serialize a tool result back as XML for the next turn's user message. */
|
|
132
|
+
serializeToolResult(call, result) {
|
|
133
|
+
return `<tool_result tool_use_id="${call.id}" name="${call.function.name}">${result}</tool_result>`;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Execute a `message.voice` (or other allowlisted) tool call.
|
|
137
|
+
*
|
|
138
|
+
* v0.11.0: routes through TtsMediaBridge (Path B — marker translation).
|
|
139
|
+
* Returns the TTS marker text to inject into the SSE stream.
|
|
140
|
+
*
|
|
141
|
+
* When `CC_OPENCLAW_NATIVE_TOOLS_HTTP=1` is set, falls through to Path A
|
|
142
|
+
* (real HTTP POST). Reserved for v0.12.0 activation.
|
|
143
|
+
*/
|
|
144
|
+
async executeNative(toolName, args) {
|
|
145
|
+
const resolved = resolveToolBridge(toolName);
|
|
146
|
+
// Tool not in allowlist → fallback empty string (caller decides what to do)
|
|
147
|
+
if (!resolved) {
|
|
148
|
+
return { text: '', delivered: false, via: 'not-allowed' };
|
|
149
|
+
}
|
|
150
|
+
// Path A: real HTTP (future v0.12.0, opt-in via env flag)
|
|
151
|
+
if (process.env.CC_OPENCLAW_NATIVE_TOOLS_HTTP === '1') {
|
|
152
|
+
const httpResult = await executeHttp(toolName, args, this._gwConfig);
|
|
153
|
+
if (httpResult.ok && httpResult.result !== undefined) {
|
|
154
|
+
return { text: httpResult.result, delivered: true, via: 'http-invoke' };
|
|
155
|
+
}
|
|
156
|
+
// HTTP failed → fall through to Path B
|
|
157
|
+
}
|
|
158
|
+
// Path B: internal marker translation
|
|
159
|
+
try {
|
|
160
|
+
return await resolved.bridge.execute(args);
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
if (err instanceof MediaBridgeError) {
|
|
164
|
+
// Return empty text — upstream voice-recovery fallback will handle it
|
|
165
|
+
return { text: '', delivered: false, via: `error:${err.message}` };
|
|
166
|
+
}
|
|
167
|
+
return { text: '', delivered: false, via: 'error:unknown' };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=openclaw-native-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-native-tools.js","sourceRoot":"","sources":["../../../../src/openai-compat/bridges/openclaw-native-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AACrD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAOlC,SAAS,iBAAiB;IACxB,4DAA4D;IAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,IAAI,MAAM,IAAI,MAAM;QAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,OAA8C,CAAC;QACjE,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAI,EAAE,CAAC,IAAe,IAAI,KAAK,CAAC;QAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,IAA0C,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;QAClD,OAAO,EAAE,GAAG,EAAE,oBAAoB,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,KAAK,UAAU,WAAW,CACxB,QAAgB,EAChB,IAA6B,EAC7B,MAAqB;IAErB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,GAAG,EACH;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;gBACvC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;aAC1C;SACF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;oBAC3D,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;wBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,KAA4C,CAAC;wBAChE,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC5E,CAAC;yBAAM,CAAC;wBACN,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;4BAC9C,CAAC,CAAC,MAAM,CAAC,MAAM;4BACf,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;wBAC5C,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5E,GAAG,CAAC,UAAU,CAAC,kBAAkB,EAAE,GAAG,EAAE;YACtC,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,kBAAkB,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAE9E,MAAM,OAAO,yBAAyB;IAC3B,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC;IAEvB,SAAS,CAAgB;IAE1C,YAAY,QAAwB;QAClC,IAAI,CAAC,SAAS,GAAG,QAAQ,IAAI,iBAAiB,EAAE,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,KAAgD;QAChE,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE,OAAO,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAK;aACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO;YACL,kDAAkD;YAClD,4CAA4C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACnE,gCAAgC;SACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,MAAe;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,mBAAmB,CAAC,IAAmD,EAAE,MAAc;QACrF,OAAO,6BAA6B,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,gBAAgB,CAAC;IACtG,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CACjB,QAAgB,EAChB,IAA6B;QAE7B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE7C,4EAA4E;QAC5E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;QAC5D,CAAC;QAED,0DAA0D;QAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,GAAG,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACrE,IAAI,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACrD,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;YAC1E,CAAC;YACD,uCAAuC;QACzC,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;gBACpC,sEAAsE;gBACtE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACrE,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw-tool-registry.ts — Registry that maps allowed tool names to their
|
|
3
|
+
* MediaBridge implementations.
|
|
4
|
+
*
|
|
5
|
+
* v0.11.0 only registers `message.voice` → TtsMediaBridge. The registry is
|
|
6
|
+
* lazy-constructed per-request (stateless) so future parallel agents can add
|
|
7
|
+
* bridges without contention.
|
|
8
|
+
*/
|
|
9
|
+
import type { MediaBridge } from './media-bridge.js';
|
|
10
|
+
/** Resolved bridge for a given tool name, or null when not in allowlist. */
|
|
11
|
+
export interface ResolvedBridge {
|
|
12
|
+
readonly bridge: MediaBridge;
|
|
13
|
+
readonly toolName: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Look up the MediaBridge for `toolName`.
|
|
17
|
+
* Returns null when the tool is not in the v0.11.0 allowlist OR has no
|
|
18
|
+
* registered implementation.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveToolBridge(toolName: string): ResolvedBridge | null;
|
|
21
|
+
/**
|
|
22
|
+
* Return every tool name currently in the registry (i.e. allowed + implemented).
|
|
23
|
+
* Used by `OpenClawNativeToolsBridge.buildToolPreamble` to filter the caller's
|
|
24
|
+
* tool list down to what the bridge can actually handle.
|
|
25
|
+
*/
|
|
26
|
+
export declare function registeredToolNames(): ReadonlySet<string>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openclaw-tool-registry.ts — Registry that maps allowed tool names to their
|
|
3
|
+
* MediaBridge implementations.
|
|
4
|
+
*
|
|
5
|
+
* v0.11.0 only registers `message.voice` → TtsMediaBridge. The registry is
|
|
6
|
+
* lazy-constructed per-request (stateless) so future parallel agents can add
|
|
7
|
+
* bridges without contention.
|
|
8
|
+
*/
|
|
9
|
+
import { TtsMediaBridge, TTS_TOOL_NAME } from './tts-media-bridge.js';
|
|
10
|
+
import { isAllowedTool } from './allowlist.js';
|
|
11
|
+
/**
|
|
12
|
+
* Look up the MediaBridge for `toolName`.
|
|
13
|
+
* Returns null when the tool is not in the v0.11.0 allowlist OR has no
|
|
14
|
+
* registered implementation.
|
|
15
|
+
*/
|
|
16
|
+
export function resolveToolBridge(toolName) {
|
|
17
|
+
if (!isAllowedTool(toolName))
|
|
18
|
+
return null;
|
|
19
|
+
const bridge = BRIDGE_MAP.get(toolName);
|
|
20
|
+
if (!bridge)
|
|
21
|
+
return null;
|
|
22
|
+
return { bridge, toolName };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Return every tool name currently in the registry (i.e. allowed + implemented).
|
|
26
|
+
* Used by `OpenClawNativeToolsBridge.buildToolPreamble` to filter the caller's
|
|
27
|
+
* tool list down to what the bridge can actually handle.
|
|
28
|
+
*/
|
|
29
|
+
export function registeredToolNames() {
|
|
30
|
+
return REGISTERED_NAMES;
|
|
31
|
+
}
|
|
32
|
+
// ── Internal registry ──────────────────────────────────────────────────────
|
|
33
|
+
/** Singleton instances — bridges are stateless so one per process is fine. */
|
|
34
|
+
const BRIDGE_MAP = new Map([
|
|
35
|
+
[TTS_TOOL_NAME, new TtsMediaBridge()],
|
|
36
|
+
]);
|
|
37
|
+
const REGISTERED_NAMES = new Set(BRIDGE_MAP.keys());
|
|
38
|
+
//# sourceMappingURL=openclaw-tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-tool-registry.js","sourceRoot":"","sources":["../../../../src/openai-compat/bridges/openclaw-tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQ/C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAE9E,8EAA8E;AAC9E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAsB;IAC9C,CAAC,aAAa,EAAE,IAAI,cAAc,EAAE,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tts-media-bridge.ts — MediaBridge impl for `message.voice`.
|
|
3
|
+
*
|
|
4
|
+
* v0.11.0 Path B strategy: instead of POSTing to a TTS HTTP endpoint, this
|
|
5
|
+
* bridge converts `message.voice` tool args into `[[tts:text]]` markers that
|
|
6
|
+
* OpenClaw's existing `maybeApplyTtsToPayload` downstream picks up — the same
|
|
7
|
+
* channel voice-recovery.ts uses. This gives the tool-boundary UX (Savvy sees
|
|
8
|
+
* a proper tool interface; callers see tool_call deltas) without requiring a
|
|
9
|
+
* new OpenClaw endpoint.
|
|
10
|
+
*
|
|
11
|
+
* The bridge imports from voice-recovery.ts and reuses its marker constants
|
|
12
|
+
* and truncation logic. No logic is duplicated.
|
|
13
|
+
*/
|
|
14
|
+
import type { MediaBridge, MediaBridgeResult } from './media-bridge.js';
|
|
15
|
+
export declare const TTS_TOOL_NAME = "message.voice";
|
|
16
|
+
export declare class TtsMediaBridge implements MediaBridge {
|
|
17
|
+
readonly toolName = "message.voice";
|
|
18
|
+
execute(args: Record<string, unknown>): Promise<MediaBridgeResult>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tts-media-bridge.ts — MediaBridge impl for `message.voice`.
|
|
3
|
+
*
|
|
4
|
+
* v0.11.0 Path B strategy: instead of POSTing to a TTS HTTP endpoint, this
|
|
5
|
+
* bridge converts `message.voice` tool args into `[[tts:text]]` markers that
|
|
6
|
+
* OpenClaw's existing `maybeApplyTtsToPayload` downstream picks up — the same
|
|
7
|
+
* channel voice-recovery.ts uses. This gives the tool-boundary UX (Savvy sees
|
|
8
|
+
* a proper tool interface; callers see tool_call deltas) without requiring a
|
|
9
|
+
* new OpenClaw endpoint.
|
|
10
|
+
*
|
|
11
|
+
* The bridge imports from voice-recovery.ts and reuses its marker constants
|
|
12
|
+
* and truncation logic. No logic is duplicated.
|
|
13
|
+
*/
|
|
14
|
+
import { DEFAULT_MAX_SPOKEN_CHARS } from '../voice-recovery.js';
|
|
15
|
+
import { MediaBridgeError } from './media-bridge.js';
|
|
16
|
+
export const TTS_TOOL_NAME = 'message.voice';
|
|
17
|
+
/** Max spoken chars for the injected TTS block — mirrors voice-recovery default. */
|
|
18
|
+
const MAX_SPOKEN = DEFAULT_MAX_SPOKEN_CHARS;
|
|
19
|
+
/** Marker constants — identical to voice-recovery.ts to stay in-sync. */
|
|
20
|
+
const TTS_OPEN = '[[tts:text]]';
|
|
21
|
+
const TTS_CLOSE = '[[/tts:text]]';
|
|
22
|
+
/**
|
|
23
|
+
* Extract the spoken text from tool call args.
|
|
24
|
+
* Tries `text`, `content`, `speech`, `input` in that order.
|
|
25
|
+
*/
|
|
26
|
+
function extractText(args) {
|
|
27
|
+
for (const key of ['text', 'content', 'speech', 'input']) {
|
|
28
|
+
const v = args[key];
|
|
29
|
+
if (typeof v === 'string' && v.trim())
|
|
30
|
+
return v.trim();
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/** Truncate to `max` chars at a sentence boundary when possible. */
|
|
35
|
+
function truncate(text, max) {
|
|
36
|
+
if (text.length <= max)
|
|
37
|
+
return text;
|
|
38
|
+
const slice = text.slice(0, max);
|
|
39
|
+
const lastSentence = Math.max(slice.lastIndexOf('. '), slice.lastIndexOf('! '), slice.lastIndexOf('? '));
|
|
40
|
+
if (lastSentence > max * 0.5)
|
|
41
|
+
return slice.slice(0, lastSentence + 1);
|
|
42
|
+
const lastSpace = slice.lastIndexOf(' ');
|
|
43
|
+
if (lastSpace > max * 0.5)
|
|
44
|
+
return `${slice.slice(0, lastSpace)}…`;
|
|
45
|
+
return `${slice}…`;
|
|
46
|
+
}
|
|
47
|
+
export class TtsMediaBridge {
|
|
48
|
+
toolName = TTS_TOOL_NAME;
|
|
49
|
+
async execute(args) {
|
|
50
|
+
const raw = extractText(args);
|
|
51
|
+
if (!raw) {
|
|
52
|
+
throw new MediaBridgeError('message.voice args missing text/content/speech/input field', this.toolName, args);
|
|
53
|
+
}
|
|
54
|
+
const spoken = truncate(raw, MAX_SPOKEN);
|
|
55
|
+
const text = `${TTS_OPEN}${spoken}${TTS_CLOSE}`;
|
|
56
|
+
return { text, delivered: true, via: 'tts-markers' };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=tts-media-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tts-media-bridge.js","sourceRoot":"","sources":["../../../../src/openai-compat/bridges/tts-media-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,oFAAoF;AACpF,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAE5C,yEAAyE;AACzE,MAAM,QAAQ,GAAG,cAAc,CAAC;AAChC,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC;;;GAGG;AACH,SAAS,WAAW,CAAC,IAA6B;IAChD,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oEAAoE;AACpE,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EACvB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EACvB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CACxB,CAAC;IACF,IAAI,YAAY,GAAG,GAAG,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,SAAS,GAAG,GAAG,GAAG,GAAG;QAAE,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC;IAClE,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC;AAED,MAAM,OAAO,cAAc;IAChB,QAAQ,GAAG,aAAa,CAAC;IAElC,KAAK,CAAC,OAAO,CAAC,IAA6B;QACzC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,gBAAgB,CACxB,4DAA4D,EAC5D,IAAI,CAAC,QAAQ,EACb,IAAI,CACL,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC;QAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IACvD,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compat.js","sourceRoot":"","sources":["../../../src/openai-compat/openai-compat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACL,2BAA2B,EAC3B,oCAAoC,GACrC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,uEAAuE;AACvE,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AACxE,wEAAwE;AACxE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,oEAAoE;AACpE,yEAAyE;AACzE,qEAAqE;AACrE,4EAA4E;AAC5E,MAAM,QAAQ,GAAG;IACf,6DAA6D;IAC7D,EAAE;IACF,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,oEAAoE;IACpE,yEAAyE;IACzE,sEAAsE;IACtE,6DAA6D;IAC7D,EAAE;IACF,mEAAmE;IACnE,0EAA0E;IAC1E,yDAAyD;IACzD,EAAE;IACF,oEAAoE;IACpE,uGAAuG;IACvG,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,wEAAwE;IACxE,sEAAsE;IACtE,kBAAkB;IAClB,EAAE;IACF,sEAAsE;IACtE,qEAAqE;IACrE,mEAAmE;IACnE,EAAE;IACF,2DAA2D;IAC3D,yCAAyC;IACzC,EAAE;IACF,mDAAmD;IACnD,qEAAqE;IACrE,kDAAkD;IAClD,qDAAqD;IACrD,EAAE;IACF,iCAAiC;CAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACb,OAAO,EACL,kBAAkB,GAGnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,yEAAyE;AACzE,4EAA4E;AAC5E,gHAAgH;AAChH,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACnG,OAAO,EAAE,sBAAsB,EAAwB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EACL,oBAAoB,EACpB,4BAA4B,GAE7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kBAAkB,GAGnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,IAAI,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"openai-compat.js","sourceRoot":"","sources":["../../../src/openai-compat/openai-compat.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,8 @@ import type { OpenAIDelta } from './sse.js';
|
|
|
30
30
|
export declare enum ToolMode {
|
|
31
31
|
Embedded = "embedded",
|
|
32
32
|
PerMessage = "per-message",
|
|
33
|
-
NativeStream = "native-stream"
|
|
33
|
+
NativeStream = "native-stream",
|
|
34
|
+
OpenClawNative = "openclaw-native"
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* The tool definition shape OpenClaw's `createOpenClawCodingTools` produces
|
|
@@ -30,5 +30,6 @@ export var ToolMode;
|
|
|
30
30
|
ToolMode["Embedded"] = "embedded";
|
|
31
31
|
ToolMode["PerMessage"] = "per-message";
|
|
32
32
|
ToolMode["NativeStream"] = "native-stream";
|
|
33
|
+
ToolMode["OpenClawNative"] = "openclaw-native";
|
|
33
34
|
})(ToolMode || (ToolMode = {}));
|
|
34
35
|
//# sourceMappingURL=tool-bridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-bridge.js","sourceRoot":"","sources":["../../../src/types/tool-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH;;;;;;;;;;;GAWG;AACH,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"tool-bridge.js","sourceRoot":"","sources":["../../../src/types/tool-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH;;;;;;;;;;;GAWG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,sCAA0B,CAAA;IAC1B,0CAA8B,CAAA;IAC9B,8CAAkC,CAAA;AACpC,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB"}
|
package/package.json
CHANGED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cc-openclaw vs claude-local A/B benchmark harness.
|
|
3
|
-
*
|
|
4
|
-
* SCAFFOLD STAGE — actual Anthropic CLI subprocess invocation is deferred
|
|
5
|
-
* to P5 (when A1 is using the plugin daily and comparison data is naturally
|
|
6
|
-
* collected from real workloads).
|
|
7
|
-
*
|
|
8
|
-
* Bench corpus per PRP "Performance Benchmark Spec":
|
|
9
|
-
* - 100 cold-start sessions (sysprompt size at start)
|
|
10
|
-
* - 100 warm-turn continuations
|
|
11
|
-
* - 50 sessions with 5+ tool calls each
|
|
12
|
-
* - 50 sessions with 10-turn dialogues
|
|
13
|
-
* - 20 sessions with MCP tool invocations
|
|
14
|
-
*
|
|
15
|
-
* Metrics captured per run:
|
|
16
|
-
* - Cold-turn sysprompt token count (input)
|
|
17
|
-
* - Time-to-first-token (latency)
|
|
18
|
-
* - Total session token cost (input + output)
|
|
19
|
-
* - Memory delta during session (RSS sample)
|
|
20
|
-
* - Listener event counts (zero-stacking proof — already verified by
|
|
21
|
-
* register-guard-stacking.test.ts)
|
|
22
|
-
*
|
|
23
|
-
* Output: ~/.openclaw/workspace/memory/cc-openclaw-bench.jsonl
|
|
24
|
-
*
|
|
25
|
-
* Invocation:
|
|
26
|
-
* tsx scripts/bench/ab-harness.ts --engine cc-openclaw --corpus cold-start --count 100
|
|
27
|
-
* tsx scripts/bench/ab-harness.ts --engine claude-local --corpus cold-start --count 100
|
|
28
|
-
*
|
|
29
|
-
* Then compare via:
|
|
30
|
-
* tsx scripts/bench/ab-compare.ts (separate script, not yet authored)
|
|
31
|
-
*/
|
|
32
|
-
export declare const BENCH_PATH: string;
|
|
33
|
-
export type Engine = 'cc-openclaw' | 'claude-local';
|
|
34
|
-
export type CorpusName = 'cold-start' | 'warm-turn' | 'tool-heavy' | 'long-dialogue' | 'mcp-heavy';
|
|
35
|
-
export interface BenchEvent {
|
|
36
|
-
ts: string;
|
|
37
|
-
engine: Engine;
|
|
38
|
-
corpus: CorpusName;
|
|
39
|
-
runIdx: number;
|
|
40
|
-
coldTurnInputTokens?: number;
|
|
41
|
-
ttftMs?: number;
|
|
42
|
-
totalInputTokens?: number;
|
|
43
|
-
totalOutputTokens?: number;
|
|
44
|
-
rssDeltaBytes?: number;
|
|
45
|
-
listenerEventCount?: number;
|
|
46
|
-
errors?: string[];
|
|
47
|
-
}
|
|
48
|
-
export declare function writeBenchEvent(event: Omit<BenchEvent, 'ts'>): void;
|
|
49
|
-
/** TODO(P5): drive an actual session via the chosen engine + record metrics. */
|
|
50
|
-
export declare function runSingle(_engine: Engine, _corpus: CorpusName, _runIdx: number): Promise<BenchEvent>;
|
|
51
|
-
/** Parse argv minimally — full CLI in P5. */
|
|
52
|
-
export interface CliArgs {
|
|
53
|
-
engine: Engine;
|
|
54
|
-
corpus: CorpusName;
|
|
55
|
-
count: number;
|
|
56
|
-
}
|
|
57
|
-
export declare function parseArgs(argv: readonly string[]): CliArgs | null;
|
|
58
|
-
//# sourceMappingURL=ab-harness.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ab-harness.d.ts","sourceRoot":"","sources":["../../../scripts/bench/ab-harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAMH,eAAO,MAAM,UAAU,QAAiF,CAAC;AAEzG,MAAM,MAAM,MAAM,GAAG,aAAa,GAAG,cAAc,CAAC;AACpD,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,eAAe,GAAG,WAAW,CAAC;AAEnG,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAOD,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI,CAGnE;AAED,gFAAgF;AAChF,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM1G;AAED,6CAA6C;AAC7C,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAcjE"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cc-openclaw vs claude-local A/B benchmark harness.
|
|
3
|
-
*
|
|
4
|
-
* SCAFFOLD STAGE — actual Anthropic CLI subprocess invocation is deferred
|
|
5
|
-
* to P5 (when A1 is using the plugin daily and comparison data is naturally
|
|
6
|
-
* collected from real workloads).
|
|
7
|
-
*
|
|
8
|
-
* Bench corpus per PRP "Performance Benchmark Spec":
|
|
9
|
-
* - 100 cold-start sessions (sysprompt size at start)
|
|
10
|
-
* - 100 warm-turn continuations
|
|
11
|
-
* - 50 sessions with 5+ tool calls each
|
|
12
|
-
* - 50 sessions with 10-turn dialogues
|
|
13
|
-
* - 20 sessions with MCP tool invocations
|
|
14
|
-
*
|
|
15
|
-
* Metrics captured per run:
|
|
16
|
-
* - Cold-turn sysprompt token count (input)
|
|
17
|
-
* - Time-to-first-token (latency)
|
|
18
|
-
* - Total session token cost (input + output)
|
|
19
|
-
* - Memory delta during session (RSS sample)
|
|
20
|
-
* - Listener event counts (zero-stacking proof — already verified by
|
|
21
|
-
* register-guard-stacking.test.ts)
|
|
22
|
-
*
|
|
23
|
-
* Output: ~/.openclaw/workspace/memory/cc-openclaw-bench.jsonl
|
|
24
|
-
*
|
|
25
|
-
* Invocation:
|
|
26
|
-
* tsx scripts/bench/ab-harness.ts --engine cc-openclaw --corpus cold-start --count 100
|
|
27
|
-
* tsx scripts/bench/ab-harness.ts --engine claude-local --corpus cold-start --count 100
|
|
28
|
-
*
|
|
29
|
-
* Then compare via:
|
|
30
|
-
* tsx scripts/bench/ab-compare.ts (separate script, not yet authored)
|
|
31
|
-
*/
|
|
32
|
-
import { appendFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
33
|
-
import { join, dirname } from 'node:path';
|
|
34
|
-
import { homedir } from 'node:os';
|
|
35
|
-
export const BENCH_PATH = join(homedir(), '.openclaw', 'workspace', 'memory', 'cc-openclaw-bench.jsonl');
|
|
36
|
-
function ensureDir(filePath) {
|
|
37
|
-
const dir = dirname(filePath);
|
|
38
|
-
if (!existsSync(dir))
|
|
39
|
-
mkdirSync(dir, { recursive: true });
|
|
40
|
-
}
|
|
41
|
-
export function writeBenchEvent(event) {
|
|
42
|
-
ensureDir(BENCH_PATH);
|
|
43
|
-
appendFileSync(BENCH_PATH, JSON.stringify({ ts: new Date().toISOString(), ...event }) + '\n');
|
|
44
|
-
}
|
|
45
|
-
/** TODO(P5): drive an actual session via the chosen engine + record metrics. */
|
|
46
|
-
export async function runSingle(_engine, _corpus, _runIdx) {
|
|
47
|
-
throw new Error('ab-harness runSingle() is not implemented in P2 R3. Real CLI subprocess invocation is deferred to P5 ' +
|
|
48
|
-
'when A1 is daily-driving the plugin. The scaffold defines the metrics shape + jsonl writer; integration ' +
|
|
49
|
-
'wires up in P5 cco-cutover-docs or a P5 follow-up.');
|
|
50
|
-
}
|
|
51
|
-
export function parseArgs(argv) {
|
|
52
|
-
const args = {};
|
|
53
|
-
for (let i = 0; i < argv.length; i++) {
|
|
54
|
-
const a = argv[i];
|
|
55
|
-
if (a.startsWith('--')) {
|
|
56
|
-
args[a.slice(2)] = argv[i + 1] ?? '';
|
|
57
|
-
i++;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
const engine = args['engine'];
|
|
61
|
-
const corpus = args['corpus'];
|
|
62
|
-
const count = Number.parseInt(args['count'] ?? '0', 10);
|
|
63
|
-
if (!engine || !corpus || !Number.isFinite(count) || count <= 0)
|
|
64
|
-
return null;
|
|
65
|
-
return { engine, corpus, count };
|
|
66
|
-
}
|
|
67
|
-
// CLI entrypoint — only when invoked via tsx, not when imported
|
|
68
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
69
|
-
const cli = parseArgs(process.argv.slice(2));
|
|
70
|
-
if (!cli) {
|
|
71
|
-
process.stderr.write('Usage: tsx scripts/bench/ab-harness.ts --engine <cc-openclaw|claude-local> --corpus <cold-start|warm-turn|tool-heavy|long-dialogue|mcp-heavy> --count <N>\n');
|
|
72
|
-
process.exit(2);
|
|
73
|
-
}
|
|
74
|
-
process.stdout.write(`Bench scaffold ready: engine=${cli.engine} corpus=${cli.corpus} count=${cli.count}\n`);
|
|
75
|
-
process.stdout.write('runSingle() is deferred to P5 — see scripts/bench/README.md\n');
|
|
76
|
-
process.exit(0);
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=ab-harness.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ab-harness.js","sourceRoot":"","sources":["../../../scripts/bench/ab-harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/channels/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,qBAAqB,GACrB,sBAAsB,GACtB,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAC5B,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB;;;;;;;OAOG;IACH,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAE/B,+CAA+C;IAC/C,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,kEAAkE;IAClE,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE,wDAAwD;IACxD,iBAAiB,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAEpF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"completion-summary.d.ts","sourceRoot":"","sources":["../../../../src/channels/telegram/completion-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqBH,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACrF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAgBD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CA2J7C"}
|