arcane-os 0.2.2 → 0.3.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 (117) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +8 -8
  3. package/browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json +29 -22
  4. package/browser-runtime/ai/ARCANE_AI_BROWSER_SPEECH_COMPONENTS.json +203 -0
  5. package/browser-runtime/ai/browser-kokoro-worker.mjs +11 -2
  6. package/browser-runtime/ai/browser-speech-artifacts.mjs +3230 -397
  7. package/browser-runtime/ai/browser-speech-providers.mjs +1141 -157
  8. package/browser-runtime/ai/browser-speech.mjs +2 -0
  9. package/browser-runtime/ai/browser-whisper-worker.mjs +11 -2
  10. package/browser-runtime/ai/model-controller.mjs +285 -95
  11. package/browser-runtime/ai/speech-worker-client.mjs +247 -32
  12. package/browser-runtime/ai/speech-worker-runtime.mjs +2310 -167
  13. package/browser-runtime/event-manager.mjs +1097 -1
  14. package/docs/architecture.md +2 -2
  15. package/docs/event-manager.md +155 -27
  16. package/docs/reference/README.md +27 -27
  17. package/docs/reference/ai/browser-speech-package-authority.json +835 -0
  18. package/docs/reference/ai/browser-speech.md +1162 -246
  19. package/docs/reference/ai/browser-wasm.md +18 -7
  20. package/docs/reference/availability-and-normalization.md +6 -3
  21. package/docs/reference/behavioral-testing.md +29 -6
  22. package/docs/reference/cli.md +117 -9
  23. package/docs/reference/core/arcane-ai-contracts.md +1 -1
  24. package/docs/reference/event-manager.md +577 -32
  25. package/docs/reference/inventory/package-api.json +478 -2
  26. package/docs/reference/inventory/runtime-components.json +108 -44
  27. package/docs/reference/inventory/runtime-modules.json +131 -53
  28. package/docs/reference/mail.md +316 -0
  29. package/docs/reference/protocols.md +157 -43
  30. package/docs/reference/runtime-components.md +258 -83
  31. package/docs/reference/runtime-modules.md +613 -77
  32. package/docs/reference/sdk-api.md +1014 -25
  33. package/package.json +5 -4
  34. package/runtime/ARCANE_RUNTIME_RELEASE.json +145 -140
  35. package/runtime/arcane/components/app-bar.html +34 -13
  36. package/runtime/arcane/components/assistant-panel.html +110 -57
  37. package/runtime/arcane/components/calculator.html +7 -4
  38. package/runtime/arcane/components/chart.html +58 -17
  39. package/runtime/arcane/components/chat.html +606 -136
  40. package/runtime/arcane/components/conversation-view.html +13 -6
  41. package/runtime/arcane/components/dashboard-config.html +96 -59
  42. package/runtime/arcane/components/data-maintenance.html +69 -14
  43. package/runtime/arcane/components/data-view.html +53 -7
  44. package/runtime/arcane/components/directory-picker.html +118 -32
  45. package/runtime/arcane/components/document-inspector.html +47 -10
  46. package/runtime/arcane/components/file-drop.html +81 -35
  47. package/runtime/arcane/components/file-inspector.html +72 -22
  48. package/runtime/arcane/components/file-manager.html +374 -79
  49. package/runtime/arcane/components/integration-settings.html +12 -5
  50. package/runtime/arcane/components/local-ai-status.html +48 -19
  51. package/runtime/arcane/components/markdown-document.html +161 -68
  52. package/runtime/arcane/components/markdown-editor.html +110 -33
  53. package/runtime/arcane/components/media-embed.html +8 -5
  54. package/runtime/arcane/components/modal.html +15 -5
  55. package/runtime/arcane/components/output-panel.html +28 -23
  56. package/runtime/arcane/components/preferences-form.html +22 -4
  57. package/runtime/arcane/components/record-timeline.html +18 -2
  58. package/runtime/arcane/components/relationship-board.html +23 -3
  59. package/runtime/arcane/components/screen-capture.html +10 -4
  60. package/runtime/arcane/components/source-code-viewer.html +76 -9
  61. package/runtime/arcane/components/source-explanation.html +23 -3
  62. package/runtime/arcane/components/speech.html +462 -384
  63. package/runtime/arcane/components/summary-strip.html +22 -11
  64. package/runtime/arcane/components/table.html +39 -21
  65. package/runtime/arcane/components/task-progress.html +79 -21
  66. package/runtime/arcane/components/terminal-workspace.html +7 -4
  67. package/runtime/arcane/components/theme-editor.html +7 -3
  68. package/runtime/arcane/components/unified-inbox.html +9 -4
  69. package/runtime/arcane/components/voice-transcription.html +639 -98
  70. package/runtime/arcane/components/weather-widget.html +5 -3
  71. package/runtime/arcane/components/web-navigator.html +48 -8
  72. package/runtime/arcane/entities/Chat.js +1 -1
  73. package/runtime/arcane/entities/User.js +110 -23
  74. package/runtime/arcane/modules/AI.js +2109 -130
  75. package/runtime/arcane/modules/AIProviderRuntime.js +720 -13
  76. package/runtime/arcane/modules/AIRuntimeState.js +109 -52
  77. package/runtime/arcane/modules/ApiModelDatabase.js +390 -17
  78. package/runtime/arcane/modules/BrowserTestSuite.js +205 -28
  79. package/runtime/arcane/modules/CalculatorEngine.js +63 -3
  80. package/runtime/arcane/modules/CommunicationAppController.js +588 -28
  81. package/runtime/arcane/modules/CommunicationHub.js +590 -10
  82. package/runtime/arcane/modules/ComponentContracts.js +470 -0
  83. package/runtime/arcane/modules/ConversationTimebox.js +152 -33
  84. package/runtime/arcane/modules/DBLS.js +40 -7
  85. package/runtime/arcane/modules/DBOPFS.js +35 -11
  86. package/runtime/arcane/modules/DataMaintenance.js +12 -2
  87. package/runtime/arcane/modules/Errors.js +65 -7
  88. package/runtime/arcane/modules/HTMLImport.js +198 -14
  89. package/runtime/arcane/modules/LocalAIReadinessController.js +208 -29
  90. package/runtime/arcane/modules/Mail.js +738 -115
  91. package/runtime/arcane/modules/MailOutbox.mjs +1395 -0
  92. package/runtime/arcane/modules/MailTransport.mjs +197 -39
  93. package/runtime/arcane/modules/Ollama.js +36 -1
  94. package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +583 -7
  95. package/runtime/arcane/modules/PreferenceStore.js +367 -33
  96. package/runtime/arcane/modules/RecordReviewStore.js +322 -23
  97. package/runtime/arcane/modules/ScreenCapture.js +1397 -15
  98. package/runtime/arcane/modules/SpeechPlayback.js +438 -41
  99. package/runtime/arcane/modules/TerminalClient.js +277 -12
  100. package/runtime/arcane/modules/ThemeBootstrap.js +80 -6
  101. package/runtime/arcane/modules/ThemeManager.js +39 -7
  102. package/runtime/arcane/modules/TimeGuard.js +131 -20
  103. package/runtime/arcane/modules/WaitForComponent.js +386 -33
  104. package/schemas/arcane-lock.schema.json +2 -2
  105. package/src/cli/main.mjs +435 -9
  106. package/src/event-manager.mjs +1097 -1
  107. package/src/import-map.mjs +21 -3
  108. package/src/index.mjs +13 -0
  109. package/src/installed-sdk-runtime.mjs +112 -0
  110. package/src/mail-api.mjs +22 -0
  111. package/src/mail-credentials.mjs +667 -0
  112. package/src/mail-server.mjs +1769 -0
  113. package/src/mail.mjs +261 -0
  114. package/src/sdk-browser-runtime.mjs +85 -41
  115. package/src/testing-loader.mjs +7 -0
  116. package/src/toolchain.mjs +3 -0
  117. package/src/workspace.mjs +1 -1
