@balpal4495/quorum 3.3.1 → 3.3.3

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.
@@ -0,0 +1,80 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest"
2
+ import { promises as fs } from "fs"
3
+ import path from "path"
4
+ import os from "os"
5
+ import { findChronicleDir } from "../shared/chronicle.js"
6
+
7
+ // ── helpers ───────────────────────────────────────────────────────────────────
8
+
9
+ async function makeTmpDir() {
10
+ return fs.mkdtemp(path.join(os.tmpdir(), "quorum-test-"))
11
+ }
12
+
13
+ async function rmrf(dir) {
14
+ await fs.rm(dir, { recursive: true, force: true })
15
+ }
16
+
17
+ // ── findChronicleDir ──────────────────────────────────────────────────────────
18
+
19
+ describe("findChronicleDir", () => {
20
+ let tmpDir
21
+
22
+ beforeEach(async () => {
23
+ tmpDir = await makeTmpDir()
24
+ })
25
+
26
+ afterEach(async () => {
27
+ await rmrf(tmpDir)
28
+ })
29
+
30
+ it("returns the .chronicle path when found directly in startDir", async () => {
31
+ const chronicleDir = path.join(tmpDir, ".chronicle")
32
+ await fs.mkdir(chronicleDir)
33
+
34
+ const result = await findChronicleDir(tmpDir)
35
+ expect(result).toBe(chronicleDir)
36
+ })
37
+
38
+ it("walks up the tree to find .chronicle in a parent directory", async () => {
39
+ const chronicleDir = path.join(tmpDir, ".chronicle")
40
+ await fs.mkdir(chronicleDir)
41
+
42
+ // Nested three levels deep — chronicle lives at root
43
+ const nested = path.join(tmpDir, "src", "components", "ui")
44
+ await fs.mkdir(nested, { recursive: true })
45
+
46
+ const result = await findChronicleDir(nested)
47
+ expect(result).toBe(chronicleDir)
48
+ })
49
+
50
+ it("returns null when no .chronicle directory exists anywhere in the tree", async () => {
51
+ const nested = path.join(tmpDir, "src", "deep")
52
+ await fs.mkdir(nested, { recursive: true })
53
+
54
+ const result = await findChronicleDir(nested)
55
+ expect(result).toBeNull()
56
+ })
57
+
58
+ it("ignores a .chronicle file (not a directory)", async () => {
59
+ // .chronicle exists as a file — must not be returned
60
+ await fs.writeFile(path.join(tmpDir, ".chronicle"), "not a dir")
61
+
62
+ const result = await findChronicleDir(tmpDir)
63
+ expect(result).toBeNull()
64
+ })
65
+
66
+ it("finds the nearest .chronicle when multiple exist in ancestor chain", async () => {
67
+ // Parent has a .chronicle, nested subdir has its own .chronicle
68
+ const parentChronicle = path.join(tmpDir, ".chronicle")
69
+ await fs.mkdir(parentChronicle)
70
+
71
+ const subDir = path.join(tmpDir, "sub")
72
+ const subChronicle = path.join(subDir, ".chronicle")
73
+ await fs.mkdir(subDir)
74
+ await fs.mkdir(subChronicle)
75
+
76
+ // From inside subDir — should find the closer one
77
+ const result = await findChronicleDir(subDir)
78
+ expect(result).toBe(subChronicle)
79
+ })
80
+ })
package/bin/shared/llm.js CHANGED
@@ -5,25 +5,52 @@ import path from "path"
5
5
  const execAsync = promisify(exec)
6
6
 
