@indevstudio.dev/hh 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.d.ts +11 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +33 -0
- package/dist/api/client.js.map +1 -0
- package/dist/commands/about.d.ts +2 -0
- package/dist/commands/about.d.ts.map +1 -0
- package/dist/commands/about.js +18 -0
- package/dist/commands/about.js.map +1 -0
- package/dist/commands/hold.d.ts +4 -0
- package/dist/commands/hold.d.ts.map +1 -0
- package/dist/commands/hold.js +65 -0
- package/dist/commands/hold.js.map +1 -0
- package/dist/commands/lifeline.d.ts +2 -0
- package/dist/commands/lifeline.d.ts.map +1 -0
- package/dist/commands/lifeline.js +21 -0
- package/dist/commands/lifeline.js.map +1 -0
- package/dist/commands/whisper.d.ts +3 -0
- package/dist/commands/whisper.d.ts.map +1 -0
- package/dist/commands/whisper.js +44 -0
- package/dist/commands/whisper.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +41 -0
- package/dist/main.js.map +1 -0
- package/dist/ui/banners.d.ts +2 -0
- package/dist/ui/banners.d.ts.map +1 -0
- package/dist/ui/banners.js +10 -0
- package/dist/ui/banners.js.map +1 -0
- package/dist/ui/menu.d.ts +2 -0
- package/dist/ui/menu.d.ts.map +1 -0
- package/dist/ui/menu.js +45 -0
- package/dist/ui/menu.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { WebSocket } from "ws";
|
|
2
|
+
export declare class HHClient {
|
|
3
|
+
private token;
|
|
4
|
+
private ws;
|
|
5
|
+
createHand(password: string): Promise<any>;
|
|
6
|
+
login(hhNumber: string, password: string): Promise<any>;
|
|
7
|
+
connectWS(onMessage: (data: any) => void): WebSocket;
|
|
8
|
+
send(data: any): void;
|
|
9
|
+
}
|
|
10
|
+
export declare const hhClient: HHClient;
|
|
11
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAK/B,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,EAAE,CAA0B;IAE9B,UAAU,CAAC,QAAQ,EAAE,MAAM;IAK3B,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAM9C,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI;IAYxC,IAAI,CAAC,IAAI,EAAE,GAAG;CAKf;AAED,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { WebSocket } from "ws";
|
|
3
|
+
const API_BASE = process.env.HH_API_URL || "https://api.hh.indevstudio.dev";
|
|
4
|
+
const WS_BASE = API_BASE.replace("http", "ws");
|
|
5
|
+
export class HHClient {
|
|
6
|
+
token = null;
|
|
7
|
+
ws = null;
|
|
8
|
+
async createHand(password) {
|
|
9
|
+
const { data } = await axios.post(`${API_BASE}/hands`, { password });
|
|
10
|
+
return data;
|
|
11
|
+
}
|
|
12
|
+
async login(hhNumber, password) {
|
|
13
|
+
const { data } = await axios.post(`${API_BASE}/login`, { hhNumber, password });
|
|
14
|
+
this.token = data.token;
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
connectWS(onMessage) {
|
|
18
|
+
if (!this.token)
|
|
19
|
+
throw new Error("Not authenticated");
|
|
20
|
+
this.ws = new WebSocket(`${WS_BASE}/ws?token=${this.token}`);
|
|
21
|
+
this.ws.on("message", (data) => {
|
|
22
|
+
onMessage(JSON.parse(data.toString()));
|
|
23
|
+
});
|
|
24
|
+
return this.ws;
|
|
25
|
+
}
|
|
26
|
+
send(data) {
|
|
27
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
28
|
+
this.ws.send(JSON.stringify(data));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export const hhClient = new HHClient();
|
|
33
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAE/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,gCAAgC,CAAC;AAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAE/C,MAAM,OAAO,QAAQ;IACX,KAAK,GAAkB,IAAI,CAAC;IAC5B,EAAE,GAAqB,IAAI,CAAC;IAEpC,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,QAAgB;QAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,SAA8B;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAEtD,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,OAAO,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAE7D,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAC7B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,IAAS;QACZ,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,kBAehC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export async function aboutAction() {
|
|
3
|
+
console.log(chalk.cyan("\nHH — Hold Hands"));
|
|
4
|
+
console.log(chalk.dim("----------------"));
|
|
5
|
+
console.log("HH is an anonymous connection platform created by Infexjay.");
|
|
6
|
+
console.log("It is designed for temporary, private conversations.");
|
|
7
|
+
console.log("\nCore Philosophy:");
|
|
8
|
+
console.log(" - No public links.");
|
|
9
|
+
console.log(" - No usernames.");
|
|
10
|
+
console.log(" - No profiles.");
|
|
11
|
+
console.log("\nYou do not need to be known to be heard.");
|
|
12
|
+
console.log("\nPress any key to return...");
|
|
13
|
+
process.stdin.setRawMode(true);
|
|
14
|
+
process.stdin.resume();
|
|
15
|
+
await new Promise(resolve => process.stdin.once("data", resolve));
|
|
16
|
+
process.stdin.setRawMode(false);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=about.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hold.d.ts","sourceRoot":"","sources":["../../src/commands/hold.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,iBA0BzD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { hhClient } from "../api/client.js";
|
|
3
|
+
import readline from "readline";
|
|
4
|
+
export async function holdAction(options) {
|
|
5
|
+
const { mood } = options;
|
|
6
|
+
console.log(chalk.yellow(`\nFinding a hand for mood: ${mood}...`));
|
|
7
|
+
try {
|
|
8
|
+
const ws = hhClient.connectWS((data) => {
|
|
9
|
+
if (data.type === "match:found") {
|
|
10
|
+
console.log(chalk.green("\nA hand found you."));
|
|
11
|
+
startChat();
|
|
12
|
+
}
|
|
13
|
+
else if (data.type === "match:waiting") {
|
|
14
|
+
console.log(chalk.dim("Waiting for another hand..."));
|
|
15
|
+
}
|
|
16
|
+
else if (data.type === "chat:message") {
|
|
17
|
+
console.log(chalk.cyan(`\nStranger: `) + data.text);
|
|
18
|
+
}
|
|
19
|
+
else if (data.type === "chat:user_left") {
|
|
20
|
+
console.log(chalk.red("\nThis hand has let go."));
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
ws.on("open", () => {
|
|
25
|
+
hhClient.send({ type: "match:join", mood });
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
console.log(chalk.red("\nYou need to login first. Run 'hh login'"));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function startChat() {
|
|
33
|
+
readline.emitKeypressEvents(process.stdin);
|
|
34
|
+
if (process.stdin.isTTY)
|
|
35
|
+
process.stdin.setRawMode(true);
|
|
36
|
+
const rl = readline.createInterface({
|
|
37
|
+
input: process.stdin,
|
|
38
|
+
output: process.stdout,
|
|
39
|
+
prompt: chalk.dim("You: ")
|
|
40
|
+
});
|
|
41
|
+
// Boss Key logic
|
|
42
|
+
let escCount = 0;
|
|
43
|
+
process.stdin.on("keypress", (str, key) => {
|
|
44
|
+
if (key.name === "escape") {
|
|
45
|
+
escCount++;
|
|
46
|
+
if (escCount >= 2) {
|
|
47
|
+
console.clear();
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
setTimeout(() => { escCount = 0; }, 500);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
rl.prompt();
|
|
54
|
+
rl.on("line", (line) => {
|
|
55
|
+
if (line.trim() === "/hold-tighter") {
|
|
56
|
+
hhClient.send({ type: "chat:hold_tighter" });
|
|
57
|
+
console.log(chalk.yellow("\nYou are holding tighter..."));
|
|
58
|
+
}
|
|
59
|
+
else if (line.trim()) {
|
|
60
|
+
hhClient.send({ type: "chat:message", text: line });
|
|
61
|
+
}
|
|
62
|
+
rl.prompt();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=hold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hold.js","sourceRoot":"","sources":["../../src/commands/hold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifeline.d.ts","sourceRoot":"","sources":["../../src/commands/lifeline.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,kBAmBnC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
const API_BASE = process.env.HH_API_URL || "https://api.hh.indevstudio.dev";
|
|
4
|
+
export async function lifelineAction() {
|
|
5
|
+
console.log(chalk.red("\nHH Lifeline — You are not alone."));
|
|
6
|
+
console.log(chalk.dim("----------------------------------"));
|
|
7
|
+
try {
|
|
8
|
+
const { data } = await axios.get(`${API_BASE}/lifeline`);
|
|
9
|
+
console.log(`Detected Region: ${chalk.yellow(data.country)}`);
|
|
10
|
+
console.log("\nLocal Resources:");
|
|
11
|
+
data.resources.forEach((r) => {
|
|
12
|
+
console.log(` - ${r.name}: ${chalk.cyan(r.phone || r.url)}`);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
console.log("If you are in crisis, please reach out to findahelpline.com");
|
|
17
|
+
}
|
|
18
|
+
console.log(chalk.dim("\nTake care of your hand."));
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=lifeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifeline.js","sourceRoot":"","sources":["../../src/commands/lifeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,gCAAgC,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,WAAW,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAElC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.d.ts","sourceRoot":"","sources":["../../src/commands/whisper.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,kBAgBlC;AAED,wBAAsB,iBAAiB,kBAsBtC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import axios from "axios";
|
|
3
|
+
import inquirer from "inquirer";
|
|
4
|
+
const API_BASE = process.env.HH_API_URL || "http://localhost:3000";
|
|
5
|
+
export async function whisperAction() {
|
|
6
|
+
const { text } = await inquirer.prompt([
|
|
7
|
+
{
|
|
8
|
+
type: "input",
|
|
9
|
+
name: "text",
|
|
10
|
+
message: "Drop your whisper (max 280 chars):",
|
|
11
|
+
validate: (input) => input.length > 0 && input.length <= 280
|
|
12
|
+
}
|
|
13
|
+
]);
|
|
14
|
+
try {
|
|
15
|
+
await axios.post(`${API_BASE}/whispers`, { text });
|
|
16
|
+
console.log(chalk.cyan("\nYour whisper has been dropped into the dark."));
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
console.log(chalk.red("\nFailed to drop whisper."));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function readWhisperAction() {
|
|
23
|
+
try {
|
|
24
|
+
const { data } = await axios.get(`${API_BASE}/whispers/random`);
|
|
25
|
+
console.log(chalk.dim("\nSomeone whispered:"));
|
|
26
|
+
console.log(chalk.italic(`"${data.text}"`));
|
|
27
|
+
const { echo } = await inquirer.prompt([
|
|
28
|
+
{
|
|
29
|
+
type: "confirm",
|
|
30
|
+
name: "echo",
|
|
31
|
+
message: "Resonate with this whisper (Echo)?",
|
|
32
|
+
default: false
|
|
33
|
+
}
|
|
34
|
+
]);
|
|
35
|
+
if (echo) {
|
|
36
|
+
await axios.post(`${API_BASE}/whispers/${data.id}/echo`);
|
|
37
|
+
console.log(chalk.yellow("The whisper echoes a bit longer..."));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.log(chalk.dim("\nThe dark is silent. No whispers found."));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=whisper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whisper.js","sourceRoot":"","sources":["../../src/commands/whisper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,uBAAuB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACrC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,oCAAoC;YAC7C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;SAC7D;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAE5C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACrC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,oCAAoC;gBAC7C,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,aAAa,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { showBanner } from "./ui/banners.js";
|
|
4
|
+
import { showMenu } from "./ui/menu.js";
|
|
5
|
+
import { aboutAction } from "./commands/about.js";
|
|
6
|
+
import { holdAction } from "./commands/hold.js";
|
|
7
|
+
import { lifelineAction } from "./commands/lifeline.js";
|
|
8
|
+
import { whisperAction, readWhisperAction } from "./commands/whisper.js";
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name("hh")
|
|
12
|
+
.description("HH — Hold Hands: Anonymous Connection Platform")
|
|
13
|
+
.version("1.0.0");
|
|
14
|
+
program
|
|
15
|
+
.command("hold")
|
|
16
|
+
.description("Start a random anonymous chat")
|
|
17
|
+
.option("-m, --mood <mood>", "Choose a mood", "random")
|
|
18
|
+
.action(holdAction);
|
|
19
|
+
program
|
|
20
|
+
.command("about")
|
|
21
|
+
.description("Learn about HH and its philosophy")
|
|
22
|
+
.action(aboutAction);
|
|
23
|
+
program
|
|
24
|
+
.command("lifeline")
|
|
25
|
+
.description("Instant access to crisis resources")
|
|
26
|
+
.action(lifelineAction);
|
|
27
|
+
program
|
|
28
|
+
.command("whisper")
|
|
29
|
+
.description("Drop an anonymous whisper")
|
|
30
|
+
.action(whisperAction);
|
|
31
|
+
program
|
|
32
|
+
.command("read")
|
|
33
|
+
.description("Read a random anonymous whisper")
|
|
34
|
+
.action(readWhisperAction);
|
|
35
|
+
program
|
|
36
|
+
.action(() => {
|
|
37
|
+
showBanner();
|
|
38
|
+
showMenu();
|
|
39
|
+
});
|
|
40
|
+
program.parse(process.argv);
|
|
41
|
+
//# 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":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,mBAAmB,EAAE,eAAe,EAAE,QAAQ,CAAC;KACtD,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE7B,OAAO;KACJ,MAAM,CAAC,GAAG,EAAE;IACX,UAAU,EAAE,CAAC;IACb,QAAQ,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banners.d.ts","sourceRoot":"","sources":["../../src/ui/banners.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,SAOzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../src/ui/banners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;;GAEtB,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/ui/menu.ts"],"names":[],"mappings":"AAMA,wBAAsB,QAAQ,kBAuC7B"}
|
package/dist/ui/menu.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import { holdAction } from "../commands/hold.js";
|
|
3
|
+
import { aboutAction } from "../commands/about.js";
|
|
4
|
+
import { lifelineAction } from "../commands/lifeline.js";
|
|
5
|
+
import { whisperAction, readWhisperAction } from "../commands/whisper.js";
|
|
6
|
+
export async function showMenu() {
|
|
7
|
+
while (true) {
|
|
8
|
+
const { choice } = await inquirer.prompt([
|
|
9
|
+
{
|
|
10
|
+
type: "list",
|
|
11
|
+
name: "choice",
|
|
12
|
+
message: "What would you like to do?",
|
|
13
|
+
choices: [
|
|
14
|
+
{ name: "Hold a Hand", value: "hold" },
|
|
15
|
+
{ name: "Drop a Whisper", value: "whisper" },
|
|
16
|
+
{ name: "Read Whispers", value: "read" },
|
|
17
|
+
{ name: "About HH", value: "about" },
|
|
18
|
+
{ name: "Lifeline (Resources)", value: "lifeline" },
|
|
19
|
+
{ name: "Exit", value: "exit" },
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
]);
|
|
23
|
+
switch (choice) {
|
|
24
|
+
case "hold":
|
|
25
|
+
await holdAction({ mood: "random" });
|
|
26
|
+
break;
|
|
27
|
+
case "whisper":
|
|
28
|
+
await whisperAction();
|
|
29
|
+
break;
|
|
30
|
+
case "read":
|
|
31
|
+
await readWhisperAction();
|
|
32
|
+
break;
|
|
33
|
+
case "about":
|
|
34
|
+
await aboutAction();
|
|
35
|
+
break;
|
|
36
|
+
case "lifeline":
|
|
37
|
+
await lifelineAction();
|
|
38
|
+
break;
|
|
39
|
+
case "exit":
|
|
40
|
+
console.log("\nThis hand has let go.");
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/ui/menu.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACvC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,4BAA4B;gBACrC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE;oBACtC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE;oBAC5C,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE;oBACxC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE;oBACpC,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,UAAU,EAAE;oBACnD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;iBAChC;aACF;SACF,CAAC,CAAC;QAEH,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,SAAS;gBACZ,MAAM,aAAa,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,iBAAiB,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,WAAW,EAAE,CAAC;gBACpB,MAAM;YACR,KAAK,UAAU;gBACb,MAAM,cAAc,EAAE,CAAC;gBACvB,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@indevstudio.dev/hh",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "HH — Hold Hands: anonymous random chat from your terminal",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/main.js",
|
|
10
|
+
"bin": {
|
|
11
|
+
"hh": "dist/main.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"start": "node dist/main.js",
|
|
20
|
+
"dev": "tsc -w"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"hh",
|
|
24
|
+
"hold-hands",
|
|
25
|
+
"anonymous-chat",
|
|
26
|
+
"terminal"
|
|
27
|
+
],
|
|
28
|
+
"author": "INDEVSTUDIO INC. <hr@indevstudio.dev>",
|
|
29
|
+
"license": "ISC",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"axios": "^1.16.1",
|
|
32
|
+
"chalk": "^4.1.2",
|
|
33
|
+
"commander": "^11.1.0",
|
|
34
|
+
"inquirer": "^8.2.6",
|
|
35
|
+
"ws": "^8.21.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/inquirer": "^9.0.9",
|
|
39
|
+
"@types/node": "^25.9.1",
|
|
40
|
+
"@types/ws": "^8.18.1",
|
|
41
|
+
"typescript": "^5.9.3"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://indevstudio.dev",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/infex1rn/hh.git"
|
|
47
|
+
},
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/infex1rn/hh/issues"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=18"
|
|
53
|
+
}
|
|
54
|
+
}
|