osborn 0.8.29 → 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.
@@ -0,0 +1,45 @@
1
+ # Learned Behaviors
2
+
3
+ Auto-extracted from voice sessions via PreCompact.
4
+ Last updated: 2026-05-01 | Session: unknown...
5
+
6
+ USER CORRECTIONS:
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
12
+
13
+ USER PREFERENCES:
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
20
+
21
+ DOMAIN KNOWLEDGE:
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
32
+
33
+ EFFECTIVE PATTERNS:
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
38
+
39
+ ANTI-PATTERNS:
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
45
+ </summary>
package/dist/index.js CHANGED
@@ -1112,7 +1112,7 @@ async function main() {
1112
1112
  // Wall-clock timer: capture when audio actually starts playing (first frame)
1113
1113
  // Used as fallback if LiveKit's playbackPosition is 0 (race condition)
1114
1114
  let playbackStartedAt = null;
1115
- const audioOutputRef = currentSession?._activity?.agentSession?.output?.audio;
1115
+ const audioOutputRef = currentSession?.output?.audio;
1116
1116
  if (audioOutputRef && typeof audioOutputRef.on === 'function') {
1117
1117
  const onPlaybackStarted = () => {
1118
1118
  playbackStartedAt = Date.now();
@@ -1124,7 +1124,7 @@ async function main() {
1124
1124
  handle.addDoneCallback((sh) => {
1125
1125
  if (sh.interrupted) {
1126
1126
  console.log(`🔇 [${sayId}] session.say INTERRUPTED`);
1127
- const audioOutput = currentSession?._activity?.agentSession?.output?.audio;
1127
+ const audioOutput = currentSession?.output?.audio;
1128
1128
  const sdkTranscript = audioOutput?.lastPlaybackEvent?.synchronizedTranscript;
1129
1129
  const sdkPlaybackSec = audioOutput?.lastPlaybackEvent?.playbackPosition ?? 0;
1130
1130
  let spokenText;
@@ -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.29",
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": {