@openclaw-cloud/agent-controller 3.6.1 → 3.6.3
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/api.d.ts +2 -14
- package/dist/api.js +1 -15
- package/dist/api.js.map +1 -1
- package/dist/commands/agent-update-cli.js +0 -7
- package/dist/commands/agent-update-cli.js.map +1 -1
- package/dist/commands/bootstrap.d.ts +0 -10
- package/dist/commands/bootstrap.js +2 -16
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/channel-server.d.ts +0 -16
- package/dist/commands/channel-server.js +1 -19
- package/dist/commands/channel-server.js.map +1 -1
- package/dist/commands/deploy-cli.js +2 -12
- package/dist/commands/deploy-cli.js.map +1 -1
- package/dist/commands/diagnostics-cli.js +0 -6
- package/dist/commands/diagnostics-cli.js.map +1 -1
- package/dist/commands/install-deps.d.ts +0 -10
- package/dist/commands/install-deps.js +1 -10
- package/dist/commands/install-deps.js.map +1 -1
- package/dist/commands/install.js +0 -6
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/package-install-cli.js +1 -14
- package/dist/commands/package-install-cli.js.map +1 -1
- package/dist/commands/plugin-update-cli.js +1 -8
- package/dist/commands/plugin-update-cli.js.map +1 -1
- package/dist/commands/restart-cli.js +0 -4
- package/dist/commands/restart-cli.js.map +1 -1
- package/dist/commands/self-update.d.ts +2 -24
- package/dist/commands/self-update.js +5 -54
- package/dist/commands/self-update.js.map +1 -1
- package/dist/commands/stop-cli.d.ts +0 -4
- package/dist/commands/stop-cli.js +1 -24
- package/dist/commands/stop-cli.js.map +1 -1
- package/dist/config-file.d.ts +3 -20
- package/dist/config-file.js +3 -22
- package/dist/config-file.js.map +1 -1
- package/dist/config.d.ts +0 -22
- package/dist/config.js +1 -34
- package/dist/config.js.map +1 -1
- package/dist/connection.js +2 -39
- package/dist/connection.js.map +1 -1
- package/dist/handlers/agent-update.d.ts +1 -21
- package/dist/handlers/agent-update.js +1 -21
- package/dist/handlers/agent-update.js.map +1 -1
- package/dist/handlers/chat.d.ts +0 -8
- package/dist/handlers/chat.js +3 -23
- package/dist/handlers/chat.js.map +1 -1
- package/dist/handlers/file-write.js +1 -4
- package/dist/handlers/file-write.js.map +1 -1
- package/dist/handlers/memory.d.ts +1 -9
- package/dist/handlers/memory.js +3 -25
- package/dist/handlers/memory.js.map +1 -1
- package/dist/handlers/onboarding.js +0 -2
- package/dist/handlers/onboarding.js.map +1 -1
- package/dist/handlers/pair.js +1 -3
- package/dist/handlers/pair.js.map +1 -1
- package/dist/handlers/plugin-update.d.ts +1 -16
- package/dist/handlers/plugin-update.js +1 -16
- package/dist/handlers/plugin-update.js.map +1 -1
- package/dist/handlers/restart.js +0 -2
- package/dist/handlers/restart.js.map +1 -1
- package/dist/handlers/self-update.d.ts +2 -29
- package/dist/handlers/self-update.js +3 -35
- package/dist/handlers/self-update.js.map +1 -1
- package/dist/handlers/slack-event.d.ts +2 -9
- package/dist/handlers/slack-event.js +2 -10
- package/dist/handlers/slack-event.js.map +1 -1
- package/dist/heartbeat.d.ts +2 -12
- package/dist/heartbeat.js +3 -18
- package/dist/heartbeat.js.map +1 -1
- package/dist/index.js +6 -50
- package/dist/index.js.map +1 -1
- package/dist/lockfile.d.ts +0 -7
- package/dist/lockfile.js +0 -9
- package/dist/lockfile.js.map +1 -1
- package/dist/memory-mcp-server.d.ts +1 -19
- package/dist/memory-mcp-server.js +5 -53
- package/dist/memory-mcp-server.js.map +1 -1
- package/dist/mock-board-worker.d.ts +2 -25
- package/dist/mock-board-worker.js +7 -54
- package/dist/mock-board-worker.js.map +1 -1
- package/dist/platform/linux.js +0 -3
- package/dist/platform/linux.js.map +1 -1
- package/dist/platform/macos.js +0 -2
- package/dist/platform/macos.js.map +1 -1
- package/dist/providers/chat-types.d.ts +0 -3
- package/dist/providers/chat-types.js +0 -3
- package/dist/providers/chat-types.js.map +1 -1
- package/dist/providers/claude-code/channel-server.d.ts +0 -19
- package/dist/providers/claude-code/channel-server.js +0 -19
- package/dist/providers/claude-code/channel-server.js.map +1 -1
- package/dist/providers/claude-code/index.d.ts +0 -22
- package/dist/providers/claude-code/index.js +3 -26
- package/dist/providers/claude-code/index.js.map +1 -1
- package/dist/providers/claude-code/login-flow.d.ts +0 -17
- package/dist/providers/claude-code/login-flow.js +2 -16
- package/dist/providers/claude-code/login-flow.js.map +1 -1
- package/dist/providers/claude-code/settings-writer.d.ts +1 -16
- package/dist/providers/claude-code/settings-writer.js +5 -20
- package/dist/providers/claude-code/settings-writer.js.map +1 -1
- package/dist/providers/claude-code/socket-bridge.d.ts +0 -35
- package/dist/providers/claude-code/socket-bridge.js +2 -43
- package/dist/providers/claude-code/socket-bridge.js.map +1 -1
- package/dist/providers/claude-code/spawn-claude.d.ts +0 -17
- package/dist/providers/claude-code/spawn-claude.js +1 -15
- package/dist/providers/claude-code/spawn-claude.js.map +1 -1
- package/dist/providers/index.d.ts +1 -10
- package/dist/providers/index.js +2 -13
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/mock/index.d.ts +0 -4
- package/dist/providers/mock/index.js +0 -4
- package/dist/providers/mock/index.js.map +1 -1
- package/dist/providers/openclaw/auto-pair.d.ts +1 -6
- package/dist/providers/openclaw/auto-pair.js +1 -10
- package/dist/providers/openclaw/auto-pair.js.map +1 -1
- package/dist/providers/openclaw/device-identity.d.ts +1 -1
- package/dist/providers/openclaw/device-identity.js +33 -17
- package/dist/providers/openclaw/device-identity.js.map +1 -1
- package/dist/providers/openclaw/gateway-adapter.d.ts +0 -5
- package/dist/providers/openclaw/gateway-adapter.js +4 -32
- package/dist/providers/openclaw/gateway-adapter.js.map +1 -1
- package/dist/providers/openclaw/gateway-client.js +3 -9
- package/dist/providers/openclaw/gateway-client.js.map +1 -1
- package/dist/providers/openclaw/index.js +2 -15
- package/dist/providers/openclaw/index.js.map +1 -1
- package/dist/providers/types.d.ts +0 -10
- package/dist/slack-relay-server.d.ts +4 -33
- package/dist/slack-relay-server.js +9 -57
- package/dist/slack-relay-server.js.map +1 -1
- package/dist/types.d.ts +1 -12
- package/dist/types.js +0 -6
- package/dist/types.js.map +1 -1
- package/dist/utils/agent-controller-bin.d.ts +0 -6
- package/dist/utils/agent-controller-bin.js +1 -21
- package/dist/utils/agent-controller-bin.js.map +1 -1
- package/dist/utils/anthropic-auth.d.ts +1 -22
- package/dist/utils/anthropic-auth.js +0 -10
- package/dist/utils/anthropic-auth.js.map +1 -1
- package/dist/utils/apply-config.d.ts +8 -68
- package/dist/utils/apply-config.js +75 -203
- package/dist/utils/apply-config.js.map +1 -1
- package/dist/utils/backup-push.d.ts +0 -10
- package/dist/utils/backup-push.js +0 -15
- package/dist/utils/backup-push.js.map +1 -1
- package/dist/utils/claude-env.d.ts +1 -10
- package/dist/utils/claude-env.js +2 -14
- package/dist/utils/claude-env.js.map +1 -1
- package/dist/utils/config-merge-paths.d.ts +5 -43
- package/dist/utils/config-merge-paths.js +5 -43
- package/dist/utils/config-merge-paths.js.map +1 -1
- package/dist/utils/deploy-type.d.ts +1 -13
- package/dist/utils/deploy-type.js +2 -19
- package/dist/utils/deploy-type.js.map +1 -1
- package/dist/utils/diagnostics.d.ts +0 -7
- package/dist/utils/diagnostics.js +0 -15
- package/dist/utils/diagnostics.js.map +1 -1
- package/dist/utils/exec.d.ts +0 -10
- package/dist/utils/exec.js +2 -32
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/gateway-restart-handler.d.ts +1 -8
- package/dist/utils/gateway-restart-handler.js +1 -8
- package/dist/utils/gateway-restart-handler.js.map +1 -1
- package/dist/utils/gateway-restart.d.ts +1 -11
- package/dist/utils/gateway-restart.js +1 -11
- package/dist/utils/gateway-restart.js.map +1 -1
- package/dist/utils/knowledge-graph.d.ts +2 -25
- package/dist/utils/knowledge-graph.js +2 -37
- package/dist/utils/knowledge-graph.js.map +1 -1
- package/dist/utils/knowledge-push.d.ts +0 -4
- package/dist/utils/knowledge-push.js +4 -19
- package/dist/utils/knowledge-push.js.map +1 -1
- package/dist/utils/legacy-mcp-servers.d.ts +1 -11
- package/dist/utils/legacy-mcp-servers.js +1 -11
- package/dist/utils/legacy-mcp-servers.js.map +1 -1
- package/dist/utils/log-collector.js +0 -2
- package/dist/utils/log-collector.js.map +1 -1
- package/dist/utils/openclaw-ops.d.ts +5 -72
- package/dist/utils/openclaw-ops.js +6 -98
- package/dist/utils/openclaw-ops.js.map +1 -1
- package/dist/utils/openclaw-stack-update.d.ts +2 -14
- package/dist/utils/openclaw-stack-update.js +1 -6
- package/dist/utils/openclaw-stack-update.js.map +1 -1
- package/dist/utils/package-install.d.ts +0 -5
- package/dist/utils/package-install.js +2 -21
- package/dist/utils/package-install.js.map +1 -1
- package/dist/utils/package-version.d.ts +1 -9
- package/dist/utils/package-version.js +1 -9
- package/dist/utils/package-version.js.map +1 -1
- package/dist/utils/parse-id-at-version.d.ts +1 -11
- package/dist/utils/parse-id-at-version.js +1 -11
- package/dist/utils/parse-id-at-version.js.map +1 -1
- package/dist/utils/plugin-reconcile.d.ts +2 -33
- package/dist/utils/plugin-reconcile.js +7 -77
- package/dist/utils/plugin-reconcile.js.map +1 -1
- package/dist/utils/release-channel.d.ts +0 -8
- package/dist/utils/release-channel.js.map +1 -1
- package/dist/utils/write-home-files.d.ts +2 -24
- package/dist/utils/write-home-files.js +3 -27
- package/dist/utils/write-home-files.js.map +1 -1
- package/dist/utils/write-workspace-files.d.ts +0 -14
- package/dist/utils/write-workspace-files.js +1 -19
- package/dist/utils/write-workspace-files.js.map +1 -1
- package/dist/workspace.d.ts +1 -21
- package/dist/workspace.js +1 -21
- package/dist/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,20 +6,7 @@ import { config } from '../config.js';
|
|
|
6
6
|
import { withEaccesRetry, installAcSelf, AC_PACKAGE, } from '../utils/openclaw-ops.js';
|
|
7
7
|
import { runOpenclawStackUpdate } from '../utils/openclaw-stack-update.js';
|
|
8
8
|
import { logCollector } from '../connection.js';
|
|
9
|
-
/**
|
|
10
|
-
* Run the explicit-version self-update flow. Throws when `installOpenclaw`
|
|
11
|
-
* or `installAcSelf` fail outright — per-plugin failures are recorded in
|
|
12
|
-
* the result rather than thrown. The caller is responsible for translating
|
|
13
|
-
* thrown errors into an AgentResponse / process exit.
|
|
14
|
-
*
|
|
15
|
-
* IMPORTANT: when `acChanged` is true, this function does NOT call
|
|
16
|
-
* `removeLockFile()` and does NOT sleep — both are now the caller's job
|
|
17
|
-
* (handler defers them to the next tick AFTER `api.publishResponse` so the
|
|
18
|
-
* backend sees a real `success: true` response before the supervisor picks
|
|
19
|
-
* up the missing lock and restarts the process). The CLI entrypoint
|
|
20
|
-
* (`runSelfUpdateCli`) handles this directly since there's no response to
|
|
21
|
-
* publish.
|
|
22
|
-
*/
|
|
9
|
+
/** Callers own lock removal: the WS handler delays it to give the response a chance to publish. */
|
|
23
10
|
export async function runExplicitSelfUpdate(currentVersion, payload) {
|
|
24
11
|
let runtimeChanged = false;
|
|
25
12
|
let pluginSummary;
|
|
@@ -31,7 +18,6 @@ export async function runExplicitSelfUpdate(currentVersion, payload) {
|
|
|
31
18
|
targetOpenclaw: payload.openclaw?.version,
|
|
32
19
|
pluginCount: payload.openclaw?.plugins?.length ?? 0,
|
|
33
20
|
});
|
|
34
|
-
// 1) openclaw runtime + plugins (one gateway restart at the end)
|
|
35
21
|
if (payload.openclaw) {
|
|
36
22
|
const stack = await runOpenclawStackUpdate({
|
|
37
23
|
version: payload.openclaw.version,
|
|
@@ -42,10 +28,6 @@ export async function runExplicitSelfUpdate(currentVersion, payload) {
|
|
|
42
28
|
pluginSummary = stack.pluginSummary;
|
|
43
29
|
gatewayRestarted = stack.gatewayRestarted;
|
|
44
30
|
}
|
|
45
|
-
// 2) agent-controller swap LAST. Note: we run `npm install -g` here but
|
|
46
|
-
// do NOT remove the lockfile or sleep — the WS handler defers that
|
|
47
|
-
// work until AFTER the AgentResponse is published. The CLI path runs
|
|
48
|
-
// this same function and handles the lockfile + sleep itself.
|
|
49
31
|
if (payload.agentController?.version) {
|
|
50
32
|
acChanged = await installAcSelf(payload.agentController.version, currentVersion);
|
|
51
33
|
if (acChanged) {
|
|
@@ -54,11 +36,7 @@ export async function runExplicitSelfUpdate(currentVersion, payload) {
|
|
|
54
36
|
}
|
|
55
37
|
return { runtimeChanged, pluginSummary, gatewayRestarted, acChanged };
|
|
56
38
|
}
|
|
57
|
-
//
|
|
58
|
-
// Legacy channel-based path — preserved for old backends that publish
|
|
59
|
-
// `self_update` with an empty payload (and for the CLI fallback when the
|
|
60
|
-
// runtime-targets endpoint is unreachable).
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
39
|
+
// Empty-payload self_update from older backends still uses the release channel.
|
|
62
40
|
export async function selfUpdate(currentVersion) {
|
|
63
41
|
const channel = getReleaseChannel();
|
|
64
42
|
const tag = channel === 'stable' ? 'latest' : channel;
|
|
@@ -75,26 +53,14 @@ export async function selfUpdate(currentVersion) {
|
|
|
75
53
|
removeLockFile();
|
|
76
54
|
await new Promise((resolve) => setTimeout(resolve, 30_000));
|
|
77
55
|
}
|
|
78
|
-
//
|
|
79
|
-
// CLI entrypoint — try the new on-demand /api/agent/runtime-targets path
|
|
80
|
-
// first; fall back to the legacy channel-based path if the backend is
|
|
81
|
-
// unreachable, returns an empty payload, or returns a non-2xx response.
|
|
82
|
-
//
|
|
83
|
-
// `fetchRuntimeTargets` is exported because it is the ONE implementation of
|
|
84
|
-
// "ask the backend what this agent should be running"; utils/plugin-reconcile.ts
|
|
85
|
-
// reuses it so a reconcile install picks the same plugin version a self-update
|
|
86
|
-
// would.
|
|
87
|
-
// ---------------------------------------------------------------------------
|
|
56
|
+
// Reconciliation shares this target lookup so it selects the same versions as self-update.
|
|
88
57
|
export async function fetchRuntimeTargets() {
|
|
89
58
|
const backendUrl = config.backendUrl;
|
|
90
59
|
const token = config.agentToken;
|
|
91
60
|
if (!backendUrl || !token)
|
|
92
61
|
return null;
|
|
93
62
|
try {
|
|
94
|
-
//
|
|
95
|
-
// up in debugLog tracing like every other backend call. The swallow is
|
|
96
|
-
// deliberate: any failure (401, 500, network, empty body) means "no
|
|
97
|
-
// explicit targets", and the caller falls back to the channel-based path.
|
|
63
|
+
// Unavailable or invalid targets deliberately fall back to the legacy release-channel path.
|
|
98
64
|
const api = createAgentApi(backendUrl, token);
|
|
99
65
|
const data = (await api.get('/api/agent/runtime-targets'));
|
|
100
66
|
if (!data || (!data.openclaw && !data.agentController))
|
|
@@ -105,23 +71,12 @@ export async function fetchRuntimeTargets() {
|
|
|
105
71
|
return null;
|
|
106
72
|
}
|
|
107
73
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Top-level CLI entrypoint invoked by `agent-controller self-update`.
|
|
110
|
-
* Tries the new explicit-payload flow first; falls back to legacy when
|
|
111
|
-
* the backend has no runtime-targets endpoint or no override configured.
|
|
112
|
-
*
|
|
113
|
-
* Unlike the WS handler path (handlers/self-update.ts), the CLI has no
|
|
114
|
-
* AgentResponse to publish, so we keep the original
|
|
115
|
-
* `removeLockFile() + sleep(30s)` tail when the agent-controller actually
|
|
116
|
-
* changed — that's the supervisor handoff signal.
|
|
117
|
-
*/
|
|
74
|
+
/** The CLI has no response to publish, so it can hand off to the supervisor directly. */
|
|
118
75
|
export async function runSelfUpdateCli(currentVersion) {
|
|
119
76
|
const targets = await fetchRuntimeTargets();
|
|
120
77
|
if (targets) {
|
|
121
78
|
const channel = getReleaseChannel();
|
|
122
79
|
console.log(`Current version: ${currentVersion} (channel: ${channel})`);
|
|
123
|
-
// Summary line — describe what the backend wants us to install, skipping
|
|
124
|
-
// subparts the payload didn't include.
|
|
125
80
|
const pluginCount = targets.openclaw?.plugins?.length ?? 0;
|
|
126
81
|
const summaryParts = [];
|
|
127
82
|
if (targets.openclaw) {
|
|
@@ -135,9 +90,6 @@ export async function runSelfUpdateCli(currentVersion) {
|
|
|
135
90
|
if (summaryParts.length > 0) {
|
|
136
91
|
console.log(`Backend targets: ${summaryParts.join(', ')}`);
|
|
137
92
|
}
|
|
138
|
-
// Intent lines — printed BEFORE runExplicitSelfUpdate runs. The runtime
|
|
139
|
-
// step may end up being a no-op (skip); the post-call result lines below
|
|
140
|
-
// resolve that ambiguity.
|
|
141
93
|
if (targets.openclaw) {
|
|
142
94
|
console.log(`Installing openclaw runtime ${targets.openclaw.version}...`);
|
|
143
95
|
}
|
|
@@ -148,7 +100,6 @@ export async function runSelfUpdateCli(currentVersion) {
|
|
|
148
100
|
console.log(`Installing agent-controller ${targets.agentController.version}...`);
|
|
149
101
|
}
|
|
150
102
|
const result = await runExplicitSelfUpdate(currentVersion, targets);
|
|
151
|
-
// Result lines — what actually happened.
|
|
152
103
|
if (targets.openclaw) {
|
|
153
104
|
if (result.runtimeChanged) {
|
|
154
105
|
console.log(`openclaw runtime installed at ${targets.openclaw.version}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,eAAe,EACf,aAAa,EACb,UAAU,GAEX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Internal seam — wraps `process.kill` so tests can swap in a stub without
|
|
3
|
-
* mocking the global. Exported for testing only.
|
|
4
|
-
*/
|
|
5
1
|
export declare const _killProcess: (pid: number, signal: NodeJS.Signals) => void;
|
|
6
2
|
export declare function runStopCli(): Promise<void>;
|
|
@@ -1,31 +1,8 @@
|
|
|
1
1
|
import { isLockFilePresent, readLockFilePid } from '../lockfile.js';
|
|
2
2
|
import { logCollector } from '../connection.js';
|
|
3
3
|
import { toErrorMessage } from '../utils/response.js';
|
|
4
|
-
//
|
|
5
|
-
// CLI entrypoint for `agent-controller stop`. The WS handler at
|
|
6
|
-
// src/handlers/stop.ts gracefully shuts down the running agent-controller
|
|
7
|
-
// process — the CLI can't do that directly because it's a separate
|
|
8
|
-
// short-lived process, so we signal the running daemon instead.
|
|
9
|
-
//
|
|
10
|
-
// Strategy (option B from the design discussion):
|
|
11
|
-
// 1. Read the lockfile (~/.openclaw/agent-controller/agent-controller.lock
|
|
12
|
-
// or /opt/openclaw-cloud/agent-controller/agent-controller.lock) to
|
|
13
|
-
// find the daemon PID.
|
|
14
|
-
// 2. Send SIGTERM. The daemon's normal shutdown path runs.
|
|
15
|
-
// 3. Exit 0 once the signal is sent — we don't wait for the daemon to
|
|
16
|
-
// actually exit because the supervisor (systemd/launchd/k8s) will
|
|
17
|
-
// decide whether to restart it.
|
|
18
|
-
//
|
|
19
|
-
// Failure modes:
|
|
20
|
-
// - No lockfile / daemon not running → exit 0 with a "not running" log
|
|
21
|
-
// - Lockfile exists but PID is gone (stale) → exit 0, hint to remove lock
|
|
22
|
-
// - kill(pid, SIGTERM) throws → exit 1 (permission, etc.)
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
4
|
+
// The CLI is a separate process: signal the lockfile PID and leave restart policy to the supervisor.
|
|
24
5
|
const STOP_SIGNAL = 'SIGTERM';
|
|
25
|
-
/**
|
|
26
|
-
* Internal seam — wraps `process.kill` so tests can swap in a stub without
|
|
27
|
-
* mocking the global. Exported for testing only.
|
|
28
|
-
*/
|
|
29
6
|
export const _killProcess = (pid, signal) => {
|
|
30
7
|
process.kill(pid, signal);
|
|
31
8
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-cli.js","sourceRoot":"","sources":["../../src/commands/stop-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,
|
|
1
|
+
{"version":3,"file":"stop-cli.js","sourceRoot":"","sources":["../../src/commands/stop-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,qGAAqG;AAErG,MAAM,WAAW,GAAmB,SAAS,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,MAAsB,EAAQ,EAAE;IACxE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAErE,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CACT,gFAAgF;YAC9E,wEAAwE,CAC3E,CAAC;QACF,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,WAAW,6BAA6B,GAAG,MAAM,CAAC,CAAC;IACjF,IAAI,CAAC;QACH,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,kBAAkB,GAAG,4DAA4D,CAClF,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5D,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/config-file.d.ts
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
/** VM provisioner writes env here */
|
|
2
1
|
export declare const VM_ENV_PATH = "/opt/openclaw-cloud/agent-controller/.env";
|
|
3
2
|
export declare function getConfigDir(): string;
|
|
4
3
|
export declare function getConfigPath(): string;
|
|
5
|
-
/**
|
|
6
|
-
* Serialize a dict to `KEY=VALUE` lines and write it 0600, creating the parent
|
|
7
|
-
* directory. The one writer for every env file we own (`agent.env` and the VM
|
|
8
|
-
* provisioner's `.env`) — these files carry AGENT_TOKEN and provider API keys,
|
|
9
|
-
* so the mode is not optional.
|
|
10
|
-
*/
|
|
4
|
+
/** Env files carry AGENT_TOKEN and provider keys, so mode 0600 is mandatory. */
|
|
11
5
|
export declare function writeEnvFile(filePath: string, vars: Record<string, string>): Promise<void>;
|
|
12
6
|
export declare function saveEnvFile(config: {
|
|
13
7
|
centrifugoUrl: string;
|
|
@@ -17,20 +11,9 @@ export declare function saveEnvFile(config: {
|
|
|
17
11
|
gatewayToken?: string | null;
|
|
18
12
|
}): Promise<void>;
|
|
19
13
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* more. On a duplicate key the FIRST occurrence wins, mirroring `loadEnvFile`'s
|
|
23
|
-
* "already set, don't overwrite" precedence.
|
|
24
|
-
*
|
|
25
|
-
* Deliberately does NOT filter through `ENV_KEYS`: that allowlist governs what
|
|
26
|
-
* this process imports into `process.env`, not what is allowed to live in the
|
|
27
|
-
* file. Callers that rewrite an env file must see every key, or they would drop
|
|
28
|
-
* the ones only systemd or `apiKeyHelper` read.
|
|
14
|
+
* First occurrence wins, matching loadEnvFile precedence. Do not filter through ENV_KEYS:
|
|
15
|
+
* rewriting must preserve keys consumed only by systemd or apiKeyHelper.
|
|
29
16
|
*/
|
|
30
17
|
export declare function parseEnvContent(content: string): Record<string, string>;
|
|
31
|
-
/**
|
|
32
|
-
* Read and parse an env file. A missing or unreadable file yields `{}` — the
|
|
33
|
-
* caller decides what that means. The counterpart to `writeEnvFile`.
|
|
34
|
-
*/
|
|
35
18
|
export declare function readEnvFile(filePath: string): Promise<Record<string, string>>;
|
|
36
19
|
export declare function loadEnvFile(): Promise<void>;
|
package/dist/config-file.js
CHANGED
|
@@ -26,7 +26,6 @@ const ENV_KEYS = [
|
|
|
26
26
|
'MOCK_TASK_DELAY_MS',
|
|
27
27
|
'MOCK_TASK_TEXT',
|
|
28
28
|
];
|
|
29
|
-
/** VM provisioner writes env here */
|
|
30
29
|
export const VM_ENV_PATH = '/opt/openclaw-cloud/agent-controller/.env';
|
|
31
30
|
export function getConfigDir() {
|
|
32
31
|
return path.join(config.stateDir, 'agent-controller');
|
|
@@ -34,12 +33,7 @@ export function getConfigDir() {
|
|
|
34
33
|
export function getConfigPath() {
|
|
35
34
|
return path.join(getConfigDir(), 'agent.env');
|
|
36
35
|
}
|
|
37
|
-
/**
|
|
38
|
-
* Serialize a dict to `KEY=VALUE` lines and write it 0600, creating the parent
|
|
39
|
-
* directory. The one writer for every env file we own (`agent.env` and the VM
|
|
40
|
-
* provisioner's `.env`) — these files carry AGENT_TOKEN and provider API keys,
|
|
41
|
-
* so the mode is not optional.
|
|
42
|
-
*/
|
|
36
|
+
/** Env files carry AGENT_TOKEN and provider keys, so mode 0600 is mandatory. */
|
|
43
37
|
export async function writeEnvFile(filePath, vars) {
|
|
44
38
|
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
45
39
|
const content = Object.entries(vars)
|
|
@@ -61,15 +55,8 @@ export async function saveEnvFile(config) {
|
|
|
61
55
|
console.log(` Config saved to ${getConfigPath()}`);
|
|
62
56
|
}
|
|
63
57
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* more. On a duplicate key the FIRST occurrence wins, mirroring `loadEnvFile`'s
|
|
67
|
-
* "already set, don't overwrite" precedence.
|
|
68
|
-
*
|
|
69
|
-
* Deliberately does NOT filter through `ENV_KEYS`: that allowlist governs what
|
|
70
|
-
* this process imports into `process.env`, not what is allowed to live in the
|
|
71
|
-
* file. Callers that rewrite an env file must see every key, or they would drop
|
|
72
|
-
* the ones only systemd or `apiKeyHelper` read.
|
|
58
|
+
* First occurrence wins, matching loadEnvFile precedence. Do not filter through ENV_KEYS:
|
|
59
|
+
* rewriting must preserve keys consumed only by systemd or apiKeyHelper.
|
|
73
60
|
*/
|
|
74
61
|
export function parseEnvContent(content) {
|
|
75
62
|
const vars = {};
|
|
@@ -86,10 +73,6 @@ export function parseEnvContent(content) {
|
|
|
86
73
|
}
|
|
87
74
|
return vars;
|
|
88
75
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Read and parse an env file. A missing or unreadable file yields `{}` — the
|
|
91
|
-
* caller decides what that means. The counterpart to `writeEnvFile`.
|
|
92
|
-
*/
|
|
93
76
|
export async function readEnvFile(filePath) {
|
|
94
77
|
try {
|
|
95
78
|
return parseEnvContent(await fs.readFile(filePath, 'utf-8'));
|
|
@@ -106,9 +89,7 @@ async function loadFile(filePath) {
|
|
|
106
89
|
}
|
|
107
90
|
}
|
|
108
91
|
export async function loadEnvFile() {
|
|
109
|
-
// 1. User config dir (~/.openclaw/agent-controller/agent.env)
|
|
110
92
|
await loadFile(getConfigPath());
|
|
111
|
-
// 2. VM provisioner path (/opt/openclaw-cloud/agent-controller/.env)
|
|
112
93
|
await loadFile(VM_ENV_PATH);
|
|
113
94
|
}
|
|
114
95
|
//# sourceMappingURL=config-file.js.map
|
package/dist/config-file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,QAAQ,GAAG;IACf,gBAAgB;IAChB,aAAa;IACb,UAAU;IACV,sBAAsB;IACtB,aAAa;IACb,SAAS;IACT,cAAc;IACd,wBAAwB;IACxB,oBAAoB;IACpB,UAAU;IACV,gBAAgB;IAChB,mBAAmB;IACnB,mBAAmB;IACnB,sBAAsB;IACtB,yBAAyB;IACzB,sBAAsB;IACtB,mBAAmB;IACnB,kBAAkB;IAClB,wBAAwB;IACxB,kBAAkB;IAClB,oBAAoB;IACpB,oBAAoB;IACpB,gBAAgB;CACR,CAAC;AAEX,
|
|
1
|
+
{"version":3,"file":"config-file.js","sourceRoot":"","sources":["../src/config-file.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,49 +1,27 @@
|
|
|
1
1
|
export declare const config: {
|
|
2
|
-
/** Base state directory — ~/.openclaw or OPENCLAW_STATE_DIR */
|
|
3
2
|
readonly stateDir: string;
|
|
4
|
-
/** Debug mode (AC_DEBUG or DEBUG) */
|
|
5
3
|
readonly debug: boolean;
|
|
6
|
-
/** Agent UUID (required for main entry, optional in CLI) */
|
|
7
4
|
readonly agentId: string | undefined;
|
|
8
|
-
/** Bearer token for backend API */
|
|
9
5
|
readonly agentToken: string | undefined;
|
|
10
|
-
/** Centrifugo WS endpoint */
|
|
11
6
|
readonly centrifugoUrl: string | undefined;
|
|
12
|
-
/** Backend API URL — BACKEND_URL takes priority, fallback to BACKEND_INTERNAL_URL */
|
|
13
7
|
readonly backendUrl: string | undefined;
|
|
14
|
-
/** Agent provider type */
|
|
15
8
|
readonly agentProvider: string;
|
|
16
|
-
/** OpenClaw Gateway WS URL */
|
|
17
9
|
readonly gatewayWsUrl: string;
|
|
18
|
-
/** OpenClaw Gateway auth token */
|
|
19
10
|
readonly gatewayToken: string;
|
|
20
|
-
/** Release channel — beta or stable */
|
|
21
11
|
readonly releaseChannel: "beta" | "stable";
|
|
22
|
-
/** Workspace directory override */
|
|
23
12
|
readonly workspaceDir: string | undefined;
|
|
24
|
-
/** Deploy type — 'vm' or undefined */
|
|
25
13
|
readonly agentDeployType: string | undefined;
|
|
26
|
-
/** HOME directory */
|
|
27
14
|
readonly home: string;
|
|
28
|
-
/** Anthropic API key (claude-code provider) */
|
|
29
15
|
readonly anthropicApiKey: string | undefined;
|
|
30
|
-
/** Anthropic auth token — alternative to API key (claude-code provider) */
|
|
31
16
|
readonly anthropicAuthToken: string | undefined;
|
|
32
|
-
/** Claude Code OAuth token — issued by `claude login` (claude-code provider) */
|
|
33
17
|
readonly claudeCodeOauthToken: string | undefined;
|
|
34
|
-
/** Workspace directory for the claude-code provider */
|
|
35
18
|
readonly claudeWorkspaceDir: string;
|
|
36
|
-
/** Optional CLAUDE.md content for the claude-code workspace (set by bootstrap). */
|
|
37
19
|
readonly claudeMdContent: string | undefined;
|
|
38
20
|
/** Bearer token the openclaw Slack relay client must present (defense-in-depth on loopback). */
|
|
39
21
|
readonly slackRelayAuthToken: string | undefined;
|
|
40
|
-
/** Optional port override for the local Slack relay WS server (default 8788). */
|
|
41
22
|
readonly slackRelayPort: number | undefined;
|
|
42
|
-
/** Idle poll interval for the mock board worker (mock provider only). */
|
|
43
23
|
readonly mockBoardPollMs: number;
|
|
44
|
-
/** Simulated "thinking" delay before the mock board worker submits. */
|
|
45
24
|
readonly mockTaskDelayMs: number;
|
|
46
|
-
/** Text the mock board worker submits as the agent's reply. */
|
|
47
25
|
readonly mockTaskText: string;
|
|
48
26
|
};
|
|
49
27
|
export declare function requireConfig<K extends keyof typeof config>(key: K): NonNullable<(typeof config)[K]>;
|
package/dist/config.js
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import os from 'node:os';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
|
|
4
|
-
* Central configuration object — single source of truth for all env vars.
|
|
5
|
-
*
|
|
6
|
-
* IMPORTANT: This module must be imported AFTER config-file.ts loadEnvFile()
|
|
7
|
-
* has run, because loadEnvFile() populates process.env from .env files.
|
|
8
|
-
* The main entry point (index.ts) and CLI commands call loadEnvFile() before
|
|
9
|
-
* importing anything that depends on config.
|
|
10
|
-
*
|
|
11
|
-
* For platform-specific values (APPDATA/USERPROFILE on Windows), access
|
|
12
|
-
* process.env directly.
|
|
13
|
-
*/
|
|
3
|
+
// Load env files before consuming config; platform-specific variables remain direct process.env reads.
|
|
14
4
|
function stateDir() {
|
|
15
5
|
return process.env.OPENCLAW_STATE_DIR?.trim() || path.join(os.homedir(), '.openclaw');
|
|
16
6
|
}
|
|
@@ -19,76 +9,58 @@ function positiveIntEnv(name, fallback) {
|
|
|
19
9
|
return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
20
10
|
}
|
|
21
11
|
export const config = {
|
|
22
|
-
/** Base state directory — ~/.openclaw or OPENCLAW_STATE_DIR */
|
|
23
12
|
get stateDir() {
|
|
24
13
|
return stateDir();
|
|
25
14
|
},
|
|
26
|
-
/** Debug mode (AC_DEBUG or DEBUG) */
|
|
27
15
|
get debug() {
|
|
28
16
|
return !!(process.env.AC_DEBUG || process.env.DEBUG);
|
|
29
17
|
},
|
|
30
|
-
/** Agent UUID (required for main entry, optional in CLI) */
|
|
31
18
|
get agentId() {
|
|
32
19
|
return process.env.AGENT_ID;
|
|
33
20
|
},
|
|
34
|
-
/** Bearer token for backend API */
|
|
35
21
|
get agentToken() {
|
|
36
22
|
return process.env.AGENT_TOKEN;
|
|
37
23
|
},
|
|
38
|
-
/** Centrifugo WS endpoint */
|
|
39
24
|
get centrifugoUrl() {
|
|
40
25
|
return process.env.CENTRIFUGO_URL;
|
|
41
26
|
},
|
|
42
|
-
/** Backend API URL — BACKEND_URL takes priority, fallback to BACKEND_INTERNAL_URL */
|
|
43
27
|
get backendUrl() {
|
|
44
28
|
return process.env.BACKEND_URL || process.env.BACKEND_INTERNAL_URL || undefined;
|
|
45
29
|
},
|
|
46
|
-
/** Agent provider type */
|
|
47
30
|
get agentProvider() {
|
|
48
31
|
return process.env.AGENT_PROVIDER ?? 'openclaw';
|
|
49
32
|
},
|
|
50
|
-
/** OpenClaw Gateway WS URL */
|
|
51
33
|
get gatewayWsUrl() {
|
|
52
34
|
return process.env.OPENCLAW_GATEWAY_WS ?? 'ws://localhost:18789';
|
|
53
35
|
},
|
|
54
|
-
/** OpenClaw Gateway auth token */
|
|
55
36
|
get gatewayToken() {
|
|
56
37
|
return process.env.OPENCLAW_GATEWAY_TOKEN ?? '';
|
|
57
38
|
},
|
|
58
|
-
/** Release channel — beta or stable */
|
|
59
39
|
get releaseChannel() {
|
|
60
40
|
const raw = process.env.AC_RELEASE_CHANNEL?.trim().toLowerCase();
|
|
61
41
|
return raw === 'beta' ? 'beta' : 'stable';
|
|
62
42
|
},
|
|
63
|
-
/** Workspace directory override */
|
|
64
43
|
get workspaceDir() {
|
|
65
44
|
return process.env.WORKSPACE_DIR?.trim() || undefined;
|
|
66
45
|
},
|
|
67
|
-
/** Deploy type — 'vm' or undefined */
|
|
68
46
|
get agentDeployType() {
|
|
69
47
|
return process.env.AGENT_DEPLOY_TYPE;
|
|
70
48
|
},
|
|
71
|
-
/** HOME directory */
|
|
72
49
|
get home() {
|
|
73
50
|
return process.env.HOME ?? '/root';
|
|
74
51
|
},
|
|
75
|
-
/** Anthropic API key (claude-code provider) */
|
|
76
52
|
get anthropicApiKey() {
|
|
77
53
|
return process.env.ANTHROPIC_API_KEY;
|
|
78
54
|
},
|
|
79
|
-
/** Anthropic auth token — alternative to API key (claude-code provider) */
|
|
80
55
|
get anthropicAuthToken() {
|
|
81
56
|
return process.env.ANTHROPIC_AUTH_TOKEN;
|
|
82
57
|
},
|
|
83
|
-
/** Claude Code OAuth token — issued by `claude login` (claude-code provider) */
|
|
84
58
|
get claudeCodeOauthToken() {
|
|
85
59
|
return process.env.CLAUDE_CODE_OAUTH_TOKEN;
|
|
86
60
|
},
|
|
87
|
-
/** Workspace directory for the claude-code provider */
|
|
88
61
|
get claudeWorkspaceDir() {
|
|
89
62
|
return process.env.CLAUDE_WORKSPACE_DIR ?? '/home/ubuntu/.claude/workspace';
|
|
90
63
|
},
|
|
91
|
-
/** Optional CLAUDE.md content for the claude-code workspace (set by bootstrap). */
|
|
92
64
|
get claudeMdContent() {
|
|
93
65
|
return process.env.CLAUDE_MD_CONTENT?.trim() || undefined;
|
|
94
66
|
},
|
|
@@ -96,7 +68,6 @@ export const config = {
|
|
|
96
68
|
get slackRelayAuthToken() {
|
|
97
69
|
return process.env.SLACK_RELAY_AUTH_TOKEN?.trim() || undefined;
|
|
98
70
|
},
|
|
99
|
-
/** Optional port override for the local Slack relay WS server (default 8788). */
|
|
100
71
|
get slackRelayPort() {
|
|
101
72
|
const raw = process.env.SLACK_RELAY_PORT?.trim();
|
|
102
73
|
if (!raw)
|
|
@@ -104,20 +75,16 @@ export const config = {
|
|
|
104
75
|
const parsed = Number.parseInt(raw, 10);
|
|
105
76
|
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
106
77
|
},
|
|
107
|
-
/** Idle poll interval for the mock board worker (mock provider only). */
|
|
108
78
|
get mockBoardPollMs() {
|
|
109
79
|
return positiveIntEnv('MOCK_BOARD_POLL_MS', 7_000);
|
|
110
80
|
},
|
|
111
|
-
/** Simulated "thinking" delay before the mock board worker submits. */
|
|
112
81
|
get mockTaskDelayMs() {
|
|
113
82
|
return positiveIntEnv('MOCK_TASK_DELAY_MS', 1_500);
|
|
114
83
|
},
|
|
115
|
-
/** Text the mock board worker submits as the agent's reply. */
|
|
116
84
|
get mockTaskText() {
|
|
117
85
|
return process.env.MOCK_TASK_TEXT?.trim() || 'Mock agent completed the task.';
|
|
118
86
|
},
|
|
119
87
|
};
|
|
120
|
-
/* ── Strict accessors (throw on missing) ────────────────────── */
|
|
121
88
|
export function requireConfig(key) {
|
|
122
89
|
const value = config[key];
|
|
123
90
|
if (value === undefined || value === null || value === '') {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/connection.js
CHANGED
|
@@ -23,19 +23,8 @@ import { handleUpdateConfig } from './handlers/update-config.js';
|
|
|
23
23
|
import { createMemoryHandlers } from './handlers/memory.js';
|
|
24
24
|
import { toErrorMessage } from './utils/response.js';
|
|
25
25
|
import { LogCollector } from './utils/log-collector.js';
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
// Log collector singleton — initialized in createConnection()
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
26
|
export let logCollector;
|
|
30
|
-
//
|
|
31
|
-
// Centrifuge state mappers
|
|
32
|
-
//
|
|
33
|
-
// The centrifuge library exposes `.state` as a string-valued enum
|
|
34
|
-
// (`State.Connected = 'connected'`, etc.) on both clients and subscriptions.
|
|
35
|
-
// We coerce defensively to the CentrifugoStatus string-literal contract so
|
|
36
|
-
// any unexpected enum value (library upgrade, runtime edge case) maps to a
|
|
37
|
-
// safe "down" state rather than throwing — heartbeats must never crash.
|
|
38
|
-
// ---------------------------------------------------------------------------
|
|
27
|
+
// Unexpected Centrifuge states must map to down; library changes must not crash heartbeats.
|
|
39
28
|
export function mapClientState(raw) {
|
|
40
29
|
if (raw === 'connected')
|
|
41
30
|
return 'connected';
|
|
@@ -50,9 +39,6 @@ export function mapSubState(raw) {
|
|
|
50
39
|
return 'subscribing';
|
|
51
40
|
return 'unsubscribed';
|
|
52
41
|
}
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
// Chat response types — moved to module scope to avoid re-creation on every message
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
42
|
const CHAT_RESPONSE_TYPES = new Set([
|
|
57
43
|
'chat_sessions_response',
|
|
58
44
|
'chat_history_response',
|
|
@@ -60,9 +46,6 @@ const CHAT_RESPONSE_TYPES = new Set([
|
|
|
60
46
|
'chat_delta',
|
|
61
47
|
'chat_typing',
|
|
62
48
|
]);
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
// Handlers
|
|
65
|
-
// ---------------------------------------------------------------------------
|
|
66
49
|
function buildHandlers(opts) {
|
|
67
50
|
return {
|
|
68
51
|
diagnostics: handleDiagnostics,
|
|
@@ -86,9 +69,6 @@ function buildHandlers(opts) {
|
|
|
86
69
|
...(opts.knowledgeGraphManager ? createMemoryHandlers(opts.knowledgeGraphManager) : {}),
|
|
87
70
|
};
|
|
88
71
|
}
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
// Step 1: Create Centrifuge client (no subscriptions yet)
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
72
|
function createClient(opts) {
|
|
93
73
|
const getToken = async () => {
|
|
94
74
|
console.log('Fetching connection token...');
|
|
@@ -102,7 +82,6 @@ function createClient(opts) {
|
|
|
102
82
|
throw err;
|
|
103
83
|
}
|
|
104
84
|
};
|
|
105
|
-
// Ensure Centrifugo URL includes /connection/websocket path
|
|
106
85
|
let wsUrl = opts.url;
|
|
107
86
|
if (!wsUrl.includes('/connection/websocket')) {
|
|
108
87
|
wsUrl = wsUrl.replace(/\/+$/, '') + '/connection/websocket';
|
|
@@ -132,9 +111,6 @@ function createClient(opts) {
|
|
|
132
111
|
});
|
|
133
112
|
return client;
|
|
134
113
|
}
|
|
135
|
-
// ---------------------------------------------------------------------------
|
|
136
|
-
// Step 2: Subscribe to a channel with subscription token auth
|
|
137
|
-
// ---------------------------------------------------------------------------
|
|
138
114
|
function subscribeToChannel(client, channel, opts) {
|
|
139
115
|
const sub = client.newSubscription(channel, {
|
|
140
116
|
getToken: async () => {
|
|
@@ -165,9 +141,6 @@ function subscribeToChannel(client, channel, opts) {
|
|
|
165
141
|
sub.subscribe();
|
|
166
142
|
return sub;
|
|
167
143
|
}
|
|
168
|
-
// ---------------------------------------------------------------------------
|
|
169
|
-
// Step 3: Wire up system command channel (agent:<agentId>)
|
|
170
|
-
// ---------------------------------------------------------------------------
|
|
171
144
|
function attachCommandHandlers(sub, channel, opts, markEvent) {
|
|
172
145
|
const handlers = buildHandlers(opts);
|
|
173
146
|
let commandQueue = Promise.resolve();
|
|
@@ -242,9 +215,6 @@ function attachCommandHandlers(sub, channel, opts, markEvent) {
|
|
|
242
215
|
});
|
|
243
216
|
return () => commandQueue;
|
|
244
217
|
}
|
|
245
|
-
// ---------------------------------------------------------------------------
|
|
246
|
-
// Step 4: Wire up chat command channel (chat:<agentId>)
|
|
247
|
-
// ---------------------------------------------------------------------------
|
|
248
218
|
function attachChatHandlers(sub, channel, opts, markEvent) {
|
|
249
219
|
sub.on('publication', (ctx) => {
|
|
250
220
|
markEvent();
|
|
@@ -284,25 +254,18 @@ function attachChatHandlers(sub, channel, opts, markEvent) {
|
|
|
284
254
|
}
|
|
285
255
|
});
|
|
286
256
|
}
|
|
287
|
-
// ---------------------------------------------------------------------------
|
|
288
|
-
// Public API
|
|
289
|
-
// ---------------------------------------------------------------------------
|
|
290
257
|
export function createConnection(opts) {
|
|
291
|
-
// Initialize log collector singleton
|
|
292
258
|
logCollector = new LogCollector(opts.api, { flushIntervalMs: 5000, maxBatchSize: 50 });
|
|
293
259
|
const commandChannel = `agent:${opts.agentId}`;
|
|
294
260
|
const chatChannel = `chat:${opts.agentId}`;
|
|
295
261
|
const client = createClient(opts);
|
|
296
|
-
//
|
|
297
|
-
// the truest "WS is alive end-to-end" signal we can give the backend.
|
|
262
|
+
// Either inbound channel proves command transport is alive; an HTTP heartbeat alone cannot.
|
|
298
263
|
let lastEventAt = null;
|
|
299
264
|
const markEvent = () => {
|
|
300
265
|
lastEventAt = new Date().toISOString();
|
|
301
266
|
};
|
|
302
|
-
// System commands channel (serialized queue)
|
|
303
267
|
const commandSub = subscribeToChannel(client, commandChannel, opts);
|
|
304
268
|
const drainCommands = attachCommandHandlers(commandSub, commandChannel, opts, markEvent);
|
|
305
|
-
// Chat commands channel (concurrent, fire-and-forget)
|
|
306
269
|
const chatSub = subscribeToChannel(client, chatChannel, opts);
|
|
307
270
|
attachChatHandlers(chatSub, chatChannel, opts, markEvent);
|
|
308
271
|
const getCentrifugoStatus = () => {
|