@spinabot/brigade 1.19.2 → 1.19.4

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 (42) hide show
  1. package/dist/agents/agent-loop.d.ts.map +1 -1
  2. package/dist/agents/agent-loop.js +12 -1
  3. package/dist/agents/agent-loop.js.map +1 -1
  4. package/dist/agents/content-quality-retry.d.ts.map +1 -1
  5. package/dist/agents/content-quality-retry.js +22 -3
  6. package/dist/agents/content-quality-retry.js.map +1 -1
  7. package/dist/agents/memory/extract.d.ts.map +1 -1
  8. package/dist/agents/memory/extract.js +44 -2
  9. package/dist/agents/memory/extract.js.map +1 -1
  10. package/dist/agents/payload-mutators.d.ts +21 -0
  11. package/dist/agents/payload-mutators.d.ts.map +1 -1
  12. package/dist/agents/payload-mutators.js +58 -0
  13. package/dist/agents/payload-mutators.js.map +1 -1
  14. package/dist/agents/tool-name-repair.d.ts +28 -0
  15. package/dist/agents/tool-name-repair.d.ts.map +1 -0
  16. package/dist/agents/tool-name-repair.js +168 -0
  17. package/dist/agents/tool-name-repair.js.map +1 -0
  18. package/dist/buildstamp.json +1 -1
  19. package/dist/cli/commands/connect.d.ts.map +1 -1
  20. package/dist/cli/commands/connect.js +61 -24
  21. package/dist/cli/commands/connect.js.map +1 -1
  22. package/dist/cli/commands/update.d.ts +6 -0
  23. package/dist/cli/commands/update.d.ts.map +1 -1
  24. package/dist/cli/commands/update.js +124 -9
  25. package/dist/cli/commands/update.js.map +1 -1
  26. package/dist/cli/program/build-program.d.ts.map +1 -1
  27. package/dist/cli/program/build-program.js +5 -1
  28. package/dist/cli/program/build-program.js.map +1 -1
  29. package/dist/core/server.js +24 -5
  30. package/dist/core/server.js.map +1 -1
  31. package/dist/integrations/ollama.d.ts +23 -3
  32. package/dist/integrations/ollama.d.ts.map +1 -1
  33. package/dist/integrations/ollama.js +74 -10
  34. package/dist/integrations/ollama.js.map +1 -1
  35. package/dist/shared/reasoning-tags.d.ts +14 -0
  36. package/dist/shared/reasoning-tags.d.ts.map +1 -0
  37. package/dist/shared/reasoning-tags.js +71 -0
  38. package/dist/shared/reasoning-tags.js.map +1 -0
  39. package/dist/system-prompt/guidance.d.ts.map +1 -1
  40. package/dist/system-prompt/guidance.js +9 -2
  41. package/dist/system-prompt/guidance.js.map +1 -1
  42. package/package.json +1 -1
@@ -9,9 +9,12 @@
9
9
  * via the `~/.brigade/models.json` mechanism Pi exposes for custom providers.
10
10
  * Each model the user has pulled becomes a Pi `Model<"openai-completions">`.
11
11
  *
12
- * Capability inference is best-effort Ollama doesn't tell us a model's
13
- * context window or whether it reasons. We pattern-match the model name
14
- * against well-known families and fall back to safe defaults.
12
+ * Capability detection is AUTHORITATIVE where possible: Ollama's POST /api/show
13
+ * returns a `capabilities` array (e.g. ["completion","tools","thinking","vision"])
14
+ * that tells us directly whether a model REASONS, supports TOOLS, and accepts
15
+ * IMAGES. We read that first and only fall back to name-pattern guessing when the
16
+ * probe is unavailable (older daemon / offline). Context window still isn't
17
+ * reported, so that stays a safe default.
15
18
  */
