osborn 0.9.237 → 0.9.238

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.
@@ -120,10 +120,17 @@ function extractSpeedMarker(text) {
120
120
  }
121
121
  function stripMarkdownForTTS(text) {
122
122
  return text
123
- // Remove code blocks (``` ... ```)
123
+ // Remove PAIRED code blocks (``` ... ```)
124
124
  .replace(/```[\s\S]*?```/g, ' [code block] ')
125
+ // Remove an UNCLOSED/partial fence to end-of-string. Assistant text streams as multiple
126
+ // blocks per turn and each block is stripped in isolation, so a fence that opens in one
127
+ // block (or is never closed) would otherwise leak raw code + literal backticks to TTS.
128
+ .replace(/```[\s\S]*$/g, ' [code block] ')
125
129
  // Remove inline code (` ... `)
126
130
  .replace(/`([^`]+)`/g, '$1')
131
+ // Sweep any remaining stray backtick runs (unbalanced ticks from split chunks) so they're
132
+ // never spoken aloud.
133
+ .replace(/`+/g, ' ')
127
134
  // Remove bold (**text** or __text__)
128
135
  .replace(/\*\*([^*]+)\*\*/g, '$1')
129
136
  .replace(/__([^_]+)__/g, '$1')
package/dist/env-keys.js CHANGED
@@ -35,6 +35,7 @@ export const AGENT_ENV_KEYS = [
35
35
  { key: 'OSBORN_CWD', required: false, explicit: true, description: 'Agent working directory.' },
36
36
  { key: 'OSBORN_SYNC_TOKEN', required: false, explicit: true, description: 'Session export/import auth token.' },
37
37
  { key: 'OSBORN_FRONTEND_URL', required: false, explicit: true, description: 'Frontend base URL for artifact upload.' },
38
+ { key: 'OSBORN_HOUSEKEEPING_DRYRUN', required: false, explicit: true, description: 'Set "0" to enable live housekeeping deletion; any other value / unset = dry-run (log only).' },
38
39
  { key: 'DEV_DOMAIN', required: false, explicit: true, description: 'Wildcard dev-routing domain.' },
39
40
  ];
40
41
  /** Keys the agent treats as required — absence should be surfaced at startup. */
@@ -255,6 +255,16 @@ function buildSystemPrompt(chatHistory, researchContext) {
255
255
  `Greetings/thanks/confirmations: respond directly, no search.`,
256
256
  `Tasks needing live code analysis or new research: respond with [RESEARCH_NEEDED]`,
257
257
  ``,
258
+ `== DECISIONS: DEFER, DON'T ASSERT ==`,
259
+ `The grounded main agent answers the SAME question in parallel with full context — it owns`,
260
+ `decisions. For questions asking what was DECIDED / CHOSEN / SCOPED / AGREED / "what were the`,
261
+ `options" / "what did we settle on" / "remind me what we decided": do NOT state a definitive`,
262
+ `answer from one keyword hit. A single matched line is often a passing mention, not the`,
263
+ `decision (e.g. a file that "covers WhatsApp and LinkedIn" is NOT the scoping decision).`,
264
+ `Only assert a decision if MULTIPLE recent hits corroborate it AND one is clearly the decision`,
265
+ `itself. Otherwise hedge briefly and defer — e.g. "I think it involved X, but let the main`,
266
+ `agent confirm the exact decision" — or emit [RESEARCH_NEEDED]. Never contradict-with-confidence.`,
267
+ ``,
258
268
  `== STYLE ==`,
259
269
  `1-3 sentences. Grounded in results. Never fabricate.`,
260
270
  `If not found after thorough searching: "I didn't find that in the session history."`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osborn",
3
- "version": "0.9.237",
3
+ "version": "0.9.238",
4
4
  "description": "Voice AI coding assistant - local agent that connects to Osborn frontend",
5
5
  "type": "module",
6
6
  "bin": {