arcane-os 0.2.2 → 0.3.0

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 (117) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +8 -8
  3. package/browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json +29 -22
  4. package/browser-runtime/ai/ARCANE_AI_BROWSER_SPEECH_COMPONENTS.json +203 -0
  5. package/browser-runtime/ai/browser-kokoro-worker.mjs +11 -2
  6. package/browser-runtime/ai/browser-speech-artifacts.mjs +3230 -397
  7. package/browser-runtime/ai/browser-speech-providers.mjs +1141 -157
  8. package/browser-runtime/ai/browser-speech.mjs +2 -0
  9. package/browser-runtime/ai/browser-whisper-worker.mjs +11 -2
  10. package/browser-runtime/ai/model-controller.mjs +285 -95
  11. package/browser-runtime/ai/speech-worker-client.mjs +247 -32
  12. package/browser-runtime/ai/speech-worker-runtime.mjs +2310 -167
  13. package/browser-runtime/event-manager.mjs +1097 -1
  14. package/docs/architecture.md +2 -2
  15. package/docs/event-manager.md +155 -27
  16. package/docs/reference/README.md +27 -27
  17. package/docs/reference/ai/browser-speech-package-authority.json +835 -0
  18. package/docs/reference/ai/browser-speech.md +1162 -246
  19. package/docs/reference/ai/browser-wasm.md +18 -7
  20. package/docs/reference/availability-and-normalization.md +6 -3
  21. package/docs/reference/behavioral-testing.md +29 -6
  22. package/docs/reference/cli.md +117 -9
  23. package/docs/reference/core/arcane-ai-contracts.md +1 -1
  24. package/docs/reference/event-manager.md +577 -32
  25. package/docs/reference/inventory/package-api.json +478 -2
  26. package/docs/reference/inventory/runtime-components.json +108 -44
  27. package/docs/reference/inventory/runtime-modules.json +131 -53
  28. package/docs/reference/mail.md +316 -0
  29. package/docs/reference/protocols.md +157 -43
  30. package/docs/reference/runtime-components.md +258 -83
  31. package/docs/reference/runtime-modules.md +613 -77
  32. package/docs/reference/sdk-api.md +1014 -25
  33. package/package.json +5 -4
  34. package/runtime/ARCANE_RUNTIME_RELEASE.json +145 -140
  35. package/runtime/arcane/components/app-bar.html +34 -13
  36. package/runtime/arcane/components/assistant-panel.html +110 -57
  37. package/runtime/arcane/components/calculator.html +7 -4
  38. package/runtime/arcane/components/chart.html +58 -17
  39. package/runtime/arcane/components/chat.html +606 -136
  40. package/runtime/arcane/components/conversation-view.html +13 -6
  41. package/runtime/arcane/components/dashboard-config.html +96 -59
  42. package/runtime/arcane/components/data-maintenance.html +69 -14
  43. package/runtime/arcane/components/data-view.html +53 -7
  44. package/runtime/arcane/components/directory-picker.html +118 -32
  45. package/runtime/arcane/components/document-inspector.html +47 -10
  46. package/runtime/arcane/components/file-drop.html +81 -35
  47. package/runtime/arcane/components/file-inspector.html +72 -22
  48. package/runtime/arcane/components/file-manager.html +374 -79
  49. package/runtime/arcane/components/integration-settings.html +12 -5
  50. package/runtime/arcane/components/local-ai-status.html +48 -19
  51. package/runtime/arcane/components/markdown-document.html +161 -68
  52. package/runtime/arcane/components/markdown-editor.html +110 -33
  53. package/runtime/arcane/components/media-embed.html +8 -5
  54. package/runtime/arcane/components/modal.html +15 -5
  55. package/runtime/arcane/components/output-panel.html +28 -23
  56. package/runtime/arcane/components/preferences-form.html +22 -4
  57. package/runtime/arcane/components/record-timeline.html +18 -2
  58. package/runtime/arcane/components/relationship-board.html +23 -3
  59. package/runtime/arcane/components/screen-capture.html +10 -4
  60. package/runtime/arcane/components/source-code-viewer.html +76 -9
  61. package/runtime/arcane/components/source-explanation.html +23 -3
  62. package/runtime/arcane/components/speech.html +462 -384
  63. package/runtime/arcane/components/summary-strip.html +22 -11
  64. package/runtime/arcane/components/table.html +39 -21
  65. package/runtime/arcane/components/task-progress.html +79 -21
  66. package/runtime/arcane/components/terminal-workspace.html +7 -4
  67. package/runtime/arcane/components/theme-editor.html +7 -3
  68. package/runtime/arcane/components/unified-inbox.html +9 -4
  69. package/runtime/arcane/components/voice-transcription.html +639 -98
  70. package/runtime/arcane/components/weather-widget.html +5 -3
  71. package/runtime/arcane/components/web-navigator.html +48 -8
  72. package/runtime/arcane/entities/Chat.js +1 -1
  73. package/runtime/arcane/entities/User.js +110 -23
  74. package/runtime/arcane/modules/AI.js +2109 -130
  75. package/runtime/arcane/modules/AIProviderRuntime.js +720 -13
  76. package/runtime/arcane/modules/AIRuntimeState.js +109 -52
  77. package/runtime/arcane/modules/ApiModelDatabase.js +390 -17
  78. package/runtime/arcane/modules/BrowserTestSuite.js +205 -28
  79. package/runtime/arcane/modules/CalculatorEngine.js +63 -3
  80. package/runtime/arcane/modules/CommunicationAppController.js +588 -28
  81. package/runtime/arcane/modules/CommunicationHub.js +590 -10
  82. package/runtime/arcane/modules/ComponentContracts.js +470 -0
  83. package/runtime/arcane/modules/ConversationTimebox.js +152 -33
  84. package/runtime/arcane/modules/DBLS.js +40 -7
  85. package/runtime/arcane/modules/DBOPFS.js +35 -11
  86. package/runtime/arcane/modules/DataMaintenance.js +12 -2
  87. package/runtime/arcane/modules/Errors.js +65 -7
  88. package/runtime/arcane/modules/HTMLImport.js +198 -14
  89. package/runtime/arcane/modules/LocalAIReadinessController.js +208 -29
  90. package/runtime/arcane/modules/Mail.js +738 -115
  91. package/runtime/arcane/modules/MailOutbox.mjs +1395 -0
  92. package/runtime/arcane/modules/MailTransport.mjs +197 -39
  93. package/runtime/arcane/modules/Ollama.js +36 -1
  94. package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +583 -7
  95. package/runtime/arcane/modules/PreferenceStore.js +367 -33
  96. package/runtime/arcane/modules/RecordReviewStore.js +322 -23
  97. package/runtime/arcane/modules/ScreenCapture.js +1397 -15
  98. package/runtime/arcane/modules/SpeechPlayback.js +438 -41
  99. package/runtime/arcane/modules/TerminalClient.js +277 -12
  100. package/runtime/arcane/modules/ThemeBootstrap.js +80 -6
  101. package/runtime/arcane/modules/ThemeManager.js +39 -7
  102. package/runtime/arcane/modules/TimeGuard.js +131 -20
  103. package/runtime/arcane/modules/WaitForComponent.js +386 -33
  104. package/schemas/arcane-lock.schema.json +2 -2
  105. package/src/cli/main.mjs +435 -9
  106. package/src/event-manager.mjs +1097 -1
  107. package/src/import-map.mjs +21 -3
  108. package/src/index.mjs +13 -0
  109. package/src/installed-sdk-runtime.mjs +112 -0
  110. package/src/mail-api.mjs +22 -0
  111. package/src/mail-credentials.mjs +667 -0
  112. package/src/mail-server.mjs +1769 -0
  113. package/src/mail.mjs +261 -0
  114. package/src/sdk-browser-runtime.mjs +85 -41
  115. package/src/testing-loader.mjs +7 -0
  116. package/src/toolchain.mjs +3 -0
  117. package/src/workspace.mjs +1 -1
