ccnow 0.0.1

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 (137) hide show
  1. package/README.md +147 -0
  2. package/dist/cli-parser.d.ts +9 -0
  3. package/dist/cli-parser.js +50 -0
  4. package/dist/cli-parser.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +64 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +2 -0
  9. package/dist/config.js +34 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/dsl/context.d.ts +6 -0
  12. package/dist/dsl/context.js +23 -0
  13. package/dist/dsl/context.js.map +1 -0
  14. package/dist/dsl/cost.d.ts +3 -0
  15. package/dist/dsl/cost.js +6 -0
  16. package/dist/dsl/cost.js.map +1 -0
  17. package/dist/dsl/git.d.ts +6 -0
  18. package/dist/dsl/git.js +23 -0
  19. package/dist/dsl/git.js.map +1 -0
  20. package/dist/dsl/index.d.ts +7 -0
  21. package/dist/dsl/index.js +8 -0
  22. package/dist/dsl/index.js.map +1 -0
  23. package/dist/dsl/model.d.ts +3 -0
  24. package/dist/dsl/model.js +6 -0
  25. package/dist/dsl/model.js.map +1 -0
  26. package/dist/dsl/primitives.d.ts +14 -0
  27. package/dist/dsl/primitives.js +28 -0
  28. package/dist/dsl/primitives.js.map +1 -0
  29. package/dist/dsl/pwd.d.ts +7 -0
  30. package/dist/dsl/pwd.js +11 -0
  31. package/dist/dsl/pwd.js.map +1 -0
  32. package/dist/dsl/session.d.ts +5 -0
  33. package/dist/dsl/session.js +29 -0
  34. package/dist/dsl/session.js.map +1 -0
  35. package/dist/presets/default.d.ts +2 -0
  36. package/dist/presets/default.js +21 -0
  37. package/dist/presets/default.js.map +1 -0
  38. package/dist/presets/full.d.ts +2 -0
  39. package/dist/presets/full.js +32 -0
  40. package/dist/presets/full.js.map +1 -0
  41. package/dist/presets/index.d.ts +3 -0
  42. package/dist/presets/index.js +15 -0
  43. package/dist/presets/index.js.map +1 -0
  44. package/dist/presets/minimal.d.ts +2 -0
  45. package/dist/presets/minimal.js +13 -0
  46. package/dist/presets/minimal.js.map +1 -0
  47. package/dist/providers/context.d.ts +7 -0
  48. package/dist/providers/context.js +33 -0
  49. package/dist/providers/context.js.map +1 -0
  50. package/dist/providers/cost.d.ts +5 -0
  51. package/dist/providers/cost.js +16 -0
  52. package/dist/providers/cost.js.map +1 -0
  53. package/dist/providers/git.d.ts +8 -0
  54. package/dist/providers/git.js +40 -0
  55. package/dist/providers/git.js.map +1 -0
  56. package/dist/providers/index.d.ts +2 -0
  57. package/dist/providers/index.js +15 -0
  58. package/dist/providers/index.js.map +1 -0
  59. package/dist/providers/model.d.ts +5 -0
  60. package/dist/providers/model.js +9 -0
  61. package/dist/providers/model.js.map +1 -0
  62. package/dist/providers/pwd.d.ts +7 -0
  63. package/dist/providers/pwd.js +45 -0
  64. package/dist/providers/pwd.js.map +1 -0
  65. package/dist/providers/session.d.ts +7 -0
  66. package/dist/providers/session.js +24 -0
  67. package/dist/providers/session.js.map +1 -0
  68. package/dist/providers.d.ts +7 -0
  69. package/dist/providers.js +39 -0
  70. package/dist/providers.js.map +1 -0
  71. package/dist/registry.d.ts +6 -0
  72. package/dist/registry.js +10 -0
  73. package/dist/registry.js.map +1 -0
  74. package/dist/render.d.ts +3 -0
  75. package/dist/render.js +53 -0
  76. package/dist/render.js.map +1 -0
  77. package/dist/runner.d.ts +2 -0
  78. package/dist/runner.js +51 -0
  79. package/dist/runner.js.map +1 -0
  80. package/dist/segments/context.percent.d.ts +2 -0
  81. package/dist/segments/context.percent.js +11 -0
  82. package/dist/segments/context.percent.js.map +1 -0
  83. package/dist/segments/context.size.d.ts +2 -0
  84. package/dist/segments/context.size.js +9 -0
  85. package/dist/segments/context.size.js.map +1 -0
  86. package/dist/segments/context.tokens.d.ts +2 -0
  87. package/dist/segments/context.tokens.js +9 -0
  88. package/dist/segments/context.tokens.js.map +1 -0
  89. package/dist/segments/cost.usd.d.ts +2 -0
  90. package/dist/segments/cost.usd.js +9 -0
  91. package/dist/segments/cost.usd.js.map +1 -0
  92. package/dist/segments/git.branch.d.ts +2 -0
  93. package/dist/segments/git.branch.js +9 -0
  94. package/dist/segments/git.branch.js.map +1 -0
  95. package/dist/segments/git.deletions.d.ts +2 -0
  96. package/dist/segments/git.deletions.js +11 -0
  97. package/dist/segments/git.deletions.js.map +1 -0
  98. package/dist/segments/git.insertions.d.ts +2 -0
  99. package/dist/segments/git.insertions.js +11 -0
  100. package/dist/segments/git.insertions.js.map +1 -0
  101. package/dist/segments/index.d.ts +2 -0
  102. package/dist/segments/index.js +33 -0
  103. package/dist/segments/index.js.map +1 -0
  104. package/dist/segments/literal.d.ts +2 -0
  105. package/dist/segments/literal.js +10 -0
  106. package/dist/segments/literal.js.map +1 -0
  107. package/dist/segments/model.name.d.ts +2 -0
  108. package/dist/segments/model.name.js +9 -0
  109. package/dist/segments/model.name.js.map +1 -0
  110. package/dist/segments/pwd.name.d.ts +2 -0
  111. package/dist/segments/pwd.name.js +9 -0
  112. package/dist/segments/pwd.name.js.map +1 -0
  113. package/dist/segments/pwd.path.d.ts +2 -0
  114. package/dist/segments/pwd.path.js +9 -0
  115. package/dist/segments/pwd.path.js.map +1 -0
  116. package/dist/segments/pwd.smart.d.ts +2 -0
  117. package/dist/segments/pwd.smart.js +9 -0
  118. package/dist/segments/pwd.smart.js.map +1 -0
  119. package/dist/segments/session.duration.d.ts +2 -0
  120. package/dist/segments/session.duration.js +9 -0
  121. package/dist/segments/session.duration.js.map +1 -0
  122. package/dist/segments/session.lines-added.d.ts +2 -0
  123. package/dist/segments/session.lines-added.js +11 -0
  124. package/dist/segments/session.lines-added.js.map +1 -0
  125. package/dist/segments/session.lines-removed.d.ts +2 -0
  126. package/dist/segments/session.lines-removed.js +11 -0
  127. package/dist/segments/session.lines-removed.js.map +1 -0
  128. package/dist/session.d.ts +2 -0
  129. package/dist/session.js +18 -0
  130. package/dist/session.js.map +1 -0
  131. package/dist/style.d.ts +3 -0
  132. package/dist/style.js +72 -0
  133. package/dist/style.js.map +1 -0
  134. package/dist/types.d.ts +54 -0
  135. package/dist/types.js +2 -0
  136. package/dist/types.js.map +1 -0
  137. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full.js","sourceRoot":"","sources":["../../src/presets/full.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EACd,OAAO,EACP,SAAS,EACT,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,CAAC,MAAM,UAAU,GAAkB,UAAU,CAAC,GAAG,EAAE,CAAC;IACxD,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAC9D,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACzE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9C,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAClE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5B,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/C,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAC7C,CAAC;KACH,CAAC;IACF,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IACpE,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC3B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAC3C,YAAY,EAAE,CAAC,GAAG,EAAE,CAAC;QACnB,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;KACvB,CAAC;IACF,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAC3C,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAC3C,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5B,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACnD,mBAAmB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KACpD,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SegmentNode } from '../types.js';
