ocuclaw 0.1.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.
@@ -0,0 +1,146 @@
1
+ import { createRuntimeConfig } from "../config/runtime-config.js";
2
+ import { createPluginOpenclawClient } from "../gateway/openclaw-client.js";
3
+ import { createRelay as createPluginOwnedRelay } from "./relay-core.js";
4
+
5
+ function normalizeLogger(logger) {
6
+ if (!logger || typeof logger !== "object") {
7
+ return console;
8
+ }
9
+ return {
10
+ info: typeof logger.info === "function" ? logger.info.bind(logger) : console.log,
11
+ warn: typeof logger.warn === "function" ? logger.warn.bind(logger) : console.warn,
12
+ error: typeof logger.error === "function" ? logger.error.bind(logger) : console.error,
13
+ debug:
14
+ typeof logger.debug === "function" ? logger.debug.bind(logger) : console.debug,
15
+ };
16
+ }
17
+
18
+ function resolveCreateRelay(createRelayOverride) {
19
+ if (typeof createRelayOverride === "function") {
20
+ return createRelayOverride;
21
+ }
22
+ return createPluginOwnedRelay;
23
+ }
24
+ function resolveOpenclawClient(openclawClientOverride, runtimeConfig, logger, stateDir) {
25
+ if (openclawClientOverride) {
26
+ return openclawClientOverride;
27
+ }
28
+ return createPluginOpenclawClient({
29
+ gatewayUrl: runtimeConfig.gatewayUrl,
30
+ gatewayToken: runtimeConfig.gatewayToken,
31
+ logger,
32
+ stateDir,
33
+ });
34
+ }
35
+
36
+ export function createOcuClawRelayService(opts = {}) {
37
+ const baseLogger = normalizeLogger(opts.logger);
38
+ let relay = null;
39
+ let runtimeConfig = null;
40
+
41
+ function getRuntimeConfig() {
42
+ if (!runtimeConfig) {
43
+ runtimeConfig =
44
+ opts.runtimeConfig ||
45
+ createRuntimeConfig({
46
+ env: opts.env || process.env,
47
+ pluginConfig: opts.pluginConfig,
48
+ openclawConfig: opts.openclawConfig,
49
+ });
50
+ }
51
+ return runtimeConfig;
52
+ }
53
+
54
+ async function start(startOpts = {}) {
55
+ if (relay) {
56
+ return relay;
57
+ }
58
+
59
+ const logger = normalizeLogger(startOpts.logger || baseLogger);
60
+ const config = getRuntimeConfig();
61
+ const stateDir = startOpts.stateDir || opts.stateDir;
62
+ const createRelay = resolveCreateRelay(opts.createRelay);
63
+ const openclawClient = resolveOpenclawClient(
64
+ opts.openclawClient,
65
+ config,
66
+ logger,
67
+ stateDir,
68
+ );
69
+ if (typeof openclawClient.setLogger === "function") {
70
+ openclawClient.setLogger(logger);
71
+ }
72
+ const nextRelay = createRelay({
73
+ gatewayUrl: config.gatewayUrl,
74
+ gatewayToken: config.gatewayToken,
75
+ httpServer: startOpts.httpServer || opts.httpServer,
76
+ port: config.wsPort,
77
+ host: config.wsBind,
78
+ token: config.relayToken,
79
+ sessionLimit: config.sessionLimit,
80
+ sonioxApiKey: config.sonioxApiKey,
81
+ debugPayloadMaxBytes: config.debugPayloadMaxBytes,
82
+ debugNoisyPolicies: config.debugNoisyPolicies,
83
+ externalDebugToolsEnabled: config.externalDebugToolsEnabled,
84
+ evenAiEnabled: config.evenAiEnabled,
85
+ evenAiToken: config.evenAiToken,
86
+ evenAiSystemPrompt: config.evenAiSystemPrompt,
87
+ evenAiRequestTimeoutMs: config.evenAiRequestTimeoutMs,
88
+ evenAiMaxBodyBytes: config.evenAiMaxBodyBytes,
89
+ evenAiDedupWindowMs: config.evenAiDedupWindowMs,
90
+ evenAiRoutingMode: config.evenAiRoutingMode,
91
+ evenAiDedicatedSessionKey: config.evenAiDedicatedSessionKey,
92
+ stateDir,
93
+ evenAiExternalHttpRouting: opts.evenAiExternalHttpRouting === true,
94
+ openclawClient,
95
+ logger,
96
+ consoleLogPath: opts.consoleLogPath,
97
+ });
98
+
99
+ relay = nextRelay;
100
+ try {
101
+ await Promise.resolve(nextRelay.start());
102
+ logger.info(
103
+ `[ocuclaw] relay service started on ws://${config.wsBind}:${config.wsPort}`,
104
+ );
105
+ return nextRelay;
106
+ } catch (err) {
107
+ relay = null;
108
+ throw err;
109
+ }
110
+ }
111
+
112
+ async function stop(stopOpts = {}) {
113
+ if (!relay) {
114
+ return;
115
+ }
116
+
117
+ const logger = normalizeLogger(stopOpts.logger || baseLogger);
118
+ const activeRelay = relay;
119
+ relay = null;
120
+ await Promise.resolve(activeRelay.stop());
121
+ logger.info("[ocuclaw] relay service stopped");
122
+ }
123
+
124
+ return {
125
+ getRuntimeConfig,
126
+ getRelay() {
127
+ return relay;
128
+ },
129
+ getEvenAiSettingsSnapshot() {
130
+ if (relay && typeof relay.getEvenAiSettingsSnapshot === "function") {
131
+ return relay.getEvenAiSettingsSnapshot();
132
+ }
133
+ const config = getRuntimeConfig();
134
+ return {
135
+ routingMode: config.evenAiRoutingMode,
136
+ systemPrompt: config.evenAiSystemPrompt,
137
+ defaultModel: "",
138
+ defaultThinking: "",
139
+ listenEnabled: false,
140
+ trackedThrowawayKeys: [],
141
+ };
142
+ },
143
+ start,
144
+ stop,
145
+ };
146
+ }