osborn 0.8.30 → 0.8.31

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.
@@ -4,38 +4,42 @@ Auto-extracted from voice sessions via PreCompact.
4
4
  Last updated: 2026-05-01 | Session: unknown...
5
5
 
6
6
  USER CORRECTIONS:
7
- - First write attempt for interruption timer was DENIED because it replaced existing LiveKit code instead of adding on top — always ADD fallbacks, never replace existing mechanisms; user said "you're basically deleting what we have"
8
- - User denied permission dialog for file edit because they wanted to verify the approach first before committing ask "should I build this?" before delegating write tasks on significant changes
9
- - When proposing solution approach, verify against LiveKit SDK source AND docs before implementing user asked "can you verify that we're doing it the right way in terms of live kits"
7
+ - Never delete existing code when adding new functionality — always add as a fallback/layer on top; user denied permission twice when replacements were sent instead of additions
8
+ - Don't dismiss log warnings as "contamination" without verifying the 0.8.30 reference in logs was real and was incorrectly dismissed
9
+ - Share URLs directly in the message, not just in session files — "send it to me in the actual message"
10
+ - Don't say "I can't read images from URLs in this context" — fetch the public URL and use the Read tool on the saved file
11
+ - When user says "you updated it" trust the session history and confirm rather than expressing surprise
10
12
 
11
13
  USER PREFERENCES:
12
- - Voice transcription: "MPM"=npm, "mobile publish"=npm publish, "live gate"=LiveKit, "left kit"=LiveKit, "basketball man"=bash command, "Osborne"=osborn interpret flexibly
13
- - Sprite is the publish path for npm going forward (not Mac), set up with automation token
14
- - Prefers additive code changes: keep existing mechanisms as primary, add new approaches as fallback tiers
15
- - Wants to understand the "why" before approving implementation explain the mechanism, not just the solution
16
- - Wants confirmation before committing to solutions when uncertain: "before we commit to doing this"
14
+ - Prefers additive changes over replacements keep existing SDK mechanisms as primary, add custom fallbacks only when SDK fails
15
+ - Wants direct URL in voice message (readable), not just written to session files
16
+ - Expects natural chain of: bump version build commit push publish in one flow
17
+ - Prefers push-based deploy (Railway auto-deploys from GitHub push) over manual steps
18
+ - Wants feedback on async operations "is it done?" is the recurring question
19
+ - Voice transcription artifacts: "MPM"=npm, "Osborne"=Osborn, "Brazil"=unclear, "basket man"=bash command
17
20
 
18
21
  DOMAIN KNOWLEDGE:
19
- - `osborn --version` has no version flag — it starts a new LiveKit-connected instance; use `npm list -g osborn` or `npm list -g osborn --json` for version
20
- - npm automation token (not web login token) required for headless publish web login token still requires 2FA for publish
21
- - `playbackPosition` is 0 because interrupt often fires before TTS audio frames start flowing (`pushedDuration = 0`); also race condition between `addDoneCallback` and `waitForPlayoutTask`
22
- - `skipTTSQueue: true` does NOT bypass audio frame tracking `ttsTask` code path is identical
23
- - `EVENT_PLAYBACK_STARTED` ('playbackStarted') is public, fires on first audio frame, accessible via `audioOutput.on()`
24
- - OpenAI TTS-1 rate: ~14 chars/second confirmed from community benchmarks
25
- - `check-version` in sandbox/route.ts was incorrectly using `osborn --version` (starts instance); fixed to `npm list -g osborn --json`
26
- - execInSprite works any time the Sprite container is running, independent of osborn agent health
27
- - `checkVersion()` already existed in dashboard/page.tsx (lines 325-338); `installedVersion` and `latestVersion` state already existed
28
- - Dashboard handleRestart/handleUpdate were not reading API response bodies server returns rich data but client discarded it
29
- - Railway auto-deploys from GitHub main branch push
22
+ - `osborn --version` has no version flag — calling it starts a new LiveKit agent instance and connects to a room
23
+ - npm automation token required for headless publish; web login token still requires interactive 2FA
24
+ - `(currentSession as any)?.output?.audio` is the correct path to AudioOutput; `_activity.agentSession.output.audio` is WRONG
25
+ - OpenAI TTS-1 does not provide `synchronizedTranscript` or meaningful `playbackPosition` both are 0/null
26
+ - `EVENT_PLAYBACK_STARTED` ('playbackStarted') is a public LiveKit AudioOutput event that fires on first audio frame
27
+ - 14 chars/sec is the correct estimate for OpenAI TTS-1 (175-178 WPM × 5 chars/word / 60s)
28
+ - Dashboard `handleRestart`/`handleUpdate` server already does `waitForHealth` before responding; client was ignoring the response body entirely
29
+ - `execInSprite` works any time the Sprite container is running, independent of osborn agent health
30
+ - `npm list -g osborn --json` is the correct way to get installed version (not `osborn --version`)
31
+ - Writer sub-agents will autonomously fix bugs and publish if they have npm auth and the task implies it — need to scope tasks tightly
30
32
 
