@hailer/cli 1.1.8 → 1.1.9
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/.claude/settings.local.json +11 -0
- package/CLAUDE.md +85 -0
- package/README.md +24 -2
- package/assets/help.md +2 -0
- package/bin/hailer-cli +1 -1
- package/dist/cli/argument-parser.d.ts +25 -0
- package/dist/cli/argument-parser.js +27 -0
- package/dist/cli/argument-parser.js.map +1 -0
- package/dist/cli/logger.d.ts +4 -0
- package/dist/cli/logger.js +27 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/repl-setup.d.ts +5 -0
- package/dist/cli/repl-setup.js +122 -0
- package/dist/cli/repl-setup.js.map +1 -0
- package/dist/cli/signal-handlers.d.ts +3 -0
- package/dist/cli/signal-handlers.js +62 -0
- package/dist/cli/signal-handlers.js.map +1 -0
- package/dist/{src/client.d.ts → client.d.ts} +3 -2
- package/dist/{src/client.js → client.js} +3 -1
- package/dist/client.js.map +1 -0
- package/dist/{src/commands → commands}/display-help.js +1 -1
- package/dist/commands/display-help.js.map +1 -0
- package/dist/{src/commands → commands}/file-upload.d.ts +0 -1
- package/dist/{src/commands → commands}/file-upload.js +2 -3
- package/dist/commands/file-upload.js.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/main.js +81 -0
- package/dist/main.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/{src/util.d.ts → util.d.ts} +0 -1
- package/dist/{src/util.js → util.js} +2 -2
- package/dist/util.js.map +1 -0
- package/doc/example/getting-started/README.md +17 -0
- package/doc/example/getting-started/package-lock.json +3489 -0
- package/doc/example/getting-started/package.json +22 -0
- package/doc/example/getting-started/src/bot.ts +68 -0
- package/doc/example/getting-started/src/upload.ts +82 -0
- package/package.json +10 -11
- package/test-baseline.js +36 -0
- package/dist/run.js +0 -213
- package/dist/run.js.map +0 -1
- package/dist/src/client.js.map +0 -1
- package/dist/src/commands/display-help.js.map +0 -1
- package/dist/src/commands/file-upload.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/util.js.map +0 -1
- /package/dist/{src/commands → commands}/display-help.d.ts +0 -0
- /package/dist/{src/index.d.ts → index.d.ts} +0 -0
- /package/dist/{src/index.js → index.js} +0 -0
- /package/dist/{run.d.ts → main.d.ts} +0 -0
package/dist/main.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const client_1 = require("./client");
|
|
16
|
+
const marked_1 = require("marked");
|
|
17
|
+
const marked_terminal_1 = require("marked-terminal");
|
|
18
|
+
const colors_1 = __importDefault(require("colors"));
|
|
19
|
+
const minimal_password_prompt_1 = __importDefault(require("minimal-password-prompt"));
|
|
20
|
+
const display_help_1 = require("./commands/display-help");
|
|
21
|
+
const argument_parser_1 = require("./cli/argument-parser");
|
|
22
|
+
const logger_1 = require("./cli/logger");
|
|
23
|
+
const signal_handlers_1 = require("./cli/signal-handlers");
|
|
24
|
+
const repl_setup_1 = require("./cli/repl-setup");
|
|
25
|
+
// Configure marked for terminal output
|
|
26
|
+
marked_1.marked.use((0, marked_terminal_1.markedTerminal)({
|
|
27
|
+
width: 100,
|
|
28
|
+
reflowText: true,
|
|
29
|
+
}));
|
|
30
|
+
function main() {
|
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
const parsedArgs = (0, argument_parser_1.parseArguments)();
|
|
33
|
+
// Display help if requested
|
|
34
|
+
if (parsedArgs.help || parsedArgs.h) {
|
|
35
|
+
(0, display_help_1.displayHelpAndExit)();
|
|
36
|
+
}
|
|
37
|
+
const connectionOptions = (0, argument_parser_1.resolveConnectionOptions)(parsedArgs);
|
|
38
|
+
let { username, password, host, quiet, rejectUnauthorized } = connectionOptions;
|
|
39
|
+
// Prompt for password if username provided but no password
|
|
40
|
+
if (username && !password) {
|
|
41
|
+
if (!quiet) {
|
|
42
|
+
console.log(colors_1.default.green(username), 'logging in to', colors_1.default.yellow(host));
|
|
43
|
+
}
|
|
44
|
+
password = yield (0, minimal_password_prompt_1.default)('enter password: ');
|
|
45
|
+
}
|
|
46
|
+
// Create and connect client
|
|
47
|
+
const client = yield client_1.Client.create({
|
|
48
|
+
username,
|
|
49
|
+
password,
|
|
50
|
+
host,
|
|
51
|
+
rejectUnauthorized
|
|
52
|
+
}).catch(error => {
|
|
53
|
+
console.log('Failed logging in:', error);
|
|
54
|
+
process.exit(7);
|
|
55
|
+
});
|
|
56
|
+
// Fetch available API methods
|
|
57
|
+
const _methods = yield client.request('methods', []);
|
|
58
|
+
// We'll store the repl reference here
|
|
59
|
+
let replInstance = null;
|
|
60
|
+
const getReplInstance = () => replInstance;
|
|
61
|
+
const methods = (0, repl_setup_1.createApiMethods)(client, _methods, getReplInstance);
|
|
62
|
+
// Start REPL
|
|
63
|
+
const repl = yield (0, repl_setup_1.startRepl)(client, methods);
|
|
64
|
+
replInstance = repl;
|
|
65
|
+
// Setup logging
|
|
66
|
+
const log = (0, logger_1.createLogger)(repl);
|
|
67
|
+
const event = (0, logger_1.createEventLogger)(log);
|
|
68
|
+
// Setup signal handlers
|
|
69
|
+
(0, signal_handlers_1.setupSignalHandlers)(client, event, log, repl.context);
|
|
70
|
+
if (client.sessionKey) {
|
|
71
|
+
log('Logged in successfully.');
|
|
72
|
+
repl.displayPrompt(true);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Run the CLI
|
|
77
|
+
main().catch(error => {
|
|
78
|
+
console.error('Fatal error:', error);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,qCAAkC;AAClC,mCAAgC;AAChC,qDAAiD;AACjD,oDAA4B;AAC5B,sFAA6C;AAC7C,0DAA6D;AAC7D,2DAAiF;AACjF,yCAA+D;AAC/D,2DAA4D;AAC5D,iDAA+D;AAE/D,uCAAuC;AACvC,eAAM,CAAC,GAAG,CAAC,IAAA,gCAAc,EAAC;IACtB,KAAK,EAAE,GAAG;IACV,UAAU,EAAE,IAAI;CACnB,CAAC,CAAC,CAAC;AAEJ,SAAe,IAAI;;QACf,MAAM,UAAU,GAAG,IAAA,gCAAc,GAAE,CAAC;QAEpC,4BAA4B;QAC5B,IAAI,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC;YAClC,IAAA,iCAAkB,GAAE,CAAC;QACzB,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAA,0CAAwB,EAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,iBAAiB,CAAC;QAEhF,2DAA2D;QAC3D,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,gBAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,QAAQ,GAAG,MAAM,IAAA,iCAAM,EAAC,kBAAkB,CAAC,CAAC;QAChD,CAAC;QAED,4BAA4B;QAC5B,MAAM,MAAM,GAAG,MAAM,eAAM,CAAC,MAAM,CAAC;YAC/B,QAAQ;YACR,QAAQ;YACR,IAAI;YACJ,kBAAkB;SACrB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAErD,sCAAsC;QACtC,IAAI,YAAY,GAAQ,IAAI,CAAC;QAC7B,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC;QAE3C,MAAM,OAAO,GAAG,IAAA,6BAAgB,EAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QAEpE,aAAa;QACb,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAS,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,YAAY,GAAG,IAAI,CAAC;QAEpB,gBAAgB;QAChB,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAC;QAErC,wBAAwB;QACxB,IAAA,qCAAmB,EAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACpB,GAAG,CAAC,yBAAyB,CAAC,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;CAAA;AAED,cAAc;AACd,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/** Hailer API method definition */
|
|
2
|
+
export interface HailerApiMethod {
|
|
3
|
+
/** Documentation for this API method */
|
|
4
|
+
doc: string;
|
|
5
|
+
/** Required arguments for this method in string format */
|
|
6
|
+
args: string;
|
|
7
|
+
}
|
|
8
|
+
/** Collection of all available Hailer API methods */
|
|
9
|
+
export interface HailerApiMethods {
|
|
10
|
+
[methodName: string]: HailerApiMethod;
|
|
11
|
+
}
|
|
12
|
+
/** API method function that can be called from REPL */
|
|
13
|
+
export interface ApiMethodFunction {
|
|
14
|
+
/** The API method name */
|
|
15
|
+
cmd: string;
|
|
16
|
+
/** Documentation for this method */
|
|
17
|
+
doc: string;
|
|
18
|
+
/** Arguments description */
|
|
19
|
+
args: string;
|
|
20
|
+
/** The actual function to call */
|
|
21
|
+
(...args: any[]): Promise<any>;
|
|
22
|
+
}
|
|
23
|
+
/** Nested API object structure for REPL */
|
|
24
|
+
export interface ApiObject {
|
|
25
|
+
[key: string]: ApiObject | ApiMethodFunction;
|
|
26
|
+
}
|
|
27
|
+
/** Root object available in REPL context */
|
|
28
|
+
export interface RootObject {
|
|
29
|
+
/** API methods organized by namespace */
|
|
30
|
+
api: ApiObject;
|
|
31
|
+
/** Result from last command */
|
|
32
|
+
result: any;
|
|
33
|
+
/** All results as array, newest at [0] */
|
|
34
|
+
history: any[];
|
|
35
|
+
/** Last error that occurred */
|
|
36
|
+
error: any;
|
|
37
|
+
}
|
|
38
|
+
/** Hailer signal event data */
|
|
39
|
+
export interface HailerSignal {
|
|
40
|
+
/** Signal name */
|
|
41
|
+
signal: string;
|
|
42
|
+
/** Signal metadata */
|
|
43
|
+
meta?: any;
|
|
44
|
+
}
|
|
45
|
+
/** Hailer user info */
|
|
46
|
+
export interface HailerUser {
|
|
47
|
+
/** User's first name */
|
|
48
|
+
firstname: string;
|
|
49
|
+
/** User's last name */
|
|
50
|
+
lastname: string;
|
|
51
|
+
/** User ID */
|
|
52
|
+
_id: string;
|
|
53
|
+
}
|
|
54
|
+
/** Hailer network info */
|
|
55
|
+
export interface HailerNetwork {
|
|
56
|
+
/** Network name */
|
|
57
|
+
name: string;
|
|
58
|
+
/** Network ID */
|
|
59
|
+
_id: string;
|
|
60
|
+
}
|
|
61
|
+
/** REPL context data from Hailer */
|
|
62
|
+
export interface HailerContextData {
|
|
63
|
+
/** Users by ID */
|
|
64
|
+
users?: {
|
|
65
|
+
[userId: string]: HailerUser;
|
|
66
|
+
};
|
|
67
|
+
/** Networks by ID */
|
|
68
|
+
networks?: {
|
|
69
|
+
[networkId: string]: HailerNetwork;
|
|
70
|
+
};
|
|
71
|
+
/** Processes info */
|
|
72
|
+
processes?: Array<{
|
|
73
|
+
_id: string;
|
|
74
|
+
name: string;
|
|
75
|
+
}>;
|
|
76
|
+
/** Current timestamp */
|
|
77
|
+
timestamp?: string;
|
|
78
|
+
/** Current network info */
|
|
79
|
+
network?: HailerNetwork;
|
|
80
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toISOStringWithTimezone =
|
|
3
|
+
exports.toISOStringWithTimezone = void 0;
|
|
4
|
+
exports.inspect = inspect;
|
|
4
5
|
const util_1 = require("util");
|
|
5
6
|
function inspect(data, options) {
|
|
6
7
|
return (0, util_1.inspect)(data, options || { colors: true, depth: 10, breakLength: 140 });
|
|
7
8
|
}
|
|
8
|
-
exports.inspect = inspect;
|
|
9
9
|
// https://www.30secondsofcode.org/js/s/to-iso-string-with-timezone 2022-10-24
|
|
10
10
|
const toISOStringWithTimezone = (date) => {
|
|
11
11
|
const tzOffset = -date.getTimezoneOffset();
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;AAEA,0BAEC;AAJD,+BAA8D;AAE9D,SAAgB,OAAO,CAAC,IAAS,EAAE,OAAwB;IACvD,OAAO,IAAA,cAAW,EAAC,IAAI,EAAE,OAAO,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;AACvF,CAAC;AAGD,8EAA8E;AACvE,MAAM,uBAAuB,GAAG,CAAC,IAAU,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,WAAW,EAAE;QACrB,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9B,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5B,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;QACzB,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC,CAAC;AAZW,QAAA,uBAAuB,2BAYlC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Getting started with Hailer CLI
|
|
2
|
+
|
|
3
|
+
## Prerequisits
|
|
4
|
+
|
|
5
|
+
Install dependencies in this directory
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm ci
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Run
|
|
12
|
+
|
|
13
|
+
Before you run, go into the `src/bot.ts`, and make sure the user, password and host is set properly
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
npm run start
|
|
17
|
+
```
|