arcane-os 0.3.5 → 0.3.6

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.6
4
+
5
+ - Replaced coherent selected-but-unregistered STT and TTS placeholders during
6
+ initial explicit browser-speech configuration while preserving rejection of
7
+ registered, busy, local-only, or internally divergent selections and keeping
8
+ the new providers unloaded until the application activates them.
9
+ - Preserved complete finite provider progress values and units as
10
+ informational, non-gating state in the reusable formatter and shared Chat
11
+ activation interface.
12
+
3
13
  ## 0.3.5
4
14
 
5
15
  - Preserved complete AI and chat runtime content across multi-choice streaming,
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.3.5` SDK contract. Applications pin one exact npm
22
+ This checkout defines the `0.3.6` 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
 
@@ -126,7 +126,7 @@ uses the same controller for automatic memory extraction.
126
126
  Create a new repository-shaped Arcane application with the exact stable SDK:
127
127
 
128
128
  ```bash
129
- npx arcane-os@0.3.5 new my-app --path ./my-app --target portable --git
129
+ npx arcane-os@0.3.6 new my-app --path ./my-app --target portable --git
130
130
  cd my-app
131
131
  npm install
132
132
  npm run check
@@ -137,7 +137,7 @@ To enroll an existing repository, install the exact SDK and initialize only
137
137
  missing Arcane files:
138
138
 
139
139
  ```bash
140
- npm install --save-dev --save-exact arcane-os@0.3.5
140
+ npm install --save-dev --save-exact arcane-os@0.3.6
141
141
  npm exec -- arcane init my-app --target portable
142
142
  ```
143
143
 
@@ -153,7 +153,7 @@ npm exec -- arcane-os targets
153
153
  No global SDK install or standalone Arcane CLI is required. The application
154
154
  repository's exact npm dependency and lockfile own the CLI and toolchain version.
155
155
 
156
- Use `npx arcane-os@0.3.5` for the initial bootstrap because it names this npm
156
+ Use `npx arcane-os@0.3.6` for the initial bootstrap because it names this npm
157
157
  package explicitly; bare `npx arcane` outside an installed project could resolve
158
158
  a different package. Both installed commands invoke the same headless toolchain.
159
159
  Project-local npm scripts use the SDK pinned by that app's `package-lock.json`,
@@ -174,7 +174,7 @@ node ./bin/arcane.mjs new local-app --path ../local-app --target portable --git
174
174
 
175
175
  # From the generated app repository
176
176
  cd ../local-app
177
- npm install --save-dev --save-exact ../arcane-os-sdk/arcane-os-0.3.5.tgz
177
+ npm install --save-dev --save-exact ../arcane-os-sdk/arcane-os-0.3.6.tgz
178
178
  npm run check
179
179
  npm ci
