arcane-os 0.5.10 → 0.5.12

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 (54) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +117 -26
  3. package/browser-runtime/ai/browser-speech-providers.mjs +1 -1
  4. package/docs/architecture.md +303 -0
  5. package/docs/compatibility.md +38 -0
  6. package/docs/event-manager.md +263 -0
  7. package/docs/platform-targets.md +104 -0
  8. package/docs/publishing.md +126 -0
  9. package/docs/reference/README.md +206 -0
  10. package/docs/reference/ai/browser-speech.md +879 -0
  11. package/docs/reference/ai/browser-wasm.md +637 -0
  12. package/docs/reference/ai/twin-cloud.md +156 -0
  13. package/docs/reference/arcane-ollama.md +288 -0
  14. package/docs/reference/availability-and-normalization.md +224 -0
  15. package/docs/reference/behavioral-testing.md +129 -0
  16. package/docs/reference/cli.md +820 -0
  17. package/docs/reference/core/README.md +61 -0
  18. package/docs/reference/core/arcane-ai-contracts.md +906 -0
  19. package/docs/reference/core/arcane-api.md +601 -0
  20. package/docs/reference/core/arcane-entities.md +59 -0
  21. package/docs/reference/core/arcane-events.md +134 -0
  22. package/docs/reference/core/ollama-module.md +181 -0
  23. package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +1909 -0
  24. package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +1057 -0
  25. package/docs/reference/core/reference/arcane-api/core-and-events.md +320 -0
  26. package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +610 -0
  27. package/docs/reference/core/reference/arcane-api/namespaces.md +1157 -0
  28. package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +1423 -0
  29. package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +315 -0
  30. package/docs/reference/event-manager.md +1409 -0
  31. package/docs/reference/inventory/package-api.json +3194 -0
  32. package/docs/reference/inventory/runtime-components.json +1015 -0
  33. package/docs/reference/inventory/runtime-entities.json +25 -0
  34. package/docs/reference/inventory/runtime-modules.json +1367 -0
  35. package/docs/reference/mail.md +309 -0
  36. package/docs/reference/protocols.md +749 -0
  37. package/docs/reference/runtime-components.md +1532 -0
  38. package/docs/reference/runtime-entities.md +305 -0
  39. package/docs/reference/runtime-modules.md +3310 -0
  40. package/docs/reference/sdk-api.md +6733 -0
  41. package/docs/roadmap.md +79 -0
  42. package/docs/work-amplification.md +66 -0
  43. package/examples/wasm-ai-demo/README.md +80 -0
  44. package/examples/wasm-ai-demo/app.js +787 -0
  45. package/examples/wasm-ai-demo/index.html +343 -0
  46. package/examples/wasm-ai-demo/profile-tools.js +217 -0
  47. package/examples/wasm-ai-demo/profiles/BOSS.Modelfile +106 -0
  48. package/examples/wasm-ai-demo/profiles/PreCrisis.Modelfile +693 -0
  49. package/examples/wasm-ai-demo/rag/boss-library.json +3006 -0
  50. package/examples/wasm-ai-demo/rag.js +295 -0
  51. package/examples/wasm-ai-demo/server.mjs +71 -0
  52. package/package.json +10 -1
  53. package/runtime/arcane/modules/AI.js +60 -11
  54. package/runtime/arcane/modules/AIProviderRuntime.js +26 -5
