@norskvideo/norsk-studio-alpha 1.27.0-2025-10-13-680fc249 → 1.27.0-2025-10-15-50193579

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.
@@ -0,0 +1,371 @@
1
+ /* AI Chat Component Styles */
2
+ .util-aiChat {
3
+ font-family: system-ui, -apple-system, sans-serif;
4
+ height: 100%;
5
+ display: flex;
6
+ flex-direction: column;
7
+ }
8
+
9
+ .chat-container {
10
+ display: flex;
11
+ flex-direction: column;
12
+ height: 500px;
13
+ border: 1px solid #e5e7eb;
14
+ border-radius: 8px;
15
+ background: white;
16
+ overflow: hidden;
17
+ }
18
+
19
+ /* Header */
20
+ .chat-header {
21
+ display: flex;
22
+ justify-content: space-between;
23
+ align-items: center;
24
+ padding: 12px 16px;
25
+ background: #f9fafb;
26
+ border-bottom: 1px solid #e5e7eb;
27
+ font-size: 14px;
28
+ }
29
+
30
+ .provider-info {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: 8px;
34
+ }
35
+
36
+ .provider-status {
37
+ font-weight: 500;
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 4px;
41
+ }
42
+
43
+ .provider-status.available {
44
+ color: #059669;
45
+ }
46
+
47
+ .provider-status.unavailable {
48
+ color: #dc2626;
49
+ }
50
+
51
+ .error-indicator {
52
+ cursor: help;
53
+ color: #f59e0b;
54
+ }
55
+
56
+ .chat-controls {
57
+ display: flex;
58
+ gap: 8px;
59
+ }
60
+
61
+ .reset-button {
62
+ padding: 4px 8px;
63
+ font-size: 12px;
64
+ background: #ef4444;
65
+ color: white;
66
+ border: none;
67
+ border-radius: 4px;
68
+ cursor: pointer;
69
+ transition: background-color 0.2s;
70
+ }
71
+
72
+ .reset-button:hover:not(:disabled) {
73
+ background: #dc2626;
74
+ }
75
+
76
+ .reset-button:disabled {
77
+ background: #d1d5db;
78
+ cursor: not-allowed;
79
+ }
80
+
81
+ /* Messages */
82
+ .messages-container {
83
+ flex: 1;
84
+ overflow-y: auto;
85
+ padding: 16px;
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: 16px;
89
+ }
90
+
91
+ .system-notice {
92
+ text-align: center;
93
+ padding: 24px;
94
+ color: #6b7280;
95
+ }
96
+
97
+ .notice-content h3 {
98
+ margin: 0 0 8px 0;
99
+ color: #374151;
100
+ }
101
+
102
+ .notice-content p {
103
+ margin: 4px 0;
104
+ }
105
+
106
+ .notice-content code {
107
+ background: #f3f4f6;
108
+ padding: 2px 4px;
109
+ border-radius: 3px;
110
+ font-family: monospace;
111
+ }
112
+
113
+ .empty-state {
114
+ text-align: center;
115
+ color: #6b7280;
116
+ padding: 24px;
117
+ }
118
+
119
+ .message {
120
+ display: flex;
121
+ flex-direction: column;
122
+ gap: 4px;
123
+ max-width: 80%;
124
+ }
125
+
126
+ .message.user {
127
+ align-self: flex-end;
128
+ align-items: flex-end;
129
+ }
130
+
131
+ .message.assistant {
132
+ align-self: flex-start;
133
+ align-items: flex-start;
134
+ }
135
+
136
+ .message.system {
137
+ align-self: center;
138
+ align-items: center;
139
+ max-width: 90%;
140
+ opacity: 0.7;
141
+ font-style: italic;
142
+ }
143
+
144
+ .message-header {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 8px;
148
+ font-size: 12px;
149
+ color: #6b7280;
150
+ margin-bottom: 4px;
151
+ }
152
+
153
+ .message-role {
154
+ font-weight: 600;
155
+ text-transform: capitalize;
156
+ }
157
+
158
+ .message.user .message-role {
159
+ color: #2563eb;
160
+ }
161
+
162
+ .message.assistant .message-role {
163
+ color: #059669;
164
+ }
165
+
166
+ .message.system .message-role {
167
+ color: #6b7280;
168
+ }
169
+
170
+ .message-time {
171
+ font-size: 11px;
172
+ }
173
+
174
+ .message-content {
175
+ padding: 12px 16px;
176
+ border-radius: 16px;
177
+ line-height: 1.5;
178
+ word-wrap: break-word;
179
+ white-space: pre-wrap;
180
+ }
181
+
182
+ .message.user .message-content {
183
+ background: #2563eb;
184
+ color: white;
185
+ }
186
+
187
+ .message.assistant .message-content {
188
+ background: #f3f4f6;
189
+ color: #374151;
190
+ border: 1px solid #e5e7eb;
191
+ }
192
+
193
+ .message.system .message-content {
194
+ background: #fef3c7;
195
+ color: #92400e;
196
+ border: 1px solid #fde68a;
197
+ }
198
+
199
+ .message.error .message-content {
200
+ background: #fef2f2;
201
+ color: #dc2626;
202
+ border: 1px solid #fecaca;
203
+ }
204
+
205
+ .tool-calls {
206
+ margin-top: 8px;
207
+ padding: 8px;
208
+ background: #f8fafc;
209
+ border: 1px solid #e2e8f0;
210
+ border-radius: 8px;
211
+ font-size: 12px;
212
+ }
213
+
214
+ .tool-calls-header {
215
+ font-weight: 600;
216
+ color: #475569;
217
+ margin-bottom: 6px;
218
+ }
219
+
220
+ .tool-call {
221
+ margin-bottom: 6px;
222
+ padding: 4px;
223
+ background: white;
224
+ border-radius: 4px;
225
+ }
226
+
227
+ .tool-name {
228
+ font-weight: 600;
229
+ color: #7c3aed;
230
+ }
231
+
232
+ .tool-args {
233
+ margin: 4px 0 0 0;
234
+ padding: 6px;
235
+ background: #f1f5f9;
236
+ border-radius: 3px;
237
+ font-family: monospace;
238
+ font-size: 11px;
239
+ overflow-x: auto;
240
+ }
241
+
242
+ .message-error {
243
+ margin-top: 4px;
244
+ padding: 6px 8px;
245
+ background: #fef2f2;
246
+ color: #dc2626;
247
+ border: 1px solid #fecaca;
248
+ border-radius: 6px;
249
+ font-size: 12px;
250
+ }
251
+
252
+ /* Thinking indicator */
253
+ .thinking-indicator {
254
+ align-self: flex-start;
255
+ }
256
+
257
+ .message.thinking .message-content {
258
+ background: #f9fafb;
259
+ border: 1px solid #e5e7eb;
260
+ padding: 16px;
261
+ }
262
+
263
+ .typing-dots {
264
+ display: flex;
265
+ gap: 4px;
266
+ align-items: center;
267
+ }
268
+
269
+ .typing-dots span {
270
+ width: 6px;
271
+ height: 6px;
272
+ background: #6b7280;
273
+ border-radius: 50%;
274
+ animation: typing 1.4s infinite;
275
+ }
276
+
277
+ .typing-dots span:nth-child(2) {
278
+ animation-delay: 0.2s;
279
+ }
280
+
281
+ .typing-dots span:nth-child(3) {
282
+ animation-delay: 0.4s;
283
+ }
284
+
285
+ @keyframes typing {
286
+ 0%, 60%, 100% {
287
+ transform: translateY(0);
288
+ opacity: 0.4;
289
+ }
290
+ 30% {
291
+ transform: translateY(-10px);
292
+ opacity: 1;
293
+ }
294
+ }
295
+
296
+ /* Input */
297
+ .chat-input-container {
298
+ padding: 16px;
299
+ border-top: 1px solid #e5e7eb;
300
+ background: #f9fafb;
301
+ }
302
+
303
+ .input-wrapper {
304
+ display: flex;
305
+ gap: 8px;
306
+ align-items: flex-end;
307
+ }
308
+
309
+ .message-input {
310
+ flex: 1;
311
+ min-height: 38px;
312
+ max-height: 120px;
313
+ padding: 8px 12px;
314
+ border: 1px solid #d1d5db;
315
+ border-radius: 20px;
316
+ resize: none;
317
+ font-family: inherit;
318
+ font-size: 14px;
319
+ line-height: 1.5;
320
+ outline: none;
321
+ transition: border-color 0.2s;
322
+ }
323
+
324
+ .message-input:focus {
325
+ border-color: #2563eb;
326
+ }
327
+
328
+ .message-input:disabled {
329
+ background: #f3f4f6;
330
+ color: #9ca3af;
331
+ cursor: not-allowed;
332
+ }
333
+
334
+ .send-button {
335
+ padding: 8px 16px;
336
+ background: #2563eb;
337
+ color: white;
338
+ border: none;
339
+ border-radius: 20px;
340
+ cursor: pointer;
341
+ font-weight: 500;
342
+ transition: background-color 0.2s;
343
+ white-space: nowrap;
344
+ }
345
+
346
+ .send-button:hover:not(:disabled) {
347
+ background: #1d4ed8;
348
+ }
349
+
350
+ .send-button:disabled {
351
+ background: #d1d5db;
352
+ cursor: not-allowed;
353
+ }
354
+
355
+ /* Scrollbar styling */
356
+ .messages-container::-webkit-scrollbar {
357
+ width: 6px;
358
+ }
359
+
360
+ .messages-container::-webkit-scrollbar-track {
361
+ background: #f1f5f9;
362
+ }
363
+
364
+ .messages-container::-webkit-scrollbar-thumb {
365
+ background: #cbd5e1;
366
+ border-radius: 3px;
367
+ }
368
+
369
+ .messages-container::-webkit-scrollbar-thumb:hover {
370
+ background: #94a3b8;
371
+ }
@@ -0,0 +1,266 @@
1
+ # This file has been generated, please edit types.source.yaml instead
2
+
3
+ openapi: 3.0.3
4
+ info:
5
+ title: Output Player API
6
+ version: 1.0.0
7
+ paths:
8
+ /timeline:
9
+ get:
10
+ summary: Returns all the available timelines in the store
11
+ description: Returns all the available timelines in the store
12
+ responses:
13
+ "200":
14
+ description: Successful operation
15
+ content:
16
+ application/json:
17
+ schema: &a3
18
+ type: object
19
+ properties:
20
+ active: &a2
21
+ type: object
22
+ properties:
23
+ audio: &a1
24
+ type: object
25
+ properties:
26
+ startIso:
27
+ type: string
28
+ format: date
29
+ durationMs:
30
+ type: number
31
+ streamNum:
32
+ type: number
33
+ versionNum:
34
+ type: number
35
+ tamsId:
36
+ type: string
37
+ active:
38
+ type: boolean
39
+ required:
40
+ - startIso
41
+ - durationMs
42
+ - versionNum
43
+ - active
44
+ video: *a1
45
+ sessionNum:
46
+ type: integer
47
+ required:
48
+ - audio
49
+ - video
50
+ - sessionNum
51
+ sessions:
52
+ type: array
53
+ items: *a2
54
+ cuts:
55
+ type: array
56
+ items: &a4
57
+ type: object
58
+ properties:
59
+ id:
60
+ type: number
61
+ percent:
62
+ type: number
63
+ createdMs:
64
+ type: number
65
+ required:
66
+ - id
67
+ - percent
68
+ - createdMs
69
+ required:
70
+ - sessions
71
+ - cuts
72
+ /cut:
73
+ post:
74
+ summary: Creates a cut
75
+ description: Creates a cut and returns the URL to query in order to get the output
76
+ requestBody:
77
+ description: Details about how this cut should take place
78
+ content:
79
+ application/json:
80
+ schema:
81
+ type: object
82
+ properties:
83
+ start:
84
+ type: string
85
+ format: date
86
+ duration_s:
87
+ type: integer
88
+ required:
89
+ - start
90
+ - duration_s
91
+ responses:
92
+ "204":
93
+ description: Successful operation
94
+ content:
95
+ application/json:
96
+ schema:
97
+ type: object
98
+ description: URL to query the status of the cut
99
+ properties:
100
+ url:
101
+ type: string
102
+ format: uri
103
+ cutId:
104
+ type: string
105
+ required:
106
+ - url
107
+ - cutId
108
+ "400":
109
+ description: Unsuccessful operation
110
+ content:
111
+ application/json:
112
+ schema:
113
+ type: string
114
+ description: The reason for failure
115
+ /cut/{id}:
116
+ get:
117
+ summary: Get the current status of a cut
118
+ description: Returns the current status of the cut identified by the given id.
119
+ parameters:
120
+ - name: id
121
+ in: path
122
+ required: true
123
+ schema:
124
+ type: integer
125
+ responses:
126
+ "200":
127
+ description: Successful operation returning the status of the cut
128
+ content:
129
+ application/json:
130
+ schema: &a8
131
+ oneOf:
132
+ - &a5
133
+ type: object
134
+ properties:
135
+ status:
136
+ type: string
137
+ enum:
138
+ - not_ready
139
+ description: Indicates the cut is not ready yet.
140
+ percent_complete:
141
+ type: number
142
+ description: Percentage of the cut that is complete.
143
+ required:
144
+ - status
145
+ - percent_complete
146
+ - &a6
147
+ type: object
148
+ properties:
149
+ status:
150
+ type: string
151
+ enum:
152
+ - ready
153
+ description: Indicates the cut is ready.
154
+ url:
155
+ type: string
156
+ format: uri
157
+ description: URL where the produced file can be accessed.
158
+ required:
159
+ - status
160
+ - url
161
+ - &a7
162
+ type: object
163
+ properties:
164
+ status:
165
+ type: string
166
+ enum:
167
+ - failed
168
+ description: Indicates the cut has failed.
169
+ reason:
170
+ type: string
171
+ description: Reason for the failure.
172
+ required:
173
+ - status
174
+ - reason
175
+ discriminator:
176
+ propertyName: status
177
+ "404":
178
+ description: Cut not found
179
+ content:
180
+ application/json:
181
+ schema:
182
+ type: string
183
+ description: The reason for failure
184
+ /download/{cut_id}:
185
+ get:
186
+ summary: Download generated mp4 file for a cut
187
+ description: Retrieves the generated mp4 file associated with the given cut id.
188
+ parameters:
189
+ - name: cut_id
190
+ in: path
191
+ required: true
192
+ schema:
193
+ type: integer
194
+ responses:
195
+ "200":
196
+ description: Successful operation - returns the mp4 file.
197
+ content:
198
+ video/mp4:
199
+ schema:
200
+ type: string
201
+ format: binary
202
+ "404":
203
+ description: Cut or file not found.
204
+ content:
205
+ application/json:
206
+ schema:
207
+ type: object
208
+ properties:
209
+ message:
210
+ type: string
211
+ required:
212
+ - message
213
+ "500":
214
+ description: Server error.
215
+ content:
216
+ application/json:
217
+ schema:
218
+ type: object
219
+ properties:
220
+ message:
221
+ type: string
222
+ required:
223
+ - message
224
+ components:
225
+ schemas:
226
+ RecorderSettings:
227
+ type: object
228
+ properties:
229
+ id:
230
+ type: string
231
+ displayName:
232
+ type: string
233
+ storePath:
234
+ type: string
235
+ cutsPath:
236
+ type: string
237
+ nullable: true
238
+ expiryHours:
239
+ type: number
240
+ pruneIntervalMs:
241
+ type: number
242
+ nullable: true
243
+ required:
244
+ - id
245
+ - displayName
246
+ - storePath
247
+ - expiryHours
248
+ RecordedStreams: *a3
249
+ StreamPair: *a2
250
+ StreamVersion: *a1
251
+ Cut: *a4
252
+ AvailableData:
253
+ type: object
254
+ properties:
255
+ start:
256
+ type: string
257
+ format: date
258
+ duration_s:
259
+ type: integer
260
+ required:
261
+ - start
262
+ - duration_s
263
+ CutNotReady: *a5
264
+ CutReady: *a6
265
+ CutFailed: *a7
266
+ CutStatus: *a8
@@ -0,0 +1,78 @@
1
+ # This file has been generated, please edit types.source.yaml instead
2
+
3
+ openapi: 3.0.0
4
+ info:
5
+ title: Action Replay
6
+ version: 1.0.0
7
+ components:
8
+ schemas:
9
+ ActionReplayConfig:
10
+ type: object
11
+ properties:
12
+ id:
13
+ type: string
14
+ displayName:
15
+ type: string
16
+ __global:
17
+ type: object
18
+ properties:
19
+ hardware:
20
+ type: string
21
+ enum:
22
+ - auto
23
+ - software
24
+ - nvidia
25
+ - nvidiaAV1
26
+ - quadra
27
+ - quadraAV1
28
+ notes:
29
+ type: string
30
+ required:
31
+ - id
32
+ - displayName
33
+ - __global
34
+ ActionReplayState:
35
+ type: object
36
+ properties:
37
+ contentPlayerUrl:
38
+ type: string
39
+ replaying:
40
+ type: boolean
41
+ required:
42
+ - replaying
43
+ ActionReplayEvent:
44
+ oneOf:
45
+ - type: object
46
+ properties:
47
+ type:
48
+ const: content-player-created
49
+ url:
50
+ type: string
51
+ required:
52
+ - type
53
+ - url
54
+ - type: object
55
+ properties:
56
+ type:
57
+ const: replay-started
58
+ required:
59
+ - type
60
+ - type: object
61
+ properties:
62
+ type:
63
+ const: replay-finished
64
+ required:
65
+ - type
66
+ ActionReplayCommand:
67
+ type: object
68
+ properties:
69
+ type:
70
+ const: do-replay
71
+ from:
72
+ type: number
73
+ duration:
74
+ type: number
75
+ required:
76
+ - type
77
+ - from
78
+ - duration