arcane-os 0.11.0 → 0.11.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.2
4
+
5
+ - Show mobile speech feedback only during requested or active voice loading.
6
+ Align pending local-model activation to the top of the chat area at viewport
7
+ widths up to `44rem`. Preserve existing mobile controls, complete status and
8
+ error data, desktop layout, and model lifecycle.
9
+
10
+ ## 0.11.1
11
+
12
+ - Keep the shared Chat transcript, composer, speech controls, language selector,
13
+ and timer hidden until the selected local language model is ready and loaded.
14
+ Cloud routes remain visible immediately, and completed transcripts remain readable.
15
+
3
16
  ## 0.11.0
4
17
 
5
18
  - Add explicit browser chat CPU selection with `loadDefaults:{gpuLayers:0}`
package/README.md CHANGED
@@ -19,7 +19,7 @@ version-locked SDK runtime, while an integrated Arcane checkout uses its live
19
19
  `arcane/` runtime. Both profiles preserve the same app URLs, theme, packaging,
20
20
  event, cancellation, and browser run contracts.
21
21
 
22
- This checkout defines the `0.11.0` SDK contract. Applications pin one exact npm
22
+ This checkout defines the `0.11.2` SDK contract. Applications pin one exact npm
23
23
  version and lockfile; registry state is deliberately not baked into application
24
24
  artifacts.
25
25
 
@@ -41,7 +41,7 @@ Create one browser application, install its pinned SDK, and start its source
41
41
  server:
42
42
 
43
43
  ```bash
44
- npx arcane-os@0.11.0 new hello-speech --path ./hello-speech --target browser
44
+ npx arcane-os@0.11.2 new hello-speech --path ./hello-speech --target browser
45
45
  cd hello-speech
46
46
  npm install
47
47
  npm run dev
@@ -392,7 +392,7 @@ uses the same controller for automatic memory extraction.
392
392
  Create a new repository-shaped Arcane application with the exact stable SDK:
393
393
 
394
394
  ```bash
395
- npx arcane-os@0.11.0 new my-app --path ./my-app --target portable --git
395
+ npx arcane-os@0.11.2 new my-app --path ./my-app --target portable --git
396
396
  cd my-app
397
397
  npm install
398
398
  npm run dev
@@ -402,7 +402,7 @@ To enroll an existing repository, install the exact SDK and initialize only
402
402
  missing Arcane files:
403
403
 
404
404
  ```bash
405
- npm install --save-dev --save-exact arcane-os@0.11.0
405
+ npm install --save-dev --save-exact arcane-os@0.11.2
406
406
  npm exec -- arcane init my-app --target portable
407
407
  ```
408
408
 
@@ -418,7 +418,7 @@ npm exec -- arcane-os targets
418
418
  No global SDK install or standalone Arcane CLI is required. The application
419
419
  repository's exact npm dependency and lockfile own the CLI and toolchain version.
420
420
 
421
- Use `npx arcane-os@0.11.0` for the initial bootstrap because it names this npm
421
+ Use `npx arcane-os@0.11.2` for the initial bootstrap because it names this npm
422
422
  package explicitly; bare `npx arcane` outside an installed project could resolve
423
423
  a different package. Both installed commands invoke the same headless toolchain.
424
424
  Project-local npm scripts use the SDK pinned by that app's `package-lock.json`,
@@ -438,7 +438,7 @@ node ./bin/arcane.mjs new local-app --path ../local-app --target portable --git
438
438
 
439
439
  # From the generated app repository
440
440
  cd ../local-app
441
- npm install --save-dev --save-exact ../arcane-os-sdk/arcane-os-0.11.0.tgz
441
+ npm install --save-dev --save-exact ../arcane-os-sdk/arcane-os-0.11.2.tgz
442
442
  npm ci