@@ -0,0 +1,1532 @@
1
+ # Arcane runtime component catalog
2
+
3
+ Arcane components are reusable HTML fragments loaded through the shared `<html-import>` element. They are browser UI, so they run in an ordinary supported browser renderer and in native Arcane WebViews. They do not run in Node or as cloud services.
4
+
5
+ A component file does not register its own custom element. The `<html-import>` host fetches the fragment from the same origin, attaches an open shadow root, runs its inline scripts with `this` bound to the host, and publishes `html-import-ready` or `html-import-error`. Component methods and properties are attached to that host.
6
+
7
+ ## Basic loading pattern
8
+
9
+ ```html
10
+ <script type="module">
11
+ import '/arcane/modules/HTMLImport.js';
12
+ </script>
13
+
14
+ <html-import id="widget" href="/arcane/components/weather-widget.html"></html-import>
15
+
16
+ <script type="module">
17
+ const widget = document.querySelector('#widget');
18
+ widget.addEventListener('html-import-ready', () => {
19
+ console.log('Component methods are attached.', typeof widget.setWeather);
20
+ }, {once: true});
21
+ </script>
22
+ ```
23
+
24
+ ## Shared semantic-event and lifecycle contract
25
+
26
+ Except for shared `header.html` and platform-owned `theme-switcher.html`,
27
+ each component owns exactly one source created through
28
+ `createArcaneEventSource(host,{source:'arcane.component.<name>',eventTypes})`.
29
+ That source publishes synchronously to the realm's branded
30
+ `globalThis.arcaneEvents` authority. Component DOM events are one-way
31
+ projections of the same canonical occurrence; they are never
32
+ republished into the authority. Every projected detail has the canonical
33
+ `occurrenceId`, `arcaneSource`, `instanceId`, and `operationId` fields in a
34
+ mutable complete record. A source payload's existing `source` field remains
35
+ source-local and may differ from `arcaneSource`; the payload may additionally
36
+ retain source-local browser or provider objects.
37
+
38
+ When a component uses a cancelable event before a requested operation, cancellation on
39
+ either the canonical occurrence or its DOM projection makes the publication
40
+ unaccepted, and the component does not continue the guarded operation. A
41
+ cancelable projected notification emitted after committed work does not
42
+ roll that work back unless its component section explicitly says otherwise.
43
+ Asynchronous work keeps its own `AbortSignal`, operation generation, and
44
+ promise ownership; canonical publication is synchronous and does not become an
45
+ async queue.
46
+
47
+ Every singleton-backed component publishes its ready event only after its host
48
+ members are installed. Its idempotent `destroy()` (unless a more specific
49
+ return is documented) disposes the canonical source and marks the host
50
+ unready. Cleanup of owned listeners, pending work, nested subscriptions, and
51
+ controllers is component-specific and is stated below where it forms part of
52
+ that component's public contract. Removing an `<html-import>` host calls an
53
+ imported component's `destroy()` through `HTMLImport`; callers that invoke
54
+ `destroy()` directly retain responsibility for removing the element when
55
+ appropriate.
56
+
57
+ ## Canonical inventory
58
+
59
+ | Component | Capability | Principal methods | Events | Normalization |
60
+ | --- | --- | --- | --- | --- |
61
+ | [`app-bar.html`](#app-barhtml) | Responsive application navigation, route state, status, and trailing actions. | `setNavigation()`<br>`setActiveRoute()`<br>`setStatus()`<br>`refresh()`<br>`destroy()` | `app-bar-ready` | DOM-normalized |
62
+ | [`assistant-panel.html`](#assistant-panelhtml) | Reusable assistant drawer, message area, composer, pending/streaming/empty/error state, and actions. | `open()`<br>`close()`<br>`toggle()`<br>`send()`<br>`clear()`<br>`setState()`<br>`focusComposer()`<br>`scrollToEnd()`<br>`destroy()` | `assistant-ready`<br>`assistant-opened`<br>`assistant-closed`<br>`assistant-send`<br>`assistant-clear` | DOM-normalized; caller/provider results remain external |
63
+ | [`calculator.html`](#calculatorhtml) | Calculator keypad and result/error event surface backed by CalculatorEngine. | `calculate()`<br>`destroy()` | `calculator-ready`<br>`calculation-complete`<br>`calculation-error` | Normalized Calculation/error events |
64
+ | [`chart.html`](#charthtml) | Accessible uPlot line, area, or point chart with normalized options and rows. | `configure()`<br>`populate()`<br>`setData()`<br>`addData()`<br>`update()`<br>`destroy()` | `chart-ready`<br>`chart-remove` | Options/rows normalized; uPlot rendering is vendor-native |
65
+ | [`chat.html`](#chathtml) | Shared chat, visible selected-model activation request, file upload, streaming, structural tool settlement, speech, language, availability, and conversation-timebox surface. | `streamMessage()`<br>`setMessageProgress()`<br>`setAIAvailability()`<br>`setInitialSpeechMuted()`<br>`setConversationComplete()`<br>`bindConversationTimebox()`<br>`bindSession()`<br>`submitMessage()`<br>`submitToolResult()`<br>`submitToolResults()`<br>`sendMessage()`<br>`languageChanged()`<br>`requestAIActivation()`<br>`destroy()` | `chat-ready`<br>`chat-session-bound`<br>`chat-session-message`<br>`chat-session-error`<br>`chat-send-message`<br>`chat-send-error`<br>`chat-file-uploaded`<br>`chat-file-upload-error`<br>`chat-language-changed`<br>`chat-language-change-error`<br>`chat-ai-activation-request`<br>`chat-ai-activation-error`<br>`chat-speech-synthesis-error`<br>`conversation-timebox-error` | UI/runtime state, explicit user activation intent, and honest structural-call settlement normalized; AI/storage/media behavior mixed |
66
+ | [`conversation-view.html`](#conversation-viewhtml) | Provider-neutral conversation display, advisory actions, composer, busy state, and status. | `setConversation()`<br>`setBusy()`<br>`setStatus()`<br>`clearComposer()`<br>`destroy()` | `conversation-view-ready`<br>`communication-send`<br>`communication-advisory-action` | DOM-normalized |
67
+ | [`dashboard-config.html`](#dashboard-confightml) | Selects which normalized chart definitions are visible on a dashboard. | `configure()`<br>`setDefinitions()`<br>`setVisibility()`<br>`getChartOptions()`<br>`getEffectiveVisibility()`<br>`open()`<br>`close()`<br>`destroy()` | `dashboard-config-ready`<br>`dashboard-config-opened`<br>`dashboard-config-closed`<br>`dashboard-config-change` | Fully normalized definitions and visibility |
68
+ | [`data-maintenance.html`](#data-maintenancehtml) | Runs destructive cleanup of empty chats and memories inside the current app data scope. | `open()`<br>`destroy()` | `data-maintenance-ready`<br>`data-maintenance-complete` | Normalized counts; DBOPFS failures mixed |
69
+ | [`data-view.html`](#data-viewhtml) | Opens a generic modal-style data view around an injected provider. | `beforeOpen()`<br>`open()`<br>`destroy()` | `data-view-ready` | DOM-native result |
70
+ | [`directory-picker.html`](#directory-pickerhtml) | Presents the provider-owned OS directory chooser with change/cancel/error states. | `configure()`<br>`focus()`<br>`select()`<br>`destroy()` | `directory-picker-ready`<br>`directory-picker-change`<br>`directory-picker-cancel`<br>`directory-picker-error` | Complete plain-text paths and native selection/error |
71
+ | [`document-inspector.html`](#document-inspectorhtml) | Inspects PDF, text, or source documents and records review state. | `loadDocument()`<br>`selectView()`<br>`markSaved()`<br>`destroy()` | `document-inspector-ready`<br>`document-review-change` | Document state normalized; browser document APIs mixed |
72
+ | [`file-drop.html`](#file-drophtml) | Acquires complete file selections by drag/drop or picker and presents busy, progress, error, and cleared state. | `configure()`<br>`openPicker()`<br>`clear()`<br>`setBusy()`<br>`setError()`<br>`setProgress()`<br>`destroy()` | `file-drop-ready`<br>`file-drop-selected`<br>`file-drop-progress`<br>`file-drop-state`<br>`file-drop-error` | Complete selections preserved; browser File/drop errors mixed |
73
+ | [`file-inspector.html`](#file-inspectorhtml) | Displays file metadata, preview, busy/error state, and caller-defined actions. | `configure()`<br>`show()`<br>`clear()`<br>`setActions()`<br>`setBusy()`<br>`setError()`<br>`setPreview()`<br>`destroy()` | `file-inspector-ready`<br>`file-inspector-action`<br>`file-inspector-change`<br>`file-inspector-cleared`<br>`file-inspector-error` | State normalized; preview/provider behavior mixed |
74
+ | [`file-manager.html`](#file-managerhtml) | Browses, filters, selects, opens, and acts on app-scoped files. | `setProvider()`<br>`loadAll()`<br>`setFilter()`<br>`select()`<br>`clearSelection()`<br>`destroy()` | `file-manager-ready`<br>`file-manager-select`<br>`file-manager-open`<br>`file-manager-action` | Selection/filter state normalized; storage/provider behavior mixed |
75
+ | [`header.html`](#headerhtml) | Shared title bar with history, reload, online marker, presentation labels, and 988 link. | None | No component-specific event | Browser/platform-native behavior; no component-ready contract |
76
+ | [`integration-settings.html`](#integration-settingshtml) | Edits non-secret communication service configuration and service actions. | `configure()`<br>`getValues()`<br>`setStatus()`<br>`destroy()` | `integration-settings-ready`<br>`integration-settings-save`<br>`integration-settings-close`<br>`integration-action` | Normalized non-secret values |
77
+ | [`local-ai-status.html`](#local-ai-statushtml) | Presents local-AI standby, failure, recovery, guidance, retry, and dismissal states. | `configure()`<br>`begin()`<br>`present()`<br>`destroy()`<br>`hidden` | `local-ai-status-ready`<br>`local-ai-status-dismissed`<br>`local-ai-retry` | Fully normalized LocalAIReadiness report |
78
+ | [`markdown-document.html`](#markdown-documenthtml) | Renders and navigates a complete Markdown document with focusable fragments. | `configure()`<br>`load()`<br>`render()`<br>`clear()`<br>`fail()`<br>`focus()`<br>`focusFragment()`<br>`destroy()` | `markdown-document-ready`<br>`markdown-document-state`<br>`markdown-document-loading`<br>`markdown-document-rendered`<br>`markdown-document-empty`<br>`markdown-document-error`<br>`markdown-document-navigate` | Complete Markdown/state normalized; malformed input and Marked/DOM failures remain visible |
79
+ | [`markdown-editor.html`](#markdown-editorhtml) | Configurable Markdown authoring, toolbar, preview, title, and save surface. | `configure()`<br>`focus()`<br>`clear()`<br>`saveEntry()`<br>`destroy()` | `markdown-editor-ready`<br>`markdown-editor-change`<br>`markdown-editor-saved` | Editor values normalized; injected save result mixed |
80
+ | [`media-embed.html`](#media-embedhtml) | Loads a parsed YouTube video or playlist embed with ordinary hosting by default, optional privacy enhancement, and an external-platform action. | `configure()`<br>`load()`<br>`destroy()` | `media-embed-ready`<br>`media-load`<br>`media-error`<br>`media-open-platform` | URL/error normalized; iframe/platform behavior native |
81
+ | [`modal.html`](#modalhtml) | Generic modal with population, open/close, actions, and sequential task execution. | `populate()`<br>`open()`<br>`close()`<br>`runTasks()`<br>`destroy()` | `modal-ready`<br>`modal-opened`<br>`modal-closed`<br>`modal-action` | Modal state normalized; injected task results mixed |
82
+ | [`output-panel.html`](#output-panelhtml) | Presents status, output, body, coverage, actions, pending, error, and cleared states. | `configure()`<br>`setOutput()`<br>`setBody()`<br>`setCoverage()`<br>`setActions()`<br>`setPending()`<br>`setStatus()`<br>`setError()`<br>`clear()`<br>`destroy()` | `output-panel-ready`<br>`output-panel-state`<br>`output-panel-change`<br>`output-panel-action`<br>`output-panel-error`<br>`output-panel-cleared` | DOM-normalized |
83
+ | [`preferences-form.html`](#preferences-formhtml) | Builds a schema-driven preferences form with submit, reset, busy, and status behavior. | `configure()`<br>`getValues()`<br>`setValues()`<br>`setBusy()`<br>`setStatus()`<br>`destroy()` | `preferences-form-ready`<br>`preferences-change`<br>`preferences-submit`<br>`preferences-reset` | Normalized form values |
84
+ | [`record-timeline.html`](#record-timelinehtml) | Displays complete chronological records/evidence and emits open actions. | `setItems()`<br>`populate()`<br>`destroy()` | `record-timeline-ready`<br>`record-timeline-open` | Complete item fields and inventories preserved |
85
+ | [`relationship-board.html`](#relationship-boardhtml) | Displays complete normalized relationship nodes/edges in graph and list forms. | `setGraph()`<br>`populate()`<br>`destroy()` | `relationship-board-ready`<br>`relationship-node-open`<br>`relationship-edge-open` | Complete graph inventories and fields preserved |
86
+ | [`screen-capture.html`](#screen-capturehtml) | Presents image, video, or GIF display-capture workflow. | `capture` (`ScreenCapture` instance)<br>`destroy()` | `screen-capture-ready`<br>`screen-capture-result` | State/result normalized; media permission/codec failures mixed |
87
+ | [`source-code-viewer.html`](#source-code-viewerhtml) | Renders complete line-addressable source code with load, error, focus, and state behavior. | `configure()`<br>`load()`<br>`render()`<br>`clear()`<br>`fail()`<br>`focus()`<br>`focusLine()`<br>`destroy()` | `source-code-viewer-ready`<br>`source-code-viewer-state`<br>`source-code-viewer-state-loading`<br>`source-code-viewer-state-ready`<br>`source-code-viewer-state-empty`<br>`source-code-viewer-state-error` | Complete mutable source/state |
88
+ | [`source-explanation.html`](#source-explanationhtml) | Presents an evidence finding, source selection, explanation, and save state. | `showFinding()`<br>`populate()`<br>`selectSource()`<br>`markSaved()`<br>`destroy()` | `source-explanation-ready`<br>`source-explanation-save`<br>`source-explanation-source-selected` | DOM-normalized |
89
+ | [`speech.html`](#speechhtml) | Coordinates explicit STT activation, speech controls, transcription completion, mute state, and microphone availability. | `configure()`<br>`setMuted()`<br>`reportTTSError()`<br>`requestSTTActivation()`<br>`destroy()`<br>`availability`<br>`muted`<br>`initialMuted`<br>`componentReady` | `speech-ready`<br>`speech-transcription-complete`<br>`speech-transcription-error`<br>`speech-transcription-cancelled`<br>`speech-microphone-unavailable`<br>`speech-stt-activation-request`<br>`speech-stt-activation-error`<br>`speech-tts-lifecycle-error`<br>`speech-synthesis-error` | Sticky runtime speech readiness, explicit STT activation, request cancellation, TTS mute lifecycle intent, and exact TTS operation failures normalized; provider/model authority remains external |
90
+ | [`summary-strip.html`](#summary-striphtml) | Displays compact selectable KPI or summary items. | `configure()`<br>`setItems()`<br>`updateItem()`<br>`clear()`<br>`destroy()` | `summary-strip-ready`<br>`summary-strip-change`<br>`summary-strip-select` | DOM-normalized |
91
+ | [`table.html`](#tablehtml) | Builds and updates a simple header/body table. | `buildHeader()`<br>`buildTable()`<br>`destroy()` | `table-ready`<br>`header-update`<br>`body-update` | DOM-normalized |
92
+ | [`task-progress.html`](#task-progresshtml) | Runs and displays a task list with started/change/complete/error state. | `configure()`<br>`setTasks()`<br>`updateTask()`<br>`runTasks()`<br>`clear()`<br>`destroy()` | `task-progress-ready`<br>`task-progress-started`<br>`task-progress-change`<br>`task-progress-complete`<br>`task-progress-error` | Task state normalized; injected task results mixed |
93
+ | [`terminal-workspace.html`](#terminal-workspacehtml) | Presents multiple terminal sessions, output, active selection, theme, and terminal actions. | `configure()`<br>`addSession()`<br>`removeSession()`<br>`activateSession()`<br>`append()`<br>`clear()`<br>`setState()`<br>`setTheme()`<br>`focus()`<br>`destroy()` | `terminal-workspace-ready`<br>`terminal-submit`<br>`terminal-interrupt`<br>`terminal-clear`<br>`terminal-session-new`<br>`terminal-session-close`<br>`terminal-session-select`<br>`terminal-settings` | UI/session state normalized; native command results supplied externally |
94
+ | [`theme-editor.html`](#theme-editorhtml) | Edits, previews, saves, and resets semantic custom theme tokens. | `configure()`<br>`getTheme()`<br>`setTheme()`<br>`setBusy()`<br>`setStatus()`<br>`destroy()` | `theme-editor-ready`<br>`theme-preview`<br>`theme-save`<br>`theme-reset` | Fully normalized Theme values |
95
+ | [`theme-switcher.html`](#theme-switcherhtml) | Selects and refreshes system, light, dark, or custom theme mode. | `setMode()`<br>`refresh()` | No component-specific event | Preference/native appearance behavior mixed; no component-ready contract |
96
+ | [`unified-inbox.html`](#unified-inboxhtml) | Displays provider-neutral communication threads with active/loading state. | `configure()`<br>`setThreads()`<br>`setActive()`<br>`setLoading()`<br>`destroy()` | `unified-inbox-ready`<br>`inbox-refresh`<br>`thread-select` | DOM-normalized |
97
+ | [`voice-transcription.html`](#voice-transcriptionhtml) | Records segmented microphone audio only after authoritative STT readiness, exposes explicit selected-STT activation, transcribes complete content with cancellation, persists, and completes a combined transcript. | `configure()`<br>`requestSTTActivation()`<br>`startRecording()`<br>`stopRecording()`<br>`save()`<br>`completeTranscription()/complete()`<br>`clear()`<br>`reset()`<br>`destroy()` | `voice-transcription-ready`<br>`voice-transcription-state`<br>`voice-transcription-segment`<br>`voice-transcription-change`<br>`voice-transcription-complete`<br>`speech-transcription-complete`<br>`speech-transcription-cancelled`<br>`speech-stt-activation-request`<br>`speech-stt-activation-error` | Sticky runtime STT readiness, explicit activation, request cancellation, and complete state/text are normalized; media/provider behavior remains external |
98
+ | [`weather-widget.html`](#weather-widgethtml) | Displays normalized current and daily weather with refresh intent. | `setWeather()`<br>`clear()`<br>`destroy()` | `weather-widget-ready`<br>`weather-refresh` | Display normalized; provider supplied externally |
99
+ | [`web-navigator.html`](#web-navigatorhtml) | Guards embedded/external navigation and surfaces allow/block/open intents. | `configure()`<br>`navigate()`<br>`currentUrl()`<br>`destroy()` | `web-navigator-ready`<br>`web-navigate`<br>`web-navigation-blocked`<br>`web-open-external` | Navigation intent/decision normalized; browser navigation result platform-native |
100
+
101
+ ## app-bar.html
102
+
103
+ ### Overview
104
+
105
+ Responsive application navigation, route state, status, and trailing actions.
106
+
107
+ ### Public surface
108
+
109
+ Methods/properties: `setNavigation()`, `setActiveRoute()`, `setStatus()`, `refresh()`, `destroy()`.
110
+
111
+ Events: `app-bar-ready`.
112
+
113
+ Slots: `brand-mark`, `product-name`, `navigation`, `status`, `trailing`.
114
+
115
+ ### Availability and normalization
116
+
117
+ **Browser and supported native WebViews.** DOM-normalized. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
118
+
119
+ ### Example
120
+
121
+ ```html
122
+ <html-import
123
+ id="app-bar.html"
124
+ href="/arcane/components/app-bar.html">
125
+ </html-import>
126
+ ```
127
+
128
+ ## assistant-panel.html
129
+
130
+ ### Overview
131
+
132
+ Reusable assistant drawer, message area, composer, pending/streaming/empty/error state, and actions.
133
+
134
+ ### Public surface
135
+
136
+ Methods/properties: `open()`, `close()`, `toggle()`, `send()`, `clear()`, `setState()`, `focusComposer()`, `scrollToEnd()`, `destroy()`.
137
+
138
+ Events: `assistant-ready`, `assistant-opened`, `assistant-closed`,
139
+ `assistant-send`, `assistant-clear`.
140
+
141
+ Slots: `title`, `subtitle`, `identity`, `messages/message`, `composer`, `actions`, `pending`, `streaming`, `empty`, `error`, `footer`.
142
+
143
+ ### Availability and normalization
144
+
145
+ **Browser and supported native WebViews.** DOM-normalized; caller/provider results remain external. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
146
+
147
+ ### Example
148
+
149
+ ```html
150
+ <html-import
151
+ id="assistant-panel.html"
152
+ href="/arcane/components/assistant-panel.html">
153
+ </html-import>
154
+ ```
155
+
156
+ ## calculator.html
157
+
158
+ ### Overview
159
+
160
+ Calculator keypad and result/error event surface backed by CalculatorEngine.
161
+
162
+ ### Public surface
163
+
164
+ Methods/properties: `calculate()`, `destroy()`.
165
+
166
+ Events: `calculator-ready`, `calculation-complete`, `calculation-error`.
167
+
168
+ Shared dependencies: [`CalculatorEngine.js`](runtime-modules.md#calculatorenginejs).
169
+
170
+ ### Availability and normalization
171
+
172
+ **Browser and supported native WebViews.** Normalized Calculation/error events. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
173
+
174
+ ### Example
175
+
176
+ ```html
177
+ <html-import
178
+ id="calculator.html"
179
+ href="/arcane/components/calculator.html">
180
+ </html-import>
181
+ ```
182
+
183
+ ## chart.html
184
+
185
+ ### Overview
186
+
187
+ Accessible uPlot line, area, or point chart with normalized options and rows.
188
+
189
+ ### Public surface
190
+
191
+ Methods/properties: `configure()`, `populate()`, `setData()`, `addData()`, `update()`, `destroy()`.
192
+
193
+ Events: `chart-ready`, `chart-remove`.
194
+
195
+ Shared dependencies: [`ChartLibrary.js`](runtime-modules.md#chartlibraryjs), [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs).
196
+
197
+ ### Availability and normalization
198
+
199
+ **Browser and supported native WebViews.** Options/rows normalized; uPlot rendering is vendor-native. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
200
+
201
+ ### Example
202
+
203
+ ```html
204
+ <html-import
205
+ id="chart.html"
206
+ href="/arcane/components/chart.html">
207
+ </html-import>
208
+ ```
209
+
210
+ ## chat.html
211
+
212
+ ### Overview
213
+
214
+ Shared chat, visible selected-model activation request, file upload, streaming,
215
+ speech, language, availability, and conversation-timebox surface.
216
+
217
+ ### Public surface
218
+
219
+ Methods/properties: `streamMessage()`, `setMessageProgress()`,
220
+ `setAIAvailability()`, `setInitialSpeechMuted()`,
221
+ `setConversationComplete()`, `bindConversationTimebox()`, `bindSession()`,
222
+ `submitMessage()`, `submitToolResult()`, `submitToolResults()`, `sendMessage()`,
223
+ `languageChanged()`, `requestAIActivation()`, `session`, `sessionStatus`,
224
+ `pendingTool`, `pendingTools`, `pendingToolCall`, `pendingToolCalls`, `modelName`,
225
+ and `destroy()`.
226
+
227
+ `sendMessage(text)` and `languageChanged(text)` are host-overridable async
228
+ extension callbacks. The component installs warning-only defaults when the host
229
+ does not supply them; applications may instead consume the corresponding
230
+ `chat-send-message` and `chat-language-changed` events.
231
+
232
+ `submitMessage(textOverride='',context={})` returns `Promise<boolean>`.
233
+ `context` accepts `source`, `preserveDraft`, `synthetic`, an optional exact
234
+ `operationId`, and an optional caller-owned `AbortSignal`. The component owns a
235
+ derived signal for each submission, supplies it in the mutable complete source
236
+ `{message,context}` detail, and aborts it on canonical/DOM cancellation,
237
+ component destruction, or caller cancellation. `chat-send-message` is
238
+ cancelable and is the gate before `sendMessage(text,context)`; a canceled event
239
+ never reaches the host callback. Rejected host promises are observed as
240
+ `chat-send-error`, and stale settlement after abort or destruction is
241
+ suppressed.
242
+
243
+ `bindSession({ai,session,sessionOptions})` accepts exactly one of a public AI API
244
+ module or an existing compatible session, restores the UI transcript when
245
+ available, and uses provider-safe history as its restoration fallback. The
246
+ transcript is a masked vertical scroll viewport; status and composer remain
247
+ outside it. Initial restoration and every user, assistant, tool, streaming,
248
+ progress, or failure mutation scrolls that viewport to its true bottom. Each
249
+ restored or new message uses a separate semantic `<time>` element at the card's
250
+ lower-right with an ISO `datetime`, full local title, and local 24-hour `HH:MM`
251
+ text.
252
+
253
+ Assistant structural calls render their nonempty `function.arguments.message`
254
+ as ordinary visible progress. The exact call name and argument string are
255
+ retained inside a collapsed `Tool call details` inspection surface. Displaying
256
+ a call does not settle it or enable another user turn.
257
+ `submitToolResults({results,request?},{operationId?,signal?})` atomically settles
258
+ the current ordered pending-call set. `results` supplies exactly one
259
+ `{toolCallId,status,message,persist?}` record for every pending ID, without
260
+ duplicates or omissions. `status` is `executed`, `declined`, `cancelled`,
261
+ or `not-executed`; every result in the batch uses the same persistence choice.
262
+ The method preserves pending order, persists and renders every human-readable
263
+ status plus complete message as matching `role:'tool'` requests, and then
264
+ renders one assistant continuation. Live submission and restored history both
265
+ require nonblank user-facing result content; accepted text is preserved exactly
266
+ rather than trimmed or rewritten.
267
+
268
+ `submitToolResult({toolCallId?,status,message,persist?,request?},{operationId?,signal?})`
269
+ is the single-call method. It infers the only pending ID when omitted
270
+ and rejects when zero or multiple calls are pending; parallel calls must use
271
+ `submitToolResults()`.
272
+ Optional plain-object `request` contains per-turn generation choices forwarded
273
+ through the session; a visibility-only host can use
274
+ `request:{toolChoice:'none'}` after a not-executed result so that continuation
275
+ cannot open another tool loop. Session-owned messages, signal, and streaming
276
+ state remain unavailable through that field. Its
277
+ terminal `chat-session-message` event releases the completed request ownership
278
+ before publication, so a listener may call `submitToolResult()` immediately
279
+ without a timer or microtask workaround. Internal protocol diagnostics remain
280
+ in the developer console; they are not inserted as assistant content, and a
281
+ rejected user draft is restored without losing its text.
282
+
283
+ Visible Chat failure copy is opt-in: only an Error deliberately marked
284
+ `userSafe:true` may provide its nonblank `userMessage` or `message`. Every
285
+ unknown provider, protocol, dispatch, persistence, or settlement failure keeps
286
+ its complete Error object in the developer console and diagnostic event while
287
+ the transcript and status use a generic user outcome. New diagnostic codes
288
+ therefore cannot become conversational text merely because they are absent
289
+ from a finite internal-error list.
290
+
291
+ `streamMessage(text,id,isThinking)` accepts text content only. An Error supplied
292
+ as a stream chunk is logged and rejected rather than stringified into the
293
+ transcript; any other nontext chunk fails with
294
+ `ARCANE_CHAT_STREAM_CONTENT_INVALID`. `setMessageProgress()` preserves explicit
295
+ string labels/status, but routes Error objects through the same user-safe copy
296
+ boundary and otherwise displays generic progress text while logging the exact
297
+ diagnostic value. Finite fractional and over-total progress remains visible in
298
+ the status text and accessibility description; only the decorative track width
299
+ is constrained to its visual range.
300
+
301
+ `pendingTools` is the mutable ordered array of actionable `{id,name,message}`
302
+ summaries and never exposes raw arguments. `pendingTool` is that single-call
303
+ summary only when exactly one call is pending. `pendingToolCalls` exposes
304
+ complete copied call envelopes for an explicitly selected inspection or host
305
+ settlement surface, while `pendingToolCall` is its single-call view.
306
+ These pending-call views exist only for the active transient protocol. Durable
307
+ history stores each tool's required user-facing message as an ordinary
308
+ `role:'tool'` record with optional public name and result status; it stores no
309
+ call envelope or ID and therefore does not recreate a pending executable call
310
+ after reload. `submitToolResult()` and `submitToolResults()` accept `status` as
311
+ the public result term; `disposition` remains an accepted input spelling.
312
+ When a submitted turn uses `persist:false`, Chat may show its cards while that
313
+ one operation is active, then removes them when the operation settles; neither
314
+ the input nor response remains in the retained transcript or model context.
315
+
316
+ For streaming sessions, every provisional structural card and the terminal
317
+ result must preserve the same choice, ordered call position, exact ID, type,
318
+ function name, argument string, and extension fields. A changed or omitted
319
+ observed call fails with
320
+ `AI_CHAT_STREAM_TOOL_CALL_MISMATCH`; the provisional card is removed and the
321
+ prior pending-call state is restored instead of leaving a ghost card or a false
322
+ settlement.
323
+
324
+ `setAIAvailability()` remains a current LLM availability input, but selected
325
+ sticky `AIRuntimeState` LLM state wins over that boolean. STT and TTS readiness always
326
+ comes from sticky runtime role state; the method never forwards standalone
327
+ speech booleans or synthesizes ready speech roles without a selected, loaded
328
+ provider.
329
+
330
+ When a selected LLM route is `unloaded` or in `error`, the component exposes a
331
+ keyboard-operable Start/Try again control while Send stays disabled. During
332
+ `loading`, the control becomes Cancel loading and reflects sticky progress
333
+ inside the same activation area. Progress is indeterminate until a real finite
334
+ positive total exists. A complete provider-reported `completed`, `total`, and
335
+ `unit` measure is informational and remains visible without gating activation.
336
+ `modelName` supplies the application-owned display label without moving model
337
+ policy into the component.
338
+ The default `requestAIActivation(intent)` forwards mutable
339
+ `{role:'llm',action:'load'|'unload',reason:'user'}` to
340
+ `requestAIRuntimeIntent()`. A host may replace that callback.
341
+
342
+ Before the callback, the component dispatches the bubbles/composed/cancelable
343
+ `chat-ai-activation-request` event with mutable complete `{intent,state}` detail.
344
+ `preventDefault()` suppresses the callback. A callback failure dispatches the
345
+ bubbles/composed, noncancelable `chat-ai-activation-error` event with mutable complete
346
+ `{request,error,message}`. A recognized canceled load whose current route is
347
+ `unloaded` or `unloading` is not reported as an activation error.
348
+
349
+ On `pagehide`, a BFCache-persisted page retains the component and its session,
350
+ speech, listeners, and provider state. A matching persisted `pageshow` refreshes
351
+ the current availability UI without rebinding or duplicating listeners.
352
+ Nonpersisted `pagehide` remains terminal and calls `destroy()`.
353
+
354
+ `destroy()` aborts the component's AI-runtime-state subscription, destroys the
355
+ activation controller, removes both page lifecycle listeners, calls the
356
+ optional speech controller's `destroy()`, sets `ready` to `false`, and returns
357
+ `true`; later calls return `false`. It does not initiate a provider load or
358
+ unload.
359
+
360
+ Chat listens for the bound (or current global) AI runtime's `ai-tts-failure`
361
+ event and forwards its complete Error and exact operation boundary to
362
+ `speech.reportTTSError()`. Playback-start or playback-resume failures can occur
363
+ after Chat's two-argument `streamTTS()` preparation promise has resolved.
364
+ SDK `0.5.12` adds a `waitForPlayback:true` mode for the
365
+ terminal result of the segments submitted by one invocation; Chat continues
366
+ to feed chunks without waiting for playback. Runtime mute, cancellation,
367
+ permission waiting, and stale generations remain non-errors.
368
+
369
+ Each visible model chunk is still forwarded to `AI.streamTTS()` in arrival
370
+ order. The AI owner preserves exact segmentation, admits completed segments to
371
+ bounded synthesis immediately, and schedules the contiguous ready audio prefix
372
+ on the audio clock. Chat neither creates a second queue nor reorders, combines,
373
+ or rewrites speech text.
374
+
375
+ Events: `chat-ready`, `chat-session-bound`, `chat-session-message`,
376
+ `chat-session-error`, `chat-send-message`, `chat-send-error`,
377
+ `chat-file-uploaded`, `chat-file-upload-error`, `chat-language-changed`,
378
+ `chat-language-change-error`, `chat-ai-activation-request`,
379
+ `chat-ai-activation-error`, `chat-speech-synthesis-error`, and
380
+ `conversation-timebox-error`.
381
+
382
+ All chat operation ids have the form
383
+ `<component-instance-id>:<kind>:<sequence>`. The stable public reasons are
384
+ `chat-ready`, `message-submission-requested`,
385
+ `message-submission-cancelled`, `caller-signal-aborted`,
386
+ `component-destroyed`, `host-message-submission-rejected`,
387
+ `file-storage-completed`, `file-storage-rejected`,
388
+ `language-change-requested`, `language-change-callback-rejected`,
389
+ `language-model-activation-requested`,
390
+ `language-model-activation-rejected`, `speech-synthesis-rejected`, and
391
+ `conversation-timebox-delivery-rejected`.
392
+
393
+ The stable chat boundary codes are:
394
+
395
+ - `ARCANE_CHAT_MESSAGE_SUBMISSION_ABORTED` for the owned submission signal;
396
+ - `ARCANE_CHAT_LANGUAGE_MODEL_ACTIVATION_REQUEST_REJECTED`;
397
+ - `ARCANE_CHAT_HOST_MESSAGE_SUBMISSION_REJECTED`;
398
+ - `ARCANE_CHAT_FILE_STORAGE_REJECTED`;
399
+ - `ARCANE_CHAT_LANGUAGE_CHANGE_CALLBACK_REJECTED`;
400
+ - `ARCANE_CHAT_SPEECH_SYNTHESIS_REQUEST_REJECTED`;
401
+ - `ARCANE_CHAT_CONVERSATION_TIMEBOX_DELIVERY_REJECTED`.
402
+
403
+ Error projections preserve the complete error detail, with the boundary `code`
404
+ and any distinct dependency `causeCode`. File projections preserve the complete
405
+ live `File` and its authored metadata. Language and LLM activation requests are
406
+ cancelable before their host callbacks. Every public detail remains mutable.
407
+
408
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs), [`File.js`](runtime-entities.md#filejs), [`ConversationTimebox.js`](runtime-modules.md#conversationtimeboxjs), [`AIRuntimeState.js`](runtime-modules.md#airuntimestatejs).
409
+
410
+ ### Availability and normalization
411
+
412
+ **Browser and supported native WebViews.** UI and provider-runtime state are
413
+ normalized; AI/storage/media behavior remains mixed. The component emits no
414
+ activation request on import or startup. After the user operates the visible
415
+ control and the component event is not canceled, it publishes a
416
+ capability-neutral user intent; a provider/runtime owner decides whether and
417
+ how to execute the requested load or unload. HTMLImport + DOM; injected
418
+ Arcane/provider modules where listed. Native methods remain subject to the
419
+ bound app's capabilities. [Deep protocol details](protocols.md).
420
+
421
+ ### Example
422
+
423
+ ```html
424
+ <html-import
425
+ id="chat.html"
426
+ href="/arcane/components/chat.html">
427
+ </html-import>
428
+ ```
429
+
430
+ ## conversation-view.html
431
+
432
+ ### Overview
433
+
434
+ Provider-neutral conversation display, advisory actions, composer, busy state, and status.
435
+
436
+ ### Public surface
437
+
438
+ Methods/properties: `setConversation()`, `setBusy()`, `setStatus()`, `clearComposer()`, `destroy()`.
439
+
440
+ Events: `conversation-view-ready`, `communication-send`, `communication-advisory-action`.
441
+
442
+ ### Availability and normalization
443
+
444
+ **Browser and supported native WebViews.** DOM-normalized. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
445
+
446
+ ### Example
447
+
448
+ ```html
449
+ <html-import
450
+ id="conversation-view.html"
451
+ href="/arcane/components/conversation-view.html">
452
+ </html-import>
453
+ ```
454
+
455
+ ## dashboard-config.html
456
+
457
+ ### Overview
458
+
459
+ Selects which normalized chart definitions are visible on a dashboard.
460
+
461
+ ### Public surface
462
+
463
+ Methods/properties: `configure()`, `setDefinitions()`, `setVisibility()`, `getChartOptions()`, `getEffectiveVisibility()`, `open()`, `close()`, `destroy()`.
464
+
465
+ Events: `dashboard-config-ready`, `dashboard-config-opened`, `dashboard-config-closed`, `dashboard-config-change`.
466
+
467
+ Shared dependencies: [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs), [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
468
+
469
+ ### Availability and normalization
470
+
471
+ **Browser and supported native WebViews.** Fully normalized definitions and visibility. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
472
+
473
+ ### Example
474
+
475
+ ```html
476
+ <html-import
477
+ id="dashboard-config.html"
478
+ href="/arcane/components/dashboard-config.html">
479
+ </html-import>
480
+ ```
481
+
482
+ ## data-maintenance.html
483
+
484
+ ### Overview
485
+
486
+ Runs destructive cleanup of empty chats and memories inside the current app data scope.
487
+
488
+ ### Public surface
489
+
490
+ Methods/properties: `open()`, `destroy()`.
491
+
492
+ Events: `data-maintenance-ready`, `data-maintenance-complete`.
493
+
494
+ Shared dependencies: [`DataMaintenance.js`](runtime-modules.md#datamaintenancejs), [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
495
+
496
+ ### Availability and normalization
497
+
498
+ **Browser and supported native WebViews.** Normalized counts; DBOPFS failures mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
499
+
500
+ ### Example
501
+
502
+ ```html
503
+ <html-import
504
+ id="data-maintenance.html"
505
+ href="/arcane/components/data-maintenance.html">
506
+ </html-import>
507
+ ```
508
+
509
+ ## data-view.html
510
+
511
+ ### Overview
512
+
513
+ Opens a generic modal-style data view around an injected provider.
514
+
515
+ ### Public surface
516
+
517
+ Methods/properties: `beforeOpen()`, `open()`, `destroy()`.
518
+
519
+ Events: `data-view-ready`.
520
+
521
+ Shared dependencies: [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
522
+
523
+ ### Availability and normalization
524
+
525
+ **Browser and supported native WebViews.** DOM-native result. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
526
+
527
+ ### Example
528
+
529
+ ```html
530
+ <html-import
531
+ id="data-view.html"
532
+ href="/arcane/components/data-view.html">
533
+ </html-import>
534
+ ```
535
+
536
+ ## directory-picker.html
537
+
538
+ ### Overview
539
+
540
+ Presents the provider-owned OS directory chooser with change/cancel/error states.
541
+
542
+ ### Public surface
543
+
544
+ Methods/properties: `configure()`, `focus()`, `select()`, `destroy()`.
545
+
546
+ Events: `directory-picker-ready`, `directory-picker-change`, `directory-picker-cancel`, `directory-picker-error`.
547
+
548
+ Shared dependencies: [`DirectoryPicker.js`](runtime-modules.md#directorypickerjs).
549
+
550
+ ### Availability and normalization
551
+
552
+ **Browser and supported native WebViews.** Complete directory paths and native
553
+ selection/error content are preserved without trimming, character caps, or a
554
+ generic control-character gate. The provider or operating system owns any
555
+ platform-specific path failure. HTMLImport + DOM; injected Arcane/provider
556
+ modules where listed. Native methods remain subject to the bound app's
557
+ capabilities. [Deep protocol details](protocols.md).
558
+
559
+ ### Example
560
+
561
+ ```html
562
+ <html-import
563
+ id="directory-picker.html"
564
+ href="/arcane/components/directory-picker.html">
565
+ </html-import>
566
+ ```
567
+
568
+ ## document-inspector.html
569
+
570
+ ### Overview
571
+
572
+ Inspects PDF, text, or source documents and records review state.
573
+
574
+ ### Public surface
575
+
576
+ Methods/properties: `loadDocument()`, `selectView()`, `markSaved()`, `destroy()`.
577
+
578
+ Events: `document-inspector-ready`, `document-review-change`.
579
+
580
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs).
581
+
582
+ ### Availability and normalization
583
+
584
+ **Browser and supported native WebViews.** Document state normalized; browser document APIs mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
585
+
586
+ ### Example
587
+
588
+ ```html
589
+ <html-import
590
+ id="document-inspector.html"
591
+ href="/arcane/components/document-inspector.html">
592
+ </html-import>
593
+ ```
594
+
595
+ ## file-drop.html
596
+
597
+ ### Overview
598
+
599
+ Acquires files by drag/drop or picker and presents busy, progress, error, and cleared state.
600
+
601
+ ### Public surface
602
+
603
+ Methods/properties: `configure()`, `openPicker()`, `clear()`, `setBusy()`, `setError()`, `setProgress()`, `destroy()`.
604
+
605
+ Events: `file-drop-ready`, `file-drop-selected`, `file-drop-progress`, `file-drop-state`, `file-drop-error`.
606
+
607
+ ### Availability and normalization
608
+
609
+ **Browser and supported native WebViews.** Complete picker, drop, and API selections are preserved; `multiple` remains a picker hint and `maxFiles` remains compatible configuration rather than a rejection or discard gate. Browser File/drop errors are mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
610
+
611
+ ### Example
612
+
613
+ ```html
614
+ <html-import
615
+ id="file-drop.html"
616
+ href="/arcane/components/file-drop.html">
617
+ </html-import>
618
+ ```
619
+
620
+ ## file-inspector.html
621
+
622
+ ### Overview
623
+
624
+ Displays file metadata, preview, busy/error state, and caller-defined actions.
625
+
626
+ ### Public surface
627
+
628
+ Methods/properties: `configure()`, `show()`, `clear()`, `setActions()`, `setBusy()`, `setError()`, `setPreview()`, `destroy()`.
629
+
630
+ Events: `file-inspector-ready`, `file-inspector-action`, `file-inspector-change`, `file-inspector-cleared`, `file-inspector-error`.
631
+
632
+ Slots: `title`, `preview`, `metadata`, `actions`.
633
+
634
+ ### Availability and normalization
635
+
636
+ **Browser and supported native WebViews.** State normalized; preview/provider behavior mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
637
+
638
+ ### Example
639
+
640
+ ```html
641
+ <html-import
642
+ id="file-inspector.html"
643
+ href="/arcane/components/file-inspector.html">
644
+ </html-import>
645
+ ```
646
+
647
+ ## file-manager.html
648
+
649
+ ### Overview
650
+
651
+ Browses, filters, selects, opens, and acts on app-scoped files.
652
+
653
+ ### Public surface
654
+
655
+ Methods/properties: `setProvider()`, `loadAll()`, `setFilter()`, `select()`, `clearSelection()`, `destroy()`.
656
+
657
+ Events: `file-manager-ready`, `file-manager-select`, `file-manager-open`, `file-manager-action`.
658
+
659
+ Shared dependencies: [`DBOPFS.js`](runtime-modules.md#dbopfsjs), [`File.js`](runtime-entities.md#filejs), [`WaitForComponent.js`](runtime-modules.md#waitforcomponentjs).
660
+
661
+ ### Availability and normalization
662
+
663
+ **Browser and supported native WebViews.** Selection/filter state normalized; storage/provider behavior mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
664
+
665
+ ### Example
666
+
667
+ ```html
668
+ <html-import
669
+ id="file-manager.html"
670
+ href="/arcane/components/file-manager.html">
671
+ </html-import>
672
+ ```
673
+
674
+ ## header.html
675
+
676
+ ### Overview
677
+
678
+ Shared title bar with history, reload, online marker, presentation labels, and 988 link.
679
+
680
+ ### Public surface
681
+
682
+ This fragment declares no public host method.
683
+
684
+ This fragment declares no component-specific readiness or action event; use the loader's `html-import-ready` only to know that import execution completed.
685
+
686
+ ### Availability and normalization
687
+
688
+ **Browser and supported native WebViews.** Browser/platform-native behavior; no component-ready contract. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
689
+
690
+ ### Example
691
+
692
+ ```html
693
+ <html-import
694
+ id="header.html"
695
+ href="/arcane/components/header.html">
696
+ </html-import>
697
+ ```
698
+
699
+ ## integration-settings.html
700
+
701
+ ### Overview
702
+
703
+ Edits non-secret communication service configuration and service actions.
704
+
705
+ ### Public surface
706
+
707
+ Methods/properties: `configure()`, `getValues()`, `setStatus()`, `destroy()`.
708
+
709
+ Events: `integration-settings-ready`, `integration-settings-save`, `integration-settings-close`, `integration-action`.
710
+
711
+ ### Availability and normalization
712
+
713
+ **Browser and supported native WebViews.** Normalized non-secret values. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
714
+
715
+ ### Example
716
+
717
+ ```html
718
+ <html-import
719
+ id="integration-settings.html"
720
+ href="/arcane/components/integration-settings.html">
721
+ </html-import>
722
+ ```
723
+
724
+ ## local-ai-status.html
725
+
726
+ ### Overview
727
+
728
+ Presents local-AI standby, failure, recovery, guidance, retry, and dismissal states.
729
+
730
+ ### Public surface
731
+
732
+ Methods/properties: `configure()`, `begin()`, `present()`, `destroy()`, and the `hidden` property.
733
+
734
+ Events: `local-ai-status-ready`, `local-ai-status-dismissed`, `local-ai-retry`.
735
+
736
+ Shared dependencies: [`LocalAIReadiness.js`](runtime-modules.md#localaireadinessjs).
737
+
738
+ ### Availability and normalization
739
+
740
+ **Browser and supported native WebViews.** Fully normalized LocalAIReadiness report. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
741
+
742
+ ### Example
743
+
744
+ ```html
745
+ <html-import
746
+ id="local-ai-status.html"
747
+ href="/arcane/components/local-ai-status.html">
748
+ </html-import>
749
+ ```
750
+
751
+ ## markdown-document.html
752
+
753
+ ### Overview
754
+
755
+ Renders and navigates a complete Markdown document with focusable fragments.
756
+
757
+ ### Public surface
758
+
759
+ Methods/properties: `configure()`, `load()`, `render()`, `clear()`, `fail()`, `focus()`, `focusFragment()`, `destroy()`.
760
+
761
+ Events: `markdown-document-ready`, `markdown-document-state`,
762
+ `markdown-document-loading`, `markdown-document-rendered`,
763
+ `markdown-document-empty`, `markdown-document-error`, and
764
+ `markdown-document-navigate`.
765
+
766
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs).
767
+
768
+ ### Availability and normalization
769
+
770
+ **Browser and supported native WebViews.** Complete Markdown and state are
771
+ normalized; malformed input and Marked/DOM failures remain visible. HTMLImport
772
+ + DOM; injected Arcane/provider modules where listed. Native methods remain
773
+ subject to the bound app's capabilities. [Deep protocol details](protocols.md).
774
+
775
+ ### Example
776
+
777
+ ```html
778
+ <html-import
779
+ id="markdown-document.html"
780
+ href="/arcane/components/markdown-document.html">
781
+ </html-import>
782
+ ```
783
+
784
+ ## markdown-editor.html
785
+
786
+ ### Overview
787
+
788
+ Configurable Markdown authoring, toolbar, preview, title, and save surface.
789
+
790
+ ### Public surface
791
+
792
+ Methods/properties: `configure()`, `focus()`, `clear()`, `saveEntry()`, `destroy()`.
793
+
794
+ Events: `markdown-editor-ready`, `markdown-editor-change`, `markdown-editor-saved`.
795
+
796
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs), [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs).
797
+
798
+ ### Availability and normalization
799
+
800
+ **Browser and supported native WebViews.** Editor values normalized; injected save result mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
801
+
802
+ ### Example
803
+
804
+ ```html
805
+ <html-import
806
+ id="markdown-editor.html"
807
+ href="/arcane/components/markdown-editor.html">
808
+ </html-import>
809
+ ```
810
+
811
+ ## media-embed.html
812
+
813
+ ### Overview
814
+
815
+ Loads a parsed YouTube video or playlist embed and exposes an external-platform
816
+ action. Ordinary YouTube hosting is the default; `configure({privacyEnhanced:true})`
817
+ explicitly selects the privacy-enhanced host.
818
+
819
+ ### Public surface
820
+
821
+ Methods/properties: `configure()`, `load()`, `destroy()`.
822
+
823
+ Events: `media-embed-ready`, `media-load`, `media-error`, `media-open-platform`.
824
+
825
+ Shared dependencies: [`YouTubeMedia.js`](runtime-modules.md#youtubemediajs).
826
+
827
+ ### Availability and normalization
828
+
829
+ **Browser and supported native WebViews.** URL/error normalized; iframe/platform behavior native. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
830
+
831
+ ### Example
832
+
833
+ ```html
834
+ <html-import
835
+ id="media-embed.html"
836
+ href="/arcane/components/media-embed.html">
837
+ </html-import>
838
+ ```
839
+
840
+ ## modal.html
841
+
842
+ ### Overview
843
+
844
+ Generic modal with population, open/close, actions, and sequential task execution.
845
+
846
+ ### Public surface
847
+
848
+ Methods/properties: `populate()`, `open()`, `close()`, `runTasks()`, `destroy()`.
849
+
850
+ Events: `modal-ready`, `modal-opened`, `modal-closed`, `modal-action`.
851
+
852
+ Slots: `header`, `body`, `footer`.
853
+
854
+ ### Availability and normalization
855
+
856
+ **Browser and supported native WebViews.** Modal state normalized; injected task results mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
857
+
858
+ ### Example
859
+
860
+ ```html
861
+ <html-import
862
+ id="modal.html"
863
+ href="/arcane/components/modal.html">
864
+ </html-import>
865
+ ```
866
+
867
+ ## output-panel.html
868
+
869
+ ### Overview
870
+
871
+ Presents status, output, body, coverage, actions, pending, error, and cleared states.
872
+
873
+ ### Public surface
874
+
875
+ Methods/properties: `configure()`, `setOutput()`, `setBody()`, `setCoverage()`, `setActions()`, `setPending()`, `setStatus()`, `setError()`, `clear()`, `destroy()`.
876
+
877
+ Events: `output-panel-ready`, `output-panel-state`, `output-panel-change`, `output-panel-action`, `output-panel-error`, `output-panel-cleared`.
878
+
879
+ Slots: `title`, `header-actions`, `body`, `coverage`, `actions`.
880
+
881
+ ### Availability and normalization
882
+
883
+ **Browser and supported native WebViews.** DOM-normalized. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
884
+
885
+ ### Example
886
+
887
+ ```html
888
+ <html-import
889
+ id="output-panel.html"
890
+ href="/arcane/components/output-panel.html">
891
+ </html-import>
892
+ ```
893
+
894
+ ## preferences-form.html
895
+
896
+ ### Overview
897
+
898
+ Builds a schema-driven preferences form with submit, reset, busy, and status behavior.
899
+
900
+ ### Public surface
901
+
902
+ Methods/properties: `configure()`, `getValues()`, `setValues()`, `setBusy()`, `setStatus()`, `destroy()`.
903
+
904
+ Events: `preferences-form-ready`, `preferences-change`, `preferences-submit`, `preferences-reset`.
905
+
906
+ ### Availability and normalization
907
+
908
+ **Browser and supported native WebViews.** Normalized form values. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
909
+
910
+ ### Example
911
+
912
+ ```html
913
+ <html-import
914
+ id="preferences-form.html"
915
+ href="/arcane/components/preferences-form.html">
916
+ </html-import>
917
+ ```
918
+
919
+ ## record-timeline.html
920
+
921
+ ### Overview
922
+
923
+ Displays chronological records/evidence and emits open actions.
924
+
925
+ ### Public surface
926
+
927
+ Methods/properties: `setItems()`, `populate()`, `destroy()`.
928
+
929
+ Events: `record-timeline-ready`, `record-timeline-open`.
930
+
931
+ ### Availability and normalization
932
+
933
+ **Browser and supported native WebViews.** Complete item inventories and fields are preserved while missing identity/date records remain non-renderable. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
934
+
935
+ ### Example
936
+
937
+ ```html
938
+ <html-import
939
+ id="record-timeline.html"
940
+ href="/arcane/components/record-timeline.html">
941
+ </html-import>
942
+ ```
943
+
944
+ ## relationship-board.html
945
+
946
+ ### Overview
947
+
948
+ Displays normalized relationship nodes/edges in graph and list forms.
949
+
950
+ ### Public surface
951
+
952
+ Methods/properties: `setGraph()`, `populate()`, `destroy()`.
953
+
954
+ Events: `relationship-board-ready`, `relationship-node-open`, `relationship-edge-open`.
955
+
956
+ ### Availability and normalization
957
+
958
+ **Browser and supported native WebViews.** Complete node, edge, lane, label, and summary inventories are preserved; edges still require existing endpoints. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
959
+
960
+ ### Example
961
+
962
+ ```html
963
+ <html-import
964
+ id="relationship-board.html"
965
+ href="/arcane/components/relationship-board.html">
966
+ </html-import>
967
+ ```
968
+
969
+ ## screen-capture.html
970
+
971
+ ### Overview
972
+
973
+ Presents image, video, or GIF display-capture workflow.
974
+
975
+ ### Public surface
976
+
977
+ Methods/properties: `capture` (the component-owned `ScreenCapture` instance) and `destroy()`.
978
+
979
+ Events: `screen-capture-ready`, `screen-capture-result`.
980
+
981
+ Ready uses operation id `screen-capture-ready-<component-instance-id>`;
982
+ capture results use the current instance-owned generation. `destroy()`
983
+ invalidates that generation, aborts UI listeners, revokes the preview URL,
984
+ destroys the `ScreenCapture` instance, disposes the source, marks the host
985
+ unready, and returns `true`; repeated calls return `false`.
986
+
987
+ Shared dependencies: [`ScreenCapture.js`](runtime-modules.md#screencapturejs).
988
+
989
+ ### Availability and normalization
990
+
991
+ **Browser and supported native WebViews.** State/result normalized; media permission/codec failures mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
992
+
993
+ ### Example
994
+
995
+ ```html
996
+ <html-import
997
+ id="screen-capture.html"
998
+ href="/arcane/components/screen-capture.html">
999
+ </html-import>
1000
+ ```
1001
+
1002
+ ## source-code-viewer.html
1003
+
1004
+ ### Overview
1005
+
1006
+ Renders line-addressable source code with load, error, focus, and state behavior.
1007
+
1008
+ ### Public surface
1009
+
1010
+ Methods/properties: `configure()`, `load()`, `render()`, `clear()`, `fail()`, `focus()`, `focusLine()`, `destroy()`.
1011
+
1012
+ Events: `source-code-viewer-ready`, `source-code-viewer-state`,
1013
+ `source-code-viewer-state-loading`, `source-code-viewer-state-ready`,
1014
+ `source-code-viewer-state-empty`, and `source-code-viewer-state-error`.
1015
+
1016
+ ### Availability and normalization
1017
+
1018
+ **Browser and supported native WebViews.** Complete mutable source/state is rendered without character or line caps; malformed control-character metadata still fails honestly. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1019
+
1020
+ ### Example
1021
+
1022
+ ```html
1023
+ <html-import
1024
+ id="source-code-viewer.html"
1025
+ href="/arcane/components/source-code-viewer.html">
1026
+ </html-import>
1027
+ ```
1028
+
1029
+ ## source-explanation.html
1030
+
1031
+ ### Overview
1032
+
1033
+ Presents an evidence finding, source selection, explanation, and save state.
1034
+
1035
+ ### Public surface
1036
+
1037
+ Methods/properties: `showFinding()`, `populate()`, `selectSource()`, `markSaved()`, `destroy()`.
1038
+
1039
+ Events: `source-explanation-ready`, `source-explanation-save`, `source-explanation-source-selected`.
1040
+
1041
+ ### Availability and normalization
1042
+
1043
+ **Browser and supported native WebViews.** DOM-normalized. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1044
+
1045
+ ### Example
1046
+
1047
+ ```html
1048
+ <html-import
1049
+ id="source-explanation.html"
1050
+ href="/arcane/components/source-explanation.html">
1051
+ </html-import>
1052
+ ```
1053
+
1054
+ ## speech.html
1055
+
1056
+ ### Overview
1057
+
1058
+ Coordinates explicit speech-to-text activation, speech controls, transcription
1059
+ completion, mute state, and microphone availability.
1060
+
1061
+ ### Public surface
1062
+
1063
+ Methods/properties: `configure()`, `setMuted()`,
1064
+ `reportTTSError(error,boundary='synthesis')`, `requestSTTActivation()`,
1065
+ `destroy()`, `availability`, `muted`, `initialMuted`, and `componentReady`.
1066
+
1067
+ Events: `speech-ready`, `speech-transcription-complete`,
1068
+ `speech-transcription-error`, `speech-transcription-cancelled`,
1069
+ `speech-microphone-unavailable`, `speech-stt-activation-request`,
1070
+ `speech-stt-activation-error`, `speech-tts-lifecycle-error`, and
1071
+ `speech-synthesis-error`.
1072
+
1073
+ Shared dependencies: [`AI.js`](runtime-modules.md#aijs),
1074
+ [`AIRuntimeState.js`](runtime-modules.md#airuntimestatejs),
1075
+ [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs), and
1076
+ [`DBLS.js`](runtime-modules.md#dblsjs).
1077
+
1078
+ The Hold to talk control remains disabled unless sticky STT state is `ready`,
1079
+ the role is not busy, and microphone capture is available. For an explicitly
1080
+ selected STT route, a separate keyboard-operable control presents Start
1081
+ transcription while `unloaded`, Cancel loading while `loading`, a disabled
1082
+ Canceling state while `unloading`, and Try again with the sticky error while
1083
+ `error`. Selected-unloaded, busy, and error states are shown as distinct facts;
1084
+ none is treated as ready.
1085
+
1086
+ Only captured microphone input that completes the selected STT route emits
1087
+ `speech-transcription-complete`. A transient capture rejection reports
1088
+ `speech-microphone-unavailable` but remains locally retryable; an observed
1089
+ permission-denied state disables capture until the browser reports that the
1090
+ permission is available again, at which point the microphone-owned status is
1091
+ cleared.
1092
+
1093
+ The default `requestSTTActivation(intent)` forwards the mutable
1094
+ `{role:'stt',action:'load'|'unload',reason:'user'}` record to
1095
+ `requestAIRuntimeIntent()`. Before calling it, the component emits a bubbling,
1096
+ composed, cancelable `speech-stt-activation-request` event with mutable complete
1097
+ `{intent,state}` detail. `preventDefault()` suppresses the callback and intent.
1098
+ Callback failure emits `speech-stt-activation-error` with mutable complete
1099
+ `{request,error,message}` detail. Cancel loading publishes an `unload` intent;
1100
+ only subsequent sticky `unloading` or `unloaded` state confirms lifecycle
1101
+ progress, and callback return never proves provider work stopped.
1102
+
1103
+ Provider and runtime failures use generic visible speech status unless their
1104
+ Error owner explicitly marks nonblank copy with `userSafe:true`. Complete
1105
+ unknown diagnostics remain available through the developer console and error
1106
+ events; they do not become control labels or status text by default. The same
1107
+ boundary applies to STT activation, transcription, TTS lifecycle, synthesis,
1108
+ and playback failures.
1109
+
1110
+ `reportTTSError()` recognizes `synthesis`, `decode`, `playback-start`, and
1111
+ `playback-resume`. It mutes and stops the failed operation, preserves sticky
1112
+ provider readiness, and emits `speech-synthesis-error` with the exact boundary,
1113
+ stable reason/code, generic user-safe status, and complete Error in the local
1114
+ event detail.
1115
+
1116
+ - `synthesis`: `tts-synthesis-rejected` / `ARCANE_SPEECH_TTS_SYNTHESIS_REQUEST_REJECTED`;
1117
+ - `decode`: `tts-decode-rejected` / `ARCANE_SPEECH_TTS_DECODE_REJECTED`;
1118
+ - `playback-start`: `tts-playback-start-rejected` / `ARCANE_SPEECH_TTS_PLAYBACK_START_REJECTED`;
1119
+ - `playback-resume`: `tts-playback-resume-rejected` / `ARCANE_SPEECH_TTS_PLAYBACK_RESUME_REJECTED`.
1120
+
1121
+ The component emits no activation request on import or state observation.
1122
+ Provider registration and selection remain inert, and default
1123
+ `startTranscription=false` does not request STT during runtime startup. The
1124
+ provider/runtime owner decides whether and how to execute a user intent; the
1125
+ component never selects a runtime or model, downloads artifacts, reloads after
1126
+ failure, or falls back to another provider.
1127
+
1128
+ Each transcription request owns an `AbortController`; its signal is passed as
1129
+ the second argument to `AI.fetchSTT()`. Cancel, a newer capture, and `destroy()`
1130
+ abort that controller and suppress late results. This proves request delivery
1131
+ was canceled, not that an uncooperative provider stopped underlying work.
1132
+
1133
+ Each microphone attempt also owns one capture generation and one operation id
1134
+ from the initial `getUserMedia()` request through transcription settlement. A
1135
+ release while permission is still pending retires only that generation because
1136
+ the browser request cannot be canceled synchronously. If that stale request
1137
+ later resolves, the component stops its returned stream without clearing a
1138
+ newer press, status, operation id, or retry. Active capture finalization checks
1139
+ both the generation and operation id, and successful transcription retains the
1140
+ same capture operation id rather than inventing a second correlation boundary.
1141
+
1142
+ User Unmute calls the shared `AI.setSpeechMuted(false)` lifecycle owner before
1143
+ or with publishing the TTS load intent, so the runtime can legally load TTS.
1144
+ Configured `initialMuted:false` records that same unmute intent even when the
1145
+ TTS route is still unselected or loading; the component remains publicly muted
1146
+ until the selected role reaches `ready`, then applies the preserved intent.
1147
+ Mute calls `AI.setSpeechMuted(true)`, stops playback, cancels active TTS work,
1148
+ and unloads the selected TTS role. Lifecycle failures remain visible through
1149
+ `speech-tts-lifecycle-error` and sticky role state.
1150
+
1151
+ A BFCache-persisted `pagehide` retains the component, active provider state,
1152
+ microphone permission observation, and listeners. On persisted `pageshow`, the
1153
+ component resynchronizes the current AI mute state and rerenders its controls
1154
+ and status without duplicating activation or provider work. Nonpersisted
1155
+ `pagehide` remains terminal and destroys the component.
1156
+
1157
+ Speech operation ids are
1158
+ `<component-instance-id>:<kind>:<sequence>`. Canonical cancellation reasons are
1159
+ `stt-role-unready`, `stt-provider-transcription-cancelled`, `stt-role-busy`,
1160
+ `microphone-unavailable`, `component-destroyed`, and
1161
+ `stt-transcription-cancelled`. Microphone capture-failure reasons are
1162
+ `microphone-input-missing`, `microphone-input-unavailable`,
1163
+ `microphone-capture-denied`, and `microphone-capture-rejected`. Component
1164
+ boundary codes are `ARCANE_SPEECH_MICROPHONE_CAPTURE_REJECTED`,
1165
+ `ARCANE_SPEECH_STT_TRANSCRIPTION_REQUEST_REJECTED`,
1166
+ `ARCANE_SPEECH_TTS_LOAD_REJECTED`, `ARCANE_SPEECH_TTS_UNLOAD_REJECTED`,
1167
+ `ARCANE_SPEECH_TTS_SYNTHESIS_REQUEST_REJECTED`,
1168
+ `ARCANE_SPEECH_TTS_DECODE_REJECTED`,
1169
+ `ARCANE_SPEECH_TTS_PLAYBACK_START_REJECTED`, and
1170
+ `ARCANE_SPEECH_TTS_PLAYBACK_RESUME_REJECTED`. Each of those component-boundary
1171
+ public projections keeps the exact boundary in `code` and preserves a distinct
1172
+ string code from the browser, runtime, or provider additively as `causeCode`.
1173
+ A missing STT method therefore uses boundary
1174
+ `ARCANE_SPEECH_STT_TRANSCRIPTION_REQUEST_REJECTED` with
1175
+ `causeCode:'ARCANE_SPEECH_STT_RUNTIME_METHOD_UNAVAILABLE'`.
1176
+
1177
+ Stable rejection reasons are `stt-transcription-rejected`,
1178
+ `tts-load-rejected`, `tts-unload-rejected`, `tts-synthesis-rejected`,
1179
+ `tts-decode-rejected`, `tts-playback-start-rejected`, and
1180
+ `tts-playback-resume-rejected`. Shared activation rejection uses
1181
+ `ARCANE_STT_ACTIVATION_REQUEST_REJECTED` and `activation-request-rejected`.
1182
+
1183
+ ### Availability and normalization
1184
+
1185
+ **Browser and supported native WebViews.** UI/runtime state and explicit user
1186
+ STT activation intent are normalized; provider/model authority and media
1187
+ behavior remain external. HTMLImport + DOM; injected Arcane/provider modules
1188
+ where listed. Native methods remain subject to the bound app's capabilities.
1189
+ [Deep protocol details](protocols.md).
1190
+
1191
+ ### Example
1192
+
1193
+ ```html
1194
+ <html-import
1195
+ id="speech.html"
1196
+ href="/arcane/components/speech.html">
1197
+ </html-import>
1198
+ ```
1199
+
1200
+ ## summary-strip.html
1201
+
1202
+ ### Overview
1203
+
1204
+ Displays compact selectable KPI or summary items.
1205
+
1206
+ ### Public surface
1207
+
1208
+ Methods/properties: `configure()`, `setItems()`, `updateItem()`, `clear()`, `destroy()`.
1209
+
1210
+ Events: `summary-strip-ready`, `summary-strip-change`, `summary-strip-select`.
1211
+
1212
+ ### Availability and normalization
1213
+
1214
+ **Browser and supported native WebViews.** DOM-normalized. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1215
+
1216
+ ### Example
1217
+
1218
+ ```html
1219
+ <html-import
1220
+ id="summary-strip.html"
1221
+ href="/arcane/components/summary-strip.html">
1222
+ </html-import>
1223
+ ```
1224
+
1225
+ ## table.html
1226
+
1227
+ ### Overview
1228
+
1229
+ Builds and updates a simple header/body table.
1230
+
1231
+ ### Public surface
1232
+
1233
+ Methods/properties: `buildHeader()`, `buildTable()`, `destroy()`.
1234
+
1235
+ Events: `table-ready`, `header-update`, `body-update`.
1236
+
1237
+ ### Availability and normalization
1238
+
1239
+ **Browser and supported native WebViews.** DOM-normalized. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1240
+
1241
+ ### Example
1242
+
1243
+ ```html
1244
+ <html-import
1245
+ id="table.html"
1246
+ href="/arcane/components/table.html">
1247
+ </html-import>
1248
+ ```
1249
+
1250
+ ## task-progress.html
1251
+
1252
+ ### Overview
1253
+
1254
+ Runs and displays a task list with started/change/complete/error state.
1255
+
1256
+ ### Public surface
1257
+
1258
+ Methods/properties: `configure()`, `setTasks()`, `updateTask()`, `runTasks()`, `clear()`, `destroy()`.
1259
+
1260
+ Events: `task-progress-ready`, `task-progress-started`, `task-progress-change`, `task-progress-complete`, `task-progress-error`.
1261
+
1262
+ ### Availability and normalization
1263
+
1264
+ **Browser and supported native WebViews.** Task state normalized; injected task results mixed. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1265
+
1266
+ ### Example
1267
+
1268
+ ```html
1269
+ <html-import
1270
+ id="task-progress.html"
1271
+ href="/arcane/components/task-progress.html">
1272
+ </html-import>
1273
+ ```
1274
+
1275
+ ## terminal-workspace.html
1276
+
1277
+ ### Overview
1278
+
1279
+ Presents multiple terminal sessions, output, active selection, theme, and terminal actions.
1280
+
1281
+ ### Public surface
1282
+
1283
+ Methods/properties: `configure()`, `addSession()`, `removeSession()`, `activateSession()`, `append()`, `clear()`, `setState()`, `setTheme()`, `focus()`, `destroy()`.
1284
+
1285
+ Events: `terminal-workspace-ready`, `terminal-submit`, `terminal-interrupt`, `terminal-clear`, `terminal-session-new`, `terminal-session-close`, `terminal-session-select`, `terminal-settings`.
1286
+
1287
+ Shared dependencies: [`AnsiText.js`](runtime-modules.md#ansitextjs).
1288
+
1289
+ ### Availability and normalization
1290
+
1291
+ **Browser and supported native WebViews.** UI/session state normalized; native command results supplied externally. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1292
+
1293
+ ### Example
1294
+
1295
+ ```html
1296
+ <html-import
1297
+ id="terminal-workspace.html"
1298
+ href="/arcane/components/terminal-workspace.html">
1299
+ </html-import>
1300
+ ```
1301
+
1302
+ ## theme-editor.html
1303
+
1304
+ ### Overview
1305
+
1306
+ Edits, previews, saves, and resets semantic custom theme tokens.
1307
+
1308
+ ### Public surface
1309
+
1310
+ Methods/properties: `configure()`, `getTheme()`, `setTheme()`, `setBusy()`, `setStatus()`, `destroy()`.
1311
+
1312
+ Events: `theme-editor-ready`, `theme-preview`, `theme-save`, `theme-reset`.
1313
+
1314
+ Shared dependencies: [`Theme.js`](runtime-entities.md#themejs).
1315
+
1316
+ ### Availability and normalization
1317
+
1318
+ **Browser and supported native WebViews.** Fully normalized Theme values. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1319
+
1320
+ ### Example
1321
+
1322
+ ```html
1323
+ <html-import
1324
+ id="theme-editor.html"
1325
+ href="/arcane/components/theme-editor.html">
1326
+ </html-import>
1327
+ ```
1328
+
1329
+ ## theme-switcher.html
1330
+
1331
+ ### Overview
1332
+
1333
+ Selects and refreshes system, light, dark, or custom theme mode.
1334
+
1335
+ ### Public surface
1336
+
1337
+ Methods/properties: `setMode()`, `refresh()`.
1338
+
1339
+ This fragment declares no component-specific readiness or action event; use the loader's `html-import-ready` only to know that import execution completed.
1340
+
1341
+ Shared dependencies: [`ThemeManager.js`](runtime-modules.md#thememanagerjs).
1342
+
1343
+ ### Availability and normalization
1344
+
1345
+ **Browser and supported native WebViews.** Preference/native appearance behavior mixed; no component-ready contract. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1346
+
1347
+ ### Example
1348
+
1349
+ ```html
1350
+ <html-import
1351
+ id="theme-switcher.html"
1352
+ href="/arcane/components/theme-switcher.html">
1353
+ </html-import>
1354
+ ```
1355
+
1356
+ ## unified-inbox.html
1357
+
1358
+ ### Overview
1359
+
1360
+ Displays provider-neutral communication threads with active/loading state.
1361
+
1362
+ ### Public surface
1363
+
1364
+ Methods/properties: `configure()`, `setThreads()`, `setActive()`, `setLoading()`, `destroy()`.
1365
+
1366
+ Events: `unified-inbox-ready`, `inbox-refresh`, `thread-select`.
1367
+
1368
+ ### Availability and normalization
1369
+
1370
+ **Browser and supported native WebViews.** DOM-normalized. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1371
+
1372
+ ### Example
1373
+
1374
+ ```html
1375
+ <html-import
1376
+ id="unified-inbox.html"
1377
+ href="/arcane/components/unified-inbox.html">
1378
+ </html-import>
1379
+ ```
1380
+
1381
+ ## voice-transcription.html
1382
+
1383
+ ### Overview
1384
+
1385
+ Records segmented microphone audio only after authoritative STT readiness,
1386
+ exposes explicit selected-STT activation, transcribes with cancellation,
1387
+ persists, and completes a combined transcript.
1388
+
1389
+ ### Public surface
1390
+
1391
+ Methods/properties: `configure()`, `requestSTTActivation()`, `startRecording()`,
1392
+ `stopRecording()`, `save()`, `completeTranscription()/complete()`, `clear()`,
1393
+ `reset()`, `destroy()`.
1394
+
1395
+ Events: `voice-transcription-ready`, `voice-transcription-state`,
1396
+ `voice-transcription-segment`, `voice-transcription-change`,
1397
+ `voice-transcription-complete`, `speech-transcription-complete`,
1398
+ `speech-transcription-cancelled`, `speech-stt-activation-request`, and
1399
+ `speech-stt-activation-error`.
1400
+
1401
+ Shared dependencies: [`MD.js`](runtime-modules.md#mdjs),
1402
+ [`ComponentContracts.js`](runtime-modules.md#componentcontractsjs),
1403
+ [`AIRuntimeState.js`](runtime-modules.md#airuntimestatejs), and
1404
+ [`AI.js`](runtime-modules.md#aijs).
1405
+
1406
+ ### Availability and normalization
1407
+
1408
+ **Browser and supported native WebViews.** The component subscribes
1409
+ synchronously to sticky `AIRuntimeState.roles.stt`; its recording Start button
1410
+ and public `startRecording()` both remain unavailable unless that role is exactly
1411
+ `ready` and not busy. A configured `transcribe(file,context)` callback remains
1412
+ request plumbing rather than readiness authority. Its context now includes the
1413
+ owned `signal` additively. The default route calls `AI.fetchSTT(file,signal)` so
1414
+ readiness loss or destruction can abort delivery.
1415
+
1416
+ For a selected `unloaded`, `loading`, `unloading`, or `error` role, the component
1417
+ keeps recording Start disabled and presents the same keyboard-operable Start
1418
+ transcription/Try again or Cancel loading control as `speech.html`. Both use the
1419
+ shared `createSTTActivationController()` contract. User operation emits the
1420
+ cancelable `speech-stt-activation-request` event with mutable complete `{intent,state}`;
1421
+ `preventDefault()` suppresses the callback. The default
1422
+ `requestSTTActivation(intent)` publishes the mutable
1423
+ `{role:'stt',action:'load'|'unload',reason:'user'}` intent. Callback failure emits
1424
+ `speech-stt-activation-error` with mutable complete `{request,error,message}`. Import and
1425
+ state observation emit no activation request and never begin a model download.
1426
+ Unknown provider/runtime diagnostics remain complete in the developer console
1427
+ and error events, while controls use generic visible outcomes unless the Error
1428
+ owner explicitly marks nonblank copy with `userSafe:true`.
1429
+
1430
+ If sticky readiness is lost during microphone acquisition, capture, or the STT
1431
+ request, the component invalidates the session, aborts the owned request signal,
1432
+ releases media, discards late completion, and emits
1433
+ `speech-transcription-cancelled`. Its source-local reason is
1434
+ `runtime-unready`, while its canonical/public reason is `stt-role-unready`. A
1435
+ busy role uses `stt-role-busy` in both views. A current provider cancellation
1436
+ returns the component workflow to `idle` with local
1437
+ `stt-provider-request-cancelled` and canonical/public
1438
+ `stt-provider-transcription-cancelled`; destruction uses
1439
+ `component-destroyed` in both views. Replacing configuration without an
1440
+ `initialValue` during active work uses `configuration-replaced` in both views.
1441
+ Stale teardown results remain suppressed. A
1442
+ current save failure, including `AbortError`, enters the visible `error` state.
1443
+ Readiness loss after transcription has finished does not invalidate an already
1444
+ pending application save or completion callback: its settlement remains
1445
+ observable, while any new recording remains gated by current sticky readiness.
1446
+ Assigning `value` or calling `configure({initialValue})` explicitly supersedes
1447
+ an in-flight microphone start, STT request, save, or completion. The component
1448
+ advances its generation, aborts owned STT delivery, releases owned media, emits
1449
+ `speech-transcription-cancelled` with
1450
+ `reason:'transcript-replaced'`, and suppresses
1451
+ late settlement before publishing the assigned transcript. Assigning transcript
1452
+ text during active recording preserves that recording and changes the transcript
1453
+ to which the captured segment will be appended.
1454
+ On a BFCache-persisted `pagehide`, the component and its owned state remain
1455
+ live. A persisted `pageshow` rerenders the retained authoritative state without
1456
+ restarting capture, transcription, or activation. Nonpersisted `pagehide`
1457
+ retains terminal destruction.
1458
+ `destroy()` aborts the state subscription, cancels active work, removes the
1459
+ activation listener, sets component `ready` to `false`, and returns `true`;
1460
+ repeated destruction is
1461
+ idempotent. Destruction is terminal: Start, activation, and Complete remain
1462
+ disabled and status remains unavailable. `voice-transcription-state` detail is
1463
+ the mutable complete `{message,state,stt}` record, where `state` remains the component
1464
+ workflow and `stt` is the authoritative mutable role record. Transcript
1465
+ completion stays available when STT is unavailable before destruction.
1466
+ State/text, explicit activation, and request cancellation are normalized;
1467
+ provider/model authority and media behavior remain external. HTMLImport + DOM;
1468
+ injected Arcane/provider modules where listed.
1469
+ Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1470
+
1471
+ ### Example
1472
+
1473
+ ```html
1474
+ <html-import
1475
+ id="voice-transcription.html"
1476
+ href="/arcane/components/voice-transcription.html">
1477
+ </html-import>
1478
+ ```
1479
+
1480
+ ## weather-widget.html
1481
+
1482
+ ### Overview
1483
+
1484
+ Displays normalized current and daily weather with refresh intent.
1485
+
1486
+ ### Public surface
1487
+
1488
+ Methods/properties: `setWeather()`, `clear()`, `destroy()`.
1489
+
1490
+ Events: `weather-widget-ready`, `weather-refresh`.
1491
+
1492
+ ### Availability and normalization
1493
+
1494
+ **Browser and supported native WebViews.** Display normalized; provider supplied externally. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1495
+
1496
+ ### Example
1497
+
1498
+ ```html
1499
+ <html-import
1500
+ id="weather-widget.html"
1501
+ href="/arcane/components/weather-widget.html">
1502
+ </html-import>
1503
+ ```
1504
+
1505
+ ## web-navigator.html
1506
+
1507
+ ### Overview
1508
+
1509
+ Guards embedded/external navigation and surfaces allow/block/open intents.
1510
+
1511
+ ### Public surface
1512
+
1513
+ Methods/properties: `configure()`, `navigate()`, `currentUrl()`, `destroy()`.
1514
+
1515
+ Events: `web-navigator-ready`, `web-navigate`, `web-navigation-blocked`, `web-open-external`.
1516
+
1517
+ ### Availability and normalization
1518
+
1519
+ **Browser and supported native WebViews.** Navigation intent/decision normalized; browser navigation result platform-native. HTMLImport + DOM; injected Arcane/provider modules where listed. Native methods remain subject to the bound app's capabilities. [Deep protocol details](protocols.md).
1520
+
1521
+ ### Example
1522
+
1523
+ ```html
1524
+ <html-import
1525
+ id="web-navigator.html"
1526
+ href="/arcane/components/web-navigator.html">
1527
+ </html-import>
1528
+ ```
1529
+
1530
+ ## Readiness caveats
1531
+
1532
+ `header.html` and `theme-switcher.html` do not currently publish a component-specific ready event/property. Consumers can observe `html-import-ready` for completed fragment execution and then feature-detect their methods. Other fragments publish the exact ready event listed above.