git-history-ui 2.0.2 → 3.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 (67) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/README.md +100 -10
  3. package/build/frontend/chunk-2QTYGOOP.js +1 -0
  4. package/build/frontend/chunk-36NFLS3P.js +1 -0
  5. package/build/frontend/chunk-3FFYILBL.js +1 -0
  6. package/build/frontend/chunk-C56FFICU.js +2 -0
  7. package/build/frontend/chunk-HIERJLKT.js +1 -0
  8. package/build/frontend/chunk-HYRHOB47.js +7 -0
  9. package/build/frontend/chunk-ITIFFECZ.js +1 -0
  10. package/build/frontend/chunk-N7UHDKJ7.js +1 -0
  11. package/build/frontend/chunk-NUMLL3OZ.js +1 -0
  12. package/build/frontend/chunk-TQE5NWMZ.js +5 -0
  13. package/build/frontend/chunk-TQVUSJBM.js +1 -0
  14. package/build/frontend/chunk-YSTG766K.js +1 -0
  15. package/build/frontend/index.html +2 -2
  16. package/build/frontend/main-44WYBFGF.js +1 -0
  17. package/build/frontend/styles-GSJUSSXL.css +1 -0
  18. package/dist/backend/aggregations.d.ts +57 -0
  19. package/dist/backend/aggregations.js +130 -0
  20. package/dist/backend/aggregations.js.map +1 -0
  21. package/dist/backend/annotations.d.ts +30 -0
  22. package/dist/backend/annotations.js +90 -0
  23. package/dist/backend/annotations.js.map +1 -0
  24. package/dist/backend/gitService.d.ts +14 -0
  25. package/dist/backend/gitService.js +81 -0
  26. package/dist/backend/gitService.js.map +1 -1
  27. package/dist/backend/grouping/prGrouping.d.ts +39 -0
  28. package/dist/backend/grouping/prGrouping.js +210 -0
  29. package/dist/backend/grouping/prGrouping.js.map +1 -0
  30. package/dist/backend/impact.d.ts +16 -0
  31. package/dist/backend/impact.js +66 -0
  32. package/dist/backend/impact.js.map +1 -0
  33. package/dist/backend/insights.d.ts +9 -0
  34. package/dist/backend/insights.js +44 -0
  35. package/dist/backend/insights.js.map +1 -0
  36. package/dist/backend/llm/anthropicProvider.d.ts +13 -0
  37. package/dist/backend/llm/anthropicProvider.js +90 -0
  38. package/dist/backend/llm/anthropicProvider.js.map +1 -0
  39. package/dist/backend/llm/heuristicProvider.d.ts +15 -0
  40. package/dist/backend/llm/heuristicProvider.js +127 -0
  41. package/dist/backend/llm/heuristicProvider.js.map +1 -0
  42. package/dist/backend/llm/index.d.ts +17 -0
  43. package/dist/backend/llm/index.js +66 -0
  44. package/dist/backend/llm/index.js.map +1 -0
  45. package/dist/backend/llm/openaiProvider.d.ts +13 -0
  46. package/dist/backend/llm/openaiProvider.js +100 -0
  47. package/dist/backend/llm/openaiProvider.js.map +1 -0
  48. package/dist/backend/llm/types.d.ts +32 -0
  49. package/dist/backend/llm/types.js +3 -0
  50. package/dist/backend/llm/types.js.map +1 -0
  51. package/dist/backend/search/datePhrase.d.ts +20 -0
  52. package/dist/backend/search/datePhrase.js +113 -0
  53. package/dist/backend/search/datePhrase.js.map +1 -0
  54. package/dist/backend/search/nlSearch.d.ts +39 -0
  55. package/dist/backend/search/nlSearch.js +90 -0
  56. package/dist/backend/search/nlSearch.js.map +1 -0
  57. package/dist/backend/server.d.ts +3 -0
  58. package/dist/backend/server.js +137 -2
  59. package/dist/backend/server.js.map +1 -1
  60. package/dist/backend/snapshot.d.ts +16 -0
  61. package/dist/backend/snapshot.js +42 -0
  62. package/dist/backend/snapshot.js.map +1 -0
  63. package/docs/launch.md +66 -0
  64. package/docs/screenshot.png +0 -0
  65. package/package.json +13 -3
  66. package/build/frontend/main-GGMHSSIF.js +0 -11
  67. package/build/frontend/styles-CO6MLMTR.css +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datePhrase.js","sourceRoot":"","sources":["../../../src/backend/search/datePhrase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { LlmService } from '../llm/types';
