petdex-cc 0.1.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.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/README_CN.md +247 -0
  4. package/dist/bin/cli.d.ts +3 -0
  5. package/dist/bin/cli.d.ts.map +1 -0
  6. package/dist/bin/cli.js +78 -0
  7. package/dist/bin/cli.js.map +1 -0
  8. package/dist/src/assets/tray-icon.png +0 -0
  9. package/dist/src/cli/config.d.ts +9 -0
  10. package/dist/src/cli/config.d.ts.map +1 -0
  11. package/dist/src/cli/config.js +41 -0
  12. package/dist/src/cli/config.js.map +1 -0
  13. package/dist/src/cli/install.d.ts +2 -0
  14. package/dist/src/cli/install.d.ts.map +1 -0
  15. package/dist/src/cli/install.js +62 -0
  16. package/dist/src/cli/install.js.map +1 -0
  17. package/dist/src/cli/list.d.ts +2 -0
  18. package/dist/src/cli/list.d.ts.map +1 -0
  19. package/dist/src/cli/list.js +20 -0
  20. package/dist/src/cli/list.js.map +1 -0
  21. package/dist/src/cli/start.d.ts +3 -0
  22. package/dist/src/cli/start.d.ts.map +1 -0
  23. package/dist/src/cli/start.js +37 -0
  24. package/dist/src/cli/start.js.map +1 -0
  25. package/dist/src/cli/status.d.ts +2 -0
  26. package/dist/src/cli/status.d.ts.map +1 -0
  27. package/dist/src/cli/status.js +8 -0
  28. package/dist/src/cli/status.js.map +1 -0
  29. package/dist/src/cli/stop.d.ts +2 -0
  30. package/dist/src/cli/stop.d.ts.map +1 -0
  31. package/dist/src/cli/stop.js +39 -0
  32. package/dist/src/cli/stop.js.map +1 -0
  33. package/dist/src/cli/switch.d.ts +2 -0
  34. package/dist/src/cli/switch.d.ts.map +1 -0
  35. package/dist/src/cli/switch.js +34 -0
  36. package/dist/src/cli/switch.js.map +1 -0
  37. package/dist/src/cli/uninstall.d.ts +2 -0
  38. package/dist/src/cli/uninstall.d.ts.map +1 -0
  39. package/dist/src/cli/uninstall.js +18 -0
  40. package/dist/src/cli/uninstall.js.map +1 -0
  41. package/dist/src/hooks/register.d.ts +3 -0
  42. package/dist/src/hooks/register.d.ts.map +1 -0
  43. package/dist/src/hooks/register.js +113 -0
  44. package/dist/src/hooks/register.js.map +1 -0
  45. package/dist/src/hooks/write-scripts.d.ts +2 -0
  46. package/dist/src/hooks/write-scripts.d.ts.map +1 -0
  47. package/dist/src/hooks/write-scripts.js +39 -0
  48. package/dist/src/hooks/write-scripts.js.map +1 -0
  49. package/dist/src/main/ai-speech.d.ts +22 -0
  50. package/dist/src/main/ai-speech.d.ts.map +1 -0
  51. package/dist/src/main/ai-speech.js +131 -0
  52. package/dist/src/main/ai-speech.js.map +1 -0
  53. package/dist/src/main/event-mapper.d.ts +10 -0
  54. package/dist/src/main/event-mapper.d.ts.map +1 -0
  55. package/dist/src/main/event-mapper.js +92 -0
  56. package/dist/src/main/event-mapper.js.map +1 -0
  57. package/dist/src/main/index.d.ts +2 -0
  58. package/dist/src/main/index.d.ts.map +1 -0
  59. package/dist/src/main/index.js +175 -0
  60. package/dist/src/main/index.js.map +1 -0
  61. package/dist/src/main/server.d.ts +8 -0
  62. package/dist/src/main/server.d.ts.map +1 -0
  63. package/dist/src/main/server.js +81 -0
  64. package/dist/src/main/server.js.map +1 -0
  65. package/dist/src/main/storage.d.ts +15 -0
  66. package/dist/src/main/storage.d.ts.map +1 -0
  67. package/dist/src/main/storage.js +90 -0
  68. package/dist/src/main/storage.js.map +1 -0
  69. package/dist/src/main/tray.d.ts +3 -0
  70. package/dist/src/main/tray.d.ts.map +1 -0
  71. package/dist/src/main/tray.js +156 -0
  72. package/dist/src/main/tray.js.map +1 -0
  73. package/dist/src/petdex-api/client.d.ts +21 -0
  74. package/dist/src/petdex-api/client.d.ts.map +1 -0
  75. package/dist/src/petdex-api/client.js +23 -0
  76. package/dist/src/petdex-api/client.js.map +1 -0
  77. package/dist/src/petdex-api/download.d.ts +8 -0
  78. package/dist/src/petdex-api/download.d.ts.map +1 -0
  79. package/dist/src/petdex-api/download.js +45 -0
  80. package/dist/src/petdex-api/download.js.map +1 -0
  81. package/dist/src/renderer/bubble.d.ts +30 -0
  82. package/dist/src/renderer/bubble.d.ts.map +1 -0
  83. package/dist/src/renderer/bubble.js +69 -0
  84. package/dist/src/renderer/bubble.js.map +1 -0
  85. package/dist/src/renderer/click-through.d.ts +21 -0
  86. package/dist/src/renderer/click-through.d.ts.map +1 -0
  87. package/dist/src/renderer/click-through.js +29 -0
  88. package/dist/src/renderer/click-through.js.map +1 -0
  89. package/dist/src/renderer/context-menu.d.ts +24 -0
  90. package/dist/src/renderer/context-menu.d.ts.map +1 -0
  91. package/dist/src/renderer/context-menu.js +83 -0
  92. package/dist/src/renderer/context-menu.js.map +1 -0
  93. package/dist/src/renderer/drag.d.ts +3 -0
  94. package/dist/src/renderer/drag.d.ts.map +1 -0
  95. package/dist/src/renderer/drag.js +57 -0
  96. package/dist/src/renderer/drag.js.map +1 -0
  97. package/dist/src/renderer/index.html +264 -0
  98. package/dist/src/renderer/pet-sprite.d.ts +25 -0
  99. package/dist/src/renderer/pet-sprite.d.ts.map +1 -0
  100. package/dist/src/renderer/pet-sprite.js +59 -0
  101. package/dist/src/renderer/pet-sprite.js.map +1 -0
  102. package/dist/src/renderer/renderer.d.ts +2 -0
  103. package/dist/src/renderer/renderer.d.ts.map +1 -0
  104. package/dist/src/renderer/renderer.js +244 -0
  105. package/dist/src/renderer/renderer.js.map +1 -0
  106. package/dist/src/renderer/wander.d.ts +8 -0
  107. package/dist/src/renderer/wander.d.ts.map +1 -0
  108. package/dist/src/renderer/wander.js +137 -0
  109. package/dist/src/renderer/wander.js.map +1 -0
  110. package/dist/src/shared/events.d.ts +62 -0
  111. package/dist/src/shared/events.d.ts.map +1 -0
  112. package/dist/src/shared/events.js +2 -0
  113. package/dist/src/shared/events.js.map +1 -0
  114. package/dist/src/shared/levels.d.ts +18 -0
  115. package/dist/src/shared/levels.d.ts.map +1 -0
  116. package/dist/src/shared/levels.js +20 -0
  117. package/dist/src/shared/levels.js.map +1 -0
  118. package/dist/src/shared/pet-states.d.ts +72 -0
  119. package/dist/src/shared/pet-states.d.ts.map +1 -0
  120. package/dist/src/shared/pet-states.js +20 -0
  121. package/dist/src/shared/pet-states.js.map +1 -0
  122. package/package.json +48 -0
  123. package/src/assets/tray-icon.png +0 -0
  124. package/src/hooks/bridge.ps1 +11 -0
  125. package/src/hooks/bridge.sh +9 -0
