arcane-os 0.2.2 → 0.2.3

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,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.3
4
+
5
+ - Made shared voice transcription consume authoritative sticky STT state,
6
+ expose explicit selected-unloaded activation, and keep recording disabled
7
+ until the selected route is genuinely ready and non-busy.
8
+ - Added owned cancellation and current-operation guards across microphone
9
+ permission, recording, transcription, save, completion, transcript
10
+ replacement, synchronous public events, teardown, and stale settlement.
11
+ - Centralized the shared STT activation control in
12
+ `createSTTActivationController()` without automatic downloads, hidden
13
+ provider selection, or application policy.
14
+
3
15
  ## 0.2.2
4
16
 
5
17
  - Corrected latest-request-wins ownership so each newly admitted AI request
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.2.2` SDK contract. Applications pin one exact npm
22
+ This checkout defines the `0.2.3` SDK contract. Applications pin one exact npm
23
23
  version and lockfile; registry state is deliberately not baked into immutable
24
24
  application artifacts.
25
25
 
@@ -132,7 +132,7 @@ uses the same controller for automatic memory extraction.
132
132
  Create a new repository-shaped Arcane application with the exact stable SDK:
133
133
 
134
134
  ```bash
135
- npx arcane-os@0.2.2 new my-app --path ./my-app --target portable --git
135
+ npx arcane-os@0.2.3 new my-app --path ./my-app --target portable --git
136
136
  cd my-app
137
137
  npm install
138
138
  npm run check
@@ -143,7 +143,7 @@ To enroll an existing repository, install the exact SDK and initialize only
143
143
  missing Arcane files:
144
144
 
145
145
  ```bash
146
- npm install --save-dev --save-exact arcane-os@0.2.2
146
+ npm install --save-dev --save-exact arcane-os@0.2.3
147
147
  npm exec -- arcane init my-app --target portable
148
148
  ```
149
149
 
@@ -159,7 +159,7 @@ npm exec -- arcane-os targets
159
159
  No global SDK install or standalone Arcane CLI is required. The application
160
160
  repository's exact npm dependency and lockfile own the CLI and toolchain version.
161
161
 
162
- Use `npx arcane-os@0.2.2` for the initial bootstrap because it names this npm
162
+ Use `npx arcane-os@0.2.3` for the initial bootstrap because it names this npm
163
163
  package explicitly; bare `npx arcane` outside an installed project could resolve
164
164
  a different package. Both installed commands invoke the same headless toolchain.
165
165
  Project-local npm scripts use the SDK pinned by that app's `package-lock.json`,
@@ -180,7 +180,7 @@ node ./bin/arcane.mjs new local-app --path ../local-app --target portable --git
180
180
 
181
181
  # From the generated app repository
182
182
  cd ../local-app
183
- npm install --save-dev --save-exact ../arcane-os-sdk/arcane-os-0.2.2.tgz
183
+ npm install --save-dev --save-exact ../arcane-os-sdk/arcane-os-0.2.3.tgz
184
184
  npm run check
185
185
  npm ci
