@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.
@@ -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,2 @@
1
+ export declare function aboutAction(): Promise<void>;
2
+ //# sourceMappingURL=about.d.ts.map
@@ -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,4 @@
1
+ export declare function holdAction(options: {
2
+ mood: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=hold.d.ts.map
@@ -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,2 @@
1
+ export declare function lifelineAction(): Promise<void>;
2
+ //# sourceMappingURL=lifeline.d.ts.map
@@ -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,3 @@
1
+ export declare function whisperAction(): Promise<void>;
2
+ export declare function readWhisperAction(): Promise<void>;
3
+ //# sourceMappingURL=whisper.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=main.d.ts.map
@@ -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
@@ -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,2 @@
1
+ export declare function showBanner(): void;
2
+ //# sourceMappingURL=banners.d.ts.map
@@ -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,10 @@
1
+ import chalk from "chalk";
2
+ export function showBanner() {
3
+ console.clear();
4
+ console.log(chalk.cyan(`
5
+ HH — Hold Hands
6
+ `));
7
+ console.log(chalk.dim(" No links. No names. No public IDs."));
8
+ console.log("");
9
+ }
10
+ //# sourceMappingURL=banners.js.map
@@ -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,2 @@
1
+ export declare function showMenu(): Promise<void>;
2
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/ui/menu.ts"],"names":[],"mappings":"AAMA,wBAAsB,QAAQ,kBAuC7B"}
@@ -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
+ }