osborn 0.9.76 → 0.9.78

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.
package/dist/index.js CHANGED
@@ -1169,8 +1169,34 @@ async function main() {
1169
1169
  console.log(`🎯 DIRECT MODE: ${directConfig.stt.provider} STT → Claude Agent SDK → ${directConfig.tts.provider} TTS`);
1170
1170
  console.log(' 🔥 Full coding capabilities!');
1171
1171
  }
1172
- // Determine room code
1173
- const roomCode = cliArgs.roomCode || generateRoomCode();
1172
+ // Determine room code. STABLE PER MACHINE, derived from identity we
1173
+ // already have: the Fly app name (one app per user). No new storage, no
1174
+ // rotation — the same user always lands in the same room, and the room
1175
+ // name itself binds to the machine identity. Rotation previously raced
1176
+ // any client that fetched /room-code just before a restart (observed
1177
+ // 2026-07-28: tester joined osborn-bz2m8n while the rebooted agent created
1178
+ // fnz7nz — stuck "Connecting..." forever; idle-exit stop/start cycles made
1179
+ // this common). Local/dev fallback: persist a generated code so restarts
1180
+ // stay stable there too.
1181
+ const identityCode = process.env.FLY_APP_NAME?.replace(/^osborn-/, '') || null;
1182
+ const roomCodeFile = join(homedir(), '.osborn', 'room-code');
1183
+ let persistedRoomCode = null;
1184
+ if (!identityCode) {
1185
+ try {
1186
+ persistedRoomCode = readFileSync(roomCodeFile, 'utf8').trim() || null;
1187
+ }
1188
+ catch { /* first boot */ }
1189
+ }
1190
+ const roomCode = cliArgs.roomCode || identityCode || persistedRoomCode || generateRoomCode();
1191
+ if (!cliArgs.roomCode && !identityCode && roomCode !== persistedRoomCode) {
1192
+ try {
1193
+ mkdirSync(dirname(roomCodeFile), { recursive: true });
1194
+ writeFileSync(roomCodeFile, roomCode);
1195
+ }
1196
+ catch (e) {
1197
+ console.warn('⚠️ could not persist room code (rotation race protection disabled):', e instanceof Error ? e.message : e);
1198
+ }
1199
+ }
1174
1200
  currentRoomCode = roomCode;
1175
1201
  const roomName = `osborn-${roomCode}`;
1176
1202
  if (cliArgs.roomCode) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osborn",
3
- "version": "0.9.76",
3
+ "version": "0.9.78",
4
4
  "description": "Voice AI coding assistant - local agent that connects to Osborn frontend",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,4 @@
1
+ {
2
+ "status": "failed",
3
+ "failedTests": []
4
+ }