186
186
  ```
@@ -191,7 +191,7 @@ still verifies the installed package name and exact version, the locked runtime
191
191
  identity, and the runtime bytes. Local directory `file:` dependencies are not
192
192
  accepted because npm may install them as links; use a packed `.tgz`. A GitHub
193
193
  runner also needs that tarball at the locked path. After publication, replace
194
- the local declaration with the exact `arcane-os@0.2.2` registry package and
194
+ the local declaration with the exact `arcane-os@0.2.3` registry package and
195
195
  commit the regenerated lock.
196
196
 
197
197
  Generated repositories use `npm ci --ignore-scripts` in CI. Run dependency
@@ -304,7 +304,7 @@ recorded length through a final identity check; an appended byte, concurrent
304
304
  growth, path replacement, or hard link fails closed. NFC paths use defined
305
305
  UTF-8 byte ordering, covered by one pinned golden bundle digest on every
306
306
  supported Node/runner combination. This SDK accepts only the explicitly listed
307
- `0.2.2` bundle generation; structural validity does not imply cross-SDK
307
+ `0.2.3` bundle generation; structural validity does not imply cross-SDK
308
308
  compatibility, and a release with zero payload bytes cannot be created. Portable
309
309
  path validation rejects file/directory prefix conflicts, case-colliding prefix
310
310
  spellings, and Windows device aliases including superscript COM/LPT digits.
@@ -350,7 +350,7 @@ package installation, or assertions.
350
350
 
351
351
  ## Current target support
352
352
 
353
- Version `0.2.2` exposes one browser target and five explicitly paired
353
+ Version `0.2.3` exposes one browser target and five explicitly paired
354
354
  native development targets: a verified non-runnable portable directory, a
355
355
  Windows x64 unsigned-local-test EXE bundle, Linux x64 and Linux ARM64
356
356
  unsigned-local-test DEBs, and an Android development-signed APK. The
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "builder": "arcane-sdk-browser-runtime-v1",
4
- "sdkVersion": "0.2.2",
4
+ "sdkVersion": "0.2.3",
5
5
  "source": {
6
6
  "authority": "arcane-os-sdk",
7
7
  "repository": "https://github.com/TheWizardNexus/arcane-os-sdk.git",
@@ -200,7 +200,7 @@ length with an EOF growth probe, and rechecked by handle and pathname identity.
200
200
  Every cumulative path prefix has one case-folded spelling and one file/directory
201
201
  kind; prefix topology conflicts and the complete portable Windows device-name
202
202
  set fail before creation or admission.
203
- The current SDK admits only the explicitly compatible `0.2.2` bundle
203
+ The current SDK admits only the explicitly compatible `0.2.3` bundle
204
204
  generation and rejects zero-byte payload releases.
205
205
 
206
206
  Promotion retains any prior output as an identity-bound backup until the new
@@ -320,7 +320,7 @@ through SDK-bound verified readers rather than accepting a mutable source path
320
320
  as authority. Build completion requires provider verification, and later
321
321
  verify/run calls receive the exact artifact receipt.
322
322
 
323
- The SDK `0.2.2` runtime requires Arcane `0.8.12` or newer. Compatibility
323
+ The SDK `0.2.3` runtime requires Arcane `0.8.12` or newer. Compatibility
324
324
  is contractual rather than exact-version pinning: the prepared Core must meet
325
325
  the highest minimum declared by the runtime, selected app, and bundled app
326
326
  dependencies; keep each app's Arcane protocol generation; and provide every
@@ -39,9 +39,9 @@ This repository contains explicitly versioned surfaces with different owners:
39
39
 
40
40
  | Surface | Source identity | Meaning |
41
41
  | --- | --- | --- |
42
- | SDK and CLI | `arcane-os` `0.2.1` | The Node.js toolchain plus the browser-only `arcane-os/ai/browser-wasm` and `arcane-os/ai/browser-speech` entrypoints in this checkout. |
43
- | Browser runtime | SDK source commit `36fbe1418af3d5c343d105ee7c9456360c57785d`, SDK `0.2.1`, protocol `arcane/1` | The SDK-canonical exact 160-file runtime shipped under `runtime/`; Arcane OS commit `c540014afe69f14cf5ae60493b7295f36dbcec64` is legacy projection provenance, not a second source authority. |
44
- | Browser SDK runtime | SDK source commit `36fbe1418af3d5c343d105ee7c9456360c57785d`, SDK `0.2.1` | The exact 25-file authenticated browser closure: EventManager/DOM instrumentation and pinned event dependencies, Wllama runtime assets, and SDK browser speech provider/store/Worker mechanisms. It contains no model weights or speech adapter/model bytes. |
42
+ | SDK and CLI | `arcane-os` `0.2.3` | The Node.js toolchain plus the browser-only `arcane-os/ai/browser-wasm` and `arcane-os/ai/browser-speech` entrypoints in this checkout. |
43
+ | Browser runtime | SDK source commit `f97ac4f2e7cc92a00a3a466c38a67446dd112acf`, SDK `0.2.3`, protocol `arcane/1` | The SDK-canonical exact 160-file runtime shipped under `runtime/`; Arcane OS commit `c540014afe69f14cf5ae60493b7295f36dbcec64` is legacy projection provenance, not a second source authority. |
44
+ | Browser SDK runtime | SDK source commit `f97ac4f2e7cc92a00a3a466c38a67446dd112acf`, SDK `0.2.3` | The exact 25-file authenticated browser closure: EventManager/DOM instrumentation and pinned event dependencies, Wllama runtime assets, and SDK browser speech provider/store/Worker mechanisms. It contains no model weights or speech adapter/model bytes. |
45
45
  | Core reference snapshot | Arcane OS commit `567ad110bf57a1c2d4a3daa22ae93716cc5f4d7e`, protocol `arcane/1` | The application-facing Core contract derived into `docs/reference/core/`. Canonical inventory and focused-member content was verified unchanged at Arcane OS `main` commit `13f3ce0ae34f77a3495331c8b4c30b1bb105f8ed`; SDK-local provenance, link, and package-boundary annotations are added explicitly. |
46
46
 
47
47
  The SDK runtime receipt and Core reference are distinct evidence and have
@@ -58,26 +58,25 @@ See [Core reference provenance](core/README.md) for the imported inventory and
58
58
  the exact distinction between a documentation snapshot and shipped runtime
59
59
  bytes.
60
60
 
61
- ## Published 0.2.1
61
+ ## Published 0.2.2
62
62
 
63
- The published package is exactly `arcane-os@0.2.1` from source commit
64
- `36fbe1418af3d5c343d105ee7c9456360c57785d`. The npm `latest` dist-tag resolves
65
- to `0.2.1`; the separate `dev` dist-tag remains `0.1.0-dev.5`.
63
+ The published package is exactly `arcane-os@0.2.2` from source commit
64
+ `d5326d206bf0bec6ad82d53605e666841aa79899`. The npm `latest` dist-tag resolves
65
+ to `0.2.2`; the separate `dev` dist-tag remains `0.1.0-dev.5`.
66
66
 
67
- The provider supersession, legacy speech readiness, fail-closed compatibility,
68
- explicit STT activation/cancellation, TTS lifecycle, and route-owned voice
69
- corrections documented below are newer canonical source. They are not package
70
- authority in `0.2.1`; consumers require a fresh numeric publication before
71
- relying on them.
67
+ The admission-aware `voice-transcription.html` lifecycle and shared
68
+ `createSTTActivationController()` contract documented below are newer canonical
69
+ source. They are not package authority in `0.2.2`; consumers require a fresh
70
+ numeric publication before relying on them.
72
71
 
73
72
  | Evidence | Exact value |
74
73
  | --- | --- |
75
- | npm integrity | `sha512-FJ7zCFvQVZEMLQ8kn9IqddnFkfw397S87tENfLULwt0bN5hYn22wmN2zU50BqYC4zDKI/fdf4Rcl5G6A6KwlCg==` |
76
- | npm shasum | `9b21aea206582e367b8220ad45475ce69af5365a` |
77
- | Immutable release tarball | `arcane-os-0.2.1.manifest.json`; artifact `9623565709`; 6,951,752 bytes; SHA-256 `c9ebe6d5c0f8f808707a00ca055ef1fe142a3a51715df43f7da427be31c95808` |
78
- | GitHub release | [`0.2.1`](https://github.com/TheWizardNexus/arcane-os-sdk/releases/tag/0.2.1) (tag and title are both exactly `0.2.1`) |
79
- | Hosted source/artifact gate | [Check run 33013624030](https://github.com/TheWizardNexus/arcane-os-sdk/actions/runs/33013624030) |
80
- | Trusted publication | [Run 33013804158](https://github.com/TheWizardNexus/arcane-os-sdk/actions/runs/33013804158) |
74
+ | npm integrity | `sha512-JnLzZ4+FqX9tMgRv8HMcaCPSFx3xNNRf8BF8T03fD2ymg2g8cIGZRdD/3Tbd9PLtpx1PIKCpxz6nCP6ztnu1Nw==` |
75
+ | npm shasum | `0b0d314acce48dcb5518470cd45a54221589d4d4` |
76
+ | Immutable release tarball | `arcane-os-0.2.2.manifest.json`; artifact `9631659213`; 6,993,999 bytes; SHA-256 `e0fe1a556b603f67f5e3c142be7154b433312d3c0f3b58632df2e7fc43cc0ca7` |
77
+ | GitHub release | [`0.2.2`](https://github.com/TheWizardNexus/arcane-os-sdk/releases/tag/0.2.2) (tag and title are both exactly `0.2.2`) |
78
+ | Hosted source/artifact gate | [Check run 33034955277](https://github.com/TheWizardNexus/arcane-os-sdk/actions/runs/33034955277) |
79
+ | Trusted publication | [Run 33035086265](https://github.com/TheWizardNexus/arcane-os-sdk/actions/runs/33035086265) |
81
80
 
82
81
  The npm SLSA provenance binds the published package to that exact source commit
83
82
  and `.github/workflows/publish-dev.yml`. Hashes prove byte identity or
@@ -139,7 +138,7 @@ Ollama, Wllama, Whisper, Kokoro, native, or cloud transport:
139
138
  | --- | --- | --- |
140
139
  | Select, load, unload, inspect, cancel, and use LLM/STT/TTS independently | [`AIProviderRuntime.js`](runtime-modules.md#aiproviderruntimejs) | Cross-host controller; each registered provider declares its own host requirements. |
141
140
  | Observe sticky role state and startup settlement | [`AIRuntimeState.js`](runtime-modules.md#airuntimestatejs) | Cross-host EventTarget state; observation grants no authority. |
142
- | Offer explicit selected-model start/cancel UI | [`chat.html`](runtime-components.md#chathtml) and [`speech.html`](runtime-components.md#speechhtml) | Browser/native WebView components; user activation emits a cancelable request before any LLM or STT load intent. |
141
+ | Offer explicit selected-model start/cancel UI | [`chat.html`](runtime-components.md#chathtml), [`speech.html`](runtime-components.md#speechhtml), and [`voice-transcription.html`](runtime-components.md#voice-transcriptionhtml) | Browser/native WebView components; user activation emits a cancelable request before any LLM or STT load intent, and recording stays disabled without sticky ready STT. |
143
142
  | Use Core-normalized chat | [`globalThis.Arcane.ai`](core/arcane-ai-contracts.md) | Native/Core only when separately admitted. |
144
143
  | Run a caller-selected GGUF LLM locally | [`arcane-os/ai/browser-wasm`](ai/browser-wasm.md) | Browser secure context with WebGPU/full-offload evidence, WebAssembly, and OPFS/DBOPFS. |
145
144
  | Run caller-selected Whisper/Kokoro locally | [`arcane-os/ai/browser-speech`](ai/browser-speech.md) | Browser with DBOPFS, Web Locks, Workers, and caller-supplied immutable runtime/model bytes. |
@@ -153,11 +152,12 @@ profiles, tools, business policy, and private data remain app-owned.
153
152
 
154
153
  An explicitly selected but unloaded model is not “ready.” `chat.html` keeps
155
154
  Send disabled and exposes a visible keyboard-operable LLM Start/Try again or
156
- Cancel loading control. `speech.html` keeps Hold to talk unavailable and offers
157
- the equivalent Start transcription/Try again/Cancel loading control for STT.
158
- Applications can override `requestAIActivation(intent)` or
159
- `requestSTTActivation(intent)`, or cancel the corresponding activation-request
160
- event. Imports and state observation emit no lifecycle intent, and default
155
+ Cancel loading control. `speech.html` and `voice-transcription.html` keep their
156
+ recording operations unavailable and share the equivalent Start
157
+ transcription/Try again/Cancel loading control for STT. Applications can
158
+ override `requestAIActivation(intent)` or `requestSTTActivation(intent)`, or
159
+ cancel the corresponding activation-request event. Imports and state
160
+ observation emit no lifecycle intent, and default
161
161
  `startTranscription=false` does not request an STT startup load or begin an
162
162
  automatic model download. It does not unload a role started independently.
163
163
  Compatibility availability never creates ready STT/TTS state without an
@@ -17,7 +17,7 @@ with the [normalized AI guide](../README.md#normalized-ai) and
17
17
  | --- | --- | --- |
18
18
  | Browser | Shipped | Requires DBOPFS/OPFS, Web Locks, Workers, Fetch or an injected fetch function, Blob/File, and object URLs. |
19
19
  | Native WebView | Conditional | Works only when the WebView exposes the same browser APIs and the application admits every artifact. This does not invoke Core speech. |
20
- | Node | Importable, execution unavailable | The ESM subpath is exported, but `0.2.1` publishes no Node speech storage, Worker, audio-decoder, or execution adapter. |
20
+ | Node | Importable, execution unavailable | The ESM subpath is exported, but `0.2.2` publishes no Node speech storage, Worker, audio-decoder, or execution adapter. |
21
21
  | Cloud | Not provided | A cloud speech provider can implement `arcane-ai-provider/2`, but this package never selects one. |
22
22
 
23
23
  Browser speech is independent from `arcane-os/ai/browser-wasm`: the Wllama
@@ -9,7 +9,7 @@ page is the focused local-browser path beneath the normalized AI decision
9
9
  guide.
10
10
 
11
11
  The wiring example assumes a scaffolded or materialized Arcane application
12
- with SDK `0.2.1`'s authenticated runtime tree and generated browser import map.
12
+ with SDK `0.2.2`'s authenticated runtime tree and generated browser import map.
13
13
  `arcane/DBOPFS` is a managed browser-map specifier, not an npm package export.
14
14
  See [browser runtime delivery](../protocols.md#browser-runtime-delivery) before
15
15
  using the example in a custom host or bundler.
@@ -91,7 +91,7 @@ surface does not require an Arcane Core method grant because it does not call a
91
91
  Core host. Browser Fetch, CORS, storage policy, secure-context behavior, and
92
92
  resource limits still apply.
93
93
 
94
- The shipped `0.2.1` runtime requires WebGPU and has no CPU fallback. A successful
94
+ The shipped `0.2.2` runtime requires WebGPU and has no CPU fallback. A successful
95
95
  load requests full GPU offload (`gpuLayers: 99999`) and admits actual adapter,
96
96
  full-offload, buffer, queue, and settled-fence evidence. `navigator.gpu`
97
97
  presence by itself is not readiness. The provider emits the instrumented
@@ -128,8 +128,11 @@ through an SDK-created authority and DBOPFS artifact store.
128
128
 
129
129
  The projected [`AIProviderRuntime`](runtime-modules.md#aiproviderruntimejs)
130
130
  normalizes those browser providers and can admit an externally supplied native
131
- or cloud provider/2 adapter. SDK `0.2.1` does not publish a native, Core, or
132
- cloud provider/2 adapter. The sticky
131
+ or cloud provider/2 adapter. `AI.js` also supplies compatibility adapters for
132
+ an already-selected legacy OpenAI route, Ollama route, or admitted Core speech
133
+ route. SDK `0.2.2` publishes no privileged Core implementation, credential,
134
+ model, or speech-runtime authority, and those adapters never probe, select,
135
+ download, or fall back. The sticky
133
136
  [`AIRuntimeState`](runtime-modules.md#airuntimestatejs) surface keeps
134
137
  application UI independent of transport. A selected route remains explicit:
135
138
  browser failure is not permission to invoke Core or cloud.
@@ -37,7 +37,7 @@ release acceptance.
37
37
  | EventManager and event stacks | Live pub/sub ordering and payload identity, nested causation, immutable/redacted snapshots, strict import, bounded overflow, seek, all playback modes/lifecycle outcomes, cancellation, and DOM start/stop/privacy behavior. | Real user journeys and browser layout belong in a browser harness; event-stack review never proves that external side effects can be replayed. |
38
38
  | CLI | Commands parse, acknowledge, select one scope, produce normalized human/JSON/NDJSON output, propagate cancellation/failure, and reject invalid cardinality. | Native build/run requires the selected real provider and host. |
39
39
  | Browser runtime modules | Every shipped ESM module parses and its export inventory matches the catalog; pure helpers run focused success/error cases. | DOM, OPFS, media, and Web Component journeys use a browser harness. |
40
- | Provider-neutral AI runtime and chat/speech activation | Provider/2 registration, closed three-role configuration, opt-in STT startup, legacy Cloud/Core speech readiness, independent LLM/STT/TTS load/unload/status, latest-request-wins settlement, owned STT signals, TTS mute lifecycle, route-owned voice defaults, sticky-state-only speech readiness, selected-unloaded activation request/cancellation/error events, stale-callback suppression, and absence of silent provider fallback are exercised against bounded providers and host callbacks. | Real model/runtime admission remains the selected provider's evidence boundary; provider-promise settlement, state, an abort signal, or an activation event does not by itself prove underlying provider work stopped or native, cloud, or browser-model availability. |
40
+ | Provider-neutral AI runtime and chat/speech activation | Provider/2 registration, closed three-role configuration, opt-in STT startup, legacy Cloud/Core speech readiness, independent LLM/STT/TTS load/unload/status, latest-request-wins settlement, owned STT signals, TTS mute lifecycle, route-owned voice defaults, sticky-state-only readiness for both speech components, shared selected-unloaded activation request/cancellation/error behavior, fail-closed programmatic voice recording, public transcript-replacement supersession of late transcribe/save/complete settlement, `AI.fetchSTT` callback-position compatibility, stale-callback suppression, and absence of silent provider fallback are exercised against bounded providers and host callbacks. | Real model/runtime admission remains the selected provider's evidence boundary; provider-promise settlement, state, an abort signal, or an activation event does not by itself prove underlying provider work stopped or native, cloud, or browser-model availability. |
41
41
  | Browser-WASM local AI | The exact exported namespace, canonical ordered `{id, files:[{name?,url,bytes?,sha256?},...]}` descriptor plus its one-file compatibility input, fieldwise app/provider/load security precedence, default-unchecked and secure-check paths, observed-byte persistence, honest capability/status reasons, provider/facade lifecycle, lazy/manual policy, successful Wllama-load requirement, abort normalization, and structural-only tool behavior run with bounded deterministic providers. | The publication gate installs the packed SDK into a real Chrome app, loads the authenticated Wllama 3.6.0 JS/WASM assets, configures `secure:true`, performs a cold exact-length/SHA-256 model install, real inference, in-flight cancellation, unload, and a verified offline reload with zero model requests. It is an explicit heavyweight capability gate, not an implicit model download in every local `npm run check`. |
42
42
  | Browser speech | Caller-owned Whisper/Kokoro authority, closed runtime graph, app/provider/load security precedence, manifest-last DBOPFS cache, strict offline admission, independent Worker lifecycle, pre-Worker versus in-Worker cancellation, Blob/File STT conversion, WAV TTS conversion, and no cloud fallback are exercised with bounded synthetic artifacts and adapters. | A real runtime/model/voice download and actual transcription or synthesis require the application's admitted immutable artifacts, licenses, browser media support, and explicit user action. |
43
43
  | Persistent chat and document context | Atomic in-memory/history commit, explicit per-turn persistence, single structural tool-call sequencing, bounded bootstrap/search/context, caller-source `evaluate()` budgets, cancellation, and reject versus `preserve-readable` partial coverage are exercised with app-scoped adapters. | Live Core/provider inference and durable browser storage remain separate authorities; tests never treat a fake chat function or in-memory adapter as host/storage proof. |
@@ -185,7 +185,7 @@ identical executable alias.
185
185
  The generated artifact is
186
186
  `apps/<id>/modules/arcane.importmap.json`. Its exact JSON is also installed in
187
187
  the app entry as `<script type="importmap" data-arcane-import-map>` before
188
- module loading. In SDK `0.2.1`, the complete authenticated physical-v1 runtime
188
+ module loading. In SDK `0.2.2`, the complete authenticated physical-v1 runtime
189
189
  produces 91 entries and intentionally has no package-root mapping. That count
190
190
  describes the shipped SDK closure; the command receipt remains authoritative
191
191
  for the exact map written to the selected application.
@@ -573,8 +573,8 @@ Success returns:
573
573
  ```javascript