443
443
  ```
444
444
 
@@ -447,7 +447,7 @@ same location. The lockfile retains the selected package dependency while
447
447
  Arcane uses the installed package name and version. Local directory `file:` dependencies are not
448
448
  accepted because npm may install them as links; use a packed `.tgz`. A GitHub
449
449
  runner also needs that tarball at the locked path. After publication, replace
450
- the local declaration with the exact `arcane-os@0.11.0` registry package and
450
+ the local declaration with the exact `arcane-os@0.11.2` registry package and
451
451
  commit the regenerated lock.
452
452
 
453
453
  Generated repositories use `npm ci --ignore-scripts` in CI. Run dependency
@@ -586,7 +586,7 @@ package installation, or assertions.
586
586
 
587
587
  ## Current target support
588
588
 
589
- Version `0.11.0` exposes one browser target and five explicitly paired
589
+ Version `0.11.2` exposes one browser target and five explicitly paired
590
590
  native development targets: a non-runnable portable directory, a
591
591
  Windows x64 unsigned-local-test EXE bundle, Linux x64 and Linux ARM64
592
592
  unsigned-local-test DEBs, and an Android development-signed APK. The
@@ -411,6 +411,20 @@ comes from sticky runtime role state; the method never forwards standalone
411
411
  speech booleans or synthesizes ready speech roles without a selected, loaded
412
412
  provider.
413
413
 
414
+ Before model selection is available, conversation surfaces remain hidden unless
415
+ the host supplies LLM availability through `setAIAvailability()`. For a selected
416
+ local LLM, the transcript, session status, composer, upload, speech panel
417
+ (including application-supplied controls), language selector, and timer stay
418
+ hidden until that exact sticky role is `ready` and `loaded`. The existing model
419
+ activation area remains available for Start, progress, cancellation, and retry.
420
+ At viewport widths up to `44rem`, that pending local-model activation area sits
421
+ at the top of the chat area; wider layouts retain their existing placement.
422
+ A selected cloud route (`localOnly:false`) shows the conversation surfaces
423
+ immediately; Send still follows actual LLM availability. Later unload, failure,
424
+ or selection changes update visibility from the same runtime subscription
425
+ without starting model work or changing retained conversation content. A
426
+ completed conversation keeps its transcript visible and its controls hidden.
427
+
414
428
  When a selected LLM route is `unloaded` or in `error`, the component exposes a
415
429
  keyboard-operable Start/Try again control while Send stays disabled. During
416
430
  `loading`, the control becomes Cancel loading and reflects sticky progress
@@ -1168,8 +1182,12 @@ selects a Speech interface for voice output. Transcription activation,
1168
1182
  recording, sending recorded audio, and their status/progress are unavailable;
1169
1183
  `requestSTTActivation()` returns `false` without requesting a provider action.
1170
1184
  The keyboard remains the voice-input path. The existing TTS mute/unmute control
1171
- and voice status remain available, and Chat retains its End control. Desktop
1172
- speech and the dedicated `voice-transcription.html` component retain their
1185
+ remains available alongside application-supplied controls such as End. Mobile
1186
+ voice feedback participates in layout only while a voice load is requested or
1187
+ the TTS role is `loading`; it collapses in other states, including unloaded, ready, and
1188
+ speaking. Complete status text and error events remain maintained by the same
1189
+ owner, and the voice control retains its state-specific labels and retry action.
1190
+ Desktop speech and the dedicated `voice-transcription.html` component retain their
1173
1191
  existing behavior.
1174
1192
 
1175
1193
  On desktop, the Hold to talk control remains disabled unless sticky STT state
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arcane-os",
3
- "version": "0.11.0",
3
+ "version": "0.11.2",
4
4
  "description": "Arcane OS JavaScript SDK, project-local CLI, browser runtime, and repository-portable application packager.",
5
5
  "type": "module",
6
6
  "main": "./src/index.mjs",
@@ -112,6 +112,15 @@
112
112
  display:none;
113
113
  }
114
114
 
115
+ .chat_area[data-model-start-required="true"]:not([data-conversation-complete="true"]) > .conversation_timebox,
116
+ .chat_area[data-model-start-required="true"]:not([data-conversation-complete="true"]) > .chat_output,
117
+ .chat_area[data-model-start-required="true"]:not([data-conversation-complete="true"]) > .chat_session_status,
118
+ .chat_area[data-model-start-required="true"]:not([data-conversation-complete="true"]) > .chat_input_area,
119
+ .chat_area[data-model-start-required="true"]:not([data-conversation-complete="true"]) > #speech,
120
+ .chat_area[data-model-start-required="true"]:not([data-conversation-complete="true"]) > .controls {
121
+ display: none;
122
+ }
123
+
115
124
  .conversation_timebox[data-error="true"]{
116
125
  color:var(--danger-color,var(--text-color));
117
126
  }
@@ -522,6 +531,10 @@
522
531
  padding: var(--arcane-space-2, .5rem);
523
532
  }
524
533
 
534
+ .chat_area[data-model-start-required="true"]:not([data-conversation-complete="true"]) {
535
+ justify-content: flex-start;
536
+ }
537
+
525
538
  .chat_output > li {
526
539
  max-width: 96%;
527
540
  }
@@ -570,7 +583,7 @@
570
583
  }
571
584
  </style>
572
585
 
573
- <section class="chat_area">
586
+ <section class="chat_area" data-model-start-required="true">
574
587
  <section
575
588
  id="conversation_timebox"
576
589
  class="conversation_timebox"
@@ -1985,6 +1998,14 @@
1985
1998
 
1986
1999
  function applyAIAvailability(availability){
1987
2000
  host.aiAvailability={...availability};
2001
+ const selectedRole = hasSelectedAIRuntimeRole('llm')
2002
+ ? latestAIRuntimeRoles.llm
2003
+ : null;
2004
+ const conversationVisible = selectedRole
2005
+ ? selectedRole.localOnly === false
2006
+ || (selectedRole.state === 'ready' && selectedRole.loaded)
2007
+ : availability.llm;
2008
+ chatArea.dataset.modelStartRequired = String(!conversationVisible);
1988
2009
  send.disabled=host.conversationComplete
1989
2010
  ||!availability.llm
1990
2011
  ||sessionMessagePending
@@ -147,6 +147,10 @@
147
147
  grid-column: 1;
148
148
  }
149
149
 
150
+ :host([data-device-class="mobile"]:not([data-voice-loading="true"])) .speech_feedback {
151
+ display: none;
152
+ }
153
+
150
154
  :host([data-device-class="mobile"]) #muteButton {
151
155
  grid-row: 1;
152
156
  grid-column: 2;
@@ -725,6 +729,9 @@
725
729
  }
726
730
 
727
731
  function renderStatus() {
732
+ host.dataset.voiceLoading = String(
733
+ pendingTTSIntent === 'load' || ttsRole.state === 'loading'
734
+ );
728
735
  const messages = [];
729
736
  let tone = '';
730
737