7
7
  /**
8
- * Auto-detect an available LLM provider from the environment.
8
+ * Auto-detect all available LLM providers from the environment and return a
9
+ * cascading provider that falls back automatically on quota / rate-limit errors.
9
10
  *
10
- * Priority:
11
+ * Detection order (highest priority first):
11
12
  * 1. ANTHROPIC_API_KEY → Anthropic Claude
12
13
  * 2. OPENAI_API_KEY → OpenAI (or compatible via OPENAI_BASE_URL)
13
14
  * 3. GEMINI_API_KEY → Google Gemini (API)
14
- * 4. OPENAI_BASE_URL (no key) → OpenAI-compatible endpoint (Azure, Groq, Ollama, etc.)
15
- * 5. OLLAMA_HOST env var → Ollama (explicit host)
16
- * 6. localhost:11434 probe Ollama (auto-detect)
17
- * 7. gemini CLI in PATH → Google Gemini (CLI subprocess)
15
+ * 4. OPENAI_BASE_URL (no key) → OpenAI-compatible endpoint (Azure, Groq, etc.)
16
+ * 5. OLLAMA_HOST / localhost:11434 → Ollama (probed in parallel with the above)
17
+ * 6. gemini CLI in PATH Google Gemini (CLI subprocess)
18
18
  *
19
- * Returns { llm: LLMProvider, name: string } or null.
19
+ * All detected providers are tried in order. A 429 / quota / rate-limit error
20
+ * from one provider causes a silent fallback to the next rather than a hard
21
+ * failure. Only non-quota errors or exhausting all providers throws.
22
+ *
23
+ * Returns { llm, name } where name is the primary provider, or null if none found.
20
24
  */