@@ -0,0 +1,62 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { fileURLToPath } from "node:url";
5
+ import { createRequire } from "node:module";
6
+ import { findPetBySlug } from "../petdex-api/client.js";
7
+ import { downloadPetAssets } from "../petdex-api/download.js";
8
+ import { registerHooks } from "../hooks/register.js";
9
+ import { writeBridgeScripts } from "../hooks/write-scripts.js";
10
+ import { spawn } from "node:child_process";
11
+ import { getDefaultState, saveState } from "../main/storage.js";
12
+ import { stop } from "./stop.js";
13
+ const CLAUDE_DIR = join(homedir(), ".claude");
14
+ export async function install(slug) {
15
+ if (!existsSync(CLAUDE_DIR)) {
16
+ console.error("Claude Code not detected. Install Claude Code first.");
17
+ process.exit(1);
18
+ }
19
+ console.log(`Looking up pet "${slug}" on Petdex...`);
20
+ const pet = await findPetBySlug(slug);
21
+ if (!pet) {
22
+ console.error(`Pet "${slug}" not found on Petdex.`);
23
+ process.exit(1);
24
+ }
25
+ console.log(`Found: ${pet.displayName} (${pet.kind})`);
26
+ console.log("Downloading assets...");
27
+ const paths = await downloadPetAssets(pet);
28
+ console.log(` Spritesheet: ${paths.spritesheetPath}`);
29
+ console.log(` Pet JSON: ${paths.petJsonPath}`);
30
+ console.log("Writing bridge scripts...");
31
+ writeBridgeScripts();
32
+ console.log("Configuring Claude Code hooks...");
33
+ registerHooks();
34
+ console.log(" Hooks registered in ~/.claude/settings.json");
35
+ saveState(getDefaultState(slug));
36
+ // Kill any existing pet process
37
+ stop();
38
+ try {
39
+ const { execSync } = await import("node:child_process");
40
+ if (process.platform === "win32") {
41
+ execSync("taskkill /F /IM electron.exe 2>nul", { stdio: "ignore" });
42
+ }
43
+ else {
44
+ execSync("pkill -f 'electron.*petdex-cc' 2>/dev/null || true", { stdio: "ignore" });
45
+ }
46
+ }
47
+ catch { }
48
+ console.log("Starting pet...");
49
+ await startElectron();
50
+ console.log(`\n✓ petdex-cc installed! "${pet.displayName}" is now on your desktop.`);
51
+ }
52
+ async function startElectron() {
53
+ const require = createRequire(import.meta.url);
54
+ const __dirname = dirname(fileURLToPath(import.meta.url));
55
+ const electronPath = require("electron");
56
+ const child = spawn(String(electronPath), [join(__dirname, "..", "main", "index.js")], {
57
+ detached: true,
58
+ stdio: "ignore",
59
+ });
60
+ child.unref();
61
+ }
62
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/cli/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function list(): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/list.ts"],"names":[],"mappings":"AAEA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB1C"}
@@ -0,0 +1,20 @@
1
+ import { listPets } from "../petdex-api/client.js";
2
+ export async function list() {
3
+ try {
4
+ const pets = await listPets();
5
+ if (pets.length === 0) {
6
+ console.log("No pets found.");
7
+ return;
8
+ }
9
+ console.log(`Found ${pets.length} pets:\n`);
10
+ console.log(" Slug".padEnd(30) + "Name".padEnd(30) + "Kind");
11
+ console.log("-".repeat(70));
12
+ for (const pet of pets) {
13
+ console.log(` ${pet.slug.padEnd(28)}${pet.displayName.padEnd(30)}${pet.kind}`);
14
+ }
15
+ }
16
+ catch {
17
+ console.log("Could not fetch pet list. Check your internet connection.");
18
+ }
19
+ }
20
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function start(): void;
2
+ export declare function isRunning(): boolean;
3
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/start.ts"],"names":[],"mappings":"AASA,wBAAgB,KAAK,IAAI,IAAI,CAmB5B;AAED,wBAAgB,SAAS,IAAI,OAAO,CASnC"}
@@ -0,0 +1,37 @@
1
+ import { readFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { spawn } from "node:child_process";
5
+ import { createRequire } from "node:module";
6
+ const require = createRequire(import.meta.url);
7
+ const PID_FILE = join(homedir(), ".petdex-cc", "data", "pid.lock");
8
+ export function start() {
9
+ if (isRunning()) {
10
+ console.log("Pet is already running.");
11
+ return;
12
+ }
13
+ const electronPath = require("electron");
14
+ const mainPath = join(import.meta.dirname, "..", "main", "index.js");
15
+ const child = spawn(String(electronPath), [mainPath], {
16
+ detached: true,
17
+ stdio: "ignore",
18
+ });
19
+ child.unref();
20
+ const dir = join(homedir(), ".petdex-cc", "data");
21
+ mkdirSync(dir, { recursive: true });
22
+ writeFileSync(PID_FILE, String(child.pid));
23
+ console.log("Pet started!");
24
+ }
25
+ export function isRunning() {
26
+ if (!existsSync(PID_FILE))
27
+ return false;
28
+ try {
29
+ const pid = Number.parseInt(readFileSync(PID_FILE, "utf8").trim(), 10);
30
+ process.kill(pid, 0);
31
+ return true;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAEnE,MAAM,UAAU,KAAK;IACnB,IAAI,SAAS,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE;QACpD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;IACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAClD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function status(): void;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAGA,wBAAgB,MAAM,IAAI,IAAI,CAM7B"}
@@ -0,0 +1,8 @@
1
+ import { loadState } from "../main/storage.js";
2
+ import { isRunning } from "./start.js";
3
+ export function status() {
4
+ const state = loadState();
5
+ const running = isRunning();
6
+ console.log(`Pet: ${state.petSlug || "(none)"} | Level ${state.level}: ${state.levelName} | Events: ${state.totalEvents} | Running: ${running ? "yes" : "no"}`);
7
+ }
8
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,UAAU,MAAM;IACpB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;IAC5B,OAAO,CAAC,GAAG,CACT,QAAQ,KAAK,CAAC,OAAO,IAAI,QAAQ,YAAY,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,WAAW,eAAe,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CACnJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function stop(): void;
2
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/stop.ts"],"names":[],"mappings":"AAMA,wBAAgB,IAAI,IAAI,IAAI,CAgC3B"}
@@ -0,0 +1,39 @@
1
+ import { readFileSync, existsSync, unlinkSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const PID_FILE = join(homedir(), ".petdex-cc", "data", "pid.lock");
5
+ export function stop() {
6
+ if (!existsSync(PID_FILE)) {
7
+ console.log("Pet is not running.");
8
+ return;
9
+ }
10
+ try {
11
+ const pid = Number.parseInt(readFileSync(PID_FILE, "utf8").trim(), 10);
12
+ // Try graceful shutdown via HTTP first
13
+ const portFile = join(homedir(), ".petdex-cc", "data", "port.lock");
14
+ let port = 17321;
15
+ try {
16
+ port = Number(readFileSync(portFile, "utf8").trim()) || 17321;
17
+ }
18
+ catch { }
19
+ try {
20
+ const { fetch } = globalThis;
21
+ fetch(`http://localhost:${port}/shutdown`, { method: "POST" }).catch(() => { });
22
+ }
23
+ catch {
24
+ // Fallback to SIGTERM
25
+ process.kill(pid, "SIGTERM");
26
+ }
27
+ console.log("Pet stopped!");
28
+ }
29
+ catch {
30
+ console.log("Pet process not found (may have already stopped).");
31
+ }
32
+ finally {
33
+ try {
34
+ unlinkSync(PID_FILE);
35
+ }
36
+ catch { }
37
+ }
38
+ }
39
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAEnE,MAAM,UAAU,IAAI;IAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAEvE,uCAAuC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACpE,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;YAC7B,KAAK,CAAC,oBAAoB,IAAI,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;YACtB,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function switchPet(slug: string): Promise<void>;
2
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/cli/switch.ts"],"names":[],"mappings":"AAMA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B3D"}
@@ -0,0 +1,34 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { findPetBySlug } from "../petdex-api/client.js";
5
+ import { downloadPetAssets, isPetDownloaded } from "../petdex-api/download.js";
6
+ export async function switchPet(slug) {
7
+ if (!isPetDownloaded(slug)) {
8
+ console.log(`Downloading "${slug}"...`);
9
+ const pet = await findPetBySlug(slug);
10
+ if (!pet) {
11
+ console.error(`Pet "${slug}" not found on Petdex.`);
12
+ process.exit(1);
13
+ }
14
+ await downloadPetAssets(pet);
15
+ }
16
+ const portFile = join(homedir(), ".petdex-cc", "data", "port.lock");
17
+ let port = 17321;
18
+ try {
19
+ port = Number(readFileSync(portFile, "utf8").trim()) || 17321;
20
+ }
21
+ catch { }
22
+ try {
23
+ await fetch(`http://localhost:${port}/switch-pet`, {
24
+ method: "POST",
25
+ headers: { "Content-Type": "application/json" },
26
+ body: JSON.stringify({ slug }),
27
+ });
28
+ console.log(`Switched to "${slug}"!`);
29
+ }
30
+ catch {
31
+ console.log("Pet is not running. Start it first with `petdex-cc start`.");
32
+ }
33
+ }
34
+ //# sourceMappingURL=switch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../src/cli/switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,wBAAwB,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,oBAAoB,IAAI,aAAa,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;SAC/B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function uninstall(): void;
2
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/cli/uninstall.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,IAAI,IAAI,CAahC"}
@@ -0,0 +1,18 @@
1
+ import { rmSync, existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { stop } from "./stop.js";
5
+ import { unregisterHooks } from "../hooks/register.js";
6
+ const PETDEX_DIR = join(homedir(), ".petdex-cc");
7
+ export function uninstall() {
8
+ console.log("Stopping pet...");
9
+ stop();
10
+ console.log("Removing hooks...");
11
+ unregisterHooks();
12
+ console.log("Deleting ~/.petdex-cc/...");
13
+ if (existsSync(PETDEX_DIR)) {
14
+ rmSync(PETDEX_DIR, { recursive: true, force: true });
15
+ }
16
+ console.log("petdex-cc uninstalled.");
17
+ }
18
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/cli/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAEjD,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC;IAEP,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,eAAe,EAAE,CAAC;IAElB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function registerHooks(): void;
2
+ export declare function unregisterHooks(): void;
3
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/hooks/register.ts"],"names":[],"mappings":"AA2DA,wBAAgB,aAAa,IAAI,IAAI,CAuDpC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAsCtC"}
@@ -0,0 +1,113 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { homedir } from "node:os";
4
+ const CLAUDE_SETTINGS = path.join(homedir(), ".claude", "settings.json");
5
+ const PETDEX_CC_HOOK_MARKER = "petdex-cc-bridge";
6
+ function isWindows() {
7
+ return process.platform === "win32";
8
+ }
9
+ function getBridgeScriptPath() {
10
+ const home = homedir();
11
+ if (isWindows()) {
12
+ return path.join(home, ".petdex-cc", "hooks", "bridge.ps1");
13
+ }
14
+ return path.join(home, ".petdex-cc", "hooks", "bridge.sh");
15
+ }
16
+ function buildMatcherGroup(matcher) {
17
+ const bridgePath = getBridgeScriptPath();
18
+ const handler = {
19
+ type: "command",
20
+ command: `${bridgePath} # ${PETDEX_CC_HOOK_MARKER}`,
21
+ async: true,
22
+ timeout: 10,
23
+ };
24
+ if (isWindows()) {
25
+ handler.shell = "powershell";
26
+ }
27
+ const group = {
28
+ hooks: [handler],
29
+ };
30
+ if (matcher) {
31
+ group.matcher = matcher;
32
+ }
33
+ return group;
34
+ }
35
+ export function registerHooks() {
36
+ let settings = {};
37
+ if (fs.existsSync(CLAUDE_SETTINGS)) {
38
+ const raw = fs.readFileSync(CLAUDE_SETTINGS, "utf-8");
39
+ try {
40
+ settings = JSON.parse(raw);
41
+ }
42
+ catch {
43
+ settings = {};
44
+ }
45
+ }
46
+ // Create backup
47
+ if (fs.existsSync(CLAUDE_SETTINGS)) {
48
+ const backupPath = CLAUDE_SETTINGS + ".petdex-cc-backup";
49
+ fs.copyFileSync(CLAUDE_SETTINGS, backupPath);
50
+ }
51
+ // Ensure hooks object exists
52
+ if (!settings.hooks) {
53
+ settings.hooks = {};
54
+ }
55
+ // Define all hooks to register
56
+ const hookDefinitions = [
57
+ { event: "PostToolUse", matcher: "Read|Edit|Write|Bash|Glob|Grep" },
58
+ { event: "PostToolUseFailure" },
59
+ { event: "Stop" },
60
+ { event: "StopFailure" },
61
+ { event: "Notification", matcher: "idle_prompt" },
62
+ { event: "SessionStart", matcher: "startup|resume" },
63
+ { event: "SessionEnd" },
64
+ { event: "TaskCompleted" },
65
+ ];
66
+ for (const def of hookDefinitions) {
67
+ const newGroup = buildMatcherGroup(def.matcher);
68
+ if (!settings.hooks[def.event]) {
69
+ settings.hooks[def.event] = [];
70
+ }
71
+ // Remove any existing petdex-cc matcher groups for this event
72
+ settings.hooks[def.event] = settings.hooks[def.event].filter((group) => {
73
+ const handlers = group.hooks ?? [];
74
+ return !handlers.some((h) => (h.command ?? "").includes(PETDEX_CC_HOOK_MARKER));
75
+ });
76
+ // Add the new matcher group
77
+ settings.hooks[def.event].push(newGroup);
78
+ }
79
+ fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2), "utf-8");
80
+ }
81
+ export function unregisterHooks() {
82
+ if (!fs.existsSync(CLAUDE_SETTINGS)) {
83
+ return;
84
+ }
85
+ const raw = fs.readFileSync(CLAUDE_SETTINGS, "utf-8");
86
+ let settings;
87
+ try {
88
+ settings = JSON.parse(raw);
89
+ }
90
+ catch {
91
+ return;
92
+ }
93
+ if (!settings.hooks) {
94
+ return;
95
+ }
96
+ for (const event of Object.keys(settings.hooks)) {
97
+ // Handle both nested format (MatcherGroup[]) and legacy flat format
98
+ settings.hooks[event] = settings.hooks[event].filter((group) => {
99
+ const handlers = group.hooks ?? [];
100
+ return !handlers.some((h) => (h.command ?? "").includes(PETDEX_CC_HOOK_MARKER));
101
+ });
102
+ // Clean up empty arrays
103
+ if (settings.hooks[event].length === 0) {
104
+ delete settings.hooks[event];
105
+ }
106
+ }
107
+ // Clean up empty hooks object
108
+ if (Object.keys(settings.hooks).length === 0) {
109
+ delete settings.hooks;
110
+ }
111
+ fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2), "utf-8");
112
+ }
113
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../src/hooks/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function writeBridgeScripts(): void;
2
+ //# sourceMappingURL=write-scripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-scripts.d.ts","sourceRoot":"","sources":["../../../src/hooks/write-scripts.ts"],"names":[],"mappings":"AA6BA,wBAAgB,kBAAkB,IAAI,IAAI,CAczC"}
@@ -0,0 +1,39 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { homedir } from "node:os";
4
+ const BRIDGE_SH = `#!/bin/bash
5
+ INPUT=$(cat)
6
+ PORT_FILE="$HOME/.petdex-cc/data/port.lock"
7
+ PORT=17321
8
+ if [ -f "$PORT_FILE" ]; then
9
+ PORT=$(cat "$PORT_FILE" 2>/dev/null || echo "17321")
10
+ fi
11
+ curl -s -X POST "http://localhost:$PORT/event" \\
12
+ -H "Content-Type: application/json" \\
13
+ -d "$INPUT" > /dev/null 2>&1 &
14
+ `;
15
+ const BRIDGE_PS1 = `$inputJson = [System.Console]::In.ReadToEnd()
16
+ $portFile = Join-Path $env:USERPROFILE ".petdex-cc\\data\\port.lock"
17
+ $port = 17321
18
+ if (Test-Path $portFile) {
19
+ $port = Get-Content $portFile -ErrorAction SilentlyContinue
20
+ if (-not $port) { $port = 17321 }
21
+ }
22
+ $url = "http://localhost:$port/event"
23
+ try {
24
+ Invoke-WebRequest -Uri $url -Method POST -ContentType "application/json" -Body $inputJson -UseBasicParsing -TimeoutSec 5 | Out-Null
25
+ } catch {}
26
+ `;
27
+ export function writeBridgeScripts() {
28
+ const hooksDir = path.join(homedir(), ".petdex-cc", "hooks");
29
+ fs.mkdirSync(hooksDir, { recursive: true });
30
+ const shPath = path.join(hooksDir, "bridge.sh");
31
+ const ps1Path = path.join(hooksDir, "bridge.ps1");
32
+ fs.writeFileSync(shPath, BRIDGE_SH, "utf-8");
33
+ fs.writeFileSync(ps1Path, BRIDGE_PS1, "utf-8");
34
+ // Make executable on unix
35
+ if (process.platform !== "win32") {
36
+ fs.chmodSync(shPath, 0o755);
37
+ }
38
+ }
39
+ //# sourceMappingURL=write-scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-scripts.js","sourceRoot":"","sources":["../../../src/hooks/write-scripts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,SAAS,GAAG;;;;;;;;;;CAUjB,CAAC;AAEF,MAAM,UAAU,GAAG;;;;;;;;;;;CAWlB,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC7D,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAElD,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAE/C,0BAA0B;IAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare function isAiOnCooldown(): boolean;
2
+ export declare function resetCooldown(): void;
3
+ export declare function resolveCredentials(): {
4
+ apiKey: string;
5
+ baseUrl: string;
6
+ } | null;
7
+ export declare function buildPrompt(args: {
8
+ petName: string;
9
+ vibes: string[];
10
+ levelName: string;
11
+ scene: string;
12
+ }): string;
13
+ export declare function generateAiSpeech(args: {
14
+ petName: string;
15
+ vibes: string[];
16
+ levelName: string;
17
+ scene: string;
18
+ skipCooldown?: boolean;
19
+ }): Promise<string | null>;
20
+ export declare const PRESET_LINES: Record<string, string[]>;
21
+ export declare function getPresetLine(scene: string): string;
22
+ //# sourceMappingURL=ai-speech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-speech.d.ts","sourceRoot":"","sources":["../../../src/main/ai-speech.ts"],"names":[],"mappings":"AAgBA,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,kBAAkB,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAe/E;AAsBD,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,MAAM,CAST;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCzB;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA8BjD,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD"}