@getaclaw/agent 0.1.1

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.
Files changed (85) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +203 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/index.d.ts +9 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/manage/channels.d.ts +15 -0
  10. package/dist/manage/channels.d.ts.map +1 -0
  11. package/dist/manage/channels.js +34 -0
  12. package/dist/manage/channels.js.map +1 -0
  13. package/dist/manage/config.d.ts +3 -0
  14. package/dist/manage/config.d.ts.map +1 -0
  15. package/dist/manage/config.js +36 -0
  16. package/dist/manage/config.js.map +1 -0
  17. package/dist/manage/devices.d.ts +5 -0
  18. package/dist/manage/devices.d.ts.map +1 -0
  19. package/dist/manage/devices.js +90 -0
  20. package/dist/manage/devices.js.map +1 -0
  21. package/dist/manage/health.d.ts +3 -0
  22. package/dist/manage/health.d.ts.map +1 -0
  23. package/dist/manage/health.js +115 -0
  24. package/dist/manage/health.js.map +1 -0
  25. package/dist/manage/update.d.ts +3 -0
  26. package/dist/manage/update.d.ts.map +1 -0
  27. package/dist/manage/update.js +303 -0
  28. package/dist/manage/update.js.map +1 -0
  29. package/dist/protocol.d.ts +31 -0
  30. package/dist/protocol.d.ts.map +1 -0
  31. package/dist/protocol.js +11 -0
  32. package/dist/protocol.js.map +1 -0
  33. package/dist/server.d.ts +29 -0
  34. package/dist/server.d.ts.map +1 -0
  35. package/dist/server.js +339 -0
  36. package/dist/server.js.map +1 -0
  37. package/dist/setup/orchestrator.d.ts +23 -0
  38. package/dist/setup/orchestrator.d.ts.map +1 -0
  39. package/dist/setup/orchestrator.js +142 -0
  40. package/dist/setup/orchestrator.js.map +1 -0
  41. package/dist/setup/steps/channels.d.ts +3 -0
  42. package/dist/setup/steps/channels.d.ts.map +1 -0
  43. package/dist/setup/steps/channels.js +38 -0
  44. package/dist/setup/steps/channels.js.map +1 -0
  45. package/dist/setup/steps/configure.d.ts +3 -0
  46. package/dist/setup/steps/configure.d.ts.map +1 -0
  47. package/dist/setup/steps/configure.js +65 -0
  48. package/dist/setup/steps/configure.js.map +1 -0
  49. package/dist/setup/steps/health.d.ts +3 -0
  50. package/dist/setup/steps/health.d.ts.map +1 -0
  51. package/dist/setup/steps/health.js +95 -0
  52. package/dist/setup/steps/health.js.map +1 -0
  53. package/dist/setup/steps/openclaw.d.ts +3 -0
  54. package/dist/setup/steps/openclaw.d.ts.map +1 -0
  55. package/dist/setup/steps/openclaw.js +22 -0
  56. package/dist/setup/steps/openclaw.js.map +1 -0
  57. package/dist/setup/steps/service.d.ts +3 -0
  58. package/dist/setup/steps/service.d.ts.map +1 -0
  59. package/dist/setup/steps/service.js +37 -0
  60. package/dist/setup/steps/service.js.map +1 -0
  61. package/dist/setup/steps/system.d.ts +3 -0
  62. package/dist/setup/steps/system.d.ts.map +1 -0
  63. package/dist/setup/steps/system.js +60 -0
  64. package/dist/setup/steps/system.js.map +1 -0
  65. package/dist/setup/steps/tailscale.d.ts +3 -0
  66. package/dist/setup/steps/tailscale.d.ts.map +1 -0
  67. package/dist/setup/steps/tailscale.js +40 -0
  68. package/dist/setup/steps/tailscale.js.map +1 -0
  69. package/dist/setup/types.d.ts +36 -0
  70. package/dist/setup/types.d.ts.map +1 -0
  71. package/dist/setup/types.js +2 -0
  72. package/dist/setup/types.js.map +1 -0
  73. package/dist/utils/crypto.d.ts +11 -0
  74. package/dist/utils/crypto.d.ts.map +1 -0
  75. package/dist/utils/crypto.js +47 -0
  76. package/dist/utils/crypto.js.map +1 -0
  77. package/dist/utils/exec.d.ts +12 -0
  78. package/dist/utils/exec.d.ts.map +1 -0
  79. package/dist/utils/exec.js +99 -0
  80. package/dist/utils/exec.js.map +1 -0
  81. package/dist/utils/logger.d.ts +4 -0
  82. package/dist/utils/logger.d.ts.map +1 -0
  83. package/dist/utils/logger.js +30 -0
  84. package/dist/utils/logger.js.map +1 -0
  85. package/package.json +40 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { logger, enableFileLogging } from './utils/logger.js';