@@ -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.3.0` 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.3.0` 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
@@ -1,46 +1,176 @@
1
- # Central event instrumentation and time-travel review
1
+ # Canonical SDK events and time-travel review
2
2
 
3
- `EventManager` is the preferred event instrumentation surface for new Arcane
4
- SDK code. It composes `event-pubsub` for synchronous delivery and adds Arcane's
5
- optional diagnostic record around that bus. Existing SDK operation queues mirror
6
- their normalized events through the shared `arcaneEvents` manager exactly once
7
- without replacing their awaited callback, backpressure, cancellation, or failure
8
- semantics.
3
+ `arcaneEvents` is the canonical synchronous SDK event authority. The module
4
+ installs or reuses exactly one branded authority at `globalThis.arcaneEvents` in
5
+ each JavaScript realm, even when the same source is loaded through duplicate
6
+ module URLs. It is not a cross-frame, worker, process, native-host, or cloud bus.
7
+
8
+ `EventManager` remains the isolated diagnostics API. `new EventManager()` and
9
+ `createEventManager()` each create an independent `event-pubsub` bus whose
10
+ `on()`, `emit()`, and `instrument()` handlers are strict: a synchronous listener
11
+ failure propagates to that publisher. Use `arcaneEvents.subscribe()` and
12
+ `createArcaneEventSource()` for canonical SDK semantic events instead.
13
+
14
+ The installed global is an own, non-enumerable, non-writable, non-configurable
15
+ data property. Its authority brand is
16
+ `Symbol.for('arcane-os.arcane-events-authority')`, and both the brand value and
17
+ public `protocol` are exactly `arcane-event-authority/1`. A later import reuses
18
+ the object only when its property, brand, protocol, and required callable API
19
+ descriptors are compatible. An inherited value, accessor, unbranded value,
20
+ mutable descriptor, incompatible protocol, incomplete API, or failed install is
21
+ rejected; the SDK never replaces or wraps a competing global.
9
22
 
