{"version":3,"sources":["../../src/voice/agent_activity_speech_lifecycle.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { describe, expect, it, vi } from 'vitest';\nimport { Future, type Task } from '../utils.js';\nimport { AgentActivity, SchedulingPausedError } from './agent_activity.js';\nimport { SpeechHandle } from './speech_handle.js';\n\ninterface AgentActivitySpeechLifecycle {\n  scheduleSpeech(speechHandle: SpeechHandle, priority: number, force?: boolean): void;\n  createSpeechTask(options: {\n    taskFn: (controller: AbortController) => Promise<void>;\n    controller?: AbortController;\n    ownedSpeechHandle?: SpeechHandle;\n    inlineTask?: boolean;\n    name?: string;\n  }): Task<void>;\n}\n\nconst activityLifecycle = AgentActivity.prototype as unknown as AgentActivitySpeechLifecycle;\n\ndescribe('AgentActivity speech lifecycle', () => {\n  it('interrupts speech refused while scheduling is paused', () => {\n    const warn = vi.fn();\n    const activity = Object.assign(Object.create(AgentActivity.prototype), {\n      _schedulingPaused: true,\n      logger: { warn },\n    }) as AgentActivity;\n    const speechHandle = SpeechHandle.create({ allowInterruptions: false });\n\n    try {\n      expect(() =>\n        activityLifecycle.scheduleSpeech.call(\n          activity,\n          speechHandle,\n          SpeechHandle.SPEECH_PRIORITY_NORMAL,\n        ),\n      ).toThrow(SchedulingPausedError);\n      expect(speechHandle.interrupted).toBe(true);\n      expect(warn).toHaveBeenCalledOnce();\n    } finally {\n      speechHandle._markDone();\n    }\n  });\n\n  it('interrupts speech when the scheduling task has already stopped', () => {\n    const warn = vi.fn();\n    const activity = Object.assign(Object.create(AgentActivity.prototype), {\n      _schedulingPaused: false,\n      _mainTask: { done: true },\n      logger: { warn },\n    }) as AgentActivity;\n    const speechHandle = SpeechHandle.create({ allowInterruptions: false });\n\n    try {\n      expect(() =>\n        activityLifecycle.scheduleSpeech.call(\n          activity,\n          speechHandle,\n          SpeechHandle.SPEECH_PRIORITY_NORMAL,\n        ),\n      ).not.toThrow();\n      expect(speechHandle.interrupted).toBe(true);\n      expect(warn).toHaveBeenCalledOnce();\n    } finally {\n      speechHandle._markDone();\n    }\n  });\n\n  it('interrupts owned speech when its task is canceled', async () => {\n    const speechTasks = new Set<Task<void>>();\n    const activity = Object.assign(Object.create(AgentActivity.prototype), {\n      speechTasks,\n      wakeupMainTask: vi.fn(),\n    }) as AgentActivity;\n    const speechHandle = SpeechHandle.create({ allowInterruptions: false });\n    const taskStarted = new Future<void>();\n    const task = activityLifecycle.createSpeechTask.call(activity, {\n      taskFn: async (controller) => {\n        taskStarted.resolve();\n        await new Promise<void>((resolve) => {\n          controller.signal.addEventListener('abort', () => resolve(), { once: true });\n        });\n      },\n      ownedSpeechHandle: speechHandle,\n      name: 'owned-speech-test',\n    });\n\n    await taskStarted.await;\n    await task.cancelAndWait();\n\n    expect(task.done).toBe(true);\n    expect(speechHandle.interrupted).toBe(true);\n  });\n});\n"],"mappings":";AAGA,oBAAyC;AACzC,mBAAkC;AAClC,4BAAqD;AACrD,2BAA6B;AAa7B,MAAM,oBAAoB,oCAAc;AAAA,IAExC,wBAAS,kCAAkC,MAAM;AAC/C,wBAAG,wDAAwD,MAAM;AAC/D,UAAM,OAAO,iBAAG,GAAG;AACnB,UAAM,WAAW,OAAO,OAAO,OAAO,OAAO,oCAAc,SAAS,GAAG;AAAA,MACrE,mBAAmB;AAAA,MACnB,QAAQ,EAAE,KAAK;AAAA,IACjB,CAAC;AACD,UAAM,eAAe,kCAAa,OAAO,EAAE,oBAAoB,MAAM,CAAC;AAEtE,QAAI;AACF;AAAA,QAAO,MACL,kBAAkB,eAAe;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,kCAAa;AAAA,QACf;AAAA,MACF,EAAE,QAAQ,2CAAqB;AAC/B,gCAAO,aAAa,WAAW,EAAE,KAAK,IAAI;AAC1C,gCAAO,IAAI,EAAE,qBAAqB;AAAA,IACpC,UAAE;AACA,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF,CAAC;AAED,wBAAG,kEAAkE,MAAM;AACzE,UAAM,OAAO,iBAAG,GAAG;AACnB,UAAM,WAAW,OAAO,OAAO,OAAO,OAAO,oCAAc,SAAS,GAAG;AAAA,MACrE,mBAAmB;AAAA,MACnB,WAAW,EAAE,MAAM,KAAK;AAAA,MACxB,QAAQ,EAAE,KAAK;AAAA,IACjB,CAAC;AACD,UAAM,eAAe,kCAAa,OAAO,EAAE,oBAAoB,MAAM,CAAC;AAEtE,QAAI;AACF;AAAA,QAAO,MACL,kBAAkB,eAAe;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,kCAAa;AAAA,QACf;AAAA,MACF,EAAE,IAAI,QAAQ;AACd,gCAAO,aAAa,WAAW,EAAE,KAAK,IAAI;AAC1C,gCAAO,IAAI,EAAE,qBAAqB;AAAA,IACpC,UAAE;AACA,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF,CAAC;AAED,wBAAG,qDAAqD,YAAY;AAClE,UAAM,cAAc,oBAAI,IAAgB;AACxC,UAAM,WAAW,OAAO,OAAO,OAAO,OAAO,oCAAc,SAAS,GAAG;AAAA,MACrE;AAAA,MACA,gBAAgB,iBAAG,GAAG;AAAA,IACxB,CAAC;AACD,UAAM,eAAe,kCAAa,OAAO,EAAE,oBAAoB,MAAM,CAAC;AACtE,UAAM,cAAc,IAAI,oBAAa;AACrC,UAAM,OAAO,kBAAkB,iBAAiB,KAAK,UAAU;AAAA,MAC7D,QAAQ,OAAO,eAAe;AAC5B,oBAAY,QAAQ;AACpB,cAAM,IAAI,QAAc,CAAC,YAAY;AACnC,qBAAW,OAAO,iBAAiB,SAAS,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,QAC7E,CAAC;AAAA,MACH;AAAA,MACA,mBAAmB;AAAA,MACnB,MAAM;AAAA,IACR,CAAC;AAED,UAAM,YAAY;AAClB,UAAM,KAAK,cAAc;AAEzB,8BAAO,KAAK,IAAI,EAAE,KAAK,IAAI;AAC3B,8BAAO,aAAa,WAAW,EAAE,KAAK,IAAI;AAAA,EAC5C,CAAC;AACH,CAAC;","names":[]}