pulse-line 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.
Files changed (211) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +27 -0
  3. package/LICENSE +21 -0
  4. package/README.md +316 -0
  5. package/bin/pulse-line.js +12 -0
  6. package/commands/clear-cache.md +23 -0
  7. package/commands/config.md +25 -0
  8. package/commands/debug.md +25 -0
  9. package/commands/disable.md +27 -0
  10. package/commands/enable.md +27 -0
  11. package/commands/install.md +25 -0
  12. package/commands/language.md +27 -0
  13. package/commands/reload.md +23 -0
  14. package/commands/theme.md +27 -0
  15. package/commands/themes.md +23 -0
  16. package/commands/uninstall.md +23 -0
  17. package/dist/src/cli.d.ts +2 -0
  18. package/dist/src/cli.js +242 -0
  19. package/dist/src/cli.js.map +1 -0
  20. package/dist/src/config/defaults.d.ts +2 -0
  21. package/dist/src/config/defaults.js +7 -0
  22. package/dist/src/config/defaults.js.map +1 -0
  23. package/dist/src/config/loader.d.ts +6 -0
  24. package/dist/src/config/loader.js +146 -0
  25. package/dist/src/config/loader.js.map +1 -0
  26. package/dist/src/config/migrate-config.d.ts +2 -0
  27. package/dist/src/config/migrate-config.js +22 -0
  28. package/dist/src/config/migrate-config.js.map +1 -0
  29. package/dist/src/config/validator.d.ts +2 -0
  30. package/dist/src/config/validator.js +7 -0
  31. package/dist/src/config/validator.js.map +1 -0
  32. package/dist/src/extractors/account-usage.d.ts +20 -0
  33. package/dist/src/extractors/account-usage.js +293 -0
  34. package/dist/src/extractors/account-usage.js.map +1 -0
  35. package/dist/src/extractors/context.d.ts +7 -0
  36. package/dist/src/extractors/context.js +20 -0
  37. package/dist/src/extractors/context.js.map +1 -0
  38. package/dist/src/extractors/cost.d.ts +5 -0
  39. package/dist/src/extractors/cost.js +13 -0
  40. package/dist/src/extractors/cost.js.map +1 -0
  41. package/dist/src/extractors/git.d.ts +6 -0
  42. package/dist/src/extractors/git.js +35 -0
  43. package/dist/src/extractors/git.js.map +1 -0
  44. package/dist/src/extractors/index.d.ts +25 -0
  45. package/dist/src/extractors/index.js +33 -0
  46. package/dist/src/extractors/index.js.map +1 -0
  47. package/dist/src/extractors/mcp.d.ts +5 -0
  48. package/dist/src/extractors/mcp.js +72 -0
  49. package/dist/src/extractors/mcp.js.map +1 -0
  50. package/dist/src/extractors/model.d.ts +9 -0
  51. package/dist/src/extractors/model.js +20 -0
  52. package/dist/src/extractors/model.js.map +1 -0
  53. package/dist/src/extractors/output-style.d.ts +9 -0
  54. package/dist/src/extractors/output-style.js +13 -0
  55. package/dist/src/extractors/output-style.js.map +1 -0
  56. package/dist/src/extractors/rate-limits.d.ts +8 -0
  57. package/dist/src/extractors/rate-limits.js +39 -0
  58. package/dist/src/extractors/rate-limits.js.map +1 -0
  59. package/dist/src/extractors/session.d.ts +5 -0
  60. package/dist/src/extractors/session.js +67 -0
  61. package/dist/src/extractors/session.js.map +1 -0
  62. package/dist/src/extractors/thinking.d.ts +10 -0
  63. package/dist/src/extractors/thinking.js +16 -0
  64. package/dist/src/extractors/thinking.js.map +1 -0
  65. package/dist/src/extractors/third-party-api.d.ts +13 -0
  66. package/dist/src/extractors/third-party-api.js +193 -0
  67. package/dist/src/extractors/third-party-api.js.map +1 -0
  68. package/dist/src/extractors/transcript.d.ts +5 -0
  69. package/dist/src/extractors/transcript.js +67 -0
  70. package/dist/src/extractors/transcript.js.map +1 -0
  71. package/dist/src/extractors/workspace.d.ts +9 -0
  72. package/dist/src/extractors/workspace.js +43 -0
  73. package/dist/src/extractors/workspace.js.map +1 -0
  74. package/dist/src/formatters/duration.d.ts +1 -0
  75. package/dist/src/formatters/duration.js +19 -0
  76. package/dist/src/formatters/duration.js.map +1 -0
  77. package/dist/src/formatters/index.d.ts +7 -0
  78. package/dist/src/formatters/index.js +16 -0
  79. package/dist/src/formatters/index.js.map +1 -0
  80. package/dist/src/formatters/layout.d.ts +10 -0
  81. package/dist/src/formatters/layout.js +38 -0
  82. package/dist/src/formatters/layout.js.map +1 -0
  83. package/dist/src/formatters/progress-bar.d.ts +2 -0
  84. package/dist/src/formatters/progress-bar.js +23 -0
  85. package/dist/src/formatters/progress-bar.js.map +1 -0
  86. package/dist/src/formatters/segment.d.ts +9 -0
  87. package/dist/src/formatters/segment.js +18 -0
  88. package/dist/src/formatters/segment.js.map +1 -0
  89. package/dist/src/formatters/separator.d.ts +1 -0
  90. package/dist/src/formatters/separator.js +11 -0
  91. package/dist/src/formatters/separator.js.map +1 -0
  92. package/dist/src/i18n/index.d.ts +8 -0
  93. package/dist/src/i18n/index.js +31 -0
  94. package/dist/src/i18n/index.js.map +1 -0
  95. package/dist/src/i18n/locales/en.d.ts +1 -0
  96. package/dist/src/i18n/locales/en.js +26 -0
  97. package/dist/src/i18n/locales/en.js.map +1 -0
  98. package/dist/src/i18n/locales/zh.d.ts +1 -0
  99. package/dist/src/i18n/locales/zh.js +26 -0
  100. package/dist/src/i18n/locales/zh.js.map +1 -0
  101. package/dist/src/index.d.ts +1 -0
  102. package/dist/src/index.js +176 -0
  103. package/dist/src/index.js.map +1 -0
  104. package/dist/src/parser/stdin-parser.d.ts +3 -0
  105. package/dist/src/parser/stdin-parser.js +58 -0
  106. package/dist/src/parser/stdin-parser.js.map +1 -0
  107. package/dist/src/themes/builtin/cyberpunk.d.ts +2 -0
  108. package/dist/src/themes/builtin/cyberpunk.js +47 -0
  109. package/dist/src/themes/builtin/cyberpunk.js.map +1 -0
  110. package/dist/src/themes/builtin/dark.d.ts +2 -0
  111. package/dist/src/themes/builtin/dark.js +47 -0
  112. package/dist/src/themes/builtin/dark.js.map +1 -0
  113. package/dist/src/themes/builtin/forest.d.ts +2 -0
  114. package/dist/src/themes/builtin/forest.js +47 -0
  115. package/dist/src/themes/builtin/forest.js.map +1 -0
  116. package/dist/src/themes/builtin/light.d.ts +2 -0
  117. package/dist/src/themes/builtin/light.js +47 -0
  118. package/dist/src/themes/builtin/light.js.map +1 -0
  119. package/dist/src/themes/builtin/ocean.d.ts +2 -0
  120. package/dist/src/themes/builtin/ocean.js +47 -0
  121. package/dist/src/themes/builtin/ocean.js.map +1 -0
  122. package/dist/src/themes/icon-provider.d.ts +2 -0
  123. package/dist/src/themes/icon-provider.js +10 -0
  124. package/dist/src/themes/icon-provider.js.map +1 -0
  125. package/dist/src/themes/icon-sets/nerd.d.ts +17 -0
  126. package/dist/src/themes/icon-sets/nerd.js +20 -0
  127. package/dist/src/themes/icon-sets/nerd.js.map +1 -0
  128. package/dist/src/themes/icon-sets/text.d.ts +17 -0
  129. package/dist/src/themes/icon-sets/text.js +21 -0
  130. package/dist/src/themes/icon-sets/text.js.map +1 -0
  131. package/dist/src/themes/index.d.ts +4 -0
  132. package/dist/src/themes/index.js +56 -0
  133. package/dist/src/themes/index.js.map +1 -0
  134. package/dist/src/types/pulse-config.d.ts +58 -0
  135. package/dist/src/types/pulse-config.js +50 -0
  136. package/dist/src/types/pulse-config.js.map +1 -0
  137. package/dist/src/types/pulse-input.d.ts +83 -0
  138. package/dist/src/types/pulse-input.js +4 -0
  139. package/dist/src/types/pulse-input.js.map +1 -0
  140. package/dist/src/types/theme.d.ts +50 -0
  141. package/dist/src/types/theme.js +4 -0
  142. package/dist/src/types/theme.js.map +1 -0
  143. package/dist/src/utils/ansi.d.ts +6 -0
  144. package/dist/src/utils/ansi.js +31 -0
  145. package/dist/src/utils/ansi.js.map +1 -0
  146. package/dist/src/utils/cache.d.ts +11 -0
  147. package/dist/src/utils/cache.js +128 -0
  148. package/dist/src/utils/cache.js.map +1 -0
  149. package/dist/src/utils/claude-settings-env.d.ts +11 -0
  150. package/dist/src/utils/claude-settings-env.js +108 -0
  151. package/dist/src/utils/claude-settings-env.js.map +1 -0
  152. package/dist/src/utils/constants.d.ts +3 -0
  153. package/dist/src/utils/constants.js +43 -0
  154. package/dist/src/utils/constants.js.map +1 -0
  155. package/dist/src/utils/display-sanitize.d.ts +7 -0
  156. package/dist/src/utils/display-sanitize.js +69 -0
  157. package/dist/src/utils/display-sanitize.js.map +1 -0
  158. package/dist/src/utils/fs.d.ts +5 -0
  159. package/dist/src/utils/fs.js +79 -0
  160. package/dist/src/utils/fs.js.map +1 -0
  161. package/dist/src/utils/git.d.ts +7 -0
  162. package/dist/src/utils/git.js +56 -0
  163. package/dist/src/utils/git.js.map +1 -0
  164. package/dist/src/utils/logger.d.ts +9 -0
  165. package/dist/src/utils/logger.js +53 -0
  166. package/dist/src/utils/logger.js.map +1 -0
  167. package/dist/src/utils/model-display-env.d.ts +12 -0
  168. package/dist/src/utils/model-display-env.js +53 -0
  169. package/dist/src/utils/model-display-env.js.map +1 -0
  170. package/dist/src/utils/provider-credentials.d.ts +12 -0
  171. package/dist/src/utils/provider-credentials.js +145 -0
  172. package/dist/src/utils/provider-credentials.js.map +1 -0
  173. package/dist/test/advanced-extractors.test.d.ts +1 -0
  174. package/dist/test/advanced-extractors.test.js +96 -0
  175. package/dist/test/advanced-extractors.test.js.map +1 -0
  176. package/dist/test/benchmark.d.ts +1 -0
  177. package/dist/test/benchmark.js +67 -0
  178. package/dist/test/benchmark.js.map +1 -0
  179. package/dist/test/display-sanitize.test.d.ts +1 -0
  180. package/dist/test/display-sanitize.test.js +28 -0
  181. package/dist/test/display-sanitize.test.js.map +1 -0
  182. package/dist/test/extractors.test.d.ts +1 -0
  183. package/dist/test/extractors.test.js +261 -0
  184. package/dist/test/extractors.test.js.map +1 -0
  185. package/dist/test/formatters.test.d.ts +1 -0
  186. package/dist/test/formatters.test.js +62 -0
  187. package/dist/test/formatters.test.js.map +1 -0
  188. package/dist/test/git.test.d.ts +1 -0
  189. package/dist/test/git.test.js +85 -0
  190. package/dist/test/git.test.js.map +1 -0
  191. package/dist/test/migrate-config.test.d.ts +1 -0
  192. package/dist/test/migrate-config.test.js +23 -0
  193. package/dist/test/migrate-config.test.js.map +1 -0
  194. package/dist/test/model-display-env.test.d.ts +1 -0
  195. package/dist/test/model-display-env.test.js +125 -0
  196. package/dist/test/model-display-env.test.js.map +1 -0
  197. package/dist/test/parser.test.d.ts +1 -0
  198. package/dist/test/parser.test.js +108 -0
  199. package/dist/test/parser.test.js.map +1 -0
  200. package/dist/test/provider-credentials.test.d.ts +1 -0
  201. package/dist/test/provider-credentials.test.js +62 -0
  202. package/dist/test/provider-credentials.test.js.map +1 -0
  203. package/dist/test/themes.test.d.ts +1 -0
  204. package/dist/test/themes.test.js +83 -0
  205. package/dist/test/themes.test.js.map +1 -0
  206. package/dist/test/third-party-api.test.d.ts +1 -0
  207. package/dist/test/third-party-api.test.js +99 -0
  208. package/dist/test/third-party-api.test.js.map +1 -0
  209. package/dist/tsconfig.tsbuildinfo +1 -0
  210. package/package.json +43 -0
  211. package/skills/pulse-configuration/SKILL.md +267 -0
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ // src/utils/cache.ts
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.TTLCache = void 0;
38
+ exports.getSessionCachePath = getSessionCachePath;
39
+ exports.loadSessionCache = loadSessionCache;
40
+ exports.saveSessionCache = saveSessionCache;
41
+ exports.removeSessionCacheKey = removeSessionCacheKey;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const os = __importStar(require("os"));
45
+ const logger_1 = require("./logger");
46
+ class TTLCache {
47
+ cache = new Map();
48
+ get(key) {
49
+ const entry = this.cache.get(key);
50
+ if (!entry)
51
+ return null;
52
+ if (Date.now() > entry.timestamp) {
53
+ this.cache.delete(key);
54
+ return null;
55
+ }
56
+ return entry.data;
57
+ }
58
+ set(key, value, ttl) {
59
+ this.cache.set(key, { data: value, timestamp: Date.now() + ttl });
60
+ }
61
+ has(key) {
62
+ const entry = this.cache.get(key);
63
+ if (!entry)
64
+ return false;
65
+ if (Date.now() > entry.timestamp) {
66
+ this.cache.delete(key);
67
+ return false;
68
+ }
69
+ return true;
70
+ }
71
+ clear() {
72
+ this.cache.clear();
73
+ }
74
+ }
75
+ exports.TTLCache = TTLCache;
76
+ function getSessionCachePath(sessionId) {
77
+ const cacheDir = path.join(os.homedir(), '.claude', 'pulse', 'cache');
78
+ return path.join(cacheDir, `${sessionId}.json`);
79
+ }
80
+ function loadSessionCache(sessionId, key) {
81
+ try {
82
+ const cachePath = getSessionCachePath(sessionId);
83
+ if (!fs.existsSync(cachePath))
84
+ return null;
85
+ const raw = fs.readFileSync(cachePath, 'utf8');
86
+ const cache = JSON.parse(raw);
87
+ if (cache[key] && Date.now() < cache[key].timestamp) {
88
+ return cache[key].data;
89
+ }
90
+ return null;
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ function saveSessionCache(sessionId, key, value, ttl) {
97
+ try {
98
+ const cachePath = getSessionCachePath(sessionId);
99
+ const cacheDir = path.dirname(cachePath);
100
+ fs.mkdirSync(cacheDir, { recursive: true });
101
+ let cache = {};
102
+ if (fs.existsSync(cachePath)) {
103
+ cache = JSON.parse(fs.readFileSync(cachePath, 'utf8'));
104
+ }
105
+ cache[key] = { data: value, timestamp: Date.now() + ttl };
106
+ fs.writeFileSync(cachePath, JSON.stringify(cache));
107
+ (0, logger_1.debug)(`Cache saved: ${sessionId}/${key}`);
108
+ }
109
+ catch (err) {
110
+ (0, logger_1.debug)('Cache write failed:', err);
111
+ }
112
+ }
113
+ function removeSessionCacheKey(sessionId, key) {
114
+ try {
115
+ const cachePath = getSessionCachePath(sessionId);
116
+ if (!fs.existsSync(cachePath))
117
+ return;
118
+ const raw = fs.readFileSync(cachePath, 'utf8');
119
+ const cache = JSON.parse(raw);
120
+ if (!(key in cache))
121
+ return;
122
+ delete cache[key];
123
+ fs.writeFileSync(cachePath, JSON.stringify(cache));
124
+ (0, logger_1.debug)(`Cache key removed: ${sessionId}/${key}`);
125
+ }
126
+ catch { /* ignore */ }
127
+ }
128
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/utils/cache.ts"],"names":[],"mappings":";AAAA,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CrB,kDAGC;AAED,4CAaC;AAED,4CAiBC;AAED,sDAWC;AA5FD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,qCAAiC;AAOjC,MAAa,QAAQ;IACX,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,GAAW;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AA9BD,4BA8BC;AAED,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,gBAAgB,CAAI,SAAiB,EAAE,GAAW;IAChE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAI,SAAiB,EAAE,GAAW,EAAE,KAAQ,EAAE,GAAW;IACvF,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5C,IAAI,KAAK,GAAwB,EAAE,CAAC;QACpC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,IAAA,cAAK,EAAC,gBAAgB,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAA,cAAK,EAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAgB,qBAAqB,CAAC,SAAiB,EAAE,GAAW;IAClE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO;QACtC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;YAAE,OAAO;QAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;QAClB,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,IAAA,cAAK,EAAC,sBAAsB,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type MergedEnvMap = Record<string, string>;
2
+ /** @internal Test hook: force loadMergedClaudeEnv to return a fixed map. */
3
+ export declare function __setTestEnvOverride(map: MergedEnvMap | null): void;
4
+ /**
5
+ * Merges top-level `env` from Claude Code settings layers (weak → strong).
6
+ * Order: ~/.claude/settings.json → ~/.claude/settings.local.json →
7
+ * {cwd}/.claude/settings.json → {cwd}/.claude/settings.local.json
8
+ */
9
+ export declare function loadMergedClaudeEnv(cwd: string): MergedEnvMap;
10
+ export declare function resolveEnvKey(key: string, merged: MergedEnvMap): string;
11
+ export declare function firstNonEmptyEnv(keys: string[], merged: MergedEnvMap): string;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ // src/utils/claude-settings-env.ts
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.__setTestEnvOverride = __setTestEnvOverride;
38
+ exports.loadMergedClaudeEnv = loadMergedClaudeEnv;
39
+ exports.resolveEnvKey = resolveEnvKey;
40
+ exports.firstNonEmptyEnv = firstNonEmptyEnv;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const os = __importStar(require("os"));
44
+ const logger_1 = require("./logger");
45
+ let _testEnvOverride = null;
46
+ /** @internal Test hook: force loadMergedClaudeEnv to return a fixed map. */
47
+ function __setTestEnvOverride(map) {
48
+ _testEnvOverride = map;
49
+ }
50
+ function readSettingsEnvFile(filePath) {
51
+ if (!fs.existsSync(filePath))
52
+ return {};
53
+ try {
54
+ const raw = fs.readFileSync(filePath, 'utf8');
55
+ const j = JSON.parse(raw);
56
+ if (!j.env || typeof j.env !== 'object' || Array.isArray(j.env))
57
+ return {};
58
+ const out = {};
59
+ for (const [k, v] of Object.entries(j.env)) {
60
+ if (typeof v === 'string' && v.length > 0)
61
+ out[k] = v;
62
+ }
63
+ return out;
64
+ }
65
+ catch (e) {
66
+ (0, logger_1.debug)('claude-settings-env: skip', filePath, e);
67
+ return {};
68
+ }
69
+ }
70
+ function mergeEnvLayers(low, high) {
71
+ return { ...low, ...high };
72
+ }
73
+ /**
74
+ * Merges top-level `env` from Claude Code settings layers (weak → strong).
75
+ * Order: ~/.claude/settings.json → ~/.claude/settings.local.json →
76
+ * {cwd}/.claude/settings.json → {cwd}/.claude/settings.local.json
77
+ */
78
+ function loadMergedClaudeEnv(cwd) {
79
+ if (_testEnvOverride !== null)
80
+ return _testEnvOverride;
81
+ const home = os.homedir();
82
+ const paths = [
83
+ path.join(home, '.claude', 'settings.json'),
84
+ path.join(home, '.claude', 'settings.local.json'),
85
+ path.join(cwd, '.claude', 'settings.json'),
86
+ path.join(cwd, '.claude', 'settings.local.json')
87
+ ];
88
+ let merged = {};
89
+ for (const p of paths) {
90
+ merged = mergeEnvLayers(merged, readSettingsEnvFile(p));
91
+ }
92
+ return merged;
93
+ }
94
+ function resolveEnvKey(key, merged) {
95
+ const fromProc = process.env[key];
96
+ if (fromProc !== undefined && fromProc !== '')
97
+ return fromProc;
98
+ return merged[key] ?? '';
99
+ }
100
+ function firstNonEmptyEnv(keys, merged) {
101
+ for (const k of keys) {
102
+ const v = resolveEnvKey(k, merged);
103
+ if (v)
104
+ return v;
105
+ }
106
+ return '';
107
+ }
108
+ //# sourceMappingURL=claude-settings-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-settings-env.js","sourceRoot":"","sources":["../../../src/utils/claude-settings-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const PULSE_DIR: string;
2
+ export declare const CONFIG_PATH: string;
3
+ export declare const CACHE_DIR: string;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // src/utils/constants.ts
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.CACHE_DIR = exports.CONFIG_PATH = exports.PULSE_DIR = void 0;
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ exports.PULSE_DIR = path.join(os.homedir(), '.claude', 'pulse');
41
+ exports.CONFIG_PATH = path.join(exports.PULSE_DIR, 'config.json');
42
+ exports.CACHE_DIR = path.join(exports.PULSE_DIR, 'cache');
43
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":";AAAA,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEzB,uCAAyB;AACzB,2CAA6B;AAEhB,QAAA,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACxD,QAAA,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAS,EAAE,aAAa,CAAC,CAAC;AAClD,QAAA,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAS,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PulseConfig } from '../types/pulse-config';
2
+ /** Private Use Areas and related planes likely to glyph as tofu without Nerd Font. */
3
+ export declare function containsPrivateUseOrProblematicPlanes(s: string): boolean;
4
+ /**
5
+ * After merging user config, drop Nerd/PUA fragments that break non–Nerd Font terminals.
6
+ */
7
+ export declare function sanitizePulseDisplayConfig(config: PulseConfig): void;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ // src/utils/display-sanitize.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.containsPrivateUseOrProblematicPlanes = containsPrivateUseOrProblematicPlanes;
5
+ exports.sanitizePulseDisplayConfig = sanitizePulseDisplayConfig;
6
+ const pulse_config_1 = require("../types/pulse-config");
7
+ /** Private Use Areas and related planes likely to glyph as tofu without Nerd Font. */
8
+ function containsPrivateUseOrProblematicPlanes(s) {
9
+ for (let i = 0; i < s.length;) {
10
+ const cp = s.codePointAt(i);
11
+ if (cp <= 0xffff) {
12
+ i += 1;
13
+ }
14
+ else {
15
+ i += 2;
16
+ }
17
+ if (cp >= 0xe000 && cp <= 0xf8ff)
18
+ return true;
19
+ if (cp >= 0xf0000 && cp <= 0xfffff)
20
+ return true;
21
+ if (cp >= 0x100000 && cp <= 0x10fffd)
22
+ return true;
23
+ }
24
+ return false;
25
+ }
26
+ /** Text iconSet: allow ASCII printable so bracket tags work everywhere. */
27
+ function isAsciiPrintableIcon(s) {
28
+ if (s === undefined || s === '')
29
+ return true;
30
+ return /^[\u0020-\u007E]+$/.test(s);
31
+ }
32
+ const MODULE_KEYS = [
33
+ 'model',
34
+ 'context',
35
+ 'git',
36
+ 'cost',
37
+ 'duration',
38
+ 'workspace',
39
+ 'turns',
40
+ 'cacheRatio',
41
+ 'rateLimits',
42
+ 'weeklyQuota',
43
+ 'mcpStatus',
44
+ 'thinking',
45
+ 'outputStyle',
46
+ 'thirdPartyApi',
47
+ 'accountUsage'
48
+ ];
49
+ /**
50
+ * After merging user config, drop Nerd/PUA fragments that break non–Nerd Font terminals.
51
+ */
52
+ function sanitizePulseDisplayConfig(config) {
53
+ if (containsPrivateUseOrProblematicPlanes(config.separator)) {
54
+ config.separator = pulse_config_1.DEFAULT_CONFIG.separator;
55
+ }
56
+ if (config.iconSet !== 'text')
57
+ return;
58
+ const defaults = pulse_config_1.DEFAULT_CONFIG.modules;
59
+ for (const key of MODULE_KEYS) {
60
+ const mod = config.modules[key];
61
+ if (!mod)
62
+ continue;
63
+ const d = defaults[key];
64
+ if (mod.icon !== undefined && !isAsciiPrintableIcon(mod.icon)) {
65
+ mod.icon = d.icon;
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=display-sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-sanitize.js","sourceRoot":"","sources":["../../../src/utils/display-sanitize.ts"],"names":[],"mappings":";AAAA,gCAAgC;;AAMhC,sFAaC;AA6BD,gEAgBC;AA7DD,wDAAuD;AAEvD,sFAAsF;AACtF,SAAgB,qCAAqC,CAAC,CAAS;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC;QAC7B,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;YACjB,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;QACD,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC;QAC9C,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,SAAS,oBAAoB,CAAC,CAAqB;IACjD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,OAAO;IACP,SAAS;IACT,KAAK;IACL,MAAM;IACN,UAAU;IACV,WAAW;IACX,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,WAAW;IACX,UAAU;IACV,aAAa;IACb,eAAe;IACf,cAAc;CACN,CAAC;AAEX;;GAEG;AACH,SAAgB,0BAA0B,CAAC,MAAmB;IAC5D,IAAI,qCAAqC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,SAAS,GAAG,6BAAc,CAAC,SAAS,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO;IAEtC,MAAM,QAAQ,GAAG,6BAAc,CAAC,OAAO,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAsB,CAAC;QACrD,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAsB,CAAC;QAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function fileExists(filePath: string): boolean;
2
+ export declare function readJsonFile<T>(filePath: string): T | null;
3
+ export declare function writeJsonFile(filePath: string, data: any): boolean;
4
+ export declare function getHomeDir(): string;
5
+ export declare function joinPath(...segments: string[]): string;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ // src/utils/fs.ts
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.fileExists = fileExists;
38
+ exports.readJsonFile = readJsonFile;
39
+ exports.writeJsonFile = writeJsonFile;
40
+ exports.getHomeDir = getHomeDir;
41
+ exports.joinPath = joinPath;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const os = __importStar(require("os"));
45
+ function fileExists(filePath) {
46
+ try {
47
+ return fs.existsSync(filePath);
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ function readJsonFile(filePath) {
54
+ try {
55
+ const raw = fs.readFileSync(filePath, 'utf8');
56
+ return JSON.parse(raw);
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ function writeJsonFile(filePath, data) {
63
+ try {
64
+ const dir = path.dirname(filePath);
65
+ fs.mkdirSync(dir, { recursive: true });
66
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ function getHomeDir() {
74
+ return os.homedir();
75
+ }
76
+ function joinPath(...segments) {
77
+ return path.join(...segments);
78
+ }
79
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/utils/fs.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMlB,gCAMC;AAED,oCAOC;AAED,sCASC;AAED,gCAEC;AAED,4BAEC;AAtCD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,SAAgB,UAAU,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAI,QAAgB;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,QAAgB,EAAE,IAAS;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,SAAgB,QAAQ,CAAC,GAAG,QAAkB;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface GitInfo {
2
+ branch: string | null;
3
+ ahead: number;
4
+ behind: number;
5
+ }
6
+ export declare function getGitInfo(cwd: string, timeout?: number): GitInfo;
7
+ export declare function isGitRepository(cwd: string): boolean;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ // src/utils/git.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.getGitInfo = getGitInfo;
5
+ exports.isGitRepository = isGitRepository;
6
+ const child_process_1 = require("child_process");
7
+ const logger_1 = require("./logger");
8
+ function getGitInfo(cwd, timeout = 200) {
9
+ try {
10
+ const branch = (0, child_process_1.execSync)('git branch --show-current', {
11
+ cwd,
12
+ timeout,
13
+ encoding: 'utf8',
14
+ stdio: ['pipe', 'pipe', 'pipe']
15
+ }).trim();
16
+ if (!branch) {
17
+ return { branch: null, ahead: 0, behind: 0 };
18
+ }
19
+ let ahead = 0;
20
+ let behind = 0;
21
+ try {
22
+ const revList = (0, child_process_1.execSync)('git rev-list --left-right --count @{upstream}...HEAD', {
23
+ cwd,
24
+ timeout,
25
+ encoding: 'utf8',
26
+ stdio: ['pipe', 'pipe', 'pipe']
27
+ });
28
+ const [behindStr, aheadStr] = revList.trim().split('\t');
29
+ behind = parseInt(behindStr, 10) || 0;
30
+ ahead = parseInt(aheadStr, 10) || 0;
31
+ }
32
+ catch {
33
+ // No upstream set, ignore
34
+ }
35
+ (0, logger_1.debug)(`Git branch: ${branch}, ahead: ${ahead}, behind: ${behind}`);
36
+ return { branch, ahead, behind };
37
+ }
38
+ catch (err) {
39
+ (0, logger_1.debug)('Git command failed:', err);
40
+ return { branch: null, ahead: 0, behind: 0 };
41
+ }
42
+ }
43
+ function isGitRepository(cwd) {
44
+ try {
45
+ (0, child_process_1.execSync)('git rev-parse --git-dir', {
46
+ cwd,
47
+ timeout: 100,
48
+ stdio: ['pipe', 'pipe', 'pipe']
49
+ });
50
+ return true;
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/utils/git.ts"],"names":[],"mappings":";AAAA,mBAAmB;;AAWnB,gCAoCC;AAED,0CAWC;AA1DD,iDAAyC;AACzC,qCAAiC;AAQjC,SAAgB,UAAU,CAAC,GAAW,EAAE,UAAkB,GAAG;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,2BAA2B,EAAE;YACnD,GAAG;YACH,OAAO;YACP,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAED,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,wBAAQ,EAAC,sDAAsD,EAAE;gBAC/E,GAAG;gBACH,OAAO;gBACP,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,IAAA,cAAK,EAAC,eAAe,MAAM,YAAY,KAAK,aAAa,MAAM,EAAE,CAAC,CAAC;QACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAA,cAAK,EAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,yBAAyB,EAAE;YAClC,GAAG;YACH,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function debug(...args: any[]): void;
2
+ export declare function measure<T>(label: string, fn: () => T): T;
3
+ export declare function measureAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
4
+ export interface TimingInfo {
5
+ [key: string]: number;
6
+ }
7
+ export declare function startTiming(label: string): void;
8
+ export declare function endTiming(label: string): number;
9
+ export declare function reportTimings(): void;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ // src/utils/logger.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.debug = debug;
5
+ exports.measure = measure;
6
+ exports.measureAsync = measureAsync;
7
+ exports.startTiming = startTiming;
8
+ exports.endTiming = endTiming;
9
+ exports.reportTimings = reportTimings;
10
+ const DEBUG = process.env.PULSE_DEBUG === 'true' || process.env.PULSE_DEBUG === '1';
11
+ function debug(...args) {
12
+ if (DEBUG) {
13
+ console.error('[pulse]', ...args);
14
+ }
15
+ }
16
+ function measure(label, fn) {
17
+ const start = performance.now();
18
+ const result = fn();
19
+ const elapsed = performance.now() - start;
20
+ debug(`${label}: ${elapsed.toFixed(2)}ms`);
21
+ if (elapsed > 100) {
22
+ console.error(`[pulse] WARNING: ${label} exceeded 100ms!`);
23
+ }
24
+ return result;
25
+ }
26
+ async function measureAsync(label, fn) {
27
+ const start = performance.now();
28
+ const result = await fn();
29
+ const elapsed = performance.now() - start;
30
+ debug(`${label}: ${elapsed.toFixed(2)}ms`);
31
+ if (elapsed > 100) {
32
+ console.error(`[pulse] WARNING: ${label} exceeded 100ms!`);
33
+ }
34
+ return result;
35
+ }
36
+ let timings = {};
37
+ function startTiming(label) {
38
+ timings[label] = performance.now();
39
+ }
40
+ function endTiming(label) {
41
+ const start = timings[label] || performance.now();
42
+ const elapsed = performance.now() - start;
43
+ debug(`${label}: ${elapsed.toFixed(2)}ms`);
44
+ delete timings[label];
45
+ return elapsed;
46
+ }
47
+ function reportTimings() {
48
+ if (!DEBUG)
49
+ return;
50
+ console.error('[pulse] Timing breakdown:');
51
+ console.error(JSON.stringify(timings, null, 2));
52
+ }
53
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":";AAAA,sBAAsB;;AAItB,sBAIC;AAED,0BASC;AAED,oCASC;AAQD,kCAEC;AAED,8BAMC;AAED,sCAIC;AApDD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC;AAEpF,SAAgB,KAAK,CAAC,GAAG,IAAW;IAClC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAgB,OAAO,CAAI,KAAa,EAAE,EAAW;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,EAAE,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC1C,KAAK,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,oBAAoB,KAAK,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,YAAY,CAAI,KAAa,EAAE,EAAoB;IACvE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC1C,KAAK,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,oBAAoB,KAAK,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAMD,IAAI,OAAO,GAAe,EAAE,CAAC;AAE7B,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,SAAgB,SAAS,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IAC1C,KAAK,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,aAAa;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ModelIdentity {
2
+ id?: string;
3
+ display_name?: string;
4
+ }
5
+ /**
6
+ * Status bar model label:
7
+ * 1. Explicit env override (PULSE_MODEL_DISPLAY / CLAUDE_CODE_MODEL_DISPLAY)
8
+ * 2. Tier mapping: stdin has "opus"/"sonnet"/"haiku" → ANTHROPIC_DEFAULT_*_MODEL
9
+ * 3. Stdin model name: already a custom model name → use directly
10
+ * 4. Global env fallback: CLAUDE_MODEL / ANTHROPIC_MODEL
11
+ */
12
+ export declare function resolveModelDisplayLabel(cwd: string, model: ModelIdentity | undefined): string | null;