claude-minipet 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 (53) hide show
  1. package/README.md +113 -0
  2. package/dist/cli/index.d.ts +2 -0
  3. package/dist/cli/index.js +351 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/cli/install.d.ts +4 -0
  6. package/dist/cli/install.js +89 -0
  7. package/dist/cli/install.js.map +1 -0
  8. package/dist/cli/setup.d.ts +11 -0
  9. package/dist/cli/setup.js +203 -0
  10. package/dist/cli/setup.js.map +1 -0
  11. package/dist/core/dna.d.ts +14 -0
  12. package/dist/core/dna.js +95 -0
  13. package/dist/core/dna.js.map +1 -0
  14. package/dist/core/evolution.d.ts +16 -0
  15. package/dist/core/evolution.js +252 -0
  16. package/dist/core/evolution.js.map +1 -0
  17. package/dist/core/pet.d.ts +25 -0
  18. package/dist/core/pet.js +224 -0
  19. package/dist/core/pet.js.map +1 -0
  20. package/dist/core/rarity.d.ts +17 -0
  21. package/dist/core/rarity.js +55 -0
  22. package/dist/core/rarity.js.map +1 -0
  23. package/dist/core/sync.d.ts +37 -0
  24. package/dist/core/sync.js +94 -0
  25. package/dist/core/sync.js.map +1 -0
  26. package/dist/core/types.d.ts +92 -0
  27. package/dist/core/types.js +22 -0
  28. package/dist/core/types.js.map +1 -0
  29. package/dist/daemon/server.d.ts +8 -0
  30. package/dist/daemon/server.js +137 -0
  31. package/dist/daemon/server.js.map +1 -0
  32. package/dist/hooks/handler.d.ts +2 -0
  33. package/dist/hooks/handler.js +99 -0
  34. package/dist/hooks/handler.js.map +1 -0
  35. package/dist/render/anim-state.d.ts +5 -0
  36. package/dist/render/anim-state.js +24 -0
  37. package/dist/render/anim-state.js.map +1 -0
  38. package/dist/render/animation.d.ts +15 -0
  39. package/dist/render/animation.js +94 -0
  40. package/dist/render/animation.js.map +1 -0
  41. package/dist/render/frames.d.ts +51 -0
  42. package/dist/render/frames.js +151 -0
  43. package/dist/render/frames.js.map +1 -0
  44. package/dist/render/pixel.d.ts +44 -0
  45. package/dist/render/pixel.js +169 -0
  46. package/dist/render/pixel.js.map +1 -0
  47. package/dist/render/sprites.d.ts +8 -0
  48. package/dist/render/sprites.js +300 -0
  49. package/dist/render/sprites.js.map +1 -0
  50. package/dist/render/statusline.d.ts +3 -0
  51. package/dist/render/statusline.js +117 -0
  52. package/dist/render/statusline.js.map +1 -0
  53. package/package.json +44 -0
