hci-atrium 0.1.0

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.
Files changed (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -0
  3. package/dist/atrium.d.ts +522 -0
  4. package/dist/atrium.d.ts.map +1 -0
  5. package/dist/atrium.js +806 -0
  6. package/dist/atrium.js.map +1 -0
  7. package/dist/auth.d.ts +85 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +369 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/by.d.ts +84 -0
  12. package/dist/by.d.ts.map +1 -0
  13. package/dist/by.js +87 -0
  14. package/dist/by.js.map +1 -0
  15. package/dist/decider.d.ts +40 -0
  16. package/dist/decider.d.ts.map +1 -0
  17. package/dist/decider.js +76 -0
  18. package/dist/decider.js.map +1 -0
  19. package/dist/discovery.d.ts +15 -0
  20. package/dist/discovery.d.ts.map +1 -0
  21. package/dist/discovery.js +38 -0
  22. package/dist/discovery.js.map +1 -0
  23. package/dist/env.d.ts +11 -0
  24. package/dist/env.d.ts.map +1 -0
  25. package/dist/env.js +28 -0
  26. package/dist/env.js.map +1 -0
  27. package/dist/errors.d.ts +67 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +86 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/files.d.ts +7 -0
  32. package/dist/files.d.ts.map +1 -0
  33. package/dist/files.js +2 -0
  34. package/dist/files.js.map +1 -0
  35. package/dist/http.d.ts +11 -0
  36. package/dist/http.d.ts.map +1 -0
  37. package/dist/http.js +21 -0
  38. package/dist/http.js.map +1 -0
  39. package/dist/index.d.ts +17 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +14 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/models.d.ts +456 -0
  44. package/dist/models.d.ts.map +1 -0
  45. package/dist/models.js +487 -0
  46. package/dist/models.js.map +1 -0
  47. package/dist/pkce.d.ts +16 -0
  48. package/dist/pkce.d.ts.map +1 -0
  49. package/dist/pkce.js +40 -0
  50. package/dist/pkce.js.map +1 -0
  51. package/dist/react/index.d.ts +37 -0
  52. package/dist/react/index.d.ts.map +1 -0
  53. package/dist/react/index.js +89 -0
  54. package/dist/react/index.js.map +1 -0
  55. package/dist/rooms/armed-set.d.ts +33 -0
  56. package/dist/rooms/armed-set.d.ts.map +1 -0
  57. package/dist/rooms/armed-set.js +65 -0
  58. package/dist/rooms/armed-set.js.map +1 -0
  59. package/dist/rooms/brokers.d.ts +62 -0
  60. package/dist/rooms/brokers.d.ts.map +1 -0
  61. package/dist/rooms/brokers.js +109 -0
  62. package/dist/rooms/brokers.js.map +1 -0
  63. package/dist/rooms/codec.d.ts +100 -0
  64. package/dist/rooms/codec.d.ts.map +1 -0
  65. package/dist/rooms/codec.js +101 -0
  66. package/dist/rooms/codec.js.map +1 -0
  67. package/dist/rooms/index.d.ts +40 -0
  68. package/dist/rooms/index.d.ts.map +1 -0
  69. package/dist/rooms/index.js +45 -0
  70. package/dist/rooms/index.js.map +1 -0
  71. package/dist/rooms/offer-capture.d.ts +96 -0
  72. package/dist/rooms/offer-capture.d.ts.map +1 -0
  73. package/dist/rooms/offer-capture.js +338 -0
  74. package/dist/rooms/offer-capture.js.map +1 -0
  75. package/dist/rooms/offer-transcription.d.ts +63 -0
  76. package/dist/rooms/offer-transcription.d.ts.map +1 -0
  77. package/dist/rooms/offer-transcription.js +231 -0
  78. package/dist/rooms/offer-transcription.js.map +1 -0
  79. package/dist/rooms/participant.d.ts +35 -0
  80. package/dist/rooms/participant.d.ts.map +1 -0
  81. package/dist/rooms/participant.js +53 -0
  82. package/dist/rooms/participant.js.map +1 -0
  83. package/dist/rooms/recorder.d.ts +74 -0
  84. package/dist/rooms/recorder.d.ts.map +1 -0
  85. package/dist/rooms/recorder.js +157 -0
  86. package/dist/rooms/recorder.js.map +1 -0
  87. package/dist/rooms/room.d.ts +542 -0
  88. package/dist/rooms/room.d.ts.map +1 -0
  89. package/dist/rooms/room.js +1357 -0
  90. package/dist/rooms/room.js.map +1 -0
  91. package/dist/rooms/snippet.d.ts +48 -0
  92. package/dist/rooms/snippet.d.ts.map +1 -0
  93. package/dist/rooms/snippet.js +70 -0
  94. package/dist/rooms/snippet.js.map +1 -0
  95. package/dist/rooms/sse.d.ts +102 -0
  96. package/dist/rooms/sse.d.ts.map +1 -0
  97. package/dist/rooms/sse.js +347 -0
  98. package/dist/rooms/sse.js.map +1 -0
  99. package/dist/rooms/standing-source.d.ts +190 -0
  100. package/dist/rooms/standing-source.d.ts.map +1 -0
  101. package/dist/rooms/standing-source.js +431 -0
  102. package/dist/rooms/standing-source.js.map +1 -0
  103. package/dist/rooms/transcriber.d.ts +81 -0
  104. package/dist/rooms/transcriber.d.ts.map +1 -0
  105. package/dist/rooms/transcriber.js +111 -0
  106. package/dist/rooms/transcriber.js.map +1 -0
  107. package/dist/rooms/transport-shared.d.ts +28 -0
  108. package/dist/rooms/transport-shared.d.ts.map +1 -0
  109. package/dist/rooms/transport-shared.js +42 -0
  110. package/dist/rooms/transport-shared.js.map +1 -0
  111. package/dist/rooms/transport.d.ts +161 -0
  112. package/dist/rooms/transport.d.ts.map +1 -0
  113. package/dist/rooms/transport.js +258 -0
  114. package/dist/rooms/transport.js.map +1 -0
  115. package/dist/shaping/assets.d.ts +42 -0
  116. package/dist/shaping/assets.d.ts.map +1 -0
  117. package/dist/shaping/assets.js +77 -0
  118. package/dist/shaping/assets.js.map +1 -0
  119. package/dist/shaping/chat.d.ts +39 -0
  120. package/dist/shaping/chat.d.ts.map +1 -0
  121. package/dist/shaping/chat.js +62 -0
  122. package/dist/shaping/chat.js.map +1 -0
  123. package/dist/shaping/index.d.ts +14 -0
  124. package/dist/shaping/index.d.ts.map +1 -0
  125. package/dist/shaping/index.js +13 -0
  126. package/dist/shaping/index.js.map +1 -0
  127. package/dist/shaping/library.d.ts +84 -0
  128. package/dist/shaping/library.d.ts.map +1 -0
  129. package/dist/shaping/library.js +288 -0
  130. package/dist/shaping/library.js.map +1 -0
  131. package/dist/shaping/request.d.ts +47 -0
  132. package/dist/shaping/request.d.ts.map +1 -0
  133. package/dist/shaping/request.js +25 -0
  134. package/dist/shaping/request.js.map +1 -0
  135. package/dist/shaping/rooms.d.ts +128 -0
  136. package/dist/shaping/rooms.d.ts.map +1 -0
  137. package/dist/shaping/rooms.js +330 -0
  138. package/dist/shaping/rooms.js.map +1 -0
  139. package/dist/shaping/sources.d.ts +29 -0
  140. package/dist/shaping/sources.d.ts.map +1 -0
  141. package/dist/shaping/sources.js +51 -0
  142. package/dist/shaping/sources.js.map +1 -0
  143. package/dist/shaping/structured.d.ts +47 -0
  144. package/dist/shaping/structured.d.ts.map +1 -0
  145. package/dist/shaping/structured.js +115 -0
  146. package/dist/shaping/structured.js.map +1 -0
  147. package/dist/storage.d.ts +36 -0
  148. package/dist/storage.d.ts.map +1 -0
  149. package/dist/storage.js +86 -0
  150. package/dist/storage.js.map +1 -0
  151. package/dist/transcribe-stream.d.ts +81 -0
  152. package/dist/transcribe-stream.d.ts.map +1 -0
  153. package/dist/transcribe-stream.js +253 -0
  154. package/dist/transcribe-stream.js.map +1 -0
  155. package/dist/transcribe.d.ts +57 -0
  156. package/dist/transcribe.d.ts.map +1 -0
  157. package/dist/transcribe.js +267 -0
  158. package/dist/transcribe.js.map +1 -0
  159. package/dist/types.d.ts +20 -0
  160. package/dist/types.d.ts.map +1 -0
  161. package/dist/types.js +3 -0
  162. package/dist/types.js.map +1 -0
  163. package/package.json +56 -0
@@ -0,0 +1,128 @@
1
+ /** Sessions + rooms REST request shaping (mirror of ``_shaping`` room/session helpers). */
2
+ import type { ShapedRequest } from "./request.js";
3
+ export interface BuildRoomOpenInput {
4
+ name?: string;
5
+ project?: string;
6
+ embeddingSpace?: string;
7
+ }
8
+ /** Build the ``POST /v1/rooms`` body. ``project`` is already resolved. */
9
+ export declare function buildRoomOpen(input: BuildRoomOpenInput): ShapedRequest;
10
+ /** Build a ``POST /v1/rooms/{id}/rotate-code`` request (mint a fresh join code; no body). */
11
+ export declare function buildRoomRotateCode(roomId: string): ShapedRequest;
12
+ /** Build a ``GET /v1/rooms/resolve?code=…`` request (join-by-code lookup). */
13
+ export declare function buildRoomResolve(code: string): ShapedRequest;
14
+ export interface BuildRoomSignalInput {
15
+ type: string;
16
+ payload?: Record<string, unknown>;
17
+ source?: string | null;
18
+ ephemeral?: boolean;
19
+ connectionId?: string | null;
20
+ to?: string | string[] | null;
21
+ includeSelf?: boolean;
22
+ ackId?: string | null;
23
+ replyTo?: string | null;
24
+ }
25
+ /**
26
+ * Build the ``POST /v1/rooms/{id}/signal`` envelope — the REST signal wire (the cross-SDK contract
27
+ * pinned by the fixture corpus, and the Python SDK's send path). The live TS Room sends over its
28
+ * WebSocket instead, but the wire body is identical field-for-field, so this is the canonical shape.
29
+ */
30
+ export declare function buildRoomSignal(roomId: string, input: BuildRoomSignalInput): ShapedRequest;
31
+ export interface BuildPlayInput {
32
+ source: unknown;
33
+ layer?: string;
34
+ mode?: string;
35
+ transition?: string;
36
+ repeat?: boolean;
37
+ shuffle?: boolean;
38
+ }
39
+ /** Build a ``play`` signal body — one sound or an array, each coerced to a track dict. */
40
+ export declare function buildPlayBody(input: BuildPlayInput): Record<string, unknown>;
41
+ /** Build a ``layer.clear`` body (``layer`` omitted → ``"default"``; ``"*"`` → every layer). */
42
+ export declare function buildLayerClearBody(layer?: string, fadeOutMs?: number): Record<string, unknown>;
43
+ /**
44
+ * Build a ``layer.effects`` body, e.g. ``{ lowpass: { hz: 700 } }`` for a backroom muffle. The
45
+ * ``effects`` state is passed through as-is — ``lowpass`` / ``highpass`` / ``reverb`` / ``echo`` are
46
+ * all live keys (an absent implemented key ramps back to neutral). ``layer`` may be ``"*"`` to apply
47
+ * to every existing layer (mirrors ``layer.clear``'s wildcard).
48
+ */
49
+ export declare function buildLayerEffectsBody(layer: string, effects: Record<string, unknown>, fadeMs?: number): Record<string, unknown>;
50
+ export interface BuildLayerPositionInput {
51
+ layer: string;
52
+ x: number;
53
+ y: number;
54
+ z?: number;
55
+ fadeMs?: number;
56
+ distance?: Record<string, unknown>;
57
+ }
58
+ /**
59
+ * Build a ``layer.position`` body — ramped whole-layer HRTF placement. ``z`` defaults to 0; the
60
+ * optional ``distance`` attenuation config (``{ model, ref, max, rolloff }``) and ``fadeMs`` are
61
+ * omitted when absent (``distance`` absent → direction-only, today's behaviour). No ``"*"`` wildcard.
62
+ */
63
+ export declare function buildLayerPositionBody(input: BuildLayerPositionInput): Record<string, unknown>;
64
+ export interface BuildShowInput {
65
+ assetId?: string;
66
+ url?: string;
67
+ caption?: string;
68
+ projection?: string;
69
+ }
70
+ /**
71
+ * Build a ``show`` signal body. Exactly one of ``assetId`` / ``url`` must be given (both or neither
72
+ * throws); ``projection`` (when present) must be ``"flat"`` or ``"360"``. Absent keys are omitted —
73
+ * no nulls on the wire. camelCase API in, snake_case wire out.
74
+ */
75
+ export declare function buildShowBody(input: BuildShowInput): Record<string, unknown>;
76
+ export interface BuildSessionStartInput {
77
+ project?: string;
78
+ name?: string;
79
+ participantRef?: string;
80
+ condition?: string;
81
+ meta?: Record<string, unknown>;
82
+ }
83
+ /** Build the ``POST /v1/sessions`` body. ``project`` is already resolved. */
84
+ export declare function buildSessionStart(input: BuildSessionStartInput): ShapedRequest;
85
+ /** Build ``POST /v1/sessions/{id}/recordings`` — open a room-capture recording in a session (the
86
+ * offer-capture chunked wire; mirror of Python's inline ``_open_recording`` call). */
87
+ export declare function buildRecordingCreate(sessionId: string, input: {
88
+ sourceName: string | null;
89
+ contentType: string;
90
+ }): ShapedRequest;
91
+ /** Build ``PUT /v1/sessions/{id}/recordings/{rid}/chunks`` — append one raw clip to an open
92
+ * recording (the clip's bytes as the body, its mime as the Content-Type). */
93
+ export declare function buildRecordingChunk(sessionId: string, recordingId: string, data: ArrayBuffer, contentType: string): ShapedRequest;
94
+ /** Build ``POST /v1/sessions/{id}/recordings/{rid}/finalize`` — close an open recording (no body). */
95
+ export declare function buildRecordingFinalize(sessionId: string, recordingId: string): ShapedRequest;
96
+ export interface BuildSessionEventInput {
97
+ type: string;
98
+ payload?: Record<string, unknown>;
99
+ source?: string;
100
+ via?: Record<string, unknown>;
101
+ }
102
+ /** Build a ``POST /v1/sessions/{id}/events`` body. */
103
+ export declare function buildSessionEvent(sessionId: string, input: BuildSessionEventInput): ShapedRequest;
104
+ /** Build a ``GET /v1/sessions`` list request. ``project`` (already resolved) filters by project;
105
+ * ``phase`` (a string or list) rides as repeated ``phase=`` query params — the empty string ``""``
106
+ * matches sessions with no phase set. */
107
+ export declare function buildSessionsList(input: {
108
+ project?: string;
109
+ phase?: string | string[];
110
+ }): ShapedRequest;
111
+ /** Build a ``GET /v1/sessions/{id}/events/history`` request (durable log, ``seq > after``). */
112
+ export declare function buildSessionEvents(sessionId: string, input?: {
113
+ after?: number;
114
+ limit?: number;
115
+ }): ShapedRequest;
116
+ /** The fixed export formats — each maps to a distinct ``/export/`` route segment (there is no
117
+ * ``?format=`` param server-side). */
118
+ export type SessionExportFormat = "jsonl" | "csv" | "transcript" | "bundle";
119
+ /** The multi-session bundle endpoint's per-call distinct-id cap (sessions/router.py). */
120
+ export declare const SESSION_EXPORT_IDS_MAX = 100;
121
+ /** Build a single-session export ``GET`` request, dispatching ``format`` to its fixed route. */
122
+ export declare function buildSessionExport(sessionId: string, format: SessionExportFormat): ShapedRequest;
123
+ /** Dedup export ids (order-preserving) and enforce the server's per-call cap — throw (never
124
+ * truncate / chunk) when exceeded or empty, naming the cap. */
125
+ export declare function distinctExportIds(ids: string[]): string[];
126
+ /** Build the multi-session ``GET /v1/sessions/export/bundle`` request (``ids`` already deduped). */
127
+ export declare function buildSessionExportBundle(ids: string[]): ShapedRequest;
128
+ //# sourceMappingURL=rooms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../src/shaping/rooms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,330 @@
1
+ /** Sessions + rooms REST request shaping (mirror of ``_shaping`` room/session helpers). */
2
+ import { InvalidArgumentError } from "../errors.js";
3
+ import { assetPlayback } from "../models.js";
4
+ /** Build the ``POST /v1/rooms`` body. ``project`` is already resolved. */
5
+ export function buildRoomOpen(input) {
6
+ const body = {};
7
+ if (input.name !== undefined) {
8
+ body.name = input.name;
9
+ }
10
+ if (input.project !== undefined) {
11
+ body.project_id = input.project;
12
+ }
13
+ if (input.embeddingSpace !== undefined) {
14
+ body.embedding_space = input.embeddingSpace;
15
+ }
16
+ return { method: "POST", path: "/v1/rooms", json: body };
17
+ }
18
+ /** Build a ``POST /v1/rooms/{id}/rotate-code`` request (mint a fresh join code; no body). */
19
+ export function buildRoomRotateCode(roomId) {
20
+ return { method: "POST", path: `/v1/rooms/${roomId}/rotate-code` };
21
+ }
22
+ /** Build a ``GET /v1/rooms/resolve?code=…`` request (join-by-code lookup). */
23
+ export function buildRoomResolve(code) {
24
+ return { method: "GET", path: "/v1/rooms/resolve", query: { code } };
25
+ }
26
+ /**
27
+ * Build the ``POST /v1/rooms/{id}/signal`` envelope — the REST signal wire (the cross-SDK contract
28
+ * pinned by the fixture corpus, and the Python SDK's send path). The live TS Room sends over its
29
+ * WebSocket instead, but the wire body is identical field-for-field, so this is the canonical shape.
30
+ */
31
+ export function buildRoomSignal(roomId, input) {
32
+ const body = {
33
+ type: input.type,
34
+ payload: input.payload ?? {},
35
+ source: input.source ?? null,
36
+ ephemeral: input.ephemeral ?? false,
37
+ connection_id: input.connectionId ?? null,
38
+ to: input.to ?? null,
39
+ include_self: input.includeSelf ?? false,
40
+ ack_id: input.ackId ?? null,
41
+ reply_to: input.replyTo ?? null,
42
+ };
43
+ return { method: "POST", path: `/v1/rooms/${roomId}/signal`, json: body };
44
+ }
45
+ // --- audio-layers dialect: `play` / `layer.*` body builders ------------------------------------
46
+ // Port of ``hci_atrium._shaping``'s play/layer builders; the normative contract is
47
+ // ``docs/reference/audio-layers-dialect.md``.
48
+ const PLAY_MODES = new Set(["oneshot", "queue"]);
49
+ const LAYER_TRANSITIONS = new Set(["now", "after_current", "queued"]);
50
+ /**
51
+ * A parsed {@link ../models.Asset} always carries these computed URLs; a hand-rolled track dict
52
+ * won't. Used to tell an Asset object apart from a plain track dict — the deliberate TS stand-in
53
+ * for Python's ``isinstance(item, dict)`` split (below).
54
+ */
55
+ function isAssetLike(obj) {
56
+ return (typeof obj.id === "string" && (obj.contentUrl !== undefined || obj.thumbnailUrl !== undefined));
57
+ }
58
+ /** Normalise one ``play`` source to a track dict (mirror of ``_shaping._coerce_track``). */
59
+ function coerceTrack(item) {
60
+ if (typeof item === "string") {
61
+ return /^https?:\/\//.test(item) ? { content_url: item } : { asset_id: item };
62
+ }
63
+ if (item && typeof item === "object") {
64
+ const obj = item;
65
+ // Python passes any ``dict`` through untouched (``isinstance(item, dict)``); TypeScript has no
66
+ // dict/object split, so we pass an object through UNLESS it's recognizably a SearchHit (``.asset``
67
+ // present) or a parsed Asset (``isAssetLike`` — an id plus the computed content/thumbnail URLs a
68
+ // hand-rolled track dict won't carry). Deliberate deviation from Python's isinstance(dict) rule:
69
+ // it lets a hand-rolled track dict with an ``id`` key pass through rather than be read as an asset.
70
+ const wrapped = obj.asset; // a SearchHit wraps the asset it matched
71
+ if (wrapped && typeof wrapped === "object") {
72
+ return trackFromAsset(wrapped);
73
+ }
74
+ if (isAssetLike(obj)) {
75
+ return trackFromAsset(obj);
76
+ }
77
+ return obj;
78
+ }
79
+ throw new Error(`cannot play ${JSON.stringify(item)}: expected an asset, a URL/id string, or a track`);
80
+ }
81
+ /**
82
+ * Build a track dict from an {@link ../models.Asset}. A link-only asset (no stored bytes, but a
83
+ * provider link like Spotify) resolves through its typed ``playback`` intent — a target the Player
84
+ * can't reach from an asset id alone. A bytes-backed asset keeps the compact ``{ asset_id }`` form
85
+ * (the Player resolves the content from the id). Deviation from Python's ``_coerce_track``, which
86
+ * emits ``playback`` for every asset — the TS wire keeps ``asset_id`` for byte-backed content.
87
+ */
88
+ function trackFromAsset(asset) {
89
+ if (!asset.sha256 && asset.sourceUrl) {
90
+ const track = { playback: assetPlayback(asset) };
91
+ const name = asset.title || asset.filename;
92
+ if (name)
93
+ track.name = name;
94
+ attachLoudness(track, asset);
95
+ return track;
96
+ }
97
+ const id = asset.id;
98
+ if (id) {
99
+ const track = { asset_id: String(id) };
100
+ attachLoudness(track, asset);
101
+ return track;
102
+ }
103
+ throw new Error(`cannot play ${JSON.stringify(asset)}: expected an asset, a URL/id string, or a track`);
104
+ }
105
+ /** Copy an asset's measured loudness facts onto a track so the Player can normalize without a fetch. */
106
+ function attachLoudness(track, asset) {
107
+ const facts = asset.facts;
108
+ if (!facts || typeof facts !== "object")
109
+ return;
110
+ for (const key of ["loudness_lufs", "true_peak_db"]) {
111
+ const value = facts[key];
112
+ if (typeof value === "number")
113
+ track[key] = value;
114
+ }
115
+ }
116
+ /** Build a ``play`` signal body — one sound or an array, each coerced to a track dict. */
117
+ export function buildPlayBody(input) {
118
+ const mode = input.mode ?? "oneshot";
119
+ if (!PLAY_MODES.has(mode)) {
120
+ throw new Error(`mode must be one of oneshot, queue, got ${JSON.stringify(mode)}`);
121
+ }
122
+ const items = Array.isArray(input.source) ? input.source : [input.source];
123
+ const body = { mode, tracks: items.map(coerceTrack) };
124
+ if (input.layer !== undefined)
125
+ body.layer = input.layer;
126
+ if (mode === "queue") {
127
+ const transition = input.transition ?? "now";
128
+ if (!LAYER_TRANSITIONS.has(transition)) {
129
+ throw new Error(`transition must be one of now, after_current, queued, got ${JSON.stringify(transition)}`);
130
+ }
131
+ body.transition = transition;
132
+ if (input.repeat)
133
+ body.repeat = true;
134
+ if (input.shuffle)
135
+ body.shuffle = true;
136
+ }
137
+ return body;
138
+ }
139
+ /** Build a ``layer.clear`` body (``layer`` omitted → ``"default"``; ``"*"`` → every layer). */
140
+ export function buildLayerClearBody(layer, fadeOutMs) {
141
+ const body = {};
142
+ if (layer !== undefined)
143
+ body.layer = layer;
144
+ if (fadeOutMs !== undefined)
145
+ body.fade_out_ms = fadeOutMs;
146
+ return body;
147
+ }
148
+ /**
149
+ * Build a ``layer.effects`` body, e.g. ``{ lowpass: { hz: 700 } }`` for a backroom muffle. The
150
+ * ``effects`` state is passed through as-is — ``lowpass`` / ``highpass`` / ``reverb`` / ``echo`` are
151
+ * all live keys (an absent implemented key ramps back to neutral). ``layer`` may be ``"*"`` to apply
152
+ * to every existing layer (mirrors ``layer.clear``'s wildcard).
153
+ */
154
+ export function buildLayerEffectsBody(layer, effects, fadeMs) {
155
+ const body = { layer, effects };
156
+ if (fadeMs !== undefined)
157
+ body.fade_ms = fadeMs;
158
+ return body;
159
+ }
160
+ /**
161
+ * Build a ``layer.position`` body — ramped whole-layer HRTF placement. ``z`` defaults to 0; the
162
+ * optional ``distance`` attenuation config (``{ model, ref, max, rolloff }``) and ``fadeMs`` are
163
+ * omitted when absent (``distance`` absent → direction-only, today's behaviour). No ``"*"`` wildcard.
164
+ */
165
+ export function buildLayerPositionBody(input) {
166
+ const body = {
167
+ layer: input.layer,
168
+ x: input.x,
169
+ y: input.y,
170
+ z: input.z ?? 0,
171
+ };
172
+ if (input.fadeMs !== undefined)
173
+ body.fade_ms = input.fadeMs;
174
+ if (input.distance !== undefined)
175
+ body.distance = input.distance;
176
+ return body;
177
+ }
178
+ // --- viewer dialect: `show` / `show.clear` body builders --------------------------------------
179
+ // The normative contract is ``docs/reference/viewer-dialect.md``.
180
+ const VIEWER_PROJECTIONS = new Set(["flat", "360"]);
181
+ /**
182
+ * Build a ``show`` signal body. Exactly one of ``assetId`` / ``url`` must be given (both or neither
183
+ * throws); ``projection`` (when present) must be ``"flat"`` or ``"360"``. Absent keys are omitted —
184
+ * no nulls on the wire. camelCase API in, snake_case wire out.
185
+ */
186
+ export function buildShowBody(input) {
187
+ const hasAsset = input.assetId !== undefined;
188
+ const hasUrl = input.url !== undefined;
189
+ if (hasAsset === hasUrl) {
190
+ throw new Error("show() needs exactly one of assetId or url");
191
+ }
192
+ if (input.projection !== undefined && !VIEWER_PROJECTIONS.has(input.projection)) {
193
+ throw new Error(`projection must be one of flat, 360, got ${JSON.stringify(input.projection)}`);
194
+ }
195
+ const body = {};
196
+ if (input.assetId !== undefined)
197
+ body.asset_id = input.assetId;
198
+ if (input.url !== undefined)
199
+ body.url = input.url;
200
+ if (input.caption !== undefined)
201
+ body.caption = input.caption;
202
+ if (input.projection !== undefined)
203
+ body.projection = input.projection;
204
+ return body;
205
+ }
206
+ /** Build the ``POST /v1/sessions`` body. ``project`` is already resolved. */
207
+ export function buildSessionStart(input) {
208
+ const body = {};
209
+ if (input.project !== undefined) {
210
+ body.project_id = input.project;
211
+ }
212
+ if (input.name !== undefined) {
213
+ body.name = input.name;
214
+ }
215
+ if (input.participantRef !== undefined) {
216
+ body.participant_ref = input.participantRef;
217
+ }
218
+ if (input.condition !== undefined) {
219
+ body.condition = input.condition;
220
+ }
221
+ if (input.meta !== undefined) {
222
+ body.meta = input.meta;
223
+ }
224
+ return { method: "POST", path: "/v1/sessions", json: body };
225
+ }
226
+ /** Build ``POST /v1/sessions/{id}/recordings`` — open a room-capture recording in a session (the
227
+ * offer-capture chunked wire; mirror of Python's inline ``_open_recording`` call). */
228
+ export function buildRecordingCreate(sessionId, input) {
229
+ return {
230
+ method: "POST",
231
+ path: `/v1/sessions/${sessionId}/recordings`,
232
+ json: { source_name: input.sourceName, content_type: input.contentType },
233
+ };
234
+ }
235
+ /** Build ``PUT /v1/sessions/{id}/recordings/{rid}/chunks`` — append one raw clip to an open
236
+ * recording (the clip's bytes as the body, its mime as the Content-Type). */
237
+ export function buildRecordingChunk(sessionId, recordingId, data, contentType) {
238
+ return {
239
+ method: "PUT",
240
+ path: `/v1/sessions/${sessionId}/recordings/${recordingId}/chunks`,
241
+ content: data,
242
+ contentType,
243
+ };
244
+ }
245
+ /** Build ``POST /v1/sessions/{id}/recordings/{rid}/finalize`` — close an open recording (no body). */
246
+ export function buildRecordingFinalize(sessionId, recordingId) {
247
+ return {
248
+ method: "POST",
249
+ path: `/v1/sessions/${sessionId}/recordings/${recordingId}/finalize`,
250
+ };
251
+ }
252
+ /** Build a ``POST /v1/sessions/{id}/events`` body. */
253
+ export function buildSessionEvent(sessionId, input) {
254
+ const body = {
255
+ type: input.type,
256
+ payload: input.payload ?? {},
257
+ source: input.source ?? null,
258
+ };
259
+ if (input.via !== undefined) {
260
+ body.via = input.via;
261
+ }
262
+ return { method: "POST", path: `/v1/sessions/${sessionId}/events`, json: body };
263
+ }
264
+ // --- sessions read-back + export ---------------------------------------------------------------
265
+ /** Build a ``GET /v1/sessions`` list request. ``project`` (already resolved) filters by project;
266
+ * ``phase`` (a string or list) rides as repeated ``phase=`` query params — the empty string ``""``
267
+ * matches sessions with no phase set. */
268
+ export function buildSessionsList(input) {
269
+ const query = {};
270
+ if (input.project !== undefined) {
271
+ query.project_id = input.project;
272
+ }
273
+ if (input.phase !== undefined) {
274
+ query.phase = typeof input.phase === "string" ? [input.phase] : [...input.phase];
275
+ }
276
+ const req = { method: "GET", path: "/v1/sessions" };
277
+ if (Object.keys(query).length) {
278
+ req.query = query;
279
+ }
280
+ return req;
281
+ }
282
+ /** Build a ``GET /v1/sessions/{id}/events/history`` request (durable log, ``seq > after``). */
283
+ export function buildSessionEvents(sessionId, input = {}) {
284
+ const query = {};
285
+ if (input.after !== undefined) {
286
+ query.after = input.after;
287
+ }
288
+ if (input.limit !== undefined) {
289
+ query.limit = input.limit;
290
+ }
291
+ const req = { method: "GET", path: `/v1/sessions/${sessionId}/events/history` };
292
+ if (Object.keys(query).length) {
293
+ req.query = query;
294
+ }
295
+ return req;
296
+ }
297
+ const SESSION_EXPORT_ROUTES = {
298
+ jsonl: "events.jsonl",
299
+ csv: "events.csv",
300
+ transcript: "transcript.txt",
301
+ bundle: "bundle",
302
+ };
303
+ /** The multi-session bundle endpoint's per-call distinct-id cap (sessions/router.py). */
304
+ export const SESSION_EXPORT_IDS_MAX = 100;
305
+ /** Build a single-session export ``GET`` request, dispatching ``format`` to its fixed route. */
306
+ export function buildSessionExport(sessionId, format) {
307
+ const segment = SESSION_EXPORT_ROUTES[format];
308
+ if (segment === undefined) {
309
+ throw new Error(`unknown export format ${JSON.stringify(format)}; expected one of ${Object.keys(SESSION_EXPORT_ROUTES).join(", ")}`);
310
+ }
311
+ return { method: "GET", path: `/v1/sessions/${sessionId}/export/${segment}` };
312
+ }
313
+ /** Dedup export ids (order-preserving) and enforce the server's per-call cap — throw (never
314
+ * truncate / chunk) when exceeded or empty, naming the cap. */
315
+ export function distinctExportIds(ids) {
316
+ const distinct = [...new Set(ids)];
317
+ if (distinct.length === 0) {
318
+ throw new InvalidArgumentError("exportBundle: ids is required — pass at least one session id");
319
+ }
320
+ if (distinct.length > SESSION_EXPORT_IDS_MAX) {
321
+ throw new InvalidArgumentError(`exportBundle: ${distinct.length} distinct ids exceeds the server cap of ` +
322
+ `${SESSION_EXPORT_IDS_MAX} — split into batches of ${SESSION_EXPORT_IDS_MAX} or fewer`);
323
+ }
324
+ return distinct;
325
+ }
326
+ /** Build the multi-session ``GET /v1/sessions/export/bundle`` request (``ids`` already deduped). */
327
+ export function buildSessionExportBundle(ids) {
328
+ return { method: "GET", path: "/v1/sessions/export/bundle", query: { ids } };
329
+ }
330
+ //# sourceMappingURL=rooms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../src/shaping/rooms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** External-sources request shaping (mirror of ``_shaping`` source helpers). */
2
+ import type { Candidate } from "../models.js";
3
+ import type { ShapedRequest } from "./request.js";
4
+ export interface BuildSourcesSearchInput {
5
+ query: string;
6
+ providers?: string | string[];
7
+ k: number;
8
+ mode?: string;
9
+ modality?: string;
10
+ }
11
+ /**
12
+ * Build the multi-provider fan-out request (``POST /v1/library/sources/search``). A single
13
+ * ``providers`` string is normalised to a one-item list; ``k`` is clamped server-side.
14
+ */
15
+ export declare function buildSourcesSearch(input: BuildSourcesSearchInput): ShapedRequest;
16
+ /**
17
+ * Resolve an import to its ``[sourceId, externalId]`` — from a {@link Candidate} (its provider +
18
+ * externalId), or the explicit pair. Exactly one form must be given.
19
+ */
20
+ export declare function resolveImportTarget(candidate: Candidate | undefined, sourceId: string | undefined, externalId: string | undefined): [string, string];
21
+ export interface BuildSourceImportInput {
22
+ sourceId: string;
23
+ externalId: string;
24
+ modality?: string;
25
+ description?: string;
26
+ }
27
+ /** Build the import request (``POST /v1/library/sources/{id}/import``). */
28
+ export declare function buildSourceImport(input: BuildSourceImportInput): ShapedRequest;
29
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/shaping/sources.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAGhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC7B,CAAC,EAAE,MAAM,CAAA;IACT,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,aAAa,CAYhF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,CAAC,MAAM,EAAE,MAAM,CAAC,CAWlB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,aAAa,CAa9E"}
@@ -0,0 +1,51 @@
1
+ /** External-sources request shaping (mirror of ``_shaping`` source helpers). */
2
+ import { InvalidArgumentError } from "../errors.js";
3
+ /**
4
+ * Build the multi-provider fan-out request (``POST /v1/library/sources/search``). A single
5
+ * ``providers`` string is normalised to a one-item list; ``k`` is clamped server-side.
6
+ */
7
+ export function buildSourcesSearch(input) {
8
+ const body = { query: input.query, k: input.k };
9
+ if (input.providers !== undefined) {
10
+ body.providers = typeof input.providers === "string" ? [input.providers] : [...input.providers];
11
+ }
12
+ if (input.mode !== undefined) {
13
+ body.mode = input.mode;
14
+ }
15
+ if (input.modality !== undefined) {
16
+ body.modality = input.modality;
17
+ }
18
+ return { method: "POST", path: "/v1/library/sources/search", json: body };
19
+ }
20
+ /**
21
+ * Resolve an import to its ``[sourceId, externalId]`` — from a {@link Candidate} (its provider +
22
+ * externalId), or the explicit pair. Exactly one form must be given.
23
+ */
24
+ export function resolveImportTarget(candidate, sourceId, externalId) {
25
+ if (candidate !== undefined) {
26
+ if (sourceId !== undefined || externalId !== undefined) {
27
+ throw new InvalidArgumentError("pass either a candidate or sourceId + externalId, not both");
28
+ }
29
+ return [candidate.provider, candidate.externalId];
30
+ }
31
+ if (sourceId === undefined || externalId === undefined) {
32
+ throw new InvalidArgumentError("pass a candidate, or both sourceId and externalId");
33
+ }
34
+ return [sourceId, externalId];
35
+ }
36
+ /** Build the import request (``POST /v1/library/sources/{id}/import``). */
37
+ export function buildSourceImport(input) {
38
+ const body = { external_id: input.externalId };
39
+ if (input.modality !== undefined) {
40
+ body.modality = input.modality;
41
+ }
42
+ if (input.description !== undefined) {
43
+ body.description = input.description;
44
+ }
45
+ return {
46
+ method: "POST",
47
+ path: `/v1/library/sources/${input.sourceId}/import`,
48
+ json: body,
49
+ };
50
+ }
51
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/shaping/sources.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAYnD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA8B;IAC/D,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAA;IACxE,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAA;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACxB,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;IAChC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAgC,EAChC,QAA4B,EAC5B,UAA8B;IAE9B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,QAAQ,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,IAAI,oBAAoB,CAAC,4DAA4D,CAAC,CAAA;QAC9F,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;IACnD,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,oBAAoB,CAAC,mDAAmD,CAAC,CAAA;IACrF,CAAC;IACD,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;AAC/B,CAAC;AASD,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,MAAM,IAAI,GAA4B,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE,CAAA;IACvE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;IAChC,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAA;IACtC,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,uBAAuB,KAAK,CAAC,QAAQ,SAAS;QACpD,IAAI,EAAE,IAAI;KACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Structured-output plumbing — the mirror of ``_structured.py``, using **Zod** as the OpenAI TS SDK
3
+ * does (decision 3). Zod is an *optional* peer dependency: nothing here imports it at module top;
4
+ * a schema is duck-typed at runtime and the module is loaded lazily only to derive its JSON Schema.
5
+ *
6
+ * The flow (client-orchestrated, like Python's): send the schema as OpenAI's ``json_schema``
7
+ * response_format, validate the reply, and on failure run ONE repair turn before throwing
8
+ * {@link StructuredOutputError}. The pure pieces (JSON extraction, validation, repair messages) live
9
+ * here; the client owns the two ``chat`` calls.
10
+ */
11
+ import { StructuredOutputError } from "../errors.js";
12
+ import type { ChatMessage } from "./chat.js";
13
+ /** The slice of a Zod schema this module relies on (v3 and v4 both satisfy it). */
14
+ export interface ZodLike<T = unknown> {
15
+ safeParse(data: unknown): {
16
+ success: true;
17
+ data: T;
18
+ } | {
19
+ success: false;
20
+ error: unknown;
21
+ };
22
+ }
23
+ /** A safe, universally-supported response_format for the repair turn: plain JSON mode. */
24
+ export declare const JSON_OBJECT: {
25
+ readonly type: "json_object";
26
+ };
27
+ /** True when ``value`` looks like a Zod schema (the structured-output path). */
28
+ export declare function isZodSchema(value: unknown): value is ZodLike;
29
+ /**
30
+ * Build the OpenAI ``json_schema`` response_format for a Zod schema. Async because it lazily loads
31
+ * Zod (v4's ``z.toJSONSchema``) — never imported at module top so the SDK installs without Zod.
32
+ * Throws {@link InvalidArgumentError} when Zod (v4+) isn't resolvable.
33
+ */
34
+ export declare function responseFormatParam(schema: ZodLike, name?: string): Promise<Record<string, unknown>>;
35
+ /**
36
+ * Validate ``text`` into ``schema``. Returns ``[value, ""]`` on success or ``[null, detail]`` with
37
+ * a human-readable reason on failure (never throws).
38
+ */
39
+ export declare function tryParse<T>(schema: ZodLike<T>, text: string): [T | null, string];
40
+ /**
41
+ * The message list for the single repair turn: the prior turns, the model's bad reply, and a
42
+ * correction quoting the error and the JSON schema to conform to.
43
+ */
44
+ export declare function repairMessages(messages: ChatMessage[], badReply: string, detail: string, jsonSchema: unknown): ChatMessage[];
45
+ /** Build the terminal error raised when the repair turn still didn't yield valid output. */
46
+ export declare function structuredError(schemaName: string, raw: string, detail: string): StructuredOutputError;
47
+ //# sourceMappingURL=structured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured.d.ts","sourceRoot":"","sources":["../../src/shaping/structured.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAwB,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,mFAAmF;AACnF,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,OAAO;IAClC,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAA;CAC1F;AAED,0FAA0F;AAC1F,eAAO,MAAM,WAAW;;CAAmC,CAAA;AAK3D,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAO5D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,OAAO,EACf,IAAI,SAAa,GAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkBlC;AAoCD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAUhF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,OAAO,GAClB,WAAW,EAAE,CAWf;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,qBAAqB,CAEvB"}