@@ -1,31 +1,205 @@
1
+ export const COMPONENT_WAIT_ERROR_CODES=Object.freeze({
2
+ abortSignalInvalid:'ARCANE_COMPONENT_READINESS_ABORT_SIGNAL_INVALID',
3
+ elementRequired:'ARCANE_COMPONENT_READINESS_ELEMENT_REQUIRED',
4
+ errorEventReported:'ARCANE_COMPONENT_READINESS_ERROR_EVENT_REPORTED',
5
+ errorEventInspectionFailed:'ARCANE_COMPONENT_READINESS_ERROR_EVENT_INSPECTION_FAILED',
6
+ listenerCleanupFailed:'ARCANE_COMPONENT_READINESS_LISTENER_CLEANUP_FAILED',
7
+ listenerInstallationFailed:'ARCANE_COMPONENT_READINESS_LISTENER_INSTALLATION_FAILED',
8
+ listenerTargetInvalid:'ARCANE_COMPONENT_READINESS_LISTENER_TARGET_INVALID',
9
+ readinessEventRequired:'ARCANE_COMPONENT_READINESS_EVENT_REQUIRED',
10
+ stateInspectionFailed:'ARCANE_COMPONENT_READINESS_STATE_INSPECTION_FAILED',
11
+ timeoutInstallationFailed:'ARCANE_COMPONENT_READINESS_TIMEOUT_INSTALLATION_FAILED',
12
+ waitAborted:'ARCANE_COMPONENT_READINESS_WAIT_ABORTED',
13
+ waitOptionsInvalid:'ARCANE_COMPONENT_READINESS_WAIT_OPTIONS_INVALID',
14
+ waitTimedOut:'COMPONENT_READY_TIMEOUT'
15
+ });
16
+
17
+ export const COMPONENT_WAIT_REASONS=Object.freeze({
18
+ abortSignalInvalid:'component-readiness-abort-signal-invalid',
19
+ elementMissing:'component-readiness-element-missing',
20
+ errorEventReported:'component-readiness-error-event-reported',
21
+ errorEventInspectionFailed:'component-readiness-error-event-inspection-threw',
22
+ listenerCleanupFailed:'component-readiness-listener-cleanup-rejected',
23
+ listenerInstallationFailed:'component-readiness-listener-installation-rejected',
24
+ listenerTargetInvalid:'component-readiness-listener-target-invalid',
25
+ readinessEventMissing:'component-readiness-event-missing',
26
+ stateInspectionFailed:'component-readiness-state-inspection-threw',
27
+ timeoutInstallationFailed:'component-readiness-timeout-installation-rejected',
28
+ waitAborted:'component-readiness-wait-aborted',
29
+ waitOptionsInvalid:'component-readiness-wait-options-invalid',
30
+ waitTimedOut:'component-readiness-wait-timed-out'
31
+ });
32
+
33
+ function defineComponentWaitError(error,code,reason,cause){
34
+ const priorCode=typeof error?.code==='string'&&error.code
35
+ ?error.code
36
+ :null;
37
+ try{
38
+ if(priorCode&&priorCode!==code&&!Object.hasOwn(error,'causeCode')){
39
+ Object.defineProperty(
40
+ error,
41
+ 'causeCode',
42
+ {value:priorCode,enumerable:false,configurable:true,writable:true}
43
+ );
44
+ }
45
+ Object.defineProperty(
46
+ error,
47
+ 'code',
48
+ {value:code,enumerable:false,configurable:true,writable:true}
49
+ );
50
+ Object.defineProperty(
51
+ error,
52
+ 'reason',
53
+ {value:reason,enumerable:false,configurable:true,writable:true}
54
+ );
55
+ if(cause!==undefined&&cause!==error&&!('cause' in error)){
56
+ Object.defineProperty(
57
+ error,
58
+ 'cause',
59
+ {value:cause,enumerable:false,configurable:true,writable:true}
60
+ );
61
+ }
62
+ return error;
63
+ }catch{
64
+ const replacement=new Error(error?.message||'Component readiness wait failed.');
65
+ replacement.name=error?.name||'Error';
66
+ replacement.code=code;
67
+ replacement.reason=reason;
68
+ if(priorCode&&priorCode!==code){
69
+ replacement.causeCode=priorCode;
70
+ }
71
+ replacement.cause=cause===undefined?error:cause;
72
+ return replacement;
73
+ }
74
+ }
75
+
76
+ function componentWaitError(message,code,reason,ErrorClass=Error,cause){
77
+ return defineComponentWaitError(
78
+ new ErrorClass(message),
79
+ code,
80
+ reason,
81
+ cause
82
+ );
83
+ }
84
+
85
+ function componentWaitAbortError(reason){
86
+ const ownsError=!(reason instanceof Error&&reason.name==='AbortError');
87
+ const error=ownsError
88
+ ?new Error('Component readiness wait was aborted.')
89
+ :reason;
90
+ if(ownsError){
91
+ error.name='AbortError';
92
+ }
93
+ return defineComponentWaitError(
94
+ error,
95
+ COMPONENT_WAIT_ERROR_CODES.waitAborted,
96
+ COMPONENT_WAIT_REASONS.waitAborted,
97
+ reason
98
+ );
99
+ }
100
+
1
101
  function waitForComponent(element,options={}){
102
+ if(!options||typeof options!=='object'||Array.isArray(options)){
103
+ return Promise.reject(
104
+ componentWaitError(
105
+ 'Component readiness wait options must be an object.',
106
+ COMPONENT_WAIT_ERROR_CODES.waitOptionsInvalid,
107
+ COMPONENT_WAIT_REASONS.waitOptionsInvalid,
108
+ TypeError
109
+ )
110
+ );
111
+ }
2
112
  const {
3
113
  errorEvent='',
4
114
  methods=[],
5
115
  property='',
6
116
  event='',
117
+ signal=null,
7
118
  timeoutMs=0
8
119
  }=options;
9
120
 
121
+ if(typeof errorEvent!=='string'
122
+ ||!Array.isArray(methods)
123
+ ||methods.some(function invalidComponentMethod(method){
124
+ return typeof method!=='string'||method.trim().length<1;
125
+ })
126
+ ||typeof property!=='string'
127
+ ||typeof event!=='string'){
128
+ return Promise.reject(
129
+ componentWaitError(
130
+ 'Component readiness event, errorEvent, property, and methods options are invalid.',
131
+ COMPONENT_WAIT_ERROR_CODES.waitOptionsInvalid,
132
+ COMPONENT_WAIT_REASONS.waitOptionsInvalid,
133
+ TypeError
134
+ )
135
+ );
136
+ }
10
137
  if(!Number.isFinite(timeoutMs)||timeoutMs<0||timeoutMs>60000){
11
- return Promise.reject(new RangeError('timeoutMs must be between 0 and 60000.'));
138
+ return Promise.reject(
139
+ componentWaitError(
140
+ 'timeoutMs must be between 0 and 60000.',
141
+ COMPONENT_WAIT_ERROR_CODES.waitOptionsInvalid,
142
+ COMPONENT_WAIT_REASONS.waitOptionsInvalid,
143
+ RangeError
144
+ )
145
+ );
146
+ }
147
+ if(signal!==null
148
+ &&(
149
+ typeof signal!=='object'
150
+ ||typeof signal.aborted!=='boolean'
151
+ ||typeof signal.addEventListener!=='function'
152
+ ||typeof signal.removeEventListener!=='function'
153
+ )){
154
+ return Promise.reject(
155
+ componentWaitError(
156
+ 'signal must be an AbortSignal.',
157
+ COMPONENT_WAIT_ERROR_CODES.abortSignalInvalid,
158
+ COMPONENT_WAIT_REASONS.abortSignalInvalid,
159
+ TypeError
160
+ )
161
+ );
12
162
  }
13
163
 
14
164
  return new Promise(
15
165
  function waitForComponentPromise(resolve,reject){
166
+ let abortListenerInstalled=false;
167
+ let errorListenerInstalled=false;
168
+ let eventListenerInstalled=false;
16
169
  let timeout=null;
170
+ let settled=false;
17
171
 
18
172
  function cleanup(){
19
- if(element&&event){
20
- element.removeEventListener(event,eventHandler);
173
+ let cleanupError=null;
174
+ if(eventListenerInstalled){
175
+ try{
176
+ element.removeEventListener(event,eventHandler);
177
+ }catch(error){
178
+ cleanupError=error;
179
+ }
180
+ eventListenerInstalled=false;
21
181
  }
22
- if(element&&errorEvent){
23
- element.removeEventListener(errorEvent,errorHandler);
182
+ if(errorListenerInstalled){
183
+ try{
184
+ element.removeEventListener(errorEvent,errorHandler);
185
+ }catch(error){
186
+ cleanupError??=error;
187
+ }
188
+ errorListenerInstalled=false;
24
189
  }
25
190
  if(timeout!==null){
26
191
  clearTimeout(timeout);
27
192
  timeout=null;
28
193
  }
194
+ if(abortListenerInstalled){
195
+ try{
196
+ signal.removeEventListener('abort',abortWait);
197
+ }catch(error){
198
+ cleanupError??=error;
199
+ }
200
+ abortListenerInstalled=false;
201
+ }
202
+ return cleanupError;
29
203
  }
30
204
 
31
205
  function isReady(){
@@ -33,65 +207,244 @@ function waitForComponent(element,options={}){
33
207
  return false;
34
208
  }
35
209
 
36
- return methods.every(
37
- method=>typeof element[method]==='function'
38
- );
210
+ return methods.every(function componentMethodAvailable(method){
211
+ return typeof element[method]==='function';
212
+ });
39
213
  }
40
214
 
41
215
  function complete(){
42
- cleanup();
216
+ if(settled){
217
+ return;
218
+ }
219
+ settled=true;
220
+ const cleanupError=cleanup();
221
+ if(cleanupError){
222
+ reject(
223
+ componentWaitError(
224
+ 'Component readiness listener cleanup failed.',
225
+ COMPONENT_WAIT_ERROR_CODES.listenerCleanupFailed,
226
+ COMPONENT_WAIT_REASONS.listenerCleanupFailed,
227
+ Error,
228
+ cleanupError
229
+ )
230
+ );
231
+ return;
232
+ }
43
233
  resolve(element);
44
234
  }
45
235
 
46
236
  function fail(error){
47
- cleanup();
237
+ if(settled){
238
+ return;
239
+ }
240
+ settled=true;
241
+ const cleanupError=cleanup();
242
+ if(cleanupError){
243
+ try{
244
+ Object.defineProperty(
245
+ error,
246
+ 'cleanupError',
247
+ {
248
+ value:cleanupError,
249
+ enumerable:false,
250
+ configurable:true,
251
+ writable:true
252
+ }
253
+ );
254
+ }catch{}
255
+ }
48
256
  reject(error);
49
257
  }
50
258
 
259
+ function abortWait(){
260
+ fail(componentWaitAbortError(signal?.reason));
261
+ }
262
+
51
263
  function check(){
52
- if(isReady()){
53
- complete();
54
- return true;
264
+ try{
265
+ if(isReady()){
266
+ complete();
267
+ return true;
268
+ }
269
+ return false;
270
+ }catch(error){
271
+ fail(
272
+ componentWaitError(
273
+ 'Component readiness state inspection failed.',
274
+ COMPONENT_WAIT_ERROR_CODES.stateInspectionFailed,
275
+ COMPONENT_WAIT_REASONS.stateInspectionFailed,
276
+ Error,
277
+ error
278
+ )
279
+ );
280
+ return false;
55
281
  }
56
- return false;
57
282
  }
58
283
 
59
284
  function eventHandler(){
60
- if(isReady()){
61
- complete();
62
- }
285
+ check();
63
286
  }
64
287
 
65
288
  function errorHandler(errorEventObject){
66
- const error=new Error(
67
- errorEventObject?.detail?.message
68
- ||'The component reported a loading error.'
69
- );
70
- error.code=errorEventObject?.detail?.code||'COMPONENT_READY_FAILED';
71
- fail(error);
289
+ try{
290
+ const detail=errorEventObject?.detail;
291
+ const error=new Error(
292
+ detail?.message||'The component reported a loading error.'
293
+ );
294
+ const componentCode=typeof detail?.code==='string'
295
+ &&detail.code.trim()
296
+ ?detail.code
297
+ :null;
298
+ if(componentCode){
299
+ error.componentCode=componentCode;
300
+ }
301
+ error.compatibilityCode=componentCode||'COMPONENT_READY_FAILED';
302
+ fail(
303
+ defineComponentWaitError(
304
+ error,
305
+ COMPONENT_WAIT_ERROR_CODES.errorEventReported,
306
+ COMPONENT_WAIT_REASONS.errorEventReported,
307
+ detail?.error
308
+ )
309
+ );
310
+ }catch(error){
311
+ fail(
312
+ componentWaitError(
313
+ 'Component readiness error-event inspection failed.',
314
+ COMPONENT_WAIT_ERROR_CODES.errorEventInspectionFailed,
315
+ COMPONENT_WAIT_REASONS.errorEventInspectionFailed,
316
+ Error,
317
+ error
318
+ )
319
+ );
320
+ }
72
321
  }
73
322
 
74
323
  if(!element){
75
- fail(new Error('Component element is required.'));
324
+ fail(
325
+ componentWaitError(
326
+ 'Component element is required.',
327
+ COMPONENT_WAIT_ERROR_CODES.elementRequired,
328
+ COMPONENT_WAIT_REASONS.elementMissing,
329
+ TypeError
330
+ )
331
+ );
332
+ return;
333
+ }
334
+ if((event||errorEvent)
335
+ &&(
336
+ typeof element.addEventListener!=='function'
337
+ ||typeof element.removeEventListener!=='function'
338
+ )){
339
+ fail(
340
+ componentWaitError(
341
+ 'The component readiness listener target must provide addEventListener() and removeEventListener().',
342
+ COMPONENT_WAIT_ERROR_CODES.listenerTargetInvalid,
343
+ COMPONENT_WAIT_REASONS.listenerTargetInvalid,
344
+ TypeError
345
+ )
346
+ );
347
+ return;
348
+ }
349
+ if(signal?.aborted){
350
+ abortWait();
76
351
  return;
77
352
  }
78
353
 
354
+ if(signal){
355
+ abortListenerInstalled=true;
356
+ try{
357
+ signal.addEventListener('abort',abortWait,{once:true});
358
+ }catch(error){
359
+ fail(
360
+ componentWaitError(
361
+ 'Component readiness abort-listener installation failed.',
362
+ COMPONENT_WAIT_ERROR_CODES.listenerInstallationFailed,
363
+ COMPONENT_WAIT_REASONS.listenerInstallationFailed,
364
+ Error,
365
+ error
366
+ )
367
+ );
368
+ return;
369
+ }
370
+ if(settled){
371
+ return;
372
+ }
373
+ }
374
+
79
375
  if(event){
80
- element.addEventListener(event,eventHandler);
81
- }else if(!isReady()){
82
- fail(new Error('A component readiness event is required.'));
376
+ try{
377
+ element.addEventListener(event,eventHandler);
378
+ eventListenerInstalled=true;
379
+ }catch(error){
380
+ fail(
381
+ componentWaitError(
382
+ 'Component readiness listener installation failed.',
383
+ COMPONENT_WAIT_ERROR_CODES.listenerInstallationFailed,
384
+ COMPONENT_WAIT_REASONS.listenerInstallationFailed,
385
+ Error,
386
+ error
387
+ )
388
+ );
389
+ return;
390
+ }
391
+ }else if(!check()){
392
+ if(settled){
393
+ return;
394
+ }
395
+ fail(
396
+ componentWaitError(
397
+ 'A component readiness event is required.',
398
+ COMPONENT_WAIT_ERROR_CODES.readinessEventRequired,
399
+ COMPONENT_WAIT_REASONS.readinessEventMissing
400
+ )
401
+ );
402
+ return;
403
+ }
404
+ if(settled){
83
405
  return;
84
406
  }
85
407
 
86
408
  if(errorEvent){
87
- element.addEventListener(errorEvent,errorHandler);
409
+ try{
410
+ element.addEventListener(errorEvent,errorHandler);
411
+ errorListenerInstalled=true;
412
+ }catch(error){
413
+ fail(
414
+ componentWaitError(
415
+ 'Component readiness error-listener installation failed.',
416
+ COMPONENT_WAIT_ERROR_CODES.listenerInstallationFailed,
417
+ COMPONENT_WAIT_REASONS.listenerInstallationFailed,
418
+ Error,
419
+ error
420
+ )
421
+ );
422
+ return;
423
+ }
88
424
  }
89
425
  if(timeoutMs>0){
90
- timeout=setTimeout(()=>{
91
- const error=new Error(`Component readiness timed out after ${timeoutMs} ms.`);
92
- error.code='COMPONENT_READY_TIMEOUT';
93
- fail(error);
94
- },timeoutMs);
426
+ try{
427
+ timeout=setTimeout(function failComponentReadinessTimeout(){
428
+ fail(
429
+ componentWaitError(
430
+ `Component readiness timed out after ${timeoutMs} ms.`,
431
+ COMPONENT_WAIT_ERROR_CODES.waitTimedOut,
432
+ COMPONENT_WAIT_REASONS.waitTimedOut
433
+ )
434
+ );
435
+ },timeoutMs);
436
+ }catch(error){
437
+ fail(
438
+ componentWaitError(
439
+ 'Component readiness timeout installation failed.',
440
+ COMPONENT_WAIT_ERROR_CODES.timeoutInstallationFailed,
441
+ COMPONENT_WAIT_REASONS.timeoutInstallationFailed,
442
+ Error,
443
+ error
444
+ )
445
+ );
446
+ return;
447
+ }
95
448
  }
96
449
 
97
450
  check();
@@ -28,7 +28,7 @@
28
28
  "const": "arcane-os"
29
29
  },
30
30
  "version": {
31
- "const": "0.2.2"
31
+ "const": "0.3.0"
32
32
  }
33
33
  }
34
34
  },
@@ -82,7 +82,7 @@
82
82
  "const": "arcane-sdk-browser-runtime-v1"
83
83
  },
84
84
  "sdkVersion": {
85
- "const": "0.2.2"
85
+ "const": "0.3.0"
86
86
  },
87
87
  "source": {
88
88
  "type": "object",