arcane-os 0.3.1 → 0.3.2

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 (153) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +86 -117
  3. package/bin/arcane-test.mjs +170 -46
  4. package/browser-runtime/ai/browser-speech-artifacts.mjs +855 -895
  5. package/browser-runtime/ai/browser-speech-providers.mjs +80 -204
  6. package/browser-runtime/ai/browser-wasm-llm-provider.mjs +627 -819
  7. package/browser-runtime/ai/browser-wasm.mjs +24 -35
  8. package/browser-runtime/ai/browser-wllama-runtime.mjs +64 -316
  9. package/browser-runtime/ai/model-controller.mjs +584 -181
  10. package/browser-runtime/ai/speech-worker-client.mjs +8 -148
  11. package/browser-runtime/ai/speech-worker-runtime.mjs +642 -374
  12. package/browser-runtime/dom-event-instrumentation.mjs +55 -147
  13. package/browser-runtime/event-manager.mjs +239 -624
  14. package/package.json +5 -6
  15. package/runtime/arcane/components/app-bar.html +3 -15
  16. package/runtime/arcane/components/assistant-panel.html +10 -10
  17. package/runtime/arcane/components/calculator.html +1 -1
  18. package/runtime/arcane/components/chat.html +1359 -135
  19. package/runtime/arcane/components/conversation-view.html +2 -2
  20. package/runtime/arcane/components/document-inspector.html +11 -17
  21. package/runtime/arcane/components/file-manager.html +13 -56
  22. package/runtime/arcane/components/markdown-document.html +82 -281
  23. package/runtime/arcane/components/markdown-editor.html +7 -10
  24. package/runtime/arcane/components/media-embed.html +6 -6
  25. package/runtime/arcane/components/screen-capture.html +4 -4
  26. package/runtime/arcane/components/source-explanation.html +2 -2
  27. package/runtime/arcane/components/speech.html +112 -68
  28. package/runtime/arcane/components/terminal-workspace.html +4 -4
  29. package/runtime/arcane/components/theme-editor.html +1 -1
  30. package/runtime/arcane/components/unified-inbox.html +2 -2
  31. package/runtime/arcane/components/voice-transcription.html +31 -21
  32. package/runtime/arcane/entities/Calculation.js +2 -3
  33. package/runtime/arcane/entities/Chat.js +228 -43
  34. package/runtime/arcane/entities/Preference.js +3 -5
  35. package/runtime/arcane/entities/Weather.js +5 -5
  36. package/runtime/arcane/modules/AI.js +1042 -427
  37. package/runtime/arcane/modules/AIProviderRuntime.js +618 -359
  38. package/runtime/arcane/modules/AIResponseLength.js +9 -19
  39. package/runtime/arcane/modules/AIRuntimeState.js +109 -72
  40. package/runtime/arcane/modules/ArcaneNavigationPolicy.js +45 -32
  41. package/runtime/arcane/modules/BrowserTestSuite.js +78 -122
  42. package/runtime/arcane/modules/CalculatorEngine.js +9 -9
  43. package/runtime/arcane/modules/CommunicationAppController.js +3 -7
  44. package/runtime/arcane/modules/ComponentContracts.js +30 -32
  45. package/runtime/arcane/modules/ConfiguredAIChatSession.js +281 -230
  46. package/runtime/arcane/modules/ConversationActionItems.js +26 -59
  47. package/runtime/arcane/modules/ConversationClosingReport.js +34 -61
  48. package/runtime/arcane/modules/ConversationTimebox.js +27 -15
  49. package/runtime/arcane/modules/DBOPFSDocumentLibrary.js +152 -344
  50. package/runtime/arcane/modules/DocumentLexicalSearch.js +25 -91
  51. package/runtime/arcane/modules/HTMLImport.js +54 -1
  52. package/runtime/arcane/modules/IsolatedModelQuestionRunner.js +40 -203
  53. package/runtime/arcane/modules/LocalAIReadiness.js +40 -60
  54. package/runtime/arcane/modules/LocalAIReadinessController.js +15 -13
  55. package/runtime/arcane/modules/MD.js +1 -45
  56. package/runtime/arcane/modules/Mail.js +51 -103
  57. package/runtime/arcane/modules/MailOutbox.mjs +95 -193
  58. package/runtime/arcane/modules/MailTransport.mjs +36 -57
  59. package/runtime/arcane/modules/ModelDefinition.js +22 -106
  60. package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +39 -101
  61. package/runtime/arcane/modules/PersistentAIChatSession.js +281 -18
  62. package/runtime/arcane/modules/PreferenceStore.js +102 -30
  63. package/runtime/arcane/modules/RiskSignalAnalyzer.js +8 -9
  64. package/runtime/arcane/modules/ScopedOPFSCache.js +7 -42
  65. package/runtime/arcane/modules/ScreenCapture.js +175 -128
  66. package/runtime/arcane/modules/SpeechPlayback.js +46 -149
  67. package/runtime/arcane/modules/StaticDocumentCatalog.js +173 -407
  68. package/runtime/arcane/modules/ToolCallRouter.js +25 -12
  69. package/runtime/arcane/modules/YouTubeMedia.js +6 -5
  70. package/schemas/arcane-app-bundle.schema.json +13 -78
  71. package/schemas/arcane-app.schema.json +9 -25
  72. package/schemas/arcane-lock.schema.json +18 -151
  73. package/schemas/arcane-package.schema.json +2 -16
  74. package/schemas/native-build-plan.schema.json +119 -122
  75. package/src/app-descriptor.mjs +75 -132
  76. package/src/application-tests.mjs +200 -0
  77. package/src/cli/main.mjs +27 -46
  78. package/src/constants.mjs +3 -4
  79. package/src/dev-server.mjs +30 -324
  80. package/src/doctor.mjs +92 -154
  81. package/src/dom-event-instrumentation.mjs +55 -147
  82. package/src/errors.mjs +2 -3
  83. package/src/event-manager.mjs +239 -624
  84. package/src/event-queue.mjs +3 -3
  85. package/src/import-map.mjs +273 -1028
  86. package/src/index.mjs +14 -16
  87. package/src/installed-sdk-runtime.mjs +27 -67
  88. package/src/integrated-provider-loader.mjs +53 -382
  89. package/src/mail-api.mjs +0 -2
  90. package/src/mail-server.mjs +224 -580
  91. package/src/mail.mjs +4 -10
  92. package/src/native-plan.mjs +163 -598
  93. package/src/native-provider-loader.mjs +104 -1063
  94. package/src/packager/core.mjs +485 -3229
  95. package/src/process.mjs +5 -10
  96. package/src/release-bundle.mjs +292 -2405
  97. package/src/runtime.mjs +76 -396
  98. package/src/scaffold.mjs +30 -80
  99. package/src/sdk-browser-runtime.mjs +70 -626
  100. package/src/source-server.mjs +588 -0
  101. package/src/targets/index.mjs +78 -188
  102. package/src/templates/workspace-template.mjs +19 -135
  103. package/src/testing-loader.mjs +164 -0
  104. package/src/testing.mjs +1 -1
  105. package/src/toolchain.mjs +131 -544
  106. package/src/update-check.mjs +26 -64
  107. package/src/workspace-operation-lock.mjs +139 -430
  108. package/src/workspace-runtime.mjs +109 -1558
  109. package/src/workspace.mjs +40 -302
  110. package/browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json +0 -218
  111. package/browser-runtime/ai/ARCANE_AI_BROWSER_SPEECH_COMPONENTS.json +0 -203
  112. package/browser-runtime/ai/ARCANE_AI_BROWSER_WASM_COMPONENTS.json +0 -80
  113. package/browser-runtime/ai/internal/sha256.mjs +0 -166
  114. package/docs/architecture.md +0 -344
  115. package/docs/compatibility.md +0 -36
  116. package/docs/event-manager.md +0 -294
  117. package/docs/platform-targets.md +0 -108
  118. package/docs/publishing.md +0 -201
  119. package/docs/reference/README.md +0 -185
  120. package/docs/reference/ai/browser-speech-package-authority.json +0 -835
  121. package/docs/reference/ai/browser-speech.md +0 -1295
  122. package/docs/reference/ai/browser-wasm.md +0 -530
  123. package/docs/reference/arcane-ollama.md +0 -288
  124. package/docs/reference/availability-and-normalization.md +0 -183
  125. package/docs/reference/behavioral-testing.md +0 -133
  126. package/docs/reference/cli.md +0 -779
  127. package/docs/reference/core/README.md +0 -62
  128. package/docs/reference/core/arcane-ai-contracts.md +0 -907
  129. package/docs/reference/core/arcane-api.md +0 -601
  130. package/docs/reference/core/arcane-entities.md +0 -65
  131. package/docs/reference/core/arcane-events.md +0 -134
  132. package/docs/reference/core/ollama-module.md +0 -181
  133. package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +0 -1909
  134. package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +0 -1057
  135. package/docs/reference/core/reference/arcane-api/core-and-events.md +0 -320
  136. package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +0 -610
  137. package/docs/reference/core/reference/arcane-api/namespaces.md +0 -1157
  138. package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +0 -1423
  139. package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +0 -315
  140. package/docs/reference/event-manager.md +0 -1511
  141. package/docs/reference/inventory/package-api.json +0 -3284
  142. package/docs/reference/inventory/runtime-components.json +0 -1011
  143. package/docs/reference/inventory/runtime-entities.json +0 -26
  144. package/docs/reference/inventory/runtime-modules.json +0 -1431
  145. package/docs/reference/mail.md +0 -316
  146. package/docs/reference/protocols.md +0 -719
  147. package/docs/reference/runtime-components.md +0 -1366
  148. package/docs/reference/runtime-entities.md +0 -303
  149. package/docs/reference/runtime-modules.md +0 -2965
  150. package/docs/reference/sdk-api.md +0 -6698
  151. package/docs/roadmap.md +0 -79
  152. package/docs/work-amplification.md +0 -129
  153. package/runtime/ARCANE_RUNTIME_RELEASE.json +0 -826
