@waiaas/cli 2.0.0-rc.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.
- package/bin/waiaas +2 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +50 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp-setup.d.ts +24 -0
- package/dist/commands/mcp-setup.d.ts.map +1 -0
- package/dist/commands/mcp-setup.js +237 -0
- package/dist/commands/mcp-setup.js.map +1 -0
- package/dist/commands/owner.d.ts +27 -0
- package/dist/commands/owner.d.ts.map +1 -0
- package/dist/commands/owner.js +145 -0
- package/dist/commands/owner.js.map +1 -0
- package/dist/commands/quickstart.d.ts +20 -0
- package/dist/commands/quickstart.d.ts.map +1 -0
- package/dist/commands/quickstart.js +192 -0
- package/dist/commands/quickstart.js.map +1 -0
- package/dist/commands/start.d.ts +10 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +54 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +10 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +80 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +10 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +68 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/upgrade.d.ts +28 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +202 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/wallet.d.ts +21 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +99 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/data-dir.d.ts +12 -0
- package/dist/utils/data-dir.d.ts.map +1 -0
- package/dist/utils/data-dir.js +18 -0
- package/dist/utils/data-dir.js.map +1 -0
- package/dist/utils/password.d.ts +10 -0
- package/dist/utils/password.d.ts.map +1 -0
- package/dist/utils/password.js +58 -0
- package/dist/utils/password.js.map +1 -0
- package/dist/utils/slug.d.ts +27 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +53 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/update-notify.d.ts +23 -0
- package/dist/utils/update-notify.d.ts.map +1 -0
- package/dist/utils/update-notify.js +114 -0
- package/dist/utils/update-notify.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password.d.ts","sourceRoot":"","sources":["../../src/utils/password.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBvD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the master password for the WAIaaS daemon.
|
|
3
|
+
*
|
|
4
|
+
* Priority:
|
|
5
|
+
* 1. WAIAAS_MASTER_PASSWORD environment variable
|
|
6
|
+
* 2. WAIAAS_MASTER_PASSWORD_FILE (read file content, trim)
|
|
7
|
+
* 3. Interactive prompt (stdin)
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
import { createInterface } from 'node:readline';
|
|
11
|
+
export async function resolvePassword() {
|
|
12
|
+
// 1. Env var
|
|
13
|
+
const envPassword = process.env['WAIAAS_MASTER_PASSWORD'];
|
|
14
|
+
if (envPassword)
|
|
15
|
+
return envPassword;
|
|
16
|
+
// 2. Password file
|
|
17
|
+
const passwordFile = process.env['WAIAAS_MASTER_PASSWORD_FILE'];
|
|
18
|
+
if (passwordFile) {
|
|
19
|
+
const content = readFileSync(passwordFile, 'utf-8').trim();
|
|
20
|
+
if (content.length === 0) {
|
|
21
|
+
throw new Error('WAIAAS_MASTER_PASSWORD_FILE is empty');
|
|
22
|
+
}
|
|
23
|
+
return content;
|
|
24
|
+
}
|
|
25
|
+
// 3. Interactive prompt
|
|
26
|
+
return promptPassword('Master password: ');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Prompt for a password with hidden input.
|
|
30
|
+
*/
|
|
31
|
+
function promptPassword(prompt) {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
const rl = createInterface({
|
|
34
|
+
input: process.stdin,
|
|
35
|
+
output: process.stdout,
|
|
36
|
+
});
|
|
37
|
+
// Hide input using ANSI escape
|
|
38
|
+
process.stdout.write(prompt);
|
|
39
|
+
process.stdout.write('\x1B[8m'); // hide text
|
|
40
|
+
rl.once('line', (line) => {
|
|
41
|
+
process.stdout.write('\x1B[28m'); // show text again
|
|
42
|
+
process.stdout.write('\n');
|
|
43
|
+
rl.close();
|
|
44
|
+
const password = line.trim();
|
|
45
|
+
if (password.length === 0) {
|
|
46
|
+
reject(new Error('Password cannot be empty'));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
resolve(password);
|
|
50
|
+
});
|
|
51
|
+
rl.once('error', (err) => {
|
|
52
|
+
process.stdout.write('\x1B[28m');
|
|
53
|
+
rl.close();
|
|
54
|
+
reject(err);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=password.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password.js","sourceRoot":"","sources":["../../src/utils/password.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,aAAa;IACb,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC1D,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,mBAAmB;IACnB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAChE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,wBAAwB;IACxB,OAAO,cAAc,CAAC,mBAAmB,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,+BAA+B;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;QAE7C,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YACD,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slug utilities for wallet name -> config-safe key conversion.
|
|
3
|
+
*
|
|
4
|
+
* Used by `mcp setup` to generate unique MCP server keys
|
|
5
|
+
* like "waiaas-trading-bot" from wallet names.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Convert wallet name to URL/config-safe slug.
|
|
9
|
+
* - lowercase
|
|
10
|
+
* - non-alphanumeric/non-hyphen -> hyphen
|
|
11
|
+
* - collapse consecutive hyphens
|
|
12
|
+
* - trim leading/trailing hyphens
|
|
13
|
+
* - fallback to 'wallet' if result is empty
|
|
14
|
+
*/
|
|
15
|
+
export declare function toSlug(name: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve slug collisions for a list of wallets.
|
|
18
|
+
* Returns Map<walletId, resolvedSlug>.
|
|
19
|
+
*
|
|
20
|
+
* If two or more wallets produce the same slug, append `-{walletId first 8 chars}`.
|
|
21
|
+
* Example: "trading-bot" collides -> "trading-bot-01929abc"
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveSlugCollisions(wallets: Array<{
|
|
24
|
+
id: string;
|
|
25
|
+
name?: string | null;
|
|
26
|
+
}>): Map<string, string>;
|
|
27
|
+
//# sourceMappingURL=slug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3C;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GACnD,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBrB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slug utilities for wallet name -> config-safe key conversion.
|
|
3
|
+
*
|
|
4
|
+
* Used by `mcp setup` to generate unique MCP server keys
|
|
5
|
+
* like "waiaas-trading-bot" from wallet names.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Convert wallet name to URL/config-safe slug.
|
|
9
|
+
* - lowercase
|
|
10
|
+
* - non-alphanumeric/non-hyphen -> hyphen
|
|
11
|
+
* - collapse consecutive hyphens
|
|
12
|
+
* - trim leading/trailing hyphens
|
|
13
|
+
* - fallback to 'wallet' if result is empty
|
|
14
|
+
*/
|
|
15
|
+
export function toSlug(name) {
|
|
16
|
+
const slug = name
|
|
17
|
+
.toLowerCase()
|
|
18
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
19
|
+
.replace(/-{2,}/g, '-')
|
|
20
|
+
.replace(/^-|-$/g, '');
|
|
21
|
+
return slug || 'wallet';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve slug collisions for a list of wallets.
|
|
25
|
+
* Returns Map<walletId, resolvedSlug>.
|
|
26
|
+
*
|
|
27
|
+
* If two or more wallets produce the same slug, append `-{walletId first 8 chars}`.
|
|
28
|
+
* Example: "trading-bot" collides -> "trading-bot-01929abc"
|
|
29
|
+
*/
|
|
30
|
+
export function resolveSlugCollisions(wallets) {
|
|
31
|
+
// Step 1: compute raw slugs
|
|
32
|
+
const entries = wallets.map((w) => ({
|
|
33
|
+
id: w.id,
|
|
34
|
+
slug: toSlug(w.name ?? w.id),
|
|
35
|
+
}));
|
|
36
|
+
// Step 2: detect collisions (count occurrences per slug)
|
|
37
|
+
const slugCounts = new Map();
|
|
38
|
+
for (const e of entries) {
|
|
39
|
+
slugCounts.set(e.slug, (slugCounts.get(e.slug) ?? 0) + 1);
|
|
40
|
+
}
|
|
41
|
+
// Step 3: resolve collisions
|
|
42
|
+
const result = new Map();
|
|
43
|
+
for (const e of entries) {
|
|
44
|
+
if (slugCounts.get(e.slug) > 1) {
|
|
45
|
+
result.set(e.id, `${e.slug}-${e.id.slice(0, 8)}`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
result.set(e.id, e.slug);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,MAAM,IAAI,GAAG,IAAI;SACd,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,OAAO,IAAI,IAAI,QAAQ,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAoD;IAEpD,4BAA4B;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;KAC7B,CAAC,CAAC,CAAC;IAEJ,yDAAyD;IACzD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAE,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI upgrade notification utility.
|
|
3
|
+
*
|
|
4
|
+
* Checks the daemon /health endpoint for update availability and displays
|
|
5
|
+
* a notification box on stderr. Uses file-based 24-hour dedup to avoid
|
|
6
|
+
* spamming users on repeated CLI invocations.
|
|
7
|
+
*
|
|
8
|
+
* Design constraints:
|
|
9
|
+
* - MUST NOT write to stdout (pipe safety)
|
|
10
|
+
* - MUST NOT throw (CLI must always work even if notification fails)
|
|
11
|
+
* - MUST NOT block CLI startup (called fire-and-forget)
|
|
12
|
+
*/
|
|
13
|
+
export interface UpdateNotifyOpts {
|
|
14
|
+
dataDir: string;
|
|
15
|
+
quiet?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check for available updates and print a notification box to stderr.
|
|
19
|
+
*
|
|
20
|
+
* Safe to call fire-and-forget — all errors are silently swallowed.
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkAndNotifyUpdate(opts: UpdateNotifyOpts): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=update-notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notify.d.ts","sourceRoot":"","sources":["../../src/utils/update-notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI upgrade notification utility.
|
|
3
|
+
*
|
|
4
|
+
* Checks the daemon /health endpoint for update availability and displays
|
|
5
|
+
* a notification box on stderr. Uses file-based 24-hour dedup to avoid
|
|
6
|
+
* spamming users on repeated CLI invocations.
|
|
7
|
+
*
|
|
8
|
+
* Design constraints:
|
|
9
|
+
* - MUST NOT write to stdout (pipe safety)
|
|
10
|
+
* - MUST NOT throw (CLI must always work even if notification fails)
|
|
11
|
+
* - MUST NOT block CLI startup (called fire-and-forget)
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
/** Default daemon port when config.toml is unavailable. */
|
|
16
|
+
const DEFAULT_PORT = 3100;
|
|
17
|
+
/** Suppress duplicate notifications within this window (ms). */
|
|
18
|
+
const DEDUP_WINDOW_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
19
|
+
/** Fetch timeout to keep CLI responsive (ms). */
|
|
20
|
+
const FETCH_TIMEOUT_MS = 2000;
|
|
21
|
+
/** Filename used to track last notification time. */
|
|
22
|
+
const LAST_NOTIFY_FILE = '.last-update-notify';
|
|
23
|
+
/**
|
|
24
|
+
* Check for available updates and print a notification box to stderr.
|
|
25
|
+
*
|
|
26
|
+
* Safe to call fire-and-forget — all errors are silently swallowed.
|
|
27
|
+
*/
|
|
28
|
+
export async function checkAndNotifyUpdate(opts) {
|
|
29
|
+
try {
|
|
30
|
+
// 1. Suppress if quiet mode
|
|
31
|
+
if (opts.quiet === true || process.env['WAIAAS_NO_UPDATE_NOTIFY'] === '1') {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// 2. Resolve port from config.toml
|
|
35
|
+
const port = resolvePort(opts.dataDir);
|
|
36
|
+
// 3. Fetch /health with timeout
|
|
37
|
+
const res = await fetch(`http://127.0.0.1:${port}/health`, {
|
|
38
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
39
|
+
});
|
|
40
|
+
if (!res.ok)
|
|
41
|
+
return;
|
|
42
|
+
const body = (await res.json());
|
|
43
|
+
// 4. Check if update is available
|
|
44
|
+
if (body.updateAvailable !== true)
|
|
45
|
+
return;
|
|
46
|
+
// 5. 24-hour dedup via file mtime
|
|
47
|
+
const notifyPath = join(opts.dataDir, LAST_NOTIFY_FILE);
|
|
48
|
+
if (isWithinDedupWindow(notifyPath))
|
|
49
|
+
return;
|
|
50
|
+
// 6. Touch the dedup file
|
|
51
|
+
writeFileSync(notifyPath, '', 'utf-8');
|
|
52
|
+
// 7. Render notification box to stderr
|
|
53
|
+
const currentVersion = body.version ?? 'unknown';
|
|
54
|
+
const latestVersion = body.latestVersion ?? 'unknown';
|
|
55
|
+
renderNotification(currentVersion, latestVersion);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Silently ignore all errors — CLI must not break
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check whether the dedup file exists and was modified within the dedup window.
|
|
63
|
+
*/
|
|
64
|
+
function isWithinDedupWindow(filePath) {
|
|
65
|
+
try {
|
|
66
|
+
if (!existsSync(filePath))
|
|
67
|
+
return false;
|
|
68
|
+
const stat = statSync(filePath);
|
|
69
|
+
const age = Date.now() - stat.mtimeMs;
|
|
70
|
+
return age < DEDUP_WINDOW_MS;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolve daemon port from config.toml using simple regex (no TOML parser dependency).
|
|
78
|
+
*/
|
|
79
|
+
function resolvePort(dataDir) {
|
|
80
|
+
try {
|
|
81
|
+
const configPath = join(dataDir, 'config.toml');
|
|
82
|
+
if (!existsSync(configPath))
|
|
83
|
+
return DEFAULT_PORT;
|
|
84
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
85
|
+
const match = /^\s*port\s*=\s*(\d+)/m.exec(content);
|
|
86
|
+
if (match?.[1]) {
|
|
87
|
+
const port = parseInt(match[1], 10);
|
|
88
|
+
if (port > 0 && port <= 65535)
|
|
89
|
+
return port;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Ignore config read errors
|
|
94
|
+
}
|
|
95
|
+
return DEFAULT_PORT;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Render an update notification box to stderr.
|
|
99
|
+
*/
|
|
100
|
+
function renderNotification(currentVersion, latestVersion) {
|
|
101
|
+
const message = `Update available: ${currentVersion} → ${latestVersion}`;
|
|
102
|
+
const action = 'Run: waiaas upgrade';
|
|
103
|
+
// Calculate box width (account for 3-space padding on each side)
|
|
104
|
+
const contentWidth = Math.max(message.length, action.length);
|
|
105
|
+
const boxWidth = contentWidth + 6; // 3 padding each side
|
|
106
|
+
const top = `\u256D${'─'.repeat(boxWidth)}\u256E`;
|
|
107
|
+
const bottom = `\u2570${'─'.repeat(boxWidth)}\u256F`;
|
|
108
|
+
const empty = `\u2502${' '.repeat(boxWidth)}\u2502`;
|
|
109
|
+
const msgLine = `\u2502 ${message.padEnd(contentWidth)} \u2502`;
|
|
110
|
+
const actLine = `\u2502 ${action.padEnd(contentWidth)} \u2502`;
|
|
111
|
+
const box = `\n${top}\n${empty}\n${msgLine}\n${actLine}\n${empty}\n${bottom}\n`;
|
|
112
|
+
process.stderr.write(box);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=update-notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notify.js","sourceRoot":"","sources":["../../src/utils/update-notify.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@waiaas/cli",
|
|
3
|
+
"version": "2.0.0-rc.1",
|
|
4
|
+
"description": "WAIaaS CLI - command-line interface for managing the wallet daemon",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/minho-yoo/waiaas.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/minho-yoo/waiaas#readme",
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"bin": {
|
|
18
|
+
"waiaas": "./bin/waiaas"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"bin"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -p tsconfig.json",
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"test:unit": "vitest run",
|
|
28
|
+
"test:integration": "[ -d src/__tests__/integration ] && vitest run --dir src/__tests__/integration || true",
|
|
29
|
+
"test:security": "[ -d src/__tests__/security ] && vitest run --dir src/__tests__/security || true",
|
|
30
|
+
"test:chain": "[ -d src/__tests__/chain ] && vitest run --dir src/__tests__/chain || true",
|
|
31
|
+
"test:platform": "[ -d src/__tests__/platform ] && vitest run --dir src/__tests__/platform || true",
|
|
32
|
+
"lint": "eslint src/",
|
|
33
|
+
"typecheck": "tsc --noEmit",
|
|
34
|
+
"clean": "rm -rf dist"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@waiaas/core": "workspace:*",
|
|
38
|
+
"@waiaas/daemon": "workspace:*",
|
|
39
|
+
"commander": "^13.0.0",
|
|
40
|
+
"qrcode": "^1.5.4",
|
|
41
|
+
"semver": "^7.7.4"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@hono/node-server": "^1.19.9",
|
|
45
|
+
"@types/qrcode": "^1.5.6",
|
|
46
|
+
"@types/semver": "^7.7.1",
|
|
47
|
+
"argon2": "^0.44.0"
|
|
48
|
+
}
|
|
49
|
+
}
|