@agimon-ai/doompi-voice 0.0.1-alpha.89 → 0.0.1-alpha.90
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/apiContracts.cjs +195 -0
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.d.mts.map +1 -1
- package/dist/apiContracts.mjs +195 -0
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/extensions/pi.cjs +2 -2
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.mjs +2 -2
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +2630 -1343
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +2631 -1344
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/web.mjs +1959 -1705
- package/dist/extensions/web.mjs.map +1 -1
- package/dist/{index-BRqic9ab.d.mts → index-B4wnKrcO.d.mts} +19 -4
- package/dist/index-B4wnKrcO.d.mts.map +1 -0
- package/dist/{index-DWWq2RYu.d.mts → index-BmLFvMPE.d.mts} +2 -1
- package/dist/{index-DWWq2RYu.d.mts.map → index-BmLFvMPE.d.mts.map} +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{voiceController-DKBtfNPr.cjs → voiceController-B4etGuZB.cjs} +87 -33
- package/dist/voiceController-B4etGuZB.cjs.map +1 -0
- package/dist/{voiceController-BK-l85i8.mjs → voiceController-C2uxn4yU.mjs} +87 -33
- package/dist/voiceController-C2uxn4yU.mjs.map +1 -0
- package/dist/{voiceModeController-BAYrm_46.mjs → voiceModeController-BI9VneT-.mjs} +103 -59
- package/dist/voiceModeController-BI9VneT-.mjs.map +1 -0
- package/dist/{voiceModeController-BjMnfxqg.cjs → voiceModeController-CoK6mfVY.cjs} +108 -58
- package/dist/voiceModeController-CoK6mfVY.cjs.map +1 -0
- package/dist/voiceWorker.d.mts +1 -1
- package/package.json +10 -10
- package/src/types/realtime.ts +1 -1
- package/src/types/voiceOwnership.ts +30 -6
- package/dist/index-BRqic9ab.d.mts.map +0 -1
- package/dist/voiceController-BK-l85i8.mjs.map +0 -1
- package/dist/voiceController-DKBtfNPr.cjs.map +0 -1
- package/dist/voiceModeController-BAYrm_46.mjs.map +0 -1
- package/dist/voiceModeController-BjMnfxqg.cjs.map +0 -1
package/dist/apiContracts.cjs
CHANGED
|
@@ -163,6 +163,23 @@ const Wake = typebox.Type.Object({
|
|
|
163
163
|
eventEpoch: S,
|
|
164
164
|
sequence: N
|
|
165
165
|
});
|
|
166
|
+
const GlobalLiveStatus = typebox.Type.Object({
|
|
167
|
+
version: typebox.Type.Literal(1),
|
|
168
|
+
state: values([
|
|
169
|
+
"disabled",
|
|
170
|
+
"starting",
|
|
171
|
+
"active",
|
|
172
|
+
"draining",
|
|
173
|
+
"shuttingDown"
|
|
174
|
+
]),
|
|
175
|
+
activeSessionId: typebox.Type.Union([S, typebox.Type.Null()]),
|
|
176
|
+
muted: B,
|
|
177
|
+
error: O(S),
|
|
178
|
+
media: typebox.Type.Object({
|
|
179
|
+
client: B,
|
|
180
|
+
realtime: B
|
|
181
|
+
})
|
|
182
|
+
});
|
|
166
183
|
const Version = { version: typebox.Type.Literal(3) };
|
|
167
184
|
const Targets = typebox.Type.Array(typebox.Type.Object({
|
|
168
185
|
handle: S,
|
|
@@ -483,6 +500,99 @@ const apiContracts = (0, _agimon_ai_doompi_core_apiContracts.defineApiContract)(
|
|
|
483
500
|
}
|
|
484
501
|
}
|
|
485
502
|
},
|
|
503
|
+
...[
|
|
504
|
+
[
|
|
505
|
+
"readiness",
|
|
506
|
+
"/live/agent",
|
|
507
|
+
"GET"
|
|
508
|
+
],
|
|
509
|
+
[
|
|
510
|
+
"prepare",
|
|
511
|
+
"/live/agent/prepare",
|
|
512
|
+
"POST"
|
|
513
|
+
],
|
|
514
|
+
[
|
|
515
|
+
"admit",
|
|
516
|
+
"/live/agent/admit",
|
|
517
|
+
"POST"
|
|
518
|
+
],
|
|
519
|
+
[
|
|
520
|
+
"results",
|
|
521
|
+
"/live/agent/results",
|
|
522
|
+
"GET"
|
|
523
|
+
],
|
|
524
|
+
[
|
|
525
|
+
"ack",
|
|
526
|
+
"/live/agent/results/ack",
|
|
527
|
+
"POST"
|
|
528
|
+
],
|
|
529
|
+
[
|
|
530
|
+
"fence",
|
|
531
|
+
"/live/agent/fence",
|
|
532
|
+
"POST"
|
|
533
|
+
],
|
|
534
|
+
[
|
|
535
|
+
"select",
|
|
536
|
+
"/live/agent/select",
|
|
537
|
+
"POST"
|
|
538
|
+
],
|
|
539
|
+
[
|
|
540
|
+
"revoke",
|
|
541
|
+
"/live/agent/revoke",
|
|
542
|
+
"POST"
|
|
543
|
+
]
|
|
544
|
+
].map(([name, path, method]) => ({
|
|
545
|
+
id: `voice.agent.${name}`,
|
|
546
|
+
scope: "session",
|
|
547
|
+
basePath: "voice",
|
|
548
|
+
path,
|
|
549
|
+
method,
|
|
550
|
+
authentication: "owner",
|
|
551
|
+
description: `Native Voice agent ${name}. Only the host-issued hub bearer can access this route.`,
|
|
552
|
+
parameters: [{
|
|
553
|
+
name: "Authorization",
|
|
554
|
+
in: "header",
|
|
555
|
+
required: true,
|
|
556
|
+
schema: typebox.Type.String({ pattern: "^Bearer .+" })
|
|
557
|
+
}, ...name === "results" ? [
|
|
558
|
+
"activationId",
|
|
559
|
+
"routeGeneration",
|
|
560
|
+
"sessionIncarnation",
|
|
561
|
+
"after"
|
|
562
|
+
].map((key) => ({
|
|
563
|
+
name: key,
|
|
564
|
+
in: "query",
|
|
565
|
+
required: key !== "after",
|
|
566
|
+
schema: S
|
|
567
|
+
})) : []],
|
|
568
|
+
...method === "POST" ? { body: {
|
|
569
|
+
required: true,
|
|
570
|
+
contentType: "application/json",
|
|
571
|
+
schema: name === "select" ? typebox.Type.Object({
|
|
572
|
+
activationId: S,
|
|
573
|
+
routeGeneration: typebox.Type.Integer({ minimum: 1 }),
|
|
574
|
+
transactionId: S,
|
|
575
|
+
sessionIncarnation: S,
|
|
576
|
+
nativeTransferAllowed: B,
|
|
577
|
+
catalog: typebox.Type.Object({
|
|
578
|
+
revision: S,
|
|
579
|
+
targets: typebox.Type.Array(typebox.Type.Object({
|
|
580
|
+
order: typebox.Type.Integer({ minimum: 1 }),
|
|
581
|
+
label: S
|
|
582
|
+
}), { maxItems: 256 })
|
|
583
|
+
})
|
|
584
|
+
}) : name === "revoke" ? typebox.Type.Object({
|
|
585
|
+
activationId: S,
|
|
586
|
+
routeGeneration: typebox.Type.Integer({ minimum: 1 }),
|
|
587
|
+
transactionId: S,
|
|
588
|
+
sessionIncarnation: S
|
|
589
|
+
}) : typebox.Type.Unknown()
|
|
590
|
+
} } : {},
|
|
591
|
+
responses: {
|
|
592
|
+
...(0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(typebox.Type.Unknown()),
|
|
593
|
+
"204": { description: "Agent result acknowledged or route fenced." }
|
|
594
|
+
}
|
|
595
|
+
})),
|
|
486
596
|
{
|
|
487
597
|
id: "voice.peer",
|
|
488
598
|
scope: "global",
|
|
@@ -513,6 +623,21 @@ const apiContracts = (0, _agimon_ai_doompi_core_apiContracts.defineApiContract)(
|
|
|
513
623
|
},
|
|
514
624
|
responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(typebox.Type.Unknown())
|
|
515
625
|
},
|
|
626
|
+
{
|
|
627
|
+
id: "voice.peerAgent",
|
|
628
|
+
scope: "global",
|
|
629
|
+
basePath: "voice",
|
|
630
|
+
path: "/peer-agent",
|
|
631
|
+
method: "POST",
|
|
632
|
+
authentication: "none",
|
|
633
|
+
description: "Accept a signed, replay-guarded, grant-scoped native Voice agent request from a configured peer.",
|
|
634
|
+
body: {
|
|
635
|
+
required: true,
|
|
636
|
+
contentType: "application/json",
|
|
637
|
+
schema: typebox.Type.Unknown()
|
|
638
|
+
},
|
|
639
|
+
responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(typebox.Type.Unknown())
|
|
640
|
+
},
|
|
516
641
|
{
|
|
517
642
|
id: "voice.relayBinding",
|
|
518
643
|
scope: "global",
|
|
@@ -555,6 +680,76 @@ const apiContracts = (0, _agimon_ai_doompi_core_apiContracts.defineApiContract)(
|
|
|
555
680
|
},
|
|
556
681
|
responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(typebox.Type.Unknown())
|
|
557
682
|
},
|
|
683
|
+
{
|
|
684
|
+
id: "voice.nativeTransfer",
|
|
685
|
+
scope: "global",
|
|
686
|
+
basePath: "voice",
|
|
687
|
+
path: "/live/native-transfer",
|
|
688
|
+
method: "POST",
|
|
689
|
+
authentication: "owner",
|
|
690
|
+
description: "Host-only revision-bound native Live transfer. Requires the host hub bearer.",
|
|
691
|
+
parameters: [{
|
|
692
|
+
name: "Authorization",
|
|
693
|
+
in: "header",
|
|
694
|
+
required: true,
|
|
695
|
+
schema: typebox.Type.String({ pattern: "^Bearer .+" })
|
|
696
|
+
}],
|
|
697
|
+
body: {
|
|
698
|
+
required: true,
|
|
699
|
+
contentType: "application/json",
|
|
700
|
+
schema: typebox.Type.Object({
|
|
701
|
+
sourceSessionId: S,
|
|
702
|
+
activationId: S,
|
|
703
|
+
routeGeneration: typebox.Type.Integer({ minimum: 0 }),
|
|
704
|
+
sessionIncarnation: S,
|
|
705
|
+
ordinal: typebox.Type.Integer({ minimum: 1 }),
|
|
706
|
+
catalogRevision: S
|
|
707
|
+
})
|
|
708
|
+
},
|
|
709
|
+
responses: {
|
|
710
|
+
...Errors,
|
|
711
|
+
"202": {
|
|
712
|
+
description: "Transfer requested; source work drains before commit.",
|
|
713
|
+
schema: typebox.Type.Object({ requested: typebox.Type.Literal(true) })
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
},
|
|
717
|
+
{
|
|
718
|
+
id: "voice.liveStatus",
|
|
719
|
+
scope: "global",
|
|
720
|
+
basePath: "voice",
|
|
721
|
+
path: "/live/status",
|
|
722
|
+
method: "GET",
|
|
723
|
+
authentication: "owner",
|
|
724
|
+
description: "Read the host-global live companion state without activating media.",
|
|
725
|
+
responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(GlobalLiveStatus)
|
|
726
|
+
},
|
|
727
|
+
{
|
|
728
|
+
id: "voice.liveControl",
|
|
729
|
+
scope: "global",
|
|
730
|
+
basePath: "voice",
|
|
731
|
+
path: "/live/control",
|
|
732
|
+
method: "POST",
|
|
733
|
+
authentication: "owner",
|
|
734
|
+
description: "Explicitly activate, transfer, mute, interrupt or end the host-global live companion.",
|
|
735
|
+
body: {
|
|
736
|
+
required: true,
|
|
737
|
+
contentType: "application/json",
|
|
738
|
+
schema: typebox.Type.Object({
|
|
739
|
+
action: values([
|
|
740
|
+
"activate",
|
|
741
|
+
"transfer",
|
|
742
|
+
"mute",
|
|
743
|
+
"unmute",
|
|
744
|
+
"interrupt",
|
|
745
|
+
"end"
|
|
746
|
+
]),
|
|
747
|
+
sessionId: O(S),
|
|
748
|
+
expectedSourceSessionId: O(S)
|
|
749
|
+
})
|
|
750
|
+
},
|
|
751
|
+
responses: (0, _agimon_ai_doompi_core_apiContracts.jsonApiResponses)(GlobalLiveStatus)
|
|
752
|
+
},
|
|
558
753
|
{
|
|
559
754
|
id: "voice.readiness",
|
|
560
755
|
scope: "global",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.cjs","names":["defineDoomPluginMethod","Type","Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/voiceControl.ts","../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineDoomPluginMethod } from '@agimon-ai/doompi-core/pluginProtocol';\nimport { Type } from 'typebox';\n\nexport const voiceControlMethod = defineDoomPluginMethod({\n service: 'voice',\n method: 'control',\n scope: 'session',\n direction: 'client-to-server',\n input: Type.Object(\n {\n action: Type.Union(\n ['status', 'manual', 'activate', 'deactivate', 'mute', 'unmute', 'interrupt', 'transfer'].map((value) =>\n Type.Literal(value),\n ),\n ),\n target: Type.Optional(Type.Integer({ minimum: 1 })),\n revision: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n },\n { additionalProperties: false },\n ),\n output: Type.Object(\n {\n state: Type.String(),\n mode: Type.String(),\n manual: Type.String(),\n muted: Type.Boolean(),\n error: Type.Optional(Type.String()),\n },\n { additionalProperties: false },\n ),\n});\n","import { defineApiContract, jsonApiResponses, type DoomHttpContract } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nimport { voiceControlMethod } from './voiceControl';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst values = <T extends string>(items: T[]) => Type.Union(items.map((item) => Type.Literal(item)));\nconst Client = { clientId: S, connectionId: S };\nconst Configuration = Type.Object({\n mode: values(['manual', 'autonomous']),\n activityControl: values(['host', 'client']),\n endpointSilenceMs: O(Type.Integer({ minimum: 250 })),\n});\nconst Playback = { playbackId: S, outcome: values(['completed', 'stopped', 'aborted', 'failed']), error: O(S) };\nconst Sequence = { sequence: N };\nconst Control = values(['mute', 'unmute', 'interrupt']);\nconst Browser = Type.Object({\n connection: values(['connecting', 'connected', 'closed', 'failed']),\n listening: B,\n speaking: B,\n muted: B,\n error: O(S),\n});\nexport const VoiceMediaEventSchema = Type.Union([\n Type.Object({\n ...Sequence,\n type: Type.Literal('capture-start'),\n captureId: S,\n sampleRate: Type.Literal(16000),\n channels: Type.Literal(1),\n bitsPerSample: Type.Literal(16),\n configuration: Configuration,\n }),\n Type.Object({ ...Sequence, type: values(['capture-stop', 'capture-abort']), captureId: S }),\n Type.Object({\n ...Sequence,\n type: Type.Literal('playback-start'),\n playbackId: S,\n text: S,\n delivery: O(values(['client', 'streamed'])),\n voice: O(S),\n rate: O(N),\n }),\n Type.Object({ ...Sequence, type: values(['playback-stop', 'playback-abort']), playbackId: S }),\n Type.Object({ ...Sequence, type: values(['realtime-start', 'realtime-stop']), activationId: S }),\n Type.Object({ ...Sequence, type: Type.Literal('realtime-control'), activationId: S, action: Control }),\n Type.Object({ ...Sequence, type: Type.Literal('realtime-send'), activationId: S, messages: Type.Array(S) }),\n]);\nconst RealtimeEvent = Type.Union([\n Type.Object({ type: Type.Literal('ready') }),\n Type.Object({ type: Type.Literal('transcript'), role: values(['user', 'assistant']), text: S, complete: B }),\n Type.Object({ type: Type.Literal('request'), requestId: S, text: S }),\n Type.Object({ type: Type.Literal('error'), code: S }),\n]);\nconst RealtimeSnapshot = Type.Object({\n activationId: S,\n state: values(['connecting', 'active', 'closed', 'failed']),\n cursor: N,\n events: Type.Array(Type.Object({ sequence: N, event: RealtimeEvent })),\n browser: O(Browser),\n});\nconst Wake = Type.Object({ eventEpoch: S, sequence: N });\nconst Version = { version: Type.Literal(3) };\nconst Targets = Type.Array(Type.Object({ handle: S, label: S, order: N }), { maxItems: 32 });\nconst OwnershipAction = values(['catalog', 'prepare', 'activate', 'deactivate', 'readiness', 'fence']);\nconst Acknowledgement = Type.Object({\n ...Version,\n commandId: S,\n action: OwnershipAction,\n ok: B,\n active: B,\n error: O(S),\n});\nconst Command = Type.Object({\n ...Version,\n commandId: S,\n action: OwnershipAction,\n targets: O(Targets),\n catalogRevision: O(S),\n handoffId: O(S),\n controllerId: O(S),\n leaseId: O(S),\n revision: O(N),\n});\nconst Snapshot = Type.Object({\n registration: O(Type.Object({ ...Version, leaseId: S, revision: N, label: S, eligible: B, active: B })),\n targets: Targets,\n catalogRevision: O(S),\n activation: O(Type.Object({ ...Version, requestId: S })),\n handoff: O(Type.Object({ ...Version, requestId: S, handle: S, catalogRevision: S })),\n acknowledgement: O(Acknowledgement),\n});\nconst Errors = Object.fromEntries(\n [400, 404, 409, 410, 413, 415, 429, 500, 502, 503, 504].map((status) => [\n status,\n { description: 'Voice request failed.', schema: Type.Object({ error: S, code: O(S) }) },\n ]),\n);\nconst route = (\n path: string,\n method: 'GET' | 'POST',\n output?: object,\n input?: object,\n query: string[] = [],\n status = 200,\n): DoomHttpContract => ({\n id: `voice.${path.slice(1).replaceAll('/', '.')}`,\n scope: 'session',\n basePath: 'voice-media',\n path,\n method,\n authentication: 'owner',\n description: `Voice media ${path}.`,\n ...(path.startsWith('/host/') || path.startsWith('/hub/')\n ? { availability: 'Internal broker route; requires the host-issued bearer token for this route namespace.' }\n : {}),\n parameters: [\n ...query.map((name) => ({ name, in: 'query' as const, required: !['after', 'wait'].includes(name), schema: S })),\n ...(path.startsWith('/host/') || path.startsWith('/hub/')\n ? [\n {\n name: 'Authorization',\n in: 'header' as const,\n required: true,\n schema: Type.String({ pattern: '^Bearer .+' }),\n },\n ]\n : []),\n ],\n ...(input ? { body: { required: true, contentType: 'application/json', schema: input } } : {}),\n responses: {\n ...Errors,\n [output ? status : 204]: {\n description: output ? 'Voice response.' : 'Accepted with no response body.',\n ...(output ? { schema: output } : {}),\n },\n },\n});\nconst pcm = (path: string, method: 'GET' | 'POST', query: string[]): DoomHttpContract => {\n const result = route(path, method, undefined, undefined, query);\n result.description =\n 'PCM signed 16-bit little-endian, 16000 Hz, mono. Chunks contain complete samples. Activity headers carry state, level, elapsed time, epoch and speech duration. A 204 response carries x-doompi-capture-state or x-doompi-playback-state when applicable.';\n if (method === 'POST') result.body = { required: true, contentType: 'application/vnd.doompi.pcm-s16le', schema: S };\n else\n result.responses['200'] = { description: 'PCM bytes.', contentType: 'application/vnd.doompi.pcm-s16le', schema: S };\n return result;\n};\nexport const apiContracts = defineApiContract({\n version: 1,\n protocols: { 'voice-media': '6', 'voice-ownership': '3' },\n dynamic: ['Realtime event strings and SDP are provider-defined protocol documents passed through the media broker.'],\n http: [\n {\n id: 'voice.status',\n scope: 'session',\n basePath: 'voice',\n path: '/status',\n method: 'GET',\n authentication: 'owner',\n description: 'Voice session status and media readiness.',\n responses: jsonApiResponses(\n Type.Object({\n ...voiceControlMethod.output.properties,\n media: Type.Object({ closed: B, capture: B, playback: B, realtime: B }),\n readiness: Type.Object({\n configured: B,\n transcription: B,\n error: O(S),\n engine: O(S),\n mode: O(S),\n correctionModel: O(S),\n }),\n }),\n ),\n },\n {\n id: 'voice.control.http',\n scope: 'session',\n basePath: 'voice',\n path: '/control',\n method: 'POST',\n authentication: 'owner',\n description: 'Control the voice session.',\n body: { required: true, contentType: 'application/json', schema: voiceControlMethod.input },\n responses: jsonApiResponses(voiceControlMethod.output),\n },\n route(\n '/client/connect',\n 'POST',\n Type.Object({ version: Type.Literal(6), cursor: N, eventEpoch: O(S), heartbeatMs: O(N) }),\n Type.Object({\n version: Type.Literal(6),\n ...Client,\n clientKind: values(['browser', 'native']),\n controlLocation: values(['local', 'remote']),\n capabilities: Type.Object({\n capture: B,\n playback: B,\n captureActivity: B,\n autonomousOrchestration: B,\n playbackDucking: O(B),\n realtime: O(B),\n }),\n }),\n ),\n route('/client/disconnect', 'POST', undefined, Type.Object(Client)),\n route('/client/heartbeat', 'POST', Wake, Type.Object(Client)),\n {\n ...route('/client/events', 'GET', VoiceMediaEventSchema, undefined, [\n 'clientId',\n 'connectionId',\n 'after',\n 'wait',\n ]),\n responses: {\n ...Errors,\n '200': { description: 'Next event.', schema: VoiceMediaEventSchema },\n '204': { description: 'No pending event.' },\n },\n },\n pcm('/client/audio', 'POST', ['clientId', 'connectionId', 'captureId']),\n route('/client/capture-stopped', 'POST', undefined, Type.Object({ ...Client, captureId: S, error: O(S) })),\n pcm('/client/playback-audio', 'GET', ['clientId', 'connectionId', 'playbackId']),\n route('/client/playback-result', 'POST', undefined, Type.Object({ ...Client, ...Playback })),\n route(\n '/host/capture/start',\n 'POST',\n Type.Object({ configuration: Configuration }),\n Type.Object({ captureId: S, configuration: O(Configuration) }),\n [],\n 201,\n ),\n pcm('/host/capture/audio', 'GET', ['captureId']),\n ...['stop', 'abort'].map((action) =>\n route(`/host/capture/${action}`, 'POST', undefined, Type.Object({ captureId: S })),\n ),\n route(\n '/host/playback/start',\n 'POST',\n Type.Object({ delivery: values(['client', 'streamed']) }),\n Type.Object({ playbackId: S, text: S, voice: O(S), rate: O(N) }),\n [],\n 201,\n ),\n pcm('/host/playback/audio', 'POST', ['playbackId']),\n route('/host/playback/audio-end', 'POST', undefined, Type.Object({ playbackId: S, error: O(S) })),\n {\n ...route('/host/playback/result', 'GET', Type.Object(Playback), undefined, ['playbackId']),\n responses: {\n ...Errors,\n '200': { description: 'Playback outcome.', schema: Type.Object(Playback) },\n '204': { description: 'Playback is pending.' },\n },\n },\n ...['stop', 'abort'].map((action) =>\n route(`/host/playback/${action}`, 'POST', undefined, Type.Object({ playbackId: S })),\n ),\n route('/hub/ownership/state', 'GET', Snapshot),\n route('/hub/ownership/command', 'POST', Acknowledgement, Command),\n route('/host/ownership/sync', 'POST', Type.Object({ command: O(Command) }), Snapshot),\n route(\n '/host/realtime/start',\n 'POST',\n Type.Object({}),\n Type.Object({ activationId: S, instructions: Type.String({ maxLength: 16384 }) }),\n [],\n 201,\n ),\n route('/host/realtime/stop', 'POST', undefined, Type.Object({ activationId: S })),\n route('/host/realtime/poll', 'GET', RealtimeSnapshot, undefined, ['activationId', 'after']),\n route(\n '/host/realtime/send',\n 'POST',\n undefined,\n Type.Object({ activationId: S, messages: Type.Array(S, { maxItems: 64 }) }),\n ),\n route('/host/realtime/control', 'POST', undefined, Type.Object({ activationId: S, action: Control })),\n route(\n '/client/realtime/negotiate',\n 'POST',\n Type.Object({ sdp: S }),\n Type.Object({ ...Client, activationId: S, sdp: S }),\n ),\n route('/client/realtime/event', 'POST', undefined, Type.Object({ ...Client, activationId: S, event: S })),\n route('/client/realtime/state', 'POST', undefined, Type.Object({ ...Client, activationId: S, state: Browser })),\n {\n id: 'voice.manual',\n scope: 'session',\n basePath: 'voice-media',\n path: '/manual/transcribe',\n method: 'POST',\n authentication: 'owner',\n description: 'Transcribe at most 4 MiB of WebM/Opus or MP4/AAC audio, at most 300000 milliseconds.',\n parameters: [\n {\n name: 'x-doom-audio-duration-ms',\n in: 'header',\n required: true,\n schema: Type.Integer({ minimum: 0, maximum: 300000 }),\n },\n ],\n body: { required: true, contentType: 'audio/webm', contentTypes: ['audio/webm', 'audio/mp4'], schema: S },\n responses: { ...Errors, '200': { description: 'Transcript.', schema: Type.Object({ transcript: S }) } },\n },\n {\n id: 'voice.peer',\n scope: 'global',\n basePath: 'voice',\n path: '/peer',\n method: 'POST',\n authentication: 'none',\n description: 'Accept an HMAC-authenticated bounded Voice media relay request from a configured peer.',\n body: { required: true, contentType: 'application/json', schema: Type.Unknown() },\n responses: jsonApiResponses(Type.Unknown()),\n },\n {\n id: 'voice.peerOwnership',\n scope: 'global',\n basePath: 'voice',\n path: '/peer-ownership',\n method: 'POST',\n authentication: 'none',\n description: 'Discover and stage Voice ownership through an HMAC-authenticated paired host.',\n body: { required: true, contentType: 'application/json', schema: Type.Unknown() },\n responses: jsonApiResponses(Type.Unknown()),\n },\n {\n id: 'voice.relayBinding',\n scope: 'global',\n basePath: 'voice',\n path: '/relay-binding',\n method: 'POST',\n authentication: 'owner',\n description: 'Issue an expiring controller-bound handle for a granted paired Voice session.',\n body: { required: true, contentType: 'application/json', schema: Type.Object({ target: S, connectionId: S }) },\n responses: jsonApiResponses(Type.Object({ binding: S, expiresAt: N })),\n },\n {\n id: 'voice.relay',\n scope: 'global',\n basePath: 'voice',\n path: '/relay',\n method: 'POST',\n authentication: 'owner',\n description: 'Relay a browser Voice media operation through an expiring controller-bound handle.',\n parameters: [{ name: 'binding', in: 'query', required: true, schema: S }],\n body: { required: true, contentType: 'application/json', schema: Type.Unknown() },\n responses: jsonApiResponses(Type.Unknown()),\n },\n {\n id: 'voice.readiness',\n scope: 'global',\n basePath: 'voice',\n path: '/readiness',\n method: 'GET',\n authentication: 'owner',\n description: 'Read configured voice readiness.',\n responses: jsonApiResponses(\n Type.Object({\n configured: B,\n transcription: B,\n error: O(S),\n engine: O(S),\n mode: O(S),\n correctionModel: O(S),\n }),\n ),\n },\n ],\n sockets: [\n {\n id: 'voice.control',\n scope: 'session',\n service: voiceControlMethod.service,\n member: voiceControlMethod.method,\n kind: 'method',\n direction: 'client-to-server',\n description: 'Voice session control through the scoped plugin service.',\n input: voiceControlMethod.input,\n output: voiceControlMethod.output,\n },\n ...(['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'voice.wake',\n scope,\n service: 'doompi.hub.v1',\n member: 'voice_media_wake',\n kind: 'channel' as const,\n direction: 'server-to-client' as const,\n description: 'Voice media wake channel payload.',\n input: Wake,\n },\n {\n id: 'voice.ownership',\n scope,\n service: 'doompi.hub.v1',\n member: 'voice_ownership',\n kind: 'channel' as const,\n direction: 'server-to-client' as const,\n description: 'Browser media ownership channel payload.',\n input: Type.Object({\n type: Type.Literal('browser-media-session'),\n ...Version,\n activeSessionId: Type.Union([S, Type.Null()]),\n }),\n },\n ]),\n ],\n});\nexport default apiContracts;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"apiContracts.cjs","names":["defineDoomPluginMethod","Type","Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/voiceControl.ts","../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineDoomPluginMethod } from '@agimon-ai/doompi-core/pluginProtocol';\nimport { Type } from 'typebox';\n\nexport const voiceControlMethod = defineDoomPluginMethod({\n service: 'voice',\n method: 'control',\n scope: 'session',\n direction: 'client-to-server',\n input: Type.Object(\n {\n action: Type.Union(\n ['status', 'manual', 'activate', 'deactivate', 'mute', 'unmute', 'interrupt', 'transfer'].map((value) =>\n Type.Literal(value),\n ),\n ),\n target: Type.Optional(Type.Integer({ minimum: 1 })),\n revision: Type.Optional(Type.String({ minLength: 1, maxLength: 128 })),\n },\n { additionalProperties: false },\n ),\n output: Type.Object(\n {\n state: Type.String(),\n mode: Type.String(),\n manual: Type.String(),\n muted: Type.Boolean(),\n error: Type.Optional(Type.String()),\n },\n { additionalProperties: false },\n ),\n});\n","import { defineApiContract, jsonApiResponses, type DoomHttpContract } from '@agimon-ai/doompi-core/apiContracts';\nimport { Type } from 'typebox';\n\nimport { voiceControlMethod } from './voiceControl';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst B = Type.Boolean();\nconst O = Type.Optional;\nconst values = <T extends string>(items: T[]) => Type.Union(items.map((item) => Type.Literal(item)));\nconst Client = { clientId: S, connectionId: S };\nconst Configuration = Type.Object({\n mode: values(['manual', 'autonomous']),\n activityControl: values(['host', 'client']),\n endpointSilenceMs: O(Type.Integer({ minimum: 250 })),\n});\nconst Playback = { playbackId: S, outcome: values(['completed', 'stopped', 'aborted', 'failed']), error: O(S) };\nconst Sequence = { sequence: N };\nconst Control = values(['mute', 'unmute', 'interrupt']);\nconst Browser = Type.Object({\n connection: values(['connecting', 'connected', 'closed', 'failed']),\n listening: B,\n speaking: B,\n muted: B,\n error: O(S),\n});\nexport const VoiceMediaEventSchema = Type.Union([\n Type.Object({\n ...Sequence,\n type: Type.Literal('capture-start'),\n captureId: S,\n sampleRate: Type.Literal(16000),\n channels: Type.Literal(1),\n bitsPerSample: Type.Literal(16),\n configuration: Configuration,\n }),\n Type.Object({ ...Sequence, type: values(['capture-stop', 'capture-abort']), captureId: S }),\n Type.Object({\n ...Sequence,\n type: Type.Literal('playback-start'),\n playbackId: S,\n text: S,\n delivery: O(values(['client', 'streamed'])),\n voice: O(S),\n rate: O(N),\n }),\n Type.Object({ ...Sequence, type: values(['playback-stop', 'playback-abort']), playbackId: S }),\n Type.Object({ ...Sequence, type: values(['realtime-start', 'realtime-stop']), activationId: S }),\n Type.Object({ ...Sequence, type: Type.Literal('realtime-control'), activationId: S, action: Control }),\n Type.Object({ ...Sequence, type: Type.Literal('realtime-send'), activationId: S, messages: Type.Array(S) }),\n]);\nconst RealtimeEvent = Type.Union([\n Type.Object({ type: Type.Literal('ready') }),\n Type.Object({ type: Type.Literal('transcript'), role: values(['user', 'assistant']), text: S, complete: B }),\n Type.Object({ type: Type.Literal('request'), requestId: S, text: S }),\n Type.Object({ type: Type.Literal('error'), code: S }),\n]);\nconst RealtimeSnapshot = Type.Object({\n activationId: S,\n state: values(['connecting', 'active', 'closed', 'failed']),\n cursor: N,\n events: Type.Array(Type.Object({ sequence: N, event: RealtimeEvent })),\n browser: O(Browser),\n});\nconst Wake = Type.Object({ eventEpoch: S, sequence: N });\nconst GlobalLiveStatus = Type.Object({\n version: Type.Literal(1),\n state: values(['disabled', 'starting', 'active', 'draining', 'shuttingDown']),\n activeSessionId: Type.Union([S, Type.Null()]),\n muted: B,\n error: O(S),\n media: Type.Object({ client: B, realtime: B }),\n});\nconst Version = { version: Type.Literal(3) };\nconst Targets = Type.Array(Type.Object({ handle: S, label: S, order: N }), { maxItems: 32 });\nconst OwnershipAction = values(['catalog', 'prepare', 'activate', 'deactivate', 'readiness', 'fence']);\nconst Acknowledgement = Type.Object({\n ...Version,\n commandId: S,\n action: OwnershipAction,\n ok: B,\n active: B,\n error: O(S),\n});\nconst Command = Type.Object({\n ...Version,\n commandId: S,\n action: OwnershipAction,\n targets: O(Targets),\n catalogRevision: O(S),\n handoffId: O(S),\n controllerId: O(S),\n leaseId: O(S),\n revision: O(N),\n});\nconst Snapshot = Type.Object({\n registration: O(Type.Object({ ...Version, leaseId: S, revision: N, label: S, eligible: B, active: B })),\n targets: Targets,\n catalogRevision: O(S),\n activation: O(Type.Object({ ...Version, requestId: S })),\n handoff: O(Type.Object({ ...Version, requestId: S, handle: S, catalogRevision: S })),\n acknowledgement: O(Acknowledgement),\n});\nconst Errors = Object.fromEntries(\n [400, 404, 409, 410, 413, 415, 429, 500, 502, 503, 504].map((status) => [\n status,\n { description: 'Voice request failed.', schema: Type.Object({ error: S, code: O(S) }) },\n ]),\n);\nconst route = (\n path: string,\n method: 'GET' | 'POST',\n output?: object,\n input?: object,\n query: string[] = [],\n status = 200,\n): DoomHttpContract => ({\n id: `voice.${path.slice(1).replaceAll('/', '.')}`,\n scope: 'session',\n basePath: 'voice-media',\n path,\n method,\n authentication: 'owner',\n description: `Voice media ${path}.`,\n ...(path.startsWith('/host/') || path.startsWith('/hub/')\n ? { availability: 'Internal broker route; requires the host-issued bearer token for this route namespace.' }\n : {}),\n parameters: [\n ...query.map((name) => ({ name, in: 'query' as const, required: !['after', 'wait'].includes(name), schema: S })),\n ...(path.startsWith('/host/') || path.startsWith('/hub/')\n ? [\n {\n name: 'Authorization',\n in: 'header' as const,\n required: true,\n schema: Type.String({ pattern: '^Bearer .+' }),\n },\n ]\n : []),\n ],\n ...(input ? { body: { required: true, contentType: 'application/json', schema: input } } : {}),\n responses: {\n ...Errors,\n [output ? status : 204]: {\n description: output ? 'Voice response.' : 'Accepted with no response body.',\n ...(output ? { schema: output } : {}),\n },\n },\n});\nconst pcm = (path: string, method: 'GET' | 'POST', query: string[]): DoomHttpContract => {\n const result = route(path, method, undefined, undefined, query);\n result.description =\n 'PCM signed 16-bit little-endian, 16000 Hz, mono. Chunks contain complete samples. Activity headers carry state, level, elapsed time, epoch and speech duration. A 204 response carries x-doompi-capture-state or x-doompi-playback-state when applicable.';\n if (method === 'POST') result.body = { required: true, contentType: 'application/vnd.doompi.pcm-s16le', schema: S };\n else\n result.responses['200'] = { description: 'PCM bytes.', contentType: 'application/vnd.doompi.pcm-s16le', schema: S };\n return result;\n};\nexport const apiContracts = defineApiContract({\n version: 1,\n protocols: { 'voice-media': '6', 'voice-ownership': '3' },\n dynamic: ['Realtime event strings and SDP are provider-defined protocol documents passed through the media broker.'],\n http: [\n {\n id: 'voice.status',\n scope: 'session',\n basePath: 'voice',\n path: '/status',\n method: 'GET',\n authentication: 'owner',\n description: 'Voice session status and media readiness.',\n responses: jsonApiResponses(\n Type.Object({\n ...voiceControlMethod.output.properties,\n media: Type.Object({ closed: B, capture: B, playback: B, realtime: B }),\n readiness: Type.Object({\n configured: B,\n transcription: B,\n error: O(S),\n engine: O(S),\n mode: O(S),\n correctionModel: O(S),\n }),\n }),\n ),\n },\n {\n id: 'voice.control.http',\n scope: 'session',\n basePath: 'voice',\n path: '/control',\n method: 'POST',\n authentication: 'owner',\n description: 'Control the voice session.',\n body: { required: true, contentType: 'application/json', schema: voiceControlMethod.input },\n responses: jsonApiResponses(voiceControlMethod.output),\n },\n route(\n '/client/connect',\n 'POST',\n Type.Object({ version: Type.Literal(6), cursor: N, eventEpoch: O(S), heartbeatMs: O(N) }),\n Type.Object({\n version: Type.Literal(6),\n ...Client,\n clientKind: values(['browser', 'native']),\n controlLocation: values(['local', 'remote']),\n capabilities: Type.Object({\n capture: B,\n playback: B,\n captureActivity: B,\n autonomousOrchestration: B,\n playbackDucking: O(B),\n realtime: O(B),\n }),\n }),\n ),\n route('/client/disconnect', 'POST', undefined, Type.Object(Client)),\n route('/client/heartbeat', 'POST', Wake, Type.Object(Client)),\n {\n ...route('/client/events', 'GET', VoiceMediaEventSchema, undefined, [\n 'clientId',\n 'connectionId',\n 'after',\n 'wait',\n ]),\n responses: {\n ...Errors,\n '200': { description: 'Next event.', schema: VoiceMediaEventSchema },\n '204': { description: 'No pending event.' },\n },\n },\n pcm('/client/audio', 'POST', ['clientId', 'connectionId', 'captureId']),\n route('/client/capture-stopped', 'POST', undefined, Type.Object({ ...Client, captureId: S, error: O(S) })),\n pcm('/client/playback-audio', 'GET', ['clientId', 'connectionId', 'playbackId']),\n route('/client/playback-result', 'POST', undefined, Type.Object({ ...Client, ...Playback })),\n route(\n '/host/capture/start',\n 'POST',\n Type.Object({ configuration: Configuration }),\n Type.Object({ captureId: S, configuration: O(Configuration) }),\n [],\n 201,\n ),\n pcm('/host/capture/audio', 'GET', ['captureId']),\n ...['stop', 'abort'].map((action) =>\n route(`/host/capture/${action}`, 'POST', undefined, Type.Object({ captureId: S })),\n ),\n route(\n '/host/playback/start',\n 'POST',\n Type.Object({ delivery: values(['client', 'streamed']) }),\n Type.Object({ playbackId: S, text: S, voice: O(S), rate: O(N) }),\n [],\n 201,\n ),\n pcm('/host/playback/audio', 'POST', ['playbackId']),\n route('/host/playback/audio-end', 'POST', undefined, Type.Object({ playbackId: S, error: O(S) })),\n {\n ...route('/host/playback/result', 'GET', Type.Object(Playback), undefined, ['playbackId']),\n responses: {\n ...Errors,\n '200': { description: 'Playback outcome.', schema: Type.Object(Playback) },\n '204': { description: 'Playback is pending.' },\n },\n },\n ...['stop', 'abort'].map((action) =>\n route(`/host/playback/${action}`, 'POST', undefined, Type.Object({ playbackId: S })),\n ),\n route('/hub/ownership/state', 'GET', Snapshot),\n route('/hub/ownership/command', 'POST', Acknowledgement, Command),\n route('/host/ownership/sync', 'POST', Type.Object({ command: O(Command) }), Snapshot),\n route(\n '/host/realtime/start',\n 'POST',\n Type.Object({}),\n Type.Object({ activationId: S, instructions: Type.String({ maxLength: 16384 }) }),\n [],\n 201,\n ),\n route('/host/realtime/stop', 'POST', undefined, Type.Object({ activationId: S })),\n route('/host/realtime/poll', 'GET', RealtimeSnapshot, undefined, ['activationId', 'after']),\n route(\n '/host/realtime/send',\n 'POST',\n undefined,\n Type.Object({ activationId: S, messages: Type.Array(S, { maxItems: 64 }) }),\n ),\n route('/host/realtime/control', 'POST', undefined, Type.Object({ activationId: S, action: Control })),\n route(\n '/client/realtime/negotiate',\n 'POST',\n Type.Object({ sdp: S }),\n Type.Object({ ...Client, activationId: S, sdp: S }),\n ),\n route('/client/realtime/event', 'POST', undefined, Type.Object({ ...Client, activationId: S, event: S })),\n route('/client/realtime/state', 'POST', undefined, Type.Object({ ...Client, activationId: S, state: Browser })),\n {\n id: 'voice.manual',\n scope: 'session',\n basePath: 'voice-media',\n path: '/manual/transcribe',\n method: 'POST',\n authentication: 'owner',\n description: 'Transcribe at most 4 MiB of WebM/Opus or MP4/AAC audio, at most 300000 milliseconds.',\n parameters: [\n {\n name: 'x-doom-audio-duration-ms',\n in: 'header',\n required: true,\n schema: Type.Integer({ minimum: 0, maximum: 300000 }),\n },\n ],\n body: { required: true, contentType: 'audio/webm', contentTypes: ['audio/webm', 'audio/mp4'], schema: S },\n responses: { ...Errors, '200': { description: 'Transcript.', schema: Type.Object({ transcript: S }) } },\n },\n ...(\n [\n ['readiness', '/live/agent', 'GET'],\n ['prepare', '/live/agent/prepare', 'POST'],\n ['admit', '/live/agent/admit', 'POST'],\n ['results', '/live/agent/results', 'GET'],\n ['ack', '/live/agent/results/ack', 'POST'],\n ['fence', '/live/agent/fence', 'POST'],\n ['select', '/live/agent/select', 'POST'],\n ['revoke', '/live/agent/revoke', 'POST'],\n ] as const\n ).map(([name, path, method]): DoomHttpContract => ({\n id: `voice.agent.${name}`,\n scope: 'session',\n basePath: 'voice',\n path,\n method,\n authentication: 'owner',\n description: `Native Voice agent ${name}. Only the host-issued hub bearer can access this route.`,\n parameters: [\n { name: 'Authorization', in: 'header', required: true, schema: Type.String({ pattern: '^Bearer .+' }) },\n ...(name === 'results'\n ? ['activationId', 'routeGeneration', 'sessionIncarnation', 'after'].map((key) => ({\n name: key,\n in: 'query' as const,\n required: key !== 'after',\n schema: S,\n }))\n : []),\n ],\n ...(method === 'POST'\n ? {\n body: {\n required: true,\n contentType: 'application/json',\n schema:\n name === 'select'\n ? Type.Object({\n activationId: S,\n routeGeneration: Type.Integer({ minimum: 1 }),\n transactionId: S,\n sessionIncarnation: S,\n nativeTransferAllowed: B,\n catalog: Type.Object({\n revision: S,\n targets: Type.Array(Type.Object({ order: Type.Integer({ minimum: 1 }), label: S }), {\n maxItems: 256,\n }),\n }),\n })\n : name === 'revoke'\n ? Type.Object({\n activationId: S,\n routeGeneration: Type.Integer({ minimum: 1 }),\n transactionId: S,\n sessionIncarnation: S,\n })\n : Type.Unknown(),\n },\n }\n : {}),\n responses: {\n ...jsonApiResponses(Type.Unknown()),\n '204': { description: 'Agent result acknowledged or route fenced.' },\n },\n })),\n {\n id: 'voice.peer',\n scope: 'global',\n basePath: 'voice',\n path: '/peer',\n method: 'POST',\n authentication: 'none',\n description: 'Accept an HMAC-authenticated bounded Voice media relay request from a configured peer.',\n body: { required: true, contentType: 'application/json', schema: Type.Unknown() },\n responses: jsonApiResponses(Type.Unknown()),\n },\n {\n id: 'voice.peerOwnership',\n scope: 'global',\n basePath: 'voice',\n path: '/peer-ownership',\n method: 'POST',\n authentication: 'none',\n description: 'Discover and stage Voice ownership through an HMAC-authenticated paired host.',\n body: { required: true, contentType: 'application/json', schema: Type.Unknown() },\n responses: jsonApiResponses(Type.Unknown()),\n },\n {\n id: 'voice.peerAgent',\n scope: 'global',\n basePath: 'voice',\n path: '/peer-agent',\n method: 'POST',\n authentication: 'none',\n description: 'Accept a signed, replay-guarded, grant-scoped native Voice agent request from a configured peer.',\n body: { required: true, contentType: 'application/json', schema: Type.Unknown() },\n responses: jsonApiResponses(Type.Unknown()),\n },\n {\n id: 'voice.relayBinding',\n scope: 'global',\n basePath: 'voice',\n path: '/relay-binding',\n method: 'POST',\n authentication: 'owner',\n description: 'Issue an expiring controller-bound handle for a granted paired Voice session.',\n body: { required: true, contentType: 'application/json', schema: Type.Object({ target: S, connectionId: S }) },\n responses: jsonApiResponses(Type.Object({ binding: S, expiresAt: N })),\n },\n {\n id: 'voice.relay',\n scope: 'global',\n basePath: 'voice',\n path: '/relay',\n method: 'POST',\n authentication: 'owner',\n description: 'Relay a browser Voice media operation through an expiring controller-bound handle.',\n parameters: [{ name: 'binding', in: 'query', required: true, schema: S }],\n body: { required: true, contentType: 'application/json', schema: Type.Unknown() },\n responses: jsonApiResponses(Type.Unknown()),\n },\n {\n id: 'voice.nativeTransfer',\n scope: 'global',\n basePath: 'voice',\n path: '/live/native-transfer',\n method: 'POST',\n authentication: 'owner',\n description: 'Host-only revision-bound native Live transfer. Requires the host hub bearer.',\n parameters: [\n { name: 'Authorization', in: 'header', required: true, schema: Type.String({ pattern: '^Bearer .+' }) },\n ],\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n sourceSessionId: S,\n activationId: S,\n routeGeneration: Type.Integer({ minimum: 0 }),\n sessionIncarnation: S,\n ordinal: Type.Integer({ minimum: 1 }),\n catalogRevision: S,\n }),\n },\n responses: {\n ...Errors,\n '202': {\n description: 'Transfer requested; source work drains before commit.',\n schema: Type.Object({ requested: Type.Literal(true) }),\n },\n },\n },\n {\n id: 'voice.liveStatus',\n scope: 'global',\n basePath: 'voice',\n path: '/live/status',\n method: 'GET',\n authentication: 'owner',\n description: 'Read the host-global live companion state without activating media.',\n responses: jsonApiResponses(GlobalLiveStatus),\n },\n {\n id: 'voice.liveControl',\n scope: 'global',\n basePath: 'voice',\n path: '/live/control',\n method: 'POST',\n authentication: 'owner',\n description: 'Explicitly activate, transfer, mute, interrupt or end the host-global live companion.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n action: values(['activate', 'transfer', 'mute', 'unmute', 'interrupt', 'end']),\n sessionId: O(S),\n expectedSourceSessionId: O(S),\n }),\n },\n responses: jsonApiResponses(GlobalLiveStatus),\n },\n {\n id: 'voice.readiness',\n scope: 'global',\n basePath: 'voice',\n path: '/readiness',\n method: 'GET',\n authentication: 'owner',\n description: 'Read configured voice readiness.',\n responses: jsonApiResponses(\n Type.Object({\n configured: B,\n transcription: B,\n error: O(S),\n engine: O(S),\n mode: O(S),\n correctionModel: O(S),\n }),\n ),\n },\n ],\n sockets: [\n {\n id: 'voice.control',\n scope: 'session',\n service: voiceControlMethod.service,\n member: voiceControlMethod.method,\n kind: 'method',\n direction: 'client-to-server',\n description: 'Voice session control through the scoped plugin service.',\n input: voiceControlMethod.input,\n output: voiceControlMethod.output,\n },\n ...(['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'voice.wake',\n scope,\n service: 'doompi.hub.v1',\n member: 'voice_media_wake',\n kind: 'channel' as const,\n direction: 'server-to-client' as const,\n description: 'Voice media wake channel payload.',\n input: Wake,\n },\n {\n id: 'voice.ownership',\n scope,\n service: 'doompi.hub.v1',\n member: 'voice_ownership',\n kind: 'channel' as const,\n direction: 'server-to-client' as const,\n description: 'Browser media ownership channel payload.',\n input: Type.Object({\n type: Type.Literal('browser-media-session'),\n ...Version,\n activeSessionId: Type.Union([S, Type.Null()]),\n }),\n },\n ]),\n ],\n});\nexport default apiContracts;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBA8Ja"}
|
package/dist/apiContracts.mjs
CHANGED
|
@@ -160,6 +160,23 @@ const Wake = Type.Object({
|
|
|
160
160
|
eventEpoch: S,
|
|
161
161
|
sequence: N
|
|
162
162
|
});
|
|
163
|
+
const GlobalLiveStatus = Type.Object({
|
|
164
|
+
version: Type.Literal(1),
|
|
165
|
+
state: values([
|
|
166
|
+
"disabled",
|
|
167
|
+
"starting",
|
|
168
|
+
"active",
|
|
169
|
+
"draining",
|
|
170
|
+
"shuttingDown"
|
|
171
|
+
]),
|
|
172
|
+
activeSessionId: Type.Union([S, Type.Null()]),
|
|
173
|
+
muted: B,
|
|
174
|
+
error: O(S),
|
|
175
|
+
media: Type.Object({
|
|
176
|
+
client: B,
|
|
177
|
+
realtime: B
|
|
178
|
+
})
|
|
179
|
+
});
|
|
163
180
|
const Version = { version: Type.Literal(3) };
|
|
164
181
|
const Targets = Type.Array(Type.Object({
|
|
165
182
|
handle: S,
|
|
@@ -480,6 +497,99 @@ const apiContracts = defineApiContract({
|
|
|
480
497
|
}
|
|
481
498
|
}
|
|
482
499
|
},
|
|
500
|
+
...[
|
|
501
|
+
[
|
|
502
|
+
"readiness",
|
|
503
|
+
"/live/agent",
|
|
504
|
+
"GET"
|
|
505
|
+
],
|
|
506
|
+
[
|
|
507
|
+
"prepare",
|
|
508
|
+
"/live/agent/prepare",
|
|
509
|
+
"POST"
|
|
510
|
+
],
|
|
511
|
+
[
|
|
512
|
+
"admit",
|
|
513
|
+
"/live/agent/admit",
|
|
514
|
+
"POST"
|
|
515
|
+
],
|
|
516
|
+
[
|
|
517
|
+
"results",
|
|
518
|
+
"/live/agent/results",
|
|
519
|
+
"GET"
|
|
520
|
+
],
|
|
521
|
+
[
|
|
522
|
+
"ack",
|
|
523
|
+
"/live/agent/results/ack",
|
|
524
|
+
"POST"
|
|
525
|
+
],
|
|
526
|
+
[
|
|
527
|
+
"fence",
|
|
528
|
+
"/live/agent/fence",
|
|
529
|
+
"POST"
|
|
530
|
+
],
|
|
531
|
+
[
|
|
532
|
+
"select",
|
|
533
|
+
"/live/agent/select",
|
|
534
|
+
"POST"
|
|
535
|
+
],
|
|
536
|
+
[
|
|
537
|
+
"revoke",
|
|
538
|
+
"/live/agent/revoke",
|
|
539
|
+
"POST"
|
|
540
|
+
]
|
|
541
|
+
].map(([name, path, method]) => ({
|
|
542
|
+
id: `voice.agent.${name}`,
|
|
543
|
+
scope: "session",
|
|
544
|
+
basePath: "voice",
|
|
545
|
+
path,
|
|
546
|
+
method,
|
|
547
|
+
authentication: "owner",
|
|
548
|
+
description: `Native Voice agent ${name}. Only the host-issued hub bearer can access this route.`,
|
|
549
|
+
parameters: [{
|
|
550
|
+
name: "Authorization",
|
|
551
|
+
in: "header",
|
|
552
|
+
required: true,
|
|
553
|
+
schema: Type.String({ pattern: "^Bearer .+" })
|
|
554
|
+
}, ...name === "results" ? [
|
|
555
|
+
"activationId",
|
|
556
|
+
"routeGeneration",
|
|
557
|
+
"sessionIncarnation",
|
|
558
|
+
"after"
|
|
559
|
+
].map((key) => ({
|
|
560
|
+
name: key,
|
|
561
|
+
in: "query",
|
|
562
|
+
required: key !== "after",
|
|
563
|
+
schema: S
|
|
564
|
+
})) : []],
|
|
565
|
+
...method === "POST" ? { body: {
|
|
566
|
+
required: true,
|
|
567
|
+
contentType: "application/json",
|
|
568
|
+
schema: name === "select" ? Type.Object({
|
|
569
|
+
activationId: S,
|
|
570
|
+
routeGeneration: Type.Integer({ minimum: 1 }),
|
|
571
|
+
transactionId: S,
|
|
572
|
+
sessionIncarnation: S,
|
|
573
|
+
nativeTransferAllowed: B,
|
|
574
|
+
catalog: Type.Object({
|
|
575
|
+
revision: S,
|
|
576
|
+
targets: Type.Array(Type.Object({
|
|
577
|
+
order: Type.Integer({ minimum: 1 }),
|
|
578
|
+
label: S
|
|
579
|
+
}), { maxItems: 256 })
|
|
580
|
+
})
|
|
581
|
+
}) : name === "revoke" ? Type.Object({
|
|
582
|
+
activationId: S,
|
|
583
|
+
routeGeneration: Type.Integer({ minimum: 1 }),
|
|
584
|
+
transactionId: S,
|
|
585
|
+
sessionIncarnation: S
|
|
586
|
+
}) : Type.Unknown()
|
|
587
|
+
} } : {},
|
|
588
|
+
responses: {
|
|
589
|
+
...jsonApiResponses(Type.Unknown()),
|
|
590
|
+
"204": { description: "Agent result acknowledged or route fenced." }
|
|
591
|
+
}
|
|
592
|
+
})),
|
|
483
593
|
{
|
|
484
594
|
id: "voice.peer",
|
|
485
595
|
scope: "global",
|
|
@@ -510,6 +620,21 @@ const apiContracts = defineApiContract({
|
|
|
510
620
|
},
|
|
511
621
|
responses: jsonApiResponses(Type.Unknown())
|
|
512
622
|
},
|
|
623
|
+
{
|
|
624
|
+
id: "voice.peerAgent",
|
|
625
|
+
scope: "global",
|
|
626
|
+
basePath: "voice",
|
|
627
|
+
path: "/peer-agent",
|
|
628
|
+
method: "POST",
|
|
629
|
+
authentication: "none",
|
|
630
|
+
description: "Accept a signed, replay-guarded, grant-scoped native Voice agent request from a configured peer.",
|
|
631
|
+
body: {
|
|
632
|
+
required: true,
|
|
633
|
+
contentType: "application/json",
|
|
634
|
+
schema: Type.Unknown()
|
|
635
|
+
},
|
|
636
|
+
responses: jsonApiResponses(Type.Unknown())
|
|
637
|
+
},
|
|
513
638
|
{
|
|
514
639
|
id: "voice.relayBinding",
|
|
515
640
|
scope: "global",
|
|
@@ -552,6 +677,76 @@ const apiContracts = defineApiContract({
|
|
|
552
677
|
},
|
|
553
678
|
responses: jsonApiResponses(Type.Unknown())
|
|
554
679
|
},
|
|
680
|
+
{
|
|
681
|
+
id: "voice.nativeTransfer",
|
|
682
|
+
scope: "global",
|
|
683
|
+
basePath: "voice",
|
|
684
|
+
path: "/live/native-transfer",
|
|
685
|
+
method: "POST",
|
|
686
|
+
authentication: "owner",
|
|
687
|
+
description: "Host-only revision-bound native Live transfer. Requires the host hub bearer.",
|
|
688
|
+
parameters: [{
|
|
689
|
+
name: "Authorization",
|
|
690
|
+
in: "header",
|
|
691
|
+
required: true,
|
|
692
|
+
schema: Type.String({ pattern: "^Bearer .+" })
|
|
693
|
+
}],
|
|
694
|
+
body: {
|
|
695
|
+
required: true,
|
|
696
|
+
contentType: "application/json",
|
|
697
|
+
schema: Type.Object({
|
|
698
|
+
sourceSessionId: S,
|
|
699
|
+
activationId: S,
|
|
700
|
+
routeGeneration: Type.Integer({ minimum: 0 }),
|
|
701
|
+
sessionIncarnation: S,
|
|
702
|
+
ordinal: Type.Integer({ minimum: 1 }),
|
|
703
|
+
catalogRevision: S
|
|
704
|
+
})
|
|
705
|
+
},
|
|
706
|
+
responses: {
|
|
707
|
+
...Errors,
|
|
708
|
+
"202": {
|
|
709
|
+
description: "Transfer requested; source work drains before commit.",
|
|
710
|
+
schema: Type.Object({ requested: Type.Literal(true) })
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
id: "voice.liveStatus",
|
|
716
|
+
scope: "global",
|
|
717
|
+
basePath: "voice",
|
|
718
|
+
path: "/live/status",
|
|
719
|
+
method: "GET",
|
|
720
|
+
authentication: "owner",
|
|
721
|
+
description: "Read the host-global live companion state without activating media.",
|
|
722
|
+
responses: jsonApiResponses(GlobalLiveStatus)
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
id: "voice.liveControl",
|
|
726
|
+
scope: "global",
|
|
727
|
+
basePath: "voice",
|
|
728
|
+
path: "/live/control",
|
|
729
|
+
method: "POST",
|
|
730
|
+
authentication: "owner",
|
|
731
|
+
description: "Explicitly activate, transfer, mute, interrupt or end the host-global live companion.",
|
|
732
|
+
body: {
|
|
733
|
+
required: true,
|
|
734
|
+
contentType: "application/json",
|
|
735
|
+
schema: Type.Object({
|
|
736
|
+
action: values([
|
|
737
|
+
"activate",
|
|
738
|
+
"transfer",
|
|
739
|
+
"mute",
|
|
740
|
+
"unmute",
|
|
741
|
+
"interrupt",
|
|
742
|
+
"end"
|
|
743
|
+
]),
|
|
744
|
+
sessionId: O(S),
|
|
745
|
+
expectedSourceSessionId: O(S)
|
|
746
|
+
})
|
|
747
|
+
},
|
|
748
|
+
responses: jsonApiResponses(GlobalLiveStatus)
|
|
749
|
+
},
|
|
555
750
|
{
|
|
556
751
|
id: "voice.readiness",
|
|
557
752
|
scope: "global",
|