2
+ import type { GitService, PaginatedCommits } from '../gitService';
3
+ export interface NlInterpretation {
4
+ rawQuery: string;
5
+ keywords: string[];
6
+ expandedKeywords: string[];
7
+ author?: string;
8
+ since?: string;
9
+ until?: string;
10
+ }
11
+ export interface NlSearchResult extends PaginatedCommits {
12
+ parsedQuery: NlInterpretation;
13
+ usedLlm: boolean;
14
+ llmProvider: 'heuristic' | 'anthropic' | 'openai';
15
+ }
16
+ export interface ParseOptions {
17
+ /** When true, skip stripping date/author phrases from keywords. */
18
+ preserveOriginal?: boolean;
19
+ }
20
+ /**
21
+ * Parse a free-form NL query into structured filter components plus a
22
+ * cleaned keyword list. Pure function — no I/O.
23
+ */
24
+ export declare function parseNlQuery(query: string, opts?: ParseOptions): NlInterpretation;
25
+ export interface NlSearchOptions {
26
+ query: string;
27
+ page?: number;
28
+ pageSize?: number;
29
+ /** Cap on candidates pulled from git for LLM rerank. */
30
+ candidateCap?: number;
31
+ }
32
+ /**
33
+ * NL search pipeline:
34
+ * 1. Parse query into structured filters (date/author/keywords).
35
+ * 2. Pull candidates via existing git-log filtering (uses author/since/until/regex on keywords).
36
+ * 3. Score with LlmService (heuristic by default, optional AI rerank).
37
+ * 4. Sort by score, paginate.
38
+ */
39
+ export declare function runNlSearch(gitService: GitService, llm: LlmService, options: NlSearchOptions): Promise<NlSearchResult>;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseNlQuery = parseNlQuery;
4
+ exports.runNlSearch = runNlSearch;
5
+ const heuristicProvider_1 = require("../llm/heuristicProvider");
6
+ const datePhrase_1 = require("./datePhrase");
7
+ const AUTHOR_PHRASE = /\bby\s+@?([a-zA-Z][\w.-]*)\b/i;
8
+ /**
9
+ * Parse a free-form NL query into structured filter components plus a
10
+ * cleaned keyword list. Pure function — no I/O.
11
+ */
12
+ function parseNlQuery(query, opts = {}) {
13
+ const raw = (query || '').trim();
14
+ const dateRange = (0, datePhrase_1.parseDatePhrase)(raw);
15
+ const authorMatch = raw.match(AUTHOR_PHRASE);
16
+ const author = authorMatch ? authorMatch[1] : undefined;
17
+ let cleaned = opts.preserveOriginal ? raw : (0, datePhrase_1.stripDatePhrase)(raw);
18
+ if (author)
19
+ cleaned = cleaned.replace(AUTHOR_PHRASE, ' ').replace(/\s+/g, ' ').trim();
20
+ const keywords = (0, heuristicProvider_1.tokenize)(cleaned);
21
+ const expandedKeywords = (0, heuristicProvider_1.expandKeywords)(cleaned);
22
+ return {
23
+ rawQuery: raw,
24
+ keywords,
25
+ expandedKeywords,
26
+ author,
27
+ since: dateRange.since,
28
+ until: dateRange.until
29
+ };
30
+ }
31
+ /**
32
+ * NL search pipeline:
33
+ * 1. Parse query into structured filters (date/author/keywords).
34
+ * 2. Pull candidates via existing git-log filtering (uses author/since/until/regex on keywords).
35
+ * 3. Score with LlmService (heuristic by default, optional AI rerank).
36
+ * 4. Sort by score, paginate.
37
+ */
38
+ async function runNlSearch(gitService, llm, options) {
39
+ const page = Math.max(1, options.page ?? 1);
40
+ const pageSize = Math.max(1, Math.min(500, options.pageSize ?? 25));
41
+ const candidateCap = Math.max(pageSize, Math.min(1000, options.candidateCap ?? 200));
42
+ const parsed = parseNlQuery(options.query);
43
+ // Build a search regex for git log --grep: union of expanded keywords (with word-ish boundaries).
44
+ // Limit length to keep arg list sane.
45
+ const top = parsed.expandedKeywords.slice(0, 12);
46
+ const grep = top.length > 0 ? top.map(escapeForGrep).join('|') : undefined;
47
+ // Pull candidate set. We deliberately ignore pagination here so we can re-rank.
48
+ const candidatesPage = await gitService.getCommits({
49
+ author: parsed.author,
50
+ since: parsed.since,
51
+ until: parsed.until,
52
+ search: grep,
53
+ page: 1,
54
+ pageSize: candidateCap
55
+ });
56
+ const scored = await llm.score(options.query, candidatesPage.commits.map((c) => ({
57
+ id: c.hash,
58
+ text: textForScoring(c)
59
+ })));
60
+ // Map back to commits, sort by score (desc).
61
+ const byHash = new Map(candidatesPage.commits.map((c) => [c.hash, c]));
62
+ const ranked = scored
63
+ .map((s) => ({ score: s.score, commit: byHash.get(s.id) }))
64
+ .filter((r) => !!r.commit)
65
+ .sort((a, b) => b.score - a.score);
66
+ const total = ranked.length;
67
+ const start = (page - 1) * pageSize;
68
+ const slice = ranked.slice(start, start + pageSize).map((r) => r.commit);
69
+ const totalPages = Math.max(1, Math.ceil(total / pageSize));
70
+ return {
71
+ commits: slice,
72
+ total,
73
+ page,
74
+ pageSize,
75
+ totalPages,
76
+ hasNext: page < totalPages,
77
+ hasPrevious: page > 1,
78
+ parsedQuery: parsed,
79
+ usedLlm: llm.isAi,
80
+ llmProvider: llm.name
81
+ };
82
+ }
83
+ function textForScoring(c) {
84
+ return `${c.subject}\n${c.body}\n${c.author}\n${c.branches.join(' ')}\n${c.tags.join(' ')}`;
85
+ }
86
+ function escapeForGrep(token) {
87
+ // Escape POSIX BRE/ERE metacharacters (git --grep is ERE with --regexp-ignore-case).
88
+ return token.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
89
+ }
90
+ //# sourceMappingURL=nlSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nlSearch.js","sourceRoot":"","sources":["../../../src/backend/search/nlSearch.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type Server as HttpServer } from 'http';
2
+ import { type LlmConfig } from './llm';
2
3
  export interface ServerOptions {
3
4
  port?: number;
4
5
  host?: string;
@@ -6,6 +7,8 @@ export interface ServerOptions {
6
7
  since?: string;
7
8
  author?: string;
8
9
  cwd?: string;
10
+ llm?: LlmConfig;
11
+ githubToken?: string;
9
12
  }
10
13
  export interface BootResult {
11
14
  server: HttpServer;
@@ -13,6 +13,13 @@ const http_1 = require("http");
13
13
  const path_1 = __importDefault(require("path"));
14
14
  const fs_1 = __importDefault(require("fs"));
15
15
  const gitService_1 = require("./gitService");
16
+ const nlSearch_1 = require("./search/nlSearch");
17
+ const prGrouping_1 = require("./grouping/prGrouping");
18
+ const snapshot_1 = require("./snapshot");
19
+ const llm_1 = require("./llm");
20
+ const impact_1 = require("./impact");
21
+ const insights_1 = require("./insights");
22
+ const annotations_1 = require("./annotations");
16
23
  const DEFAULT_PORT = 3000;
17
24
  const DEFAULT_HOST = 'localhost';
18
25
  async function startServer(port = DEFAULT_PORT, host = DEFAULT_HOST, options = {}) {
@@ -34,7 +41,7 @@ async function startServer(port = DEFAULT_PORT, host = DEFAULT_HOST, options = {
34
41
  }
35
42
  return cb(new Error('CORS not allowed'), false);
36
43
  },
37
- methods: ['GET'],
44
+ methods: ['GET', 'POST', 'DELETE'],
38
45
  allowedHeaders: ['Content-Type', 'X-Requested-With']
39
46
  }));