31
33
  EFFECTIVE PATTERNS:
32
- - Layered fallback approach: preserve existing SDK mechanisms, add custom approach only as fallback explicit user preference confirmed
33
- - Taking checkpoint before significant changes gives confidence to experiment
34
- - Reading API response bodies and surfacing errors/success messages is a simple fix for "silent" operations
34
+ - Four-tier fallback chain (sdk-transcript sdk-position wall-clock full-block) preserves future compatibility while adding current fix
35
+ - Checkpoint before significant code changes; user approved checkpoints as a safety measure
36
+ - Delegating "research then build" to researcher first, then writer prevents over-building on incorrect assumptions
37
+ - Reading the actual image file via WebFetch + Read instead of asking user to describe it
35
38
 
36
39
  ANTI-PATTERNS:
37
- - Running `osborn --version` on the Sprite created stray processes connected to LiveKit room — never run the osborn binary to check version
38
- - Replacing existing LiveKit code with custom implementation instead of adding on top user explicitly denied and corrected this
39
- - Delegating write task without confirming approach with user first on novel/uncertain changes
40
- - Not reading the API response body after `await fetch()` silent failure mode
40
+ - Running `osborn --version` starts a live agent instance, creates stray processes in LiveKit room
41
+ - Telling user to look for a permission dialog in their browser when the dialog may have already timed out — retry the agent instead
42
+ - Dismissing "contamination" in logs without checking if it's real data cost a full investigative loop
43
+ - Scoping writer agent tasks too broadly — the dashboard writer autonomously bumped version and published because npm was authenticated and the task was ambiguous about scope
44
+ - Ending a turn with only "opaque work is running" and no conversational engagement
41
45
  </summary>
package/dist/index.js CHANGED
@@ -2994,9 +2994,10 @@ async function main() {
2994
2994
  }
2995
2995
  else {
2996
2996
  try {
2997
- const webhookBase = process.env.FLY_APP_NAME
2998
- ? `https://${process.env.FLY_APP_NAME}.fly.dev`
2999
- : `http://localhost:${apiPort}`;
2997
+ const webhookBase = data.webhookBase ||
2998
+ (process.env.FLY_APP_NAME
2999
+ ? `https://${process.env.FLY_APP_NAME}.fly.dev`
3000
+ : `http://localhost:${apiPort}`);
3000
3001
  await sendToFrontend({ type: 'meeting_joining', message: 'Osborn is joining your meeting...' });
3001
3002
  const botId = await recallJoin.joinMeeting(meetingUrl, webhookBase);
3002
3003
  const sessionId = currentLLM?.sessionId || currentResumeSessionId || 'default';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osborn",
3
- "version": "0.8.30",
3
+ "version": "0.8.31",
4
4
  "description": "Voice AI coding assistant - local agent that connects to Osborn frontend",
5
5
  "type": "module",
6
6
  "bin": {