574
574
  {
575
575
  packageName:'arcane-os',
576
- currentVersion:'0.2.0',
577
- registryVersion:'0.2.1',
576
+ currentVersion:'0.2.1',
577
+ registryVersion:'0.2.2',
578
578
  tag:'latest',
579
579
  status:'update-available', // or 'current' or 'ahead'
580
580
  updateAvailable:true,
@@ -9,7 +9,7 @@ They are not TypeScript declarations.
9
9
 
10
10
  ## Portable SDK AI and Core AI
11
11
 
12
- The SDK `0.2.1` has two related but separate normalized boundaries:
12
+ The SDK `0.2.2` has two related but separate normalized boundaries:
13
13
 
14
14
  | Boundary | Use | Host |
15
15
  |---|---|---|
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "sdkVersion": "0.2.1",
3
+ "sdkVersion": "0.2.3",
4
4
  "environment": {
5
5
  "runtime": "Node.js for Node entrypoints; browser for browser-only entrypoints",
6
6
  "minimumVersion": "22.23.2 for Node entrypoints",
@@ -3,9 +3,9 @@
3
3
  "source": {
4
4
  "authority": "sdk-canonical",
5
5
  "repository": "https://github.com/TheWizardNexus/arcane-os-sdk.git",
6
- "commit": "36fbe1418af3d5c343d105ee7c9456360c57785d",
6
+ "commit": "f97ac4f2e7cc92a00a3a466c38a67446dd112acf",
7
7
  "path": "runtime/arcane/components",
8
- "sdkVersion": "0.2.1",
8
+ "sdkVersion": "0.2.3",
9
9
  "legacyProjection": {
10
10
  "repository": "https://github.com/TheWizardNexus/ARCANE-OS.git",
11
11
  "commit": "c540014afe69f14cf5ae60493b7295f36dbcec64",
@@ -689,28 +689,38 @@
689
689
  {
690
690
  "file": "runtime/arcane/components/speech.html",
691
691
  "name": "speech.html",
692
- "purpose": "Coordinates speech controls, transcription completion, mute state, and microphone availability.",
692
+ "purpose": "Coordinates explicit speech-to-text activation, request cancellation, speech controls, transcription completion, mute state, and microphone availability.",
693
693
  "methods": [
694
694
  "configure()",
695
695
  "setAvailability()",
696
- "setMuted(); availability",
696
+ "setMuted()",
697
+ "requestSTTActivation()",
698
+ "destroy()",
699
+ "availability",
697
700
  "muted",
698
701
  "initialMuted",
699
- "componentReady properties"
702
+ "componentReady"
700
703
  ],
701
704
  "events": [
702
705
  "speech-ready",
703
706
  "speech-transcription-complete",
704
- "speech-microphone-unavailable"
707
+ "speech-transcription-error",
708
+ "speech-transcription-cancelled",
709
+ "speech-microphone-unavailable",
710
+ "speech-stt-activation-request",
711
+ "speech-stt-activation-error",
712
+ "speech-tts-lifecycle-error"
705
713
  ],
706
714
  "slots": [],
707
715
  "dependencies": [
708
716
  "AI.js",
717
+ "AIRuntimeState.js",
718
+ "ComponentContracts.js",
709
719
  "DBLS.js"
710
720
  ],
711
721
  "availability": "Browser and supported native WebViews",
712
722
  "transport": "HTMLImport + DOM; injected Arcane/provider modules where listed",
713
- "normalization": "UI state normalized; AI/media behavior mixed"
723
+ "normalization": "UI/runtime state, explicit STT activation intent, and request-owned cancellation are normalized; positive compatibility booleans cannot manufacture provider readiness; provider/model authority and media behavior remain external"
714
724
  },
715
725
  {
716
726
  "file": "runtime/arcane/components/summary-strip.html",
@@ -875,9 +885,10 @@
875
885
  {
876
886
  "file": "runtime/arcane/components/voice-transcription.html",
877
887
  "name": "voice-transcription.html",
878
- "purpose": "Records segmented microphone audio, transcribes, persists, and completes a combined transcript.",
888
+ "purpose": "Records segmented microphone audio only after authoritative STT admission, exposes explicit selected-STT activation, transcribes with cancellation, persists, and completes a combined transcript.",
879
889
  "methods": [
880
890
  "configure()",
891
+ "requestSTTActivation()",
881
892
  "startRecording()",
882
893
  "stopRecording()",
883
894
  "save()",
@@ -892,17 +903,21 @@
892
903
  "voice-transcription-segment",
893
904
  "voice-transcription-change",
894
905
  "voice-transcription-complete",
895
- "speech-transcription-complete"
906
+ "speech-transcription-complete",
907
+ "speech-transcription-cancelled",
908
+ "speech-stt-activation-request",
909
+ "speech-stt-activation-error"
896
910
  ],
897
911
  "slots": [],
898
912
  "dependencies": [
899
913
  "MD.js",
900
914
  "ComponentContracts.js",
915
+ "AIRuntimeState.js",
901
916
  "AI.js"
902
917
  ],
903
918
  "availability": "Browser and supported native WebViews",
904
919
  "transport": "HTMLImport + DOM; injected Arcane/provider modules where listed",
905
- "normalization": "State/text normalized; media/provider behavior mixed"
920
+ "normalization": "Sticky runtime STT readiness, explicit activation, request cancellation, and state/text are normalized; media/provider behavior remains external"
906
921
  },
907
922
  {
908
923
  "file": "runtime/arcane/components/weather-widget.html",
@@ -3,9 +3,9 @@
3
3
  "source": {
4
4
  "authority": "sdk-canonical",
5
5
  "repository": "https://github.com/TheWizardNexus/arcane-os-sdk.git",
6
- "commit": "36fbe1418af3d5c343d105ee7c9456360c57785d",
6
+ "commit": "f97ac4f2e7cc92a00a3a466c38a67446dd112acf",
7
7
  "path": "runtime/arcane",
8
- "sdkVersion": "0.2.1",
8
+ "sdkVersion": "0.2.3",
9
9
  "legacyProjection": {
10
10
  "repository": "https://github.com/TheWizardNexus/ARCANE-OS.git",
11
11
  "commit": "c540014afe69f14cf5ae60493b7295f36dbcec64",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "artifactCount": 85,
17
17
  "javascriptArtifactCount": 83,
18
- "esmExportCount": 318,
18
+ "esmExportCount": 319,
19
19
  "artifacts": [
20
20
  {
21
21
  "file": "runtime/arcane/modules/AI.js",
@@ -407,6 +407,7 @@
407
407
  "VOICE_MESSAGES",
408
408
  "appendTranscription",
409
409
  "applyMarkdownFormat",
410
+ "createSTTActivationController",
410
411
  "effectiveDashboardVisibility",
411
412
  "normalizeChartOptions",
412
413
  "normalizeChartRows",
@@ -417,11 +418,11 @@
417
418
  "normalizeMarkdownOptions",
418
419
  "normalizeVoiceOptions"
419
420
  ],
420
- "summary": "Owns normalized configuration/value contracts shared by chart, dashboard, Markdown, and voice components.",
421
- "availability": "Cross-host",
421
+ "summary": "Owns normalized configuration/value contracts and shared explicit STT activation behavior for chart, dashboard, Markdown, and voice components.",
422
+ "availability": "Cross-host with an injected event constructor outside DOM hosts",
422
423
  "protocol": "In-process only",
423
- "normalization": "Fully normalized labels, rows, definitions, visibility, formats, editor and voice options.",
424
- "surface": "Six constant sets and twelve normalization/formatting helpers."
424
+ "normalization": "Fully normalized labels, rows, definitions, visibility, formats, editor and voice options, plus capability-neutral STT activation intent and presentation state.",
425
+ "surface": "Constant sets plus normalization, formatting, and explicit STT activation helpers."
425
426
  },
426
427
  {
427
428
  "file": "runtime/arcane/modules/ConfiguredAIChatSession.js",
@@ -104,12 +104,12 @@ import ollama from 'arcane/Ollama';
104
104
  ```
105
105
 
106
106
  The authenticated physical-v1 tree lives entirely beneath `arcane/`. SDK
107
- `0.2.1` projects it from two canonical release receipts:
107
+ `0.2.3` projects it from two canonical release receipts:
108
108
 
109
109
  | Canonical receipt | Source authority and protocol | Receipt inventory |
110
110
  | --- | --- | --- |
111
- | `runtime/ARCANE_RUNTIME_RELEASE.json` | `sdk-canonical`; `arcane/1`; builder `arcane-sdk-runtime-v1` | 160 files; 3,605,154 bytes; content SHA-256 `5b921d50b6a0cf36a13f7a7dedf96cd3a68104a322e5139136fd4197aa1ca7cb` |
112
- | `browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json` | `arcane-os-sdk`; `arcane-sdk-browser-runtime/1`; builder `arcane-sdk-browser-runtime-v1` | 25 files; 9,279,974 bytes; content SHA-256 `a9715c4b3aef70ec4042e4738089568d6588877b29582e0f758ed83897b6814f` |
111
+ | `runtime/ARCANE_RUNTIME_RELEASE.json` | `sdk-canonical`; `arcane/1`; builder `arcane-sdk-runtime-v1` | 160 files; 3,655,536 bytes; content SHA-256 `f96a27bd79a809201708f73ca729bc60ab02696daf619365f77267a28b47b4b3` |
112
+ | `browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json` | `arcane-os-sdk`; `arcane-sdk-browser-runtime/1`; builder `arcane-sdk-browser-runtime-v1` | 25 files; 9,280,047 bytes; content SHA-256 `3c82ed11b24c7b7b91b62f6dc52e0b1dcd444112a29cd48413eedc008380eb61` |
113
113
 
114
114
  The runtime receipt is the current byte authority. Its Arcane OS
115
115
  `c540014afe69f14cf5ae60493b7295f36dbcec64` / bundle `0.8.12` record is
@@ -123,7 +123,7 @@ versions from aliasing one another.
123
123
 
124
124
  Those two receipt inventories contain 185 entries in total. That sum is a
125
125
  release-inventory fact, not an import-map entry count and not an assertion about
126
- one maintained example. The `0.2.1` map deterministically roots every admitted
126
+ one maintained example. The `0.2.3` map deterministically roots every admitted
127
127
  top-level runtime ESM plus the authenticated SDK browser roots, then follows
128
128
  those roots for runtime entities and dependency compatibility. Application
129
129
  source imports do not select the 91 entries. Its public operation receipt is the
@@ -188,8 +188,8 @@ authority with exactly `dependencyName`, `packageSource`,
188
188
  `canonicalPackageRoot`, `packageName`, `packageVersion`, `runtimeRoot`,
189
189
  `browserRuntimeRoot`, `runtimeManifest`, and `browserRuntimeManifest`. A
190
190
  workspace may use the canonical dependency name or one exact npm alias such as
191
- `npm:arcane-os@0.2.1`; the physical package manifest must still identify
192
- exactly as `arcane-os@0.2.1`. Canonical-plus-alias duplicates, multiple aliases,
191
+ `npm:arcane-os@0.2.3`; the physical package manifest must still identify
192
+ exactly as `arcane-os@0.2.3`. Canonical-plus-alias duplicates, multiple aliases,
193
193
  links/junctions, indirect package roots, or version drift fail closed.
194
194
 
195
195
  The imported module can be pure browser logic, standard-Web-API logic, or a
@@ -225,19 +225,19 @@ heartbeat is event telemetry only and never regenerates browser state.
225
225
  </details>
226
226
 
227
227
  <details>
228
- <summary>SDK 0.2.1 browser-runtime admission and exact receipt fields</summary>
228
+ <summary>SDK 0.2.3 browser-runtime admission and exact receipt fields</summary>
229
229
 
230
230
  `arcane.lock.json.sdkBrowserRuntime` persists the trusted manifest path,
231
231
  `manifestSha256`, `contentSha256`, `builder`, `sdkVersion`, and `source` record.
232
- For SDK `0.2.1`, the manifest itself records:
232
+ For SDK `0.2.3`, the manifest itself records:
233
233
 
234
234
  ```text
235
235
  manifest: node_modules/arcane-os/browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json
236
236
  fileCount: 25
237
- totalBytes: 9279974
238
- contentSha256: a9715c4b3aef70ec4042e4738089568d6588877b29582e0f758ed83897b6814f
237
+ totalBytes: 9280047
238
+ contentSha256: 3c82ed11b24c7b7b91b62f6dc52e0b1dcd444112a29cd48413eedc008380eb61
239
239
  builder: arcane-sdk-browser-runtime-v1
240
- sdkVersion: 0.2.1
240
+ sdkVersion: 0.2.3
241
241
  source.protocol: arcane-sdk-browser-runtime/1
242
242
  source.browserEntry: arcane-os/event-manager
243
243
  ```
@@ -263,9 +263,8 @@ Application code should select a normalized role, not an internal protocol.
263
263
  The exported
264
264
  [`getAIProviderRuntime()` singleton](runtime-modules.md#aiproviderruntimejs)
265
265
  comes from authenticated runtime bytes and owns independent `llm`, `stt`, and
266
- `tts` selections. Published SDK `0.2.1` ships browser-WASM LLM and browser
267
- speech provider/2 adapters but predates the legacy speech correction described
268
- below. Current source also adapts selected legacy OpenAI LLM/STT/TTS,
266
+ `tts` selections. SDK `0.2.3` ships browser-WASM LLM and browser
267
+ speech provider/2 adapters and also adapts selected legacy OpenAI LLM/STT/TTS,
269
268
  Core-backed Ollama LLM, and admitted Core speech STT/TTS routes into provider/2;
270
269
  other native, Core, or cloud routes require an externally supplied compatible
271
270
  adapter. The singleton itself is not an authentication or capability token. It
@@ -301,7 +300,7 @@ compatible completed cache, otherwise it rejects with
301
300
  `ARCANE_AI_MODEL_OFFLINE_MISS`. Unload releases the active Wllama session but
302
301
  does not silently delete the app-owned cache.
303
302
 
304
- SDK `0.2.1` requires WebGPU. Load requests full offload with exactly 99,999 GPU
303
+ SDK `0.2.3` requires WebGPU. Load requests full offload with exactly 99,999 GPU
305
304
  layers and admits the model only after observing an adapter, full layer offload,
306
305
  buffer and queue work, and a settled fence. `navigator.gpu` presence alone is
307
306
  not readiness. There is no CPU fallback, partial-offload success mode, or
@@ -378,14 +377,19 @@ STT. It declines to request a startup STT load; it does not unload a role alread
378
377
  started through another explicit lifecycle action. A selected unloaded
379
378
  transcription provider remains selected and unloaded until a user lifecycle
380
379
  intent or explicit `startTranscription:true` opt-in asks the provider owner to
381
- load it. Neither state observation nor the shared speech component imports a
382
- model or selects a fallback.
383
-
384
- The shared speech component owns an `AbortController` for each STT request and
385
- passes its signal through `AI.fetchSTT()`. Cancel, superseding capture, and
386
- component teardown abort that signal and suppress late delivery. Whether the
387
- provider's underlying computation stops remains governed by its own
388
- cancellation contract. User TTS unmute calls `AI.setSpeechMuted(false)` before
380
+ load it. Neither state observation nor either shared speech component imports a
381
+ model or selects a fallback. `speech.html` and `voice-transcription.html` consume
382
+ one shared `createSTTActivationController()` contract for selected, unloaded,
383
+ loading, unloading, error, and ready presentation plus cancelable user intent.
384
+ Both keep capture fail-closed until sticky STT state is exactly ready.
385
+
386
+ Each shared speech component owns an `AbortController` for its STT request and
387
+ passes its signal through `AI.fetchSTT()`. `voice-transcription.html` also adds
388
+ that signal to the existing injected `transcribe(file,context)` callback
389
+ context. Cancel, readiness loss, superseding capture, and component teardown
390
+ abort the owned signal and suppress late delivery. Whether the provider's
391
+ underlying computation stops remains governed by its own cancellation contract.
392
+ User TTS unmute calls `AI.setSpeechMuted(false)` before
389
393
  or with its load intent so the runtime records the unmuted lifecycle preference;
390
394
  mute calls `AI.setSpeechMuted(true)`, cancels active synthesis, and unloads TTS.
391
395
  The selected TTS model catalog owns `defaultVoice`. AI.js uses a saved OpenAI