16
19
  export interface OllamaModelSummary {
17
20
  id: string;
@@ -38,6 +41,23 @@ export interface InferredCapabilities {
38
41
  input: ("text" | "image")[];
39
42
  }
40
43
  export declare function inferOllamaModelCapabilities(modelId: string): InferredCapabilities;
44
+ /** What `/api/show` tells us about a model — all best-effort / nullable. */
45
+ export interface OllamaModelInfo {
46
+ /** Lower-cased capability tags, or null when the probe failed. */
47
+ capabilities: string[] | null;
48
+ /** The model's real max context window (tokens), or null when unknown. */
49
+ contextLength: number | null;
50
+ }
51
+ /**
52
+ * AUTHORITATIVE model probe — POST /api/show for one model and return its
53
+ * capabilities (`"thinking"`/`"tools"`/`"vision"`) AND its real context window.
54
+ * This is the source of truth — far better than guessing from the model name.
55
+ * Best-effort: any failure (older Ollama, daemon down, timeout) yields nulls so
56
+ * callers fall back to `inferOllamaModelCapabilities`.
57
+ */
58
+ export declare function fetchOllamaModelInfo(modelId: string, baseUrl?: string): Promise<OllamaModelInfo>;
59
+ /** Back-compat helper — capability tags only. Prefer `fetchOllamaModelInfo`. */
60
+ export declare function fetchOllamaCapabilities(modelId: string, baseUrl?: string): Promise<string[] | null>;
41
61
  /**
42
62
  * Write Brigade's Ollama provider entry into Pi's `~/.brigade/models.json`.
43
63
  * Pi's `ModelRegistry.refresh()` picks this up and exposes the models as
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/integrations/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwBH,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,MAAyB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAqC5G;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;CAC5B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAiDlF;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC5C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAC1C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAyB,GAChC,OAAO,CAAC,OAAO,CAAC,CAclB"}
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/integrations/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAwBH,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,MAAyB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAqC5G;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;CAC5B;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAiDlF;AAWD,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC/B,kEAAkE;IAClE,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC9B,0EAA0E;IAC1E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAcD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAyB,GAChC,OAAO,CAAC,eAAe,CAAC,CAsB1B;AAED,gFAAgF;AAChF,wBAAsB,uBAAuB,CAC5C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAyB,GAChC,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAE1B;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC5C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,kBAAkB,EAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkEf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAC1C,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAyB,GAChC,OAAO,CAAC,OAAO,CAAC,CAclB"}
@@ -9,9 +9,12 @@
9
9
  * via the `~/.brigade/models.json` mechanism Pi exposes for custom providers.
10
10
  * Each model the user has pulled becomes a Pi `Model<"openai-completions">`.
11
11
  *
12
- * Capability inference is best-effort Ollama doesn't tell us a model's
13
- * context window or whether it reasons. We pattern-match the model name
14
- * against well-known families and fall back to safe defaults.
12
+ * Capability detection is AUTHORITATIVE where possible: Ollama's POST /api/show
13
+ * returns a `capabilities` array (e.g. ["completion","tools","thinking","vision"])
14
+ * that tells us directly whether a model REASONS, supports TOOLS, and accepts
15
+ * IMAGES. We read that first and only fall back to name-pattern guessing when the
16
+ * probe is unavailable (older daemon / offline). Context window still isn't
17
+ * reported, so that stays a safe default.
15
18
  */
16
19
  import * as fs from "node:fs/promises";
17
20
  import path from "node:path";
@@ -98,6 +101,55 @@ export function inferOllamaModelCapabilities(modelId) {
98
101
  const input = vision ? ["text", "image"] : ["text"];
99
102
  return { reasoning, contextWindow, maxTokens, input };
100
103
  }
104
+ /** Pull `<arch>.context_length` out of `/api/show`'s `model_info` (the key is
105
+ * architecture-prefixed, e.g. `qwen3.context_length`). */
106
+ function extractContextLength(modelInfo) {
107
+ if (!modelInfo || typeof modelInfo !== "object")
108
+ return null;
109
+ for (const [k, v] of Object.entries(modelInfo)) {
110
+ if (k.endsWith(".context_length") && typeof v === "number" && Number.isFinite(v) && v > 0) {
111
+ return Math.floor(v);
112
+ }
113
+ }
114
+ return null;
115
+ }
116
+ /**
117
+ * AUTHORITATIVE model probe — POST /api/show for one model and return its
118
+ * capabilities (`"thinking"`/`"tools"`/`"vision"`) AND its real context window.
119
+ * This is the source of truth — far better than guessing from the model name.
120
+ * Best-effort: any failure (older Ollama, daemon down, timeout) yields nulls so
121
+ * callers fall back to `inferOllamaModelCapabilities`.
122
+ */
123
+ export async function fetchOllamaModelInfo(modelId, baseUrl = DEFAULT_BASE_URL) {
124
+ const url = `${baseUrl.replace(/\/$/, "")}/api/show`;
125
+ const controller = new AbortController();
126
+ const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
127
+ try {
128
+ const res = await fetch(url, {
129
+ method: "POST",
130
+ headers: { "Content-Type": "application/json" },
131
+ body: JSON.stringify({ model: modelId }),
132
+ signal: controller.signal,
133
+ });
134
+ if (!res.ok)
135
+ return { capabilities: null, contextLength: null };
136
+ const body = (await res.json());
137
+ const capabilities = Array.isArray(body.capabilities)
138
+ ? body.capabilities.map((c) => String(c).toLowerCase())
139
+ : null;
140
+ return { capabilities, contextLength: extractContextLength(body.model_info) };
141
+ }
142
+ catch {
143
+ return { capabilities: null, contextLength: null };
144
+ }
145
+ finally {
146
+ clearTimeout(timer);
147
+ }
148
+ }
149
+ /** Back-compat helper — capability tags only. Prefer `fetchOllamaModelInfo`. */
150
+ export async function fetchOllamaCapabilities(modelId, baseUrl = DEFAULT_BASE_URL) {
151
+ return (await fetchOllamaModelInfo(modelId, baseUrl)).capabilities;
152
+ }
101
153
  /**
102
154
  * Write Brigade's Ollama provider entry into Pi's `~/.brigade/models.json`.
103
155
  * Pi's `ModelRegistry.refresh()` picks this up and exposes the models as
@@ -117,18 +169,30 @@ export async function writeOllamaToModelsJson(modelsJsonPath, baseUrl, models) {
117
169
  catch {
118
170
  // File missing or unparseable — start fresh. Pi treats an absent file as no config.
119
171
  }
120
- const modelDefs = models.map((m) => {
121
- const caps = inferOllamaModelCapabilities(m.id);
172
+ // Prefer Ollama's own /api/show `capabilities` (authoritative for reasoning /
173
+ // tools / vision); fall back to the name heuristic only when the probe fails.
174
+ // Probes run in parallel, so total added latency is ~one request, not N.
175
+ const modelDefs = await Promise.all(models.map(async (m) => {
176
+ const guess = inferOllamaModelCapabilities(m.id);
177
+ const info = await fetchOllamaModelInfo(m.id, baseUrl);
178
+ const caps = info.capabilities;
179
+ const reasoning = caps ? caps.includes("thinking") : guess.reasoning;
180
+ const vision = caps ? caps.includes("vision") : guess.input.includes("image");
181
+ const input = vision ? ["text", "image"] : ["text"];
182
+ // Prefer the model's REAL context window from /api/show; the name-based
183
+ // guess (32k) is only a fallback. This value also drives the runtime
184
+ // num_ctx we inject, so an accurate number prevents silent truncation.
185
+ const contextWindow = info.contextLength ?? guess.contextWindow;
122
186
  return {
123
187
  id: m.id,
124
188
  name: m.name + (m.parameterSize ? ` (${m.parameterSize})` : ""),
125
- reasoning: caps.reasoning,
126
- input: caps.input,
127
- contextWindow: caps.contextWindow,
128
- maxTokens: caps.maxTokens,
189
+ reasoning,
190
+ input,
191
+ contextWindow,
192
+ maxTokens: guess.maxTokens,
129
193
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, // local = free
130
194
  };
131
- });
195
+ }));
132
196
  existing.providers["ollama"] = {
133
197
  baseUrl: `${baseUrl.replace(/\/$/, "")}/v1`,
134
198
  api: "openai-completions",
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/integrations/ollama.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/integrations/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Split `text` into the visible answer and the concatenated reasoning trace.
3
+ * `reasoning` is "" when there was none. Never throws.
4
+ */
5
+ export declare function splitReasoning(text: string): {
6
+ visible: string;
7
+ reasoning: string;
8
+ };
9
+ /**
10
+ * Return `text` with all reasoning removed — only the model's actual answer
11
+ * (or the JSON it was asked for) remains. Never throws.
12
+ */
13
+ export declare function stripReasoningTags(text: string): string;
14
+ //# sourceMappingURL=reasoning-tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-tags.d.ts","sourceRoot":"","sources":["../../src/shared/reasoning-tags.ts"],"names":[],"mappings":"AAwCA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CA2BnF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,71 @@
1
+ // Reasoning-tag handling for models that emit chain-of-thought as literal text.
2
+ //
3
+ // Many local models (Ollama qwen3 / deepseek-r1 / qwq / "thinking" forks, and
4
+ // assorted fine-tunes) emit their reasoning INLINE as `<think>…</think>`,
5
+ // `<thinking>…</thinking>`, `<thought>…</thought>`, sometimes wrapped in a
6
+ // `<final>…</final>` around the real answer — as plain TEXT, not as a typed
7
+ // reasoning content block. Left in place this reasoning:
8
+ // • leaks the raw tags into the visible reply (bad UX), and
9
+ // • defeats JSON extraction (the chain-of-thought surrounds/pollutes the
10
+ // JSON the memory extractor asks for).
11
+ //
12
+ // This module is the single source of truth for stripping/splitting that
13
+ // reasoning. Two entry points:
14
+ // • stripReasoningTags(text) — drop reasoning, return only the answer text.
15
+ // • splitReasoning(text) — split into { visible, reasoning } so callers
16
+ // that want to SHOW the trace (e.g. the TUI's
17
+ // /show-thinking) can keep it.
18
+ // Fast pre-check: bail immediately when there's no reasoning tag at all so the
19
+ // common (no-tag) path allocates nothing.
20
+ const REASONING_QUICK_RE = /<\s*\/?\s*(?:think(?:ing)?|thought|final)\b/i;
21
+ // A complete paired reasoning block. Group 1 captures the tag word so the
22
+ // backreference (\1) forces the closing tag to match the opener
23
+ // (`<thinking>…</thinking>`, not `<thinking>…</think>`); group 2 is the inner
24
+ // reasoning. Case-insensitive; tolerant of attributes/whitespace.
25
+ const REASONING_BLOCK_RE = /<\s*(think(?:ing)?|thought)\b[^>]*>([\s\S]*?)<\/\s*\1\s*>/gi;
26
+ // A reasoning block that was OPENED but never closed — e.g. a stream cut off
27
+ // mid-thought. Everything from the open tag to end-of-text is reasoning.
28
+ const REASONING_OPEN_TO_END_RE = /<\s*(?:think(?:ing)?|thought)\b[^>]*>([\s\S]*)$/i;
29
+ // `<final>` / `</final>` wrapper tags — the INNER content is the real answer,
30
+ // so we only remove the tags, never the content.
31
+ const FINAL_TAG_RE = /<\s*\/?\s*final\b[^>]*>/gi;
32
+ // Any stray/leftover reasoning tag (unpaired open or close) after the passes
33
+ // above.
34
+ const REASONING_STRAY_TAG_RE = /<\s*\/?\s*(?:think(?:ing)?|thought)\b[^>]*>/gi;
35
+ /**
36
+ * Split `text` into the visible answer and the concatenated reasoning trace.
37
+ * `reasoning` is "" when there was none. Never throws.
38
+ */
39
+ export function splitReasoning(text) {
40
+ if (!text || !REASONING_QUICK_RE.test(text))
41
+ return { visible: text, reasoning: "" };
42
+ const reasoning = [];
43
+ // 1. Complete paired blocks → collect inner, drop from visible.
44
+ let visible = text.replace(REASONING_BLOCK_RE, (_m, _word, inner) => {
45
+ const t = (inner ?? "").trim();
46
+ if (t)
47
+ reasoning.push(t);
48
+ return "";
49
+ });
50
+ // 2. An unclosed reasoning block (opened, never closed) → collect the tail.
51
+ const open = REASONING_OPEN_TO_END_RE.exec(visible);
52
+ if (open) {
53
+ const t = (open[1] ?? "").trim();
54
+ if (t)
55
+ reasoning.push(t);
56
+ visible = visible.slice(0, open.index);
57
+ }
58
+ // 3. Unwrap <final>…</final> (keep the answer, drop the tags).
59
+ visible = visible.replace(FINAL_TAG_RE, "");
60
+ // 4. Remove any stray leftover reasoning tags.
61
+ visible = visible.replace(REASONING_STRAY_TAG_RE, "");
62
+ return { visible, reasoning: reasoning.join("\n").trim() };
63
+ }
64
+ /**
65
+ * Return `text` with all reasoning removed — only the model's actual answer
66
+ * (or the JSON it was asked for) remains. Never throws.
67
+ */
68
+ export function stripReasoningTags(text) {
69
+ return splitReasoning(text).visible;
70
+ }
71
+ //# sourceMappingURL=reasoning-tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-tags.js","sourceRoot":"","sources":["../../src/shared/reasoning-tags.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,yDAAyD;AACzD,8DAA8D;AAC9D,2EAA2E;AAC3E,2CAA2C;AAC3C,EAAE;AACF,yEAAyE;AACzE,+BAA+B;AAC/B,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,+DAA+D;AAE/D,+EAA+E;AAC/E,0CAA0C;AAC1C,MAAM,kBAAkB,GAAG,8CAA8C,CAAC;AAE1E,0EAA0E;AAC1E,gEAAgE;AAChE,8EAA8E;AAC9E,kEAAkE;AAClE,MAAM,kBAAkB,GAAG,6DAA6D,CAAC;AAEzF,6EAA6E;AAC7E,yEAAyE;AACzE,MAAM,wBAAwB,GAAG,kDAAkD,CAAC;AAEpF,8EAA8E;AAC9E,iDAAiD;AACjD,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAEjD,6EAA6E;AAC7E,SAAS;AACT,MAAM,sBAAsB,GAAG,+CAA+C,CAAC;AAE/E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAErF,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,gEAAgE;IAChE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,KAAa,EAAE,KAAa,EAAE,EAAE;QACnF,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,+DAA+D;IAC/D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAE5C,+CAA+C;IAC/C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;IAEtD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC9C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;AACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"guidance.d.ts","sourceRoot":"","sources":["../../src/system-prompt/guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,kVAI0K,CAAC;AAEjN;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,aAAa,EAAE,MAAM,GAAG,SAAS,GAC/B,OAAO,CAYT;AAID;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,+bAM4E,CAAC;AAIjH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,u7EAU4I,CAAC;AAIhL;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,6pDAU0D,CAAC;AAIvF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,quDAY4G,CAAC;AAIzI;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,qyJA+CmK,CAAC;AAInM;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc,+nDAQiU,CAAC;AAI7V;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,wnGAUsP,CAAC;AAIrR;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,kxNA6CoF,CAAC;AAIrH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,+/BAS4E,CAAC;AAIrH;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAuBlF"}
1
+ {"version":3,"file":"guidance.d.ts","sourceRoot":"","sources":["../../src/system-prompt/guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,kVAI0K,CAAC;AAEjN;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,aAAa,EAAE,MAAM,GAAG,SAAS,GAC/B,OAAO,CAYT;AAID;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,+bAM4E,CAAC;AAIjH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,u7EAU4I,CAAC;AAIhL;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,6pDAU0D,CAAC;AAIvF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,quDAY4G,CAAC;AAIzI;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,qyJA+CmK,CAAC;AAInM;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,cAAc,+nDAQiU,CAAC;AAI7V;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,wnGAUsP,CAAC;AAIrR;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,kxNA6CoF,CAAC;AAIrH;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,2BAA2B,+/BAS4E,CAAC;AAIrH;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CA2BlF"}
@@ -386,9 +386,16 @@ export function pickModelFamilyGuidance(modelId) {
386
386
  // Anthropic family — already follows the patterns the system prompt teaches.
387
387
  if (/(?:^|\/)claude(?:\d|[-_.:]|$)/.test(id))
388
388
  return null;
389
- // Unknown / niche — fall through to no extra guidance.
390
- return null;
389
+ // Unknown / niche — every OTHER model (local Ollama forks: ornith, llama,
390
+ // qwen, deepseek, mistral, phi, …) previously fell through to NO override and
391
+ // happily answered "I'm Claude" / "I'm Ornith, powered by OpenAI and
392
+ // Anthropic". Give them the generic identity anchor so the base model's
393
+ // training identity never leaks.
394
+ return GENERIC_IDENTITY_GUIDANCE;
391
395
  }
396
+ const GENERIC_IDENTITY_GUIDANCE = `# Identity override
397
+
398
+ You are the assistant defined by the persona files above — you run inside Brigade. The underlying language model is only the engine; it is NOT your identity. When asked who or what you are, answer from the persona files. Never identify as the base model or its vendor — never say you are "Claude", "GPT", "ChatGPT", "Gemini", "Gemma", "Llama", "Qwen", "DeepSeek", "Ornith", "an OpenAI / Anthropic / Google model", "an open-source coding assistant", or "a large language model". If the persona files don't specify a name, call yourself Brigade.`;
392
399
  const OPENAI_FAMILY_GUIDANCE = `# Identity override (OpenAI family)
393
400
 
394
401
  Your baseline training tells you to identify as "ChatGPT", "GPT", "an AI assistant from OpenAI", "your coding assistant", "an AI coding assistant", or to identify with the project in your working directory. None of that applies here. When asked who you are, draw your identity from the persona files above — never say "I am ChatGPT" / "I'm GPT" / "I'm an AI coding assistant" / "I'm here to help you with this codebase".
@@ -1 +1 @@
1
- {"version":3,"file":"guidance.js","sourceRoot":"","sources":["../../src/system-prompt/guidance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guidance.js","sourceRoot":"","sources":["../../src/system-prompt/guidance.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spinabot/brigade",
3
- "version": "1.19.2",
3
+ "version": "1.19.4",
4
4
  "description": "Brigade — your personal AI crew",
5
5
  "homepage": "https://brigade.spinabot.com",
6
6
  "author": "Spinabot <hello@brigade-agent.ai>",