openclaw-channel-dmwork 0.5.18-dev.a83ea4f8 → 0.5.19-dev.47fa1d22

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 (42) hide show
  1. package/README.md +69 -21
  2. package/bin/dmwork.js +2 -0
  3. package/dist/cli/doctor.d.ts +33 -0
  4. package/dist/cli/doctor.js +346 -0
  5. package/dist/cli/doctor.js.map +1 -0
  6. package/dist/cli/index.d.ts +4 -0
  7. package/dist/cli/index.js +114 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/install.d.ts +15 -0
  10. package/dist/cli/install.js +151 -0
  11. package/dist/cli/install.js.map +1 -0
  12. package/dist/cli/openclaw-cli.d.ts +58 -0
  13. package/dist/cli/openclaw-cli.js +276 -0
  14. package/dist/cli/openclaw-cli.js.map +1 -0
  15. package/dist/cli/remove-account.d.ts +8 -0
  16. package/dist/cli/remove-account.js +52 -0
  17. package/dist/cli/remove-account.js.map +1 -0
  18. package/dist/cli/uninstall.d.ts +8 -0
  19. package/dist/cli/uninstall.js +33 -0
  20. package/dist/cli/uninstall.js.map +1 -0
  21. package/dist/cli/update.d.ts +11 -0
  22. package/dist/cli/update.js +79 -0
  23. package/dist/cli/update.js.map +1 -0
  24. package/dist/cli/utils.d.ts +21 -0
  25. package/dist/cli/utils.js +98 -0
  26. package/dist/cli/utils.js.map +1 -0
  27. package/dist/index.js +166 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/package.json +8 -2
  30. package/dist/src/agent-tools.js +84 -11
  31. package/dist/src/agent-tools.js.map +1 -1
  32. package/dist/src/api-fetch.d.ts +41 -0
  33. package/dist/src/api-fetch.js +47 -0
  34. package/dist/src/api-fetch.js.map +1 -1
  35. package/dist/src/group-md.d.ts +65 -0
  36. package/dist/src/group-md.js +219 -6
  37. package/dist/src/group-md.js.map +1 -1
  38. package/dist/src/inbound.js +74 -15
  39. package/dist/src/inbound.js.map +1 -1
  40. package/dist/src/types.d.ts +2 -0
  41. package/dist/src/types.js.map +1 -1
  42. package/package.json +8 -2