@@ -13,8 +13,8 @@ function nextOperationId(kind){operationSequence+=1;return `${events.descriptor.
13
13
  function emit(type,detail={},publicDetail={},operationId=null){if(destroyed)return false;const publication=events.dispatch(type,detail,{publicDetail,operationId});return projectArcaneDOMEvent(host,publication.occurrence,{bubbles:true,composed:true})}
14
14
  host.setConversation=(next,items=[],options={})=>{if(destroyed)return false;thread=next||null;advisories=options?.advisories instanceof Map?options.advisories:new Map();heading.hidden=!thread;composer.hidden=!thread;if(!thread){messages.innerHTML='<div class="blank"><div><strong>Select a conversation</strong><p>Choose a thread from the inbox, or connect a service in settings.</p></div></div>';return}root.querySelector('#title').textContent=thread.title;root.querySelector('#participants').textContent=(thread.participants||[]).join(', ');root.querySelector('#badge').textContent=`${thread.channel} · ${thread.providerId}`;render(items)};
15
15
  host.setBusy=value=>{if(destroyed)return false;for(const control of composer.elements) control.disabled=Boolean(value)};host.setStatus=value=>{if(destroyed)return false;status.textContent=String(value||'')};
16
- composer.addEventListener('submit',event=>{event.preventDefault();const value=body.value.trim();if(!value)return;emit('communication-send',{thread,body:value},{hasThread:Boolean(thread),bodyLength:value.length},nextOperationId('send'))},{signal:lifecycleController.signal});
17
- function render(items){messages.replaceChildren(...Array.from(items||[]).map(item=>{const article=document.createElement('article'),text=document.createElement('p'),footer=document.createElement('footer'),time=document.createElement('time'),state=document.createElement('span');article.className=`message ${item.direction}`;text.textContent=item.body||item.subject||'';time.dateTime=item.timestamp;time.textContent=new Intl.DateTimeFormat(undefined,{dateStyle:'short',timeStyle:'short'}).format(new Date(item.timestamp));state.textContent=item.status;footer.append(time,state);article.append(text,footer);const advisory=advisories.get(item);if(advisory){const note=document.createElement('aside'),title=document.createElement('strong'),summary=document.createElement('p');note.className='advisory';note.dataset.level=String(advisory.level||'caution');note.setAttribute('role','note');title.textContent=String(advisory.title||'Content advisory');summary.textContent=String(advisory.summary||'Review this message carefully.');note.append(title,summary);const signals=Array.from(advisory.signals||[]).map(String).filter(Boolean).slice(0,8);if(signals.length){const list=document.createElement('ul');for(const signal of signals){const entry=document.createElement('li');entry.textContent=signal;list.append(entry)}note.append(list)}if(advisory.actionLabel){const action=document.createElement('button');action.type='button';action.className='arcane-button arcane-button--tertiary';action.textContent=String(advisory.actionLabel);action.addEventListener('click',()=>emit('communication-advisory-action',{thread,message:item,advisory},{hasThread:Boolean(thread),level:String(advisory.level||'caution')},nextOperationId('advisory-action')),{signal:lifecycleController.signal});note.append(action)}article.append(note)}return article}));messages.scrollTop=messages.scrollHeight;}
16
+ composer.addEventListener('submit',event=>{event.preventDefault();const value=body.value;if(!value.trim())return;const detail={thread,body:value};emit('communication-send',detail,detail,nextOperationId('send'))},{signal:lifecycleController.signal});
17
+ function render(items){messages.replaceChildren(...Array.from(items||[]).map(item=>{const article=document.createElement('article'),text=document.createElement('p'),footer=document.createElement('footer'),time=document.createElement('time'),state=document.createElement('span');article.className=`message ${item.direction}`;text.textContent=item.body||item.subject||'';time.dateTime=item.timestamp;time.textContent=new Intl.DateTimeFormat(undefined,{dateStyle:'short',timeStyle:'short'}).format(new Date(item.timestamp));state.textContent=item.status;footer.append(time,state);article.append(text,footer);const advisory=advisories.get(item);if(advisory){const note=document.createElement('aside'),title=document.createElement('strong'),summary=document.createElement('p');note.className='advisory';note.dataset.level=String(advisory.level||'caution');note.setAttribute('role','note');title.textContent=String(advisory.title||'Content advisory');summary.textContent=String(advisory.summary||'Review this message carefully.');note.append(title,summary);const signals=Array.from(advisory.signals||[]).map(String).filter(Boolean);if(signals.length){const list=document.createElement('ul');for(const signal of signals){const entry=document.createElement('li');entry.textContent=signal;list.append(entry)}note.append(list)}if(advisory.actionLabel){const action=document.createElement('button');action.type='button';action.className='arcane-button arcane-button--tertiary';action.textContent=String(advisory.actionLabel);const detail={thread,message:item,advisory};action.addEventListener('click',()=>emit('communication-advisory-action',detail,detail,nextOperationId('advisory-action')),{signal:lifecycleController.signal});note.append(action)}article.append(note)}return article}));messages.scrollTop=messages.scrollHeight;}
18
18
  function destroy(){if(destroyed)return false;destroyed=true;lifecycleController.abort();thread=null;advisories={};events.dispose();host.ready=false;return true}
19
19
  host.clearComposer=()=>{if(destroyed)return false;body.value='';body.focus()};host.destroy=destroy;host.ready=true;emit('conversation-view-ready',{}, {ready:true});
20
20
  </script>
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
  <div id="details-panel" class="panel details" role="tabpanel" aria-labelledby="details-tab" data-panel="details" hidden>
44
44
  <section class="metadata"><h3>Source details</h3><dl data-metadata></dl></section>
45
- <form class="review"><h3 data-review-heading>Review</h3><label>Status<select data-review-status></select></label><label data-classification-field hidden><span data-classification-label>Classification</span><select data-review-classification></select></label><div data-review-fields></div><label><span data-notes-label>Notes</span><textarea data-review-notes maxlength="10000"></textarea></label><button class="save" type="submit">Save review</button><span class="save-state" aria-live="polite"></span></form>
45
+ <form class="review"><h3 data-review-heading>Review</h3><label>Status<select data-review-status></select></label><label data-classification-field hidden><span data-classification-label>Classification</span><select data-review-classification></select></label><div data-review-fields></div><label><span data-notes-label>Notes</span><textarea data-review-notes></textarea></label><button class="save" type="submit">Save review</button><span class="save-state" aria-live="polite"></span></form>
46
46
  </div>
47
47
  </section>
48
48
 
@@ -108,15 +108,13 @@
108
108
  projectArcaneDOMEvent(host,publication.occurrence,{bubbles:true,composed:true});
109
109
  },{signal:lifecycleController.signal});
110
110
 
111
- function sameOriginUrl(value){
111
+ function sourceUrl(value){
112
112
  if(!String(value||'').trim()) throw new TypeError('A document source is required.');
113
- const url=new URL(String(value||''),document.baseURI);
114
- if(url.origin!==location.origin) throw new TypeError('Document sources must use the current application origin.');
115
- return url.href;
113
+ return new URL(String(value||''),document.baseURI).href;
116
114
  }
117
115
 
118
116
  function pdfSourceUrl(value,page=null){
119
- const url=new URL(sameOriginUrl(value));
117
+ const url=new URL(sourceUrl(value));
120
118
  if(page===null||page===undefined||page==='') return url.href;
121
119
  const resolvedPage=Number(page);
122
120
  if(!Number.isSafeInteger(resolvedPage)||resolvedPage<1) throw new TypeError('PDF page must be a positive integer.');
@@ -143,12 +141,8 @@
143
141
  surface.replaceChildren(paragraph);
144
142
  }
145
143
 
146
- function safeMarkdown(markdown=''){
147
- const template=document.createElement('template');
148
- template.innerHTML=new MD(markdown).safeRendered;
149
- template.content.querySelectorAll('img,video,audio,source,picture').forEach(element=>element.remove());
150
- template.content.querySelectorAll('a').forEach(link=>{link.removeAttribute('href');link.removeAttribute('target');link.removeAttribute('rel');});
151
- return template.innerHTML;
144
+ function renderMarkdownHTML(markdown=''){
145
+ return new MD(markdown).safeRendered;
152
146
  }
153
147
 
154
148
  function showMarkdown(){
@@ -218,7 +212,7 @@
218
212
  if(!reviewClassification.value&&reviewClassification.options.length) reviewClassification.selectedIndex=0;
219
213
  reviewFields.replaceChildren();
220
214
  for(const definition of Array.isArray(config.reviewFields)?config.reviewFields:[]){
221
- const key=String(definition.key||'').replace(/[^a-z0-9._-]/gi,'-').slice(0,80);
215
+ const key=String(definition.key||'').replace(/[^a-z0-9._-]/gi,'-');
222
216
  if(!key) continue;
223
217
  const label=document.createElement('label'); const caption=document.createElement('span'); caption.textContent=String(definition.label||key);
224
218
  let field;
@@ -230,7 +224,7 @@
230
224
  }else{
231
225
  field=document.createElement('input'); field.type='text';
232
226
  }
233
- field.dataset.reviewField=key; field.maxLength=Math.min(Number(definition.maxLength)||10000,10000); field.placeholder=String(definition.placeholder||'');
227
+ field.dataset.reviewField=key; field.placeholder=String(definition.placeholder||'');
234
228
  field.value=String(config.review?.attributes?.[key]||'');
235
229
  if(definition.type==='select'&&!field.value&&field.options.length&&![...field.options].some(option=>option.value==='')) field.selectedIndex=0;
236
230
  label.append(caption,field); reviewFields.append(label);
@@ -241,7 +235,7 @@
241
235
  if(hasPdf){
242
236
  try{
243
237
  const resolvedPage=config.pdfPage===null||config.pdfPage===undefined||config.pdfPage===''?null:Number(config.pdfPage);
244
- const frame=document.createElement('iframe'); frame.className='pdf-frame'; frame.title=`Original PDF: ${config.title||'document'}${resolvedPage?`, page ${resolvedPage}`:''}`; frame.referrerPolicy='no-referrer'; frame.src=pdfSourceUrl(config.pdfUrl,resolvedPage); pdfPanel.append(frame);
238
+ const frame=document.createElement('iframe'); frame.className='pdf-frame'; frame.title=`Original PDF: ${config.title||'document'}${resolvedPage?`, page ${resolvedPage}`:''}`; frame.src=pdfSourceUrl(config.pdfUrl,resolvedPage); pdfPanel.append(frame);
245
239
  }catch(error){showSurfaceMessage(pdfPanel,error.message,'error');}
246
240
  }
247
241
  rawMarkdown=''; renderedMarkdown=''; markdownMessage=null;
@@ -249,11 +243,11 @@
249
243
  if(hasText){
250
244
  showSurfaceMessage(markdownSurface,'Loading document text…');
251
245
  try{
252
- const response=await fetch(sameOriginUrl(config.markdownUrl),{cache:'no-store',credentials:'same-origin',signal:controller.signal});
246
+ const response=await fetch(sourceUrl(config.markdownUrl),{signal:controller.signal});
253
247
  if(!response.ok) throw new Error(`Document text unavailable (${response.status}).`);
254
248
  const markdown=await response.text();
255
249
  if(destroyed||sequence!==loadSequence) return false;
256
- rawMarkdown=markdown; renderedMarkdown=safeMarkdown(rawMarkdown); showMarkdown();
250
+ rawMarkdown=markdown; renderedMarkdown=renderMarkdownHTML(rawMarkdown); showMarkdown();
257
251
  }catch(error){
258
252
  if(destroyed||sequence!==loadSequence||controller.signal.aborted) return false;
259
253
  markdownMessage={message:error.message,className:'error'}; showMarkdown();
@@ -13,9 +13,6 @@
13
13
  list-style:none;
14
14
  padding:1em;
15
15
  margin:0;
16
- max-height: 1em;
17
- overflow: hidden;
18
- transition: max-height 250ms ease-out;
19
16
  }
20
17
 
21
18
  .directory.open{
@@ -314,15 +311,13 @@
314
311
 
315
312
  .tree-entry-name{
316
313
  min-width:0;
317
- overflow:hidden;
318
- text-overflow:ellipsis;
319
- white-space:nowrap;
314
+ overflow-wrap:anywhere;
320
315
  }
321
316
 
322
317
  .tree-file-count{
323
318
  color:var(--platinum,var(--text-color));
324
319
  font-size:.75em;
325
- white-space:nowrap;
320
+ overflow-wrap:anywhere;
326
321
  }
327
322
 
328
323
  .tree-empty,
@@ -512,24 +507,8 @@
512
507
  return `${events.descriptor.instanceId}:${action}:${operationSequence}`;
513
508
  }
514
509
 
515
- function publicEventDetail(name,detail={}){
516
- if(name==='file-manager-action'){
517
- const publicDetail={action:String(detail.action||''),kind:String(detail.entry?.kind||''),hasEntry:Boolean(detail.path)};
518
- if(detail.code){
519
- publicDetail.code=String(detail.code);
520
- }
521
- if(detail.reason){
522
- publicDetail.reason=String(detail.reason);
523
- }
524
- return publicDetail;
525
- }
526
- if(name==='file-manager-open'){
527
- return {trigger:String(detail.trigger||''),kind:String(detail.entry?.kind||''),hasEntry:Boolean(detail.path)};
528
- }
529
- if(name==='file-manager-select'){
530
- return {selected:Boolean(detail.path),kind:String(detail.entry?.kind||'')};
531
- }
532
- return {};
510
+ function publicEventDetail(_name,detail={}){
511
+ return detail;
533
512
  }
534
513
 
535
514
  function emit(name,detail={},cancelable=false,operationId=null){
@@ -1467,31 +1446,11 @@
1467
1446
 
1468
1447
  status.remove();
1469
1448
 
1470
- if(fileRef.size<1){
1471
- const empty=document.createElement('h2');
1472
-
1473
- if(!layout){
1474
- await dbopfs.delete(directory,fileName);
1475
- if(destroyed||generation!==fileOpenGeneration){
1476
- return false;
1477
- }
1478
- await loadAll();
1479
- if(destroyed||generation!==fileOpenGeneration){
1480
- return false;
1481
- }
1482
- empty.innerText='File was empty and has been deleted';
1483
- }else{
1484
- empty.innerText='File is empty';
1485
- }
1486
-
1487
- content.append(empty);
1488
- }else{
1489
- const rendered=await renderFile(fileRef,{directory,fileName});
1490
- if(destroyed||generation!==fileOpenGeneration){
1491
- return false;
1492
- }
1493
- content.append(rendered);
1449
+ const rendered=await renderFile(fileRef,{directory,fileName});
1450
+ if(destroyed||generation!==fileOpenGeneration){
1451
+ return false;
1494
1452
  }
1453
+ content.append(rendered);
1495
1454
  return true;
1496
1455
  }catch(error){
1497
1456
  if(!destroyed&&generation===fileOpenGeneration){
@@ -1551,13 +1510,11 @@
1551
1510
  ){
1552
1511
  preview=await host.previewTransform(
1553
1512
  preview,
1554
- Object.freeze(
1555
- {
1556
- directory:String(context.directory||''),
1557
- extension:String(fileRef.ext||''),
1558
- fileName:String(context.fileName||fileRef.name||'')
1559
- }
1560
- )
1513
+ {
1514
+ directory:String(context.directory||''),
1515
+ extension:String(fileRef.ext||''),
1516
+ fileName:String(context.fileName||fileRef.name||'')
1517
+ }
1561
1518
  );
1562
1519
  }
1563
1520