2
+ export declare function getPreset(name: string): SegmentNode[] | undefined;
3
+ export declare function listPresets(): string[];
@@ -0,0 +1,15 @@
1
+ import { defaultPreset } from './default.js';
2
+ import { minimalPreset } from './minimal.js';
3
+ import { fullPreset } from './full.js';
4
+ const presets = new Map([
5
+ ['default', defaultPreset],
6
+ ['minimal', minimalPreset],
7
+ ['full', fullPreset],
8
+ ]);
9
+ export function getPreset(name) {
10
+ return presets.get(name);
11
+ }
12
+ export function listPresets() {
13
+ return [...presets.keys()];
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAwB;IAC7C,CAAC,SAAS,EAAE,aAAa,CAAC;IAC1B,CAAC,SAAS,EAAE,aAAa,CAAC;IAC1B,CAAC,MAAM,EAAE,UAAU,CAAC;CACrB,CAAC,CAAC;AAEH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { SegmentNode } from '../types.js';
2
+ export declare const minimalPreset: SegmentNode[];
@@ -0,0 +1,13 @@
1
+ import { StatusLine, GitGroup, GitBranch, ContextGroup, ContextTokens, Literal, ContextSize, } from '../dsl/index.js';
2
+ export const minimalPreset = StatusLine(() => [
3
+ { type: 'pwd.name', provider: 'pwd', style: { color: '39' } },
4
+ GitGroup({ prefix: ' | ', color: '240' })(() => [
5
+ GitBranch({ color: 'whiteBright', bold: true }),
6
+ ]),
7
+ ContextGroup({ prefix: ' | ', color: '240' })(() => [
8
+ ContextTokens({ color: 'white' }),
9
+ Literal({ text: '/' }),
10
+ ContextSize({ color: 'white' }),
11
+ ]),
12
+ ]);
13
+ //# sourceMappingURL=minimal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimal.js","sourceRoot":"","sources":["../../src/presets/minimal.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,aAAa,EACb,OAAO,EACP,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAGzB,MAAM,CAAC,MAAM,aAAa,GAAkB,UAAU,CAAC,GAAG,EAAE,CAAC;IAC3D,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAC7D,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9C,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;KAChD,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAClD,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;KAChC,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DataProvider } from '../types.js';
2
+ export interface ContextData {
3
+ tokens: string | null;
4
+ size: string | null;
5
+ percent: number | null;
6
+ }
7
+ export declare const contextProvider: DataProvider;
@@ -0,0 +1,33 @@
1
+ function formatTokens(total) {
2
+ if (total >= 1_000_000) {
3
+ const val = total / 1_000_000;
4
+ return val % 1 === 0 ? `${val}M` : `${val.toFixed(1)}M`;
5
+ }
6
+ if (total >= 1_000) {
7
+ return `${Math.round(total / 1_000)}K`;
8
+ }
9
+ return `${total}`;
10
+ }
11
+ export const contextProvider = {
12
+ name: 'context',
13
+ async resolve(session) {
14
+ const cw = session.context_window;
15
+ if (!cw) {
16
+ return { tokens: null, size: null, percent: null };
17
+ }
18
+ const usage = cw.current_usage;
19
+ let totalTokens = 0;
20
+ if (usage) {
21
+ totalTokens =
22
+ (usage.input_tokens ?? 0) +
23
+ (usage.cache_creation_input_tokens ?? 0) +
24
+ (usage.cache_read_input_tokens ?? 0);
25
+ }
26
+ return {
27
+ tokens: usage ? formatTokens(totalTokens) : null,
28
+ size: cw.context_window_size ? formatTokens(cw.context_window_size) : null,
29
+ percent: cw.used_percentage ?? null,
30
+ };
31
+ },
32
+ };
33
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/providers/context.ts"],"names":[],"mappings":"AAQA,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC;QAC9B,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,KAAK,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,IAAI,EAAE,SAAS;IACf,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;QAClC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC;QAC/B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,KAAK,EAAE,CAAC;YACV,WAAW;gBACT,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;oBACzB,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC;oBACxC,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;YAChD,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI;YAC1E,OAAO,EAAE,EAAE,CAAC,eAAe,IAAI,IAAI;SACpC,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DataProvider } from '../types.js';
2
+ export interface CostData {
3
+ usd: string | null;
4
+ }
5
+ export declare const costProvider: DataProvider;
@@ -0,0 +1,16 @@
1
+ function formatUsd(amount) {
2
+ return `$${amount.toFixed(2)}`;
3
+ }
4
+ export const costProvider = {
5
+ name: 'cost',
6
+ async resolve(session) {
7
+ const cost = session.cost;
8
+ if (!cost) {
9
+ return { usd: null };
10
+ }
11
+ return {
12
+ usd: formatUsd(cost.total_cost_usd),
13
+ };
14
+ },
15
+ };
16
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/providers/cost.ts"],"names":[],"mappings":"AAMA,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,MAAM;IACZ,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACvB,CAAC;QAED,OAAO;YACL,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;SACpC,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { DataProvider } from '../types.js';
2
+ export interface GitData {
3
+ branch: string | null;
4
+ insertions: number | null;
5
+ deletions: number | null;
6
+ }
7
+ export declare function gitAvailable(cwd: string): Promise<boolean>;
8
+ export declare const gitProvider: DataProvider;
@@ -0,0 +1,40 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const execFileAsync = promisify(execFile);
4
+ async function exec(cmd, args, cwd) {
5
+ try {
6
+ const { stdout } = await execFileAsync(cmd, args, { cwd, timeout: 5000 });
7
+ return stdout.trim();
8
+ }
9
+ catch {
10
+ return '';
11
+ }
12
+ }
13
+ export async function gitAvailable(cwd) {
14
+ const result = await exec('git', ['-C', cwd, 'rev-parse', '--git-dir'], cwd);
15
+ return result !== '';
16
+ }
17
+ export const gitProvider = {
18
+ name: 'git',
19
+ async resolve(session) {
20
+ const cwd = session.cwd;
21
+ const isGit = await gitAvailable(cwd);
22
+ if (!isGit) {
23
+ return { branch: null, insertions: null, deletions: null };
24
+ }
25
+ const branch = (await exec('git', ['branch', '--show-current'], cwd)) || null;
26
+ const diffstat = await exec('git', ['diff', '--shortstat', 'HEAD'], cwd);
27
+ let insertions = null;
28
+ let deletions = null;
29
+ if (diffstat) {
30
+ const insMatch = diffstat.match(/(\d+) insertion/);
31
+ const delMatch = diffstat.match(/(\d+) deletion/);
32
+ if (insMatch)
33
+ insertions = parseInt(insMatch[1], 10);
34
+ if (delMatch)
35
+ deletions = parseInt(delMatch[1], 10);
36
+ }
37
+ return { branch, insertions, deletions };
38
+ },
39
+ };
40
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/providers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7E,OAAO,MAAM,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,KAAK;IACX,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7D,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;QAE9E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAClD,IAAI,QAAQ;gBAAE,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrD,IAAI,QAAQ;gBAAE,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC3C,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ProviderRegistry } from '../providers.js';
2
+ export declare function registerBuiltinProviders(registry: ProviderRegistry): void;
@@ -0,0 +1,15 @@
1
+ import { pwdProvider } from './pwd.js';
2
+ import { gitProvider } from './git.js';
3
+ import { contextProvider } from './context.js';
4
+ import { modelProvider } from './model.js';
5
+ import { costProvider } from './cost.js';
6
+ import { sessionProvider } from './session.js';
7
+ export function registerBuiltinProviders(registry) {
8
+ registry.register(pwdProvider);
9
+ registry.register(gitProvider);
10
+ registry.register(contextProvider);
11
+ registry.register(modelProvider);
12
+ registry.register(costProvider);
13
+ registry.register(sessionProvider);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,UAAU,wBAAwB,CAAC,QAA0B;IACjE,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DataProvider } from '../types.js';
2
+ export interface ModelData {
3
+ name: string | null;
4
+ }
5
+ export declare const modelProvider: DataProvider;
@@ -0,0 +1,9 @@
1
+ export const modelProvider = {
2
+ name: 'model',
3
+ async resolve(session) {
4
+ return {
5
+ name: session.model?.display_name ?? null,
6
+ };
7
+ },
8
+ };
9
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/providers/model.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,IAAI,EAAE,OAAO;IACb,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,YAAY,IAAI,IAAI;SAC1C,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DataProvider } from '../types.js';
2
+ export interface PwdData {
3
+ name: string;
4
+ path: string;
5
+ smart: string;
6
+ }
7
+ export declare const pwdProvider: DataProvider;
@@ -0,0 +1,45 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ const MAX_ABBREVIATED = 2;
4
+ function smartPrefix(cwd) {
5
+ if (cwd === '/')
6
+ return '';
7
+ const home = os.homedir();
8
+ let p = cwd;
9
+ // Replace home dir with ~
10
+ if (p.startsWith(home)) {
11
+ p = '~' + p.slice(home.length);
12
+ }
13
+ const parts = p.split('/');
14
+ // 2 segments (e.g. /tmp or ~/foo) — just the root prefix with trailing /
15
+ if (parts.length <= 2) {
16
+ const root = parts[0] || '/';
17
+ return root.endsWith('/') ? root : root + '/';
18
+ }
19
+ const first = parts[0]; // '' for absolute, '~' for home-relative
20
+ const middle = parts.slice(1, -1);
21
+ // 3 segments (e.g. ~/Projects/ccnow) — keep prefix as-is with trailing /
22
+ if (parts.length <= 3)
23
+ return first + '/' + middle.join('/') + '/';
24
+ // Abbreviate up to MAX_ABBREVIATED middle segments, then ellipsis if more remain
25
+ if (middle.length <= MAX_ABBREVIATED) {
26
+ const abbreviated = middle.map((part) => part[0] ?? '');
27
+ return [first, ...abbreviated, ''].join('/');
28
+ }
29
+ const abbreviated = middle.slice(0, MAX_ABBREVIATED).map((part) => part[0] ?? '');
30
+ return [first, ...abbreviated, '\u2026', ''].join('/');
31
+ }
32
+ export const pwdProvider = {
33
+ name: 'pwd',
34
+ async resolve(session) {
35
+ const cwd = session.cwd;
36
+ const name = cwd === '/' ? '/' : path.basename(cwd);
37
+ const fullPrefix = cwd === '/' ? '' : path.dirname(cwd) + '/';
38
+ return {
39
+ name,
40
+ path: fullPrefix,
41
+ smart: smartPrefix(cwd),
42
+ };
43
+ },
44
+ };
45
+ //# sourceMappingURL=pwd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pwd.js","sourceRoot":"","sources":["../../src/providers/pwd.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AASzB,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,GAAG,CAAC;IAEZ,0BAA0B;IAC1B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,yEAAyE;IACzE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yCAAyC;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElC,yEAAyE;IACzE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAEnE,iFAAiF;IACjF,IAAI,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,EAAE,GAAG,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,OAAO,CAAC,KAAK,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,IAAI,EAAE,KAAK;IACX,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAE9D,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC;SACxB,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DataProvider } from '../types.js';
2
+ export interface SessionMetrics {
3
+ duration: string | null;
4
+ linesAdded: number | null;
5
+ linesRemoved: number | null;
6
+ }
7
+ export declare const sessionProvider: DataProvider;
@@ -0,0 +1,24 @@
1
+ function formatDuration(ms) {
2
+ const totalSec = Math.floor(ms / 1000);
3
+ const hours = Math.floor(totalSec / 3600);
4
+ const mins = Math.floor((totalSec % 3600) / 60);
5
+ if (hours > 0) {
6
+ return `${hours}h ${mins}m`;
7
+ }
8
+ return `${mins}m`;
9
+ }
10
+ export const sessionProvider = {
11
+ name: 'session',
12
+ async resolve(session) {
13
+ const cost = session.cost;
14
+ if (!cost) {
15
+ return { duration: null, linesAdded: null, linesRemoved: null };
16
+ }
17
+ return {
18
+ duration: formatDuration(cost.total_duration_ms),
19
+ linesAdded: cost.total_lines_added ?? null,
20
+ linesRemoved: cost.total_lines_removed ?? null,
21
+ };
22
+ },
23
+ };
24
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/providers/session.ts"],"names":[],"mappings":"AAQA,SAAS,cAAc,CAAC,EAAU;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC;IAC9B,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAiB;IAC3C,IAAI,EAAE,SAAS;IACf,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAClE,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC;YAChD,UAAU,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI;YAC1C,YAAY,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI;SAC/C,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DataProvider, SessionData, SegmentNode } from './types.js';
2
+ export declare class ProviderRegistry {
3
+ private providers;
4
+ register(provider: DataProvider): void;
5
+ collectProviderNames(tree: SegmentNode[]): Set<string>;
6
+ resolveAll(names: string[], session: SessionData): Promise<Map<string, unknown>>;
7
+ }
@@ -0,0 +1,39 @@
1
+ export class ProviderRegistry {
2
+ providers = new Map();
3
+ register(provider) {
4
+ this.providers.set(provider.name, provider);
5
+ }
6
+ collectProviderNames(tree) {
7
+ const names = new Set();
8
+ const walk = (nodes) => {
9
+ for (const node of nodes) {
10
+ // Skip statically disabled nodes (and their children)
11
+ if (node.enabled === false)
12
+ continue;
13
+ if (node.provider)
14
+ names.add(node.provider);
15
+ if (node.children)
16
+ walk(node.children);
17
+ }
18
+ };
19
+ walk(tree);
20
+ return names;
21
+ }
22
+ async resolveAll(names, session) {
23
+ const results = new Map();
24
+ const entries = names
25
+ .map((name) => ({ name, provider: this.providers.get(name) }))
26
+ .filter((e) => e.provider !== undefined);
27
+ const settled = await Promise.allSettled(entries.map(async ({ name, provider }) => {
28
+ const data = await provider.resolve(session);
29
+ return { name, data };
30
+ }));
31
+ for (const result of settled) {
32
+ if (result.status === 'fulfilled') {
33
+ results.set(result.value.name, result.value.data);
34
+ }
35
+ }
36
+ return results;
37
+ }
38
+ }
39
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IACnB,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEpD,QAAQ,CAAC,QAAsB;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,oBAAoB,CAAC,IAAmB;QACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,MAAM,IAAI,GAAG,CAAC,KAAoB,EAAE,EAAE;YACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,sDAAsD;gBACtD,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;oBAAE,SAAS;gBACrC,IAAI,IAAI,CAAC,QAAQ;oBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,IAAI,CAAC,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe,EAAE,OAAoB;QACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;QAE3C,MAAM,OAAO,GAAG,KAAK;aAClB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC7D,MAAM,CAAC,CAAC,CAAC,EAAiD,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QAE1F,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC,CAAC,CACH,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { Segment } from './types.js';
2
+ export declare class SegmentRegistry {
3
+ private segments;
4
+ register(segment: Segment): void;
5
+ get(name: string): Segment | undefined;
6
+ }
@@ -0,0 +1,10 @@
1
+ export class SegmentRegistry {
2
+ segments = new Map();
3
+ register(segment) {
4
+ this.segments.set(segment.name, segment);
5
+ }
6
+ get(name) {
7
+ return this.segments.get(name);
8
+ }
9
+ }
10
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE9C,QAAQ,CAAC,OAAgB;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { SegmentNode, SessionData } from './types.js';
2
+ import { SegmentRegistry } from './registry.js';
3
+ export declare function renderTree(tree: SegmentNode[], registry: SegmentRegistry, session: SessionData, providerData: Map<string, unknown>): string;
package/dist/render.js ADDED
@@ -0,0 +1,53 @@
1
+ import { applyStyle } from './style.js';
2
+ function isEnabled(node, session) {
3
+ if (node.enabled === undefined)
4
+ return true;
5
+ if (typeof node.enabled === 'boolean')
6
+ return node.enabled;
7
+ try {
8
+ return node.enabled(session);
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ }
14
+ function renderNode(node, registry, session, providerData) {
15
+ if (!isEnabled(node, session))
16
+ return null;
17
+ // Composite node: render children
18
+ if (node.children) {
19
+ const parts = [];
20
+ for (const child of node.children) {
21
+ const rendered = renderNode(child, registry, session, providerData);
22
+ if (rendered !== null)
23
+ parts.push(rendered);
24
+ }
25
+ if (parts.length === 0)
26
+ return null;
27
+ const joined = parts.join('');
28
+ return applyStyle(joined, node.style);
29
+ }
30
+ // Atomic node: look up segment and render
31
+ const segment = registry.get(node.type);
32
+ if (!segment)
33
+ return null;
34
+ const context = {
35
+ session,
36
+ provider: node.provider ? providerData.get(node.provider) : undefined,
37
+ props: node.props,
38
+ };
39
+ const value = segment.render(context);
40
+ if (value === null)
41
+ return null;
42
+ return applyStyle(value, node.style);
43
+ }
44
+ export function renderTree(tree, registry, session, providerData) {
45
+ const parts = [];
46
+ for (const node of tree) {
47
+ const rendered = renderNode(node, registry, session, providerData);
48
+ if (rendered !== null)
49
+ parts.push(rendered);
50
+ }
51
+ return parts.join('');
52
+ }
53
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,SAAS,SAAS,CAAC,IAAiB,EAAE,OAAoB;IACxD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,IAAiB,EACjB,QAAyB,EACzB,OAAoB,EACpB,YAAkC;IAElC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,kCAAkC;IAClC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;YACpE,IAAI,QAAQ,KAAK,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,0CAA0C;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,OAAO,GAAG;QACd,OAAO;QACP,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,IAAmB,EACnB,QAAyB,EACzB,OAAoB,EACpB,YAAkC;IAElC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,QAAQ,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CliArgs } from './cli-parser.js';
2
+ export declare function run(args: CliArgs, stdin: string): Promise<string>;
package/dist/runner.js ADDED
@@ -0,0 +1,51 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { parseSession } from './session.js';
3
+ import { parseConfig } from './config.js';
4
+ import { SegmentRegistry } from './registry.js';
5
+ import { ProviderRegistry } from './providers.js';
6
+ import { registerBuiltinSegments } from './segments/index.js';
7
+ import { registerBuiltinProviders } from './providers/index.js';
8
+ import { renderTree } from './render.js';
9
+ import { getPreset } from './presets/index.js';
10
+ import { setColorLevel } from './style.js';
11
+ export async function run(args, stdin) {
12
+ // Parse session
13
+ const session = parseSession(stdin);
14
+ if (!session)
15
+ return '';
16
+ // Set color level based on format
17
+ setColorLevel(args.format === 'plain' ? 0 : 1);
18
+ try {
19
+ // Build registries
20
+ const segmentRegistry = new SegmentRegistry();
21
+ registerBuiltinSegments(segmentRegistry);
22
+ const providerRegistry = new ProviderRegistry();
23
+ registerBuiltinProviders(providerRegistry);
24
+ // Resolve render tree: config file > preset
25
+ let tree;
26
+ if (args.config) {
27
+ try {
28
+ const configJson = JSON.parse(readFileSync(args.config, 'utf-8'));
29
+ const configTree = parseConfig(configJson);
30
+ tree =
31
+ configTree.length > 0 ? configTree : (getPreset(args.preset) ?? getPreset('default'));
32
+ }
33
+ catch (err) {
34
+ process.stderr.write(`ccnow: failed to load config: ${err}\n`);
35
+ tree = getPreset(args.preset) ?? getPreset('default');
36
+ }
37
+ }
38
+ else {
39
+ tree = getPreset(args.preset) ?? getPreset('default');
40
+ }
41
+ // Resolve providers
42
+ const providerNames = providerRegistry.collectProviderNames(tree);
43
+ const providerData = await providerRegistry.resolveAll([...providerNames], session);
44
+ // Render
45
+ return renderTree(tree, segmentRegistry, session, providerData);
46
+ }
47
+ finally {
48
+ setColorLevel(1);
49
+ }
50
+ }
51
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAa,EAAE,KAAa;IACpD,gBAAgB;IAChB,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,kCAAkC;IAClC,aAAa,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,mBAAmB;QACnB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,uBAAuB,CAAC,eAAe,CAAC,CAAC;QAEzC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAChD,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QAE3C,4CAA4C;QAC5C,IAAI,IAAmB,CAAC;QAExB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAClE,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;gBAC3C,IAAI;oBACF,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,SAAS,CAAE,CAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,IAAI,CAAC,CAAC;gBAC/D,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,SAAS,CAAE,CAAC;YACzD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,SAAS,CAAE,CAAC;QACzD,CAAC;QAED,oBAAoB;QACpB,MAAM,aAAa,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;QAEpF,SAAS;QACT,OAAO,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,aAAa,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Segment } from '../types.js';
2
+ export declare const contextPercentSegment: Segment;
@@ -0,0 +1,11 @@
1
+ export const contextPercentSegment = {
2
+ name: 'context.percent',
3
+ provider: 'context',
4
+ render(context) {
5
+ const data = context.provider;
6
+ if (data?.percent == null)
7
+ return null;
8
+ return `${data.percent}%`;
9
+ },
10
+ };
11
+ //# sourceMappingURL=context.percent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.percent.js","sourceRoot":"","sources":["../../src/segments/context.percent.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,qBAAqB,GAAY;IAC5C,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE,SAAS;IACnB,MAAM,CAAC,OAAuB;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAmC,CAAC;QACzD,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC;IAC5B,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Segment } from '../types.js';
2
+ export declare const contextSizeSegment: Segment;
@@ -0,0 +1,9 @@
1
+ export const contextSizeSegment = {
2
+ name: 'context.size',
3
+ provider: 'context',
4
+ render(context) {
5
+ const data = context.provider;
6
+ return data?.size ?? null;
7
+ },
8
+ };
9
+ //# sourceMappingURL=context.size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.size.js","sourceRoot":"","sources":["../../src/segments/context.size.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,kBAAkB,GAAY;IACzC,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,SAAS;IACnB,MAAM,CAAC,OAAuB;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAmC,CAAC;QACzD,OAAO,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;IAC5B,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Segment } from '../types.js';
2
+ export declare const contextTokensSegment: Segment;
@@ -0,0 +1,9 @@
1
+ export const contextTokensSegment = {
2
+ name: 'context.tokens',
3
+ provider: 'context',
4
+ render(context) {
5
+ const data = context.provider;
6
+ return data?.tokens ?? null;
7
+ },
8
+ };
9
+ //# sourceMappingURL=context.tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.tokens.js","sourceRoot":"","sources":["../../src/segments/context.tokens.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAY;IAC3C,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,SAAS;IACnB,MAAM,CAAC,OAAuB;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAmC,CAAC;QACzD,OAAO,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;IAC9B,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Segment } from '../types.js';
2
+ export declare const costUsdSegment: Segment;
@@ -0,0 +1,9 @@
1
+ export const costUsdSegment = {
2
+ name: 'cost.usd',
3
+ provider: 'cost',
4
+ render(context) {
5
+ const data = context.provider;
6
+ return data?.usd ?? null;
7
+ },
8
+ };
9
+ //# sourceMappingURL=cost.usd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.usd.js","sourceRoot":"","sources":["../../src/segments/cost.usd.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,MAAM;IAChB,MAAM,CAAC,OAAuB;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAgC,CAAC;QACtD,OAAO,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC;IAC3B,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Segment } from '../types.js';
2
+ export declare const gitBranchSegment: Segment;