@copilotkit/pathfinder 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 (114) hide show
  1. package/.env.example +20 -0
  2. package/.superpowers/brainstorm/47098-1775507869/content/homepage-mockup.html +324 -0
  3. package/.superpowers/brainstorm/47098-1775507869/state/server-stopped +1 -0
  4. package/.superpowers/brainstorm/47098-1775507869/state/server.log +13 -0
  5. package/.superpowers/brainstorm/47098-1775507869/state/server.pid +1 -0
  6. package/.superpowers/brainstorm/82141-1775511032/content/migration-v2.html +340 -0
  7. package/.superpowers/brainstorm/82141-1775511032/content/migration.html +340 -0
  8. package/.superpowers/brainstorm/82141-1775511032/state/server-stopped +1 -0
  9. package/.superpowers/brainstorm/82141-1775511032/state/server.log +4 -0
  10. package/.superpowers/brainstorm/82141-1775511032/state/server.pid +1 -0
  11. package/CHANGELOG.md +26 -0
  12. package/LICENSE +21 -0
  13. package/README.md +284 -0
  14. package/dist/config.d.ts +32 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +180 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/db/client.d.ts +22 -0
  19. package/dist/db/client.d.ts.map +1 -0
  20. package/dist/db/client.js +134 -0
  21. package/dist/db/client.js.map +1 -0
  22. package/dist/db/queries.d.ts +51 -0
  23. package/dist/db/queries.d.ts.map +1 -0
  24. package/dist/db/queries.js +271 -0
  25. package/dist/db/queries.js.map +1 -0
  26. package/dist/db/schema.d.ts +11 -0
  27. package/dist/db/schema.d.ts.map +1 -0
  28. package/dist/db/schema.js +63 -0
  29. package/dist/db/schema.js.map +1 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +366 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/indexing/chunking/code.d.ts +17 -0
  35. package/dist/indexing/chunking/code.d.ts.map +1 -0
  36. package/dist/indexing/chunking/code.js +277 -0
  37. package/dist/indexing/chunking/code.js.map +1 -0
  38. package/dist/indexing/chunking/index.d.ts +6 -0
  39. package/dist/indexing/chunking/index.d.ts.map +1 -0
  40. package/dist/indexing/chunking/index.js +19 -0
  41. package/dist/indexing/chunking/index.js.map +1 -0
  42. package/dist/indexing/chunking/markdown.d.ts +16 -0
  43. package/dist/indexing/chunking/markdown.d.ts.map +1 -0
  44. package/dist/indexing/chunking/markdown.js +283 -0
  45. package/dist/indexing/chunking/markdown.js.map +1 -0
  46. package/dist/indexing/chunking/raw-text.d.ts +11 -0
  47. package/dist/indexing/chunking/raw-text.d.ts.map +1 -0
  48. package/dist/indexing/chunking/raw-text.js +59 -0
  49. package/dist/indexing/chunking/raw-text.js.map +1 -0
  50. package/dist/indexing/embeddings.d.ts +10 -0
  51. package/dist/indexing/embeddings.d.ts.map +1 -0
  52. package/dist/indexing/embeddings.js +78 -0
  53. package/dist/indexing/embeddings.js.map +1 -0
  54. package/dist/indexing/orchestrator.d.ts +69 -0
  55. package/dist/indexing/orchestrator.d.ts.map +1 -0
  56. package/dist/indexing/orchestrator.js +387 -0
  57. package/dist/indexing/orchestrator.js.map +1 -0
  58. package/dist/indexing/source-indexer.d.ts +68 -0
  59. package/dist/indexing/source-indexer.d.ts.map +1 -0
  60. package/dist/indexing/source-indexer.js +379 -0
  61. package/dist/indexing/source-indexer.js.map +1 -0
  62. package/dist/indexing/url-derivation.d.ts +7 -0
  63. package/dist/indexing/url-derivation.d.ts.map +1 -0
  64. package/dist/indexing/url-derivation.js +31 -0
  65. package/dist/indexing/url-derivation.js.map +1 -0
  66. package/dist/mcp/server.d.ts +10 -0
  67. package/dist/mcp/server.d.ts.map +1 -0
  68. package/dist/mcp/server.js +67 -0
  69. package/dist/mcp/server.js.map +1 -0
  70. package/dist/mcp/tools/bash-fs.d.ts +19 -0
  71. package/dist/mcp/tools/bash-fs.d.ts.map +1 -0
  72. package/dist/mcp/tools/bash-fs.js +134 -0
  73. package/dist/mcp/tools/bash-fs.js.map +1 -0
  74. package/dist/mcp/tools/bash-grep.d.ts +29 -0
  75. package/dist/mcp/tools/bash-grep.d.ts.map +1 -0
  76. package/dist/mcp/tools/bash-grep.js +153 -0
  77. package/dist/mcp/tools/bash-grep.js.map +1 -0
  78. package/dist/mcp/tools/bash-related.d.ts +14 -0
  79. package/dist/mcp/tools/bash-related.d.ts.map +1 -0
  80. package/dist/mcp/tools/bash-related.js +54 -0
  81. package/dist/mcp/tools/bash-related.js.map +1 -0
  82. package/dist/mcp/tools/bash-session.d.ts +23 -0
  83. package/dist/mcp/tools/bash-session.d.ts.map +1 -0
  84. package/dist/mcp/tools/bash-session.js +60 -0
  85. package/dist/mcp/tools/bash-session.js.map +1 -0
  86. package/dist/mcp/tools/bash-telemetry.d.ts +26 -0
  87. package/dist/mcp/tools/bash-telemetry.d.ts.map +1 -0
  88. package/dist/mcp/tools/bash-telemetry.js +53 -0
  89. package/dist/mcp/tools/bash-telemetry.js.map +1 -0
  90. package/dist/mcp/tools/bash-virtual-files.d.ts +3 -0
  91. package/dist/mcp/tools/bash-virtual-files.d.ts.map +1 -0
  92. package/dist/mcp/tools/bash-virtual-files.js +65 -0
  93. package/dist/mcp/tools/bash-virtual-files.js.map +1 -0
  94. package/dist/mcp/tools/bash.d.ts +25 -0
  95. package/dist/mcp/tools/bash.d.ts.map +1 -0
  96. package/dist/mcp/tools/bash.js +140 -0
  97. package/dist/mcp/tools/bash.js.map +1 -0
  98. package/dist/mcp/tools/collect.d.ts +13 -0
  99. package/dist/mcp/tools/collect.d.ts.map +1 -0
  100. package/dist/mcp/tools/collect.js +56 -0
  101. package/dist/mcp/tools/collect.js.map +1 -0
  102. package/dist/mcp/tools/search.d.ts +5 -0
  103. package/dist/mcp/tools/search.d.ts.map +1 -0
  104. package/dist/mcp/tools/search.js +68 -0
  105. package/dist/mcp/tools/search.js.map +1 -0
  106. package/dist/types.d.ts +1237 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +163 -0
  109. package/dist/types.js.map +1 -0
  110. package/dist/webhooks/github.d.ts +12 -0
  111. package/dist/webhooks/github.d.ts.map +1 -0
  112. package/dist/webhooks/github.js +117 -0
  113. package/dist/webhooks/github.js.map +1 -0
  114. package/package.json +48 -0
