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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
@@ -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
|
-
|
|
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
|
|
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=
|
|
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
|
|
2035
|
-
if (!
|
|
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(
|
|
2052
|
-
selection
|
|
2053
|
-
|
|
2054
|
-
|
|
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}`;
|