21
25
  export async function detectProvider() {
26
+ const candidates = await gatherCandidates()
27
+ if (candidates.length === 0) return null
28
+ if (candidates.length === 1) return candidates[0]
29
+
30
+ return {
31
+ llm: createCascadingLLM(candidates),
32
+ name: candidates[0].name,
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Collect every available provider — all that can be detected run in parallel.
38
+ * Ollama is probed concurrently with API-key checks so it doesn't add latency.
39
+ */
40
+ async function gatherCandidates() {
41
+ // Probe async sources concurrently
42
+ const [ollamaModel, geminiCLIAvail] = await Promise.all([
43
+ probeOllama(process.env.OLLAMA_HOST || "http://localhost:11434"),
44
+ probeGeminiCLI(),
45
+ ])
46
+
47
+ const candidates = []
48
+
22
49
  if (process.env.ANTHROPIC_API_KEY) {
23
- return {
50
+ candidates.push({
24
51
  llm: createAnthropicProvider(process.env.ANTHROPIC_API_KEY),
25
52
  name: "Anthropic",
26
- }
53
+ })
27
54
  }
28
55
 
29
56
  if (process.env.OPENAI_API_KEY) {
@@ -31,45 +58,75 @@ export async function detectProvider() {
31
58
  const name = base
32
59
  ? `OpenAI-compatible (${new URL(base).hostname})`
33
60
  : "OpenAI"
34
- return {
61
+ candidates.push({
35
62
  llm: createOpenAICompatProvider(process.env.OPENAI_API_KEY, base || "https://api.openai.com/v1"),
36
63
  name,
37
- }
64
+ })
65
+ } else if (process.env.OPENAI_BASE_URL) {
66
+ const base = process.env.OPENAI_BASE_URL.replace(/\/$/, "")
67
+ candidates.push({
68
+ llm: createOpenAICompatProvider("", base),
69
+ name: `OpenAI-compatible (${new URL(base).hostname})`,
70
+ })
38
71
  }
39
72
 
40
73
  if (process.env.GEMINI_API_KEY) {
41
- return {
74
+ candidates.push({
42
75
  llm: createGeminiProvider(process.env.GEMINI_API_KEY),
43
76
  name: "Gemini",
44
- }
45
- }
46
-
47
- if (process.env.OPENAI_BASE_URL) {
48
- const base = process.env.OPENAI_BASE_URL.replace(/\/$/, "")
49
- return {
50
- llm: createOpenAICompatProvider("", base),
51
- name: `OpenAI-compatible (${new URL(base).hostname})`,
52
- }
77
+ })
53
78
  }
54
79
 
55
- const ollamaHost = process.env.OLLAMA_HOST || "http://localhost:11434"
56
- const ollamaModel = await probeOllama(ollamaHost)
57
80
  if (ollamaModel) {
58
- return {
59
- llm: createOpenAICompatProvider("", `${ollamaHost}/v1`, ollamaModel),
81
+ const host = process.env.OLLAMA_HOST || "http://localhost:11434"
82
+ candidates.push({
83
+ llm: createOpenAICompatProvider("", `${host}/v1`, ollamaModel),
60
84
  name: `Ollama (${ollamaModel})`,
61
- }
85
+ })
62
86
  }
63
87
 
64
- const geminiCLI = await probeGeminiCLI()
65
- if (geminiCLI) {
66
- return {
88
+ if (geminiCLIAvail) {
89
+ candidates.push({
67
90
  llm: createGeminiCLIProvider(),
68
91
  name: "Gemini CLI",
69
- }
92
+ })
70
93
  }
71
94
 
72
- return null
95
+ return candidates
96
+ }
97
+
98
+ /**
99
+ * Returns true if the error looks like a quota / rate-limit response
100
+ * (HTTP 429, "quota exceeded", "rate limit", etc.).
101
+ */
102
+ function isQuotaError(err) {
103
+ return /429|quota|rate.?limit/i.test(String(err?.message ?? ""))
104
+ }
105
+
106
+ /**
107
+ * Wraps multiple provider functions into a single LLM function.
108
+ * On a quota error the next provider is tried automatically with a stderr notice.
109
+ * All other errors are re-thrown immediately from the failing provider.
110
+ */
111
+ function createCascadingLLM(candidates) {
112
+ return async function llm(messages, model) {
113
+ let lastErr
114
+ for (let i = 0; i < candidates.length; i++) {
115
+ try {
116
+ return await candidates[i].llm(messages, model)
117
+ } catch (err) {
118
+ lastErr = err
119
+ if (isQuotaError(err) && i < candidates.length - 1) {
120
+ process.stderr.write(
121
+ `\n ⚠ ${candidates[i].name} quota/rate-limit — falling back to ${candidates[i + 1].name}\n\n`,
122
+ )
123
+ continue
124
+ }
125
+ throw err
126
+ }
127
+ }
128
+ throw lastErr
129
+ }
73
130
  }
74
131
 
75
132
  /** Convenience wrapper — returns the provider function or null. */
@@ -1 +1 @@
1
- {"version":3,"file":"lance-db.d.ts","sourceRoot":"","sources":["../../../modules/oracle/adapters/lance-db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAa9C,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAsDnF"}
1
+ {"version":3,"file":"lance-db.d.ts","sourceRoot":"","sources":["../../../modules/oracle/adapters/lance-db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAa9C,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyDnF"}
@@ -30,7 +30,10 @@ export async function createLanceDBStore(chronicleDir) {
30
30
  table = await db.openTable("entries");
31
31
  }
32
32
  else if (firstRow) {
33
- table = await db.createTable("entries", [firstRow], { metric: "cosine" });
33
+ // { metric: "cosine" } crashes vectordb v0.4.x — isWriteOptions() passes it
34
+ // through but the native Rust layer misinterprets it as a schema field.
35
+ // Cosine is the default metric for float vectors so the option can be omitted.
36
+ table = await db.createTable("entries", [firstRow]);
34
37
  }
35
38
  return table;
36
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lance-db.js","sourceRoot":"","sources":["../../../modules/oracle/adapters/lance-db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,IAAI,MAAM,MAAM,CAAA;AAWvB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,YAAoB;IAC3D,4EAA4E;IAC5E,sEAAsE;IACtE,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAA;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IACnD,+EAA+E;IAC/E,mEAAmE;IACnE,8DAA8D;IAC9D,MAAM,EAAE,GAAQ,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/C,IAAI,KAAK,GAAQ,IAAI,CAAA;IAErB,KAAK,UAAU,gBAAgB,CAAC,QAAmB;QACjD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;QACvB,MAAM,KAAK,GAAa,MAAM,EAAE,CAAC,UAAU,EAAE,CAAA;QAC7C,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,KAAK,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACvC,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,KAAK,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC3E,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ;YAC/B,MAAM,GAAG,GAAa,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAA;YACvE,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAA;YACrC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBAChB,0DAA0D;gBAC1D,OAAM;YACR,CAAC;YACD,oEAAoE;YACpE,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;YAC1C,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACpB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK;YACxB,MAAM,CAAC,GAAG,MAAM,gBAAgB,EAAE,CAAA;YAClC,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAA;YACjB,MAAM,IAAI,GAAe,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;YACtE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAmB;gBAChD,wEAAwE;gBACxE,KAAK,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aAC3D,CAAC,CAAC,CAAA;QACL,CAAC;QAED,KAAK,CAAC,MAAM;YACV,MAAM,CAAC,GAAG,MAAM,gBAAgB,EAAE,CAAA;YAClC,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAA;YACjB,MAAM,IAAI,GAAe,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAA;YAClD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAmB,CAAC,CAAA;QACnE,CAAC;KACF,CAAA;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,UAAU,CAAC,EAAU;IAC5B,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAC/B,CAAC"}
1
+ {"version":3,"file":"lance-db.js","sourceRoot":"","sources":["../../../modules/oracle/adapters/lance-db.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"xenova-embedder.d.ts","sourceRoot":"","sources":["../../../modules/oracle/adapters/xenova-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIjE;AAED,8DAA8D;AAC9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
1
+ {"version":3,"file":"xenova-embedder.d.ts","sourceRoot":"","sources":["../../../modules/oracle/adapters/xenova-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoBH;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIjE;AAED,8DAA8D;AAC9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
@@ -11,11 +11,15 @@
11
11
  * import { warmEmbedder } from "./adapters/xenova-embedder.js"
12
12
  * await warmEmbedder()
13
13
  */
14
- // eslint-disable-next-line @typescript-eslint/no-require-imports
15
- const { pipeline } = require("@xenova/transformers");
16
14
  let embedderPipeline = null;
17
15
  async function getPipeline() {
18
16
  if (!embedderPipeline) {
17
+ // Dynamic import keeps this file valid ESM — @xenova/transformers is CJS-only
18
+ // and has no ESM export, so a top-level require() would throw in ESM scope.
19
+ // Cast to any — the package's TS declarations are incomplete.
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ const mod = await import("@xenova/transformers");
22
+ const pipeline = mod.pipeline ?? mod.default?.pipeline;
19
23
  embedderPipeline = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
20
24
  }
21
25
  return embedderPipeline;
@@ -1 +1 @@
1
- {"version":3,"file":"xenova-embedder.js","sourceRoot":"","sources":["../../../modules/oracle/adapters/xenova-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,iEAAiE;AACjE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;AAEpD,IAAI,gBAAgB,GAAQ,IAAI,CAAA;AAEhC,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,MAAM,QAAQ,CAC/B,oBAAoB,EACpB,yBAAyB,CAC1B,CAAA;IACH,CAAC;IACD,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAa,CAAA;AAC5C,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,WAAW,EAAE,CAAA;AACrB,CAAC"}
1
+ {"version":3,"file":"xenova-embedder.js","sourceRoot":"","sources":["../../../modules/oracle/adapters/xenova-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,IAAI,gBAAgB,GAAQ,IAAI,CAAA;AAEhC,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,8EAA8E;QAC9E,4EAA4E;QAC5E,8DAA8D;QAC9D,8DAA8D;QAC9D,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAA;QACrD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAA;QACtD,gBAAgB,GAAG,MAAM,QAAQ,CAC/B,oBAAoB,EACpB,yBAAyB,CAC1B,CAAA;IACH,CAAC;IACD,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAa,CAAA;AAC5C,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,WAAW,EAAE,CAAA;AACrB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@balpal4495/quorum",
3
- "version": "3.3.1",
3
+ "version": "3.3.3",
4
4
  "description": "Git-backed memory and design review for AI coding agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -43,8 +43,8 @@
43
43
  },
44
44
  "scripts": {
45
45
  "build": "tsc -p tsconfig.build.json",
46
- "test": "vitest run modules/ evals/",
47
- "test:watch": "vitest modules/",
46
+ "test": "vitest run modules/ evals/ bin/",
47
+ "test:watch": "vitest modules/ bin/",
48
48
  "typecheck": "tsc --noEmit"
49
49
  },
50
50
  "dependencies": {