180
180
  ```
@@ -184,7 +184,7 @@ same location. The lockfile retains the selected package dependency while
184
184
  Arcane uses the installed package name and version. Local directory `file:` dependencies are not
185
185
  accepted because npm may install them as links; use a packed `.tgz`. A GitHub
186
186
  runner also needs that tarball at the locked path. After publication, replace
187
- the local declaration with the exact `arcane-os@0.3.5` registry package and
187
+ the local declaration with the exact `arcane-os@0.3.6` registry package and
188
188
  commit the regenerated lock.
189
189
 
190
190
  Generated repositories use `npm ci --ignore-scripts` in CI. Run dependency
@@ -322,7 +322,7 @@ package installation, or assertions.
322
322
 
323
323
  ## Current target support
324
324
 
325
- Version `0.3.5` exposes one browser target and five explicitly paired
325
+ Version `0.3.6` exposes one browser target and five explicitly paired
326
326
  native development targets: a non-runnable portable directory, a
327
327
  Windows x64 unsigned-local-test EXE bundle, Linux x64 and Linux ARM64
328
328
  unsigned-local-test DEBs, and an Android development-signed APK. The
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arcane-os",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
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",
@@ -2044,16 +2044,6 @@
2044
2044
  return configured||role?.modelId||'the selected language model';
2045
2045
  }
2046
2046
 
2047
- function byteProgressUnit(value){
2048
- const unit=String(value??'')
2049
- .trim()
2050
- .toLowerCase()
2051
- .replace(/[\s_-]+/g,'');
2052
- return unit.includes('byte')
2053
- ||unit.includes('octet')
2054
- ||/^(?:[kmgtpe]?i?b)(?:(?:\/|per)?(?:s|sec|second))?$/u.test(unit);
2055
- }
2056
-
2057
2047
  function determinateProgress(){
2058
2048
  const total=Number(role?.progress?.total);
2059
2049
  const completed=Number(role?.progress?.completed);
@@ -2061,15 +2051,14 @@
2061
2051
  ?role.progress.unit
2062
2052
  :'items';
2063
2053
  if(
2064
- byteProgressUnit(unit)
2065
- ||!Number.isFinite(total)
2054
+ !Number.isFinite(total)
2066
2055
  ||total<=0
2067
2056
  ||!Number.isFinite(completed)
2068
2057
  ){
2069
2058
  return null;
2070
2059
  }
2071
2060
  return {
2072
- completed:Math.max(0,completed),
2061
+ completed,
2073
2062
  total,
2074
2063
  unit
2075
2064
  };
@@ -2106,7 +2095,7 @@
2106
2095
  return;
2107
2096
  }
2108
2097
  progress.max=measured.total;
2109
- progress.value=Math.min(measured.completed,measured.total);
2098
+ progress.value=measured.completed;
2110
2099
  }
2111
2100
 
2112
2101
  function render(){
@@ -2031,15 +2031,12 @@ export class AIProviderRuntime {
2031
2031
  }
2032
2032
  }
2033
2033
 
2034
- #pendingSpeechProviderHydrationMatches(role, slot, provider, routes) {
2035
- if (!provider || !slot.selection || !routes.default) {
2034
+ #pendingSpeechProviderHydrationMatches(role, slot) {
2035
+ if (!slot.selection) {
2036
2036
  return false;
2037
2037
  }
2038
2038
  const pending = slot.selection;
2039
- if (this.#providers.has(providerKey(role, pending.providerId))
2040
- || provider.id !== pending.providerId
2041
- || routes.default.providerId !== pending.providerId
2042
- || routes.default.modelId !== pending.modelId) {
2039
+ if (this.#providers.has(providerKey(role, pending.providerId))) {
2043
2040
  return false;
2044
2041
  }
2045
2042
  const currentSelections = [
@@ -2048,10 +2045,12 @@ export class AIProviderRuntime {
2048
2045
  slot.routes.localOnly
2049
2046
  ].filter(Boolean);
2050
2047
  return currentSelections.length > 0
2051
- && currentSelections.every(selection =>
2052
- selection.providerId === pending.providerId
2053
- && selection.modelId === pending.modelId
2054
- && selection.localOnly === null
2048
+ && currentSelections.every(
2049
+ function isSamePendingSpeechSelection(selection) {
2050
+ return selection.providerId === pending.providerId
2051
+ && selection.modelId === pending.modelId
2052
+ && selection.localOnly === null;
2053
+ }
2055
2054
  );
2056
2055
  }
2057
2056
 
@@ -2104,9 +2103,7 @@ export class AIProviderRuntime {
2104
2103
  || slot.selection)
2105
2104
  && !this.#pendingSpeechProviderHydrationMatches(
2106
2105
  role,
2107
- slot,
2108
- replacement.provider,
2109
- replacement.routes
2106
+ slot
2110
2107
  )) {
2111
2108
  throw speechProviderReplacementError(
2112
2109
  'ARCANE_AI_SPEECH_PROVIDER_REPLACEMENT_EXPECTED_PROVIDER_REQUIRED',
@@ -2249,9 +2246,7 @@ export class AIProviderRuntime {
2249
2246
  || slot.selection)
2250
2247
  && !this.#pendingSpeechProviderHydrationMatches(
2251
2248
  role,
2252
- slot,
2253
- replacement.providers[role],
2254
- replacement.routes[role]
2249
+ slot
2255
2250
  )) {
2256
2251
  throw speechProviderReplacementError(
2257
2252
  'ARCANE_AI_SPEECH_PROVIDER_REPLACEMENT_EXPECTED_PROVIDER_REQUIRED',
@@ -403,16 +403,6 @@ function effectiveDashboardVisibility(definitions=[],visibility={}){
403
403
  );
404
404
  }
405
405
 
406
- function byteProgressUnit(value){
407
- const unit=String(value??'')
408
- .trim()
409
- .toLowerCase()
410
- .replace(/[\s_-]+/g,'');
411
- return unit.includes('byte')
412
- ||unit.includes('octet')
413
- ||/^(?:[kmgtpe]?i?b)(?:(?:\/|per)?(?:s|sec|second))?$/u.test(unit);
414
- }
415
-
416
406
  function formatAIRuntimeProgress(progress,fallback){
417
407
  const phase=typeof progress?.phase==='string'&&progress.phase
418
408
  ?progress.phase
@@ -427,8 +417,7 @@ function formatAIRuntimeProgress(progress,fallback){
427
417
  ||!Number.isSafeInteger(total)
428
418
  ||total<=0
429
419
  ||completed>total
430
- ||!unit
431
- ||byteProgressUnit(unit)){
420
+ ||!unit){
432
421
  return phase;
433
422
  }
434
423
  return `${phase} · ${completed} of ${total} ${unit}`;