ai-mind-map 1.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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +554 -0
  3. package/dist/change-tracker/change-log.d.ts +160 -0
  4. package/dist/change-tracker/change-log.d.ts.map +1 -0
  5. package/dist/change-tracker/change-log.js +507 -0
  6. package/dist/change-tracker/change-log.js.map +1 -0
  7. package/dist/change-tracker/diff-engine.d.ts +149 -0
  8. package/dist/change-tracker/diff-engine.d.ts.map +1 -0
  9. package/dist/change-tracker/diff-engine.js +530 -0
  10. package/dist/change-tracker/diff-engine.js.map +1 -0
  11. package/dist/change-tracker/watcher.d.ts +137 -0
  12. package/dist/change-tracker/watcher.d.ts.map +1 -0
  13. package/dist/change-tracker/watcher.js +300 -0
  14. package/dist/change-tracker/watcher.js.map +1 -0
  15. package/dist/cli.d.ts +20 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +937 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +38 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +222 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/context/compressor.d.ts +49 -0
  24. package/dist/context/compressor.d.ts.map +1 -0
  25. package/dist/context/compressor.js +769 -0
  26. package/dist/context/compressor.js.map +1 -0
  27. package/dist/context/progressive-disclosure.d.ts +71 -0
  28. package/dist/context/progressive-disclosure.d.ts.map +1 -0
  29. package/dist/context/progressive-disclosure.js +470 -0
  30. package/dist/context/progressive-disclosure.js.map +1 -0
  31. package/dist/context/token-budget.d.ts +121 -0
  32. package/dist/context/token-budget.d.ts.map +1 -0
  33. package/dist/context/token-budget.js +282 -0
  34. package/dist/context/token-budget.js.map +1 -0
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +944 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/install.d.ts +66 -0
  40. package/dist/install.d.ts.map +1 -0
  41. package/dist/install.js +946 -0
  42. package/dist/install.js.map +1 -0
  43. package/dist/knowledge-graph/architecture.d.ts +213 -0
  44. package/dist/knowledge-graph/architecture.d.ts.map +1 -0
  45. package/dist/knowledge-graph/architecture.js +585 -0
  46. package/dist/knowledge-graph/architecture.js.map +1 -0
  47. package/dist/knowledge-graph/cypher.d.ts +113 -0
  48. package/dist/knowledge-graph/cypher.d.ts.map +1 -0
  49. package/dist/knowledge-graph/cypher.js +1051 -0
  50. package/dist/knowledge-graph/cypher.js.map +1 -0
  51. package/dist/knowledge-graph/dead-code.d.ts +121 -0
  52. package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
  53. package/dist/knowledge-graph/dead-code.js +331 -0
  54. package/dist/knowledge-graph/dead-code.js.map +1 -0
  55. package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
  56. package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
  57. package/dist/knowledge-graph/flow-analyzer.js +739 -0
  58. package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
  59. package/dist/knowledge-graph/graph.d.ts +291 -0
  60. package/dist/knowledge-graph/graph.d.ts.map +1 -0
  61. package/dist/knowledge-graph/graph.js +978 -0
  62. package/dist/knowledge-graph/graph.js.map +1 -0
  63. package/dist/knowledge-graph/index.d.ts +17 -0
  64. package/dist/knowledge-graph/index.d.ts.map +1 -0
  65. package/dist/knowledge-graph/index.js +14 -0
  66. package/dist/knowledge-graph/index.js.map +1 -0
  67. package/dist/knowledge-graph/indexer.d.ts +112 -0
  68. package/dist/knowledge-graph/indexer.d.ts.map +1 -0
  69. package/dist/knowledge-graph/indexer.js +506 -0
  70. package/dist/knowledge-graph/indexer.js.map +1 -0
  71. package/dist/knowledge-graph/pagerank.d.ts +141 -0
  72. package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
  73. package/dist/knowledge-graph/pagerank.js +493 -0
  74. package/dist/knowledge-graph/pagerank.js.map +1 -0
  75. package/dist/knowledge-graph/parser.d.ts +55 -0
  76. package/dist/knowledge-graph/parser.d.ts.map +1 -0
  77. package/dist/knowledge-graph/parser.js +1090 -0
  78. package/dist/knowledge-graph/parser.js.map +1 -0
  79. package/dist/knowledge-graph/snapshot.d.ts +107 -0
  80. package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
  81. package/dist/knowledge-graph/snapshot.js +435 -0
  82. package/dist/knowledge-graph/snapshot.js.map +1 -0
  83. package/dist/memory/decision-log.d.ts +151 -0
  84. package/dist/memory/decision-log.d.ts.map +1 -0
  85. package/dist/memory/decision-log.js +482 -0
  86. package/dist/memory/decision-log.js.map +1 -0
  87. package/dist/memory/persistent-memory.d.ts +182 -0
  88. package/dist/memory/persistent-memory.d.ts.map +1 -0
  89. package/dist/memory/persistent-memory.js +579 -0
  90. package/dist/memory/persistent-memory.js.map +1 -0
  91. package/dist/memory/session-memory.d.ts +165 -0
  92. package/dist/memory/session-memory.d.ts.map +1 -0
  93. package/dist/memory/session-memory.js +382 -0
  94. package/dist/memory/session-memory.js.map +1 -0
  95. package/dist/stress-test.d.ts +10 -0
  96. package/dist/stress-test.d.ts.map +1 -0
  97. package/dist/stress-test.js +258 -0
  98. package/dist/stress-test.js.map +1 -0
  99. package/dist/tools/advanced-tools.d.ts +32 -0
  100. package/dist/tools/advanced-tools.d.ts.map +1 -0
  101. package/dist/tools/advanced-tools.js +480 -0
  102. package/dist/tools/advanced-tools.js.map +1 -0
  103. package/dist/tools/change-tools.d.ts +76 -0
  104. package/dist/tools/change-tools.d.ts.map +1 -0
  105. package/dist/tools/change-tools.js +93 -0
  106. package/dist/tools/change-tools.js.map +1 -0
  107. package/dist/tools/context-tools.d.ts +68 -0
  108. package/dist/tools/context-tools.d.ts.map +1 -0
  109. package/dist/tools/context-tools.js +141 -0
  110. package/dist/tools/context-tools.js.map +1 -0
  111. package/dist/tools/debug-tools.d.ts +25 -0
  112. package/dist/tools/debug-tools.d.ts.map +1 -0
  113. package/dist/tools/debug-tools.js +286 -0
  114. package/dist/tools/debug-tools.js.map +1 -0
  115. package/dist/tools/evolving-tools.d.ts +23 -0
  116. package/dist/tools/evolving-tools.d.ts.map +1 -0
  117. package/dist/tools/evolving-tools.js +207 -0
  118. package/dist/tools/evolving-tools.js.map +1 -0
  119. package/dist/tools/flow-tools.d.ts +24 -0
  120. package/dist/tools/flow-tools.d.ts.map +1 -0
  121. package/dist/tools/flow-tools.js +265 -0
  122. package/dist/tools/flow-tools.js.map +1 -0
  123. package/dist/tools/graph-tools.d.ts +71 -0
  124. package/dist/tools/graph-tools.d.ts.map +1 -0
  125. package/dist/tools/graph-tools.js +165 -0
  126. package/dist/tools/graph-tools.js.map +1 -0
  127. package/dist/tools/memory-tools.d.ts +62 -0
  128. package/dist/tools/memory-tools.d.ts.map +1 -0
  129. package/dist/tools/memory-tools.js +195 -0
  130. package/dist/tools/memory-tools.js.map +1 -0
  131. package/dist/tools/smart-tools.d.ts +23 -0
  132. package/dist/tools/smart-tools.d.ts.map +1 -0
  133. package/dist/tools/smart-tools.js +482 -0
  134. package/dist/tools/smart-tools.js.map +1 -0
  135. package/dist/tools/snapshot-tools.d.ts +19 -0
  136. package/dist/tools/snapshot-tools.d.ts.map +1 -0
  137. package/dist/tools/snapshot-tools.js +149 -0
  138. package/dist/tools/snapshot-tools.js.map +1 -0
  139. package/dist/types.d.ts +181 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +45 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/utils/logger.d.ts +59 -0
  144. package/dist/utils/logger.d.ts.map +1 -0
  145. package/dist/utils/logger.js +142 -0
  146. package/dist/utils/logger.js.map +1 -0
  147. package/dist/utils/token-counter.d.ts +51 -0
  148. package/dist/utils/token-counter.d.ts.map +1 -0
  149. package/dist/utils/token-counter.js +181 -0
  150. package/dist/utils/token-counter.js.map +1 -0
  151. package/install.ps1 +321 -0
  152. package/install.sh +345 -0
  153. package/package.json +94 -0
  154. package/setup.bat +62 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * AI Mind Map — Token Budget Manager