40
47
  app.use((0, compression_1.default)());
@@ -47,6 +54,9 @@ async function startServer(port = DEFAULT_PORT, host = DEFAULT_HOST, options = {
47
54
  });
48
55
  app.use('/api', apiLimiter);
49
56
  const gitService = new gitService_1.GitService(cwd);
57
+ const llmService = (0, llm_1.getDefaultLlmService)(options.llm ?? {});
58
+ const githubToken = options.githubToken ?? process.env.GITHUB_TOKEN;
59
+ const annotations = new annotations_1.AnnotationsStore(cwd);
50
60
  const angularBuildPath = path_1.default.join(__dirname, '../../build/frontend');
51
61
  const publicPath = path_1.default.join(__dirname, '../../public');
52
62
  const staticDir = fs_1.default.existsSync(angularBuildPath) ? angularBuildPath : publicPath;
@@ -56,7 +66,12 @@ async function startServer(port = DEFAULT_PORT, host = DEFAULT_HOST, options = {
56
66
  res.json({ status: 'ok', uptime: process.uptime(), pid: process.pid });
57
67
  });
58
68
  app.get('/api/version', (_req, res) => {
59
- res.json({ name: 'git-history-ui', version: pkgVersion() });
69
+ res.json({
70
+ name: 'git-history-ui',
71
+ version: pkgVersion(),
72
+ llm: { provider: llmService.name, isAi: llmService.isAi },
73
+ githubEnrichment: !!githubToken
74
+ });
60
75
  });