10
23
  Import the dedicated host-neutral entry point:
11
24
 
12
25
  ```javascript
13
26
  import {
14
27
  arcaneEvents,
28
+ createArcaneEventSource,
15
29
  createEventManager,
30
+ projectArcaneDOMEvent,
16
31
  PLAYBACK_RECORD_EVENT
17
32
  } from 'arcane-os/event-manager';
18
33
  ```
19
34
 
20
- Prefer one manager for an application or process boundary. Publish semantic
21
- events through `instrument()` when source and correlation metadata are known:
35
+ An SDK publisher owns one source handle for its lifetime and declares every
36
+ semantic event type up front:
22
37
 
23
38
  ```javascript
24
- arcaneEvents.on('document.save.completed',event=>{
25
- console.info('Saved',event.documentId);
39
+ const controller={};
40
+ const events=createArcaneEventSource(controller,{
41
+ source:'app.editor',
42
+ eventTypes:['document.save.completed']
26
43
  });
27
44
 
28
- arcaneEvents.instrument(
45
+ const unsubscribe=arcaneEvents.subscribe('document.save.completed',occurrence=>{
46
+ console.info('Saved',occurrence.detail.documentId);
47
+ });
48
+
49
+ const publication=events.dispatch(
29
50
  'document.save.completed',
30
- {documentId:'example'},
51
+ Object.freeze({documentId:'example',document:liveDocument}),
31
52
  {
32
- source:'app:example',
33
- category:'operation',
34
- correlationId:'save-42'
53
+ operationId:'save-42',
54
+ publicDetail:{documentId:'example'},
55
+ cancelable:false
35
56
  }
36
57
  );
58
+
59
+ projectArcaneDOMEvent(editorElement,publication.occurrence);
60
+ unsubscribe();
61
+ ```
62
+
63
+ `createArcaneEventSource(owner,options)` is the public wrapper for
64
+ `arcaneEvents.createSource(owner,options)`. `options` is the closed record
65
+ `{source,eventTypes,onListenerError?}`. Each non-null object or function owner
66
+ may have one active source, and the returned frozen handle exposes
67
+ `{protocol,descriptor,source,instanceId,eventTypes,disposed,subscribe,on,once,
68
+ addEventListener,removeEventListener,dispatch,dispatchEvent,dispose,destroy}`.
69
+
70
+ `dispatch()` synchronously delivers one immutable `arcane-event-occurrence/1`
71
+ to exact-type canonical subscribers, then an EventTarget-compatible view to the
72
+ source's own listeners. The occurrence contains `occurrenceId`, `type`, `source`,
73
+ `instanceId`, `operationId`, deeply frozen privacy-admitted `detail`,
74
+ `cancelable`, live `defaultPrevented`, and `preventDefault()`. The richer
75
+ compatibility detail remains local to the authority for source listeners and
76
+ optional DOM projection; it is not placed on the canonical bus or in time-travel
77
+ history.
78
+
79
+ Source listeners retain EventTarget compatibility: function listeners receive
80
+ the source owner as `this`, and the frozen compatibility view exposes that owner
81
+ as both `target` and `currentTarget`. Already-frozen compatibility detail retains
82
+ its identity. Other plain records and arrays are shallow-copied and frozen;
83
+ rich host objects remain local and are not recursively frozen.
84
+ EventTarget-shaped `addEventListener()` and `removeEventListener()` preserve
85
+ native no-op admission for null or non-listener callbacks; strict `subscribe()`
86
+ and `on()` still reject an invalid handler.
87
+
88
+ Canonical delivery is observational. Every active listener runs in registration
89
+ order. A listener failure publishes one privacy-safe
90
+ `arcane.event.listener.error` occurrence and is reported through `reportError`
91
+ or `console.error`; it does not undo committed domain work or make
92
+ `dispatch()` throw. An optional source `onListenerError(error,errorOccurrence)`
93
+ callback receives the raw failure and its canonical listener-error occurrence
94
+ only at that owner-local boundary; `errorOccurrence` is `null` only when the
95
+ secondary error occurrence itself could not be constructed. Subscriber
96
+ promises are not awaited, so keep completion, backpressure, and asynchronous
97
+ failure in the SDK-owned queue or operation that owns them. There is no second
98
+ Promise-returning publication bus: `dispatch()`, cancellation admission, sticky
99
+ state commits, and listener installation remain synchronous. Owned promises and
100
+ `createEventQueue()` own asynchronous work, ordering, failure, and backpressure;
101
+ an `AbortSignal` removes a subscription but does not claim that already-started
102
+ provider, host, or queue work stopped.
103
+
104
+ `arcaneEvents.subscribe(type,handler,{once=false,signal}={})` returns an
105
+ idempotent unsubscribe function whose `.dispose` property is the same function.
106
+ An already-aborted signal installs nothing, and abort removes the registration
107
+ deterministically. Source `on()` follows the same lifecycle. EventTarget-shaped
108
+ `addEventListener()`/`removeEventListener()` calls deduplicate by
109
+ type/listener/capture. Calling a source's idempotent `dispose()` emits its final
110
+ `arcane.event.source.disposed` occurrence, removes its registrations, and frees
111
+ the owner to register a later source.
112
+
113
+ Cancellation is synchronous and observational. For a cancelable occurrence,
114
+ canonical or source listeners may call `preventDefault()`; `dispatch()` then
115
+ returns `{occurrence,accepted:false}`. Callers decide whether cancellation gates
116
+ their domain operation. `projectArcaneDOMEvent()` is a one-way compatibility
117
+ projection: it creates one `CustomEvent`, adds the canonical identifiers to a
118
+ frozen outer detail object, preserves any compatibility `source` value, exposes
119
+ the canonical emitter as `arcaneSource`, propagates DOM cancellation back to the
120
+ occurrence, and never republishes the DOM event into the authority. It returns `false`
121
+ without dispatching when the occurrence is already canceled.
122
+
123
+ The authority also retains `on`, `once`, `off`, `reset`, `emit`, `instrument`,
124
+ and `forward` for legacy direct EventManager-style diagnostics. Those handlers
125
+ are separate from canonical `subscribe()` registrations; `off()` and `reset()`
126
+ cannot remove canonical or source-owned registrations. New SDK publishers must
127
+ use source handles. Authority-level `dispatchEvent()` exists only as a deprecated
128
+ EventTarget admission adapter for older `aiRuntimeEvents` callers.
129
+
130
+ `aiRuntimeEvents` is itself deprecated. It is a frozen, state-free
131
+ EventTarget-compatible view over the `AIRuntimeState` source registered with
132
+ this authority; it has no listener registry, `EventTarget`, or lifecycle state
133
+ of its own. New consumers use the focused AIRuntimeState subscription helpers
134
+ or `arcaneEvents.subscribe()`.
135
+
136
+ ## Stable authority failures
137
+
138
+ `ARCANE_EVENT_ERROR_CODES` is frozen and maps every key below to the identical
139
+ string value. Thrown authority errors expose that value as `error.code`:
140
+
141
+ ```text
142
+ ARCANE_EVENT_AUTHORITY_ACCESSOR_COLLISION
143
+ ARCANE_EVENT_AUTHORITY_VALUE_COLLISION
144
+ ARCANE_EVENT_AUTHORITY_DESCRIPTOR_MISMATCH
145
+ ARCANE_EVENT_AUTHORITY_PROTOCOL_MISMATCH
146
+ ARCANE_EVENT_AUTHORITY_API_MISMATCH
147
+ ARCANE_EVENT_AUTHORITY_INSTALL_FAILED
148
+ ARCANE_EVENT_SOURCE_INVALID
149
+ ARCANE_EVENT_SOURCE_ALREADY_REGISTERED
150
+ ARCANE_EVENT_SOURCE_DISPOSED
151
+ ARCANE_EVENT_SOURCE_EVENT_TYPE_UNDECLARED
152
+ ARCANE_EVENT_COMPATIBILITY_DETAIL_INVALID
153
+ ARCANE_EVENT_OCCURRENCE_INVALID
154
+ ARCANE_EVENT_OCCURRENCE_SEQUENCE_EXHAUSTED
155
+ ARCANE_EVENT_SOURCE_SEQUENCE_EXHAUSTED
156
+ ARCANE_EVENT_LISTENER_CALLBACK_FAILED
157
+ ARCANE_EVENT_DOM_DETAIL_COLLISION
158
+ ARCANE_EVENT_DOM_TARGET_INVALID
159
+ ARCANE_EVENT_DOM_OPTIONS_INVALID
160
+ ARCANE_EVENT_SUBSCRIPTION_TYPE_INVALID
161
+ ARCANE_EVENT_SUBSCRIPTION_HANDLER_INVALID
162
+ ARCANE_EVENT_SUBSCRIPTION_OPTIONS_INVALID
163
+ ARCANE_EVENT_SUBSCRIPTION_SIGNAL_INVALID
164
+ ARCANE_EVENT_DISPATCH_EVENT_INVALID
37
165
  ```