@@ -0,0 +1,224 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { EXP_REWARDS, SPECIES_BONUSES } from './types.js';
5
+ const DATA_DIR = join(homedir(), '.claude-minipet');
6
+ const STATE_FILE = join(DATA_DIR, 'state.json');
7
+ const CONFIG_FILE = join(DATA_DIR, 'config.json');
8
+ export function getDataDir() {
9
+ return DATA_DIR;
10
+ }
11
+ export function ensureDataDir() {
12
+ if (!existsSync(DATA_DIR)) {
13
+ mkdirSync(DATA_DIR, { recursive: true });
14
+ }
15
+ }
16
+ /** Read pet state from disk */
17
+ export function loadState() {
18
+ try {
19
+ const raw = readFileSync(STATE_FILE, 'utf-8');
20
+ return JSON.parse(raw);
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /** Write pet state to disk */
27
+ export function saveState(state) {
28
+ ensureDataDir();
29
+ writeFileSync(STATE_FILE, JSON.stringify(state, null, 2), 'utf-8');
30
+ }
31
+ /** Read config from disk */
32
+ export function loadConfig() {
33
+ try {
34
+ const raw = readFileSync(CONFIG_FILE, 'utf-8');
35
+ return JSON.parse(raw);
36
+ }
37
+ catch {
38
+ return { language: 'zh', animationsEnabled: true, statusLineRows: 3 };
39
+ }
40
+ }
41
+ /** Write config to disk */
42
+ export function saveConfig(config) {
43
+ ensureDataDir();
44
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
45
+ }
46
+ /** Calculate EXP required to reach a given level */
47
+ export function expForLevel(level) {
48
+ return Math.floor(100 * Math.pow(level, 1.5));
49
+ }
50
+ /** Determine stage from level */
51
+ export function stageFromLevel(level) {
52
+ if (level < 16)
53
+ return 'baby';
54
+ if (level < 41)
55
+ return 'growth';
56
+ return 'final';
57
+ }
58
+ /** Create initial pet state */
59
+ export function createPet(name, species, dna, rarity) {
60
+ const now = new Date().toISOString();
61
+ const today = new Date().toISOString().slice(0, 10);
62
+ return {
63
+ name,
64
+ species,
65
+ dna,
66
+ rarity,
67
+ level: 1,
68
+ exp: 0,
69
+ expToNext: expForLevel(2),
70
+ hunger: 100,
71
+ mood: 80,
72
+ bond: 0,
73
+ stage: 'baby',
74
+ evolution: null,
75
+ pendingEvolution: null,
76
+ createdAt: now,
77
+ lastFed: now,
78
+ lastInteraction: now,
79
+ stats: {
80
+ totalEdits: 0,
81
+ totalBash: 0,
82
+ totalReads: 0,
83
+ totalCommits: 0,
84
+ totalPRs: 0,
85
+ totalTests: 0,
86
+ totalSessions: 0,
87
+ sessionMinutes: 0,
88
+ loginStreak: 1,
89
+ lastLoginDate: today,
90
+ moodHistory: [80],
91
+ },
92
+ };
93
+ }
94
+ /** Award EXP and handle level ups. Returns messages for display. */
95
+ export function awardExp(state, baseExp, type) {
96
+ const messages = [];
97
+ const bonus = SPECIES_BONUSES[state.species];
98
+ let exp = baseExp;
99
+ // Apply species bonus
100
+ if (bonus.type === type) {
101
+ exp = Math.floor(exp * bonus.multiplier);
102
+ }
103
+ // Codeslime's bonus is applied at level-up check (lower requirements)
104
+ // Starving penalty
105
+ if (state.hunger <= 0) {
106
+ exp = Math.floor(exp / 2);
107
+ }
108
+ state.exp += exp;
109
+ state.lastInteraction = new Date().toISOString();
110
+ // Check level up
111
+ while (state.exp >= state.expToNext && state.level < 100) {
112
+ state.exp -= state.expToNext;
113
+ state.level++;
114
+ // Codeslime gets reduced EXP requirements
115
+ const nextExp = expForLevel(state.level + 1);
116
+ state.expToNext = state.species === 'codeslime'
117
+ ? Math.floor(nextExp * 0.8)
118
+ : nextExp;
119
+ const newStage = stageFromLevel(state.level);
120
+ if (newStage !== state.stage) {
121
+ state.stage = newStage;
122
+ messages.push(`stage_up:${newStage}`);
123
+ }
124
+ messages.push(`level_up:${state.level}`);
125
+ }
126
+ // Mood boost from activity
127
+ state.mood = Math.min(100, state.mood + 1);
128
+ // Bond slowly increases
129
+ state.bond = Math.min(100, state.bond + 0.1);
130
+ return messages;
131
+ }
132
+ /** Process a hook event and return messages */
133
+ export function processHookEvent(state, input) {
134
+ const messages = [];
135
+ switch (input.hook_event_name) {
136
+ case 'SessionStart': {
137
+ state.stats.totalSessions++;
138
+ const today = new Date().toISOString().slice(0, 10);
139
+ if (state.stats.lastLoginDate !== today) {
140
+ const lastDate = new Date(state.stats.lastLoginDate);
141
+ const todayDate = new Date(today);
142
+ const diffDays = Math.floor((todayDate.getTime() - lastDate.getTime()) / 86400000);
143
+ state.stats.loginStreak = diffDays === 1 ? state.stats.loginStreak + 1 : 1;
144
+ state.stats.lastLoginDate = today;
145
+ // Record mood history
146
+ state.stats.moodHistory.push(state.mood);
147
+ if (state.stats.moodHistory.length > 7) {
148
+ state.stats.moodHistory.shift();
149
+ }
150
+ }
151
+ state.mood = Math.min(100, state.mood + 5);
152
+ messages.push('greeting');
153
+ break;
154
+ }
155
+ case 'UserPromptSubmit': {
156
+ messages.push(...awardExp(state, EXP_REWARDS.prompt, 'prompt'));
157
+ break;
158
+ }
159
+ case 'PostToolUse': {
160
+ const toolName = input.tool_name?.toLowerCase() ?? '';
161
+ if (toolName === 'bash') {
162
+ state.stats.totalBash++;
163
+ // Check for git commit
164
+ const cmd = String(input.tool_input?.command ?? '');
165
+ if (cmd.includes('git commit')) {
166
+ state.stats.totalCommits++;
167
+ messages.push(...awardExp(state, EXP_REWARDS.git_commit, 'git'));
168
+ }
169
+ else if (cmd.includes('git push') || cmd.includes('gh pr create')) {
170
+ state.stats.totalPRs++;
171
+ messages.push(...awardExp(state, EXP_REWARDS.git_pr, 'git'));
172
+ }
173
+ else if (cmd.includes('test') || cmd.includes('vitest') || cmd.includes('jest') || cmd.includes('pytest')) {
174
+ state.stats.totalTests++;
175
+ const response = input.tool_response ?? '';
176
+ if (response.includes('passed') || response.includes('PASS')) {
177
+ messages.push(...awardExp(state, EXP_REWARDS.test_pass, 'test'));
178
+ }
179
+ else {
180
+ messages.push(...awardExp(state, EXP_REWARDS.bash, 'bash'));
181
+ }
182
+ }
183
+ else {
184
+ messages.push(...awardExp(state, EXP_REWARDS.bash, 'bash'));
185
+ }
186
+ }
187
+ else if (toolName === 'edit' || toolName === 'write') {
188
+ state.stats.totalEdits++;
189
+ messages.push(...awardExp(state, EXP_REWARDS.edit, 'edit'));
190
+ }
191
+ else if (toolName === 'read') {
192
+ state.stats.totalReads++;
193
+ messages.push(...awardExp(state, EXP_REWARDS.read, 'read'));
194
+ }
195
+ break;
196
+ }
197
+ case 'Stop': {
198
+ // Session ending - small bond boost for engagement
199
+ state.bond = Math.min(100, state.bond + 0.5);
200
+ break;
201
+ }
202
+ }
203
+ // Check pending evolution
204
+ if (state.pendingEvolution) {
205
+ messages.push(`evolution:${state.pendingEvolution}`);
206
+ }
207
+ saveState(state);
208
+ return messages;
209
+ }
210
+ /** Feed the pet */
211
+ export function feedPet(state) {
212
+ state.hunger = Math.min(100, state.hunger + 30);
213
+ state.mood = Math.min(100, state.mood + 5);
214
+ state.lastFed = new Date().toISOString();
215
+ saveState(state);
216
+ }
217
+ /** Pat the pet */
218
+ export function patPet(state) {
219
+ state.mood = Math.min(100, state.mood + 10);
220
+ state.bond = Math.min(100, state.bond + 2);
221
+ state.lastInteraction = new Date().toISOString();
222
+ saveState(state);
223
+ }
224
+ //# sourceMappingURL=pet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pet.js","sourceRoot":"","sources":["../../src/core/pet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACpD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAChD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAElD,MAAM,UAAU,UAAU;IACxB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,SAAS,CAAC,KAAe;IACvC,aAAa,EAAE,CAAC;IAChB,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;IACxE,CAAC;AACH,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,aAAa,EAAE,CAAC;IAChB,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAgB,EAAE,GAAW,EAAE,MAAc;IACnF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO;QACL,IAAI;QACJ,OAAO;QACP,GAAG;QACH,MAAM;QACN,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,CAAC;QACN,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,IAAI;QACtB,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,GAAG;QACZ,eAAe,EAAE,GAAG;QACpB,KAAK,EAAE;YACL,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC;YAChB,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,KAAK;YACpB,WAAW,EAAE,CAAC,EAAE,CAAC;SAClB;KACF,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CAAC,KAAe,EAAE,OAAe,EAAE,IAAY;IACrE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE7C,IAAI,GAAG,GAAG,OAAO,CAAC;IAElB,sBAAsB;IACtB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IACD,sEAAsE;IAEtE,mBAAmB;IACnB,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC;IACjB,KAAK,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEjD,iBAAiB;IACjB,OAAO,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACzD,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC;QAC7B,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,0CAA0C;QAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7C,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,KAAK,WAAW;YAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;YAC3B,CAAC,CAAC,OAAO,CAAC;QAEZ,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC3C,wBAAwB;IACxB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAE7C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,gBAAgB,CAAC,KAAe,EAAE,KAAgB;IAChE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,KAAK,CAAC,eAAe,EAAE,CAAC;QAC9B,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBACrD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;gBACnF,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;gBAElC,sBAAsB;gBACtB,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,MAAM;QACR,CAAC;QAED,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;YAChE,MAAM;QACR,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACtD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACxB,uBAAuB;gBACvB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;gBACpD,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;gBACnE,CAAC;qBAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;oBACpE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC/D,CAAC;qBAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5G,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;oBAC3C,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC7D,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;oBACnE,CAAC;yBAAM,CAAC;wBACN,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACvD,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,CAAC;iBAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC/B,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,mDAAmD;YACnD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;YAC7C,MAAM;QACR,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,OAAO,CAAC,KAAe;IACrC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzC,SAAS,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,MAAM,CAAC,KAAe;IACpC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC3C,KAAK,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,SAAS,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Rarity } from './types.js';
2
+ /** Display info for each rarity tier */
3
+ export declare const RARITY_INFO: Record<Rarity, {
4
+ label: string;
5
+ labelZh: string;
6
+ stars: string;
7
+ color: {
8
+ r: number;
9
+ g: number;
10
+ b: number;
11
+ };
12
+ hasGlow: boolean;
13
+ hasSparkle: boolean;
14
+ hasBorder: boolean;
15
+ }>;
16
+ /** Get rarity display text */
17
+ export declare function getRarityDisplay(rarity: Rarity, lang?: 'zh' | 'en'): string;
@@ -0,0 +1,55 @@
1
+ /** Display info for each rarity tier */
2
+ export const RARITY_INFO = {
3
+ common: {
4
+ label: 'Common',
5
+ labelZh: '普通',
6
+ stars: '☆',
7
+ color: { r: 180, g: 180, b: 180 },
8
+ hasGlow: false,
9
+ hasSparkle: false,
10
+ hasBorder: false,
11
+ },
12
+ uncommon: {
13
+ label: 'Uncommon',
14
+ labelZh: '优秀',
15
+ stars: '★',
16
+ color: { r: 46, g: 213, b: 115 },
17
+ hasGlow: false,
18
+ hasSparkle: false,
19
+ hasBorder: false,
20
+ },
21
+ rare: {
22
+ label: 'Rare',
23
+ labelZh: '稀有',
24
+ stars: '★★',
25
+ color: { r: 69, g: 170, b: 242 },
26
+ hasGlow: false,
27
+ hasSparkle: false,
28
+ hasBorder: false,
29
+ },
30
+ legendary: {
31
+ label: 'Legendary',
32
+ labelZh: '传说',
33
+ stars: '★★★',
34
+ color: { r: 255, g: 214, b: 10 },
35
+ hasGlow: true,
36
+ hasSparkle: false,
37
+ hasBorder: false,
38
+ },
39
+ shiny: {
40
+ label: 'Shiny',
41
+ labelZh: '异色',
42
+ stars: '✦✦✦',
43
+ color: { r: 243, g: 104, b: 224 },
44
+ hasGlow: true,
45
+ hasSparkle: true,
46
+ hasBorder: true,
47
+ },
48
+ };
49
+ /** Get rarity display text */
50
+ export function getRarityDisplay(rarity, lang = 'zh') {
51
+ const info = RARITY_INFO[rarity];
52
+ const label = lang === 'zh' ? info.labelZh : info.label;
53
+ return `${info.stars} [${label}]`;
54
+ }
55
+ //# sourceMappingURL=rarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rarity.js","sourceRoot":"","sources":["../../src/core/rarity.ts"],"names":[],"mappings":"AAEA,wCAAwC;AACxC,MAAM,CAAC,MAAM,WAAW,GAQnB;IACH,MAAM,EAAE;QACN,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;QACjC,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;KACjB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,GAAG;QACV,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;QAChC,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;KACjB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;QAChC,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;KACjB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;QAChC,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,KAAK;KACjB;IACD,KAAK,EAAE;QACL,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;QACjC,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AAEF,8BAA8B;AAC9B,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAoB,IAAI;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACxD,OAAO,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC;AACpC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { PetState } from './types.js';
2
+ interface AuthData {
3
+ token: string;
4
+ email: string;
5
+ userId: number;
6
+ serverUrl: string;
7
+ }
8
+ /** Load auth data */
9
+ export declare function loadAuth(): AuthData | null;
10
+ /** Save auth data */
11
+ export declare function saveAuth(data: AuthData): void;
12
+ /** Get server URL from config or default */
13
+ export declare function getServerUrl(): string;
14
+ /** Sync full pet state to server */
15
+ export declare function syncPetToServer(state: PetState): Promise<boolean>;
16
+ /** Fetch pet state from server */
17
+ export declare function fetchPetFromServer(): Promise<PetState | null>;
18
+ /** Redeem a code to get a new pet */
19
+ export declare function redeemCode(code: string): Promise<{
20
+ ok: boolean;
21
+ pet?: PetState;
22
+ message?: string;
23
+ error?: string;
24
+ }>;
25
+ /** Send verification code */
26
+ export declare function sendCode(serverUrl: string, email: string): Promise<{
27
+ ok: boolean;
28
+ error?: string;
29
+ }>;
30
+ /** Verify code and get token */
31
+ export declare function verifyCode(serverUrl: string, email: string, code: string): Promise<{
32
+ ok: boolean;
33
+ token?: string;
34
+ userId?: number;
35
+ error?: string;
36
+ }>;
37
+ export {};
@@ -0,0 +1,94 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ const DATA_DIR = join(homedir(), '.claude-minipet');
5
+ const AUTH_FILE = join(DATA_DIR, 'auth.json');
6
+ const CONFIG_FILE = join(DATA_DIR, 'config.json');
7
+ /** Load auth data */
8
+ export function loadAuth() {
9
+ try {
10
+ return JSON.parse(readFileSync(AUTH_FILE, 'utf-8'));
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
16
+ /** Save auth data */
17
+ export function saveAuth(data) {
18
+ writeFileSync(AUTH_FILE, JSON.stringify(data, null, 2), 'utf-8');
19
+ }
20
+ /** Get server URL from config or default */
21
+ export function getServerUrl() {
22
+ const auth = loadAuth();
23
+ return auth?.serverUrl ?? 'http://localhost:3456';
24
+ }
25
+ /** Make authenticated API request */
26
+ async function apiRequest(method, path, body) {
27
+ const auth = loadAuth();
28
+ if (!auth)
29
+ return null;
30
+ const url = `${auth.serverUrl}${path}`;
31
+ const headers = {
32
+ 'Content-Type': 'application/json',
33
+ 'Authorization': `Bearer ${auth.token}`,
34
+ };
35
+ try {
36
+ const res = await fetch(url, {
37
+ method,
38
+ headers,
39
+ body: body ? JSON.stringify(body) : undefined,
40
+ signal: AbortSignal.timeout(5000), // 5 second timeout
41
+ });
42
+ return await res.json();
43
+ }
44
+ catch {
45
+ // Silently fail — offline mode
46
+ return null;
47
+ }
48
+ }
49
+ /** Sync full pet state to server */
50
+ export async function syncPetToServer(state) {
51
+ const result = await apiRequest('PUT', '/pets', { state });
52
+ return result?.ok ?? false;
53
+ }
54
+ /** Fetch pet state from server */
55
+ export async function fetchPetFromServer() {
56
+ const result = await apiRequest('GET', '/pets');
57
+ return result?.pet ?? null;
58
+ }
59
+ /** Redeem a code to get a new pet */
60
+ export async function redeemCode(code) {
61
+ const result = await apiRequest('POST', '/redeem', { code });
62
+ return result ?? { ok: false, error: '无法连接服务器' };
63
+ }
64
+ /** Send verification code */
65
+ export async function sendCode(serverUrl, email) {
66
+ try {
67
+ const res = await fetch(`${serverUrl}/auth/send-code`, {
68
+ method: 'POST',
69
+ headers: { 'Content-Type': 'application/json' },
70
+ body: JSON.stringify({ email }),
71
+ signal: AbortSignal.timeout(10000),
72
+ });
73
+ return await res.json();
74
+ }
75
+ catch (err) {
76
+ return { ok: false, error: `无法连接服务器: ${err}` };
77
+ }
78
+ }
79
+ /** Verify code and get token */
80
+ export async function verifyCode(serverUrl, email, code) {
81
+ try {
82
+ const res = await fetch(`${serverUrl}/auth/verify`, {
83
+ method: 'POST',
84
+ headers: { 'Content-Type': 'application/json' },
85
+ body: JSON.stringify({ email, code }),
86
+ signal: AbortSignal.timeout(10000),
87
+ });
88
+ return await res.json();
89
+ }
90
+ catch (err) {
91
+ return { ok: false, error: `无法连接服务器: ${err}` };
92
+ }
93
+ }
94
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /** All species available in the game */
2
+ export type Species = 'bitcat' | 'shelldragon' | 'codeslime' | 'gitfox' | 'bugowl' | 'pixiebot';
3
+ /** Rarity tiers with their visual properties */
4
+ export type Rarity = 'common' | 'uncommon' | 'rare' | 'legendary' | 'shiny';
5
+ /** Evolution stages */
6
+ export type Stage = 'baby' | 'growth' | 'final';
7
+ /** Pattern types for pet appearance */
8
+ export type Pattern = 'solid' | 'stripes' | 'spots' | 'gradient' | 'zigzag' | 'diamond' | 'swirl' | 'dots';
9
+ /** Eye styles */
10
+ export type EyeStyle = 'round' | 'star' | 'squint' | 'heterochromia' | 'dot' | 'wide' | 'angry' | 'sleepy';
11
+ /** Accessory types */
12
+ export type Accessory = 'none' | 'hat' | 'scarf' | 'bow' | 'horns' | 'crown' | 'glasses' | 'bandana';
13
+ /** RGB color */
14
+ export interface Color {
15
+ r: number;
16
+ g: number;
17
+ b: number;
18
+ }
19
+ /** The DNA structure that determines all visual traits */
20
+ export interface DNA {
21
+ raw: string;
22
+ species: Species;
23
+ bodyVariation: number;
24
+ primaryColor: Color;
25
+ secondaryColor: Color;
26
+ pattern: Pattern;
27
+ eyeStyle: EyeStyle;
28
+ accessory: Accessory;
29
+ rarity: Rarity;
30
+ }
31
+ /** Activity statistics for evolution conditions */
32
+ export interface Stats {
33
+ totalEdits: number;
34
+ totalBash: number;
35
+ totalReads: number;
36
+ totalCommits: number;
37
+ totalPRs: number;
38
+ totalTests: number;
39
+ totalSessions: number;
40
+ sessionMinutes: number;
41
+ loginStreak: number;
42
+ lastLoginDate: string;
43
+ moodHistory: number[];
44
+ }
45
+ /** The full pet state persisted to disk */
46
+ export interface PetState {
47
+ name: string;
48
+ species: Species;
49
+ dna: string;
50
+ rarity: Rarity;
51
+ level: number;
52
+ exp: number;
53
+ expToNext: number;
54
+ hunger: number;
55
+ mood: number;
56
+ bond: number;
57
+ stage: Stage;
58
+ evolution: string | null;
59
+ pendingEvolution: string | null;
60
+ createdAt: string;
61
+ lastFed: string;
62
+ lastInteraction: string;
63
+ stats: Stats;
64
+ }
65
+ /** User configuration */
66
+ export interface PetConfig {
67
+ language: 'zh' | 'en';
68
+ animationsEnabled: boolean;
69
+ statusLineRows: number;
70
+ }
71
+ /** Hook event types from Claude Code */
72
+ export type HookEvent = 'SessionStart' | 'UserPromptSubmit' | 'PostToolUse' | 'Stop' | 'PostToolUseFailure';
73
+ /** Data received from Claude Code hooks via stdin */
74
+ export interface HookInput {
75
+ session_id: string;
76
+ cwd: string;
77
+ hook_event_name: HookEvent;
78
+ tool_name?: string;
79
+ tool_input?: Record<string, unknown>;
80
+ tool_response?: string;
81
+ prompt?: string;
82
+ source?: string;
83
+ last_assistant_message?: string;
84
+ }
85
+ /** EXP reward table */
86
+ export declare const EXP_REWARDS: Record<string, number>;
87
+ /** Species passive bonus descriptions */
88
+ export declare const SPECIES_BONUSES: Record<Species, {
89
+ description: string;
90
+ type: string;
91
+ multiplier: number;
92
+ }>;
@@ -0,0 +1,22 @@
1
+ /** EXP reward table */
2
+ export const EXP_REWARDS = {
3
+ prompt: 2,
4
+ bash: 3,
5
+ edit: 5,
6
+ write: 5,
7
+ read: 1,
8
+ test_pass: 10,
9
+ git_commit: 15,
10
+ git_pr: 20,
11
+ long_session: 25,
12
+ };
13
+ /** Species passive bonus descriptions */
14
+ export const SPECIES_BONUSES = {
15
+ bitcat: { description: 'Happy when reading files', type: 'read', multiplier: 2 },
16
+ shelldragon: { description: '2x EXP from Bash commands', type: 'bash', multiplier: 2 },
17
+ codeslime: { description: 'Lower EXP requirements', type: 'exp_reduction', multiplier: 0.8 },
18
+ gitfox: { description: 'Extra EXP from Git operations', type: 'git', multiplier: 2 },
19
+ bugowl: { description: '2x EXP from debug/test', type: 'test', multiplier: 2 },
20
+ pixiebot: { description: 'Slower mood decay', type: 'mood_decay', multiplier: 0.5 },
21
+ };
22
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAsGA,uBAAuB;AACvB,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,EAAE;IACV,YAAY,EAAE,EAAE;CACjB,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAA+E;IACzG,MAAM,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;IAChF,WAAW,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;IACtF,SAAS,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,EAAE;IAC5F,MAAM,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE;IACpF,MAAM,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE;IAC9E,QAAQ,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE;CACpF,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Check if daemon is already running */
2
+ export declare function isDaemonRunning(): boolean;
3
+ /** Get daemon PID */
4
+ export declare function getDaemonPid(): number | null;
5
+ /** Start the daemon loop */
6
+ export declare function startDaemon(): void;
7
+ /** Stop the daemon */
8
+ export declare function stopDaemon(): boolean;