61
76
  app.get('/api/commits', wrap(async (req, res) => {
62
77
  const result = await gitService.getCommits({
@@ -78,6 +93,126 @@ async function startServer(port = DEFAULT_PORT, host = DEFAULT_HOST, options = {
78
93
  const diff = await gitService.getDiff(req.params.hash);
79
94
  res.json(diff);
80
95
  }));
96
+ app.get('/api/diff', wrap(async (req, res) => {
97
+ const from = stringParam(req.query.from);
98
+ const to = stringParam(req.query.to);
99
+ if (!from || !to) {
100
+ res.status(400).json({ error: 'from and to query params are required' });
101
+ return;
102
+ }
103
+ const diff = await gitService.getRangeDiff(from, to);
104
+ res.json(diff);
105
+ }));
106
+ app.get('/api/search', wrap(async (req, res) => {
107
+ const q = stringParam(req.query.q ?? req.query.query);
108
+ if (!q) {
109
+ res.status(400).json({ error: 'q query param is required' });
110
+ return;
111
+ }
112
+ const result = await (0, nlSearch_1.runNlSearch)(gitService, llmService, {
113
+ query: q,
114
+ page: numberParam(req.query.page, 1),
115
+ pageSize: numberParam(req.query.pageSize, 25)
116
+ });
117
+ res.json(result);
118
+ }));
119
+ app.get('/api/groups', wrap(async (req, res) => {
120
+ const groups = await (0, prGrouping_1.buildCommitGroups)(gitService, {
121
+ since: stringParam(req.query.since),
122
+ until: stringParam(req.query.until),
123
+ author: stringParam(req.query.author),
124
+ githubToken,
125
+ maxCommits: numberParam(req.query.maxCommits, 1000)
126
+ });
127
+ res.json(groups);
128
+ }));
129
+ app.get('/api/snapshot', wrap(async (req, res) => {
130
+ const at = stringParam(req.query.at);
131
+ if (!at) {
132
+ res.status(400).json({ error: 'at query param is required' });
133
+ return;
134
+ }
135
+ const snap = await (0, snapshot_1.getSnapshot)(gitService, at);
136
+ res.json(snap);
137
+ }));
138
+ app.get('/api/file-stats', wrap(async (req, res) => {
139
+ const file = stringParam(req.query.file);
140
+ if (!file) {
141
+ res.status(400).json({ error: 'file query param is required' });
142
+ return;
143
+ }
144
+ const stats = await gitService.getFileStats(file);
145
+ res.json(stats);
146
+ }));
147
+ app.get('/api/impact/:hash', wrap(async (req, res) => {
148
+ const impact = await (0, impact_1.getCommitImpact)(gitService, req.params.hash);
149
+ res.json(impact);
150
+ }));
151
+ app.get('/api/insights', wrap(async (req, res) => {
152
+ const bundle = await (0, insights_1.computeInsights)(gitService, {
153
+ since: stringParam(req.query.since),
154
+ until: stringParam(req.query.until),
155
+ maxCommits: numberParam(req.query.maxCommits, 500)
156
+ });
157
+ res.json(bundle);
158
+ }));
159
+ app.post('/api/summarize-diff', wrap(async (req, res) => {
160
+ const text = typeof req.body?.text === 'string' ? req.body.text : '';
161
+ if (!text) {
162
+ res.status(400).json({ error: 'text body field is required' });
163
+ return;
164
+ }
165
+ if (!llmService.isAi) {
166
+ res.status(503).json({ error: 'No AI provider configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY.' });
167
+ return;
168
+ }
169
+ const summary = await llmService.summarize(text, {
170
+ hint: 'Summarize this code diff in 2-3 sentences for a developer skimming the change.'
171
+ });
172
+ res.json({ summary, provider: llmService.name });
173
+ }));
174
+ app.post('/api/explain-commit/:hash', wrap(async (req, res) => {
175
+ if (!llmService.isAi) {
176
+ res.status(503).json({ error: 'No AI provider configured. Set ANTHROPIC_API_KEY or OPENAI_API_KEY.' });
177
+ return;
178
+ }
179
+ const commit = await gitService.getCommit(req.params.hash);
180
+ const diff = await gitService.getDiff(req.params.hash);
181
+ const text = [
182
+ `Subject: ${commit.subject}`,
183
+ commit.body ? `Body:\n${commit.body}` : '',
184
+ 'Changed files:',
185
+ ...diff.slice(0, 25).map((f) => `- ${f.file} (+${f.additions} -${f.deletions})`)
186
+ ]
187
+ .filter(Boolean)
188
+ .join('\n');
189
+ const summary = await llmService.summarize(text, {
190
+ hint: 'Explain in plain English what this commit changes and why a reviewer should care.'
191
+ });
192
+ res.json({ summary, provider: llmService.name });
193
+ }));
194
+ app.get('/api/annotations/:hash', wrap(async (req, res) => {
195
+ const list = await annotations.list(req.params.hash);
196
+ res.json(list);
197
+ }));
198
+ app.post('/api/annotations/:hash', wrap(async (req, res) => {
199
+ const author = typeof req.body?.author === 'string' ? req.body.author : 'anonymous';
200
+ const body = typeof req.body?.body === 'string' ? req.body.body.trim() : '';
201
+ if (!body) {
202
+ res.status(400).json({ error: 'body is required' });
203
+ return;
204
+ }
205
+ if (body.length > 5000) {
206
+ res.status(413).json({ error: 'comment too long' });
207
+ return;
208
+ }
209
+ const created = await annotations.add(req.params.hash, { author, body });
210
+ res.status(201).json(created);
211
+ }));
212
+ app.delete('/api/annotations/:hash/:id', wrap(async (req, res) => {
213
+ const ok = await annotations.remove(req.params.hash, req.params.id);
214
+ res.status(ok ? 204 : 404).end();
215
+ }));
81
216
  app.get('/api/blame', wrap(async (req, res) => {
82
217
  const file = stringParam(req.query.file);
83
218
  if (!file) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/backend/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/backend/server.ts"],"names":[],"mappings":";;;;;AAqCA,kCAsUC;AA3WD,sDAAkF;AAClF,gDAAwB;AACxB,oDAA4B;AAC5B,8DAAsC;AACtC,4EAA2C;AAC3C,+BAA+D;AAC/D,gDAAwB;AACxB,4CAAoB;AACpB,6CAA+D;AAC/D,gDAAgD;AAChD,sDAA0D;AAC1D,yCAAyC;AACzC,+BAA6D;AAC7D,qCAA2C;AAC3C,yCAA6C;AAC7C,+CAAiD;AAmBjD,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,WAAW,CAAC;AAE1B,KAAK,UAAU,WAAW,CAC/B,OAAe,YAAY,EAC3B,OAAe,YAAY,EAC3B,UAAkC,EAAE;IAEpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5B,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAEnC,GAAG,CAAC,GAAG,CACL,IAAA,gBAAM,EAAC;QACL,qBAAqB,EAAE,KAAK;QAC5B,yBAAyB,EAAE,KAAK;QAChC,yBAAyB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;KACrD,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,IAAA,cAAI,EAAC;QACH,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE;YACrB,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnC,IAAI,8CAA8C,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC;YACD,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;QAClC,cAAc,EAAE,CAAC,cAAc,EAAE,kBAAkB,CAAC;KACrD,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,IAAA,qBAAW,GAAE,CAAC,CAAC;IACvB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAE1C,MAAM,UAAU,GAAG,IAAA,4BAAS,EAAC;QAC3B,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,GAAG;QACR,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE5B,MAAM,UAAU,GAAG,IAAI,uBAAU,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAA,0BAAoB,EAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACpE,MAAM,WAAW,GAAG,IAAI,8BAAgB,CAAC,GAAG,CAAC,CAAC;IAE9C,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,YAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC;IAClF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAErD,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEjE,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACnC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACpC,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,UAAU,EAAE;YACrB,GAAG,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;YACzD,gBAAgB,EAAE,CAAC,CAAC,WAAW;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CACL,cAAc,EACd,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC;YACzC,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YACjC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACnC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACnC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YACrC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACpD,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;SAC9C,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,mBAAmB,EACnB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,iBAAiB,EACjB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,WAAW,EACX,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,aAAa,EACb,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAW,EAAC,UAAU,EAAE,UAAU,EAAE;YACvD,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACpC,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;SAC9C,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,aAAa,EACb,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAiB,EAAC,UAAU,EAAE;YACjD,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACnC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACnC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YACrC,WAAW;YACX,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC;SACpD,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,eAAe,EACf,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAA,sBAAW,EAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,iBAAiB,EACjB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,mBAAmB,EACnB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,IAAA,wBAAe,EAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,eAAe,EACf,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAe,EAAC,UAAU,EAAE;YAC/C,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACnC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;YACnC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC;SACnD,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,qBAAqB,EACrB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qEAAqE,EAAE,CAAC,CAAC;YACvG,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE;YAC/C,IAAI,EAAE,gFAAgF;SACvF,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,2BAA2B,EAC3B,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qEAAqE,EAAE,CAAC,CAAC;YACvG,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG;YACX,YAAY,MAAM,CAAC,OAAO,EAAE;YAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;YAC1C,gBAAgB;YAChB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC;SACjF;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE;YAC/C,IAAI,EAAE,mFAAmF;SAC1F,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,wBAAwB,EACxB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,wBAAwB,EACxB,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC;QACpF,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,MAAM,CACR,4BAA4B,EAC5B,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,YAAY,EACZ,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACtF,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5F,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzB,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9B,IAAI,GAAG;gBAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,IAAa,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;QAC1E,IAAI,GAAG,YAAY,gCAAmB,EAAE,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAA,mBAAY,EAAC,GAAG,CAAC,CAAC;IAErC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACjC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACjC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,GAAkB,EAAE,CAChC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5B,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,IAAI,CACX,OAA8E;IAE9E,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAU;IAC7B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,CAAU,EAAE,QAAgB;IAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;QACtF,OAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC,OAAO,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC;IAC9C,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;SACpB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACvB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;YAC/B,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,oBAAoB,CAAC,CAAC;YACnD,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACpC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QACpD,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { GitService } from './gitService';
2
+ export interface Snapshot {
3
+ at: string;
4
+ ref: string | null;
5
+ branches: Record<string, string>;
6
+ tags: Record<string, string>;
7
+ }
8
+ /**
9
+ * Get the repo state at a point in time: HEAD/branch/tag heads as of `atIso`.
10
+ * Implementation: for each branch/tag ref, find the most recent commit
11
+ * with committer date <= atIso (`git rev-list -1 --before=...`).
12
+ *
13
+ * Tags are typically immutable, but historically were placed at a different
14
+ * commit so we still resolve them at the snapshot moment.
15
+ */
16
+ export declare function getSnapshot(gitService: GitService, atIso: string): Promise<Snapshot>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSnapshot = getSnapshot;
4
+ /**
5
+ * Get the repo state at a point in time: HEAD/branch/tag heads as of `atIso`.
6
+ * Implementation: for each branch/tag ref, find the most recent commit
7
+ * with committer date <= atIso (`git rev-list -1 --before=...`).
8
+ *
9
+ * Tags are typically immutable, but historically were placed at a different
10
+ * commit so we still resolve them at the snapshot moment.
11
+ */
12
+ async function getSnapshot(gitService, atIso) {
13
+ const [branches, tags] = await Promise.all([
14
+ gitService.getBranches(),
15
+ gitService.getTags()
16
+ ]);
17
+ const branchEntries = await Promise.all(branches.map(async (b) => {
18
+ const hash = await gitService.revAt(b, atIso).catch(() => null);
19
+ return [b, hash];
20
+ }));
21
+ const tagEntries = await Promise.all(tags.map(async (t) => {
22
+ const hash = await gitService.revAt(t, atIso).catch(() => null);
23
+ return [t, hash];
24
+ }));
25
+ const branchMap = {};
26
+ for (const [b, hash] of branchEntries)
27
+ if (hash)
28
+ branchMap[b] = hash;
29
+ const tagMap = {};
30
+ for (const [t, hash] of tagEntries)
31
+ if (hash)
32
+ tagMap[t] = hash;
33
+ // HEAD-equivalent: commit on the default branch (HEAD) at the snapshot time.
34
+ const head = await gitService.revAt('HEAD', atIso).catch(() => null);
35
+ return {
36
+ at: atIso,
37
+ ref: head,
38
+ branches: branchMap,
39
+ tags: tagMap
40
+ };
41
+ }
42
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/backend/snapshot.ts"],"names":[],"mappings":";;AAiBA,kCAoCC;AA5CD;;;;;;;GAOG;AACI,KAAK,UAAU,WAAW,CAC/B,UAAsB,EACtB,KAAa;IAEb,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,UAAU,CAAC,WAAW,EAAE;QACxB,UAAU,CAAC,OAAO,EAAE;KACrB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAU,CAAC;IAC5B,CAAC,CAAC,CACH,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,EAAE,IAAI,CAAU,CAAC;IAC5B,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,aAAa;QAAE,IAAI,IAAI;YAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACrE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,UAAU;QAAE,IAAI,IAAI;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/D,6EAA6E;IAC7E,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAErE,OAAO;QACL,EAAE,EAAE,KAAK;QACT,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,MAAM;KACb,CAAC;AACJ,CAAC"}
package/docs/launch.md ADDED
@@ -0,0 +1,66 @@
1
+ # v3.0 launch — talking points
2
+
3
+ ## Hacker News title (proposed)
4
+
5
+ > Show HN: I added natural-language search and time travel to git-history-ui
6
+
7
+ ## Lede (~120 words)
8
+
9
+ git-history-ui v3 turns your local git history into something you can ask
10
+ questions of. Drop into any repo, run `npx git-history-ui@latest`, and you
11
+ get three features that used to need GitHub Pro, a desktop client, or a
12
+ homegrown script:
13
+
14
+ 1. **Natural-language search.** Type "login bug last month" or "payments by
15
+ alice". A heuristic intent parser handles dates, authors, and synonym
16
+ expansion with no setup; if you set `ANTHROPIC_API_KEY` (or
17
+ `OPENAI_API_KEY`), the same query gets semantically re-ranked by Claude
18
+ or GPT — but only the prompt leaves your machine, never the code.
19
+ 2. **PR / feature grouping.** A "Grouped" toggle clusters commits by GitHub
20
+ merge / squash patterns and Conventional Commits scope, turning a wall
21
+ of 200 commits into ~20 PRs you can scan.
22
+ 3. **Time travel.** A horizontal timeline slider shows the repo state at any
23
+ moment and computes a live diff against HEAD.
24
+
25
+ Plus file-level history, blame, commit impact analysis, an insights
26
+ dashboard, and an "Explain this change" AI button on every commit. All
27
+ local. All zero-config. AI is opt-in.
28
+
29
+ ## What to emphasize in comments
30
+
31
+ - **Privacy.** Heuristic mode is the default. AI calls only happen on user
32
+ intent (clicking Explain / Summarize, or running an NL search) and only
33
+ send the prompt — never the working tree.
34
+ - **Zero deps to add.** No new npm packages were added in v3 — the LLM
35
+ providers use `fetch`, the date parser is hand-rolled, the heuristic
36
+ scorer is plain TF-IDF. Same install footprint as v2.
37
+ - **Open to providers.** Anthropic and OpenAI today; the `LlmService`
38
+ interface is two methods (`score`, `summarize`) so adding Ollama, Gemini,
39
+ or a self-hosted model is a single file.
40
+ - **What's next (Phase 2 + 3).** Better diff viz (intra-line, scroll-sync
41
+ split), d3 charts in the insights dashboard, SQLite background indexer
42
+ for huge repos, virtualized graph rendering, GitHub App + Chrome
43
+ extension for "open in git-history-ui" deep links, CLI presets.
44
+
45
+ ## Demo script (~60s)
46
+
47
+ 1. `cd ~/some-busy-repo && npx git-history-ui@latest`.
48
+ 2. Click the search icon — it flips to "AI" mode. Type
49
+ "login bug last month". Show the parsed-query chips appear.
50
+ 3. Click "Grouped" in the toolbar. Expand a PR group, click a commit.
51
+ 4. On the commit detail, click "✨ Explain change". (If you've set a key,
52
+ it actually summarizes; otherwise it shows a clear "set a key" message.)
53
+ 5. Click "Show impact" — point out the dependency ripple list.
54
+ 6. Top nav → "Timeline". Drag the slider to last quarter, watch HEAD
55
+ pointers update and the "Diff vs HEAD" panel populate.
56
+ 7. Top nav → "Insights". Hotspots + risky files.
57
+ 8. Click any file in a commit's Files panel → land on `/file/...` →
58
+ switch to the Blame tab.
59
+
60
+ ## Screenshots needed before publishing
61
+
62
+ - [ ] Toolbar with NL chips visible
63
+ - [ ] Grouped commit list with PR cards
64
+ - [ ] Timeline page with slider mid-history
65
+ - [ ] File history → Blame tab
66
+ - [ ] Insights dashboard (hotspots + churn chart)
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "git-history-ui",
3
- "version": "2.0.2",
4
- "description": "Beautiful, fast git history visualization in your browser — with deterministic swim-lane graphs, virtualized diffs, and a command palette.",
3
+ "version": "3.0.0",
4
+ "description": "Git Intelligence in your browser — natural-language search, PR/feature grouping, time-travel snapshots, file history, blame, commit impact, and an insights dashboard. Optional AI integration (Anthropic / OpenAI).",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
7
7
  "git-history-ui": "dist/cli.js"
@@ -9,6 +9,7 @@
9
9
  "files": [
10
10
  "dist/**/*",
11
11
  "build/**/*",
12
+ "docs/**/*",
12
13
  "public/**/*",
13
14
  "README.md",
14
15
  "LICENSE",
@@ -49,7 +50,16 @@
49
50
  "developer-tools",
50
51
  "git-graph",
51
52
  "git-log",
52
- "command-palette"
53
+ "command-palette",
54
+ "natural-language-search",
55
+ "ai",
56
+ "anthropic",
57
+ "openai",
58
+ "claude",
59
+ "blame",
60
+ "code-insights",
61
+ "time-travel",
62
+ "pull-request"
53
63
  ],
54
64
  "author": "Ankit Sharma <ankit.sharma199803@gmail.com>",
55
65
  "license": "MIT",