@@ -0,0 +1,151 @@
1
+ /**
2
+ * install command: install plugin via official CLI + interactive config setup.
3
+ *
4
+ * Only manages channels.dmwork account config. Agent creation (binding,
5
+ * workspace, agent.md) is left to the user via `openclaw agents add`.
6
+ */
7
+ import { configGet, configGetJson, configSet, configUnset, gatewayRestart, pluginsInspect, pluginsInstall, } from "./openclaw-cli.js";
8
+ import { PLUGIN_ID, RECOMMENDED_DM_SCOPE, confirm, ensureOpenClawCompat, isInteractive, prompt, validateAccountId, } from "./utils.js";
9
+ export async function runInstall(opts) {
10
+ // 1. Pre-check
11
+ ensureOpenClawCompat();
12
+ // 2. Plugin install (delegate to official CLI)
13
+ const inspect = pluginsInspect(PLUGIN_ID);
14
+ if (inspect?.plugin && !opts.force) {
15
+ console.log(`DMWork plugin is already installed (v${inspect.plugin.version}). Skipping install.`);
16
+ }
17
+ else {
18
+ const spec = opts.dev ? `${PLUGIN_ID}@dev` : PLUGIN_ID;
19
+ console.log(`Installing DMWork plugin${opts.dev ? " (dev)" : ""}...`);
20
+ pluginsInstall(spec, false, opts.force);
21
+ console.log("Plugin installed successfully.");
22
+ }
23
+ // 3. Legacy config migration
24
+ await migrateLegacyConfig();
25
+ // 4. DMWork config (unless --skip-config)
26
+ if (!opts.skipConfig) {
27
+ await configureDmworkAccount(opts);
28
+ }
29
+ // 5. Gateway restart
30
+ console.log("Restarting gateway...");
31
+ if (!gatewayRestart()) {
32
+ console.log("Warning: Gateway restart failed. Run 'openclaw gateway restart' manually.");
33
+ }
34
+ // 6. Success
35
+ console.log("\nDMWork plugin setup complete!");
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Legacy config migration
39
+ // ---------------------------------------------------------------------------
40
+ async function migrateLegacyConfig() {
41
+ const legacyToken = configGet("channels.dmwork.botToken");
42
+ const accounts = configGetJson("channels.dmwork.accounts");
43
+ // Has top-level botToken but no accounts map → legacy flat config
44
+ if (legacyToken && (!accounts || Object.keys(accounts).length === 0)) {
45
+ console.log("Detected legacy flat config. Migrating to accounts model...");
46
+ // Copy token to accounts.default
47
+ configSet("channels.dmwork.accounts.default.botToken", legacyToken);
48
+ // Copy apiUrl if present
49
+ const legacyApiUrl = configGet("channels.dmwork.apiUrl");
50
+ if (legacyApiUrl) {
51
+ configSet("channels.dmwork.accounts.default.apiUrl", legacyApiUrl);
52
+ }
53
+ // Remove top-level botToken (keep apiUrl as shared default)
54
+ configUnset("channels.dmwork.botToken");
55
+ console.log("Migrated legacy config to accounts.default.");
56
+ }
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Account configuration
60
+ // ---------------------------------------------------------------------------
61
+ async function configureDmworkAccount(opts) {
62
+ // Collect accountId
63
+ let accountId = opts.accountId;
64
+ if (!accountId) {
65
+ accountId = await prompt("Enter bot account ID (e.g. my_bot):");
66
+ if (!accountId) {
67
+ console.log("No account ID provided. Skipping config.");
68
+ return;
69
+ }
70
+ }
71
+ if (!validateAccountId(accountId)) {
72
+ console.error(`Error: Invalid account ID "${accountId}". Only letters, digits, and underscores are allowed.`);
73
+ process.exit(1);
74
+ }
75
+ // Check if account already exists
76
+ const existingToken = configGet(`channels.dmwork.accounts.${accountId}.botToken`);
77
+ if (existingToken) {
78
+ if (!isInteractive()) {
79
+ if (opts.botToken && opts.apiUrl) {
80
+ console.log(`Overwriting existing account "${accountId}".`);
81
+ }
82
+ else if (opts.botToken || opts.apiUrl) {
83
+ console.error(`Error: Account "${accountId}" already exists. Provide both --bot-token and --api-url to overwrite.`);
84
+ process.exit(1);
85
+ }
86
+ else {
87
+ console.log(`Account "${accountId}" already configured. Keeping existing config.`);
88
+ ensureDmScope();
89
+ printAgentHint(accountId);
90
+ return;
91
+ }
92
+ }
93
+ else {
94
+ const keep = await confirm(`Bot account "${accountId}" is already configured. Keep current config?`, true);
95
+ if (keep) {
96
+ console.log("Keeping existing config.");
97
+ ensureDmScope();
98
+ printAgentHint(accountId);
99
+ return;
100
+ }
101
+ }
102
+ }
103
+ // Collect botToken
104
+ let botToken = opts.botToken;
105
+ if (!botToken) {
106
+ botToken = await prompt("Enter bot token (bf_...):");
107
+ }
108
+ if (!botToken?.startsWith("bf_")) {
109
+ console.error("Error: Bot token must start with 'bf_'.");
110
+ process.exit(1);
111
+ }
112
+ // Collect apiUrl
113
+ let apiUrl = opts.apiUrl;
114
+ if (!apiUrl) {
115
+ apiUrl = await prompt("Enter API server URL:");
116
+ }
117
+ if (!apiUrl) {
118
+ console.error("Error: API URL is required.");
119
+ process.exit(1);
120
+ }
121
+ // Write account config
122
+ configSet(`channels.dmwork.accounts.${accountId}.botToken`, botToken);
123
+ configSet(`channels.dmwork.accounts.${accountId}.apiUrl`, apiUrl);
124
+ console.log(`Configured bot account: ${accountId}`);
125
+ console.log(` API: ${apiUrl}`);
126
+ ensureDmScope();
127
+ printAgentHint(accountId);
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // session.dmScope
131
+ // ---------------------------------------------------------------------------
132
+ function ensureDmScope() {
133
+ const current = configGet("session.dmScope");
134
+ if (!current) {
135
+ configSet("session.dmScope", RECOMMENDED_DM_SCOPE);
136
+ }
137
+ else if (current !== RECOMMENDED_DM_SCOPE) {
138
+ console.log(`Warning: session.dmScope is "${current}" (recommended: ${RECOMMENDED_DM_SCOPE})`);
139
+ }
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Agent hint
143
+ // ---------------------------------------------------------------------------
144
+ function printAgentHint(accountId) {
145
+ const agentName = accountId.replace(/_bot$/, "");
146
+ console.log(`
147
+ To create an independent agent for this bot (optional):
148
+ openclaw agents add ${agentName}
149
+ openclaw agents bind ${agentName} dmwork ${accountId}`);
150
+ }
151
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../cli/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * openclaw CLI wrapper.
3
+ * All openclaw invocations go through this module using execFileSync with
4
+ * argument arrays to avoid shell-quoting issues.
5
+ */
6
+ export declare function getConfigFilePath(): string;
7
+ export declare function configGet(path: string): string | null;
8
+ export declare function configGetJson(path: string): any;
9
+ export declare function configSet(path: string, value: string): void;
10
+ export declare function configSetBatch(operations: Array<{
11
+ path: string;
12
+ value: unknown;
13
+ }>): void;
14
+ export declare function configSetJson(path: string, value: unknown): void;
15
+ export declare function configUnset(path: string): void;
16
+ export declare function pluginsInstall(spec: string, quiet?: boolean, force?: boolean): void;
17
+ export declare function pluginsUpdate(id: string, quiet?: boolean): void;
18
+ export declare function pluginsUninstall(id: string, yes?: boolean): void;
19
+ export interface PluginInspectResult {
20
+ plugin?: {
21
+ id: string;
22
+ version: string;
23
+ enabled: boolean;
24
+ };
25
+ install?: {
26
+ source: string;
27
+ version: string;
28
+ installPath: string;
29
+ };
30
+ }
31
+ export declare function pluginsInspect(id: string): PluginInspectResult | null;
32
+ export declare function gatewayStatus(): {
33
+ running: boolean;
34
+ };
35
+ export declare function gatewayRestart(quiet?: boolean): boolean;
36
+ export declare function getOpenClawVersion(): string | null;
37
+ /**
38
+ * Save the channels.dmwork section from openclaw.json by reading the file
39
+ * directly (preserving secrets that `openclaw config get` would redact).
40
+ */
41
+ export declare function saveChannelConfigFromFile(): Record<string, unknown> | null;
42
+ /**
43
+ * Restore the channels.dmwork section into openclaw.json by writing the file
44
+ * directly (bypassing validation that would reject unknown channel ids).
45
+ * Creates a .bak backup before writing.
46
+ */
47
+ export declare function restoreChannelConfigToFile(dmworkConfig: Record<string, unknown>): void;
48
+ export declare function removeChannelConfigFromFile(): void;
49
+ /**
50
+ * Read the full config object directly from file (for doctor phase-1 checks).
51
+ */
52
+ export declare function readConfigFromFile(): Record<string, any> | null;
53
+ /**
54
+ * Remove orphaned dmwork bindings from the config file.
55
+ * If validAccountIds is provided, only removes bindings referencing accounts
56
+ * not in that list. Otherwise removes all dmwork bindings.
57
+ */
58
+ export declare function removeOrphanedBindingsFromFile(channel: string, validAccountIds?: string[]): void;
@@ -0,0 +1,276 @@
1
+ /**
2
+ * openclaw CLI wrapper.
3
+ * All openclaw invocations go through this module using execFileSync with
4
+ * argument arrays to avoid shell-quoting issues.
5
+ */
6
+ import { execFileSync } from "node:child_process";
7
+ import { readFileSync, writeFileSync, copyFileSync } from "node:fs";
8
+ import { homedir } from "node:os";
9
+ import { resolve } from "node:path";
10
+ const OPENCLAW = "openclaw";
11
+ /** Expand ~ to home directory */
12
+ function expandHome(p) {
13
+ if (p.startsWith("~/"))
14
+ return resolve(homedir(), p.slice(2));
15
+ return p;
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // Config helpers
19
+ // ---------------------------------------------------------------------------
20
+ export function getConfigFilePath() {
21
+ return execFileSync(OPENCLAW, ["config", "file"], { encoding: "utf-8" }).trim();
22
+ }
23
+ export function configGet(path) {
24
+ try {
25
+ const val = execFileSync(OPENCLAW, ["config", "get", path], {
26
+ encoding: "utf-8",
27
+ stdio: ["pipe", "pipe", "pipe"],
28
+ }).trim();
29
+ return val === "" ? null : val;
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ export function configGetJson(path) {
36
+ try {
37
+ const out = execFileSync(OPENCLAW, ["config", "get", path, "--json"], {
38
+ encoding: "utf-8",
39
+ stdio: ["pipe", "pipe", "pipe"],
40
+ });
41
+ const jsonStart = out.indexOf("{");
42
+ const arrStart = out.indexOf("[");
43
+ const start = jsonStart >= 0 && arrStart >= 0
44
+ ? Math.min(jsonStart, arrStart)
45
+ : Math.max(jsonStart, arrStart);
46
+ if (start < 0)
47
+ return null;
48
+ return JSON.parse(out.slice(start));
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ export function configSet(path, value) {
55
+ execFileSync(OPENCLAW, ["config", "set", path, value], {
56
+ stdio: ["pipe", "pipe", "pipe"],
57
+ });
58
+ }
59
+ export function configSetBatch(operations) {
60
+ const batchJson = JSON.stringify(operations.map((op) => ({ path: op.path, value: op.value })));
61
+ execFileSync(OPENCLAW, ["config", "set", "--batch-json", batchJson], {
62
+ stdio: ["pipe", "pipe", "pipe"],
63
+ });
64
+ }
65
+ export function configSetJson(path, value) {
66
+ execFileSync(OPENCLAW, ["config", "set", path, JSON.stringify(value), "--strict-json"], {
67
+ stdio: ["pipe", "pipe", "pipe"],
68
+ });
69
+ }
70
+ export function configUnset(path) {
71
+ execFileSync(OPENCLAW, ["config", "unset", path], {
72
+ stdio: ["pipe", "pipe", "pipe"],
73
+ });
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Plugin helpers
77
+ // ---------------------------------------------------------------------------
78
+ export function pluginsInstall(spec, quiet, force) {
79
+ const args = ["plugins", "install", spec, "--dangerously-force-unsafe-install"];
80
+ if (force)
81
+ args.push("--force");
82
+ execFileSync(OPENCLAW, args, {
83
+ stdio: quiet ? ["pipe", "pipe", "pipe"] : "inherit",
84
+ });
85
+ }
86
+ export function pluginsUpdate(id, quiet) {
87
+ execFileSync(OPENCLAW, ["plugins", "update", id], {
88
+ stdio: quiet ? ["pipe", "pipe", "pipe"] : "inherit",
89
+ });
90
+ }
91
+ export function pluginsUninstall(id, yes) {
92
+ const args = ["plugins", "uninstall", id];
93
+ if (yes)
94
+ args.push("--force");
95
+ execFileSync(OPENCLAW, args, { stdio: "inherit" });
96
+ }
97
+ export function pluginsInspect(id) {
98
+ try {
99
+ const out = execFileSync(OPENCLAW, ["plugins", "inspect", id, "--json"], {
100
+ encoding: "utf-8",
101
+ stdio: ["pipe", "pipe", "pipe"],
102
+ });
103
+ // stdout may contain plugin log noise before JSON — find the JSON object
104
+ const jsonStart = out.indexOf("{");
105
+ if (jsonStart < 0)
106
+ return null;
107
+ return JSON.parse(out.slice(jsonStart));
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Gateway helpers
115
+ // ---------------------------------------------------------------------------
116
+ export function gatewayStatus() {
117
+ try {
118
+ const out = execFileSync(OPENCLAW, ["gateway", "status", "--json"], {
119
+ encoding: "utf-8",
120
+ stdio: ["pipe", "pipe", "pipe"],
121
+ });
122
+ const jsonStart = out.indexOf("{");
123
+ if (jsonStart < 0)
124
+ return { running: false };
125
+ const data = JSON.parse(out.slice(jsonStart));
126
+ // Real structure: { service.runtime.status: "running", health.healthy: true }
127
+ const runtimeRunning = data.service?.runtime?.status === "running";
128
+ const healthy = data.health?.healthy === true;
129
+ return { running: runtimeRunning || healthy };
130
+ }
131
+ catch {
132
+ return { running: false };
133
+ }
134
+ }
135
+ export function gatewayRestart(quiet) {
136
+ try {
137
+ execFileSync(OPENCLAW, ["gateway", "restart"], {
138
+ stdio: quiet ? ["pipe", "pipe", "pipe"] : "inherit",
139
+ });
140
+ return true;
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Version
148
+ // ---------------------------------------------------------------------------
149
+ export function getOpenClawVersion() {
150
+ try {
151
+ const out = execFileSync(OPENCLAW, ["--version"], {
152
+ encoding: "utf-8",
153
+ stdio: ["pipe", "pipe", "pipe"],
154
+ });
155
+ const match = out.match(/(\d{4}\.\d+\.\d+)/);
156
+ return match?.[1] ?? null;
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ // ---------------------------------------------------------------------------
163
+ // Direct JSON file access (for config backup/restore around uninstall)
164
+ //
165
+ // openclaw plugins uninstall deletes channels.dmwork from the config file.
166
+ // We cannot use `openclaw config get` to back up because it redacts secrets,
167
+ // and we cannot use `openclaw config set` to restore because after uninstall
168
+ // the channel id is unknown and validation rejects it.
169
+ // So we read/write the JSON file directly for this specific operation.
170
+ // ---------------------------------------------------------------------------
171
+ /**
172
+ * Save the channels.dmwork section from openclaw.json by reading the file
173
+ * directly (preserving secrets that `openclaw config get` would redact).
174
+ */
175
+ export function saveChannelConfigFromFile() {
176
+ try {
177
+ const configPath = expandHome(getConfigFilePath());
178
+ const raw = readFileSync(configPath, "utf-8");
179
+ const cfg = JSON.parse(raw);
180
+ return cfg?.channels?.dmwork ?? null;
181
+ }
182
+ catch {
183
+ return null;
184
+ }
185
+ }
186
+ /**
187
+ * Restore the channels.dmwork section into openclaw.json by writing the file
188
+ * directly (bypassing validation that would reject unknown channel ids).
189
+ * Creates a .bak backup before writing.
190
+ */
191
+ export function restoreChannelConfigToFile(dmworkConfig) {
192
+ const configPath = expandHome(getConfigFilePath());
193
+ // Backup
194
+ copyFileSync(configPath, configPath + ".bak");
195
+ // Read, merge, write
196
+ const raw = readFileSync(configPath, "utf-8");
197
+ const cfg = JSON.parse(raw);
198
+ if (!cfg.channels)
199
+ cfg.channels = {};
200
+ cfg.channels.dmwork = dmworkConfig;
201
+ writeFileSync(configPath, JSON.stringify(cfg, null, 2), "utf-8");
202
+ }
203
+ /**
204
+ * Remove channels.dmwork directly from the JSON file.
205
+ * Used before uninstall to avoid config validation errors
206
+ * (openclaw config unset also fails when the channel id is unknown).
207
+ */
208
+ /**
209
+ * Get the openclaw config file path without calling the CLI.
210
+ * Falls back to the standard default when CLI is unavailable
211
+ * (e.g. during uninstall when config validation fails).
212
+ */
213
+ function getConfigFilePathSafe() {
214
+ try {
215
+ return expandHome(getConfigFilePath());
216
+ }
217
+ catch {
218
+ return resolve(homedir(), ".openclaw", "openclaw.json");
219
+ }
220
+ }
221
+ export function removeChannelConfigFromFile() {
222
+ try {
223
+ const configPath = getConfigFilePathSafe();
224
+ copyFileSync(configPath, configPath + ".bak");
225
+ const raw = readFileSync(configPath, "utf-8");
226
+ const cfg = JSON.parse(raw);
227
+ if (cfg.channels?.dmwork) {
228
+ delete cfg.channels.dmwork;
229
+ writeFileSync(configPath, JSON.stringify(cfg, null, 2), "utf-8");
230
+ }
231
+ }
232
+ catch {
233
+ // best effort
234
+ }
235
+ }
236
+ /**
237
+ * Read the full config object directly from file (for doctor phase-1 checks).
238
+ */
239
+ export function readConfigFromFile() {
240
+ try {
241
+ const configPath = getConfigFilePathSafe();
242
+ const raw = readFileSync(configPath, "utf-8");
243
+ return JSON.parse(raw);
244
+ }
245
+ catch {
246
+ return null;
247
+ }
248
+ }
249
+ /**
250
+ * Remove orphaned dmwork bindings from the config file.
251
+ * If validAccountIds is provided, only removes bindings referencing accounts
252
+ * not in that list. Otherwise removes all dmwork bindings.
253
+ */
254
+ export function removeOrphanedBindingsFromFile(channel, validAccountIds) {
255
+ try {
256
+ const configPath = getConfigFilePathSafe();
257
+ copyFileSync(configPath, configPath + ".bak");
258
+ const raw = readFileSync(configPath, "utf-8");
259
+ const cfg = JSON.parse(raw);
260
+ if (!Array.isArray(cfg.bindings))
261
+ return;
262
+ cfg.bindings = cfg.bindings.filter((b) => {
263
+ if (b.match?.channel !== channel)
264
+ return true; // keep non-dmwork
265
+ if (!validAccountIds)
266
+ return false; // remove all dmwork bindings
267
+ // Keep only if accountId is in valid list (or no accountId specified)
268
+ return !b.match.accountId || validAccountIds.includes(b.match.accountId);
269
+ });
270
+ writeFileSync(configPath, JSON.stringify(cfg, null, 2), "utf-8");
271
+ }
272
+ catch {
273
+ // best effort
274
+ }
275
+ }
276
+ //# sourceMappingURL=openclaw-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-cli.js","sourceRoot":"","sources":["../../cli/openclaw-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * remove-account command: delete a single bot account config without touching the plugin.
3
+ */
4
+ export interface RemoveAccountOptions {
5
+ accountId: string;
6
+ yes?: boolean;
7
+ }
8
+ export declare function runRemoveAccount(opts: RemoveAccountOptions): Promise<void>;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * remove-account command: delete a single bot account config without touching the plugin.
3
+ */
4
+ import { configGet, configGetJson, configUnset, gatewayRestart, pluginsUninstall, } from "./openclaw-cli.js";
5
+ import { PLUGIN_ID, confirm, ensureOpenClawCompat, validateAccountId, } from "./utils.js";
6
+ export async function runRemoveAccount(opts) {
7
+ ensureOpenClawCompat();
8
+ if (!validateAccountId(opts.accountId)) {
9
+ console.error(`Error: Invalid account ID "${opts.accountId}". Only letters, digits, and underscores are allowed.`);
10
+ process.exit(1);
11
+ }
12
+ // Check if account exists
13
+ const token = configGet(`channels.dmwork.accounts.${opts.accountId}.botToken`);
14
+ if (!token) {
15
+ console.error(`Error: Account "${opts.accountId}" does not exist.`);
16
+ process.exit(1);
17
+ }
18
+ if (!opts.yes) {
19
+ const ok = await confirm(`Delete bot account "${opts.accountId}"?`);
20
+ if (!ok) {
21
+ console.log("Cancelled.");
22
+ return;
23
+ }
24
+ }
25
+ // Delete account
26
+ configUnset(`channels.dmwork.accounts.${opts.accountId}`);
27
+ console.log(`Removed account: ${opts.accountId}`);
28
+ // Check remaining accounts
29
+ const remaining = configGetJson("channels.dmwork.accounts");
30
+ const remainingCount = remaining ? Object.keys(remaining).length : 0;
31
+ if (remainingCount === 0) {
32
+ let shouldUninstall = false;
33
+ if (opts.yes) {
34
+ shouldUninstall = true;
35
+ }
36
+ else {
37
+ shouldUninstall = await confirm("No active bot accounts remaining. Uninstall the plugin?");
38
+ }
39
+ if (shouldUninstall) {
40
+ // Clean up channels.dmwork before uninstall to avoid "unknown channel id"
41
+ // residue that would block future installs
42
+ configUnset("channels.dmwork");
43
+ pluginsUninstall(PLUGIN_ID, true);
44
+ console.log("Plugin uninstalled.");
45
+ }
46
+ }
47
+ console.log("Restarting gateway...");
48
+ if (!gatewayRestart()) {
49
+ console.log("Warning: Gateway restart failed. Run 'openclaw gateway restart' manually.");
50
+ }
51
+ }
52
+ //# sourceMappingURL=remove-account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-account.js","sourceRoot":"","sources":["../../cli/remove-account.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,OAAO,EACP,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAOpB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAA0B;IAE1B,oBAAoB,EAAE,CAAC;IAEvB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CACX,8BAA8B,IAAI,CAAC,SAAS,uDAAuD,CACpG,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,MAAM,KAAK,GAAG,SAAS,CACrB,4BAA4B,IAAI,CAAC,SAAS,WAAW,CACtD,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,mBAAmB,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,uBAAuB,IAAI,CAAC,SAAS,IAAI,CAC1C,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,WAAW,CAAC,4BAA4B,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAElD,2BAA2B;IAC3B,MAAM,SAAS,GAAG,aAAa,CAAC,0BAA0B,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,eAAe,GAAG,IAAI,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,eAAe,GAAG,MAAM,OAAO,CAC7B,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,0EAA0E;YAC1E,2CAA2C;YAC3C,WAAW,CAAC,iBAAiB,CAAC,CAAC;YAC/B,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,2EAA2E,CAC5E,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * uninstall command: delegate to openclaw plugins uninstall.
3
+ * Removes plugin + all channels.dmwork config (openclaw CLI does this automatically).
4
+ */
5
+ export interface UninstallOptions {
6
+ yes?: boolean;
7
+ }
8
+ export declare function runUninstall(opts: UninstallOptions): Promise<void>;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * uninstall command: delegate to openclaw plugins uninstall.
3
+ * Removes plugin + all channels.dmwork config (openclaw CLI does this automatically).
4
+ */
5
+ import { gatewayRestart, pluginsInspect, pluginsUninstall, removeChannelConfigFromFile, } from "./openclaw-cli.js";
6
+ import { PLUGIN_ID, confirm, ensureOpenClawCompat } from "./utils.js";
7
+ export async function runUninstall(opts) {
8
+ ensureOpenClawCompat();
9
+ if (!opts.yes) {
10
+ const ok = await confirm("Uninstall DMWork plugin? All bot configs will be removed.");
11
+ if (!ok) {
12
+ console.log("Cancelled.");
13
+ return;
14
+ }
15
+ }
16
+ // Remove channels.dmwork directly from file before uninstall to avoid
17
+ // config validation errors ("unknown channel id: dmwork")
18
+ removeChannelConfigFromFile();
19
+ console.log("Uninstalling DMWork plugin...");
20
+ const inspect = pluginsInspect(PLUGIN_ID);
21
+ if (inspect?.plugin) {
22
+ pluginsUninstall(PLUGIN_ID, opts.yes);
23
+ }
24
+ else {
25
+ console.log("Plugin not installed. Skipping.");
26
+ }
27
+ console.log("Restarting gateway...");
28
+ if (!gatewayRestart()) {
29
+ console.log("Warning: Gateway restart failed. Run 'openclaw gateway restart' manually.");
30
+ }
31
+ console.log("DMWork plugin uninstalled.");
32
+ }
33
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../cli/uninstall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMtE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAsB;IACvD,oBAAoB,EAAE,CAAC;IAEvB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,MAAM,OAAO,CACtB,2DAA2D,CAC5D,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,0DAA0D;IAC1D,2BAA2B,EAAE,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * update command:
3
+ * - Without --dev: always target latest (stable) version
4
+ * - With --dev: always target @dev tag version
5
+ * - Skip if the target version is already installed
6
+ */
7
+ export interface UpdateOptions {
8
+ json?: boolean;
9
+ dev?: boolean;
10
+ }
11
+ export declare function runUpdate(opts: UpdateOptions): Promise<void>;