osborn 0.9.84 → 0.9.85

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
@@ -4624,7 +4624,11 @@ async function main() {
4624
4624
  // pipeline at all. Recall captures the meeting audio internally
4625
4625
  // and we pull the transcript via its REST API every ~30s.
4626
4626
  await sendToFrontend({ type: 'meeting_joining', message: 'Osborn is joining your meeting...' });
4627
- const botId = await recallJoin.joinMeeting(meetingUrl, webhookBase);
4627
+ // 0.9.85: optional castUrl — a webpage to display as the bot's
4628
+ // camera (live feed / seeded site). Passed from the frontend or
4629
+ // env OSBORN_MEETING_CAST_URL for testing.
4630
+ const castUrl = data.castUrl || process.env.OSBORN_MEETING_CAST_URL || undefined;
4631
+ const botId = await recallJoin.joinMeeting(meetingUrl, webhookBase, { castUrl });
4628
4632
  const sessionId = currentLLM?.sessionId || currentResumeSessionId || 'default';
4629
4633
  recallJoin.registerBot(botId, sessionId);
4630
4634
  activeMeetingBotId = botId;
@@ -81,6 +81,7 @@ export declare class RecallClient extends EventEmitter {
81
81
  */
82
82
  joinMeeting(meetingUrl: string, webhookBaseUrl: string, opts?: {
83
83
  botName?: string;
84
+ castUrl?: string;
84
85
  }): Promise<string>;
85
86
  /**
86
87
  * Fetch the bot's current transcript. Returns an array of "transcript turns"
@@ -23,6 +23,19 @@ export class RecallClient extends EventEmitter {
23
23
  */
24
24
  async joinMeeting(meetingUrl, webhookBaseUrl, opts) {
25
25
  const botName = opts?.botName ?? 'Osborn';
26
+ // 0.9.85: optional CAST — display a webpage as the bot's camera in the
27
+ // meeting (Recall output_media, the piece the v0.9.44 rewrite removed).
28
+ // Point castUrl at the session-engine live-feed viewer, a seeded site
29
+ // (e.g. voice-native's LinkedIn), or a research/output page. This is the
30
+ // "the client sees content" visual side of the copilot. Left off by
31
+ // default (silent, invisible observer) — only casts when castUrl is set.
32
+ const cast = opts?.castUrl && /^https?:\/\//.test(opts.castUrl)
33
+ ? { output_media: { camera: { kind: 'webpage', config: { url: opts.castUrl } } } }
34
+ : {};
35
+ if (opts?.castUrl && !Object.keys(cast).length)
36
+ console.log(`⚠️ castUrl ignored (not http(s)): ${opts.castUrl}`);
37
+ else if (Object.keys(cast).length)
38
+ console.log(`📺 Meeting cast enabled — bot camera = ${opts.castUrl}`);
26
39
  // 0.9.84: LIVE transcript via realtime_endpoints. The v0.9.44 rewrite
27
40
  // removed this and left only 30s polling of the batch download_url — but
28
41
  // that URL is a POST-PROCESSING artifact (empty until the meeting ends),
@@ -58,6 +71,7 @@ export class RecallClient extends EventEmitter {
58
71
  body: JSON.stringify({
59
72
  meeting_url: meetingUrl,
60
73
  bot_name: botName,
74
+ ...cast,
61
75
  recording_config: {
62
76
  transcript: {
63
77
  provider: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "osborn",
3
- "version": "0.9.84",
3
+ "version": "0.9.85",
4
4
  "description": "Voice AI coding assistant - local agent that connects to Osborn frontend",
5
5
  "type": "module",
6
6
  "bin": {