38
166
 
39
- `on`, `once`, `off`, `emit`, `reset`, and `list` retain the synchronous
40
- `event-pubsub` contract. Synchronous subscriber exceptions propagate to the
41
- publisher. Subscriber promises are not awaited, so use the SDK's owned event
42
- queues for work whose completion, failure, or cancellation depends on an
43
- asynchronous callback.
167
+ Listener callback failure is observational: it appears as
168
+ `ARCANE_EVENT_LISTENER_CALLBACK_FAILED` inside the frozen
169
+ `arcane.event.listener.error` occurrence. Its frozen public detail is
170
+ `{code:'ARCANE_EVENT_LISTENER_CALLBACK_FAILED',reason:'listener-threw',
171
+ eventType,occurrenceId,source,instanceId,operationId}`. Source disposal publishes
172
+ `arcane.event.source.disposed` with public detail
173
+ `{reason:'source-disposed'}` rather than throwing from committed source dispatch.
44
174
 
45
175
  ## Enable a bounded, complete event stack
46
176
 
@@ -71,7 +201,7 @@ arcaneEvents.disableTimeTravel();
71
201
  const serialized=arcaneEvents.exportStack();
72
202
  ```
73
203
 
74
- While enabled, every manager event receives an immutable
204
+ While enabled, every isolated-manager event receives an immutable
75
205
  `arcane-event-stack/1` record containing the session and event ids, sequence,
76
206
  UTC and monotonic timestamps, source/category, correlation and causation ids,
77
207
  nested dispatch depth, a bounded payload snapshot, completion or failure
@@ -159,8 +289,6 @@ The npm artifact bundles the exact `event-pubsub` and `strong-type` pair because
159
289
  use must preserve that physical sibling layout and provide import-map entries
160
290
  for the public SDK entry and `event-pubsub`.
161
291
 
162
- The current `0.1.0-dev.5` hash-pinned Arcane browser runtime does not yet
163
- bootstrap or package this SDK-authored module. Built-in Shell, Provisioner, and
164
- native Arcane application instrumentation therefore belongs in the downstream
165
- Arcane OS integration work; this SDK release does not claim automatic coverage
166
- inside those surfaces.
292
+ The managed Arcane browser runtime ships the authenticated focused entry and its
293
+ dependency closure. Its import map resolves `arcane-os/event-manager` exactly;
294
+ query, fragment, and subpath variants are not alternate authority identities.
@@ -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.3.0` | The Node.js toolchain plus the browser-only `arcane-os/ai/browser-wasm`, `arcane-os/ai/browser-speech`, and portable `arcane-os/mail` entrypoints in this checkout. |
43
+ | Browser runtime | `runtime/ARCANE_RUNTIME_RELEASE.json`, SDK `0.3.0`, protocol `arcane/1` | The SDK-canonical dynamic runtime inventory shipped under `runtime/`; the receipt binds its exact paths, bytes, inventory, and digest. |
44
+ | Browser SDK runtime | `browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json`, SDK `0.3.0` | The dynamically derived browser closure for events, Wllama, and Browser Speech mechanisms. It contains no speech runtime, model, voice, third-party legal/notice, or corresponding-source payloads. |
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.3
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 most recently verified published package before this 0.3.0 source candidate
64
+ is exactly `arcane-os@0.2.3` from source commit
65
+ `d717f21d45664d20e4ed6377596db87c47492e11`. The npm `latest` dist-tag resolves
66
+ to `0.2.3`; the separate `dev` dist-tag remains `0.1.0-dev.5`.
66
67
 
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.
68
+ The singleton-event, Mail, warn-first Browser Speech, and mixed-route contracts
69
+ documented below are newer canonical source. They are not package authority in
70
+ `0.2.3`; consumers require the numeric 0.3.0 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-TZewkGM7dh9PdVnOtnkBO7QalJ6qyWWdKruCmsTxoHyeoG5XpqVbkNgiJhtBLhrIzgUV3vydYplxZQkIbIWoHg==` |
75
+ | npm shasum | `8e978a23289a41db130253e6475a0c8bb0c0d73f` |
76
+ | Immutable release tarball | `arcane-os-0.2.3.tgz`; 6,999,078 bytes; SHA-256 `857f179c2f9d4549e7691b4e6cebc49e5ab5e18600816443b26319c61fc1f85d` |
77
+ | GitHub release | [`0.2.3`](https://github.com/TheWizardNexus/arcane-os-sdk/releases/tag/0.2.3) (tag and title are both exactly `0.2.3`) |
78
+ | Hosted source/artifact gate | [Check run 33052271534](https://github.com/TheWizardNexus/arcane-os-sdk/actions/runs/33052271534) |
79
+ | Trusted publication | [Run 33052383457](https://github.com/TheWizardNexus/arcane-os-sdk/actions/runs/33052383457) |
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
@@ -103,10 +102,10 @@ Public reference entries follow the established Arcane documentation model:
103
102
 
104
103
  ## Public runtime inventory
105
104
 
106
- The package exposes 169 semantic JavaScript records across 13 JavaScript
105
+ The package exposes 200 semantic JavaScript records across 14 JavaScript
107
106
  entrypoints, plus eight JSON Schemas, its exact runtime manifest, and package
108
107
  metadata. Ten entrypoints are Node.js control-plane surfaces,
109
- `arcane-os/event-manager` runs in Node and browsers, and
108
+ `arcane-os/event-manager` and `arcane-os/mail` run in Node and browsers, and
110
109
  `arcane-os/ai/browser-wasm` plus `arcane-os/ai/browser-speech` are browser-only.
111
110
  The [machine-readable package
112
111
  inventory](inventory/package-api.json) and [SDK member reference](sdk-api.md)
@@ -117,7 +116,7 @@ download, install, or self-update.
117
116
 
118
117
  The synchronized browser payload exposes:
119
118
 
120
- - 83 JavaScript module artifacts under `runtime/arcane/modules/`, including
119
+ - 84 JavaScript module artifacts under `runtime/arcane/modules/`, including
121
120
  ESM modules, classic vendor globals, one worker protocol, and one Node-oriented
122
121
  mail transport;
123
122
  - 15 shared entity modules under `runtime/arcane/entities/`;
@@ -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