3
+ *
4
+ * Explicit token budget management inspired by Aider's `--map-tokens`
5
+ * approach. Provides per-component budgets, enforcement, smart
6
+ * truncation at logical boundaries, dynamic reallocation, and
7
+ * formatted budget reports.
8
+ */
9
+ import type { TokenBudget } from '../types.js';
10
+ /** Label for a budget component (matches the keys of {@link TokenBudget}). */
11
+ export type BudgetComponent = 'graphResults' | 'changeSummary' | 'memoryRetrieval' | 'fileContent';
12
+ /** Snapshot of a single component's budget state. */
13
+ export interface ComponentBudgetState {
14
+ component: BudgetComponent;
15
+ label: string;
16
+ used: number;
17
+ budget: number;
18
+ remaining: number;
19
+ }
20
+ /** Full budget report across all components. */
21
+ export interface BudgetReport {
22
+ components: ComponentBudgetState[];
23
+ totalUsed: number;
24
+ totalBudget: number;
25
+ totalRemaining: number;
26
+ /** Estimated savings vs reading entire files naively. */
27
+ savingsPercent: number;
28
+ }
29
+ /**
30
+ * Manages token budgets across all context components.
31
+ *
32
+ * Usage:
33
+ * ```ts
34
+ * const mgr = new TokenBudgetManager(config.tokenBudgets);
35
+ * const text = mgr.enforceComponentBudget('graphResults', longText);
36
+ * mgr.recordUsage('graphResults', text);
37
+ * const report = mgr.generateReport();
38
+ * ```
39
+ */
40
+ export declare class TokenBudgetManager {
41
+ /** Per-component budgets (immutable originals). */
42
+ private readonly baseBudgets;
43
+ /** Current effective budgets (may be reallocated). */
44
+ private readonly effectiveBudgets;
45
+ /** Running token counts per component. */
46
+ private readonly usage;
47
+ /** Total budget across all components. */
48
+ private readonly totalBudget;
49
+ /** Estimated naive cost (for savings calculation). */
50
+ private naiveCost;
51
+ constructor(budgets: TokenBudget);
52
+ /** Get the current effective budget for a component. */
53
+ getBudget(component: BudgetComponent): number;
54
+ /** Get current token usage for a component. */
55
+ getUsage(component: BudgetComponent): number;
56
+ /** Get remaining tokens for a component. */
57
+ getRemaining(component: BudgetComponent): number;
58
+ /** Get total tokens used across all components. */
59
+ getTotalUsed(): number;
60
+ /** Get total tokens remaining across all components. */
61
+ getTotalRemaining(): number;
62
+ /** Check whether the total budget has been exceeded. */
63
+ isOverBudget(): boolean;
64
+ /**
65
+ * Record that `tokenCount` tokens were consumed by `component`.
66
+ *
67
+ * @param component - The budget component.
68
+ * @param text - The text whose tokens to count (or supply a number).
69
+ */
70
+ recordUsage(component: BudgetComponent, text: string | number): void;
71
+ /**
72
+ * Record the "naive" cost — the estimated tokens if entire files were
73
+ * sent without compression. Used for savings calculation.
74
+ */
75
+ recordNaiveCost(tokens: number): void;
76
+ /** Reset all usage counters (e.g., for a new request). */
77
+ resetUsage(): void;
78
+ /**
79
+ * Enforce the budget for a component by truncating content if necessary.
80
+ *
81
+ * @param component - The budget component.
82
+ * @param text - The input text.
83
+ * @returns The (possibly truncated) text that fits within the budget.
84
+ */
85
+ enforceComponentBudget(component: BudgetComponent, text: string): string;
86
+ /**
87
+ * Enforce the total context budget on a final assembled context string.
88
+ *
89
+ * @param text - The assembled context.
90
+ * @returns The (possibly truncated) text.
91
+ */
92
+ enforceTotalBudget(text: string): string;
93
+ /**
94
+ * Reallocate unused budget from components that used less than their
95
+ * allocation to components that need more.
96
+ *
97
+ * Call this after all components have submitted their initial content
98
+ * but before final assembly.
99
+ */
100
+ reallocate(): void;
101
+ /**
102
+ * Generate a structured budget report.
103
+ */
104
+ generateReport(): BudgetReport;
105
+ /**
106
+ * Generate a formatted text table of the budget report.
107
+ *
108
+ * Example output:
109
+ * ```
110
+ * Token Budget Report:
111
+ * ┌──────────────────┬───────┬──────────┬────────────┐
112
+ * │ Component │ Used │ Budget │ Remaining │
113
+ * ├──────────────────┼───────┼──────────┼────────────┤
114
+ * │ Graph Results │ 1,200 │ 2,000 │ 800 │
115
+ * │ Change Summary │ 450 │ 1,000 │ 550 │
116
+ * ...
117
+ * ```
118
+ */
119
+ formatReport(): string;
120
+ }
121
+ //# sourceMappingURL=token-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-budget.d.ts","sourceRoot":"","sources":["../../src/context/token-budget.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW/C,8EAA8E;AAC9E,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,aAAa,CAAC;AAElB,qDAAqD;AACrD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;CACxB;AAoBD;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAC7B,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAc;IAC/C,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,sDAAsD;IACtD,OAAO,CAAC,SAAS,CAAK;gBAEV,OAAO,EAAE,WAAW;IAchC,wDAAwD;IACxD,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM;IAI7C,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM;IAI5C,4CAA4C;IAC5C,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM;IAIhD,mDAAmD;IACnD,YAAY,IAAI,MAAM;IAQtB,wDAAwD;IACxD,iBAAiB,IAAI,MAAM;IAI3B,wDAAwD;IACxD,YAAY,IAAI,OAAO;IAMvB;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpE;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIrC,0DAA0D;IAC1D,UAAU,IAAI,IAAI;IAYlB;;;;;;OAMG;IACH,sBAAsB,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAoBxE;;;;;OAKG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAcxC;;;;;;OAMG;IACH,UAAU,IAAI,IAAI;IA2ClB;;OAEG;IACH,cAAc,IAAI,YAAY;IAwB9B;;;;;;;;;;;;;OAaG;IACH,YAAY,IAAI,MAAM;CAIvB"}
@@ -0,0 +1,282 @@
1
+ /**
2
+ * AI Mind Map — Token Budget Manager
3
+ *
4
+ * Explicit token budget management inspired by Aider's `--map-tokens`
5
+ * approach. Provides per-component budgets, enforcement, smart
6
+ * truncation at logical boundaries, dynamic reallocation, and
7
+ * formatted budget reports.
8
+ */
9
+ import { estimateTokens, truncateToTokenBudget, } from '../utils/token-counter.js';
10
+ import { Logger } from '../utils/logger.js';
11
+ const logger = new Logger({ prefix: 'TokenBudget' });
12
+ /** Human-readable labels for each budget component. */
13
+ const COMPONENT_LABELS = {
14
+ graphResults: 'Graph Results',
15
+ changeSummary: 'Change Summary',
16
+ memoryRetrieval: 'Memory Retrieval',
17
+ fileContent: 'File Content',
18
+ };
19
+ /** All component keys in display order. */
20
+ const ALL_COMPONENTS = [
21
+ 'graphResults',
22
+ 'changeSummary',
23
+ 'memoryRetrieval',
24
+ 'fileContent',
25
+ ];
26
+ // ── Budget Manager Class ─────────────────────────────────────
27
+ /**
28
+ * Manages token budgets across all context components.
29
+ *
30
+ * Usage:
31
+ * ```ts
32
+ * const mgr = new TokenBudgetManager(config.tokenBudgets);
33
+ * const text = mgr.enforceComponentBudget('graphResults', longText);
34
+ * mgr.recordUsage('graphResults', text);
35
+ * const report = mgr.generateReport();
36
+ * ```
37
+ */
38
+ export class TokenBudgetManager {
39
+ /** Per-component budgets (immutable originals). */
40
+ baseBudgets;
41
+ /** Current effective budgets (may be reallocated). */
42
+ effectiveBudgets;
43
+ /** Running token counts per component. */
44
+ usage;
45
+ /** Total budget across all components. */
46
+ totalBudget;
47
+ /** Estimated naive cost (for savings calculation). */
48
+ naiveCost = 0;
49
+ constructor(budgets) {
50
+ this.baseBudgets = { ...budgets };
51
+ this.effectiveBudgets = { ...budgets };
52
+ this.totalBudget = budgets.totalContext;
53
+ this.usage = {
54
+ graphResults: 0,
55
+ changeSummary: 0,
56
+ memoryRetrieval: 0,
57
+ fileContent: 0,
58
+ };
59
+ }
60
+ // ── Query ──────────────────────────────────────────────
61
+ /** Get the current effective budget for a component. */
62
+ getBudget(component) {
63
+ return this.effectiveBudgets[component];
64
+ }
65
+ /** Get current token usage for a component. */
66
+ getUsage(component) {
67
+ return this.usage[component];
68
+ }
69
+ /** Get remaining tokens for a component. */
70
+ getRemaining(component) {
71
+ return Math.max(0, this.effectiveBudgets[component] - this.usage[component]);
72
+ }
73
+ /** Get total tokens used across all components. */
74
+ getTotalUsed() {
75
+ let sum = 0;
76
+ for (const c of ALL_COMPONENTS) {
77
+ sum += this.usage[c];
78
+ }
79
+ return sum;
80
+ }
81
+ /** Get total tokens remaining across all components. */
82
+ getTotalRemaining() {
83
+ return Math.max(0, this.totalBudget - this.getTotalUsed());
84
+ }
85
+ /** Check whether the total budget has been exceeded. */
86
+ isOverBudget() {
87
+ return this.getTotalUsed() > this.totalBudget;
88
+ }
89
+ // ── Recording ──────────────────────────────────────────
90
+ /**
91
+ * Record that `tokenCount` tokens were consumed by `component`.
92
+ *
93
+ * @param component - The budget component.
94
+ * @param text - The text whose tokens to count (or supply a number).
95
+ */
96
+ recordUsage(component, text) {
97
+ const tokens = typeof text === 'number' ? text : estimateTokens(text);
98
+ this.usage[component] += tokens;
99
+ logger.debug(`${COMPONENT_LABELS[component]}: +${tokens} tokens (total: ${this.usage[component]})`);
100
+ }
101
+ /**
102
+ * Record the "naive" cost — the estimated tokens if entire files were
103
+ * sent without compression. Used for savings calculation.
104
+ */
105
+ recordNaiveCost(tokens) {
106
+ this.naiveCost += tokens;
107
+ }
108
+ /** Reset all usage counters (e.g., for a new request). */
109
+ resetUsage() {
110
+ for (const c of ALL_COMPONENTS) {
111
+ this.usage[c] = 0;
112
+ }
113
+ this.naiveCost = 0;
114
+ // Restore effective budgets to base values.
115
+ Object.assign(this.effectiveBudgets, this.baseBudgets);
116
+ logger.debug('Budget usage reset');
117
+ }
118
+ // ── Enforcement ────────────────────────────────────────
119
+ /**
120
+ * Enforce the budget for a component by truncating content if necessary.
121
+ *
122
+ * @param component - The budget component.
123
+ * @param text - The input text.
124
+ * @returns The (possibly truncated) text that fits within the budget.
125
+ */
126
+ enforceComponentBudget(component, text) {
127
+ const budget = this.getRemaining(component);
128
+ if (budget <= 0) {
129
+ logger.warn(`${COMPONENT_LABELS[component]}: budget exhausted, returning empty`);
130
+ return `[${COMPONENT_LABELS[component]}: budget exhausted]`;
131
+ }
132
+ const tokens = estimateTokens(text);
133
+ if (tokens <= budget) {
134
+ return text;
135
+ }
136
+ logger.debug(`${COMPONENT_LABELS[component]}: truncating ${tokens} → ${budget} tokens`);
137
+ return truncateToTokenBudget(text, budget);
138
+ }
139
+ /**
140
+ * Enforce the total context budget on a final assembled context string.
141
+ *
142
+ * @param text - The assembled context.
143
+ * @returns The (possibly truncated) text.
144
+ */
145
+ enforceTotalBudget(text) {
146
+ const remaining = this.getTotalRemaining();
147
+ const tokens = estimateTokens(text);
148
+ if (tokens <= remaining) {
149
+ return text;
150
+ }
151
+ logger.debug(`Total budget: truncating ${tokens} → ${remaining} tokens`);
152
+ return truncateToTokenBudget(text, remaining);
153
+ }
154
+ // ── Dynamic Reallocation ───────────────────────────────
155
+ /**
156
+ * Reallocate unused budget from components that used less than their
157
+ * allocation to components that need more.
158
+ *
159
+ * Call this after all components have submitted their initial content
160
+ * but before final assembly.
161
+ */
162
+ reallocate() {
163
+ // Calculate how much each component has left.
164
+ let surplus = 0;
165
+ const needMore = [];
166
+ for (const c of ALL_COMPONENTS) {
167
+ const remaining = this.effectiveBudgets[c] - this.usage[c];
168
+ if (remaining > 50) {
169
+ // This component has surplus — make it available.
170
+ surplus += remaining;
171
+ // Shrink its effective budget to what it actually used + 10% buffer.
172
+ this.effectiveBudgets[c] = Math.ceil(this.usage[c] * 1.1);
173
+ surplus -= this.effectiveBudgets[c] - this.usage[c]; // Subtract the buffer
174
+ }
175
+ else if (remaining < 0) {
176
+ needMore.push(c);
177
+ }
178
+ }
179
+ // Recalculate surplus after adjustments.
180
+ surplus = 0;
181
+ for (const c of ALL_COMPONENTS) {
182
+ const remaining = this.effectiveBudgets[c] - this.usage[c];
183
+ if (remaining > 0) {
184
+ surplus += remaining;
185
+ }
186
+ }
187
+ if (surplus <= 0 || needMore.length === 0) {
188
+ return;
189
+ }
190
+ // Distribute surplus evenly among components that need more.
191
+ const perComponent = Math.floor(surplus / needMore.length);
192
+ for (const c of needMore) {
193
+ this.effectiveBudgets[c] += perComponent;
194
+ logger.debug(`Reallocated +${perComponent} tokens to ${COMPONENT_LABELS[c]}`);
195
+ }
196
+ }
197
+ // ── Reporting ──────────────────────────────────────────
198
+ /**
199
+ * Generate a structured budget report.
200
+ */
201
+ generateReport() {
202
+ const totalUsed = this.getTotalUsed();
203
+ const components = ALL_COMPONENTS.map((c) => ({
204
+ component: c,
205
+ label: COMPONENT_LABELS[c],
206
+ used: this.usage[c],
207
+ budget: this.effectiveBudgets[c],
208
+ remaining: Math.max(0, this.effectiveBudgets[c] - this.usage[c]),
209
+ }));
210
+ const savingsPercent = this.naiveCost > 0
211
+ ? Math.round((1 - totalUsed / this.naiveCost) * 100)
212
+ : 0;
213
+ return {
214
+ components,
215
+ totalUsed,
216
+ totalBudget: this.totalBudget,
217
+ totalRemaining: Math.max(0, this.totalBudget - totalUsed),
218
+ savingsPercent,
219
+ };
220
+ }
221
+ /**
222
+ * Generate a formatted text table of the budget report.
223
+ *
224
+ * Example output:
225
+ * ```
226
+ * Token Budget Report:
227
+ * ┌──────────────────┬───────┬──────────┬────────────┐
228
+ * │ Component │ Used │ Budget │ Remaining │
229
+ * ├──────────────────┼───────┼──────────┼────────────┤
230
+ * │ Graph Results │ 1,200 │ 2,000 │ 800 │
231
+ * │ Change Summary │ 450 │ 1,000 │ 550 │
232
+ * ...
233
+ * ```
234
+ */
235
+ formatReport() {
236
+ const report = this.generateReport();
237
+ return formatBudgetTable(report);
238
+ }
239
+ }
240
+ // ── Formatting Helpers ───────────────────────────────────────
241
+ /**
242
+ * Format a number with thousands separators.
243
+ * e.g. 12345 → "12,345"
244
+ */
245
+ function formatNumber(n) {
246
+ return n.toLocaleString('en-US');
247
+ }
248
+ /**
249
+ * Right-pad or right-align a string within a fixed width.
250
+ */
251
+ function padRight(str, width) {
252
+ return str.padEnd(width);
253
+ }
254
+ function padLeft(str, width) {
255
+ return str.padStart(width);
256
+ }
257
+ /**
258
+ * Build the formatted budget table string.
259
+ */
260
+ function formatBudgetTable(report) {
261
+ const colW = { name: 18, used: 7, budget: 10, remaining: 12 };
262
+ const totalW = colW.name + colW.used + colW.budget + colW.remaining + 13; // + borders
263
+ const border = (left, mid, right, fill) => `${left}${fill.repeat(colW.name + 2)}${mid}${fill.repeat(colW.used + 2)}${mid}${fill.repeat(colW.budget + 2)}${mid}${fill.repeat(colW.remaining + 2)}${right}`;
264
+ const row = (name, used, budget, remaining) => `│ ${padRight(name, colW.name)} │ ${padLeft(used, colW.used)} │ ${padLeft(budget, colW.budget)} │ ${padLeft(remaining, colW.remaining)} │`;
265
+ const lines = [
266
+ 'Token Budget Report:',
267
+ border('┌', '┬', '┐', '─'),
268
+ row('Component', 'Used', 'Budget', 'Remaining'),
269
+ border('├', '┼', '┤', '─'),
270
+ ];
271
+ for (const c of report.components) {
272
+ lines.push(row(c.label, formatNumber(c.used), formatNumber(c.budget), formatNumber(c.remaining)));
273
+ }
274
+ lines.push(border('├', '┼', '┤', '─'));
275
+ lines.push(row('TOTAL', formatNumber(report.totalUsed), formatNumber(report.totalBudget), formatNumber(report.totalRemaining)));
276
+ lines.push(border('└', '┴', '┘', '─'));
277
+ if (report.savingsPercent > 0) {
278
+ lines.push(`Estimated savings: ${report.savingsPercent}% vs naive file reading`);
279
+ }
280
+ return lines.join('\n');
281
+ }
282
+ //# sourceMappingURL=token-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-budget.js","sourceRoot":"","sources":["../../src/context/token-budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AI Mind Map — MCP Server Entry Point
4
+ *
5
+ * Creates the MCP server with stdio transport, registers all tools,
6
+ * initialises ALL real subsystems (knowledge graph, change tracker,
7
+ * persistent memory, context engine), and handles graceful shutdown.
8
+ *
9
+ * Usage:
10
+ * ai-mind-map [--project-root <path>] [--db-path <path>] [--log-level debug|info|warn|error]
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}