@@ -0,0 +1,59 @@
1
+ // Plain text chunker — paragraph-boundary splitting for non-structured content.
2
+ const DEFAULT_TARGET_TOKENS = 600;
3
+ const DEFAULT_OVERLAP_TOKENS = 50;
4
+ /**
5
+ * Split plain text into embedding-friendly chunks on paragraph boundaries.
6
+ *
7
+ * @param content - The full file content
8
+ * @param _filePath - Path to the source file (unused, kept for registry signature)
9
+ * @param config - Source configuration with chunk size parameters
10
+ * @returns Array of ChunkOutput objects
11
+ */
12
+ export function chunkRawText(content, _filePath, config) {
13
+ if (!content || !content.trim()) {
14
+ return [];
15
+ }
16
+ const targetChars = (config.chunk?.target_tokens ?? DEFAULT_TARGET_TOKENS) * 4;
17
+ const overlapChars = (config.chunk?.overlap_tokens ?? DEFAULT_OVERLAP_TOKENS) * 4;
18
+ // Split on double newlines into paragraphs
19
+ const paragraphs = content.split(/\n\n+/).filter(p => p.trim().length > 0);
20
+ if (paragraphs.length === 0) {
21
+ return [];
22
+ }
23
+ // Merge small consecutive paragraphs until reaching target size
24
+ const merged = [];
25
+ let current = '';
26
+ for (const para of paragraphs) {
27
+ const trimmed = para.trim();
28
+ const separator = current ? '\n\n' : '';
29
+ if (current && (current.length + separator.length + trimmed.length) > targetChars) {
30
+ merged.push(current);
31
+ current = trimmed;
32
+ }
33
+ else {
34
+ current = current ? current + separator + trimmed : trimmed;
35
+ }
36
+ }
37
+ if (current.trim()) {
38
+ merged.push(current);
39
+ }
40
+ // Apply overlap
41
+ const chunks = [];
42
+ for (let i = 0; i < merged.length; i++) {
43
+ let chunkContent = merged[i];
44
+ if (i > 0 && overlapChars > 0) {
45
+ const prevChunk = merged[i - 1];
46
+ const overlapText = prevChunk.slice(-overlapChars);
47
+ // Find a clean break point (newline or space)
48
+ const breakPoint = overlapText.lastIndexOf('\n');
49
+ const cleanOverlap = breakPoint > 0 ? overlapText.slice(breakPoint) : overlapText;
50
+ chunkContent = cleanOverlap + '\n\n' + chunkContent;
51
+ }
52
+ chunks.push({
53
+ content: chunkContent.trim(),
54
+ chunkIndex: i,
55
+ });
56
+ }
57
+ return chunks;
58
+ }
59
+ //# sourceMappingURL=raw-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-text.js","sourceRoot":"","sources":["../../../src/indexing/chunking/raw-text.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAIhF,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,SAAiB,EAAE,MAAoB;IACjF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC/E,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,IAAI,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAElF,2CAA2C;IAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE3E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAExC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC;QACtB,CAAC;aAAM,CAAC;YACJ,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAChE,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,gBAAgB;IAChB,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;YAEnD,8CAA8C;YAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YAElF,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC;QACxD,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACR,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE;YAC5B,UAAU,EAAE,CAAC;SAChB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class EmbeddingClient {
2
+ private client;
3
+ private model;
4
+ private dimensions;
5
+ constructor(apiKey: string, model?: string, dimensions?: number);
6
+ embed(text: string): Promise<number[]>;
7
+ embedBatch(texts: string[]): Promise<number[][]>;
8
+ private embedWithRetry;
9
+ }
10
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/indexing/embeddings.ts"],"names":[],"mappings":"AAQA,qBAAa,eAAe;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAMzD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAgCxC,cAAc;CAwC/B"}
@@ -0,0 +1,78 @@
1
+ // OpenAI batch embedding client with automatic batching and retry logic
2
+ import OpenAI from 'openai';
3
+ const MAX_BATCH_SIZE = 2048;
4
+ const MAX_RETRIES = 3;
5
+ const BASE_DELAY_MS = 1000;
6
+ export class EmbeddingClient {
7
+ client;
8
+ model;
9
+ dimensions;
10
+ constructor(apiKey, model, dimensions) {
11
+ this.client = new OpenAI({ apiKey });
12
+ this.model = model ?? 'text-embedding-3-small';
13
+ this.dimensions = dimensions ?? 1536;
14
+ }
15
+ async embed(text) {
16
+ const result = await this.embedBatch([text]);
17
+ return result[0];
18
+ }
19
+ async embedBatch(texts) {
20
+ if (texts.length === 0)
21
+ return [];
22
+ // Truncate texts that exceed OpenAI's 8192 token limit (~32K chars with safety margin)
23
+ const MAX_CHARS = 30_000;
24
+ const truncated = texts.map((t) => {
25
+ if (t.length > MAX_CHARS) {
26
+ return t.slice(0, MAX_CHARS);
27
+ }
28
+ return t;
29
+ });
30
+ const chunks = [];
31
+ for (let i = 0; i < truncated.length; i += MAX_BATCH_SIZE) {
32
+ chunks.push(truncated.slice(i, i + MAX_BATCH_SIZE));
33
+ }
34
+ const totalBatches = chunks.length;
35
+ const results = [];
36
+ for (let i = 0; i < chunks.length; i++) {
37
+ // Only log batch progress when there are multiple batches
38
+ if (totalBatches > 1) {
39
+ console.log(`Embedding batch ${i + 1}/${totalBatches} (${chunks[i].length} texts)...`);
40
+ }
41
+ const batchResults = await this.embedWithRetry(chunks[i], i + 1);
42
+ results.push(...batchResults);
43
+ }
44
+ return results;
45
+ }
46
+ async embedWithRetry(texts, batchNum, attempt = 1) {
47
+ try {
48
+ const response = await this.client.embeddings.create({
49
+ model: this.model,
50
+ input: texts,
51
+ dimensions: this.dimensions,
52
+ });
53
+ // OpenAI returns embeddings sorted by index, but sort explicitly to be safe
54
+ const sorted = response.data.sort((a, b) => a.index - b.index);
55
+ return sorted.map((item) => item.embedding);
56
+ }
57
+ catch (error) {
58
+ if (attempt >= MAX_RETRIES) {
59
+ console.error(`Embedding batch ${batchNum} failed after ${MAX_RETRIES} retries`);
60
+ throw error;
61
+ }
62
+ const isRetryable = error instanceof OpenAI.RateLimitError ||
63
+ error instanceof OpenAI.InternalServerError ||
64
+ error instanceof OpenAI.APIConnectionError;
65
+ if (!isRetryable)
66
+ throw error;
67
+ const delay = BASE_DELAY_MS * Math.pow(2, attempt - 1);
68
+ console.warn(`Embedding batch ${batchNum} attempt ${attempt}/${MAX_RETRIES} failed ` +
69
+ `(${error.message}), retrying in ${delay}ms...`);
70
+ await sleep(delay);
71
+ return this.embedWithRetry(texts, batchNum, attempt + 1);
72
+ }
73
+ }
74
+ }
75
+ function sleep(ms) {
76
+ return new Promise((resolve) => setTimeout(resolve, ms));
77
+ }
78
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/indexing/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ export declare class IndexingOrchestrator {
2
+ private queue;
3
+ private running;
4
+ private processing;
5
+ private activeSources;
6
+ private lastReindexDate;
7
+ constructor();
8
+ /**
9
+ * Smart startup check: compare DB commit SHAs against remote HEAD.
10
+ * Only re-indexes sources that have actually changed, avoiding
11
+ * unnecessary OpenAI API calls on container restarts.
12
+ */
13
+ checkAndIndex(): Promise<void>;
14
+ /**
15
+ * Get the HEAD SHA of a remote repo without cloning.
16
+ * Uses `git ls-remote` which only fetches refs.
17
+ */
18
+ private getRemoteHead;
19
+ /**
20
+ * Queue a full re-index of all sources. Returns immediately.
21
+ */
22
+ queueFullReindex(): void;
23
+ /**
24
+ * Queue an incremental re-index for a specific repo. Returns immediately.
25
+ */
26
+ queueIncrementalReindex(repoUrl: string): void;
27
+ /**
28
+ * Returns true if any indexing job is currently running.
29
+ */
30
+ isIndexing(): boolean;
31
+ /**
32
+ * Start a background timer that triggers a full reindex once per day at
33
+ * the configured UTC hour. Uses a simple setInterval (no cron library).
34
+ */
35
+ startNightlyReindex(): void;
36
+ /**
37
+ * Check if an index state is stale (never indexed or older than the configured threshold).
38
+ */
39
+ private isStale;
40
+ /**
41
+ * Process the job queue (max 1 concurrent job).
42
+ */
43
+ private drain;
44
+ /**
45
+ * Execute a single job.
46
+ */
47
+ private executeJob;
48
+ /**
49
+ * Run a full re-index of all indexable sources (those referenced by search tools).
50
+ */
51
+ private runFullReindex;
52
+ /**
53
+ * Run an incremental re-index for all sources associated with a repo.
54
+ */
55
+ private runIncrementalReindex;
56
+ /**
57
+ * Index a single source with full state tracking.
58
+ */
59
+ private indexSourceWithState;
60
+ /**
61
+ * Simple per-source mutex. If the source is already being indexed, skip.
62
+ */
63
+ private withSourceLock;
64
+ /**
65
+ * Update the index_state status for a source.
66
+ */
67
+ private setIndexStatus;
68
+ }
69
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/indexing/orchestrator.ts"],"names":[],"mappings":"AA+BA,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,aAAa,CAAqB;IAG1C,OAAO,CAAC,eAAe,CAAuB;;IAM9C;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAqGpC;;;OAGG;YACW,aAAa;IAa3B;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAQxB;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAU9C;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;;OAGG;IACH,mBAAmB,IAAI,IAAI;IA4B3B;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;YACW,KAAK;IAwBnB;;OAEG;YACW,UAAU;IAoCxB;;OAEG;YACW,cAAc;IAqB5B;;OAEG;YACW,qBAAqB;IAoDnC;;OAEG;YACW,oBAAoB;IAgDlC;;OAEG;YACW,cAAc;IAmB5B;;OAEG;YACW,cAAc;CAgB/B"}
@@ -0,0 +1,387 @@
1
+ // Job queue and coordination for indexing pipelines.
2
+ // Fully config-driven: indexes sources referenced by search tools in mcp-docs.yaml.
3
+ import { simpleGit } from 'simple-git';
4
+ import { getConfig, getServerConfig, getIndexableSourceNames } from '../config.js';
5
+ import { EmbeddingClient } from './embeddings.js';
6
+ import { SourceIndexer } from './source-indexer.js';
7
+ import { getIndexState, upsertIndexState, } from '../db/queries.js';
8
+ /**
9
+ * Find all source configs that reference a given repo URL.
10
+ */
11
+ function getSourcesByRepo(repoUrl) {
12
+ return getServerConfig().sources.filter(s => s.repo === repoUrl);
13
+ }
14
+ function getStaleThresholdMs() {
15
+ const serverCfg = getServerConfig();
16
+ return (serverCfg.indexing?.stale_threshold_hours ?? 24) * 60 * 60 * 1000;
17
+ }
18
+ export class IndexingOrchestrator {
19
+ queue = [];
20
+ running = false;
21
+ processing = false;
22
+ // Per-source mutex: prevents concurrent indexing of the same source
23
+ activeSources = new Set();
24
+ // Track last nightly reindex date to prevent drift-based duplicate triggers
25
+ lastReindexDate = null;
26
+ constructor() {
27
+ // No-op — all setup happens lazily via getConfig()
28
+ }
29
+ /**
30
+ * Smart startup check: compare DB commit SHAs against remote HEAD.
31
+ * Only re-indexes sources that have actually changed, avoiding
32
+ * unnecessary OpenAI API calls on container restarts.
33
+ */
34
+ async checkAndIndex() {
35
+ const indexableNames = getIndexableSourceNames();
36
+ if (indexableNames.size === 0) {
37
+ console.log('[orchestrator] No search tools configured — skipping indexing');
38
+ return;
39
+ }
40
+ console.log('[orchestrator] Checking index state...');
41
+ const serverCfg = getServerConfig();
42
+ const indexableSources = serverCfg.sources.filter(s => indexableNames.has(s.name));
43
+ // Check indexable sources for missing/errored state.
44
+ // Queue individual sources that need reindexing rather than triggering a full reindex of everything.
45
+ const sourcesNeedingFullReindex = [];
46
+ const sourcesOk = [];
47
+ for (const source of indexableSources) {
48
+ const state = await getIndexState(source.type, source.name);
49
+ if (!state || !state.last_commit_sha || state.status === 'error') {
50
+ console.log(`[orchestrator] ${source.name}: never indexed or in error state — will queue for reindex`);
51
+ sourcesNeedingFullReindex.push(source);
52
+ }
53
+ else {
54
+ sourcesOk.push(source);
55
+ }
56
+ }
57
+ // Queue full reindex for individual missing/errored sources
58
+ if (sourcesNeedingFullReindex.length > 0) {
59
+ // If ALL sources need reindex, just do a full reindex
60
+ if (sourcesNeedingFullReindex.length === indexableSources.length) {
61
+ console.log('[orchestrator] All indexable sources need reindexing — queuing full reindex');
62
+ this.queueFullReindex();
63
+ return;
64
+ }
65
+ // Queue incremental reindexes for each affected git-backed repo
66
+ const reposToReindex = new Set(sourcesNeedingFullReindex.filter(s => s.repo).map(s => s.repo));
67
+ for (const repoUrl of reposToReindex) {
68
+ this.queueIncrementalReindex(repoUrl);
69
+ }
70
+ // Local sources (no repo) get queued as a full reindex of just those sources
71
+ const localSources = sourcesNeedingFullReindex.filter(s => !s.repo);
72
+ if (localSources.length > 0) {
73
+ this.queue.push({ type: 'full-reindex-local', sources: localSources });
74
+ this.drain().catch(err => console.error('[orchestrator] drain() failed:', err));
75
+ }
76
+ }
77
+ if (sourcesOk.length === 0)
78
+ return;
79
+ // Local sources in sourcesOk have no remote to check — always reindex on startup
80
+ const localSourcesOk = sourcesOk.filter(s => !s.repo);
81
+ if (localSourcesOk.length > 0) {
82
+ console.log(`[orchestrator] Queuing reindex for ${localSourcesOk.length} local source(s)`);
83
+ this.queue.push({ type: 'full-reindex-local', sources: localSourcesOk });
84
+ this.drain().catch(err => console.error('[orchestrator] drain() failed:', err));
85
+ }
86
+ console.log('[orchestrator] Checking remotes for changes on indexed sources...');
87
+ // Only check remotes for git-backed sources
88
+ const repos = [...new Set(sourcesOk.filter(s => s.repo).map(s => s.repo))];
89
+ for (const repoUrl of repos) {
90
+ try {
91
+ const remoteHead = await this.getRemoteHead(repoUrl);
92
+ const sources = getSourcesByRepo(repoUrl).filter(s => indexableNames.has(s.name));
93
+ let anyChanged = false;
94
+ for (const source of sources) {
95
+ const state = await getIndexState(source.type, source.name);
96
+ if (state?.last_commit_sha !== remoteHead) {
97
+ anyChanged = true;
98
+ break;
99
+ }
100
+ }
101
+ if (anyChanged) {
102
+ console.log(`[orchestrator] Remote HEAD ${remoteHead.slice(0, 8)} for ${repoUrl} differs from indexed — queuing incremental reindex`);
103
+ this.queueIncrementalReindex(repoUrl);
104
+ }
105
+ else {
106
+ console.log(`[orchestrator] Index current at ${remoteHead.slice(0, 8)}`);
107
+ }
108
+ }
109
+ catch (err) {
110
+ // If we can't check remote, fall back to age-based staleness
111
+ console.warn(`[orchestrator] Failed to check remote HEAD for ${repoUrl}, falling back to age check:`, err);
112
+ const repoSources = getSourcesByRepo(repoUrl);
113
+ const firstState = await getIndexState(repoSources[0].type, repoSources[0].name);
114
+ if (this.isStale(firstState)) {
115
+ const thresholdHours = getServerConfig().indexing?.stale_threshold_hours ?? 24;
116
+ console.log(`[orchestrator] Index for ${repoUrl} is stale (>${thresholdHours}h) — queuing full reindex`);
117
+ this.queueFullReindex();
118
+ }
119
+ else {
120
+ console.log(`[orchestrator] Index for ${repoUrl} appears fresh, skipping`);
121
+ }
122
+ }
123
+ }
124
+ }
125
+ /**
126
+ * Get the HEAD SHA of a remote repo without cloning.
127
+ * Uses `git ls-remote` which only fetches refs.
128
+ */
129
+ async getRemoteHead(repoUrl) {
130
+ const config = getConfig();
131
+ let url = repoUrl;
132
+ if (config.githubToken) {
133
+ url = repoUrl.replace('https://github.com/', `https://x-access-token:${config.githubToken}@github.com/`);
134
+ }
135
+ const git = simpleGit();
136
+ const result = await git.listRemote([url, 'HEAD']);
137
+ const sha = result.split('\t')[0]?.trim();
138
+ if (!sha)
139
+ throw new Error(`Could not resolve HEAD for ${repoUrl}`);
140
+ return sha;
141
+ }
142
+ /**
143
+ * Queue a full re-index of all sources. Returns immediately.
144
+ */
145
+ queueFullReindex() {
146
+ this.queue.push({ type: 'full-reindex' });
147
+ console.log('[orchestrator] Full re-index queued');
148
+ this.drain().catch((err) => {
149
+ console.error('[orchestrator] drain() failed:', err);
150
+ });
151
+ }
152
+ /**
153
+ * Queue an incremental re-index for a specific repo. Returns immediately.
154
+ */
155
+ queueIncrementalReindex(repoUrl) {
156
+ this.queue.push({ type: 'incremental-reindex', repoUrl });
157
+ console.log(`[orchestrator] Incremental re-index queued for ${repoUrl}`);
158
+ this.drain().catch((err) => {
159
+ console.error('[orchestrator] drain() failed:', err);
160
+ });
161
+ }
162
+ /**
163
+ * Returns true if any indexing job is currently running.
164
+ */
165
+ isIndexing() {
166
+ return this.running;
167
+ }
168
+ /**
169
+ * Start a background timer that triggers a full reindex once per day at
170
+ * the configured UTC hour. Uses a simple setInterval (no cron library).
171
+ */
172
+ startNightlyReindex() {
173
+ const serverCfg = getServerConfig();
174
+ if (!serverCfg.indexing?.auto_reindex) {
175
+ console.log('[orchestrator] Nightly reindex disabled');
176
+ return;
177
+ }
178
+ const hour = serverCfg.indexing.reindex_hour_utc;
179
+ console.log(`[orchestrator] Nightly reindex scheduled at ${hour}:00 UTC`);
180
+ // Check every 60 seconds if it's time to run
181
+ setInterval(() => {
182
+ const now = new Date();
183
+ const today = now.toISOString().slice(0, 10);
184
+ if (now.getUTCHours() === hour && this.lastReindexDate !== today) {
185
+ if (!this.isIndexing()) {
186
+ this.lastReindexDate = today;
187
+ console.log('[orchestrator] Starting nightly reindex');
188
+ this.queueFullReindex();
189
+ }
190
+ }
191
+ }, 60_000);
192
+ }
193
+ // -----------------------------------------------------------------------
194
+ // Private
195
+ // -----------------------------------------------------------------------
196
+ /**
197
+ * Check if an index state is stale (never indexed or older than the configured threshold).
198
+ */
199
+ isStale(state) {
200
+ if (!state)
201
+ return true;
202
+ if (!state.last_indexed_at)
203
+ return true;
204
+ if (state.status === 'error')
205
+ return true;
206
+ const age = Date.now() - new Date(state.last_indexed_at).getTime();
207
+ return age > getStaleThresholdMs();
208
+ }
209
+ /**
210
+ * Process the job queue (max 1 concurrent job).
211
+ */
212
+ async drain() {
213
+ if (this.processing)
214
+ return; // Already draining
215
+ this.processing = true;
216
+ try {
217
+ while (this.queue.length > 0) {
218
+ const job = this.queue.shift();
219
+ this.running = true;
220
+ try {
221
+ await this.executeJob(job);
222
+ }
223
+ catch (err) {
224
+ console.error('[orchestrator] Job failed:', err);
225
+ }
226
+ }
227
+ }
228
+ finally {
229
+ this.running = false;
230
+ this.processing = false;
231
+ }
232
+ }
233
+ /**
234
+ * Execute a single job.
235
+ */
236
+ async executeJob(job) {
237
+ const config = getConfig();
238
+ const serverCfg = getServerConfig();
239
+ if (!serverCfg.embedding) {
240
+ throw new Error('embedding config is required for indexing');
241
+ }
242
+ const embeddingClient = new EmbeddingClient(config.openaiApiKey, serverCfg.embedding.model, serverCfg.embedding.dimensions);
243
+ if (job.type === 'full-reindex') {
244
+ await this.runFullReindex(embeddingClient, config.cloneDir, config.githubToken);
245
+ }
246
+ else if (job.type === 'full-reindex-local') {
247
+ if (!job.sources || job.sources.length === 0) {
248
+ console.warn('[orchestrator] full-reindex-local job has no sources, skipping');
249
+ return;
250
+ }
251
+ for (const sourceConfig of job.sources) {
252
+ await this.indexSourceWithState(sourceConfig, embeddingClient, config.cloneDir);
253
+ }
254
+ }
255
+ else if (job.type === 'incremental-reindex') {
256
+ if (!job.repoUrl) {
257
+ console.warn('[orchestrator] incremental-reindex job has no repoUrl, skipping');
258
+ return;
259
+ }
260
+ await this.runIncrementalReindex(embeddingClient, config.cloneDir, config.githubToken, job.repoUrl);
261
+ }
262
+ }
263
+ /**
264
+ * Run a full re-index of all indexable sources (those referenced by search tools).
265
+ */
266
+ async runFullReindex(embeddingClient, cloneDir, githubToken) {
267
+ console.log('[orchestrator] Starting full re-index');
268
+ const serverCfg = getServerConfig();
269
+ const indexableNames = getIndexableSourceNames();
270
+ for (const sourceConfig of serverCfg.sources.filter(s => indexableNames.has(s.name))) {
271
+ await this.indexSourceWithState(sourceConfig, embeddingClient, cloneDir, githubToken);
272
+ }
273
+ console.log('[orchestrator] Full re-index complete');
274
+ }
275
+ /**
276
+ * Run an incremental re-index for all sources associated with a repo.
277
+ */
278
+ async runIncrementalReindex(embeddingClient, cloneDir, githubToken, repoUrl) {
279
+ console.log(`[orchestrator] Starting incremental re-index for ${repoUrl}`);
280
+ const indexableNames = getIndexableSourceNames();
281
+ const sources = getSourcesByRepo(repoUrl).filter(s => indexableNames.has(s.name));
282
+ for (const sourceConfig of sources) {
283
+ const state = await getIndexState(sourceConfig.type, sourceConfig.name);
284
+ if (state?.last_commit_sha) {
285
+ await this.withSourceLock(`${sourceConfig.type}:${sourceConfig.name}`, async () => {
286
+ await this.setIndexStatus(sourceConfig.type, sourceConfig.name, 'indexing');
287
+ try {
288
+ const indexer = new SourceIndexer(sourceConfig, embeddingClient, cloneDir, githubToken);
289
+ await indexer.incrementalIndex(state.last_commit_sha);
290
+ const headSha = await indexer.getHeadSha();
291
+ await upsertIndexState({
292
+ source_type: sourceConfig.type,
293
+ source_key: sourceConfig.name,
294
+ last_commit_sha: headSha,
295
+ last_indexed_at: new Date(),
296
+ status: 'idle',
297
+ });
298
+ }
299
+ catch (err) {
300
+ console.error(`[orchestrator] Incremental reindex failed for ${sourceConfig.name}:`, err);
301
+ try {
302
+ await this.setIndexStatus(sourceConfig.type, sourceConfig.name, 'error', err instanceof Error ? err.message : String(err));
303
+ }
304
+ catch (statusErr) {
305
+ console.error('[orchestrator] Failed to update index status:', statusErr);
306
+ }
307
+ // Don't rethrow — continue with remaining sources
308
+ }
309
+ });
310
+ }
311
+ else {
312
+ // No previous state — do a full index for this source
313
+ await this.indexSourceWithState(sourceConfig, embeddingClient, cloneDir, githubToken);
314
+ }
315
+ }
316
+ console.log(`[orchestrator] Incremental re-index complete for ${repoUrl}`);
317
+ }
318
+ /**
319
+ * Index a single source with full state tracking.
320
+ */
321
+ async indexSourceWithState(sourceConfig, embeddingClient, cloneDir, githubToken) {
322
+ const lockKey = `${sourceConfig.type}:${sourceConfig.name}`;
323
+ await this.withSourceLock(lockKey, async () => {
324
+ const indexer = new SourceIndexer(sourceConfig, embeddingClient, cloneDir, githubToken);
325
+ await this.setIndexStatus(sourceConfig.type, sourceConfig.name, 'indexing');
326
+ try {
327
+ const state = await getIndexState(sourceConfig.type, sourceConfig.name);
328
+ if (state?.last_commit_sha) {
329
+ await indexer.incrementalIndex(state.last_commit_sha);
330
+ }
331
+ else {
332
+ await indexer.fullIndex();
333
+ }
334
+ const headSha = await indexer.getHeadSha();
335
+ await upsertIndexState({
336
+ source_type: sourceConfig.type,
337
+ source_key: sourceConfig.name,
338
+ last_commit_sha: headSha,
339
+ last_indexed_at: new Date(),
340
+ status: 'idle',
341
+ });
342
+ console.log(`[orchestrator] Indexing complete for ${sourceConfig.name}`);
343
+ }
344
+ catch (err) {
345
+ console.error(`[orchestrator] Indexing failed for ${sourceConfig.name}:`, err);
346
+ try {
347
+ await this.setIndexStatus(sourceConfig.type, sourceConfig.name, 'error', err instanceof Error ? err.message : String(err));
348
+ }
349
+ catch (statusErr) {
350
+ console.error('[orchestrator] Failed to update index status:', statusErr);
351
+ }
352
+ // Don't rethrow — continue with remaining sources
353
+ }
354
+ });
355
+ }
356
+ /**
357
+ * Simple per-source mutex. If the source is already being indexed, skip.
358
+ */
359
+ async withSourceLock(sourceKey, fn) {
360
+ if (this.activeSources.has(sourceKey)) {
361
+ console.log(`[orchestrator] Skipping ${sourceKey} — already being indexed`);
362
+ return;
363
+ }
364
+ this.activeSources.add(sourceKey);
365
+ try {
366
+ await fn();
367
+ }
368
+ finally {
369
+ this.activeSources.delete(sourceKey);
370
+ }
371
+ }
372
+ /**
373
+ * Update the index_state status for a source.
374
+ */
375
+ async setIndexStatus(sourceType, sourceKey, status, errorMessage) {
376
+ const existing = await getIndexState(sourceType, sourceKey);
377
+ await upsertIndexState({
378
+ source_type: sourceType,
379
+ source_key: sourceKey,
380
+ last_commit_sha: existing?.last_commit_sha ?? null,
381
+ last_indexed_at: existing?.last_indexed_at ?? null,
382
+ status,
383
+ error_message: errorMessage ?? null,
384
+ });
385
+ }
386
+ }
387
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/indexing/orchestrator.ts"],"names":[],"mappings":"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"}