6
+ import { generateToken, generateTlsCert, hashToken } from './utils/crypto.js';
7
+ import { AgentServer } from './server.js';
8
+ import { safeExec } from './utils/exec.js';
9
+ const DEFAULT_CONFIG_DIR = '/etc/getaclaw';
10
+ const DEFAULT_PORT = 34567;
11
+ const program = new Command();
12
+ program
13
+ .name('getaclaw-agent')
14
+ .description('Get a Claw Agent — manages OpenClaw setup and ongoing maintenance')
15
+ .version('0.1.0');
16
+ // --- init ---
17
+ program
18
+ .command('init')
19
+ .description('Initialize the agent: generate TLS cert, save config')
20
+ .option('--token <token>', 'Pairing token (generated if not provided)')
21
+ .option('--port <port>', 'Agent port', String(DEFAULT_PORT))
22
+ .option('--config-dir <dir>', 'Configuration directory', DEFAULT_CONFIG_DIR)
23
+ .action(async (opts) => {
24
+ const configDir = opts.configDir;
25
+ const port = parseInt(opts.port, 10);
26
+ const pairingToken = opts.token || generateToken();
27
+ logger.info('Initializing getaclaw-agent', { configDir, port });
28
+ // Create config directory
29
+ fs.mkdirSync(configDir, { recursive: true });
30
+ fs.mkdirSync(path.join(configDir, 'tls'), { recursive: true });
31
+ // Generate TLS certificate
32
+ logger.info('Generating self-signed TLS certificate...');
33
+ const tls = generateTlsCert(pairingToken);
34
+ const certPath = path.join(configDir, 'tls', 'cert.pem');
35
+ const keyPath = path.join(configDir, 'tls', 'key.pem');
36
+ fs.writeFileSync(certPath, tls.cert, 'utf-8');
37
+ fs.writeFileSync(keyPath, tls.key, 'utf-8');
38
+ fs.chmodSync(certPath, 0o644);
39
+ fs.chmodSync(keyPath, 0o600);
40
+ // Save agent config
41
+ const config = {
42
+ port,
43
+ pairingTokenHash: hashToken(pairingToken),
44
+ certPath,
45
+ keyPath,
46
+ configDir,
47
+ fingerprint: tls.fingerprint,
48
+ createdAt: new Date().toISOString(),
49
+ };
50
+ const configPath = path.join(configDir, 'config.json');
51
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
52
+ fs.chmodSync(configPath, 0o600);
53
+ logger.info('Agent initialized successfully');
54
+ logger.info(`Port: ${port}`);
55
+ logger.info(`Config: ${configPath}`);
56
+ logger.info(`TLS fingerprint: ${tls.fingerprint}`);
57
+ if (!opts.token) {
58
+ logger.info(`Pairing token: ${pairingToken}`);
59
+ logger.info('Save this token — it will not be shown again.');
60
+ }
61
+ });
62
+ // --- serve ---
63
+ program
64
+ .command('serve')
65
+ .description('Start the agent HTTPS/WebSocket server')
66
+ .option('--config-dir <dir>', 'Configuration directory', DEFAULT_CONFIG_DIR)
67
+ .action(async (opts) => {
68
+ const configDir = opts.configDir;
69
+ const configPath = path.join(configDir, 'config.json');
70
+ if (!fs.existsSync(configPath)) {
71
+ logger.error(`Config not found at ${configPath}. Run "getaclaw-agent init" first.`);
72
+ process.exit(1);
73
+ }
74
+ enableFileLogging();
75
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
76
+ const server = new AgentServer({
77
+ port: config.port,
78
+ certPath: config.certPath,
79
+ keyPath: config.keyPath,
80
+ pairingTokenHash: config.pairingTokenHash,
81
+ configDir,
82
+ });
83
+ // Graceful shutdown
84
+ const shutdown = async () => {
85
+ logger.info('Shutting down agent server...');
86
+ await server.stop();
87
+ process.exit(0);
88
+ };
89
+ process.on('SIGTERM', shutdown);
90
+ process.on('SIGINT', shutdown);
91
+ await server.start();
92
+ logger.info(`Agent server running on port ${config.port}`);
93
+ // Auto-detect init-config and start setup if present
94
+ const initConfigPath = path.join(configDir, 'init-config.json');
95
+ if (fs.existsSync(initConfigPath)) {
96
+ try {
97
+ const initConfig = JSON.parse(fs.readFileSync(initConfigPath, 'utf-8'));
98
+ const setupConfig = initConfig.setup;
99
+ if (setupConfig) {
100
+ logger.info('Found init-config.json, auto-starting setup');
101
+ server.autoStartSetup(setupConfig).then((result) => {
102
+ // Only rename to .done if setup succeeded
103
+ const donePath = path.join(configDir, 'init-config.done.json');
104
+ if (result.success) {
105
+ fs.renameSync(initConfigPath, donePath);
106
+ logger.info('Setup succeeded, renamed init-config.json to init-config.done.json');
107
+ }
108
+ else {
109
+ logger.warn('Setup finished with errors, keeping init-config.json for retry');
110
+ }
111
+ }).catch((err) => {
112
+ logger.error('Auto-setup error', {
113
+ error: err instanceof Error ? err.message : String(err),
114
+ });
115
+ });
116
+ }
117
+ }
118
+ catch (err) {
119
+ logger.error('Failed to read init-config.json', {
120
+ error: err instanceof Error ? err.message : String(err),
121
+ });
122
+ }
123
+ }
124
+ });
125
+ // --- service ---
126
+ const serviceCmd = program
127
+ .command('service')
128
+ .description('Manage the getaclaw-agent systemd service');
129
+ serviceCmd
130
+ .command('install')
131
+ .description('Install the systemd service')
132
+ .action(async () => {
133
+ const serviceContent = `[Unit]
134
+ Description=Get a Claw Agent
135
+ After=network-online.target
136
+ Wants=network-online.target
137
+
138
+ [Service]
139
+ Type=simple
140
+ User=getaclaw-agent
141
+ ExecStart=/usr/bin/getaclaw-agent serve
142
+ Restart=always
143
+ RestartSec=5
144
+ Environment=NODE_ENV=production
145
+ Environment=GETACLAW_CONFIG=${DEFAULT_CONFIG_DIR}/config.json
146
+
147
+ [Install]
148
+ WantedBy=multi-user.target
149
+ `;
150
+ const servicePath = '/etc/systemd/system/getaclaw-agent.service';
151
+ logger.info('Installing systemd service...');
152
+ fs.writeFileSync(servicePath, serviceContent, 'utf-8');
153
+ await safeExec('systemctl', ['daemon-reload']);
154
+ await safeExec('systemctl', ['enable', 'getaclaw-agent']);
155
+ logger.info('Service installed and enabled');
156
+ logger.info('Start with: systemctl start getaclaw-agent');
157
+ });
158
+ serviceCmd
159
+ .command('uninstall')
160
+ .description('Remove the systemd service')
161
+ .action(async () => {
162
+ logger.info('Stopping and disabling service...');
163
+ try {
164
+ await safeExec('systemctl', ['stop', 'getaclaw-agent']);
165
+ }
166
+ catch {
167
+ // May not be running
168
+ }
169
+ try {
170
+ await safeExec('systemctl', ['disable', 'getaclaw-agent']);
171
+ }
172
+ catch {
173
+ // May not be enabled
174
+ }
175
+ const servicePath = '/etc/systemd/system/getaclaw-agent.service';
176
+ if (fs.existsSync(servicePath)) {
177
+ fs.unlinkSync(servicePath);
178
+ }
179
+ await safeExec('systemctl', ['daemon-reload']);
180
+ logger.info('Service uninstalled');
181
+ });
182
+ serviceCmd
183
+ .command('status')
184
+ .description('Check the service status')
185
+ .action(async () => {
186
+ try {
187
+ const result = await safeExec('systemctl', ['status', 'getaclaw-agent']);
188
+ console.log(result.stdout);
189
+ }
190
+ catch (err) {
191
+ const execErr = err;
192
+ if (execErr.result?.stdout) {
193
+ console.log(execErr.result.stdout);
194
+ }
195
+ else {
196
+ logger.error('Failed to get service status', {
197
+ error: err instanceof Error ? err.message : String(err),
198
+ });
199
+ }
200
+ }
201
+ });
202
+ program.parse();
203
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { AgentServer } from './server.js';
2
+ export type { AgentServerConfig } from './server.js';
3
+ export { SetupOrchestrator } from './setup/orchestrator.js';
4
+ export type { ClientMessage, AgentMessage, AgentEventPayload, SetupEvent, Action, } from './protocol.js';
5
+ export { isValidClientMessage } from './protocol.js';
6
+ export type { SetupConfig, ChannelConfig, StepName, StepState, StepStatus, } from './setup/types.js';
7
+ export { generateToken, generateTlsCert, computeCertFingerprint } from './utils/crypto.js';
8
+ export { logger } from './utils/logger.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EACV,WAAW,EACX,aAAa,EACb,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { AgentServer } from './server.js';
2
+ export { SetupOrchestrator } from './setup/orchestrator.js';
3
+ export { isValidClientMessage } from './protocol.js';
4
+ export { generateToken, generateTlsCert, computeCertFingerprint } from './utils/crypto.js';
5
+ export { logger } from './utils/logger.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAQ5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAQrD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,15 @@
1
+ interface ChannelEntry {
2
+ type: string;
3
+ name: string;
4
+ enabled: boolean;
5
+ config: Record<string, unknown>;
6
+ }
7
+ export declare function listChannels(): Promise<ChannelEntry[]>;
8
+ export declare function addChannel(channel: {
9
+ type: string;
10
+ name: string;
11
+ config: Record<string, unknown>;
12
+ }): Promise<void>;
13
+ export declare function removeChannel(name: string): Promise<void>;
14
+ export {};
15
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/manage/channels.ts"],"names":[],"mappings":"AAGA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAG5D;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY/D"}
@@ -0,0 +1,34 @@
1
+ import { getConfig, setConfig } from './config.js';
2
+ import { logger } from '../utils/logger.js';
3
+ export async function listChannels() {
4
+ const config = await getConfig();
5
+ return config.channels ?? [];
6
+ }
7
+ export async function addChannel(channel) {
8
+ const config = await getConfig();
9
+ const channels = config.channels ?? [];
10
+ // Check for duplicate name
11
+ if (channels.some((ch) => ch.name === channel.name)) {
12
+ throw new Error(`Channel with name "${channel.name}" already exists`);
13
+ }
14
+ channels.push({
15
+ type: channel.type,
16
+ name: channel.name,
17
+ enabled: true,
18
+ config: channel.config,
19
+ });
20
+ await setConfig({ channels });
21
+ logger.info(`Channel added: ${channel.name} (${channel.type})`);
22
+ }
23
+ export async function removeChannel(name) {
24
+ const config = await getConfig();
25
+ const channels = config.channels ?? [];
26
+ const idx = channels.findIndex((ch) => ch.name === name);
27
+ if (idx === -1) {
28
+ throw new Error(`Channel "${name}" not found`);
29
+ }
30
+ channels.splice(idx, 1);
31
+ await setConfig({ channels });
32
+ logger.info(`Channel removed: ${name}`);
33
+ }
34
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/manage/channels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,OAAQ,MAAM,CAAC,QAA2B,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAIhC;IACC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAI,MAAM,CAAC,QAA2B,IAAI,EAAE,CAAC;IAE3D,2BAA2B;IAC3B,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,IAAI,kBAAkB,CAAC,CAAC;IACxE,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC;QACZ,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAI,MAAM,CAAC,QAA2B,IAAI,EAAE,CAAC;IAE3D,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACzD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,aAAa,CAAC,CAAC;IACjD,CAAC;IAED,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxB,MAAM,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function getConfig(): Promise<Record<string, unknown>>;
2
+ export declare function setConfig(updates: Record<string, unknown>): Promise<void>;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/manage/config.ts"],"names":[],"mappings":"AAOA,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAGlE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/E"}
@@ -0,0 +1,36 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { logger } from '../utils/logger.js';
5
+ const OPENCLAW_CONFIG_PATH = path.join(os.homedir(), '.openclaw', 'openclaw.json');
6
+ export async function getConfig() {
7
+ const raw = await fs.readFile(OPENCLAW_CONFIG_PATH, 'utf-8');
8
+ return JSON.parse(raw);
9
+ }
10
+ export async function setConfig(updates) {
11
+ const current = await getConfig();
12
+ // Deep merge updates into current config
13
+ const merged = deepMerge(current, updates);
14
+ await fs.writeFile(OPENCLAW_CONFIG_PATH, JSON.stringify(merged, null, 2), 'utf-8');
15
+ logger.info('OpenClaw config updated', { keys: Object.keys(updates) });
16
+ }
17
+ function deepMerge(target, source) {
18
+ const result = { ...target };
19
+ for (const key of Object.keys(source)) {
20
+ const sourceVal = source[key];
21
+ const targetVal = target[key];
22
+ if (sourceVal !== null &&
23
+ typeof sourceVal === 'object' &&
24
+ !Array.isArray(sourceVal) &&
25
+ targetVal !== null &&
26
+ typeof targetVal === 'object' &&
27
+ !Array.isArray(targetVal)) {
28
+ result[key] = deepMerge(targetVal, sourceVal);
29
+ }
30
+ else {
31
+ result[key] = sourceVal;
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/manage/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AAEnF,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgC;IAC9D,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC;IAElC,yCAAyC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE3C,MAAM,EAAE,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACnF,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,SAAS,CAChB,MAA+B,EAC/B,MAA+B;IAE/B,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,IACE,SAAS,KAAK,IAAI;YAClB,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YACzB,SAAS,KAAK,IAAI;YAClB,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EACzB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,SAAoC,EACpC,SAAoC,CACrC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AgentMessage, ClientMessage } from '../protocol.js';
2
+ export declare function handleDevicesList(msg: ClientMessage, sendEvent: (event: AgentMessage) => void): Promise<void>;
3
+ export declare function handleDevicesApprove(msg: ClientMessage, sendEvent: (event: AgentMessage) => void): Promise<void>;
4
+ export declare function handleDevicesReject(msg: ClientMessage, sendEvent: (event: AgentMessage) => void): Promise<void>;
5
+ //# sourceMappingURL=devices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/manage/devices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIlE,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
@@ -0,0 +1,90 @@
1
+ import { safeExec } from '../utils/exec.js';
2
+ import { logger } from '../utils/logger.js';
3
+ export async function handleDevicesList(msg, sendEvent) {
4
+ try {
5
+ const result = await safeExec('openclaw', ['devices', 'list', '--json']);
6
+ const devices = JSON.parse(result.stdout);
7
+ sendEvent({
8
+ id: msg.id,
9
+ type: 'response',
10
+ action: msg.action,
11
+ status: 'ok',
12
+ data: { devices },
13
+ });
14
+ }
15
+ catch (err) {
16
+ const errorMessage = err instanceof Error ? err.message : String(err);
17
+ logger.error('Failed to list devices', { error: errorMessage });
18
+ sendEvent({
19
+ id: msg.id,
20
+ type: 'error',
21
+ status: 'error',
22
+ data: { message: `Failed to list devices: ${errorMessage}` },
23
+ });
24
+ }
25
+ }
26
+ export async function handleDevicesApprove(msg, sendEvent) {
27
+ try {
28
+ const deviceId = msg.params?.deviceId;
29
+ if (!deviceId) {
30
+ sendEvent({
31
+ id: msg.id,
32
+ type: 'error',
33
+ status: 'error',
34
+ data: { message: 'Missing deviceId in params' },
35
+ });
36
+ return;
37
+ }
38
+ await safeExec('openclaw', ['devices', 'approve', deviceId]);
39
+ sendEvent({
40
+ id: msg.id,
41
+ type: 'response',
42
+ action: msg.action,
43
+ status: 'ok',
44
+ data: { message: `Device ${deviceId} approved` },
45
+ });
46
+ }
47
+ catch (err) {
48
+ const errorMessage = err instanceof Error ? err.message : String(err);
49
+ logger.error('Failed to approve device', { error: errorMessage });
50
+ sendEvent({
51
+ id: msg.id,
52
+ type: 'error',
53
+ status: 'error',
54
+ data: { message: `Failed to approve device: ${errorMessage}` },
55
+ });
56
+ }
57
+ }
58
+ export async function handleDevicesReject(msg, sendEvent) {
59
+ try {
60
+ const deviceId = msg.params?.deviceId;
61
+ if (!deviceId) {
62
+ sendEvent({
63
+ id: msg.id,
64
+ type: 'error',
65
+ status: 'error',
66
+ data: { message: 'Missing deviceId in params' },
67
+ });
68
+ return;
69
+ }
70
+ await safeExec('openclaw', ['devices', 'reject', deviceId]);
71
+ sendEvent({
72
+ id: msg.id,
73
+ type: 'response',
74
+ action: msg.action,
75
+ status: 'ok',
76
+ data: { message: `Device ${deviceId} rejected` },
77
+ });
78
+ }
79
+ catch (err) {
80
+ const errorMessage = err instanceof Error ? err.message : String(err);
81
+ logger.error('Failed to reject device', { error: errorMessage });
82
+ sendEvent({
83
+ id: msg.id,
84
+ type: 'error',
85
+ status: 'error',
86
+ data: { message: `Failed to reject device: ${errorMessage}` },
87
+ });
88
+ }
89
+ }
90
+ //# sourceMappingURL=devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/manage/devices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentMessage, ClientMessage } from '../protocol.js';
2
+ export declare function handleHealthAction(msg: ClientMessage, sendEvent: (event: AgentMessage) => void): Promise<void>;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/manage/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIlE,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GACvC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,115 @@
1
+ import { safeExec } from '../utils/exec.js';
2
+ import { logger } from '../utils/logger.js';
3
+ export async function handleHealthAction(msg, sendEvent) {
4
+ switch (msg.action) {
5
+ case 'health.check':
6
+ await handleHealthCheck(msg, sendEvent);
7
+ break;
8
+ case 'health.logs':
9
+ await handleHealthLogs(msg, sendEvent);
10
+ break;
11
+ default:
12
+ sendEvent({
13
+ id: msg.id,
14
+ type: 'error',
15
+ status: 'error',
16
+ data: { message: `Unknown health action: ${msg.action}` },
17
+ });
18
+ }
19
+ }
20
+ async function handleHealthCheck(msg, sendEvent) {
21
+ try {
22
+ // Check gateway service status
23
+ const serviceResult = await safeExec('systemctl', ['is-active', 'openclaw-gateway']);
24
+ const serviceStatus = serviceResult.stdout.trim();
25
+ // Get uptime
26
+ const uptimeResult = await safeExec('uptime', ['-s']);
27
+ const uptimeSince = uptimeResult.stdout.trim();
28
+ // Get openclaw version
29
+ let version = 'unknown';
30
+ try {
31
+ const versionResult = await safeExec('openclaw', ['--version']);
32
+ version = versionResult.stdout.trim();
33
+ }
34
+ catch {
35
+ // openclaw may not be installed yet
36
+ }
37
+ // Check gateway HTTP endpoint
38
+ let gatewayReachable = false;
39
+ try {
40
+ const curlResult = await safeExec('curl', [
41
+ '-s',
42
+ '-o', '/dev/null',
43
+ '-w', '%{http_code}',
44
+ '--max-time', '3',
45
+ 'http://127.0.0.1:18789',
46
+ ]);
47
+ const httpCode = parseInt(curlResult.stdout.trim(), 10);
48
+ gatewayReachable = httpCode >= 200 && httpCode < 500;
49
+ }
50
+ catch {
51
+ // not reachable
52
+ }
53
+ // System resource info
54
+ const freeResult = await safeExec('free', ['-m']);
55
+ const memLines = freeResult.stdout.split('\n');
56
+ let memTotal = 0;
57
+ let memUsed = 0;
58
+ if (memLines.length > 1) {
59
+ const parts = memLines[1].split(/\s+/);
60
+ memTotal = parseInt(parts[1], 10) || 0;
61
+ memUsed = parseInt(parts[2], 10) || 0;
62
+ }
63
+ sendEvent({
64
+ id: msg.id,
65
+ type: 'response',
66
+ action: msg.action,
67
+ status: 'ok',
68
+ data: {
69
+ gateway: {
70
+ service: serviceStatus,
71
+ reachable: gatewayReachable,
72
+ version,
73
+ },
74
+ system: {
75
+ uptimeSince,
76
+ memoryMB: { total: memTotal, used: memUsed },
77
+ agentUptime: Math.round(process.uptime()),
78
+ },
79
+ },
80
+ });
81
+ }
82
+ catch (err) {
83
+ const errorMessage = err instanceof Error ? err.message : String(err);
84
+ logger.error('Health check failed', { error: errorMessage });
85
+ sendEvent({
86
+ id: msg.id,
87
+ type: 'error',
88
+ status: 'error',
89
+ data: { message: `Health check failed: ${errorMessage}` },
90
+ });
91
+ }
92
+ }
93
+ async function handleHealthLogs(msg, sendEvent) {
94
+ try {
95
+ const lines = msg.params?.lines ?? 100;
96
+ const result = await safeExec('systemctl', ['status', 'openclaw-gateway']);
97
+ sendEvent({
98
+ id: msg.id,
99
+ type: 'response',
100
+ action: msg.action,
101
+ status: 'ok',
102
+ data: { logs: result.stdout },
103
+ });
104
+ }
105
+ catch (err) {
106
+ const errorMessage = err instanceof Error ? err.message : String(err);
107
+ sendEvent({
108
+ id: msg.id,
109
+ type: 'error',
110
+ status: 'error',
111
+ data: { message: `Failed to get logs: ${errorMessage}` },
112
+ });
113
+ }
114
+ }
115
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/manage/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentMessage, ClientMessage } from '../protocol.js';
2
+ export declare function handleManageAction(msg: ClientMessage, sendEvent: (event: AgentMessage) => void, configDir: string): Promise<void>;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/manage/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQlE,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,EACxC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA0Df"}